From 340b984ced48c9a563b82e351393a342a3ff4903 Mon Sep 17 00:00:00 2001 From: Rogerborg Date: Tue, 16 Dec 2008 16:16:35 +0000 Subject: [PATCH] Add a hitPosition to ISceneCollisionManager::getCollisionResultPosition() as per https://sourceforge.net/tracker2/?func=detail&aid=1339139&group_id=74339&atid=540679 This is a very small API breaking change to a method that's unlikely to be heavily used in user code. It is commented in the declaration, in changes.txt and a unit test has been added. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1958 dfc29bdd-3216-0410-991c-e03cc46cb475 --- changes.txt | 7 +++++++ include/ISceneCollisionManager.h | 1 + source/Irrlicht/CSceneCollisionManager.cpp | 8 ++++++-- source/Irrlicht/CSceneCollisionManager.h | 2 ++ source/Irrlicht/CSceneNodeAnimatorCollisionResponse.cpp | 3 ++- tests/main.cpp | 4 +++- tests/tests-last-passed-at.txt | 2 +- tests/tests.cbp | 1 + tests/tests_vc8.vcproj | 4 ++++ tests/tests_vc9.vcproj | 4 ++++ 10 files changed, 31 insertions(+), 5 deletions(-) diff --git a/changes.txt b/changes.txt index 4b6039f5..77651e56 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,10 @@ +Changes in version 1.6 + + - ISceneNodeAnimatorCollisionResponse exposes the target node. Setting the node again resets the last position, allowing the node to be teleported. + + - Add a hitPosition out parameter to ISceneCollisionManager::getCollisionResultPosition() - this is a (small) API breaking change. + + Changes in version 1.5 (...12.2008) - Construction calls for FPS camera changed to take speed in units/milliseconds, just as the setSpeed method does. diff --git a/include/ISceneCollisionManager.h b/include/ISceneCollisionManager.h index 8d2b822f..b9c7ee13 100644 --- a/include/ISceneCollisionManager.h +++ b/include/ISceneCollisionManager.h @@ -70,6 +70,7 @@ namespace scene const core::vector3df& ellipsoidRadius, const core::vector3df& ellipsoidDirectionAndSpeed, core::triangle3df& triout, + core::vector3df& hitPosition, bool& outFalling, f32 slidingSpeed = 0.0005f, const core::vector3df& gravityDirectionAndSpeed diff --git a/source/Irrlicht/CSceneCollisionManager.cpp b/source/Irrlicht/CSceneCollisionManager.cpp index 511b9186..b4636ef7 100644 --- a/source/Irrlicht/CSceneCollisionManager.cpp +++ b/source/Irrlicht/CSceneCollisionManager.cpp @@ -230,6 +230,7 @@ core::vector3df CSceneCollisionManager::getCollisionResultPosition( const core::vector3df &position, const core::vector3df& radius, const core::vector3df& direction, core::triangle3df& triout, + core::vector3df& hitPosition, bool& outFalling, f32 slidingSpeed, const core::vector3df& gravity) @@ -238,7 +239,7 @@ core::vector3df CSceneCollisionManager::getCollisionResultPosition( return position; return collideEllipsoidWithWorld(selector, position, - radius, direction, slidingSpeed, gravity, triout, outFalling); + radius, direction, slidingSpeed, gravity, triout, hitPosition, outFalling); } @@ -497,7 +498,9 @@ core::vector3df CSceneCollisionManager::collideEllipsoidWithWorld( const core::vector3df& radius, const core::vector3df& velocity, f32 slidingSpeed, const core::vector3df& gravity, - core::triangle3df& triout, bool& outFalling) + core::triangle3df& triout, + core::vector3df& hitPosition, + bool& outFalling) { if (!selector || radius.X == 0.0f || radius.Y == 0.0f || radius.Z == 0.0f) return position; @@ -549,6 +552,7 @@ core::vector3df CSceneCollisionManager::collideEllipsoidWithWorld( } finalPos *= colData.eRadius; + hitPosition = colData.intersectionPoint * colData.eRadius; return finalPos; } diff --git a/source/Irrlicht/CSceneCollisionManager.h b/source/Irrlicht/CSceneCollisionManager.h index 95ac9e47..b4dc9c59 100644 --- a/source/Irrlicht/CSceneCollisionManager.h +++ b/source/Irrlicht/CSceneCollisionManager.h @@ -52,6 +52,7 @@ namespace scene const core::vector3df &ellipsoidPosition, const core::vector3df& ellipsoidRadius, const core::vector3df& ellipsoidDirectionAndSpeed, core::triangle3df& triout, + core::vector3df& hitPosition, bool& outFalling, f32 slidingSpeed, const core::vector3df& gravityDirectionAndSpeed); @@ -106,6 +107,7 @@ namespace scene const core::vector3df& radius, const core::vector3df& velocity, f32 slidingSpeed, const core::vector3df& gravity, core::triangle3df& triout, + core::vector3df& hitPosition, bool& outFalling); core::vector3df collideWithWorld(s32 recursionDepth, SCollisionData &colData, diff --git a/source/Irrlicht/CSceneNodeAnimatorCollisionResponse.cpp b/source/Irrlicht/CSceneNodeAnimatorCollisionResponse.cpp index 7422b96e..8fe6fc6a 100644 --- a/source/Irrlicht/CSceneNodeAnimatorCollisionResponse.cpp +++ b/source/Irrlicht/CSceneNodeAnimatorCollisionResponse.cpp @@ -161,9 +161,10 @@ void CSceneNodeAnimatorCollisionResponse::animateNode(ISceneNode* node, u32 time // TODO: divide SlidingSpeed by frame time bool f = false; + core::vector3df collisionPosition; // Not used. pos = SceneManager->getSceneCollisionManager()->getCollisionResultPosition( World, LastPosition-Translation, - Radius, vel, triangle, f, SlidingSpeed, FallingVelocity); + Radius, vel, triangle, collisionPosition, f, SlidingSpeed, FallingVelocity); pos += Translation; diff --git a/tests/main.cpp b/tests/main.cpp index 13739cd7..483c5809 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -55,6 +55,7 @@ int main(int argumentCount, char * arguments[]) extern bool b3dAnimation(void); extern bool guiDisabledMenu(void); extern bool collisionResponseAnimator(void); + extern bool sceneCollisionManager(void); typedef struct _STest { @@ -69,8 +70,9 @@ int main(int argumentCount, char * arguments[]) // Note that to interactively debug a test, you will generally want to move it // (temporarily) to the beginning of the list, since each test runs in its own // process. - TEST(collisionResponseAnimator), TEST(disambiguateTextures), // Normally you should run this first, since it validates the working directory. + TEST(sceneCollisionManager), + TEST(collisionResponseAnimator), TEST(exports), TEST(testVector3d), TEST(testVector2d), diff --git a/tests/tests-last-passed-at.txt b/tests/tests-last-passed-at.txt index a313a284..83013fdd 100644 --- a/tests/tests-last-passed-at.txt +++ b/tests/tests-last-passed-at.txt @@ -1,2 +1,2 @@ -Test suite pass at GMT Tue Dec 16 14:56:26 2008 +Test suite pass at GMT Tue Dec 16 16:13:56 2008 diff --git a/tests/tests.cbp b/tests/tests.cbp index 3a8220d0..879291f8 100644 --- a/tests/tests.cbp +++ b/tests/tests.cbp @@ -48,6 +48,7 @@ + diff --git a/tests/tests_vc8.vcproj b/tests/tests_vc8.vcproj index 1b943b53..4afd1517 100644 --- a/tests/tests_vc8.vcproj +++ b/tests/tests_vc8.vcproj @@ -213,6 +213,10 @@ RelativePath=".\planeMatrix.cpp" > + + diff --git a/tests/tests_vc9.vcproj b/tests/tests_vc9.vcproj index 36eb2787..1306939d 100644 --- a/tests/tests_vc9.vcproj +++ b/tests/tests_vc9.vcproj @@ -209,6 +209,10 @@ RelativePath=".\planeMatrix.cpp" > + +