Fix uninitialized variable in CTriangleSelector and code cleanup

CTriangleSelector constructor with IAnimatedMeshSceneNode parameter didn't initialize MeshBuffer.
Not used internally, so no big problem, but it got passed back to users in some cases
Replaced SCollisionTriangleRange, by CTriangleSelector::SBufferTriangleRange. Was a bad idea to use a struct which is for something else just because some member were the same (my fault, sorry).
Also started unifying the case of using ranges vs not using them. 
Can maybe even get rid of the non-ranges case in future. Or unify the duplicated code for getting triangles at least.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6579 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
cutealien 2023-12-13 16:10:50 +00:00
parent 70b2e3a255
commit 8372a70f21
4 changed files with 39 additions and 17 deletions

View File

@ -182,8 +182,8 @@ void COctreeTriangleSelector::getTriangles(core::triangle3df* triangles,
triRange.RangeSize = trianglesWritten; triRange.RangeSize = trianglesWritten;
triRange.Selector = this; triRange.Selector = this;
triRange.SceneNode = SceneNode; triRange.SceneNode = SceneNode;
triRange.MeshBuffer = MeshBuffer; triRange.MeshBuffer = SingleBufferRange.MeshBuffer;
triRange.MaterialIndex = MaterialIndex; triRange.MaterialIndex = SingleBufferRange.MaterialIndex;
outTriangleInfo->push_back(triRange); outTriangleInfo->push_back(triRange);
} }
@ -274,8 +274,8 @@ void COctreeTriangleSelector::getTriangles(core::triangle3df* triangles, s32 arr
triRange.RangeSize = trianglesWritten; triRange.RangeSize = trianglesWritten;
triRange.Selector = this; triRange.Selector = this;
triRange.SceneNode = SceneNode; triRange.SceneNode = SceneNode;
triRange.MeshBuffer = MeshBuffer; triRange.MeshBuffer = SingleBufferRange.MeshBuffer;
triRange.MaterialIndex = MaterialIndex; triRange.MaterialIndex = SingleBufferRange.MaterialIndex;
outTriangleInfo->push_back(triRange); outTriangleInfo->push_back(triRange);
} }

View File

