VBOs now use irrMap
git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1151 dfc29bdd-3216-0410-991c-e03cc46cb475master
parent
199c83dab5
commit
86eda333c6
|
@ -55,6 +55,14 @@ namespace scene
|
||||||
EPT_POINT_SPRITES
|
EPT_POINT_SPRITES
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum E_BUFFER_TYPE
|
||||||
|
{
|
||||||
|
EBT_NONE=0,
|
||||||
|
EBT_VERTEX,
|
||||||
|
EBT_INDEX,
|
||||||
|
EBT_VERTEX_AND_INDEX
|
||||||
|
};
|
||||||
|
|
||||||
//! Struct for holding a mesh with a single material
|
//! Struct for holding a mesh with a single material
|
||||||
/** SMeshBuffer is a simple implementation of a MeshBuffer. */
|
/** SMeshBuffer is a simple implementation of a MeshBuffer. */
|
||||||
class IMeshBuffer : public virtual IReferenceCounted
|
class IMeshBuffer : public virtual IReferenceCounted
|
||||||
|
|
|
@ -1254,7 +1254,6 @@ void CNullDriver::drawMeshBuffer(const scene::IMeshBuffer* mb)
|
||||||
drawHardwareBuffer(HWBuffer);
|
drawHardwareBuffer(HWBuffer);
|
||||||
else
|
else
|
||||||
drawVertexPrimitiveList(mb->getVertices(), mb->getVertexCount(), mb->getIndices(), mb->getIndexCount()/3, mb->getVertexType(), scene::EPT_TRIANGLES);
|
drawVertexPrimitiveList(mb->getVertices(), mb->getVertexCount(), mb->getIndices(), mb->getIndexCount()/3, mb->getVertexType(), scene::EPT_TRIANGLES);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer* mb)
|
CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer* mb)
|
||||||
|
@ -1263,14 +1262,8 @@ CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer*
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
//search for hardware links
|
//search for hardware links
|
||||||
for (u32 n=0;n<HWBufferLinks.size();++n)
|
core::map< const scene::IMeshBuffer*,SHWBufferLink* >::Node* node = HWBufferMap.find(mb);
|
||||||
{
|
if (node) return node->getValue();
|
||||||
SHWBufferLink *Link=HWBufferLinks[n];
|
|
||||||
if (Link->MeshBuffer==mb)
|
|
||||||
{
|
|
||||||
return Link;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return createHardwareBuffer(mb); //no hardware links, and mesh wants one, create it
|
return createHardwareBuffer(mb); //no hardware links, and mesh wants one, create it
|
||||||
}
|
}
|
||||||
|
@ -1278,12 +1271,13 @@ CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer*
|
||||||
//! Update all hardware buffers, remove unused ones
|
//! Update all hardware buffers, remove unused ones
|
||||||
void CNullDriver::updateAllHardwareBuffers()
|
void CNullDriver::updateAllHardwareBuffers()
|
||||||
{
|
{
|
||||||
for (u32 n=0;n<HWBufferLinks.size();++n)
|
core::map<const scene::IMeshBuffer*,SHWBufferLink*>::ParentFirstIterator Iterator=HWBufferMap.getParentFirstIterator();
|
||||||
|
|
||||||
|
for (;!Iterator.atEnd();Iterator++)
|
||||||
{
|
{
|
||||||
SHWBufferLink *Link=HWBufferLinks[n];
|
SHWBufferLink *Link=Iterator.getNode()->getValue();
|
||||||
|
|
||||||
Link->LastUsed++;
|
Link->LastUsed++;
|
||||||
|
|
||||||
if (Link->LastUsed>20000)
|
if (Link->LastUsed>20000)
|
||||||
{
|
{
|
||||||
deleteHardwareBuffer(Link);
|
deleteHardwareBuffer(Link);
|
||||||
|
@ -1294,34 +1288,27 @@ void CNullDriver::updateAllHardwareBuffers()
|
||||||
|
|
||||||
void CNullDriver::deleteHardwareBuffer(SHWBufferLink *HWBuffer)
|
void CNullDriver::deleteHardwareBuffer(SHWBufferLink *HWBuffer)
|
||||||
{
|
{
|
||||||
s32 n=HWBufferLinks.binary_search(HWBuffer);
|
if (!HWBuffer) return;
|
||||||
if (n!=-1) HWBufferLinks.erase(n);
|
HWBufferMap.remove( HWBuffer->MeshBuffer );
|
||||||
|
|
||||||
delete HWBuffer;
|
delete HWBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! Remove hardware buffer
|
//! Remove hardware buffer
|
||||||
void CNullDriver::removeHardwareBuffer(const scene::IMeshBuffer* mb)
|
void CNullDriver::removeHardwareBuffer(const scene::IMeshBuffer* mb)
|
||||||
{
|
{
|
||||||
for (u32 n=0;n<HWBufferLinks.size();++n)
|
core::map<const scene::IMeshBuffer*,SHWBufferLink*>::Node* node = HWBufferMap.find(mb);
|
||||||
{
|
if (node) deleteHardwareBuffer( node->getValue() );
|
||||||
SHWBufferLink *Link=HWBufferLinks[n];
|
|
||||||
if (Link->MeshBuffer==mb)
|
|
||||||
{
|
|
||||||
deleteHardwareBuffer(Link);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//! Remove all hardware buffers
|
//! Remove all hardware buffers
|
||||||
void CNullDriver::removeAllHardwareBuffers()
|
void CNullDriver::removeAllHardwareBuffers()
|
||||||
{
|
{
|
||||||
while (HWBufferLinks.size())
|
core::map<const scene::IMeshBuffer*,SHWBufferLink*>::ParentLastIterator Iterator=HWBufferMap.getParentLastIterator();
|
||||||
deleteHardwareBuffer(HWBufferLinks[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
for (;!Iterator.atEnd();Iterator++)
|
||||||
|
deleteHardwareBuffer(Iterator.getNode()->getValue());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
bool CNullDriver::isHardwareBufferRecommend(const scene::IMeshBuffer* mb)
|
bool CNullDriver::isHardwareBufferRecommend(const scene::IMeshBuffer* mb)
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include "IGPUProgrammingServices.h"
|
#include "IGPUProgrammingServices.h"
|
||||||
#include "irrArray.h"
|
#include "irrArray.h"
|
||||||
#include "irrString.h"
|
#include "irrString.h"
|
||||||
|
#include "irrMap.h"
|
||||||
#include "IAttributes.h"
|
#include "IAttributes.h"
|
||||||
#include "IMeshBuffer.h"
|
#include "IMeshBuffer.h"
|
||||||
#include "CFPSCounter.h"
|
#include "CFPSCounter.h"
|
||||||
|
@ -305,10 +306,13 @@ namespace video
|
||||||
MeshBuffer->drop();
|
MeshBuffer->drop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
scene::E_BUFFER_TYPE Contains;
|
||||||
const scene::IMeshBuffer *MeshBuffer;
|
const scene::IMeshBuffer *MeshBuffer;
|
||||||
u32 ChangedID;
|
u32 ChangedID;
|
||||||
u32 LastUsed;
|
u32 LastUsed;
|
||||||
scene::E_HARDWARE_MAPPING Mapped;
|
scene::E_HARDWARE_MAPPING Mapped;
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -555,8 +559,8 @@ namespace video
|
||||||
core::array<SLight> Lights;
|
core::array<SLight> Lights;
|
||||||
core::array<SMaterialRenderer> MaterialRenderers;
|
core::array<SMaterialRenderer> MaterialRenderers;
|
||||||
|
|
||||||
core::array<SHWBufferLink*> HWBufferLinks;
|
//core::array<SHWBufferLink*> HWBufferLinks;
|
||||||
|
core::map< const scene::IMeshBuffer* , SHWBufferLink* > HWBufferMap;
|
||||||
|
|
||||||
io::IFileSystem* FileSystem;
|
io::IFileSystem* FileSystem;
|
||||||
|
|
||||||
|
|
|
@ -659,6 +659,7 @@ bool COpenGLDriver::updateHardwareBuffer(SHWBufferLink *HWBuffer)
|
||||||
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_indicesID
|
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_indicesID
|
||||||
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_verticesID)
|
|| !((SHWBufferLink_opengl*)HWBuffer)->vbo_verticesID)
|
||||||
{
|
{
|
||||||
|
|
||||||
HWBuffer->ChangedID = HWBuffer->MeshBuffer->getChangedID();
|
HWBuffer->ChangedID = HWBuffer->MeshBuffer->getChangedID();
|
||||||
|
|
||||||
if (!updateVertexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
|
if (!updateVertexHardwareBuffer((SHWBufferLink_opengl*)HWBuffer))
|
||||||
|
@ -680,17 +681,8 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I
|
||||||
|
|
||||||
SHWBufferLink_opengl *HWBuffer=new SHWBufferLink_opengl(mb);
|
SHWBufferLink_opengl *HWBuffer=new SHWBufferLink_opengl(mb);
|
||||||
|
|
||||||
//add to list, in order of their meshbuffer pointer
|
//add to map
|
||||||
|
HWBufferMap.insert(HWBuffer->MeshBuffer, HWBuffer);
|
||||||
u32 n;
|
|
||||||
for (n=0;n<HWBufferLinks.size();++n)
|
|
||||||
if (HWBufferLinks[n]->MeshBuffer > HWBuffer->MeshBuffer)
|
|
||||||
break;
|
|
||||||
if (n<HWBufferLinks.size())
|
|
||||||
HWBufferLinks.insert(HWBuffer,n);
|
|
||||||
else
|
|
||||||
|
|
||||||
HWBufferLinks.push_back(HWBuffer);
|
|
||||||
|
|
||||||
HWBuffer->ChangedID=HWBuffer->MeshBuffer->getChangedID();
|
HWBuffer->ChangedID=HWBuffer->MeshBuffer->getChangedID();
|
||||||
HWBuffer->Mapped=mb->getHardwareMappingHint();
|
HWBuffer->Mapped=mb->getHardwareMappingHint();
|
||||||
|
@ -715,6 +707,7 @@ void COpenGLDriver::deleteHardwareBuffer(SHWBufferLink *_HWBuffer)
|
||||||
{
|
{
|
||||||
if (!_HWBuffer) return;
|
if (!_HWBuffer) return;
|
||||||
|
|
||||||
|
|
||||||
#if defined(GL_ARB_vertex_buffer_object)
|
#if defined(GL_ARB_vertex_buffer_object)
|
||||||
SHWBufferLink_opengl *HWBuffer=(SHWBufferLink_opengl*)_HWBuffer;
|
SHWBufferLink_opengl *HWBuffer=(SHWBufferLink_opengl*)_HWBuffer;
|
||||||
if (HWBuffer->vbo_verticesID)
|
if (HWBuffer->vbo_verticesID)
|
||||||
|
|
Loading…
Reference in New Issue