| 1012 | } |
| 1013 | |
| 1014 | void SceneGraph::set_motion_vector(Ref<SceneGraph::Node> node, const Vec3fa& dP) |
| 1015 | { |
| 1016 | if (Ref<SceneGraph::TransformNode> xfmNode = node.dynamicCast<SceneGraph::TransformNode>()) { |
| 1017 | set_motion_vector(xfmNode->child, dP); |
| 1018 | } |
| 1019 | else if (Ref<SceneGraph::GroupNode> groupNode = node.dynamicCast<SceneGraph::GroupNode>()) |
| 1020 | { |
| 1021 | for (size_t i=0; i<groupNode->children.size(); i++) |
| 1022 | set_motion_vector(groupNode->children[i],dP); |
| 1023 | } |
| 1024 | else if (Ref<SceneGraph::TriangleMeshNode> mesh = node.dynamicCast<SceneGraph::TriangleMeshNode>()) |
| 1025 | { |
| 1026 | avector<Vec3fa> positions1; |
| 1027 | for (auto& P : mesh->positions.back()) |
| 1028 | positions1.push_back(P+dP); |
| 1029 | mesh->positions.push_back(std::move(positions1)); |
| 1030 | } |
| 1031 | else if (Ref<SceneGraph::QuadMeshNode> mesh = node.dynamicCast<SceneGraph::QuadMeshNode>()) |
| 1032 | { |
| 1033 | avector<Vec3fa> positions1; |
| 1034 | for (auto& P : mesh->positions.back()) |
| 1035 | positions1.push_back(P+dP); |
| 1036 | mesh->positions.push_back(std::move(positions1)); |
| 1037 | } |
| 1038 | else if (Ref<SceneGraph::GridMeshNode> mesh = node.dynamicCast<SceneGraph::GridMeshNode>()) |
| 1039 | { |
| 1040 | avector<Vec3fa> positions1; |
| 1041 | for (auto& P : mesh->positions.back()) |
| 1042 | positions1.push_back(P+dP); |
| 1043 | mesh->positions.push_back(std::move(positions1)); |
| 1044 | } |
| 1045 | else if (Ref<SceneGraph::HairSetNode> mesh = node.dynamicCast<SceneGraph::HairSetNode>()) |
| 1046 | { |
| 1047 | avector<Vec3ff> positions1; |
| 1048 | for (auto& P : mesh->positions.back()) |
| 1049 | positions1.push_back(P+Vec3ff(dP,0.0f)); |
| 1050 | mesh->positions.push_back(std::move(positions1)); |
| 1051 | } |
| 1052 | else if (Ref<SceneGraph::PointSetNode> mesh = node.dynamicCast<SceneGraph::PointSetNode>()) |
| 1053 | { |
| 1054 | avector<Vec3ff> positions1; |
| 1055 | for (auto& P : mesh->positions.back()) |
| 1056 | positions1.push_back(P+Vec3ff(dP,0.0f)); |
| 1057 | mesh->positions.push_back(std::move(positions1)); |
| 1058 | |
| 1059 | if (mesh->normals.size()) |
| 1060 | mesh->normals.push_back(mesh->normals[0]); |
| 1061 | } |
| 1062 | else if (Ref<SceneGraph::SubdivMeshNode> mesh = node.dynamicCast<SceneGraph::SubdivMeshNode>()) |
| 1063 | { |
| 1064 | avector<Vec3fa> positions1; |
| 1065 | for (auto& P : mesh->positions.back()) |
| 1066 | positions1.push_back(P+dP); |
| 1067 | mesh->positions.push_back(std::move(positions1)); |
| 1068 | } |
| 1069 | } |
| 1070 | |
| 1071 | void SceneGraph::set_motion_vector(Ref<SceneGraph::Node> node, const avector<Vec3fa>& motion_vector) |