From 81ff2ebb72b1d2d47f2da575c0d05734bc417622 Mon Sep 17 00:00:00 2001 From: hybrid Date: Mon, 3 Dec 2007 10:42:58 +0000 Subject: [PATCH] Provide meshbuffer level access to vertex elements which always exist. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1085 dfc29bdd-3216-0410-991c-e03cc46cb475 --- include/CMeshBuffer.h | 24 ++++++++ include/IMeshBuffer.h | 12 ++++ include/SSkinMeshBuffer.h | 56 +++++++++++++++++++ .../CParticleAnimatedMeshSceneNodeEmitter.cpp | 44 ++++----------- source/Irrlicht/CParticleMeshEmitter.cpp | 44 ++++----------- 5 files changed, 112 insertions(+), 68 deletions(-) diff --git a/include/CMeshBuffer.h b/include/CMeshBuffer.h index 34386b90..e1935d3a 100644 --- a/include/CMeshBuffer.h +++ b/include/CMeshBuffer.h @@ -105,6 +105,30 @@ namespace scene return T().getType(); } + //! returns position of vertex i + virtual const core::vector3df& getPosition(u32 i) const + { + return Vertices[i].Pos; + } + + //! returns position of vertex i + virtual core::vector3df& getPosition(u32 i) + { + return Vertices[i].Pos; + } + + //! returns normal of vertex i + virtual const core::vector3df& getNormal(u32 i) const + { + return Vertices[i].Normal; + } + + //! returns normal of vertex i + virtual core::vector3df& getNormal(u32 i) + { + return Vertices[i].Normal; + } + //! append the vertices and indices to the current buffer virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) diff --git a/include/IMeshBuffer.h b/include/IMeshBuffer.h index 60b60b04..907dbfd7 100644 --- a/include/IMeshBuffer.h +++ b/include/IMeshBuffer.h @@ -103,6 +103,18 @@ namespace scene //! recalculates the bounding box. should be called if the mesh changed. virtual void recalculateBoundingBox() = 0; + //! returns position of vertex i + virtual const core::vector3df& getPosition(u32 i) const = 0; + + //! returns position of vertex i + virtual core::vector3df& getPosition(u32 i) = 0; + + //! returns normal of vertex i + virtual const core::vector3df& getNormal(u32 i) const = 0; + + //! returns normal of vertex i + virtual core::vector3df& getNormal(u32 i) = 0; + //! append the vertices and indices to the current buffer virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) = 0; diff --git a/include/SSkinMeshBuffer.h b/include/SSkinMeshBuffer.h index e0ebcee1..c5294b67 100644 --- a/include/SSkinMeshBuffer.h +++ b/include/SSkinMeshBuffer.h @@ -201,6 +201,62 @@ struct SSkinMeshBuffer : public IMeshBuffer } } + //! returns position of vertex i + virtual const core::vector3df& getPosition(u32 i) const + { + switch (VertexType) + { + case video::EVT_2TCOORDS: + return Vertices_2TCoords[i].Pos; + case video::EVT_TANGENTS: + return Vertices_Tangents[i].Pos; + default: + return Vertices_Standard[i].Pos; + } + } + + //! returns position of vertex i + virtual core::vector3df& getPosition(u32 i) + { + switch (VertexType) + { + case video::EVT_2TCOORDS: + return Vertices_2TCoords[i].Pos; + case video::EVT_TANGENTS: + return Vertices_Tangents[i].Pos; + default: + return Vertices_Standard[i].Pos; + } + } + + //! returns normal of vertex i + virtual const core::vector3df& getNormal(u32 i) const + { + switch (VertexType) + { + case video::EVT_2TCOORDS: + return Vertices_2TCoords[i].Normal; + case video::EVT_TANGENTS: + return Vertices_Tangents[i].Normal; + default: + return Vertices_Standard[i].Normal; + } + } + + //! returns normal of vertex i + virtual core::vector3df& getNormal(u32 i) + { + switch (VertexType) + { + case video::EVT_2TCOORDS: + return Vertices_2TCoords[i].Normal; + case video::EVT_TANGENTS: + return Vertices_Tangents[i].Normal; + default: + return Vertices_Standard[i].Normal; + } + } + //! append the vertices and indices to the current buffer virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) {} diff --git a/source/Irrlicht/CParticleAnimatedMeshSceneNodeEmitter.cpp b/source/Irrlicht/CParticleAnimatedMeshSceneNodeEmitter.cpp index 6436479d..fba3a230 100644 --- a/source/Irrlicht/CParticleAnimatedMeshSceneNodeEmitter.cpp +++ b/source/Irrlicht/CParticleAnimatedMeshSceneNodeEmitter.cpp @@ -71,23 +71,11 @@ s32 CParticleAnimatedMeshSceneNodeEmitter::emitt(u32 now, u32 timeSinceLastCall, { for( u32 k=0; kgetMeshBuffer(j)->getVertexCount(); ++k ) { - switch( frameMesh->getMeshBuffer(j)->getVertexType() ) - { - case video::EVT_STANDARD: - p.pos = ((video::S3DVertex*)frameMesh->getMeshBuffer(j)->getVertices())[k].Pos; - if( UseNormalDirection ) - p.vector = ((video::S3DVertex*)frameMesh->getMeshBuffer(j)->getVertices())[k].Normal / NormalDirectionModifier; - else - p.vector = Direction; - break; - case video::EVT_TANGENTS: - p.pos = ((video::S3DVertexTangents*)frameMesh->getMeshBuffer(j)->getVertices())[k].Pos; - if( UseNormalDirection ) - p.vector = ((video::S3DVertexTangents*)frameMesh->getMeshBuffer(j)->getVertices())[k].Normal / NormalDirectionModifier; - else - p.vector = Direction; - break; - } + p.pos = frameMesh->getMeshBuffer(j)->getPosition(k); + if( UseNormalDirection ) + p.vector = frameMesh->getMeshBuffer(j)->getNormal(k) / NormalDirectionModifier; + else + p.vector = Direction; p.startTime = now; @@ -130,23 +118,11 @@ s32 CParticleAnimatedMeshSceneNodeEmitter::emitt(u32 now, u32 timeSinceLastCall, u32 vertexNumber = os::Randomizer::rand() % frameMesh->getMeshBuffer(randomMB)->getVertexCount(); - switch( frameMesh->getMeshBuffer(randomMB)->getVertexType() ) - { - case video::EVT_STANDARD: - p.pos = ((video::S3DVertex*)frameMesh->getMeshBuffer(randomMB)->getVertices())[vertexNumber].Pos; - if( UseNormalDirection ) - p.vector = ((video::S3DVertex*)frameMesh->getMeshBuffer(randomMB)->getVertices())[vertexNumber].Normal / NormalDirectionModifier; - else - p.vector = Direction; - break; - case video::EVT_TANGENTS: - p.pos = ((video::S3DVertexTangents*)frameMesh->getMeshBuffer(randomMB)->getVertices())[vertexNumber].Pos; - if( UseNormalDirection ) - p.vector = ((video::S3DVertexTangents*)frameMesh->getMeshBuffer(randomMB)->getVertices())[vertexNumber].Normal / NormalDirectionModifier; - else - p.vector = Direction; - break; - } + p.pos = frameMesh->getMeshBuffer(randomMB)->getPosition(vertexNumber); + if( UseNormalDirection ) + p.vector = frameMesh->getMeshBuffer(randomMB)->getNormal(vertexNumber) / NormalDirectionModifier; + else + p.vector = Direction; p.startTime = now; diff --git a/source/Irrlicht/CParticleMeshEmitter.cpp b/source/Irrlicht/CParticleMeshEmitter.cpp index c9dfcaf5..b4bf337c 100644 --- a/source/Irrlicht/CParticleMeshEmitter.cpp +++ b/source/Irrlicht/CParticleMeshEmitter.cpp @@ -65,23 +65,11 @@ s32 CParticleMeshEmitter::emitt(u32 now, u32 timeSinceLastCall, SParticle*& outA { for( u32 k=0; kgetMeshBuffer(j)->getVertexCount(); ++k ) { - switch( Mesh->getMeshBuffer(j)->getVertexType() ) - { - case video::EVT_STANDARD: - p.pos = ((video::S3DVertex*)Mesh->getMeshBuffer(j)->getVertices())[k].Pos; - if( UseNormalDirection ) - p.vector = ((video::S3DVertex*)Mesh->getMeshBuffer(j)->getVertices())[k].Normal / NormalDirectionModifier; - else - p.vector = Direction; - break; - case video::EVT_TANGENTS: - p.pos = ((video::S3DVertexTangents*)Mesh->getMeshBuffer(j)->getVertices())[k].Pos; - if( UseNormalDirection ) - p.vector = ((video::S3DVertexTangents*)Mesh->getMeshBuffer(j)->getVertices())[k].Normal / NormalDirectionModifier; - else - p.vector = Direction; - break; - } + p.pos = Mesh->getMeshBuffer(j)->getPosition(k); + if( UseNormalDirection ) + p.vector = Mesh->getMeshBuffer(j)->getNormal(k) / NormalDirectionModifier; + else + p.vector = Direction; p.startTime = now; @@ -124,23 +112,11 @@ s32 CParticleMeshEmitter::emitt(u32 now, u32 timeSinceLastCall, SParticle*& outA u32 vertexNumber = os::Randomizer::rand() % Mesh->getMeshBuffer(randomMB)->getVertexCount(); - switch( Mesh->getMeshBuffer(randomMB)->getVertexType() ) - { - case video::EVT_STANDARD: - p.pos = ((video::S3DVertex*)Mesh->getMeshBuffer(randomMB)->getVertices())[vertexNumber].Pos; - if( UseNormalDirection ) - p.vector = ((video::S3DVertex*)Mesh->getMeshBuffer(randomMB)->getVertices())[vertexNumber].Normal / NormalDirectionModifier; - else - p.vector = Direction; - break; - case video::EVT_TANGENTS: - p.pos = ((video::S3DVertexTangents*)Mesh->getMeshBuffer(randomMB)->getVertices())[vertexNumber].Pos; - if( UseNormalDirection ) - p.vector = ((video::S3DVertexTangents*)Mesh->getMeshBuffer(randomMB)->getVertices())[vertexNumber].Normal / NormalDirectionModifier; - else - p.vector = Direction; - break; - } + p.pos = Mesh->getMeshBuffer(randomMB)->getPosition(vertexNumber); + if( UseNormalDirection ) + p.vector = Mesh->getMeshBuffer(randomMB)->getNormal(vertexNumber) / NormalDirectionModifier; + else + p.vector = Direction; p.startTime = now;