void BVH4HairBuilder::computePrimRefsBezierCurves(const size_t threadID, const size_t numThreads) { DBG(PING); const size_t numTotalGroups = scene->size(); /* count total number of virtual objects */ const size_t numBezierCurves = numPrimitives; const size_t startID = (threadID+0)*numBezierCurves/numThreads; const size_t endID = (threadID+1)*numBezierCurves/numThreads; Bezier1i *__restrict__ const bptr = (Bezier1i*)this->prims; // === find first group containing startID === unsigned int g=0, numSkipped = 0; for (; g<numTotalGroups; g++) { if (unlikely(scene->get(g) == nullptr)) continue; if (unlikely((scene->get(g)->type != Geometry::BEZIER_CURVES))) continue; if (unlikely(!scene->get(g)->isEnabled())) continue; BezierCurves* geom = (BezierCurves*) scene->getBezierCurves(g); const size_t numPrims = geom->size(); if (numSkipped + numPrims > startID) break; numSkipped += numPrims; } CentroidGeometryAABB bounds_cs; bounds_cs.reset(); /* start with first group containing startID */ unsigned int num = 0; unsigned int currentID = startID; unsigned int offset = startID - numSkipped; for (; g<numTotalGroups; g++) { if (unlikely(scene->get(g) == nullptr)) continue; if (unlikely((scene->get(g)->type != Geometry::BEZIER_CURVES))) continue; if (unlikely(!scene->get(g)->isEnabled())) continue; BezierCurves* geom = (BezierCurves*) scene->getBezierCurves(g); size_t N = geom->size(); for (unsigned int i=offset; i<N && currentID < endID; i++, currentID++) { const mic2f b2 = geom->bounds_mic2f(i); const mic_f bmin = b2.x; const mic_f bmax = b2.y; bounds_cs.extend(bmin,bmax); bptr[currentID].p = geom->fristVertexPtr(i); // FIXME: this does not support strides!! bptr[currentID].geomID = g; bptr[currentID].primID = i; } if (currentID == endID) break; offset = 0; } /* update global bounds */ Centroid_Scene_AABB bounds (bounds_cs); global_bounds.extend_atomic(bounds); }
void BVH4HairBuilder::computePrimRefsBezierCurves(const size_t threadID, const size_t numThreads) { DBG(PING); const size_t numTotalGroups = scene->size(); /* count total number of virtual objects */ const size_t numBezierCurves = numPrimitives; const size_t startID = (threadID+0)*numBezierCurves/numThreads; const size_t endID = (threadID+1)*numBezierCurves/numThreads; Bezier1i *__restrict__ const bptr = (Bezier1i*)this->prims; // === find first group containing startID === unsigned int g=0, numSkipped = 0; for (; g<numTotalGroups; g++) { if (unlikely(scene->get(g) == NULL)) continue; if (unlikely((scene->get(g)->type != BEZIER_CURVES))) continue; if (unlikely(!scene->get(g)->isEnabled())) continue; BezierCurves* geom = (BezierCurves*) scene->getBezierCurves(g); const size_t numPrims = geom->numCurves; if (numSkipped + numPrims > startID) break; numSkipped += numPrims; } /* start with first group containing startID */ mic_f bounds_scene_min((float)pos_inf); mic_f bounds_scene_max((float)neg_inf); mic_f bounds_centroid_min((float)pos_inf); mic_f bounds_centroid_max((float)neg_inf); unsigned int num = 0; unsigned int currentID = startID; unsigned int offset = startID - numSkipped; for (; g<numTotalGroups; g++) { if (unlikely(scene->get(g) == NULL)) continue; if (unlikely((scene->get(g)->type != BEZIER_CURVES))) continue; if (unlikely(!scene->get(g)->isEnabled())) continue; BezierCurves* geom = (BezierCurves*) scene->getBezierCurves(g); size_t N = geom->numCurves; for (unsigned int i=offset; i<N && currentID < endID; i++, currentID++) { const mic2f b2 = geom->bounds_mic2f(i); const mic_f bmin = b2.x; const mic_f bmax = b2.y; bounds_scene_min = min(bounds_scene_min,bmin); bounds_scene_max = max(bounds_scene_max,bmax); const mic_f centroid2 = bmin+bmax; bounds_centroid_min = min(bounds_centroid_min,centroid2); bounds_centroid_max = max(bounds_centroid_max,centroid2); bptr[currentID].p = geom->fristVertexPtr(i); bptr[currentID].geomID = g; bptr[currentID].primID = i; } if (currentID == endID) break; offset = 0; } /* update global bounds */ Centroid_Scene_AABB bounds; store4f(&bounds.centroid2.lower,bounds_centroid_min); store4f(&bounds.centroid2.upper,bounds_centroid_max); store4f(&bounds.geometry.lower,bounds_scene_min); store4f(&bounds.geometry.upper,bounds_scene_max); global_bounds.extend_atomic(bounds); }