-added support for 32bit buffers in the opengl and directx9 drivers :) hopefully not buggy...

(may need to add support for directx8 and software?)

-made terrainNode use DynamicMeshBuffer, so it can use 32bit buffers. (no more size limits now on terrains!!! )
if the terrainNode loads an image over 256x256, it is set to 32bit, smaller sizes will use 16bit for better speed.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1515 dfc29bdd-3216-0410-991c-e03cc46cb475
master
lukeph 2008-08-28 04:00:22 +00:00
parent 320c8b91cb
commit 341dc16566
26 changed files with 532 additions and 240 deletions

View File

@ -18,6 +18,8 @@ namespace scene
class IIndexList
{
public:
virtual ~IIndexList(){};
virtual u32 stride() const =0;
virtual u32 size() const =0;
virtual void push_back(const u32 &element) =0;
@ -28,7 +30,7 @@ namespace scene
virtual void reallocate(u32 new_size) =0;
virtual u32 allocated_size() const =0;
virtual void* pointer() =0;
virtual video::E_INDEX_TYPE getType() =0;
virtual video::E_INDEX_TYPE getType() const =0;
};
template <class T>
@ -75,7 +77,7 @@ namespace scene
virtual void* pointer() {return Indices.pointer();}
virtual video::E_INDEX_TYPE getType()
virtual video::E_INDEX_TYPE getType() const
{
if (sizeof(T)==sizeof(u16))
return video::EIT_16BIT;
@ -91,6 +93,15 @@ namespace scene
setType(IndexType);
}
CIndexBuffer(const IIndexBuffer &IndexBufferCopy) :Indices(0), MappingHint(EHM_NEVER), ChangedID(1)
{
setType(IndexBufferCopy.getType());
reallocate(IndexBufferCopy.size());
for (u32 n=0;n<IndexBufferCopy.size();++n)
push_back(IndexBufferCopy[n]);
}
virtual ~CIndexBuffer()
{
delete Indices;
@ -130,7 +141,7 @@ namespace scene
virtual void* getData() {return Indices->pointer();}
virtual video::E_INDEX_TYPE getType(){return Indices->getType();}
virtual video::E_INDEX_TYPE getType() const {return Indices->getType();}
virtual u32 stride() const {return Indices->stride();}

View File

@ -18,7 +18,7 @@ namespace scene
{
public:
//! Default constructor for empty meshbuffer
CMeshBuffer() : ChangedID_Vertex(1), ChangedID_Index(1), MappingHint(EHM_NEVER)
CMeshBuffer():ChangedID_Vertex(1),ChangedID_Index(1),MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER)
{
#ifdef _DEBUG
setDebugName("SMeshBuffer");
@ -65,6 +65,12 @@ namespace scene
return Vertices.size();
}
//! Get type of index data which is stored in this meshbuffer.
/** \return Index type of this buffer. */
virtual video::E_INDEX_TYPE getIndexType() const
{
return video::EIT_16BIT;
}
//! Get pointer to indices
/** \return Pointer to indices. */
@ -202,6 +208,7 @@ namespace scene
*/
virtual void append(const IMeshBuffer* const other)
{
/*
if (this==other)
return;
@ -220,20 +227,32 @@ namespace scene
Indices.push_back(other->getIndices()[i]+vertexCount);
}
BoundingBox.addInternalBox(other->getBoundingBox());
*/
}
//! get the current hardware mapping hint
virtual const E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const
{
return MappingHint_Vertex;
}
//! get the current hardware mapping hint
virtual const E_HARDWARE_MAPPING getHardwareMappingHint() const
virtual const E_HARDWARE_MAPPING getHardwareMappingHint_Index() const
{
return MappingHint;
return MappingHint_Index;
}
//! set the hardware mapping hint, for driver
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint )
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX )
{
MappingHint=NewMappingHint;
if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_VERTEX)
MappingHint_Vertex=NewMappingHint;
if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
MappingHint_Index=NewMappingHint;
}
//! flags the mesh as changed, reloads hardware buffers
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX)
{
@ -255,7 +274,8 @@ namespace scene
u32 ChangedID_Index;
//! hardware mapping hint
E_HARDWARE_MAPPING MappingHint;
E_HARDWARE_MAPPING MappingHint_Vertex;
E_HARDWARE_MAPPING MappingHint_Index;
//! Material for this meshbuffer.
video::SMaterial Material;
@ -278,3 +298,4 @@ namespace scene
#endif

View File

@ -7,6 +7,7 @@
#include "IVertexBuffer.h"
namespace irr
{
namespace scene
@ -17,6 +18,8 @@ namespace scene
class IVertexList
{
public:
virtual ~IVertexList(){};
virtual u32 stride() const =0;
virtual u32 size() const =0;
@ -28,7 +31,7 @@ namespace scene
virtual void reallocate(u32 new_size) =0;
virtual u32 allocated_size() const =0;
virtual video::S3DVertex* pointer() =0;
virtual video::E_VERTEX_TYPE getType() =0;
virtual video::E_VERTEX_TYPE getType() const =0;
};
template <class T>
@ -63,7 +66,7 @@ namespace scene
virtual video::S3DVertex* pointer() {return Vertices.pointer();}
virtual video::E_VERTEX_TYPE getType(){return T().getType();}
virtual video::E_VERTEX_TYPE getType() const {return T().getType();}
};
public:
@ -74,6 +77,15 @@ namespace scene
setType(vertexType);
}
CVertexBuffer(const IVertexBuffer &VertexBufferCopy) :Vertices(0), MappingHint(EHM_NEVER), ChangedID(1)
{
setType(VertexBufferCopy.getType());
reallocate(VertexBufferCopy.size());
for (u32 n=0;n<VertexBufferCopy.size();++n)
push_back(VertexBufferCopy[n]);
}
virtual ~CVertexBuffer()
{
delete Vertices;
@ -118,7 +130,7 @@ namespace scene
virtual void* getData() {return Vertices->pointer();}
virtual video::E_VERTEX_TYPE getType(){return Vertices->getType();}
virtual video::E_VERTEX_TYPE getType() const {return Vertices->getType();}
virtual u32 stride() const {return Vertices->stride();}

View File

@ -177,6 +177,18 @@ namespace scene
return getVertexBuffer()[i].Pos;
}
//! returns texture coords of vertex i
virtual const core::vector2df& getTCoords(u32 i) const
{
return getVertexBuffer()[i].TCoords;
}
//! returns texture coords of vertex i
virtual core::vector2df& getTCoords(u32 i)
{
return getVertexBuffer()[i].TCoords;
}
//! returns normal of vertex i
virtual const core::vector3df& getNormal(u32 i) const
{
@ -196,3 +208,4 @@ namespace scene
#endif

View File

@ -27,7 +27,7 @@ namespace scene
virtual void* getData() =0;
virtual video::E_INDEX_TYPE getType() =0;
virtual video::E_INDEX_TYPE getType() const =0;
virtual void setType(video::E_INDEX_TYPE IndexType) =0;
virtual u32 stride() const =0;

View File

@ -9,6 +9,7 @@
#include "SMaterial.h"
#include "aabbox3d.h"
#include "S3DVertex.h"
#include "SVertexIndex.h"
#include "EHardwareBufferFlags.h"
namespace irr
@ -102,6 +103,10 @@ namespace scene
/** \return Number of vertices in this buffer. */
virtual u32 getVertexCount() const = 0;
//! Get type of index data which is stored in this meshbuffer.
/** \return Index type of this buffer. */
virtual video::E_INDEX_TYPE getIndexType() const =0;
//! Get access to Indices.
/** \return Pointer to indices array. */
virtual const u16* getIndices() const = 0;
@ -158,10 +163,13 @@ namespace scene
virtual void append(const IMeshBuffer* const other) = 0;
//! get the current hardware mapping hint
virtual const E_HARDWARE_MAPPING getHardwareMappingHint() const = 0;
virtual const E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const = 0;
//! get the current hardware mapping hint
virtual const E_HARDWARE_MAPPING getHardwareMappingHint_Index() const = 0;
//! set the hardware mapping hint, for driver
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) = 0;
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX ) = 0;
//! flags the meshbuffer as changed, reloads hardware buffers
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) = 0;
@ -174,8 +182,6 @@ namespace scene
//! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */
virtual const u32 getChangedID_Index() const = 0;
u32 HardwareHint;
};
} // end namespace scene
@ -183,3 +189,4 @@ namespace scene
#endif

View File

