Skip to content

Graph 定义

Graph 是图类型的根 API。它持有一个 CustomGraphModelImpl,并定义这个图支持什么。

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

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

Node Registry

当节点使用 @NodeAttribute 声明时,使用 GraphNodeRegistry

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 会按图类型、mod id 和注册环境过滤带注解的节点。

Node Attribute

java
@NodeAttribute(
        name = "add",
        group = "math",
        graphTypes = {MyGraph.class}
)
public class AddNode extends Node {
}
字段说明
name图工具包使用的节点 id。
groupItem Library 的分组路径。
modID可选的 mod 过滤。
priority排序优先级。
environment注册环境。
graphTypes这个节点可以在哪些图类中使用。

支持的类型

getSupportTypes() 控制常量和变量可用的类型句柄。Type API 和注册辅助方法见 Type Handles

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

返回 null 时,CustomGraphModelImpl.detectSupportedTypes(graphModel) 会从支持节点的端口中收集类型。

也可以分别调整 UI 列表:

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

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

Graph Hooks

当行为属于图类型,而不是某个 GraphView 实例时,使用 graph hooks。

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 可以拒绝编辑器变更。

onCommandExecuted 在命令修改图之后运行。

onGraphChanged 会向 graph view 底部诊断区域输出信息。这些消息是运行时 UI 状态,不会序列化。

子图支持

默认支持同类型本地子图。跨类型子图需要显式允许:

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

使用 getSupportedSubgraphVariableKinds() 控制当这个图作为子图使用时,哪些暴露变量会变成端口。

Released under the MIT License.