Richard Boegli's CnC_Generals_Zero_Hour Fork WIP
This is documentation of Richard Boegil's Zero Hour Fork
 
Loading...
Searching...
No Matches
vertmaterial.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/vertmaterial.cpp $*
26 * *
27 * Author:: Greg Hjelstrom *
28 * *
29 * $Modtime:: 8/22/01 11:06a $*
30 * *
31 * $Revision:: 42 $*
32 * *
33 *---------------------------------------------------------------------------------------------*
34 * Functions: *
35 * Init -- init code *
36 * Shutdown -- shutdown code *
37 * Get_Preset -- retrieve presets *
38 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
39
40#include "vertmaterial.h"
41#include "realcrc.h"
42#include "wwdebug.h"
43#include "w3d_util.h"
44#include "chunkio.h"
45#include "w3derr.h"
46#include "ini.h"
47#include "xstraw.h"
48#include "dx8wrapper.h"
49
50#include <stdio.h>
51#include <string.h>
52
53static unsigned int unique=1;
54
55VertexMaterialClass* VertexMaterialClass::Presets[VertexMaterialClass::PRESET_COUNT];
56
57#ifdef DYN_MAT8
58class DynD3DMATERIAL8 : public W3DMPO
59{
61public:
62 D3DMATERIAL8 Mat;
63};
64#define Material (&MaterialDyn->Mat)
65#define SRCMATPTR(src) (&(src)->MaterialDyn->Mat)
66#else
67#define Material (MaterialOld)
68#define SRCMATPTR(src) ((src)->MaterialOld)
69#endif
70
71/*
72** VertexMaterialClass Implementation
73*/
75#ifdef DYN_MAT8
76 MaterialDyn(NULL),
77#else
78 MaterialOld(NULL),
79#endif
80 Flags(0),
81 AmbientColorSource(D3DMCS_MATERIAL),
82 EmissiveColorSource(D3DMCS_MATERIAL),
83 DiffuseColorSource(D3DMCS_MATERIAL),
84 UseLighting(false),
85 UniqueID(0),
86 CRCDirty(true)
87{
88 int i;
89
90 for (i=0; i<MeshBuilderClass::MAX_STAGES; i++)
91 {
92 Mapper[i]=NULL;
93 UVSource[i] = i;
94 }
95
96#ifdef DYN_MAT8
97 MaterialDyn=W3DNEW DynD3DMATERIAL8;
98#else
99 MaterialOld=W3DNEW D3DMATERIAL8;
100#endif
101 memset(Material,0,sizeof(D3DMATERIAL8));
102 Set_Ambient(1.0f,1.0f,1.0f);
103 Set_Diffuse(1.0f,1.0f,1.0f);
104
105 Set_Opacity(1.0f);
106}
107
109#ifdef DYN_MAT8
110 MaterialDyn(NULL),
111#else
112 MaterialOld(NULL),
113#endif
114 Flags(src.Flags),
115 AmbientColorSource(src.AmbientColorSource),
116 EmissiveColorSource(src.EmissiveColorSource),
117 DiffuseColorSource(src.DiffuseColorSource),
118 UseLighting(src.UseLighting),
119 Name(src.Name),
120 UniqueID(src.UniqueID),
121 CRCDirty(true)
122{
123 int i;
124 for (i=0; i<MeshBuilderClass::MAX_STAGES; i++)
125 {
126 Mapper[i]=NULL;
127 if (src.Mapper[i])
128 {
129 TextureMapperClass *mapper=src.Mapper[i]->Clone();
130 Set_Mapper(mapper,i);
131 mapper->Release_Ref();
132 }
133
134 UVSource[i] = src.UVSource[i];
135 }
136
137#ifdef DYN_MAT8
138 MaterialDyn=W3DNEW DynD3DMATERIAL8;
139#else
140 MaterialOld=W3DNEW D3DMATERIAL8;
141#endif
142 memcpy(Material, SRCMATPTR(&src), sizeof(D3DMATERIAL8));
143}
144
146{
147 CRCDirty=true;
148 UniqueID=unique;
149 unique++;
150}
151
153{
154 int i;
155
156 for (i=0; i<MeshBuilderClass::MAX_STAGES; i++)
157 {
158 if (Mapper[i])
159 {
160 REF_PTR_RELEASE(Mapper[i]);
161 Mapper[i]=NULL;
162 }
163 }
164
165#ifdef DYN_MAT8
166 delete MaterialDyn;
167#else
168 delete MaterialOld;
169#endif
170}
171
173{
174
175 if (this != &src) {
176 Name=src.Name;
177 Flags = src.Flags;
178 AmbientColorSource = src.AmbientColorSource;
179 EmissiveColorSource = src.EmissiveColorSource;
180 DiffuseColorSource = src.DiffuseColorSource;
181 UseLighting=src.UseLighting;
182 UniqueID=src.UniqueID;
183 CRCDirty=src.CRCDirty;
184 int stage;
185 for (stage=0;stage<MeshBuilderClass::MAX_STAGES;++stage) {
186 if (Mapper[stage] != NULL) {
187 Mapper[stage]->Release_Ref();
188 Mapper[stage] = NULL;
189 }
190 }
191 for (stage=0;stage<MeshBuilderClass::MAX_STAGES;++stage) {
192 if (src.Mapper[stage]) {
193 TextureMapperClass *mapper = src.Mapper[stage]->Clone();
194 Set_Mapper(mapper,stage);
195 mapper->Release_Ref();
196 }
197 UVSource[stage] = src.UVSource[stage];
198 }
199
200 *Material = *SRCMATPTR(&src);
201 }
202 return *this;
203}
204
205unsigned long VertexMaterialClass::Compute_CRC(void) const
206{
207 unsigned long crc = 0;
208
209// don't include the name when determining whether two vertex materials match
210// crc = CRC_Memory(reinterpret_cast<const unsigned char *>(Name.Peek_Buffer()),sizeof(char)*strlen(Name),crc);
211
212 crc = CRC_Memory(reinterpret_cast<const unsigned char *>(Material),sizeof(D3DMATERIAL8),crc);
213 crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&Flags),sizeof(Flags),crc);
214 crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&DiffuseColorSource),sizeof(DiffuseColorSource),crc);
215 crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&AmbientColorSource),sizeof(AmbientColorSource),crc);
216 crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&EmissiveColorSource),sizeof(EmissiveColorSource),crc);
217 crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&UVSource),sizeof(UVSource),crc);
218 crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&UseLighting),sizeof(UseLighting),crc);
219 crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&UniqueID),sizeof(UniqueID),crc);
220
221 int i;
222 for (i=0; i<MeshBuilderClass::MAX_STAGES; i++)
223 {
224 if (Mapper[i]) crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&(Mapper[i])),sizeof(TextureMapperClass*),crc);
225 }
226
227 return crc;
228}
229
230// Ambient Get and Sets
231
233{
234 assert(set);
235 *set=Vector3(Material->Ambient.r,Material->Ambient.g,Material->Ambient.b);
236}
237
239{
240 CRCDirty=true;
241 Material->Ambient.r=color.X;
242 Material->Ambient.g=color.Y;
243 Material->Ambient.b=color.Z;
244}
245
246void VertexMaterialClass::Set_Ambient(float r,float g,float b)
247{
248 CRCDirty=true;
249 Material->Ambient.r=r;
250 Material->Ambient.g=g;
251 Material->Ambient.b=b;
252}
253
254// Diffuse Get and Sets
255
257{
258 assert(set);
259 *set=Vector3(Material->Diffuse.r,Material->Diffuse.g,Material->Diffuse.b);
260}
261
263{
264 CRCDirty=true;
265 Material->Diffuse.r=color.X;
266 Material->Diffuse.g=color.Y;
267 Material->Diffuse.b=color.Z;
268}
269
270void VertexMaterialClass::Set_Diffuse(float r,float g,float b)
271{
272 CRCDirty=true;
273 Material->Diffuse.r=r;
274 Material->Diffuse.g=g;
275 Material->Diffuse.b=b;
276}
277
278// Specular Get and Sets
279
281{
282 assert(set);
283 *set=Vector3(Material->Specular.r,Material->Specular.g,Material->Specular.b);
284}
285
287{
288 CRCDirty=true;
289 Material->Specular.r=color.X;
290 Material->Specular.g=color.Y;
291 Material->Specular.b=color.Z;
292}
293
294void VertexMaterialClass::Set_Specular(float r,float g,float b)
295{
296 CRCDirty=true;
297 Material->Specular.r=r;
298 Material->Specular.g=g;
299 Material->Specular.b=b;
300}
301
302// Emissive Get and Sets
303
305{
306 assert(set);
307 *set=Vector3(Material->Emissive.r,Material->Emissive.g,Material->Emissive.b);
308}
309
311{
312 CRCDirty=true;
313 Material->Emissive.r=color.X;
314 Material->Emissive.g=color.Y;
315 Material->Emissive.b=color.Z;
316}
317
318void VertexMaterialClass::Set_Emissive(float r,float g,float b)
319{
320 CRCDirty=true;
321 Material->Emissive.r=r;
322 Material->Emissive.g=g;
323 Material->Emissive.b=b;
324}
325
326
328{
329 return Material->Power;
330}
331
333{
334 CRCDirty=true;
335 Material->Power=shin;
336}
337
339{
340 return Material->Diffuse.a;
341}
342
344{
345 CRCDirty=true;
346 Material->Diffuse.a=o;
347}
348
350{
351 CRCDirty=true;
352 switch (src)
353 {
354 case COLOR1: AmbientColorSource = D3DMCS_COLOR1; break;
355 case COLOR2: AmbientColorSource = D3DMCS_COLOR2; break;
356 default: AmbientColorSource = D3DMCS_MATERIAL; break;
357 }
358}
359
361{
362 CRCDirty=true;
363 switch (src)
364 {
365 case COLOR1: EmissiveColorSource = D3DMCS_COLOR1; break;
366 case COLOR2: EmissiveColorSource = D3DMCS_COLOR2; break;
367 default: EmissiveColorSource = D3DMCS_MATERIAL; break;
368 }
369}
370
372{
373 CRCDirty=true;
374 switch (src)
375 {
376 case COLOR1: DiffuseColorSource = D3DMCS_COLOR1; break;
377 case COLOR2: DiffuseColorSource = D3DMCS_COLOR2; break;
378 default: DiffuseColorSource = D3DMCS_MATERIAL; break;
379 }
380}
381
384{
385 switch(AmbientColorSource)
386 {
387 case D3DMCS_COLOR1: return COLOR1;
388 case D3DMCS_COLOR2: return COLOR2;
389 default: return MATERIAL;
390 }
391}
392
395{
396 switch(EmissiveColorSource)
397 {
398 case D3DMCS_COLOR1: return COLOR1;
399 case D3DMCS_COLOR2: return COLOR2;
400 default: return MATERIAL;
401 }
402}
403
406{
407 switch(DiffuseColorSource)
408 {
409 case D3DMCS_COLOR1: return COLOR1;
410 case D3DMCS_COLOR2: return COLOR2;
411 default: return MATERIAL;
412 }
413}
414
415void VertexMaterialClass::Set_UV_Source(int stage,int array_index)
416{
417 WWASSERT(stage >= 0);
419 WWASSERT(array_index >= 0);
420 WWASSERT(array_index < 8);
421 CRCDirty=true;
422 UVSource[stage] = array_index;
423}
424
426{
427 WWASSERT(stage >= 0);
429 return UVSource[stage];
430}
431
432
434{
435 Vector3 tmp0,tmp1,tmp2;
436
439 tmp2.X = tmp0.X * tmp1.X;
440 tmp2.Y = tmp0.Y * tmp1.Y;
441 tmp2.Z = tmp0.Z * tmp1.Z;
442 Set_Diffuse(tmp2);
443
446 tmp2.X = tmp0.X * tmp1.X;
447 tmp2.Y = tmp0.Y * tmp1.Y;
448 tmp2.Z = tmp0.Z * tmp1.Z;
449 Set_Specular(tmp2);
450
452 Set_Emissive(tmp0);
453
455 Set_Ambient(tmp0);
456
458 Set_Opacity(mat3.Opacity);
459}
460
462{
463 char name[256];
464
466 bool hasname = false;
467
468 char *mapping0_arg_buffer = NULL;
469 char *mapping1_arg_buffer = NULL;
470 unsigned int mapping0_arg_len = 0U;
471 unsigned int mapping1_arg_len = 0U;
472
473 while (cload.Open_Chunk()) {
474 switch (cload.Cur_Chunk_ID()) {
476 cload.Read(&name,cload.Cur_Chunk_Length());
477 hasname = true;
478 break;
479
481 if (cload.Read(&vmat,sizeof(vmat)) != sizeof(vmat)) {
483 }
484 break;
485
487 mapping0_arg_len = cload.Cur_Chunk_Length();
488 mapping0_arg_buffer = MSGW3DNEWARRAY("VertexMaterialClassTemp") char[mapping0_arg_len];
489 if (cload.Read(mapping0_arg_buffer, mapping0_arg_len) != mapping0_arg_len) {
491 }
492 break;
493
495 mapping1_arg_len = cload.Cur_Chunk_Length();
496 mapping1_arg_buffer = MSGW3DNEWARRAY("VertexMaterialClassTemp") char[mapping1_arg_len];
497 if (cload.Read(mapping1_arg_buffer, mapping1_arg_len) != mapping1_arg_len) {
499 }
500 break;
501 };
502 cload.Close_Chunk();
503 }
504
505 if (hasname) {
506 Set_Name(name);
507 }
508
510 Parse_Mapping_Args(vmat,mapping0_arg_buffer,mapping1_arg_buffer);
511
512 delete [] mapping0_arg_buffer;
513 mapping0_arg_buffer = NULL;
514
515 delete [] mapping1_arg_buffer;
516 mapping1_arg_buffer = NULL;
517
518 return WW3D_ERROR_OK;
519}
520
547
548void VertexMaterialClass::Parse_Mapping_Args(const W3dVertexMaterialStruct & vmat,char * mapping0_arg_buffer,char * mapping1_arg_buffer)
549{
550
551 // Read an INIClass from the mapping argument buffer - this will be used
552 // to initialize any special mappers used.
553 INIClass mapping0_arg_ini;
554 if (mapping0_arg_buffer) {
555
556 int mapping0_arg_len = strlen(mapping0_arg_buffer);
557
558 char *extended_arg_buffer = MSGW3DNEWARRAY("VertexMaterialClassTemp") char[mapping0_arg_len + 10];
559 sprintf(extended_arg_buffer, "[Args]\n%s", mapping0_arg_buffer);
560 mapping0_arg_len = strlen(extended_arg_buffer) + 1;
561
562 BufferStraw map_arg_buf_straw((void *)extended_arg_buffer, mapping0_arg_len);
563
564 mapping0_arg_ini.Load(map_arg_buf_straw);
565
566 delete [] extended_arg_buffer;
567 extended_arg_buffer = NULL;
568 }
569 INIClass mapping1_arg_ini;
570 if (mapping1_arg_buffer) {
571
572 int mapping1_arg_len = strlen(mapping1_arg_buffer);
573
574 char *extended_arg_buffer = MSGW3DNEWARRAY("VertexMaterialClassTemp") char[mapping1_arg_len + 20];
575 sprintf(extended_arg_buffer, "[Args]\n%s", mapping1_arg_buffer);
576 mapping1_arg_len = strlen(extended_arg_buffer) + 1;
577
578 BufferStraw map_arg_buf_straw((void *)extended_arg_buffer, mapping1_arg_len);
579
580 mapping1_arg_ini.Load(map_arg_buf_straw);
581
582 delete [] extended_arg_buffer;
583 extended_arg_buffer = NULL;
584 }
585
586 // Set up the vertex mapper. If it is one of the simple
587 // ones, set the pointer to one of the global instances.
588 int mapping = vmat.Attributes & W3DVERTMAT_STAGE0_MAPPING_MASK;
589
590 switch(mapping) {
591
593 break;
594
596 {
598 Set_Mapper(mapper);
599 mapper->Release_Ref();
600 }
601 break;
603 {
605 Set_Mapper(mapper);
606 mapper->Release_Ref();
607 }
608 break;
610 {
612 NEW_REF(LinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
613 Set_Mapper(mapper);
614 mapper->Release_Ref();
615 }
616 break;
617
619 {
620 ScreenMapperClass *mapper =
621 NEW_REF(ScreenMapperClass,(mapping0_arg_ini, "Args", 0));
622 Set_Mapper(mapper);
623 mapper->Release_Ref();
624 }
625 break;
626
628 {
630 NEW_REF(ScaleTextureMapperClass,(mapping0_arg_ini, "Args", 0));
631 Set_Mapper(mapper);
632 mapper->Release_Ref();
633 }
634 break;
635
637 {
638 GridTextureMapperClass *mapper =
639 NEW_REF(GridTextureMapperClass,(mapping0_arg_ini, "Args", 0));
640 Set_Mapper(mapper,0);
641 mapper->Release_Ref();
642 }
643 break;
644
646 {
648 NEW_REF(RotateTextureMapperClass,(mapping0_arg_ini, "Args", 0));
649 Set_Mapper(mapper,0);
650 mapper->Release_Ref();
651 }
652 break;
653
655 {
657 NEW_REF(SineLinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
658 Set_Mapper(mapper,0);
659 mapper->Release_Ref();
660 }
661 break;
662
664 {
666 NEW_REF(StepLinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
667 Set_Mapper(mapper,0);
668 mapper->Release_Ref();
669 }
670 break;
671
673 {
675 NEW_REF(ZigZagLinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
676 Set_Mapper(mapper,0);
677 mapper->Release_Ref();
678 }
679 break;
680
682 {
683 WSClassicEnvironmentMapperClass *mapper = NEW_REF(WSClassicEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
684 Set_Mapper(mapper,0);
685 mapper->Release_Ref();
686 }
687 break;
688
690 {
691 WSEnvironmentMapperClass *mapper = NEW_REF(WSEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
692 Set_Mapper(mapper,0);
693 mapper->Release_Ref();
694 }
695 break;
696
698 {
700 NEW_REF(GridClassicEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
701 Set_Mapper(mapper,0);
702 mapper->Release_Ref();
703 }
704 break;
705
707 {
709 NEW_REF(GridEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
710 Set_Mapper(mapper,0);
711 mapper->Release_Ref();
712 }
713 break;
714
716 {
718 NEW_REF(RandomTextureMapperClass,(mapping0_arg_ini, "Args", 0));
719 Set_Mapper(mapper,0);
720 mapper->Release_Ref();
721 }
722 break;
723
725 {
726 EdgeMapperClass *mapper =
727 NEW_REF(EdgeMapperClass,(mapping0_arg_ini, "Args", 0));
728 Set_Mapper(mapper,0);
729 mapper->Release_Ref();
730 }
731 break;
732
734 {
736 NEW_REF(BumpEnvTextureMapperClass,(mapping0_arg_ini, "Args", 0));
737 Set_Mapper(mapper,0);
738 mapper->Release_Ref();
739 }
740 break;
741
743 {
745 NEW_REF(GridWSClassicEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
746 Set_Mapper(mapper,0);
747 mapper->Release_Ref();
748 }
749 break;
750
752 {
754 NEW_REF(GridWSEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
755 Set_Mapper(mapper,0);
756 mapper->Release_Ref();
757 }
758 break;
759
760 default:
761 break;
762 }
763
764 // Same setup for stage 1's mapper.
766 switch(mapping) {
767
769 break;
770
772 {
774 Set_Mapper(mapper, 1);
775 mapper->Release_Ref();
776 }
777 break;
779 {
781 Set_Mapper(mapper, 1);
782 mapper->Release_Ref();
783 }
784 break;
785
787 {
789 W3DNEW LinearOffsetTextureMapperClass(mapping1_arg_ini, "Args", 1);
790 Set_Mapper(mapper, 1);
791 mapper->Release_Ref();
792 }
793 break;
794
796 {
797 ScreenMapperClass *mapper =
798 W3DNEW ScreenMapperClass(mapping1_arg_ini, "Args", 1);
799 Set_Mapper(mapper, 1);
800 mapper->Release_Ref();
801 }
802 break;
803
805 {
807 NEW_REF(ScaleTextureMapperClass,(mapping1_arg_ini, "Args", 1));
808 Set_Mapper(mapper,1);
809 mapper->Release_Ref();
810 }
811 break;
812
814 {
815 GridTextureMapperClass *mapper =
816 NEW_REF(GridTextureMapperClass,(mapping1_arg_ini, "Args", 1));
817 Set_Mapper(mapper,1);
818 mapper->Release_Ref();
819 }
820 break;
821
823 {
825 NEW_REF(RotateTextureMapperClass,(mapping1_arg_ini, "Args", 1));
826 Set_Mapper(mapper,1);
827 mapper->Release_Ref();
828 }
829 break;
830
832 {
834 NEW_REF(SineLinearOffsetTextureMapperClass,(mapping1_arg_ini, "Args", 1));
835 Set_Mapper(mapper,1);
836 mapper->Release_Ref();
837 }
838 break;
839
841 {
843 NEW_REF(StepLinearOffsetTextureMapperClass,(mapping1_arg_ini, "Args", 1));
844 Set_Mapper(mapper,1);
845 mapper->Release_Ref();
846 }
847 break;
848
850 {
852 NEW_REF(ZigZagLinearOffsetTextureMapperClass,(mapping1_arg_ini, "Args", 1));
853 Set_Mapper(mapper,1);
854 mapper->Release_Ref();
855 }
856 break;
857
859 {
860 WSClassicEnvironmentMapperClass *mapper = NEW_REF(WSClassicEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
861 Set_Mapper(mapper,1);
862 mapper->Release_Ref();
863 }
864 break;
865
867 {
868 WSEnvironmentMapperClass *mapper = NEW_REF(WSEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
869 Set_Mapper(mapper,1);
870 mapper->Release_Ref();
871 }
872 break;
873
875 {
877 NEW_REF(GridClassicEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
878 Set_Mapper(mapper,1);
879 mapper->Release_Ref();
880 }
881 break;
882
884 {
886 NEW_REF(GridEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
887 Set_Mapper(mapper,1);
888 mapper->Release_Ref();
889 }
890 break;
891
893 {
895 NEW_REF(RandomTextureMapperClass,(mapping1_arg_ini, "Args", 1));
896 Set_Mapper(mapper,1);
897 mapper->Release_Ref();
898 }
899 break;
900
902 {
903 EdgeMapperClass *mapper =
904 NEW_REF(EdgeMapperClass,(mapping1_arg_ini, "Args", 1));
905 Set_Mapper(mapper,1);
906 mapper->Release_Ref();
907 }
908 break;
909
911 {
913 NEW_REF(BumpEnvTextureMapperClass,(mapping1_arg_ini, "Args", 1));
914 Set_Mapper(mapper,1);
915 mapper->Release_Ref();
916 }
917 break;
918
920 {
922 NEW_REF(GridWSClassicEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
923 Set_Mapper(mapper,1);
924 mapper->Release_Ref();
925 }
926 break;
927
929 {
931 NEW_REF(GridWSEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
932 Set_Mapper(mapper,1);
933 mapper->Release_Ref();
934 }
935 break;
936
937 default:
938 break;
939 }
940}
941
942
948
949void VertexMaterialClass::Apply(void) const
950{
951 int i;
952
954
957 else
958 DX8Wrapper::Set_DX8_Render_State(D3DRS_LIGHTING,UseLighting);
959 DX8Wrapper::Set_DX8_Render_State(D3DRS_AMBIENTMATERIALSOURCE,AmbientColorSource);
960 DX8Wrapper::Set_DX8_Render_State(D3DRS_DIFFUSEMATERIALSOURCE,DiffuseColorSource);
961 DX8Wrapper::Set_DX8_Render_State(D3DRS_EMISSIVEMATERIALSOURCE,EmissiveColorSource);
962
963 // set to default values if no mappers
964 for (i=0; i<MeshBuilderClass::MAX_STAGES; i++) {
965 if (Mapper[i]) {
966 Mapper[i]->Apply(UVSource[i]);
967 } else {
968 DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_PASSTHRU | UVSource[i]);
969 DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE);
970 }
971 }
972}
973
974void VertexMaterialClass::Apply_Null(void)
975{
976 int i;
977 static D3DMATERIAL8 default_settings =
978 {
979 { 1.0f, 1.0f, 1.0f, 1.0f }, // diffuse
980 { 1.0f, 1.0f, 1.0f, 1.0f }, // ambient
981 { 0.0f, 0.0f, 0.0f, 0.0f }, // specular
982 { 0.0f, 0.0f, 0.0f, 0.0f }, // emissive
983 1.0f // power
984 };
985
987 DX8Wrapper::Set_DX8_Material(&default_settings);
988
989 DX8Wrapper::Set_DX8_Render_State(D3DRS_AMBIENTMATERIALSOURCE,D3DMCS_MATERIAL);
990 DX8Wrapper::Set_DX8_Render_State(D3DRS_DIFFUSEMATERIALSOURCE,D3DMCS_MATERIAL);
991 DX8Wrapper::Set_DX8_Render_State(D3DRS_EMISSIVEMATERIALSOURCE,D3DMCS_MATERIAL);
992
993 // set to default values if no mappers
994 for (i=0; i<MeshBuilderClass::MAX_STAGES; i++) {
995 DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_PASSTHRU | i);
996 DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE);
997 }
998}
999
1000
1001/***********************************************************************************************
1002 * Init -- init code *
1003 * *
1004 * *
1005 * *
1006 * *
1007 * INPUT: *
1008 * *
1009 * OUTPUT: *
1010 * *
1011 * WARNINGS: *
1012 * *
1013 * HISTORY: *
1014 * 2/14/2001 hy : Created. *
1015 *=============================================================================================*/
1017{
1018 int i;
1019 for (i=0; i<PRESET_COUNT;i++)
1020 Presets[i]=NEW_REF(VertexMaterialClass,());
1021
1022 // Set up presets
1023 Presets[PRELIT_DIFFUSE]->Set_Diffuse_Color_Source(VertexMaterialClass::COLOR1);
1024 Presets[PRELIT_DIFFUSE]->Set_Lighting(false);
1025 Presets[PRELIT_NODIFFUSE]->Set_Lighting(false);
1026}
1027
1028
1029/***********************************************************************************************
1030 * Shutdown -- shutdown code *
1031 * *
1032 * *
1033 * *
1034 * *
1035 * INPUT: *
1036 * *
1037 * OUTPUT: *
1038 * *
1039 * WARNINGS: *
1040 * *
1041 * HISTORY: *
1042 * 2/14/2001 hy : Created. *
1043 *=============================================================================================*/
1045{
1046 int i;
1047 for (i=0; i<PRESET_COUNT;i++)
1048 REF_PTR_RELEASE(Presets[i]);
1049}
1050
1051
1052/***********************************************************************************************
1053 * Get_Preset -- retrieve presets *
1054 * *
1055 * *
1056 * *
1057 * *
1058 * INPUT: *
1059 * *
1060 * OUTPUT: *
1061 * *
1062 * WARNINGS: *
1063 * *
1064 * HISTORY: *
1065 * 2/14/2001 hy : Created. *
1066 *=============================================================================================*/
1068{
1069 WWASSERT(type<PRESET_COUNT);
1070 Presets[type]->Add_Ref();
1071 return Presets[type];
1072}
#define NULL
Definition BaseType.h:92
#define FALSE
Definition BaseType.h:113
#define WWASSERT
#define W3DVERTMAT_STAGE1_MAPPING_ZIGZAG_LINEAR_OFFSET
Definition w3d_file.h:687
#define W3DVERTMAT_STAGE1_MAPPING_WS_CLASSIC_ENV
Definition w3d_file.h:688
#define W3DVERTMAT_STAGE1_MAPPING_WS_ENVIRONMENT
Definition w3d_file.h:689
#define W3DVERTMAT_STAGE0_MAPPING_ENVIRONMENT
Definition w3d_file.h:654
#define W3DVERTMAT_STAGE1_MAPPING_GRID_WS_ENVIRONMENT
Definition w3d_file.h:696
#define W3DVERTMAT_STAGE0_MAPPING_CHEAP_ENVIRONMENT
Definition w3d_file.h:655
#define W3DVERTMAT_STAGE1_MAPPING_SINE_LINEAR_OFFSET
Definition w3d_file.h:685
#define W3DVERTMAT_STAGE1_MAPPING_SCALE
Definition w3d_file.h:682
#define W3DVERTMAT_STAGE1_MAPPING_SCREEN
Definition w3d_file.h:679
#define W3DVERTMAT_STAGE0_MAPPING_BUMPENV
Definition w3d_file.h:671
#define W3DVERTMAT_STAGE0_MAPPING_UV
Definition w3d_file.h:653
#define W3DVERTMAT_STAGE0_MAPPING_GRID_WS_CLASSIC_ENV
Definition w3d_file.h:672
#define W3DVERTMAT_STAGE1_MAPPING_ROTATE
Definition w3d_file.h:684
#define W3DVERTMAT_STAGE1_MAPPING_STEP_LINEAR_OFFSET
Definition w3d_file.h:686
#define W3DVERTMAT_STAGE0_MAPPING_ZIGZAG_LINEAR_OFFSET
Definition w3d_file.h:664
#define W3DVERTMAT_STAGE0_MAPPING_LINEAR_OFFSET
Definition w3d_file.h:657
#define W3DVERTMAT_STAGE0_MAPPING_SCALE
Definition w3d_file.h:659
#define W3DVERTMAT_STAGE0_MAPPING_STEP_LINEAR_OFFSET
Definition w3d_file.h:663
#define W3DVERTMAT_STAGE0_MAPPING_SINE_LINEAR_OFFSET
Definition w3d_file.h:662
#define W3DVERTMAT_STAGE1_MAPPING_EDGE
Definition w3d_file.h:693
#define W3DVERTMAT_STAGE0_MAPPING_SCREEN
Definition w3d_file.h:656
#define W3DVERTMAT_STAGE1_MAPPING_GRID_WS_CLASSIC_ENV
Definition w3d_file.h:695
#define W3DVERTMAT_STAGE0_MAPPING_GRID_WS_ENVIRONMENT
Definition w3d_file.h:673
#define W3DVERTMAT_STAGE0_MAPPING_EDGE
Definition w3d_file.h:670
#define W3DVERTMAT_STAGE1_MAPPING_UV
Definition w3d_file.h:676
#define W3DVERTMAT_COPY_SPECULAR_TO_DIFFUSE
Definition w3d_file.h:649
#define W3DVERTMAT_STAGE1_MAPPING_MASK
Definition w3d_file.h:675
#define W3DVERTMAT_STAGE1_MAPPING_GRID_ENVIRONMENT
Definition w3d_file.h:691
#define W3DVERTMAT_STAGE0_MAPPING_WS_CLASSIC_ENV
Definition w3d_file.h:665
#define W3DVERTMAT_STAGE0_MAPPING_ROTATE
Definition w3d_file.h:661
#define W3DVERTMAT_STAGE1_MAPPING_BUMPENV
Definition w3d_file.h:694
#define W3DVERTMAT_STAGE0_MAPPING_GRID
Definition w3d_file.h:660
#define W3DVERTMAT_STAGE0_MAPPING_MASK
Definition w3d_file.h:652
#define W3DVERTMAT_STAGE0_MAPPING_GRID_ENVIRONMENT
Definition w3d_file.h:668
#define W3DVERTMAT_STAGE0_MAPPING_GRID_CLASSIC_ENV
Definition w3d_file.h:667
#define W3DVERTMAT_STAGE1_MAPPING_CHEAP_ENVIRONMENT
Definition w3d_file.h:678
#define W3DVERTMAT_STAGE1_MAPPING_GRID_CLASSIC_ENV
Definition w3d_file.h:690
#define W3DVERTMAT_STAGE1_MAPPING_LINEAR_OFFSET
Definition w3d_file.h:680
@ W3D_CHUNK_VERTEX_MAPPER_ARGS1
Definition w3d_file.h:364
@ W3D_CHUNK_VERTEX_MATERIAL_NAME
Definition w3d_file.h:361
@ W3D_CHUNK_VERTEX_MAPPER_ARGS0
Definition w3d_file.h:363
@ W3D_CHUNK_VERTEX_MATERIAL_INFO
Definition w3d_file.h:362
#define W3DVERTMAT_STAGE0_MAPPING_WS_ENVIRONMENT
Definition w3d_file.h:666
#define W3DVERTMAT_STAGE1_MAPPING_RANDOM
Definition w3d_file.h:692
#define W3DVERTMAT_STAGE0_MAPPING_RANDOM
Definition w3d_file.h:669
#define W3DVERTMAT_USE_DEPTH_CUE
Definition w3d_file.h:647
#define W3DVERTMAT_STAGE1_MAPPING_GRID
Definition w3d_file.h:683
#define W3DVERTMAT_STAGE1_MAPPING_ENVIRONMENT
Definition w3d_file.h:677
#define W3DMPO_GLUE(ARGCLASS)
Definition always.h:120
#define W3DNEW
Definition always.h:109
#define MSGW3DNEWARRAY(MSG)
Definition always.h:108
@ true
Definition bool.h:59
@ false
Definition bool.h:59
unsigned long CRC_Memory(const unsigned char *data, unsigned long length, unsigned long crc)
Definition realcrc.cpp:126
bool Close_Chunk()
Definition chunkio.cpp:448
uint32 Cur_Chunk_ID()
Definition chunkio.cpp:484
uint32 Cur_Chunk_Length()
Definition chunkio.cpp:503
uint32 Read(void *buf, uint32 nbytes)
Definition chunkio.cpp:692
bool Open_Chunk()
Definition chunkio.cpp:412
static void Set_DX8_Material(const D3DMATERIAL8 *mat)
Definition dx8wrapper.h:849
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
D3DMATERIAL8 Mat
Definition INI.H:80
int Load(FileClass &file)
Definition ini.cpp:339
WWINLINE void Release_Ref(void) const
Definition refcount.h:146
virtual void Apply(int uv_array_index)=0
virtual TextureMapperClass * Clone(void) const =0
float X
Definition vector3.h:90
float Z
Definition vector3.h:92
float Y
Definition vector3.h:91
float Get_Shininess(void) const
void Parse_W3dVertexMaterialStruct(const W3dVertexMaterialStruct &vmat)
static VertexMaterialClass * Get_Preset(PresetType type)
void Get_Diffuse(Vector3 *set_color) const
WW3DErrorType Save_W3D(ChunkSaveClass &csave)
ColorSourceType Get_Diffuse_Color_Source(void)
ColorSourceType Get_Emissive_Color_Source(void)
ColorSourceType Get_Ambient_Color_Source(void)
void Parse_Mapping_Args(const W3dVertexMaterialStruct &vmat, char *mapping0_arg_buffer, char *mapping1_arg_buffer)
void Set_Specular(const Vector3 &color)
void Set_Diffuse(const Vector3 &color)
int Get_UV_Source(int stage)
void Set_Ambient(const Vector3 &color)
void Set_Flag(FlagsType flag, bool onoff)
void Set_Shininess(float shin)
void Set_Emissive(const Vector3 &color)
void Set_Ambient_Color_Source(ColorSourceType src)
void Get_Emissive(Vector3 *set_color) const
void Set_Mapper(TextureMapperClass *mapper, int stage=0)
void Get_Ambient(Vector3 *set_color) const
void Get_Specular(Vector3 *set_color) const
void Set_Emissive_Color_Source(ColorSourceType src)
WW3DErrorType Load_W3D(ChunkLoadClass &cload)
VertexMaterialClass & operator=(const VertexMaterialClass &src)
void Set_Name(const char *name)
float Get_Opacity(void) const
void Init_From_Material3(const W3dMaterial3Struct &mat3)
void Set_Opacity(float o)
void Set_Diffuse_Color_Source(ColorSourceType src)
void Set_UV_Source(int stage, int array_index)
static void Convert_Color(const W3dRGBStruct &rgb, Vector3 *set)
Definition w3d_util.cpp:75
static bool Is_Coloring_Enabled()
Definition ww3d.h:258
#define REF_PTR_RELEASE(x)
Definition refcount.h:80
#define NEW_REF(C, P)
Definition refcount.h:62
W3dRGBStruct SpecularCoefficients
W3dRGBStruct EmissiveCoefficients
W3dRGBStruct DiffuseCoefficients
W3dRGBStruct SpecularColor
W3dRGBStruct AmbientCoefficients
W3dRGBStruct DiffuseColor
W3dRGBStruct Emissive
Definition w3d_file.h:732
W3dRGBStruct Ambient
Definition w3d_file.h:729
W3dRGBStruct Specular
Definition w3d_file.h:731
W3dRGBStruct Diffuse
Definition w3d_file.h:730
#define SRCMATPTR(src)
#define Material
#define DYN_MAT8
WW3DErrorType
Definition w3derr.h:51
@ WW3D_ERROR_LOAD_FAILED
Definition w3derr.h:54
@ WW3D_ERROR_OK
Definition w3derr.h:52