irrlicht/source/Irrlicht/CTriangleSelector.h
cutealien 8372a70f21 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
2023-12-13 16:10:50 +00:00

130 lines
4.6 KiB
C++

// Copyright (C) 2002-2012 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef IRR_C_TRIANGLE_SELECTOR_H_INCLUDED
#define IRR_C_TRIANGLE_SELECTOR_H_INCLUDED
#include "ITriangleSelector.h"
#include "IMesh.h"
#include "irrArray.h"
#include "aabbox3d.h"
namespace irr
{
namespace scene
{
class ISceneNode;
class IAnimatedMeshSceneNode;
//! Stupid triangle selector without optimization
class CTriangleSelector : public ITriangleSelector
{
public:
//! Constructs a selector based on a mesh
CTriangleSelector(ISceneNode* node);
//! Constructs a selector based on a mesh
CTriangleSelector(const IMesh* mesh, ISceneNode* node, bool separateMeshbuffers);
//! Constructs a selector based on a meshbuffer
CTriangleSelector(const IMeshBuffer* meshBuffer, irr::u32 materialIndex, 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, bool separateMeshbuffers);
//! Constructs a selector based on a bounding box
CTriangleSelector(const core::aabbox3d<f32>& box, ISceneNode* node);
//! Gets all triangles.
virtual void getTriangles(core::triangle3df* triangles, s32 arraySize, s32& outTriangleCount,
const core::matrix4* transform, bool useNodeTransform,
irr::core::array<SCollisionTriangleRange>* outTriangleInfo) const IRR_OVERRIDE;
//! Gets all triangles which lie within a specific bounding box.
virtual void getTriangles(core::triangle3df* triangles, s32 arraySize, s32& outTriangleCount,
const core::aabbox3d<f32>& box, const core::matrix4* transform, bool useNodeTransform,
irr::core::array<SCollisionTriangleRange>* outTriangleInfo) const IRR_OVERRIDE;
//! Gets all triangles which have or may have contact with a 3d line.
virtual void getTriangles(core::triangle3df* triangles, s32 arraySize,
s32& outTriangleCount, const core::line3d<f32>& line,
const core::matrix4* transform, bool useNodeTransform,
irr::core::array<SCollisionTriangleRange>* outTriangleInfo) const IRR_OVERRIDE;
//! Returns amount of all available triangles in this selector
virtual s32 getTriangleCount() const IRR_OVERRIDE;
//! Return the scene node associated with a given triangle.
virtual ISceneNode* getSceneNodeForTriangle(u32 triangleIndex) const IRR_OVERRIDE { return SceneNode; }
// Get the number of TriangleSelectors that are part of this one
virtual u32 getSelectorCount() const IRR_OVERRIDE;
// Get the TriangleSelector based on index based on getSelectorCount
virtual ITriangleSelector* getSelector(u32 index) IRR_OVERRIDE;
// Get the TriangleSelector based on index based on getSelectorCount
virtual const ITriangleSelector* getSelector(u32 index) const IRR_OVERRIDE;
protected:
//! Create from a mesh
virtual void createFromMesh(const IMesh* mesh, bool createBufferRanges);
//! Create from a meshbuffer
virtual void createFromMeshBuffer(const IMeshBuffer* meshBuffer);
//! Update when the mesh has changed
virtual void updateFromMesh(const IMesh* mesh) const;
//! Update when the meshbuffer has changed
virtual void updateFromMeshBuffer(const IMeshBuffer* meshBuffer) const;
//! Update bounding box from triangles
void updateBoundingBox() const;
//! Update the triangle selector, which will only have an effect if it
//! was built from an animated mesh and that mesh's frame has changed
//! since the last time it was updated.
virtual void update(void) const;
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;
mutable core::array<core::triangle3df> Triangles; // (mutable for CTriangleBBSelector)
mutable core::aabbox3df BoundingBox; // Allows for trivial rejection
IAnimatedMeshSceneNode* AnimatedNode;
mutable u32 LastMeshFrame;
};
} // end namespace scene
} // end namespace irr
#endif