@ -12,7 +12,7 @@
#include "ETerrainElements.h"
#include "ISceneNode.h"
#include "SMeshBufferLightMap.h"
#include "IDynamicMeshBuffer.h"
#include "irrArray.h"
namespace irr
@ -84,7 +84,7 @@ namespace scene
//! Gets the meshbuffer data based on a specified level of detail.
/** \param mb A reference to an SMeshBuffer object
\param LOD The level of detail you want the indices from. */
virtual void getMeshBufferForLOD(SMeshBufferLightMap& mb, s32 LOD) const = 0;
virtual void getMeshBufferForLOD(IDynamicMeshBuffer& mb, s32 LOD) const = 0;
//! Gets the indices for a specified patch at a specified Level of Detail.
/** \param indices A reference to an array of u32 indices.

View File

@ -18,7 +18,7 @@ namespace scene
{
public:
virtual void* getData() =0;
virtual video::E_VERTEX_TYPE getType() =0;
virtual video::E_VERTEX_TYPE getType() const =0;
virtual void setType(video::E_VERTEX_TYPE vertexType) =0;
virtual u32 stride() const =0;
virtual u32 size() const =0;

View File

@ -326,8 +326,8 @@ namespace video
\param vType Vertex type, e.g. EVT_STANDARD for S3DVertex.
\param pType Primitive type, e.g. EPT_TRIANGLE_FAN for a triangle fan. */
virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType) = 0;
const void* indexList, u32 primCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType) = 0;
//! Draws an indexed triangle list.
/** Note that there may be at maximum 65536 vertices, because
@ -634,7 +634,7 @@ namespace video
available with D3D and vertex fog. */
virtual void setFog(SColor color=SColor(0,255,255,255),
bool linearFog=true, f32 start=50.0f, f32 end=100.0f,
f32 density=0.01f,
f32 density=0.01f,
bool pixelFog=false, bool rangeFog=false) = 0;
//! Get the current color format of the color buffer
@ -966,3 +966,4 @@ namespace video
#endif

View File

@ -795,8 +795,8 @@ const core::rect<s32>& CD3D8Driver::getViewPort() const
//! draws a vertex primitive list
void CD3D8Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType)
const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType)
{
if (!checkPrimitiveCount(primitiveCount))
return;

View File

@ -67,8 +67,8 @@ namespace video
//! draws a vertex primitive list
void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType);
const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType);
//! draws an 2d image, using a color (if color is other then Color(255,255,255,255)) and the alpha channel of the texture if wanted.
virtual void draw2DImage(const video::ITexture* texture, const core::position2d<s32>& destPos,

View File

@ -859,7 +859,7 @@ bool CD3D9Driver::updateVertexHardwareBuffer(SHWBufferLink_d3d9 *HWBuffer)
}
flags = D3DUSAGE_WRITEONLY; // SIO2: Default to D3DUSAGE_WRITEONLY
if(HWBuffer->Mapped != scene::EHM_STATIC)
if(HWBuffer->Mapped_Vertex != scene::EHM_STATIC)
flags |= D3DUSAGE_DYNAMIC;
pID3DDevice->CreateVertexBuffer(vertexCount * vertexSize, flags, FVF, D3DPOOL_DEFAULT, &HWBuffer->vertexBuffer, NULL);
@ -868,7 +868,7 @@ bool CD3D9Driver::updateVertexHardwareBuffer(SHWBufferLink_d3d9 *HWBuffer)
return false;
flags = 0; // SIO2: Reset flags before Lock
if(HWBuffer->Mapped != scene::EHM_STATIC)
if(HWBuffer->Mapped_Vertex != scene::EHM_STATIC)
flags = D3DLOCK_DISCARD;
HWBuffer->vertexBuffer->Lock(0, vertexCount * vertexSize, (void**)&pLockedBuffer, flags);
@ -896,24 +896,42 @@ bool CD3D9Driver::updateIndexHardwareBuffer(SHWBufferLink_d3d9 *HWBuffer)
const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer;
const u16* indices=mb->getIndices();
const u32 indexCount=mb->getIndexCount();
const u32 indexSize = 2;
u32 indexSize = 2;
D3DFORMAT indexType=D3DFMT_UNKNOWN;
switch (mb->getIndexType())
{
case (EIT_16BIT):
{
indexType=D3DFMT_INDEX16;
indexSize = 2;
break;
}
case (EIT_32BIT):
{
indexType=D3DFMT_INDEX32;
indexSize = 4;
break;
}
}
if (!HWBuffer->indexBuffer || indexSize * indexCount > HWBuffer->indexBufferSize)
{
D3DFORMAT idxFormat = D3DFMT_INDEX16;
DWORD flags = 0;
flags = D3DUSAGE_WRITEONLY; // SIO2: Default to D3DUSAGE_WRITEONLY
if(HWBuffer->Mapped != scene::EHM_STATIC)
if(HWBuffer->Mapped_Index != scene::EHM_STATIC)
flags |= D3DUSAGE_DYNAMIC; // SIO2: Add DYNAMIC flag for dynamic buffer data
if(FAILED(pID3DDevice->CreateIndexBuffer( indexCount * indexSize, flags, idxFormat, D3DPOOL_DEFAULT, &HWBuffer->indexBuffer, NULL)))
if(FAILED(pID3DDevice->CreateIndexBuffer( indexCount * indexSize, flags, indexType, D3DPOOL_DEFAULT, &HWBuffer->indexBuffer, NULL)))
return false;
void* pIndices = 0;
flags = 0; // SIO2: Reset flags before Lock
if(HWBuffer->Mapped != scene::EHM_STATIC)
if(HWBuffer->Mapped_Index != scene::EHM_STATIC)
flags = D3DLOCK_DISCARD;
if(FAILED(HWBuffer->indexBuffer->Lock( 0, 0, (void**)&pIndices, flags)))
@ -944,30 +962,33 @@ bool CD3D9Driver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
if (!HWBuffer)
return false;
if (HWBuffer->ChangedID_Vertex != HWBuffer->MeshBuffer->getChangedID_Vertex()
|| !((SHWBufferLink_d3d9*)HWBuffer)->vertexBuffer)
if (HWBuffer->Mapped_Vertex!=scene::EHM_NEVER)
{
if (HWBuffer->ChangedID_Vertex != HWBuffer->MeshBuffer->getChangedID_Vertex()
|| !((SHWBufferLink_d3d9*)HWBuffer)->vertexBuffer)
{
HWBuffer->ChangedID_Vertex = HWBuffer->MeshBuffer->getChangedID_Vertex();
HWBuffer->ChangedID_Vertex = HWBuffer->MeshBuffer->getChangedID_Vertex();
if (!updateVertexHardwareBuffer((SHWBufferLink_d3d9*)HWBuffer))
return false;
if (!updateVertexHardwareBuffer((SHWBufferLink_d3d9*)HWBuffer))
return false;
}
}
if (HWBuffer->ChangedID_Index != HWBuffer->MeshBuffer->getChangedID_Index()
|| !((SHWBufferLink_d3d9*)HWBuffer)->indexBuffer)
if (HWBuffer->Mapped_Index!=scene::EHM_NEVER)
{
if (HWBuffer->ChangedID_Index != HWBuffer->MeshBuffer->getChangedID_Index()
|| !((SHWBufferLink_d3d9*)HWBuffer)->indexBuffer)
{
HWBuffer->ChangedID_Index = HWBuffer->MeshBuffer->getChangedID_Index();
HWBuffer->ChangedID_Index = HWBuffer->MeshBuffer->getChangedID_Index();
if (!updateIndexHardwareBuffer((SHWBufferLink_d3d9*)HWBuffer))
return false;
if (!updateIndexHardwareBuffer((SHWBufferLink_d3d9*)HWBuffer))
return false;
}
}
return true;
}
@ -975,7 +996,7 @@ bool CD3D9Driver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
//! Create hardware buffer from meshbuffer
CD3D9Driver::SHWBufferLink *CD3D9Driver::createHardwareBuffer(const scene::IMeshBuffer* mb)
{
if (!mb || (mb->getHardwareMappingHint()==scene::EHM_NEVER))
if (!mb || (mb->getHardwareMappingHint_Index()==scene::EHM_NEVER && mb->getHardwareMappingHint_Vertex()==scene::EHM_NEVER))
return 0;
SHWBufferLink_d3d9 *HWBuffer=new SHWBufferLink_d3d9(mb);
@ -985,7 +1006,8 @@ CD3D9Driver::SHWBufferLink *CD3D9Driver::createHardwareBuffer(const scene::IMesh
HWBuffer->ChangedID_Vertex=HWBuffer->MeshBuffer->getChangedID_Vertex();
HWBuffer->ChangedID_Index=HWBuffer->MeshBuffer->getChangedID_Index();
HWBuffer->Mapped=mb->getHardwareMappingHint();
HWBuffer->Mapped_Vertex=mb->getHardwareMappingHint_Vertex();
HWBuffer->Mapped_Index=mb->getHardwareMappingHint_Index();
HWBuffer->LastUsed=0;
HWBuffer->vertexBuffer=0;
HWBuffer->indexBuffer=0;
@ -1041,7 +1063,7 @@ void CD3D9Driver::drawHardwareBuffer(SHWBufferLink *_HWBuffer)
if (HWBuffer->vertexBuffer) pID3DDevice->SetStreamSource(0, HWBuffer->vertexBuffer, 0, stride);
if (HWBuffer->indexBuffer) pID3DDevice->SetIndices(HWBuffer->indexBuffer);
drawVertexPrimitiveList(0, mb->getVertexCount(), 0, mb->getIndexCount()/3, mb->getVertexType(), scene::EPT_TRIANGLES);
drawVertexPrimitiveList(0, mb->getVertexCount(), 0, mb->getIndexCount()/3, mb->getVertexType(), scene::EPT_TRIANGLES, mb->getIndexType());
if (HWBuffer->vertexBuffer) pID3DDevice->SetStreamSource(0, 0, 0, 0);
if (HWBuffer->indexBuffer) pID3DDevice->SetIndices(0);
@ -1049,13 +1071,13 @@ void CD3D9Driver::drawHardwareBuffer(SHWBufferLink *_HWBuffer)
//! draws a vertex primitive list
void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType)
const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType)
{
if (!checkPrimitiveCount(primitiveCount))
return;
CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType);
CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType,iType);
if (!vertexCount || !primitiveCount)
return;
@ -1064,6 +1086,25 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u32 stride = getVertexPitchFromType(vType);
D3DFORMAT indexType=D3DFMT_UNKNOWN;
switch (iType)
{
case (EIT_16BIT):
{
indexType=D3DFMT_INDEX16;
break;
}
case (EIT_32BIT):
{
indexType=D3DFMT_INDEX32;
break;
}
}
if (setRenderStates3DMode())
{
switch (pType)
@ -1089,7 +1130,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
else
{
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_POINTLIST, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride);
primitiveCount, indexList, indexType, vertices, stride);
}
pID3DDevice->SetRenderState(D3DRS_POINTSCALEENABLE, FALSE);
@ -1105,7 +1146,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
else
{
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINESTRIP, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride);
primitiveCount, indexList, indexType, vertices, stride);
}
break;
case scene::EPT_LINE_LOOP:
@ -1121,12 +1162,12 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
else
{
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINESTRIP, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride);
primitiveCount, indexList, indexType, vertices, stride);
u16 tmpIndices[] = {0, primitiveCount};
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINELIST, 0, vertexCount,
1, tmpIndices, D3DFMT_INDEX16, vertices, stride);
1, tmpIndices, indexType, vertices, stride);
}
break;
case scene::EPT_LINES:
@ -1137,7 +1178,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
else
{
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINELIST, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride);
primitiveCount, indexList, indexType, vertices, stride);
}
break;
case scene::EPT_TRIANGLE_STRIP:
@ -1148,7 +1189,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
else
{
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLESTRIP, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride);
primitiveCount, indexList, indexType, vertices, stride);
}
break;
case scene::EPT_TRIANGLE_FAN:
@ -1159,7 +1200,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
else
{
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLEFAN, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride);
primitiveCount, indexList, indexType, vertices, stride);
}
break;
case scene::EPT_TRIANGLES:
@ -1170,7 +1211,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
else
{
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride);
primitiveCount, indexList, indexType, vertices, stride);
}
break;
}

