size_t BVH4HairBuilder::getNumPrimitives() { DBG(PING); /* count total number of virtual objects */ size_t numCurves = 0; for (size_t i=0;i<scene->size();i++) { if (unlikely(scene->get(i) == nullptr)) continue; if (unlikely((scene->get(i)->type != Geometry::BEZIER_CURVES))) continue; if (unlikely(!scene->get(i)->isEnabled())) continue; BezierCurves* geom = (BezierCurves*) scene->getBezierCurves(i); numCurves += geom->size(); } return numCurves; }
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); }