mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 03:56:39 +00:00 
			
		
		
		
	Use a full Movement to hand off to the world physics update
This commit is contained in:
		
							parent
							
								
									0ce188b7cc
								
							
						
					
					
						commit
						466c0086b8
					
				
					 7 changed files with 29 additions and 12 deletions
				
			
		| 
						 | 
					@ -44,6 +44,11 @@ namespace MWRender
 | 
				
			||||||
    class Animation;
 | 
					    class Animation;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MWMechanics
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    class Movement;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace MWWorld
 | 
					namespace MWWorld
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    class Fallback;
 | 
					    class Fallback;
 | 
				
			||||||
| 
						 | 
					@ -54,7 +59,7 @@ namespace MWWorld
 | 
				
			||||||
    class ESMStore;
 | 
					    class ESMStore;
 | 
				
			||||||
    class RefData;
 | 
					    class RefData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    typedef std::vector<std::pair<MWWorld::Ptr,Ogre::Vector3> > PtrMovementList;
 | 
					    typedef std::vector<std::pair<MWWorld::Ptr,MWMechanics::Movement> > PtrMovementList;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace MWBase
 | 
					namespace MWBase
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <OgreVector3.h>
 | 
					#include <OgreVector3.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "movement.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "../mwbase/environment.hpp"
 | 
					#include "../mwbase/environment.hpp"
 | 
				
			||||||
#include "../mwbase/world.hpp"
 | 
					#include "../mwbase/world.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,7 +59,7 @@ void Activators::update(float duration, bool paused)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        for(PtrControllerMap::iterator iter(mActivators.begin());iter != mActivators.end();++iter)
 | 
					        for(PtrControllerMap::iterator iter(mActivators.begin());iter != mActivators.end();++iter)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Ogre::Vector3 movement(0.0f);
 | 
					            Movement movement;
 | 
				
			||||||
            iter->second.update(duration, movement);
 | 
					            iter->second.update(duration, movement);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,6 +17,7 @@
 | 
				
			||||||
#include "../mwbase/windowmanager.hpp"
 | 
					#include "../mwbase/windowmanager.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "creaturestats.hpp"
 | 
					#include "creaturestats.hpp"
 | 
				
			||||||
 | 
					#include "movement.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace MWMechanics
 | 
					namespace MWMechanics
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -266,7 +267,7 @@ namespace MWMechanics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            for(PtrControllerMap::iterator iter(mActors.begin());iter != mActors.end();++iter)
 | 
					            for(PtrControllerMap::iterator iter(mActors.begin());iter != mActors.end();++iter)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Ogre::Vector3 movement(0.0f);
 | 
					                Movement movement;
 | 
				
			||||||
                iter->second.update(duration, movement);
 | 
					                iter->second.update(duration, movement);
 | 
				
			||||||
                mMovement.push_back(std::make_pair(iter->first, movement));
 | 
					                mMovement.push_back(std::make_pair(iter->first, movement));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@
 | 
				
			||||||
#include <map>
 | 
					#include <map>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "character.hpp"
 | 
					#include "character.hpp"
 | 
				
			||||||
 | 
					#include "movement.hpp"
 | 
				
			||||||
#include "../mwbase/world.hpp"
 | 
					#include "../mwbase/world.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Ogre
 | 
					namespace Ogre
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -21,6 +21,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <OgreStringConverter.h>
 | 
					#include <OgreStringConverter.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "movement.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "../mwrender/animation.hpp"
 | 
					#include "../mwrender/animation.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "../mwbase/environment.hpp"
 | 
					#include "../mwbase/environment.hpp"
 | 
				
			||||||
| 
						 | 
					@ -168,7 +170,7 @@ void CharacterController::markerEvent(float time, const std::string &evt)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void CharacterController::update(float duration, Ogre::Vector3 &movement)
 | 
					void CharacterController::update(float duration, Movement &movement)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    float speed = 0.0f;
 | 
					    float speed = 0.0f;
 | 
				
			||||||
    if(!(getState() >= CharState_Death1))
 | 
					    if(!(getState() >= CharState_Death1))
 | 
				
			||||||
| 
						 | 
					@ -190,14 +192,14 @@ void CharacterController::update(float duration, Ogre::Vector3 &movement)
 | 
				
			||||||
            float x = cls.getJump(mPtr);
 | 
					            float x = cls.getJump(mPtr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if(vec.x == 0 && vec.y == 0)
 | 
					            if(vec.x == 0 && vec.y == 0)
 | 
				
			||||||
                movement.z += x*duration;
 | 
					                movement.mPosition[2] += x*duration;
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                /* FIXME: this would be more correct if we were going into a jumping state,
 | 
					                /* FIXME: this would be more correct if we were going into a jumping state,
 | 
				
			||||||
                 * rather than normal walking/idle states. */
 | 
					                 * rather than normal walking/idle states. */
 | 
				
			||||||
                //Ogre::Vector3 lat = Ogre::Vector3(vec.x, vec.y, 0.0f).normalisedCopy();
 | 
					                //Ogre::Vector3 lat = Ogre::Vector3(vec.x, vec.y, 0.0f).normalisedCopy();
 | 
				
			||||||
                //movement += Ogre::Vector3(lat.x, lat.y, 1.0f) * x * 0.707f * duration;
 | 
					                //movement += Ogre::Vector3(lat.x, lat.y, 1.0f) * x * 0.707f * duration;
 | 
				
			||||||
                movement.z += x * 0.707f * duration;
 | 
					                movement.mPosition[2] += x * 0.707f * duration;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            //decrease fatigue by fFatigueJumpBase + (1 - normalizedEncumbrance) * fFatigueJumpMult;
 | 
					            //decrease fatigue by fFatigueJumpBase + (1 - normalizedEncumbrance) * fFatigueJumpMult;
 | 
				
			||||||
| 
						 | 
					@ -214,7 +216,7 @@ void CharacterController::update(float duration, Ogre::Vector3 &movement)
 | 
				
			||||||
                                 : (sneak ? CharState_SneakLeft : (isrunning ? CharState_RunLeft : CharState_WalkLeft)), true);
 | 
					                                 : (sneak ? CharState_SneakLeft : (isrunning ? CharState_RunLeft : CharState_WalkLeft)), true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // Apply any forward/backward movement manually
 | 
					            // Apply any forward/backward movement manually
 | 
				
			||||||
            movement.y += vec.y * (speed*duration);
 | 
					            movement.mPosition[1] += vec.y * (speed*duration);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else if(vec.y != 0.0f && speed > 0.0f)
 | 
					        else if(vec.y != 0.0f && speed > 0.0f)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
| 
						 | 
					@ -226,7 +228,7 @@ void CharacterController::update(float duration, Ogre::Vector3 &movement)
 | 
				
			||||||
                setState(inwater ? (isrunning ? CharState_SwimRunBack : CharState_SwimWalkBack)
 | 
					                setState(inwater ? (isrunning ? CharState_SwimRunBack : CharState_SwimWalkBack)
 | 
				
			||||||
                                 : (sneak ? CharState_SneakBack : (isrunning ? CharState_RunBack : CharState_WalkBack)), true);
 | 
					                                 : (sneak ? CharState_SneakBack : (isrunning ? CharState_RunBack : CharState_WalkBack)), true);
 | 
				
			||||||
            // Apply any sideways movement manually
 | 
					            // Apply any sideways movement manually
 | 
				
			||||||
            movement.x += vec.x * (speed*duration);
 | 
					            movement.mPosition[0] += vec.x * (speed*duration);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else if(mAnimQueue.size() == 0)
 | 
					        else if(mAnimQueue.size() == 0)
 | 
				
			||||||
            setState((inwater ? CharState_IdleSwim : (sneak ? CharState_IdleSneak : CharState_Idle)), true);
 | 
					            setState((inwater ? CharState_IdleSwim : (sneak ? CharState_IdleSneak : CharState_Idle)), true);
 | 
				
			||||||