View File

@ -87,8 +87,8 @@ namespace video
//! draws a vertex primitive list
virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType);
const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType);
//! draws an 2d image, using a color (if color is other then Color(255,255,255,255)) and the alpha channel of the texture if wanted.
virtual void draw2DImage(const video::ITexture* texture, const core::position2d<s32>& destPos,

View File

@ -104,7 +104,7 @@ void CGUIMeshViewer::draw()
viewPort.clipAgainst(AbsoluteClippingRect);
// draw the frame
core::rect<s32> frameRect(AbsoluteRect);
frameRect.LowerRightCorner.Y = frameRect.UpperLeftCorner.Y + 1;
skin->draw2DRectangle(this, skin->getColor(EGDC_3D_SHADOW), frameRect, &AbsoluteClippingRect);
@ -157,7 +157,7 @@ void CGUIMeshViewer::draw()
driver->drawVertexPrimitiveList(mb->getVertices(),
mb->getVertexCount(), mb->getIndices(),
mb->getIndexCount()/ 3, mb->getVertexType(),
scene::EPT_TRIANGLES);
scene::EPT_TRIANGLES, mb->getIndexType());
}
driver->setViewPort(oldViewPort);
@ -172,3 +172,4 @@ void CGUIMeshViewer::draw()
#endif // _IRR_COMPILE_WITH_GUI_

View File

@ -502,7 +502,7 @@ const core::rect<s32>& CNullDriver::getViewPort() const
//! draws a vertex primitive list
void CNullDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, const u16* indexList, u32 primitiveCount, E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType)
void CNullDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, const void* indexList, u32 primitiveCount, E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType)
{
PrimitivesDrawn += primitiveCount;
}
@ -512,7 +512,7 @@ void CNullDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
//! draws an indexed triangle list
inline void CNullDriver::drawIndexedTriangleList(const S3DVertex* vertices, u32 vertexCount, const u16* indexList, u32 triangleCount)
{
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_STANDARD, scene::EPT_TRIANGLES);
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_STANDARD, scene::EPT_TRIANGLES, EIT_16BIT);
}
@ -520,7 +520,7 @@ inline void CNullDriver::drawIndexedTriangleList(const S3DVertex* vertices, u32
//! draws an indexed triangle list
inline void CNullDriver::drawIndexedTriangleList(const S3DVertex2TCoords* vertices, u32 vertexCount, const u16* indexList, u32 triangleCount)
{
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_2TCOORDS, scene::EPT_TRIANGLES);
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_2TCOORDS, scene::EPT_TRIANGLES, EIT_16BIT);
}
@ -528,7 +528,7 @@ inline void CNullDriver::drawIndexedTriangleList(const S3DVertex2TCoords* vertic
inline void CNullDriver::drawIndexedTriangleList(const S3DVertexTangents* vertices,
u32 vertexCount, const u16* indexList, u32 triangleCount)
{
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_TANGENTS, scene::EPT_TRIANGLES);
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_TANGENTS, scene::EPT_TRIANGLES, EIT_16BIT);
}
@ -537,7 +537,7 @@ inline void CNullDriver::drawIndexedTriangleList(const S3DVertexTangents* vertic
inline void CNullDriver::drawIndexedTriangleFan(const S3DVertex* vertices,
u32 vertexCount, const u16* indexList, u32 triangleCount)
{
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_STANDARD, scene::EPT_TRIANGLE_FAN);
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_STANDARD, scene::EPT_TRIANGLE_FAN, EIT_16BIT);
}
@ -546,7 +546,7 @@ inline void CNullDriver::drawIndexedTriangleFan(const S3DVertex* vertices,
inline void CNullDriver::drawIndexedTriangleFan(const S3DVertex2TCoords* vertices,
u32 vertexCount, const u16* indexList, u32 triangleCount)
{
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_2TCOORDS, scene::EPT_TRIANGLE_FAN);
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_2TCOORDS, scene::EPT_TRIANGLE_FAN, EIT_16BIT);
}
@ -555,7 +555,7 @@ inline void CNullDriver::drawIndexedTriangleFan(const S3DVertex2TCoords* vertice
inline void CNullDriver::drawIndexedTriangleFan(const S3DVertexTangents* vertices,
u32 vertexCount, const u16* indexList, u32 triangleCount)
{
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_TANGENTS, scene::EPT_TRIANGLE_FAN);
drawVertexPrimitiveList(vertices, vertexCount, indexList, triangleCount, EVT_TANGENTS, scene::EPT_TRIANGLE_FAN, EIT_16BIT);
}
@ -1278,7 +1278,7 @@ void CNullDriver::drawMeshBuffer(const scene::IMeshBuffer* mb)
if (HWBuffer)
drawHardwareBuffer(HWBuffer);
else
drawVertexPrimitiveList(mb->getVertices(), mb->getVertexCount(), mb->getIndices(), mb->getIndexCount()/3, mb->getVertexType(), scene::EPT_TRIANGLES);
drawVertexPrimitiveList(mb->getVertices(), mb->getVertexCount(), mb->getIndices(), mb->getIndexCount()/3, mb->getVertexType(), scene::EPT_TRIANGLES, mb->getIndexType());
}
CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer* mb)
@ -1337,7 +1337,7 @@ void CNullDriver::removeAllHardwareBuffers()
bool CNullDriver::isHardwareBufferRecommend(const scene::IMeshBuffer* mb)
{
if (!mb || mb->getHardwareMappingHint()==scene::EHM_NEVER)
if (!mb || (mb->getHardwareMappingHint_Index()==scene::EHM_NEVER && mb->getHardwareMappingHint_Vertex()==scene::EHM_NEVER))
return false;
if (mb->getVertexCount()<500) //todo: tweak and make user definable
@ -1874,3 +1874,4 @@ void CNullDriver::enableClipPlane(u32 index, bool enable)
} // end namespace
} // end namespace

View File

