Commit fb49a86e authored by cutealien's avatar cutealien

Several fixes for SceneNodeAnimatorCollisionResponse, based on...

Several fixes for SceneNodeAnimatorCollisionResponse, based on http://irrlicht.sourceforge.net/forum/viewtopic.php?f=7&t=33098&p=290746
Thanks to all people who reported and to JLouisB and kinkreet for the patches:
- Gravity is now fps independent
- Values of gravity now like documented (wasn't 1 unit = 1m before, had been 1m = current frames per second, so maybe 100 units = 1m). 
  Note that jump-values for fps-camera must also change when adapting gravity!
  Several examples got adapted for new ranges
- Pausing timer now pauses animator. Also doesn't reset values anymore with pauses.
- Clones no longer have 1000 times the gravity of original animator.


git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@5305 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 960be376
-------------------------- --------------------------
Changes in 1.9 (not yet released) Changes in 1.9 (not yet released)
- Several fixes for SceneNodeAnimatorCollisionResponse, based on http://irrlicht.sourceforge.net/forum/viewtopic.php?f=7&t=33098&p=290746
Thanks to all people who reported and to JLouisB and kinkreet for the patches:
- Gravity is now fps independent
- Values of gravity now like documented (wasn't 1 unit = 1m before, had been 1m = current frames per second, so maybe 100 units = 1m).
Note that jump-values for fps-camera must also change when adapting gravity!
Several examples got adapted for new ranges.
- Pausing timer now pauses animator. Also doesn't reset values anymore with pauses.
- Clones no longer have 1000 times the gravity of original animator.
should now be fps independentn
- Speedup CTriangleSelector (mainly for animated meshes) - Speedup CTriangleSelector (mainly for animated meshes)
- CTriangleSelector now supports 32-bit meshbuffers. Thanks @Wol101 for reporting and patch-proposal. - CTriangleSelector now supports 32-bit meshbuffers. Thanks @Wol101 for reporting and patch-proposal.
- Fix: CTriangleSelector no longer resets it's boundingbox to 0,0,0 (was wrong when a meshbuffer was not around 0) - Fix: CTriangleSelector no longer resets it's boundingbox to 0,0,0 (was wrong when a meshbuffer was not around 0)
......
...@@ -119,7 +119,7 @@ int main() ...@@ -119,7 +119,7 @@ int main()
values, the camera will be able to move closer to walls after this. The values, the camera will be able to move closer to walls after this. The
next parameter is the direction and speed of gravity. We'll set it to next parameter is the direction and speed of gravity. We'll set it to
(0, -10, 0), which approximates to realistic gravity, assuming that our (0, -10, 0), which approximates to realistic gravity, assuming that our
units are metres. You could set it to (0,0,0) to disable gravity. And the units are meters. You could set it to (0,0,0) to disable gravity. And the
last value is just a translation: Without this, the ellipsoid with which last value is just a translation: Without this, the ellipsoid with which
collision detection is done would be around the camera, and the camera would collision detection is done would be around the camera, and the camera would
be in the middle of the ellipsoid. But as human beings, we are used to have our be in the middle of the ellipsoid. But as human beings, we are used to have our
...@@ -132,7 +132,7 @@ int main() ...@@ -132,7 +132,7 @@ int main()
// Set a jump speed of 3 units per second, which gives a fairly realistic jump // Set a jump speed of 3 units per second, which gives a fairly realistic jump
// when used with the gravity of (0, -10, 0) in the collision response animator. // when used with the gravity of (0, -10, 0) in the collision response animator.
scene::ICameraSceneNode* camera = scene::ICameraSceneNode* camera =
smgr->addCameraSceneNodeFPS(0, 100.0f, .3f, ID_IsNotPickable, 0, 0, true, 3.f); smgr->addCameraSceneNodeFPS(0, 100.0f, .3f, ID_IsNotPickable, 0, 0, true, 300.f);
camera->setPosition(core::vector3df(50,50,-60)); camera->setPosition(core::vector3df(50,50,-60));
camera->setTarget(core::vector3df(-70,30,-60)); camera->setTarget(core::vector3df(-70,30,-60));
...@@ -140,7 +140,7 @@ int main() ...@@ -140,7 +140,7 @@ int main()
{ {
scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator( scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
selector, camera, core::vector3df(30,50,30), selector, camera, core::vector3df(30,50,30),
core::vector3df(0,-10,0), core::vector3df(0,30,0)); core::vector3df(0,-1000,0), core::vector3df(0,30,0));
selector->drop(); // As soon as we're done with the selector, drop it. selector->drop(); // As soon as we're done with the selector, drop it.
camera->addAnimator(anim); camera->addAnimator(anim);
anim->drop(); // And likewise, drop the animator when we're done referring to it. anim->drop(); // And likewise, drop the animator when we're done referring to it.
......
...@@ -316,7 +316,7 @@ void Q3Player::create ( IrrlichtDevice *device, IQ3LevelMesh* mesh, ISceneNode * ...@@ -316,7 +316,7 @@ void Q3Player::create ( IrrlichtDevice *device, IQ3LevelMesh* mesh, ISceneNode *
keyMap[9].Action = EKA_CROUCH; keyMap[9].Action = EKA_CROUCH;
keyMap[9].KeyCode = KEY_KEY_C; keyMap[9].KeyCode = KEY_KEY_C;
camera = smgr->addCameraSceneNodeFPS(0, 100.0f, 0.6f, -1, keyMap, 10, false, 0.6f); camera = smgr->addCameraSceneNodeFPS(0, 100.0f, 0.6f, -1, keyMap, 10, false, 600.f);
camera->setName ( "First Person Camera" ); camera->setName ( "First Person Camera" );
//camera->setFOV ( 100.f * core::DEGTORAD ); //camera->setFOV ( 100.f * core::DEGTORAD );
camera->setFarValue( 20000.f ); camera->setFarValue( 20000.f );
...@@ -385,7 +385,7 @@ void Q3Player::respawn () ...@@ -385,7 +385,7 @@ void Q3Player::respawn ()
StartPositionCurrent, cam()->getEllipsoidTranslation())) StartPositionCurrent, cam()->getEllipsoidTranslation()))
StartPositionCurrent = 0; StartPositionCurrent = 0;
else else
++StartPositionCurrent; ++StartPositionCurrent;
} }
/* /*
...@@ -2021,7 +2021,7 @@ void CQuake3EventHandler::Animate() ...@@ -2021,7 +2021,7 @@ void CQuake3EventHandler::Animate()
wchar_t msg[128]; wchar_t msg[128];
IVideoDriver * driver = Game->Device->getVideoDriver(); IVideoDriver * driver = Game->Device->getVideoDriver();
#ifdef _IRR_SCENEMANAGER_DEBUG #ifdef _IRR_SCENEMANAGER_DEBUG
IAttributes * attr = Game->Device->getSceneManager()->getParameters(); IAttributes * attr = Game->Device->getSceneManager()->getParameters();
swprintf_irr ( msg, 128, swprintf_irr ( msg, 128,
L"Q3 %s [%ls], FPS:%03d Tri:%.03fm Cull %d/%d nodes (%d,%d,%d)", L"Q3 %s [%ls], FPS:%03d Tri:%.03fm Cull %d/%d nodes (%d,%d,%d)",
...@@ -2042,8 +2042,8 @@ swprintf_irr ( msg, 128, ...@@ -2042,8 +2042,8 @@ swprintf_irr ( msg, 128,
driver->getName(), driver->getName(),
driver->getFPS (), driver->getFPS (),
(f32) driver->getPrimitiveCountDrawn( 0 ) * ( 1.f / 1000000.f ) (f32) driver->getPrimitiveCountDrawn( 0 ) * ( 1.f / 1000000.f )
); );
#endif #endif
Game->Device->setWindowCaption( msg ); Game->Device->setWindowCaption( msg );
swprintf_irr ( msg, 128, swprintf_irr ( msg, 128,
......
...@@ -735,10 +735,10 @@ s32 Q3StartPosition ( IQ3LevelMesh* mesh, ...@@ -735,10 +735,10 @@ s32 Q3StartPosition ( IQ3LevelMesh* mesh,
*/ */
vector3df getGravity ( const c8 * surface ) vector3df getGravity ( const c8 * surface )
{ {
if ( 0 == strcmp ( surface, "earth" ) ) return vector3df ( 0.f, -90.f, 0.f ); if ( 0 == strcmp ( surface, "earth" ) ) return vector3df ( 0.f, -900.f, 0.f );
if ( 0 == strcmp ( surface, "moon" ) ) return vector3df ( 0.f, -6.f / 100.f, 0.f ); if ( 0 == strcmp ( surface, "moon" ) ) return vector3df ( 0.f, -6.f , 0.f );
if ( 0 == strcmp ( surface, "water" ) ) return vector3df ( 0.1f / 100.f, -2.f / 100.f, 0.f ); if ( 0 == strcmp ( surface, "water" ) ) return vector3df ( 0.1f, -2.f, 0.f );
if ( 0 == strcmp ( surface, "ice" ) ) return vector3df ( 0.2f / 100.f, -9.f / 100.f, 0.3f / 100.f ); if ( 0 == strcmp ( surface, "ice" ) ) return vector3df ( 0.2f, -9.f, 0.3f );
return vector3df ( 0.f, 0.f, 0.f ); return vector3df ( 0.f, 0.f, 0.f );
} }
......
...@@ -328,14 +328,14 @@ void CDemo::switchToNextScene() ...@@ -328,14 +328,14 @@ void CDemo::switchToNextScene()
keyMap[8].Action = EKA_JUMP_UP; keyMap[8].Action = EKA_JUMP_UP;
keyMap[8].KeyCode = KEY_KEY_J; keyMap[8].KeyCode = KEY_KEY_J;
camera = sm->addCameraSceneNodeFPS(0, 100.0f, .4f, -1, keyMap, 9, false, 3.f); camera = sm->addCameraSceneNodeFPS(0, 100.0f, .4f, -1, keyMap, 9, false, 300.f);
camera->setPosition(core::vector3df(108,140,-140)); camera->setPosition(core::vector3df(108,140,-140));
camera->setFarValue(5000.0f); camera->setFarValue(5000.0f);
scene::ISceneNodeAnimatorCollisionResponse* collider = scene::ISceneNodeAnimatorCollisionResponse* collider =
sm->createCollisionResponseAnimator( sm->createCollisionResponseAnimator(
metaSelector, camera, core::vector3df(25,50,25), metaSelector, camera, core::vector3df(25,50,25),
core::vector3df(0, quakeLevelMesh ? -10.f : 0.0f,0), core::vector3df(0, quakeLevelMesh ? -1000.f : 0.0f,0),
core::vector3df(0,45,0), 0.005f); core::vector3df(0,45,0), 0.005f);
camera->addAnimator(collider); camera->addAnimator(collider);
......
...@@ -164,13 +164,13 @@ void CSceneNodeAnimatorCollisionResponse::animateNode(ISceneNode* node, u32 time ...@@ -164,13 +164,13 @@ void CSceneNodeAnimatorCollisionResponse::animateNode(ISceneNode* node, u32 time
FirstUpdate = false; FirstUpdate = false;
} }
const u32 diff = timeMs - LastTime; const f32 diffSec = (f32)(timeMs - LastTime)*0.001f;
LastTime = timeMs; LastTime = timeMs;
CollisionResultPosition = Object->getPosition(); CollisionResultPosition = Object->getPosition();
core::vector3df vel = CollisionResultPosition - LastPosition; core::vector3df vel = CollisionResultPosition - LastPosition;
FallingVelocity += Gravity * (f32)diff * 0.001f; FallingVelocity += Gravity * diffSec;
CollisionTriangle = RefTriangle; CollisionTriangle = RefTriangle;
CollisionPoint = core::vector3df(); CollisionPoint = core::vector3df();
...@@ -188,20 +188,23 @@ void CSceneNodeAnimatorCollisionResponse::animateNode(ISceneNode* node, u32 time ...@@ -188,20 +188,23 @@ void CSceneNodeAnimatorCollisionResponse::animateNode(ISceneNode* node, u32 time
= SceneManager->getSceneCollisionManager()->getCollisionResultPosition( = SceneManager->getSceneCollisionManager()->getCollisionResultPosition(
World, LastPosition-Translation, World, LastPosition-Translation,
Radius, vel, CollisionTriangle, CollisionPoint, f, Radius, vel, CollisionTriangle, CollisionPoint, f,
CollisionNode, SlidingSpeed, FallingVelocity); CollisionNode, SlidingSpeed, FallingVelocity*diffSec);
CollisionOccurred = (CollisionTriangle != RefTriangle); CollisionOccurred = (CollisionTriangle != RefTriangle);
CollisionResultPosition += Translation; CollisionResultPosition += Translation;
if (f)//CollisionTriangle == RefTriangle) if ( diffSec > 0 ) // don't change the state when there was no time
{ {
Falling = true; if (f)//CollisionTriangle == RefTriangle)
} {
else Falling = true;
{ }
Falling = false; else
FallingVelocity.set(0, 0, 0); {
Falling = false;
FallingVelocity.set(0, 0, 0);
}
} }
bool collisionConsumed = false; bool collisionConsumed = false;
...@@ -269,7 +272,7 @@ ISceneNodeAnimator* CSceneNodeAnimatorCollisionResponse::createClone(ISceneNode* ...@@ -269,7 +272,7 @@ ISceneNodeAnimator* CSceneNodeAnimatorCollisionResponse::createClone(ISceneNode*
CSceneNodeAnimatorCollisionResponse * newAnimator = CSceneNodeAnimatorCollisionResponse * newAnimator =
new CSceneNodeAnimatorCollisionResponse(newManager, World, Object, Radius, new CSceneNodeAnimatorCollisionResponse(newManager, World, Object, Radius,
(Gravity * 1000.0f), Translation, SlidingSpeed); Gravity, Translation, SlidingSpeed);
newAnimator->cloneMembers(this); newAnimator->cloneMembers(this);
return newAnimator; return newAnimator;
} }
......
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