void updateEdgeLevelBuffer( ISPCSubdivMesh* mesh, const Vec3fa& cam_pos, size_t startID, size_t endID ) { for (size_t f=startID; f<endID;f++) { unsigned int e = mesh->face_offsets[f]; unsigned int N = mesh->verticesPerFace[f]; if (N == 4) /* fast path for quads */ for (size_t i=0; i<4; i++) mesh->subdivlevel[e+i] = updateEdgeLevel(mesh,cam_pos,e+(i+0),e+(i+1)%4); else if (N == 3) /* fast path for triangles */ for (size_t i=0; i<3; i++) mesh->subdivlevel[e+i] = updateEdgeLevel(mesh,cam_pos,e+(i+0),e+(i+1)%3); else /* fast path for general polygons */ for (size_t i=0; i<N; i++) mesh->subdivlevel[e+i] = updateEdgeLevel(mesh,cam_pos,e+(i+0),e+(i+1)%N); } }
void setTriangleSubdivCubeLevels (RTCGeometry geom, const Vec3fa& cam_pos) { Vec3fa* vtx = (Vec3fa*) rtcGetGeometryBufferData(geom, RTC_BUFFER_TYPE_VERTEX, 0); if (vtx == nullptr) return; float* level = (float*) rtcGetGeometryBufferData(geom, RTC_BUFFER_TYPE_LEVEL, 0); if (level == nullptr) return; for (unsigned int i=0; i<NUM_TRI_INDICES; i+=3) { level[i+0] = updateEdgeLevel(cam_pos, vtx, cube_tri_indices, i+0, i+1); level[i+1] = updateEdgeLevel(cam_pos, vtx, cube_tri_indices, i+1, i+2); level[i+2] = updateEdgeLevel(cam_pos, vtx, cube_tri_indices, i+2, i+0); } rtcUpdateGeometryBuffer(geom, RTC_BUFFER_TYPE_LEVEL, 0); rtcCommitGeometry(geom); }