Skip to content

Commit

Permalink
Extend the draw calls of Drivers
Browse files Browse the repository at this point in the history
  • Loading branch information
Lauri Kasanen committed May 18, 2013
1 parent 48edb5e commit f688a18
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 21 deletions.
10 changes: 6 additions & 4 deletions include/IVideoDriver.h
Expand Up @@ -562,12 +562,13 @@ namespace video
\param primCount Amount of Primitives
\param vType Vertex type, e.g. video::EVT_STANDARD for S3DVertex.
\param pType Primitive type, e.g. scene::EPT_TRIANGLE_FAN for a triangle fan.
\param iType Index type, e.g. video::EIT_16BIT for 16bit indices. */
\param iType Index type, e.g. video::EIT_16BIT for 16bit indices.
\param num Number of times to draw this, via instancing. */
virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const void* indexList, u32 primCount,
E_VERTEX_TYPE vType=EVT_STANDARD,
scene::E_PRIMITIVE_TYPE pType=scene::EPT_TRIANGLES,
E_INDEX_TYPE iType=EIT_16BIT) =0;
E_INDEX_TYPE iType=EIT_16BIT, u32 num = 1) =0;

//! Draws a vertex primitive list in 2d
/** Compared to the general (3d) version of this method, this
Expand Down Expand Up @@ -943,8 +944,9 @@ namespace video
video::SColor rightDownEdge = video::SColor(255,0,0,0)) =0;

//! Draws a mesh buffer
/** \param mb Buffer to draw; */
virtual void drawMeshBuffer(const scene::IMeshBuffer* mb) =0;
/** \param mb Buffer to draw;
\param num Number of times to draw this, via instancing. */
virtual void drawMeshBuffer(const scene::IMeshBuffer* mb, u32 num = 1) =0;

//! Sets the fog mode.
/** These are global values attached to each 3d object rendered,
Expand Down
10 changes: 5 additions & 5 deletions source/Irrlicht/CNullDriver.cpp
Expand Up @@ -634,11 +634,11 @@ const core::rect<s32>& CNullDriver::getViewPort() const


//! draws a vertex primitive list
void CNullDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, const void* indexList, u32 primitiveCount, E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType)
void CNullDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount, const void* indexList, u32 primitiveCount, E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType, u32 num)
{
if ((iType==EIT_16BIT) && (vertexCount>65536))
os::Printer::log("Too many vertices for 16bit index type, render artifacts may occur.");
PrimitivesDrawn += primitiveCount;
PrimitivesDrawn += primitiveCount * num;
}


Expand Down Expand Up @@ -1494,7 +1494,7 @@ void CNullDriver::getFog(SColor& color, E_FOG_TYPE& fogType, f32& start, f32& en
}

//! Draws a mesh buffer
void CNullDriver::drawMeshBuffer(const scene::IMeshBuffer* mb)
void CNullDriver::drawMeshBuffer(const scene::IMeshBuffer* mb, u32 num)
{
if (!mb)
return;
Expand All @@ -1503,9 +1503,9 @@ void CNullDriver::drawMeshBuffer(const scene::IMeshBuffer* mb)
SHWBufferLink *HWBuffer=getBufferLink(mb);

if (HWBuffer)
drawHardwareBuffer(HWBuffer);
drawHardwareBuffer(HWBuffer, num);
else
drawVertexPrimitiveList(mb->getVertices(), mb->getVertexCount(), mb->getIndices(), indiceToPrimitiveCount(mb->getPrimitiveType(), mb->getIndexCount()), mb->getVertexType(), mb->getPrimitiveType(), mb->getIndexType());
drawVertexPrimitiveList(mb->getVertices(), mb->getVertexCount(), mb->getIndices(), indiceToPrimitiveCount(mb->getPrimitiveType(), mb->getIndexCount()), mb->getVertexType(), mb->getPrimitiveType(), mb->getIndexType(), num);
}


Expand Down
7 changes: 4 additions & 3 deletions source/Irrlicht/CNullDriver.h
Expand Up @@ -114,7 +114,8 @@ namespace video
//! draws a vertex primitive list
virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType=EVT_STANDARD, scene::E_PRIMITIVE_TYPE pType=scene::EPT_TRIANGLES, E_INDEX_TYPE iType=EIT_16BIT);
E_VERTEX_TYPE vType=EVT_STANDARD, scene::E_PRIMITIVE_TYPE pType=scene::EPT_TRIANGLES,
E_INDEX_TYPE iType=EIT_16BIT, u32 num = 1);

//! draws a vertex primitive list in 2d
virtual void draw2DVertexPrimitiveList(const void* vertices, u32 vertexCount,
Expand Down Expand Up @@ -364,7 +365,7 @@ namespace video
const core::dimension2d<u32>& size);

//! Draws a mesh buffer
virtual void drawMeshBuffer(const scene::IMeshBuffer* mb);
virtual void drawMeshBuffer(const scene::IMeshBuffer* mb, u32 num = 1);

protected:
struct SHWBufferLink
Expand Down Expand Up @@ -402,7 +403,7 @@ namespace video
virtual SHWBufferLink *createHardwareBuffer(const scene::IMeshBuffer* mb) {return 0;}

//! Draw hardware buffer (only some drivers can)
virtual void drawHardwareBuffer(SHWBufferLink *HWBuffer) {}
virtual void drawHardwareBuffer(SHWBufferLink *HWBuffer, u32 num = 1) {}

//! Update all hardware buffers, remove unused ones
virtual void updateAllHardwareBuffers();
Expand Down
20 changes: 14 additions & 6 deletions source/Irrlicht/COpenGLDriver.cpp
Expand Up @@ -1201,7 +1201,7 @@ void COpenGLDriver::deleteHardwareBuffer(SHWBufferLink *_HWBuffer)


//! Draw hardware buffer
void COpenGLDriver::drawHardwareBuffer(SHWBufferLink *_HWBuffer)
void COpenGLDriver::drawHardwareBuffer(SHWBufferLink *_HWBuffer, u32 num)
{
if (!_HWBuffer)
return;
Expand All @@ -1228,7 +1228,7 @@ void COpenGLDriver::drawHardwareBuffer(SHWBufferLink *_HWBuffer)
indexList=0;
}

drawVertexPrimitiveList(vertices, mb->getVertexCount(), indexList, indiceToPrimitiveCount(mb->getPrimitiveType(), mb->getIndexCount()), mb->getVertexType(), mb->getPrimitiveType(), mb->getIndexType());
drawVertexPrimitiveList(vertices, mb->getVertexCount(), indexList, indiceToPrimitiveCount(mb->getPrimitiveType(), mb->getIndexCount()), mb->getVertexType(), mb->getPrimitiveType(), mb->getIndexType(), num);

if (HWBuffer->Mapped_Vertex!=scene::EHM_NEVER)
extGlBindBuffer(GL_ARRAY_BUFFER, 0);
Expand All @@ -1248,15 +1248,22 @@ static inline u8* buffer_offset(const long offset)
//! draws a vertex primitive list
void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType)
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType,
u32 num)
{
if (!primitiveCount || !vertexCount)
return;

if (!checkPrimitiveCount(primitiveCount))
return;

CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType, iType);
if (num > 1 && !queryFeature(EVDF_INSTANCING))
{
os::Printer::log("Instancing requested but no HW support", ELL_WARNING);
return;
}

CNullDriver::drawVertexPrimitiveList(vertices, vertexCount, indexList, primitiveCount, vType, pType, iType, num);

if (vertices && !FeatureAvailable[IRR_ARB_vertex_array_bgra] && !FeatureAvailable[IRR_EXT_vertex_array_bgra])
getColorBuffer(vertices, vertexCount, vType);
Expand Down Expand Up @@ -1399,7 +1406,7 @@ void COpenGLDriver::drawVertexPrimitiveList(const void* vertices, u32 vertexCoun
break;
}

renderArray(indexList, primitiveCount, pType, iType);
renderArray(indexList, primitiveCount, pType, iType, num);

if (MultiTextureExtension)
{
Expand Down Expand Up @@ -1466,7 +1473,8 @@ void COpenGLDriver::getColorBuffer(const void* vertices, u32 vertexCount, E_VERT


void COpenGLDriver::renderArray(const void* indexList, u32 primitiveCount,
scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType)
scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType,
u32 num)
{
GLenum indexSize=0;

Expand Down
8 changes: 5 additions & 3 deletions source/Irrlicht/COpenGLDriver.h
Expand Up @@ -101,12 +101,13 @@ namespace video
virtual void deleteHardwareBuffer(SHWBufferLink *HWBuffer);

//! Draw hardware buffer
virtual void drawHardwareBuffer(SHWBufferLink *HWBuffer);
virtual void drawHardwareBuffer(SHWBufferLink *HWBuffer, u32 num = 1);

//! draws a vertex primitive list
virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount,
const void* indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType);
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType,
E_INDEX_TYPE iType, u32 num = 1);

//! draws a vertex primitive list in 2d
virtual void draw2DVertexPrimitiveList(const void* vertices, u32 vertexCount,
Expand Down Expand Up @@ -420,7 +421,8 @@ namespace video

//! helper function doing the actual rendering.
void renderArray(const void* indexList, u32 primitiveCount,
scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType);
scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType,
u32 num = 1);

//! Set the gl matrix mode, if not set already
void setMatrixMode(GLenum mode);
Expand Down

0 comments on commit f688a18

Please sign in to comment.