@ -16,6 +16,7 @@
#include "IMeshBuffer.h"
#include "CFPSCounter.h"
#include "S3DVertex.h"
#include "SVertexIndex.h"
#include "SLight.h"
#include "SExposedVideoData.h"
@ -86,8 +87,8 @@ namespace video
//! draws a vertex primitive list
virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType);
const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType);
//! draws an indexed triangle list
virtual void drawIndexedTriangleList(const S3DVertex* vertices, u32 vertexCount, const u16* indexList, u32 triangleCount);
@ -310,7 +311,7 @@ namespace video
protected:
struct SHWBufferLink
{
SHWBufferLink(const scene::IMeshBuffer *_MeshBuffer):MeshBuffer(_MeshBuffer),ChangedID_Vertex(0),ChangedID_Index(0),LastUsed(0),Mapped(scene::EHM_NEVER)
SHWBufferLink(const scene::IMeshBuffer *_MeshBuffer):MeshBuffer(_MeshBuffer),ChangedID_Vertex(0),ChangedID_Index(0),LastUsed(0),Mapped_Vertex(scene::EHM_NEVER),Mapped_Index(scene::EHM_NEVER)
{
if (MeshBuffer)
MeshBuffer->grab();
@ -327,7 +328,8 @@ namespace video
u32 ChangedID_Vertex;
u32 ChangedID_Index;
u32 LastUsed;
scene::E_HARDWARE_MAPPING Mapped;
scene::E_HARDWARE_MAPPING Mapped_Vertex;
scene::E_HARDWARE_MAPPING Mapped_Index;
};
//! Gets hardware buffer link from a meshbuffer (may create or update buffer)
@ -452,7 +454,7 @@ namespace video
//! Returns a pointer to the mesh manipulator.
virtual scene::IMeshManipulator* getMeshManipulator();
//! Clears the ZBuffer.
virtual void clearZBuffer();
@ -612,3 +614,4 @@ namespace video
#endif

View File

@ -638,9 +638,9 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
{
HWBuffer->vbo_verticesSize = vertexCount*vertexSize;
if (HWBuffer->Mapped==scene::EHM_STATIC)
if (HWBuffer->Mapped_Vertex==scene::EHM_STATIC)
extGlBufferData(GL_ARRAY_BUFFER, vertexCount * vertexSize, buffer.const_pointer(), GL_STATIC_DRAW);
else if (HWBuffer->Mapped==scene::EHM_DYNAMIC)
else if (HWBuffer->Mapped_Vertex==scene::EHM_DYNAMIC)
extGlBufferData(GL_ARRAY_BUFFER, vertexCount * vertexSize, buffer.const_pointer(), GL_DYNAMIC_DRAW);
else //scene::EHM_STREAM
extGlBufferData(GL_ARRAY_BUFFER, vertexCount * vertexSize, buffer.const_pointer(), GL_STREAM_DRAW);
@ -666,9 +666,28 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
#if defined(GL_ARB_vertex_buffer_object)
const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer;
const u16* indices=mb->getIndices();
const void* indices=mb->getIndices();
u32 indexCount= mb->getIndexCount();
u32 indexSize = 2;
GLenum indexSize;
switch (mb->getIndexType())
{
case (EIT_16BIT):
{
indexSize=sizeof(u16);
break;
}
case (EIT_32BIT):
{
indexSize=sizeof(u32);
break;
}
default:
{
return false;
}
}
//get or create buffer
bool newBuffer=false;
@ -693,9 +712,9 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
{
HWBuffer->vbo_indicesSize = indexCount*indexSize;
if (HWBuffer->Mapped==scene::EHM_STATIC)
if (HWBuffer->Mapped_Index==scene::EHM_STATIC)
extGlBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * indexSize, indices, GL_STATIC_DRAW);
else if (HWBuffer->Mapped==scene::EHM_DYNAMIC)
else if (HWBuffer->Mapped_Index==scene::EHM_DYNAMIC)
extGlBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * indexSize, indices, GL_DYNAMIC_DRAW);
else //scene::EHM_STREAM
extGlBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * indexSize, indices, GL_STREAM_DRAW);
@ -716,24 +735,30 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
if (!HWBuffer)
return false;
if (HWBuffer->ChangedID_Vertex != HWBuffer->MeshBuffer->getChangedID_Vertex()
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_verticesID)
if (HWBuffer->Mapped_Vertex!=scene::EHM_NEVER)
{
if (HWBuffer->ChangedID_Vertex != HWBuffer->MeshBuffer->getChangedID_Vertex()
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_verticesID)
{
HWBuffer->ChangedID_Vertex = HWBuffer->MeshBuffer->getChangedID_Vertex();
HWBuffer->ChangedID_Vertex = HWBuffer->MeshBuffer->getChangedID_Vertex();
if (!updateVertexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
return false;
if (!updateVertexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
return false;
}
}
if (HWBuffer->ChangedID_Index != HWBuffer->MeshBuffer->getChangedID_Index()
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_indicesID)
if (HWBuffer->Mapped_Index!=scene::EHM_NEVER)
{
if (HWBuffer->ChangedID_Index != HWBuffer->MeshBuffer->getChangedID_Index()
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_indicesID)
{
HWBuffer->ChangedID_Index = HWBuffer->MeshBuffer->getChangedID_Index();
HWBuffer->ChangedID_Index = HWBuffer->MeshBuffer->getChangedID_Index();
if (!updateIndexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
return false;
if (!updateIndexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
return false;
}
}
return true;
@ -744,7 +769,7 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::IMeshBuffer* mb)
{
#if defined(GL_ARB_vertex_buffer_object)
if (!mb || (mb->getHardwareMappingHint()==scene::EHM_NEVER))
if (!mb || (mb->getHardwareMappingHint_Index()==scene::EHM_NEVER && mb->getHardwareMappingHint_Vertex()==scene::EHM_NEVER))
return 0;
SHWBufferLink_opengl *HWBuffer=new SHWBufferLink_opengl(mb);
@ -754,7 +779,8 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I
HWBuffer->ChangedID_Vertex=HWBuffer->MeshBuffer->getChangedID_Vertex();
HWBuffer->ChangedID_Index=HWBuffer->MeshBuffer->getChangedID_Index();
HWBuffer->Mapped=mb->getHardwareMappingHint();
HWBuffer->Mapped_Vertex=mb->getHardwareMappingHint_Vertex();
HWBuffer->Mapped_Index=mb->getHardwareMappingHint_Index();
HWBuffer->LastUsed=0;
HWBuffer->vbo_verticesID=0;
HWBuffer->vbo_indicesID=0;
@ -813,13 +839,33 @@ void COpenGLDriver::drawHardwareBuffer(SHWBufferLink *_HWBuffer)
#if defined(GL_ARB_vertex_buffer_object)
const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer;
extGlBindBuffer(GL_ARRAY_BUFFER, HWBuffer->vbo_verticesID);
extGlBindBuffer(GL_ELEMENT_ARRAY_BUFFER, HWBuffer->vbo_indicesID);
drawVertexPrimitiveList(0, mb->getVertexCount(), 0, mb->getIndexCount()/3, mb->getVertexType(), scene::EPT_TRIANGLES);
const void *vertices=mb->getVertices();
const void *indexList=mb->getIndices();
if (HWBuffer->Mapped_Vertex!=scene::EHM_NEVER)
{
extGlBindBuffer(GL_ARRAY_BUFFER, HWBuffer->vbo_verticesID);
vertices=0;
}
if (HWBuffer->Mapped_Index!=scene::EHM_NEVER)
{
extGlBindBuffer(GL_ELEMENT_ARRAY_BUFFER, HWBuffer->vbo_indicesID);
indexList=0;
}
drawVertexPrimitiveList(vertices, mb->getVertexCount(), indexList, mb->getIndexCount()/3, mb->getVertexType(), scene::EPT_TRIANGLES, mb->getIndexType());
if (HWBuffer->Mapped_Vertex!=scene::EHM_NEVER)
extGlBindBuffer(GL_ARRAY_BUFFER, 0);
if (HWBuffer->Mapped_Index!=scene::EHM_NEVER)
extGlBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
extGlBindBuffer(GL_ARRAY_BUFFER, 0);
extGlBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
#endif
}
@ -833,16 +879,17 @@ static inline u8* buffer_offset(const long offset)
//! draws a vertex primitive list
void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType)
const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType)
{
if (!primitiveCount || !vertexCount)
return;
if (!checkPrimitiveCount(primitiveCount))
return;
CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType);
CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType, iType);
if (vertices)
{
@ -989,6 +1036,22 @@ void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCoun
break;
}
GLenum indexSize=0;
switch (iType)
{
case (EIT_16BIT):
{
indexSize=GL_UNSIGNED_SHORT;
break;
}
case (EIT_32BIT):
{
indexSize=GL_UNSIGNED_INT;
break;
}
}
switch (pType)
{
case scene::EPT_POINTS:
@ -1022,31 +1085,31 @@ void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCoun
}
break;
case scene::EPT_LINE_STRIP:
glDrawElements(GL_LINE_STRIP, primitiveCount+1, GL_UNSIGNED_SHORT, indexList);
glDrawElements(GL_LINE_STRIP, primitiveCount+1, indexSize, indexList);
break;
case scene::EPT_LINE_LOOP:
glDrawElements(GL_LINE_LOOP, primitiveCount, GL_UNSIGNED_SHORT, indexList);
glDrawElements(GL_LINE_LOOP, primitiveCount, indexSize, indexList);
break;
case scene::EPT_LINES:
glDrawElements(GL_LINES, primitiveCount*2, GL_UNSIGNED_SHORT, indexList);
glDrawElements(GL_LINES, primitiveCount*2, indexSize, indexList);
break;
case scene::EPT_TRIANGLE_STRIP:
glDrawElements(GL_TRIANGLE_STRIP, primitiveCount+2, GL_UNSIGNED_SHORT, indexList);
glDrawElements(GL_TRIANGLE_STRIP, primitiveCount+2, indexSize, indexList);
break;
case scene::EPT_TRIANGLE_FAN:
glDrawElements(GL_TRIANGLE_FAN, primitiveCount+2, GL_UNSIGNED_SHORT, indexList);
glDrawElements(GL_TRIANGLE_FAN, primitiveCount+2, indexSize, indexList);
break;
case scene::EPT_TRIANGLES:
glDrawElements(GL_TRIANGLES, primitiveCount*3, GL_UNSIGNED_SHORT, indexList);
glDrawElements(GL_TRIANGLES, primitiveCount*3, indexSize, indexList);
break;
case scene::EPT_QUAD_STRIP:
glDrawElements(GL_QUAD_STRIP, primitiveCount*2+2, GL_UNSIGNED_SHORT, indexList);
glDrawElements(GL_QUAD_STRIP, primitiveCount*2+2, indexSize, indexList);
break;
case scene::EPT_QUADS:
glDrawElements(GL_QUADS, primitiveCount*4, GL_UNSIGNED_SHORT, indexList);
glDrawElements(GL_QUADS, primitiveCount*4, indexSize, indexList);
break;
case scene::EPT_POLYGON:
glDrawElements(GL_POLYGON, primitiveCount, GL_UNSIGNED_SHORT, indexList);
glDrawElements(GL_POLYGON, primitiveCount, indexSize, indexList);
break;
}
@ -2776,3 +2839,4 @@ IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params,
} // end namespace
} // end namespace

