案例位置:examples/Cuda/QtGUI/Qt_ResetNode
功能介绍:该案例主要向用户展示节点属性更新的过程。PeriDyno引擎仿真任务以场景图的形式。数据从一个节点计算完之后传向下一个节点。当更新节点的时候,只更新修改过的节点和之后的节点,而修改之前的节点不会被更新。
案例说明: 案例中有Source、Summation(1)[第一个Summation节点]、Summation(2)[第二个Summation节点] 三个节点。初始化时,每个一个节点都有一个 Value 值,初始化都为1。节点会将上一个节点的 Value 值输入,并当前节点 Value 值相加,并将结果传到下一个节点。案例中 Source 的 Value 值为1; Summation(1) 的值为 Source 传入的 Value 值与当前 Value 值相加,为2;同理 Summation(2) 的值为上一个节点传入的值与当前节点的值的和,为3。如果将 Summation(1) 的 Value 值改为2。此时 Source、Summation(1)、Summation(2) 的值分别为1,3,4。因此,从后台打印信息可以看出,改变 Summation(1) 节点的属性值,并不会改变上一个节点 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;
}
};
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());