//----------------------------------------------------------------------------- // CalcBBox //----------------------------------------------------------------------------- NxBox CPhysicModelSimple::CalcBBox (void) const { NxBounds3 bounds; for (int i = 0; i < (int)m_ActorDesc.shapes.size(); i++) { NxShapeDesc* pShapeDesc = m_ActorDesc.shapes[i]; switch (pShapeDesc->getType()) { case NX_SHAPE_BOX: { NxBoxShapeDesc* pBoxShape = (NxBoxShapeDesc*) pShapeDesc; NxBox shapeBBox (pBoxShape->localPose.t, pBoxShape->dimensions, pBoxShape->localPose.M); NxBounds3 shapeBounds; shapeBounds.boundsOfOBB( shapeBBox.rot, shapeBBox.center, shapeBBox.extents ); bounds.combine (shapeBounds); } break; case NX_SHAPE_SPHERE: { NxSphereShapeDesc* pSphereShape = (NxSphereShapeDesc*) pShapeDesc; NxBox shapeBBox (pSphereShape->localPose.t, NxVec3(pSphereShape->radius), pSphereShape->localPose.M); NxBounds3 shapeBounds; shapeBounds.boundsOfOBB( shapeBBox.rot, shapeBBox.center, shapeBBox.extents ); bounds.combine (shapeBounds); } break; default: // Caso no soportado assert(0); break; } } NxBox result; bounds.getCenter (result.center); bounds.getExtents (result.extents); return result; }
/** Returns bounds description associated with the Novodex shape description. */ Bounds::Desc::Ptr PhysScene::createBoundsDesc(const NxShapeDesc &nxShapeDesc) { // check if bound description has been already created BoundsDescMap::const_iterator pos = boundsDescMap.find(&nxShapeDesc); if (pos != boundsDescMap.end()) return pos->second; Bounds::Desc::Ptr pBoundsDesc; // check if description is valid if (!nxShapeDesc.isValid()) throw MsgPhysSceneNxShapeDescInvalidDesc(Message::LEVEL_ERROR, "PhysScene::createBoundsDesc(): invalid Novodex shape description"); NxShapeDescPtr nxShapeDescPtr; if (nxShapeDesc.getType() == NX_SHAPE_PLANE) { const NxPlaneShapeDesc *pDescSrc = dynamic_cast<const NxPlaneShapeDesc*>(&nxShapeDesc); if (pDescSrc != NULL) { NxPlaneShapeDesc *pDescDst = new NxPlaneShapeDesc(); nxShapeDescPtr.reset(pDescDst); ::memcpy(pDescDst, pDescSrc, sizeof(NxPlaneShapeDesc)); pBoundsDesc = createBoundsDesc(pDescDst); } } else if (nxShapeDesc.getType() == NX_SHAPE_SPHERE) { const NxSphereShapeDesc *pDescSrc = dynamic_cast<const NxSphereShapeDesc*>(&nxShapeDesc); if (pDescSrc != NULL) { NxSphereShapeDesc *pDescDst = new NxSphereShapeDesc(); nxShapeDescPtr.reset(pDescDst); ::memcpy(pDescDst, pDescSrc, sizeof(NxSphereShapeDesc)); pBoundsDesc = createBoundsDesc(pDescDst); } } else if (nxShapeDesc.getType() == NX_SHAPE_BOX) { const NxBoxShapeDesc *pDescSrc = dynamic_cast<const NxBoxShapeDesc*>(&nxShapeDesc); if (pDescSrc != NULL) { NxBoxShapeDesc *pDescDst = new NxBoxShapeDesc(); nxShapeDescPtr.reset(pDescDst); ::memcpy(pDescDst, pDescSrc, sizeof(NxBoxShapeDesc)); pBoundsDesc = createBoundsDesc(pDescDst); } } else if (nxShapeDesc.getType() == NX_SHAPE_CONVEX) { const NxConvexShapeDesc *pDescSrc = dynamic_cast<const NxConvexShapeDesc*>(&nxShapeDesc); if (pDescSrc != NULL) { NxConvexShapeDesc *pDescDst = new NxConvexShapeDesc(); nxShapeDescPtr.reset(pDescDst); ::memcpy(pDescDst, pDescSrc, sizeof(NxConvexShapeDesc)); pBoundsDesc = createBoundsDesc(pDescDst); // Access to PhysX } } else { ASSERT(false) } if (pBoundsDesc == NULL) throw MsgSceneBoundsDescCreate(Message::LEVEL_ERROR, "PhysScene::createBoundsDesc(): failed to create bounds description"); nxShapeDescMap[pBoundsDesc.get()] = nxShapeDescPtr; boundsDescMap[nxShapeDescPtr.get()] = pBoundsDesc; return pBoundsDesc; }