@@ -128,45 +128,39 @@ GPRTRayTracer::create_surface_tree(const std::shared_ptr<MeshManager>& mesh_mana
128128 std::vector<gprt::Instance> surfaceBlasInstances; // BLAS for each (surface) geometry in this volume
129129
130130 for (const auto &surf : volume_surfaces) {
131- auto num_faces = mesh_manager->num_surface_faces (surf);
132-
133- // get the sense of this surface with respect to the volume
134- Sense triangle_sense {Sense::UNSET };
135- auto surf_to_vol_senses = mesh_manager->get_parent_volumes (surf);
136- if (volume_id == surf_to_vol_senses.first ) triangle_sense = Sense::FORWARD ;
137- else if (volume_id == surf_to_vol_senses.second ) triangle_sense = Sense::REVERSE ;
138-
139131 DPTriangleGeomData* geom_data = nullptr ;
140132 auto triangleGeom = gprtGeomCreate<DPTriangleGeomData>(context_, trianglesGeomType_);
141133 geom_data = gprtGeomGetParameters (triangleGeom); // pointer to assign data to
142134
143135 // Get storage for vertices and indices
144136 auto vertices = mesh_manager->get_surface_vertices (surf);
145137 auto indices = mesh_manager->get_surface_connectivity (surf);
146- std::vector<double3> dbl3Vertices;
147- dbl3Vertices.reserve (vertices.size ());
148- for (const auto &vertex : vertices) {
149- dbl3Vertices.push_back ({vertex.x , vertex.y , vertex.z });
138+ if (indices.size () % 3 != 0 ) {
139+ fatal_error (" Surface {} connectivity size ({}) is not divisible by 3 for triangles" , surf, indices.size ());
140+ }
141+ std::vector<double3> dbl3Vertices (vertices.size ());
142+ for (size_t i = 0 ; i < vertices.size (); ++i) {
143+ const auto & vertex = vertices[i];
144+ dbl3Vertices[i] = {vertex.x , vertex.y , vertex.z };
150145 }
151146
152147 // Get storage for indices
153- std::vector<uint3> ui3Indices;
154- ui3Indices.reserve (indices.size () / 3 );
155- for (size_t i = 0 ; i < indices.size (); i += 3 ) {
156- ui3Indices.emplace_back (indices[i], indices[i + 1 ], indices[i + 2 ]);
148+ std::vector<uint3> ui3Indices (indices.size () / 3 );
149+ for (size_t i = 0 , triIdx = 0 ; i < indices.size (); i += 3 , ++triIdx) {
150+ ui3Indices[triIdx] = uint3 (indices[i], indices[i + 1 ], indices[i + 2 ]);
157151 }
158152
159153 // Get storage for normals
160- std::vector<double3> normals;
161- std::vector<GPRTPrimitiveRef> primitive_refs;
162- primitive_refs.reserve (num_faces);
163- normals.reserve (num_faces);
164- for (const auto &face : mesh_manager->get_surface_faces (surf)) {
154+ auto surface_faces = mesh_manager->get_surface_faces (surf);
155+ const size_t num_faces = surface_faces.size ();
156+
157+ std::vector<double3> normals (surface_faces.size ());
158+ std::vector<GPRTPrimitiveRef> primitive_refs (surface_faces.size ());
159+ for (size_t i = 0 ; i < surface_faces.size (); ++i) {
160+ const auto face = surface_faces[i];
165161 auto norm = mesh_manager->face_normal (face);
166- normals.push_back ({norm.x , norm.y , norm.z });
167- GPRTPrimitiveRef prim_ref;
168- prim_ref.id = face;
169- primitive_refs.push_back (prim_ref);
162+ normals[i] = {norm.x , norm.y , norm.z };
163+ primitive_refs[i].id = face;
170164 }
171165
172166 auto vertex_buffer = gprtDeviceBufferCreate<double3>(context_, dbl3Vertices.size (), dbl3Vertices.data ());
@@ -197,9 +191,6 @@ GPRTRayTracer::create_surface_tree(const std::shared_ptr<MeshManager>& mesh_mana
197191 // Store in maps
198192 surface_to_geometry_map_[surf] = triangleGeom;
199193
200- geom_data = gprtGeomGetParameters (triangleGeom);
201- instance = gprtAccelGetInstance (blas);
202- instance.mask = 0xff ;
203194 surfaceBlasInstances.push_back (instance);
204195 globalBlasInstances_.push_back (instance);
205196
@@ -240,26 +231,23 @@ GPRTRayTracer::create_element_tree(const std::shared_ptr<MeshManager>& mesh_mana
240231
241232 auto vertices = mesh_manager->get_volume_vertices (volume_id);
242233 auto indices = mesh_manager->get_volume_connectivity (volume_id);
243- std::vector<double3> dbl3Vertices;
244- dbl3Vertices.reserve (vertices.size ());
245- for (const auto &vertex : vertices) {
246- dbl3Vertices.push_back ({vertex.x , vertex.y , vertex.z });
234+
235+ std::vector<double3> dbl3Vertices (vertices.size ());
236+ for (size_t i = 0 ; i < vertices.size (); ++i) {
237+ const auto & vertex = vertices[i];
238+ dbl3Vertices[i] = {vertex.x , vertex.y , vertex.z };
247239 }
248240
249241 // Get storage for indices
250- std::vector<uint4> ui4Indices;
251- ui4Indices.reserve (indices.size () / 4 );
252- for (size_t i = 0 ; i + 3 < indices.size (); i += 4 ) {
253- ui4Indices.emplace_back (indices[i], indices[i + 1 ], indices[i + 2 ], indices[i + 3 ]);
242+ std::vector<uint4> ui4Indices (indices.size () / 4 );
243+ for (size_t i = 0 , tetIdx = 0 ; i < indices.size (); i += 4 , ++tetIdx) {
244+ ui4Indices[tetIdx] = uint4 (indices[i], indices[i + 1 ], indices[i + 2 ], indices[i + 3 ]);
254245 }
255246
256247 // Get storage for prim IDs
257- std::vector<GPRTPrimitiveRef> primitive_refs;
258- primitive_refs.reserve (mesh_manager->num_volume_elements (volume_id));
259- for (const auto &element : mesh_manager->get_volume_elements (volume_id)) {
260- GPRTPrimitiveRef prim_ref;
261- prim_ref.id = element;
262- primitive_refs.push_back (prim_ref);
248+ std::vector<GPRTPrimitiveRef> primitive_refs (volume_elements.size ());
249+ for (size_t i = 0 ; i < volume_elements.size (); ++i) {
250+ primitive_refs[i].id = volume_elements[i];
263251 }
264252
265253 auto vertex_buffer = gprtDeviceBufferCreate<double3>(context_, dbl3Vertices.size (), dbl3Vertices.data ());
0 commit comments