Commit 1833dcdb authored by bitplane's avatar bitplane

Camera FPS animator: Fixed float scaling bug. When horizontal movement is...

Camera FPS animator: Fixed float scaling bug. When horizontal movement is disabled the camera now moves at a constant speed regardless of angle.
Collision response animator now animates camera target (can be disabled via attributes) and the node can be changed.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1364 dfc29bdd-3216-0410-991c-e03cc46cb475
parent e1df1732
......@@ -153,16 +153,22 @@ void CSceneNodeAnimatorCameraFPS::animateNode(ISceneNode* node, u32 timeMs)
// set target
target.set(0,0,1);
target.set(0,0,100);
core::vector3df movedir = target;
core::matrix4 mat;
mat.setRotationDegrees(core::vector3df(relativeRotation.X, relativeRotation.Y, 0));
mat.transformVect(target);
core::vector3df movedir = target;
if (NoVerticalMovement)
movedir.Y = 0.f;
{
mat.setRotationDegrees(core::vector3df(0, relativeRotation.Y, 0));
mat.transformVect(movedir);
}
else
{
movedir = target;
}
movedir.normalize();
......
......@@ -5,6 +5,7 @@
#include "CSceneNodeAnimatorCollisionResponse.h"
#include "ISceneCollisionManager.h"
#include "ISceneManager.h"
#include "ICameraSceneNode.h"
#include "os.h"
namespace irr
......@@ -22,7 +23,7 @@ CSceneNodeAnimatorCollisionResponse::CSceneNodeAnimatorCollisionResponse(
f32 slidingSpeed)
: Radius(ellipsoidRadius), Gravity(gravityPerSecond / 1000.0f), Translation(ellipsoidTranslation),
World(world), Object(object), SceneManager(scenemanager),
SlidingSpeed(slidingSpeed), Falling(false)
SlidingSpeed(slidingSpeed), Falling(false), IsCamera(false), AnimateCameraTarget(true)
{
#ifdef _DEBUG
......@@ -32,11 +33,7 @@ CSceneNodeAnimatorCollisionResponse::CSceneNodeAnimatorCollisionResponse(
if (World)
World->grab();
if (Object)
LastPosition = Object->getPosition();
LastTime = os::Timer::getTime();
FallStartTime = LastTime;
setNode(Object);
}
......@@ -138,7 +135,7 @@ void CSceneNodeAnimatorCollisionResponse::animateNode(ISceneNode* node, u32 time
{
if (node != Object)
{
os::Printer::log("CollisionResponseAnimator only works with same scene node as set as object during creation", ELL_ERROR);
setNode(node);
return;
}
......@@ -190,15 +187,38 @@ void CSceneNodeAnimatorCollisionResponse::animateNode(ISceneNode* node, u32 time
Object->setPosition(pos);
}
// move camera target
if (AnimateCameraTarget && IsCamera)
{
const core::vector3df diff = Object->getPosition() - LastPosition - vel;
ICameraSceneNode* cam = (ICameraSceneNode*)Object;
cam->setTarget(cam->getTarget() + diff);
}
LastPosition = Object->getPosition();
}
void CSceneNodeAnimatorCollisionResponse::setNode(ISceneNode* node)
{
Object = node;
if (Object)
{
LastPosition = Object->getPosition();
IsCamera = (Object->getType() == ESNT_CAMERA);
}
LastTime = os::Timer::getTime();
FallStartTime = LastTime;
}
//! Writes attributes of the scene node animator.
void CSceneNodeAnimatorCollisionResponse::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const
{
out->addVector3d("Radius", Radius);
out->addVector3d("Gravity", Gravity);
out->addVector3d("Translation", Translation);
out->addBool("AnimateCameraTarget", AnimateCameraTarget);
}
//! Reads attributes of the scene node animator.
......@@ -207,6 +227,7 @@ void CSceneNodeAnimatorCollisionResponse::deserializeAttributes(io::IAttributes*
Radius = in->getAttributeAsVector3d("Radius");
Gravity = in->getAttributeAsVector3d("Gravity");
Translation = in->getAttributeAsVector3d("Translation");
AnimateCameraTarget = in->getAttributeAsBool("AnimateCameraTarget");
}
......
......@@ -81,6 +81,9 @@ namespace scene
virtual ESCENE_NODE_ANIMATOR_TYPE getType() const { return ESNAT_COLLISION_RESPONSE; }
private:
void setNode(ISceneNode* node);
core::vector3df LastPosition;
core::vector3df Radius;
core::vector3df Gravity;
......@@ -93,6 +96,8 @@ namespace scene
u32 FallStartTime;
f32 SlidingSpeed;
bool Falling;
bool IsCamera;
bool AnimateCameraTarget;
core::triangle3df RefTriangle;
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment