LightDefinition.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  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 : LevelEdit *
  23. * *
  24. * $Archive:: /Commando/Code/Tools/LevelEdit/LightDefinition.cpp $*
  25. * *
  26. * Author:: Patrick Smith *
  27. * *
  28. * $Modtime:: 4/20/00 2:09p $*
  29. * *
  30. * $Revision:: 5 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. #include "stdafx.h"
  36. #include "lightdefinition.h"
  37. #include "simpledefinitionfactory.h"
  38. #include "definitionclassids.h"
  39. #include "definitionmgr.h"
  40. #include "persistfactory.h"
  41. #include "editorchunkids.h"
  42. #include "lightnode.h"
  43. //////////////////////////////////////////////////////////////////////////////////
  44. // Constants
  45. //////////////////////////////////////////////////////////////////////////////////
  46. enum
  47. {
  48. CHUNKID_VARIABLES = 0x00000100,
  49. CHUNKID_BASE_CLASS = 0x00000200,
  50. };
  51. enum
  52. {
  53. VARID_CASTS_SHADOWS = 0x01,
  54. VARID_AMBIENT_COLOR,
  55. VARID_DIFFUSE_COLOR,
  56. VARID_SPECULAR_COLOR,
  57. VARID_INTENSITY,
  58. VARID_INNER_RADIUS,
  59. VARID_OUTER_RADIUS,
  60. VARID_LIGHT_TYPE,
  61. VARID_LIGHT_SPOT_ANGLE,
  62. VARID_LIGHT_SPOT_EXPONENT,
  63. VARID_LIGHT_SPOT_DIRECTION,
  64. };
  65. //////////////////////////////////////////////////////////////////////////////////
  66. //
  67. // Static factories
  68. //
  69. //////////////////////////////////////////////////////////////////////////////////
  70. DECLARE_DEFINITION_FACTORY(LightDefinitionClass, CLASSID_LIGHT, "Light") _LightDefFactory;
  71. SimplePersistFactoryClass<LightDefinitionClass, CHUNKID_LIGHT_DEF> _LightPersistFactory;
  72. //////////////////////////////////////////////////////////////////////////////////
  73. //
  74. // LightDefinitionClass
  75. //
  76. //////////////////////////////////////////////////////////////////////////////////
  77. LightDefinitionClass::LightDefinitionClass (void)
  78. : m_CastsShadows (false),
  79. m_AmbientColor (0.7F, 0.7F, 0.7F),
  80. m_DiffuseColor (0.7F, 0.7F, 0.7F),
  81. m_SpecularColor (0.7F, 0.7F, 0.7F),
  82. m_Intensity (1.0F),
  83. m_FarRadiusInner (10.0F),
  84. m_FarRadiusOuter (20.0F),
  85. m_SpotDir (0, 0, 0),
  86. m_SpotAngle (0),
  87. m_SpotExp (0),
  88. m_LightType (LightClass::POINT),
  89. DefinitionClass ()
  90. {
  91. NAMED_EDITABLE_PARAM (LightDefinitionClass, ParameterClass::TYPE_BOOL, m_CastsShadows, "Casts Shadows");
  92. NAMED_EDITABLE_PARAM (LightDefinitionClass, ParameterClass::TYPE_COLOR, m_AmbientColor, "Ambient");
  93. NAMED_EDITABLE_PARAM (LightDefinitionClass, ParameterClass::TYPE_COLOR, m_DiffuseColor, "Diffuse");
  94. NAMED_EDITABLE_PARAM (LightDefinitionClass, ParameterClass::TYPE_COLOR, m_SpecularColor, "Specular");
  95. NAMED_EDITABLE_PARAM (LightDefinitionClass, ParameterClass::TYPE_FLOAT, m_FarRadiusInner, "Inner Radius");
  96. NAMED_EDITABLE_PARAM (LightDefinitionClass, ParameterClass::TYPE_FLOAT, m_FarRadiusOuter, "Outer Radius");
  97. FLOAT_EDITABLE_PARAM (LightDefinitionClass, m_Intensity, 0, 1.0F);
  98. ENUM_PARAM (LightDefinitionClass, m_LightType, ("Point", LightClass::POINT, "Directional", LightClass::DIRECTIONAL, "Spotlight", LightClass::SPOT, NULL));
  99. NAMED_EDITABLE_PARAM (LightDefinitionClass, ParameterClass::TYPE_ANGLE, m_SpotAngle, "Spot Angle");
  100. NAMED_EDITABLE_PARAM (LightDefinitionClass, ParameterClass::TYPE_FLOAT, m_SpotExp, "Spot Exponent");
  101. NAMED_EDITABLE_PARAM (LightDefinitionClass, ParameterClass::TYPE_VECTOR3, m_SpotDir, "Spot Direction");
  102. return ;
  103. }
  104. //////////////////////////////////////////////////////////////////////////////////
  105. //
  106. // ~LightDefinitionClass
  107. //
  108. //////////////////////////////////////////////////////////////////////////////////
  109. LightDefinitionClass::~LightDefinitionClass (void)
  110. {
  111. return ;
  112. }
  113. //////////////////////////////////////////////////////////////////////////////////
  114. //
  115. // operator=
  116. //
  117. //////////////////////////////////////////////////////////////////////////////////
  118. const LightDefinitionClass &
  119. LightDefinitionClass::operator= (const LightDefinitionClass &src)
  120. {
  121. m_CastsShadows = src.m_CastsShadows;
  122. m_AmbientColor = src.m_AmbientColor;
  123. m_DiffuseColor = src.m_DiffuseColor;
  124. m_SpecularColor = src.m_SpecularColor;
  125. m_Intensity = src.m_Intensity;
  126. m_FarRadiusInner = src.m_FarRadiusInner;
  127. m_FarRadiusOuter = src.m_FarRadiusOuter;
  128. m_LightType = src.m_LightType;
  129. return *this;
  130. }
  131. //////////////////////////////////////////////////////////////////////////////////
  132. //
  133. // Get_Factory
  134. //
  135. //////////////////////////////////////////////////////////////////////////////////
  136. const PersistFactoryClass &
  137. LightDefinitionClass::Get_Factory (void) const
  138. {
  139. return _LightPersistFactory;
  140. }
  141. //////////////////////////////////////////////////////////////////////////////////
  142. //
  143. // Save
  144. //
  145. //////////////////////////////////////////////////////////////////////////////////
  146. bool
  147. LightDefinitionClass::Save (ChunkSaveClass &csave)
  148. {
  149. bool retval = true;
  150. csave.Begin_Chunk (CHUNKID_VARIABLES);
  151. retval &= Save_Variables (csave);
  152. csave.End_Chunk ();
  153. csave.Begin_Chunk (CHUNKID_BASE_CLASS);
  154. retval &= DefinitionClass::Save (csave);
  155. csave.End_Chunk ();
  156. return retval;
  157. }
  158. //////////////////////////////////////////////////////////////////////////////////
  159. //
  160. // Load
  161. //
  162. //////////////////////////////////////////////////////////////////////////////////
  163. bool
  164. LightDefinitionClass::Load (ChunkLoadClass &cload)
  165. {
  166. bool retval = true;
  167. while (cload.Open_Chunk ()) {
  168. switch (cload.Cur_Chunk_ID ()) {
  169. case CHUNKID_VARIABLES:
  170. retval &= Load_Variables (cload);
  171. break;
  172. case CHUNKID_BASE_CLASS:
  173. retval &= DefinitionClass::Load (cload);
  174. break;
  175. }
  176. cload.Close_Chunk ();
  177. }
  178. return retval;
  179. }
  180. //////////////////////////////////////////////////////////////////////////////////
  181. //
  182. // Save_Variables
  183. //
  184. //////////////////////////////////////////////////////////////////////////////////
  185. bool
  186. LightDefinitionClass::Save_Variables (ChunkSaveClass &csave)
  187. {
  188. bool retval = true;
  189. WRITE_MICRO_CHUNK (csave, VARID_CASTS_SHADOWS, m_CastsShadows)
  190. WRITE_MICRO_CHUNK (csave, VARID_AMBIENT_COLOR, m_AmbientColor)
  191. WRITE_MICRO_CHUNK (csave, VARID_DIFFUSE_COLOR, m_DiffuseColor)
  192. WRITE_MICRO_CHUNK (csave, VARID_SPECULAR_COLOR, m_SpecularColor)
  193. WRITE_MICRO_CHUNK (csave, VARID_INTENSITY, m_Intensity)
  194. WRITE_MICRO_CHUNK (csave, VARID_INNER_RADIUS, m_FarRadiusInner)
  195. WRITE_MICRO_CHUNK (csave, VARID_OUTER_RADIUS, m_FarRadiusOuter)
  196. WRITE_MICRO_CHUNK (csave, VARID_LIGHT_TYPE, m_LightType)
  197. WRITE_MICRO_CHUNK (csave, VARID_LIGHT_SPOT_ANGLE, m_SpotAngle)
  198. WRITE_MICRO_CHUNK (csave, VARID_LIGHT_SPOT_EXPONENT, m_SpotExp)
  199. WRITE_MICRO_CHUNK (csave, VARID_LIGHT_SPOT_DIRECTION, m_SpotDir)
  200. return retval;
  201. }
  202. //////////////////////////////////////////////////////////////////////////////////
  203. //
  204. // Load_Variables
  205. //
  206. //////////////////////////////////////////////////////////////////////////////////
  207. bool
  208. LightDefinitionClass::Load_Variables (ChunkLoadClass &cload)
  209. {
  210. bool retval = true;
  211. //
  212. // Loop through all the microchunks that define the variables
  213. //
  214. while (cload.Open_Micro_Chunk ()) {
  215. switch (cload.Cur_Micro_Chunk_ID ()) {
  216. READ_MICRO_CHUNK (cload, VARID_CASTS_SHADOWS, m_CastsShadows)
  217. READ_MICRO_CHUNK (cload, VARID_AMBIENT_COLOR, m_AmbientColor)
  218. READ_MICRO_CHUNK (cload, VARID_DIFFUSE_COLOR, m_DiffuseColor)
  219. READ_MICRO_CHUNK (cload, VARID_SPECULAR_COLOR, m_SpecularColor)
  220. READ_MICRO_CHUNK (cload, VARID_INTENSITY, m_Intensity)
  221. READ_MICRO_CHUNK (cload, VARID_INNER_RADIUS, m_FarRadiusInner)
  222. READ_MICRO_CHUNK (cload, VARID_OUTER_RADIUS, m_FarRadiusOuter)
  223. READ_MICRO_CHUNK (cload, VARID_LIGHT_TYPE, m_LightType)
  224. READ_MICRO_CHUNK (cload, VARID_LIGHT_SPOT_ANGLE, m_SpotAngle)
  225. READ_MICRO_CHUNK (cload, VARID_LIGHT_SPOT_EXPONENT, m_SpotExp)
  226. READ_MICRO_CHUNK (cload, VARID_LIGHT_SPOT_DIRECTION, m_SpotDir)
  227. }
  228. cload.Close_Micro_Chunk ();
  229. }
  230. return retval;
  231. }
  232. //////////////////////////////////////////////////////////////////////////////////
  233. //
  234. // Create
  235. //
  236. //////////////////////////////////////////////////////////////////////////////////
  237. PersistClass *
  238. LightDefinitionClass::Create (void) const
  239. {
  240. return new LightNodeClass ();
  241. }