重置节点

1、重置节点

案例位置examples/Cuda/QtGUI/Qt_ResetNode

功能介绍:该案例主要向用户展示节点属性更新的过程。PeriDyno引擎仿真任务以场景图的形式。数据从一个节点计算完之后传向下一个节点。当更新节点的时候,只更新修改过的节点和之后的节点,而修改之前的节点不会被更新。

案例说明: 案例中有SourceSummation(1)[第一个Summation节点]Summation(2)[第二个Summation节点] 三个节点。初始化时,每个一个节点都有一个 Value 值,初始化都为1。节点会将上一个节点的 Value 值输入,并当前节点 Value 值相加,并将结果传到下一个节点。案例中 SourceValue 值为1; Summation(1) 的值为 Source 传入的 Value 值与当前 Value 值相加,为2;同理 Summation(2) 的值为上一个节点传入的值与当前节点的值的和,为3。如果将 Summation(1)Value 值改为2。此时 SourceSummation(1)Summation(2) 的值分别为1,3,4。因此,从后台打印信息可以看出,改变 Summation(1) 节点的属性值,并不会改变上一个节点 Source 的值,也就是上一个节点不会被更新。

2、程序实现

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

  • 创建Source节点:
	class Source : public Node
	{
		DECLARE_CLASS(Source);
	public:
		Source() {
		};
		~Source() {};

		DEF_VAR(int, Value, 1, "Define a scalar");

		DEF_VAR_OUT(int, Value, "Output value");

	protected:
		void resetStates() {
			this->outValue()->setValue(this->varValue()->getData());

			std::cout << "Node " << this->getName() << " is reset, and the new value is " << this->varValue()->getData() << std::endl;
		}
	};
  • 创建Summation节点:
	class Summation : public Node
	{
		DECLARE_CLASS(Summation);
	public:
		Summation() {
		};
		~Summation() {};

		DEF_VAR(int, Value, 1, "Define a scalar");

		DEF_VAR_IN(int, Value, "Input value");

		DEF_VAR_OUT(int, Value, "Output value");

	protected:
		void resetStates() {
			this->outValue()->setValue(this->varValue()->getData() + this->inValue()->getData());

			std::cout << "Node " << this->getName() << " is reset, and the new value is " << this->outValue()->getData() << std::endl;
		}
	};
  • 将节点连接起来:
	std::shared_ptr<SceneGraph> scn = std::make_shared<SceneGraph>();
	auto source1 = scn->addNode(std::make_shared<Source>());
	source1->setName("Source1");

	auto sum1 = scn->addNode(std::make_shared<Summation>());
	sum1->setName("Sum1");

	auto sum2 = scn->addNode(std::make_shared<Summation>());
	sum2->setName("Sum2");

	source1->outValue()->connect(sum1->inValue());
	sum1->outValue()->connect(sum2->inValue());