Implement [ format specifier.
[wine] / dlls / ddraw / mesa.c
1 /* Direct3D Common functions
2  * Copyright (c) 1998 Lionel ULMER
3  *
4  * This file contains all MESA common code
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include "config.h"
22
23 #include "windef.h"
24 #include "wine/obj_base.h"
25 #include "ddraw.h"
26 #include "d3d.h"
27 #include "wine/debug.h"
28
29 #include "mesa_private.h"
30
31 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
32
33 #define D3DTPRIVATE(x) mesa_d3dt_private *dtpriv = (mesa_d3dt_private*)(x)->private
34
35 void set_render_state(D3DRENDERSTATETYPE dwRenderStateType,
36                       DWORD dwRenderState, RenderState *rs)
37 {
38
39   if (TRACE_ON(ddraw))
40     TRACE("%s = %08lx\n", _get_renderstate(dwRenderStateType), dwRenderState);
41
42   /* First, all the stipple patterns */
43   if ((dwRenderStateType >= D3DRENDERSTATE_STIPPLEPATTERN00) &&
44       (dwRenderStateType <= D3DRENDERSTATE_STIPPLEPATTERN31)) {
45     ERR("Unhandled dwRenderStateType stipple %d!\n",dwRenderStateType);
46   } else {
47     ENTER_GL();
48
49     /* All others state variables */
50     switch (dwRenderStateType) {
51
52     case D3DRENDERSTATE_TEXTUREHANDLE: {    /*  1 */
53       IDirect3DTexture2Impl* tex = (IDirect3DTexture2Impl*) dwRenderState;
54
55       if (tex == NULL) {
56         glBindTexture(GL_TEXTURE_2D, 0);
57         glDisable(GL_TEXTURE_2D);
58         TRACE("disabling texturing\n");
59       } else {
60         D3DTPRIVATE(tex);
61
62         glEnable(GL_TEXTURE_2D);
63         /* Default parameters */
64         glBindTexture(GL_TEXTURE_2D, dtpriv->tex_name);
65         /* To prevent state change, we could test here what are the parameters
66            stored in the texture */
67         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, rs->mag);
68         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, rs->min);
69         TRACE("setting OpenGL texture handle : %d\n", dtpriv->tex_name);
70       }
71     } break;
72
73     case D3DRENDERSTATE_TEXTUREPERSPECTIVE: /* 4 */
74       if (dwRenderState)
75         glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
76       else
77         glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
78       break;
79
80     case D3DRENDERSTATE_ZENABLE:          /*  7 */
81       if (dwRenderState)
82         glEnable(GL_DEPTH_TEST);
83       else
84         glDisable(GL_DEPTH_TEST);
85       break;
86
87     case D3DRENDERSTATE_FILLMODE:           /*  8 */
88       switch ((D3DFILLMODE) dwRenderState) {
89       case D3DFILL_POINT:
90         glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);        
91         break;
92       case D3DFILL_WIREFRAME:
93         glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); 
94         break;
95       case D3DFILL_SOLID:
96         glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); 
97         break;
98
99       default:
100         ERR("Unhandled fill mode !\n");
101       }
102       break;
103
104     case D3DRENDERSTATE_SHADEMODE:          /*  9 */
105       switch ((D3DSHADEMODE) dwRenderState) {
106       case D3DSHADE_FLAT:
107         glShadeModel(GL_FLAT);
108         break;
109
110       case D3DSHADE_GOURAUD:
111         glShadeModel(GL_SMOOTH);
112         break;
113
114       default:
115         ERR("Unhandled shade mode !\n");
116       }
117       break;
118
119     case D3DRENDERSTATE_ZWRITEENABLE:     /* 14 */
120       if (dwRenderState)
121         glDepthMask(GL_TRUE);
122       else
123         glDepthMask(GL_FALSE);
124       break;
125
126     case D3DRENDERSTATE_TEXTUREMAG:         /* 17 */
127       switch ((D3DTEXTUREFILTER) dwRenderState) {
128       case D3DFILTER_NEAREST:
129         rs->mag = GL_NEAREST;
130         break;
131
132       case D3DFILTER_LINEAR:
133         rs->mag = GL_LINEAR;
134         break;
135
136       default:
137         ERR("Unhandled texture mag !\n");
138       }
139       break;
140
141     case D3DRENDERSTATE_TEXTUREMIN:         /* 18 */
142       switch ((D3DTEXTUREFILTER) dwRenderState) {
143       case D3DFILTER_NEAREST:
144         rs->min = GL_NEAREST;
145         break;
146
147       case D3DFILTER_LINEAR:
148         rs->mag = GL_LINEAR;
149         break;
150
151       default:
152         ERR("Unhandled texture min !\n");
153       }
154       break;
155
156     case D3DRENDERSTATE_SRCBLEND:           /* 19 */
157       switch ((D3DBLEND) dwRenderState) {
158       case D3DBLEND_SRCALPHA:
159         rs->src = GL_SRC_ALPHA;
160         break;
161
162       default:
163         ERR("Unhandled blend mode !\n");
164       }
165
166       glBlendFunc(rs->src, rs->dst);
167       break;
168
169     case D3DRENDERSTATE_DESTBLEND:          /* 20 */
170       switch ((D3DBLEND) dwRenderState) {
171       case D3DBLEND_INVSRCALPHA:
172         rs->dst = GL_ONE_MINUS_SRC_ALPHA;
173         break;
174
175       default:
176         ERR("Unhandled blend mode !\n");
177       }
178
179       glBlendFunc(rs->src, rs->dst);
180       break;
181
182     case D3DRENDERSTATE_TEXTUREMAPBLEND:    /* 21 */
183       switch ((D3DTEXTUREBLEND) dwRenderState) {
184       case D3DTBLEND_MODULATE:
185       case D3DTBLEND_MODULATEALPHA:
186         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
187         break;
188
189       default:
190         ERR("Unhandled texture environment !\n");
191       }
192       break;
193
194     case D3DRENDERSTATE_CULLMODE:           /* 22 */
195       switch ((D3DCULL) dwRenderState) {
196       case D3DCULL_NONE:
197         glDisable(GL_CULL_FACE);
198         break;
199
200       case D3DCULL_CW:
201         glEnable(GL_CULL_FACE);
202         glFrontFace(GL_CW);
203         break;
204
205       case D3DCULL_CCW:
206         glEnable(GL_CULL_FACE);
207         glFrontFace(GL_CCW);
208         break;
209
210       default:
211         ERR("Unhandled cull mode !\n");
212       }
213       break;
214
215     case D3DRENDERSTATE_ZFUNC:            /* 23 */
216       switch ((D3DCMPFUNC) dwRenderState) {
217       case D3DCMP_NEVER:
218         glDepthFunc(GL_NEVER);
219         break;
220       case D3DCMP_LESS:
221         glDepthFunc(GL_LESS);
222         break;
223       case D3DCMP_EQUAL:
224         glDepthFunc(GL_EQUAL);
225         break;
226       case D3DCMP_LESSEQUAL:
227         glDepthFunc(GL_LEQUAL);
228         break;
229       case D3DCMP_GREATER:
230         glDepthFunc(GL_GREATER);
231         break;
232       case D3DCMP_NOTEQUAL:
233         glDepthFunc(GL_NOTEQUAL);
234         break;
235       case D3DCMP_GREATEREQUAL:
236         glDepthFunc(GL_GEQUAL);
237         break;
238       case D3DCMP_ALWAYS:
239         glDepthFunc(GL_ALWAYS);
240         break;
241
242       default:
243         ERR("Unexpected value\n");
244       }
245       break;
246
247     case D3DRENDERSTATE_DITHERENABLE:     /* 26 */
248       if (dwRenderState)
249         glEnable(GL_DITHER);
250       else
251         glDisable(GL_DITHER);
252       break;
253
254     case D3DRENDERSTATE_ALPHABLENDENABLE:   /* 27 */
255       if (dwRenderState)
256         glEnable(GL_BLEND);
257       else
258         glDisable(GL_BLEND);
259       break;
260
261     case D3DRENDERSTATE_COLORKEYENABLE:     /* 41 */
262       if (dwRenderState)
263         glEnable(GL_BLEND);
264       else
265         glDisable(GL_BLEND);
266       break;
267
268     case D3DRENDERSTATE_FLUSHBATCH:         /* 50 */
269       break;
270
271     default:
272       ERR("Unhandled dwRenderStateType %s !\n", _get_renderstate(dwRenderStateType));
273       break;
274     }
275
276     LEAVE_GL();
277   }
278 }