Richard Boegli's CnC_Generals_Zero_Hour Fork WIP
This is documentation of Richard Boegil's Zero Hour Fork
 
Loading...
Searching...
No Matches
shader.cpp
Go to the documentation of this file.
1/*
2** Command & Conquer Generals Zero Hour(tm)
3** Copyright 2025 Electronic Arts Inc.
4**
5** This program is free software: you can redistribute it and/or modify
6** it under the terms of the GNU General Public License as published by
7** the Free Software Foundation, either version 3 of the License, or
8** (at your option) any later version.
9**
10** This program is distributed in the hope that it will be useful,
11** but WITHOUT ANY WARRANTY; without even the implied warranty of
12** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13** GNU General Public License for more details.
14**
15** You should have received a copy of the GNU General Public License
16** along with this program. If not, see <http://www.gnu.org/licenses/>.
17*/
18
19/***********************************************************************************************
20 *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
21 ***********************************************************************************************
22 * *
23 * Project Name : WW3D *
24 * *
25 * $Archive:: /Commando/Code/ww3d2/shader.cpp $*
26 * *
27 * Author:: Greg Hjelstrom *
28 * *
29 * $Modtime:: 12/11/01 5:15p $*
30 * *
31 * $Revision:: 21 $*
32 * *
33 *---------------------------------------------------------------------------------------------*
34 * Functions: *
35 * ShaderClass::Init_From_Material3 -- Initialize a shader from a Material3 structure *
36 * ShaderClass::Apply -- Apply the renderstates for this shader *
37 * ShaderClass::Invert_Backface_Culling -- Globally invert the sense of all backface culling *
38 * ShaderClass::Is_Backface_Culling_Inverted -- Is backface culling inverted? *
39 * ShaderClass::Get_SS_Category -- Helper function for static sort system *
40 * ShaderClass::Guess_Sort_Level -- Guess the static sort level *
41 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
42
43#include "shader.h"
44#include "w3d_file.h"
45#include "wwdebug.h"
46#include "Dx8Wrapper.h"
47#include "dx8caps.h"
48
49
51unsigned long ShaderClass::CurrentShader=0;
52unsigned long _PolygonCullMode = D3DCULL_CW;
53
54
55/*
56** Definitions of the preset shaders:
57*/
58
59// Texturing, zbuffer, primary gradient, no blending
60
61#define SC_OPAQUE ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_ENABLE, COLOR_WRITE_ENABLE, SRCBLEND_ONE, \
62 DSTBLEND_ZERO, FOG_DISABLE, GRADIENT_MODULATE, SECONDARY_GRADIENT_DISABLE, TEXTURING_ENABLE, \
63 ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
64 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
66
67// Texturing, zbuffer, disabled zbuffer write, primary gradient, additive blending
68#define SC_ADDITIVE ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, SRCBLEND_ONE, \
69 DSTBLEND_ONE, FOG_DISABLE, GRADIENT_MODULATE, SECONDARY_GRADIENT_DISABLE, TEXTURING_ENABLE, \
70 ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
71 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
73
74// Texturing, zbuffer, disabled zbuffer write, primary gradient, additive blending, bumpenvmap
75#define SC_BUMPENVMAP ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, SRCBLEND_ONE, \
76 DSTBLEND_ONE, FOG_DISABLE, GRADIENT_BUMPENVMAP, SECONDARY_GRADIENT_DISABLE, TEXTURING_ENABLE, \
77 ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
78 DETAILCOLOR_ADD, DETAILALPHA_DISABLE) )
80
81// Texturing, zbuffer, disabled zbuffer write, primary gradient, alpha blending
82#define SC_ALPHA ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, SRCBLEND_SRC_ALPHA, \
83 DSTBLEND_ONE_MINUS_SRC_ALPHA, FOG_DISABLE, GRADIENT_MODULATE, SECONDARY_GRADIENT_DISABLE, TEXTURING_ENABLE, \
84 ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
85 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
87
88// Texturing, zbuffer, disabled zbuffer write, primary gradient, multiplicative blending
89#define SC_MULTIPLICATIVE ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, SRCBLEND_ZERO, \
90 DSTBLEND_SRC_COLOR, FOG_DISABLE, GRADIENT_MODULATE, SECONDARY_GRADIENT_DISABLE, TEXTURING_ENABLE, \
91 ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
92 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
94
95// Texturing, no zbuffer reading/writing, no gradients, no blending, no
96// fogging - mostly for opaque 2D objects.
97#define SC_OP_2D ( SHADE_CNST(PASS_ALWAYS, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, SRCBLEND_ONE, \
98 DSTBLEND_ZERO, FOG_DISABLE, GRADIENT_DISABLE, SECONDARY_GRADIENT_DISABLE, TEXTURING_ENABLE, \
99 ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
100 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
102
103// Texturing, default zbuffer reading, no zbuffer writing, no gradients, no blending, no
104// fogging - mostly for opaque sprite objects.
105#define SC_OP_SPRITE ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, SRCBLEND_ONE, \
106 DSTBLEND_ZERO, FOG_DISABLE, GRADIENT_DISABLE, SECONDARY_GRADIENT_DISABLE, TEXTURING_ENABLE, \
107 ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
108 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
110
111
112// Texturing, no zbuffer reading/writing, no gradients, additive blending,
113// no fogging - mostly for additive 2D objects.
114#define SC_ADD_2D ( SHADE_CNST(PASS_ALWAYS, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, SRCBLEND_ONE, \
115 DSTBLEND_ONE, FOG_DISABLE, GRADIENT_DISABLE, SECONDARY_GRADIENT_DISABLE, TEXTURING_ENABLE, \
116 ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
117 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
119
120// Texturing, no zbuffer reading/writing, no gradients, alpha blending, no
121// fogging - mostly for alpha-blended 2D objects.
122#define SC_ALPHA_2D ( SHADE_CNST(PASS_ALWAYS, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, \
123 SRCBLEND_SRC_ALPHA, DSTBLEND_ONE_MINUS_SRC_ALPHA, FOG_DISABLE, GRADIENT_DISABLE, \
124 SECONDARY_GRADIENT_DISABLE, TEXTURING_ENABLE, \
125 ALPHATEST_DISABLE, CULL_MODE_ENABLE, DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
127
128// Texturing, default zbuffer reading, no zbuffer writing, no gradients,
129// additive blending, no fogging - mostly for use in additive sprite
130// objects.
131#define SC_ADD_SPRITE ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, \
132 SRCBLEND_ONE, DSTBLEND_ONE, FOG_DISABLE, GRADIENT_DISABLE, SECONDARY_GRADIENT_DISABLE, \
133 TEXTURING_ENABLE, ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
134 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
136
137// Texturing, default zbuffer reading, no zbuffer writing, no gradients,
138// alpha blending, no fogging - mostly for use in alpha-blended sprite
139// objects.
140#define SC_ALPHA_SPRITE ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, \
141 SRCBLEND_SRC_ALPHA, DSTBLEND_ONE_MINUS_SRC_ALPHA, FOG_DISABLE, GRADIENT_DISABLE, \
142 SECONDARY_GRADIENT_DISABLE, TEXTURING_ENABLE, \
143 ALPHATEST_DISABLE, CULL_MODE_ENABLE, DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
145
146// No texturing, default zbuffer reading/writing, primary gradient, no
147// blending, no fogging - mostly for use in solid-colored opaque objects.
148#define SC_OPAQUE_SOLID ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_ENABLE, COLOR_WRITE_ENABLE, \
149 SRCBLEND_ONE, DSTBLEND_ZERO, FOG_DISABLE, GRADIENT_MODULATE, SECONDARY_GRADIENT_DISABLE, \
150 TEXTURING_DISABLE, ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
151 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
153
154// No texturing, default zbuffer reading, no zbuffer writing, primary
155// gradient, additive blending, no fogging - mostly for use in solid-colored
156// additive objects.
157#define SC_ADDITIVE_SOLID ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, \
158 SRCBLEND_ONE, DSTBLEND_ONE, FOG_DISABLE, GRADIENT_MODULATE, SECONDARY_GRADIENT_DISABLE, \
159 TEXTURING_DISABLE, ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
160 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
162
163// No texturing, default zbuffer reading, no zbuffer writing, primary
164// gradient, alpha blending, no fogging - mostly for use in solid-colored
165// alpha objects.
166#define SC_ALPHA_SOLID ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, \
167 SRCBLEND_SRC_ALPHA, DSTBLEND_ONE_MINUS_SRC_ALPHA, FOG_DISABLE, GRADIENT_MODULATE, \
168 SECONDARY_GRADIENT_DISABLE, TEXTURING_DISABLE, \
169 ALPHATEST_DISABLE, CULL_MODE_ENABLE, DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
171
172// Texturing, no zbuffer reading/writing, no gradients, no blending, alpha
173// testing, no fogging - mostly for "pure" alpha-tested 2D objects.
174#define SC_ATEST_2D ( SHADE_CNST(PASS_ALWAYS, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, \
175 SRCBLEND_ONE, DSTBLEND_ZERO, FOG_DISABLE, GRADIENT_DISABLE, SECONDARY_GRADIENT_DISABLE, \
176 TEXTURING_ENABLE, ALPHATEST_ENABLE, CULL_MODE_ENABLE, \
177 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
179
180// Texturing, default zbuffer reading and writing, no gradients, no
181// blending, alpha testing, no fogging - mostly for "pure" alpha-tested
182// sprite objects.
183#define SC_ATEST_SPRITE ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_ENABLE, COLOR_WRITE_ENABLE, \
184 SRCBLEND_ONE, DSTBLEND_ZERO, FOG_DISABLE, GRADIENT_DISABLE, SECONDARY_GRADIENT_DISABLE, \
185 TEXTURING_ENABLE, ALPHATEST_ENABLE, CULL_MODE_ENABLE, \
186 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
188
189// Texturing, no zbuffer reading/writing, no gradients, alpha blending AND
190// alpha testing, no fogging - mostly for alpha-tested and blended 2D
191// objects.
192#define SC_ATESTBLEND_2D ( SHADE_CNST(PASS_ALWAYS, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, \
193 SRCBLEND_SRC_ALPHA, DSTBLEND_ONE_MINUS_SRC_ALPHA, FOG_DISABLE, GRADIENT_DISABLE, \
194 SECONDARY_GRADIENT_DISABLE, TEXTURING_ENABLE, \
195 ALPHATEST_ENABLE, CULL_MODE_ENABLE, DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
197
198// Texturing, default zbuffer reading and writing, no gradients, alpha
199// blending AND alpha testing, no fogging - mostly for use in alpha-tested
200// and blended sprite objects.
201#define SC_ATESTBLEND_SPRITE ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_ENABLE, COLOR_WRITE_ENABLE, \
202 SRCBLEND_SRC_ALPHA, DSTBLEND_ONE_MINUS_SRC_ALPHA, FOG_DISABLE, GRADIENT_DISABLE, \
203 SECONDARY_GRADIENT_DISABLE, TEXTURING_ENABLE, \
204 ALPHATEST_ENABLE, CULL_MODE_ENABLE, DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
206
207// Texturing, no zbuffer reading/writing, no gradients, screen blending,
208// no fogging - mostly for screen-blended 2D objects.
209#define SC_SCREEN_2D ( SHADE_CNST(PASS_ALWAYS, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, SRCBLEND_ONE, \
210 DSTBLEND_ONE_MINUS_SRC_COLOR, FOG_DISABLE, GRADIENT_DISABLE, SECONDARY_GRADIENT_DISABLE, \
211 TEXTURING_ENABLE, ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
212 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
214
215// Texturing, default zbuffer reading, no zbuffer writing, no gradients,
216// screen blending, no fogging - mostly for use in screen-blended sprite
217// objects.
218#define SC_SCREEN_SPRITE ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, \
219 SRCBLEND_ONE, DSTBLEND_ONE_MINUS_SRC_COLOR, FOG_DISABLE, GRADIENT_DISABLE, SECONDARY_GRADIENT_DISABLE, \
220 TEXTURING_ENABLE, ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
221 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
223
224// Texturing, no zbuffer reading/writing, no gradients, multiplicative
225// blending, no fogging - mostly for multiplicatively blended 2D objects.
226#define SC_MUL_2D ( SHADE_CNST(PASS_ALWAYS, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, SRCBLEND_ZERO, \
227 DSTBLEND_SRC_COLOR, FOG_DISABLE, GRADIENT_DISABLE, SECONDARY_GRADIENT_DISABLE, TEXTURING_ENABLE, \
228 ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
229 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
231
232// Texturing, default zbuffer reading, no zbuffer writing, no gradients,
233// multiplicative blending, no fogging - mostly for use in multiplicatively
234// blended sprite objects.
235#define SC_MUL_SPRITE ( SHADE_CNST(PASS_LEQUAL, DEPTH_WRITE_DISABLE, COLOR_WRITE_ENABLE, \
236 SRCBLEND_ZERO, DSTBLEND_SRC_COLOR, FOG_DISABLE, GRADIENT_DISABLE, SECONDARY_GRADIENT_DISABLE, \
237 TEXTURING_ENABLE, ALPHATEST_DISABLE, CULL_MODE_ENABLE, \
238 DETAILCOLOR_DISABLE, DETAILALPHA_DISABLE) )
240
241
242/***********************************************************************************************
243 * ShaderClass::Init_From_Material3 -- Initialize a shader from a Material3 structure *
244 * *
245 * INPUT: *
246 * *
247 * OUTPUT: *
248 * *
249 * WARNINGS: *
250 * *
251 * HISTORY: *
252 * 4/24/2001 gth : Created. *
253 *=============================================================================================*/
262
263
264/***********************************************************************************************
265 * ShaderClass::Enable_Fog -- Turn on fog for this shader. *
266 * *
267 * Enable most appropriate fog mode (FOG_ENABLE, FOG_SCALE_FRAGMENT or FOG_WHITE) for given *
268 * source and destination blends. *
269 * *
270 * INPUT: *
271 * *
272 * OUTPUT: *
273 * *
274 * WARNINGS: *
275 * *
276 * HISTORY: *
277 * 05/02/00 IML : Created. *
278 *=============================================================================================*/
279
280void ShaderClass::Enable_Fog (const char *source)
281{
282 // Enable the appropriate fog mode based on shader's source and destination blends.
283 switch (Get_Src_Blend_Func()) {
284
288 } else {
289 Report_Unable_To_Fog (source);
290 }
291 break;
292
294 switch (Get_Dst_Blend_Func()) {
295
296 case ShaderClass::DSTBLEND_ZERO: // Opaque.
298 break;
299
300 case ShaderClass::DSTBLEND_ONE: // Additive.
303 break;
304
305 default:
306 Report_Unable_To_Fog (source);
307 break;
308 }
309 break;
310
314 } else {
315 Report_Unable_To_Fog (source);
316 }
317 break;
318
322 } else {
323 Report_Unable_To_Fog (source);
324 }
325 break;
326 }
327}
328
329
330/***********************************************************************************************
331 * ShaderClass::Report_Unable_To_Fog -- *
332 * *
333 * INPUT: *
334 * *
335 * OUTPUT: *
336 * *
337 * WARNINGS: *
338 * *
339 * HISTORY: *
340 * 10/04/00 IML : Created. *
341 *=============================================================================================*/
342void ShaderClass::Report_Unable_To_Fog (const char *source)
343{
344 #ifdef WWDEBUG
345 static unsigned _reportcount = 0;
346
347 const char *unabletofogtext = "WARNING: Unable to fog shader in %s with given blending mode.\r\n";
348 const char *unabletofogmoretext = "WARNING: Unable to fog additional shaders (further warnings will be suppressed).\r\n";
349 const unsigned maxreportcount = 10;
350
351 // Limit the no. of warning messages to some practical maximum. Suppress all subsequent warnings.
352 if (_reportcount < maxreportcount) {
353 WWDEBUG_SAY ((unabletofogtext, source));
354 _reportcount++;
355 } else {
356 if (_reportcount == maxreportcount) {
357 WWDEBUG_SAY ((unabletofogmoretext));
358 _reportcount++;
359 }
360 }
361 #endif
362}
363
364class Blend
365{
366public:
367
368 Blend(D3DBLEND f, bool ab)
369 {
370 func = f;
371 useAlpha = ab;
372 }
373
374 D3DBLEND func;
376};
377
379{
380 Blend(D3DBLEND_ZERO, false),
381 Blend(D3DBLEND_ONE, false),
382 Blend(D3DBLEND_SRCALPHA, true),
383 Blend(D3DBLEND_DESTCOLOR, true)
384};
385
387{
388 Blend(D3DBLEND_ZERO, false),
389 Blend(D3DBLEND_ONE, false),
390 Blend(D3DBLEND_SRCCOLOR, false),
391 Blend(D3DBLEND_INVSRCCOLOR, false),
392 Blend(D3DBLEND_SRCALPHA, true),
393 Blend(D3DBLEND_INVSRCALPHA, true)
394};
395
396
397/***********************************************************************************************
398 * ShaderClass::Apply -- Apply the renderstates for this shader *
399 * *
400 * INPUT: *
401 * *
402 * OUTPUT: *
403 * *
404 * WARNINGS: *
405 * *
406 * HISTORY: *
407 * 4/24/2001 gth : Created. *
408 *=============================================================================================*/
409void ShaderClass::Apply()
410{
411 unsigned long diff;
412
413 unsigned int TextureOpCaps=DX8Wrapper::Get_Current_Caps()->Get_DX8_Caps().TextureOpCaps;
414
415 if (ShaderDirty)
416 {
417 diff=0xffffffff;
418 }
419 else
420 {
422 }
423
424 if(!diff) return;
425
426
428 ShaderDirty=false;
429 // COLOR MASK
430
432 {
433 ULONG planeMask = 0xffffff;
434
436 planeMask = 0;
437
438 D3DBLEND sf;
439 D3DBLEND df;
440 bool blendAlpha = false;
441
442 if(!planeMask)
443 {
444 sf = D3DBLEND_ZERO;
445 df = D3DBLEND_ONE;
446 }
447 else
448 {
449 sf = srcBlendLUT[ int(Get_Src_Blend_Func()) ].func;
450 df = dstBlendLUT[ int(Get_Dst_Blend_Func()) ].func;
451 blendAlpha |= srcBlendLUT[ int(Get_Src_Blend_Func()) ].useAlpha;
452 blendAlpha |= dstBlendLUT[ int(Get_Dst_Blend_Func()) ].useAlpha;
453 }
454
455 BOOL blendOn = FALSE;
456
457 if(sf != D3DBLEND_ONE || df != D3DBLEND_ZERO)
458 {
459 DX8Wrapper::Set_DX8_Render_State(D3DRS_SRCBLEND,sf);
460 DX8Wrapper::Set_DX8_Render_State(D3DRS_DESTBLEND,df);
461 blendOn = TRUE;
462 }
463 DX8Wrapper::Set_DX8_Render_State(D3DRS_ALPHABLENDENABLE,blendOn);
464
465 BOOL alphaTest = FALSE;
466
468 {
469 unsigned char alphareference = 0x60; // Alpha reference value that produces best results with mip-mapped textures.
470
471 if(sf == D3DBLEND_INVSRCALPHA)
472 {
473 DX8Wrapper::Set_DX8_Render_State(D3DRS_ALPHAREF,0xff - alphareference);
474 DX8Wrapper::Set_DX8_Render_State(D3DRS_ALPHAFUNC,D3DCMP_LESSEQUAL);
475 }
476 else
477 {
478 DX8Wrapper::Set_DX8_Render_State(D3DRS_ALPHAREF,alphareference);
479 DX8Wrapper::Set_DX8_Render_State(D3DRS_ALPHAFUNC,D3DCMP_GREATEREQUAL);
480 }
481 blendAlpha = true;
482 alphaTest = TRUE;
483 }
484 DX8Wrapper::Set_DX8_Render_State(D3DRS_ALPHATESTENABLE,alphaTest);
485
487 if(!diff)
488 return;
489 }
490
491 if(diff & (ShaderClass::MASK_FOG))
492 {
493 // Whenever fog is enabled or disabled, the entire shader is invalidated. This is why we
494 // can defer the "fog enabled" check inside the "fog settings changed" check.
495 if (DX8Wrapper::Get_Current_Caps()->Is_Fog_Allowed() && DX8Wrapper::Get_Fog_Enable()) {
496
497 BOOL fm = FALSE;
498 D3DCOLOR fogColor = DX8Wrapper::Get_Fog_Color();
499
500 switch(Get_Fog_Func())
501 {
503 fm = TRUE;
504 break;
506 fogColor = 0;
507 fm = TRUE;
508 break;
510 fogColor = 0xffffff;
511 fm = TRUE;
512 break;
514 fm = FALSE;
515 break;
516 }
517
518 DX8Wrapper::Set_DX8_Render_State(D3DRS_FOGENABLE,fm);
519
520 if(fm)
521 {
522 DX8Wrapper::Set_DX8_Render_State(D3DRS_FOGCOLOR,fogColor);
523 }
524
525 } else {
527 }
528
529 diff &= ~(ShaderClass::MASK_FOG);
530 if(!diff)
531 return;
532 }
533
534 // Defaults
535
536 D3DTEXTUREOP PricOp = D3DTOP_SELECTARG1;
537 DWORD PricArg1 = D3DTA_DIFFUSE;
538 DWORD PricArg2 = D3DTA_DIFFUSE;
539
540 D3DTEXTUREOP PriaOp = D3DTOP_SELECTARG1;
541 DWORD PriaArg1 = D3DTA_DIFFUSE;
542 DWORD PriaArg2 = D3DTA_DIFFUSE;
543
544 D3DTEXTUREOP SeccOp = D3DTOP_DISABLE;
545 DWORD SeccArg1 = D3DTA_TEXTURE;
546 DWORD SeccArg2 = D3DTA_CURRENT;
547
548 D3DTEXTUREOP SecaOp = D3DTOP_DISABLE;
549 DWORD SecaArg1 = D3DTA_TEXTURE;
550 DWORD SecaArg2 = D3DTA_CURRENT;
551
556
557 // Voodoo3s need to keep track of any changes in any of the above
558 // because it shuffles the stages around
559 if (voodoo3) {
560 pri_mask|=sec_mask;
561 sec_mask=pri_mask;
562 }
563
564 if(diff & pri_mask)
565 {
567 {
568 switch(Get_Primary_Gradient())
569 {
571 //Decal
572 PricOp = D3DTOP_SELECTARG1;
573 PricArg1 = D3DTA_TEXTURE;
574 PricArg2 = D3DTA_CURRENT;
575 PriaOp = D3DTOP_SELECTARG1;
576 PriaArg1 = D3DTA_TEXTURE;
577 PriaArg2 = D3DTA_CURRENT;
578 break;
579 default:
581 PricOp = D3DTOP_MODULATE;
582 PricArg1 = D3DTA_TEXTURE;
583 PricArg2 = D3DTA_DIFFUSE;
584 PriaOp = D3DTOP_MODULATE;
585 PriaArg1 = D3DTA_TEXTURE;
586 PriaArg2 = D3DTA_DIFFUSE;
587 break;
589 //Modulate Alpha
590 if(!(TextureOpCaps & D3DTEXOPCAPS_ADD))
591 PricOp = D3DTOP_MODULATE;
592 else
593 PricOp = D3DTOP_ADD;
594 PricArg1 = D3DTA_TEXTURE;
595 PricArg2 = D3DTA_DIFFUSE;
596 PriaOp = D3DTOP_MODULATE;
597 PriaArg1 = D3DTA_TEXTURE;
598 PriaArg2 = D3DTA_DIFFUSE;
599 break;
600
601 // Bump map is a hack currently as we only have two stages in use!
603 if(TextureOpCaps & D3DTEXOPCAPS_BUMPENVMAP)
604 {
605 PricOp=D3DTOP_BUMPENVMAP;
606 PricArg1=D3DTA_TEXTURE;
607 PricArg2=D3DTA_DIFFUSE;
608 PriaOp = D3DTOP_DISABLE;
609 PriaArg1 = D3DTA_TEXTURE;
610 PriaArg2 = D3DTA_CURRENT;
611 } else {
612 PricOp = D3DTOP_SELECTARG1;
613 PricArg1 = D3DTA_DIFFUSE;
614 PricArg2 = D3DTA_DIFFUSE;
615 PriaOp = D3DTOP_SELECTARG1;
616 PriaArg1 = D3DTA_DIFFUSE;
617 PriaArg2 = D3DTA_DIFFUSE;
618 }
619 break;
620
621 // Bump map is a hack currently as we only have two stages in use!
623 if(TextureOpCaps & D3DTEXOPCAPS_BUMPENVMAPLUMINANCE)
624 {
625 PricOp=D3DTOP_BUMPENVMAPLUMINANCE;
626 PricArg1=D3DTA_TEXTURE;
627 PricArg2=D3DTA_DIFFUSE;
628 PriaOp = D3DTOP_DISABLE;
629 PriaArg1 = D3DTA_TEXTURE;
630 PriaArg2 = D3DTA_CURRENT;
631 } else {
632 PricOp = D3DTOP_SELECTARG1;
633 PricArg1 = D3DTA_DIFFUSE;
634 PricArg2 = D3DTA_DIFFUSE;
635 PriaOp = D3DTOP_SELECTARG1;
636 PriaArg1 = D3DTA_DIFFUSE;
637 PriaArg2 = D3DTA_DIFFUSE;
638 }
639 break;
640
642 //Modulate Alpha
643 if(!(TextureOpCaps & D3DTOP_MODULATE2X))
644 PricOp = D3DTOP_MODULATE;
645 else
646 PricOp = D3DTOP_MODULATE2X;
647 PricArg1 = D3DTA_TEXTURE;
648 PricArg2 = D3DTA_DIFFUSE;
649 PriaOp = D3DTOP_MODULATE;
650 PriaArg1 = D3DTA_TEXTURE;
651 PriaArg2 = D3DTA_DIFFUSE;
652 break;
653 }
654
655 }
656 else
657 {
658 switch(Get_Primary_Gradient())
659 {
661 PricOp = D3DTOP_DISABLE;
662 PricArg1 = D3DTA_TEXTURE;
663 PricArg2 = D3DTA_CURRENT;
664 PriaOp = D3DTOP_DISABLE;
665 PriaArg1 = D3DTA_TEXTURE;
666 PriaArg2 = D3DTA_CURRENT;
667 break;
668 default:
670 PricOp = D3DTOP_SELECTARG2;
671 PricArg1 = D3DTA_TEXTURE;
672 PricArg2 = D3DTA_DIFFUSE;
673 PriaOp = D3DTOP_SELECTARG2;
674 PriaArg1 = D3DTA_TEXTURE;
675 PriaArg2 = D3DTA_DIFFUSE;
676 break;
678 PricOp = D3DTOP_SELECTARG2;
679 PricArg1 = D3DTA_TEXTURE;
680 PricArg2 = D3DTA_DIFFUSE;
681 PriaOp = D3DTOP_SELECTARG2;
682 PriaArg1 = D3DTA_TEXTURE;
683 PriaArg2 = D3DTA_DIFFUSE;
684 break;
685 }
686 }
687 }
688
689 if(diff & sec_mask)
690 {
692 {
694 {
695 default:
697 break;
698
700 if(TextureOpCaps & D3DTEXOPCAPS_SELECTARG1)
701 {
702 SeccOp = D3DTOP_SELECTARG1;
703 SeccArg1 = D3DTA_TEXTURE;
704 SeccArg2 = D3DTA_CURRENT;
705 }
706 else {
707 SNAPSHOT_SAY(("Warning: Using unsupported texture op: SELECTARG1\n"));
708 }
709 break;
710
712 if(TextureOpCaps & D3DTEXOPCAPS_MODULATE)
713 {
714 SeccOp = D3DTOP_MODULATE;
715 SeccArg1 = D3DTA_TEXTURE;
716 SeccArg2 = D3DTA_CURRENT;
717 }
718 else {
719 SNAPSHOT_SAY(("Warning: Using unsupported texture op: MODULATE\n"));
720 }
721 break;
722
724 if(TextureOpCaps & D3DTEXOPCAPS_ADDSMOOTH)
725 {
726 SeccOp = D3DTOP_ADDSMOOTH;
727 SeccArg1 = D3DTA_TEXTURE;
728 SeccArg2 = D3DTA_CURRENT;
729 } else if(TextureOpCaps & D3DTEXOPCAPS_ADD) {
730 SeccOp = D3DTOP_ADD;
731 SeccArg1 = D3DTA_TEXTURE;
732 SeccArg2 = D3DTA_CURRENT;
733 }
734 else {
735 SNAPSHOT_SAY(("Warning: Using unsupported texture op: ADDSMOOTH\n"));
736 }
737 break;
738
740 if(TextureOpCaps & D3DTEXOPCAPS_ADD)
741 {
742 SeccOp = D3DTOP_ADD;
743 SeccArg1 = D3DTA_TEXTURE;
744 SeccArg2 = D3DTA_CURRENT;
745 }
746 else {
747 SNAPSHOT_SAY(("Warning: Using unsupported texture op: ADD\n"));
748 }
749 break;
750
752 if(TextureOpCaps & D3DTEXOPCAPS_SUBTRACT)
753 {
754 SeccOp = D3DTOP_SUBTRACT;
755 SeccArg1 = D3DTA_TEXTURE;
756 SeccArg2 = D3DTA_CURRENT;
757 }
758 else {
759 SNAPSHOT_SAY(("Warning: Using unsupported texture op: SUBTRACT\n"));
760 }
761 break;
762
764 if(TextureOpCaps & D3DTEXOPCAPS_SUBTRACT)
765 {
766 SeccOp = D3DTOP_SUBTRACT;
767 SeccArg1 = D3DTA_CURRENT;
768 SeccArg2 = D3DTA_TEXTURE;
769 }
770 else {
771 SNAPSHOT_SAY(("Warning: Using unsupported texture op: SUBTRACT\n"));
772 }
773 break;
774
776 if(TextureOpCaps & D3DTEXOPCAPS_BLENDTEXTUREALPHA)
777 {
778 SeccOp = D3DTOP_BLENDTEXTUREALPHA;
779 SeccArg1 = D3DTA_TEXTURE;
780 SeccArg2 = D3DTA_CURRENT;
781 }
782 else {
783 SNAPSHOT_SAY(("Warning: Using unsupported texture op: BLENDTEXTUREALPHA\n"));
784 }
785 break;
786
788 if(TextureOpCaps & D3DTEXOPCAPS_BLENDCURRENTALPHA)
789 {
790 SeccOp = D3DTOP_BLENDCURRENTALPHA;
791 SeccArg1 = D3DTA_TEXTURE;
792 SeccArg2 = D3DTA_CURRENT;
793 }
794 else {
795 SNAPSHOT_SAY(("Warning: Using unsupported texture op: BLENDCURRENTALPHA\n"));
796 }
797 break;
798
800 if (TextureOpCaps & D3DTEXOPCAPS_ADDSIGNED) {
801 SeccOp = D3DTOP_ADDSIGNED;
802 SeccArg1 = D3DTA_TEXTURE;
803 SeccArg2 = D3DTA_CURRENT;
804 } else if (TextureOpCaps & D3DTEXOPCAPS_ADD) {
805 SeccOp = D3DTOP_ADD;
806 SeccArg1 = D3DTA_TEXTURE;
807 SeccArg2 = D3DTA_CURRENT;
808 } else {
809 SNAPSHOT_SAY(("Warning: Using unsupported texture op: ADDSIGNED\n"));
810 }
811 break;
812
814 if (TextureOpCaps & D3DTEXOPCAPS_ADDSIGNED2X) {
815 SeccOp = D3DTOP_ADDSIGNED2X;
816 SeccArg1 = D3DTA_TEXTURE;
817 SeccArg2 = D3DTA_CURRENT;
818 } else if (TextureOpCaps & D3DTEXOPCAPS_ADDSIGNED) {
819 SeccOp = D3DTOP_ADDSIGNED;
820 SeccArg1 = D3DTA_TEXTURE;
821 SeccArg2 = D3DTA_CURRENT;
822 } else if (TextureOpCaps & D3DTEXOPCAPS_ADD) {
823 SeccOp = D3DTOP_ADD;
824 SeccArg1 = D3DTA_TEXTURE;
825 SeccArg2 = D3DTA_CURRENT;
826 } else {
827 SNAPSHOT_SAY(("Warning: Using unsupported texture op: ADDSIGNED2X\n"));
828 }
829 break;
830
832 if(TextureOpCaps & D3DTEXOPCAPS_MODULATE2X) {
833 SeccOp = D3DTOP_MODULATE2X;
834 SeccArg1 = D3DTA_TEXTURE;
835 SeccArg2 = D3DTA_CURRENT;
836 } else if(TextureOpCaps & D3DTEXOPCAPS_MODULATE) {
837 SeccOp = D3DTOP_MODULATE;
838 SeccArg1 = D3DTA_TEXTURE;
839 SeccArg2 = D3DTA_CURRENT;
840 }
841 else {
842 SNAPSHOT_SAY(("Warning: Using unsupported texture op: MODULATE2X\n"));
843 }
844 break;
845
847 if (DX8Wrapper::Get_Current_Caps()->Support_ModAlphaAddClr()) {
848 SeccOp = D3DTOP_MODULATEALPHA_ADDCOLOR;
849 SeccArg1 = D3DTA_CURRENT;
850 SeccArg2 = D3DTA_TEXTURE;
851 } else if (TextureOpCaps & D3DTEXOPCAPS_ADD) {
852 SeccOp = D3DTOP_ADD;
853 SeccArg1 = D3DTA_TEXTURE;
854 SeccArg2 = D3DTA_CURRENT;
855 } else {
856 SNAPSHOT_SAY(("Warning: Using unsupported texture op: MODULATEALPHA_ADDCOLOR\n"));
857 }
858 break;
859 } // color operations
860
862 {
863 default:
865 break;
866
868 if(TextureOpCaps & D3DTEXOPCAPS_SELECTARG1)
869 {
870 SecaOp = D3DTOP_SELECTARG1;
871 SecaArg1 = D3DTA_TEXTURE;
872 SecaArg2 = D3DTA_CURRENT;
873 }
874 else {
875 SNAPSHOT_SAY(("Warning: Using unsupported texture op: SELECTARG1\n"));
876 }
877 break;
878
880 if(TextureOpCaps & D3DTEXOPCAPS_MODULATE)
881 {
882 SecaOp = D3DTOP_MODULATE;
883 SecaArg1 = D3DTA_TEXTURE;
884 SecaArg2 = D3DTA_CURRENT;
885 }
886 else {
887 SNAPSHOT_SAY(("Warning: Using unsupported texture op: MODULATE\n"));
888 }
889 break;
890
892 if(TextureOpCaps & D3DTEXOPCAPS_ADDSMOOTH)
893 {
894 SecaOp = D3DTOP_ADDSMOOTH;
895 SecaArg1 = D3DTA_TEXTURE;
896 SecaArg2 = D3DTA_CURRENT;
897 }
898 else {
899 SNAPSHOT_SAY(("Warning: Using unsupported texture op: ADDSMOOTH\n"));
900 }
901 break;
902 } // alpha operations
903
904 // if color is enabled and alpha is disabled set to pass alpha through
905 if ((SeccOp!=D3DTOP_DISABLE) && (SecaOp==D3DTOP_DISABLE)) {
906 SecaOp = D3DTOP_SELECTARG2;
907 SecaArg2 = D3DTA_CURRENT;
908 } else if ((SeccOp==D3DTOP_DISABLE) && (SecaOp!=D3DTOP_DISABLE)) {
909 SeccOp = D3DTOP_SELECTARG2;
910 SeccArg2 = D3DTA_CURRENT;
911 }
912 } // texturing enabled
913 } // if diff sec_mask
914
915 bool kill_stage_2=false;
916
917 // Apply the stage settings
918 if (diff & pri_mask) {
919 // for voodoo3 supported blend modes, the stage 0 color and alpha are both diffuse
920 // or both not, so we can check for color diffuse only
921 if ( voodoo3 && (PricArg2==D3DTA_DIFFUSE) &&
922 ( (SecaOp!=D3DTOP_DISABLE) || (SeccOp!=D3DTOP_DISABLE) )
923 ) {
924 // Special Voodoo3 code
925 // If stage 0 has a diffuse input
926 // and stage 1 has an input put the diffuse in stage 2
927
928 DWORD tex_arg=D3DTA_CURRENT;
930 tex_arg=D3DTA_TEXTURE;
931 }
932
933 // this is for the bad case of using
934 // stage 0 for diffuse only
935 if ((PricOp==D3DTOP_SELECTARG1)&&(PricArg1==D3DTA_DIFFUSE)) {
936 WWDEBUG_SAY(("Wasted Stage 0 in shader-vertex diffuse only"));
937 // set stage 0 to disable
938 DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_COLOROP,D3DTOP_DISABLE);
939 DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_ALPHAOP,D3DTOP_DISABLE);
940 // set stage 1 to accept diffuse
941 if (SeccArg2==D3DTA_CURRENT) SeccArg2=D3DTA_DIFFUSE;
942 if (SecaArg2==D3DTA_CURRENT) SecaArg2=D3DTA_DIFFUSE;
943 // and nuke stage 2
944 kill_stage_2=true;
945 } else {
946 // set stage 0 to pass through what it needs
947 DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
948 DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_COLORARG1,tex_arg);
949 DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);
950 DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_ALPHAARG1,tex_arg);
951
952 // set stage 2 to do the diffuse op
953 // bypass the wrapper since it only supports 2 texture stages
954 DX8CALL(SetTextureStageState(2,D3DTSS_COLOROP,PricOp));
955 DX8CALL(SetTextureStageState(2,D3DTSS_COLORARG1,D3DTA_CURRENT));
956 DX8CALL(SetTextureStageState(2,D3DTSS_COLORARG2,D3DTA_DIFFUSE));
957 DX8CALL(SetTextureStageState(2,D3DTSS_ALPHAOP,PriaOp));
958 DX8CALL(SetTextureStageState(2,D3DTSS_ALPHAARG1,D3DTA_CURRENT));
959 DX8CALL(SetTextureStageState(2,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE));
960 DX8CALL(SetTextureStageState(2,D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_PASSTHRU));
961 DX8CALL(SetTexture(2,0));
962 kill_stage_2=false;
963 ShaderDirty=true;
964 }
965 } else {
966
967#pragma message("(gth) Generals added a feature here WW3D::Is_Coloring_Enabled() which needs to be merged properly")
968#if 0
970 {
971 cArg2=aArg2=D3DTA_TFACTOR;
972 cOp=aOp=D3DTOP_SELECTARG2;
973 }
974#endif
975 DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_COLOROP,PricOp);
976 DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_COLORARG1,PricArg1);
977 DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_COLORARG2,PricArg2);
978 DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_ALPHAOP,PriaOp);
979 DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_ALPHAARG1,PriaArg1);
980 DX8Wrapper::Set_DX8_Texture_Stage_State(0,D3DTSS_ALPHAARG2,PriaArg2);
981 kill_stage_2=true;
982 }
984 }
985
986 if (diff & sec_mask) {
987 DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_COLOROP,SeccOp);
988 DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_COLORARG1,SeccArg1);
989 DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_COLORARG2,SeccArg2);
990 DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_ALPHAOP,SecaOp);
991 DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_ALPHAARG1,SecaArg1);
992 DX8Wrapper::Set_DX8_Texture_Stage_State(1,D3DTSS_ALPHAARG2,SecaArg2);
996 }
997
998 // Make sure to disable stage 2 for voodoos since we don't have state tracking for
999 // stage 2
1000 // bypass the wrapper since it only supports 2 texture stages
1001 if (voodoo3 && kill_stage_2) {
1002 if ((SeccOp!=D3DTOP_DISABLE)&&(SecaOp!=D3DTOP_DISABLE)) {
1003 DX8CALL(SetTextureStageState(2,D3DTSS_COLOROP,D3DTOP_SELECTARG1));
1004 DX8CALL(SetTextureStageState(2,D3DTSS_COLORARG1,D3DTA_CURRENT));
1005 DX8CALL(SetTextureStageState(2,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1));
1006 DX8CALL(SetTextureStageState(2,D3DTSS_ALPHAARG1,D3DTA_CURRENT));
1007 } else {
1008 DX8CALL(SetTextureStageState(2,D3DTSS_COLOROP,D3DTOP_DISABLE));
1009 DX8CALL(SetTextureStageState(2,D3DTSS_ALPHAOP,D3DTOP_DISABLE));
1010 }
1011 DX8CALL(SetTextureStageState(2,D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_PASSTHRU));
1012 DX8CALL(SetTexture(2,0));
1013 }
1014
1015 if(!diff)
1016 return;
1017
1019
1020 // DEPTH COMPARE FUNCTION
1021 DX8Wrapper::Set_DX8_Render_State(D3DRS_ZFUNC,D3DCMPFUNC(int(Get_Depth_Compare())+1));
1022
1023 // DEPTH MASK
1025
1026 // DITHERING
1027// DX8Wrapper::Set_DX8_Render_State(D3DRS_DITHERENABLE,BOOL(Get_Dither_Mask()));
1028
1029 // CULLMODE
1030 DX8Wrapper::Set_DX8_Render_State(D3DRS_CULLMODE,Get_Cull_Mode() ? _PolygonCullMode : D3DCULL_NONE);
1031
1032 // NPATCHES
1034 float level=1.0f;
1035 if (Get_NPatch_Enable()) level=float(WW3D::Get_NPatches_Level());
1036 DX8Wrapper::Set_DX8_Render_State(D3DRS_PATCHSEGMENTS,*((DWORD*)&level));
1037 }
1038
1039 // Enable/disable alpha test
1040 DX8Wrapper::Set_DX8_Render_State(D3DRS_ALPHATESTENABLE,BOOL(Get_Alpha_Test()));
1041
1042 // Enable/disable stencil test
1043 // Not supported yet
1044}
1045
1046
1047/***********************************************************************************************
1048 * ShaderClass::Invert_Backface_Culling -- Globally invert the sense of all backface culling *
1049 * *
1050 * INPUT: *
1051 * *
1052 * OUTPUT: *
1053 * *
1054 * WARNINGS: *
1055 * *
1056 * HISTORY: *
1057 * 4/24/2001 gth : Created. *
1058 *=============================================================================================*/
1060{
1061 if (onoff == true) {
1062 _PolygonCullMode = D3DCULL_CCW;
1063 } else {
1064 _PolygonCullMode = D3DCULL_CW;
1065 }
1066 Invalidate();
1067}
1068
1069
1070/***********************************************************************************************
1071 * ShaderClass::Get_SS_Category -- Helper function for static sort system *
1072 * *
1073 * *
1074 * *
1075 * *
1076 * INPUT: *
1077 * *
1078 * OUTPUT: *
1079 * *
1080 * WARNINGS: *
1081 * *
1082 * HISTORY: *
1083 * 7/13/2001 hy : Created. *
1084 *=============================================================================================*/
1086{
1087 // category: Opaque
1089 return SSCAT_OPAQUE;
1090 // category: Alpha Test
1095 return SSCAT_ALPHA_TEST;
1096 }
1097 // category: Additive
1099 return SSCAT_ADDITIVE;
1100 // category: Screen
1102 return SSCAT_SCREEN;
1103 // category: Everything else
1104 return SSCAT_OTHER;
1105}
1106
1107
1108/***********************************************************************************************
1109 * ShaderClass::Guess_Sort_Level -- Guess the static sort level *
1110 * *
1111 * *
1112 * *
1113 * *
1114 * INPUT: *
1115 * *
1116 * OUTPUT: *
1117 * *
1118 * WARNINGS: *
1119 * *
1120 * HISTORY: *
1121 * 8/27/2001 hy : Created. *
1122 *=============================================================================================*/
1124{
1125 int sort_level;
1127
1128 switch (scat)
1129 {
1132 sort_level=SORT_LEVEL_NONE;
1133 break;
1135 sort_level=SORT_LEVEL_BIN2;
1136 break;
1138 sort_level=SORT_LEVEL_BIN3;
1139 break;
1140 default:
1141 sort_level=SORT_LEVEL_BIN1;
1142 break;
1143 }
1144 return sort_level;
1145}
1146
1147/***********************************************************************************************
1148 * ShaderClass::Is_Backface_Culling_Inverted -- Is backface culling inverted? *
1149 * *
1150 * INPUT: *
1151 * *
1152 * OUTPUT: *
1153 * *
1154 * WARNINGS: *
1155 * *
1156 * HISTORY: *
1157 * 4/24/2001 gth : Created. *
1158 *=============================================================================================*/
1160{
1161 return (_PolygonCullMode == D3DCULL_CCW);
1162}
1163
1165{
1166 str="";
1167 switch (Get_Depth_Compare()) {
1168 case PASS_NEVER: str+="DEPTH_COMPARE:PASS_NEVER | "; break;
1169 case PASS_LESS: str+="DEPTH_COMPARE:PASS_LESS | "; break;
1170 case PASS_EQUAL: str+="DEPTH_COMPARE:PASS_EQUAL | "; break;
1171 case PASS_LEQUAL: str+="DEPTH_COMPARE:PASS_LEQUAL | "; break;
1172 case PASS_GREATER: str+="DEPTH_COMPARE:PASS_GREATER | "; break;
1173 case PASS_NOTEQUAL: str+="DEPTH_COMPARE:PASS_NOTEQUAL | "; break;
1174 case PASS_GEQUAL: str+="DEPTH_COMPARE:PASS_GEQUAL | "; break;
1175 case PASS_ALWAYS: str+="DEPTH_COMPARE:PASS_ALWAYS | "; break;
1176 }
1177
1178 switch (Get_Depth_Mask()) {
1179 case DEPTH_WRITE_DISABLE: str+="DEPTH_WRITE_DISABLE | "; break;
1180 case DEPTH_WRITE_ENABLE: str+="DEPTH_WRITE_ENABLE | "; break;
1181 }
1182
1183 switch (Get_Color_Mask()) {
1184 case COLOR_WRITE_DISABLE: str+="COLOR_WRITE_DISABLE | "; break;
1185 case COLOR_WRITE_ENABLE: str+="COLOR_WRITE_ENABLE | "; break;
1186 }
1187
1188 switch (Get_Dst_Blend_Func()) {
1189 case DSTBLEND_ZERO: str+="DSTBLEND_ZERO | "; break;
1190 case DSTBLEND_ONE: str+="DSTBLEND_ONE | "; break;
1191 case DSTBLEND_SRC_COLOR: str+="DSTBLEND_SRC_COLOR | "; break;
1192 case DSTBLEND_ONE_MINUS_SRC_COLOR: str+="DSTBLEND_ONE_MINUS_SRC_COLOR | "; break;
1193 case DSTBLEND_SRC_ALPHA: str+="DSTBLEND_SRC_ALPHA | "; break;
1194 case DSTBLEND_ONE_MINUS_SRC_ALPHA: str+="DSTBLEND_ONE_MINUS_SRC_ALPHA | "; break;
1195 }
1196
1197 switch (Get_Fog_Func()) {
1198 case FOG_DISABLE: str+="FOG_DISABLE | "; break;
1199 case FOG_ENABLE: str+="FOG_ENABLE | "; break;
1200 case FOG_SCALE_FRAGMENT: str+="FOG_SCALE_FRAGMENT | "; break;
1201 case FOG_WHITE: str+="FOG_WHITE | "; break;
1202 }
1203
1204 switch (Get_Primary_Gradient()) {
1205 case GRADIENT_DISABLE: str+="GRADIENT_DISABLE | "; break;
1206 case GRADIENT_MODULATE: str+="GRADIENT_MODULATE | "; break;
1207 case GRADIENT_ADD: str+="GRADIENT_ADD | "; break;
1208 case GRADIENT_BUMPENVMAP: str+="GRADIENT_BUMPENVMAP | "; break;
1209 case GRADIENT_BUMPENVMAPLUMINANCE: str+="GRADIENT_BUMPENVMAPLUMINANCE | "; break;
1210 case GRADIENT_MODULATE2X: str+="GRADIENT_MODULATE2X | "; break;
1211 }
1212
1213 switch (Get_Secondary_Gradient()) {
1214 case SECONDARY_GRADIENT_DISABLE: str+="SECONDARY_GRADIENT_DISABLE | "; break;
1215 case SECONDARY_GRADIENT_ENABLE: str+="SECONDARY_GRADIENT_ENABLE | "; break;
1216 }
1217
1218 switch (Get_Src_Blend_Func()) {
1219 case SRCBLEND_ZERO: str+="SRCBLEND_ZERO | "; break;
1220 case SRCBLEND_ONE: str+="SRCBLEND_ONE | "; break;
1221 case SRCBLEND_SRC_ALPHA: str+="SRCBLEND_SRC_ALPHA | "; break;
1222 case SRCBLEND_ONE_MINUS_SRC_ALPHA: str+="SRCBLEND_ONE_MINUS_SRC_ALPHA | "; break;
1223 }
1224
1225 switch (Get_Texturing()) {
1226 case TEXTURING_DISABLE: str+="TEXTURING_DISABLE | "; break;
1227 case TEXTURING_ENABLE: str+="TEXTURING_ENABLE | "; break;
1228 }
1229
1230 switch (Get_NPatch_Enable()) {
1231 case NPATCH_DISABLE: str+="NPATCH_DISABLE | "; break;
1232 case NPATCH_ENABLE: str+="NPATCH_ENABLE | "; break;
1233 }
1234
1235 switch (Get_Alpha_Test()) {
1236 case ALPHATEST_DISABLE: str+="ALPHATEST_DISABLE | "; break;
1237 case ALPHATEST_ENABLE: str+="ALPHATEST_ENABLE | "; break;
1238 }
1239
1240 switch (Get_Cull_Mode()) {
1241 case CULL_MODE_DISABLE: str+="CULL_MODE_DISABLE | "; break;
1242 case CULL_MODE_ENABLE: str+="CULL_MODE_ENABLE | "; break;
1243 }
1244
1245 switch (Get_Post_Detail_Color_Func()) {
1246 case DETAILCOLOR_DISABLE: str+="DETAILCOLOR_DISABLE"; break;
1247 case DETAILCOLOR_DETAIL: str+="DETAILCOLOR_DETAIL"; break;
1248 case DETAILCOLOR_SCALE: str+="DETAILCOLOR_SCALE"; break;
1249 case DETAILCOLOR_INVSCALE: str+="DETAILCOLOR_INVSCALE"; break;
1250 case DETAILCOLOR_ADD: str+="DETAILCOLOR_ADD"; break;
1251 case DETAILCOLOR_SUB: str+="DETAILCOLOR_SUB"; break;
1252 case DETAILCOLOR_SUBR: str+="DETAILCOLOR_SUBR"; break;
1253 case DETAILCOLOR_BLEND: str+="DETAILCOLOR_BLEND"; break;
1254 case DETAILCOLOR_DETAILBLEND: str+="DETAILCOLOR_DETAILBLEND"; break;
1255 case DETAILCOLOR_ADDSIGNED: str+="DETAILCOLOR_ADDSIGNED"; break;
1256 case DETAILCOLOR_ADDSIGNED2X: str+="DETAILCOLOR_ADDSIGNED2X"; break;
1257 case DETAILCOLOR_SCALE2X: str+="DETAILCOLOR_SCALE2X"; break;
1258 case DETAILCOLOR_MODALPHAADDCOLOR: str+="DETAILCOLOR_MODALPHAADDCOLOR"; break;
1259 }
1260 return str;
1261}
1262
#define TRUE
Definition BaseType.h:109
#define FALSE
Definition BaseType.h:113
#define SORT_LEVEL_BIN1
Definition w3d_file.h:1197
#define SORT_LEVEL_NONE
Definition w3d_file.h:1195
#define SORT_LEVEL_BIN2
Definition w3d_file.h:1198
#define SORT_LEVEL_BIN3
Definition w3d_file.h:1199
#define W3DMATERIAL_USE_ALPHA
unsigned long DWORD
Definition bittype.h:57
unsigned long ULONG
Definition bittype.h:64
#define SC_ALPHA
#define BOOL
Definition Wnd_File.h:57
bool useAlpha
Definition shader.cpp:375
D3DBLEND func
Definition shader.cpp:374
Blend(D3DBLEND f, bool ab)
Definition shader.cpp:368
D3DCAPS8 const & Get_DX8_Caps() const
Definition dx8caps.h:251
@ VENDOR_3DFX
Definition dx8caps.h:69
@ DEVICE_3DFX_VOODOO_3
Definition dx8caps.h:167
unsigned Get_Vendor() const
Definition dx8caps.h:256
static const DX8Caps * Get_Current_Caps()
Definition dx8wrapper.h:536
static D3DCOLOR Get_Fog_Color()
Definition dx8wrapper.h:450
static bool Get_Fog_Enable()
Definition dx8wrapper.h:449
static void Set_DX8_Texture_Stage_State(unsigned stage, D3DTEXTURESTAGESTATETYPE state, unsigned value)
Definition dx8wrapper.h:899
static void Set_DX8_Render_State(D3DRENDERSTATETYPE state, unsigned value)
Definition dx8wrapper.h:874
const StringClass & Get_Description(StringClass &str) const
Definition shader.cpp:1164
static ShaderClass _PresetOpaqueSpriteShader
Definition shader.h:385
static ShaderClass _PresetAdditiveSpriteShader
Definition shader.h:398
unsigned int ShaderBits
Definition shader.h:461
@ GRADIENT_BUMPENVMAPLUMINANCE
Definition shader.h:196
@ GRADIENT_DISABLE
Definition shader.h:192
@ GRADIENT_BUMPENVMAP
Definition shader.h:195
@ GRADIENT_MODULATE
Definition shader.h:193
@ GRADIENT_ADD
Definition shader.h:194
@ GRADIENT_MODULATE2X
Definition shader.h:197
static ShaderClass _PresetAdditive2DShader
Definition shader.h:389
static ShaderClass _PresetATestBlendSpriteShader
Definition shader.h:436
static ShaderClass _PresetBumpenvmapShader
Definition shader.h:371
static ShaderClass _PresetOpaqueShader
Definition shader.h:365
DepthCompareType Get_Depth_Compare(void) const
Definition shader.h:308
@ DETAILCOLOR_ADDSIGNED2X
Definition shader.h:149
@ DETAILCOLOR_SUB
Definition shader.h:144
@ DETAILCOLOR_DISABLE
Definition shader.h:139
@ DETAILCOLOR_DETAIL
Definition shader.h:140
@ DETAILCOLOR_BLEND
Definition shader.h:146
@ DETAILCOLOR_SCALE
Definition shader.h:141
@ DETAILCOLOR_ADDSIGNED
Definition shader.h:148
@ DETAILCOLOR_SCALE2X
Definition shader.h:150
@ DETAILCOLOR_DETAILBLEND
Definition shader.h:147
@ DETAILCOLOR_SUBR
Definition shader.h:145
@ DETAILCOLOR_INVSCALE
Definition shader.h:142
@ DETAILCOLOR_ADD
Definition shader.h:143
@ DETAILCOLOR_MODALPHAADDCOLOR
Definition shader.h:151
static ShaderClass _PresetAlphaSpriteShader
Definition shader.h:403
static ShaderClass _PresetATestBlend2DShader
Definition shader.h:431
static ShaderClass _PresetATestSpriteShader
Definition shader.h:426
void Set_Src_Blend_Func(SrcBlendFuncType x)
Definition shader.h:334
static void Invalidate()
Definition shader.h:346
@ MASK_DSTBLEND
Definition shader.h:238
@ MASK_NPATCHENABLE
Definition shader.h:244
@ MASK_TEXTURING
Definition shader.h:243
@ MASK_ALPHATEST
Definition shader.h:245
@ MASK_COLORMASK
Definition shader.h:237
@ MASK_POSTDETAILCOLORFUNC
Definition shader.h:247
@ MASK_SRCBLEND
Definition shader.h:242
@ MASK_PRIGRADIENT
Definition shader.h:240
@ MASK_POSTDETAILALPHAFUNC
Definition shader.h:248
@ PASS_LEQUAL
Definition shader.h:106
@ PASS_NOTEQUAL
Definition shader.h:108
@ PASS_GEQUAL
Definition shader.h:109
@ PASS_ALWAYS
Definition shader.h:110
@ PASS_GREATER
Definition shader.h:107
static bool Is_Backface_Culling_Inverted(void)
Definition shader.cpp:1159
static ShaderClass _PresetATest2DShader
Definition shader.h:421
static ShaderClass _PresetAlpha2DShader
Definition shader.h:393
static ShaderClass _PresetAlphaSolidShader
Definition shader.h:417
FogFuncType Get_Fog_Func(void) const
Definition shader.h:316
DetailColorFuncType Get_Post_Detail_Color_Func(void) const
Definition shader.h:312
@ FOG_DISABLE
Definition shader.h:183
@ FOG_SCALE_FRAGMENT
Definition shader.h:185
@ NPATCH_ENABLE
Definition shader.h:166
@ NPATCH_DISABLE
Definition shader.h:165
static ShaderClass _PresetMultiplicativeSpriteShader
Definition shader.h:454
void Set_Depth_Mask(DepthMaskType x)
Definition shader.h:324
@ COLOR_WRITE_DISABLE
Definition shader.h:123
@ COLOR_WRITE_ENABLE
Definition shader.h:124
@ DETAILALPHA_SCALE
Definition shader.h:132
@ DETAILALPHA_INVSCALE
Definition shader.h:133
@ DETAILALPHA_DETAIL
Definition shader.h:131
@ DETAILALPHA_DISABLE
Definition shader.h:130
static ShaderClass _PresetMultiplicative2DShader
Definition shader.h:449
static ShaderClass _PresetScreen2DShader
Definition shader.h:440
DetailAlphaFuncType Get_Post_Detail_Alpha_Func(void) const
Definition shader.h:311
StaticSortCategoryType
Definition shader.h:225
@ SSCAT_OPAQUE
Definition shader.h:226
@ SSCAT_ALPHA_TEST
Definition shader.h:227
@ SSCAT_ADDITIVE
Definition shader.h:228
@ SSCAT_SCREEN
Definition shader.h:229
@ SSCAT_OTHER
Definition shader.h:230
TexturingType Get_Texturing(void) const
Definition shader.h:320
void Init_From_Material3(const W3dMaterial3Struct &mat3)
Definition shader.cpp:254
@ TEXTURING_DISABLE
Definition shader.h:219
@ TEXTURING_ENABLE
Definition shader.h:220
@ CULL_MODE_DISABLE
Definition shader.h:158
@ CULL_MODE_ENABLE
Definition shader.h:159
NPatchEnableType Get_NPatch_Enable(void) const
Definition shader.h:321
SecGradientType Get_Secondary_Gradient(void) const
Definition shader.h:318
void Set_Fog_Func(FogFuncType x)
Definition shader.h:331
DepthMaskType Get_Depth_Mask(void) const
Definition shader.h:309
CullModeType Get_Cull_Mode(void) const
Definition shader.h:314
static ShaderClass _PresetAdditiveSolidShader
Definition shader.h:412
static ShaderClass _PresetOpaque2DShader
Definition shader.h:381
PriGradientType Get_Primary_Gradient(void) const
Definition shader.h:317
static ShaderClass _PresetAlphaShader
Definition shader.h:374
static void Invert_Backface_Culling(bool onoff)
Definition shader.cpp:1059
static ShaderClass _PresetAdditiveShader
Definition shader.h:368
@ DEPTH_WRITE_ENABLE
Definition shader.h:117
@ DEPTH_WRITE_DISABLE
Definition shader.h:116
SrcBlendFuncType Get_Src_Blend_Func(void) const
Definition shader.h:319
ColorMaskType Get_Color_Mask(void) const
Definition shader.h:310
void Set_Dst_Blend_Func(DstBlendFuncType x)
Definition shader.h:330
@ SECONDARY_GRADIENT_ENABLE
Definition shader.h:204
@ SECONDARY_GRADIENT_DISABLE
Definition shader.h:203
void Enable_Fog(const char *source)
Definition shader.cpp:280
static unsigned long CurrentShader
Definition shader.h:464
StaticSortCategoryType Get_SS_Category(void) const
Definition shader.cpp:1085
DstBlendFuncType Get_Dst_Blend_Func(void) const
Definition shader.h:315
void Report_Unable_To_Fog(const char *source)
Definition shader.cpp:342
@ SRCBLEND_ZERO
Definition shader.h:210
@ SRCBLEND_ONE_MINUS_SRC_ALPHA
Definition shader.h:213
@ SRCBLEND_SRC_ALPHA
Definition shader.h:212
@ SRCBLEND_ONE
Definition shader.h:211
@ SRCBLEND_MAX
Definition shader.h:214
static ShaderClass _PresetScreenSpriteShader
Definition shader.h:445
int Guess_Sort_Level(void) const
Definition shader.cpp:1123
AlphaTestType Get_Alpha_Test(void) const
Definition shader.h:313
static bool ShaderDirty
Definition shader.h:463
@ ALPHATEST_DISABLE
Definition shader.h:96
@ ALPHATEST_ENABLE
Definition shader.h:97
static ShaderClass _PresetMultiplicativeShader
Definition shader.h:377
@ DSTBLEND_ZERO
Definition shader.h:172
@ DSTBLEND_MAX
Definition shader.h:178
@ DSTBLEND_ONE_MINUS_SRC_COLOR
Definition shader.h:175
@ DSTBLEND_ONE_MINUS_SRC_ALPHA
Definition shader.h:177
@ DSTBLEND_SRC_COLOR
Definition shader.h:174
@ DSTBLEND_ONE
Definition shader.h:173
@ DSTBLEND_SRC_ALPHA
Definition shader.h:176
static ShaderClass _PresetOpaqueSolidShader
Definition shader.h:407
static unsigned Get_NPatches_Level()
Definition ww3d.h:254
static bool Is_Coloring_Enabled()
Definition ww3d.h:258
#define DX8CALL(x)
Definition dx8wrapper.h:138
#define SC_ALPHA_SOLID
Definition shader.cpp:166
#define SC_ADDITIVE_SOLID
Definition shader.cpp:157
#define SC_ATEST_2D
Definition shader.cpp:174
#define SC_OP_SPRITE
Definition shader.cpp:105
#define SC_ALPHA_SPRITE
Definition shader.cpp:140
#define SC_MUL_2D
Definition shader.cpp:226
#define SC_OP_2D
Definition shader.cpp:97
#define SC_ATEST_SPRITE
Definition shader.cpp:183
unsigned long _PolygonCullMode
Definition shader.cpp:52
#define SC_ADDITIVE
Definition shader.cpp:68
#define SC_ATESTBLEND_SPRITE
Definition shader.cpp:201
const Blend dstBlendLUT[ShaderClass::DSTBLEND_MAX]
Definition shader.cpp:386
#define SC_ATESTBLEND_2D
Definition shader.cpp:192
#define SC_MULTIPLICATIVE
Definition shader.cpp:89
#define SC_ALPHA_2D
Definition shader.cpp:122
#define SC_SCREEN_SPRITE
Definition shader.cpp:218
#define SC_ADD_SPRITE
Definition shader.cpp:131
#define SC_MUL_SPRITE
Definition shader.cpp:235
#define SC_OPAQUE_SOLID
Definition shader.cpp:148
const Blend srcBlendLUT[ShaderClass::SRCBLEND_MAX]
Definition shader.cpp:378
#define SC_SCREEN_2D
Definition shader.cpp:209
#define SC_OPAQUE
Definition shader.cpp:61
#define SC_ADD_2D
Definition shader.cpp:114
#define SC_BUMPENVMAP
Definition shader.cpp:75
#define SNAPSHOT_SAY(x)
Definition ww3d.h:68
#define WWDEBUG_SAY(x)
Definition wwdebug.h:114