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