mapper.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. /*
  2. ** Command & Conquer Renegade(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:: /Commando/Code/ww3d2/mapper.h $*
  25. * *
  26. * $Author:: Greg_h $*
  27. * *
  28. * $Modtime:: 1/06/02 10:53a $*
  29. * *
  30. * $Revision:: 25 $*
  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 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. public:
  98. ScaleTextureMapperClass(unsigned int stage);
  99. ScaleTextureMapperClass(const Vector2 &scale, unsigned int stage);
  100. ScaleTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  101. ScaleTextureMapperClass(const ScaleTextureMapperClass & src);
  102. virtual int Mapper_ID(void) const { return MAPPER_ID_SCALE;}
  103. virtual TextureMapperClass *Clone(void) const { return NEW_REF( ScaleTextureMapperClass, (*this)); }
  104. virtual void Apply(int uv_array_index);
  105. protected:
  106. Vector2 Scale; // Scale
  107. };
  108. /*
  109. ** LinearOffsetTextureMapperClass
  110. ** Modifies the UV coodinates by a linear offset
  111. */
  112. class LinearOffsetTextureMapperClass : public ScaleTextureMapperClass
  113. {
  114. public:
  115. LinearOffsetTextureMapperClass(const Vector2 &offset_per_sec, const Vector2 &scale, unsigned int stage);
  116. LinearOffsetTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  117. LinearOffsetTextureMapperClass(const LinearOffsetTextureMapperClass & src);
  118. virtual int Mapper_ID(void) const { return MAPPER_ID_LINEAR_OFFSET;}
  119. virtual TextureMapperClass *Clone(void) const { return NEW_REF( LinearOffsetTextureMapperClass, (*this)); }
  120. virtual void Apply(int uv_array_index);
  121. virtual void Reset(void) { Set_Current_UV_Offset(Vector2(0.0f, 0.0f)); LastUsedSyncTime = WW3D::Get_Sync_Time(); }
  122. virtual bool Is_Time_Variant(void) { return true; }
  123. void Set_Current_UV_Offset(const Vector2 &cur) {
  124. CurrentUVOffset = cur;
  125. }
  126. void Set_UV_Offset_Delta(const Vector2 &per_sec) {
  127. UVOffsetDeltaPerMS = per_sec;
  128. UVOffsetDeltaPerMS *= -0.001f;
  129. }
  130. protected:
  131. Vector2 CurrentUVOffset; // Current UV offset
  132. Vector2 UVOffsetDeltaPerMS; // Amount to increase offset each millisec
  133. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  134. };
  135. /*
  136. ** GridTextureMapperClass
  137. ** Animates a texture by divving it up into a grid and using those offsets
  138. */
  139. class GridTextureMapperClass : public TextureMapperClass
  140. {
  141. public:
  142. GridTextureMapperClass(float fps, unsigned int gridwidth_log2, unsigned int stage);
  143. GridTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  144. GridTextureMapperClass(const GridTextureMapperClass & src);
  145. virtual int Mapper_ID(void) const { return MAPPER_ID_GRID;}
  146. virtual TextureMapperClass *Clone(void) const { return NEW_REF( GridTextureMapperClass, (*this)); }
  147. virtual void Apply(int uv_array_index);
  148. virtual void Reset(void);
  149. virtual bool Is_Time_Variant(void) { return true; }
  150. void Set_Frame(unsigned int frame) { CurrentFrame=frame; }
  151. void Set_Frame_Per_Second(float fps);
  152. protected:
  153. // Utility functions
  154. void initialize(float fps, unsigned int gridwidth_log2);
  155. void update_temporal_state(void);
  156. void calculate_uv_offset(float * u_offset, float * v_offset);
  157. // Constant properties
  158. int Sign; // +1 if frame rate positive, -1 otherwise
  159. unsigned int MSPerFrame; // milliseconds per frame
  160. float OOGridWidth; // 1.0f / size of the side of the grid)
  161. unsigned int GridWidthLog2; // log base 2 of size of the side of the grid
  162. unsigned int LastFrame; // Last frame to use
  163. // Temporal state
  164. unsigned int Remainder; // used for timing calculations
  165. unsigned int CurrentFrame; // current frame
  166. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  167. };
  168. /*
  169. ** RotateTextureMapperClass
  170. ** Modifies the textures over time
  171. */
  172. class RotateTextureMapperClass : public ScaleTextureMapperClass
  173. {
  174. public:
  175. RotateTextureMapperClass(float rad_per_sec, const Vector2& center, unsigned int stage);
  176. RotateTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  177. RotateTextureMapperClass(const RotateTextureMapperClass & src);
  178. virtual int Mapper_ID(void) const { return MAPPER_ID_ROTATE;}
  179. virtual TextureMapperClass *Clone(void) const { return NEW_REF( RotateTextureMapperClass, (*this)); }
  180. virtual void Apply(int uv_array_index);
  181. virtual void Reset(void) { CurrentAngle = 0.0f; LastUsedSyncTime = WW3D::Get_Sync_Time(); }
  182. virtual bool Is_Time_Variant(void) { return true; }
  183. private:
  184. float CurrentAngle;
  185. float RadiansPerMilliSec;
  186. Vector2 Center;
  187. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  188. };
  189. /*
  190. ** SineLinearOffsetTextureMapperClass
  191. ** Modifies the UV coodinates by a sine linear offset
  192. */
  193. class SineLinearOffsetTextureMapperClass : public TextureMapperClass
  194. {
  195. public:
  196. SineLinearOffsetTextureMapperClass(const Vector3 &uafp, const Vector3 &vafp, unsigned int stage);
  197. SineLinearOffsetTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  198. SineLinearOffsetTextureMapperClass(const SineLinearOffsetTextureMapperClass & src);
  199. virtual int Mapper_ID(void) const { return MAPPER_ID_SINE_LINEAR_OFFSET;}
  200. virtual TextureMapperClass *Clone(void) const { return NEW_REF( SineLinearOffsetTextureMapperClass, (*this)); }
  201. virtual void Apply(int uv_array_index);
  202. virtual void Reset(void) { CurrentAngle = 0.0f; LastUsedSyncTime = WW3D::Get_Sync_Time(); }
  203. virtual bool Is_Time_Variant(void) { return true; }
  204. private:
  205. Vector3 UAFP; // U Coordinate Amplitude frequency phase
  206. Vector3 VAFP; // V Coordinate Amplitude frequency phase
  207. float CurrentAngle;
  208. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  209. };
  210. /*
  211. ** StepLinearOffsetTextureMapperClass
  212. ** Modifies the UV coodinates by a Step linear offset
  213. */
  214. class StepLinearOffsetTextureMapperClass : public TextureMapperClass
  215. {
  216. public:
  217. StepLinearOffsetTextureMapperClass(const Vector2 &step, float steps_per_sec, unsigned int stage);
  218. StepLinearOffsetTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  219. StepLinearOffsetTextureMapperClass(const StepLinearOffsetTextureMapperClass & src);
  220. virtual int Mapper_ID(void) const { return MAPPER_ID_STEP_LINEAR_OFFSET;}
  221. virtual TextureMapperClass *Clone(void) const { return NEW_REF( StepLinearOffsetTextureMapperClass, (*this)); }
  222. virtual void Apply(int uv_array_index);
  223. virtual void Reset(void);
  224. virtual bool Is_Time_Variant(void) { return true; }
  225. private:
  226. Vector2 Step; // Size of step
  227. float StepsPerMilliSec; // Steps per millisecond
  228. Vector2 CurrentStep; // Current step
  229. float Remainder; // Remainder time
  230. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  231. };
  232. /*
  233. ** ZigZagLinearOffsetTextureMapperClass
  234. ** Modifies the UV coodinates by a ZigZag linear offset
  235. */
  236. class ZigZagLinearOffsetTextureMapperClass : public TextureMapperClass
  237. {
  238. public:
  239. ZigZagLinearOffsetTextureMapperClass(const Vector2 &speed, float period, unsigned int stage);
  240. ZigZagLinearOffsetTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  241. ZigZagLinearOffsetTextureMapperClass(const ZigZagLinearOffsetTextureMapperClass & src);
  242. virtual int Mapper_ID(void) const { return MAPPER_ID_ZIGZAG_LINEAR_OFFSET;}
  243. virtual TextureMapperClass *Clone(void) const { return NEW_REF( ZigZagLinearOffsetTextureMapperClass, (*this)); }
  244. virtual void Apply(int uv_array_index);
  245. virtual void Reset(void);
  246. virtual bool Is_Time_Variant(void) { return true; }
  247. private:
  248. Vector2 Speed; // Speed of zigzag in units per millisecond
  249. float Period; // Time taken for a period in milliseconds
  250. float Half_Period; // Half of period
  251. float Remainder; // Remainder time in milliseconds
  252. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  253. };
  254. // ----------------------------------------------------------------------------
  255. //
  256. // Environment Mapper calculates the texture coordinates based on
  257. // transformed normals
  258. //
  259. // ----------------------------------------------------------------------------
  260. class ClassicEnvironmentMapperClass : public TextureMapperClass
  261. {
  262. public:
  263. ClassicEnvironmentMapperClass(unsigned int stage) : TextureMapperClass(stage) { }
  264. ClassicEnvironmentMapperClass(const ClassicEnvironmentMapperClass & src) : TextureMapperClass(src) { }
  265. virtual int Mapper_ID(void) const { return MAPPER_ID_CLASSIC_ENVIRONMENT;}
  266. virtual TextureMapperClass* Clone() const { return NEW_REF( ClassicEnvironmentMapperClass, (*this)); }
  267. virtual void Apply(int uv_array_index);
  268. virtual bool Needs_Normals(void) { return true; }
  269. };
  270. class EnvironmentMapperClass : public TextureMapperClass
  271. {
  272. public:
  273. EnvironmentMapperClass(unsigned int stage) : TextureMapperClass(stage) { }
  274. EnvironmentMapperClass(const EnvironmentMapperClass & src) : TextureMapperClass(src) { }
  275. virtual int Mapper_ID(void) const { return MAPPER_ID_ENVIRONMENT;}
  276. virtual TextureMapperClass* Clone() const { return NEW_REF( EnvironmentMapperClass, (*this)); }
  277. virtual void Apply(int uv_array_index);
  278. virtual bool Needs_Normals(void) { return true; }
  279. };
  280. class EdgeMapperClass : public TextureMapperClass
  281. {
  282. public:
  283. EdgeMapperClass(unsigned int stage);
  284. EdgeMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  285. EdgeMapperClass(const EdgeMapperClass & src);
  286. virtual int Mapper_ID(void) const { return MAPPER_ID_EDGE;}
  287. virtual TextureMapperClass* Clone() const { return NEW_REF( EdgeMapperClass, (*this)); }
  288. virtual void Apply(int uv_array_index);
  289. virtual void Reset(void);
  290. virtual bool Is_Time_Variant(void) { return true; }
  291. virtual bool Needs_Normals(void) { return true; }
  292. protected:
  293. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  294. float VSpeed,VOffset;
  295. bool UseReflect;
  296. };
  297. class WSClassicEnvironmentMapperClass : public TextureMapperClass
  298. {
  299. public:
  300. WSClassicEnvironmentMapperClass(unsigned int stage) : TextureMapperClass(stage) { }
  301. WSClassicEnvironmentMapperClass(const WSClassicEnvironmentMapperClass & src) : TextureMapperClass(src) { }
  302. virtual int Mapper_ID(void) const { return MAPPER_ID_WS_CLASSIC_ENVIRONMENT;}
  303. virtual TextureMapperClass* Clone() const { return NEW_REF( WSClassicEnvironmentMapperClass, (*this)); }
  304. virtual void Apply(int uv_array_index);
  305. virtual bool Needs_Normals(void) { return true; }
  306. };
  307. class WSEnvironmentMapperClass : public TextureMapperClass
  308. {
  309. public:
  310. WSEnvironmentMapperClass(unsigned int stage) : TextureMapperClass(stage) { }
  311. WSEnvironmentMapperClass(const WSEnvironmentMapperClass & src) : TextureMapperClass(src) { }
  312. virtual int Mapper_ID(void) const { return MAPPER_ID_WS_ENVIRONMENT;}
  313. virtual TextureMapperClass* Clone() const { return NEW_REF( WSEnvironmentMapperClass, (*this)); }
  314. virtual void Apply(int uv_array_index);
  315. virtual bool Needs_Normals(void) { return true; }
  316. };
  317. class GridClassicEnvironmentMapperClass : public GridTextureMapperClass
  318. {
  319. public:
  320. GridClassicEnvironmentMapperClass(float fps,unsigned int gridwidth, unsigned int stage):GridTextureMapperClass(fps,gridwidth,stage) { }
  321. GridClassicEnvironmentMapperClass(const INIClass &ini, const char *section, unsigned int stage) : GridTextureMapperClass(ini,section,stage) { }
  322. GridClassicEnvironmentMapperClass(const GridTextureMapperClass & src) : GridTextureMapperClass(src) { }
  323. virtual int Mapper_ID(void) const { return MAPPER_ID_GRID_CLASSIC_ENVIRONMENT;}
  324. virtual TextureMapperClass* Clone() const { return NEW_REF( GridClassicEnvironmentMapperClass, (*this)); }
  325. virtual void Apply(int uv_array_index);
  326. virtual bool Needs_Normals(void) { return true; }
  327. };
  328. class GridEnvironmentMapperClass : public GridTextureMapperClass
  329. {
  330. public:
  331. GridEnvironmentMapperClass(float fps,unsigned int gridwidth, unsigned int stage):GridTextureMapperClass(fps,gridwidth,stage) { }
  332. GridEnvironmentMapperClass(const INIClass &ini, const char *section, unsigned int stage) : GridTextureMapperClass(ini,section,stage) { }
  333. GridEnvironmentMapperClass(const GridTextureMapperClass & src) : GridTextureMapperClass(src) { }
  334. virtual int Mapper_ID(void) const { return MAPPER_ID_GRID_ENVIRONMENT;}
  335. virtual TextureMapperClass* Clone() const { return NEW_REF( GridEnvironmentMapperClass, (*this)); }
  336. virtual void Apply(int uv_array_index);
  337. virtual bool Needs_Normals(void) { return true; }
  338. };
  339. // ----------------------------------------------------------------------------
  340. //
  341. // Screen Mapper calculates texture coordinates based on the projected screen
  342. // coordinates of vertices
  343. //
  344. // ----------------------------------------------------------------------------
  345. class ScreenMapperClass : public LinearOffsetTextureMapperClass
  346. {
  347. public:
  348. ScreenMapperClass(const Vector2 &offset_per_sec, const Vector2 &scale, unsigned int stage):LinearOffsetTextureMapperClass(offset_per_sec,scale,stage) { }
  349. ScreenMapperClass(const INIClass &ini, const char *section, unsigned int stage):LinearOffsetTextureMapperClass(ini,section,stage) { }
  350. ScreenMapperClass(const LinearOffsetTextureMapperClass & src):LinearOffsetTextureMapperClass(src) { }
  351. virtual int Mapper_ID(void) const { return MAPPER_ID_SCREEN;}
  352. virtual TextureMapperClass* Clone() const { return NEW_REF( ScreenMapperClass, (*this)); }
  353. virtual void Apply(int uv_array_index);
  354. };
  355. /**
  356. ** RandomTextureMapperClass
  357. ** Modifies the textures over time
  358. */
  359. class RandomTextureMapperClass : public TextureMapperClass
  360. {
  361. public:
  362. RandomTextureMapperClass(float fps, unsigned int stage);
  363. RandomTextureMapperClass(const INIClass &ini, const char *section, unsigned int stage);
  364. RandomTextureMapperClass(const RandomTextureMapperClass & src);
  365. virtual int Mapper_ID(void) const { return MAPPER_ID_RANDOM;}
  366. virtual TextureMapperClass *Clone(void) const { return NEW_REF( RandomTextureMapperClass, (*this)); }
  367. virtual void Apply(int uv_array_index);
  368. virtual void Reset(void);
  369. virtual bool Is_Time_Variant(void) { return true; }
  370. protected:
  371. // Greg's WW3D naming convention for helper functions
  372. void randomize(void);
  373. float FPMS; // frames per mili second
  374. float Remainder; // remaining time
  375. float CurrentAngle;
  376. Vector2 Center;
  377. Vector2 Speed;
  378. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  379. };
  380. /**
  381. ** BumpEnvTextureMapperClass
  382. ** Modifies the bump transform as a function of time. This mapper is derived
  383. ** from the LinearOffset mapper so that you can scroll and scale the bump map.
  384. */
  385. class BumpEnvTextureMapperClass : public LinearOffsetTextureMapperClass
  386. {
  387. public:
  388. BumpEnvTextureMapperClass(float rad_per_sec, float scale_factor, const Vector2 & offset_per_sec, const Vector2 &scale, unsigned int stage);
  389. BumpEnvTextureMapperClass(INIClass &ini, char *section, unsigned int stage);
  390. BumpEnvTextureMapperClass(const BumpEnvTextureMapperClass & src);
  391. virtual int Mapper_ID(void) const { return MAPPER_ID_BUMPENV;}
  392. virtual TextureMapperClass *Clone(void) const { return NEW_REF( BumpEnvTextureMapperClass, (*this)); }
  393. virtual void Apply(int uv_array_index);
  394. protected:
  395. unsigned int LastUsedSyncTime; // Sync time last used to update offset
  396. float CurrentAngle;
  397. float RadiansPerSecond;
  398. float ScaleFactor;
  399. };
  400. /*
  401. ** Utility functions
  402. */
  403. void Reset_All_Texture_Mappers(RenderObjClass *robj, bool make_unique);
  404. #endif