vertmaterial.cpp 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072
  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. *** 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. Parse_W3dVertexMaterialStruct(vmat);
  440. Parse_Mapping_Args(vmat,mapping0_arg_buffer,mapping1_arg_buffer);
  441. delete [] mapping0_arg_buffer;
  442. mapping0_arg_buffer = NULL;
  443. delete [] mapping1_arg_buffer;
  444. mapping1_arg_buffer = NULL;
  445. return WW3D_ERROR_OK;
  446. }
  447. void VertexMaterialClass::Parse_W3dVertexMaterialStruct(const W3dVertexMaterialStruct & vmat)
  448. {
  449. Vector3 tmp;
  450. W3dUtilityClass::Convert_Color(vmat.Ambient,&tmp);
  451. Set_Ambient(tmp);
  452. W3dUtilityClass::Convert_Color(vmat.Diffuse,&tmp);
  453. Set_Diffuse(tmp);
  454. W3dUtilityClass::Convert_Color(vmat.Specular,&tmp);
  455. Set_Specular(tmp);
  456. W3dUtilityClass::Convert_Color(vmat.Emissive,&tmp);
  457. Set_Emissive(tmp);
  458. Set_Shininess(vmat.Shininess);
  459. Set_Opacity(vmat.Opacity);
  460. if (vmat.Attributes & W3DVERTMAT_USE_DEPTH_CUE) {
  461. Set_Flag(VertexMaterialClass::DEPTH_CUE,true);
  462. }
  463. if (vmat.Attributes & W3DVERTMAT_COPY_SPECULAR_TO_DIFFUSE) {
  464. Set_Flag(VertexMaterialClass::COPY_SPECULAR_TO_DIFFUSE,true);
  465. }
  466. }
  467. void VertexMaterialClass::Parse_Mapping_Args(const W3dVertexMaterialStruct & vmat,char * mapping0_arg_buffer,char * mapping1_arg_buffer)
  468. {
  469. // Read an INIClass from the mapping argument buffer - this will be used
  470. // to initialize any special mappers used.
  471. INIClass mapping0_arg_ini;
  472. if (mapping0_arg_buffer) {
  473. int mapping0_arg_len = strlen(mapping0_arg_buffer);
  474. char *extended_arg_buffer = MSGW3DNEWARRAY("VertexMaterialClassTemp") char[mapping0_arg_len + 10];
  475. sprintf(extended_arg_buffer, "[Args]\n%s", mapping0_arg_buffer);
  476. mapping0_arg_len = strlen(extended_arg_buffer) + 1;
  477. BufferStraw map_arg_buf_straw((void *)extended_arg_buffer, mapping0_arg_len);
  478. mapping0_arg_ini.Load(map_arg_buf_straw);
  479. delete [] extended_arg_buffer;
  480. extended_arg_buffer = NULL;
  481. }
  482. INIClass mapping1_arg_ini;
  483. if (mapping1_arg_buffer) {
  484. int mapping1_arg_len = strlen(mapping1_arg_buffer);
  485. char *extended_arg_buffer = MSGW3DNEWARRAY("VertexMaterialClassTemp") char[mapping1_arg_len + 20];
  486. sprintf(extended_arg_buffer, "[Args]\n%s", mapping1_arg_buffer);
  487. mapping1_arg_len = strlen(extended_arg_buffer) + 1;
  488. BufferStraw map_arg_buf_straw((void *)extended_arg_buffer, mapping1_arg_len);
  489. mapping1_arg_ini.Load(map_arg_buf_straw);
  490. delete [] extended_arg_buffer;
  491. extended_arg_buffer = NULL;
  492. }
  493. // Set up the vertex mapper. If it is one of the simple
  494. // ones, set the pointer to one of the global instances.
  495. int mapping = vmat.Attributes & W3DVERTMAT_STAGE0_MAPPING_MASK;
  496. switch(mapping) {
  497. case W3DVERTMAT_STAGE0_MAPPING_UV:
  498. break;
  499. case W3DVERTMAT_STAGE0_MAPPING_ENVIRONMENT:
  500. {
  501. EnvironmentMapperClass *mapper = NEW_REF(EnvironmentMapperClass,(0));
  502. Set_Mapper(mapper);
  503. mapper->Release_Ref();
  504. }
  505. break;
  506. case W3DVERTMAT_STAGE0_MAPPING_CHEAP_ENVIRONMENT:
  507. {
  508. ClassicEnvironmentMapperClass *mapper = NEW_REF(ClassicEnvironmentMapperClass,(0));
  509. Set_Mapper(mapper);
  510. mapper->Release_Ref();
  511. }
  512. break;
  513. case W3DVERTMAT_STAGE0_MAPPING_LINEAR_OFFSET:
  514. {
  515. LinearOffsetTextureMapperClass *mapper =
  516. NEW_REF(LinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  517. Set_Mapper(mapper);
  518. mapper->Release_Ref();
  519. }
  520. break;
  521. case W3DVERTMAT_STAGE0_MAPPING_SCREEN:
  522. {
  523. ScreenMapperClass *mapper =
  524. NEW_REF(ScreenMapperClass,(mapping0_arg_ini, "Args", 0));
  525. Set_Mapper(mapper);
  526. mapper->Release_Ref();
  527. }
  528. break;
  529. case W3DVERTMAT_STAGE0_MAPPING_SCALE:
  530. {
  531. ScaleTextureMapperClass *mapper =
  532. NEW_REF(ScaleTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  533. Set_Mapper(mapper);
  534. mapper->Release_Ref();
  535. }
  536. break;
  537. case W3DVERTMAT_STAGE0_MAPPING_GRID:
  538. {
  539. GridTextureMapperClass *mapper =
  540. NEW_REF(GridTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  541. Set_Mapper(mapper,0);
  542. mapper->Release_Ref();
  543. }
  544. break;
  545. case W3DVERTMAT_STAGE0_MAPPING_ROTATE:
  546. {
  547. RotateTextureMapperClass *mapper =
  548. NEW_REF(RotateTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  549. Set_Mapper(mapper,0);
  550. mapper->Release_Ref();
  551. }
  552. break;
  553. case W3DVERTMAT_STAGE0_MAPPING_SINE_LINEAR_OFFSET:
  554. {
  555. SineLinearOffsetTextureMapperClass *mapper =
  556. NEW_REF(SineLinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  557. Set_Mapper(mapper,0);
  558. mapper->Release_Ref();
  559. }
  560. break;
  561. case W3DVERTMAT_STAGE0_MAPPING_STEP_LINEAR_OFFSET:
  562. {
  563. StepLinearOffsetTextureMapperClass *mapper =
  564. NEW_REF(StepLinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  565. Set_Mapper(mapper,0);
  566. mapper->Release_Ref();
  567. }
  568. break;
  569. case W3DVERTMAT_STAGE0_MAPPING_ZIGZAG_LINEAR_OFFSET:
  570. {
  571. ZigZagLinearOffsetTextureMapperClass *mapper =
  572. NEW_REF(ZigZagLinearOffsetTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  573. Set_Mapper(mapper,0);
  574. mapper->Release_Ref();
  575. }
  576. break;
  577. case W3DVERTMAT_STAGE0_MAPPING_WS_CLASSIC_ENV:
  578. {
  579. WSClassicEnvironmentMapperClass *mapper = NEW_REF(WSClassicEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
  580. Set_Mapper(mapper,0);
  581. mapper->Release_Ref();
  582. }
  583. break;
  584. case W3DVERTMAT_STAGE0_MAPPING_WS_ENVIRONMENT:
  585. {
  586. WSEnvironmentMapperClass *mapper = NEW_REF(WSEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
  587. Set_Mapper(mapper,0);
  588. mapper->Release_Ref();
  589. }
  590. break;
  591. case W3DVERTMAT_STAGE0_MAPPING_GRID_CLASSIC_ENV:
  592. {
  593. GridClassicEnvironmentMapperClass *mapper =
  594. NEW_REF(GridClassicEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
  595. Set_Mapper(mapper,0);
  596. mapper->Release_Ref();
  597. }
  598. break;
  599. case W3DVERTMAT_STAGE0_MAPPING_GRID_ENVIRONMENT:
  600. {
  601. GridEnvironmentMapperClass *mapper =
  602. NEW_REF(GridEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
  603. Set_Mapper(mapper,0);
  604. mapper->Release_Ref();
  605. }
  606. break;
  607. case W3DVERTMAT_STAGE0_MAPPING_RANDOM:
  608. {
  609. RandomTextureMapperClass *mapper =
  610. NEW_REF(RandomTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  611. Set_Mapper(mapper,0);
  612. mapper->Release_Ref();
  613. }
  614. break;
  615. case W3DVERTMAT_STAGE0_MAPPING_EDGE:
  616. {
  617. EdgeMapperClass *mapper =
  618. NEW_REF(EdgeMapperClass,(mapping0_arg_ini, "Args", 0));
  619. Set_Mapper(mapper,0);
  620. mapper->Release_Ref();
  621. }
  622. break;
  623. case W3DVERTMAT_STAGE0_MAPPING_BUMPENV:
  624. {
  625. BumpEnvTextureMapperClass *mapper =
  626. NEW_REF(BumpEnvTextureMapperClass,(mapping0_arg_ini, "Args", 0));
  627. Set_Mapper(mapper,0);
  628. mapper->Release_Ref();
  629. }
  630. break;
  631. case W3DVERTMAT_STAGE0_MAPPING_GRID_WS_CLASSIC_ENV:
  632. {
  633. GridWSClassicEnvironmentMapperClass *mapper =
  634. NEW_REF(GridWSClassicEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
  635. Set_Mapper(mapper,0);
  636. mapper->Release_Ref();
  637. }
  638. break;
  639. case W3DVERTMAT_STAGE0_MAPPING_GRID_WS_ENVIRONMENT:
  640. {
  641. GridWSEnvironmentMapperClass *mapper =
  642. NEW_REF(GridWSEnvironmentMapperClass,(mapping0_arg_ini, "Args", 0));
  643. Set_Mapper(mapper,0);
  644. mapper->Release_Ref();
  645. }
  646. break;
  647. default:
  648. break;
  649. }
  650. // Same setup for stage 1's mapper.
  651. mapping = vmat.Attributes & W3DVERTMAT_STAGE1_MAPPING_MASK;
  652. switch(mapping) {
  653. case W3DVERTMAT_STAGE1_MAPPING_UV:
  654. break;
  655. case W3DVERTMAT_STAGE1_MAPPING_ENVIRONMENT:
  656. {
  657. EnvironmentMapperClass *mapper = W3DNEW EnvironmentMapperClass(1);
  658. Set_Mapper(mapper, 1);
  659. mapper->Release_Ref();
  660. }
  661. break;
  662. case W3DVERTMAT_STAGE1_MAPPING_CHEAP_ENVIRONMENT:
  663. {
  664. ClassicEnvironmentMapperClass *mapper = W3DNEW ClassicEnvironmentMapperClass(1);
  665. Set_Mapper(mapper, 1);
  666. mapper->Release_Ref();
  667. }
  668. break;
  669. case W3DVERTMAT_STAGE1_MAPPING_LINEAR_OFFSET:
  670. {
  671. LinearOffsetTextureMapperClass *mapper =
  672. W3DNEW LinearOffsetTextureMapperClass(mapping1_arg_ini, "Args", 1);
  673. Set_Mapper(mapper, 1);
  674. mapper->Release_Ref();
  675. }
  676. break;
  677. case W3DVERTMAT_STAGE1_MAPPING_SCREEN:
  678. {
  679. ScreenMapperClass *mapper =
  680. W3DNEW ScreenMapperClass(mapping1_arg_ini, "Args", 1);
  681. Set_Mapper(mapper, 1);
  682. mapper->Release_Ref();
  683. }
  684. break;
  685. case W3DVERTMAT_STAGE1_MAPPING_SCALE:
  686. {
  687. ScaleTextureMapperClass *mapper =
  688. NEW_REF(ScaleTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  689. Set_Mapper(mapper,1);
  690. mapper->Release_Ref();
  691. }
  692. break;
  693. case W3DVERTMAT_STAGE1_MAPPING_GRID:
  694. {
  695. GridTextureMapperClass *mapper =
  696. NEW_REF(GridTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  697. Set_Mapper(mapper,1);
  698. mapper->Release_Ref();
  699. }
  700. break;
  701. case W3DVERTMAT_STAGE1_MAPPING_ROTATE:
  702. {
  703. RotateTextureMapperClass *mapper =
  704. NEW_REF(RotateTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  705. Set_Mapper(mapper,1);
  706. mapper->Release_Ref();
  707. }
  708. break;
  709. case W3DVERTMAT_STAGE1_MAPPING_SINE_LINEAR_OFFSET:
  710. {
  711. SineLinearOffsetTextureMapperClass *mapper =
  712. NEW_REF(SineLinearOffsetTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  713. Set_Mapper(mapper,1);
  714. mapper->Release_Ref();
  715. }
  716. break;
  717. case W3DVERTMAT_STAGE1_MAPPING_STEP_LINEAR_OFFSET:
  718. {
  719. StepLinearOffsetTextureMapperClass *mapper =
  720. NEW_REF(StepLinearOffsetTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  721. Set_Mapper(mapper,1);
  722. mapper->Release_Ref();
  723. }
  724. break;
  725. case W3DVERTMAT_STAGE1_MAPPING_ZIGZAG_LINEAR_OFFSET:
  726. {
  727. ZigZagLinearOffsetTextureMapperClass *mapper =
  728. NEW_REF(ZigZagLinearOffsetTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  729. Set_Mapper(mapper,1);
  730. mapper->Release_Ref();
  731. }
  732. break;
  733. case W3DVERTMAT_STAGE1_MAPPING_WS_CLASSIC_ENV:
  734. {
  735. WSClassicEnvironmentMapperClass *mapper = NEW_REF(WSClassicEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
  736. Set_Mapper(mapper,1);
  737. mapper->Release_Ref();
  738. }
  739. break;
  740. case W3DVERTMAT_STAGE1_MAPPING_WS_ENVIRONMENT:
  741. {
  742. WSEnvironmentMapperClass *mapper = NEW_REF(WSEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
  743. Set_Mapper(mapper,1);
  744. mapper->Release_Ref();
  745. }
  746. break;
  747. case W3DVERTMAT_STAGE1_MAPPING_GRID_CLASSIC_ENV:
  748. {
  749. GridClassicEnvironmentMapperClass *mapper =
  750. NEW_REF(GridClassicEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
  751. Set_Mapper(mapper,1);
  752. mapper->Release_Ref();
  753. }
  754. break;
  755. case W3DVERTMAT_STAGE1_MAPPING_GRID_ENVIRONMENT:
  756. {
  757. GridEnvironmentMapperClass *mapper =
  758. NEW_REF(GridEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
  759. Set_Mapper(mapper,1);
  760. mapper->Release_Ref();
  761. }
  762. break;
  763. case W3DVERTMAT_STAGE1_MAPPING_RANDOM:
  764. {
  765. RandomTextureMapperClass *mapper =
  766. NEW_REF(RandomTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  767. Set_Mapper(mapper,1);
  768. mapper->Release_Ref();
  769. }
  770. break;
  771. case W3DVERTMAT_STAGE1_MAPPING_EDGE:
  772. {
  773. EdgeMapperClass *mapper =
  774. NEW_REF(EdgeMapperClass,(mapping1_arg_ini, "Args", 1));
  775. Set_Mapper(mapper,1);
  776. mapper->Release_Ref();
  777. }
  778. break;
  779. case W3DVERTMAT_STAGE1_MAPPING_BUMPENV:
  780. {
  781. BumpEnvTextureMapperClass *mapper =
  782. NEW_REF(BumpEnvTextureMapperClass,(mapping1_arg_ini, "Args", 1));
  783. Set_Mapper(mapper,1);
  784. mapper->Release_Ref();
  785. }
  786. break;
  787. case W3DVERTMAT_STAGE1_MAPPING_GRID_WS_CLASSIC_ENV:
  788. {
  789. GridWSClassicEnvironmentMapperClass *mapper =
  790. NEW_REF(GridWSClassicEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
  791. Set_Mapper(mapper,1);
  792. mapper->Release_Ref();
  793. }
  794. break;
  795. case W3DVERTMAT_STAGE1_MAPPING_GRID_WS_ENVIRONMENT:
  796. {
  797. GridWSEnvironmentMapperClass *mapper =
  798. NEW_REF(GridWSEnvironmentMapperClass,(mapping1_arg_ini, "Args", 1));
  799. Set_Mapper(mapper,1);
  800. mapper->Release_Ref();
  801. }
  802. break;
  803. default:
  804. break;
  805. }
  806. }
  807. WW3DErrorType VertexMaterialClass::Save_W3D(ChunkSaveClass & csave)
  808. {
  809. WWASSERT(0);
  810. return WW3D_ERROR_OK;
  811. }
  812. void VertexMaterialClass::Apply(void) const
  813. {
  814. int i;
  815. DX8Wrapper::Set_DX8_Material(Material);
  816. if (WW3D::Is_Coloring_Enabled())
  817. DX8Wrapper::Set_DX8_Render_State(D3DRS_LIGHTING,FALSE);
  818. else
  819. DX8Wrapper::Set_DX8_Render_State(D3DRS_LIGHTING,UseLighting);
  820. DX8Wrapper::Set_DX8_Render_State(D3DRS_AMBIENTMATERIALSOURCE,AmbientColorSource);
  821. DX8Wrapper::Set_DX8_Render_State(D3DRS_DIFFUSEMATERIALSOURCE,DiffuseColorSource);
  822. DX8Wrapper::Set_DX8_Render_State(D3DRS_EMISSIVEMATERIALSOURCE,EmissiveColorSource);
  823. // set to default values if no mappers
  824. for (i=0; i<MeshBuilderClass::MAX_STAGES; i++) {
  825. if (Mapper[i]) {
  826. Mapper[i]->Apply(UVSource[i]);
  827. } else {
  828. DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_PASSTHRU | UVSource[i]);
  829. DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE);
  830. }
  831. }
  832. }
  833. void VertexMaterialClass::Apply_Null(void)
  834. {
  835. int i;
  836. static D3DMATERIAL8 default_settings =
  837. {
  838. { 1.0f, 1.0f, 1.0f, 1.0f }, // diffuse
  839. { 1.0f, 1.0f, 1.0f, 1.0f }, // ambient
  840. { 0.0f, 0.0f, 0.0f, 0.0f }, // specular
  841. { 0.0f, 0.0f, 0.0f, 0.0f }, // emissive
  842. 1.0f // power
  843. };
  844. DX8Wrapper::Set_DX8_Render_State(D3DRS_LIGHTING,FALSE);
  845. DX8Wrapper::Set_DX8_Material(&default_settings);
  846. DX8Wrapper::Set_DX8_Render_State(D3DRS_AMBIENTMATERIALSOURCE,D3DMCS_MATERIAL);
  847. DX8Wrapper::Set_DX8_Render_State(D3DRS_DIFFUSEMATERIALSOURCE,D3DMCS_MATERIAL);
  848. DX8Wrapper::Set_DX8_Render_State(D3DRS_EMISSIVEMATERIALSOURCE,D3DMCS_MATERIAL);
  849. // set to default values if no mappers
  850. for (i=0; i<MeshBuilderClass::MAX_STAGES; i++) {
  851. DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXCOORDINDEX,D3DTSS_TCI_PASSTHRU | i);
  852. DX8Wrapper::Set_DX8_Texture_Stage_State(i,D3DTSS_TEXTURETRANSFORMFLAGS,D3DTTFF_DISABLE);
  853. }
  854. }
  855. /***********************************************************************************************
  856. * Init -- init code *
  857. * *
  858. * *
  859. * *
  860. * *
  861. * INPUT: *
  862. * *
  863. * OUTPUT: *
  864. * *
  865. * WARNINGS: *
  866. * *
  867. * HISTORY: *
  868. * 2/14/2001 hy : Created. *
  869. *=============================================================================================*/
  870. void VertexMaterialClass::Init()
  871. {
  872. int i;
  873. for (i=0; i<PRESET_COUNT;i++)
  874. Presets[i]=NEW_REF(VertexMaterialClass,());
  875. // Set up presets
  876. Presets[PRELIT_DIFFUSE]->Set_Diffuse_Color_Source(VertexMaterialClass::COLOR1);
  877. Presets[PRELIT_DIFFUSE]->Set_Lighting(false);
  878. Presets[PRELIT_NODIFFUSE]->Set_Lighting(false);
  879. }
  880. /***********************************************************************************************
  881. * Shutdown -- shutdown code *
  882. * *
  883. * *
  884. * *
  885. * *
  886. * INPUT: *
  887. * *
  888. * OUTPUT: *
  889. * *
  890. * WARNINGS: *
  891. * *
  892. * HISTORY: *
  893. * 2/14/2001 hy : Created. *
  894. *=============================================================================================*/
  895. void VertexMaterialClass::Shutdown()
  896. {
  897. int i;
  898. for (i=0; i<PRESET_COUNT;i++)
  899. REF_PTR_RELEASE(Presets[i]);
  900. }
  901. /***********************************************************************************************
  902. * Get_Preset -- retrieve presets *
  903. * *
  904. * *
  905. * *
  906. * *
  907. * INPUT: *
  908. * *
  909. * OUTPUT: *
  910. * *
  911. * WARNINGS: *
  912. * *
  913. * HISTORY: *
  914. * 2/14/2001 hy : Created. *
  915. *=============================================================================================*/
  916. VertexMaterialClass * VertexMaterialClass::Get_Preset(PresetType type)
  917. {
  918. WWASSERT(type<PRESET_COUNT);
  919. Presets[type]->Add_Ref();
  920. return Presets[type];
  921. }