AxisAlignedBox3f TriMesh::calcBoundingBox( const Matrix44f &transform ) const { if( mVertices.empty() ) return AxisAlignedBox3f( Vec3f::zero(), Vec3f::zero() ); Vec3f min( transform.transformPointAffine( mVertices[0] ) ); Vec3f max( min ); for( size_t i = 0; i < mVertices.size(); ++i ) { Vec3f v = transform.transformPointAffine( mVertices[i] ); if( v.x < min.x ) min.x = v.x; else if( v.x > max.x ) max.x = v.x; if( v.y < min.y ) min.y = v.y; else if( v.y > max.y ) max.y = v.y; if( v.z < min.z ) min.z = v.z; else if( v.z > max.z ) max.z = v.z; } return AxisAlignedBox3f( min, max ); }
AxisAlignedBox3f TriMesh::calcBoundingBox() const { if( mVertices.empty() ) return AxisAlignedBox3f( Vec3f::zero(), Vec3f::zero() ); Vec3f min(mVertices[0]), max(mVertices[0]); for( size_t i = 1; i < mVertices.size(); ++i ) { if( mVertices[i].x < min.x ) min.x = mVertices[i].x; else if( mVertices[i].x > max.x ) max.x = mVertices[i].x; if( mVertices[i].y < min.y ) min.y = mVertices[i].y; else if( mVertices[i].y > max.y ) max.y = mVertices[i].y; if( mVertices[i].z < min.z ) min.z = mVertices[i].z; else if( mVertices[i].z > max.z ) max.z = mVertices[i].z; } return AxisAlignedBox3f( min, max ); }
AxisAlignedBox3f AxisAlignedBox3f::transformed( const Matrix44f &transform ) const { Vec3f verts[8]; for(size_t i=0;i<8;i++) verts[i] = transform.transformPointAffine(mVerts[i]); Vec3f min = verts[0]; Vec3f max = verts[0]; for(size_t i=1;i<8;i++) { if(verts[i].x < min.x) min.x = verts[i].x; if(verts[i].y < min.y) min.y = verts[i].y; if(verts[i].z < min.z) min.z = verts[i].z; if(verts[i].x > max.x) max.x = verts[i].x; if(verts[i].y > max.y) max.y = verts[i].y; if(verts[i].z > max.z) max.z = verts[i].z; } return AxisAlignedBox3f(min, max); }
//---------------------------------------------------------------------------- void IntersectingBoxes::CreateScene () { // Create some axis-aligned boxes for intersection testing. const int imax = 16; int i; for (i = 0; i < imax; ++i) { float xMin = 0.5f*mSize*Mathf::SymmetricRandom(); float xMax = xMin + Mathf::IntervalRandom(8.0f, 32.0f); float yMin = 0.5f*mSize*Mathf::SymmetricRandom(); float yMax = yMin + Mathf::IntervalRandom(8.0f, 32.0f); float zMin = 0.5f*mSize*Mathf::SymmetricRandom(); float zMax = zMin + Mathf::IntervalRandom(8.0f, 32.0f); mBoxes.push_back( AxisAlignedBox3f(xMin, xMax, yMin, yMax, zMin, zMax)); } mManager = new0 BoxManagerf(mBoxes); // Scene graph for the visual representation of the boxes. mScene = new0 Node(); mWireState = new0 WireState(); mRenderer->SetOverrideWireState(mWireState); // Effects for boxes, blue for nonintersecting and red for intersecting. Float4 black(0.0f, 0.0f, 0.0f, 1.0f); Float4 white(1.0f, 1.0f, 1.0f, 1.0f); Material* blueMaterial = new0 Material(); blueMaterial->Emissive = black; blueMaterial->Ambient = Float4(0.25f, 0.25f, 0.25f, 1.0f); blueMaterial->Diffuse = Float4(0.0f, 0.0f, 1.0f, 1.0f); blueMaterial->Specular = black; Material* redMaterial = new0 Material(); redMaterial->Emissive = black; redMaterial->Ambient = Float4(0.25f, 0.25f, 0.25f, 1.0f); redMaterial->Diffuse = Float4(1.0f, 0.0f, 0.0f, 1.0f); redMaterial->Specular = black; // A light for the effects. Light* light = new0 Light(Light::LT_DIRECTIONAL); light->Ambient = white; light->Diffuse = white; light->Specular = black; light->SetDirection(AVector::UNIT_Z); LightDirPerVerEffect* effect = new0 LightDirPerVerEffect(); mNoIntersectEffect = effect->CreateInstance(light, blueMaterial); mIntersectEffect = effect->CreateInstance(light, redMaterial); // Create visual representations of the boxes. VertexFormat* vformat = VertexFormat::Create(2, VertexFormat::AU_POSITION, VertexFormat::AT_FLOAT3, 0, VertexFormat::AU_NORMAL, VertexFormat::AT_FLOAT3, 0); for (i = 0; i < imax; ++i) { APoint center( 0.5f*(mBoxes[i].Min[0] + mBoxes[i].Max[0]), 0.5f*(mBoxes[i].Min[1] + mBoxes[i].Max[1]), 0.5f*(mBoxes[i].Min[2] + mBoxes[i].Max[2])); Transform transform; transform.SetTranslate(center); float xExtent = 0.5f*(mBoxes[i].Max[0] - mBoxes[i].Min[0]); float yExtent = 0.5f*(mBoxes[i].Max[1] - mBoxes[i].Min[1]); float zExtent = 0.5f*(mBoxes[i].Max[2] - mBoxes[i].Min[2]); StandardMesh sm(vformat, true, false, &transform); TriMesh* mesh = sm.Box(xExtent, yExtent, zExtent); mesh->SetEffectInstance(mNoIntersectEffect); mScene->AttachChild(mesh); } }