@ -15,7 +15,7 @@ namespace scene
//! constructor //! constructor
CTriangleSelector::CTriangleSelector(ISceneNode* node) CTriangleSelector::CTriangleSelector(ISceneNode* node)
: SceneNode(node), MeshBuffer(0), MaterialIndex(0), AnimatedNode(0), LastMeshFrame(0) : SceneNode(node), AnimatedNode(0), LastMeshFrame(0)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("CTriangleSelector"); setDebugName("CTriangleSelector");
@ -27,7 +27,7 @@ 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), MeshBuffer(0), MaterialIndex(0), AnimatedNode(0), LastMeshFrame(0) : SceneNode(node), AnimatedNode(0), LastMeshFrame(0)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("CTriangleSelector"); setDebugName("CTriangleSelector");
@ -40,7 +40,7 @@ CTriangleSelector::CTriangleSelector(const core::aabbox3d<f32>& box, ISceneNode*
//! constructor //! constructor
CTriangleSelector::CTriangleSelector(const IMesh* mesh, ISceneNode* node, bool separateMeshbuffers) CTriangleSelector::CTriangleSelector(const IMesh* mesh, ISceneNode* node, bool separateMeshbuffers)
: SceneNode(node), MeshBuffer(0), MaterialIndex(0), AnimatedNode(0), LastMeshFrame(0) : SceneNode(node), AnimatedNode(0), LastMeshFrame(0)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("CTriangleSelector"); setDebugName("CTriangleSelector");
@ -50,12 +50,14 @@ CTriangleSelector::CTriangleSelector(const IMesh* mesh, ISceneNode* node, bool s
} }
CTriangleSelector::CTriangleSelector(const IMeshBuffer* meshBuffer, irr::u32 materialIndex, ISceneNode* node) CTriangleSelector::CTriangleSelector(const IMeshBuffer* meshBuffer, irr::u32 materialIndex, ISceneNode* node)
: SceneNode(node), MeshBuffer(meshBuffer), MaterialIndex(materialIndex), AnimatedNode(0), LastMeshFrame(0) : SceneNode(node), AnimatedNode(0), LastMeshFrame(0)
{ {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("CTriangleSelector"); setDebugName("CTriangleSelector");
#endif #endif
SingleBufferRange.MeshBuffer = meshBuffer;
SingleBufferRange.MaterialIndex = materialIndex;
createFromMeshBuffer(meshBuffer); createFromMeshBuffer(meshBuffer);
} }
@ -90,7 +92,7 @@ void CTriangleSelector::createFromMesh(const IMesh* mesh, bool createBufferRange
u32 totalFaceCount = 0; u32 totalFaceCount = 0;
for (u32 j=0; j<cnt; ++j) for (u32 j=0; j<cnt; ++j)
{ {
SCollisionTriangleRange range; SBufferTriangleRange range;
range.MeshBuffer = mesh->getMeshBuffer(j); range.MeshBuffer = mesh->getMeshBuffer(j);
range.MaterialIndex = j; range.MaterialIndex = j;
range.RangeSize = range.MeshBuffer->getIndexCount() / 3; range.RangeSize = range.MeshBuffer->getIndexCount() / 3;
@ -301,8 +303,8 @@ void CTriangleSelector::getTriangles(core::triangle3df* triangles,
triRange.RangeSize = cnt; triRange.RangeSize = cnt;
triRange.Selector = this; triRange.Selector = this;
triRange.SceneNode = SceneNode; triRange.SceneNode = SceneNode;
triRange.MeshBuffer = MeshBuffer; triRange.MeshBuffer = SingleBufferRange.MeshBuffer;
triRange.MaterialIndex = MaterialIndex; triRange.MaterialIndex = SingleBufferRange.MaterialIndex;
outTriangleInfo->push_back(triRange); outTriangleInfo->push_back(triRange);
} }
else else
@ -445,8 +447,8 @@ void CTriangleSelector::getTriangles(core::triangle3df* triangles,
triRange.RangeSize = triangleCount; triRange.RangeSize = triangleCount;
triRange.Selector = this; triRange.Selector = this;
triRange.SceneNode = SceneNode; triRange.SceneNode = SceneNode;
triRange.MeshBuffer = MeshBuffer; triRange.MeshBuffer = SingleBufferRange.MeshBuffer;
triRange.MaterialIndex = MaterialIndex; triRange.MaterialIndex = SingleBufferRange.MaterialIndex;
outTriangleInfo->push_back(triRange); outTriangleInfo->push_back(triRange);
} }
} }

View File

@ -91,14 +91,34 @@ protected:
//! since the last time it was updated. //! since the last time it was updated.
virtual void update(void) const; virtual void update(void) const;
irr::core::array<SCollisionTriangleRange> BufferRanges; struct SBufferTriangleRange
{
SBufferTriangleRange()
: RangeStart(0), RangeSize(0), MeshBuffer(0), MaterialIndex(0)
{}
//! First index in Triangles array
irr::u32 RangeStart;
//! Number of elements in Triangles array
irr::u32 RangeSize;
//! Meshbuffer from which the triangles are from
//! Is 0 when we use a single range for all buffers
const IMeshBuffer* MeshBuffer;
//! Index of selected material in the SceneNode.
//! Only valid when MeshBuffer is also set, otherwise 0
irr::u32 MaterialIndex;
};
SBufferTriangleRange SingleBufferRange; // When avoiding extra heap allocations
irr::core::array<SBufferTriangleRange> BufferRanges;
ISceneNode* SceneNode; ISceneNode* SceneNode;
mutable core::array<core::triangle3df> Triangles; // (mutable for CTriangleBBSelector) mutable core::array<core::triangle3df> Triangles; // (mutable for CTriangleBBSelector)
mutable core::aabbox3df BoundingBox; // Allows for trivial rejection mutable core::aabbox3df BoundingBox; // Allows for trivial rejection
const IMeshBuffer* MeshBuffer; // non-zero when the selector is for a single meshbuffer
irr::u32 MaterialIndex; // Only set when MeshBuffer is non-zero
IAnimatedMeshSceneNode* AnimatedNode; IAnimatedMeshSceneNode* AnimatedNode;
mutable u32 LastMeshFrame; mutable u32 LastMeshFrame;
}; };

View File

@ -1,4 +1,4 @@
Tests finished. 72 tests of 72 passed. Tests finished. 72 tests of 72 passed.
Compiled as DEBUG Compiled as DEBUG
Test suite pass at GMT Wed Dec 13 15:00:54 2023 Test suite pass at GMT Wed Dec 13 16:04:52 2023