From 33fe80723ccda649ed2a1391002cc32489c6d6f2 Mon Sep 17 00:00:00 2001
From: Jason Hooks <jhooks1@mix.wvu.edu>
Date: Sun, 17 Jun 2012 20:56:10 -0400
Subject: [PATCH] btScaledBvhTriangleMeshShapes

---
 apps/openmw/mwworld/physicssystem.cpp |  1 +
 apps/openmw/mwworld/physicssystem.hpp |  1 +
 libs/openengine/bullet/physic.cpp     | 16 ++++++++--------
 libs/openengine/bullet/physic.hpp     |  1 +
 libs/openengine/bullet/pmove.cpp      |  2 +-
 libs/openengine/bullet/pmove.h        |  4 ++--
 6 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/apps/openmw/mwworld/physicssystem.cpp b/apps/openmw/mwworld/physicssystem.cpp
index 3757609b2..46b72956d 100644
--- a/apps/openmw/mwworld/physicssystem.cpp
+++ b/apps/openmw/mwworld/physicssystem.cpp
@@ -237,6 +237,7 @@ namespace MWWorld
     void PhysicsSystem::addObject (const std::string& handle, const std::string& mesh,
         const Ogre::Quaternion& rotation, float scale, const Ogre::Vector3& position)
     {
+        handleToMesh[handle] = mesh;
         OEngine::Physic::RigidBody* body = mEngine->createRigidBody(mesh,handle,scale);
         mEngine->addRigidBody(body);
         btTransform tr;
diff --git a/apps/openmw/mwworld/physicssystem.hpp b/apps/openmw/mwworld/physicssystem.hpp
index 1a8bd87ae..b46ce117b 100644
--- a/apps/openmw/mwworld/physicssystem.hpp
+++ b/apps/openmw/mwworld/physicssystem.hpp
@@ -72,6 +72,7 @@ namespace MWWorld
             OEngine::Physic::PhysicEngine* mEngine;
             bool mFreeFly;
             playerMove* playerphysics;
+            std::map<std::string, std::string> handleToMesh;
 
             PhysicsSystem (const PhysicsSystem&);
             PhysicsSystem& operator= (const PhysicsSystem&);
diff --git a/libs/openengine/bullet/physic.cpp b/libs/openengine/bullet/physic.cpp
index d075536d2..6c4e42697 100644
--- a/libs/openengine/bullet/physic.cpp
+++ b/libs/openengine/bullet/physic.cpp
@@ -324,24 +324,24 @@ namespace Physic
 
     RigidBody* PhysicEngine::createRigidBody(std::string mesh,std::string name,float scale)
     {
-        char uniqueID[8];
+        /*char uniqueID[8];
         sprintf( uniqueID, "%07.3f", scale );
         std::string sid = uniqueID;
-        std::string outputstring = mesh + uniqueID + "\"|";
+        std::string outputstring = mesh + uniqueID + "\"|";*/
         //std::cout << "The string" << outputstring << "\n";
 
         //get the shape from the .nif
-        mShapeLoader->load(outputstring,"General");
-        BulletShapeManager::getSingletonPtr()->load(outputstring,"General");
-        BulletShapePtr shape = BulletShapeManager::getSingleton().getByName(outputstring,"General");
-        shape->Shape->setLocalScaling(btVector3(scale,scale,scale));
-        
+        mShapeLoader->load(mesh,"General");
+        BulletShapeManager::getSingletonPtr()->load(mesh,"General");
+        BulletShapePtr shape = BulletShapeManager::getSingleton().getByName(mesh,"General");
+        //shape->Shape->setLocalScaling();
+        btScaledBvhTriangleMeshShape* scaled = new btScaledBvhTriangleMeshShape(dynamic_cast<btBvhTriangleMeshShape*> (shape->Shape), btVector3(scale,scale,scale));
 
         //create the motionState
         CMotionState* newMotionState = new CMotionState(this,name);
 
         //create the real body
-        btRigidBody::btRigidBodyConstructionInfo CI = btRigidBody::btRigidBodyConstructionInfo(0,newMotionState,shape->Shape);
+        btRigidBody::btRigidBodyConstructionInfo CI = btRigidBody::btRigidBodyConstructionInfo(0,newMotionState,scaled);
         RigidBody* body = new RigidBody(CI,name);
         body->collide = shape->collide;
         return body;
diff --git a/libs/openengine/bullet/physic.hpp b/libs/openengine/bullet/physic.hpp
index 811572320..8a3295ec3 100644
--- a/libs/openengine/bullet/physic.hpp
+++ b/libs/openengine/bullet/physic.hpp
@@ -7,6 +7,7 @@
 #include <list>
 #include <map>
 #include "BulletShapeLoader.h"
+#include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h"
 
 class btRigidBody;
 class btBroadphaseInterface;
diff --git a/libs/openengine/bullet/pmove.cpp b/libs/openengine/bullet/pmove.cpp
index 6173acacf..fa87e9040 100644
--- a/libs/openengine/bullet/pmove.cpp
+++ b/libs/openengine/bullet/pmove.cpp
@@ -1430,7 +1430,7 @@ static void PM_GroundTrace( void )
     // if the trace didn't hit anything, we are in free fall
 	if ( trace.fraction == 1.0) 
 	{
-        if(pm->ps.velocity.z > 50.0f && pm->ps.bSnap)
+        if(pm->ps.velocity.z > 50.0f && pm->ps.bSnap && pm->ps.speed > 1000.0f)
             pm->ps.velocity.z = 50.0f;
         if(pm->ps.snappingImplemented){
             if(pm->ps.bSnap && pm->ps.counter <= 0)
diff --git a/libs/openengine/bullet/pmove.h b/libs/openengine/bullet/pmove.h
index bc475a934..592ca724d 100644
--- a/libs/openengine/bullet/pmove.h
+++ b/libs/openengine/bullet/pmove.h
@@ -42,7 +42,7 @@ static const Ogre::Vector3 halfExtents(14.64f * 2, 14.24f * 2, 33.25f * 2);
 #define	ENTITYNUM_NONE (MAX_GENTITIES - 1)
 #define ENTITYNUM_WORLD (MAX_GENTITIES - 2)
 #define	MIN_WALK_NORMAL .7f // can't walk on very steep slopes
-#define	JUMP_VELOCITY (540)
+#define	JUMP_VELOCITY (270)
 #define PS_PMOVEFRAMECOUNTBITS 6
 #define	MINS_Z -24
 #define	DEFAULT_VIEWHEIGHT 26
@@ -90,7 +90,7 @@ struct playerMove
 {
 	struct playerStruct
 	{
-		playerStruct() : gravity(800.0f), speed(2000.0f), pmove_framecount(20), groundEntityNum(ENTITYNUM_NONE), commandTime(40), move_type(PM_NOCLIP), pm_time(0), snappingImplemented(true), bSnap(false), counter(-1)
+		playerStruct() : gravity(800.0f), speed(480.0f), pmove_framecount(20), groundEntityNum(ENTITYNUM_NONE), commandTime(40), move_type(PM_NOCLIP), pm_time(0), snappingImplemented(true), bSnap(false), counter(-1)
 		{
 			origin = Ogre::Vector3(733.164f,900.0f, 839.432f);
 			velocity = Ogre::Vector3(0.0f, 0.0f, 0.0f);