View File

@ -136,8 +136,8 @@ namespace video
//! draws a vertex primitive list
virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType);
const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType);
//! queries the features of the driver, returns true if feature is available
virtual bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const
@ -416,3 +416,4 @@ namespace video

View File

@ -352,7 +352,7 @@ void CParticleSystemSceneNode::render()
driver->setMaterial(Buffer->Material);
driver->drawVertexPrimitiveList(Buffer->getVertices(), Particles.size()*4,
Buffer->getIndices(), Particles.size()*2, video::EVT_STANDARD, EPT_TRIANGLES);
Buffer->getIndices(), Particles.size()*2, video::EVT_STANDARD, EPT_TRIANGLES,Buffer->getIndexType());
// for debug purposes only:
if ( DebugDataVisible & scene::EDS_BBOX )
@ -632,3 +632,4 @@ void CParticleSystemSceneNode::deserializeAttributes(io::IAttributes* in, io::SA
} // end namespace scene
} // end namespace irr

View File

@ -379,6 +379,21 @@ void CShadowVolumeSceneNode::render()
for (s32 i=0; i<ShadowVolumesUsed; ++i)
driver->drawStencilShadowVolume(ShadowVolumes[i].vertices,
ShadowVolumes[i].count, UseZFailMethod);
/*
if ( DebugDataVisible & scene::EDS_MESH_WIRE_OVERLAY )
{
video::SMaterial mat;
mat.Lighting = false;
mat.Wireframe = true;
mat.ZBuffer = true;
driver->setMaterial(mat);
for (s32 i=0; i<ShadowVolumesUsed; ++i)
driver->drawVertexPrimitiveList(ShadowVolumes[i].vertices,
ShadowVolumes[i].count,0,0,video::EVT_STANDARD,scene::EPT_LINES);
}
*/
}
@ -445,3 +460,4 @@ void CShadowVolumeSceneNode::calculateAdjacency(f32 epsilon)
} // end namespace scene
} // end namespace irr

View File

