The following functions will now use a "ISceneNode *" instead of a "const ISceneNode *":

ITriangleSelector::getSceneNodeForTriangle, ISceneNodeAnimatorCollisionResponse::getCollisionNode, ISceneCollisionManager::getCollisionPoint and ISceneCollisionManager::getCollisionResultPosition.
As collision functions often are followed by changing node positions users where so far forced to using const_casts (found by Greenya).
(This will lead once more to many post about correct getCollisionResultPosition usage, but can't be helped - those consts were too restricitive, sorry)


git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3442 dfc29bdd-3216-0410-991c-e03cc46cb475
master
cutealien 2010-11-21 00:23:09 +00:00
parent 5c3e9500f8
commit 8b71ff58b4
21 changed files with 63 additions and 56 deletions

View File

@ -1,5 +1,9 @@
Changes in 1.8 (??.0?.2010)
- The following functions will now use a "ISceneNode *" instead of a "const ISceneNode *":
ITriangleSelector::getSceneNodeForTriangle, ISceneNodeAnimatorCollisionResponse::getCollisionNode, ISceneCollisionManager::getCollisionPoint and ISceneCollisionManager::getCollisionResultPosition.
As collision functions often are followed by changing node positions users where so far forced to using const_casts (found by Greenya).
- Add vector3d::getAs3Values (patch provided by slavik262)
- Add function to SViewFrustum to get corners of the near plane (patch provided by Matt Kline, aka slavik262)

View File

@ -1733,7 +1733,7 @@ void CQuake3EventHandler::useItem( Q3Player * player)
line3d<f32> line(start, end);
// get intersection point with map
const scene::ISceneNode* hitNode;
scene::ISceneNode* hitNode;
if (smgr->getSceneCollisionManager()->getCollisionPoint(
line, Meta, end, triangle,hitNode))
{

View File

@ -620,7 +620,7 @@ void CDemo::shoot()
core::line3d<f32> line(start, end);
// get intersection point with map
const scene::ISceneNode* hitNode;
scene::ISceneNode* hitNode;
if (sm->getSceneCollisionManager()->getCollisionPoint(
line, mapSelector, end, triangle, hitNode))
{

View File

@ -40,7 +40,7 @@ namespace scene
\return True if a collision was detected and false if not. */
virtual bool getCollisionPoint(const core::line3d<f32>& ray,
ITriangleSelector* selector, core::vector3df& outCollisionPoint,
core::triangle3df& outTriangle, const ISceneNode*& outNode) =0;
core::triangle3df& outTriangle, ISceneNode*& outNode) =0;
//! Collides a moving ellipsoid with a 3d world with gravity and returns the resulting new position of the ellipsoid.
/** This can be used for moving a character in a 3d world: The
@ -73,7 +73,7 @@ namespace scene
core::triangle3df& triout,
core::vector3df& hitPosition,
bool& outFalling,
const ISceneNode*& outNode,
ISceneNode*& outNode,
f32 slidingSpeed = 0.0005f,
const core::vector3df& gravityDirectionAndSpeed
= core::vector3df(0.0f, 0.0f, 0.0f)) = 0;

View File

@ -153,7 +153,7 @@ namespace scene
virtual const core::vector3df & getCollisionResultPosition(void) const = 0;
//! Returns the node that was collided with.
virtual const ISceneNode* getCollisionNode(void) const = 0;
virtual ISceneNode* getCollisionNode(void) const = 0;
//! Sets a callback interface which will be called if a collision occurs.
/** \param callback: collision callback handler that will be called when a collision

View File

@ -110,7 +110,7 @@ public:
the associated scene node.
\return The scene node associated with that triangle.
*/
virtual const ISceneNode* getSceneNodeForTriangle(u32 triangleIndex) const = 0;
virtual ISceneNode* getSceneNodeForTriangle(u32 triangleIndex) const = 0;
};

View File

@ -135,7 +135,7 @@ void CMetaTriangleSelector::removeAllTriangleSelectors()
//! Return the scene node associated with a given triangle.
const ISceneNode* CMetaTriangleSelector::getSceneNodeForTriangle(u32 triangleIndex) const
ISceneNode* CMetaTriangleSelector::getSceneNodeForTriangle(u32 triangleIndex) const
{
u32 totalTriangles = 0;

View File

@ -52,7 +52,7 @@ public:
virtual void removeAllTriangleSelectors();
//! Return the scene node associated with a given triangle.
virtual const ISceneNode* getSceneNodeForTriangle(u32 triangleIndex) const;
virtual ISceneNode* getSceneNodeForTriangle(u32 triangleIndex) const;
private:

View File

@ -14,7 +14,7 @@ namespace scene
//! constructor
COctreeTriangleSelector::COctreeTriangleSelector(const IMesh* mesh,
const ISceneNode* node, s32 minimalPolysPerNode)
ISceneNode* node, s32 minimalPolysPerNode)
: CTriangleSelector(mesh, node), Root(0), NodeCount(0),
MinimalPolysPerNode(minimalPolysPerNode)
{

View File

@ -20,7 +20,7 @@ class COctreeTriangleSelector : public CTriangleSelector
public:
//! Constructs a selector based on a mesh
COctreeTriangleSelector(const IMesh* mesh, const ISceneNode* node, s32 minimalPolysPerNode);
COctreeTriangleSelector(const IMesh* mesh, ISceneNode* node, s32 minimalPolysPerNode);
virtual ~COctreeTriangleSelector();

View File

@ -303,7 +303,7 @@ void CSceneCollisionManager::getPickedNodeFromBBAndSelector(
core::triangle3df candidateTriangle;
// do intersection test in object space
const ISceneNode * hitNode = 0;
ISceneNode * hitNode = 0;
if (box.intersectsWithLine(line) &&
getCollisionPoint(ray, selector, candidateCollisionPoint, candidateTriangle, hitNode))
{
@ -349,7 +349,7 @@ ISceneNode* CSceneCollisionManager::getSceneNodeFromCameraBB(
bool CSceneCollisionManager::getCollisionPoint(const core::line3d<f32>& ray,
ITriangleSelector* selector, core::vector3df& outIntersection,
core::triangle3df& outTriangle,
const ISceneNode*& outNode)
ISceneNode*& outNode)
{
if (!selector)
{
@ -423,7 +423,7 @@ core::vector3df CSceneCollisionManager::getCollisionResultPosition(
core::triangle3df& triout,
core::vector3df& hitPosition,
bool& outFalling,
const ISceneNode*& outNode,
ISceneNode*& outNode,
f32 slidingSpeed,
const core::vector3df& gravity)
{
@ -691,7 +691,7 @@ core::vector3df CSceneCollisionManager::collideEllipsoidWithWorld(
core::triangle3df& triout,
core::vector3df& hitPosition,
bool& outFalling,
const ISceneNode*& outNode)
ISceneNode*& outNode)
{
if (!selector || radius.X == 0.0f || radius.Y == 0.0f || radius.Z == 0.0f)
return position;

View File

@ -45,7 +45,7 @@ namespace scene
virtual bool getCollisionPoint(const core::line3d<f32>& ray,
ITriangleSelector* selector, core::vector3df& outCollisionPoint,
core::triangle3df& outTriangle,
const ISceneNode* & outNode);
ISceneNode* & outNode);
//! Collides a moving ellipsoid with a 3d world with gravity and returns
//! the resulting new position of the ellipsoid.
@ -57,7 +57,7 @@ namespace scene
core::triangle3df& triout,
core::vector3df& hitPosition,
bool& outFalling,
const ISceneNode*& outNode,
ISceneNode*& outNode,
f32 slidingSpeed,
const core::vector3df& gravityDirectionAndSpeed);
@ -138,7 +138,7 @@ namespace scene
const core::vector3df& gravity, core::triangle3df& triout,
core::vector3df& hitPosition,
bool& outFalling,
const ISceneNode*& outNode);
ISceneNode*& outNode);
core::vector3df collideWithWorld(s32 recursionDepth, SCollisionData &colData,
core::vector3df pos, core::vector3df vel);

View File

@ -23,7 +23,7 @@ CSceneNodeAnimatorCollisionResponse::CSceneNodeAnimatorCollisionResponse(
f32 slidingSpeed)
: Radius(ellipsoidRadius), Gravity(gravityPerSecond), Translation(ellipsoidTranslation),
World(world), Object(object), SceneManager(scenemanager), LastTime(0),
SlidingSpeed(slidingSpeed), CollisionCallback(0),
SlidingSpeed(slidingSpeed), CollisionNode(0), CollisionCallback(0),
Falling(false), IsCamera(false), AnimateCameraTarget(true), CollisionOccurred(false),
FirstUpdate(true)
{

View File

@ -110,7 +110,7 @@ namespace scene
virtual const core::vector3df & getCollisionResultPosition(void) const { return CollisionResultPosition; }
virtual const ISceneNode* getCollisionNode(void) const { return CollisionNode; }
virtual ISceneNode* getCollisionNode(void) const { return CollisionNode; }
//! Sets a callback interface which will be called if a collision occurs.
@ -140,7 +140,7 @@ namespace scene
core::vector3df CollisionPoint;
core::triangle3df CollisionTriangle;
core::vector3df CollisionResultPosition;
const ISceneNode * CollisionNode;
ISceneNode * CollisionNode;
ICollisionCallback* CollisionCallback;
bool Falling;

View File

@ -186,6 +186,11 @@ s32 CTerrainTriangleSelector::getTriangleCount() const
return TrianglePatches.TotalTriangles;
}
ISceneNode* CTerrainTriangleSelector::getSceneNodeForTriangle(u32 triangleIndex) const
{
return SceneNode;
}
} // end namespace scene
} // end namespace irr

View File

@ -53,9 +53,7 @@ public:
virtual s32 getTriangleCount() const;
//! Return the scene node associated with a given triangle.
/** ITerrainSceneNode is an ISceneNode, we just don't know it yet. */
virtual const ISceneNode* getSceneNodeForTriangle(u32 triangleIndex) const
{ return (ISceneNode*)SceneNode; }
virtual ISceneNode* getSceneNodeForTriangle(u32 triangleIndex) const;
private:

View File

@ -11,7 +11,7 @@ namespace scene
{
//! constructor
CTriangleBBSelector::CTriangleBBSelector(const ISceneNode* node)
CTriangleBBSelector::CTriangleBBSelector(ISceneNode* node)
: CTriangleSelector(node)
{
#ifdef _DEBUG

View File

@ -18,7 +18,7 @@ class CTriangleBBSelector : public CTriangleSelector
public:
//! Constructs a selector based on a mesh
CTriangleBBSelector(const ISceneNode* node);
CTriangleBBSelector(ISceneNode* node);
//! Gets all triangles.
virtual void getTriangles(core::triangle3df* triangles, s32 arraySize, s32& outTriangleCount,

View File

@ -13,7 +13,7 @@ namespace scene
{
//! constructor
CTriangleSelector::CTriangleSelector(const ISceneNode* node)
CTriangleSelector::CTriangleSelector(ISceneNode* node)
: SceneNode(node), AnimatedNode(0), LastMeshFrame(-1)
{
#ifdef _DEBUG
@ -23,7 +23,7 @@ CTriangleSelector::CTriangleSelector(const ISceneNode* node)
//! constructor
CTriangleSelector::CTriangleSelector(const IMesh* mesh, const ISceneNode* node)
CTriangleSelector::CTriangleSelector(const IMesh* mesh, ISceneNode* node)
: SceneNode(node), AnimatedNode(0)
{
#ifdef _DEBUG
@ -137,7 +137,7 @@ void CTriangleSelector::updateFromMesh(const IMesh* mesh) const
//! constructor
CTriangleSelector::CTriangleSelector(const core::aabbox3d<f32>& box, const ISceneNode* node)
CTriangleSelector::CTriangleSelector(const core::aabbox3d<f32>& box, ISceneNode* node)
: SceneNode(node)
{
#ifdef _DEBUG

View File

@ -23,17 +23,17 @@ class CTriangleSelector : public ITriangleSelector
public:
//! Constructs a selector based on a mesh
CTriangleSelector(const ISceneNode* node);
CTriangleSelector(ISceneNode* node);
//! Constructs a selector based on a mesh
CTriangleSelector(const IMesh* mesh, const ISceneNode* node);
CTriangleSelector(const IMesh* mesh, ISceneNode* node);
//! Constructs a selector based on an animated mesh scene node
//!\param node An animated mesh scene node, which must have a valid mesh
CTriangleSelector(IAnimatedMeshSceneNode* node);
//! Constructs a selector based on a bounding box
CTriangleSelector(const core::aabbox3d<f32>& box, const ISceneNode* node);
CTriangleSelector(const core::aabbox3d<f32>& box, ISceneNode* node);
//! Gets all triangles.
void getTriangles(core::triangle3df* triangles, s32 arraySize, s32& outTriangleCount,
@ -52,7 +52,7 @@ public:
virtual s32 getTriangleCount() const;
//! Return the scene node associated with a given triangle.
virtual const ISceneNode* getSceneNodeForTriangle(u32 triangleIndex) const { return SceneNode; }
virtual ISceneNode* getSceneNodeForTriangle(u32 triangleIndex) const { return SceneNode; }
protected:
//! Create from a mesh
@ -66,8 +66,8 @@ protected:
//! since the last time it was updated.
virtual void update(void) const;
const ISceneNode* SceneNode;
mutable core::array<core::triangle3df> Triangles;
ISceneNode* SceneNode;
mutable core::array<core::triangle3df> Triangles; // (mutable for CTriangleBBSelector)
IAnimatedMeshSceneNode* AnimatedNode;
mutable s32 LastMeshFrame;

View File

@ -18,7 +18,7 @@ static bool testGetCollisionResultPosition(IrrlichtDevice * device,
triangle3df triOut;
vector3df hitPosition;
bool falling;
const ISceneNode* hitNode;
ISceneNode* hitNode;
vector3df resultPosition =
collMgr->getCollisionResultPosition(cubeSelector,
@ -112,7 +112,7 @@ static bool getCollisionPoint_ignoreTriangleVertices(IrrlichtDevice * device,
line3df ray(0, 0, -5, 0, 0, 100);
vector3df hitPosition;
triangle3df hitTriangle;
const ISceneNode* hitNode;
ISceneNode* hitNode;
bool collision = collMgr->getCollisionPoint(ray, meta, hitPosition, hitTriangle, hitNode);