terrains can now use VBOs, but index and vertex data will need to be updated independently for any speed gain

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@1269 dfc29bdd-3216-0410-991c-e03cc46cb475
master
lukeph 2008-02-27 14:07:27 +00:00
parent ee6f54877e
commit 580c3f5365
10 changed files with 100 additions and 57 deletions

View File

@ -189,7 +189,7 @@ namespace scene
}
//! flags the mesh as changed, reloads hardware buffers
virtual void setDirty() {ChangedID++;}
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) {ChangedID++;}
virtual const u32 getChangedID() const {return ChangedID;}

View File

@ -137,7 +137,10 @@ namespace scene
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) = 0;
//! flags the meshbuffer as changed, reloads hardware buffers
virtual void setDirty() = 0;
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) = 0;
virtual const u32 getChangedID() const = 0;

View File

@ -68,6 +68,11 @@ namespace scene
//! Returns pointer to the mesh
virtual IMesh* getMesh() = 0;
//! Returns a pointer to the buffer used by the terrain (most users will not need this)
virtual IMeshBuffer* getRenderBuffer() = 0;
//! 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. */

View File

@ -142,7 +142,7 @@ namespace scene
//! flags the mesh as changed, reloads hardware buffers
virtual void setDirty() {ChangedID++;}
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) {ChangedID++;}
virtual const u32 getChangedID() const {return ChangedID;}

View File

@ -282,7 +282,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
//! flags the mesh as changed, reloads hardware buffers
virtual void setDirty() {ChangedID++;}
virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX) {ChangedID++;}
virtual const u32 getChangedID() const {return ChangedID;}

View File

@ -573,6 +573,10 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
if (!HWBuffer->vbo_verticesID) return false;
newBuffer=true;
}
else if (HWBuffer->vbo_verticesSize < vertexCount*vertexSize)
{
newBuffer=true;
}
extGlBindBuffer(GL_ARRAY_BUFFER, HWBuffer->vbo_verticesID );
@ -581,6 +585,8 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
extGlBufferSubData(GL_ARRAY_BUFFER, 0, vertexCount * vertexSize, buffer.const_pointer());
else
{
HWBuffer->vbo_verticesSize = vertexCount*vertexSize;
if (HWBuffer->Mapped==scene::EHM_STATIC)
extGlBufferData(GL_ARRAY_BUFFER, vertexCount * vertexSize, buffer.const_pointer(), GL_STATIC_DRAW);
else if (HWBuffer->Mapped==scene::EHM_DYNAMIC)
@ -623,7 +629,10 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
if (!HWBuffer->vbo_indicesID) return false;
newBuffer=true;
}
else if (HWBuffer->vbo_indicesSize < indexCount*indexSize)
{
newBuffer=true;
}
extGlBindBuffer(GL_ELEMENT_ARRAY_BUFFER, HWBuffer->vbo_indicesID);
@ -632,6 +641,8 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
extGlBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indexCount * indexSize, indices);
else
{
HWBuffer->vbo_indicesSize = indexCount*indexSize;
if (HWBuffer->Mapped==scene::EHM_STATIC)
extGlBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * indexSize, indices, GL_STATIC_DRAW);
else if (HWBuffer->Mapped==scene::EHM_DYNAMIC)
@ -689,6 +700,8 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I
HWBuffer->LastUsed=0;
HWBuffer->vbo_verticesID=0;
HWBuffer->vbo_indicesID=0;
HWBuffer->vbo_verticesSize=0;
HWBuffer->vbo_indicesSize=0;
if (!updateHardwareBuffer(HWBuffer))
{

View File

@ -113,6 +113,10 @@ namespace video
GLuint vbo_verticesID; //tmp
GLuint vbo_indicesID; //tmp
GLuint vbo_verticesSize; //tmp
GLuint vbo_indicesSize; //tmp
};
bool updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer);

View File

@ -253,6 +253,12 @@ void COpenGLTexture::copyTexture(bool newTexture)
if (Driver->testGLError())
os::Printer::log("Could not bind Texture", ELL_ERROR);
if (!Image)
{
os::Printer::log("No image for OpenGL texture to upload", ELL_ERROR);
return;
}
switch (Image->getColorFormat())
{
case ECF_A1R5G5B5:

View File

@ -189,6 +189,8 @@ namespace scene
RenderBuffer.Indices.set_used( TerrainData.PatchCount * TerrainData.PatchCount *
TerrainData.CalcPatchSize * TerrainData.CalcPatchSize * 6 );
RenderBuffer.setDirty();
const u32 endTime = os::Timer::getRealTime();
c8 tmp[255];
@ -394,6 +396,9 @@ namespace scene
calculateDistanceThresholds( true );
calculatePatchData();
RenderBuffer.setDirty(EBT_VERTEX);
}
//! Updates the scene nodes indices if the camera has moved or rotated by a certain
@ -522,6 +527,10 @@ namespace scene
}
}
RenderBuffer.Indices.set_used(IndicesToRender);
RenderBuffer.setDirty(EBT_INDEX);
if ( DynamicSelectorUpdate && TriangleSelector )
{
CTerrainTriangleSelector* selector = (CTerrainTriangleSelector*)TriangleSelector;
@ -547,10 +556,7 @@ namespace scene
driver->setMaterial(Mesh.getMeshBuffer(0)->getMaterial());
// For use with geomorphing
driver->drawVertexPrimitiveList(
RenderBuffer.getVertices(), RenderBuffer.getVertexCount(),
RenderBuffer.getIndices(), IndicesToRender / 3,
video::EVT_2TCOORDS, EPT_TRIANGLES);
driver->drawMeshBuffer(&RenderBuffer);
// for debug purposes only:
if (DebugDataVisible)
@ -818,6 +824,8 @@ namespace scene
xval += resBySize;
x2val += res2BySize;
}
RenderBuffer.setDirty(EBT_VERTEX);
}
//! used to get the indices when generating index data for patches at varying levels of detail.

View File

@ -135,6 +135,10 @@ namespace scene
//! Returns the mesh
virtual IMesh* getMesh() { return &Mesh; }
//! Returns a pointer to the buffer used by the terrain (most users will not need this)
virtual IMeshBuffer* getRenderBuffer() { return &RenderBuffer; }
//! 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.