mapper.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  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 : G *
  23. * *
  24. * $Archive:: /VSS_Sync/ww3d2/mapper.h $*
  25. * *
  26. * $Author:: Vss_sync $*
  27. * *
  28. * $Modtime:: 8/30/01 1:38a $*
  29. * *
  30. * $Revision:: 23 $*
  31. * *
  32. *-------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. #if defined(_MSC_VER)
  36. #pragma once
  37. #endif
  38. #ifndef VERTEXMAPPER_H
  39. #define VERTEXMAPPER_H
  40. #include "refcount.h"
  41. #include "w3d_file.h"
  42. #include "w3derr.h"
  43. #include "wwdebug.h"
  44. #include "vector2.h"
  45. #include "vector3.h"
  46. #include "ww3d.h"
  47. class INIClass;
  48. /*
  49. ** TextureMapperClass
  50. ** Base class for all texture mappers.
  51. */
  52. class TextureMapperClass : public W3DMPO, public RefCountClass
  53. {
  54. public:
  55. enum {
  56. MAPPER_ID_UNKNOWN,
  57. MAPPER_ID_LINEAR_OFFSET,
  58. MAPPER_ID_CLASSIC_ENVIRONMENT,
  59. MAPPER_ID_ENVIRONMENT,
  60. MAPPER_ID_SCREEN,
  61. MAPPER_ID_ANIMATING_1D,
  62. MAPPER_ID_AXIAL,
  63. MAPPER_ID_SILHOUETTE,
  64. MAPPER_ID_SCALE,
  65. MAPPER_ID_GRID,
  66. MAPPER_ID_ROTATE,
  67. MAPPER_ID_SINE_LINEAR_OFFSET,
  68. MAPPER_ID_STEP_LINEAR_OFFSET,
  69. MAPPER_ID_ZIGZAG_LINEAR_OFFSET,
  70. MAPPER_ID_WS_CLASSIC_ENVIRONMENT,
  71. MAPPER_ID_WS_ENVIRONMENT,
  72. MAPPER_ID_GRID_CLASSIC_ENVIRONMENT,
  73. MAPPER_ID_GRID_ENVIRONMENT,
  74. MAPPER_ID_RANDOM,
  75. MAPPER_ID_EDGE,
  76. MAPPER_ID_BUMPENV,
  77. };
  78. TextureMapperClass(unsigned int stage=0);
  79. TextureMapperClass(const TextureMapperClass & src) : Stage(src.Stage) { }
  80. virtual void Reset(void) { }
  81. virtual TextureMapperClass * Clone(void) const=0;
  82. virtual int Mapper_ID(void) const { return MAPPER_ID_UNKNOWN;}
  83. virtual bool Is_Time_Variant(void) { return false; }
  84. virtual void Apply(int uv_array_index)=0;
  85. virtual bool Needs_Normals(void) { return false; }
  86. void Set_Stage(int stage) { Stage = stage; }
  87. int Get_Stage(void) const { return Stage; }
  88. protected:
  89. unsigned int Stage;
  90. };
  91. /*
  92. ** ScaleTextureMapperClass
  93. ** Scales UV coordinates
  94. */
  95. class ScaleTextureMapperClass : public TextureMapperClass
  96. {
  97. W3DMPO_GLUE(ScaleTextureMapperClass)
  98. public:
  99. ScaleTextureMapperClass(unsigned int stage);
  100. ScaleTextureMapperClass(const Vector2 &scale, unsigned int stage);
  101. ScaleTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  102. ScaleTextureMapperClass(const ScaleTextureMapperClass & src);
  103. virtual int Mapper_ID(void) const { return MAPPER_ID_SCALE;}
  104. virtual TextureMapperClass *Clone(void) const { return NEW_REF( ScaleTextureMapperClass, (*this)); }
  105. virtual void Apply(int uv_array_index);
  106. protected:
  107. Vector2 Scale; // Scale
  108. };
  109. /*
  110. ** LinearOffsetTextureMapperClass
  111. ** Modifies the UV coodinates by a linear offset
  112. */
  113. class LinearOffsetTextureMapperClass : public ScaleTextureMapperClass
  114. {
  115. W3DMPO_GLUE(LinearOffsetTextureMapperClass)
  116. public:
  117. LinearOffsetTextureMapperClass(const Vector2 &offset_per_sec, const Vector2 &scale, unsigned int stage);
  118. LinearOffsetTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  119. LinearOffsetTextureMapperClass(const LinearOffsetTextureMapperClass & src);
  120. virtual int Mapper_ID(void) const { return MAPPER_ID_LINEAR_OFFSET;}
  121. virtual TextureMapperClass *Clone(void) const { return NEW_REF( LinearOffsetTextureMapperClass, (*this)); }
  122. virtual void Apply(int uv_array_index);
  123. virtual void Reset(void) { Set_Current_UV_Offset(Vector2(0.0f, 0.0f)); }
  124. virtual bool Is_Time_Variant(void) { return true; }
  125. void Set_Current_UV_Offset(const Vector2 &cur) {
  126. CurrentUVOffset = cur;
  127. }
  128. void Set_UV_Offset_Delta(const Vector2 &per_sec) {
  129. UVOffsetDeltaPerMS = per_sec;
  130. UVOffsetDeltaPerMS *= -0.001f;
  131. }
  132. void Get_Current_UV_Offset(Vector2 &cur)
  133. { cur= CurrentUVOffset;
  134. }
  135. void Set_LastUsedSyncTime(unsigned int time) { LastUsedSyncTime = time;}
  136. unsigned int Get_LastUsedSyncTime() { return LastUsedSyncTime;}
  137. protected:
  138. Vector2 CurrentUVOffset; // Current UV offset
  139. Vector2 UVOffsetDeltaPerMS; // Amount to increase offset each millisec
  140. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  141. };
  142. /*
  143. ** GridTextureMapperClass
  144. ** Animates a texture by divving it up into a grid and using those offsets
  145. */
  146. class GridTextureMapperClass : public TextureMapperClass
  147. {
  148. W3DMPO_GLUE(GridTextureMapperClass)
  149. public:
  150. GridTextureMapperClass(float fps, unsigned int gridwidth_log2, unsigned int stage);
  151. GridTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  152. GridTextureMapperClass(const GridTextureMapperClass & src);
  153. virtual int Mapper_ID(void) const { return MAPPER_ID_GRID;}
  154. virtual TextureMapperClass *Clone(void) const { return NEW_REF( GridTextureMapperClass, (*this)); }
  155. virtual void Apply(int uv_array_index);
  156. virtual void Reset(void);
  157. virtual bool Is_Time_Variant(void) { return true; }
  158. void Set_Frame(unsigned int frame) { CurrentFrame=frame; }
  159. void Set_Frame_Per_Second(float fps);
  160. protected:
  161. // Utility functions
  162. void initialize(float fps, unsigned int gridwidth_log2);
  163. void update_temporal_state(void);
  164. void calculate_uv_offset(float * u_offset, float * v_offset);
  165. // Constant properties
  166. int Sign; // +1 if frame rate positive, -1 otherwise
  167. unsigned int MSPerFrame; // milliseconds per frame
  168. float OOGridWidth; // 1.0f / size of the side of the grid)
  169. unsigned int GridWidthLog2; // log base 2 of size of the side of the grid
  170. unsigned int LastFrame; // Last frame to use
  171. // Temporal state
  172. unsigned int Remainder; // used for timing calculations
  173. unsigned int CurrentFrame; // current frame
  174. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  175. };
  176. /*
  177. ** RotateTextureMapperClass
  178. ** Modifies the textures over time
  179. */
  180. class RotateTextureMapperClass : public ScaleTextureMapperClass
  181. {
  182. W3DMPO_GLUE(RotateTextureMapperClass)
  183. public:
  184. RotateTextureMapperClass(float rad_per_sec, const Vector2& center, unsigned int stage);
  185. RotateTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  186. RotateTextureMapperClass(const RotateTextureMapperClass & src);
  187. virtual int Mapper_ID(void) const { return MAPPER_ID_ROTATE;}
  188. virtual TextureMapperClass *Clone(void) const { return NEW_REF( RotateTextureMapperClass, (*this)); }
  189. virtual void Apply(int uv_array_index);
  190. virtual void Reset(void) { CurrentAngle = 0.0f; }
  191. virtual bool Is_Time_Variant(void) { return true; }
  192. private:
  193. float CurrentAngle;
  194. float RadiansPerSec;
  195. Vector2 Center;
  196. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  197. };
  198. /*
  199. ** SineLinearOffsetTextureMapperClass
  200. ** Modifies the UV coodinates by a sine linear offset
  201. */
  202. class SineLinearOffsetTextureMapperClass : public TextureMapperClass
  203. {
  204. W3DMPO_GLUE(SineLinearOffsetTextureMapperClass)
  205. public:
  206. SineLinearOffsetTextureMapperClass(const Vector3 &uafp, const Vector3 &vafp, unsigned int stage);
  207. SineLinearOffsetTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  208. SineLinearOffsetTextureMapperClass(const SineLinearOffsetTextureMapperClass & src);
  209. virtual int Mapper_ID(void) const { return MAPPER_ID_SINE_LINEAR_OFFSET;}
  210. virtual TextureMapperClass *Clone(void) const { return NEW_REF( SineLinearOffsetTextureMapperClass, (*this)); }
  211. virtual void Apply(int uv_array_index);
  212. virtual void Reset(void) { CurrentAngle = 0.0f; }
  213. virtual bool Is_Time_Variant(void) { return true; }
  214. private:
  215. Vector3 UAFP; // U Coordinate Amplitude frequency phase
  216. Vector3 VAFP; // V Coordinate Amplitude frequency phase
  217. float CurrentAngle;
  218. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  219. };
  220. /*
  221. ** StepLinearOffsetTextureMapperClass
  222. ** Modifies the UV coodinates by a Step linear offset
  223. */
  224. class StepLinearOffsetTextureMapperClass : public TextureMapperClass
  225. {
  226. W3DMPO_GLUE(StepLinearOffsetTextureMapperClass)
  227. public:
  228. StepLinearOffsetTextureMapperClass(const Vector2 &step, float steps_per_sec, unsigned int stage);
  229. StepLinearOffsetTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  230. StepLinearOffsetTextureMapperClass(const StepLinearOffsetTextureMapperClass & src);
  231. virtual int Mapper_ID(void) const { return MAPPER_ID_STEP_LINEAR_OFFSET;}
  232. virtual TextureMapperClass *Clone(void) const { return NEW_REF( StepLinearOffsetTextureMapperClass, (*this)); }
  233. virtual void Apply(int uv_array_index);
  234. virtual void Reset(void);
  235. virtual bool Is_Time_Variant(void) { return true; }
  236. private:
  237. Vector2 Step; // Size of step
  238. float StepsPerSec; // Steps per second
  239. Vector2 CurrentStep; // Current step
  240. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  241. };
  242. /*
  243. ** ZigZagLinearOffsetTextureMapperClass
  244. ** Modifies the UV coodinates by a ZigZag linear offset
  245. */
  246. class ZigZagLinearOffsetTextureMapperClass : public TextureMapperClass
  247. {
  248. W3DMPO_GLUE(ZigZagLinearOffsetTextureMapperClass)
  249. public:
  250. ZigZagLinearOffsetTextureMapperClass(const Vector2 &speed, float period, unsigned int stage);
  251. ZigZagLinearOffsetTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  252. ZigZagLinearOffsetTextureMapperClass(const ZigZagLinearOffsetTextureMapperClass & src);
  253. virtual int Mapper_ID(void) const { return MAPPER_ID_ZIGZAG_LINEAR_OFFSET;}
  254. virtual TextureMapperClass *Clone(void) const { return NEW_REF( ZigZagLinearOffsetTextureMapperClass, (*this)); }
  255. virtual void Apply(int uv_array_index);
  256. virtual void Reset(void);
  257. virtual bool Is_Time_Variant(void) { return true; }
  258. private:
  259. Vector2 Speed; // Speed of zigzag
  260. float Period; // Time taken for a period
  261. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  262. };
  263. // ----------------------------------------------------------------------------
  264. //
  265. // Environment Mapper calculates the texture coordinates based on
  266. // transformed normals
  267. //
  268. // ----------------------------------------------------------------------------
  269. class ClassicEnvironmentMapperClass : public TextureMapperClass
  270. {
  271. W3DMPO_GLUE(ClassicEnvironmentMapperClass)
  272. public:
  273. ClassicEnvironmentMapperClass(unsigned int stage) : TextureMapperClass(stage) { }
  274. ClassicEnvironmentMapperClass(const ClassicEnvironmentMapperClass & src) : TextureMapperClass(src) { }
  275. virtual int Mapper_ID(void) const { return MAPPER_ID_CLASSIC_ENVIRONMENT;}
  276. virtual TextureMapperClass* Clone() const { return NEW_REF( ClassicEnvironmentMapperClass, (*this)); }
  277. virtual void Apply(int uv_array_index);
  278. virtual bool Needs_Normals(void) { return true; }
  279. };
  280. class EnvironmentMapperClass : public TextureMapperClass
  281. {
  282. W3DMPO_GLUE(EnvironmentMapperClass)
  283. public:
  284. EnvironmentMapperClass(unsigned int stage) : TextureMapperClass(stage) { }
  285. EnvironmentMapperClass(const EnvironmentMapperClass & src) : TextureMapperClass(src) { }
  286. virtual int Mapper_ID(void) const { return MAPPER_ID_ENVIRONMENT;}
  287. virtual TextureMapperClass* Clone() const { return NEW_REF( EnvironmentMapperClass, (*this)); }
  288. virtual void Apply(int uv_array_index);
  289. virtual bool Needs_Normals(void) { return true; }
  290. };
  291. class EdgeMapperClass : public TextureMapperClass
  292. {
  293. W3DMPO_GLUE(EdgeMapperClass)
  294. public:
  295. EdgeMapperClass(unsigned int stage);
  296. EdgeMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  297. EdgeMapperClass(const EdgeMapperClass & src);
  298. virtual int Mapper_ID(void) const { return MAPPER_ID_EDGE;}
  299. virtual TextureMapperClass* Clone() const { return NEW_REF( EdgeMapperClass, (*this)); }
  300. virtual void Apply(int uv_array_index);
  301. virtual void Reset(void);
  302. virtual bool Is_Time_Variant(void) { return true; }
  303. virtual bool Needs_Normals(void) { return true; }
  304. protected:
  305. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  306. float VSpeed,VOffset;
  307. bool UseReflect;
  308. };
  309. class WSClassicEnvironmentMapperClass : public TextureMapperClass
  310. {
  311. W3DMPO_GLUE(WSClassicEnvironmentMapperClass)
  312. public:
  313. WSClassicEnvironmentMapperClass(unsigned int stage) : TextureMapperClass(stage) { }
  314. WSClassicEnvironmentMapperClass(const WSClassicEnvironmentMapperClass & src) : TextureMapperClass(src) { }
  315. virtual int Mapper_ID(void) const { return MAPPER_ID_WS_CLASSIC_ENVIRONMENT;}
  316. virtual TextureMapperClass* Clone() const { return NEW_REF( WSClassicEnvironmentMapperClass, (*this)); }
  317. virtual void Apply(int uv_array_index);
  318. virtual bool Needs_Normals(void) { return true; }
  319. };
  320. class WSEnvironmentMapperClass : public TextureMapperClass
  321. {
  322. W3DMPO_GLUE(WSEnvironmentMapperClass)
  323. public:
  324. WSEnvironmentMapperClass(unsigned int stage) : TextureMapperClass(stage) { }
  325. WSEnvironmentMapperClass(const WSEnvironmentMapperClass & src) : TextureMapperClass(src) { }
  326. virtual int Mapper_ID(void) const { return MAPPER_ID_WS_ENVIRONMENT;}
  327. virtual TextureMapperClass* Clone() const { return NEW_REF( WSEnvironmentMapperClass, (*this)); }
  328. virtual void Apply(int uv_array_index);
  329. virtual bool Needs_Normals(void) { return true; }
  330. };
  331. class GridClassicEnvironmentMapperClass : public GridTextureMapperClass
  332. {
  333. W3DMPO_GLUE(GridClassicEnvironmentMapperClass)
  334. public:
  335. GridClassicEnvironmentMapperClass(float fps,unsigned int gridwidth, unsigned int stage):GridTextureMapperClass(fps,gridwidth,stage) { }
  336. GridClassicEnvironmentMapperClass(const INIClass &ini, const char *section, unsigned int stage) : GridTextureMapperClass(ini,section,stage) { }
  337. GridClassicEnvironmentMapperClass(const GridTextureMapperClass & src) : GridTextureMapperClass(src) { }
  338. virtual int Mapper_ID(void) const { return MAPPER_ID_GRID_CLASSIC_ENVIRONMENT;}
  339. virtual TextureMapperClass* Clone() const { return NEW_REF( GridClassicEnvironmentMapperClass, (*this)); }
  340. virtual void Apply(int uv_array_index);
  341. virtual bool Needs_Normals(void) { return true; }
  342. };
  343. class GridEnvironmentMapperClass : public GridTextureMapperClass
  344. {
  345. W3DMPO_GLUE(GridEnvironmentMapperClass)
  346. public:
  347. GridEnvironmentMapperClass(float fps,unsigned int gridwidth, unsigned int stage):GridTextureMapperClass(fps,gridwidth,stage) { }
  348. GridEnvironmentMapperClass(const INIClass &ini, const char *section, unsigned int stage) : GridTextureMapperClass(ini,section,stage) { }
  349. GridEnvironmentMapperClass(const GridTextureMapperClass & src) : GridTextureMapperClass(src) { }
  350. virtual int Mapper_ID(void) const { return MAPPER_ID_GRID_ENVIRONMENT;}
  351. virtual TextureMapperClass* Clone() const { return NEW_REF( GridEnvironmentMapperClass, (*this)); }
  352. virtual void Apply(int uv_array_index);
  353. virtual bool Needs_Normals(void) { return true; }
  354. };
  355. // ----------------------------------------------------------------------------
  356. //
  357. // Screen Mapper calculates texture coordinates based on the projected screen
  358. // coordinates of vertices
  359. //
  360. // ----------------------------------------------------------------------------
  361. class ScreenMapperClass : public LinearOffsetTextureMapperClass
  362. {
  363. W3DMPO_GLUE(ScreenMapperClass)
  364. public:
  365. ScreenMapperClass(const Vector2 &offset_per_sec, const Vector2 &scale, unsigned int stage):LinearOffsetTextureMapperClass(offset_per_sec,scale,stage) { }
  366. ScreenMapperClass(const INIClass &ini, const char *section, unsigned int stage):LinearOffsetTextureMapperClass(ini,section,stage) { }
  367. ScreenMapperClass(const LinearOffsetTextureMapperClass & src):LinearOffsetTextureMapperClass(src) { }
  368. virtual int Mapper_ID(void) const { return MAPPER_ID_SCREEN;}
  369. virtual TextureMapperClass* Clone() const { return NEW_REF( ScreenMapperClass, (*this)); }
  370. virtual void Apply(int uv_array_index);
  371. };
  372. /**
  373. ** RandomTextureMapperClass
  374. ** Modifies the textures over time
  375. */
  376. class RandomTextureMapperClass : public TextureMapperClass
  377. {
  378. W3DMPO_GLUE(RandomTextureMapperClass)
  379. public:
  380. RandomTextureMapperClass(float fps, unsigned int stage);
  381. RandomTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  382. RandomTextureMapperClass(const RandomTextureMapperClass & src);
  383. virtual int Mapper_ID(void) const { return MAPPER_ID_RANDOM;}
  384. virtual TextureMapperClass *Clone(void) const { return NEW_REF( RandomTextureMapperClass, (*this)); }
  385. virtual void Apply(int uv_array_index);
  386. virtual void Reset(void);
  387. virtual bool Is_Time_Variant(void) { return true; }
  388. protected:
  389. float FPS;
  390. float CurrentAngle;
  391. Vector2 Center;
  392. Vector2 Speed;
  393. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  394. };
  395. /**
  396. ** BumpEnvTextureMapperClass
  397. ** Modifies the bump transform as a function of time. This mapper is derived
  398. ** from the LinearOffset mapper so that you can scroll and scale the bump map.
  399. */
  400. class BumpEnvTextureMapperClass : public LinearOffsetTextureMapperClass
  401. {
  402. W3DMPO_GLUE(BumpEnvTextureMapperClass)
  403. public:
  404. BumpEnvTextureMapperClass(float rad_per_sec, float scale_factor, const Vector2 & offset_per_sec, const Vector2 &scale, unsigned int stage);
  405. BumpEnvTextureMapperClass(INIClass &ini, char *section, unsigned int stage);
  406. BumpEnvTextureMapperClass(const BumpEnvTextureMapperClass & src);
  407. virtual int Mapper_ID(void) const { return MAPPER_ID_BUMPENV;}
  408. virtual TextureMapperClass *Clone(void) const { return NEW_REF( BumpEnvTextureMapperClass, (*this)); }
  409. virtual void Apply(int uv_array_index);
  410. protected:
  411. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  412. float CurrentAngle;
  413. float RadiansPerSecond;
  414. float ScaleFactor;
  415. };
  416. /*
  417. ** Utility functions
  418. */
  419. void Reset_All_Texture_Mappers(RenderObjClass *robj, bool make_unique);
  420. #endif