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-e03cc46cb475master
parent
ee6f54877e
commit
580c3f5365
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue