- beginning of Material and Light support for D3D7
- new rendering states supported
This commit is contained in:
parent
825ad05656
commit
d70a2c0322
|
@ -166,6 +166,7 @@ struct IDirect3DExecuteBufferImpl
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MAX_TEXTURES 8
|
#define MAX_TEXTURES 8
|
||||||
|
#define MAX_LIGHTS 16
|
||||||
|
|
||||||
struct IDirect3DDeviceImpl
|
struct IDirect3DDeviceImpl
|
||||||
{
|
{
|
||||||
|
@ -189,6 +190,13 @@ struct IDirect3DDeviceImpl
|
||||||
D3DMATRIX *view_mat;
|
D3DMATRIX *view_mat;
|
||||||
D3DMATRIX *proj_mat;
|
D3DMATRIX *proj_mat;
|
||||||
|
|
||||||
|
/* Current material used in D3D7 mode */
|
||||||
|
D3DMATERIAL7 current_material;
|
||||||
|
|
||||||
|
/* Light parameters */
|
||||||
|
DWORD active_lights, set_lights;
|
||||||
|
D3DLIGHT7 light_parameters[MAX_LIGHTS];
|
||||||
|
|
||||||
void (*set_context)(IDirect3DDeviceImpl*);
|
void (*set_context)(IDirect3DDeviceImpl*);
|
||||||
HRESULT (*clear)(IDirect3DDeviceImpl *This,
|
HRESULT (*clear)(IDirect3DDeviceImpl *This,
|
||||||
DWORD dwCount,
|
DWORD dwCount,
|
||||||
|
@ -215,6 +223,9 @@ struct IDirect3DVertexBufferImpl
|
||||||
|
|
||||||
/* Various dump functions */
|
/* Various dump functions */
|
||||||
extern const char *_get_renderstate(D3DRENDERSTATETYPE type);
|
extern const char *_get_renderstate(D3DRENDERSTATETYPE type);
|
||||||
|
extern void dump_D3DMATERIAL7(LPD3DMATERIAL7 lpMat);
|
||||||
|
extern void dump_D3DCOLORVALUE(D3DCOLORVALUE *lpCol);
|
||||||
|
extern void dump_D3DLIGHT7(LPD3DLIGHT7 lpLight);
|
||||||
|
|
||||||
#define dump_mat(mat) \
|
#define dump_mat(mat) \
|
||||||
TRACE("%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \
|
TRACE("%f %f %f %f\n", (mat)->_11, (mat)->_12, (mat)->_13, (mat)->_14); \
|
||||||
|
|
|
@ -163,3 +163,44 @@ const char *_get_renderstate(D3DRENDERSTATETYPE type) {
|
||||||
if (type >= (sizeof(states) / sizeof(states[0]))) return "ERR";
|
if (type >= (sizeof(states) / sizeof(states[0]))) return "ERR";
|
||||||
return states[type];
|
return states[type];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dump_D3DCOLORVALUE(D3DCOLORVALUE *lpCol)
|
||||||
|
{
|
||||||
|
DPRINTF("%f %f %f %f", lpCol->u1.r, lpCol->u2.g, lpCol->u3.b, lpCol->u4.a);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dump_D3DVECTOR(D3DVECTOR *lpVec)
|
||||||
|
{
|
||||||
|
DPRINTF("%f %f %f", lpVec->u1.x, lpVec->u2.y, lpVec->u3.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dump_D3DMATERIAL7(LPD3DMATERIAL7 lpMat)
|
||||||
|
{
|
||||||
|
DPRINTF(" - diffuse : "); dump_D3DCOLORVALUE(&(lpMat->u.diffuse)); DPRINTF("\n");
|
||||||
|
DPRINTF(" - ambient : "); dump_D3DCOLORVALUE(&(lpMat->u1.ambient)); DPRINTF("\n");
|
||||||
|
DPRINTF(" - specular : "); dump_D3DCOLORVALUE(&(lpMat->u2.specular)); DPRINTF("\n");
|
||||||
|
DPRINTF(" - emissive : "); dump_D3DCOLORVALUE(&(lpMat->u3.emissive)); DPRINTF("\n");
|
||||||
|
DPRINTF(" - power : %f\n", lpMat->u4.power);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dump_D3DLIGHT7(LPD3DLIGHT7 lpLight)
|
||||||
|
{
|
||||||
|
DPRINTF(" - light type : %s\n", (lpLight->dltType == D3DLIGHT_POINT ? "D3DLIGHT_POINT" :
|
||||||
|
(lpLight->dltType == D3DLIGHT_SPOT ? "D3DLIGHT_SPOT" :
|
||||||
|
(lpLight->dltType == D3DLIGHT_DIRECTIONAL ? "D3DLIGHT_DIRECTIONAL" :
|
||||||
|
"UNSUPPORTED"))));
|
||||||
|
DPRINTF(" - diffuse : "); dump_D3DCOLORVALUE(&(lpLight->dcvDiffuse)); DPRINTF("\n");
|
||||||
|
DPRINTF(" - specular : "); dump_D3DCOLORVALUE(&(lpLight->dcvSpecular)); DPRINTF("\n");
|
||||||
|
DPRINTF(" - ambient : "); dump_D3DCOLORVALUE(&(lpLight->dcvAmbient)); DPRINTF("\n");
|
||||||
|
DPRINTF(" - position : "); dump_D3DVECTOR(&(lpLight->dvPosition)); DPRINTF("\n");
|
||||||
|
DPRINTF(" - direction : "); dump_D3DVECTOR(&(lpLight->dvDirection)); DPRINTF("\n");
|
||||||
|
DPRINTF(" - dvRange : %f\n", lpLight->dvRange);
|
||||||
|
DPRINTF(" - dvFalloff : %f\n", lpLight->dvFalloff);
|
||||||
|
DPRINTF(" - dvAttenuation : %f %f %f\n", lpLight->dvAttenuation0, lpLight->dvAttenuation1, lpLight->dvAttenuation2);
|
||||||
|
DPRINTF(" - dvTheta : %f\n", lpLight->dvTheta);
|
||||||
|
DPRINTF(" - dvPhi : %f\n", lpLight->dvPhi);
|
||||||
|
}
|
||||||
|
|
|
@ -162,7 +162,12 @@ Main_IDirect3DDeviceImpl_7_3T_2T_SetRenderTarget(LPDIRECT3DDEVICE7 iface,
|
||||||
DWORD dwFlags)
|
DWORD dwFlags)
|
||||||
{
|
{
|
||||||
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
|
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
|
||||||
FIXME("(%p/%p)->(%p,%08lx): stub!\n", This, iface, lpNewRenderTarget, dwFlags);
|
IDirectDrawSurfaceImpl *target_impl = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface7, lpNewRenderTarget);
|
||||||
|
|
||||||
|
TRACE("(%p/%p)->(%p,%08lx)\n", This, iface, lpNewRenderTarget, dwFlags);
|
||||||
|
if (target_impl != This->surface) {
|
||||||
|
WARN(" Change of rendering target not handled yet !\n");
|
||||||
|
}
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,7 +312,15 @@ Main_IDirect3DDeviceImpl_7_GetMaterial(LPDIRECT3DDEVICE7 iface,
|
||||||
LPD3DMATERIAL7 lpMat)
|
LPD3DMATERIAL7 lpMat)
|
||||||
{
|
{
|
||||||
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
|
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
|
||||||
FIXME("(%p/%p)->(%p): stub!\n", This, iface, lpMat);
|
TRACE("(%p/%p)->(%p)\n", This, iface, lpMat);
|
||||||
|
|
||||||
|
*lpMat = This->current_material;
|
||||||
|
|
||||||
|
if (TRACE_ON(ddraw)) {
|
||||||
|
TRACE(" returning material : \n");
|
||||||
|
dump_D3DMATERIAL7(lpMat);
|
||||||
|
}
|
||||||
|
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -327,7 +340,16 @@ Main_IDirect3DDeviceImpl_7_GetLight(LPDIRECT3DDEVICE7 iface,
|
||||||
LPD3DLIGHT7 lpLight)
|
LPD3DLIGHT7 lpLight)
|
||||||
{
|
{
|
||||||
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
|
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
|
||||||
FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwLightIndex, lpLight);
|
TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, dwLightIndex, lpLight);
|
||||||
|
|
||||||
|
if (dwLightIndex > MAX_LIGHTS) return DDERR_INVALIDPARAMS;
|
||||||
|
*lpLight = This->light_parameters[dwLightIndex];
|
||||||
|
|
||||||
|
if (TRACE_ON(ddraw)) {
|
||||||
|
TRACE(" returning light : \n");
|
||||||
|
dump_D3DLIGHT7(lpLight);
|
||||||
|
}
|
||||||
|
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -624,7 +646,13 @@ Main_IDirect3DDeviceImpl_7_GetLightEnable(LPDIRECT3DDEVICE7 iface,
|
||||||
BOOL* pbEnable)
|
BOOL* pbEnable)
|
||||||
{
|
{
|
||||||
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
|
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
|
||||||
FIXME("(%p/%p)->(%08lx,%p): stub!\n", This, iface, dwLightIndex, pbEnable);
|
TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, dwLightIndex, pbEnable);
|
||||||
|
|
||||||
|
if (dwLightIndex > MAX_LIGHTS) *pbEnable = 0;
|
||||||
|
else *pbEnable = ((0x00000001 << dwLightIndex) & This->active_lights) != 0;
|
||||||
|
|
||||||
|
TRACE(" returning %d.\n", *pbEnable);
|
||||||
|
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -538,6 +538,8 @@ GL_IDirect3DDeviceImpl_3_2T_SetLightState(LPDIRECT3DDEVICE3 iface,
|
||||||
DWORD dwLightState)
|
DWORD dwLightState)
|
||||||
{
|
{
|
||||||
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
|
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice3, iface);
|
||||||
|
IDirect3DDeviceGLImpl *glThis = (IDirect3DDeviceGLImpl *) This;
|
||||||
|
|
||||||
TRACE("(%p/%p)->(%08x,%08lx)\n", This, iface, dwLightStateType, dwLightState);
|
TRACE("(%p/%p)->(%08x,%08lx)\n", This, iface, dwLightStateType, dwLightState);
|
||||||
|
|
||||||
switch (dwLightStateType) {
|
switch (dwLightStateType) {
|
||||||
|
@ -553,17 +555,10 @@ GL_IDirect3DDeviceImpl_3_2T_SetLightState(LPDIRECT3DDEVICE3 iface,
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case D3DLIGHTSTATE_AMBIENT: { /* 2 */
|
case D3DLIGHTSTATE_AMBIENT: /* 2 */
|
||||||
float light[4];
|
/* Call the render_state function... */
|
||||||
|
set_render_state(D3DRENDERSTATE_AMBIENT, dwLightState, &(glThis->render_state));
|
||||||
light[0] = ((dwLightState >> 16) & 0xFF) / 255.0;
|
break;
|
||||||
light[1] = ((dwLightState >> 8) & 0xFF) / 255.0;
|
|
||||||
light[2] = ((dwLightState >> 0) & 0xFF) / 255.0;
|
|
||||||
light[3] = 1.0;
|
|
||||||
ENTER_GL();
|
|
||||||
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, (float *) light);
|
|
||||||
LEAVE_GL();
|
|
||||||
} break;
|
|
||||||
|
|
||||||
#define UNSUP(x) case D3DLIGHTSTATE_##x: FIXME("unsupported D3DLIGHTSTATE_" #x "!\n");break;
|
#define UNSUP(x) case D3DLIGHTSTATE_##x: FIXME("unsupported D3DLIGHTSTATE_" #x "!\n");break;
|
||||||
UNSUP(COLORMODEL);
|
UNSUP(COLORMODEL);
|
||||||
|
@ -1469,6 +1464,103 @@ GL_IDirect3DDeviceImpl_7_GetCaps(LPDIRECT3DDEVICE7 iface,
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
HRESULT WINAPI
|
||||||
|
GL_IDirect3DDeviceImpl_7_SetMaterial(LPDIRECT3DDEVICE7 iface,
|
||||||
|
LPD3DMATERIAL7 lpMat)
|
||||||
|
{
|
||||||
|
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
|
||||||
|
TRACE("(%p/%p)->(%p)\n", This, iface, lpMat);
|
||||||
|
|
||||||
|
if (TRACE_ON(ddraw)) {
|
||||||
|
TRACE(" material is : \n");
|
||||||
|
dump_D3DMATERIAL7(lpMat);
|
||||||
|
}
|
||||||
|
|
||||||
|
This->current_material = *lpMat;
|
||||||
|
|
||||||
|
glMaterialfv(GL_FRONT,
|
||||||
|
GL_DIFFUSE,
|
||||||
|
(float *) &(This->current_material.u.diffuse));
|
||||||
|
glMaterialfv(GL_FRONT,
|
||||||
|
GL_AMBIENT,
|
||||||
|
(float *) &(This->current_material.u1.ambient));
|
||||||
|
glMaterialfv(GL_FRONT,
|
||||||
|
GL_SPECULAR,
|
||||||
|
(float *) &(This->current_material.u2.specular));
|
||||||
|
glMaterialfv(GL_FRONT,
|
||||||
|
GL_EMISSION,
|
||||||
|
(float *) &(This->current_material.u3.emissive));
|
||||||
|
glMaterialf(GL_FRONT,
|
||||||
|
GL_SHININESS,
|
||||||
|
This->current_material.u4.power); /* Not sure about this... */
|
||||||
|
|
||||||
|
return DD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
HRESULT WINAPI
|
||||||
|
GL_IDirect3DDeviceImpl_7_SetLight(LPDIRECT3DDEVICE7 iface,
|
||||||
|
DWORD dwLightIndex,
|
||||||
|
LPD3DLIGHT7 lpLight)
|
||||||
|
{
|
||||||
|
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
|
||||||
|
TRACE("(%p/%p)->(%08lx,%p)\n", This, iface, dwLightIndex, lpLight);
|
||||||
|
|
||||||
|
if (TRACE_ON(ddraw)) {
|
||||||
|
TRACE(" setting light : \n");
|
||||||
|
dump_D3DLIGHT7(lpLight);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dwLightIndex > MAX_LIGHTS) return DDERR_INVALIDPARAMS;
|
||||||
|
This->set_lights |= 0x00000001 << dwLightIndex;
|
||||||
|
This->light_parameters[dwLightIndex] = *lpLight;
|
||||||
|
|
||||||
|
switch (lpLight->dltType) {
|
||||||
|
case D3DLIGHT_DIRECTIONAL: { /* 3 */
|
||||||
|
float direction[4];
|
||||||
|
|
||||||
|
glLightfv(GL_LIGHT0 + dwLightIndex, GL_AMBIENT, (float *) &(lpLight->dcvAmbient));
|
||||||
|
glLightfv(GL_LIGHT0 + dwLightIndex, GL_DIFFUSE, (float *) &(lpLight->dcvDiffuse));
|
||||||
|
glLightfv(GL_LIGHT0 + dwLightIndex, GL_SPECULAR, (float *) &(lpLight->dcvSpecular));
|
||||||
|
|
||||||
|
direction[0] = lpLight->dvDirection.u1.x;
|
||||||
|
direction[1] = lpLight->dvDirection.u2.y;
|
||||||
|
direction[2] = lpLight->dvDirection.u3.z;
|
||||||
|
direction[3] = 0.0; /* This is a directional light */
|
||||||
|
|
||||||
|
glLightfv(GL_LIGHT0 + dwLightIndex, GL_POSITION, (float *) direction);
|
||||||
|
} break;
|
||||||
|
|
||||||
|
default: WARN(" light type not handled yet...\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return DD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT WINAPI
|
||||||
|
GL_IDirect3DDeviceImpl_7_LightEnable(LPDIRECT3DDEVICE7 iface,
|
||||||
|
DWORD dwLightIndex,
|
||||||
|
BOOL bEnable)
|
||||||
|
{
|
||||||
|
ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface);
|
||||||
|
TRACE("(%p/%p)->(%08lx,%d)\n", This, iface, dwLightIndex, bEnable);
|
||||||
|
|
||||||
|
if (dwLightIndex > MAX_LIGHTS) return DDERR_INVALIDPARAMS;
|
||||||
|
|
||||||
|
if (bEnable) {
|
||||||
|
if (((0x00000001 << dwLightIndex) & This->set_lights) == 0) {
|
||||||
|
/* Set the default parameters.. */
|
||||||
|
TRACE(" setting default light parameters...\n");
|
||||||
|
GL_IDirect3DDeviceImpl_7_SetLight(iface, dwLightIndex, &(This->light_parameters[dwLightIndex]));
|
||||||
|
}
|
||||||
|
glEnable(GL_LIGHT0 + dwLightIndex);
|
||||||
|
} else {
|
||||||
|
glDisable(GL_LIGHT0 + dwLightIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return DD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
#if !defined(__STRICT_ANSI__) && defined(__GNUC__)
|
#if !defined(__STRICT_ANSI__) && defined(__GNUC__)
|
||||||
# define XCAST(fun) (typeof(VTABLE_IDirect3DDevice7.fun))
|
# define XCAST(fun) (typeof(VTABLE_IDirect3DDevice7.fun))
|
||||||
#else
|
#else
|
||||||
|
@ -1494,9 +1586,9 @@ ICOM_VTABLE(IDirect3DDevice7) VTABLE_IDirect3DDevice7 =
|
||||||
XCAST(SetViewport) Main_IDirect3DDeviceImpl_7_SetViewport,
|
XCAST(SetViewport) Main_IDirect3DDeviceImpl_7_SetViewport,
|
||||||
XCAST(MultiplyTransform) Main_IDirect3DDeviceImpl_7_3T_2T_MultiplyTransform,
|
XCAST(MultiplyTransform) Main_IDirect3DDeviceImpl_7_3T_2T_MultiplyTransform,
|
||||||
XCAST(GetViewport) Main_IDirect3DDeviceImpl_7_GetViewport,
|
XCAST(GetViewport) Main_IDirect3DDeviceImpl_7_GetViewport,
|
||||||
XCAST(SetMaterial) Main_IDirect3DDeviceImpl_7_SetMaterial,
|
XCAST(SetMaterial) GL_IDirect3DDeviceImpl_7_SetMaterial,
|
||||||
XCAST(GetMaterial) Main_IDirect3DDeviceImpl_7_GetMaterial,
|
XCAST(GetMaterial) Main_IDirect3DDeviceImpl_7_GetMaterial,
|
||||||
XCAST(SetLight) Main_IDirect3DDeviceImpl_7_SetLight,
|
XCAST(SetLight) GL_IDirect3DDeviceImpl_7_SetLight,
|
||||||
XCAST(GetLight) Main_IDirect3DDeviceImpl_7_GetLight,
|
XCAST(GetLight) Main_IDirect3DDeviceImpl_7_GetLight,
|
||||||
XCAST(SetRenderState) GL_IDirect3DDeviceImpl_7_3T_2T_SetRenderState,
|
XCAST(SetRenderState) GL_IDirect3DDeviceImpl_7_3T_2T_SetRenderState,
|
||||||
XCAST(GetRenderState) Main_IDirect3DDeviceImpl_7_3T_2T_GetRenderState,
|
XCAST(GetRenderState) Main_IDirect3DDeviceImpl_7_3T_2T_GetRenderState,
|
||||||
|
@ -1522,7 +1614,7 @@ ICOM_VTABLE(IDirect3DDevice7) VTABLE_IDirect3DDevice7 =
|
||||||
XCAST(DeleteStateBlock) Main_IDirect3DDeviceImpl_7_DeleteStateBlock,
|
XCAST(DeleteStateBlock) Main_IDirect3DDeviceImpl_7_DeleteStateBlock,
|
||||||
XCAST(CreateStateBlock) Main_IDirect3DDeviceImpl_7_CreateStateBlock,
|
XCAST(CreateStateBlock) Main_IDirect3DDeviceImpl_7_CreateStateBlock,
|
||||||
XCAST(Load) Main_IDirect3DDeviceImpl_7_Load,
|
XCAST(Load) Main_IDirect3DDeviceImpl_7_Load,
|
||||||
XCAST(LightEnable) Main_IDirect3DDeviceImpl_7_LightEnable,
|
XCAST(LightEnable) GL_IDirect3DDeviceImpl_7_LightEnable,
|
||||||
XCAST(GetLightEnable) Main_IDirect3DDeviceImpl_7_GetLightEnable,
|
XCAST(GetLightEnable) Main_IDirect3DDeviceImpl_7_GetLightEnable,
|
||||||
XCAST(SetClipPlane) Main_IDirect3DDeviceImpl_7_SetClipPlane,
|
XCAST(SetClipPlane) Main_IDirect3DDeviceImpl_7_SetClipPlane,
|
||||||
XCAST(GetClipPlane) Main_IDirect3DDeviceImpl_7_GetClipPlane,
|
XCAST(GetClipPlane) Main_IDirect3DDeviceImpl_7_GetClipPlane,
|
||||||
|
@ -1884,6 +1976,7 @@ d3ddevice_create(IDirect3DDeviceImpl **obj, IDirect3DImpl *d3d, IDirectDrawSurfa
|
||||||
int num;
|
int num;
|
||||||
XVisualInfo template;
|
XVisualInfo template;
|
||||||
GLenum buffer;
|
GLenum buffer;
|
||||||
|
int light;
|
||||||
|
|
||||||
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DDeviceGLImpl));
|
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DDeviceGLImpl));
|
||||||
if (object == NULL) return DDERR_OUTOFMEMORY;
|
if (object == NULL) return DDERR_OUTOFMEMORY;
|
||||||
|
@ -1965,6 +2058,29 @@ d3ddevice_create(IDirect3DDeviceImpl **obj, IDirect3DImpl *d3d, IDirectDrawSurfa
|
||||||
gl_object->render_state.alpha_func = GL_ALWAYS; /* Here either but it seems logical */
|
gl_object->render_state.alpha_func = GL_ALWAYS; /* Here either but it seems logical */
|
||||||
gl_object->render_state.alpha_blend_enable = FALSE;
|
gl_object->render_state.alpha_blend_enable = FALSE;
|
||||||
gl_object->render_state.fog_on = FALSE;
|
gl_object->render_state.fog_on = FALSE;
|
||||||
|
gl_object->render_state.stencil_func = GL_ALWAYS;
|
||||||
|
gl_object->render_state.stencil_mask = 0xFFFFFFFF;
|
||||||
|
gl_object->render_state.stencil_ref = 0;
|
||||||
|
gl_object->render_state.stencil_enable = FALSE;
|
||||||
|
gl_object->render_state.stencil_fail = GL_KEEP;
|
||||||
|
gl_object->render_state.stencil_zfail = GL_KEEP;
|
||||||
|
gl_object->render_state.stencil_pass = GL_KEEP;
|
||||||
|
gl_object->render_state.lighting_enable = FALSE;
|
||||||
|
gl_object->render_state.specular_enable = FALSE;
|
||||||
|
gl_object->render_state.color_diffuse = D3DMCS_COLOR1;
|
||||||
|
gl_object->render_state.color_specular = D3DMCS_COLOR2;
|
||||||
|
gl_object->render_state.color_ambient = D3DMCS_COLOR2;
|
||||||
|
gl_object->render_state.color_emissive = D3DMCS_MATERIAL;
|
||||||
|
|
||||||
|
/* Set the various light parameters */
|
||||||
|
for (light = 0; light < MAX_LIGHTS; light++) {
|
||||||
|
/* Only set the fields that are not zero-created */
|
||||||
|
object->light_parameters[light].dltType = D3DLIGHT_DIRECTIONAL;
|
||||||
|
object->light_parameters[light].dcvDiffuse.u1.r = 1.0;
|
||||||
|
object->light_parameters[light].dcvDiffuse.u2.g = 1.0;
|
||||||
|
object->light_parameters[light].dcvDiffuse.u3.b = 1.0;
|
||||||
|
object->light_parameters[light].dvDirection.u3.z = 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Allocate memory for the matrices */
|
/* Allocate memory for the matrices */
|
||||||
object->world_mat = (D3DMATRIX *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16 * sizeof(float));
|
object->world_mat = (D3DMATRIX *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 16 * sizeof(float));
|
||||||
|
|
|
@ -840,7 +840,7 @@ Main_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
|
||||||
LPDDCAPS pHELCaps)
|
LPDDCAPS pHELCaps)
|
||||||
{
|
{
|
||||||
ICOM_THIS(IDirectDrawImpl,iface);
|
ICOM_THIS(IDirectDrawImpl,iface);
|
||||||
TRACE("(%p,%p,%p), stub\n",This,pDriverCaps,pHELCaps);
|
TRACE("(%p,%p,%p)\n",This,pDriverCaps,pHELCaps);
|
||||||
if (pDriverCaps != NULL) {
|
if (pDriverCaps != NULL) {
|
||||||
DD_STRUCT_COPY_BYSIZE(pDriverCaps,&This->caps);
|
DD_STRUCT_COPY_BYSIZE(pDriverCaps,&This->caps);
|
||||||
if (TRACE_ON(ddraw)) {
|
if (TRACE_ON(ddraw)) {
|
||||||
|
|
|
@ -46,6 +46,21 @@ GLenum convert_D3D_compare_to_GL(D3DCMPFUNC dwRenderState)
|
||||||
return GL_ALWAYS;
|
return GL_ALWAYS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLenum convert_D3D_stencilop_to_GL(D3DSTENCILOP dwRenderState)
|
||||||
|
{
|
||||||
|
switch (dwRenderState) {
|
||||||
|
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: WARN("D3DSTENCILOP_INCR not properly handled !\n"); return GL_INCR;
|
||||||
|
case D3DSTENCILOP_DECR: WARN("D3DSTENCILOP_DECR not properly handled !\n"); return GL_DECR;
|
||||||
|
default: ERR("Unexpected compare type %d !\n", dwRenderState);
|
||||||
|
}
|
||||||
|
return GL_KEEP;
|
||||||
|
}
|
||||||
|
|
||||||
void set_render_state(D3DRENDERSTATETYPE dwRenderStateType,
|
void set_render_state(D3DRENDERSTATETYPE dwRenderStateType,
|
||||||
DWORD dwRenderState, RenderState *rs)
|
DWORD dwRenderState, RenderState *rs)
|
||||||
|
@ -400,6 +415,47 @@ void set_render_state(D3DRENDERSTATETYPE dwRenderStateType,
|
||||||
case D3DRENDERSTATE_FLUSHBATCH: /* 50 */
|
case D3DRENDERSTATE_FLUSHBATCH: /* 50 */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case D3DRENDERSTATE_STENCILENABLE: /* 52 */
|
||||||
|
if (dwRenderState)
|
||||||
|
glDisable(GL_STENCIL_TEST);
|
||||||
|
else
|
||||||
|
glDisable(GL_STENCIL_TEST);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3DRENDERSTATE_STENCILFAIL: /* 53 */
|
||||||
|
rs->stencil_fail = convert_D3D_stencilop_to_GL(dwRenderState);
|
||||||
|
glStencilOp(rs->stencil_fail, rs->stencil_zfail, rs->stencil_pass);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3DRENDERSTATE_STENCILZFAIL: /* 54 */
|
||||||
|
rs->stencil_zfail = convert_D3D_stencilop_to_GL(dwRenderState);
|
||||||
|
glStencilOp(rs->stencil_fail, rs->stencil_zfail, rs->stencil_pass);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3DRENDERSTATE_STENCILPASS: /* 55 */
|
||||||
|
rs->stencil_pass = convert_D3D_stencilop_to_GL(dwRenderState);
|
||||||
|
glStencilOp(rs->stencil_fail, rs->stencil_zfail, rs->stencil_pass);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3DRENDERSTATE_STENCILFUNC: /* 56 */
|
||||||
|
rs->stencil_func = convert_D3D_compare_to_GL(dwRenderState);
|
||||||
|
glStencilFunc(rs->stencil_func, rs->stencil_ref, rs->stencil_mask);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3DRENDERSTATE_STENCILREF: /* 57 */
|
||||||
|
rs->stencil_ref = dwRenderState;
|
||||||
|
glStencilFunc(rs->stencil_func, rs->stencil_ref, rs->stencil_mask);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3DRENDERSTATE_STENCILMASK: /* 58 */
|
||||||
|
rs->stencil_mask = dwRenderState;
|
||||||
|
glStencilFunc(rs->stencil_func, rs->stencil_ref, rs->stencil_mask);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3DRENDERSTATE_STENCILWRITEMASK: /* 59 */
|
||||||
|
glStencilMask(dwRenderState);
|
||||||
|
break;
|
||||||
|
|
||||||
case D3DRENDERSTATE_LIGHTING: /* 137 */
|
case D3DRENDERSTATE_LIGHTING: /* 137 */
|
||||||
/* There will be more to do here once we really support D3D7 Lighting.
|
/* There will be more to do here once we really support D3D7 Lighting.
|
||||||
Should be enough for now to prevent warnings :-) */
|
Should be enough for now to prevent warnings :-) */
|
||||||
|
@ -408,6 +464,33 @@ void set_render_state(D3DRENDERSTATETYPE dwRenderStateType,
|
||||||
else
|
else
|
||||||
glDisable(GL_LIGHTING);
|
glDisable(GL_LIGHTING);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case D3DRENDERSTATE_AMBIENT: { /* 139 */
|
||||||
|
float light[4];
|
||||||
|
|
||||||
|
light[0] = ((dwRenderState >> 16) & 0xFF) / 255.0;
|
||||||
|
light[1] = ((dwRenderState >> 8) & 0xFF) / 255.0;
|
||||||
|
light[2] = ((dwRenderState >> 0) & 0xFF) / 255.0;
|
||||||
|
light[3] = ((dwRenderState >> 24) & 0xFF) / 255.0;
|
||||||
|
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, (float *) light);
|
||||||
|
} break;
|
||||||
|
|
||||||
|
case D3DRENDERSTATE_LOCALVIEWER: /* 142 */
|
||||||
|
if (dwRenderState)
|
||||||
|
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
|
||||||
|
else
|
||||||
|
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case D3DRENDERSTATE_NORMALIZENORMALS: /* 143 */
|
||||||
|
if (dwRenderState) {
|
||||||
|
glEnable(GL_NORMALIZE);
|
||||||
|
glEnable(GL_RESCALE_NORMAL);
|
||||||
|
} else {
|
||||||
|
glDisable(GL_NORMALIZE);
|
||||||
|
glDisable(GL_RESCALE_NORMAL);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ERR("Unhandled dwRenderStateType %s (%08x) !\n", _get_renderstate(dwRenderStateType), dwRenderStateType);
|
ERR("Unhandled dwRenderStateType %s (%08x) !\n", _get_renderstate(dwRenderStateType), dwRenderStateType);
|
||||||
|
|
|
@ -69,6 +69,17 @@ typedef struct render_state {
|
||||||
GLclampf alpha_ref;
|
GLclampf alpha_ref;
|
||||||
BOOLEAN alpha_blend_enable;
|
BOOLEAN alpha_blend_enable;
|
||||||
|
|
||||||
|
/* This is needed for the stencil stuff */
|
||||||
|
GLint stencil_ref;
|
||||||
|
GLuint stencil_mask;
|
||||||
|
GLenum stencil_func;
|
||||||
|
BOOLEAN stencil_enable;
|
||||||
|
GLenum stencil_fail, stencil_zfail, stencil_pass;
|
||||||
|
|
||||||
|
/* This is needed for proper lighting */
|
||||||
|
BOOLEAN lighting_enable, specular_enable;
|
||||||
|
D3DMATERIALCOLORSOURCE color_diffuse, color_specular, color_ambient, color_emissive;
|
||||||
|
|
||||||
/* This is needed to re-enable fogging when XYZRHW and XYZ primitives are mixed */
|
/* This is needed to re-enable fogging when XYZRHW and XYZ primitives are mixed */
|
||||||
BOOLEAN fog_on;
|
BOOLEAN fog_on;
|
||||||
} RenderState;
|
} RenderState;
|
||||||
|
@ -175,8 +186,7 @@ extern DWORD get_flexible_vertex_size(DWORD d3dvtVertexType, DWORD *elements);
|
||||||
};
|
};
|
||||||
|
|
||||||
#define _dump_colorvalue(s,v) \
|
#define _dump_colorvalue(s,v) \
|
||||||
TRACE(" " s " : %f %f %f %f\n", \
|
DPRINTF(" - " s); dump_D3DCOLORVALUE(&v); DPRINTF("\n");
|
||||||
(v).u1.r, (v).u2.g, (v).u3.b, (v).u4.a);
|
|
||||||
|
|
||||||
/* This structure contains all the function pointers to OpenGL extensions
|
/* This structure contains all the function pointers to OpenGL extensions
|
||||||
that are used by Wine */
|
that are used by Wine */
|
||||||
|
|
Loading…
Reference in New Issue