All pastes #2074037 Raw Edit

Anonymous

public diff v1 · immutable
#2074037 ·published 2011-06-03 08:07 UTC
rendered paste body
Subject: [PATCH 1/2] Initial instancing support--- source/Irrlicht/CNullDriver.cpp             |   13 +++++++ source/Irrlicht/CNullDriver.h               |    6 +++ source/Irrlicht/COpenGLDriver.cpp           |   46 +++++++++++++++++++++++++++ source/Irrlicht/COpenGLDriver.h             |    3 ++ source/Irrlicht/COpenGLExtensionHandler.cpp |    5 ++- source/Irrlicht/COpenGLExtensionHandler.h   |   13 +++++++ 6 files changed, 85 insertions(+), 1 deletions(-)diff --git a/source/Irrlicht/CNullDriver.cpp b/source/Irrlicht/CNullDriver.cppindex c69bacf..cc3a385 100644--- a/source/Irrlicht/CNullDriver.cpp+++ b/source/Irrlicht/CNullDriver.cpp@@ -1469,6 +1469,19 @@ void CNullDriver::drawMeshBuffer(const scene::IMeshBuffer* mb) 		drawVertexPrimitiveList(mb->getVertices(), mb->getVertexCount(), mb->getIndices(), mb->getIndexCount()/3, mb->getVertexType(), scene::EPT_TRIANGLES, mb->getIndexType()); } +//! Draws an instanced mesh buffer+void CNullDriver::drawInstancedMeshBuffer(const scene::IMeshBuffer* mb, const u32 num)+{+	if (!mb)+		return;++	//IVertexBuffer and IIndexBuffer later+	SHWBufferLink *HWBuffer=getBufferLink(mb);++	if (HWBuffer)+		drawInstancedHardwareBuffer(HWBuffer, num);+}+  CNullDriver::SHWBufferLink *CNullDriver::getBufferLink(const scene::IMeshBuffer* mb) {diff --git a/source/Irrlicht/CNullDriver.h b/source/Irrlicht/CNullDriver.hindex 8896784..ebdbbf4 100644--- a/source/Irrlicht/CNullDriver.h+++ b/source/Irrlicht/CNullDriver.h@@ -363,6 +363,9 @@ namespace video 		//! Draws a mesh buffer 		virtual void drawMeshBuffer(const scene::IMeshBuffer* mb); +		//! Draws an instanced mesh buffer+		virtual void drawInstancedMeshBuffer(const scene::IMeshBuffer* mb, const u32 num);+ 	protected: 		struct SHWBufferLink 		{@@ -401,6 +404,9 @@ namespace video 		//! Draw hardware buffer (only some drivers can) 		virtual void drawHardwareBuffer(SHWBufferLink *HWBuffer) {} +		//! Draw instancd hardware buffer (only some drivers can)+		virtual void drawInstancedHardwareBuffer(SHWBufferLink *HWBuffer, const u32 num) {}+ 		//! Update all hardware buffers, remove unused ones 		virtual void updateAllHardwareBuffers(); diff --git a/source/Irrlicht/COpenGLDriver.cpp b/source/Irrlicht/COpenGLDriver.cppindex 0d2a5ba..bf2e0e5 100644--- a/source/Irrlicht/COpenGLDriver.cpp+++ b/source/Irrlicht/COpenGLDriver.cpp@@ -1215,6 +1215,52 @@ void COpenGLDriver::drawHardwareBuffer(SHWBufferLink *_HWBuffer) #endif } +//! Draw instanced hardware buffer+void COpenGLDriver::drawInstancedHardwareBuffer(SHWBufferLink *_HWBuffer, const u32 num)+{+	if (!_HWBuffer)+		return;++	updateHardwareBuffer(_HWBuffer); //check if update is needed+	_HWBuffer->LastUsed=0; //reset count++#if defined(GL_ARB_vertex_buffer_object) && defined(GL_ARB_draw_instanced)+	SHWBufferLink_opengl *HWBuffer=(SHWBufferLink_opengl*)_HWBuffer;++	const scene::IMeshBuffer* mb = HWBuffer->MeshBuffer;+	const void *vertices=mb->getVertices();+	const void *indexList=mb->getIndices();++	if (HWBuffer->Mapped_Vertex==scene::EHM_NEVER)+		return;++	extGlBindBuffer(GL_ARRAY_BUFFER, HWBuffer->vbo_verticesID);+	vertices=0;++	extGlBindBuffer(GL_ELEMENT_ARRAY_BUFFER, HWBuffer->vbo_indicesID);+	indexList=0;++	GLenum indexSize = 0;+	switch (mb->getIndexType()) {+		case EIT_16BIT:+			indexSize = GL_UNSIGNED_SHORT;+		break;+		case EIT_32BIT:+			indexSize = GL_UNSIGNED_INT;+		break;+	}++//	drawVertexPrimitiveList(vertices, mb->getVertexCount(), indexList, mb->getIndexCount()/3, mb->getVertexType(), scene::EPT_TRIANGLES, mb->getIndexType());+	extGlDrawElementsInstanced(GL_TRIANGLES, mb->getIndexCount(), indexSize, indexList, num);++	printf("Drawing instanced hwbuf with idxcount %u, size %u, list %p, num %u\n",mb->getIndexCount(),+		indexSize, indexList, num);++	extGlBindBuffer(GL_ARRAY_BUFFER, 0);+	extGlBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);+#endif+}+  // small helper function to create vertex buffer object adress offsets static inline u8* buffer_offset(const long offset)diff --git a/source/Irrlicht/COpenGLDriver.h b/source/Irrlicht/COpenGLDriver.hindex 9aa4326..35e6da3 100644--- a/source/Irrlicht/COpenGLDriver.h+++ b/source/Irrlicht/COpenGLDriver.h@@ -99,6 +99,9 @@ namespace video 		//! Draw hardware buffer 		virtual void drawHardwareBuffer(SHWBufferLink *HWBuffer); +		//! Draw instanced hardware buffer+		virtual void drawInstancedHardwareBuffer(SHWBufferLink *HWBuffer, const u32 num);+ 		//! draws a vertex primitive list 		virtual void drawVertexPrimitiveList(const void* vertices, u32 vertexCount, 				const void* indexList, u32 primitiveCount,diff --git a/source/Irrlicht/COpenGLExtensionHandler.cpp b/source/Irrlicht/COpenGLExtensionHandler.cppindex ccd1417..0c2f153 100644--- a/source/Irrlicht/COpenGLExtensionHandler.cpp+++ b/source/Irrlicht/COpenGLExtensionHandler.cpp@@ -25,7 +25,7 @@ COpenGLExtensionHandler::COpenGLExtensionHandler() : 		MaxTextureSize(1), MaxGeometryVerticesOut(0), 		MaxTextureLODBias(0.f), Version(0), ShaderLanguageVersion(0) #ifdef _IRR_OPENGL_USE_EXTPOINTER_-	,pGlActiveTextureARB(0), pGlClientActiveTextureARB(0),+	,pGlDrawElementsInstancedARB(0), pGlActiveTextureARB(0), pGlClientActiveTextureARB(0), 	pGlGenProgramsARB(0), pGlGenProgramsNV(0), 	pGlBindProgramARB(0), pGlBindProgramNV(0), 	pGlDeleteProgramsARB(0), pGlDeleteProgramsNV(0),@@ -244,6 +244,9 @@ void COpenGLExtensionHandler::initExtensions(bool stencilBuffer) 	#endif 	#endif +	pGlDrawElementsInstancedARB = (PFNGLDRAWELEMENTSINSTANCEDARBPROC)+		IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glDrawElementsInstancedARB"));+ 	pGlActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) 		IRR_OGL_LOAD_EXTENSION(reinterpret_cast<const GLubyte*>("glActiveTextureARB")); diff --git a/source/Irrlicht/COpenGLExtensionHandler.h b/source/Irrlicht/COpenGLExtensionHandler.hindex 67e63cf..2e4b05d 100644--- a/source/Irrlicht/COpenGLExtensionHandler.h+++ b/source/Irrlicht/COpenGLExtensionHandler.h@@ -847,6 +847,7 @@ class COpenGLExtensionHandler 	void extGlCompressedTexImage2D(GLenum target, GLint level, 		GLenum internalformat, GLsizei width, GLsizei height, 		GLint border, GLsizei imageSize, const void* data);+	void extGlDrawElementsInstanced(GLenum, GLsizei, GLenum, const GLvoid *, GLsizei);  	// shader programming 	void extGlGenPrograms(GLsizei n, GLuint *programs);@@ -919,6 +920,7 @@ class COpenGLExtensionHandler 	bool FeatureAvailable[IRR_OpenGL_Feature_Count];  	#if defined(_IRR_OPENGL_USE_EXTPOINTER_)+		PFNGLDRAWELEMENTSINSTANCEDARBPROC pGlDrawElementsInstancedARB; 		PFNGLACTIVETEXTUREARBPROC pGlActiveTextureARB; 		PFNGLCLIENTACTIVETEXTUREARBPROC	pGlClientActiveTextureARB; 		PFNGLGENPROGRAMSARBPROC pGlGenProgramsARB;@@ -1012,6 +1014,17 @@ inline void COpenGLExtensionHandler::extGlActiveTexture(GLenum texture) #endif } +inline void COpenGLExtensionHandler::extGlDrawElementsInstanced(GLenum mode, GLsizei count,+	GLenum type, const GLvoid *ind, GLsizei num)+{+#ifdef _IRR_OPENGL_USE_EXTPOINTER_+	if (pGlDrawElementsInstancedARB)+		pGlDrawElementsInstancedARB(mode, count, type, ind, num);+#else+		glDrawElementsInstancedARB(mode, count, type, ind, num);+#endif+}+ inline void COpenGLExtensionHandler::extGlClientActiveTexture(GLenum texture) { #ifdef _IRR_OPENGL_USE_EXTPOINTER_-- 1.7.2.1