forked from teamnwah/openmw-tes3coop
Alert the user if attempting to play an animation fails
This is mostly propogating the error up the stack so the game can do something about it. Working on avoiding log spam from calling an animation that doesn't exist every frame.
This commit is contained in:
parent
a391579382
commit
5e6fcc2aef
9 changed files with 37 additions and 13 deletions
|
@ -160,12 +160,13 @@ namespace MWBase
|
||||||
virtual void forceStateUpdate(const MWWorld::Ptr &ptr) = 0;
|
virtual void forceStateUpdate(const MWWorld::Ptr &ptr) = 0;
|
||||||
///< Forces an object to refresh its animation state.
|
///< Forces an object to refresh its animation state.
|
||||||
|
|
||||||
virtual void playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number=1) = 0;
|
virtual bool playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number=1) = 0;
|
||||||
///< Run animation for a MW-reference. Calls to this function for references that are currently not
|
///< Run animation for a MW-reference. Calls to this function for references that are currently not
|
||||||
/// in the scene should be ignored.
|
/// in the scene should be ignored.
|
||||||
///
|
///
|
||||||
/// \param mode 0 normal, 1 immediate start, 2 immediate loop
|
/// \param mode 0 normal, 1 immediate start, 2 immediate loop
|
||||||
/// \param count How many times the animation should be run
|
/// \param count How many times the animation should be run
|
||||||
|
/// \return Success or error
|
||||||
|
|
||||||
virtual void skipAnimation(const MWWorld::Ptr& ptr) = 0;
|
virtual void skipAnimation(const MWWorld::Ptr& ptr) = 0;
|
||||||
///< Skip the animation for the given MW-reference for one frame. Calls to this function for
|
///< Skip the animation for the given MW-reference for one frame. Calls to this function for
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "actors.hpp"
|
#include "actors.hpp"
|
||||||
|
|
||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include <osg/PositionAttitudeTransform>
|
#include <osg/PositionAttitudeTransform>
|
||||||
|
|
||||||
|
@ -1241,11 +1242,18 @@ namespace MWMechanics
|
||||||
iter->second->getCharacterController()->forceStateUpdate();
|
iter->second->getCharacterController()->forceStateUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actors::playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number)
|
bool Actors::playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number)
|
||||||
{
|
{
|
||||||
PtrActorMap::iterator iter = mActors.find(ptr);
|
PtrActorMap::iterator iter = mActors.find(ptr);
|
||||||
if(iter != mActors.end())
|
if(iter != mActors.end())
|
||||||
iter->second->getCharacterController()->playGroup(groupName, mode, number);
|
{
|
||||||
|
return iter->second->getCharacterController()->playGroup(groupName, mode, number);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cerr<< "Error in Actors::playAnimationGroup: Unable to find " << ptr.getTypeName() << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void Actors::skipAnimation(const MWWorld::Ptr& ptr)
|
void Actors::skipAnimation(const MWWorld::Ptr& ptr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -105,7 +105,7 @@ namespace MWMechanics
|
||||||
|
|
||||||
void forceStateUpdate(const MWWorld::Ptr &ptr);
|
void forceStateUpdate(const MWWorld::Ptr &ptr);
|
||||||
|
|
||||||
void playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number);
|
bool playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number);
|
||||||
void skipAnimation(const MWWorld::Ptr& ptr);
|
void skipAnimation(const MWWorld::Ptr& ptr);
|
||||||
bool checkAnimationPlaying(const MWWorld::Ptr& ptr, const std::string& groupName);
|
bool checkAnimationPlaying(const MWWorld::Ptr& ptr, const std::string& groupName);
|
||||||
|
|
||||||
|
|
|
@ -1866,10 +1866,13 @@ void CharacterController::update(float duration)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CharacterController::playGroup(const std::string &groupname, int mode, int count)
|
bool CharacterController::playGroup(const std::string &groupname, int mode, int count)
|
||||||
{
|
{
|
||||||
if(!mAnimation || !mAnimation->hasAnimation(groupname))
|
if(!mAnimation || !mAnimation->hasAnimation(groupname))
|
||||||
|
{
|
||||||
std::cerr<< "Animation "<<groupname<<" not found for " << mPtr.getCellRef().getRefId() << std::endl;
|
std::cerr<< "Animation "<<groupname<<" not found for " << mPtr.getCellRef().getRefId() << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
count = std::max(count, 1);
|
count = std::max(count, 1);
|
||||||
|
@ -1894,6 +1897,7 @@ void CharacterController::playGroup(const std::string &groupname, int mode, int
|
||||||
mAnimQueue.push_back(std::make_pair(groupname, count-1));
|
mAnimQueue.push_back(std::make_pair(groupname, count-1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CharacterController::skipAnim()
|
void CharacterController::skipAnim()
|
||||||
|
|
|
@ -225,7 +225,7 @@ public:
|
||||||
|
|
||||||
void update(float duration);
|
void update(float duration);
|
||||||
|
|
||||||
void playGroup(const std::string &groupname, int mode, int count);
|
bool playGroup(const std::string &groupname, int mode, int count);
|
||||||
void skipAnim();
|
void skipAnim();
|
||||||
bool isAnimPlaying(const std::string &groupName);
|
bool isAnimPlaying(const std::string &groupName);
|
||||||
|
|
||||||
|
|
|
@ -843,12 +843,12 @@ namespace MWMechanics
|
||||||
mActors.forceStateUpdate(ptr);
|
mActors.forceStateUpdate(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MechanicsManager::playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number)
|
bool MechanicsManager::playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number)
|
||||||
{
|
{
|
||||||
if(ptr.getClass().isActor())
|
if(ptr.getClass().isActor())
|
||||||
mActors.playAnimationGroup(ptr, groupName, mode, number);
|
return mActors.playAnimationGroup(ptr, groupName, mode, number);
|
||||||
else
|
else
|
||||||
mObjects.playAnimationGroup(ptr, groupName, mode, number);
|
return mObjects.playAnimationGroup(ptr, groupName, mode, number);
|
||||||
}
|
}
|
||||||
void MechanicsManager::skipAnimation(const MWWorld::Ptr& ptr)
|
void MechanicsManager::skipAnimation(const MWWorld::Ptr& ptr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -137,7 +137,9 @@ namespace MWMechanics
|
||||||
|
|
||||||
virtual void forceStateUpdate(const MWWorld::Ptr &ptr);
|
virtual void forceStateUpdate(const MWWorld::Ptr &ptr);
|
||||||
|
|
||||||
virtual void playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number);
|
/// Attempt to play an animation group
|
||||||
|
/// @return Success or error
|
||||||
|
virtual bool playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number);
|
||||||
virtual void skipAnimation(const MWWorld::Ptr& ptr);
|
virtual void skipAnimation(const MWWorld::Ptr& ptr);
|
||||||
virtual bool checkAnimationPlaying(const MWWorld::Ptr& ptr, const std::string &groupName);
|
virtual bool checkAnimationPlaying(const MWWorld::Ptr& ptr, const std::string &groupName);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include "objects.hpp"
|
#include "objects.hpp"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
#include "movement.hpp"
|
#include "movement.hpp"
|
||||||
|
|
||||||
#include "../mwbase/environment.hpp"
|
#include "../mwbase/environment.hpp"
|
||||||
|
@ -77,11 +79,18 @@ void Objects::update(float duration, bool paused)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Objects::playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number)
|
bool Objects::playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number)
|
||||||
{
|
{
|
||||||
PtrControllerMap::iterator iter = mObjects.find(ptr);
|
PtrControllerMap::iterator iter = mObjects.find(ptr);
|
||||||
if(iter != mObjects.end())
|
if(iter != mObjects.end())
|
||||||
iter->second->playGroup(groupName, mode, number);
|
{
|
||||||
|
return iter->second->playGroup(groupName, mode, number);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cerr<< "Error in Objects::playAnimationGroup: Unable to find " << ptr.getTypeName() << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void Objects::skipAnimation(const MWWorld::Ptr& ptr)
|
void Objects::skipAnimation(const MWWorld::Ptr& ptr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -38,7 +38,7 @@ namespace MWMechanics
|
||||||
void update(float duration, bool paused);
|
void update(float duration, bool paused);
|
||||||
///< Update object animations
|
///< Update object animations
|
||||||
|
|
||||||
void playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number);
|
bool playAnimationGroup(const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number);
|
||||||
void skipAnimation(const MWWorld::Ptr& ptr);
|
void skipAnimation(const MWWorld::Ptr& ptr);
|
||||||
|
|
||||||
void getObjectsInRange (const osg::Vec3f& position, float radius, std::vector<MWWorld::Ptr>& out);
|
void getObjectsInRange (const osg::Vec3f& position, float radius, std::vector<MWWorld::Ptr>& out);
|
||||||
|
|
Loading…
Reference in a new issue