-Made drivers update vertex and index VBOs independently. Massive speed up for terrain nodes. Interface isn’t so clean yet, but will be when vertex and index buffers are separated.
-fixed a rendering state bug, in openGL and directx drivers, while changing from 3d to 2d rendering. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1403 dfc29bdd-3216-0410-991c-e03cc46cb475master
parent
c661079e7e
commit
e903f2ca6b
|
@ -18,7 +18,7 @@ namespace scene
|
|||
{
|
||||
public:
|
||||
//! Default constructor for empty meshbuffer
|
||||
CMeshBuffer():ChangedID(1),MappingHint(EHM_NEVER) // everything's default constructed
|
||||
CMeshBuffer():ChangedID_Vertex(1),ChangedID_Index(1),MappingHint(EHM_NEVER) // everything's default constructed
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
setDebugName("SMeshBuffer");
|
||||
|
@ -223,12 +223,24 @@ namespace scene
|
|||
}
|
||||
|
||||
//! flags the mesh as changed, reloads hardware buffers
|
||||
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) {ChangedID++;}
|
||||
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX)
|
||||
{
|
||||
if (Buffer==EBT_VERTEX_AND_INDEX ||Buffer==EBT_VERTEX)
|
||||
ChangedID_Vertex++;
|
||||
else if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
|
||||
ChangedID_Index++;
|
||||
}
|
||||
|
||||
//! Get the currently used ID for identification of changes.
|
||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
||||
virtual const u32 getChangedID_Vertex() const {return ChangedID_Vertex;}
|
||||
|
||||
//! 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 {return ChangedID_Index;}
|
||||
|
||||
virtual const u32 getChangedID() const {return ChangedID;}
|
||||
|
||||
|
||||
u32 ChangedID;
|
||||
u32 ChangedID_Vertex;
|
||||
u32 ChangedID_Index;
|
||||
|
||||
//! hardware mapping hint
|
||||
E_HARDWARE_MAPPING MappingHint;
|
||||
|
|
|
@ -154,9 +154,17 @@ namespace scene
|
|||
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) = 0;
|
||||
|
||||
//! flags the meshbuffer as changed, reloads hardware buffers
|
||||
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) = 0;
|
||||
|
||||
virtual const u32 getChangedID() const = 0;
|
||||
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) = 0;
|
||||
|
||||
//to be spit into vertex and index buffers:
|
||||
//! Get the currently used ID for identification of changes.
|
||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
||||
virtual const u32 getChangedID_Vertex() const = 0;
|
||||
|
||||
//! 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;
|
||||
};
|
||||
|
|
|
@ -16,7 +16,7 @@ namespace scene
|
|||
struct SSharedMeshBuffer : public IMeshBuffer
|
||||
{
|
||||
//! constructor
|
||||
SSharedMeshBuffer() : IMeshBuffer(), ChangedID(1), MappingHint(Never), Vertices(0)
|
||||
SSharedMeshBuffer() : IMeshBuffer(), ChangedID_Vertex(1), ChangedID_Index(1), MappingHint(Never), Vertices(0)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
setDebugName("SSharedMeshBuffer");
|
||||
|
@ -140,13 +140,30 @@ namespace scene
|
|||
{
|
||||
MappingHint=NewMappingHint;
|
||||
}
|
||||
|
||||
//! flags the mesh as changed, reloads hardware buffers
|
||||
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) {ChangedID++;}
|
||||
|
||||
//! Get the currently used ID for identification of changes.
|
||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
||||
virtual const u32 getChangedID() const {return ChangedID;}
|
||||
|
||||
|
||||
//! flags the mesh as changed, reloads hardware buffers
|
||||
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX)
|
||||
{
|
||||
if (E_BUFFER_TYPE Buffer==EBT_VERTEX_AND_INDEX || E_BUFFER_TYPE Buffer==EBT_VERTEX)
|
||||
ChangedID_Vertex++;
|
||||
else if (E_BUFFER_TYPE Buffer==EBT_VERTEX_AND_INDEX || E_BUFFER_TYPE Buffer==EBT_INDEX)
|
||||
ChangedID_Index++;
|
||||
}
|
||||
//! Get the currently used ID for identification of changes.
|
||||
/** This shouldn't be used for anything outside the VideoDriver. */
|
||||
virtual const u32 getChangedID_Vertex() const {return ChangedID_Vertex;}
|
||||
|
||||
//! 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 {return ChangedID_Index;}
|
||||
|
||||
//! ID used for hardware buffer management
|
||||
u32 ChangedID_Vertex;
|
||||
|
||||
//! ID used for hardware buffer management
|
||||
u32 ChangedID_Index;
|
||||
|
||||
|
||||
//! Material of this meshBuffer
|
||||
video::SMaterial Material;
|
||||
|
@ -158,8 +175,7 @@ namespace scene
|
|||
core::aabbox3df BoundingBox;
|
||||
//! hardware mapping hint
|
||||
E_HARDWARE_MAPPING MappingHint;
|
||||
//! ID used for hardware buffer management
|
||||
u32 ChangedID;
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ namespace scene
|
|||
struct SSkinMeshBuffer : public IMeshBuffer
|
||||
{
|
||||
//! Default constructor
|
||||
SSkinMeshBuffer(video::E_VERTEX_TYPE vt=video::EVT_STANDARD) : ChangedID(1),MappingHint(EHM_NEVER),VertexType(vt)
|
||||
SSkinMeshBuffer(video::E_VERTEX_TYPE vt=video::EVT_STANDARD) : ChangedID_Vertex(1),ChangedID_Index(1),MappingHint(EHM_NEVER),VertexType(vt)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
setDebugName("SSkinMeshBuffer");
|
||||
|
@ -305,14 +305,21 @@ struct SSkinMeshBuffer : public IMeshBuffer
|
|||
MappingHint=NewMappingHint;
|
||||
}
|
||||
|
||||
//! flags the mesh as changed, reloads hardware buffers
|
||||
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX)
|
||||
{
|
||||
if (Buffer==EBT_VERTEX_AND_INDEX ||Buffer==EBT_VERTEX)
|
||||
ChangedID_Vertex++;
|
||||
else if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
|
||||
ChangedID_Index++;
|
||||
}
|
||||
|
||||
virtual const u32 getChangedID_Vertex() const {return ChangedID_Vertex;}
|
||||
virtual const u32 getChangedID_Index() const {return ChangedID_Index;}
|
||||
|
||||
u32 ChangedID_Vertex;
|
||||
u32 ChangedID_Index;
|
||||
|
||||
//! flags the mesh as changed, reloads hardware buffers
|
||||
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) {ChangedID++;}
|
||||
|
||||
virtual const u32 getChangedID() const {return ChangedID;}
|
||||
|
||||
|
||||
u32 ChangedID;
|
||||
|
||||
// hardware mapping hint
|
||||
E_HARDWARE_MAPPING MappingHint;
|
||||
|
|
|
@ -1621,8 +1621,8 @@ void CD3D8Driver::setRenderStates2DMode(bool alpha, bool texture, bool alphaChan
|
|||
|
||||
// unset last 3d material
|
||||
if (CurrentRenderMode == ERM_3D &&
|
||||
Material.MaterialType >= 0 && Material.MaterialType < (s32)MaterialRenderers.size())
|
||||
MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial();
|
||||
Material.MaterialType >= 0 && LastMaterial.MaterialType < (s32)MaterialRenderers.size())
|
||||
MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial();
|
||||
}
|
||||
|
||||
if (texture)
|
||||
|
|
|
@ -208,7 +208,7 @@ bool CD3D9Driver::initDriver(const core::dimension2d<s32>& screenSize, HWND hwnd
|
|||
{
|
||||
case 0x1002 : vendorName = "ATI Technologies Inc."; break;
|
||||
case 0x10DE : vendorName = "NVIDIA Corporation"; break;
|
||||
case 0x102B : vendorName = "Matrox Electronic Systems Ltd."; break;
|
||||
case 0x102B : vendorName = "Matrox Electronic Systems Ltd."; break;
|
||||
case 0x121A : vendorName = "3dfx Interactive Inc"; break;
|
||||
case 0x5333 : vendorName = "S3 Graphics Co., Ltd."; break;
|
||||
case 0x8086 : vendorName = "Intel Corporation"; break;
|
||||
|
@ -842,28 +842,28 @@ bool CD3D9Driver::updateVertexHardwareBuffer(SHWBufferLink_d3d9 *HWBuffer)
|
|||
// Get the vertex sizes and cvf
|
||||
switch (vType)
|
||||
{
|
||||
case EVT_STANDARD:
|
||||
vertexSize = sizeof(S3DVertex);
|
||||
case EVT_STANDARD:
|
||||
vertexSize = sizeof(S3DVertex);
|
||||
FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1;
|
||||
break;
|
||||
case EVT_2TCOORDS:
|
||||
vertexSize = sizeof(S3DVertex2TCoords);
|
||||
case EVT_2TCOORDS:
|
||||
vertexSize = sizeof(S3DVertex2TCoords);
|
||||
FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX2;
|
||||
break;
|
||||
case EVT_TANGENTS:
|
||||
case EVT_TANGENTS:
|
||||
vertexSize = sizeof(S3DVertexTangents);
|
||||
FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX3;
|
||||
FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX3;
|
||||
break;
|
||||
default:
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
flags = D3DUSAGE_WRITEONLY; // SIO2: Default to D3DUSAGE_WRITEONLY
|
||||
if(HWBuffer->Mapped != scene::EHM_STATIC)
|
||||
flags |= D3DUSAGE_DYNAMIC;
|
||||
|
||||
pID3DDevice->CreateVertexBuffer(vertexCount * vertexSize, flags, FVF, D3DPOOL_DEFAULT, &HWBuffer->vertexBuffer, NULL);
|
||||
|
||||
|
||||
if(!HWBuffer->vertexBuffer)
|
||||
return false;
|
||||
|
||||
|
@ -878,7 +878,7 @@ bool CD3D9Driver::updateVertexHardwareBuffer(SHWBufferLink_d3d9 *HWBuffer)
|
|||
HWBuffer->vertexBufferSize = vertexCount * vertexSize;
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
HWBuffer->vertexBuffer->Lock(0, vertexCount * vertexSize, (void**)&pLockedBuffer, D3DLOCK_DISCARD);
|
||||
memcpy(pLockedBuffer, vertices, vertexCount * vertexSize);
|
||||
HWBuffer->vertexBuffer->Unlock();
|
||||
|
@ -944,17 +944,30 @@ bool CD3D9Driver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
|
|||
if (!HWBuffer)
|
||||
return false;
|
||||
|
||||
if (HWBuffer->ChangedID != HWBuffer->MeshBuffer->getChangedID()
|
||||
|| !((SHWBufferLink_d3d9*)HWBuffer)->vertexBuffer
|
||||
|| !((SHWBufferLink_d3d9*)HWBuffer)->indexBuffer)
|
||||
if (HWBuffer->ChangedID_Vertex != HWBuffer->MeshBuffer->getChangedID_Vertex()
|
||||
|| !((SHWBufferLink_d3d9*)HWBuffer)->vertexBuffer)
|
||||
{
|
||||
HWBuffer->ChangedID = HWBuffer->MeshBuffer->getChangedID();
|
||||
|
||||
HWBuffer->ChangedID_Vertex = HWBuffer->MeshBuffer->getChangedID_Vertex();
|
||||
|
||||
if (!updateVertexHardwareBuffer((SHWBufferLink_d3d9*)HWBuffer))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (HWBuffer->ChangedID_Index != HWBuffer->MeshBuffer->getChangedID_Index()
|
||||
|| !((SHWBufferLink_d3d9*)HWBuffer)->indexBuffer)
|
||||
{
|
||||
|
||||
HWBuffer->ChangedID_Index = HWBuffer->MeshBuffer->getChangedID_Index();
|
||||
|
||||
if (!updateIndexHardwareBuffer((SHWBufferLink_d3d9*)HWBuffer))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -970,7 +983,8 @@ CD3D9Driver::SHWBufferLink *CD3D9Driver::createHardwareBuffer(const scene::IMesh
|
|||
//add to map
|
||||
HWBufferMap.insert(HWBuffer->MeshBuffer, HWBuffer);
|
||||
|
||||
HWBuffer->ChangedID=HWBuffer->MeshBuffer->getChangedID();
|
||||
HWBuffer->ChangedID_Vertex=HWBuffer->MeshBuffer->getChangedID_Vertex();
|
||||
HWBuffer->ChangedID_Index=HWBuffer->MeshBuffer->getChangedID_Index();
|
||||
HWBuffer->Mapped=mb->getHardwareMappingHint();
|
||||
HWBuffer->LastUsed=0;
|
||||
HWBuffer->vertexBuffer=0;
|
||||
|
@ -1108,7 +1122,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
|
|||
{
|
||||
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINESTRIP, 0, vertexCount,
|
||||
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride);
|
||||
|
||||
|
||||
u16 tmpIndices[] = {0, primitiveCount};
|
||||
|
||||
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_LINELIST, 0, vertexCount,
|
||||
|
@ -1154,7 +1168,7 @@ void CD3D9Driver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
|
|||
pID3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, vertexCount, 0, primitiveCount);
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
pID3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, vertexCount,
|
||||
primitiveCount, indexList, D3DFMT_INDEX16, vertices, stride);
|
||||
}
|
||||
|
@ -1870,8 +1884,8 @@ void CD3D9Driver::setRenderStates2DMode(bool alpha, bool texture, bool alphaChan
|
|||
// unset last 3d material
|
||||
if (CurrentRenderMode != ERM_2D)
|
||||
{
|
||||
if (static_cast<u32>(Material.MaterialType) < MaterialRenderers.size())
|
||||
MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial();
|
||||
if (static_cast<u32>(LastMaterial.MaterialType) < MaterialRenderers.size())
|
||||
MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial();
|
||||
setBasicRenderStates(SMaterial(), SMaterial(), true);
|
||||
// everything that is wrongly set by SMaterial default
|
||||
pID3DDevice->SetRenderState(D3DRS_ZENABLE, FALSE);
|
||||
|
|
|
@ -299,7 +299,7 @@ namespace video
|
|||
protected:
|
||||
struct SHWBufferLink
|
||||
{
|
||||
SHWBufferLink(const scene::IMeshBuffer *_MeshBuffer):MeshBuffer(_MeshBuffer),ChangedID(0),LastUsed(0),Mapped(scene::EHM_NEVER)
|
||||
SHWBufferLink(const scene::IMeshBuffer *_MeshBuffer):MeshBuffer(_MeshBuffer),ChangedID_Vertex(0),ChangedID_Index(0),LastUsed(0),Mapped(scene::EHM_NEVER)
|
||||
{
|
||||
if (MeshBuffer)
|
||||
MeshBuffer->grab();
|
||||
|
@ -313,7 +313,8 @@ namespace video
|
|||
|
||||
scene::E_BUFFER_TYPE Contains;
|
||||
const scene::IMeshBuffer *MeshBuffer;
|
||||
u32 ChangedID;
|
||||
u32 ChangedID_Vertex;
|
||||
u32 ChangedID_Index;
|
||||
u32 LastUsed;
|
||||
scene::E_HARDWARE_MAPPING Mapped;
|
||||
|
||||
|
|
|
@ -713,19 +713,30 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
|
|||
{
|
||||
if (!HWBuffer)
|
||||
return false;
|
||||
|
||||
if (HWBuffer->ChangedID_Vertex != HWBuffer->MeshBuffer->getChangedID_Vertex()
|
||||
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_verticesID)
|
||||
{
|
||||
|
||||
HWBuffer->ChangedID_Vertex = HWBuffer->MeshBuffer->getChangedID_Vertex();
|
||||
|
||||
if (!updateVertexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (HWBuffer->ChangedID_Index != HWBuffer->MeshBuffer->getChangedID_Index()
|
||||
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_indicesID)
|
||||
{
|
||||
|
||||
HWBuffer->ChangedID_Index = HWBuffer->MeshBuffer->getChangedID_Index();
|
||||
|
||||
if (!updateIndexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (HWBuffer->ChangedID != HWBuffer->MeshBuffer->getChangedID()
|
||||
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_indicesID
|
||||
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_verticesID)
|
||||
{
|
||||
|
||||
HWBuffer->ChangedID = HWBuffer->MeshBuffer->getChangedID();
|
||||
|
||||
if (!updateVertexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
|
||||
return false;
|
||||
if (!updateIndexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -743,7 +754,8 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I
|
|||
//add to map
|
||||
HWBufferMap.insert(HWBuffer->MeshBuffer, HWBuffer);
|
||||
|
||||
HWBuffer->ChangedID=HWBuffer->MeshBuffer->getChangedID();
|
||||
HWBuffer->ChangedID_Vertex=HWBuffer->MeshBuffer->getChangedID_Vertex();
|
||||
HWBuffer->ChangedID_Index=HWBuffer->MeshBuffer->getChangedID_Index();
|
||||
HWBuffer->Mapped=mb->getHardwareMappingHint();
|
||||
HWBuffer->LastUsed=0;
|
||||
HWBuffer->vbo_verticesID=0;
|
||||
|
@ -1880,8 +1892,8 @@ void COpenGLDriver::setRenderStates2DMode(bool alpha, bool texture, bool alphaCh
|
|||
// unset last 3d material
|
||||
if (CurrentRenderMode == ERM_3D)
|
||||
{
|
||||
if (static_cast<u32>(Material.MaterialType) < MaterialRenderers.size())
|
||||
MaterialRenderers[Material.MaterialType].Renderer->OnUnsetMaterial();
|
||||
if (static_cast<u32>(LastMaterial.MaterialType) < MaterialRenderers.size())
|
||||
MaterialRenderers[LastMaterial.MaterialType].Renderer->OnUnsetMaterial();
|
||||
SMaterial mat;
|
||||
mat.ZBuffer=0;
|
||||
mat.Lighting=false;
|
||||
|
|
|
@ -458,7 +458,7 @@ void CSkinnedMesh::skinMesh()
|
|||
SkinJoint(RootJoints[i], 0);
|
||||
|
||||
for (i=0; i<SkinningBuffers->size(); ++i)
|
||||
(*SkinningBuffers)[i]->setDirty();
|
||||
(*SkinningBuffers)[i]->setDirty(EBT_VERTEX);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue