-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-e03cc46cb475master
parent
320c8b91cb
commit
341dc16566
|
@ -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();}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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();}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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_
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
|||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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__
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue