//-----------------------------------------------------------------------------
//  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;
}
Example #2
0
/** 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;
}