| 
						 | 
					@ -235,7 +237,10 @@ void CharacterController::update(float duration, Ogre::Vector3 &movement)
 | 
				
			||||||
    if(mAnimation && !mSkipAnim)
 | 
					    if(mAnimation && !mSkipAnim)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        mAnimation->setSpeed(speed);
 | 
					        mAnimation->setSpeed(speed);
 | 
				
			||||||
        movement += mAnimation->runAnimation(duration);
 | 
					        Ogre::Vector3 moved = mAnimation->runAnimation(duration);
 | 
				
			||||||
 | 
					        movement.mPosition[0] += moved.x;
 | 
				
			||||||
 | 
					        movement.mPosition[1] += moved.y;
 | 
				
			||||||
 | 
					        movement.mPosition[2] += moved.z;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    mSkipAnim = false;
 | 
					    mSkipAnim = false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,6 +13,8 @@ namespace MWRender
 | 
				
			||||||
namespace MWMechanics
 | 
					namespace MWMechanics
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Movement;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum CharacterState {
 | 
					enum CharacterState {
 | 
				
			||||||
    CharState_SpecialIdle,
 | 
					    CharState_SpecialIdle,
 | 
				
			||||||
    CharState_Idle,
 | 
					    CharState_Idle,
 | 
				
			||||||
| 
						 | 
					@ -87,7 +89,7 @@ public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void updatePtr(const MWWorld::Ptr &ptr);
 | 
					    void updatePtr(const MWWorld::Ptr &ptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void update(float duration, Ogre::Vector3 &movement);
 | 
					    void update(float duration, Movement &movement);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void playGroup(const std::string &groupname, int mode, int count);
 | 
					    void playGroup(const std::string &groupname, int mode, int count);
 | 
				
			||||||
    void skipAnim();
 | 
					    void skipAnim();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,6 +13,7 @@
 | 
				
			||||||
#include "../mwbase/scriptmanager.hpp"
 | 
					#include "../mwbase/scriptmanager.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "../mwmechanics/creaturestats.hpp"
 | 
					#include "../mwmechanics/creaturestats.hpp"
 | 
				
			||||||
 | 
					#include "../mwmechanics/movement.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "../mwrender/sky.hpp"
 | 
					#include "../mwrender/sky.hpp"
 | 
				
			||||||
#include "../mwrender/player.hpp"
 | 
					#include "../mwrender/player.hpp"
 | 
				
			||||||
| 
						 | 
					@ -875,13 +876,13 @@ namespace MWWorld
 | 
				
			||||||
                player = iter;
 | 
					                player = iter;
 | 
				
			||||||
                continue;
 | 
					                continue;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            Ogre::Vector3 vec = mPhysics->move(iter->first, iter->second, duration,
 | 
					            Ogre::Vector3 vec = mPhysics->move(iter->first, Ogre::Vector3(iter->second.mPosition), duration,
 | 
				
			||||||
                                               !isSwimming(iter->first) && !isFlying(iter->first));
 | 
					                                               !isSwimming(iter->first) && !isFlying(iter->first));
 | 
				
			||||||
            moveObjectImp(iter->first, vec.x, vec.y, vec.z);
 | 
					            moveObjectImp(iter->first, vec.x, vec.y, vec.z);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if(player != actors.end())
 | 
					        if(player != actors.end())
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            Ogre::Vector3 vec = mPhysics->move(player->first, player->second, duration,
 | 
					            Ogre::Vector3 vec = mPhysics->move(player->first, Ogre::Vector3(player->second.mPosition), duration,
 | 
				
			||||||
                                               !isSwimming(player->first) && !isFlying(player->first));
 | 
					                                               !isSwimming(player->first) && !isFlying(player->first));
 | 
				
			||||||
            moveObjectImp(player->first, vec.x, vec.y, vec.z);
 | 
					            moveObjectImp(player->first, vec.x, vec.y, vec.z);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue