/** * This function does prism intersection tests with the terrain. * * @param source The source of the prism. * @param extent The end point to test. * @param pCallback The terrain collision callback. */ bool TerrainHeightMap1::collide ( WorldTriangle const &source, Vector3 const &extent, TerrainCollisionCallback *pCallback ) const { BW_GUARD; BoundingBox bb; bb.addBounds(source.v0()); bb.addBounds(source.v1()); bb.addBounds(source.v2()); Vector3 delta = extent - source.v0(); bb.addBounds(extent); bb.addBounds(source.v1() + delta); bb.addBounds(source.v2() + delta); return hmCollide(source, extent, bb.minBounds().x, bb.minBounds().z, bb.maxBounds().x, bb.maxBounds().z, pCallback); }
void ChunkExitPortal::edBounds( BoundingBox & bbRet ) const { BW_GUARD; const std::vector<Vector2> & points = portal_.points; bbRet = BoundingBox::s_insideOut_; // first find the average in portal space again Vector2 avg( 0.f, 0.f ); for (uint i = 0; i < points.size(); i++) avg += points[i]; avg /= float( points.size() ); // now build up the bounding box (also in portal space) for (uint i = 0; i < points.size(); i++) { const Vector2 & apt = points[i]; bbRet.addBounds( Vector3( apt.x - avg.x, apt.y - avg.y, 0.f ) ); } // and add a bit of depth bbRet.addBounds( Vector3( 0.f, 0.f, 0.2f ) ); }
/** * We want to add up everyone's bounding boxes */ void PyModelNode::boundingBoxAcc( BoundingBox & bb ) { BW_GUARD; if (attachments_.empty()) return; BoundingBox tbb = BoundingBox::s_insideOut_; for (PyAttachments::iterator it = attachments_.begin(); it != attachments_.end(); it++) { (*it)->boundingBoxAcc( tbb ); } // PyModel wants world-coord bbs from us if (!(tbb == BoundingBox::s_insideOut_)) { tbb.transformBy( lastWorldTransform_ ); bb.addBounds( tbb ); } }