Add improvement/fix in SortableTransparentInstance back.

This commit is contained in:
yunfeibai
2018-02-15 13:19:41 -08:00
parent 7dbc5626fb
commit cf4a0a3503

View File

@@ -1989,22 +1989,21 @@ void GLInstancingRenderer::drawLine(const float from[4], const float to[4], cons
glUseProgram(0); glUseProgram(0);
} }
struct SortableTransparentInstance B3_ATTRIBUTE_ALIGNED16(struct) SortableTransparentInstance
{ {
b3Scalar m_projection;
int m_shapeIndex; int m_shapeIndex;
int m_instanceId; 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 (a.m_projection > b.m_projection);
return (projA > projB);
} }
}; };
@@ -2226,6 +2225,11 @@ b3Assert(glGetError() ==GL_NO_ERROR);
transparentInstances.reserve(totalNumInstances); 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;obj<m_graphicsInstances.size();obj++) for (int obj=0;obj<m_graphicsInstances.size();obj++)
{ {
b3GraphicsInstance* gfxObj = m_graphicsInstances[obj]; b3GraphicsInstance* gfxObj = m_graphicsInstances[obj];
@@ -2239,19 +2243,24 @@ b3Assert(glGetError() ==GL_NO_ERROR);
if ((gfxObj->m_flags&eGfxTransparency)==0) if ((gfxObj->m_flags&eGfxTransparency)==0)
{ {
inst.m_instanceId = curOffset; inst.m_instanceId = curOffset;
inst.m_centerPosition.setValue(m_data->m_instance_positions_ptr[inst.m_instanceId*4+0], 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+1],
m_data->m_instance_positions_ptr[inst.m_instanceId*4+2]); m_data->m_instance_positions_ptr[inst.m_instanceId*4+2]);
inst.m_centerPosition *= -1;//reverse sort opaque instances centerPosition *= -1;//reverse sort opaque instances
inst.m_projection = centerPosition.dot(camForwardVec);
transparentInstances.push_back(inst); transparentInstances.push_back(inst);
} else } else
{ {
for (int i=0;i<gfxObj->m_numGraphicsInstances;i++) for (int i=0;i<gfxObj->m_numGraphicsInstances;i++)
{ {
inst.m_instanceId = curOffset+i; inst.m_instanceId = curOffset+i;
inst.m_centerPosition.setValue(m_data->m_instance_positions_ptr[inst.m_instanceId*4+0], 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+1],
m_data->m_instance_positions_ptr[inst.m_instanceId*4+2]); m_data->m_instance_positions_ptr[inst.m_instanceId*4+2]);
inst.m_projection = centerPosition.dot(camForwardVec);
transparentInstances.push_back(inst); transparentInstances.push_back(inst);
} }
} }
@@ -2259,9 +2268,7 @@ b3Assert(glGetError() ==GL_NO_ERROR);
} }
} }
TransparentDistanceSortPredicate sorter; TransparentDistanceSortPredicate sorter;
float fwd[3];
m_data->m_activeCamera->getCameraForwardVector(fwd);
sorter.m_camForwardVec.setValue(fwd[0],fwd[1],fwd[2]);
transparentInstances.quickSort(sorter); transparentInstances.quickSort(sorter);
} }
@@ -2532,7 +2539,6 @@ b3Assert(glGetError() ==GL_NO_ERROR);
} }
case B3_USE_PROJECTIVE_TEXTURE_RENDERMODE: case B3_USE_PROJECTIVE_TEXTURE_RENDERMODE:
{ {
printf("PROJECTIVE TEXTURE!!\n");
if ( gfxObj->m_flags&eGfxTransparency) if ( gfxObj->m_flags&eGfxTransparency)
{ {
glDepthMask(false); glDepthMask(false);