Commit 341dc165 authored by lukeph's avatar lukeph

-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
parent 320c8b91
...@@ -18,6 +18,8 @@ namespace scene ...@@ -18,6 +18,8 @@ namespace scene
class IIndexList class IIndexList
{ {
public: public:
virtual ~IIndexList(){};
virtual u32 stride() const =0; virtual u32 stride() const =0;
virtual u32 size() const =0; virtual u32 size() const =0;
virtual void push_back(const u32 &element) =0; virtual void push_back(const u32 &element) =0;
...@@ -28,7 +30,7 @@ namespace scene ...@@ -28,7 +30,7 @@ namespace scene
virtual void reallocate(u32 new_size) =0; virtual void reallocate(u32 new_size) =0;
virtual u32 allocated_size() const =0; virtual u32 allocated_size() const =0;
virtual void* pointer() =0; virtual void* pointer() =0;
virtual video::E_INDEX_TYPE getType() =0; virtual video::E_INDEX_TYPE getType() const =0;
}; };
template <class T> template <class T>
...@@ -75,7 +77,7 @@ namespace scene ...@@ -75,7 +77,7 @@ namespace scene
virtual void* pointer() {return Indices.pointer();} virtual void* pointer() {return Indices.pointer();}
virtual video::E_INDEX_TYPE getType() virtual video::E_INDEX_TYPE getType() const
{ {
if (sizeof(T)==sizeof(u16)) if (sizeof(T)==sizeof(u16))
return video::EIT_16BIT; return video::EIT_16BIT;
...@@ -91,6 +93,15 @@ namespace scene ...@@ -91,6 +93,15 @@ namespace scene
setType(IndexType); 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() virtual ~CIndexBuffer()
{ {
delete Indices; delete Indices;
...@@ -130,7 +141,7 @@ namespace scene ...@@ -130,7 +141,7 @@ namespace scene
virtual void* getData() {return Indices->pointer();} 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();} virtual u32 stride() const {return Indices->stride();}
......
...@@ -18,7 +18,7 @@ namespace scene ...@@ -18,7 +18,7 @@ namespace scene
{ {
public: public:
//! Default constructor for empty meshbuffer //! 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 #ifdef _DEBUG
setDebugName("SMeshBuffer"); setDebugName("SMeshBuffer");
...@@ -65,6 +65,12 @@ namespace scene ...@@ -65,6 +65,12 @@ namespace scene
return Vertices.size(); 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 //! Get pointer to indices
/** \return Pointer to indices. */ /** \return Pointer to indices. */
...@@ -202,6 +208,7 @@ namespace scene ...@@ -202,6 +208,7 @@ namespace scene
*/ */
virtual void append(const IMeshBuffer* const other) virtual void append(const IMeshBuffer* const other)
{ {
/*
if (this==other) if (this==other)
return; return;
...@@ -220,20 +227,32 @@ namespace scene ...@@ -220,20 +227,32 @@ namespace scene
Indices.push_back(other->getIndices()[i]+vertexCount); Indices.push_back(other->getIndices()[i]+vertexCount);
} }
BoundingBox.addInternalBox(other->getBoundingBox()); 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 //! 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 //! 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 //! flags the mesh as changed, reloads hardware buffers
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX)
{ {
...@@ -255,7 +274,8 @@ namespace scene ...@@ -255,7 +274,8 @@ namespace scene
u32 ChangedID_Index; u32 ChangedID_Index;
//! hardware mapping hint //! hardware mapping hint
E_HARDWARE_MAPPING MappingHint; E_HARDWARE_MAPPING MappingHint_Vertex;
E_HARDWARE_MAPPING MappingHint_Index;
//! Material for this meshbuffer. //! Material for this meshbuffer.
video::SMaterial Material; video::SMaterial Material;
...@@ -278,3 +298,4 @@ namespace scene ...@@ -278,3 +298,4 @@ namespace scene
#endif #endif
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "IVertexBuffer.h" #include "IVertexBuffer.h"
namespace irr namespace irr
{ {
namespace scene namespace scene
...@@ -17,6 +18,8 @@ namespace scene ...@@ -17,6 +18,8 @@ namespace scene
class IVertexList class IVertexList
{ {
public: public:
virtual ~IVertexList(){};
virtual u32 stride() const =0; virtual u32 stride() const =0;
virtual u32 size() const =0; virtual u32 size() const =0;
...@@ -28,7 +31,7 @@ namespace scene ...@@ -28,7 +31,7 @@ namespace scene
virtual void reallocate(u32 new_size) =0; virtual void reallocate(u32 new_size) =0;
virtual u32 allocated_size() const =0; virtual u32 allocated_size() const =0;
virtual video::S3DVertex* pointer() =0; virtual video::S3DVertex* pointer() =0;
virtual video::E_VERTEX_TYPE getType() =0; virtual video::E_VERTEX_TYPE getType() const =0;
}; };
template <class T> template <class T>
...@@ -63,7 +66,7 @@ namespace scene ...@@ -63,7 +66,7 @@ namespace scene
virtual video::S3DVertex* pointer() {return Vertices.pointer();} 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: public:
...@@ -74,6 +77,15 @@ namespace scene ...@@ -74,6 +77,15 @@ namespace scene
setType(vertexType); 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() virtual ~CVertexBuffer()
{ {
delete Vertices; delete Vertices;
...@@ -118,7 +130,7 @@ namespace scene ...@@ -118,7 +130,7 @@ namespace scene
virtual void* getData() {return Vertices->pointer();} 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();} virtual u32 stride() const {return Vertices->stride();}
......
...@@ -177,6 +177,18 @@ namespace scene ...@@ -177,6 +177,18 @@ namespace scene
return getVertexBuffer()[i].Pos; 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 //! returns normal of vertex i
virtual const core::vector3df& getNormal(u32 i) const virtual const core::vector3df& getNormal(u32 i) const
{ {
...@@ -196,3 +208,4 @@ namespace scene ...@@ -196,3 +208,4 @@ namespace scene
#endif #endif
...@@ -27,7 +27,7 @@ namespace scene ...@@ -27,7 +27,7 @@ namespace scene
virtual void* getData() =0; 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 void setType(video::E_INDEX_TYPE IndexType) =0;
virtual u32 stride() const =0; virtual u32 stride() const =0;
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "SMaterial.h" #include "SMaterial.h"
#include "aabbox3d.h" #include "aabbox3d.h"
#include "S3DVertex.h" #include "S3DVertex.h"
#include "SVertexIndex.h"
#include "EHardwareBufferFlags.h" #include "EHardwareBufferFlags.h"
namespace irr namespace irr
...@@ -102,6 +103,10 @@ namespace scene ...@@ -102,6 +103,10 @@ namespace scene
/** \return Number of vertices in this buffer. */ /** \return Number of vertices in this buffer. */
virtual u32 getVertexCount() const = 0; 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. //! Get access to Indices.
/** \return Pointer to indices array. */ /** \return Pointer to indices array. */
virtual const u16* getIndices() const = 0; virtual const u16* getIndices() const = 0;
...@@ -158,10 +163,13 @@ namespace scene ...@@ -158,10 +163,13 @@ namespace scene
virtual void append(const IMeshBuffer* const other) = 0; virtual void append(const IMeshBuffer* const other) = 0;
//! get the current hardware mapping hint //! 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 //! 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 //! flags the meshbuffer as changed, reloads hardware buffers
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) = 0; virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) = 0;
...@@ -174,8 +182,6 @@ namespace scene ...@@ -174,8 +182,6 @@ namespace scene
//! Get the currently used ID for identification of changes. //! Get the currently used ID for identification of changes.
/** This shouldn't be used for anything outside the VideoDriver. */ /** This shouldn't be used for anything outside the VideoDriver. */
virtual const u32 getChangedID_Index() const = 0; virtual const u32 getChangedID_Index() const = 0;
u32 HardwareHint;
}; };
} // end namespace scene } // end namespace scene
...@@ -183,3 +189,4 @@ namespace scene ...@@ -183,3 +189,4 @@ namespace scene
#endif #endif
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
#include "ETerrainElements.h" #include "ETerrainElements.h"
#include "ISceneNode.h" #include "ISceneNode.h"
#include "SMeshBufferLightMap.h" #include "IDynamicMeshBuffer.h"
#include "irrArray.h" #include "irrArray.h"
namespace irr namespace irr
...@@ -84,7 +84,7 @@ namespace scene ...@@ -84,7 +84,7 @@ namespace scene
//! Gets the meshbuffer data based on a specified level of detail. //! Gets the meshbuffer data based on a specified level of detail.
/** \param mb A reference to an SMeshBuffer object /** \param mb A reference to an SMeshBuffer object
\param LOD The level of detail you want the indices from. */ \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. //! Gets the indices for a specified patch at a specified Level of Detail.
/** \param indices A reference to an array of u32 indices. /** \param indices A reference to an array of u32 indices.
......
...@@ -18,7 +18,7 @@ namespace scene ...@@ -18,7 +18,7 @@ namespace scene
{ {
public: public:
virtual void* getData() =0; 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 void setType(video::E_VERTEX_TYPE vertexType) =0;
virtual u32 stride() const =0; virtual u32 stride() const =0;
virtual u32 size() const =0; virtual u32 size() const =0;
......
...@@ -326,8 +326,8 @@ namespace video ...@@ -326,8 +326,8 @@ namespace video
\param vType Vertex type, e.g. EVT_STANDARD for S3DVertex. \param vType Vertex type, e.g. EVT_STANDARD for S3DVertex.
\param pType Primitive type, e.g. EPT_TRIANGLE_FAN for a triangle fan. */ \param pType Primitive type, e.g. EPT_TRIANGLE_FAN for a triangle fan. */
virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount, virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primCount, const void* indexList, u32 primCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType) = 0; E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType) = 0;
//! Draws an indexed triangle list. //! Draws an indexed triangle list.
/** Note that there may be at maximum 65536 vertices, because /** Note that there may be at maximum 65536 vertices, because
...@@ -634,7 +634,7 @@ namespace video ...@@ -634,7 +634,7 @@ namespace video
available with D3D and vertex fog. */ available with D3D and vertex fog. */
virtual void setFog(SColor color=SColor(0,255,255,255), virtual void setFog(SColor color=SColor(0,255,255,255),
bool linearFog=true, f32 start=50.0f, f32 end=100.0f, 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; bool pixelFog=false, bool rangeFog=false) = 0;
//! Get the current color format of the color buffer //! Get the current color format of the color buffer
...@@ -966,3 +966,4 @@ namespace video ...@@ -966,3 +966,4 @@ namespace video
#endif #endif
...@@ -795,8 +795,8 @@ const core::rect<s32>& CD3D8Driver::getViewPort() const ...@@ -795,8 +795,8 @@ const core::rect<s32>& CD3D8Driver::getViewPort() const
//! draws a vertex primitive list //! draws a vertex primitive list
void CD3D8Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, void CD3D8Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount, const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType) E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType)
{ {
if (!checkPrimitiveCount(primitiveCount)) if (!checkPrimitiveCount(primitiveCount))
return; return;
......
...@@ -67,8 +67,8 @@ namespace video ...@@ -67,8 +67,8 @@ namespace video
//! draws a vertex primitive list //! draws a vertex primitive list
void drawVertexPrimitiveList(const void* vertices, u32 vertexCount, void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount, const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType); 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. //! 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, virtual void draw2DImage(const video::ITexture* texture, const core::position2d<s32>& destPos,
......
...@@ -859,7 +859,7 @@ bool CD3D9Driver::updateVertexHardwareBuffer(SHWBufferLink_d3d9 *HWBuffer) ...@@ -859,7 +859,7 @@ bool CD3D9Driver::updateVertexHardwareBuffer(SHWBufferLink_d3d9 *HWBuffer)
} }
flags = D3DUSAGE_WRITEONLY; // SIO2: Default to D3DUSAGE_WRITEONLY flags = D3DUSAGE_WRITEONLY; // SIO2: Default to D3DUSAGE_WRITEONLY
if(HWBuffer->Mapped != scene::EHM_STATIC) if(HWBuffer->Mapped_Vertex != scene::EHM_STATIC)
flags |= D3DUSAGE_DYNAMIC; flags |= D3DUSAGE_DYNAMIC;
pID3DDevice->CreateVertexBuffer(vertexCount * vertexSize, flags, FVF, D3DPOOL_DEFAULT, &HWBuffer->vertexBuffer, NULL); pID3DDevice->CreateVertexBuffer(vertexCount * vertexSize, flags, FVF, D3DPOOL_DEFAULT, &HWBuffer->vertexBuffer, NULL);
...@@ -868,7 +868,7 @@ bool CD3D9Driver::updateVertexHardwareBuffer(SHWBufferLink_d3d9 *HWBuffer) ...@@ -868,7 +868,7 @@ bool CD3D9Driver::updateVertexHardwareBuffer(SHWBufferLink_d3d9 *HWBuffer)
return false; return false;
flags = 0; // SIO2: Reset flags before Lock flags = 0; // SIO2: Reset flags before Lock
if(HWBuffer->Mapped != scene::EHM_STATIC) if(HWBuffer->Mapped_Vertex != scene::EHM_STATIC)
flags = D3DLOCK_DISCARD; flags = D3DLOCK_DISCARD;
HWBuffer->vertexBuffer->Lock(0, vertexCount * vertexSize, (void**)&pLockedBuffer, flags); HWBuffer->vertexBuffer->Lock(0, vertexCount * vertexSize, (void**)&pLockedBuffer, flags);
...@@ -896,24 +896,42 @@ bool CD3D9Driver::updateIndexHardwareBuffer(SHWBufferLink_d3d9 *HWBuffer) ...@@ -896,24 +896,42 @@ bool CD3D9Driver::updateIndexHardwareBuffer(SHWBufferLink_d3d9 *HWBuffer)
const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer; const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer;
const u16* indices=mb->getIndices(); const u16* indices=mb->getIndices();
const u32 indexCount=mb->getIndexCount(); 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) if (!HWBuffer->indexBuffer || indexSize * indexCount > HWBuffer->indexBufferSize)
{ {
D3DFORMAT idxFormat = D3DFMT_INDEX16;
DWORD flags = 0; DWORD flags = 0;
flags = D3DUSAGE_WRITEONLY; // SIO2: Default to D3DUSAGE_WRITEONLY 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 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; return false;
void* pIndices = 0; void* pIndices = 0;
flags = 0; // SIO2: Reset flags before Lock flags = 0; // SIO2: Reset flags before Lock
if(HWBuffer->Mapped != scene::EHM_STATIC) if(HWBuffer->Mapped_Index != scene::EHM_STATIC)
flags = D3DLOCK_DISCARD; flags = D3DLOCK_DISCARD;
if(FAILED(HWBuffer->indexBuffer->Lock( 0, 0, (void**)&pIndices, flags))) if(FAILED(HWBuffer->indexBuffer->Lock( 0, 0, (void**)&pIndices, flags)))
...@@ -944,30 +962,33 @@ bool CD3D9Driver::updateHardwareBuffer(SHWBufferLink *HWBuffer) ...@@ -944,30 +962,33 @@ bool CD3D9Driver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
if (!HWBuffer) if (!HWBuffer)
return false; return false;
if (HWBuffer->ChangedID_Vertex != HWBuffer->MeshBuffer->getChangedID_Vertex() if (HWBuffer->Mapped_Vertex!=scene::EHM_NEVER)
|| !((SHWBufferLink_d3d9*)HWBuffer)->vertexBuffer)
{ {
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)) if (!updateVertexHardwareBuffer((SHWBufferLink_d3d9*)HWBuffer))
return false; return false;
}
} }
if (HWBuffer->Mapped_Index!=scene::EHM_NEVER)
if (HWBuffer->ChangedID_Index != HWBuffer->MeshBuffer->getChangedID_Index()
|| !((SHWBufferLink_d3d9*)HWBuffer)->indexBuffer)
{ {
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)) if (!updateIndexHardwareBuffer((SHWBufferLink_d3d9*)HWBuffer))
return false; return false;
}
} }
return true; return true;
} }
...@@ -975,7 +996,7 @@ bool CD3D9Driver::updateHardwareBuffer(SHWBufferLink *HWBuffer) ...@@ -975,7 +996,7 @@ bool CD3D9Driver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
//! Create hardware buffer from meshbuffer //! Create hardware buffer from meshbuffer
CD3D9Driver::SHWBufferLink *CD3D9Driver::createHardwareBuffer(const scene::IMeshBuffer* mb) 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; return 0;
SHWBufferLink_d3d9 *HWBuffer=new SHWBufferLink_d3d9(mb); SHWBufferLink_d3d9 *HWBuffer=new SHWBufferLink_d3d9(mb);
...@@ -985,7 +1006,8 @@ CD3D9Driver::SHWBufferLink *CD3D9Driver::createHardwareBuffer(const scene::IMesh ...@@ -985,7 +1006,8 @@ CD3D9Driver::SHWBufferLink *CD3D9Driver::createHardwareBuffer(const scene::IMesh
HWBuffer->ChangedID_Vertex=HWBuffer->MeshBuffer->getChangedID_Vertex(); HWBuffer->ChangedID_Vertex=HWBuffer->MeshBuffer->getChangedID_Vertex();
HWBuffer->ChangedID_Index=HWBuffer->MeshBuffer->getChangedID_Index(); 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->LastUsed=0;
HWBuffer->vertexBuffer=0; HWBuffer->vertexBuffer=0;
HWBuffer->indexBuffer=0; HWBuffer->indexBuffer=0;
...@@ -1041,7 +1063,7 @@ void CD3D9Driver::drawHardwareBuffer(SHWBufferLink *_HWBuffer) ...@@ -1041,7 +1063,7 @@ void CD3D9Driver::drawHardwareBuffer(SHWBufferLink *_HWBuffer)
if (HWBuffer->vertexBuffer) pID3DDevice->SetStreamSource(0, HWBuffer->vertexBuffer, 0, stride); if (HWBuffer->vertexBuffer) pID3DDevice->SetStreamSource(0, HWBuffer->vertexBuffer, 0, stride);
if (HWBuffer->indexBuffer) pID3DDevice->SetIndices(HWBuffer->indexBuffer); 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->vertexBuffer) pID3DDevice->SetStreamSource(0, 0, 0, 0);
if (HWBuffer->indexBuffer) pID3DDevice->SetIndices(0); if (HWBuffer->indexBuffer) pID3DDevice->SetIndices(0);
...@@ -1049,13 +1071,13 @@ void CD3D9Driver::drawHardwareBuffer(SHWBufferLink *_HWBuffer) ...@@ -1049,13 +1071,13 @@ void CD3D9Driver::drawHardwareBuffer(SHWBufferLink *_HWBuffer)
//! draws a vertex primitive list //! draws a vertex primitive list
void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount, const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType) E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType)
{ {
if (!checkPrimitiveCount(primitiveCount)) if (!checkPrimitiveCount(primitiveCount))
return; return;
CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType); CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType,iType);
if (!vertexCount || !primitiveCount) if (!vertexCount || !primitiveCount)
return; return;
...@@ -1064,6 +1086,25 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, ...@@ -1064,6 +1086,25 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u32 stride = getVertexPitchFromType(vType); 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()) if (setRenderStates3DMode())
{ {
switch (pType) switch (pType)
...@@ -1089,7 +1130,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, ...@@ -1089,7 +1130,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
else else
{ {
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_POINTLIST, 0, vertexCount, pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_POINTLIST, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride); primitiveCount, indexList, indexType, vertices, stride);
} }
pID3DDevice->SetRenderState(D3DRS_POINTSCALEENABLE, FALSE); pID3DDevice->SetRenderState(D3DRS_POINTSCALEENABLE, FALSE);
...@@ -1105,7 +1146,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, ...@@ -1105,7 +1146,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
else else
{ {
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINESTRIP, 0, vertexCount, pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINESTRIP, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride); primitiveCount, indexList, indexType, vertices, stride);
} }
break; break;
case scene::EPT_LINE_LOOP: case scene::EPT_LINE_LOOP:
...@@ -1121,12 +1162,12 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, ...@@ -1121,12 +1162,12 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
else else
{ {
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINESTRIP, 0, vertexCount, pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINESTRIP, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride); primitiveCount, indexList, indexType, vertices, stride);
u16 tmpIndices[] = {0, primitiveCount}; u16 tmpIndices[] = {0, primitiveCount};
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINELIST, 0, vertexCount, pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINELIST, 0, vertexCount,
1, tmpIndices, D3DFMT_INDEX16, vertices, stride); 1, tmpIndices, indexType, vertices, stride);
} }
break; break;
case scene::EPT_LINES: case scene::EPT_LINES:
...@@ -1137,7 +1178,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, ...@@ -1137,7 +1178,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
else else
{ {
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINELIST, 0, vertexCount, pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINELIST, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride); primitiveCount, indexList, indexType, vertices, stride);
} }
break; break;
case scene::EPT_TRIANGLE_STRIP: case scene::EPT_TRIANGLE_STRIP:
...@@ -1148,7 +1189,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, ...@@ -1148,7 +1189,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
else else
{ {
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLESTRIP, 0, vertexCount, pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLESTRIP, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride); primitiveCount, indexList, indexType, vertices, stride);
} }
break; break;
case scene::EPT_TRIANGLE_FAN: case scene::EPT_TRIANGLE_FAN:
...@@ -1159,7 +1200,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, ...@@ -1159,7 +1200,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
else else
{ {
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLEFAN, 0, vertexCount, pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLEFAN, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride); primitiveCount, indexList, indexType, vertices, stride);
} }
break; break;
case scene::EPT_TRIANGLES: case scene::EPT_TRIANGLES:
...@@ -1170,7 +1211,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, ...@@ -1170,7 +1211,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
else else
{ {
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, vertexCount, pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, vertexCount,
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride); primitiveCount, indexList, indexType, vertices, stride);
} }
break; break;
} }
......
...@@ -87,8 +87,8 @@ namespace video ...@@ -87,8 +87,8 @@ namespace video
//! draws a vertex primitive list //! draws a vertex primitive list
virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount, virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount, const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType); 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. //! 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, virtual void draw2DImage(const video::ITexture* texture, const core::position2d<s32>& destPos,
......
...@@ -104,7 +104,7 @@ void CGUIMeshViewer::draw() ...@@ -104,7 +104,7 @@ void CGUIMeshViewer::draw()
viewPort.clipAgainst(AbsoluteClippingRect); viewPort.clipAgainst(AbsoluteClippingRect);
// draw the frame // draw the frame
core::rect<s32> frameRect(AbsoluteRect); core::rect<s32> frameRect(AbsoluteRect);
frameRect.LowerRightCorner.Y = frameRect.UpperLeftCorner.Y + 1; frameRect.LowerRightCorner.Y = frameRect.UpperLeftCorner.Y + 1;
skin->draw2DRectangle(this, skin->getColor(EGDC_3D_SHADOW), frameRect, &AbsoluteClippingRect); skin->draw2DRectangle(this, skin->getColor(EGDC_3D_SHADOW), frameRect, &AbsoluteClippingRect);
...@@ -157,7 +157,7 @@ void CGUIMeshViewer::draw() ...@@ -157,7 +157,7 @@ void CGUIMeshViewer::draw()
driver->drawVertexPrimitiveList(mb->getVertices(), driver->drawVertexPrimitiveList(mb->getVertices(),
mb->getVertexCount(), mb->getIndices(), mb->getVertexCount(), mb->getIndices(),
mb->getIndexCount()/ 3, mb->getVertexType(), mb->getIndexCount()/ 3, mb->getVertexType(),
scene::EPT_TRIANGLES); scene::EPT_TRIANGLES, mb->getIndexType());
} }
driver->setViewPort(oldViewPort); driver->setViewPort(oldViewPort);
...@@ -172,3 +172,4 @@ void CGUIMeshViewer::draw() ...@@ -172,3 +172,4 @@ void CGUIMeshViewer::draw()
#endif // _IRR_COMPILE_WITH_GUI_ #endif // _IRR_COMPILE_WITH_GUI_
...@@ -502,7 +502,7 @@ const core::rect<s32>& CNullDriver::getViewPort() const ...@@ -502,7 +502,7 @@ const core::rect<s32>& CNullDriver::getViewPort() const
//! draws a vertex primitive list //! 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; PrimitivesDrawn += primitiveCount;
} }
...@@ -512,7 +512,7 @@ void CNullDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, ...@@ -512,7 +512,7 @@ void CNullDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
//! draws an indexed triangle list //! draws an indexed triangle list
inline void CNullDriver::drawIndexedTriangleList(const S3DVertex* vertices, u32 vertexCount, const u16* indexList, u32 triangleCount) 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 ...@@ -520,7 +520,7 @@ inline void CNullDriver::drawIndexedTriangleList(const S3DVertex* vertices, u32
//! draws an indexed triangle list //! draws an indexed triangle list
inline void CNullDriver::drawIndexedTriangleList(const S3DVertex2TCoords* vertices, u32 vertexCount, const u16* indexList, u32 triangleCount) 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 ...@@ -528,7 +528,7 @@ inline void CNullDriver::drawIndexedTriangleList(const S3DVertex2TCoords* vertic
inline void CNullDriver::drawIndexedTriangleList(const S3DVertexTangents* vertices, inline void CNullDriver::drawIndexedTriangleList(const S3DVertexTangents* vertices,
u32 vertexCount, const u16* indexList, u32 triangleCount) 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 ...@@ -537,7 +537,7 @@ inline void CNullDriver::drawIndexedTriangleList(const S3DVertexTangents* vertic
inline void CNullDriver::drawIndexedTriangleFan(const S3DVertex* vertices, inline void CNullDriver::drawIndexedTriangleFan(const S3DVertex* vertices,
u32 vertexCount, const u16* indexList, u32 triangleCount) 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, ...@@ -546,7 +546,7 @@ inline void CNullDriver::drawIndexedTriangleFan(const S3DVertex* vertices,
inline void CNullDriver::drawIndexedTriangleFan(const S3DVertex2TCoords* vertices, inline void CNullDriver::drawIndexedTriangleFan(const S3DVertex2TCoords* vertices,
u32 vertexCount, const u16* indexList, u32 triangleCount) 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 ...@@ -555,7 +555,7 @@ inline void CNullDriver::drawIndexedTriangleFan(const S3DVertex2TCoords* vertice
inline void CNullDriver::drawIndexedTriangleFan(const S3DVertexTangents* vertices, inline void CNullDriver::drawIndexedTriangleFan(const S3DVertexTangents* vertices,
u32 vertexCount, const u16* indexList, u32 triangleCount) 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) ...@@ -1278,7 +1278,7 @@ void CNullDriver::drawMeshBuffer(const scene::IMeshBuffer* mb)
if (HWBuffer) if (HWBuffer)
drawHardwareBuffer(HWBuffer); drawHardwareBuffer(HWBuffer);
else 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) CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer* mb)
...@@ -1337,7 +1337,7 @@ void CNullDriver::removeAllHardwareBuffers() ...@@ -1337,7 +1337,7 @@ void CNullDriver::removeAllHardwareBuffers()
bool CNullDriver::isHardwareBufferRecommend(const scene::IMeshBuffer* mb) 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; return false;
if (mb->getVertexCount()<500) //todo: tweak and make user definable if (mb->getVertexCount()<500) //todo: tweak and make user definable
...@@ -1874,3 +1874,4 @@ void CNullDriver::enableClipPlane(u32 index, bool enable) ...@@ -1874,3 +1874,4 @@ void CNullDriver::enableClipPlane(u32 index, bool enable)
} // end namespace } // end namespace
} // end namespace } // end namespace
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "IMeshBuffer.h" #include "IMeshBuffer.h"
#include "CFPSCounter.h" #include "CFPSCounter.h"
#include "S3DVertex.h" #include "S3DVertex.h"
#include "SVertexIndex.h"
#include "SLight.h" #include "SLight.h"
#include "SExposedVideoData.h" #include "SExposedVideoData.h"
...@@ -86,8 +87,8 @@ namespace video ...@@ -86,8 +87,8 @@ namespace video
//! draws a vertex primitive list //! draws a vertex primitive list
virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount, virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount, const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType); E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType);
//! draws an indexed triangle list //! draws an indexed triangle list
virtual void drawIndexedTriangleList(const S3DVertex* vertices, u32 vertexCount, const u16* indexList, u32 triangleCount); virtual void drawIndexedTriangleList(const S3DVertex* vertices, u32 vertexCount, const u16* indexList, u32 triangleCount);
...@@ -310,7 +311,7 @@ namespace video ...@@ -310,7 +311,7 @@ namespace video
protected: protected:
struct SHWBufferLink 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) if (MeshBuffer)
MeshBuffer->grab(); MeshBuffer->grab();
...@@ -327,7 +328,8 @@ namespace video ...@@ -327,7 +328,8 @@ namespace video
u32 ChangedID_Vertex; u32 ChangedID_Vertex;
u32 ChangedID_Index; u32 ChangedID_Index;
u32 LastUsed; 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) //! Gets hardware buffer link from a meshbuffer (may create or update buffer)
...@@ -452,7 +454,7 @@ namespace video ...@@ -452,7 +454,7 @@ namespace video
//! Returns a pointer to the mesh manipulator. //! Returns a pointer to the mesh manipulator.
virtual scene::IMeshManipulator* getMeshManipulator(); virtual scene::IMeshManipulator* getMeshManipulator();
//! Clears the ZBuffer. //! Clears the ZBuffer.
virtual void clearZBuffer(); virtual void clearZBuffer();
...@@ -612,3 +614,4 @@ namespace video ...@@ -612,3 +614,4 @@ namespace video
#endif #endif
...@@ -638,9 +638,9 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -638,9 +638,9 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
{ {
HWBuffer->vbo_verticesSize = vertexCount*vertexSize; 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); 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); extGlBufferData(GL_ARRAY_BUFFER, vertexCount * vertexSize, buffer.const_pointer(), GL_DYNAMIC_DRAW);
else //scene::EHM_STREAM else //scene::EHM_STREAM
extGlBufferData(GL_ARRAY_BUFFER, vertexCount * vertexSize, buffer.const_pointer(), GL_STREAM_DRAW); extGlBufferData(GL_ARRAY_BUFFER, vertexCount * vertexSize, buffer.const_pointer(), GL_STREAM_DRAW);
...@@ -666,9 +666,28 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -666,9 +666,28 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
#if defined(GL_ARB_vertex_buffer_object) #if defined(GL_ARB_vertex_buffer_object)
const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer; const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer;
const u16* indices=mb->getIndices(); const void* indices=mb->getIndices();
u32 indexCount= mb->getIndexCount(); 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 //get or create buffer
bool newBuffer=false; bool newBuffer=false;
...@@ -693,9 +712,9 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -693,9 +712,9 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
{ {
HWBuffer->vbo_indicesSize = indexCount*indexSize; 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); 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); extGlBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * indexSize, indices, GL_DYNAMIC_DRAW);
else //scene::EHM_STREAM else //scene::EHM_STREAM
extGlBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * indexSize, indices, GL_STREAM_DRAW); extGlBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * indexSize, indices, GL_STREAM_DRAW);
...@@ -716,24 +735,30 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer) ...@@ -716,24 +735,30 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
if (!HWBuffer) if (!HWBuffer)
return false; return false;
if (HWBuffer->ChangedID_Vertex != HWBuffer->MeshBuffer->getChangedID_Vertex() if (HWBuffer->Mapped_Vertex!=scene::EHM_NEVER)
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_verticesID)
{ {
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)) if (!updateVertexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
return false; return false;
}
} }
if (HWBuffer->ChangedID_Index != HWBuffer->MeshBuffer->getChangedID_Index() if (HWBuffer->Mapped_Index!=scene::EHM_NEVER)
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_indicesID)
{ {
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)) if (!updateIndexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
return false; return false;
}
} }
return true; return true;
...@@ -744,7 +769,7 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer) ...@@ -744,7 +769,7 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::IMeshBuffer* mb) COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::IMeshBuffer* mb)
{ {
#if defined(GL_ARB_vertex_buffer_object) #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; return 0;
SHWBufferLink_opengl *HWBuffer=new SHWBufferLink_opengl(mb); SHWBufferLink_opengl *HWBuffer=new SHWBufferLink_opengl(mb);
...@@ -754,7 +779,8 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I ...@@ -754,7 +779,8 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I
HWBuffer->ChangedID_Vertex=HWBuffer->MeshBuffer->getChangedID_Vertex(); HWBuffer->ChangedID_Vertex=HWBuffer->MeshBuffer->getChangedID_Vertex();
HWBuffer->ChangedID_Index=HWBuffer->MeshBuffer->getChangedID_Index(); 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->LastUsed=0;
HWBuffer->vbo_verticesID=0; HWBuffer->vbo_verticesID=0;
HWBuffer->vbo_indicesID=0; HWBuffer->vbo_indicesID=0;
...@@ -813,13 +839,33 @@ void COpenGLDriver::drawHardwareBuffer(SHWBufferLink *_HWBuffer) ...@@ -813,13 +839,33 @@ void COpenGLDriver::drawHardwareBuffer(SHWBufferLink *_HWBuffer)
#if defined(GL_ARB_vertex_buffer_object) #if defined(GL_ARB_vertex_buffer_object)
const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer; 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 #endif
} }
...@@ -833,16 +879,17 @@ static inline u8* buffer_offset(const long offset) ...@@ -833,16 +879,17 @@ static inline u8* buffer_offset(const long offset)
//! draws a vertex primitive list //! draws a vertex primitive list
void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount, const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType) E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType)
{ {
if (!primitiveCount || !vertexCount) if (!primitiveCount || !vertexCount)
return; return;
if (!checkPrimitiveCount(primitiveCount)) if (!checkPrimitiveCount(primitiveCount))
return; return;
CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType); CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType, iType);
if (vertices) if (vertices)
{ {
...@@ -989,6 +1036,22 @@ void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCoun ...@@ -989,6 +1036,22 @@ void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCoun
break; break;
} }
GLenum indexSize=0;
switch (iType)
{
case (EIT_16BIT):
{
indexSize=GL_UNSIGNED_SHORT;
break;
}
case (EIT_32BIT):
{
indexSize=GL_UNSIGNED_INT;
break;
}
}
switch (pType) switch (pType)
{ {
case scene::EPT_POINTS: case scene::EPT_POINTS:
...@@ -1022,31 +1085,31 @@ void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCoun ...@@ -1022,31 +1085,31 @@ void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCoun
} }
break; break;
case scene::EPT_LINE_STRIP: case scene::EPT_LINE_STRIP:
glDrawElements(GL_LINE_STRIP, primitiveCount+1, GL_UNSIGNED_SHORT, indexList); glDrawElements(GL_LINE_STRIP, primitiveCount+1, indexSize, indexList);
break; break;
case scene::EPT_LINE_LOOP: case scene::EPT_LINE_LOOP:
glDrawElements(GL_LINE_LOOP, primitiveCount, GL_UNSIGNED_SHORT, indexList); glDrawElements(GL_LINE_LOOP, primitiveCount, indexSize, indexList);
break; break;
case scene::EPT_LINES: case scene::EPT_LINES:
glDrawElements(GL_LINES, primitiveCount*2, GL_UNSIGNED_SHORT, indexList); glDrawElements(GL_LINES, primitiveCount*2, indexSize, indexList);
break; break;
case scene::EPT_TRIANGLE_STRIP: case scene::EPT_TRIANGLE_STRIP:
glDrawElements(GL_TRIANGLE_STRIP, primitiveCount+2, GL_UNSIGNED_SHORT, indexList); glDrawElements(GL_TRIANGLE_STRIP, primitiveCount+2, indexSize, indexList);
break; break;
case scene::EPT_TRIANGLE_FAN: case scene::EPT_TRIANGLE_FAN:
glDrawElements(GL_TRIANGLE_FAN, primitiveCount+2, GL_UNSIGNED_SHORT, indexList); glDrawElements(GL_TRIANGLE_FAN, primitiveCount+2, indexSize, indexList);
break; break;
case scene::EPT_TRIANGLES: case scene::EPT_TRIANGLES:
glDrawElements(GL_TRIANGLES, primitiveCount*3, GL_UNSIGNED_SHORT, indexList); glDrawElements(GL_TRIANGLES, primitiveCount*3, indexSize, indexList);
break; break;
case scene::EPT_QUAD_STRIP: 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; break;
case scene::EPT_QUADS: case scene::EPT_QUADS:
glDrawElements(GL_QUADS, primitiveCount*4, GL_UNSIGNED_SHORT, indexList); glDrawElements(GL_QUADS, primitiveCount*4, indexSize, indexList);
break; break;
case scene::EPT_POLYGON: case scene::EPT_POLYGON:
glDrawElements(GL_POLYGON, primitiveCount, GL_UNSIGNED_SHORT, indexList); glDrawElements(GL_POLYGON, primitiveCount, indexSize, indexList);
break; break;
} }
...@@ -2776,3 +2839,4 @@ IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params, ...@@ -2776,3 +2839,4 @@ IVideoDriver* createOpenGLDriver(const SIrrlichtCreationParameters& params,
} // end namespace } // end namespace
} // end namespace } // end namespace
...@@ -136,8 +136,8 @@ namespace video ...@@ -136,8 +136,8 @@ namespace video
//! draws a vertex primitive list //! draws a vertex primitive list
virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount, virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount, const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType); 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 //! queries the features of the driver, returns true if feature is available
virtual bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const virtual bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const
...@@ -416,3 +416,4 @@ namespace video ...@@ -416,3 +416,4 @@ namespace video
...@@ -352,7 +352,7 @@ void CParticleSystemSceneNode::render() ...@@ -352,7 +352,7 @@ void CParticleSystemSceneNode::render()
driver->setMaterial(Buffer->Material); driver->setMaterial(Buffer->Material);
driver->drawVertexPrimitiveList(Buffer->getVertices(), Particles.size()*4, 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: // for debug purposes only:
if ( DebugDataVisible & scene::EDS_BBOX ) if ( DebugDataVisible & scene::EDS_BBOX )
...@@ -632,3 +632,4 @@ void CParticleSystemSceneNode::deserializeAttributes(io::IAttributes* in, io::SA ...@@ -632,3 +632,4 @@ void CParticleSystemSceneNode::deserializeAttributes(io::IAttributes* in, io::SA
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
...@@ -379,6 +379,21 @@ void CShadowVolumeSceneNode::render() ...@@ -379,6 +379,21 @@ void CShadowVolumeSceneNode::render()
for (s32 i=0; i<ShadowVolumesUsed; ++i) for (s32 i=0; i<ShadowVolumesUsed; ++i)
driver->drawStencilShadowVolume(ShadowVolumes[i].vertices, driver->drawStencilShadowVolume(ShadowVolumes[i].vertices,
ShadowVolumes[i].count, UseZFailMethod); 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) ...@@ -445,3 +460,4 @@ void CShadowVolumeSceneNode::calculateAdjacency(f32 epsilon)
} // end namespace scene } // end namespace scene
} // end namespace irr } // end namespace irr
...@@ -324,9 +324,30 @@ void CSoftwareDriver::setViewPort(const core::rect<s32>& area) ...@@ -324,9 +324,30 @@ void CSoftwareDriver::setViewPort(const core::rect<s32>& area)
CurrentTriangleRenderer->setRenderTarget(RenderTargetSurface, ViewPort); 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 //! 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; const u16* indexPointer=0;
core::array<u16> newBuffer; core::array<u16> newBuffer;
...@@ -364,7 +385,7 @@ void CSoftwareDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCo ...@@ -364,7 +385,7 @@ void CSoftwareDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCo
} }
return; return;
case scene::EPT_LINE_LOOP: 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) switch (vType)
{ {
case EVT_STANDARD: case EVT_STANDARD:
...@@ -628,7 +649,7 @@ void CSoftwareDriver::drawClippedIndexedTriangleListT(const VERTEXTYPE* vertices ...@@ -628,7 +649,7 @@ void CSoftwareDriver::drawClippedIndexedTriangleListT(const VERTEXTYPE* vertices
// draw triangles // draw triangles
CNullDriver::drawVertexPrimitiveList(clippedVertices.pointer(), clippedVertices.size(), 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()) if (TransformedPoints.size() < clippedVertices.size())
TransformedPoints.set_used(clippedVertices.size()); TransformedPoints.set_used(clippedVertices.size());
......
...@@ -54,8 +54,8 @@ namespace video ...@@ -54,8 +54,8 @@ namespace video
//! draws a vertex primitive list //! draws a vertex primitive list
void drawVertexPrimitiveList(const void* vertices, u32 vertexCount, void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount, const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType); E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType);
//! Draws a 3d line. //! Draws a 3d line.
virtual void draw3DLine(const core::vector3df& start, virtual void draw3DLine(const core::vector3df& start,
...@@ -124,6 +124,13 @@ namespace video ...@@ -124,6 +124,13 @@ namespace video
//! clips a triangle agains the viewing frustum //! clips a triangle agains the viewing frustum
void clipTriangle(f32* transformedPos); 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> template<class VERTEXTYPE>
void drawClippedIndexedTriangleListT(const VERTEXTYPE* vertices, void drawClippedIndexedTriangleListT(const VERTEXTYPE* vertices,
s32 vertexCount, const u16* indexList, s32 triangleCount); s32 vertexCount, const u16* indexList, s32 triangleCount);
...@@ -158,3 +165,4 @@ namespace video ...@@ -158,3 +165,4 @@ namespace video
#endif #endif
...@@ -39,7 +39,7 @@ CBurningVideoDriver::CBurningVideoDriver(const core::dimension2d<s32>& windowSiz ...@@ -39,7 +39,7 @@ CBurningVideoDriver::CBurningVideoDriver(const core::dimension2d<s32>& windowSiz
if (BackBuffer) if (BackBuffer)
{ {
BackBuffer->fill(SColor(0)); BackBuffer->fill(SColor(0));
// create z buffer // create z buffer
DepthBuffer = video::createDepthBuffer(BackBuffer->getDimension()); DepthBuffer = video::createDepthBuffer(BackBuffer->getDimension());
} }
...@@ -96,8 +96,8 @@ CBurningVideoDriver::CBurningVideoDriver(const core::dimension2d<s32>& windowSiz ...@@ -96,8 +96,8 @@ CBurningVideoDriver::CBurningVideoDriver(const core::dimension2d<s32>& windowSiz
addMaterialRenderer ( umr ); // EMT_SPHERE_MAP, addMaterialRenderer ( umr ); // EMT_SPHERE_MAP,
addMaterialRenderer ( smr ); // EMT_REFLECTION_2_LAYER, addMaterialRenderer ( smr ); // EMT_REFLECTION_2_LAYER,
addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_ADD_COLOR, addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_ADD_COLOR,
addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_ALPHA_CHANNEL, addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_ALPHA_CHANNEL,
addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_ALPHA_CHANNEL_REF, addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_ALPHA_CHANNEL_REF,
addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_VERTEX_ALPHA, addMaterialRenderer ( tmr ); // EMT_TRANSPARENT_VERTEX_ALPHA,
addMaterialRenderer ( smr ); // EMT_TRANSPARENT_REFLECTION_2_LAYER, addMaterialRenderer ( smr ); // EMT_TRANSPARENT_REFLECTION_2_LAYER,
addMaterialRenderer ( umr ); // EMT_NORMAL_MAP_SOLID, addMaterialRenderer ( umr ); // EMT_NORMAL_MAP_SOLID,
...@@ -370,7 +370,7 @@ void CBurningVideoDriver::setMaterial(const SMaterial& material) ...@@ -370,7 +370,7 @@ void CBurningVideoDriver::setMaterial(const SMaterial& material)
for (u32 i = 0; i < 2; ++i) 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)); material.getTextureMatrix(i));
} }
...@@ -408,7 +408,7 @@ bool CBurningVideoDriver::endScene( void* windowId, core::rect<s32>* sourceRect ...@@ -408,7 +408,7 @@ bool CBurningVideoDriver::endScene( void* windowId, core::rect<s32>* sourceRect
//! sets a render target //! sets a render target
bool CBurningVideoDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuffer, bool CBurningVideoDriver::setRenderTarget(video::ITexture* texture, bool clearBackBuffer,
bool clearZBuffer, SColor color) bool clearZBuffer, SColor color)
{ {
if (texture && texture->getDriverType() != EDT_BURNINGSVIDEO) if (texture && texture->getDriverType() != EDT_BURNINGSVIDEO)
...@@ -573,7 +573,7 @@ REALINLINE u32 CBurningVideoDriver::clipToFrustumTest ( const s4DVertex * v ) c ...@@ -573,7 +573,7 @@ REALINLINE u32 CBurningVideoDriver::clipToFrustumTest ( const s4DVertex * v ) c
return flag; return flag;
} }
#endif // _MSC_VER #endif // _MSC_VER
u32 CBurningVideoDriver::clipToHyperPlane ( s4DVertex * dest, const s4DVertex * source, u32 inCount, const sVec4 &plane ) u32 CBurningVideoDriver::clipToHyperPlane ( s4DVertex * dest, const s4DVertex * source, u32 inCount, const sVec4 &plane )
{ {
...@@ -898,13 +898,13 @@ void CBurningVideoDriver::VertexCache_fill(const u32 sourceIndex, ...@@ -898,13 +898,13 @@ void CBurningVideoDriver::VertexCache_fill(const u32 sourceIndex,
{ {
/* /*
Generate texture coordinates as linear functions so that: 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 v = Vx*x + Vy*y + Vz*z + Vw
The matrix M for this case is: The matrix M for this case is:
Ux Vx 0 0 Ux Vx 0 0
Uy Vy 0 0 Uy Vy 0 0
Uz Vz 0 0 Uz Vz 0 0
Uw Vw 0 0 Uw Vw 0 0
*/ */
const core::vector2d<f32> *src = &((S3DVertex*) source )->TCoords; const core::vector2d<f32> *src = &((S3DVertex*) source )->TCoords;
...@@ -937,7 +937,7 @@ void CBurningVideoDriver::VertexCache_fill(const u32 sourceIndex, ...@@ -937,7 +937,7 @@ void CBurningVideoDriver::VertexCache_fill(const u32 sourceIndex,
dest[0].flag = dest[1].flag = vSize[VertexCache.vType].Format; dest[0].flag = dest[1].flag = vSize[VertexCache.vType].Format;
// test vertex // test vertex
dest[0].flag |= clipToFrustumTest ( dest); dest[0].flag |= clipToFrustumTest ( dest);
// to DC Space, project homogenous vertex // to DC Space, project homogenous vertex
...@@ -1075,8 +1075,8 @@ REALINLINE void CBurningVideoDriver::VertexCache_get2 ( s4DVertex ** face ) ...@@ -1075,8 +1075,8 @@ REALINLINE void CBurningVideoDriver::VertexCache_get2 ( s4DVertex ** face )
} }
void CBurningVideoDriver::VertexCache_reset ( const void* vertices, u32 vertexCount, void CBurningVideoDriver::VertexCache_reset ( const void* vertices, u32 vertexCount,
const u16* indices, u32 primitiveCount, const u16* indices, u32 primitiveCount,
E_VERTEX_TYPE vType,scene::E_PRIMITIVE_TYPE pType ) E_VERTEX_TYPE vType,scene::E_PRIMITIVE_TYPE pType )
{ {
VertexCache.vertices = vertices; VertexCache.vertices = vertices;
...@@ -1106,13 +1106,37 @@ void CBurningVideoDriver::VertexCache_reset ( const void* vertices, u32 vertexCo ...@@ -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 //! 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)) if (!checkPrimitiveCount(primitiveCount))
return; return;
CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType); CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType, EIT_16BIT);
if ( 0 == CurrentShader ) if ( 0 == CurrentShader )
return; return;
...@@ -1194,7 +1218,7 @@ void CBurningVideoDriver::drawVertexPrimitiveList(const void* vertices, u32 vert ...@@ -1194,7 +1218,7 @@ void CBurningVideoDriver::drawVertexPrimitiveList(const void* vertices, u32 vert
u32 flag; u32 flag;
const char * name; const char * name;
}; };
SCheck check[5]; SCheck check[5];
check[0].flag = face[0]->flag; check[0].flag = face[0]->flag;
check[0].name = "face0"; check[0].name = "face0";
...@@ -1464,7 +1488,7 @@ void CBurningVideoDriver::lightVertex ( s4DVertex *dest, const S3DVertex *source ...@@ -1464,7 +1488,7 @@ void CBurningVideoDriver::lightVertex ( s4DVertex *dest, const S3DVertex *source
lightHalf.y = vp.y - vertexEyeSpaceUnit.y; lightHalf.y = vp.y - vertexEyeSpaceUnit.y;
lightHalf.z = vp.z - vertexEyeSpaceUnit.z; lightHalf.z = vp.z - vertexEyeSpaceUnit.z;
lightHalf.normalize_xyz(); lightHalf.normalize_xyz();
} break; } break;
case video::ELT_DIRECTIONAL: case video::ELT_DIRECTIONAL:
...@@ -1520,8 +1544,8 @@ void CBurningVideoDriver::lightVertex ( s4DVertex *dest, const S3DVertex *source ...@@ -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. //! 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, void CBurningVideoDriver::draw2DImage(const video::ITexture* texture, const core::position2d<s32>& destPos,
const core::rect<s32>& sourceRect, const core::rect<s32>& sourceRect,
const core::rect<s32>* clipRect, SColor color, const core::rect<s32>* clipRect, SColor color,
bool useAlphaChannelOfTexture) bool useAlphaChannelOfTexture)
{ {
if (texture) if (texture)
...@@ -1543,7 +1567,7 @@ void CBurningVideoDriver::draw2DImage(const video::ITexture* texture, const core ...@@ -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, void CBurningVideoDriver::draw2DLine(const core::position2d<s32>& start,
const core::position2d<s32>& end, const core::position2d<s32>& end,
SColor color) SColor color)
...@@ -1562,7 +1586,7 @@ void CBurningVideoDriver::draw2DRectangle(SColor color, const core::rect<s32>& p ...@@ -1562,7 +1586,7 @@ void CBurningVideoDriver::draw2DRectangle(SColor color, const core::rect<s32>& p
p.clipAgainst(*clip); p.clipAgainst(*clip);
if(!p.isValid()) if(!p.isValid())
return; return;
BackBuffer->drawRectangle(p, color); BackBuffer->drawRectangle(p, color);
...@@ -1824,11 +1848,11 @@ ITexture* CBurningVideoDriver::createRenderTargetTexture(const core::dimension2d ...@@ -1824,11 +1848,11 @@ ITexture* CBurningVideoDriver::createRenderTargetTexture(const core::dimension2d
ITexture* tex = new CSoftwareTexture2(img, name, false, true); ITexture* tex = new CSoftwareTexture2(img, name, false, true);
img->drop(); img->drop();
return tex; return tex;
} }
//! Clears the DepthBuffer. //! Clears the DepthBuffer.
void CBurningVideoDriver::clearZBuffer() void CBurningVideoDriver::clearZBuffer()
{ {
if (DepthBuffer) if (DepthBuffer)
......
...@@ -70,8 +70,8 @@ namespace video ...@@ -70,8 +70,8 @@ namespace video
//! draws a vertex primitive list //! draws a vertex primitive list
void drawVertexPrimitiveList(const void* vertices, u32 vertexCount, void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const u16* indexList, u32 primitiveCount, const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType); 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. //! 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, virtual void draw2DImage(const video::ITexture* texture, const core::position2d<s32>& destPos,
...@@ -139,6 +139,12 @@ namespace video ...@@ -139,6 +139,12 @@ namespace video
protected: 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 //! sets a render target
void setRenderTarget(video::CImage* image); void setRenderTarget(video::CImage* image);
...@@ -245,3 +251,4 @@ namespace video ...@@ -245,3 +251,4 @@ namespace video
#endif #endif
This diff is collapsed.
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "ITerrainSceneNode.h" #include "ITerrainSceneNode.h"
#include "SMesh.h" #include "SMesh.h"
#include "CDynamicMeshBuffer.h"
namespace irr namespace irr
{ {
...@@ -142,7 +143,7 @@ namespace scene ...@@ -142,7 +143,7 @@ namespace scene
//! Gets the meshbuffer data based on a specified Level of Detail. //! Gets the meshbuffer data based on a specified Level of Detail.
//! \param mb: A reference to an SMeshBufferLightMap object //! \param mb: A reference to an SMeshBufferLightMap object
//! \param LOD: The Level Of Detail you want the indices from. //! \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. //! Gets the indices for a specified patch at a specified Level of Detail.
//! \param indices: A reference to an array of u32 indices. //! \param indices: A reference to an array of u32 indices.
...@@ -282,10 +283,10 @@ namespace scene ...@@ -282,10 +283,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(SMeshBufferLightMap* mb, s32 smoothFactor); void smoothTerrain(CDynamicMeshBuffer* mb, s32 smoothFactor);
//! calculate smooth normals //! 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. //! create patches, stuff that needs to only be done once for patches goes here.
void createPatches(); void createPatches();
...@@ -307,7 +308,9 @@ namespace scene ...@@ -307,7 +308,9 @@ namespace scene
STerrainData TerrainData; STerrainData TerrainData;
SMesh Mesh; SMesh Mesh;
SMeshBufferLightMap* RenderBuffer;
CDynamicMeshBuffer *RenderBuffer;
u32 VerticesToRender; u32 VerticesToRender;
u32 IndicesToRender; u32 IndicesToRender;
...@@ -334,3 +337,4 @@ namespace scene ...@@ -334,3 +337,4 @@ namespace scene
#endif // __C_TERRAIN_SCENE_NODE_H__ #endif // __C_TERRAIN_SCENE_NODE_H__
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