节点连接关系

1、节点连接关系

案例位置examples/Cuda/QtGUI/Qt_Connection

功能介绍:该案例展示了场景图中节点的连接关系。如下图所示,场景图中Target节点有输入节点和输出节点。为了方便叙述,将节点标号为①②③④

  • 节点:输入节点,允许多个节点输入。宏定义如下,其中T代表节点类型,name表示名称,desc表示输入节点描述信息,访问方式为import+数据名称+s。
DEF_NODE_PORTS(T, name, desc)
  • 节点:输入节点,只允许单个节点输入。宏定义如下,其中T代表节点类型,name表示名称,desc表示输入节点描述信息,访问方式为import+数据名称。
DEF_NODE_PORT(T, name, desc)
  • 节点:输入节点,只允许单个节点指定数据类型输入。宏定义如下,其中T代表节点类型,name表示名称,desc表示输入节点描述信息。访问方式为in+数据名称。
DEF_INSTANCE_IN(T, name, desc);
  • 节点:输出节点,将当前节点全部的数据输出。无需定义,系统会默认将每个节点增加一个输出接口out。

案例说明:案例中Target节点定义了三个输入接口,其中Source A(s)运行多个节点接入、Source B只允许一个节点接入、Data是只允许指定数据输入。

2、程序实现

接下来介绍案例的实现过程:

  • Data数据定义:
class Data : public Object {
public:
	Data() {};
	~Data() override {};
};
  • SourceA节点定义:
class SourceA : public Node
{
	DECLARE_CLASS(SourceA);
public:
	SourceA() {
	};
	~SourceA() override {};

	DEF_INSTANCE_OUT(Data, Data, "Output");

protected:
	void resetStates() {};
};

IMPLEMENT_CLASS(SourceA);

  • SourceB节点定义:
class SourceB : public Node
{
	DECLARE_CLASS(SourceB);
public:
	SourceB() {
	};
	~SourceB() override {};

	DEF_INSTANCE_OUT(Data, Data, "Output");

protected:
	void resetStates() {};
};

IMPLEMENT_CLASS(SourceB);

  • Target节点定义:
class Target : public Node
{
	DECLARE_CLASS(Target);
public:
	Target() {
	};
	~Target() override {};

	DEF_NODE_PORTS(SourceA, SourceA, "");

	DEF_NODE_PORT(SourceB, SourceB, "");

	DEF_INSTANCE_IN(Data, Data, "Input");

protected:
	void resetStates() {};
};

IMPLEMENT_CLASS(Target);

  • 节点间的连接关系:
int main()
{
	std::shared_ptr<SceneGraph> scn = std::make_shared<SceneGraph>();

	auto source1 = scn->addNode(std::make_shared<SourceA>());
	source1->setName("s1");

	auto source2 = scn->addNode(std::make_shared<SourceA>());
	source2->setName("s2");

	auto source3 = scn->addNode(std::make_shared<SourceB>());
	source3->setName("s3");

	auto target1 = scn->addNode(std::make_shared<Target>());
	target1->setName("t1");

	source1->connect(target1->importSourceAs());
	source2->connect(target1->importSourceAs());
	source3->connect(target1->importSourceB());

	source1->outData()->connect(target1->inData());

	QtApp app;
	app.setSceneGraph(scn);
	app.initialize(1366, 800);
	app.mainLoop();

	return 0;
}