mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-28 00:56:37 +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
 |