| 1145 | } |
| 1146 | |
| 1147 | void SceneGraph::resize_randomly(RandomSampler& sampler, Ref<Node> node, const size_t N) |
| 1148 | { |
| 1149 | if (Ref<SceneGraph::TransformNode> xfmNode = node.dynamicCast<SceneGraph::TransformNode>()) { |
| 1150 | resize_randomly(sampler,xfmNode->child, N); |
| 1151 | } |
| 1152 | else if (Ref<SceneGraph::GroupNode> groupNode = node.dynamicCast<SceneGraph::GroupNode>()) |
| 1153 | { |
| 1154 | for (size_t i=0; i<groupNode->children.size(); i++) |
| 1155 | resize_randomly(sampler,groupNode->children[i],N); |
| 1156 | } |
| 1157 | else if (Ref<SceneGraph::TriangleMeshNode> mesh = node.dynamicCast<SceneGraph::TriangleMeshNode>()) |
| 1158 | { |
| 1159 | if (!mesh->triangles.size()) return; |
| 1160 | for (size_t i=0; i<N; i++) { |
| 1161 | size_t j = RandomSampler_getInt(sampler)%(min(mesh->triangles.size(),N)); |
| 1162 | if (i < mesh->triangles.size()) std::swap(mesh->triangles[i],mesh->triangles[j]); |
| 1163 | else mesh->triangles.push_back(mesh->triangles[j]); |
| 1164 | } |
| 1165 | } |
| 1166 | else if (Ref<SceneGraph::QuadMeshNode> mesh = node.dynamicCast<SceneGraph::QuadMeshNode>()) |
| 1167 | { |
| 1168 | if (!mesh->quads.size()) return; |
| 1169 | for (size_t i=0; i<N; i++) { |
| 1170 | size_t j = RandomSampler_getInt(sampler)%(min(mesh->quads.size(),N)); |
| 1171 | if (i < mesh->quads.size()) std::swap(mesh->quads[i],mesh->quads[j]); |
| 1172 | else mesh->quads.push_back(mesh->quads[j]); |
| 1173 | } |
| 1174 | } |
| 1175 | else if (Ref<SceneGraph::HairSetNode> mesh = node.dynamicCast<SceneGraph::HairSetNode>()) |
| 1176 | { |
| 1177 | if (!mesh->hairs.size()) return; |
| 1178 | for (size_t i=0; i<N; i++) { |
| 1179 | size_t j = RandomSampler_getInt(sampler)%(min(mesh->hairs.size(),N)); |
| 1180 | if (i < mesh->hairs.size()) std::swap(mesh->hairs[i],mesh->hairs[j]); |
| 1181 | else mesh->hairs.push_back(mesh->hairs[j]); |
| 1182 | } |
| 1183 | } |
| 1184 | else if (Ref<SceneGraph::PointSetNode> mesh = node.dynamicCast<SceneGraph::PointSetNode>()) |
| 1185 | { |
| 1186 | if (mesh->positions.size() <= N) return; |
| 1187 | mesh->positions.resize(N); |
| 1188 | } |
| 1189 | else if (Ref<SceneGraph::SubdivMeshNode> mesh = node.dynamicCast<SceneGraph::SubdivMeshNode>()) |
| 1190 | { |
| 1191 | if (mesh->verticesPerFace.size() <= N) return; |
| 1192 | mesh->verticesPerFace.resize(N); |
| 1193 | } |
| 1194 | } |
| 1195 | |
| 1196 | void SceneGraph::set_time_range(Ref<SceneGraph::Node> node, const BBox1f& time_range) |
| 1197 | { |