Esempio n. 1
0
  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; 
  }
Esempio n. 2
0
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));
}
Esempio n. 3
0
 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; 
 }
Esempio n. 4
0
 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();
 }
Esempio n. 5
0
 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);
 }
Esempio n. 6
0
	// 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);
	}