void GroundPlane::setTransform( const MatrixF &mat ) { Parent::setTransform( mat ); // Parent::setTransforms ends up setting our worldBox to something other than // global, so we have to set it back... but we can't actually call setGlobalBounds // again because it does extra work adding and removing us from the container. mGlobalBounds = true; mObjBox.minExtents.set(-1e10, -1e10, -1e10); mObjBox.maxExtents.set( 1e10, 1e10, 1e10); resetWorldBox(); mPlaneBox = getPlaneBox(); }
bool GroundPlane::buildPolyList( PolyListContext context, AbstractPolyList* polyList, const Box3F& box, const SphereF& ) { polyList->setObject( this ); polyList->setTransform( &MatrixF::Identity, Point3F( 1.0f, 1.0f, 1.0f ) ); if(context == PLC_Navigation) { F32 z = getPosition().z; Point3F p0(box.minExtents.x, box.maxExtents.y, z), p1(box.maxExtents.x, box.maxExtents.y, z), p2(box.maxExtents.x, box.minExtents.y, z), p3(box.minExtents.x, box.minExtents.y, z); // Add vertices to poly list. U32 v0 = polyList->addPoint(p0); polyList->addPoint(p1); polyList->addPoint(p2); polyList->addPoint(p3); // Add plane between first three vertices. polyList->begin(0, 0); polyList->vertex(v0); polyList->vertex(v0+1); polyList->vertex(v0+2); polyList->plane(v0, v0+1, v0+2); polyList->end(); // Add plane between last three vertices. polyList->begin(0, 1); polyList->vertex(v0+2); polyList->vertex(v0+3); polyList->vertex(v0); polyList->plane(v0+2, v0+3, v0); polyList->end(); return true; } Box3F planeBox = getPlaneBox(); polyList->addBox( planeBox, mMaterial ); return true; }
void GroundPlane::buildConvex( const Box3F& box, Convex* convex ) { mConvexList->collectGarbage(); Box3F planeBox = getPlaneBox(); if ( !box.isOverlapped( planeBox ) ) return; // See if we already have a convex in the working set. BoxConvex *boxConvex = NULL; CollisionWorkingList &wl = convex->getWorkingList(); CollisionWorkingList *itr = wl.wLink.mNext; for ( ; itr != &wl; itr = itr->wLink.mNext ) { if ( itr->mConvex->getType() == BoxConvexType && itr->mConvex->getObject() == this ) { boxConvex = (BoxConvex*)itr->mConvex; break; } } if ( !boxConvex ) { boxConvex = new BoxConvex; mConvexList->registerObject( boxConvex ); boxConvex->init( this ); convex->addToWorkingList( boxConvex ); } // Update our convex to best match the queried box if ( boxConvex ) { Point3F queryCenter = box.getCenter(); boxConvex->mCenter = Point3F( queryCenter.x, queryCenter.y, -GROUND_PLANE_BOX_HEIGHT_HALF ); boxConvex->mSize = Point3F( box.getExtents().x, box.getExtents().y, GROUND_PLANE_BOX_HEIGHT_HALF ); } }