该功能主要用于相应鼠标事件,包括鼠标移动、点击和释放。当鼠标发出不同指令时,程序会调用不同的接口,便于用户和仿真程序的交互。
std::shared_ptr<SceneGraph> scn = std::make_shared<SceneGraph>();
auto instanceNode = scn->addNode(std::make_shared<Instances>());
class Instances : public Node
{
public:
Instances() {
Transform3f tm;
CArray<Transform3f> hTransform;
for (uint i = 0; i < 5; i++)
{
tm.translation() = Vec3f(0.4 * i, 0, 0);
tm.scale() = Vec3f(1.0 + 0.1*i, 1.0 - 0.1*i, 1.0);
tm.rotation() = Quat<float>(i * (-0.2), Vec3f(1, 0, 0)).toMatrix3x3();
hTransform.pushBack(tm);
}
this->stateTransforms()->allocate()->assign(hTransform);
std::shared_ptr<TriangleSet<DataType3f>> triSet = std::make_shared<TriangleSet<DataType3f>>();
triSet->loadObjFile(getAssetPath() + "armadillo/armadillo.obj");
this->stateTopology()->setDataPtr(triSet);
hTransform.clear();
};
DEF_ARRAY_STATE(Transform3f, Transforms, DeviceType::GPU, "Instance transform");
DEF_INSTANCE_STATE(TopologyModule, Topology, "Topology");
};
//Create a CustomMouseInteraction object to handle the mouse event,
//Press/release the mouse button to show the information
auto mouseInterator = std::make_shared<CustomMouseInteraction>();
instanceNode->stateTopology()->connect(mouseInterator->inTopology());
instanceNode->graphicsPipeline()->pushModule(mouseInterator);
auto instanceRender = std::make_shared<GLInstanceVisualModule>();
instanceRender->setColor(Vec3f(0, 1, 0));
instanceNode->stateTopology()->connect(instanceRender->inTriangleSet());
instanceNode->stateTransforms()->connect(instanceRender->inTransform());
instanceNode->graphicsPipeline()->pushModule(instanceRender);
scn->setUpperBound({ 4, 4, 4 });
如图所示,当鼠标在仿真界面移动、点击时,程序会打印出相应的状态、位置坐标等信息。代码参考example/GL_MouseInteractionInGraphicsPipeline/main.h: