Supports the ALPHAFUNC and ALPHAREF rendering states.

This commit is contained in:
Lionel Ulmer 2002-12-16 22:39:09 +00:00 committed by Alexandre Julliard
parent 841f695959
commit dfddf92ecf
3 changed files with 47 additions and 33 deletions

View File

@ -1662,7 +1662,9 @@ d3ddevice_create(IDirect3DDeviceImpl **obj, IDirect3DImpl *d3d, IDirectDrawSurfa
gl_object->render_state.dst = GL_ZERO; gl_object->render_state.dst = GL_ZERO;
gl_object->render_state.mag = GL_NEAREST; gl_object->render_state.mag = GL_NEAREST;
gl_object->render_state.min = 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 */ /* Allocate memory for the matrices */
gl_object->world_mat = (D3DMATRIX *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16 * sizeof(float)); 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)); gl_object->view_mat = (D3DMATRIX *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16 * sizeof(float));

View File

@ -30,6 +30,24 @@
WINE_DEFAULT_DEBUG_CHANNEL(ddraw); 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");
return GL_NEVER;
}
}
void set_render_state(D3DRENDERSTATETYPE dwRenderStateType, void set_render_state(D3DRENDERSTATETYPE dwRenderStateType,
DWORD dwRenderState, RenderState *rs) DWORD dwRenderState, RenderState *rs)
{ {
@ -66,9 +84,9 @@ void set_render_state(D3DRENDERSTATETYPE dwRenderStateType,
} }
} break; } break;
case D3DRENDERSTATE_TEXTUREADDRESSU: case D3DRENDERSTATE_TEXTUREADDRESSU: /* 44 */
case D3DRENDERSTATE_TEXTUREADDRESSV: case D3DRENDERSTATE_TEXTUREADDRESSV: /* 45 */
case D3DRENDERSTATE_TEXTUREADDRESS: { /* 3 */ case D3DRENDERSTATE_TEXTUREADDRESS: { /* 3 */
GLenum arg = GL_REPEAT; /* Default value */ GLenum arg = GL_REPEAT; /* Default value */
switch ((D3DTEXTUREADDRESS) dwRenderState) { switch ((D3DTEXTUREADDRESS) dwRenderState) {
case D3DTADDRESS_WRAP: arg = GL_REPEAT; break; case D3DTADDRESS_WRAP: arg = GL_REPEAT; break;
@ -133,8 +151,15 @@ void set_render_state(D3DRENDERSTATETYPE dwRenderStateType,
else else
glDepthMask(GL_FALSE); glDepthMask(GL_FALSE);
break; 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) { switch ((D3DTEXTUREFILTER) dwRenderState) {
case D3DFILTER_NEAREST: case D3DFILTER_NEAREST:
rs->mag = GL_NEAREST; rs->mag = GL_NEAREST;
@ -218,34 +243,17 @@ void set_render_state(D3DRENDERSTATETYPE dwRenderStateType,
break; break;
case D3DRENDERSTATE_ZFUNC: /* 23 */ case D3DRENDERSTATE_ZFUNC: /* 23 */
switch ((D3DCMPFUNC) dwRenderState) { glDepthFunc(convert_D3D_compare_to_GL(dwRenderState));
case D3DCMP_NEVER: break;
glDepthFunc(GL_NEVER);
break; case D3DRENDERSTATE_ALPHAREF: /* 24 */
case D3DCMP_LESS: rs->alpha_ref = dwRenderState / 255.0;
glDepthFunc(GL_LESS); glAlphaFunc(rs->alpha_func, rs->alpha_ref);
break; break;
case D3DCMP_EQUAL:
glDepthFunc(GL_EQUAL); case D3DRENDERSTATE_ALPHAFUNC: /* 25 */
break; rs->alpha_func = convert_D3D_compare_to_GL(dwRenderState);
case D3DCMP_LESSEQUAL: glAlphaFunc(rs->alpha_func, rs->alpha_ref);
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");
}
break; break;
case D3DRENDERSTATE_DITHERENABLE: /* 26 */ case D3DRENDERSTATE_DITHERENABLE: /* 26 */

View File

@ -63,6 +63,10 @@ typedef struct render_state {
GLenum src, dst; GLenum src, dst;
/* This is used for textures */ /* This is used for textures */
GLenum mag, min; GLenum mag, min;
/* This is needed for the Alpha stuff */
GLenum alpha_func;
GLclampf alpha_ref;
} RenderState; } RenderState;
/* Common functions defined in d3dcommon.c */ /* Common functions defined in d3dcommon.c */