mapper.h 23 KB

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