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 @@
#include "IVideoDriver.h"
#include "ISceneManager.h"
#include "ICameraSceneNode.h"
#include "SMeshBufferLightMap.h"
#include "SViewFrustum.h"
#include "irrMath.h"
#include "os.h"
......@@ -21,6 +20,8 @@
#include "IReadFile.h"
#include "ITextSceneNode.h"
#include "IAnimatedMesh.h"
#include "SMesh.h"
#include "CDynamicMeshBuffer.h"
namespace irr
{
......@@ -47,6 +48,7 @@ namespace scene
setDebugName("CTerrainSceneNode");
#endif
Mesh = new SMesh();
RenderBuffer = new CDynamicMeshBuffer(video::EVT_2TCOORDS, video::EIT_16BIT);
RenderBuffer->setHardwareMappingHint(scene::EHM_STATIC, scene::EBT_VERTEX);
RenderBuffer->setHardwareMappingHint(scene::EHM_DYNAMIC, scene::EBT_INDEX);
......@@ -66,6 +68,9 @@ namespace scene
if (FileSystem)
FileSystem->drop();
if (Mesh)
Mesh->drop();
if (RenderBuffer)
RenderBuffer->drop();
}
......@@ -78,7 +83,7 @@ namespace scene
if (!file)
return false;
Mesh.MeshBuffers.clear();
Mesh->MeshBuffers.clear();
const u32 startTime = os::Timer::getRealTime();
video::IImage* heightMap = SceneManager->getVideoDriver()->createImageFromFile(file);
......@@ -129,8 +134,6 @@ namespace scene
// --- Generate vertex data from heightmap ----
// resize the vertex array for the mesh buffer one time (makes loading faster)
//SMeshBufferLightMap* mb = new SMeshBufferLightMap();
scene::CDynamicMeshBuffer *mb=0;
const u32 numVertices = TerrainData.Size * TerrainData.Size;
......@@ -187,7 +190,7 @@ namespace scene
calculateNormals(mb);
// 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.
RenderBuffer->getVertexBuffer().set_used(numVertices);
......@@ -247,7 +250,7 @@ namespace scene
// start reading
const u32 startTime = os::Timer::getTime();
Mesh.MeshBuffers.clear();
Mesh->MeshBuffers.clear();
const s32 bytesPerPixel = bitsPerPixel / 8;
......@@ -425,7 +428,7 @@ namespace scene
calculateNormals(mb);
// add the MeshBuffer to the mesh
Mesh.addMeshBuffer(mb);
Mesh->addMeshBuffer(mb);
const u32 vertexCount = mb->getVertexCount();
// We copy the data to the renderBuffer, after the normals have been calculated.
......@@ -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.
//! \param scale: New scale of the node
void CTerrainSceneNode::setScale(const core::vector3df& scale)
......@@ -514,17 +535,17 @@ namespace scene
//! Apply transformation changes(scale, position, rotation)
void CTerrainSceneNode::applyTransformation()
{
if (!Mesh.getMeshBufferCount())
if (!Mesh->getMeshBufferCount())
return;
TerrainData.Position = TerrainData.Position;
s32 vtxCount = Mesh.getMeshBuffer(0)->getVertexCount();
s32 vtxCount = Mesh->getMeshBuffer(0)->getVertexCount();
core::matrix4 rotMatrix;
rotMatrix.setRotationDegrees(TerrainData.Rotation);
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;
rotMatrix.inverseRotateVect(RenderBuffer->getVertexBuffer()[i].Pos);
......@@ -698,13 +719,13 @@ namespace scene
if (!IsVisible || !SceneManager->getActiveCamera())
return;
if (!Mesh.getMeshBufferCount())
if (!Mesh->getMeshBufferCount())
return;
video::IVideoDriver* driver = SceneManager->getVideoDriver();
driver->setTransform (video::ETS_WORLD, core::IdentityMatrix);
driver->setMaterial(Mesh.getMeshBuffer(0)->getMaterial());
driver->setMaterial(Mesh->getMeshBuffer(0)->getMaterial());
RenderBuffer->getIndexBuffer().set_used(IndicesToRender);
......@@ -810,14 +831,14 @@ namespace scene
//! \param LOD: The Level Of Detail you want the indices from.
void CTerrainSceneNode::getMeshBufferForLOD(IDynamicMeshBuffer& mb, s32 LOD ) const
{
if (!Mesh.getMeshBufferCount())
if (!Mesh->getMeshBufferCount())
return;
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);
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)
mb.getVertexBuffer().push_back(vertices[n]);
......@@ -1091,7 +1112,7 @@ namespace scene
//! smooth the terrain
void CTerrainSceneNode::smoothTerrain(CDynamicMeshBuffer* mb, s32 smoothFactor)
void CTerrainSceneNode::smoothTerrain(IDynamicMeshBuffer* mb, s32 smoothFactor)
{
for (s32 run = 0; run < smoothFactor; ++run)
{
......@@ -1113,7 +1134,7 @@ namespace scene
//! calculate smooth normals
void CTerrainSceneNode::calculateNormals(CDynamicMeshBuffer* mb)
void CTerrainSceneNode::calculateNormals(IDynamicMeshBuffer* mb)
{
s32 count;
core::vector3df a, b, c, t;
......@@ -1353,7 +1374,7 @@ namespace scene
//! Gets the height
f32 CTerrainSceneNode::getHeight(f32 x, f32 z) const
{
if (!Mesh.getMeshBufferCount())
if (!Mesh->getMeshBufferCount())
return 0;
f32 height = -999999.9f;
......@@ -1371,7 +1392,7 @@ namespace scene
if (X >= 0 && X < 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& b = Vertices[(X + 1) * TerrainData.Size + Z].Pos;
const core::vector3df& c = Vertices[X * TerrainData.Size + (Z + 1)].Pos;
......@@ -1478,18 +1499,18 @@ namespace scene
// 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 &&
nb->Mesh.getMeshBuffer(m) &&
Mesh.getMeshBuffer(m))
if (nb->Mesh->getMeshBufferCount()>m &&
nb->Mesh->getMeshBuffer(m) &&
Mesh->getMeshBuffer(m))
{
nb->Mesh.getMeshBuffer(m)->getMaterial() =
Mesh.getMeshBuffer(m)->getMaterial();
nb->Mesh->getMeshBuffer(m)->getMaterial() =
Mesh->getMeshBuffer(m)->getMaterial();
}
}
nb->RenderBuffer->Material = RenderBuffer->Material;
nb->RenderBuffer->getMaterial() = RenderBuffer->getMaterial();
// finish
......
......@@ -10,8 +10,7 @@
#define __C_TERRAIN_SCENE_NODE_H__
#include "ITerrainSceneNode.h"
#include "SMesh.h"
#include "CDynamicMeshBuffer.h"
#include "IDynamicMeshBuffer.h"
#include "path.h"
namespace irr
......@@ -23,6 +22,7 @@ namespace io
}
namespace scene
{
struct SMesh;
class ITextSceneNode;
//! A scene node for displaying terrain using the geo mip map algorithm.
......@@ -62,17 +62,11 @@ namespace scene
//! 1 material.
//! \param i: Zero based index i. UNUSED, left in for virtual purposes.
//! \return Returns the single material this scene node uses.
virtual video::SMaterial& getMaterial ( u32 i )
{
return Mesh.getMeshBuffer(i)->getMaterial();
}
virtual video::SMaterial& getMaterial(u32 i);
//! Returns amount 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
{
return Mesh.getMeshBufferCount();
}
virtual u32 getMaterialCount() const;
//! 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
......@@ -136,7 +130,7 @@ namespace scene
virtual u32 getIndexCount() const { return IndicesToRender; }
//! 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)
virtual IMeshBuffer* getRenderBuffer() { return RenderBuffer; }
......@@ -283,10 +277,10 @@ namespace scene
u32 getIndex(const s32 PatchX, const s32 PatchZ, const s32 PatchIndex, u32 vX, u32 vZ) const;
//! smooth the terrain
void smoothTerrain(CDynamicMeshBuffer* mb, s32 smoothFactor);
void smoothTerrain(IDynamicMeshBuffer* mb, s32 smoothFactor);
//! 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.
void createPatches();
......@@ -307,9 +301,9 @@ namespace scene
void applyTransformation();
STerrainData TerrainData;
SMesh Mesh;
SMesh* Mesh;
CDynamicMeshBuffer *RenderBuffer;
IDynamicMeshBuffer *RenderBuffer;
u32 VerticesToRender;
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