vertmaterial.cpp 30 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024
  1. /*
  2. ** Command & Conquer Generals(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. *** 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 ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : WW3D *
  23. * *
  24. * $Archive:: /Commando/Code/ww3d2/vertmaterial.cpp $*
  25. * *
  26. * Author:: Greg Hjelstrom *
  27. * *
  28. * $Modtime:: 8/22/01 11:06a $*
  29. * *
  30. * $Revision:: 42 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * Init -- init code *
  35. * Shutdown -- shutdown code *
  36. * Get_Preset -- retrieve presets *
  37. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  38. #include "vertmaterial.h"
  39. #include "realcrc.h"
  40. #include "wwdebug.h"
  41. #include "w3d_util.h"
  42. #include "chunkio.h"
  43. #include "w3derr.h"
  44. #include "ini.h"
  45. #include "xstraw.h"
  46. #include "dx8wrapper.h"
  47. #include <stdio.h>
  48. #include <string.h>
  49. static unsigned int unique=1;
  50. VertexMaterialClass* VertexMaterialClass::Presets[VertexMaterialClass::PRESET_COUNT];
  51. #ifdef DYN_MAT8
  52. class DynD3DMATERIAL8 : public W3DMPO
  53. {
  54. W3DMPO_GLUE(DynD3DMATERIAL8)
  55. public:
  56. D3DMATERIAL8 Mat;
  57. };
  58. #define Material (&MaterialDyn->Mat)
  59. #define SRCMATPTR(src) (&(src)->MaterialDyn->Mat)
  60. #else
  61. #define Material (MaterialOld)
  62. #define SRCMATPTR(src) ((src)->MaterialOld)
  63. #endif
  64. /*
  65. ** VertexMaterialClass Implementation
  66. */
  67. VertexMaterialClass::VertexMaterialClass(void):
  68. #ifdef DYN_MAT8
  69. MaterialDyn(NULL),
  70. #else
  71. MaterialOld(NULL),
  72. #endif
  73. Flags(0),
  74. AmbientColorSource(D3DMCS_MATERIAL),
  75. EmissiveColorSource(D3DMCS_MATERIAL),
  76. DiffuseColorSource(D3DMCS_MATERIAL),
  77. UseLighting(false),
  78. UniqueID(0),
  79. CRCDirty(true)
  80. {
  81. int i;
  82. for (i=0; i<MeshBuilderClass::MAX_STAGES; i++)
  83. {
  84. Mapper[i]=NULL;
  85. UVSource[i] = i;
  86. }
  87. #ifdef DYN_MAT8
  88. MaterialDyn=W3DNEW DynD3DMATERIAL8;
  89. #else
  90. MaterialOld=W3DNEW D3DMATERIAL8;
  91. #endif
  92. memset(Material,0,sizeof(D3DMATERIAL8));
  93. Set_Ambient(1.0f,1.0f,1.0f);
  94. Set_Diffuse(1.0f,1.0f,1.0f);
  95. Set_Opacity(1.0f);
  96. }
  97. VertexMaterialClass::VertexMaterialClass(const VertexMaterialClass & src) :
  98. #ifdef DYN_MAT8
  99. MaterialDyn(NULL),
  100. #else
  101. MaterialOld(NULL),
  102. #endif
  103. Flags(src.Flags),
  104. AmbientColorSource(src.AmbientColorSource),
  105. EmissiveColorSource(src.EmissiveColorSource),
  106. DiffuseColorSource(src.DiffuseColorSource),
  107. UseLighting(src.UseLighting),
  108. Name(src.Name),
  109. UniqueID(src.UniqueID),
  110. CRCDirty(true)
  111. {
  112. int i;
  113. for (i=0; i<MeshBuilderClass::MAX_STAGES; i++)
  114. {
  115. Mapper[i]=NULL;
  116. if (src.Mapper[i])
  117. {
  118. TextureMapperClass *mapper=src.Mapper[i]->Clone();
  119. Set_Mapper(mapper,i);
  120. mapper->Release_Ref();
  121. }
  122. UVSource[i] = src.UVSource[i];
  123. }
  124. #ifdef DYN_MAT8
  125. MaterialDyn=W3DNEW DynD3DMATERIAL8;
  126. #else
  127. MaterialOld=W3DNEW D3DMATERIAL8;
  128. #endif
  129. memcpy(Material, SRCMATPTR(&src), sizeof(D3DMATERIAL8));
  130. }
  131. void VertexMaterialClass::Make_Unique()
  132. {
  133. CRCDirty=true;
  134. UniqueID=unique;
  135. unique++;
  136. }
  137. VertexMaterialClass::~VertexMaterialClass(void)
  138. {
  139. int i;
  140. for (i=0; i<MeshBuilderClass::MAX_STAGES; i++)
  141. {
  142. if (Mapper[i])
  143. {
  144. REF_PTR_RELEASE(Mapper[i]);
  145. Mapper[i]=NULL;
  146. }
  147. }
  148. #ifdef DYN_MAT8
  149. delete MaterialDyn;
  150. #else
  151. delete MaterialOld;
  152. #endif
  153. }
  154. VertexMaterialClass & VertexMaterialClass::operator = (const VertexMaterialClass &src)
  155. {
  156. if (this != &src) {
  157. Name=src.Name;
  158. Flags = src.Flags;
  159. AmbientColorSource = src.AmbientColorSource;
  160. EmissiveColorSource = src.EmissiveColorSource;
  161. DiffuseColorSource = src.DiffuseColorSource;
  162. UseLighting=src.UseLighting;
  163. UniqueID=src.UniqueID;
  164. CRCDirty=src.CRCDirty;
  165. int stage;
  166. for (stage=0;stage<MeshBuilderClass::MAX_STAGES;++stage) {
  167. if (Mapper[stage] != NULL) {
  168. Mapper[stage]->Release_Ref();
  169. Mapper[stage] = NULL;
  170. }
  171. }
  172. for (stage=0;stage<MeshBuilderClass::MAX_STAGES;++stage) {
  173. if (src.Mapper[stage]) {
  174. TextureMapperClass *mapper = src.Mapper[stage]->Clone();
  175. Set_Mapper(mapper,stage);
  176. mapper->Release_Ref();
  177. }
  178. UVSource[stage] = src.UVSource[stage];
  179. }
  180. *Material = *SRCMATPTR(&src);
  181. }
  182. return *this;
  183. }
  184. unsigned long VertexMaterialClass::Compute_CRC(void) const
  185. {
  186. unsigned long crc = 0;
  187. // don't include the name when determining whether two vertex materials match
  188. // crc = CRC_Memory(reinterpret_cast<const unsigned char *>(Name.Peek_Buffer()),sizeof(char)*strlen(Name),crc);
  189. crc = CRC_Memory(reinterpret_cast<const unsigned char *>(Material),sizeof(D3DMATERIAL8),crc);
  190. crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&Flags),sizeof(Flags),crc);
  191. crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&DiffuseColorSource),sizeof(DiffuseColorSource),crc);
  192. crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&AmbientColorSource),sizeof(AmbientColorSource),crc);
  193. crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&EmissiveColorSource),sizeof(EmissiveColorSource),crc);
  194. crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&UVSource),sizeof(UVSource),crc);
  195. crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&UseLighting),sizeof(UseLighting),crc);
  196. crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&UniqueID),sizeof(UniqueID),crc);
  197. int i;
  198. for (i=0; i<MeshBuilderClass::MAX_STAGES; i++)
  199. {
  200. if (Mapper[i]) crc = CRC_Memory(reinterpret_cast<const unsigned char *>(&(Mapper[i])),sizeof(TextureMapperClass*),crc);
  201. }
  202. return crc;
  203. }
  204. // Ambient Get and Sets
  205. void VertexMaterialClass::Get_Ambient(Vector3 * set) const
  206. {
  207. assert(set);
  208. *set=Vector3(Material->Ambient.r,Material->Ambient.g,Material->Ambient.b);
  209. }
  210. void VertexMaterialClass::Set_Ambient(const Vector3 & color)
  211. {
  212. CRCDirty=true;
  213. Material->Ambient.r=color.X;
  214. Material->Ambient.g=color.Y;
  215. Material->Ambient.b=color.Z;
  216. }
  217. void VertexMaterialClass::Set_Ambient(float r,float g,float b)
  218. {
  219. CRCDirty=true;
  220. Material->Ambient.r=r;
  221. Material->Ambient.g=g;
  222. Material->Ambient.b=b;
  223. }
  224. // Diffuse Get and Sets
  225. void VertexMaterialClass::Get_Diffuse(Vector3 * set) const
  226. {
  227. assert(set);
  228. *set=Vector3(Material->Diffuse.r,Material->Diffuse.g,Material->Diffuse.b);
  229. }
  230. void VertexMaterialClass::Set_Diffuse(const Vector3 & color)
  231. {
  232. CRCDirty=true;
  233. Material->Diffuse.r=color.X;
  234. Material->Diffuse.g=color.Y;
  235. Material->Diffuse.b=color.Z;
  236. }
  237. void VertexMaterialClass::Set_Diffuse(float r,float g,float b)
  238. {
  239. CRCDirty=true;
  240. Material->Diffuse.r=r;
  241. Material->Diffuse.g=g;
  242. Material->Diffuse.b=b;
  243. }
  244. // Specular Get and Sets
  245. void VertexMaterialClass::Get_Specular(Vector3 * set) const
  246. {
  247. assert(set);
  248. *set=Vector3(Material->Specular.r,Material->Specular.g,Material->Specular.b);
  249. }
  250. void VertexMaterialClass::Set_Specular(const Vector3 & color)
  251. {
  252. CRCDirty=true;
  253. Material->Specular.r=color.X;
  254. Material->Specular.g=color.Y;
  255. Material->Specular.b=color.Z;
  256. }
  257. void VertexMaterialClass::Set_Specular(float r,float g,float b)
  258. {
  259. CRCDirty=true;
  260. Material->Specular.r=r;
  261. Material->Specular.g=g;
  262. Material->Specular.b=b;
  263. }
  264. // Emissive Get and Sets
  265. void VertexMaterialClass::Get_Emissive(Vector3 * set) const
  266. {
  267. assert(set);
  268. *set=Vector3(Material->Emissive.r,Material->Emissive.g,Material->Emissive.b);
  269. }
  270. void VertexMaterialClass::Set_Emissive(const Vector3 & color)
  271. {
  272. CRCDirty=true;
  273. Material->Emissive.r=color.X;
  274. Material->Emissive.g=color.Y;
  275. Material->Emissive.b=color.Z;
  276. }
  277. void VertexMaterialClass::Set_Emissive(float r,float g,float b)
  278. {
  279. CRCDirty=true;
  280. Material->Emissive.r=r;
  281. Material->Emissive.g=g;
  282. Material->Emissive.b=b;
  283. }
  284. float VertexMaterialClass::Get_Shininess(void) const
  285. {
  286. return Material->Power;
  287. }
  288. void VertexMaterialClass::Set_Shininess(float shin)
  289. {
  290. CRCDirty=true;
  291. Material->Power=shin;
  292. }
  293. float VertexMaterialClass::Get_Opacity(void) const
  294. {
  295. return Material->Diffuse.a;
  296. }
  297. void VertexMaterialClass::Set_Opacity(float o)
  298. {
  299. CRCDirty=true;
  300. Material->Diffuse.a=o;
  301. }
  302. void VertexMaterialClass::Set_Ambient_Color_Source(ColorSourceType src)
  303. {
  304. CRCDirty=true;
  305. switch (src)
  306. {
  307. case COLOR1: AmbientColorSource = D3DMCS_COLOR1; break;
  308. case COLOR2: AmbientColorSource = D3DMCS_COLOR2; break;
  309. default: AmbientColorSource = D3DMCS_MATERIAL; break;
  310. }
  311. }
  312. void VertexMaterialClass::Set_Emissive_Color_Source(ColorSourceType src)
  313. {
  314. CRCDirty=true;
  315. switch (src)
  316. {
  317. case COLOR1: EmissiveColorSource = D3DMCS_COLOR1; break;
  318. case COLOR2: EmissiveColorSource = D3DMCS_COLOR2; break;
  319. default: EmissiveColorSource = D3DMCS_MATERIAL; break;
  320. }
  321. }
  322. void VertexMaterialClass::Set_Diffuse_Color_Source(ColorSourceType src)
  323. {
  324. CRCDirty=true;
  325. switch (src)
  326. {
  327. case COLOR1: DiffuseColorSource = D3DMCS_COLOR1; break;
  328. case COLOR2: DiffuseColorSource = D3DMCS_COLOR2; break;
  329. default: DiffuseColorSource = D3DMCS_MATERIAL; break;
  330. }
  331. }
  332. VertexMaterialClass::ColorSourceType
  333. VertexMaterialClass::Get_Ambient_Color_Source(void)
  334. {
  335. switch(AmbientColorSource)
  336. {
  337. case D3DMCS_COLOR1: return COLOR1;
  338. case D3DMCS_COLOR2: return COLOR2;
  339. default: return MATERIAL;
  340. }
  341. }
  342. VertexMaterialClass::ColorSourceType
  343. VertexMaterialClass::Get_Emissive_Color_Source(void)
  344. {
  345. switch(EmissiveColorSource)
  346. {
  347. case D3DMCS_COLOR1: return COLOR1;
  348. case D3DMCS_COLOR2: return COLOR2;
  349. default: return MATERIAL;
  350. }
  351. }
  352. VertexMaterialClass::ColorSourceType
  353. VertexMaterialClass::Get_Diffuse_Color_Source(void)
  354. {
  355. switch(DiffuseColorSource)
  356. {
  357. case D3DMCS_COLOR1: return COLOR1;
  358. case D3DMCS_COLOR2: return COLOR2;
  359. default: return MATERIAL;
  360. }
  361. }
  362. void VertexMaterialClass::Set_UV_Source(int stage,int array_index)
  363. {
  364. WWASSERT(stage >= 0);
  365. WWASSERT(stage < MeshBuilderClass::MAX_STAGES);
  366. WWASSERT(array_index >= 0);
  367. WWASSERT(array_index < 8);
  368. CRCDirty=true;
  369. UVSource[stage] = array_index;
  370. }
  371. int VertexMaterialClass::Get_UV_Source(int stage)
  372. {
  373. WWASSERT(stage >= 0);
  374. WWASSERT(stage < MeshBuilderClass::MAX_STAGES);
  375. return UVSource[stage];
  376. }
  377. void VertexMaterialClass::Init_From_Material3(const W3dMaterial3Struct & mat3)
  378. {
  379. Vector3 tmp0,tmp1,tmp2;
  380. W3dUtilityClass::Convert_Color(mat3.DiffuseColor,&tmp0);
  381. W3dUtilityClass::Convert_Color(mat3.DiffuseCoefficients,&tmp1);
  382. tmp2.X = tmp0.X * tmp1.X;
  383. tmp2.Y = tmp0.Y * tmp1.Y;
  384. tmp2.Z = tmp0.Z * tmp1.Z;
  385. Set_Diffuse(tmp2);
  386. W3dUtilityClass::Convert_Color(mat3.SpecularColor,&tmp0);
  387. W3dUtilityClass::Convert_Color(mat3.SpecularCoefficients,&tmp1);
  388. tmp2.X = tmp0.X * tmp1.X;
  389. tmp2.Y = tmp0.Y * tmp1.Y;
  390. tmp2.Z = tmp0.Z * tmp1.Z;
  391. Set_Specular(tmp2);
  392. W3dUtilityClass::Convert_Color(mat3.EmissiveCoefficients,&tmp0);
  393. Set_Emissive(tmp0);
  394. W3dUtilityClass::Convert_Color(mat3.AmbientCoefficients,&tmp0);
  395. Set_Ambient(tmp0);
  396. Set_Shininess(mat3.Shininess);
  397. Set_Opacity(mat3.Opacity);
  398. }
  399. WW3DErrorType VertexMaterialClass::Load_W3D(ChunkLoadClass & cload)
  400. {
  401. char name[256];
  402. W3dVertexMaterialStruct vmat;
  403. bool hasname = false;
  404. char *mapping0_arg_buffer = NULL;
  405. char *mapping1_arg_buffer = NULL;
  406. unsigned int mapping0_arg_len = 0U;
  407. unsigned int mapping1_arg_len = 0U;
  408. while (cload.Open_Chunk()) {
  409. switch (cload.Cur_Chunk_ID()) {
  410. case W3D_CHUNK_VERTEX_MATERIAL_NAME:
  411. cload.Read(&name,cload.Cur_Chunk_Length());
  412. hasname = true;
  413. break;
  414. case W3D_CHUNK_VERTEX_MATERIAL_INFO:
  415. if (cload.Read(&vmat,sizeof(vmat)) != sizeof(vmat)) {
  416. return WW3D_ERROR_LOAD_FAILED;
  417. }
  418. break;
  419. case W3D_CHUNK_VERTEX_MAPPER_ARGS0:
  420. mapping0_arg_len = cload.Cur_Chunk_Length();
  421. mapping0_arg_buffer = MSGW3DNEWARRAY("VertexMaterialClassTemp") char[mapping0_arg_len];
  422. if (cload.Read(mapping0_arg_buffer, mapping0_arg_len) != mapping0_arg_len) {
  423. return WW3D_ERROR_LOAD_FAILED;
  424. }
  425. break;
  426. case W3D_CHUNK_VERTEX_MAPPER_ARGS1:
  427. mapping1_arg_len = cload.Cur_Chunk_Length();
  428. mapping1_arg_buffer = MSGW3DNEWARRAY("VertexMaterialClassTemp") char[mapping1_arg_len];
  429. if (cload.Read(mapping1_arg_buffer, mapping1_arg_len) != mapping1_arg_len) {
  430. return WW3D_ERROR_LOAD_FAILED;
  431. }
  432. break;
  433. };
  434. cload.Close_Chunk();
  435. }
  436. if (hasname) {
  437. Set_Name(name);
  438. }
  439. // Read an INIClass from the mapping argument buffer - this will be used
  440. // to initialize any special mappers used.
  441. INIClass mapping0_arg_ini;
  442. if (mapping0_arg_buffer) {
  443. char *extended_arg_buffer = MSGW3DNEWARRAY("VertexMaterialClassTemp") char[mapping0_arg_len + 10];
  444. sprintf(extended_arg_buffer, "[Args]\n%s", mapping0_arg_buffer);
  445. mapping0_arg_len = strlen(extended_arg_buffer) + 1;
  446. delete [] mapping0_arg_buffer;
  447. mapping0_arg_buffer = NULL;
  448. BufferStraw map_arg_buf_straw((void *)extended_arg_buffer, mapping0_arg_len);
  449. mapping0_arg_ini.Load(map_arg_buf_straw);
  450. delete [] extended_arg_buffer;
  451. extended_arg_buffer = NULL;
  452. }
  453. INIClass mapping1_arg_ini;
  454. if (mapping1_arg_buffer) {
  455. char *extended_arg_buffer = MSGW3DNEWARRAY("VertexMaterialClassTemp") char[mapping1_arg_len + 20];
  456. sprintf(extended_arg_buffer, "[Args]\n%s", mapping1_arg_buffer);
  457. mapping1_arg_len = strlen(extended_arg_buffer) + 1;
  458. delete [] mapping1_arg_buffer;
  459. mapping1_arg_buffer = NULL;
  460. BufferStraw map_arg_buf_straw((void *)extended_arg_buffer, mapping1_arg_len);
  461. mapping1_arg_ini.Load(map_arg_buf_straw);
  462. delete [] extended_arg_buffer;
  463. extended_arg_buffer = NULL;
  464. }
  465. if (vmat.Attributes & W3DVERTMAT_USE_DEPTH_CUE) {
  466. Set_Flag(VertexMaterialClass::DEPTH_CUE,true);
  467. }
  468. if (vmat.Attributes & W3DVERTMAT_COPY_SPECULAR_TO_DIFFUSE) {
  469. Set_Flag(VertexMaterialClass::COPY_SPECULAR_TO_DIFFUSE,true);
  470. }
  471. // Set up the vertex mapper. If it is one of the simple
  472. // ones, set the pointer to one of the global instances.
  473. int mapping = vmat.Attributes & W3DVERTMAT_STAGE0_MAPPING_MASK;
  474. switch(mapping) {
  475. case W3DVERTMAT_STAGE0_MAPPING_UV:
  476. break;
  477. case W3DVERTMAT_STAGE0_MAPPING_ENVIRONMENT:
  478. {
  479. EnvironmentMapperClass *mapper = NEW_REF(EnvironmentMapperClass,(0));
  480. Set_Mapper(mapper);
  481. mapper->Release_Ref();
  482. }
  483. break;
  484. case W3DVERTMAT_STAGE0_MAPPING_CHEAP_ENVIRONMENT:
  485. {
  486. ClassicEnvironmentMapperClass *mapper = NEW_REF(ClassicEnvironmentMapperClass,(0));
  487. Set_Mapper(mapper);
  488. mapper->Release_Ref();
  489. }
  490. break;
  491. case W3DVERTMAT_STAGE0_MAPPING_LINEAR_OFFSET:
  492. {
  493. LinearOffsetTextureMapperClass *mapper =
  494. NEW_REF(LinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  495. Set_Mapper(mapper);
  496. mapper->Release_Ref();
  497. }
  498. break;
  499. case W3DVERTMAT_STAGE0_MAPPING_SCREEN:
  500. {
  501. ScreenMapperClass *mapper =
  502. NEW_REF(ScreenMapperClass,(mapping0_arg_ini, "Args", 0));
  503. Set_Mapper(mapper);
  504. mapper->Release_Ref();
  505. }
  506. break;
  507. case W3DVERTMAT_STAGE0_MAPPING_SCALE:
  508. {
  509. ScaleTextureMapperClass *mapper =
  510. NEW_REF(ScaleTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  511. Set_Mapper(mapper);
  512. mapper->Release_Ref();
  513. }
  514. break;
  515. case W3DVERTMAT_STAGE0_MAPPING_GRID:
  516. {
  517. GridTextureMapperClass *mapper =
  518. NEW_REF(GridTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  519. Set_Mapper(mapper,0);
  520. mapper->Release_Ref();
  521. }
  522. break;
  523. case W3DVERTMAT_STAGE0_MAPPING_ROTATE:
  524. {
  525. RotateTextureMapperClass *mapper =
  526. NEW_REF(RotateTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  527. Set_Mapper(mapper,0);
  528. mapper->Release_Ref();
  529. }
  530. break;
  531. case W3DVERTMAT_STAGE0_MAPPING_SINE_LINEAR_OFFSET:
  532. {
  533. SineLinearOffsetTextureMapperClass *mapper =
  534. NEW_REF(SineLinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  535. Set_Mapper(mapper,0);
  536. mapper->Release_Ref();
  537. }
  538. break;
  539. case W3DVERTMAT_STAGE0_MAPPING_STEP_LINEAR_OFFSET:
  540. {
  541. StepLinearOffsetTextureMapperClass *mapper =
  542. NEW_REF(StepLinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  543. Set_Mapper(mapper,0);
  544. mapper->Release_Ref();
  545. }
  546. break;
  547. case W3DVERTMAT_STAGE0_MAPPING_ZIGZAG_LINEAR_OFFSET:
  548. {
  549. ZigZagLinearOffsetTextureMapperClass *mapper =
  550. NEW_REF(ZigZagLinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  551. Set_Mapper(mapper,0);
  552. mapper->Release_Ref();
  553. }
  554. break;
  555. case W3DVERTMAT_STAGE0_MAPPING_WS_CLASSIC_ENV:
  556. {
  557. WSClassicEnvironmentMapperClass *mapper = NEW_REF(WSClassicEnvironmentMapperClass,(0));
  558. Set_Mapper(mapper,0);
  559. mapper->Release_Ref();
  560. }
  561. break;
  562. case W3DVERTMAT_STAGE0_MAPPING_WS_ENVIRONMENT:
  563. {
  564. WSEnvironmentMapperClass *mapper = NEW_REF(WSEnvironmentMapperClass,(0));
  565. Set_Mapper(mapper,0);
  566. mapper->Release_Ref();
  567. }
  568. break;
  569. case W3DVERTMAT_STAGE0_MAPPING_GRID_CLASSIC_ENV:
  570. {
  571. GridClassicEnvironmentMapperClass *mapper =
  572. NEW_REF(GridClassicEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
  573. Set_Mapper(mapper,0);
  574. mapper->Release_Ref();
  575. }
  576. break;
  577. case W3DVERTMAT_STAGE0_MAPPING_GRID_ENVIRONMENT:
  578. {
  579. GridEnvironmentMapperClass *mapper =
  580. NEW_REF(GridEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
  581. Set_Mapper(mapper,0);
  582. mapper->Release_Ref();
  583. }
  584. break;
  585. case W3DVERTMAT_STAGE0_MAPPING_RANDOM:
  586. {
  587. RandomTextureMapperClass *mapper =
  588. NEW_REF(RandomTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  589. Set_Mapper(mapper,0);
  590. mapper->Release_Ref();
  591. }
  592. break;
  593. case W3DVERTMAT_STAGE0_MAPPING_EDGE:
  594. {
  595. EdgeMapperClass *mapper =
  596. NEW_REF(EdgeMapperClass,(mapping0_arg_ini, "Args", 0));
  597. Set_Mapper(mapper,0);
  598. mapper->Release_Ref();
  599. }
  600. break;
  601. case W3DVERTMAT_STAGE0_MAPPING_BUMPENV:
  602. {
  603. BumpEnvTextureMapperClass *mapper =
  604. NEW_REF(BumpEnvTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  605. Set_Mapper(mapper,0);
  606. mapper->Release_Ref();
  607. }
  608. break;
  609. default:
  610. WWDEBUG_SAY(("Unsupported mapper in %s\n",name));
  611. break;
  612. }
  613. // Same setup for stage 1's mapper.
  614. mapping = vmat.Attributes & W3DVERTMAT_STAGE1_MAPPING_MASK;
  615. switch(mapping) {
  616. case W3DVERTMAT_STAGE1_MAPPING_UV:
  617. break;
  618. case W3DVERTMAT_STAGE1_MAPPING_ENVIRONMENT:
  619. {
  620. EnvironmentMapperClass *mapper = W3DNEW EnvironmentMapperClass(1);
  621. Set_Mapper(mapper, 1);
  622. mapper->Release_Ref();
  623. }
  624. break;
  625. case W3DVERTMAT_STAGE1_MAPPING_CHEAP_ENVIRONMENT:
  626. {
  627. ClassicEnvironmentMapperClass *mapper = W3DNEW ClassicEnvironmentMapperClass(1);
  628. Set_Mapper(mapper, 1);
  629. mapper->Release_Ref();
  630. }
  631. break;
  632. case W3DVERTMAT_STAGE1_MAPPING_LINEAR_OFFSET:
  633. {
  634. LinearOffsetTextureMapperClass *mapper =
  635. W3DNEW LinearOffsetTextureMapperClass(mapping1_arg_ini, "Args", 1);
  636. Set_Mapper(mapper, 1);
  637. mapper->Release_Ref();
  638. }
  639. break;
  640. case W3DVERTMAT_STAGE1_MAPPING_SCREEN:
  641. {
  642. ScreenMapperClass *mapper =
  643. W3DNEW ScreenMapperClass(mapping1_arg_ini, "Args", 1);
  644. Set_Mapper(mapper, 1);
  645. mapper->Release_Ref();
  646. }
  647. break;
  648. case W3DVERTMAT_STAGE1_MAPPING_SCALE:
  649. {
  650. ScaleTextureMapperClass *mapper =
  651. NEW_REF(ScaleTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  652. Set_Mapper(mapper,1);
  653. mapper->Release_Ref();
  654. }
  655. break;
  656. case W3DVERTMAT_STAGE1_MAPPING_GRID:
  657. {
  658. GridTextureMapperClass *mapper =
  659. NEW_REF(GridTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  660. Set_Mapper(mapper,1);
  661. mapper->Release_Ref();
  662. }
  663. break;
  664. case W3DVERTMAT_STAGE1_MAPPING_ROTATE:
  665. {
  666. RotateTextureMapperClass *mapper =
  667. NEW_REF(RotateTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  668. Set_Mapper(mapper,1);
  669. mapper->Release_Ref();
  670. }
  671. break;
  672. case W3DVERTMAT_STAGE1_MAPPING_SINE_LINEAR_OFFSET:
  673. {
  674. SineLinearOffsetTextureMapperClass *mapper =
  675. NEW_REF(SineLinearOffsetTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  676. Set_Mapper(mapper,1);
  677. mapper->Release_Ref();
  678. }
  679. break;
  680. case W3DVERTMAT_STAGE1_MAPPING_STEP_LINEAR_OFFSET:
  681. {
  682. StepLinearOffsetTextureMapperClass *mapper =
  683. NEW_REF(StepLinearOffsetTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  684. Set_Mapper(mapper,1);
  685. mapper->Release_Ref();
  686. }
  687. break;
  688. case W3DVERTMAT_STAGE1_MAPPING_ZIGZAG_LINEAR_OFFSET:
  689. {
  690. ZigZagLinearOffsetTextureMapperClass *mapper =
  691. NEW_REF(ZigZagLinearOffsetTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  692. Set_Mapper(mapper,1);
  693. mapper->Release_Ref();
  694. }
  695. break;
  696. case W3DVERTMAT_STAGE1_MAPPING_WS_CLASSIC_ENV:
  697. {
  698. WSClassicEnvironmentMapperClass *mapper = NEW_REF(WSClassicEnvironmentMapperClass,(1));
  699. Set_Mapper(mapper,1);
  700. mapper->Release_Ref();
  701. }
  702. break;
  703. case W3DVERTMAT_STAGE1_MAPPING_WS_ENVIRONMENT:
  704. {
  705. WSEnvironmentMapperClass *mapper = NEW_REF(WSEnvironmentMapperClass,(1));
  706. Set_Mapper(mapper,1);
  707. mapper->Release_Ref();
  708. }
  709. break;
  710. case W3DVERTMAT_STAGE1_MAPPING_GRID_CLASSIC_ENV:
  711. {
  712. GridClassicEnvironmentMapperClass *mapper =
  713. NEW_REF(GridClassicEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
  714. Set_Mapper(mapper,1);
  715. mapper->Release_Ref();
  716. }
  717. break;
  718. case W3DVERTMAT_STAGE1_MAPPING_GRID_ENVIRONMENT:
  719. {
  720. GridEnvironmentMapperClass *mapper =
  721. NEW_REF(GridEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
  722. Set_Mapper(mapper,1);
  723. mapper->Release_Ref();
  724. }
  725. break;
  726. case W3DVERTMAT_STAGE1_MAPPING_RANDOM:
  727. {
  728. RandomTextureMapperClass *mapper =
  729. NEW_REF(RandomTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  730. Set_Mapper(mapper,1);
  731. mapper->Release_Ref();
  732. }
  733. break;
  734. case W3DVERTMAT_STAGE1_MAPPING_EDGE:
  735. {
  736. EdgeMapperClass *mapper =
  737. NEW_REF(EdgeMapperClass,(mapping1_arg_ini, "Args", 1));
  738. Set_Mapper(mapper,1);
  739. mapper->Release_Ref();
  740. }
  741. break;
  742. case W3DVERTMAT_STAGE0_MAPPING_BUMPENV:
  743. {
  744. BumpEnvTextureMapperClass *mapper =
  745. NEW_REF(BumpEnvTextureMapperClass,(mapping1_arg_ini, "Args", 0));
  746. Set_Mapper(mapper,1);
  747. mapper->Release_Ref();
  748. }
  749. break;
  750. default:
  751. WWDEBUG_SAY(("Unsupported mapper in %s\n",name));
  752. break;
  753. }
  754. Vector3 tmp;
  755. W3dUtilityClass::Convert_Color(vmat.Ambient,&tmp);
  756. Set_Ambient(tmp);
  757. W3dUtilityClass::Convert_Color(vmat.Diffuse,&tmp);
  758. Set_Diffuse(tmp);
  759. W3dUtilityClass::Convert_Color(vmat.Specular,&tmp);
  760. Set_Specular(tmp);
  761. W3dUtilityClass::Convert_Color(vmat.Emissive,&tmp);
  762. Set_Emissive(tmp);
  763. Set_Shininess(vmat.Shininess);
  764. Set_Opacity(vmat.Opacity);
  765. return WW3D_ERROR_OK;
  766. }
  767. WW3DErrorType VertexMaterialClass::Save_W3D(ChunkSaveClass & csave)
  768. {
  769. WWASSERT(0);
  770. return WW3D_ERROR_OK;
  771. }
  772. void VertexMaterialClass::Apply(void) const
  773. {
  774. int i;
  775. DX8Wrapper::Set_DX8_Material(Material);
  776. if (WW3D::Is_Coloring_Enabled())
  777. DX8Wrapper::Set_DX8_Render_State(D3DRS_LIGHTING,FALSE);
  778. else
  779. DX8Wrapper::Set_DX8_Render_State(D3DRS_LIGHTING,UseLighting);
  780. DX8Wrapper::Set_DX8_Render_State(D3DRS_AMBIENTMATERIALSOURCE,AmbientColorSource);
  781. DX8Wrapper::Set_DX8_Render_State(D3DRS_DIFFUSEMATERIALSOURCE,DiffuseColorSource);
  782. DX8Wrapper::Set_DX8_Render_State(D3DRS_EMISSIVEMATERIALSOURCE,EmissiveColorSource);
  783. // set to default values if no mappers
  784. for (i=0; i<MeshBuilderClass::MAX_STAGES; i++) {
  785. if (Mapper[i]) {
  786. Mapper[i]->Apply(UVSource[i]);
  787. } else {
  788. DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_PASSTHRU | UVSource[i]);
  789. DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE);
  790. }
  791. }
  792. }
  793. void VertexMaterialClass::Apply_Null(void)
  794. {
  795. int i;
  796. static D3DMATERIAL8 default_settings =
  797. {
  798. { 1.0f, 1.0f, 1.0f, 1.0f }, // diffuse
  799. { 1.0f, 1.0f, 1.0f, 1.0f }, // ambient
  800. { 0.0f, 0.0f, 0.0f, 0.0f }, // specular
  801. { 0.0f, 0.0f, 0.0f, 0.0f }, // emissive
  802. 1.0f // power
  803. };
  804. DX8Wrapper::Set_DX8_Render_State(D3DRS_LIGHTING,FALSE);
  805. DX8Wrapper::Set_DX8_Material(&default_settings);
  806. DX8Wrapper::Set_DX8_Render_State(D3DRS_AMBIENTMATERIALSOURCE,D3DMCS_MATERIAL);
  807. DX8Wrapper::Set_DX8_Render_State(D3DRS_DIFFUSEMATERIALSOURCE,D3DMCS_MATERIAL);
  808. DX8Wrapper::Set_DX8_Render_State(D3DRS_EMISSIVEMATERIALSOURCE,D3DMCS_MATERIAL);
  809. // set to default values if no mappers
  810. for (i=0; i<MeshBuilderClass::MAX_STAGES; i++) {
  811. DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_PASSTHRU | i);
  812. DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE);
  813. }
  814. }
  815. /***********************************************************************************************
  816. * Init -- init code *
  817. * *
  818. * *
  819. * *
  820. * *
  821. * INPUT: *
  822. * *
  823. * OUTPUT: *
  824. * *
  825. * WARNINGS: *
  826. * *
  827. * HISTORY: *
  828. * 2/14/2001 hy : Created. *
  829. *=============================================================================================*/
  830. void VertexMaterialClass::Init()
  831. {
  832. int i;
  833. for (i=0; i<PRESET_COUNT;i++)
  834. Presets[i]=NEW_REF(VertexMaterialClass,());
  835. // Set up presets
  836. Presets[PRELIT_DIFFUSE]->Set_Diffuse_Color_Source(VertexMaterialClass::COLOR1);
  837. Presets[PRELIT_DIFFUSE]->Set_Lighting(false);
  838. Presets[PRELIT_NODIFFUSE]->Set_Lighting(false);
  839. }
  840. /***********************************************************************************************
  841. * Shutdown -- shutdown code *
  842. * *
  843. * *
  844. * *
  845. * *
  846. * INPUT: *
  847. * *
  848. * OUTPUT: *
  849. * *
  850. * WARNINGS: *
  851. * *
  852. * HISTORY: *
  853. * 2/14/2001 hy : Created. *
  854. *=============================================================================================*/
  855. void VertexMaterialClass::Shutdown()
  856. {
  857. int i;
  858. for (i=0; i<PRESET_COUNT;i++)
  859. REF_PTR_RELEASE(Presets[i]);
  860. }
  861. /***********************************************************************************************
  862. * Get_Preset -- retrieve presets *
  863. * *
  864. * *
  865. * *
  866. * *
  867. * INPUT: *
  868. * *
  869. * OUTPUT: *
  870. * *
  871. * WARNINGS: *
  872. * *
  873. * HISTORY: *
  874. * 2/14/2001 hy : Created. *
  875. *=============================================================================================*/
  876. VertexMaterialClass * VertexMaterialClass::Get_Preset(PresetType type)
  877. {
  878. WWASSERT(type<PRESET_COUNT);
  879. Presets[type]->Add_Ref();
  880. return Presets[type];
  881. }