Beginnings of Stencil support.
This commit is contained in:
parent
d664540782
commit
07d5c1a32e
|
@ -474,6 +474,21 @@ int OPERANDx_ALPHA_EXT(DWORD arg) {
|
||||||
return GL_OPERAND0_ALPHA_EXT;
|
return GL_OPERAND0_ALPHA_EXT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
GLenum StencilOp(DWORD op) {
|
||||||
|
switch(op) {
|
||||||
|
case D3DSTENCILOP_KEEP : return GL_KEEP;
|
||||||
|
case D3DSTENCILOP_ZERO : return GL_ZERO;
|
||||||
|
case D3DSTENCILOP_REPLACE : return GL_REPLACE;
|
||||||
|
case D3DSTENCILOP_INCRSAT : return GL_INCR;
|
||||||
|
case D3DSTENCILOP_DECRSAT : return GL_DECR;
|
||||||
|
case D3DSTENCILOP_INVERT : return GL_INVERT;
|
||||||
|
case D3DSTENCILOP_INCR : return GL_INCR; /* Fixme - needs to support wrap */
|
||||||
|
case D3DSTENCILOP_DECR : return GL_DECR; /* Fixme - needs to support wrap */
|
||||||
|
default:
|
||||||
|
FIXME("Invalid stencil op %ld\n", op);
|
||||||
|
return GL_ALWAYS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* IDirect3D IUnknown parts follow: */
|
/* IDirect3D IUnknown parts follow: */
|
||||||
HRESULT WINAPI IDirect3DDevice8Impl_QueryInterface(LPDIRECT3DDEVICE8 iface,REFIID riid,LPVOID *ppobj)
|
HRESULT WINAPI IDirect3DDevice8Impl_QueryInterface(LPDIRECT3DDEVICE8 iface,REFIID riid,LPVOID *ppobj)
|
||||||
|
@ -1782,8 +1797,18 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3
|
||||||
|
|
||||||
/* Note the texture color applies to all textures whereas
|
/* Note the texture color applies to all textures whereas
|
||||||
GL_TEXTURE_ENV_COLOR applies to active only */
|
GL_TEXTURE_ENV_COLOR applies to active only */
|
||||||
for (i=0; i<8; i++) {
|
|
||||||
float col[4];
|
float col[4];
|
||||||
|
col[0] = ((Value >> 16) & 0xFF) / 255.0;
|
||||||
|
col[1] = ((Value >> 8 ) & 0xFF) / 255.0;
|
||||||
|
col[2] = ((Value >> 0 ) & 0xFF) / 255.0;
|
||||||
|
col[3] = ((Value >> 24 ) & 0xFF) / 255.0;
|
||||||
|
|
||||||
|
/* Set the default alpha blend color */
|
||||||
|
glBlendColor(col[0], col[1], col[2], col[3]);
|
||||||
|
checkGLcall("glBlendColor");
|
||||||
|
|
||||||
|
/* And now the default texture color as well */
|
||||||
|
for (i=0; i<8; i++) {
|
||||||
|
|
||||||
if (This->StateBlock.textures[i]) {
|
if (This->StateBlock.textures[i]) {
|
||||||
glActiveTextureARB(GL_TEXTURE0_ARB + i);
|
glActiveTextureARB(GL_TEXTURE0_ARB + i);
|
||||||
|
@ -1791,10 +1816,6 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3
|
||||||
|
|
||||||
/* Note the D3DRS value applies to all textures, but GL has one
|
/* Note the D3DRS value applies to all textures, but GL has one
|
||||||
per texture, so apply it now ready to be used! */
|
per texture, so apply it now ready to be used! */
|
||||||
col[0] = ((Value >> 16) & 0xFF) / 255.0;
|
|
||||||
col[1] = ((Value >> 8 ) & 0xFF) / 255.0;
|
|
||||||
col[2] = ((Value >> 0 ) & 0xFF) / 255.0;
|
|
||||||
col[3] = ((Value >> 24 ) & 0xFF) / 255.0;
|
|
||||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]);
|
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]);
|
||||||
checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);");
|
checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);");
|
||||||
}
|
}
|
||||||
|
@ -1814,6 +1835,138 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case D3DRS_STENCILENABLE :
|
||||||
|
if (Value) {
|
||||||
|
glEnable(GL_STENCIL_TEST);
|
||||||
|
checkGLcall("glEnable GL_STENCIL_TEST");
|
||||||
|
} else {
|
||||||
|
glDisable(GL_STENCIL_TEST);
|
||||||
|
checkGLcall("glDisable GL_STENCIL_TEST");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3DRS_STENCILFUNC :
|
||||||
|
{
|
||||||
|
int glParm = GL_ALWAYS;
|
||||||
|
int ref = 0;
|
||||||
|
GLuint mask = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
glGetIntegerv(GL_STENCIL_REF, &ref);
|
||||||
|
checkGLcall("glGetFloatv(GL_STENCIL_REF, &ref);");
|
||||||
|
glGetIntegerv(GL_STENCIL_VALUE_MASK, &mask);
|
||||||
|
checkGLcall("glGetFloatv(GL_STENCIL_VALUE_MASK, &glParm);");
|
||||||
|
|
||||||
|
switch ((D3DCMPFUNC) Value) {
|
||||||
|
case D3DCMP_NEVER: glParm=GL_NEVER; break;
|
||||||
|
case D3DCMP_LESS: glParm=GL_LESS; break;
|
||||||
|
case D3DCMP_EQUAL: glParm=GL_EQUAL; break;
|
||||||
|
case D3DCMP_LESSEQUAL: glParm=GL_LEQUAL; break;
|
||||||
|
case D3DCMP_GREATER: glParm=GL_GREATER; break;
|
||||||
|
case D3DCMP_NOTEQUAL: glParm=GL_NOTEQUAL; break;
|
||||||
|
case D3DCMP_GREATEREQUAL: glParm=GL_GEQUAL; break;
|
||||||
|
case D3DCMP_ALWAYS: glParm=GL_ALWAYS; break;
|
||||||
|
default:
|
||||||
|
FIXME("Unrecognized/Unhandled D3DCMPFUNC value %ld\n", Value);
|
||||||
|
}
|
||||||
|
TRACE("glStencilFunc with Parm=%x, ref=%d, mask=%x\n", glParm, ref, mask);
|
||||||
|
glStencilFunc(glParm, ref, mask);
|
||||||
|
checkGLcall("glStencilFunc");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3DRS_STENCILREF :
|
||||||
|
{
|
||||||
|
int glParm = GL_ALWAYS;
|
||||||
|
int ref = 0;
|
||||||
|
GLuint mask = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
glGetIntegerv(GL_STENCIL_FUNC, &glParm);
|
||||||
|
checkGLcall("glGetFloatv(GL_STENCIL_FUNC, &glParm);");
|
||||||
|
glGetIntegerv(GL_STENCIL_VALUE_MASK, &mask);
|
||||||
|
checkGLcall("glGetFloatv(GL_STENCIL_VALUE_MASK, &glParm);");
|
||||||
|
|
||||||
|
ref = Value;
|
||||||
|
TRACE("glStencilFunc with Parm=%x, ref=%d, mask=%x\n", glParm, ref, mask);
|
||||||
|
glStencilFunc(glParm, ref, mask);
|
||||||
|
checkGLcall("glStencilFunc");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3DRS_STENCILMASK :
|
||||||
|
{
|
||||||
|
int glParm = GL_ALWAYS;
|
||||||
|
int ref = 0.0;
|
||||||
|
GLuint mask = Value;
|
||||||
|
|
||||||
|
glGetIntegerv(GL_STENCIL_REF, &ref);
|
||||||
|
checkGLcall("glGetFloatv(GL_STENCIL_REF, &ref);");
|
||||||
|
glGetIntegerv(GL_STENCIL_FUNC, &glParm);
|
||||||
|
checkGLcall("glGetFloatv(GL_STENCIL_FUNC, &glParm);");
|
||||||
|
|
||||||
|
TRACE("glStencilFunc with Parm=%x, ref=%d, mask=%x\n", glParm, ref, mask);
|
||||||
|
glStencilFunc(glParm, ref, mask);
|
||||||
|
checkGLcall("glStencilFunc");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3DRS_STENCILFAIL :
|
||||||
|
{
|
||||||
|
GLenum fail ;
|
||||||
|
GLenum zpass ;
|
||||||
|
GLenum zfail ;
|
||||||
|
|
||||||
|
fail = StencilOp(Value);
|
||||||
|
glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &zpass);
|
||||||
|
checkGLcall("glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &zpass);");
|
||||||
|
glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &zfail);
|
||||||
|
checkGLcall("glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &zfail);");
|
||||||
|
|
||||||
|
TRACE("StencilOp fail=%x, zfail=%x, zpass=%x\n", fail, zfail, zpass);
|
||||||
|
glStencilOp(fail, zfail, zpass);
|
||||||
|
checkGLcall("glStencilOp(fail, zfail, zpass);");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case D3DRS_STENCILZFAIL :
|
||||||
|
{
|
||||||
|
GLenum fail ;
|
||||||
|
GLenum zpass ;
|
||||||
|
GLenum zfail ;
|
||||||
|
|
||||||
|
glGetIntegerv(GL_STENCIL_FAIL, &fail);
|
||||||
|
checkGLcall("glGetIntegerv(GL_STENCIL_FAIL, &fail);");
|
||||||
|
glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &zpass);
|
||||||
|
checkGLcall("glGetIntegerv(GL_STENCIL_PASS_DEPTH_PASS, &zpass);");
|
||||||
|
zfail = StencilOp(Value);
|
||||||
|
|
||||||
|
TRACE("StencilOp fail=%x, zfail=%x, zpass=%x\n", fail, zfail, zpass);
|
||||||
|
glStencilOp(fail, zfail, zpass);
|
||||||
|
checkGLcall("glStencilOp(fail, zfail, zpass);");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case D3DRS_STENCILPASS :
|
||||||
|
{
|
||||||
|
GLenum fail ;
|
||||||
|
GLenum zpass ;
|
||||||
|
GLenum zfail ;
|
||||||
|
|
||||||
|
glGetIntegerv(GL_STENCIL_FAIL, &fail);
|
||||||
|
checkGLcall("glGetIntegerv(GL_STENCIL_FAIL, &fail);");
|
||||||
|
zpass = StencilOp(Value);
|
||||||
|
glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &zfail);
|
||||||
|
checkGLcall("glGetIntegerv(GL_STENCIL_PASS_DEPTH_FAIL, &zfail);");
|
||||||
|
|
||||||
|
TRACE("StencilOp fail=%x, zfail=%x, zpass=%x\n", fail, zfail, zpass);
|
||||||
|
glStencilOp(fail, zfail, zpass);
|
||||||
|
checkGLcall("glStencilOp(fail, zfail, zpass);");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3DRS_STENCILWRITEMASK :
|
||||||
|
{
|
||||||
|
glStencilMask(Value);
|
||||||
|
checkGLcall("glStencilMask");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
/* Unhandled yet...! */
|
/* Unhandled yet...! */
|
||||||
case D3DRS_LINEPATTERN :
|
case D3DRS_LINEPATTERN :
|
||||||
|
@ -1828,14 +1981,6 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3
|
||||||
case D3DRS_EDGEANTIALIAS :
|
case D3DRS_EDGEANTIALIAS :
|
||||||
case D3DRS_ZBIAS :
|
case D3DRS_ZBIAS :
|
||||||
case D3DRS_RANGEFOGENABLE :
|
case D3DRS_RANGEFOGENABLE :
|
||||||
case D3DRS_STENCILENABLE :
|
|
||||||
case D3DRS_STENCILFAIL :
|
|
||||||
case D3DRS_STENCILZFAIL :
|
|
||||||
case D3DRS_STENCILPASS :
|
|
||||||
case D3DRS_STENCILFUNC :
|
|
||||||
case D3DRS_STENCILREF :
|
|
||||||
case D3DRS_STENCILMASK :
|
|
||||||
case D3DRS_STENCILWRITEMASK :
|
|
||||||
case D3DRS_WRAP0 :
|
case D3DRS_WRAP0 :
|
||||||
case D3DRS_WRAP1 :
|
case D3DRS_WRAP1 :
|
||||||
case D3DRS_WRAP2 :
|
case D3DRS_WRAP2 :
|
||||||
|
|
Loading…
Reference in New Issue