@ -324,9 +324,30 @@ void CSoftwareDriver::setViewPort(const core::rect<s32>& area)
CurrentTriangleRenderer->setRenderTarget(RenderTargetSurface, ViewPort);
}
void CSoftwareDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType)
{
switch (iType)
{
case (EIT_16BIT):
{
drawVertexPrimitiveList16(vertices, vertexCount, (const u16*)indexList, primitiveCount, vType, pType);
break;
}
case (EIT_32BIT):
{
os::Printer::log("Software driver can not render 32bit buffers", ELL_ERROR);
break;
}
}
}
//! draws a vertex primitive list
void CSoftwareDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, const u16* indexList, u32 primitiveCount, E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType)
void CSoftwareDriver::drawVertexPrimitiveList16(const void* vertices, u32 vertexCount, const u16* indexList, u32 primitiveCount, E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType)
{
const u16* indexPointer=0;
core::array<u16> newBuffer;
@ -364,7 +385,7 @@ void CSoftwareDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCo
}
return;
case scene::EPT_LINE_LOOP:
drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount-1, vType, scene::EPT_LINE_STRIP);
drawVertexPrimitiveList16(vertices, vertexCount, indexList, primitiveCount-1, vType, scene::EPT_LINE_STRIP);
switch (vType)
{
case EVT_STANDARD:
@ -628,7 +649,7 @@ void CSoftwareDriver::drawClippedIndexedTriangleListT(const VERTEXTYPE* vertices
// draw triangles
CNullDriver::drawVertexPrimitiveList(clippedVertices.pointer(), clippedVertices.size(),
clippedIndices.pointer(), clippedIndices.size()/3, EVT_STANDARD, scene::EPT_TRIANGLES);
clippedIndices.pointer(), clippedIndices.size()/3, EVT_STANDARD, scene::EPT_TRIANGLES, EIT_16BIT);
if (TransformedPoints.size() < clippedVertices.size())
TransformedPoints.set_used(clippedVertices.size());

View File

@ -54,8 +54,8 @@ namespace video
//! draws a vertex primitive list
void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType);
const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType);
//! Draws a 3d line.
virtual void draw3DLine(const core::vector3df& start,
@ -124,6 +124,13 @@ namespace video
//! clips a triangle agains the viewing frustum
void clipTriangle(f32* transformedPos);
//! draws a vertex primitive list
void drawVertexPrimitiveList16(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType);
template<class VERTEXTYPE>
void drawClippedIndexedTriangleListT(const VERTEXTYPE* vertices,
s32 vertexCount, const u16* indexList, s32 triangleCount);
@ -158,3 +165,4 @@ namespace video
#endif

View File

@ -39,7 +39,7 @@ CBurningVideoDriver::CBurningVideoDriver(const core::dimension2d<s32>& windowSiz
if (BackBuffer)
{
BackBuffer->fill(SColor(0));
// create z buffer
DepthBuffer = video::createDepthBuffer(BackBuffer->getDimension());
}
@ -96,8 +96,8 @@ CBurningVideoDriver::CBurningVideoDriver(const core::dimension2d<s32>& windowSiz
addMaterialRenderer ( umr ); // EMT_SPHERE_MAP,
addMaterialRenderer ( smr ); // EMT_REFLECTION_2_LAYER,
addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_ADD_COLOR,
addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_ALPHA_CHANNEL,
addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_ALPHA_CHANNEL_REF,
addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_ALPHA_CHANNEL,
addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_ALPHA_CHANNEL_REF,
addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_VERTEX_ALPHA,
addMaterialRenderer ( smr ); // EMT_TRANSPARENT_REFLECTION_2_LAYER,
addMaterialRenderer ( umr ); // EMT_NORMAL_MAP_SOLID,
@ -370,7 +370,7 @@ void CBurningVideoDriver::setMaterial(const SMaterial& material)
for (u32 i = 0; i < 2; ++i)
{
setTransform((E_TRANSFORMATION_STATE) (ETS_TEXTURE_0 + i),
setTransform((E_TRANSFORMATION_STATE) (ETS_TEXTURE_0 + i),
material.getTextureMatrix(i));
}
@ -408,7 +408,7 @@ bool CBurningVideoDriver::endScene( void* windowId, core::rect<s32>* sourceRect
//! sets a render target
bool CBurningVideoDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuffer,
bool CBurningVideoDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuffer,
bool clearZBuffer, SColor color)
{
if (texture && texture->getDriverType() != EDT_BURNINGSVIDEO)
@ -573,7 +573,7 @@ REALINLINE u32 CBurningVideoDriver::clipToFrustumTest ( const s4DVertex * v ) c
return flag;
}
#endif // _MSC_VER
#endif // _MSC_VER
u32 CBurningVideoDriver::clipToHyperPlane ( s4DVertex * dest, const s4DVertex * source, u32 inCount, const sVec4 &plane )
{
@ -898,13 +898,13 @@ void CBurningVideoDriver::VertexCache_fill(const u32 sourceIndex,
{
/*
Generate texture coordinates as linear functions so that:
u = Ux*x + Uy*y + Uz*z + Uw
u = Ux*x + Uy*y + Uz*z + Uw
v = Vx*x + Vy*y + Vz*z + Vw
The matrix M for this case is:
Ux Vx 0 0
Uy Vy 0 0
Uz Vz 0 0
Uw Vw 0 0
Ux Vx 0 0
Uy Vy 0 0
Uz Vz 0 0
Uw Vw 0 0
*/
const core::vector2d<f32> *src = &((S3DVertex*) source )->TCoords;
@ -937,7 +937,7 @@ void CBurningVideoDriver::VertexCache_fill(const u32 sourceIndex,
dest[0].flag = dest[1].flag = vSize[VertexCache.vType].Format;
// test vertex
// test vertex
dest[0].flag |= clipToFrustumTest ( dest);
// to DC Space, project homogenous vertex
@ -1075,8 +1075,8 @@ REALINLINE void CBurningVideoDriver::VertexCache_get2 ( s4DVertex ** face )
}
void CBurningVideoDriver::VertexCache_reset ( const void* vertices, u32 vertexCount,
const u16* indices, u32 primitiveCount,
void CBurningVideoDriver::VertexCache_reset ( const void* vertices, u32 vertexCount,
const u16* indices, u32 primitiveCount,
E_VERTEX_TYPE vType,scene::E_PRIMITIVE_TYPE pType )
{
VertexCache.vertices = vertices;
@ -1106,13 +1106,37 @@ void CBurningVideoDriver::VertexCache_reset ( const void* vertices, u32 vertexCo
}
void CBurningVideoDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType)
{
switch (iType)
{
case (EIT_16BIT):
{
drawVertexPrimitiveList16(vertices, vertexCount, (const u16*) indexList, primitiveCount, vType, pType);
break;
}
case (EIT_32BIT):
{
os::Printer::log("Software driver can not render 32bit buffers", ELL_ERROR);
break;
}
}
}
//! draws a vertex primitive list
void CBurningVideoDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, const u16* indexList, u32 primitiveCount, E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType)
void CBurningVideoDriver::drawVertexPrimitiveList16(const void* vertices, u32 vertexCount, const u16* indexList, u32 primitiveCount, E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType)
{
if (!checkPrimitiveCount(primitiveCount))
return;
CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType);
CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType, EIT_16BIT);
if ( 0 == CurrentShader )
return;
@ -1194,7 +1218,7 @@ void CBurningVideoDriver::drawVertexPrimitiveList(const void* vertices, u32 vert
u32 flag;
const char * name;
};
SCheck check[5];
check[0].flag = face[0]->flag;
check[0].name = "face0";
@ -1464,7 +1488,7 @@ void CBurningVideoDriver::lightVertex ( s4DVertex *dest, const S3DVertex *source
lightHalf.y = vp.y - vertexEyeSpaceUnit.y;
lightHalf.z = vp.z - vertexEyeSpaceUnit.z;
lightHalf.normalize_xyz();
} break;
case video::ELT_DIRECTIONAL:
@ -1520,8 +1544,8 @@ void CBurningVideoDriver::lightVertex ( s4DVertex *dest, const S3DVertex *source
//! draws an 2d image, using a color (if color is other then Color(255,255,255,255)) and the alpha channel of the texture if wanted.
void CBurningVideoDriver::draw2DImage(const video::ITexture* texture, const core::position2d<s32>& destPos,
const core::rect<s32>& sourceRect,
const core::rect<s32>* clipRect, SColor color,
const core::rect<s32>& sourceRect,
const core::rect<s32>* clipRect, SColor color,
bool useAlphaChannelOfTexture)
{
if (texture)
@ -1543,7 +1567,7 @@ void CBurningVideoDriver::draw2DImage(const video::ITexture* texture, const core
//! Draws a 2d line.
//! Draws a 2d line.
void CBurningVideoDriver::draw2DLine(const core::position2d<s32>& start,
const core::position2d<s32>& end,
SColor color)
@ -1562,7 +1586,7 @@ void CBurningVideoDriver::draw2DRectangle(SColor color, const core::rect<s32>& p
p.clipAgainst(*clip);
if(!p.isValid())
if(!p.isValid())
return;
BackBuffer->drawRectangle(p, color);
@ -1824,11 +1848,11 @@ ITexture* CBurningVideoDriver::createRenderTargetTexture(const core::dimension2d
ITexture* tex = new CSoftwareTexture2(img, name, false, true);
img->drop();
return tex;
return tex;
}
//! Clears the DepthBuffer.
//! Clears the DepthBuffer.
void CBurningVideoDriver::clearZBuffer()
{
if (DepthBuffer)

View File

@ -70,8 +70,8 @@ namespace video
//! draws a vertex primitive list
void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType);
const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType);
//! draws an 2d image, using a color (if color is other then Color(255,255,255,255)) and the alpha channel of the texture if wanted.
virtual void draw2DImage(const video::ITexture* texture, const core::position2d<s32>& destPos,
@ -139,6 +139,12 @@ namespace video
protected:
void drawVertexPrimitiveList16(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType);
//! sets a render target
void setRenderTarget(video::CImage* image);
@ -245,3 +251,4 @@ namespace video
#endif

View File

@ -45,7 +45,7 @@ namespace scene
setDebugName("CTerrainSceneNode");
#endif
RenderBuffer = new SMeshBufferLightMap();
RenderBuffer = new CDynamicMeshBuffer(video::EVT_2TCOORDS, video::EIT_16BIT);
if (FileSystem)
FileSystem->grab();
@ -125,8 +125,24 @@ namespace scene
// --- Generate vertex data from heightmap ----
// resize the vertex array for the mesh buffer one time ( makes loading faster )
SMeshBufferLightMap* mb = new SMeshBufferLightMap();
mb->Vertices.set_used( TerrainData.Size * TerrainData.Size );
//SMeshBufferLightMap* mb = new SMeshBufferLightMap();
scene::CDynamicMeshBuffer *mb=0;
if ((heightMap->getDimension().Width*heightMap->getDimension().Height) <65535)
{
//small enough for 16bit buffers
mb=new scene::CDynamicMeshBuffer(video::EVT_2TCOORDS, video::EIT_16BIT);
RenderBuffer->getIndexBuffer().setType(video::EIT_16BIT);
}
else
{
//we need 32bit buffers
mb=new scene::CDynamicMeshBuffer(video::EVT_2TCOORDS, video::EIT_32BIT);
RenderBuffer->getIndexBuffer().setType(video::EIT_32BIT);
}
mb->getVertexBuffer().set_used( TerrainData.Size * TerrainData.Size );
video::S3DVertex2TCoords vertex;
vertex.Normal.set( 0.0f, 1.0f, 0.0f );
@ -148,7 +164,7 @@ namespace scene
vertex.TCoords.X = vertex.TCoords2.X = x * tdSize;
vertex.TCoords.Y = vertex.TCoords2.Y = z * tdSize;
mb->Vertices[index] = vertex;
mb->getVertexBuffer()[index] = vertex;
++index;
}
}
@ -166,13 +182,14 @@ namespace scene
const u32 vertexCount = mb->getVertexCount();
// We copy the data to the renderBuffer, after the normals have been calculated.
RenderBuffer->Vertices.set_used( vertexCount );
RenderBuffer->getVertexBuffer().set_used( vertexCount );
for( u32 i = 0; i < vertexCount; ++i )
{
RenderBuffer->Vertices[i] = mb->Vertices[i];
RenderBuffer->Vertices[i].Pos *= TerrainData.Scale;
RenderBuffer->Vertices[i].Pos += TerrainData.Position;
RenderBuffer->getVertexBuffer()[i] = mb->getVertexBuffer()[i];
RenderBuffer->getVertexBuffer()[i].Pos *= TerrainData.Scale;
RenderBuffer->getVertexBuffer()[i].Pos += TerrainData.Position;
}
// We no longer need the mb
@ -192,7 +209,8 @@ namespace scene
setRotation( TerrainData.Rotation );
// Pre-allocate memory for indices
RenderBuffer->Indices.set_used( TerrainData.PatchCount * TerrainData.PatchCount *
RenderBuffer->getIndexBuffer().set_used( TerrainData.PatchCount * TerrainData.PatchCount *
TerrainData.CalcPatchSize * TerrainData.CalcPatchSize * 6 );
RenderBuffer->setDirty();
@ -260,8 +278,9 @@ namespace scene
// --- Generate vertex data from heightmap ----
// resize the vertex array for the mesh buffer one time ( makes loading faster )
SMeshBufferLightMap* mb = new SMeshBufferLightMap();
mb->Vertices.reallocate( TerrainData.Size * TerrainData.Size );
scene::CDynamicMeshBuffer *mb=new scene::CDynamicMeshBuffer(video::EVT_2TCOORDS, video::EIT_16BIT);
mb->getVertexBuffer().reallocate( TerrainData.Size * TerrainData.Size );
video::S3DVertex2TCoords vertex;
vertex.Normal.set( 0.0f, 1.0f, 0.0f );
@ -288,7 +307,7 @@ namespace scene
vertex.TCoords.X = vertex.TCoords2.X = x * tdSize;
vertex.TCoords.Y = vertex.TCoords2.Y = z * tdSize;
mb->Vertices.push_back( vertex );
mb->getVertexBuffer().push_back( vertex );
}
}
@ -302,13 +321,14 @@ namespace scene
const u32 vertexCount = mb->getVertexCount();
// We copy the data to the renderBuffer, after the normals have been calculated.
RenderBuffer->Vertices.set_used( vertexCount );
RenderBuffer->getVertexBuffer().set_used( vertexCount );
for( u32 i = 0; i < vertexCount; i++ )
{
RenderBuffer->Vertices[i] = mb->Vertices[i];
RenderBuffer->Vertices[i].Pos *= TerrainData.Scale;
RenderBuffer->Vertices[i].Pos += TerrainData.Position;
RenderBuffer->getVertexBuffer()[i] = mb->getVertexBuffer()[i];
RenderBuffer->getVertexBuffer()[i].Pos *= TerrainData.Scale;
RenderBuffer->getVertexBuffer()[i].Pos += TerrainData.Position;
}
// We no longer need the mb
@ -328,7 +348,7 @@ namespace scene
setRotation( TerrainData.Rotation );
// Pre-allocate memory for indices
RenderBuffer->Indices.set_used( TerrainData.PatchCount * TerrainData.PatchCount *
RenderBuffer->getIndexBuffer().set_used( TerrainData.PatchCount * TerrainData.PatchCount *
TerrainData.CalcPatchSize * TerrainData.CalcPatchSize * 6 );
u32 endTime = os::Timer::getTime();
@ -393,11 +413,11 @@ namespace scene
for( s32 i = 0; i < vtxCount; ++i )
{
RenderBuffer->Vertices[i].Pos = meshVertices[i].Pos * TerrainData.Scale + TerrainData.Position;
RenderBuffer->getVertexBuffer()[i].Pos = meshVertices[i].Pos * TerrainData.Scale + TerrainData.Position;
RenderBuffer->Vertices[i].Pos -= TerrainData.RotationPivot;
rotMatrix.inverseRotateVect( RenderBuffer->Vertices[i].Pos );
RenderBuffer->Vertices[i].Pos += TerrainData.RotationPivot;
RenderBuffer->getVertexBuffer()[i].Pos -= TerrainData.RotationPivot;
rotMatrix.inverseRotateVect( RenderBuffer->getVertexBuffer()[i].Pos );
RenderBuffer->getVertexBuffer()[i].Pos += TerrainData.RotationPivot;
}
calculateDistanceThresholds( true );
@ -514,12 +534,12 @@ namespace scene
index12 = getIndex( j, i, index, x, z + step );
index22 = getIndex( j, i, index, x + step, z + step );
RenderBuffer->Indices[IndicesToRender++] = index12;
RenderBuffer->Indices[IndicesToRender++] = index11;
RenderBuffer->Indices[IndicesToRender++] = index22;
RenderBuffer->Indices[IndicesToRender++] = index22;
RenderBuffer->Indices[IndicesToRender++] = index11;
RenderBuffer->Indices[IndicesToRender++] = index21;
RenderBuffer->getIndexBuffer().setValue(IndicesToRender++, index12);
RenderBuffer->getIndexBuffer().setValue(IndicesToRender++,index11);
RenderBuffer->getIndexBuffer().setValue(IndicesToRender++, index22);
RenderBuffer->getIndexBuffer().setValue(IndicesToRender++, index22);
RenderBuffer->getIndexBuffer().setValue(IndicesToRender++, index11);
RenderBuffer->getIndexBuffer().setValue(IndicesToRender++, index21);
// increment index position horizontally
x += step;
@ -560,12 +580,12 @@ namespace scene
driver->setMaterial(Mesh.getMeshBuffer(0)->getMaterial());
RenderBuffer->Indices.set_used(IndicesToRender);
RenderBuffer->getIndexBuffer().set_used(IndicesToRender);
// For use with geomorphing
driver->drawMeshBuffer(RenderBuffer);
RenderBuffer->Indices.set_used( RenderBuffer->Indices.allocated_size() );
RenderBuffer->getIndexBuffer().set_used( RenderBuffer->getIndexBuffer().allocated_size() );
// for debug purposes only:
if (DebugDataVisible)
@ -614,7 +634,7 @@ namespace scene
//! Gets the meshbuffer data based on a specified Level of Detail.
//! \param mb: A reference to an SMeshBuffer object
//! \param LOD: The Level Of Detail you want the indices from.
void CTerrainSceneNode::getMeshBufferForLOD(SMeshBufferLightMap& mb, s32 LOD ) const
void CTerrainSceneNode::getMeshBufferForLOD(IDynamicMeshBuffer& mb, s32 LOD ) const
{
if (!Mesh.getMeshBufferCount())
return;
@ -624,23 +644,30 @@ namespace scene
else if ( LOD > TerrainData.MaxLOD - 1 )
LOD = TerrainData.MaxLOD - 1;
s32 numVertices = Mesh.getMeshBuffer( 0 )->getVertexCount ( );
mb.Vertices.reallocate ( numVertices );
//mb.setVertexBuffer( new CVertexBuffer( Mesh.getMeshBuffer(0)->getVertexBuffer() ));
u32 numVertices = Mesh.getMeshBuffer( 0 )->getVertexCount ( );
mb.getVertexBuffer().reallocate ( numVertices );
video::S3DVertex2TCoords* vertices = (video::S3DVertex2TCoords*)Mesh.getMeshBuffer ( 0 )->getVertices ( );
s32 i;
for (i=0; i<numVertices; ++i)
mb.Vertices.push_back(vertices[i]);
for (u32 n=0; n<numVertices; ++n)
mb.getVertexBuffer().push_back(vertices[n]);
mb.getIndexBuffer().setType( RenderBuffer->getIndexBuffer().getType() );
// calculate the step we take for all patches, since LOD is the same
s32 step = 1 << LOD;
s32 index11;
s32 index21;
s32 index12;
s32 index22;
u32 index11;
u32 index21;
u32 index12;
u32 index22;
// Generate the indices for all patches at the specified LOD
for (i=0; i<TerrainData.PatchCount; ++i)
for (s32 i=0; i<TerrainData.PatchCount; ++i)
{
for (s32 j=0; j<TerrainData.PatchCount; ++j)
{
@ -656,12 +683,12 @@ namespace scene
index12 = getIndex( j, i, index, x, z + step );
index22 = getIndex( j, i, index, x + step, z + step );
mb.Indices.push_back( index12 );
mb.Indices.push_back( index11 );
mb.Indices.push_back( index22 );
mb.Indices.push_back( index22 );
mb.Indices.push_back( index11 );
mb.Indices.push_back( index21 );
mb.getIndexBuffer().push_back( index12 );
mb.getIndexBuffer().push_back( index11 );
mb.getIndexBuffer().push_back( index22 );
mb.getIndexBuffer().push_back( index22 );
mb.getIndexBuffer().push_back( index11 );
mb.getIndexBuffer().push_back( index21 );
// increment index position horizontally
x += step;
@ -802,6 +829,8 @@ namespace scene
//! specifying the relation between world space and texture coordinate space.
void CTerrainSceneNode::scaleTexture(f32 resolution, f32 resolution2)
{
TCoordScale1 = resolution;
TCoordScale2 = resolution2;
@ -815,18 +844,22 @@ namespace scene
zval=z2val=0;
for (s32 z=0; z<TerrainData.Size; ++z)
{
RenderBuffer->Vertices[index].TCoords.X = xval;
RenderBuffer->Vertices[index].TCoords.Y = zval;
RenderBuffer->getVertexBuffer()[index].TCoords.X = xval;
RenderBuffer->getVertexBuffer()[index].TCoords.Y = zval;
if ( resolution2 == 0 )
if (RenderBuffer->getVertexType()==video::EVT_2TCOORDS)
{
RenderBuffer->Vertices[index].TCoords2 = RenderBuffer->Vertices[index].TCoords;
}
else
{
RenderBuffer->Vertices[index].TCoords2.X = x2val;
RenderBuffer->Vertices[index].TCoords2.Y = z2val;
if ( resolution2 == 0 )
{
((video::S3DVertex2TCoords&)RenderBuffer->getVertexBuffer()[index]).TCoords2 = RenderBuffer->getVertexBuffer()[index].TCoords;
}
else
{
((video::S3DVertex2TCoords&)RenderBuffer->getVertexBuffer()[index]).TCoords2.X = x2val;
((video::S3DVertex2TCoords&)RenderBuffer->getVertexBuffer()[index]).TCoords2.Y = z2val;
}
}
++index;
zval += resBySize;
z2val += res2BySize;
@ -895,7 +928,7 @@ namespace scene
}
//! smooth the terrain
void CTerrainSceneNode::smoothTerrain(SMeshBufferLightMap* mb, s32 smoothFactor)
void CTerrainSceneNode::smoothTerrain(CDynamicMeshBuffer* mb, s32 smoothFactor)
{
for (s32 run = 0; run < smoothFactor; ++run)
{
@ -904,11 +937,11 @@ namespace scene
{
for (s32 x = 1; x < TerrainData.Size - 1; ++x)
{
mb->Vertices[x + yd].Pos.Y =
(mb->Vertices[x-1 + yd].Pos.Y +
mb->Vertices[x+1 + yd].Pos.Y +
mb->Vertices[x + yd - TerrainData.Size].Pos.Y +
mb->Vertices[x + yd - TerrainData.Size].Pos.Y) * 0.25f;
mb->getVertexBuffer()[x + yd].Pos.Y =
(mb->getVertexBuffer()[x-1 + yd].Pos.Y +
mb->getVertexBuffer()[x+1 + yd].Pos.Y +
mb->getVertexBuffer()[x + yd - TerrainData.Size].Pos.Y +
mb->getVertexBuffer()[x + yd - TerrainData.Size].Pos.Y) * 0.25f;
}
yd += TerrainData.Size;
}
@ -916,7 +949,7 @@ namespace scene
}
//! calculate smooth normals
void CTerrainSceneNode::calculateNormals ( SMeshBufferLightMap* mb )
void CTerrainSceneNode::calculateNormals ( CDynamicMeshBuffer* mb )
{
s32 count;
core::vector3df a, b, c, t;
@ -931,18 +964,18 @@ namespace scene
// top left
if (x>0 && z>0)
{
a = mb->Vertices[(x-1)*TerrainData.Size+z-1].Pos;
b = mb->Vertices[(x-1)*TerrainData.Size+z].Pos;
c = mb->Vertices[x*TerrainData.Size+z].Pos;
a = mb->getVertexBuffer()[(x-1)*TerrainData.Size+z-1].Pos;
b = mb->getVertexBuffer()[(x-1)*TerrainData.Size+z].Pos;
c = mb->getVertexBuffer()[x*TerrainData.Size+z].Pos;
b -= a;
c -= a;
t = b.crossProduct ( c );
t.normalize ( );
normal += t;
a = mb->Vertices[(x-1)*TerrainData.Size+z-1].Pos;
b = mb->Vertices[x*TerrainData.Size+z-1].Pos;
c = mb->Vertices[x*TerrainData.Size+z].Pos;
a = mb->getVertexBuffer()[(x-1)*TerrainData.Size+z-1].Pos;
b = mb->getVertexBuffer()[x*TerrainData.Size+z-1].Pos;
c = mb->getVertexBuffer()[x*TerrainData.Size+z].Pos;
b -= a;
c -= a;
t = b.crossProduct ( c );
@ -955,18 +988,18 @@ namespace scene
// top right
if (x>0 && z<TerrainData.Size-1)
{
a = mb->Vertices[(x-1)*TerrainData.Size+z].Pos;
b = mb->Vertices[(x-1)*TerrainData.Size+z+1].Pos;
c = mb->Vertices[x*TerrainData.Size+z+1].Pos;
a = mb->getVertexBuffer()[(x-1)*TerrainData.Size+z].Pos;
b = mb->getVertexBuffer()[(x-1)*TerrainData.Size+z+1].Pos;
c = mb->getVertexBuffer()[x*TerrainData.Size+z+1].Pos;
b -= a;
c -= a;
t = b.crossProduct ( c );
t.normalize ( );
normal += t;
a = mb->Vertices[(x-1)*TerrainData.Size+z].Pos;
b = mb->Vertices[x*TerrainData.Size+z+1].Pos;
c = mb->Vertices[x*TerrainData.Size+z].Pos;
a = mb->getVertexBuffer()[(x-1)*TerrainData.Size+z].Pos;
b = mb->getVertexBuffer()[x*TerrainData.Size+z+1].Pos;
c = mb->getVertexBuffer()[x*TerrainData.Size+z].Pos;
b -= a;
c -= a;
t = b.crossProduct ( c );
@ -979,18 +1012,18 @@ namespace scene
// bottom right
if (x<TerrainData.Size-1 && z<TerrainData.Size-1)
{
a = mb->Vertices[x*TerrainData.Size+z+1].Pos;
b = mb->Vertices[x*TerrainData.Size+z].Pos;
c = mb->Vertices[(x+1)*TerrainData.Size+z+1].Pos;
a = mb->getVertexBuffer()[x*TerrainData.Size+z+1].Pos;
b = mb->getVertexBuffer()[x*TerrainData.Size+z].Pos;
c = mb->getVertexBuffer()[(x+1)*TerrainData.Size+z+1].Pos;
b -= a;
c -= a;
t = b.crossProduct ( c );
t.normalize ( );
normal += t;
a = mb->Vertices[x*TerrainData.Size+z+1].Pos;
b = mb->Vertices[(x+1)*TerrainData.Size+z+1].Pos;
c = mb->Vertices[(x+1)*TerrainData.Size+z].Pos;
a = mb->getVertexBuffer()[x*TerrainData.Size+z+1].Pos;
b = mb->getVertexBuffer()[(x+1)*TerrainData.Size+z+1].Pos;
c = mb->getVertexBuffer()[(x+1)*TerrainData.Size+z].Pos;
b -= a;
c -= a;
t = b.crossProduct ( c );
@ -1003,18 +1036,18 @@ namespace scene
// bottom left
if (x<TerrainData.Size-1 && z>0)
{
a = mb->Vertices[x*TerrainData.Size+z-1].Pos;
b = mb->Vertices[x*TerrainData.Size+z].Pos;
c = mb->Vertices[(x+1)*TerrainData.Size+z].Pos;
a = mb->getVertexBuffer()[x*TerrainData.Size+z-1].Pos;
b = mb->getVertexBuffer()[x*TerrainData.Size+z].Pos;
c = mb->getVertexBuffer()[(x+1)*TerrainData.Size+z].Pos;
b -= a;
c -= a;
t = b.crossProduct ( c );
t.normalize ( );
normal += t;
a = mb->Vertices[x*TerrainData.Size+z-1].Pos;
b = mb->Vertices[(x+1)*TerrainData.Size+z].Pos;
c = mb->Vertices[(x+1)*TerrainData.Size+z-1].Pos;
a = mb->getVertexBuffer()[x*TerrainData.Size+z-1].Pos;
b = mb->getVertexBuffer()[(x+1)*TerrainData.Size+z].Pos;
c = mb->getVertexBuffer()[(x+1)*TerrainData.Size+z-1].Pos;
b -= a;
c -= a;
t = b.crossProduct ( c );
@ -1033,7 +1066,7 @@ namespace scene
normal.set( 0.0f, 1.0f, 0.0f );
}
mb->Vertices[x * TerrainData.Size + z].Normal = normal;
mb->getVertexBuffer()[x * TerrainData.Size + z].Normal = normal;
}
}
}
@ -1068,7 +1101,8 @@ namespace scene
for( s32 xx = x*(TerrainData.CalcPatchSize); xx <= ( x + 1 ) * TerrainData.CalcPatchSize; ++xx )
for( s32 zz = z*(TerrainData.CalcPatchSize); zz <= ( z + 1 ) * TerrainData.CalcPatchSize; ++zz )
TerrainData.Patches[index].BoundingBox.addInternalPoint( RenderBuffer->Vertices[xx * TerrainData.Size + zz].Pos );
TerrainData.Patches[index].BoundingBox.addInternalPoint( RenderBuffer->getVertexBuffer()[xx * TerrainData.Size + zz].Pos );
// Reconfigure the bounding box of the terrain as a whole
TerrainData.BoundingBox.addInternalBox( TerrainData.Patches[index].BoundingBox );
@ -1303,3 +1337,4 @@ namespace scene
} // end namespace scene
} // end namespace irr

View File

@ -11,6 +11,7 @@
#include "ITerrainSceneNode.h"
#include "SMesh.h"
#include "CDynamicMeshBuffer.h"
namespace irr
{
@ -142,7 +143,7 @@ namespace scene
//! Gets the meshbuffer data based on a specified Level of Detail.
//! \param mb: A reference to an SMeshBufferLightMap object
//! \param LOD: The Level Of Detail you want the indices from.
virtual void getMeshBufferForLOD(SMeshBufferLightMap& mb, s32 LOD ) const;
virtual void getMeshBufferForLOD(IDynamicMeshBuffer& mb, s32 LOD ) const;
//! Gets the indices for a specified patch at a specified Level of Detail.
//! \param indices: A reference to an array of u32 indices.
@ -282,10 +283,10 @@ namespace scene
u32 getIndex(const s32 PatchX, const s32 PatchZ, const s32 PatchIndex, u32 vX, u32 vZ) const;
//! smooth the terrain
void smoothTerrain(SMeshBufferLightMap* mb, s32 smoothFactor);
void smoothTerrain(CDynamicMeshBuffer* mb, s32 smoothFactor);
//! calculate smooth normals
void calculateNormals(SMeshBufferLightMap* mb);
void calculateNormals(CDynamicMeshBuffer* mb);
//! create patches, stuff that needs to only be done once for patches goes here.
void createPatches();
@ -307,7 +308,9 @@ namespace scene
STerrainData TerrainData;
SMesh Mesh;
SMeshBufferLightMap* RenderBuffer;
CDynamicMeshBuffer *RenderBuffer;
u32 VerticesToRender;
u32 IndicesToRender;
@ -334,3 +337,4 @@ namespace scene
#endif // __C_TERRAIN_SCENE_NODE_H__