[D3D 20] Alpha test support
Lionel Ulmer
lionel.ulmer at free.fr
Sun Dec 15 07:48:32 CST 2002
Changelog:
Supports the ALPHAFUNC and ALPHAREF rendering states
--
Lionel Ulmer - http://www.bbrox.org/
-------------- next part --------------
--- ../wine_base/dlls/ddraw/mesa.c Sun Dec 15 12:16:39 2002
+++ dlls/ddraw/mesa.c Sun Dec 15 14:43:11 2002
@@ -30,6 +30,22 @@
WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
+GLenum convert_D3D_compare_to_GL(D3DCMPFUNC dwRenderState)
+{
+ switch (dwRenderState) {
+ case D3DCMP_NEVER: return GL_NEVER;
+ case D3DCMP_LESS: return GL_LESS;
+ case D3DCMP_EQUAL: return GL_EQUAL;
+ case D3DCMP_LESSEQUAL: return GL_LEQUAL;
+ case D3DCMP_GREATER: return GL_GREATER;
+ case D3DCMP_NOTEQUAL: return GL_NOTEQUAL;
+ case D3DCMP_GREATEREQUAL: return GL_GEQUAL;
+ case D3DCMP_ALWAYS: return GL_ALWAYS;
+ default: ERR("Unexpected compare type !!!\n");
+ }
+}
+
+
void set_render_state(D3DRENDERSTATETYPE dwRenderStateType,
DWORD dwRenderState, RenderState *rs)
{
@@ -66,9 +82,9 @@
}
} break;
- case D3DRENDERSTATE_TEXTUREADDRESSU:
- case D3DRENDERSTATE_TEXTUREADDRESSV:
- case D3DRENDERSTATE_TEXTUREADDRESS: { /* 3 */
+ case D3DRENDERSTATE_TEXTUREADDRESSU: /* 44 */
+ case D3DRENDERSTATE_TEXTUREADDRESSV: /* 45 */
+ case D3DRENDERSTATE_TEXTUREADDRESS: { /* 3 */
GLenum arg = GL_REPEAT; /* Default value */
switch ((D3DTEXTUREADDRESS) dwRenderState) {
case D3DTADDRESS_WRAP: arg = GL_REPEAT; break;
@@ -133,8 +149,15 @@
else
glDepthMask(GL_FALSE);
break;
+
+ case D3DRENDERSTATE_ALPHATESTENABLE: /* 15 */
+ if (dwRenderState)
+ glEnable(GL_ALPHA_TEST);
+ else
+ glDisable(GL_ALPHA_TEST);
+ break;
- case D3DRENDERSTATE_TEXTUREMAG: /* 17 */
+ case D3DRENDERSTATE_TEXTUREMAG: /* 17 */
switch ((D3DTEXTUREFILTER) dwRenderState) {
case D3DFILTER_NEAREST:
rs->mag = GL_NEAREST;
@@ -218,34 +241,17 @@
break;
case D3DRENDERSTATE_ZFUNC: /* 23 */
- switch ((D3DCMPFUNC) dwRenderState) {
- case D3DCMP_NEVER:
- glDepthFunc(GL_NEVER);
- break;
- case D3DCMP_LESS:
- glDepthFunc(GL_LESS);
- break;
- case D3DCMP_EQUAL:
- glDepthFunc(GL_EQUAL);
- break;
- case D3DCMP_LESSEQUAL:
- glDepthFunc(GL_LEQUAL);
- break;
- case D3DCMP_GREATER:
- glDepthFunc(GL_GREATER);
- break;
- case D3DCMP_NOTEQUAL:
- glDepthFunc(GL_NOTEQUAL);
- break;
- case D3DCMP_GREATEREQUAL:
- glDepthFunc(GL_GEQUAL);
- break;
- case D3DCMP_ALWAYS:
- glDepthFunc(GL_ALWAYS);
- break;
- default:
- ERR("Unexpected value\n");
- }
+ glDepthFunc(convert_D3D_compare_to_GL(dwRenderState));
+ break;
+
+ case D3DRENDERSTATE_ALPHAREF: /* 24 */
+ rs->alpha_ref = dwRenderState / 255.0;
+ glAlphaFunc(rs->alpha_func, rs->alpha_ref);
+ break;
+
+ case D3DRENDERSTATE_ALPHAFUNC: /* 25 */
+ rs->alpha_func = convert_D3D_compare_to_GL(dwRenderState);
+ glAlphaFunc(rs->alpha_func, rs->alpha_ref);
break;
case D3DRENDERSTATE_DITHERENABLE: /* 26 */
--- ../wine_base/dlls/ddraw/mesa_private.h Sun Dec 15 12:15:49 2002
+++ dlls/ddraw/mesa_private.h Sun Dec 15 14:32:34 2002
@@ -63,6 +63,10 @@
GLenum src, dst;
/* This is used for textures */
GLenum mag, min;
+
+ /* This is needed for the Alpha stuff */
+ GLenum alpha_func;
+ GLclampf alpha_ref;
} RenderState;
/* Common functions defined in d3dcommon.c */
--- ../wine_base/dlls/ddraw/d3ddevice/mesa.c Sun Dec 15 12:15:49 2002
+++ dlls/ddraw/d3ddevice/mesa.c Sun Dec 15 14:36:25 2002
@@ -1662,7 +1662,9 @@
gl_object->render_state.dst = GL_ZERO;
gl_object->render_state.mag = GL_NEAREST;
gl_object->render_state.min = GL_NEAREST;
-
+ gl_object->render_state.alpha_ref = 0.0; /* No actual idea about the real default value... */
+ gl_object->render_state.alpha_func = GL_ALWAYS; /* Here either but it seems logical */
+
/* Allocate memory for the matrices */
gl_object->world_mat = (D3DMATRIX *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16 * sizeof(float));
gl_object->view_mat = (D3DMATRIX *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16 * sizeof(float));
More information about the wine-patches
mailing list