mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 00:56:39 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			81 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						|
 * =====================================================================================
 | 
						|
 *
 | 
						|
 *       Filename:  BtOgrePG.h
 | 
						|
 *
 | 
						|
 *    Description:  The part of BtOgre that handles information transfer from Bullet to
 | 
						|
 *                  Ogre (like updating graphics object positions).
 | 
						|
 *
 | 
						|
 *        Version:  1.0
 | 
						|
 *        Created:  27/12/2008 03:40:56 AM
 | 
						|
 *
 | 
						|
 *         Author:  Nikhilesh (nikki)
 | 
						|
 *
 | 
						|
 * =====================================================================================
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef BtOgreGP_H_
 | 
						|
#define BtOgreGP_H_
 | 
						|
 | 
						|
#include "btBulletDynamicsCommon.h"
 | 
						|
#include "OgreSceneNode.h"
 | 
						|
#include "BtOgreExtras.h"
 | 
						|
 | 
						|
namespace BtOgre {
 | 
						|
 | 
						|
//A MotionState is Bullet's way of informing you about updates to an object.
 | 
						|
//Pass this MotionState to a btRigidBody to have your SceneNode updated automaticaly.
 | 
						|
class RigidBodyState : public btMotionState
 | 
						|
{
 | 
						|
    protected:
 | 
						|
        btTransform mTransform;
 | 
						|
        btTransform mCenterOfMassOffset;
 | 
						|
 | 
						|
        Ogre::SceneNode *mNode;
 | 
						|
 | 
						|
    public:
 | 
						|
        RigidBodyState(Ogre::SceneNode *node, const btTransform &transform, const btTransform &offset = btTransform::getIdentity())
 | 
						|
            : mTransform(transform),
 | 
						|
              mCenterOfMassOffset(offset),
 | 
						|
              mNode(node)
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        RigidBodyState(Ogre::SceneNode *node)
 | 
						|
            : mTransform(((node != NULL) ? BtOgre::Convert::toBullet(node->getOrientation()) : btQuaternion(0,0,0,1)),
 | 
						|
                         ((node != NULL) ? BtOgre::Convert::toBullet(node->getPosition())    : btVector3(0,0,0))),
 | 
						|
              mCenterOfMassOffset(btTransform::getIdentity()),
 | 
						|
              mNode(node)
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        virtual void getWorldTransform(btTransform &ret) const
 | 
						|
        {
 | 
						|
            ret = mCenterOfMassOffset.inverse() * mTransform;
 | 
						|
        }
 | 
						|
 | 
						|
        virtual void setWorldTransform(const btTransform &in)
 | 
						|
        {
 | 
						|
            if (mNode == NULL)
 | 
						|
                return;
 | 
						|
 | 
						|
            mTransform = in;
 | 
						|
            btTransform transform = in * mCenterOfMassOffset;
 | 
						|
 | 
						|
            btQuaternion rot = transform.getRotation();
 | 
						|
            btVector3 pos = transform.getOrigin();
 | 
						|
            mNode->setOrientation(rot.w(), rot.x(), rot.y(), rot.z());
 | 
						|
            mNode->setPosition(pos.x(), pos.y(), pos.z());
 | 
						|
        }
 | 
						|
 | 
						|
        void setNode(Ogre::SceneNode *node)
 | 
						|
        {
 | 
						|
            mNode = node;
 | 
						|
        }
 | 
						|
};
 | 
						|
 | 
						|
//Softbody-Ogre connection goes here!
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
#endif
 |