Commit 47d5711e authored by hybrid's avatar hybrid

Merged from trunk revisions 3998-4000. Changes for triangle selector.

Also added a fix for proper update of animated meshes, as suggested by Reiko. This was missing from the recent update of improved selector usage and should now re-enable the proper handling of animated poses in selectors.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@4001 dfc29bdd-3216-0410-991c-e03cc46cb475
parent 3353705f
...@@ -14,7 +14,7 @@ namespace scene ...@@ -14,7 +14,7 @@ namespace scene
//! constructor //! constructor
CTriangleSelector::CTriangleSelector(ISceneNode* node) CTriangleSelector::CTriangleSelector(ISceneNode* node)
: SceneNode(node), AnimatedNode(0), LastMeshFrame(-1) : SceneNode(node), AnimatedNode(0), LastMeshFrame(0)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("CTriangleSelector"); setDebugName("CTriangleSelector");
...@@ -26,20 +26,20 @@ CTriangleSelector::CTriangleSelector(ISceneNode* node) ...@@ -26,20 +26,20 @@ CTriangleSelector::CTriangleSelector(ISceneNode* node)
//! constructor //! constructor
CTriangleSelector::CTriangleSelector(const core::aabbox3d<f32>& box, ISceneNode* node) CTriangleSelector::CTriangleSelector(const core::aabbox3d<f32>& box, ISceneNode* node)
: SceneNode(node) : SceneNode(node), AnimatedNode(0), LastMeshFrame(0)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("CTriangleSelector"); setDebugName("CTriangleSelector");
#endif #endif
BoundingBox.reset(0.f, 0.f, 0.f); BoundingBox=box;
// TODO // TODO
} }
//! constructor //! constructor
CTriangleSelector::CTriangleSelector(const IMesh* mesh, ISceneNode* node) CTriangleSelector::CTriangleSelector(const IMesh* mesh, ISceneNode* node)
: SceneNode(node), AnimatedNode(0) : SceneNode(node), AnimatedNode(0), LastMeshFrame(0)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("CTriangleSelector"); setDebugName("CTriangleSelector");
...@@ -50,7 +50,7 @@ CTriangleSelector::CTriangleSelector(const IMesh* mesh, ISceneNode* node) ...@@ -50,7 +50,7 @@ CTriangleSelector::CTriangleSelector(const IMesh* mesh, ISceneNode* node)
CTriangleSelector::CTriangleSelector(IAnimatedMeshSceneNode* node) CTriangleSelector::CTriangleSelector(IAnimatedMeshSceneNode* node)
: SceneNode(reinterpret_cast<ISceneNode*>(node)), AnimatedNode(node) : SceneNode(node), AnimatedNode(node), LastMeshFrame(0)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("CTriangleSelector"); setDebugName("CTriangleSelector");
...@@ -59,18 +59,19 @@ CTriangleSelector::CTriangleSelector(IAnimatedMeshSceneNode* node) ...@@ -59,18 +59,19 @@ CTriangleSelector::CTriangleSelector(IAnimatedMeshSceneNode* node)
if (!AnimatedNode) if (!AnimatedNode)
return; return;
IAnimatedMesh * animatedMesh = AnimatedNode->getMesh(); IAnimatedMesh* animatedMesh = AnimatedNode->getMesh();
if (!animatedMesh) if (!animatedMesh)
return; return;
IMesh * mesh = animatedMesh->getMesh((s32)AnimatedNode->getFrameNr()); LastMeshFrame = AnimatedNode->getFrameNr();
IMesh* mesh = animatedMesh->getMesh(LastMeshFrame);
if (mesh) if (mesh)
createFromMesh(mesh); createFromMesh(mesh);
} }
void CTriangleSelector::createFromMesh(const IMesh * mesh) void CTriangleSelector::createFromMesh(const IMesh* mesh)
{ {
const u32 cnt = mesh->getMeshBufferCount(); const u32 cnt = mesh->getMeshBufferCount();
u32 totalFaceCount = 0; u32 totalFaceCount = 0;
...@@ -136,7 +137,7 @@ void CTriangleSelector::update(void) const ...@@ -136,7 +137,7 @@ void CTriangleSelector::update(void) const
if (!AnimatedNode) if (!AnimatedNode)
return; //< harmless no-op return; //< harmless no-op
s32 currentFrame = (s32)AnimatedNode->getFrameNr(); const u32 currentFrame = AnimatedNode->getFrameNr();
if (currentFrame == LastMeshFrame) if (currentFrame == LastMeshFrame)
return; //< Nothing to do return; //< Nothing to do
...@@ -188,6 +189,9 @@ void CTriangleSelector::getTriangles(core::triangle3df* triangles, ...@@ -188,6 +189,9 @@ void CTriangleSelector::getTriangles(core::triangle3df* triangles,
const core::aabbox3d<f32>& box, const core::aabbox3d<f32>& box,
const core::matrix4* transform) const const core::matrix4* transform) const
{ {
// Update my triangles if necessary
update();
core::matrix4 mat(core::matrix4::EM4CONST_NOTHING); core::matrix4 mat(core::matrix4::EM4CONST_NOTHING);
core::aabbox3df tBox(box); core::aabbox3df tBox(box);
...@@ -238,6 +242,9 @@ void CTriangleSelector::getTriangles(core::triangle3df* triangles, ...@@ -238,6 +242,9 @@ void CTriangleSelector::getTriangles(core::triangle3df* triangles,
const core::line3d<f32>& line, const core::line3d<f32>& line,
const core::matrix4* transform) const const core::matrix4* transform) const
{ {
// Update my triangles if necessary
update();
core::aabbox3d<f32> box(line.start); core::aabbox3d<f32> box(line.start);
box.addInternalPoint(line.end); box.addInternalPoint(line.end);
......
...@@ -81,7 +81,7 @@ protected: ...@@ -81,7 +81,7 @@ protected:
mutable core::aabbox3df BoundingBox; // Allows for trivial rejection mutable core::aabbox3df BoundingBox; // Allows for trivial rejection
IAnimatedMeshSceneNode* AnimatedNode; IAnimatedMeshSceneNode* AnimatedNode;
mutable s32 LastMeshFrame; mutable u32 LastMeshFrame;
}; };
} // end namespace scene } // end namespace scene
......
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