LightMapDoc.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  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. *** Confidential - Westwood Studios ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : LightMap *
  23. * *
  24. * $Archive:: /Commando/Code/Tool $*
  25. * *
  26. * $Author:: Ian_l $*
  27. * *
  28. * $Modtime:: 7/24/01 4:53p $*
  29. * *
  30. * $Revision:: 39 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. #ifndef LIGHTMAPDOC_H
  36. #define LIGHTMAPDOC_H
  37. // Includes.
  38. #include "Rawfile.h"
  39. #include "w3d_file.h"
  40. #include "Chunk.h"
  41. #include "Lightscape.h"
  42. #include "meshmdl.h"
  43. // Defines.
  44. #define MAX_SOLVE_COUNT 2
  45. #define TEMPORARY_SOLVE_FILENAME_COUNT 2
  46. class LightMapDoc : public CDocument
  47. {
  48. public:
  49. enum PrelitModeEnum {
  50. UNLIT,
  51. VERTEX,
  52. MULTI_PASS,
  53. MULTI_TEXTURE,
  54. COUNT
  55. };
  56. // Flags for anomalies in a W3D model.
  57. // WARNING: Do not exceed no. of bits in unsigned long.
  58. enum MeshFlagsEnum {
  59. // Unconditional errors.
  60. MESH_HIDDEN,
  61. MESH_PRELIT,
  62. MESH_NO_VERTEX_MATERIALS,
  63. MESH_NO_SHADERS,
  64. MESH_HAS_HIERARCHY,
  65. MESH_NOT_MODULATED_PRIMARY,
  66. MESH_HAS_SPECULAR,
  67. MESH_SPECULAR_TO_DIFFUSE,
  68. MESH_W3D_CHUNK_DEFORM,
  69. MESH_TWO_SIDED,
  70. MESH_HAS_EMISSIVE,
  71. MESH_HAS_SCG,
  72. // Vertex specific errors.
  73. MESH_HAS_DIG,
  74. // Lightmap multi-pass specific errors.
  75. MESH_TOO_MANY_PASSES,
  76. MESH_ALPHATEST,
  77. MESH_PASS_ZERO_DESTBLEND,
  78. // Lightmap multi-texture specific errors.
  79. MESH_TOO_MANY_STAGES,
  80. // General warnings.
  81. MESH_VERTEX_COLORING,
  82. MESH_FLAG_COUNT,
  83. // Unconditional errors.
  84. MESH_ERROR_MASK = (1 << MESH_HIDDEN) |
  85. (1 << MESH_PRELIT) |
  86. (1 << MESH_NO_VERTEX_MATERIALS) |
  87. (1 << MESH_NO_SHADERS) |
  88. (1 << MESH_HAS_HIERARCHY) |
  89. (1 << MESH_NOT_MODULATED_PRIMARY) |
  90. (1 << MESH_HAS_SPECULAR) |
  91. (1 << MESH_SPECULAR_TO_DIFFUSE) |
  92. (1 << MESH_W3D_CHUNK_DEFORM) |
  93. (1 << MESH_TWO_SIDED) |
  94. (1 << MESH_HAS_EMISSIVE) |
  95. (1 << MESH_HAS_SCG),
  96. // Anomalies that will prevent a vertex solve from being inserted.
  97. MESH_VERTEX_ERROR_MASK = MESH_ERROR_MASK |
  98. (1 << MESH_HAS_DIG),
  99. // Anomalies that will prevent a multi-pass lightmap solve from being inserted.
  100. MESH_MULTI_PASS_ERROR_MASK = MESH_ERROR_MASK |
  101. (1 << MESH_TOO_MANY_PASSES) |
  102. (1 << MESH_ALPHATEST) |
  103. (1 << MESH_PASS_ZERO_DESTBLEND),
  104. // Anomalies that will prevent a multi-texture lightmap solve from being inserted.
  105. MESH_MULTI_TEXTURE_ERROR_MASK = MESH_ERROR_MASK |
  106. (1 << MESH_TOO_MANY_STAGES)
  107. };
  108. // Functions.
  109. bool Is_Open() {return (W3dFile != NULL);}
  110. bool Can_Insert_Solve() {return (CanInsertSolve && SolveCount < MAX_SOLVE_COUNT);}
  111. void Insert_Solve (const char *solvedirectoryname, const char *solvefilenamelist, const char *inclusionstring, bool invertselection, bool blendnoise);
  112. bool Solve_Inserted() {return (SolveCount > 0);}
  113. unsigned Mesh_Count() {return (MeshStatus.Count());}
  114. const char *Mesh_Name (unsigned index) {return (MeshStatus [index].Name);}
  115. const char *Mesh_Anomalies_String (unsigned meshindex, bool verbose, StringBuilder &string);
  116. const char *Solve_Anomalies_String (unsigned meshindex, bool verbose, StringBuilder &string);
  117. const char *Vertex_Solve_Status_String (unsigned meshindex, StringBuilder &string);
  118. const char *Lightmap_Solve_Status_String (unsigned meshindex, StringBuilder &string);
  119. private:
  120. struct MeshInfoStruct {
  121. public:
  122. MeshInfoStruct (FileClass &meshfile);
  123. ~MeshInfoStruct ();
  124. unsigned Lightmap_Vertex_Material_Count() const {return (1);}
  125. unsigned Lightmap_Shader_Count() const {return (1);}
  126. W3dMeshHeader3Struct Header;
  127. W3dMaterialInfoStruct MaterialInfo [PrelitModeEnum::COUNT];
  128. ChunkClass *TriangleChunk;
  129. ChunkClass *VertexChunk;
  130. DynamicVectorClass <W3dVertexMaterialStruct> *VertexMaterials [PrelitModeEnum::COUNT];
  131. ChunkClass *ShaderChunk [PrelitModeEnum::COUNT];
  132. ChunkClass *ShaderIdChunk [PrelitModeEnum::COUNT][MeshMatDescClass::MAX_PASSES];
  133. ChunkClass *SCGChunk [PrelitModeEnum::COUNT][MeshMatDescClass::MAX_PASSES];
  134. bool SCGsExist;
  135. bool DIGsExist;
  136. bool DeformExists;
  137. bool IsMultiStage;
  138. bool VertexColorsExist;
  139. private:
  140. void Parse_Vertex_Materials (ChunkLoadClass &w3dchunk, unsigned prelitmode);
  141. void Parse_Material_Pass (ChunkLoadClass &w3dchunk, unsigned prelitmode, unsigned materialpass);
  142. void Parse_Prelit_Chunk (ChunkLoadClass &w3dchunk, unsigned prelitmode);
  143. };
  144. struct MeshAnomalyStruct {
  145. public:
  146. MeshAnomalyStruct (const MeshInfoStruct &meshinfo);
  147. unsigned long MeshAnomalies;
  148. };
  149. struct MeshStatusStruct {
  150. // Equality operator.
  151. bool operator == (const MeshStatusStruct &m) {
  152. return (strcmp (Name, m.Name) == 0);
  153. }
  154. // Inequality operator.
  155. bool operator != (const MeshStatusStruct &m) {
  156. return (!(*this == m));
  157. }
  158. MeshStatusStruct() {}
  159. MeshStatusStruct (const char *name, unsigned trianglecount, unsigned long meshanomalies)
  160. {
  161. strcpy (Name, name);
  162. TriangleCount = trianglecount;
  163. MeshAnomalies = meshanomalies;
  164. InsertedFlags = 0;
  165. }
  166. bool Can_Insert_Vertex_Solve() {
  167. return (((MeshAnomalies & MESH_VERTEX_ERROR_MASK) == 0) && SolveStatistics.Valid_Vertex_Solve());
  168. }
  169. bool Can_Insert_Multi_Pass_Solve() {
  170. return (((MeshAnomalies & MESH_MULTI_PASS_ERROR_MASK) == 0) && SolveStatistics.Valid_Lightmap_Solve());
  171. }
  172. bool Can_Insert_Multi_Texture_Solve() {
  173. return (((MeshAnomalies & MESH_MULTI_TEXTURE_ERROR_MASK) == 0) && SolveStatistics.Valid_Lightmap_Solve());
  174. }
  175. bool Inserted_Vertex_Solve() {return ((InsertedFlags & W3D_MESH_FLAG_PRELIT_VERTEX) != 0);}
  176. bool Inserted_Multi_Pass_Solve() {return ((InsertedFlags & W3D_MESH_FLAG_PRELIT_LIGHTMAP_MULTI_PASS) != 0);}
  177. bool Inserted_Multi_Texture_Solve() {return ((InsertedFlags & W3D_MESH_FLAG_PRELIT_LIGHTMAP_MULTI_TEXTURE) != 0);}
  178. unsigned long Prelit_Flags() {
  179. unsigned long prelitflags;
  180. // If a vertex solve cannot be inserted substitute an unlit solve.
  181. if (Can_Insert_Vertex_Solve()) {
  182. prelitflags = W3D_MESH_FLAG_PRELIT_VERTEX;
  183. } else {
  184. prelitflags = W3D_MESH_FLAG_PRELIT_UNLIT;
  185. }
  186. if (Can_Insert_Multi_Pass_Solve()) prelitflags |= W3D_MESH_FLAG_PRELIT_LIGHTMAP_MULTI_PASS;
  187. if (Can_Insert_Multi_Texture_Solve()) prelitflags |= W3D_MESH_FLAG_PRELIT_LIGHTMAP_MULTI_TEXTURE;
  188. return (prelitflags);
  189. }
  190. char Name [W3D_NAME_LEN];
  191. unsigned TriangleCount;
  192. unsigned long MeshAnomalies;
  193. unsigned long InsertedFlags; // Which prelit mode types were inserted with the most recent solve?
  194. SolveStatistics SolveStatistics;
  195. };
  196. struct SplitVertexInfoStruct {
  197. public:
  198. SplitVertexInfoStruct (const MeshInfoStruct &meshinfo, const LightscapeMeshSolve &meshsolve);
  199. ~SplitVertexInfoStruct();
  200. unsigned Vertex_Count() const {return (VertexCount);}
  201. uint32 Remap (unsigned v) const {ASSERT (v < Vertex_Count()); return (RemapTable [v]);}
  202. uint32 Index (unsigned v) const {ASSERT (v < FaceVertexCount); return (IndexTable [v]);}
  203. W3dTexCoordStruct *UV (unsigned v) const {ASSERT (v < Vertex_Count()); return (UVPtrTable [v]);}
  204. private:
  205. SplitVertexInfoStruct() {ASSERT (false);}
  206. unsigned VertexCount;
  207. unsigned FaceVertexCount;
  208. uint32 *RemapTable;
  209. uint32 *IndexTable;
  210. W3dTexCoordStruct *UVTable;
  211. W3dTexCoordStruct **UVPtrTable;
  212. };
  213. struct MeshReorderStruct {
  214. // Equality operator.
  215. bool operator == (const MeshReorderStruct &m) {
  216. return ((Chunk == m.Chunk) && (Position == m.Position));
  217. }
  218. // Inequality operator.
  219. bool operator != (const MeshReorderStruct &m) {
  220. return (!(*this == m));
  221. }
  222. public:
  223. ChunkClass *Chunk;
  224. Vector3 Position;
  225. };
  226. // Functions.
  227. bool Check_Document();
  228. void Reorder();
  229. void Optimize();
  230. void Optimize_Prelit_Vertex_Material_Pass (ChunkLoadClass &w3dchunk, ChunkSaveClass &optimizechunk);
  231. void Rename_Mesh (ChunkLoadClass &loadchunk, ChunkSaveClass &savechunk, const char *filename, const char *lightmapdirectory);
  232. void Rename_Mesh_Header (ChunkLoadClass &loadchunk, ChunkSaveClass &savechunk, const char *filename);
  233. void Rename_Prelit_Chunks (ChunkLoadClass &loadchunk, ChunkSaveClass &savechunk, const char *lightmapdirectory);
  234. void Rename_Lightmaps (ChunkLoadClass &loadchunk, ChunkSaveClass &savechunk, const char *lightmapdirectory);
  235. void Rename_Collection (ChunkLoadClass &loadchunk, ChunkSaveClass &savechunk, const char *filename);
  236. void Rename_HLOD (ChunkLoadClass &loadchunk, ChunkSaveClass &savechunk, const char *filename);
  237. void Rename_Dazzle (ChunkLoadClass &loadchunk, ChunkSaveClass &savechunk, const char *filename);
  238. void Save_Lights (const char *pathname);
  239. void Translate_Mesh_Header3 (ChunkLoadClass &w3dchunk, unsigned long prelitflags, ChunkSaveClass &solvechunk, const SplitVertexInfoStruct &splitvertexinfo);
  240. void Translate_Vertices (ChunkLoadClass &w3dchunk, ChunkSaveClass &solvechunk, const SplitVertexInfoStruct &splitvertexinfo);
  241. void Translate_Vertex_Normals (ChunkLoadClass &w3dchunk, ChunkSaveClass &solvechunk, const SplitVertexInfoStruct &splitvertexinfo);
  242. void Translate_Vertex_Influences (ChunkLoadClass &w3dchunk, ChunkSaveClass &solvechunk, const SplitVertexInfoStruct &splitvertexinfo);
  243. void Translate_Triangles (ChunkLoadClass &w3dchunk, ChunkSaveClass &solvechunk, const SplitVertexInfoStruct &splitvertexinfo);
  244. void Translate_Vertex_Shade_Indices (ChunkLoadClass &w3dchunk, ChunkSaveClass &solvechunk, const SplitVertexInfoStruct &splitvertexinfo);
  245. void Insert_Solve (PrelitModeEnum inputmode, FileClass &meshfile, PrelitModeEnum outputmode, ChunkSaveClass &solvechunk, const MeshInfoStruct &meshinfo, const LightscapeMeshSolve &meshsolve, const SplitVertexInfoStruct &splitvertexinfo);
  246. void Insert_Solve (PrelitModeEnum inputmode, ChunkLoadClass &w3dchunk, PrelitModeEnum outputmode, ChunkSaveClass &solvechunk, const MeshInfoStruct &meshinfo, const LightscapeMeshSolve &meshsolve, const SplitVertexInfoStruct &splitvertexinfo);
  247. void Translate_Material_Info (PrelitModeEnum inputmode, ChunkLoadClass &w3dchunk, PrelitModeEnum outputmode, ChunkSaveClass &solvechunk, const MeshInfoStruct &meshinfo, const LightscapeMeshSolve &meshsolve);
  248. void Translate_Vertex_Materials (PrelitModeEnum inputmode, ChunkLoadClass &w3dchunk, PrelitModeEnum outputmode, ChunkSaveClass &solvechunk, const MeshInfoStruct &meshinfo);
  249. void Translate_Shaders (PrelitModeEnum inputmode, ChunkLoadClass &w3dchunk, PrelitModeEnum outputmode, ChunkSaveClass &solvechunk, const MeshInfoStruct &meshinfo);
  250. void Translate_Textures (ChunkLoadClass &w3dchunk, PrelitModeEnum outputmode, ChunkSaveClass &solvechunk, const LightscapeMeshSolve &meshsolve);
  251. void Add_Lightmap_Textures (ChunkSaveClass &solvechunk, const LightscapeMeshSolve &meshsolve);
  252. void Translate_Material_Pass (PrelitModeEnum inputmode, ChunkLoadClass &w3dchunk, unsigned materialpass, PrelitModeEnum outputmode, ChunkSaveClass &solvechunk, const MeshInfoStruct &meshinfo, const LightscapeMeshSolve &meshsolve, const SplitVertexInfoStruct &splitvertexinfo);
  253. void Translate_DCGs (ChunkLoadClass &w3dchunk, ChunkSaveClass &solvechunk, const SplitVertexInfoStruct &splitvertexinfo);
  254. void Translate_DIGs (PrelitModeEnum inputmode, ChunkLoadClass &w3dchunk, unsigned materialpass, ChunkSaveClass &solvechunk, const MeshInfoStruct &meshinfo, const LightscapeMeshSolve &meshsolve, const SplitVertexInfoStruct &splitvertexinfo);
  255. void Add_DIGs (PrelitModeEnum inputmode, unsigned materialpass, ChunkSaveClass &solvechunk, const MeshInfoStruct &meshinfo, const LightscapeMeshSolve &meshsolve, const SplitVertexInfoStruct &splitvertexinfo);
  256. void Translate_Vertex_Material_IDs (PrelitModeEnum inputmode, ChunkLoadClass &w3dchunk, ChunkSaveClass &solvechunk, const MeshInfoStruct &meshinfo, const SplitVertexInfoStruct &splitvertexinfo);
  257. void Translate_Texture_Stage (ChunkLoadClass &w3dchunk, ChunkSaveClass &solvechunk, const SplitVertexInfoStruct &splitvertexinfo);
  258. void Translate_Stage_Texcoords (ChunkLoadClass &w3dchunk, ChunkSaveClass &solvechunk, const SplitVertexInfoStruct &splitvertexinfo);
  259. void Add_Lightmap_Material_Pass (PrelitModeEnum inputmode, unsigned materialpass, ChunkSaveClass &solvechunk, const MeshInfoStruct &meshinfo, const LightscapeMeshSolve &meshsolve, const SplitVertexInfoStruct &splitvertexinfo);
  260. void Add_Lightmap_Stage (PrelitModeEnum inputmode, ChunkSaveClass &solvechunk, const MeshInfoStruct &meshinfo, const LightscapeMeshSolve &meshsolve, const SplitVertexInfoStruct &splitvertexinfo);
  261. void Translate_Lightmap_Stage (PrelitModeEnum inputmode, ChunkLoadClass &w3dchunk, ChunkSaveClass &solvechunk, const MeshInfoStruct &meshinfo, const LightscapeMeshSolve &meshsolve, const SplitVertexInfoStruct &splitvertexinfo);
  262. void Add_Lightmap_Stage_Chunks (PrelitModeEnum inputmode, ChunkSaveClass &solvechunk, const MeshInfoStruct &meshinfo, const LightscapeMeshSolve &meshsolve, const SplitVertexInfoStruct &splitvertexinfo);
  263. void Copy_Chunk (ChunkLoadClass &loadchunk, ChunkSaveClass &savechunk);
  264. // Member data.
  265. char DocumentName [_MAX_FNAME]; // Name of this document.
  266. RawFileClass *W3dFile; // Ptr to current open w3d document.
  267. unsigned MeshCount; // Total no. of meshes in this w3d document.
  268. unsigned TriangleCount; // Total no. of triangles in this w3d document.
  269. bool CanInsertSolve; // Can a solve be inserted?
  270. unsigned SolveCount; // No. of solves inserted so far.
  271. DynamicVectorClass <MeshStatusStruct> MeshStatus; // Mesh information database.
  272. DynamicVectorClass <LightClass*> Lights [MAX_SOLVE_COUNT]; // All active lights in the solves.
  273. // Static data.
  274. static const char *_TemporarySolveFilename [TEMPORARY_SOLVE_FILENAME_COUNT];
  275. static const char *_TemporaryOptimizeFilename;
  276. static const char *_TemporaryReorderFilename;
  277. // The following is maintained by MFC tools.
  278. protected: // create from serialization only
  279. LightMapDoc();
  280. DECLARE_DYNCREATE(LightMapDoc)
  281. // Attributes
  282. public:
  283. // Operations
  284. public:
  285. // Overrides
  286. // ClassWizard generated virtual function overrides
  287. //{{AFX_VIRTUAL(LightMapDoc)
  288. public:
  289. virtual BOOL OnNewDocument();
  290. virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
  291. virtual void Serialize(CArchive& ar);
  292. virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
  293. virtual void DeleteContents();
  294. //}}AFX_VIRTUAL
  295. // Implementation
  296. public:
  297. virtual ~LightMapDoc();
  298. #ifdef _DEBUG
  299. virtual void AssertValid() const;
  300. virtual void Dump(CDumpContext& dc) const;
  301. #endif
  302. // Generated message map functions
  303. protected:
  304. //{{AFX_MSG(LightMapDoc)
  305. afx_msg void OnFileSave();
  306. afx_msg void OnFileSaveAs();
  307. afx_msg void OnUpdateFileSave(CCmdUI* pCmdUI);
  308. afx_msg void OnUpdateFileSaveAs(CCmdUI* pCmdUI);
  309. //}}AFX_MSG
  310. DECLARE_MESSAGE_MAP()
  311. };
  312. #endif // LIGHTMAPDOC_H