Commit 27b5b663 authored by hybrid's avatar hybrid

Change SMesh allocation to heap allocation, as it's a reference counted element.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3037 dfc29bdd-3216-0410-991c-e03cc46cb475
parent e10f17dc
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
#include "IVideoDriver.h" #include "IVideoDriver.h"
#include "ISceneManager.h" #include "ISceneManager.h"
#include "ICameraSceneNode.h" #include "ICameraSceneNode.h"
#include "SMeshBufferLightMap.h"
#include "SViewFrustum.h" #include "SViewFrustum.h"
#include "irrMath.h" #include "irrMath.h"
#include "os.h" #include "os.h"
...@@ -21,6 +20,8 @@ ...@@ -21,6 +20,8 @@
#include "IReadFile.h" #include "IReadFile.h"
#include "ITextSceneNode.h" #include "ITextSceneNode.h"
#include "IAnimatedMesh.h" #include "IAnimatedMesh.h"
#include "SMesh.h"
#include "CDynamicMeshBuffer.h"
namespace irr namespace irr
{ {
...@@ -47,6 +48,7 @@ namespace scene ...@@ -47,6 +48,7 @@ namespace scene
setDebugName("CTerrainSceneNode"); setDebugName("CTerrainSceneNode");
#endif #endif
Mesh = new SMesh();
RenderBuffer = new CDynamicMeshBuffer(video::EVT_2TCOORDS, video::EIT_16BIT); RenderBuffer = new CDynamicMeshBuffer(video::EVT_2TCOORDS, video::EIT_16BIT);
RenderBuffer->setHardwareMappingHint(scene::EHM_STATIC, scene::EBT_VERTEX); RenderBuffer->setHardwareMappingHint(scene::EHM_STATIC, scene::EBT_VERTEX);
RenderBuffer->setHardwareMappingHint(scene::EHM_DYNAMIC, scene::EBT_INDEX); RenderBuffer->setHardwareMappingHint(scene::EHM_DYNAMIC, scene::EBT_INDEX);
...@@ -66,6 +68,9 @@ namespace scene ...@@ -66,6 +68,9 @@ namespace scene
if (FileSystem) if (FileSystem)
FileSystem->drop(); FileSystem->drop();
if (Mesh)
Mesh->drop();
if (RenderBuffer) if (RenderBuffer)
RenderBuffer->drop(); RenderBuffer->drop();
} }
...@@ -78,7 +83,7 @@ namespace scene ...@@ -78,7 +83,7 @@ namespace scene
if (!file) if (!file)
return false; return false;
Mesh.MeshBuffers.clear(); Mesh->MeshBuffers.clear();
const u32 startTime = os::Timer::getRealTime(); const u32 startTime = os::Timer::getRealTime();
video::IImage* heightMap = SceneManager->getVideoDriver()->createImageFromFile(file); video::IImage* heightMap = SceneManager->getVideoDriver()->createImageFromFile(file);
...@@ -129,8 +134,6 @@ namespace scene ...@@ -129,8 +134,6 @@ namespace scene
// --- Generate vertex data from heightmap ---- // --- Generate vertex data from heightmap ----
// resize the vertex array for the mesh buffer one time (makes loading faster) // resize the vertex array for the mesh buffer one time (makes loading faster)
//SMeshBufferLightMap* mb = new SMeshBufferLightMap();
scene::CDynamicMeshBuffer *mb=0; scene::CDynamicMeshBuffer *mb=0;
const u32 numVertices = TerrainData.Size * TerrainData.Size; const u32 numVertices = TerrainData.Size * TerrainData.Size;
...@@ -187,7 +190,7 @@ namespace scene ...@@ -187,7 +190,7 @@ namespace scene
calculateNormals(mb); calculateNormals(mb);
// add the MeshBuffer to the mesh // add the MeshBuffer to the mesh
Mesh.addMeshBuffer(mb); Mesh->addMeshBuffer(mb);
// We copy the data to the renderBuffer, after the normals have been calculated. // We copy the data to the renderBuffer, after the normals have been calculated.
RenderBuffer->getVertexBuffer().set_used(numVertices); RenderBuffer->getVertexBuffer().set_used(numVertices);
...@@ -247,7 +250,7 @@ namespace scene ...@@ -247,7 +250,7 @@ namespace scene
// start reading // start reading
const u32 startTime = os::Timer::getTime(); const u32 startTime = os::Timer::getTime();
Mesh.MeshBuffers.clear(); Mesh->MeshBuffers.clear();
const s32 bytesPerPixel = bitsPerPixel / 8; const s32 bytesPerPixel = bitsPerPixel / 8;
...@@ -425,7 +428,7 @@ namespace scene ...@@ -425,7 +428,7 @@ namespace scene
calculateNormals(mb); calculateNormals(mb);
// add the MeshBuffer to the mesh // add the MeshBuffer to the mesh
Mesh.addMeshBuffer(mb); Mesh->addMeshBuffer(mb);
const u32 vertexCount = mb->getVertexCount(); const u32 vertexCount = mb->getVertexCount();
// We copy the data to the renderBuffer, after the normals have been calculated. // We copy the data to the renderBuffer, after the normals have been calculated.
...@@ -470,6 +473,24 @@ namespace scene ...@@ -470,6 +473,24 @@ namespace scene
} }
//! Returns the mesh
IMesh* CTerrainSceneNode::getMesh() { return Mesh; }
//! Returns the material based on the zero based index i.
video::SMaterial& CTerrainSceneNode::getMaterial(u32 i)
{
return Mesh->getMeshBuffer(i)->getMaterial();
}
//! Returns amount of materials used by this scene node ( always 1 )
u32 CTerrainSceneNode::getMaterialCount() const
{
return Mesh->getMeshBufferCount();
}
//! Sets the scale of the scene node. //! Sets the scale of the scene node.
//! \param scale: New scale of the node //! \param scale: New scale of the node
void CTerrainSceneNode::setScale(const core::vector3df& scale) void CTerrainSceneNode::setScale(const core::vector3df& scale)
...@@ -514,17 +535,17 @@ namespace scene ...@@ -514,17 +535,17 @@ namespace scene
//! Apply transformation changes(scale, position, rotation) //! Apply transformation changes(scale, position, rotation)
void CTerrainSceneNode::applyTransformation() void CTerrainSceneNode::applyTransformation()
{ {
if (!Mesh.getMeshBufferCount()) if (!Mesh->getMeshBufferCount())
return; return;
TerrainData.Position = TerrainData.Position; TerrainData.Position = TerrainData.Position;
s32 vtxCount = Mesh.getMeshBuffer(0)->getVertexCount(); s32 vtxCount = Mesh->getMeshBuffer(0)->getVertexCount();
core::matrix4 rotMatrix; core::matrix4 rotMatrix;
rotMatrix.setRotationDegrees(TerrainData.Rotation); rotMatrix.setRotationDegrees(TerrainData.Rotation);
for (s32 i = 0; i < vtxCount; ++i) for (s32 i = 0; i < vtxCount; ++i)
{ {
RenderBuffer->getVertexBuffer()[i].Pos = Mesh.getMeshBuffer(0)->getPosition(i) * TerrainData.Scale + TerrainData.Position; RenderBuffer->getVertexBuffer()[i].Pos = Mesh->getMeshBuffer(0)->getPosition(i) * TerrainData.Scale + TerrainData.Position;
RenderBuffer->getVertexBuffer()[i].Pos -= TerrainData.RotationPivot; RenderBuffer->getVertexBuffer()[i].Pos -= TerrainData.RotationPivot;
rotMatrix.inverseRotateVect(RenderBuffer->getVertexBuffer()[i].Pos); rotMatrix.inverseRotateVect(RenderBuffer->getVertexBuffer()[i].Pos);
...@@ -698,13 +719,13 @@ namespace scene ...@@ -698,13 +719,13 @@ namespace scene
if (!IsVisible || !SceneManager->getActiveCamera()) if (!IsVisible || !SceneManager->getActiveCamera())
return; return;
if (!Mesh.getMeshBufferCount()) if (!Mesh->getMeshBufferCount())
return; return;
video::IVideoDriver* driver = SceneManager->getVideoDriver(); video::IVideoDriver* driver = SceneManager->getVideoDriver();
driver->setTransform (video::ETS_WORLD, core::IdentityMatrix); driver->setTransform (video::ETS_WORLD, core::IdentityMatrix);
driver->setMaterial(Mesh.getMeshBuffer(0)->getMaterial()); driver->setMaterial(Mesh->getMeshBuffer(0)->getMaterial());
RenderBuffer->getIndexBuffer().set_used(IndicesToRender); RenderBuffer->getIndexBuffer().set_used(IndicesToRender);
...@@ -810,14 +831,14 @@ namespace scene ...@@ -810,14 +831,14 @@ namespace scene
//! \param LOD: The Level Of Detail you want the indices from. //! \param LOD: The Level Of Detail you want the indices from.
void CTerrainSceneNode::getMeshBufferForLOD(IDynamicMeshBuffer& mb, s32 LOD ) const void CTerrainSceneNode::getMeshBufferForLOD(IDynamicMeshBuffer& mb, s32 LOD ) const
{ {
if (!Mesh.getMeshBufferCount()) if (!Mesh->getMeshBufferCount())
return; return;
LOD = core::clamp(LOD, 0, TerrainData.MaxLOD - 1); LOD = core::clamp(LOD, 0, TerrainData.MaxLOD - 1);
const u32 numVertices = Mesh.getMeshBuffer(0)->getVertexCount(); const u32 numVertices = Mesh->getMeshBuffer(0)->getVertexCount();
mb.getVertexBuffer().reallocate(numVertices); mb.getVertexBuffer().reallocate(numVertices);
video::S3DVertex2TCoords* vertices = (video::S3DVertex2TCoords*)Mesh.getMeshBuffer(0)->getVertices(); video::S3DVertex2TCoords* vertices = (video::S3DVertex2TCoords*)Mesh->getMeshBuffer(0)->getVertices();
for (u32 n=0; n<numVertices; ++n) for (u32 n=0; n<numVertices; ++n)
mb.getVertexBuffer().push_back(vertices[n]); mb.getVertexBuffer().push_back(vertices[n]);
...@@ -1091,7 +1112,7 @@ namespace scene ...@@ -1091,7 +1112,7 @@ namespace scene
//! smooth the terrain //! smooth the terrain
void CTerrainSceneNode::smoothTerrain(CDynamicMeshBuffer* mb, s32 smoothFactor) void CTerrainSceneNode::smoothTerrain(IDynamicMeshBuffer* mb, s32 smoothFactor)
{ {
for (s32 run = 0; run < smoothFactor; ++run) for (s32 run = 0; run < smoothFactor; ++run)
{ {
...@@ -1113,7 +1134,7 @@ namespace scene ...@@ -1113,7 +1134,7 @@ namespace scene
//! calculate smooth normals //! calculate smooth normals
void CTerrainSceneNode::calculateNormals(CDynamicMeshBuffer* mb) void CTerrainSceneNode::calculateNormals(IDynamicMeshBuffer* mb)
{ {
s32 count; s32 count;
core::vector3df a, b, c, t; core::vector3df a, b, c, t;
...@@ -1353,7 +1374,7 @@ namespace scene ...@@ -1353,7 +1374,7 @@ namespace scene
//! Gets the height //! Gets the height
f32 CTerrainSceneNode::getHeight(f32 x, f32 z) const f32 CTerrainSceneNode::getHeight(f32 x, f32 z) const
{ {
if (!Mesh.getMeshBufferCount()) if (!Mesh->getMeshBufferCount())
return 0; return 0;
f32 height = -999999.9f; f32 height = -999999.9f;
...@@ -1371,7 +1392,7 @@ namespace scene ...@@ -1371,7 +1392,7 @@ namespace scene
if (X >= 0 && X < TerrainData.Size-1 && if (X >= 0 && X < TerrainData.Size-1 &&
Z >= 0 && Z < TerrainData.Size-1) Z >= 0 && Z < TerrainData.Size-1)
{ {
const video::S3DVertex2TCoords* Vertices = (const video::S3DVertex2TCoords*)Mesh.getMeshBuffer(0)->getVertices(); const video::S3DVertex2TCoords* Vertices = (const video::S3DVertex2TCoords*)Mesh->getMeshBuffer(0)->getVertices();
const core::vector3df& a = Vertices[X * TerrainData.Size + Z].Pos; const core::vector3df& a = Vertices[X * TerrainData.Size + Z].Pos;
const core::vector3df& b = Vertices[(X + 1) * TerrainData.Size + Z].Pos; const core::vector3df& b = Vertices[(X + 1) * TerrainData.Size + Z].Pos;
const core::vector3df& c = Vertices[X * TerrainData.Size + (Z + 1)].Pos; const core::vector3df& c = Vertices[X * TerrainData.Size + (Z + 1)].Pos;
...@@ -1478,18 +1499,18 @@ namespace scene ...@@ -1478,18 +1499,18 @@ namespace scene
// copy materials // copy materials
for (unsigned int m = 0; m<Mesh.getMeshBufferCount(); ++m) for (unsigned int m = 0; m<Mesh->getMeshBufferCount(); ++m)
{ {
if (nb->Mesh.getMeshBufferCount()>m && if (nb->Mesh->getMeshBufferCount()>m &&
nb->Mesh.getMeshBuffer(m) && nb->Mesh->getMeshBuffer(m) &&
Mesh.getMeshBuffer(m)) Mesh->getMeshBuffer(m))
{ {
nb->Mesh.getMeshBuffer(m)->getMaterial() = nb->Mesh->getMeshBuffer(m)->getMaterial() =
Mesh.getMeshBuffer(m)->getMaterial(); Mesh->getMeshBuffer(m)->getMaterial();
} }
} }
nb->RenderBuffer->Material = RenderBuffer->Material; nb->RenderBuffer->getMaterial() = RenderBuffer->getMaterial();
// finish // finish
......
...@@ -10,8 +10,7 @@ ...@@ -10,8 +10,7 @@
#define __C_TERRAIN_SCENE_NODE_H__ #define __C_TERRAIN_SCENE_NODE_H__
#include "ITerrainSceneNode.h" #include "ITerrainSceneNode.h"
#include "SMesh.h" #include "IDynamicMeshBuffer.h"
#include "CDynamicMeshBuffer.h"
#include "path.h" #include "path.h"
namespace irr namespace irr
...@@ -23,6 +22,7 @@ namespace io ...@@ -23,6 +22,7 @@ namespace io
} }
namespace scene namespace scene
{ {
struct SMesh;
class ITextSceneNode; class ITextSceneNode;
//! A scene node for displaying terrain using the geo mip map algorithm. //! A scene node for displaying terrain using the geo mip map algorithm.
...@@ -62,17 +62,11 @@ namespace scene ...@@ -62,17 +62,11 @@ namespace scene
//! 1 material. //! 1 material.
//! \param i: Zero based index i. UNUSED, left in for virtual purposes. //! \param i: Zero based index i. UNUSED, left in for virtual purposes.
//! \return Returns the single material this scene node uses. //! \return Returns the single material this scene node uses.
virtual video::SMaterial& getMaterial ( u32 i ) virtual video::SMaterial& getMaterial(u32 i);
{
return Mesh.getMeshBuffer(i)->getMaterial();
}
//! Returns amount of materials used by this scene node ( always 1 ) //! Returns amount of materials used by this scene node ( always 1 )
//! \return Returns current count of materials used by this scene node ( always 1 ) //! \return Returns current count of materials used by this scene node ( always 1 )
virtual u32 getMaterialCount() const virtual u32 getMaterialCount() const;
{
return Mesh.getMeshBufferCount();
}
//! Gets the last scaling factor applied to the scene node. This value only represents the //! Gets the last scaling factor applied to the scene node. This value only represents the
//! last scaling factor presented to the node. For instance, if you make create the node //! last scaling factor presented to the node. For instance, if you make create the node
...@@ -136,7 +130,7 @@ namespace scene ...@@ -136,7 +130,7 @@ namespace scene
virtual u32 getIndexCount() const { return IndicesToRender; } virtual u32 getIndexCount() const { return IndicesToRender; }
//! Returns the mesh //! Returns the mesh
virtual IMesh* getMesh() { return &Mesh; } virtual IMesh* getMesh();
//! Returns a pointer to the buffer used by the terrain (most users will not need this) //! Returns a pointer to the buffer used by the terrain (most users will not need this)
virtual IMeshBuffer* getRenderBuffer() { return RenderBuffer; } virtual IMeshBuffer* getRenderBuffer() { return RenderBuffer; }
...@@ -283,10 +277,10 @@ namespace scene ...@@ -283,10 +277,10 @@ namespace scene
u32 getIndex(const s32 PatchX, const s32 PatchZ, const s32 PatchIndex, u32 vX, u32 vZ) const; u32 getIndex(const s32 PatchX, const s32 PatchZ, const s32 PatchIndex, u32 vX, u32 vZ) const;
//! smooth the terrain //! smooth the terrain
void smoothTerrain(CDynamicMeshBuffer* mb, s32 smoothFactor); void smoothTerrain(IDynamicMeshBuffer* mb, s32 smoothFactor);
//! calculate smooth normals //! calculate smooth normals
void calculateNormals(CDynamicMeshBuffer* mb); void calculateNormals(IDynamicMeshBuffer* mb);
//! create patches, stuff that needs to only be done once for patches goes here. //! create patches, stuff that needs to only be done once for patches goes here.
void createPatches(); void createPatches();
...@@ -307,9 +301,9 @@ namespace scene ...@@ -307,9 +301,9 @@ namespace scene
void applyTransformation(); void applyTransformation();
STerrainData TerrainData; STerrainData TerrainData;
SMesh Mesh; SMesh* Mesh;
CDynamicMeshBuffer *RenderBuffer; IDynamicMeshBuffer *RenderBuffer;
u32 VerticesToRender; u32 VerticesToRender;
u32 IndicesToRender; u32 IndicesToRender;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment