Add improvement/fix in SortableTransparentInstance back.
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user