Commit 580c3f53 authored by lukeph's avatar lukeph

terrains can now use VBOs, but index and vertex data will need to be updated...

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
parent ee6f5487
...@@ -189,7 +189,7 @@ namespace scene ...@@ -189,7 +189,7 @@ namespace scene
} }
//! flags the mesh as changed, reloads hardware buffers //! 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;} virtual const u32 getChangedID() const {return ChangedID;}
......
...@@ -137,7 +137,10 @@ namespace scene ...@@ -137,7 +137,10 @@ namespace scene
virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) = 0; virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) = 0;
//! flags the meshbuffer as changed, reloads hardware buffers //! 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; virtual const u32 getChangedID() const = 0;
......
...@@ -68,6 +68,11 @@ namespace scene ...@@ -68,6 +68,11 @@ namespace scene
//! Returns pointer to the mesh //! Returns pointer to the mesh
virtual IMesh* getMesh() = 0; 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. //! Gets the meshbuffer data based on a specified level of detail.
/** \param mb: A reference to an SMeshBuffer object /** \param mb: A reference to an SMeshBuffer object
\param LOD: the level of detail you want the indices from. */ \param LOD: the level of detail you want the indices from. */
......
...@@ -142,7 +142,7 @@ namespace scene ...@@ -142,7 +142,7 @@ namespace scene
//! flags the mesh as changed, reloads hardware buffers //! 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;} virtual const u32 getChangedID() const {return ChangedID;}
......
...@@ -282,7 +282,7 @@ struct SSkinMeshBuffer : public IMeshBuffer ...@@ -282,7 +282,7 @@ struct SSkinMeshBuffer : public IMeshBuffer
//! flags the mesh as changed, reloads hardware buffers //! 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;} virtual const u32 getChangedID() const {return ChangedID;}
......
...@@ -573,6 +573,10 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -573,6 +573,10 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
if (!HWBuffer->vbo_verticesID) return false; if (!HWBuffer->vbo_verticesID) return false;
newBuffer=true; newBuffer=true;
} }
else if (HWBuffer->vbo_verticesSize < vertexCount*vertexSize)
{
newBuffer=true;
}
extGlBindBuffer(GL_ARRAY_BUFFER, HWBuffer->vbo_verticesID ); extGlBindBuffer(GL_ARRAY_BUFFER, HWBuffer->vbo_verticesID );
...@@ -581,6 +585,8 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -581,6 +585,8 @@ bool COpenGLDriver::updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
extGlBufferSubData(GL_ARRAY_BUFFER, 0, vertexCount * vertexSize, buffer.const_pointer()); extGlBufferSubData(GL_ARRAY_BUFFER, 0, vertexCount * vertexSize, buffer.const_pointer());
else else
{ {
HWBuffer->vbo_verticesSize = vertexCount*vertexSize;
if (HWBuffer->Mapped==scene::EHM_STATIC) if (HWBuffer->Mapped==scene::EHM_STATIC)
extGlBufferData(GL_ARRAY_BUFFER, vertexCount * vertexSize, buffer.const_pointer(), GL_STATIC_DRAW); extGlBufferData(GL_ARRAY_BUFFER, vertexCount * vertexSize, buffer.const_pointer(), GL_STATIC_DRAW);
else if (HWBuffer->Mapped==scene::EHM_DYNAMIC) else if (HWBuffer->Mapped==scene::EHM_DYNAMIC)
...@@ -623,7 +629,10 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -623,7 +629,10 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
if (!HWBuffer->vbo_indicesID) return false; if (!HWBuffer->vbo_indicesID) return false;
newBuffer=true; newBuffer=true;
} }
else if (HWBuffer->vbo_indicesSize < indexCount*indexSize)
{
newBuffer=true;
}
extGlBindBuffer(GL_ELEMENT_ARRAY_BUFFER, HWBuffer->vbo_indicesID); extGlBindBuffer(GL_ELEMENT_ARRAY_BUFFER, HWBuffer->vbo_indicesID);
...@@ -632,6 +641,8 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer) ...@@ -632,6 +641,8 @@ bool COpenGLDriver::updateIndexHardwareBuffer(SHWBufferLink_opengl *HWBuffer)
extGlBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indexCount * indexSize, indices); extGlBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, indexCount * indexSize, indices);
else else
{ {
HWBuffer->vbo_indicesSize = indexCount*indexSize;
if (HWBuffer->Mapped==scene::EHM_STATIC) if (HWBuffer->Mapped==scene::EHM_STATIC)
extGlBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * indexSize, indices, GL_STATIC_DRAW); extGlBufferData(GL_ELEMENT_ARRAY_BUFFER, indexCount * indexSize, indices, GL_STATIC_DRAW);
else if (HWBuffer->Mapped==scene::EHM_DYNAMIC) else if (HWBuffer->Mapped==scene::EHM_DYNAMIC)
...@@ -689,6 +700,8 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I ...@@ -689,6 +700,8 @@ COpenGLDriver::SHWBufferLink *COpenGLDriver::createHardwareBuffer(const scene::I
HWBuffer->LastUsed=0; HWBuffer->LastUsed=0;
HWBuffer->vbo_verticesID=0; HWBuffer->vbo_verticesID=0;
HWBuffer->vbo_indicesID=0; HWBuffer->vbo_indicesID=0;
HWBuffer->vbo_verticesSize=0;
HWBuffer->vbo_indicesSize=0;
if (!updateHardwareBuffer(HWBuffer)) if (!updateHardwareBuffer(HWBuffer))
{ {
......
...@@ -113,6 +113,10 @@ namespace video ...@@ -113,6 +113,10 @@ namespace video
GLuint vbo_verticesID; //tmp GLuint vbo_verticesID; //tmp
GLuint vbo_indicesID; //tmp GLuint vbo_indicesID; //tmp
GLuint vbo_verticesSize; //tmp
GLuint vbo_indicesSize; //tmp
}; };
bool updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer); bool updateVertexHardwareBuffer(SHWBufferLink_opengl *HWBuffer);
......
...@@ -253,6 +253,12 @@ void COpenGLTexture::copyTexture(bool newTexture) ...@@ -253,6 +253,12 @@ void COpenGLTexture::copyTexture(bool newTexture)
if (Driver->testGLError()) if (Driver->testGLError())
os::Printer::log("Could not bind Texture", ELL_ERROR); 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()) switch (Image->getColorFormat())
{ {
case ECF_A1R5G5B5: case ECF_A1R5G5B5:
......
...@@ -189,6 +189,8 @@ namespace scene ...@@ -189,6 +189,8 @@ namespace scene
RenderBuffer.Indices.set_used( TerrainData.PatchCount * TerrainData.PatchCount * RenderBuffer.Indices.set_used( TerrainData.PatchCount * TerrainData.PatchCount *
TerrainData.CalcPatchSize * TerrainData.CalcPatchSize * 6 ); TerrainData.CalcPatchSize * TerrainData.CalcPatchSize * 6 );
RenderBuffer.setDirty();
const u32 endTime = os::Timer::getRealTime(); const u32 endTime = os::Timer::getRealTime();
c8 tmp[255]; c8 tmp[255];
...@@ -394,6 +396,9 @@ namespace scene ...@@ -394,6 +396,9 @@ namespace scene
calculateDistanceThresholds( true ); calculateDistanceThresholds( true );
calculatePatchData(); calculatePatchData();
RenderBuffer.setDirty(EBT_VERTEX);
} }
//! Updates the scene nodes indices if the camera has moved or rotated by a certain //! Updates the scene nodes indices if the camera has moved or rotated by a certain
...@@ -522,6 +527,10 @@ namespace scene ...@@ -522,6 +527,10 @@ namespace scene
} }
} }
RenderBuffer.Indices.set_used(IndicesToRender);
RenderBuffer.setDirty(EBT_INDEX);
if ( DynamicSelectorUpdate && TriangleSelector ) if ( DynamicSelectorUpdate && TriangleSelector )
{ {
CTerrainTriangleSelector* selector = (CTerrainTriangleSelector*)TriangleSelector; CTerrainTriangleSelector* selector = (CTerrainTriangleSelector*)TriangleSelector;
...@@ -547,10 +556,7 @@ namespace scene ...@@ -547,10 +556,7 @@ namespace scene
driver->setMaterial(Mesh.getMeshBuffer(0)->getMaterial()); driver->setMaterial(Mesh.getMeshBuffer(0)->getMaterial());
// For use with geomorphing // For use with geomorphing
driver->drawVertexPrimitiveList( driver->drawMeshBuffer(&RenderBuffer);
RenderBuffer.getVertices(), RenderBuffer.getVertexCount(),
RenderBuffer.getIndices(), IndicesToRender / 3,
video::EVT_2TCOORDS, EPT_TRIANGLES);
// for debug purposes only: // for debug purposes only:
if (DebugDataVisible) if (DebugDataVisible)
...@@ -818,6 +824,8 @@ namespace scene ...@@ -818,6 +824,8 @@ namespace scene
xval += resBySize; xval += resBySize;
x2val += res2BySize; x2val += res2BySize;
} }
RenderBuffer.setDirty(EBT_VERTEX);
} }
//! used to get the indices when generating index data for patches at varying levels of detail. //! used to get the indices when generating index data for patches at varying levels of detail.
......
...@@ -135,6 +135,10 @@ namespace scene ...@@ -135,6 +135,10 @@ namespace scene
//! Returns the mesh //! Returns the mesh
virtual IMesh* getMesh() { return &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. //! Gets the meshbuffer data based on a specified Level of Detail.
//! \param mb: A reference to an SMeshBufferLightMap object //! \param mb: A reference to an SMeshBufferLightMap object
//! \param LOD: The Level Of Detail you want the indices from. //! \param LOD: The Level Of Detail you want the indices from.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment