shdbumpspec.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  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/shdbumpspec.cpp $*
  25. * *
  26. * $Author:: Kenny_m
  27. *
  28. * $Modtime:: 5/27/02 2:21p $*
  29. * *
  30. * $Revision:: 1 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. #include "dx8fvf.h"
  36. #include "dx8wrapper.h"
  37. #include "assetmgr.h"
  38. #include "shdbumpspec.h"
  39. #include "shd6bumpspec.h"
  40. #include "shd7bumpspec.h"
  41. #include "shd8bumpspec.h"
  42. #include "editable.h"
  43. #include "shdclassids.h"
  44. #include "shddeffactory.h"
  45. #include "shdinterface.h"
  46. #include "persistfactory.h"
  47. #include "wwhack.h"
  48. DECLARE_FORCE_LINK(BumpSpecShader);
  49. REGISTER_SHDDEF(ShdBumpSpecDefClass,SHDDEF_CLASSID_BUMPSPEC,"Bump Specular");
  50. // static member
  51. ShdVersion ShdBumpSpecDefClass::Version;
  52. // Save-Load methods for ShdDefClass
  53. enum
  54. {
  55. CHUNKID_VARIABLES = 0x16490450,
  56. VARID_TEXTURE_NAME = 0x00,
  57. VARID_BUMP_MAP_NAME,
  58. VARID_AMBIENT_COLOR,
  59. VARID_DIFFUSE_COLOR,
  60. VARID_SPECULAR_COLOR,
  61. VARID_DIFFUSE_BUMPINESS,
  62. VARID_SPECULAR_BUMPINESS
  63. };
  64. ShdBumpSpecDefClass::ShdBumpSpecDefClass()
  65. : ShdDefClass(SHDDEF_CLASSID_BUMPSPEC),
  66. Ambient(1,1,1),
  67. Diffuse(1,1,1),
  68. Specular(1,1,1),
  69. Diffuse_Bumpiness(1,0),
  70. Specular_Bumpiness(1,0)
  71. {
  72. NAMED_TEXTURE_FILENAME_PARAM(ShdBumpSpecDefClass, TextureName, "Base and Alpha Gloss Map", "Targa Files", ".tga");
  73. NAMED_TEXTURE_FILENAME_PARAM(ShdBumpSpecDefClass, BumpMapName, "Bump Map", "Targa Files", ".tga");
  74. NAMED_EDITABLE_PARAM(ShdBumpSpecDefClass, ParameterClass::TYPE_COLOR, Ambient, "Ambient");
  75. NAMED_EDITABLE_PARAM(ShdBumpSpecDefClass, ParameterClass::TYPE_COLOR, Diffuse, "Diffuse");
  76. NAMED_EDITABLE_PARAM(ShdBumpSpecDefClass, ParameterClass::TYPE_COLOR, Specular, "Specular");
  77. NAMED_EDITABLE_PARAM(ShdBumpSpecDefClass, ParameterClass::TYPE_FLOAT, Diffuse_Bumpiness.X, "Diffuse Bump Scale");
  78. NAMED_EDITABLE_PARAM(ShdBumpSpecDefClass, ParameterClass::TYPE_FLOAT, Diffuse_Bumpiness.Y, "Diffuse Bump Bias");
  79. NAMED_EDITABLE_PARAM(ShdBumpSpecDefClass, ParameterClass::TYPE_FLOAT, Specular_Bumpiness.X, "Specular Bump Scale");
  80. NAMED_EDITABLE_PARAM(ShdBumpSpecDefClass, ParameterClass::TYPE_FLOAT, Specular_Bumpiness.Y, "Specular Bump Bias");
  81. }
  82. ShdBumpSpecDefClass::ShdBumpSpecDefClass(const ShdBumpSpecDefClass& that)
  83. : ShdDefClass(that),
  84. Ambient(that.Ambient),
  85. Diffuse(that.Diffuse),
  86. Specular(that.Specular),
  87. Diffuse_Bumpiness(that.Diffuse_Bumpiness),
  88. Specular_Bumpiness(that.Specular_Bumpiness)
  89. {
  90. TextureName=that.TextureName;
  91. BumpMapName=that.BumpMapName;
  92. }
  93. ShdBumpSpecDefClass::~ShdBumpSpecDefClass()
  94. {
  95. }
  96. bool ShdBumpSpecDefClass::Is_Valid_Config(StringClass &message)
  97. {
  98. return true;
  99. }
  100. bool ShdBumpSpecDefClass::Save(ChunkSaveClass &csave)
  101. {
  102. ShdDefClass::Save(csave);
  103. csave.Begin_Chunk(CHUNKID_VARIABLES);
  104. bool retval = true;
  105. // only save the file name
  106. char fname[_MAX_PATH];
  107. _splitpath(TextureName,NULL,NULL,fname,NULL);
  108. strcat(fname,".tga");
  109. TextureName=fname;
  110. WRITE_MICRO_CHUNK_WWSTRING(csave, VARID_TEXTURE_NAME, TextureName);
  111. _splitpath(BumpMapName,NULL,NULL,fname,NULL);
  112. strcat(fname,".tga");
  113. BumpMapName=fname;
  114. WRITE_MICRO_CHUNK_WWSTRING(csave, VARID_BUMP_MAP_NAME, BumpMapName);
  115. WRITE_MICRO_CHUNK(csave, VARID_AMBIENT_COLOR, Ambient);
  116. WRITE_MICRO_CHUNK(csave, VARID_DIFFUSE_COLOR, Diffuse);
  117. WRITE_MICRO_CHUNK(csave, VARID_SPECULAR_COLOR, Specular);
  118. WRITE_MICRO_CHUNK(csave, VARID_DIFFUSE_BUMPINESS, Diffuse_Bumpiness);
  119. WRITE_MICRO_CHUNK(csave, VARID_SPECULAR_BUMPINESS, Specular_Bumpiness);
  120. csave.End_Chunk();
  121. return retval;
  122. }
  123. bool ShdBumpSpecDefClass::Load(ChunkLoadClass &cload)
  124. {
  125. ShdDefClass::Load(cload);
  126. // Loop through all the microchunks that define the variables
  127. while (cload.Open_Chunk()) {
  128. switch (cload.Cur_Chunk_ID())
  129. {
  130. case CHUNKID_VARIABLES:
  131. while (cload.Open_Micro_Chunk())
  132. {
  133. switch (cload.Cur_Micro_Chunk_ID())
  134. {
  135. READ_MICRO_CHUNK_WWSTRING(cload, VARID_TEXTURE_NAME, TextureName);
  136. READ_MICRO_CHUNK_WWSTRING(cload, VARID_BUMP_MAP_NAME, BumpMapName);
  137. READ_MICRO_CHUNK(cload, VARID_AMBIENT_COLOR, Ambient);
  138. READ_MICRO_CHUNK(cload, VARID_DIFFUSE_COLOR, Diffuse);
  139. READ_MICRO_CHUNK(cload, VARID_SPECULAR_COLOR, Specular);
  140. READ_MICRO_CHUNK(cload, VARID_DIFFUSE_BUMPINESS, Diffuse_Bumpiness);
  141. READ_MICRO_CHUNK(cload, VARID_SPECULAR_BUMPINESS, Specular_Bumpiness);
  142. }
  143. cload.Close_Micro_Chunk();
  144. }
  145. break;
  146. default:
  147. break;
  148. }
  149. cload.Close_Chunk();
  150. }
  151. return true;
  152. }
  153. void ShdBumpSpecDefClass::Init()
  154. {
  155. // select shader version
  156. if ((DX8Wrapper::Get_Current_Caps()->Get_Pixel_Shader_Major_Version())==1 &&
  157. (DX8Wrapper::Get_Current_Caps()->Get_Pixel_Shader_Minor_Version())>=1)
  158. {
  159. Version.Set(SHDVER_8);
  160. }
  161. else if (DX8Wrapper::Get_Current_Caps()->Support_Dot3())
  162. {
  163. Version.Set(SHDVER_7);
  164. }
  165. else
  166. {
  167. Version.Set(SHDVER_6);
  168. }
  169. switch (Version.Get())
  170. {
  171. case SHDVER_8 : Shd8BumpSpecClass::Init(); break;
  172. case SHDVER_7 : Shd7BumpSpecClass::Init(); break;
  173. case SHDVER_6 : Shd6BumpSpecClass::Init(); break;
  174. }
  175. }
  176. void ShdBumpSpecDefClass::Shutdown()
  177. {
  178. switch (Version.Get())
  179. {
  180. case SHDVER_8 : Shd8BumpSpecClass::Shutdown(); break;
  181. case SHDVER_7 : Shd7BumpSpecClass::Shutdown(); break;
  182. case SHDVER_6 : Shd6BumpSpecClass::Shutdown(); break;
  183. }
  184. }
  185. ShdInterfaceClass* ShdBumpSpecDefClass::Create() const
  186. {
  187. switch (Version.Get())
  188. {
  189. case SHDVER_8 : return new Shd8BumpSpecClass(this); break;
  190. case SHDVER_7 : return new Shd7BumpSpecClass(this); break;
  191. case SHDVER_6 : return new Shd6BumpSpecClass(this); break;
  192. }
  193. return NULL;
  194. }