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) ...@@ -153,16 +153,22 @@ void CSceneNodeAnimatorCameraFPS::animateNode(ISceneNode* node, u32 timeMs)
// set target // set target
target.set(0,0,1); target.set(0,0,100);
core::vector3df movedir = target;
core::matrix4 mat; core::matrix4 mat;
mat.setRotationDegrees(core::vector3df(relativeRotation.X, relativeRotation.Y, 0)); mat.setRotationDegrees(core::vector3df(relativeRotation.X, relativeRotation.Y, 0));
mat.transformVect(target); mat.transformVect(target);
core::vector3df movedir = target;
if (NoVerticalMovement) if (NoVerticalMovement)
movedir.Y = 0.f; {
mat.setRotationDegrees(core::vector3df(0, relativeRotation.Y, 0));
mat.transformVect(movedir);
}
else
{
movedir = target;
}
movedir.normalize(); movedir.normalize();
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "CSceneNodeAnimatorCollisionResponse.h" #include "CSceneNodeAnimatorCollisionResponse.h"
#include "ISceneCollisionManager.h" #include "ISceneCollisionManager.h"
#include "ISceneManager.h" #include "ISceneManager.h"
#include "ICameraSceneNode.h"
#include "os.h" #include "os.h"
namespace irr namespace irr
...@@ -22,7 +23,7 @@ CSceneNodeAnimatorCollisionResponse::CSceneNodeAnimatorCollisionResponse( ...@@ -22,7 +23,7 @@ CSceneNodeAnimatorCollisionResponse::CSceneNodeAnimatorCollisionResponse(
f32 slidingSpeed) f32 slidingSpeed)
: Radius(ellipsoidRadius), Gravity(gravityPerSecond / 1000.0f), Translation(ellipsoidTranslation), : Radius(ellipsoidRadius), Gravity(gravityPerSecond / 1000.0f), Translation(ellipsoidTranslation),
World(world), Object(object), SceneManager(scenemanager), World(world), Object(object), SceneManager(scenemanager),
SlidingSpeed(slidingSpeed), Falling(false) SlidingSpeed(slidingSpeed), Falling(false), IsCamera(false), AnimateCameraTarget(true)
{ {
#ifdef _DEBUG #ifdef _DEBUG
...@@ -32,11 +33,7 @@ CSceneNodeAnimatorCollisionResponse::CSceneNodeAnimatorCollisionResponse( ...@@ -32,11 +33,7 @@ CSceneNodeAnimatorCollisionResponse::CSceneNodeAnimatorCollisionResponse(
if (World) if (World)
World->grab(); World->grab();
if (Object) setNode(Object);
LastPosition = Object->getPosition();
LastTime = os::Timer::getTime();
FallStartTime = LastTime;
} }
...@@ -138,7 +135,7 @@ void CSceneNodeAnimatorCollisionResponse::animateNode(ISceneNode* node, u32 time ...@@ -138,7 +135,7 @@ void CSceneNodeAnimatorCollisionResponse::animateNode(ISceneNode* node, u32 time
{ {
if (node != Object) if (node != Object)
{ {
os::Printer::log("CollisionResponseAnimator only works with same scene node as set as object during creation", ELL_ERROR); setNode(node);
return; return;
} }
...@@ -190,15 +187,38 @@ void CSceneNodeAnimatorCollisionResponse::animateNode(ISceneNode* node, u32 time ...@@ -190,15 +187,38 @@ void CSceneNodeAnimatorCollisionResponse::animateNode(ISceneNode* node, u32 time
Object->setPosition(pos); 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(); 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. //! Writes attributes of the scene node animator.
void CSceneNodeAnimatorCollisionResponse::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const void CSceneNodeAnimatorCollisionResponse::serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options) const
{ {
out->addVector3d("Radius", Radius); out->addVector3d("Radius", Radius);
out->addVector3d("Gravity", Gravity); out->addVector3d("Gravity", Gravity);
out->addVector3d("Translation", Translation); out->addVector3d("Translation", Translation);
out->addBool("AnimateCameraTarget", AnimateCameraTarget);
} }
//! Reads attributes of the scene node animator. //! Reads attributes of the scene node animator.
...@@ -207,6 +227,7 @@ void CSceneNodeAnimatorCollisionResponse::deserializeAttributes(io::IAttributes* ...@@ -207,6 +227,7 @@ void CSceneNodeAnimatorCollisionResponse::deserializeAttributes(io::IAttributes*
Radius = in->getAttributeAsVector3d("Radius"); Radius = in->getAttributeAsVector3d("Radius");
Gravity = in->getAttributeAsVector3d("Gravity"); Gravity = in->getAttributeAsVector3d("Gravity");
Translation = in->getAttributeAsVector3d("Translation"); Translation = in->getAttributeAsVector3d("Translation");
AnimateCameraTarget = in->getAttributeAsBool("AnimateCameraTarget");
} }
......
...@@ -81,6 +81,9 @@ namespace scene ...@@ -81,6 +81,9 @@ namespace scene
virtual ESCENE_NODE_ANIMATOR_TYPE getType() const { return ESNAT_COLLISION_RESPONSE; } virtual ESCENE_NODE_ANIMATOR_TYPE getType() const { return ESNAT_COLLISION_RESPONSE; }
private: private:
void setNode(ISceneNode* node);
core::vector3df LastPosition; core::vector3df LastPosition;
core::vector3df Radius; core::vector3df Radius;
core::vector3df Gravity; core::vector3df Gravity;
...@@ -93,6 +96,8 @@ namespace scene ...@@ -93,6 +96,8 @@ namespace scene
u32 FallStartTime; u32 FallStartTime;
f32 SlidingSpeed; f32 SlidingSpeed;
bool Falling; bool Falling;
bool IsCamera;
bool AnimateCameraTarget;
core::triangle3df RefTriangle; 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