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
}
//! 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;}
......
......@@ -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;
......
......@@ -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. */
......
......@@ -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;}
......
......@@ -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;}
......
......@@ -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))
{
......
......@@ -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);
......
......@@ -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:
......
......@@ -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.
......
......@@ -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.
......
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