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
This commit is contained in:
parent
ee6f54877e
commit
580c3f5365
@ -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
|
|||||||
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
|
|||||||
//! 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
|
|||||||
|
|
||||||
|
|
||||||
//! 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
|
|||||||
|
|
||||||
|
|
||||||
//! 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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
|
|||||||
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
|
|||||||
|
|
||||||
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)
|
|||||||
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
|
|||||||
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
|
|||||||
|
|
||||||
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
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
|||||||
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
|
|||||||
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
|
|||||||
//! 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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user