From: <axl...@us...> - 2009-08-19 23:50:42
|
Revision: 501 http://hgengine.svn.sourceforge.net/hgengine/?rev=501&view=rev Author: axlecrusher Date: 2009-08-19 23:50:34 +0000 (Wed, 19 Aug 2009) Log Message: ----------- Poor man's OpenGL profiler. I can't afford gDEBugger. Modified Paths: -------------- Mercury2/src/BoundingBox.cpp Mercury2/src/FullscreenQuad.cpp Mercury2/src/GLHeaders.h Mercury2/src/GLHelpers.cpp Mercury2/src/Light.cpp Mercury2/src/Mercury2.cpp Mercury2/src/MercuryAsset.cpp Mercury2/src/MercuryFBO.cpp Mercury2/src/MercuryNode.cpp Mercury2/src/MercuryVBO.cpp Mercury2/src/Orthographic.cpp Mercury2/src/RenderBuffer.cpp Mercury2/src/RenderDifferedLights.cpp Mercury2/src/RenderGraph.cpp Mercury2/src/Shader.cpp Mercury2/src/Texture.cpp Mercury2/src/TransformNode.cpp Mercury2/src/Viewport.cpp Mercury2/src/X11Window.cpp Modified: Mercury2/src/BoundingBox.cpp =================================================================== --- Mercury2/src/BoundingBox.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/BoundingBox.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -14,7 +14,9 @@ OcclusionResult::~OcclusionResult() { if ( m_occlusionQuery != 0 ) - glDeleteQueriesARB( 1, &m_occlusionQuery ); + { + GLCALL( glDeleteQueriesARB( 1, &m_occlusionQuery ) ); + } m_occlusionQuery = 0; } @@ -23,7 +25,7 @@ if (m_occlusionQuery == 0) return ~0; uint32_t samples; - glGetQueryObjectuivARB(m_occlusionQuery, GL_QUERY_RESULT_ARB, &samples); + GLCALL( glGetQueryObjectuivARB(m_occlusionQuery, GL_QUERY_RESULT_ARB, &samples) ); return samples; } @@ -144,36 +146,36 @@ const float* center = GetCenter(); const float* extend = GetExtend(); - glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); - glDisable(GL_CULL_FACE); + GLCALL( glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT) ); + GLCALL( glDisable(GL_CULL_FACE) ); - glPushMatrix(); - glTranslatef(center[0], center[1], center[2]); - glScalef(extend[0],extend[1],extend[2]); + GLCALL( glPushMatrix() ); + GLCALL( glTranslatef(center[0], center[1], center[2]) ); + GLCALL( glScalef(extend[0],extend[1],extend[2]) ); if (m_vboID == 0) InitVBO(); if ( MercuryVBO::m_lastVBOrendered != &m_vboID ) { MercuryVBO::m_lastVBOrendered = &m_vboID; - glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vboID); // once - glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); // once - glVertexPointer(3, GL_FLOAT, 0, 0); // once + GLCALL( glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vboID) ); // once + GLCALL( glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); // once + GLCALL( glVertexPointer(3, GL_FLOAT, 0, 0) ); // once } - if (result.GetQueryID() == 0) glGenQueriesARB(1, &result.GetQueryID()); - glBeginQueryARB(GL_SAMPLES_PASSED_ARB, result.GetQueryID()); + if (result.GetQueryID() == 0) { GLCALL( glGenQueriesARB(1, &result.GetQueryID()) ); } + GLCALL( glBeginQueryARB(GL_SAMPLES_PASSED_ARB, result.GetQueryID()) ); - glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - glDepthMask(GL_FALSE); + GLCALL( glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE) ); + GLCALL( glDepthMask(GL_FALSE) ); - glDrawArrays(GL_QUADS, 0, 24); + GLCALL( glDrawArrays(GL_QUADS, 0, 24) ); - glEndQueryARB(GL_SAMPLES_PASSED_ARB); -// glGetQueryObjectuivARB(q, GL_QUERY_RESULT_ARB, &samples); + GLCALL( glEndQueryARB(GL_SAMPLES_PASSED_ARB) ); +// GLCALL( glGetQueryObjectuivARB(q, GL_QUERY_RESULT_ARB, &samples) ); - glPopMatrix(); - glPopAttrib( ); + GLCALL( glPopMatrix() ); + GLCALL( glPopAttrib( ) ); } void BoundingBox::RenderFaces() const @@ -181,22 +183,22 @@ const float* center = GetCenter(); const float* extend = GetExtend(); - glPushMatrix(); - glTranslatef(center[0], center[1], center[2]); - glScalef(extend[0],extend[1],extend[2]); + GLCALL( glPushMatrix() ); + GLCALL( glTranslatef(center[0], center[1], center[2]) ); + GLCALL( glScalef(extend[0],extend[1],extend[2]) ); if (m_vboID == 0) InitVBO(); // if ( MercuryVBO::m_lastVBOrendered != &m_vboID ) { MercuryVBO::m_lastVBOrendered = &m_vboID; - glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vboID); // once - glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); // once - glVertexPointer(3, GL_FLOAT, 0, 0); // once + GLCALL( glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vboID) ); // once + GLCALL( glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0) ); // once + GLCALL( glVertexPointer(3, GL_FLOAT, 0, 0) ); // once } - glDrawArrays(GL_QUADS, 0, 24); - glPopMatrix(); + GLCALL( glDrawArrays(GL_QUADS, 0, 24) ); + GLCALL( glPopMatrix() ); } void BoundingBox::Render() @@ -209,85 +211,85 @@ const float* center = GetCenter(); const float* extend = GetExtend(); - glPushMatrix(); -// glLoadIdentity(); - glPushAttrib( GL_CURRENT_BIT ); - glBegin(GL_LINES); - glColor3f(0,1.0f,0); + GLCALL( glPushMatrix() ); +// GLCALL( glLoadIdentity() ); + GLCALL( glPushAttrib( GL_CURRENT_BIT ) ); + GLCALL( glBegin(GL_LINES) ); + GLCALL( glColor3f(0,1.0f,0) ); //front - glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]); - glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]); - glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]); - glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]); - glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]); - glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]); - glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]); - glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]); + GLCALL( glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]) ); + GLCALL( glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]) ); + GLCALL( glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]) ); + GLCALL( glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]) ); + GLCALL( glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]) ); + GLCALL( glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]) ); + GLCALL( glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]) ); + GLCALL( glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]) ); //back - glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]); - glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]); - glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]); - glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]); - glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]); - glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]); - glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]); - glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]); + GLCALL( glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]) ); + GLCALL( glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]) ); + GLCALL( glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]) ); + GLCALL( glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]) ); + GLCALL( glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]) ); + GLCALL( glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]) ); + GLCALL( glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]) ); + GLCALL( glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]) ); //top - glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]); - glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]); - glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]); - glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]); + GLCALL( glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]-extend[2]) ); + GLCALL( glVertex3f(center[0]-extend[0], center[1]+extend[1], center[2]+extend[2]) ); + GLCALL( glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]-extend[2]) ); + GLCALL( glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]) ); //bottom - glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]); - glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]); - glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]); - glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]); + GLCALL( glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]) ); + GLCALL( glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]+extend[2]) ); + GLCALL( glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]-extend[2]) ); + GLCALL( glVertex3f(center[0]+extend[0], center[1]-extend[1], center[2]+extend[2]) ); - glEnd(); + GLCALL( glEnd() ); - glPointSize(4); - glBegin(GL_POINTS); + GLCALL( glPointSize(4) ); + GLCALL( glBegin(GL_POINTS) ); //center - glVertex3f(center[0], center[1], center[2]); + GLCALL( glVertex3f(center[0], center[1], center[2]) ); //max point - glColor3f(1,1,0); - glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]); + GLCALL( glColor3f(1,1,0) ); + GLCALL( glVertex3f(center[0]+extend[0], center[1]+extend[1], center[2]+extend[2]) ); //min point -// glColor3f(1,0,0); - glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]); - glEnd(); +// GLCALL( glColor3f(1,0,0) ); + GLCALL( glVertex3f(center[0]-extend[0], center[1]-extend[1], center[2]-extend[2]) ); + GLCALL( glEnd() ); //normals MercuryVertex c; - glBegin(GL_LINES); + GLCALL( glBegin(GL_LINES) ); - glColor3f(1.0f,0,0); - glVertex3f(center[0], center[1], center[2]); + GLCALL( glColor3f(1.0f,0,0) ); + GLCALL( glVertex3f(center[0], center[1], center[2]) ); c = center; c += m_normals[0]; - glVertex3f(c.GetX(), c.GetY(), c.GetZ()); + GLCALL( glVertex3f(c.GetX(), c.GetY(), c.GetZ()) ); - glColor3f(0,1.0f,0); - glVertex3f(center[0], center[1], center[2]); + GLCALL( glColor3f(0,1.0f,0) ); + GLCALL( glVertex3f(center[0], center[1], center[2]) ); c = center; c += m_normals[1]; - glVertex3f(c.GetX(), c.GetY(), c.GetZ()); + GLCALL( glVertex3f(c.GetX(), c.GetY(), c.GetZ()) ); - glColor3f(0,0,1.0f); - glVertex3f(center[0], center[1], center[2]); + GLCALL( glColor3f(0,0,1.0f) ); + GLCALL( glVertex3f(center[0], center[1], center[2]) ); c = center; c += m_normals[2]; - glVertex3f(c.GetX(), c.GetY(), c.GetZ()); + GLCALL( glVertex3f(c.GetX(), c.GetY(), c.GetZ()) ); - glEnd(); + GLCALL( glEnd() ); - glPopAttrib( ); - glPopMatrix(); + GLCALL( glPopAttrib( ) ); + GLCALL( glPopMatrix() ); } void BoundingBox::PopulateVertices() @@ -336,11 +338,11 @@ void BoundingBox::InitVBO() { - glGenBuffersARB(1, &m_vboID); + GLCALL( glGenBuffersARB(1, &m_vboID) ); //vertex VBO - glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vboID); - glBufferDataARB(GL_ARRAY_BUFFER_ARB, m_vertexData.LengthInBytes(), m_vertexData.Buffer(), GL_STATIC_DRAW_ARB); + GLCALL( glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vboID) ); + GLCALL( glBufferDataARB(GL_ARRAY_BUFFER_ARB, m_vertexData.LengthInBytes(), m_vertexData.Buffer(), GL_STATIC_DRAW_ARB) ); } AlignedBuffer<float> BoundingBox::m_vertexData; Modified: Mercury2/src/FullscreenQuad.cpp =================================================================== --- Mercury2/src/FullscreenQuad.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/FullscreenQuad.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -13,20 +13,20 @@ void FullscreenQuad::Render(const MercuryNode* node) { - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); -// glLoadIdentity(); - glLoadMatrixf( m_matrix.Ptr() ); //this is OK + GLCALL( glMatrixMode(GL_MODELVIEW) ); + GLCALL( glPushMatrix() ); +// GLCALL( glLoadIdentity() ); + GLCALL( glLoadMatrixf( m_matrix.Ptr() ) ); //this is OK - glMatrixMode(GL_PROJECTION); - glPushMatrix(); -// glLoadIdentity(); + GLCALL( glMatrixMode(GL_PROJECTION) ); + GLCALL( glPushMatrix() ); +// GLCALL( glLoadIdentity() ); Quad::Render( node ); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); + GLCALL( glPopMatrix() ); + GLCALL( glMatrixMode(GL_MODELVIEW) ); + GLCALL( glPopMatrix() ); } FullscreenQuad* FullscreenQuad::Generate() Modified: Mercury2/src/GLHeaders.h =================================================================== --- Mercury2/src/GLHeaders.h 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/GLHeaders.h 2009-08-19 23:50:34 UTC (rev 501) @@ -23,17 +23,19 @@ #include <MercuryLog.h> +#define GLCALL(x) x; ++GLCALLCOUNT; + #define GLERRORCHECK { \ -uint32_t e = glGetError(); \ +uint32_t e = GLCALL( glGetError() ); \ if ( e != GL_NO_ERROR ) { \ LOG.Write(ssprintf("GL Error:%s", GlError2String(e).c_str())); \ assert(0); } } #define CHECKFBO { \ -uint32_t e = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); \ +uint32_t e = GLCALL( glCheckFramebufferStatusEXT(GL_FRAMEBUFFER) ); \ if ( e != GL_FRAMEBUFFER_COMPLETE ) { \ LOG.Write(ssprintf("GL FBO Error:%s", GlError2String(e).c_str())); \ assert(0); } } - +extern uint32_t GLCALLCOUNT; #endif Modified: Mercury2/src/GLHelpers.cpp =================================================================== --- Mercury2/src/GLHelpers.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/GLHelpers.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -1,6 +1,8 @@ #include <GLHeaders.h> #include <GLHelpers.h> +uint32_t GLCALLCOUNT = 0; + MString GlError2String(uint32_t e) { switch (e) @@ -63,13 +65,13 @@ GLdouble modelview[16]; GLdouble projection[16]; - glGetIntegerv(GL_VIEWPORT, viewport); - glGetDoublev(GL_MODELVIEW_MATRIX, modelview); - glGetDoublev(GL_PROJECTION_MATRIX, projection); + GLCALL( glGetIntegerv(GL_VIEWPORT, viewport) ); + GLCALL( glGetDoublev(GL_MODELVIEW_MATRIX, modelview) ); + GLCALL( glGetDoublev(GL_PROJECTION_MATRIX, projection) ); winX = (float)screen_x; winY = (float)viewport[3] - (float)screen_y; - glReadPixels( screen_x, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ ); + GLCALL( glReadPixels( screen_x, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ ) ); gluUnProject( winX, winY, winZ, Modified: Mercury2/src/Light.cpp =================================================================== --- Mercury2/src/Light.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/Light.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -131,7 +131,7 @@ void Light::DifferedRender() { - glLoadMatrix( m_worldPosition ); + GLCALL( glLoadMatrix( m_worldPosition ) ); if ( !m_boundingVolume ) return; if ( m_shader.IsValid() ) @@ -169,9 +169,9 @@ if (m_fullscreen) { - glCullFace(GL_BACK); + GLCALL( glCullFace(GL_BACK) ); m_fullScreenQuad.Render( this ); - glCullFace(GL_FRONT); + GLCALL( glCullFace(GL_FRONT) ); } else bb->RenderFaces(); Modified: Mercury2/src/Mercury2.cpp =================================================================== --- Mercury2/src/Mercury2.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/Mercury2.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -106,8 +106,11 @@ float batches = MercuryVBO::ResetBatchCount()/(float)m_count; float VBinds = MercuryVBO::ResetBindCount()/(float)m_count; float Tbinds = Texture::ReadAndResetBindCount()/(float)m_count; + float GLcalls = GLCALLCOUNT/(float)m_count; LOG.Write( ssprintf("FPS: %f, VBO batches %f, TBinds %f, VBinds %f", m_count/fpsTimer.Age(), batches, Tbinds, VBinds) ); + LOG.Write( ssprintf("GL/f: %f", GLcalls) ); m_count = 0; + GLCALLCOUNT = 0; fpsTimer = timer; } } Modified: Mercury2/src/MercuryAsset.cpp =================================================================== --- Mercury2/src/MercuryAsset.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/MercuryAsset.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -71,18 +71,18 @@ void MercuryAsset::DrawAxes() { - glBegin(GL_LINES); - glColor3f(1,0,0); - glVertex3f(0,0,0); - glVertex3f(0.5,0,0); - glColor3f(0,1,0); - glVertex3f(0,0,0); - glVertex3f(0,0.5,0); - glColor3f(0,0,1); - glVertex3f(0,0,0); - glVertex3f(0,0,0.5); - glColor3f(1,1,1); - glEnd(); + GLCALL( glBegin(GL_LINES) ); + GLCALL( glColor3f(1,0,0) ); + GLCALL( glVertex3f(0,0,0) ); + GLCALL( glVertex3f(0.5,0,0) ); + GLCALL( glColor3f(0,1,0) ); + GLCALL( glVertex3f(0,0,0) ); + GLCALL( glVertex3f(0,0.5,0) ); + GLCALL( glColor3f(0,0,1) ); + GLCALL( glVertex3f(0,0,0) ); + GLCALL( glVertex3f(0,0,0.5) ); + GLCALL( glColor3f(1,1,1) ); + GLCALL( glEnd() ); } MercuryAssetInstance::MercuryAssetInstance(MercuryAsset* asset) Modified: Mercury2/src/MercuryFBO.cpp =================================================================== --- Mercury2/src/MercuryFBO.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/MercuryFBO.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -24,8 +24,8 @@ void MercuryFBO::Clean() { - if (m_fboID != 0) glDeleteFramebuffersEXT(1, &m_fboID); - if (m_depthBufferID != 0) glDeleteRenderbuffersEXT( 1, &m_depthBufferID ); + if (m_fboID != 0) { GLCALL( glDeleteFramebuffersEXT(1, &m_fboID) ); } + if (m_depthBufferID != 0) { GLCALL( glDeleteRenderbuffersEXT( 1, &m_depthBufferID ) ); } m_fboID = m_depthBufferID = 0; m_initiated = false; for (uint8_t i = 0; i < 4; ++i) m_textures[i] = NULL; @@ -43,8 +43,8 @@ void MercuryFBO::GenerateFBO() { - if( m_useDepth ) glGenRenderbuffersEXT( 1, &m_depthBufferID ); - glGenFramebuffersEXT( 1, &m_fboID ); + if( m_useDepth ) { GLCALL( glGenRenderbuffersEXT( 1, &m_depthBufferID ) ); } + GLCALL( glGenFramebuffersEXT( 1, &m_fboID ) ); for (uint8_t i = 0; i < m_numTextures; ++i) { @@ -58,16 +58,20 @@ { if( m_useDepth ) { - glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, m_fboID ); - glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, m_width, m_height ); + GLCALL( glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, m_fboID ) ); + GLCALL( glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, m_width, m_height ) ); } - glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_fboID ); + GLCALL( glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, m_fboID ) ); for (uint8_t i = 0; i < m_numTextures; ++i) - glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + i, GL_TEXTURE_2D, m_textures[i]->TextureID(), 0 ); - + { + GLCALL( glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + i, GL_TEXTURE_2D, m_textures[i]->TextureID(), 0 ) ); + } + if( m_useDepth ) - glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthBufferID ); + { + GLCALL( glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthBufferID ) ); + } } @@ -75,7 +79,7 @@ void MercuryFBO::InitFBOBeforeRender() { m_initiated = true; - glGenFramebuffersEXT(1, &m_fboID); + GLCALL( glGenFramebuffersEXT(1, &m_fboID) ); CHECKFBO; GLERRORCHECK; } @@ -104,19 +108,19 @@ GLERRORCHECK; } - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fboID); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GLCALL( glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fboID) ); + GLCALL( glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ); GLERRORCHECK; const GLenum buffers[8] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_COLOR_ATTACHMENT2_EXT, GL_COLOR_ATTACHMENT3_EXT, GL_COLOR_ATTACHMENT4_EXT, GL_COLOR_ATTACHMENT5_EXT, GL_COLOR_ATTACHMENT6_EXT, GL_COLOR_ATTACHMENT7_EXT }; - glDrawBuffersARB( m_numTextures, buffers ); + GLCALL( glDrawBuffersARB( m_numTextures, buffers ) ); - glPushAttrib(GL_VIEWPORT_BIT); + GLCALL( glPushAttrib(GL_VIEWPORT_BIT) ); - if ( !m_useScreenSize ) glViewport(0,0,m_width, m_height); + if ( !m_useScreenSize ) { GLCALL( glViewport(0,0,m_width, m_height) ); } GLERRORCHECK; MercuryNode::Render(matrix); @@ -125,19 +129,19 @@ void MercuryFBO::PostRender(const MercuryMatrix& matrix) { - glPopAttrib(); + GLCALL( glPopAttrib() ); MercuryNode::PostRender(matrix); // for( uint8_t i = 0; i < m_numTextures; i++ ) // { -// glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + i, GL_TEXTURE_2D, 0, 0 ); -// glActiveTextureARB( GL_TEXTURE0_ARB + i ); -// glDisable( GL_TEXTURE_2D ); +// GLCALL( glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + i, GL_TEXTURE_2D, 0, 0 ) ); +// GLCALL( glActiveTextureARB( GL_TEXTURE0_ARB + i ) ); +// GLCALL( glDisable( GL_TEXTURE_2D ) ); // } // CURRENTRENDERGRAPH->DoDifferedLightPass(); - glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ); -// glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ); + GLCALL( glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, 0 ) ); +// GLCALL( glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, 0 ) ); // CURRENTRENDERGRAPH->DoDifferedLightPass(); CHECKFBO; Modified: Mercury2/src/MercuryNode.cpp =================================================================== --- Mercury2/src/MercuryNode.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/MercuryNode.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -198,7 +198,7 @@ //the alpha render path requires that all things things happen, so //it is just easier to leave it here than to duplicate this code in //RenderGraph::RenderAlpha - glLoadMatrix( modelView ); + GLCALL( glLoadMatrix( modelView ) ); ShaderAttribute sa; sa.type = ShaderAttribute::TYPE_MATRIX; @@ -216,7 +216,7 @@ child->RecursiveRender(); } - glLoadMatrix( modelView ); + GLCALL( glLoadMatrix( modelView ) ); Shader::SetAttribute("HG_ModelMatrix", sa); PostRender( modelView ); //calls on children assets } Modified: Mercury2/src/MercuryVBO.cpp =================================================================== --- Mercury2/src/MercuryVBO.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/MercuryVBO.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -19,7 +19,7 @@ MercuryVBO::~MercuryVBO() { - if (m_bufferIDs[0]) glDeleteBuffersARB(2, m_bufferIDs); + if (m_bufferIDs[0]) { GLCALL( glDeleteBuffersARB(2, m_bufferIDs) ); } m_bufferIDs[0] = m_bufferIDs[1] = 0; } @@ -39,24 +39,24 @@ if( m_bDirtyIndices ) UpdateIndices(); - glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_bufferIDs[0]); - glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_bufferIDs[1]); - glVertexPointer(3, GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*5)); + GLCALL( glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_bufferIDs[0]) ); + GLCALL( glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_bufferIDs[1]) ); + GLCALL( glVertexPointer(3, GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*5)) ); ++m_vboBinds; } //apply all the active Textures for (uint8_t i = 0; i < numTextures; ++i) { - glActiveTexture( GL_TEXTURE0+i ); - glClientActiveTextureARB(GL_TEXTURE0+i); - glTexCoordPointer(2, GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*0)); + GLCALL( glActiveTexture( GL_TEXTURE0+i ) ); + GLCALL( glClientActiveTextureARB(GL_TEXTURE0+i) ); + GLCALL( glTexCoordPointer(2, GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*0)) ); } - glEnableClientState( GL_NORMAL_ARRAY ); - glNormalPointer(GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*2)); + GLCALL( glEnableClientState( GL_NORMAL_ARRAY ) ); + GLCALL( glNormalPointer(GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*2)) ); - glDrawRangeElements(GL_TRIANGLES, 0, m_indexData.Length()-1, m_indexData.Length(), GL_UNSIGNED_SHORT, NULL); + GLCALL( glDrawRangeElements(GL_TRIANGLES, 0, m_indexData.Length()-1, m_indexData.Length(), GL_UNSIGNED_SHORT, NULL) ); m_vboBatches++; if (m_boundingVolume && SHOWBOUNDINGVOLUME) m_boundingVolume->Render(); @@ -67,27 +67,27 @@ { if (!m_bufferIDs[0]) { - glGenBuffersARB(2, m_bufferIDs); + GLCALL( glGenBuffersARB(2, m_bufferIDs) ); } UpdateIndices(); UpdateVertices(); - glEnableClientState(GL_VERTEX_ARRAY); + GLCALL( glEnableClientState(GL_VERTEX_ARRAY) ); m_initiated = true; } void MercuryVBO::UpdateIndices() { - glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_bufferIDs[1]); - glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_indexData.LengthInBytes(), m_indexData.Buffer(), GL_STATIC_DRAW_ARB); + GLCALL( glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_bufferIDs[1]) ); + GLCALL( glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_indexData.LengthInBytes(), m_indexData.Buffer(), GL_STATIC_DRAW_ARB) ); m_bDirtyIndices = 0; } void MercuryVBO::UpdateVertices() { - glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_bufferIDs[0]); - glBufferDataARB(GL_ARRAY_BUFFER_ARB, m_vertexData.LengthInBytes(), m_vertexData.Buffer(), GL_STATIC_DRAW_ARB); + GLCALL( glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_bufferIDs[0]) ); + GLCALL( glBufferDataARB(GL_ARRAY_BUFFER_ARB, m_vertexData.LengthInBytes(), m_vertexData.Buffer(), GL_STATIC_DRAW_ARB) ); m_bDirtyVertices = 0; } Modified: Mercury2/src/Orthographic.cpp =================================================================== --- Mercury2/src/Orthographic.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/Orthographic.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -13,9 +13,9 @@ FRUSTUM = &m_frustum; //Load the frustum into the projection - glMatrixMode(GL_PROJECTION); - glLoadMatrix( m_frustum.GetMatrix() ); - glMatrixMode(GL_MODELVIEW); + GLCALL( glMatrixMode(GL_PROJECTION) ); + GLCALL( glLoadMatrix( m_frustum.GetMatrix() ) ); + GLCALL( glMatrixMode(GL_MODELVIEW) ); VIEWMATRIX = matrix; MercuryNode::PreRender(matrix); @@ -26,9 +26,9 @@ FRUSTUM = &m_frustum; //Load the frustum into the projection - glMatrixMode(GL_PROJECTION); - glLoadMatrix( m_frustum.GetMatrix() ); - glMatrixMode(GL_MODELVIEW); + GLCALL( glMatrixMode(GL_PROJECTION) ); + GLCALL( glLoadMatrix( m_frustum.GetMatrix() ) ); + GLCALL( glMatrixMode(GL_MODELVIEW) ); VIEWMATRIX = matrix; MercuryNode::Render(matrix); Modified: Mercury2/src/RenderBuffer.cpp =================================================================== --- Mercury2/src/RenderBuffer.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/RenderBuffer.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -14,28 +14,28 @@ RenderBuffer::~RenderBuffer() { - if (m_bufferID != 0) glDeleteRenderbuffersEXT(1, &m_bufferID); + if (m_bufferID != 0) { GLCALL( glDeleteRenderbuffersEXT(1, &m_bufferID) ); } } void RenderBuffer::Render(const MercuryNode* node) { if ( !m_initiated ) InitRenderBuffer(); - glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_bufferID); + GLCALL( glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_bufferID) ); if ( NeedResize() ) AllocateSpace(); if ( m_type == TEXTURE ) { - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GLAttachPoint(), GL_TEXTURE_2D, m_textureID, 0); + GLCALL( glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GLAttachPoint(), GL_TEXTURE_2D, m_textureID, 0) ); } else { - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GLAttachPoint(), GL_RENDERBUFFER_EXT, m_bufferID); + GLCALL( glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GLAttachPoint(), GL_RENDERBUFFER_EXT, m_bufferID) ); } CHECKFBO; - glClearColor(0.0, 0.0, 0.0, 0.0); - glClear(GL_COLOR_BUFFER_BIT ); + GLCALL( glClearColor(0.0, 0.0, 0.0, 0.0) ); + GLCALL( glClear(GL_COLOR_BUFFER_BIT ) ); GLERRORCHECK; } @@ -44,57 +44,57 @@ GLERRORCHECK; if ( m_type == TEXTURE ) { - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); + GLCALL( glMatrixMode(GL_MODELVIEW) ); + GLCALL( glPushMatrix() ); + GLCALL( glLoadIdentity() ); GLERRORCHECK; - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); + GLCALL( glMatrixMode(GL_PROJECTION) ); + GLCALL( glPushMatrix() ); + GLCALL( glLoadIdentity() ); GLERRORCHECK; // printf("active %d\n", Texture::NumberActiveTextures() ); //this works with a "normal" texture, FBO texture is still white - glActiveTexture( GL_TEXTURE0 ); - glClientActiveTextureARB(GL_TEXTURE0); - glEnable( GL_TEXTURE_2D ); - glBindTexture(GL_TEXTURE_2D, m_textureID); - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); + GLCALL( glActiveTexture( GL_TEXTURE0 ) ); + GLCALL( glClientActiveTextureARB(GL_TEXTURE0) ); + GLCALL( glEnable( GL_TEXTURE_2D ) ); + GLCALL( glBindTexture(GL_TEXTURE_2D, m_textureID) ); + GLCALL( glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ); GLERRORCHECK; - glBegin(GL_QUADS); - glTexCoord2d(0,1); - glVertex3i(-1, -1, -1); + GLCALL( glBegin(GL_QUADS) ); + GLCALL( glTexCoord2d(0,1) ); + GLCALL( glVertex3i(-1, -1, -1) ); - glTexCoord2d(1,1); - glVertex3i(1, -1, -1); + GLCALL( glTexCoord2d(1,1) ); + GLCALL( glVertex3i(1, -1, -1) ); - glTexCoord2d(1,0); - glVertex3i(1, 1, -1); + GLCALL( glTexCoord2d(1,0) ); + GLCALL( glVertex3i(1, 1, -1) ); - glTexCoord2d(0,0); - glVertex3i(-1, 1, -1); + GLCALL( glTexCoord2d(0,0) ); + GLCALL( glVertex3i(-1, 1, -1) ); - glEnd(); + GLCALL( glEnd() ); GLERRORCHECK; - glBindTexture(GL_TEXTURE_2D, 0); -// glActiveTexture( GL_TEXTURE0 ); -// glClientActiveTextureARB(GL_TEXTURE0); -// glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glDisable( GL_TEXTURE_2D ); + GLCALL( glBindTexture(GL_TEXTURE_2D, 0) ); +// GLCALL( glActiveTexture( GL_TEXTURE0 ) ); +// GLCALL( glClientActiveTextureARB(GL_TEXTURE0) ); +// GLCALL( glDisableClientState(GL_TEXTURE_COORD_ARRAY) ); + GLCALL( glDisable( GL_TEXTURE_2D ) ); GLERRORCHECK; - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); + GLCALL( glPopMatrix() ); + GLCALL( glMatrixMode(GL_MODELVIEW) ); + GLCALL( glPopMatrix() ); GLERRORCHECK; } @@ -103,10 +103,10 @@ void RenderBuffer::InitRenderBuffer() { m_initiated = true; - glGenRenderbuffersEXT(1, &m_bufferID); + GLCALL( glGenRenderbuffersEXT(1, &m_bufferID) ); CHECKFBO; GLERRORCHECK; - if (m_type == TEXTURE) glGenTextures(1, &m_textureID); + if (m_type == TEXTURE) { GLCALL( glGenTextures(1, &m_textureID) ); } CHECKFBO; GLERRORCHECK; } @@ -120,11 +120,13 @@ if (m_type == TEXTURE) { - glBindTexture(GL_TEXTURE_2D, m_textureID); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + GLCALL( glBindTexture(GL_TEXTURE_2D, m_textureID) ); + GLCALL( glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_width, m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL) ); } else - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GLType(), m_width, m_height); + { + GLCALL( glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GLType(), m_width, m_height) ); + } GLERRORCHECK; } Modified: Mercury2/src/RenderDifferedLights.cpp =================================================================== --- Mercury2/src/RenderDifferedLights.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/RenderDifferedLights.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -23,21 +23,21 @@ //apply all the active Textures for (uint8_t i = 0; i < numTextures; ++i) { - glActiveTexture( GL_TEXTURE0+i ); - glClientActiveTextureARB(GL_TEXTURE0+i); - glTexCoordPointer(2, GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*0)); + GLCALL( glActiveTexture( GL_TEXTURE0+i ) ); + GLCALL( glClientActiveTextureARB(GL_TEXTURE0+i) ); + GLCALL( glTexCoordPointer(2, GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*0)) ); } - glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_POLYGON_BIT); - glCullFace(GL_FRONT); + GLCALL( glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_POLYGON_BIT) ); + GLCALL( glCullFace(GL_FRONT) ); - glDisable(GL_DEPTH_TEST); - glDepthMask(false); - glBlendFunc(GL_ONE, GL_ONE); + GLCALL( glDisable(GL_DEPTH_TEST) ); + GLCALL( glDepthMask(false) ); + GLCALL( glBlendFunc(GL_ONE, GL_ONE) ); CURRENTRENDERGRAPH->DoDifferedLightPass(); - glPopAttrib( ); + GLCALL( glPopAttrib( ) ); } RenderDifferedLights* RenderDifferedLights::Generate() Modified: Mercury2/src/RenderGraph.cpp =================================================================== --- Mercury2/src/RenderGraph.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/RenderGraph.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -20,7 +20,7 @@ modelView = m_node->ManipulateMatrix( *m_matrix ); if ( m_node->IsHidden() || m_node->IsCulled(modelView) ) return; - glLoadMatrix( modelView ); + GLCALL( glLoadMatrix( modelView ) ); sa.type = ShaderAttribute::TYPE_MATRIX; sa.value.matrix = m_matrix->Ptr(); @@ -36,7 +36,7 @@ if (m_node) { - glLoadMatrix( modelView ); + GLCALL( glLoadMatrix( modelView ) ); Shader::SetAttribute("HG_ModelMatrix", sa); m_node->PostRender( modelView ); //calls on children assets } Modified: Mercury2/src/Shader.cpp =================================================================== --- Mercury2/src/Shader.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/Shader.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -193,16 +193,16 @@ GLint bFragCompiled; GLint stringLength; - fragmentShader = glCreateShaderObjectARB( GL_FRAGMENT_SHADER_ARB ); - glShaderSourceARB( fragmentShader, 1, &sShaderCode, NULL ); - glCompileShaderARB( fragmentShader ); + fragmentShader = GLCALL( glCreateShaderObjectARB( GL_FRAGMENT_SHADER_ARB ) ); + GLCALL( glShaderSourceARB( fragmentShader, 1, &sShaderCode, NULL ) ); + GLCALL( glCompileShaderARB( fragmentShader ) ); - glGetObjectParameterivARB( fragmentShader, GL_OBJECT_COMPILE_STATUS_ARB, &bFragCompiled ); - glGetObjectParameterivARB( fragmentShader, GL_OBJECT_INFO_LOG_LENGTH_ARB, &stringLength ); + GLCALL( glGetObjectParameterivARB( fragmentShader, GL_OBJECT_COMPILE_STATUS_ARB, &bFragCompiled ) ); + GLCALL( glGetObjectParameterivARB( fragmentShader, GL_OBJECT_INFO_LOG_LENGTH_ARB, &stringLength ) ); if ( stringLength > 1 ) { char * tmpstr = (char*)malloc( stringLength + 1 ); - glGetInfoLogARB( fragmentShader, stringLength, NULL, tmpstr ); + GLCALL( glGetInfoLogARB( fragmentShader, stringLength, NULL, tmpstr ) ); puts( "Compiling Fragment Shader response follows:" ); puts( tmpstr ); free( tmpstr ); @@ -219,18 +219,18 @@ GLint bVertCompiled; GLint stringLength; //Create a new vertex shader - vertexShader = glCreateShaderObjectARB( GL_VERTEX_SHADER_ARB ); + vertexShader = GLCALL( glCreateShaderObjectARB( GL_VERTEX_SHADER_ARB ) ); //Bind the shader to the text, setting that to be its source. - glShaderSourceARB( vertexShader, 1, &sShaderCode, NULL ); + GLCALL( glShaderSourceARB( vertexShader, 1, &sShaderCode, NULL ) ); //Compile the shader - glCompileShaderARB( vertexShader ); + GLCALL( glCompileShaderARB( vertexShader ) ); //Did the shader compile? Were there any errors? - glGetObjectParameterivARB( vertexShader, GL_OBJECT_COMPILE_STATUS_ARB, &bVertCompiled ); - glGetObjectParameterivARB( vertexShader, GL_OBJECT_INFO_LOG_LENGTH_ARB, &stringLength ); + GLCALL( glGetObjectParameterivARB( vertexShader, GL_OBJECT_COMPILE_STATUS_ARB, &bVertCompiled ) ); + GLCALL( glGetObjectParameterivARB( vertexShader, GL_OBJECT_INFO_LOG_LENGTH_ARB, &stringLength ) ); if( stringLength > 1 ) { char * tmpstr = (char*)malloc( stringLength + 1 ); - glGetInfoLogARB( vertexShader, stringLength, NULL, tmpstr ); + GLCALL( glGetInfoLogARB( vertexShader, stringLength, NULL, tmpstr ) ); puts( "Compiling Vertex Shader response follows:" ); puts( tmpstr ); free( tmpstr ); @@ -248,18 +248,18 @@ GLint bGeomCompiled; GLint stringLength; //Create a new geometry shader - geometryShader = glCreateShaderObjectARB( GL_GEOMETRY_SHADER_EXT ); + geometryShader = GLCALL( glCreateShaderObjectARB( GL_GEOMETRY_SHADER_EXT ) ); //Bind the shader to the text, setting that to be its source. - glShaderSourceARB( geometryShader, 1, &sShaderCode, NULL ); + GLCALL( glShaderSourceARB( geometryShader, 1, &sShaderCode, NULL ) ); //Compile the shader - glCompileShaderARB( geometryShader ); + GLCALL( glCompileShaderARB( geometryShader ) ); //Did the shader compile? Were there any errors? - glGetObjectParameterivARB( geometryShader, GL_OBJECT_COMPILE_STATUS_ARB, &bGeomCompiled ); - glGetObjectParameterivARB( geometryShader, GL_OBJECT_INFO_LOG_LENGTH_ARB, &stringLength ); + GLCALL( glGetObjectParameterivARB( geometryShader, GL_OBJECT_COMPILE_STATUS_ARB, &bGeomCompiled ) ); + GLCALL( glGetObjectParameterivARB( geometryShader, GL_OBJECT_INFO_LOG_LENGTH_ARB, &stringLength ) ); if( bGeomCompiled == 0 ) { char * tmpstr = (char*)malloc( stringLength + 1 ); - glGetInfoLogARB( geometryShader, stringLength, NULL, tmpstr ); + GLCALL( glGetInfoLogARB( geometryShader, stringLength, NULL, tmpstr ) ); puts( "Compiling Geometry Shader response follows:" ); puts( tmpstr ); free( tmpstr ); @@ -273,16 +273,22 @@ GLint bLinked; GLint stringLength; //Create the actual shader prgoram - iProgramID = glCreateProgramObjectARB(); + iProgramID = GLCALL( glCreateProgramObjectARB() ); //Attach the fragment/vertex shader to it. if( vertexShader ) - glAttachObjectARB( iProgramID, vertexShader ); + { + GLCALL( glAttachObjectARB( iProgramID, vertexShader ) ); + } if( fragmentShader ) - glAttachObjectARB( iProgramID, fragmentShader ); + { + GLCALL( glAttachObjectARB( iProgramID, fragmentShader ) ); + } if( geometryShader ) - glAttachObjectARB( iProgramID, geometryShader ); + { + GLCALL( glAttachObjectARB( iProgramID, geometryShader ) ); + } //Attempt to link the shader - glLinkProgramARB( iProgramID ); + GLCALL( glLinkProgramARB( iProgramID ) ); //If we're using a geometry shader, we have to do a little extra. if( CustomGLProgramParI && geometryShader ) @@ -292,7 +298,7 @@ int ierror, i; GLint imaxvert; - glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT,&imaxvert); + GLCALL( glGetIntegerv(GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT,&imaxvert) ); if( (ierror = glGetError()) != 0 ) { puts( "ERROR: You cannot load a geometry shader when there are still errors left in OpenGL." ); @@ -310,13 +316,13 @@ //See if there were any errors. - glGetObjectParameterivARB( iProgramID, GL_OBJECT_LINK_STATUS_ARB, &bLinked ); - glGetObjectParameterivARB( iProgramID, GL_OBJECT_INFO_LOG_LENGTH_ARB, &stringLength ); + GLCALL( glGetObjectParameterivARB( iProgramID, GL_OBJECT_LINK_STATUS_ARB, &bLinked ) ); + GLCALL( glGetObjectParameterivARB( iProgramID, GL_OBJECT_INFO_LOG_LENGTH_ARB, &stringLength ) ); if ( stringLength > 1 || bLinked == 0 ) { char * tmpstr = (char*)malloc( stringLength + 1 ); - glGetInfoLogARB( iProgramID, stringLength, NULL, tmpstr ); + GLCALL( glGetInfoLogARB( iProgramID, stringLength, NULL, tmpstr ) ); puts( "Linking shaders. response follows:" ); puts( tmpstr ); free( tmpstr ); @@ -326,7 +332,7 @@ //Build the list of uniform tabs. int iNumUniforms; - glGetObjectParameterivARB( iProgramID, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &iNumUniforms ); + GLCALL( glGetObjectParameterivARB( iProgramID, GL_OBJECT_ACTIVE_UNIFORMS_ARB, &iNumUniforms ) ); m_uniforms.clear(); for( int i = 0; i < iNumUniforms; ++i ) { @@ -334,10 +340,10 @@ int bufflen; GLint size; GLenum type; - glGetActiveUniformARB( iProgramID, i, 1024, &bufflen, &size, &type, buffer ); + GLCALL( glGetActiveUniformARB( iProgramID, i, 1024, &bufflen, &size, &type, buffer ) ); buffer[bufflen] = 0; -// m_uniforms[buffer] = glGetUniformLocationARB( iProgramID, buffer ); - int location = glGetUniformLocationARB( iProgramID, buffer ); +// m_uniforms[buffer] = GLCALL( glGetUniformLocationARB( iProgramID, buffer ) ); + int location = GLCALL( glGetUniformLocationARB( iProgramID, buffer ) ); m_uniforms.push_back( UniformMap(buffer, location) ); } return true; @@ -352,23 +358,23 @@ return; //If we can't destroy the object, then don't try. - glGetObjectParameterivARB(iProgramID, GL_OBJECT_ATTACHED_OBJECTS_ARB, &count); + GLCALL( glGetObjectParameterivARB(iProgramID, GL_OBJECT_ATTACHED_OBJECTS_ARB, &count) ); //Iterate through all children. if (count > 0) { objects = (GLhandleARB *)malloc(count*sizeof(GLhandleARB)); - glGetAttachedObjectsARB(iProgramID, count, NULL, objects); + GLCALL( glGetAttachedObjectsARB(iProgramID, count, NULL, objects) ); } else return; for ( i = 0; i < count; ++i) { - glDetachObjectARB(iProgramID, objects[i]); + GLCALL( glDetachObjectARB(iProgramID, objects[i]) ); } - glDeleteObjectARB(iProgramID); + GLCALL( glDeleteObjectARB(iProgramID) ); iProgramID = 0; free( objects ); @@ -418,7 +424,7 @@ { if ( !iProgramID ) return; - glUseProgramObjectARB( iProgramID ); + GLCALL( glUseProgramObjectARB( iProgramID ) ); GLERRORCHECK; //set attributes here @@ -433,7 +439,7 @@ void Shader::DeactivateShader() { - glUseProgramObjectARB( 0 ); + GLCALL( glUseProgramObjectARB( 0 ) ); GLERRORCHECK; } @@ -471,17 +477,17 @@ { case ShaderAttribute::TYPE_INT: case ShaderAttribute::TYPE_SAMPLER: - glUniform1iARB( location, x.value.iInt ); + GLCALL( glUniform1iARB( location, x.value.iInt ) ); break; case ShaderAttribute::TYPE_FLOAT: case ShaderAttribute::TYPE_FLOATV4: - glUniform4fvARB( location, 1, &x.value.fFloatV4[0] ); + GLCALL( glUniform4fvARB( location, 1, &x.value.fFloatV4[0] ) ); break; case ShaderAttribute::TYPE_MATRIX: - glUniformMatrix4fvARB(location, 1, 1, x.value.matrix); //transpase too + GLCALL( glUniformMatrix4fvARB(location, 1, 1, x.value.matrix) ); //transpase too break; case ShaderAttribute::TYPE_INT4: - glUniform4ivARB( location, 1, x.value.iInts ); + GLCALL( glUniform4ivARB( location, 1, x.value.iInts ) ); break; }; GLERRORCHECK; Modified: Mercury2/src/Texture.cpp =================================================================== --- Mercury2/src/Texture.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/Texture.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -33,19 +33,19 @@ void Texture::Clean() { - if (m_textureID) glDeleteTextures(1, &m_textureID); + if (m_textureID) { GLCALL( glDeleteTextures(1, &m_textureID) ); } m_textureID = 0; } void Texture::LoadFromRaw() { if ( !m_raw ) return; - if ( !m_textureID ) glGenTextures(1, &m_textureID); + if ( !m_textureID ) { GLCALL( glGenTextures(1, &m_textureID) ); } // m_raw = raw; GLenum byteType = ToGLColorType( m_raw->m_ColorByteType ); - glBindTexture(GL_TEXTURE_2D, m_textureID); + GLCALL( glBindTexture(GL_TEXTURE_2D, m_textureID) ); /* glTexImage2D(GL_TEXTURE_2D, 0, @@ -57,17 +57,17 @@ GL_UNSIGNED_BYTE, m_raw->m_data); */ - gluBuild2DMipmaps( GL_TEXTURE_2D, byteType, m_raw->m_width, m_raw->m_height, byteType, GL_UNSIGNED_BYTE, m_raw->m_data ); + GLCALL( gluBuild2DMipmaps( GL_TEXTURE_2D, byteType, m_raw->m_width, m_raw->m_height, byteType, GL_UNSIGNED_BYTE, m_raw->m_data ) ); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); + GLCALL( glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST) ); + GLCALL( glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR) ); -// glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); +// GLCALL( glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + GLCALL( glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP) ); + GLCALL( glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP) ); -// gluBuild2DMipmaps( GL_TEXTURE_2D, 3, m_raw->m_width, m_raw->m_height, ByteType, GL_UNSIGNED_BYTE, m_raw->m_data ); +// GLCALL( gluBuild2DMipmaps( GL_TEXTURE_2D, 3, m_raw->m_width, m_raw->m_height, ByteType, GL_UNSIGNED_BYTE, m_raw->m_data ) ); SAFE_DELETE(m_raw); }; @@ -103,12 +103,12 @@ void Texture::BindTexture() { m_textureResource = GL_TEXTURE0+m_numActiveTextures; - glActiveTexture( m_textureResource ); - glClientActiveTextureARB(m_textureResource); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glEnable( GL_TEXTURE_2D ); - glBindTexture(GL_TEXTURE_2D, m_textureID); - glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ); + GLCALL( glActiveTexture( m_textureResource ) ); + GLCALL( glClientActiveTextureARB(m_textureResource) ); + GLCALL( glEnableClientState(GL_TEXTURE_COORD_ARRAY) ); + GLCALL( glEnable( GL_TEXTURE_2D ) ); + GLCALL( glBindTexture(GL_TEXTURE_2D, m_textureID) ); + GLCALL( glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ); GLERRORCHECK; @@ -125,10 +125,10 @@ void Texture::UnbindTexture() { - glActiveTexture( m_textureResource ); - glClientActiveTextureARB(m_textureResource); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); - glDisable( GL_TEXTURE_2D ); + GLCALL( glActiveTexture( m_textureResource ) ); + GLCALL( glClientActiveTextureARB(m_textureResource) ); + GLCALL( glDisableClientState(GL_TEXTURE_COORD_ARRAY) ); + GLCALL( glDisable( GL_TEXTURE_2D ) ); GLERRORCHECK; Shader::RemoveAttribute( ssprintf("HG_Texture%d", m_numActiveTextures) ); @@ -172,12 +172,12 @@ m_path = "DYNATEXT"+name; ADD_ASSET_INSTANCE(Texture, m_path, this); - if (m_textureID == 0) glGenTextures( 1, &m_textureID ); - glBindTexture( GL_TEXTURE_2D, m_textureID ); - glCopyTexImage2D( GL_TEXTURE_2D, 0, ToGLColorType(cbt), 0, 0, width, height, 0 ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glBindTexture( GL_TEXTURE_2D, 0 ); + if (m_textureID == 0) { GLCALL( glGenTextures( 1, &m_textureID ) ); } + GLCALL( glBindTexture( GL_TEXTURE_2D, m_textureID ) ); + GLCALL( glCopyTexImage2D( GL_TEXTURE_2D, 0, ToGLColorType(cbt), 0, 0, width, height, 0 ) ); + GLCALL( glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST ) ); + GLCALL( glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) ); + GLCALL( glBindTexture( GL_TEXTURE_2D, 0 ) ); GLERRORCHECK; } Modified: Mercury2/src/TransformNode.cpp =================================================================== --- Mercury2/src/TransformNode.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/TransformNode.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -23,7 +23,7 @@ const MercuryMatrix& matrix = GetGlobalMatrix(); m_modelView = ManipulateMatrix( matrix ); - glLoadMatrix( m_modelView ); + GLCALL( glLoadMatrix( m_modelView ) ); MercuryNode::RecursivePreRender(); } @@ -35,7 +35,7 @@ const MercuryMatrix& matrix = GetGlobalMatrix(); m_modelView = ManipulateMatrix( matrix ); - glLoadMatrix( m_modelView ); + GLCALL( glLoadMatrix( m_modelView ) ); } Modified: Mercury2/src/Viewport.cpp =================================================================== --- Mercury2/src/Viewport.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/Viewport.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -23,14 +23,14 @@ FRUSTUM = &m_frustum; MercuryWindow* w = MercuryWindow::GetCurrentWindow(); - glViewport(m_minx, m_miny, (GLsizei)(w->Width()*m_xFactor), (GLsizei)(w->Height()*m_yFactor)); + GLCALL( glViewport(m_minx, m_miny, (GLsizei)(w->Width()*m_xFactor), (GLsizei)(w->Height()*m_yFactor)) ); //Load the frustum into the projection //"eye" position does not go into projection - glMatrixMode(GL_PROJECTION); - glLoadMatrix( m_frustum.GetMatrix() ); + GLCALL( glMatrixMode(GL_PROJECTION) ); + GLCALL( glLoadMatrix( m_frustum.GetMatrix() ) ); - glMatrixMode(GL_MODELVIEW); + GLCALL( glMatrixMode(GL_MODELVIEW) ); //Sets up the clipping frustum m_frustum.LookAt(EYE, LOOKAT, MercuryVertex(0,1,0)); @@ -41,18 +41,18 @@ FRUSTUM = &m_frustum; MercuryWindow* w = MercuryWindow::GetCurrentWindow(); - glViewport(m_minx, m_miny, (GLsizei)(w->Width()*m_xFactor), (GLsizei)(w->Height()*m_yFactor)); + GLCALL( glViewport(m_minx, m_miny, (GLsizei)(w->Width()*m_xFactor), (GLsizei)(w->Height()*m_yFactor)) ); //Load the frustum into the projection //"eye" position does not go into projection - glMatrixMode(GL_PROJECTION); - glLoadMatrix( m_frustum.GetMatrix() ); + GLCALL( glMatrixMode(GL_PROJECTION) ); + GLCALL( glLoadMatrix( m_frustum.GetMatrix() ) ); - glMatrixMode(GL_MODELVIEW); + GLCALL( glMatrixMode(GL_MODELVIEW) ); ShaderAttribute sa; sa.type = ShaderAttribute::TYPE_INT4; - glGetIntegerv(GL_VIEWPORT, sa.value.iInts); + GLCALL( glGetIntegerv(GL_VIEWPORT, sa.value.iInts) ); Shader::SetAttribute("HG_ViewPort", sa); sa.type = ShaderAttribute::TYPE_FLOATV4; @@ -87,11 +87,11 @@ void Viewport::PostRender(const MercuryMatrix& matrix) { - glPushMatrix(); -// glLoadIdentity(); + GLCALL( glPushMatrix() ); +// GLCALL( glLoadIdentity() ); glLoadMatrix( matrix ); CURRENTRENDERGRAPH->RenderAlpha(); - glPopMatrix(); + GLCALL( glPopMatrix() ); MercuryNode::PostRender(matrix); } Modified: Mercury2/src/X11Window.cpp =================================================================== --- Mercury2/src/X11Window.cpp 2009-08-19 01:48:06 UTC (rev 500) +++ Mercury2/src/X11Window.cpp 2009-08-19 23:50:34 UTC (rev 501) @@ -3,6 +3,8 @@ #include <MercuryInput.h> #include <MercuryPrefs.h> +#include <GLHeaders.h> + #define MOUSE_BTN_LEFT 1 #define MOUSE_BTN_RIGHT 3 #define MOUSE_BTN_CENTER 2 @@ -186,18 +188,19 @@ } XMapWindow(m_display, win); - glXMakeCurrent(m_display, win, ctx); + GLCALL( glXMakeCurrent(m_display, win, ctx) ); XFree(visinfo); m_window = win; m_renderCtx = ctx; - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); - glEnable(GL_NORMALIZE); + GLCALL( glEnable(GL_DEPTH_TEST) ); + GLCALL( glEnable(GL_CULL_FACE) ); + GLCALL( glEnable(GL_NORMALIZE) ); - glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + GLCALL( glEnable (GL_BLEND); ); + GLCALL( glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ); } X11Window::~X11Window() @@ -363,7 +366,7 @@ void X11Window::Clear() { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GLCALL( glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ); } void* X11Window::GetProcAddress(const MString& x) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <axl...@us...> - 2009-08-21 00:57:58
|
Revision: 502 http://hgengine.svn.sourceforge.net/hgengine/?rev=502&view=rev Author: axlecrusher Date: 2009-08-21 00:57:42 +0000 (Fri, 21 Aug 2009) Log Message: ----------- Count specific functions Modified Paths: -------------- Mercury2/src/GLHeaders.h Mercury2/src/GLHelpers.cpp Mercury2/src/GLHelpers.h Mercury2/src/Mercury2.cpp Modified: Mercury2/src/GLHeaders.h =================================================================== --- Mercury2/src/GLHeaders.h 2009-08-19 23:50:34 UTC (rev 501) +++ Mercury2/src/GLHeaders.h 2009-08-21 00:57:42 UTC (rev 502) @@ -23,7 +23,7 @@ #include <MercuryLog.h> -#define GLCALL(x) x; ++GLCALLCOUNT; +#define GLCALL(x) x; ++GLCALLCOUNT; GLFUNCTCOUNT[#x]++; #define GLERRORCHECK { \ uint32_t e = GLCALL( glGetError() ); \ @@ -37,5 +37,9 @@ LOG.Write(ssprintf("GL FBO Error:%s", GlError2String(e).c_str())); \ assert(0); } } +#include <map> + extern uint32_t GLCALLCOUNT; +extern std::map<MString, uint32_t> GLFUNCTCOUNT; + #endif Modified: Mercury2/src/GLHelpers.cpp =================================================================== --- Mercury2/src/GLHelpers.cpp 2009-08-19 23:50:34 UTC (rev 501) +++ Mercury2/src/GLHelpers.cpp 2009-08-21 00:57:42 UTC (rev 502) @@ -2,6 +2,7 @@ #include <GLHelpers.h> uint32_t GLCALLCOUNT = 0; +std::map<MString, uint32_t> GLFUNCTCOUNT; MString GlError2String(uint32_t e) { @@ -108,6 +109,18 @@ } +void PrintGLFunctionCalls() +{ + std::map<MString,uint32_t>::iterator i; + + for(i = GLFUNCTCOUNT.begin(); i != GLFUNCTCOUNT.end(); ++i) + { + LOG.Write(ssprintf( "%d ", i->second ) + i->first); + } + + GLFUNCTCOUNT.clear(); +} + /**************************************************************************** * Copyright (C) 2009 by Joshua Allen * * * Modified: Mercury2/src/GLHelpers.h =================================================================== --- Mercury2/src/GLHelpers.h 2009-08-19 23:50:34 UTC (rev 501) +++ Mercury2/src/GLHelpers.h 2009-08-21 00:57:42 UTC (rev 502) @@ -11,6 +11,8 @@ MercuryVertex pointFromScreenLoc(int screen_x, int screen_y); unsigned int ToGLColorType(ColorByteType cbt); +void PrintGLFunctionCalls(); + /**************************************************************************** * Copyright (C) 2009 by Joshua Allen * * * Modified: Mercury2/src/Mercury2.cpp =================================================================== --- Mercury2/src/Mercury2.cpp 2009-08-19 23:50:34 UTC (rev 501) +++ Mercury2/src/Mercury2.cpp 2009-08-21 00:57:42 UTC (rev 502) @@ -120,6 +120,8 @@ // UpdateLoopGo.Increment(); // updateThread.Wait(); + PrintGLFunctionCalls(); + SAFE_DELETE(root); SAFE_DELETE(w); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <axl...@us...> - 2009-08-21 00:58:16
|
Revision: 503 http://hgengine.svn.sourceforge.net/hgengine/?rev=503&view=rev Author: axlecrusher Date: 2009-08-21 00:58:05 +0000 (Fri, 21 Aug 2009) Log Message: ----------- remove unused Modified Paths: -------------- Mercury2/src/MercuryNode.cpp Mercury2/src/MercuryNode.h Mercury2/src/RenderGraph.cpp Modified: Mercury2/src/MercuryNode.cpp =================================================================== --- Mercury2/src/MercuryNode.cpp 2009-08-21 00:57:42 UTC (rev 502) +++ Mercury2/src/MercuryNode.cpp 2009-08-21 00:58:05 UTC (rev 503) @@ -331,20 +331,6 @@ return MercuryMatrix::Identity(); } -bool MercuryNode::IsCulled(const MercuryMatrix& matrix) -{ - bool clip = false; -/* - std::list< MAutoPtr< MercuryAsset > >::iterator i; - for (i = m_assets.begin(); i != m_assets.end(); ++i ) - { - clip = (*i)->IsCulled( matrix ); - if ( clip == false ) return false; - } - */ - return clip; -} - MercuryMatrix MercuryNode::ManipulateMatrix(const MercuryMatrix& matrix) { return VIEWMATRIX * matrix; Modified: Mercury2/src/MercuryNode.h =================================================================== --- Mercury2/src/MercuryNode.h 2009-08-21 00:57:42 UTC (rev 502) +++ Mercury2/src/MercuryNode.h 2009-08-21 00:58:05 UTC (rev 503) @@ -97,8 +97,7 @@ virtual void PreRender(const MercuryMatrix& matrix); virtual void Render(const MercuryMatrix& matrix); virtual void PostRender(const MercuryMatrix& matrix); - - virtual bool IsCulled(const MercuryMatrix& matrix); + inline bool IsHidden() { return m_hidden; } inline void SetCulled(bool t) { m_culled = t; } Modified: Mercury2/src/RenderGraph.cpp =================================================================== --- Mercury2/src/RenderGraph.cpp 2009-08-21 00:57:42 UTC (rev 502) +++ Mercury2/src/RenderGraph.cpp 2009-08-21 00:58:05 UTC (rev 503) @@ -18,7 +18,7 @@ { m_node->PreRender( *m_matrix ); //calls on children assets modelView = m_node->ManipulateMatrix( *m_matrix ); - if ( m_node->IsHidden() || m_node->IsCulled(modelView) ) return; + if ( m_node->IsHidden() || m_node->IsCulled() ) return; GLCALL( glLoadMatrix( modelView ) ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <axl...@us...> - 2009-08-21 01:17:39
|
Revision: 504 http://hgengine.svn.sourceforge.net/hgengine/?rev=504&view=rev Author: axlecrusher Date: 2009-08-21 01:17:31 +0000 (Fri, 21 Aug 2009) Log Message: ----------- Improve culling, excludeCull is supposed to mean ignore cull so change the name. Ignoring the cull means that the asset will not influence the cull either way. Textures are an example of this, since they only apply to things rendered later their cull can be ignored, and just rely on the parent node's cull. Quads were not supposed to be ignored, they have no bounding volume so they default to fail culling. Modified Paths: -------------- Mercury2/src/MercuryAsset.cpp Mercury2/src/MercuryAsset.h Mercury2/src/MercuryNode.cpp Mercury2/src/Quad.cpp Mercury2/src/Texture.cpp Modified: Mercury2/src/MercuryAsset.cpp =================================================================== --- Mercury2/src/MercuryAsset.cpp 2009-08-21 00:58:05 UTC (rev 503) +++ Mercury2/src/MercuryAsset.cpp 2009-08-21 01:17:31 UTC (rev 504) @@ -6,7 +6,7 @@ extern bool DOOCCLUSIONCULL; MercuryAsset::MercuryAsset() - :m_isInstanced(false), m_boundingVolume(NULL), m_loadState(NONE), m_excludeFromCull(false) + :m_isInstanced(false), m_boundingVolume(NULL), m_loadState(NONE), m_ignoreCull(false) { } @@ -63,9 +63,9 @@ void MercuryAsset::LoadFromXML(const XMLNode& node) { - if ( !node.Attribute("nocull").empty() ) + if ( !node.Attribute("ignorecull").empty() ) { - SetExcludeFromCull( node.Attribute("nocull")=="true" ); + SetIgnoreCull( node.Attribute("ignorecull")=="true" ); } } Modified: Mercury2/src/MercuryAsset.h =================================================================== --- Mercury2/src/MercuryAsset.h 2009-08-21 00:58:05 UTC (rev 503) +++ Mercury2/src/MercuryAsset.h 2009-08-21 01:17:31 UTC (rev 504) @@ -56,8 +56,8 @@ virtual bool DoCullingTests(OcclusionResult& occlusion, const MercuryMatrix& matrix); void DrawAxes(); - inline void SetExcludeFromCull(bool t) { m_excludeFromCull = t; } - inline bool ExcludeFromCull() const { return m_excludeFromCull; } + inline void SetIgnoreCull(bool t) { m_ignoreCull = t; } + inline bool IgnoreCull() const { return m_ignoreCull; } protected: void SetLoadState(LoadState ls); //thread safe LoadState GetLoadState(); //thread safe @@ -68,7 +68,7 @@ private: LoadState m_loadState; MSemaphore m_lock; - bool m_excludeFromCull; + bool m_ignoreCull; }; /** This holds the per-instance data for each asset instance. Modified: Mercury2/src/MercuryNode.cpp =================================================================== --- Mercury2/src/MercuryNode.cpp 2009-08-21 00:58:05 UTC (rev 503) +++ Mercury2/src/MercuryNode.cpp 2009-08-21 01:17:31 UTC (rev 504) @@ -276,14 +276,13 @@ MercuryAssetInstance& mai = *i; MercuryAsset& a = mai.Asset(); - if ( !a.ExcludeFromCull() ) + ///NOTE: Things that ignore culling do not affect culling one way or the other + if ( !a.IgnoreCull() ) { mai.Culled( a.DoCullingTests( mai.GetOcclusionResult(), matrix ) ); culled = culled && mai.Culled(); } - if ( a.ExcludeFromCull() ) culled = false; //node must be rendered if something was excluded - if ( !mai.Culled() ) a.PreRender(this); } SetCulled( culled ); Modified: Mercury2/src/Quad.cpp =================================================================== --- Mercury2/src/Quad.cpp 2009-08-21 00:58:05 UTC (rev 503) +++ Mercury2/src/Quad.cpp 2009-08-21 01:17:31 UTC (rev 504) @@ -36,8 +36,6 @@ m_indexData[1] = 1; m_indexData[3] = m_indexData[2] = 2; m_indexData[4] = 3; - - SetExcludeFromCull( true ); } Quad::~Quad() Modified: Mercury2/src/Texture.cpp =================================================================== --- Mercury2/src/Texture.cpp 2009-08-21 00:58:05 UTC (rev 503) +++ Mercury2/src/Texture.cpp 2009-08-21 01:17:31 UTC (rev 504) @@ -19,7 +19,7 @@ m_numActiveTextures = 0; } - SetExcludeFromCull( true ); + SetIgnoreCull( true ); } Texture::~Texture() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <axl...@us...> - 2009-08-21 01:40:12
|
Revision: 505 http://hgengine.svn.sourceforge.net/hgengine/?rev=505&view=rev Author: axlecrusher Date: 2009-08-21 01:40:06 +0000 (Fri, 21 Aug 2009) Log Message: ----------- move profiling calls into function for easier modifications Modified Paths: -------------- Mercury2/src/GLHeaders.h Mercury2/src/GLHelpers.cpp Mercury2/src/GLHelpers.h Modified: Mercury2/src/GLHeaders.h =================================================================== --- Mercury2/src/GLHeaders.h 2009-08-21 01:17:31 UTC (rev 504) +++ Mercury2/src/GLHeaders.h 2009-08-21 01:40:06 UTC (rev 505) @@ -23,8 +23,6 @@ #include <MercuryLog.h> -#define GLCALL(x) x; ++GLCALLCOUNT; GLFUNCTCOUNT[#x]++; - #define GLERRORCHECK { \ uint32_t e = GLCALL( glGetError() ); \ if ( e != GL_NO_ERROR ) { \ Modified: Mercury2/src/GLHelpers.cpp =================================================================== --- Mercury2/src/GLHelpers.cpp 2009-08-21 01:17:31 UTC (rev 504) +++ Mercury2/src/GLHelpers.cpp 2009-08-21 01:40:06 UTC (rev 505) @@ -109,6 +109,12 @@ } +void ProfileGLCall(const MString& funcName) +{ + ++GLCALLCOUNT; + GLFUNCTCOUNT[funcName]++; +} + void PrintGLFunctionCalls() { std::map<MString,uint32_t>::iterator i; Modified: Mercury2/src/GLHelpers.h =================================================================== --- Mercury2/src/GLHelpers.h 2009-08-21 01:17:31 UTC (rev 504) +++ Mercury2/src/GLHelpers.h 2009-08-21 01:40:06 UTC (rev 505) @@ -1,3 +1,6 @@ +#ifndef GLHELPERS_H +#define GLHELPERS_H + #include <global.h> #include <MercuryUtil.h> #include <MercuryMatrix.h> @@ -5,14 +8,19 @@ #include <RawImageData.h> +#define GLCALL(x) x; ProfileGLCall(#x); + MString GlError2String(uint32_t e); void glLoadMatrix(const MercuryMatrix& m); MercuryMatrix glGetMatrix(unsigned int m); MercuryVertex pointFromScreenLoc(int screen_x, int screen_y); unsigned int ToGLColorType(ColorByteType cbt); +void ProfileGLCall(const MString& funcName); void PrintGLFunctionCalls(); +#endif + /**************************************************************************** * Copyright (C) 2009 by Joshua Allen * * * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cn...@us...> - 2009-08-22 06:15:27
|
Revision: 506 http://hgengine.svn.sourceforge.net/hgengine/?rev=506&view=rev Author: cnlohr Date: 2009-08-22 06:15:15 +0000 (Sat, 22 Aug 2009) Log Message: ----------- fix spelling (plural of Vertex is Vertices) Modified Paths: -------------- Mercury2/src/MercuryHash.h Mercury2/src/Shader.cpp Modified: Mercury2/src/MercuryHash.h =================================================================== --- Mercury2/src/MercuryHash.h 2009-08-21 01:40:06 UTC (rev 505) +++ Mercury2/src/MercuryHash.h 2009-08-22 06:15:15 UTC (rev 506) @@ -190,7 +190,7 @@ return false; } - void VectorIndicies( MVector < MString > & vOut ) + void VectorIndices( MVector < MString > & vOut ) { unsigned int i; MHashNode<T> * m_pTmp; Modified: Mercury2/src/Shader.cpp =================================================================== --- Mercury2/src/Shader.cpp 2009-08-21 01:40:06 UTC (rev 505) +++ Mercury2/src/Shader.cpp 2009-08-22 06:15:15 UTC (rev 506) @@ -311,7 +311,7 @@ if( glGetError() == 0 ) break; } - LOG.Write(ssprintf( "Geometry Shader loaded with a total of %d max verticies. Because there are %d max vertices, and %d preceived components per vert.", imaxvert/i, imaxvert, i )); + LOG.Write(ssprintf( "Geometry Shader loaded with a total of %d max vertices. Because there are %d max vertices, and %d preceived components per vert.", imaxvert/i, imaxvert, i )); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cn...@us...> - 2009-08-22 06:16:39
|
Revision: 507 http://hgengine.svn.sourceforge.net/hgengine/?rev=507&view=rev Author: cnlohr Date: 2009-08-22 06:16:33 +0000 (Sat, 22 Aug 2009) Log Message: ----------- switch to MHash for listing of all GL Calls, so I can still (sort of) profile when logging all calls Modified Paths: -------------- Mercury2/src/GLHeaders.h Mercury2/src/GLHelpers.cpp Modified: Mercury2/src/GLHeaders.h =================================================================== --- Mercury2/src/GLHeaders.h 2009-08-22 06:15:15 UTC (rev 506) +++ Mercury2/src/GLHeaders.h 2009-08-22 06:16:33 UTC (rev 507) @@ -35,9 +35,8 @@ LOG.Write(ssprintf("GL FBO Error:%s", GlError2String(e).c_str())); \ assert(0); } } -#include <map> - +#include <MercuryHash.h> extern uint32_t GLCALLCOUNT; -extern std::map<MString, uint32_t> GLFUNCTCOUNT; +extern MHash< uint32_t> GLFUNCTCOUNT; #endif Modified: Mercury2/src/GLHelpers.cpp =================================================================== --- Mercury2/src/GLHelpers.cpp 2009-08-22 06:15:15 UTC (rev 506) +++ Mercury2/src/GLHelpers.cpp 2009-08-22 06:16:33 UTC (rev 507) @@ -1,8 +1,9 @@ #include <GLHeaders.h> #include <GLHelpers.h> +#include <MercuryHash.h> uint32_t GLCALLCOUNT = 0; -std::map<MString, uint32_t> GLFUNCTCOUNT; +MHash< uint32_t> GLFUNCTCOUNT; MString GlError2String(uint32_t e) { @@ -117,13 +118,12 @@ void PrintGLFunctionCalls() { - std::map<MString,uint32_t>::iterator i; + MVector < MString > v; + GLFUNCTCOUNT.VectorIndices( v ); + //We now know all the names of the functions that were called. + for( unsigned i = 0; i < v.size(); i++ ) + LOG.Write(ssprintf( "%d ", GLFUNCTCOUNT[v[i]] ) + v[i] ); - for(i = GLFUNCTCOUNT.begin(); i != GLFUNCTCOUNT.end(); ++i) - { - LOG.Write(ssprintf( "%d ", i->second ) + i->first); - } - GLFUNCTCOUNT.clear(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cn...@us...> - 2009-08-22 16:05:07
|
Revision: 508 http://hgengine.svn.sourceforge.net/hgengine/?rev=508&view=rev Author: cnlohr Date: 2009-08-22 16:04:58 +0000 (Sat, 22 Aug 2009) Log Message: ----------- move StrToBool to its own function Modified Paths: -------------- Mercury2/src/MercuryNamedResource.cpp Mercury2/src/MercuryUtil.cpp Mercury2/src/MercuryUtil.h Modified: Mercury2/src/MercuryNamedResource.cpp =================================================================== --- Mercury2/src/MercuryNamedResource.cpp 2009-08-22 06:16:33 UTC (rev 507) +++ Mercury2/src/MercuryNamedResource.cpp 2009-08-22 16:04:58 UTC (rev 508) @@ -47,18 +47,8 @@ { MString tmpret; if( GetValue( sDataPointer, tmpret ) ) - { - tmpret = ToUpper( tmpret ); - if( tmpret.compare( "TRUE" ) == 0 ) return 1; - if( tmpret.compare( "FALSE" ) == 0 ) return 0; - if( tmpret.compare( "ON" ) == 0 ) return 1; - if( tmpret.compare( "OFF" ) == 0 ) return 0; - if( tmpret.compare( "YES" ) == 0 ) return 1; - if( tmpret.compare( "NO" ) == 0 ) return 0; + return StrToBool( tmpret ); - return StrToInt( tmpret ) != 0; - } - if( bSetValue ) SetValueB( sDataPointer, bDefaultValue ); Modified: Mercury2/src/MercuryUtil.cpp =================================================================== --- Mercury2/src/MercuryUtil.cpp 2009-08-22 06:16:33 UTC (rev 507) +++ Mercury2/src/MercuryUtil.cpp 2009-08-22 16:04:58 UTC (rev 508) @@ -151,7 +151,22 @@ return x; } +bool StrToBool( const MString & s, bool d ) +{ + MString tmpret = s; + tmpret = ToUpper( tmpret ); + if( tmpret.compare( "TRUE" ) == 0 ) return 1; + if( tmpret.compare( "FALSE" ) == 0 ) return 0; + if( tmpret.compare( "ON" ) == 0 ) return 1; + if( tmpret.compare( "OFF" ) == 0 ) return 0; + if( tmpret.compare( "YES" ) == 0 ) return 1; + if( tmpret.compare( "NO" ) == 0 ) return 0; + + return StrToInt( tmpret, d ) != 0; +} + + void fail_m( const char * message, const char * file, int line ) { char backtracebuffer[2048]; Modified: Mercury2/src/MercuryUtil.h =================================================================== --- Mercury2/src/MercuryUtil.h 2009-08-22 06:16:33 UTC (rev 507) +++ Mercury2/src/MercuryUtil.h 2009-08-22 16:04:58 UTC (rev 508) @@ -36,6 +36,7 @@ float StrToFloat(const MString & s, float d = 0); int32_t StrToInt(const MString & s, int32_t d = 0); +bool StrToBool( const MString & s, bool d = false ); template<typename T> const T& MAX(const T& t1, const T& t2) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cn...@us...> - 2009-08-22 17:51:46
|
Revision: 510 http://hgengine.svn.sourceforge.net/hgengine/?rev=510&view=rev Author: cnlohr Date: 2009-08-22 17:51:38 +0000 (Sat, 22 Aug 2009) Log Message: ----------- allow multipass rendering Modified Paths: -------------- Mercury2/src/Mercury2.cpp Mercury2/src/MercuryAsset.cpp Mercury2/src/MercuryAsset.h Mercury2/src/MercuryNode.cpp Mercury2/src/MercuryNode.h Mercury2/src/RenderGraph.cpp Modified: Mercury2/src/Mercury2.cpp =================================================================== --- Mercury2/src/Mercury2.cpp 2009-08-22 16:10:33 UTC (rev 509) +++ Mercury2/src/Mercury2.cpp 2009-08-22 17:51:38 UTC (rev 510) @@ -92,8 +92,17 @@ // renderGraph.Render(); // RenderableNode::RecursiveRender(root); // printf("\n"); + + + for( g_iPass = 2; g_iPass < 5; g_iPass++ ) //2,3,4 + if( root->GetPasses() & (1<<g_iPass) ) + root->RecursiveRender( ); + root->RecursivePreRender(); - root->RecursiveRender(); + + for( g_iPass = 5; g_iPass < 15; g_iPass++ ) //5..15 + if( root->GetPasses() & (1<<g_iPass) ) + root->RecursiveRender( ); // renderGraph.RenderAlpha(); w->SwapBuffers(); Modified: Mercury2/src/MercuryAsset.cpp =================================================================== --- Mercury2/src/MercuryAsset.cpp 2009-08-22 16:10:33 UTC (rev 509) +++ Mercury2/src/MercuryAsset.cpp 2009-08-22 17:51:38 UTC (rev 510) @@ -6,7 +6,7 @@ extern bool DOOCCLUSIONCULL; MercuryAsset::MercuryAsset() - :m_isInstanced(false), m_boundingVolume(NULL), m_loadState(NONE), m_ignoreCull(false) + :m_isInstanced(false), m_boundingVolume(NULL), m_loadState(NONE), m_ignoreCull(false), m_iPasses( DEFAULT_PASSES ) { } @@ -65,8 +65,16 @@ if ( !node.Attribute("ignorecull").empty() ) { - SetIgnoreCull( node.Attribute("ignorecull")=="true" ); + SetIgnoreCull( StrToBool( node.Attribute("ignorecull") ) ); } + if ( !node.Attribute("setPasses").empty() ) + { + MVector< MString > out; + SplitStrings( node.Attribute("setPasses"), out, ",+", " \t", 2, 2 ); + m_iPasses = 0; + for( unsigned i = 0; i < out.size(); i++ ) + m_iPasses = m_iPasses | (1<<StrToInt( out[i] ) ); + } } void MercuryAsset::DrawAxes() @@ -86,7 +94,7 @@ } MercuryAssetInstance::MercuryAssetInstance(MercuryAsset* asset) - :m_asset( asset ), m_isCulled( false ) + :m_asset( asset ), m_isCulled( false ), m_iPasses( asset->GetPasses() ) { } Modified: Mercury2/src/MercuryAsset.h =================================================================== --- Mercury2/src/MercuryAsset.h 2009-08-22 16:10:33 UTC (rev 509) +++ Mercury2/src/MercuryAsset.h 2009-08-22 17:51:38 UTC (rev 510) @@ -58,6 +58,9 @@ inline void SetIgnoreCull(bool t) { m_ignoreCull = t; } inline bool IgnoreCull() const { return m_ignoreCull; } + + inline unsigned short GetPasses() { return m_iPasses; } + inline void SetPasses( unsigned short p ) { m_iPasses = p; } protected: void SetLoadState(LoadState ls); //thread safe LoadState GetLoadState(); //thread safe @@ -69,6 +72,7 @@ LoadState m_loadState; MSemaphore m_lock; bool m_ignoreCull; + unsigned short m_iPasses; }; /** This holds the per-instance data for each asset instance. @@ -85,10 +89,16 @@ inline bool Culled(bool t) { m_isCulled = t; return m_isCulled; } inline OcclusionResult& GetOcclusionResult() { return m_occlusionResult; } + + inline unsigned short GetPasses() { return m_iPasses; } + inline void SetPasses( unsigned short p ) { m_iPasses = p; } private: MAutoPtr< MercuryAsset > m_asset; //actual asset storage OcclusionResult m_occlusionResult; bool m_isCulled; + + //We need to keep our own copy, since it may be changed in software from what the original one has. + unsigned short m_iPasses; }; class LoaderThreadData Modified: Mercury2/src/MercuryNode.cpp =================================================================== --- Mercury2/src/MercuryNode.cpp 2009-08-22 16:10:33 UTC (rev 509) +++ Mercury2/src/MercuryNode.cpp 2009-08-22 17:51:38 UTC (rev 510) @@ -186,10 +186,10 @@ } } -void MercuryNode::RecursiveRender() +void MercuryNode::RecursiveRender( ) { - if ( IsHidden() || IsCulled() ) return; - + if ( IsHidden() || IsCulled() || (! (m_iPasses & (1<<g_iPass))) ) return; + const MercuryMatrix& matrix = GetGlobalMatrix(); const MercuryMatrix& modelView = GetModelViewMatrix(); //get the one computed in the last transform ShaderAttribute sa; @@ -262,6 +262,16 @@ } } } + + if ( !node.Attribute("setPasses").empty() ) + { + MVector< MString > out; + SplitStrings( node.Attribute("setPasses"), out, ",+", " \t", 2, 2 ); + m_iForcePasses = (1<<15); + for( unsigned i = 0; i < out.size(); i++ ) + m_iForcePasses = m_iForcePasses | (1<<StrToInt( out[i] ) ); + } + } @@ -365,7 +375,9 @@ bool MercuryNode::m_rebuildRenderGraph = false; __thread int g_iViewportID; +__thread int g_iPass; + /*************************************************************************** * Copyright (C) 2008 by Joshua Allen * * * Modified: Mercury2/src/MercuryNode.h =================================================================== --- Mercury2/src/MercuryNode.h 2009-08-22 16:10:33 UTC (rev 509) +++ Mercury2/src/MercuryNode.h 2009-08-22 17:51:38 UTC (rev 510) @@ -30,9 +30,17 @@ return false;} */ + +#define STANDARD_PASS 7 +///Which passes, by default, should be run on all nodes. +#define DEFAULT_PASSES ( (1<<STANDARD_PASS) ) + ///The Global Viewport ID for this thread (to enable multi-threaded functioning for Viewports) extern __thread int g_iViewportID; +///The Global Pass Number (which Pass is currently doing Render) +extern __thread int g_iPass; + class MercuryNode : public MessageHandler { public: @@ -106,6 +114,8 @@ const MercuryMatrix & GetGlobalMatrix() const { return m_pGlobalMatrix[g_iViewportID]; } const MercuryMatrix & GetModelViewMatrix() const { return m_pModelViewMatrix[g_iViewportID]; } + + inline unsigned short GetPasses() const { return m_iPasses; } protected: std::list< MercuryNode* > m_children; //These nodes are unique, not instanced MercuryNode* m_parent; @@ -120,6 +130,9 @@ bool m_culled; bool IsInAssetList(MercuryAsset* asset) const; + unsigned short m_iPasses; + unsigned short m_iForcePasses; //If (1<<15) is set, then, we know the force is enabled. + //The asset is actually stored here std::list< MercuryAssetInstance > m_assets; Modified: Mercury2/src/RenderGraph.cpp =================================================================== --- Mercury2/src/RenderGraph.cpp 2009-08-22 16:10:33 UTC (rev 509) +++ Mercury2/src/RenderGraph.cpp 2009-08-22 17:51:38 UTC (rev 510) @@ -56,18 +56,32 @@ //Update the Matrices node->m_pGlobalMatrix = &node->FindGlobalMatrix(); - node->m_pModelViewMatrix = &node->FindModelViewMatrix(); - + node->m_pModelViewMatrix = &node->FindModelViewMatrix(); + if ( node ) { //found a new renderable entry.m_children.push_back( RenderGraphEntry(&(node->FindGlobalMatrix()), node) ); lastEntry = &(entry.m_children.back()); } + + unsigned short iPasses = 0; for (MercuryNode* child = node->FirstChild(); child != NULL; child = node->NextChild(child)) + { Build(child, *lastEntry); - + iPasses |= child->m_iPasses; + } + + std::list< MercuryAssetInstance >::iterator i; + for (i = node->m_assets.begin(); i != node->m_assets.end(); ++i ) + iPasses |= i->GetPasses(); + + if( node->m_iForcePasses & (1<<15 ) ) + node->m_iPasses = node->m_iForcePasses; + else + node->m_iPasses = iPasses; + //coming back up the tree // entry = lastEntry; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: Josh <axl...@gm...> - 2009-08-23 12:57:03
|
I am getting very inconsistent numbers while rendering. VBO batches count will randomly increase or decrease per program execution. TBinds and VBinds will also change. I suspect there is something wrong with the new traversal as that is the only thing that can affect all 3 counts. Josh cn...@us... wrote: > Revision: 510 > http://hgengine.svn.sourceforge.net/hgengine/?rev=510&view=rev > Author: cnlohr > Date: 2009-08-22 17:51:38 +0000 (Sat, 22 Aug 2009) > > Log Message: > ----------- > allow multipass rendering > > Modified Paths: > -------------- > Mercury2/src/Mercury2.cpp > Mercury2/src/MercuryAsset.cpp > Mercury2/src/MercuryAsset.h > Mercury2/src/MercuryNode.cpp > Mercury2/src/MercuryNode.h > Mercury2/src/RenderGraph.cpp > > Modified: Mercury2/src/Mercury2.cpp > =================================================================== > --- Mercury2/src/Mercury2.cpp 2009-08-22 16:10:33 UTC (rev 509) > +++ Mercury2/src/Mercury2.cpp 2009-08-22 17:51:38 UTC (rev 510) > @@ -92,8 +92,17 @@ > // renderGraph.Render(); > // RenderableNode::RecursiveRender(root); > // printf("\n"); > + > + > + for( g_iPass = 2; g_iPass < 5; g_iPass++ ) //2,3,4 > + if( root->GetPasses() & (1<<g_iPass) ) > + root->RecursiveRender( ); > + > root->RecursivePreRender(); > - root->RecursiveRender(); > + > + for( g_iPass = 5; g_iPass < 15; g_iPass++ ) //5..15 > + if( root->GetPasses() & (1<<g_iPass) ) > + root->RecursiveRender( ); > // renderGraph.RenderAlpha(); > w->SwapBuffers(); > > > Modified: Mercury2/src/MercuryAsset.cpp > =================================================================== > --- Mercury2/src/MercuryAsset.cpp 2009-08-22 16:10:33 UTC (rev 509) > +++ Mercury2/src/MercuryAsset.cpp 2009-08-22 17:51:38 UTC (rev 510) > @@ -6,7 +6,7 @@ > extern bool DOOCCLUSIONCULL; > > MercuryAsset::MercuryAsset() > - :m_isInstanced(false), m_boundingVolume(NULL), m_loadState(NONE), m_ignoreCull(false) > + :m_isInstanced(false), m_boundingVolume(NULL), m_loadState(NONE), m_ignoreCull(false), m_iPasses( DEFAULT_PASSES ) > { > } > > @@ -65,8 +65,16 @@ > > if ( !node.Attribute("ignorecull").empty() ) > { > - SetIgnoreCull( node.Attribute("ignorecull")=="true" ); > + SetIgnoreCull( StrToBool( node.Attribute("ignorecull") ) ); > } > + if ( !node.Attribute("setPasses").empty() ) > + { > + MVector< MString > out; > + SplitStrings( node.Attribute("setPasses"), out, ",+", " \t", 2, 2 ); > + m_iPasses = 0; > + for( unsigned i = 0; i < out.size(); i++ ) > + m_iPasses = m_iPasses | (1<<StrToInt( out[i] ) ); > + } > } > > void MercuryAsset::DrawAxes() > @@ -86,7 +94,7 @@ > } > > MercuryAssetInstance::MercuryAssetInstance(MercuryAsset* asset) > - :m_asset( asset ), m_isCulled( false ) > + :m_asset( asset ), m_isCulled( false ), m_iPasses( asset->GetPasses() ) > { > } > > > Modified: Mercury2/src/MercuryAsset.h > =================================================================== > --- Mercury2/src/MercuryAsset.h 2009-08-22 16:10:33 UTC (rev 509) > +++ Mercury2/src/MercuryAsset.h 2009-08-22 17:51:38 UTC (rev 510) > @@ -58,6 +58,9 @@ > > inline void SetIgnoreCull(bool t) { m_ignoreCull = t; } > inline bool IgnoreCull() const { return m_ignoreCull; } > + > + inline unsigned short GetPasses() { return m_iPasses; } > + inline void SetPasses( unsigned short p ) { m_iPasses = p; } > protected: > void SetLoadState(LoadState ls); //thread safe > LoadState GetLoadState(); //thread safe > @@ -69,6 +72,7 @@ > LoadState m_loadState; > MSemaphore m_lock; > bool m_ignoreCull; > + unsigned short m_iPasses; > }; > > /** This holds the per-instance data for each asset instance. > @@ -85,10 +89,16 @@ > inline bool Culled(bool t) { m_isCulled = t; return m_isCulled; } > > inline OcclusionResult& GetOcclusionResult() { return m_occlusionResult; } > + > + inline unsigned short GetPasses() { return m_iPasses; } > + inline void SetPasses( unsigned short p ) { m_iPasses = p; } > private: > MAutoPtr< MercuryAsset > m_asset; //actual asset storage > OcclusionResult m_occlusionResult; > bool m_isCulled; > + > + //We need to keep our own copy, since it may be changed in software from what the original one has. > + unsigned short m_iPasses; > }; > > class LoaderThreadData > > Modified: Mercury2/src/MercuryNode.cpp > =================================================================== > --- Mercury2/src/MercuryNode.cpp 2009-08-22 16:10:33 UTC (rev 509) > +++ Mercury2/src/MercuryNode.cpp 2009-08-22 17:51:38 UTC (rev 510) > @@ -186,10 +186,10 @@ > } > } > > -void MercuryNode::RecursiveRender() > +void MercuryNode::RecursiveRender( ) > { > - if ( IsHidden() || IsCulled() ) return; > - > + if ( IsHidden() || IsCulled() || (! (m_iPasses & (1<<g_iPass))) ) return; > + > const MercuryMatrix& matrix = GetGlobalMatrix(); > const MercuryMatrix& modelView = GetModelViewMatrix(); //get the one computed in the last transform > ShaderAttribute sa; > @@ -262,6 +262,16 @@ > } > } > } > + > + if ( !node.Attribute("setPasses").empty() ) > + { > + MVector< MString > out; > + SplitStrings( node.Attribute("setPasses"), out, ",+", " \t", 2, 2 ); > + m_iForcePasses = (1<<15); > + for( unsigned i = 0; i < out.size(); i++ ) > + m_iForcePasses = m_iForcePasses | (1<<StrToInt( out[i] ) ); > + } > + > } > > > @@ -365,7 +375,9 @@ > > bool MercuryNode::m_rebuildRenderGraph = false; > __thread int g_iViewportID; > +__thread int g_iPass; > > + > /*************************************************************************** > * Copyright (C) 2008 by Joshua Allen * > * * > > Modified: Mercury2/src/MercuryNode.h > =================================================================== > --- Mercury2/src/MercuryNode.h 2009-08-22 16:10:33 UTC (rev 509) > +++ Mercury2/src/MercuryNode.h 2009-08-22 17:51:38 UTC (rev 510) > @@ -30,9 +30,17 @@ > return false;} > */ > > + > +#define STANDARD_PASS 7 > +///Which passes, by default, should be run on all nodes. > +#define DEFAULT_PASSES ( (1<<STANDARD_PASS) ) > + > ///The Global Viewport ID for this thread (to enable multi-threaded functioning for Viewports) > extern __thread int g_iViewportID; > > +///The Global Pass Number (which Pass is currently doing Render) > +extern __thread int g_iPass; > + > class MercuryNode : public MessageHandler > { > public: > @@ -106,6 +114,8 @@ > > const MercuryMatrix & GetGlobalMatrix() const { return m_pGlobalMatrix[g_iViewportID]; } > const MercuryMatrix & GetModelViewMatrix() const { return m_pModelViewMatrix[g_iViewportID]; } > + > + inline unsigned short GetPasses() const { return m_iPasses; } > protected: > std::list< MercuryNode* > m_children; //These nodes are unique, not instanced > MercuryNode* m_parent; > @@ -120,6 +130,9 @@ > bool m_culled; > bool IsInAssetList(MercuryAsset* asset) const; > > + unsigned short m_iPasses; > + unsigned short m_iForcePasses; //If (1<<15) is set, then, we know the force is enabled. > + > //The asset is actually stored here > std::list< MercuryAssetInstance > m_assets; > > > Modified: Mercury2/src/RenderGraph.cpp > =================================================================== > --- Mercury2/src/RenderGraph.cpp 2009-08-22 16:10:33 UTC (rev 509) > +++ Mercury2/src/RenderGraph.cpp 2009-08-22 17:51:38 UTC (rev 510) > @@ -56,18 +56,32 @@ > > //Update the Matrices > node->m_pGlobalMatrix = &node->FindGlobalMatrix(); > - node->m_pModelViewMatrix = &node->FindModelViewMatrix(); > - > + node->m_pModelViewMatrix = &node->FindModelViewMatrix(); > + > if ( node ) > { > //found a new renderable > entry.m_children.push_back( RenderGraphEntry(&(node->FindGlobalMatrix()), node) ); > lastEntry = &(entry.m_children.back()); > } > + > + unsigned short iPasses = 0; > > for (MercuryNode* child = node->FirstChild(); child != NULL; child = node->NextChild(child)) > + { > Build(child, *lastEntry); > - > + iPasses |= child->m_iPasses; > + } > + > + std::list< MercuryAssetInstance >::iterator i; > + for (i = node->m_assets.begin(); i != node->m_assets.end(); ++i ) > + iPasses |= i->GetPasses(); > + > + if( node->m_iForcePasses & (1<<15 ) ) > + node->m_iPasses = node->m_iForcePasses; > + else > + node->m_iPasses = iPasses; > + > //coming back up the tree > // entry = lastEntry; > } > > > This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. > > ------------------------------------------------------------------------------ > Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day > trial. Simplify your report design, integration and deployment - and focus on > what you do best, core application coding. Discover what's new with > Crystal Reports now. http://p.sf.net/sfu/bobj-july > _______________________________________________ > Hgengine-cvs mailing list > Hge...@li... > https://lists.sourceforge.net/lists/listinfo/hgengine-cvs > |
From: Josh <axl...@gm...> - 2009-08-23 13:01:53
|
Please revert this back to the old renderer. This isn't working and can't be switched to the old recursive method by just changing Mercury2.cpp. Josh cn...@us... wrote: > Revision: 510 > http://hgengine.svn.sourceforge.net/hgengine/?rev=510&view=rev > Author: cnlohr > Date: 2009-08-22 17:51:38 +0000 (Sat, 22 Aug 2009) > > Log Message: > ----------- > allow multipass rendering > > Modified Paths: > -------------- > Mercury2/src/Mercury2.cpp > Mercury2/src/MercuryAsset.cpp > Mercury2/src/MercuryAsset.h > Mercury2/src/MercuryNode.cpp > Mercury2/src/MercuryNode.h > Mercury2/src/RenderGraph.cpp > > Modified: Mercury2/src/Mercury2.cpp > =================================================================== > --- Mercury2/src/Mercury2.cpp 2009-08-22 16:10:33 UTC (rev 509) > +++ Mercury2/src/Mercury2.cpp 2009-08-22 17:51:38 UTC (rev 510) > @@ -92,8 +92,17 @@ > // renderGraph.Render(); > // RenderableNode::RecursiveRender(root); > // printf("\n"); > + > + > + for( g_iPass = 2; g_iPass < 5; g_iPass++ ) //2,3,4 > + if( root->GetPasses() & (1<<g_iPass) ) > + root->RecursiveRender( ); > + > root->RecursivePreRender(); > - root->RecursiveRender(); > + > + for( g_iPass = 5; g_iPass < 15; g_iPass++ ) //5..15 > + if( root->GetPasses() & (1<<g_iPass) ) > + root->RecursiveRender( ); > // renderGraph.RenderAlpha(); > w->SwapBuffers(); > > > Modified: Mercury2/src/MercuryAsset.cpp > =================================================================== > --- Mercury2/src/MercuryAsset.cpp 2009-08-22 16:10:33 UTC (rev 509) > +++ Mercury2/src/MercuryAsset.cpp 2009-08-22 17:51:38 UTC (rev 510) > @@ -6,7 +6,7 @@ > extern bool DOOCCLUSIONCULL; > > MercuryAsset::MercuryAsset() > - :m_isInstanced(false), m_boundingVolume(NULL), m_loadState(NONE), m_ignoreCull(false) > + :m_isInstanced(false), m_boundingVolume(NULL), m_loadState(NONE), m_ignoreCull(false), m_iPasses( DEFAULT_PASSES ) > { > } > > @@ -65,8 +65,16 @@ > > if ( !node.Attribute("ignorecull").empty() ) > { > - SetIgnoreCull( node.Attribute("ignorecull")=="true" ); > + SetIgnoreCull( StrToBool( node.Attribute("ignorecull") ) ); > } > + if ( !node.Attribute("setPasses").empty() ) > + { > + MVector< MString > out; > + SplitStrings( node.Attribute("setPasses"), out, ",+", " \t", 2, 2 ); > + m_iPasses = 0; > + for( unsigned i = 0; i < out.size(); i++ ) > + m_iPasses = m_iPasses | (1<<StrToInt( out[i] ) ); > + } > } > > void MercuryAsset::DrawAxes() > @@ -86,7 +94,7 @@ > } > > MercuryAssetInstance::MercuryAssetInstance(MercuryAsset* asset) > - :m_asset( asset ), m_isCulled( false ) > + :m_asset( asset ), m_isCulled( false ), m_iPasses( asset->GetPasses() ) > { > } > > > Modified: Mercury2/src/MercuryAsset.h > =================================================================== > --- Mercury2/src/MercuryAsset.h 2009-08-22 16:10:33 UTC (rev 509) > +++ Mercury2/src/MercuryAsset.h 2009-08-22 17:51:38 UTC (rev 510) > @@ -58,6 +58,9 @@ > > inline void SetIgnoreCull(bool t) { m_ignoreCull = t; } > inline bool IgnoreCull() const { return m_ignoreCull; } > + > + inline unsigned short GetPasses() { return m_iPasses; } > + inline void SetPasses( unsigned short p ) { m_iPasses = p; } > protected: > void SetLoadState(LoadState ls); //thread safe > LoadState GetLoadState(); //thread safe > @@ -69,6 +72,7 @@ > LoadState m_loadState; > MSemaphore m_lock; > bool m_ignoreCull; > + unsigned short m_iPasses; > }; > > /** This holds the per-instance data for each asset instance. > @@ -85,10 +89,16 @@ > inline bool Culled(bool t) { m_isCulled = t; return m_isCulled; } > > inline OcclusionResult& GetOcclusionResult() { return m_occlusionResult; } > + > + inline unsigned short GetPasses() { return m_iPasses; } > + inline void SetPasses( unsigned short p ) { m_iPasses = p; } > private: > MAutoPtr< MercuryAsset > m_asset; //actual asset storage > OcclusionResult m_occlusionResult; > bool m_isCulled; > + > + //We need to keep our own copy, since it may be changed in software from what the original one has. > + unsigned short m_iPasses; > }; > > class LoaderThreadData > > Modified: Mercury2/src/MercuryNode.cpp > =================================================================== > --- Mercury2/src/MercuryNode.cpp 2009-08-22 16:10:33 UTC (rev 509) > +++ Mercury2/src/MercuryNode.cpp 2009-08-22 17:51:38 UTC (rev 510) > @@ -186,10 +186,10 @@ > } > } > > -void MercuryNode::RecursiveRender() > +void MercuryNode::RecursiveRender( ) > { > - if ( IsHidden() || IsCulled() ) return; > - > + if ( IsHidden() || IsCulled() || (! (m_iPasses & (1<<g_iPass))) ) return; > + > const MercuryMatrix& matrix = GetGlobalMatrix(); > const MercuryMatrix& modelView = GetModelViewMatrix(); //get the one computed in the last transform > ShaderAttribute sa; > @@ -262,6 +262,16 @@ > } > } > } > + > + if ( !node.Attribute("setPasses").empty() ) > + { > + MVector< MString > out; > + SplitStrings( node.Attribute("setPasses"), out, ",+", " \t", 2, 2 ); > + m_iForcePasses = (1<<15); > + for( unsigned i = 0; i < out.size(); i++ ) > + m_iForcePasses = m_iForcePasses | (1<<StrToInt( out[i] ) ); > + } > + > } > > > @@ -365,7 +375,9 @@ > > bool MercuryNode::m_rebuildRenderGraph = false; > __thread int g_iViewportID; > +__thread int g_iPass; > > + > /*************************************************************************** > * Copyright (C) 2008 by Joshua Allen * > * * > > Modified: Mercury2/src/MercuryNode.h > =================================================================== > --- Mercury2/src/MercuryNode.h 2009-08-22 16:10:33 UTC (rev 509) > +++ Mercury2/src/MercuryNode.h 2009-08-22 17:51:38 UTC (rev 510) > @@ -30,9 +30,17 @@ > return false;} > */ > > + > +#define STANDARD_PASS 7 > +///Which passes, by default, should be run on all nodes. > +#define DEFAULT_PASSES ( (1<<STANDARD_PASS) ) > + > ///The Global Viewport ID for this thread (to enable multi-threaded functioning for Viewports) > extern __thread int g_iViewportID; > > +///The Global Pass Number (which Pass is currently doing Render) > +extern __thread int g_iPass; > + > class MercuryNode : public MessageHandler > { > public: > @@ -106,6 +114,8 @@ > > const MercuryMatrix & GetGlobalMatrix() const { return m_pGlobalMatrix[g_iViewportID]; } > const MercuryMatrix & GetModelViewMatrix() const { return m_pModelViewMatrix[g_iViewportID]; } > + > + inline unsigned short GetPasses() const { return m_iPasses; } > protected: > std::list< MercuryNode* > m_children; //These nodes are unique, not instanced > MercuryNode* m_parent; > @@ -120,6 +130,9 @@ > bool m_culled; > bool IsInAssetList(MercuryAsset* asset) const; > > + unsigned short m_iPasses; > + unsigned short m_iForcePasses; //If (1<<15) is set, then, we know the force is enabled. > + > //The asset is actually stored here > std::list< MercuryAssetInstance > m_assets; > > > Modified: Mercury2/src/RenderGraph.cpp > =================================================================== > --- Mercury2/src/RenderGraph.cpp 2009-08-22 16:10:33 UTC (rev 509) > +++ Mercury2/src/RenderGraph.cpp 2009-08-22 17:51:38 UTC (rev 510) > @@ -56,18 +56,32 @@ > > //Update the Matrices > node->m_pGlobalMatrix = &node->FindGlobalMatrix(); > - node->m_pModelViewMatrix = &node->FindModelViewMatrix(); > - > + node->m_pModelViewMatrix = &node->FindModelViewMatrix(); > + > if ( node ) > { > //found a new renderable > entry.m_children.push_back( RenderGraphEntry(&(node->FindGlobalMatrix()), node) ); > lastEntry = &(entry.m_children.back()); > } > + > + unsigned short iPasses = 0; > > for (MercuryNode* child = node->FirstChild(); child != NULL; child = node->NextChild(child)) > + { > Build(child, *lastEntry); > - > + iPasses |= child->m_iPasses; > + } > + > + std::list< MercuryAssetInstance >::iterator i; > + for (i = node->m_assets.begin(); i != node->m_assets.end(); ++i ) > + iPasses |= i->GetPasses(); > + > + if( node->m_iForcePasses & (1<<15 ) ) > + node->m_iPasses = node->m_iForcePasses; > + else > + node->m_iPasses = iPasses; > + > //coming back up the tree > // entry = lastEntry; > } > > > This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. > > ------------------------------------------------------------------------------ > Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day > trial. Simplify your report design, integration and deployment - and focus on > what you do best, core application coding. Discover what's new with > Crystal Reports now. http://p.sf.net/sfu/bobj-july > _______________________________________________ > Hgengine-cvs mailing list > Hge...@li... > https://lists.sourceforge.net/lists/listinfo/hgengine-cvs > |
From: <axl...@us...> - 2009-08-22 19:46:42
|
Revision: 511 http://hgengine.svn.sourceforge.net/hgengine/?rev=511&view=rev Author: axlecrusher Date: 2009-08-22 19:46:34 +0000 (Sat, 22 Aug 2009) Log Message: ----------- remember the last thing that was cached Modified Paths: -------------- Mercury2/src/Texture.cpp Mercury2/src/Texture.h Modified: Mercury2/src/Texture.cpp =================================================================== --- Mercury2/src/Texture.cpp 2009-08-22 17:51:38 UTC (rev 510) +++ Mercury2/src/Texture.cpp 2009-08-22 19:46:34 UTC (rev 511) @@ -102,12 +102,22 @@ void Texture::BindTexture() { + if ( !m_lastBound ) InitiateBindCache(); + + if (m_numActiveTextures >= m_maxActiveTextures) return; + m_textureResource = GL_TEXTURE0+m_numActiveTextures; GLCALL( glActiveTexture( m_textureResource ) ); GLCALL( glClientActiveTextureARB(m_textureResource) ); GLCALL( glEnableClientState(GL_TEXTURE_COORD_ARRAY) ); GLCALL( glEnable( GL_TEXTURE_2D ) ); - GLCALL( glBindTexture(GL_TEXTURE_2D, m_textureID) ); + + if (m_lastBound[m_numActiveTextures] != this) + { + GLCALL( glBindTexture(GL_TEXTURE_2D, m_textureID) ); + m_lastBound[m_numActiveTextures] = this; + ++m_textureBinds; + } GLCALL( glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE ) ); GLERRORCHECK; @@ -120,7 +130,6 @@ m_activeTextures.push_back(this); ++m_numActiveTextures; - ++m_textureBinds; } void Texture::UnbindTexture() @@ -137,6 +146,17 @@ --m_numActiveTextures; } +void Texture::InitiateBindCache() +{ + GLint x; + GLCALL( glGetIntegerv( GL_MAX_TEXTURE_UNITS, &x ) ); + m_lastBound = new Texture*[x]; + m_maxActiveTextures = x; + + for ( x = 0; x < m_maxActiveTextures; ++x) + m_lastBound[x] = NULL; +} + void Texture::LoadImagePath(const MString& path) { if (m_isInstanced) return; @@ -207,6 +227,8 @@ uint8_t Texture::m_numActiveTextures = 0; uint32_t Texture::m_textureBinds = 0; std::list< Texture* > Texture::m_activeTextures; +Texture** Texture::m_lastBound = NULL; +uint8_t Texture::m_maxActiveTextures = 0; /*************************************************************************** * Copyright (C) 2008 by Joshua Allen * Modified: Mercury2/src/Texture.h =================================================================== --- Mercury2/src/Texture.h 2009-08-22 17:51:38 UTC (rev 510) +++ Mercury2/src/Texture.h 2009-08-22 19:46:34 UTC (rev 511) @@ -37,6 +37,8 @@ void BindTexture(); void UnbindTexture(); + void InitiateBindCache(); + const RawImageData* m_raw; uint32_t m_textureID; uint32_t m_textureResource; @@ -46,7 +48,8 @@ static uint32_t m_textureBinds; static std::list< Texture* > m_activeTextures; - + static uint8_t m_maxActiveTextures; + static Texture** m_lastBound; // MString m_filename; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <axl...@us...> - 2009-08-23 01:41:20
|
Revision: 514 http://hgengine.svn.sourceforge.net/hgengine/?rev=514&view=rev Author: axlecrusher Date: 2009-08-23 01:41:14 +0000 (Sun, 23 Aug 2009) Log Message: ----------- reduce the number of opengl API calls by not always disablsing and activating textures Modified Paths: -------------- Mercury2/src/MercuryVBO.cpp Mercury2/src/RenderDifferedLights.cpp Mercury2/src/Texture.cpp Mercury2/src/Texture.h Modified: Mercury2/src/MercuryVBO.cpp =================================================================== --- Mercury2/src/MercuryVBO.cpp 2009-08-22 21:25:09 UTC (rev 513) +++ Mercury2/src/MercuryVBO.cpp 2009-08-23 01:41:14 UTC (rev 514) @@ -25,7 +25,6 @@ void MercuryVBO::Render(const MercuryNode* node) { - uint8_t numTextures = Texture::NumberActiveTextures(); uint16_t stride = sizeof(float)*8; if ( !m_initiated ) InitVBO(); @@ -45,13 +44,7 @@ ++m_vboBinds; } - //apply all the active Textures - for (uint8_t i = 0; i < numTextures; ++i) - { - GLCALL( glActiveTexture( GL_TEXTURE0+i ) ); - GLCALL( glClientActiveTextureARB(GL_TEXTURE0+i) ); - GLCALL( glTexCoordPointer(2, GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*0)) ); - } + Texture::ApplyActiveTextures(stride); GLCALL( glEnableClientState( GL_NORMAL_ARRAY ) ); GLCALL( glNormalPointer(GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*2)) ); Modified: Mercury2/src/RenderDifferedLights.cpp =================================================================== --- Mercury2/src/RenderDifferedLights.cpp 2009-08-22 21:25:09 UTC (rev 513) +++ Mercury2/src/RenderDifferedLights.cpp 2009-08-23 01:41:14 UTC (rev 514) @@ -5,7 +5,6 @@ #include <GLHeaders.h> REGISTER_ASSET_TYPE(RenderDifferedLights); -#define BUFFER_OFFSET(i) ((char*)NULL + (i)) RenderDifferedLights::RenderDifferedLights() { @@ -20,13 +19,7 @@ uint8_t numTextures = Texture::NumberActiveTextures(); uint16_t stride = sizeof(float)*8; - //apply all the active Textures - for (uint8_t i = 0; i < numTextures; ++i) - { - GLCALL( glActiveTexture( GL_TEXTURE0+i ) ); - GLCALL( glClientActiveTextureARB(GL_TEXTURE0+i) ); - GLCALL( glTexCoordPointer(2, GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*0)) ); - } + Texture::ApplyActiveTextures(stride); GLCALL( glPushAttrib( GL_CURRENT_BIT | GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_POLYGON_BIT) ); GLCALL( glCullFace(GL_FRONT) ); Modified: Mercury2/src/Texture.cpp =================================================================== --- Mercury2/src/Texture.cpp 2009-08-22 21:25:09 UTC (rev 513) +++ Mercury2/src/Texture.cpp 2009-08-23 01:41:14 UTC (rev 514) @@ -10,6 +10,8 @@ REGISTER_ASSET_TYPE(Texture); +#define BUFFER_OFFSET(i) ((char*)NULL + (i)) + Texture::Texture() :MercuryAsset(), m_raw(NULL),m_textureID(0) { @@ -34,6 +36,14 @@ void Texture::Clean() { if (m_textureID) { GLCALL( glDeleteTextures(1, &m_textureID) ); } + for (uint8_t i = 0; i < m_maxActiveTextures; ++i) + { + if (m_lastBound[i] == this) + { + Deactivate(); + m_lastBound[i] = 0; + } + } m_textureID = 0; } @@ -107,13 +117,15 @@ if (m_numActiveTextures >= m_maxActiveTextures) return; m_textureResource = GL_TEXTURE0+m_numActiveTextures; - GLCALL( glActiveTexture( m_textureResource ) ); - GLCALL( glClientActiveTextureARB(m_textureResource) ); - GLCALL( glEnableClientState(GL_TEXTURE_COORD_ARRAY) ); - GLCALL( glEnable( GL_TEXTURE_2D ) ); if (m_lastBound[m_numActiveTextures] != this) { +// We don't really even have to disable old spots +// if ( m_lastBound[m_numActiveTextures] != NULL) +// m_lastBound[m_numActiveTextures]->Deactivate(); + + Activate(); + GLCALL( glBindTexture(GL_TEXTURE_2D, m_textureID) ); m_lastBound[m_numActiveTextures] = this; ++m_textureBinds; @@ -134,11 +146,13 @@ void Texture::UnbindTexture() { + /* GLCALL( glActiveTexture( m_textureResource ) ); GLCALL( glClientActiveTextureARB(m_textureResource) ); GLCALL( glDisableClientState(GL_TEXTURE_COORD_ARRAY) ); GLCALL( glDisable( GL_TEXTURE_2D ) ); GLERRORCHECK; + */ Shader::RemoveAttribute( ssprintf("HG_Texture%d", m_numActiveTextures) ); m_activeTextures.pop_back(); @@ -146,6 +160,47 @@ --m_numActiveTextures; } +void Texture::Activate() +{ + GLCALL( glActiveTexture( m_textureResource ) ); + GLCALL( glClientActiveTextureARB(m_textureResource) ); + GLCALL( glEnableClientState(GL_TEXTURE_COORD_ARRAY) ); + GLCALL( glEnable( GL_TEXTURE_2D ) ); +} + +void Texture::Deactivate() +{ + GLCALL( glActiveTexture( m_textureResource ) ); + GLCALL( glClientActiveTextureARB(m_textureResource) ); + GLCALL( glDisableClientState(GL_TEXTURE_COORD_ARRAY) ); + GLCALL( glDisable( GL_TEXTURE_2D ) ); + GLERRORCHECK; +} + +void Texture::ApplyActiveTextures(uint16_t stride) +{ + for (uint8_t i = 0; i < m_numActiveTextures; ++i) + { + GLCALL( glActiveTexture( GL_TEXTURE0+i ) ); + GLCALL( glClientActiveTextureARB(GL_TEXTURE0+i) ); + GLCALL( glTexCoordPointer(2, GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*0)) ); + } + + Texture::DisableUnusedTextures(); +} + +void Texture::DisableUnusedTextures() +{ + for (uint8_t i = m_numActiveTextures; i < m_maxActiveTextures; ++i) + { + if (m_lastBound[m_numActiveTextures] != NULL) + { + m_lastBound[m_numActiveTextures]->Deactivate(); + m_lastBound[m_numActiveTextures] = NULL; + } + } +} + void Texture::InitiateBindCache() { GLint x; Modified: Mercury2/src/Texture.h =================================================================== --- Mercury2/src/Texture.h 2009-08-22 21:25:09 UTC (rev 513) +++ Mercury2/src/Texture.h 2009-08-23 01:41:14 UTC (rev 514) @@ -31,12 +31,18 @@ static const std::list< Texture* >& GetActiveTextures() { return m_activeTextures; } void SetRawData(RawImageData* raw); + + static void ApplyActiveTextures(uint16_t stride); + static void DisableUnusedTextures(); private: void LoadImagePath(const MString& path); void BindTexture(); void UnbindTexture(); + void Activate(); + void Deactivate(); + void InitiateBindCache(); const RawImageData* m_raw; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <axl...@us...> - 2009-08-23 12:42:43
|
Revision: 520 http://hgengine.svn.sourceforge.net/hgengine/?rev=520&view=rev Author: axlecrusher Date: 2009-08-23 12:42:36 +0000 (Sun, 23 Aug 2009) Log Message: ----------- Fix bug where texture could only be used in one active texture location at a time. Modified Paths: -------------- Mercury2/src/Texture.cpp Mercury2/src/Texture.h Modified: Mercury2/src/Texture.cpp =================================================================== --- Mercury2/src/Texture.cpp 2009-08-23 12:12:13 UTC (rev 519) +++ Mercury2/src/Texture.cpp 2009-08-23 12:42:36 UTC (rev 520) @@ -40,7 +40,7 @@ { if (m_lastBound[i] == this) { - Deactivate(); + Deactivate(GL_TEXTURE0 + i); m_lastBound[i] = 0; } } @@ -55,6 +55,7 @@ // m_raw = raw; GLenum byteType = ToGLColorType( m_raw->m_ColorByteType ); + GLCALL( glPushAttrib( GL_TEXTURE_BIT ) ); GLCALL( glBindTexture(GL_TEXTURE_2D, m_textureID) ); /* glTexImage2D(GL_TEXTURE_2D, @@ -79,6 +80,9 @@ // GLCALL( gluBuild2DMipmaps( GL_TEXTURE_2D, 3, m_raw->m_width, m_raw->m_height, ByteType, GL_UNSIGNED_BYTE, m_raw->m_data ) ); SAFE_DELETE(m_raw); + + GLCALL( glPopAttrib() ); + }; void Texture::Render(const MercuryNode* node) @@ -116,15 +120,13 @@ if (m_numActiveTextures >= m_maxActiveTextures) return; - m_textureResource = GL_TEXTURE0+m_numActiveTextures; - -// if (m_lastBound[m_numActiveTextures] != this) + if (m_lastBound[m_numActiveTextures] != this) { // We don't really even have to disable old spots // if ( m_lastBound[m_numActiveTextures] != NULL) // m_lastBound[m_numActiveTextures]->Deactivate(); - Activate(); + Activate(GL_TEXTURE0 + m_numActiveTextures); GLCALL( glBindTexture(GL_TEXTURE_2D, m_textureID) ); @@ -148,34 +150,26 @@ void Texture::UnbindTexture() { - /* - GLCALL( glActiveTexture( m_textureResource ) ); - GLCALL( glClientActiveTextureARB(m_textureResource) ); - GLCALL( glDisableClientState(GL_TEXTURE_COORD_ARRAY) ); - GLCALL( glDisable( GL_TEXTURE_2D ) ); - GLERRORCHECK; - */ +// Deactivate(m_textureResource); - Deactivate(); - Shader::RemoveAttribute( ssprintf("HG_Texture%d", m_numActiveTextures) ); m_activeTextures.pop_back(); --m_numActiveTextures; } -void Texture::Activate() +void Texture::Activate(uint32_t textureResource) { - GLCALL( glActiveTexture( m_textureResource ) ); - GLCALL( glClientActiveTextureARB(m_textureResource) ); + GLCALL( glActiveTexture( textureResource ) ); + GLCALL( glClientActiveTextureARB(textureResource) ); GLCALL( glEnableClientState(GL_TEXTURE_COORD_ARRAY) ); GLCALL( glEnable( GL_TEXTURE_2D ) ); } -void Texture::Deactivate() +void Texture::Deactivate(uint32_t textureResource) { - GLCALL( glActiveTexture( m_textureResource ) ); - GLCALL( glClientActiveTextureARB(m_textureResource) ); + GLCALL( glActiveTexture( textureResource ) ); + GLCALL( glClientActiveTextureARB(textureResource) ); GLCALL( glDisableClientState(GL_TEXTURE_COORD_ARRAY) ); GLCALL( glDisable( GL_TEXTURE_2D ) ); GLERRORCHECK; @@ -190,7 +184,7 @@ GLCALL( glTexCoordPointer(2, GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*0)) ); } -// Texture::DisableUnusedTextures(); + Texture::DisableUnusedTextures(); } void Texture::DisableUnusedTextures() @@ -199,7 +193,7 @@ { if (m_lastBound[m_numActiveTextures] != NULL) { - m_lastBound[m_numActiveTextures]->Deactivate(); + m_lastBound[m_numActiveTextures]->Deactivate(GL_TEXTURE0 + i); m_lastBound[m_numActiveTextures] = NULL; } } Modified: Mercury2/src/Texture.h =================================================================== --- Mercury2/src/Texture.h 2009-08-23 12:12:13 UTC (rev 519) +++ Mercury2/src/Texture.h 2009-08-23 12:42:36 UTC (rev 520) @@ -40,14 +40,13 @@ void BindTexture(); void UnbindTexture(); - void Activate(); - void Deactivate(); + void Activate(uint32_t textureResource); + void Deactivate(uint32_t textureResource); void InitiateBindCache(); const RawImageData* m_raw; uint32_t m_textureID; - uint32_t m_textureResource; static bool m_initTextureSuccess; static uint8_t m_numActiveTextures; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <axl...@us...> - 2009-08-23 13:08:21
|
Revision: 521 http://hgengine.svn.sourceforge.net/hgengine/?rev=521&view=rev Author: axlecrusher Date: 2009-08-23 13:08:11 +0000 (Sun, 23 Aug 2009) Log Message: ----------- revert back to recursive rendering Modified Paths: -------------- Mercury2/src/Mercury2.cpp Mercury2/src/MercuryNode.cpp Modified: Mercury2/src/Mercury2.cpp =================================================================== --- Mercury2/src/Mercury2.cpp 2009-08-23 12:42:36 UTC (rev 520) +++ Mercury2/src/Mercury2.cpp 2009-08-23 13:08:11 UTC (rev 521) @@ -140,16 +140,19 @@ // RenderableNode::RecursiveRender(root); // printf("\n"); - +/* for( g_iPass = 2; g_iPass < 5; g_iPass++ ) //2,3,4 if( root->GetPasses() & (1<<g_iPass) ) root->RecursiveRender( ); - +*/ root->RecursivePreRender(); - - for( g_iPass = 5; g_iPass < 15; g_iPass++ ) //5..15 + root->RecursiveRender(); + +/* for( g_iPass = 5; g_iPass < 15; g_iPass++ ) //5..15 if( root->GetPasses() & (1<<g_iPass) ) root->RecursiveRender( ); + + */ // renderGraph.RenderAlpha(); w->SwapBuffers(); Modified: Mercury2/src/MercuryNode.cpp =================================================================== --- Mercury2/src/MercuryNode.cpp 2009-08-23 12:42:36 UTC (rev 520) +++ Mercury2/src/MercuryNode.cpp 2009-08-23 13:08:11 UTC (rev 521) @@ -200,7 +200,8 @@ printf( "1%*c %p:%s\n", depth, 0, this, GetName().c_str() ); depth++; #else - if ( IsHidden() || IsCulled() || (! (m_iPasses & (1<<g_iPass))) ) +// if ( IsHidden() || IsCulled() || (! (m_iPasses & (1<<g_iPass))) ) + if ( IsHidden() || IsCulled() ) return; #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cn...@us...> - 2009-08-24 17:24:21
|
Revision: 524 http://hgengine.svn.sourceforge.net/hgengine/?rev=524&view=rev Author: cnlohr Date: 2009-08-24 17:24:14 +0000 (Mon, 24 Aug 2009) Log Message: ----------- re-enable multipass rendering Modified Paths: -------------- Mercury2/src/Mercury2.cpp Mercury2/src/MercuryNode.cpp Modified: Mercury2/src/Mercury2.cpp =================================================================== --- Mercury2/src/Mercury2.cpp 2009-08-24 17:10:52 UTC (rev 523) +++ Mercury2/src/Mercury2.cpp 2009-08-24 17:24:14 UTC (rev 524) @@ -21,6 +21,8 @@ #include <MercuryLog.h> +#define MULTIPASS + bool SHOWBOUNDINGVOLUME = false; bool SHOWAXISES = false; bool DOOCCLUSIONCULL = false; @@ -136,24 +138,22 @@ } w->Clear(); -// renderGraph.Render(); -// RenderableNode::RecursiveRender(root); -// printf("\n"); -/* +#ifdef MULTIPASS for( g_iPass = 2; g_iPass < 5; g_iPass++ ) //2,3,4 if( root->GetPasses() & (1<<g_iPass) ) root->RecursiveRender( ); -*/ +#endif root->RecursivePreRender(); + +#ifndef MULTIPASS root->RecursiveRender(); - -/* for( g_iPass = 5; g_iPass < 15; g_iPass++ ) //5..15 +#else + for( g_iPass = 5; g_iPass < 15; g_iPass++ ) //5..15 if( root->GetPasses() & (1<<g_iPass) ) root->RecursiveRender( ); +#endif - */ -// renderGraph.RenderAlpha(); w->SwapBuffers(); Modified: Mercury2/src/MercuryNode.cpp =================================================================== --- Mercury2/src/MercuryNode.cpp 2009-08-24 17:10:52 UTC (rev 523) +++ Mercury2/src/MercuryNode.cpp 2009-08-24 17:24:14 UTC (rev 524) @@ -201,8 +201,7 @@ printf( "1%*c %p:%s\n", depth, 0, this, GetName().c_str() ); depth++; #else -// if ( IsHidden() || IsCulled() || (! (m_iPasses & (1<<g_iPass))) ) - if ( IsHidden() || IsCulled() ) + if ( IsHidden() || IsCulled() || (! (m_iPasses & (1<<g_iPass))) ) return; #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <axl...@us...> - 2009-08-30 02:52:01
|
Revision: 527 http://hgengine.svn.sourceforge.net/hgengine/?rev=527&view=rev Author: axlecrusher Date: 2009-08-30 02:51:54 +0000 (Sun, 30 Aug 2009) Log Message: ----------- Fix windows compile Modified Paths: -------------- Mercury2/src/MercuryLog.cpp Mercury2/src/MercuryNode.cpp Mercury2/src/MercuryNode.h Mercury2/src/MercuryThreads.h Mercury2/src/MercuryUtil.cpp Mercury2/src/MercuryUtil.h Mercury2/src/OGLExtensions.cpp Mercury2/src/OGLExtensions.h Modified: Mercury2/src/MercuryLog.cpp =================================================================== --- Mercury2/src/MercuryLog.cpp 2009-08-28 20:44:26 UTC (rev 526) +++ Mercury2/src/MercuryLog.cpp 2009-08-30 02:51:54 UTC (rev 527) @@ -11,7 +11,7 @@ { log->CopyQueue(); log->WriteQueue(); - usleep(100000); //10x/sec + msleep(100); //10x/sec } } Modified: Mercury2/src/MercuryNode.cpp =================================================================== --- Mercury2/src/MercuryNode.cpp 2009-08-28 20:44:26 UTC (rev 526) +++ Mercury2/src/MercuryNode.cpp 2009-08-30 02:51:54 UTC (rev 527) @@ -393,8 +393,8 @@ } bool MercuryNode::m_rebuildRenderGraph = false; -__thread int g_iViewportID; -__thread int g_iPass; +__ThreadLocalStore int g_iViewportID; +__ThreadLocalStore int g_iPass; /*************************************************************************** Modified: Mercury2/src/MercuryNode.h =================================================================== --- Mercury2/src/MercuryNode.h 2009-08-28 20:44:26 UTC (rev 526) +++ Mercury2/src/MercuryNode.h 2009-08-30 02:51:54 UTC (rev 527) @@ -36,10 +36,10 @@ #define DEFAULT_PASSES ( (1<<STANDARD_PASS) ) ///The Global Viewport ID for this thread (to enable multi-threaded functioning for Viewports) -extern __thread int g_iViewportID; +extern __ThreadLocalStore int g_iViewportID; ///The Global Pass Number (which Pass is currently doing Render) -extern __thread int g_iPass; +extern __ThreadLocalStore int g_iPass; class MercuryNode : public MessageHandler { Modified: Mercury2/src/MercuryThreads.h =================================================================== --- Mercury2/src/MercuryThreads.h 2009-08-28 20:44:26 UTC (rev 526) +++ Mercury2/src/MercuryThreads.h 2009-08-30 02:51:54 UTC (rev 527) @@ -15,7 +15,10 @@ #else #include <kernel.h> #endif +#define __ThreadLocalStore __thread #else +#include <WIndows.h> +#define __ThreadLocalStore __declspec(thread) class StartThreadData; #endif Modified: Mercury2/src/MercuryUtil.cpp =================================================================== --- Mercury2/src/MercuryUtil.cpp 2009-08-28 20:44:26 UTC (rev 526) +++ Mercury2/src/MercuryUtil.cpp 2009-08-30 02:51:54 UTC (rev 527) @@ -4,6 +4,10 @@ #include <MercuryVector.h> #include <MercuryBacktrace.h> +#ifdef WIN32 +#include <Windows.h> +#endif + MString ConvertToCFormat( const MString & ncf ) { MString ret; @@ -273,11 +277,15 @@ } } +void msleep(uint32_t msec) +{ +#ifdef WIN32 + Sleep(msec); +#else + usleep(msec*1000); +#endif +} - - - - /* Copyright (c) 2009, Joshua Allen and Charles Lohr * All rights reserved. * Modified: Mercury2/src/MercuryUtil.h =================================================================== --- Mercury2/src/MercuryUtil.h 2009-08-28 20:44:26 UTC (rev 526) +++ Mercury2/src/MercuryUtil.h 2009-08-30 02:51:54 UTC (rev 527) @@ -131,6 +131,9 @@ ///Convert a C-style formatted string into it's binary string equivalent. MString ConvertToUnformatted( const MString & cf ); +///millisecond sleep +void msleep(uint32_t msec); + #endif /* Copyright (c) 2009, Joshua Allen and Charles Lohr Modified: Mercury2/src/OGLExtensions.cpp =================================================================== --- Mercury2/src/OGLExtensions.cpp 2009-08-28 20:44:26 UTC (rev 526) +++ Mercury2/src/OGLExtensions.cpp 2009-08-30 02:51:54 UTC (rev 527) @@ -33,6 +33,7 @@ PFNGLGETACTIVEUNIFORMARBPROC glGetActiveUniformARB; PFNGLUNIFORM1IARBPROC glUniform1iARB; PFNGLUNIFORM4FVARBPROC glUniform4fvARB; +PFNGLUNIFORM4IVARBPROC glUniform4ivARB; PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT; PFNGLGENRENDERBUFFERSEXTPROC glGenRenderbuffersEXT; Modified: Mercury2/src/OGLExtensions.h =================================================================== --- Mercury2/src/OGLExtensions.h 2009-08-28 20:44:26 UTC (rev 526) +++ Mercury2/src/OGLExtensions.h 2009-08-30 02:51:54 UTC (rev 527) @@ -28,6 +28,7 @@ extern PFNGLGETACTIVEUNIFORMARBPROC glGetActiveUniformARB; extern PFNGLUNIFORM1IARBPROC glUniform1iARB; extern PFNGLUNIFORM4FVARBPROC glUniform4fvARB; +extern PFNGLUNIFORM4IVARBPROC glUniform4ivARB; extern PFNGLUNIFORMMATRIX4FVARBPROC glUniformMatrix4fvARB; extern PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cn...@us...> - 2009-09-26 18:09:33
|
Revision: 541 http://hgengine.svn.sourceforge.net/hgengine/?rev=541&view=rev Author: cnlohr Date: 2009-09-26 18:09:25 +0000 (Sat, 26 Sep 2009) Log Message: ----------- make use of new CTA + Priority Queue Modified Paths: -------------- Mercury2/src/MercuryMessageManager.cpp Mercury2/src/MercuryMessageManager.h Mercury2/src/RenderGraph.cpp Mercury2/src/RenderGraph.h Modified: Mercury2/src/MercuryMessageManager.cpp =================================================================== --- Mercury2/src/MercuryMessageManager.cpp 2009-09-26 18:08:19 UTC (rev 540) +++ Mercury2/src/MercuryMessageManager.cpp 2009-09-26 18:09:25 UTC (rev 541) @@ -1,30 +1,39 @@ #include <MercuryMessageManager.h> +#include <MercuryCTA.h> +MercuryCTA HolderAllocator( sizeof(MessageHolder), 8 ); + + MessageHolder::MessageHolder() - :data(NULL) + :data(NULL),when(0) { } +bool MessageHolder::Compare( void * left, void * right ) +{ + return (((MessageHolder*)left)->when) < (((MessageHolder*)right)->when); +} + void MercuryMessageManager::PostMessage(const MString& message, MessageData* data, float delay) { - MessageHolder m; - m.message = message; - m.data = data; - uint64_t fireTime = m_currTime + uint64_t(delay*1000000); - m_messageQueue.Insert(fireTime, m); + MessageHolder * m = new(HolderAllocator.Malloc()) MessageHolder(); + m->message = message; + m->data = data; + m->when = m_currTime + uint64_t(delay*1000000); + m_messageQueue.Push( m ); } void MercuryMessageManager::PumpMessages(const uint64_t& currTime) { m_currTime = currTime; - while ( !m_messageQueue.empty() ) + while ( !m_messageQueue.Empty() ) { - if ( m_messageQueue.PeekNextPriority() > m_currTime ) return; + if ( ((MessageHolder *)m_messageQueue.Peek())->when > m_currTime ) return; - MessageHolder& message = m_messageQueue.GetNext(); - FireOffMessage( message ); - SAFE_DELETE( message.data ); - m_messageQueue.PopNext(); + MessageHolder * message = (MessageHolder *)m_messageQueue.Pop(); + FireOffMessage( *message ); + SAFE_DELETE( message->data ); + HolderAllocator.Free(message); } } @@ -33,15 +42,15 @@ m_messageRecipients[message].push_back(ptr); } -void MercuryMessageManager::FireOffMessage(const MessageHolder& message) +void MercuryMessageManager::FireOffMessage( const MessageHolder & message ) { - std::map< MString, std::list< MessageHandler* > >::iterator i = m_messageRecipients.find(message.message); - - if ( i != m_messageRecipients.end() ) +// std::map< MString, std::list< MessageHandler* > >::iterator i = m_messageRecipients.find(message.message); + std::list< MessageHandler* > * ref = m_messageRecipients.get( message.message ); + if ( ref ) { - std::list< MessageHandler* >::iterator recipients = i->second.begin(); + std::list< MessageHandler* >::iterator recipients = ref->begin(); - for (; recipients != i->second.end(); ++recipients) + for (; recipients != ref->end(); ++recipients) (*recipients)->HandleMessage(message.message, message.data); } } Modified: Mercury2/src/MercuryMessageManager.h =================================================================== --- Mercury2/src/MercuryMessageManager.h 2009-09-26 18:08:19 UTC (rev 540) +++ Mercury2/src/MercuryMessageManager.h 2009-09-26 18:09:25 UTC (rev 541) @@ -1,20 +1,25 @@ #ifndef MERCURYMESSAGEMANAGER_H #define MERCURYMESSAGEMANAGER_H + +#include <PriorityQueue.h> #include <Callback.h> #include <MessageHandler.h> -#include <map> -#include <PriorityQueue.h> +#include <MercuryHash.h> +#include <list> #include <MercuryString.h> #include <MercuryUtil.h> #include <Mint.h> +#include <MAutoPtr.h> -class MessageHolder +class MessageHolder : public RefBase { public: MessageHolder(); MString message; MessageData* data; + uint64_t when; + static bool Compare( void * left, void * right ); }; /* This message system uses absolute integer time values to fire off events. @@ -25,18 +30,19 @@ class MercuryMessageManager { public: + MercuryMessageManager() : m_messageQueue( MessageHolder::Compare ) { } void PostMessage(const MString& message, MessageData* data, float delay); void PumpMessages(const uint64_t& currTime); void RegisterForMessage(const MString& message, MessageHandler* ptr); static MercuryMessageManager& GetInstance(); private: - void FireOffMessage(const MessageHolder& message); + void FireOffMessage( const MessageHolder & message ); - PriorityQueue<uint64_t, MessageHolder> m_messageQueue; + PriorityQueue m_messageQueue; uint64_t m_currTime; //microseconds - std::map< MString, std::list< MessageHandler* > > m_messageRecipients; + MHash< std::list< MessageHandler* > > m_messageRecipients; }; static InstanceCounter<MercuryMessageManager> MMcounter("MessageManager"); Modified: Mercury2/src/RenderGraph.cpp =================================================================== --- Mercury2/src/RenderGraph.cpp 2009-09-26 18:08:19 UTC (rev 540) +++ Mercury2/src/RenderGraph.cpp 2009-09-26 18:09:25 UTC (rev 541) @@ -1,14 +1,18 @@ #include <MercuryMatrix.h> #include <RenderGraph.h> - +#include <MercuryCTA.h> #include <GLHeaders.h> #include <Shader.h> #include <Viewport.h> #include <Texture.h> +MercuryCTA AlphaHolderAllocator( sizeof(StoreRenderState), 8 ); + RenderGraph* CURRENTRENDERGRAPH = NULL; + + void RenderGraphEntry::Render() { MercuryMatrix modelView; @@ -88,37 +92,40 @@ void RenderGraph::AddAlphaNode( MercuryNode* node ) { - StoreRenderState srs; - srs.Save(); - srs.Matrix = node->GetGlobalMatrix(); - srs.Node = node; - - MercuryVertex p = srs.Matrix * MercuryVertex(0,0,0,1); + StoreRenderState * srs = new(AlphaHolderAllocator.Malloc()) StoreRenderState(); + srs->Save(); + srs->Matrix = node->GetGlobalMatrix(); + MercuryVertex p = srs->Matrix * MercuryVertex(0,0,0,1); + srs->Node = node; //order from back to front (ensure furthest has lowest number and is first) - float length = (p - EYE).Length() * -1; - m_alphaNodesQueue.Insert(length, srs); + srs->fDistance = (p - EYE).Length() * -1; + + //This makes the insertion linear time. We fix this up before rendering. + m_alphaNodesQueue.PushRaw( srs ); } void RenderGraph::RenderAlpha() { - while ( !m_alphaNodesQueue.empty() ) + m_alphaNodesQueue.Fixup(); + + while ( !m_alphaNodesQueue.Empty() ) { - StoreRenderState& srs = m_alphaNodesQueue.GetNext(); - - std::list< MercuryAsset* >::iterator i = srs.Assets.begin(); - for (;i != srs.Assets.end(); ++i) + StoreRenderState * srs = (StoreRenderState *)m_alphaNodesQueue.Pop(); + + std::list< MercuryAsset* >::iterator i = srs->Assets.begin(); + for (;i != srs->Assets.end(); ++i) { - (*i)->PreRender(srs.Node); - (*i)->Render(srs.Node); + (*i)->PreRender(srs->Node); + (*i)->Render(srs->Node); } - srs.Node->RecursiveRender(); + srs->Node->RecursiveRender(); - for (i = srs.Assets.begin();i != srs.Assets.end(); ++i) - (*i)->PostRender(srs.Node); + for (i = srs->Assets.begin();i != srs->Assets.end(); ++i) + (*i)->PostRender(srs->Node); - m_alphaNodesQueue.PopNext(); + AlphaHolderAllocator.Free( srs ); } } @@ -136,11 +143,17 @@ m_lights.clear(); } + StoreRenderState::StoreRenderState() :Node(NULL) { } +bool StoreRenderState::Compare( void * Left, void * Right ) +{ + return ((StoreRenderState*)Left)->fDistance < ((StoreRenderState*)Right)->fDistance; +} + void StoreRenderState::Save() { //get assets for current textures Modified: Mercury2/src/RenderGraph.h =================================================================== --- Mercury2/src/RenderGraph.h 2009-09-26 18:08:19 UTC (rev 540) +++ Mercury2/src/RenderGraph.h 2009-09-26 18:09:25 UTC (rev 541) @@ -39,6 +39,8 @@ void Save(); MercuryNode* Node; MercuryMatrix Matrix; + float fDistance; + static bool Compare( void * Left, void * Right ); // private: std::list< MercuryAsset* > Assets; }; @@ -46,6 +48,7 @@ class RenderGraph { public: + RenderGraph() : m_alphaNodesQueue( &StoreRenderState::Compare ) { } void Build( MercuryNode* node ); inline void Render() { m_root.Render(); } @@ -59,7 +62,7 @@ RenderGraphEntry m_root; //nodes that use alpha, ordered from farthest to nearest from the camera - PriorityQueue<float, StoreRenderState > m_alphaNodesQueue; + PriorityQueue m_alphaNodesQueue; std::list< Light* > m_lights; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cn...@us...> - 2009-10-02 06:48:04
|
Revision: 546 http://hgengine.svn.sourceforge.net/hgengine/?rev=546&view=rev Author: cnlohr Date: 2009-10-02 06:47:57 +0000 (Fri, 02 Oct 2009) Log Message: ----------- permit disabling of the GL profiling based on the configure flags Modified Paths: -------------- Mercury2/src/GLHeaders.h Mercury2/src/GLHelpers.cpp Mercury2/src/Mercury2.cpp Mercury2/src/global.h Modified: Mercury2/src/GLHeaders.h =================================================================== --- Mercury2/src/GLHeaders.h 2009-10-02 06:47:10 UTC (rev 545) +++ Mercury2/src/GLHeaders.h 2009-10-02 06:47:57 UTC (rev 546) @@ -1,5 +1,7 @@ #ifndef GLHEADERS_H #define GLHEADERS_H + +#include <configuration.h> #ifdef WIN32 #include <windows.h> Modified: Mercury2/src/GLHelpers.cpp =================================================================== --- Mercury2/src/GLHelpers.cpp 2009-10-02 06:47:10 UTC (rev 545) +++ Mercury2/src/GLHelpers.cpp 2009-10-02 06:47:57 UTC (rev 546) @@ -2,8 +2,6 @@ #include <GLHelpers.h> #include <MercuryHash.h> -uint32_t GLCALLCOUNT = 0; -MHash< uint32_t> GLFUNCTCOUNT; MString GlError2String(uint32_t e) { @@ -110,6 +108,10 @@ } +#ifdef GL_PROFILE +uint32_t GLCALLCOUNT = 0; +MHash< uint32_t> GLFUNCTCOUNT; + void ProfileGLCall(const MString& funcName) { ++GLCALLCOUNT; @@ -126,6 +128,12 @@ GLFUNCTCOUNT.clear(); } +#else +void PrintGLFunctionCalls() +{ + LOG.Write( "No profiling performed on data set because it was configrued off." ); +} +#endif /**************************************************************************** * Copyright (C) 2009 by Joshua Allen * Modified: Mercury2/src/Mercury2.cpp =================================================================== --- Mercury2/src/Mercury2.cpp 2009-10-02 06:47:10 UTC (rev 545) +++ Mercury2/src/Mercury2.cpp 2009-10-02 06:47:57 UTC (rev 546) @@ -165,11 +165,13 @@ float batches = MercuryVBO::ResetBatchCount()/(float)m_count; float VBinds = MercuryVBO::ResetBindCount()/(float)m_count; float Tbinds = Texture::ReadAndResetBindCount()/(float)m_count; + LOG.Write( ssprintf("FPS: %f, VBO batches %f, TBinds %f, VBinds %f", m_count/fpsTimer.Age(), batches, Tbinds, VBinds) ); +#ifdef GL_PROFILE float GLcalls = GLCALLCOUNT/(float)m_count; - LOG.Write( ssprintf("FPS: %f, VBO batches %f, TBinds %f, VBinds %f", m_count/fpsTimer.Age(), batches, Tbinds, VBinds) ); - LOG.Write( ssprintf("GL/f: %f", GLcalls) ); + GLCALLCOUNT = 0; + LOG.Write( ssprintf("GL/f: %f", GLcalls) ); +#endif m_count = 0; - GLCALLCOUNT = 0; fpsTimer = timer; } } Modified: Mercury2/src/global.h =================================================================== --- Mercury2/src/global.h 2009-10-02 06:47:10 UTC (rev 545) +++ Mercury2/src/global.h 2009-10-02 06:47:57 UTC (rev 546) @@ -4,7 +4,7 @@ #ifdef WIN32 #pragma warning( disable : 4100 ) #endif - +#include <configuration.h> #include <Mint.h> -#endif \ No newline at end of file +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <cn...@us...> - 2009-10-02 06:49:00
|
Revision: 548 http://hgengine.svn.sourceforge.net/hgengine/?rev=548&view=rev Author: cnlohr Date: 2009-10-02 06:48:51 +0000 (Fri, 02 Oct 2009) Log Message: ----------- at least make the system compile with SSE actually enabled Modified Paths: -------------- Mercury2/src/MercuryMath.h Mercury2/src/MercuryMatrix.cpp Modified: Mercury2/src/MercuryMath.h =================================================================== --- Mercury2/src/MercuryMath.h 2009-10-02 06:48:35 UTC (rev 547) +++ Mercury2/src/MercuryMath.h 2009-10-02 06:48:51 UTC (rev 548) @@ -2,6 +2,9 @@ #define _MERCURYMATH_H #include <math.h> +#ifdef HGENGINE +#include <configuration.h> +#endif #ifdef USE_SSE #include <xmmintrin.h> Modified: Mercury2/src/MercuryMatrix.cpp =================================================================== --- Mercury2/src/MercuryMatrix.cpp 2009-10-02 06:48:35 UTC (rev 547) +++ Mercury2/src/MercuryMatrix.cpp 2009-10-02 06:48:51 UTC (rev 548) @@ -1,9 +1,22 @@ #include "MercuryMatrix.h" #include <MercuryLog.h> +float base_matrix_identity[16] = { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; + MercuryMatrix::MercuryMatrix() { - *this = Identity(); +#ifdef USE_SSE + m_matrix[0] = _mm_load1_ps( &base_matrix_identity[0] ); + m_matrix[1] = _mm_load1_ps( &base_matrix_identity[4] ); + m_matrix[2] = _mm_load1_ps( &base_matrix_identity[8] ); + m_matrix[3] = _mm_load1_ps( &base_matrix_identity[12] ); +#else + Copy16f(m_matrix[0], base_matrix_identity ); +#endif } const MercuryMatrix& MercuryMatrix::operator=(const MercuryMatrix& m) @@ -28,14 +41,19 @@ const MercuryMatrix& MercuryMatrix::Identity() { - if (IdentityMatrix.m_matrix[0][0] != 1.0f) + static bool bSetIdentity = false; + + if (!bSetIdentity) { - float identity[16] = { - 1.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f }; - Copy16f(MercuryMatrix::IdentityMatrix.m_matrix[0], identity ); + bSetIdentity = true; +#ifdef USE_SSE + MercuryMatrix::IdentityMatrix.m_matrix[0] = _mm_load1_ps( &base_matrix_identity[0] ); + MercuryMatrix::IdentityMatrix.m_matrix[1] = _mm_load1_ps( &base_matrix_identity[4] ); + MercuryMatrix::IdentityMatrix.m_matrix[2] = _mm_load1_ps( &base_matrix_identity[8] ); + MercuryMatrix::IdentityMatrix.m_matrix[3] = _mm_load1_ps( &base_matrix_identity[12] ); +#else + Copy16f(MercuryMatrix::IdentityMatrix.m_matrix[0], base_matrix_identity ); +#endif } return IdentityMatrix; @@ -212,7 +230,8 @@ MercuryMatrix MercuryMatrix::IdentityMatrix; /* - * Copyright (c) 2006 Joshua Allen + * Copyright (c) 2006-2009 Joshua Allen + * Charles Lohr * All rights reserved. * * Redistribution and use in source and binary forms, with or This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <axl...@us...> - 2009-10-10 22:16:40
|
Revision: 553 http://hgengine.svn.sourceforge.net/hgengine/?rev=553&view=rev Author: axlecrusher Date: 2009-10-10 22:16:31 +0000 (Sat, 10 Oct 2009) Log Message: ----------- update Modified Paths: -------------- Mercury2/src/HGMDLModel.h Mercury2/src/MercuryAsset.h Modified: Mercury2/src/HGMDLModel.h =================================================================== --- Mercury2/src/HGMDLModel.h 2009-10-10 22:15:29 UTC (rev 552) +++ Mercury2/src/HGMDLModel.h 2009-10-10 22:16:31 UTC (rev 553) @@ -23,11 +23,13 @@ virtual void PreRender(const MercuryNode* node); virtual void Render(const MercuryNode* node); + protected: + std::vector< MAutoPtr< HGMDLMesh > > m_meshes; + private: + CLASS_HELPERS( MercuryAsset ); void LoadHGMDL( const MString& path ); static void* LoaderThread(void* d); - - std::vector< MAutoPtr< HGMDLMesh > > m_meshes; }; Modified: Mercury2/src/MercuryAsset.h =================================================================== --- Mercury2/src/MercuryAsset.h 2009-10-10 22:15:29 UTC (rev 552) +++ Mercury2/src/MercuryAsset.h 2009-10-10 22:16:31 UTC (rev 553) @@ -146,6 +146,9 @@ #define REMOVE_ASSET_INSTANCE(class, key)\ AssetFactory::GetInstance().RemoveAssetInstance( ToUpper(#class)+key ); +#define CLASS_HELPERS(baseClass)\ + typedef baseClass base; + #endif /*************************************************************************** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <axl...@us...> - 2009-10-10 22:19:20
|
Revision: 554 http://hgengine.svn.sourceforge.net/hgengine/?rev=554&view=rev Author: axlecrusher Date: 2009-10-10 22:19:14 +0000 (Sat, 10 Oct 2009) Log Message: ----------- add const methods update for easier striding else where Modified Paths: -------------- Mercury2/src/MercuryVBO.cpp Mercury2/src/MercuryVBO.h Modified: Mercury2/src/MercuryVBO.cpp =================================================================== --- Mercury2/src/MercuryVBO.cpp 2009-10-10 22:16:31 UTC (rev 553) +++ Mercury2/src/MercuryVBO.cpp 2009-10-10 22:19:14 UTC (rev 554) @@ -25,7 +25,6 @@ void MercuryVBO::Render(const MercuryNode* node) { - uint16_t stride = sizeof(float)*8; if ( !m_initiated ) InitVBO(); @@ -40,14 +39,14 @@ GLCALL( glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_bufferIDs[0]) ); GLCALL( glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_bufferIDs[1]) ); - GLCALL( glVertexPointer(3, GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*5)) ); + GLCALL( glVertexPointer(3, GL_FLOAT, STRIDE*sizeof(float), BUFFER_OFFSET( VERTEX_OFFSET*sizeof(float) ) ) ); ++m_vboBinds; } - Texture::ApplyActiveTextures(stride); + Texture::ApplyActiveTextures(STRIDE*sizeof(float)); GLCALL( glEnableClientState( GL_NORMAL_ARRAY ) ); - GLCALL( glNormalPointer(GL_FLOAT, stride, BUFFER_OFFSET(sizeof(float)*2)) ); + GLCALL( glNormalPointer(GL_FLOAT, STRIDE*sizeof(float), BUFFER_OFFSET(sizeof(float)*2)) ); GLCALL( glDrawRangeElements(GL_TRIANGLES, 0, m_indexData.Length()-1, m_indexData.Length(), GL_UNSIGNED_SHORT, NULL) ); m_vboBatches++; Modified: Mercury2/src/MercuryVBO.h =================================================================== --- Mercury2/src/MercuryVBO.h 2009-10-10 22:16:31 UTC (rev 553) +++ Mercury2/src/MercuryVBO.h 2009-10-10 22:19:14 UTC (rev 554) @@ -10,6 +10,9 @@ class MercuryVBO : public MercuryAsset { public: + static const uint16_t STRIDE = 8; + static const uint16_t VERTEX_OFFSET = 5; + MercuryVBO(); virtual ~MercuryVBO(); @@ -22,9 +25,14 @@ static uint32_t ResetBatchCount() { uint32_t t = m_vboBatches; m_vboBatches = 0; return t; } static uint32_t ResetBindCount() { uint32_t t = m_vboBinds; m_vboBinds = 0; return t; } - float * GetVertexHandle() { return &m_vertexData[0]; } - short unsigned int * GetIndexHandle() { return &m_indexData[0]; } + const float* GetVertexHandle() const { return m_vertexData.Buffer(); } + float* GetVertexHandle() { return m_vertexData.Buffer(); } + + const short unsigned int* GetIndexHandle() const { return m_indexData.Buffer(); } + short unsigned int* GetIndexHandle() { return m_indexData.Buffer(); } + inline uint16_t IndiceCount() const { return m_indexData.Length(); } + static void* m_lastVBOrendered; void DirtyVertices() { m_bDirtyVertices = 1; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <axl...@us...> - 2009-10-11 00:49:46
|
Revision: 557 http://hgengine.svn.sourceforge.net/hgengine/?rev=557&view=rev Author: axlecrusher Date: 2009-10-11 00:49:38 +0000 (Sun, 11 Oct 2009) Log Message: ----------- we can store the asset's parent node pointer in the per-instance data Modified Paths: -------------- Mercury2/src/MercuryAsset.cpp Mercury2/src/MercuryAsset.h Mercury2/src/MercuryNode.cpp Modified: Mercury2/src/MercuryAsset.cpp =================================================================== --- Mercury2/src/MercuryAsset.cpp 2009-10-10 22:22:50 UTC (rev 556) +++ Mercury2/src/MercuryAsset.cpp 2009-10-11 00:49:38 UTC (rev 557) @@ -93,8 +93,8 @@ GLCALL( glEnd() ); } -MercuryAssetInstance::MercuryAssetInstance(MercuryAsset* asset) - :m_asset( asset ), m_isCulled( false ), m_iPasses( asset->GetPasses() ) +MercuryAssetInstance::MercuryAssetInstance(MercuryAsset* asset, MercuryNode* parentNode) + :m_parentNode(parentNode), m_asset( asset ), m_isCulled( false ), m_iPasses( asset->GetPasses() ) { } Modified: Mercury2/src/MercuryAsset.h =================================================================== --- Mercury2/src/MercuryAsset.h 2009-10-10 22:22:50 UTC (rev 556) +++ Mercury2/src/MercuryAsset.h 2009-10-11 00:49:38 UTC (rev 557) @@ -25,7 +25,7 @@ /* Assets are stored in renderable nodes with MAuto pointers. The renderable nodes handle the memory management */ -class MercuryAsset : public RefBase, MessageHandler +class MercuryAsset : public RefBase, public MessageHandler { public: MercuryAsset(); @@ -80,7 +80,7 @@ class MercuryAssetInstance { public: - MercuryAssetInstance(MercuryAsset* asset); + MercuryAssetInstance(MercuryAsset* asset, MercuryNode* parentNode); inline MercuryAsset& Asset() { return *m_asset; } inline const MercuryAsset& Asset() const { return *m_asset; } inline const MercuryAsset* AssetPtr() const { return m_asset; } @@ -93,6 +93,7 @@ inline unsigned short GetPasses() { return m_iPasses; } inline void SetPasses( unsigned short p ) { m_iPasses = p; } private: + MercuryNode* m_parentNode; MAutoPtr< MercuryAsset > m_asset; //actual asset storage OcclusionResult m_occlusionResult; bool m_isCulled; Modified: Mercury2/src/MercuryNode.cpp =================================================================== --- Mercury2/src/MercuryNode.cpp 2009-10-10 22:22:50 UTC (rev 556) +++ Mercury2/src/MercuryNode.cpp 2009-10-11 00:49:38 UTC (rev 557) @@ -34,7 +34,7 @@ void MercuryNode::AddAsset(MercuryAsset* asset) { - m_assets.push_back( MercuryAssetInstance(asset) ); + m_assets.push_back( MercuryAssetInstance(asset, this) ); } void MercuryNode::AddChild(MercuryNode* n) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <axl...@us...> - 2009-10-11 03:28:07
|
Revision: 558 http://hgengine.svn.sourceforge.net/hgengine/?rev=558&view=rev Author: axlecrusher Date: 2009-10-11 03:27:58 +0000 (Sun, 11 Oct 2009) Log Message: ----------- need to be able to unregister Modified Paths: -------------- Mercury2/src/MercuryMessageManager.cpp Mercury2/src/MercuryMessageManager.h Modified: Mercury2/src/MercuryMessageManager.cpp =================================================================== --- Mercury2/src/MercuryMessageManager.cpp 2009-10-11 00:49:38 UTC (rev 557) +++ Mercury2/src/MercuryMessageManager.cpp 2009-10-11 03:27:58 UTC (rev 558) @@ -42,6 +42,23 @@ m_messageRecipients[message].push_back(ptr); } +void MercuryMessageManager::UnRegisterForMessage(const MString& message, MessageHandler* ptr) +{ + std::list< MessageHandler* >& subscriptions = m_messageRecipients[message]; + std::list< MessageHandler* >::iterator i = subscriptions.begin(); + + for (;i != subscriptions.end(); ++i) + { + if (*i == ptr) + { + printf("Deleted subscription\n"); + subscriptions.erase( i ); + return; + } + } + +} + void MercuryMessageManager::FireOffMessage( const MessageHolder & message ) { // std::map< MString, std::list< MessageHandler* > >::iterator i = m_messageRecipients.find(message.message); Modified: Mercury2/src/MercuryMessageManager.h =================================================================== --- Mercury2/src/MercuryMessageManager.h 2009-10-11 00:49:38 UTC (rev 557) +++ Mercury2/src/MercuryMessageManager.h 2009-10-11 03:27:58 UTC (rev 558) @@ -33,7 +33,9 @@ MercuryMessageManager() : m_messageQueue( MessageHolder::Compare ) { } void PostMessage(const MString& message, MessageData* data, float delay); void PumpMessages(const uint64_t& currTime); + void RegisterForMessage(const MString& message, MessageHandler* ptr); + void UnRegisterForMessage(const MString& message, MessageHandler* ptr); static MercuryMessageManager& GetInstance(); private: @@ -49,6 +51,7 @@ #define MESSAGEMAN MercuryMessageManager #define REGISTER_FOR_MESSAGE(x) MESSAGEMAN::GetInstance().RegisterForMessage(x, this) +#define UNREGISTER_FOR_MESSAGE(x) MESSAGEMAN::GetInstance().UnRegisterForMessage(x, this) #define POST_MESSAGE(x,data,delay) MESSAGEMAN::GetInstance().PostMessage(x, data, delay) #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <axl...@us...> - 2009-10-11 03:32:39
|
Revision: 559 http://hgengine.svn.sourceforge.net/hgengine/?rev=559&view=rev Author: axlecrusher Date: 2009-10-11 03:32:30 +0000 (Sun, 11 Oct 2009) Log Message: ----------- allow for abstracted assted instance data Modified Paths: -------------- Mercury2/src/MercuryAsset.cpp Mercury2/src/MercuryAsset.h Mercury2/src/MercuryNode.cpp Mercury2/src/MercuryNode.h Modified: Mercury2/src/MercuryAsset.cpp =================================================================== --- Mercury2/src/MercuryAsset.cpp 2009-10-11 03:27:58 UTC (rev 558) +++ Mercury2/src/MercuryAsset.cpp 2009-10-11 03:32:30 UTC (rev 559) @@ -93,6 +93,11 @@ GLCALL( glEnd() ); } +MercuryAssetInstance* MercuryAsset::GenerateInstanceData(MercuryNode* parentNode) +{ + return new MercuryAssetInstance(this, parentNode); +} + MercuryAssetInstance::MercuryAssetInstance(MercuryAsset* asset, MercuryNode* parentNode) :m_parentNode(parentNode), m_asset( asset ), m_isCulled( false ), m_iPasses( asset->GetPasses() ) { Modified: Mercury2/src/MercuryAsset.h =================================================================== --- Mercury2/src/MercuryAsset.h 2009-10-11 03:27:58 UTC (rev 558) +++ Mercury2/src/MercuryAsset.h 2009-10-11 03:32:30 UTC (rev 559) @@ -21,6 +21,7 @@ }; class MercuryNode; +class MercuryAssetInstance; /* Assets are stored in renderable nodes with MAuto pointers. The renderable nodes handle the memory management @@ -61,6 +62,8 @@ inline unsigned short GetPasses() { return m_iPasses; } inline void SetPasses( unsigned short p ) { m_iPasses = p; } + + virtual MercuryAssetInstance* GenerateInstanceData(MercuryNode* parentNode); protected: void SetLoadState(LoadState ls); //thread safe LoadState GetLoadState(); //thread safe @@ -77,10 +80,12 @@ /** This holds the per-instance data for each asset instance. Used in MercuryNode. */ -class MercuryAssetInstance +class MercuryAssetInstance : public MessageHandler { public: MercuryAssetInstance(MercuryAsset* asset, MercuryNode* parentNode); + virtual ~MercuryAssetInstance() {}; + inline MercuryAsset& Asset() { return *m_asset; } inline const MercuryAsset& Asset() const { return *m_asset; } inline const MercuryAsset* AssetPtr() const { return m_asset; } @@ -92,8 +97,9 @@ inline unsigned short GetPasses() { return m_iPasses; } inline void SetPasses( unsigned short p ) { m_iPasses = p; } + protected: + MercuryNode* m_parentNode; private: - MercuryNode* m_parentNode; MAutoPtr< MercuryAsset > m_asset; //actual asset storage OcclusionResult m_occlusionResult; bool m_isCulled; Modified: Mercury2/src/MercuryNode.cpp =================================================================== --- Mercury2/src/MercuryNode.cpp 2009-10-11 03:27:58 UTC (rev 558) +++ Mercury2/src/MercuryNode.cpp 2009-10-11 03:32:30 UTC (rev 559) @@ -30,13 +30,22 @@ SAFE_DELETE(*i); m_children.clear(); + + ClearAssets(); } void MercuryNode::AddAsset(MercuryAsset* asset) { - m_assets.push_back( MercuryAssetInstance(asset, this) ); + m_assets.push_back( asset->GenerateInstanceData(this) ); } +void MercuryNode::ClearAssets() +{ + list< MercuryAssetInstance* >::iterator i; + for (i = m_assets.begin(); i != m_assets.end(); ++i ) + SAFE_DELETE(*i); +} + void MercuryNode::AddChild(MercuryNode* n) { // list< MercuryNode* >::iterator last = m_children.end(); @@ -299,36 +308,39 @@ SetCulled( false ); bool culled = true; - std::list< MercuryAssetInstance >::iterator i; + std::list< MercuryAssetInstance* >::iterator i; for (i = m_assets.begin(); i != m_assets.end(); ++i ) { - MercuryAssetInstance& mai = *i; - MercuryAsset& a = mai.Asset(); + MercuryAssetInstance* mai = *i; + MercuryAsset& a = mai->Asset(); ///NOTE: Things that ignore culling do not affect culling one way or the other if ( !a.IgnoreCull() ) { - mai.Culled( a.DoCullingTests( mai.GetOcclusionResult(), matrix ) ); - culled = culled && mai.Culled(); + mai->Culled( a.DoCullingTests( mai->GetOcclusionResult(), matrix ) ); + culled = culled && mai->Culled(); } - if ( !mai.Culled() ) a.PreRender(this); + if ( !mai->Culled() ) a.PreRender(this); } SetCulled( culled ); } void MercuryNode::Render(const MercuryMatrix& matrix) { - std::list< MercuryAssetInstance >::iterator i; + std::list< MercuryAssetInstance* >::iterator i; for (i = m_assets.begin(); i != m_assets.end(); ++i ) - if ( !(i->Culled() || i->GetOcclusionResult().IsOccluded()) ) i->Asset().Render(this); + { + MercuryAssetInstance* mai = *i; + if ( !(mai->Culled() || mai->GetOcclusionResult().IsOccluded()) ) mai->Asset().Render(this); + } } void MercuryNode::PostRender(const MercuryMatrix& matrix) { - std::list< MercuryAssetInstance >::iterator i; + std::list< MercuryAssetInstance* >::iterator i; for (i = m_assets.begin(); i != m_assets.end(); ++i ) - i->Asset().PostRender(this); + (*i)->Asset().PostRender(this); } const MercuryMatrix& MercuryNode::FindGlobalMatrix() const Modified: Mercury2/src/MercuryNode.h =================================================================== --- Mercury2/src/MercuryNode.h 2009-10-11 03:27:58 UTC (rev 558) +++ Mercury2/src/MercuryNode.h 2009-10-11 03:32:30 UTC (rev 559) @@ -101,6 +101,7 @@ inline MString GetName() const { return m_name; } void AddAsset(MercuryAsset* asset); + void ClearAssets(); virtual void PreRender(const MercuryMatrix& matrix); virtual void Render(const MercuryMatrix& matrix); @@ -134,7 +135,7 @@ unsigned short m_iForcePasses; //If (1<<15) is set, then, we know the force is enabled. //The asset is actually stored here - std::list< MercuryAssetInstance > m_assets; + std::list< MercuryAssetInstance* > m_assets; //we will just use normal pointers here because we don't want to waste too much time //dereferencing the autopointer. As a precaution when assets are added to these lists, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |