From 8372a70f21faadc77759cd670b8322ca4187f908 Mon Sep 17 00:00:00 2001 From: cutealien Date: Wed, 13 Dec 2023 16:10:50 +0000 Subject: [PATCH] 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 --- source/Irrlicht/COctreeTriangleSelector.cpp | 8 +++---- source/Irrlicht/CTriangleSelector.cpp | 20 +++++++++------- source/Irrlicht/CTriangleSelector.h | 26 ++++++++++++++++++--- tests/tests-last-passed-at.txt | 2 +- 4 files changed, 39 insertions(+), 17 deletions(-) diff --git a/source/Irrlicht/COctreeTriangleSelector.cpp b/source/Irrlicht/COctreeTriangleSelector.cpp index 50c6ff4b..0c7fd1f5 100644 --- a/source/Irrlicht/COctreeTriangleSelector.cpp +++ b/source/Irrlicht/COctreeTriangleSelector.cpp @@ -182,8 +182,8 @@ void COctreeTriangleSelector::getTriangles(core::triangle3df* triangles, triRange.RangeSize = trianglesWritten; triRange.Selector = this; triRange.SceneNode = SceneNode; - triRange.MeshBuffer = MeshBuffer; - triRange.MaterialIndex = MaterialIndex; + triRange.MeshBuffer = SingleBufferRange.MeshBuffer; + triRange.MaterialIndex = SingleBufferRange.MaterialIndex; outTriangleInfo->push_back(triRange); } @@ -274,8 +274,8 @@ void COctreeTriangleSelector::getTriangles(core::triangle3df* triangles, s32 arr triRange.RangeSize = trianglesWritten; triRange.Selector = this; triRange.SceneNode = SceneNode; - triRange.MeshBuffer = MeshBuffer; - triRange.MaterialIndex = MaterialIndex; + triRange.MeshBuffer = SingleBufferRange.MeshBuffer; + triRange.MaterialIndex = SingleBufferRange.MaterialIndex; outTriangleInfo->push_back(triRange); } diff --git a/source/Irrlicht/CTriangleSelector.cpp b/source/Irrlicht/CTriangleSelector.cpp index 0cf500a4..044545eb 100644 --- a/source/Irrlicht/CTriangleSelector.cpp +++ b/source/Irrlicht/CTriangleSelector.cpp @@ -15,7 +15,7 @@ namespace scene //! constructor CTriangleSelector::CTriangleSelector(ISceneNode* node) -: SceneNode(node), MeshBuffer(0), MaterialIndex(0), AnimatedNode(0), LastMeshFrame(0) +: SceneNode(node), AnimatedNode(0), LastMeshFrame(0) { #ifdef _DEBUG setDebugName("CTriangleSelector"); @@ -27,7 +27,7 @@ CTriangleSelector::CTriangleSelector(ISceneNode* node) //! constructor CTriangleSelector::CTriangleSelector(const core::aabbox3d& box, ISceneNode* node) -: SceneNode(node), MeshBuffer(0), MaterialIndex(0), AnimatedNode(0), LastMeshFrame(0) +: SceneNode(node), AnimatedNode(0), LastMeshFrame(0) { #ifdef _DEBUG setDebugName("CTriangleSelector"); @@ -40,7 +40,7 @@ CTriangleSelector::CTriangleSelector(const core::aabbox3d& box, ISceneNode* //! constructor 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 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) - : SceneNode(node), MeshBuffer(meshBuffer), MaterialIndex(materialIndex), AnimatedNode(0), LastMeshFrame(0) + : SceneNode(node), AnimatedNode(0), LastMeshFrame(0) { #ifdef _DEBUG setDebugName("CTriangleSelector"); #endif + SingleBufferRange.MeshBuffer = meshBuffer; + SingleBufferRange.MaterialIndex = materialIndex; createFromMeshBuffer(meshBuffer); } @@ -90,7 +92,7 @@ void CTriangleSelector::createFromMesh(const IMesh* mesh, bool createBufferRange u32 totalFaceCount = 0; for (u32 j=0; jgetMeshBuffer(j); range.MaterialIndex = j; range.RangeSize = range.MeshBuffer->getIndexCount() / 3; @@ -301,8 +303,8 @@ void CTriangleSelector::getTriangles(core::triangle3df* triangles, triRange.RangeSize = cnt; triRange.Selector = this; triRange.SceneNode = SceneNode; - triRange.MeshBuffer = MeshBuffer; - triRange.MaterialIndex = MaterialIndex; + triRange.MeshBuffer = SingleBufferRange.MeshBuffer; + triRange.MaterialIndex = SingleBufferRange.MaterialIndex; outTriangleInfo->push_back(triRange); } else @@ -445,8 +447,8 @@ void CTriangleSelector::getTriangles(core::triangle3df* triangles, triRange.RangeSize = triangleCount; triRange.Selector = this; triRange.SceneNode = SceneNode; - triRange.MeshBuffer = MeshBuffer; - triRange.MaterialIndex = MaterialIndex; + triRange.MeshBuffer = SingleBufferRange.MeshBuffer; + triRange.MaterialIndex = SingleBufferRange.MaterialIndex; outTriangleInfo->push_back(triRange); } } diff --git a/source/Irrlicht/CTriangleSelector.h b/source/Irrlicht/CTriangleSelector.h index 138fca91..01a451b3 100644 --- a/source/Irrlicht/CTriangleSelector.h +++ b/source/Irrlicht/CTriangleSelector.h @@ -91,14 +91,34 @@ protected: //! since the last time it was updated. virtual void update(void) const; - irr::core::array 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 BufferRanges; ISceneNode* SceneNode; mutable core::array Triangles; // (mutable for CTriangleBBSelector) 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; mutable u32 LastMeshFrame; }; diff --git a/tests/tests-last-passed-at.txt b/tests/tests-last-passed-at.txt index 661557bc..5109c5ce 100644 --- a/tests/tests-last-passed-at.txt +++ b/tests/tests-last-passed-at.txt @@ -1,4 +1,4 @@ Tests finished. 72 tests of 72 passed. 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