Skip to content

Graph Definition ​

Graph is the root API for a graph type. It owns a CustomGraphModelImpl and defines what the graph supports.

java
public abstract class Graph implements IGraph {
    public final CustomGraphModelImpl graphModel = createGraphModel();

    public abstract List<Class<? extends Node>> getSupportNodes();
}

Node Registry ​

Use GraphNodeRegistry when your nodes are declared with @NodeAttribute.

java
public class MyGraph extends Graph {
    public static final GraphNodeRegistry NODE_REGISTRY =
            GraphNodeRegistry.create(MyMod.id("my_graph"), MyGraph.class);

    @Override
    public List<Class<? extends Node>> getSupportNodes() {
        return NODE_REGISTRY.getNodeClasses();
    }
}

GraphNodeRegistry filters annotated nodes by graph type, mod id, and registration environment.

Node Attribute ​

java
@NodeAttribute(
        name = "add",
        group = "math",
        graphTypes = {MyGraph.class}
)
public class AddNode extends Node {
}
FieldDescription
nameNode id used by the graph toolkit.
groupItem library grouping path.
modIDOptional mod filter.
prioritySort priority.
environmentRegistration environment.
graphTypesGraph classes this node can be used in.

Supported Types ​

getSupportTypes() controls type handles available to ports, constants, and variables. See Type Handles for the type API and registration helpers.

java
@Override
public @Nullable List<TypeHandle> getSupportTypes() {
    return List.of(TypeHandles.FLOAT, TypeHandles.STRING, TypeHandles.BOOL);
}

Return null to let CustomGraphModelImpl.detectSupportedTypes(graphModel) collect port types from supported nodes.

You can also tune UI lists separately:

java
@Override
public List<TypeHandle> getLibrarySupportTypes() {
    return List.of(TypeHandles.FLOAT);
}

@Override
public List<TypeHandle> getVariableSupportTypes() {
    return List.of(TypeHandles.FLOAT, TypeHandles.BOOL);
}

By default, getVariableSupportTypes() returns getSupportTypes(), and getLibrarySupportTypes() returns null. A null library list keeps only the supported types a literal can be authored of: those for which TypeHandleHelpers.canAuthorLiteral(handle) is true, meaning the handle has a registered default value.

WARNING

Since 2.2.41, the item library no longer offers a constant node for every supported type. Before 2.2.41, the default was the whole getSupportTypes() list.

Types without a default value are now left out. This includes custom types registered without setCustomDefaultValue(...), plain enums, and the built-in TypeHandles.DIRECTION. To bring one back, register a default value:

java
TypeHandleHelpers.setCustomDefaultValue(TypeHandles.DIRECTION, () -> Direction.NORTH);

Or override getLibrarySupportTypes() and list the types yourself.

Graph Hooks ​

Use graph hooks when behavior belongs to the graph type instead of one GraphView instance.

java
@Override
public boolean canExecuteCommand(IGraphCommand command) {
    return true;
}

@Override
public void onCommandExecuted(IGraphCommand command) {
}

@Override
public void onGraphChanged(GraphLogger logger) {
    logger.warning(Component.literal("Missing output"));
}

canExecuteCommand can veto editor changes.

onCommandExecuted runs after a command has changed the graph.

onGraphChanged emits footer diagnostics in the graph view. Messages are runtime UI state and are not serialized.

Subgraph Support ​

Same-type local subgraphs are supported by default. Cross-type subgraphs require opt-in:

java
@Override
public boolean acceptsSubgraphGraph(Graph other) {
    return other instanceof MaterialGraph;
}

Use getSupportedSubgraphVariableKinds() to control which exposed variable kinds become ports when this graph is used as a subgraph.

Released under the MIT License.