BBox3f TriangleMeshTriangle4::update(char* prim, size_t num, void* geom) const { BBox3f bounds = empty; TriangleMeshScene::TriangleMesh* mesh = (TriangleMeshScene::TriangleMesh*) geom; for (size_t j=0; j<num; j++) { Triangle4& dst = ((Triangle4*) prim)[j]; ssei vgeomID = -1, vprimID = -1, vmask = -1; sse3f v0 = zero, v1 = zero, v2 = zero; for (size_t i=0; i<4; i++) { if (dst.primID[i] == -1) break; const unsigned geomID = dst.geomID[i]; const unsigned primID = dst.primID[i]; const TriangleMeshScene::TriangleMesh::Triangle& tri = mesh->triangle(primID); const Vec3fa p0 = mesh->vertex(tri.v[0]); const Vec3fa p1 = mesh->vertex(tri.v[1]); const Vec3fa p2 = mesh->vertex(tri.v[2]); bounds.extend(merge(BBox3f(p0),BBox3f(p1),BBox3f(p2))); vgeomID [i] = geomID; vprimID [i] = primID; vmask [i] = mesh->mask; v0.x[i] = p0.x; v0.y[i] = p0.y; v0.z[i] = p0.z; v1.x[i] = p1.x; v1.y[i] = p1.y; v1.z[i] = p1.z; v2.x[i] = p2.x; v2.y[i] = p2.y; v2.z[i] = p2.z; } new (&dst) Triangle4(v0,v1,v2,vgeomID,vprimID,vmask); } return bounds; }
void SnowModel::checkBoundingBox() { float minX = 0.0f, minY = 0.0f, minZ = 0.0f; float maxX = 0.0f, maxY = 0.0f, maxZ = 0.0f; if (edge_groups.size() > 0) { std::vector<EdgeGroup*>::iterator it = edge_groups.begin(); BBox3f bb = (*it)->GetBoundingBox(); point3f minBB = bb.min; minX = minBB.x(), minY = minBB.y(), minZ = minBB.z(); point3f maxBB = bb.max; maxX = maxBB.x(), maxY = maxBB.y(), maxZ = maxBB.z(); // increment the iterator // (we handled the first edge group seperately) ++it; while (it != edge_groups.end()) { bb = (*it)->GetBoundingBox(); minBB = bb.min; maxBB = bb.max;; if ( minBB.x() < minX ) minX = minBB.x(); if ( minBB.y() < minY ) minY = minBB.y(); if ( minBB.z() < minZ ) minZ = minBB.z(); if ( maxBB.x() > maxX ) maxX = maxBB.x(); if ( maxBB.y() > maxY ) maxY = maxBB.y(); if ( maxBB.z() > maxZ ) maxZ = maxBB.z(); ++it; } } m_boundingbox = BBox3f(point3f(minX, minY, minZ), point3f(maxX, maxY, maxZ)); }
BBox3f TriangleMeshTriangle1v::update(char* prim, size_t num, void* geom) const { BBox3f bounds = empty; const TriangleMeshScene::TriangleMesh* mesh = (const TriangleMeshScene::TriangleMesh*) geom; for (size_t j=0; j<num; j++) { Triangle1v& dst = ((Triangle1v*) prim)[j]; const unsigned geomID = dst.geomID(); const unsigned primID = dst.primID(); const TriangleMeshScene::TriangleMesh::Triangle& tri = mesh->triangle(primID); const Vec3fa v0 = mesh->vertex(tri.v[0]); const Vec3fa v1 = mesh->vertex(tri.v[1]); const Vec3fa v2 = mesh->vertex(tri.v[2]); new (&dst) Triangle1v(v0,v1,v2,geomID,primID,mesh->mask); bounds.extend(merge(BBox3f(v0),BBox3f(v1),BBox3f(v2))); } return bounds; }
void rtcSetVirtualGeometryBounds (RTCGeometry* geom, const size_t i, const float* lower, const float* upper, const RTCTransformation* local2world) { VirtualScene::Object& obj = ((VirtualScene*)geom)->get(i); if (lower && upper) { obj.localBounds = BBox3f(Vector3f(lower[0],lower[1],lower[2]), Vector3f(upper[0],upper[1],upper[2])); } if (local2world) { obj.local2world = AffineSpace3f(Vector3f(local2world->vxx,local2world->vxy,local2world->vxz), Vector3f(local2world->vyx,local2world->vyy,local2world->vyz), Vector3f(local2world->vzx,local2world->vzy,local2world->vzz), Vector3f(local2world->px ,local2world->py ,local2world->pz )); obj.hasTransform = obj.local2world != AffineSpace3f(one); } obj.calculateWorldData(); }
std::pair<BBox3f,BBox3f> TriangleMeshTriangle1vMB::update2(char* prim, size_t num, void* geom) const { BBox3f bounds0 = empty, bounds1 = empty; for (size_t j=0; j<num; j++) { const Triangle1vMB& tri = ((Triangle1vMB*) prim)[j]; bounds0.extend(merge(BBox3f(tri.v0),BBox3f(tri.v1),BBox3f(tri.v2))); bounds1.extend(merge(BBox3f(tri.v0+tri.d0),BBox3f(tri.v1+tri.d1),BBox3f(tri.v2+tri.d2))); } return std::pair<BBox3f,BBox3f>(bounds0,bounds1); }
// get the bounding box of all meshes BBox3f EdgeGroupFace::GetBoundingBox() { // we have at least 3 vertices, // so is is ok to assume vertices[0] exists point3f min = vertices[0]->position; point3f max = min; for (int i = 1; i < nVertices; ++i) { point3f pos = vertices[i]->position; if ( pos.x() < min.x() ) min.x() = pos.x(); if ( pos.x() > max.x() ) max.x() = pos.x(); if ( pos.y() < min.y() ) min.y() = pos.y(); if ( pos.y() > max.y() ) max.y() = pos.y(); if ( pos.z() < min.z() ) min.z() = pos.z(); if ( pos.z() > max.z() ) max.z() = pos.z(); } return BBox3f(min, max); }