Commit c895c0e1 authored by hybrid's avatar hybrid

Add implementations for polygon offset in hw drivers.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@3651 dfc29bdd-3216-0410-991c-e03cc46cb475
parent ca089b25
...@@ -1562,6 +1562,14 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria ...@@ -1562,6 +1562,14 @@ void CD3D8Driver::setBasicRenderStates(const SMaterial& material, const SMateria
pID3DDevice->SetRenderState(D3DRS_COLORWRITEENABLE, flag); pID3DDevice->SetRenderState(D3DRS_COLORWRITEENABLE, flag);
} }
// Polygon offset
if (queryFeature(EVDF_POLYGON_OFFSET) && (resetAllRenderstates ||
lastmaterial.PolygonOffsetDirection != material.PolygonOffsetDirection ||
lastmaterial.PolygonOffsetFactor != material.PolygonOffsetFactor))
{
pID3DDevice->SetRenderState(D3DRS_ZBIAS, material.PolygonOffsetFactor);
}
// thickness // thickness
if (resetAllRenderstates || lastmaterial.Thickness != material.Thickness) if (resetAllRenderstates || lastmaterial.Thickness != material.Thickness)
{ {
......
...@@ -22,6 +22,11 @@ namespace irr ...@@ -22,6 +22,11 @@ namespace irr
namespace video namespace video
{ {
namespace
{
inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); }
}
//! constructor //! constructor
CD3D9Driver::CD3D9Driver(const core::dimension2d<u32>& screenSize, HWND window, CD3D9Driver::CD3D9Driver(const core::dimension2d<u32>& screenSize, HWND window,
bool fullscreen, bool stencilbuffer, bool fullscreen, bool stencilbuffer,
...@@ -659,6 +664,8 @@ bool CD3D9Driver::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const ...@@ -659,6 +664,8 @@ bool CD3D9Driver::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const
return (Caps.PrimitiveMiscCaps & D3DPMISCCAPS_MRTPOSTPIXELSHADERBLENDING) != 0; return (Caps.PrimitiveMiscCaps & D3DPMISCCAPS_MRTPOSTPIXELSHADERBLENDING) != 0;
case EVDF_OCCLUSION_QUERY: case EVDF_OCCLUSION_QUERY:
return OcclusionQuerySupport; return OcclusionQuerySupport;
case EVDF_POLYGON_OFFSET:
return (Caps.RasterCaps & (D3DPRASTERCAPS_DEPTHBIAS|D3DPRASTERCAPS_SLOPESCALEDEPTHBIAS)) != 0;
default: default:
return false; return false;
}; };
...@@ -1446,13 +1453,13 @@ void CD3D9Driver::draw2D3DVertexPrimitiveList(const void* vertices, ...@@ -1446,13 +1453,13 @@ void CD3D9Driver::draw2D3DVertexPrimitiveList(const void* vertices,
if (pType==scene::EPT_POINT_SPRITES) if (pType==scene::EPT_POINT_SPRITES)
pID3DDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, TRUE); pID3DDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_POINTSCALEENABLE, TRUE); pID3DDevice->SetRenderState(D3DRS_POINTSCALEENABLE, TRUE);
pID3DDevice->SetRenderState(D3DRS_POINTSIZE, *(DWORD*)(&tmp)); pID3DDevice->SetRenderState(D3DRS_POINTSIZE, F2DW(tmp));
tmp=1.0f; tmp=1.0f;
pID3DDevice->SetRenderState(D3DRS_POINTSCALE_A, *(DWORD*)(&tmp)); pID3DDevice->SetRenderState(D3DRS_POINTSCALE_A, F2DW(tmp));
pID3DDevice->SetRenderState(D3DRS_POINTSCALE_B, *(DWORD*)(&tmp)); pID3DDevice->SetRenderState(D3DRS_POINTSCALE_B, F2DW(tmp));
pID3DDevice->SetRenderState(D3DRS_POINTSIZE_MIN, *(DWORD*)(&tmp)); pID3DDevice->SetRenderState(D3DRS_POINTSIZE_MIN, F2DW(tmp));
tmp=0.0f; tmp=0.0f;
pID3DDevice->SetRenderState(D3DRS_POINTSCALE_C, *(DWORD*)(&tmp)); pID3DDevice->SetRenderState(D3DRS_POINTSCALE_C, F2DW(tmp));
if (!vertices) if (!vertices)
{ {
...@@ -2246,6 +2253,31 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria ...@@ -2246,6 +2253,31 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria
pID3DDevice->SetRenderState(D3DRS_COLORWRITEENABLE, flag); pID3DDevice->SetRenderState(D3DRS_COLORWRITEENABLE, flag);
} }
// Polygon offset
if (queryFeature(EVDF_POLYGON_OFFSET) && (resetAllRenderstates ||
lastmaterial.PolygonOffsetDirection != material.PolygonOffsetDirection ||
lastmaterial.PolygonOffsetFactor != material.PolygonOffsetFactor))
{
if (material.PolygonOffsetFactor)
{
if (material.PolygonOffsetDirection==EPO_BACK)
{
pID3DDevice->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, F2DW(1.f));
pID3DDevice->SetRenderState(D3DRS_DEPTHBIAS, F2DW((FLOAT)material.PolygonOffsetFactor));
}
else
{
pID3DDevice->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, F2DW(-1.f));
pID3DDevice->SetRenderState(D3DRS_DEPTHBIAS, F2DW((FLOAT)-material.PolygonOffsetFactor));
}
}
else
{
pID3DDevice->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, 0);
pID3DDevice->SetRenderState(D3DRS_DEPTHBIAS, 0);
}
}
// Anti Aliasing // Anti Aliasing
if (resetAllRenderstates || lastmaterial.AntiAliasing != material.AntiAliasing) if (resetAllRenderstates || lastmaterial.AntiAliasing != material.AntiAliasing)
{ {
...@@ -2282,7 +2314,7 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria ...@@ -2282,7 +2314,7 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria
// thickness // thickness
if (resetAllRenderstates || lastmaterial.Thickness != material.Thickness) if (resetAllRenderstates || lastmaterial.Thickness != material.Thickness)
{ {
pID3DDevice->SetRenderState(D3DRS_POINTSIZE, *((DWORD*)&material.Thickness)); pID3DDevice->SetRenderState(D3DRS_POINTSIZE, F2DW(material.Thickness));
} }
// texture address mode // texture address mode
...@@ -2291,7 +2323,7 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria ...@@ -2291,7 +2323,7 @@ void CD3D9Driver::setBasicRenderStates(const SMaterial& material, const SMateria
if (resetAllRenderstates || lastmaterial.TextureLayer[st].LODBias != material.TextureLayer[st].LODBias) if (resetAllRenderstates || lastmaterial.TextureLayer[st].LODBias != material.TextureLayer[st].LODBias)
{ {
const float tmp = material.TextureLayer[st].LODBias * 0.125f; const float tmp = material.TextureLayer[st].LODBias * 0.125f;
pID3DDevice->SetSamplerState(st, D3DSAMP_MIPMAPLODBIAS, *(DWORD*)(&tmp)); pID3DDevice->SetSamplerState(st, D3DSAMP_MIPMAPLODBIAS, F2DW(tmp));
} }
if (resetAllRenderstates || lastmaterial.TextureLayer[st].TextureWrapU != material.TextureLayer[st].TextureWrapU) if (resetAllRenderstates || lastmaterial.TextureLayer[st].TextureWrapU != material.TextureLayer[st].TextureWrapU)
...@@ -2796,11 +2828,11 @@ void CD3D9Driver::setFog(SColor color, E_FOG_TYPE fogType, f32 start, ...@@ -2796,11 +2828,11 @@ void CD3D9Driver::setFog(SColor color, E_FOG_TYPE fogType, f32 start,
if (fogType==EFT_FOG_LINEAR) if (fogType==EFT_FOG_LINEAR)
{ {
pID3DDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD*)(&start)); pID3DDevice->SetRenderState(D3DRS_FOGSTART, F2DW(start));
pID3DDevice->SetRenderState(D3DRS_FOGEND, *(DWORD*)(&end)); pID3DDevice->SetRenderState(D3DRS_FOGEND, F2DW(end));
} }
else else
pID3DDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD*)(&density)); pID3DDevice->SetRenderState(D3DRS_FOGDENSITY, F2DW(density));
if(!pixelFog) if(!pixelFog)
pID3DDevice->SetRenderState(D3DRS_RANGEFOGENABLE, rangeFog); pID3DDevice->SetRenderState(D3DRS_RANGEFOGENABLE, rangeFog);
......
...@@ -2913,6 +2913,23 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater ...@@ -2913,6 +2913,23 @@ void COpenGLDriver::setBasicRenderStates(const SMaterial& material, const SMater
(material.ColorMask & ECP_ALPHA)?GL_TRUE:GL_FALSE); (material.ColorMask & ECP_ALPHA)?GL_TRUE:GL_FALSE);
} }
// Polygon Offset
if (queryFeature(EVDF_POLYGON_OFFSET) && (resetAllRenderStates ||
lastmaterial.PolygonOffsetDirection != material.PolygonOffsetDirection ||
lastmaterial.PolygonOffsetFactor != material.PolygonOffsetFactor))
{
glDisable(lastmaterial.Wireframe?GL_POLYGON_OFFSET_LINE:lastmaterial.PointCloud?GL_POLYGON_OFFSET_POINT:GL_POLYGON_OFFSET_FILL);
if (material.PolygonOffsetFactor)
{
glDisable(material.Wireframe?GL_POLYGON_OFFSET_LINE:material.PointCloud?GL_POLYGON_OFFSET_POINT:GL_POLYGON_OFFSET_FILL);
glEnable(material.Wireframe?GL_POLYGON_OFFSET_LINE:material.PointCloud?GL_POLYGON_OFFSET_POINT:GL_POLYGON_OFFSET_FILL);
}
if (material.PolygonOffsetDirection==EPO_BACK)
glPolygonOffset(1.0f, (GLfloat)material.PolygonOffsetFactor);
else
glPolygonOffset(-1.0f, (GLfloat)-material.PolygonOffsetFactor);
}
// thickness // thickness
if (resetAllRenderStates || lastmaterial.Thickness != material.Thickness) if (resetAllRenderStates || lastmaterial.Thickness != material.Thickness)
{ {
...@@ -3372,13 +3389,13 @@ void COpenGLDriver::drawStencilShadowVolume(const core::vector3df* triangles, s3 ...@@ -3372,13 +3389,13 @@ void COpenGLDriver::drawStencilShadowVolume(const core::vector3df* triangles, s3
glDepthMask(GL_FALSE); // no depth buffer writing glDepthMask(GL_FALSE); // no depth buffer writing
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // no color buffer drawing glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); // no color buffer drawing
glEnable(GL_STENCIL_TEST); glEnable(GL_STENCIL_TEST);
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(0.0f, 1.0f);
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3,GL_FLOAT,sizeof(core::vector3df),&triangles[0]); glVertexPointer(3,GL_FLOAT,sizeof(core::vector3df),&triangles[0]);
glStencilMask(~0); glStencilMask(~0);
glStencilFunc(GL_ALWAYS, 0, ~0); glStencilFunc(GL_ALWAYS, 0, ~0);
glPolygonOffset(1.f,1.f);
glEnable(GL_POLYGON_OFFSET_FILL);
GLenum incr = GL_INCR; GLenum incr = GL_INCR;
GLenum decr = GL_DECR; GLenum decr = GL_DECR;
...@@ -3475,6 +3492,7 @@ void COpenGLDriver::drawStencilShadowVolume(const core::vector3df* triangles, s3 ...@@ -3475,6 +3492,7 @@ void COpenGLDriver::drawStencilShadowVolume(const core::vector3df* triangles, s3
glDisable(GL_DEPTH_CLAMP_NV); glDisable(GL_DEPTH_CLAMP_NV);
#endif #endif
glDisable(GL_POLYGON_OFFSET_FILL);
glDisableClientState(GL_VERTEX_ARRAY); //not stored on stack glDisableClientState(GL_VERTEX_ARRAY); //not stored on stack
glPopAttrib(); glPopAttrib();
} }
......
...@@ -821,6 +821,9 @@ bool COpenGLExtensionHandler::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const ...@@ -821,6 +821,9 @@ bool COpenGLExtensionHandler::queryFeature(E_VIDEO_DRIVER_FEATURE feature) const
return FeatureAvailable[IRR_ARB_draw_buffers_blend] || FeatureAvailable[IRR_AMD_draw_buffers_blend]; return FeatureAvailable[IRR_ARB_draw_buffers_blend] || FeatureAvailable[IRR_AMD_draw_buffers_blend];
case EVDF_OCCLUSION_QUERY: case EVDF_OCCLUSION_QUERY:
return FeatureAvailable[IRR_ARB_occlusion_query] && OcclusionQuerySupport; return FeatureAvailable[IRR_ARB_occlusion_query] && OcclusionQuerySupport;
case EVDF_POLYGON_OFFSET:
// both features supported with OpenGL 1.1
return Version>=110;
default: default:
return false; return false;
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment