From cf4a0a35031f1cc931d112f4375f5ab4f89b49a8 Mon Sep 17 00:00:00 2001 From: yunfeibai Date: Thu, 15 Feb 2018 13:19:41 -0800 Subject: [PATCH] Add improvement/fix in SortableTransparentInstance back. --- .../OpenGLWindow/GLInstancingRenderer.cpp | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/examples/OpenGLWindow/GLInstancingRenderer.cpp b/examples/OpenGLWindow/GLInstancingRenderer.cpp index edbe0ee7d..6edb4a69f 100644 --- a/examples/OpenGLWindow/GLInstancingRenderer.cpp +++ b/examples/OpenGLWindow/GLInstancingRenderer.cpp @@ -1989,22 +1989,21 @@ void GLInstancingRenderer::drawLine(const float from[4], const float to[4], cons glUseProgram(0); } -struct SortableTransparentInstance +B3_ATTRIBUTE_ALIGNED16(struct) SortableTransparentInstance { + b3Scalar m_projection; + int m_shapeIndex; int m_instanceId; - b3Vector3 m_centerPosition; }; -struct TransparentDistanceSortPredicate +B3_ATTRIBUTE_ALIGNED16(struct) TransparentDistanceSortPredicate { - b3Vector3 m_camForwardVec; - - inline bool operator() (const SortableTransparentInstance& a, const SortableTransparentInstance& b) const + + inline bool operator() (const SortableTransparentInstance& a, const SortableTransparentInstance& b) const { - b3Scalar projA = a.m_centerPosition.dot(m_camForwardVec); - b3Scalar projB = b.m_centerPosition.dot(m_camForwardVec); - return (projA > projB); + + return (a.m_projection > b.m_projection); } }; @@ -2225,6 +2224,11 @@ b3Assert(glGetError() ==GL_NO_ERROR); //GLuint lastBindTexture = 0; transparentInstances.reserve(totalNumInstances); + + float fwd[3]; + m_data->m_activeCamera->getCameraForwardVector(fwd); + b3Vector3 camForwardVec; + camForwardVec.setValue(fwd[0],fwd[1],fwd[2]); for (int obj=0;objm_flags&eGfxTransparency)==0) { inst.m_instanceId = curOffset; - inst.m_centerPosition.setValue(m_data->m_instance_positions_ptr[inst.m_instanceId*4+0], - m_data->m_instance_positions_ptr[inst.m_instanceId*4+1], - m_data->m_instance_positions_ptr[inst.m_instanceId*4+2]); - inst.m_centerPosition *= -1;//reverse sort opaque instances + b3Vector3 centerPosition; + centerPosition.setValue(m_data->m_instance_positions_ptr[inst.m_instanceId*4+0], + m_data->m_instance_positions_ptr[inst.m_instanceId*4+1], + m_data->m_instance_positions_ptr[inst.m_instanceId*4+2]); + centerPosition *= -1;//reverse sort opaque instances + inst.m_projection = centerPosition.dot(camForwardVec); transparentInstances.push_back(inst); } else { for (int i=0;im_numGraphicsInstances;i++) { inst.m_instanceId = curOffset+i; - inst.m_centerPosition.setValue(m_data->m_instance_positions_ptr[inst.m_instanceId*4+0], - m_data->m_instance_positions_ptr[inst.m_instanceId*4+1], - m_data->m_instance_positions_ptr[inst.m_instanceId*4+2]); + b3Vector3 centerPosition; + + centerPosition.setValue(m_data->m_instance_positions_ptr[inst.m_instanceId*4+0], + m_data->m_instance_positions_ptr[inst.m_instanceId*4+1], + m_data->m_instance_positions_ptr[inst.m_instanceId*4+2]); + inst.m_projection = centerPosition.dot(camForwardVec); transparentInstances.push_back(inst); } } @@ -2259,9 +2268,7 @@ b3Assert(glGetError() ==GL_NO_ERROR); } } TransparentDistanceSortPredicate sorter; - float fwd[3]; - m_data->m_activeCamera->getCameraForwardVector(fwd); - sorter.m_camForwardVec.setValue(fwd[0],fwd[1],fwd[2]); + transparentInstances.quickSort(sorter); } @@ -2532,7 +2539,6 @@ b3Assert(glGetError() ==GL_NO_ERROR); } case B3_USE_PROJECTIVE_TEXTURE_RENDERMODE: { - printf("PROJECTIVE TEXTURE!!\n"); if ( gfxObj->m_flags&eGfxTransparency) { glDepthMask(false);