| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** Confidential - Westwood Studios ***
- ***********************************************************************************************
- * *
- * Project Name : LightMap *
- * *
- * $Archive:: /Commando/Code/Tool $*
- * *
- * $Author:: Ian_l $*
- * *
- * $Modtime:: 7/03/01 3:07p $*
- * *
- * $Revision:: 38 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #ifndef _LIGHTSCAPE_H
- #define _LIGHTSCAPE_H
- // Includes.
- #include "Chunk.h"
- #include "LightMapPacker.h"
- #include "Triangle.h"
- #include "arraylistof.h"
- #include "light.h"
- #include "lsbasebuilders.h"
- #include "ltttypes.h"
- #include "rmap.h"
- #include "vector.h"
- #include "vector2.h"
- #include "vector3.h"
- #include "vector3i.h"
- #include "wwmath.h"
- #include "w3d_file.h"
- class TextureNameNode;
- class SolveStatistics {
- public:
- enum SolveStatisticEnum {
- VERTEX_NOT_FOUND,
- VERTEX_NO_COLOR,
- FACE_NOT_FOUND,
- FACE_NO_LIGHTMAP,
- VERTEX_NOT_SMOOTH,
- FACE_AMBIGUOUS,
- FACE_DEGENERATE,
- FACE_UNDERSIZED,
- EDGE_MATCH,
- ALL_FILL_COLOR,
- NULL_TEXTURE,
- SOLVE_STATISTIC_COUNT
- };
- SolveStatistics ()
- {
- VertexCount = 0;
- FaceCount = 0;
- for (unsigned s = 0; s < SOLVE_STATISTIC_COUNT; s++) Count [s] = 0;
- }
- SolveStatistics (unsigned vertexcount, unsigned facecount)
- {
- VertexCount = vertexcount;
- FaceCount = facecount;
- for (unsigned s = 0; s < SOLVE_STATISTIC_COUNT; s++) Count [s] = 0;
- }
-
- bool Valid_Vertex_Solve() const {
- return (((Count [VERTEX_NOT_FOUND] == 0) || (Count [VERTEX_NOT_FOUND] < VertexCount)) && (Count [VERTEX_NO_COLOR] == 0));
- }
- bool Valid_Lightmap_Solve() const {
- return (((Count [FACE_NOT_FOUND] == 0) || (Count [FACE_NOT_FOUND] < FaceCount)) && (Count [FACE_NO_LIGHTMAP] == 0));
- }
- bool operator == (unsigned c) {
-
- unsigned sum;
- sum = 0;
- for (unsigned s = 0; s < SOLVE_STATISTIC_COUNT; s++) sum += Count [s];
- return (sum == c);
- }
-
- unsigned VertexCount;
- unsigned FaceCount;
- unsigned Count [SOLVE_STATISTIC_COUNT];
- };
- // Class wrapper for floating point color vectors.
- class ColorVector : public Vector3
- {
- public:
- ColorVector () : Vector3() {}
- ColorVector (float r, float g, float b) : Vector3 (r, g, b) {}
- void Set (float r, float g, float b)
- {
- Vector3::Set (r, g, b);
- }
- void Set (const LtTRGBColor &irradiance, const RadianceMap &radiancemap)
- {
- const double oopi = 1.0 / M_PI;
-
- X = irradiance.GetR() * oopi;
- Y = irradiance.GetG() * oopi;
- Z = irradiance.GetB() * oopi;
- radiancemap.ToColor (X, Y, Z);
- }
- };
- class LightscapeSolve : public LightmapPacker
- {
- public:
- // Member functions.
- LightscapeSolve (const char *solvedirectoryname, const char *solvefilenamelist, CStatusBar* statusptr, const char *statusbarmessage, bool blendnoise = false);
- Finish();
- ~LightscapeSolve ();
-
- // Database ammendment functions.
- void Set_Is_Solution (bool issolution) {IsSolution = issolution;}
- void Set_Brightness (float brightness) {Brightness = brightness;}
- void Set_Contrast (float contrast) {Contrast = contrast;}
- void Set_Is_Daylight (bool isdaylight) {IsDaylight = isdaylight;}
- void Set_Is_Exterior (bool isexterior) {IsExterior = isexterior;}
- void Set_Patch_Cluster_Count (int count) {PatchClusterCount = count;}
- void Set_Is_M2T_Solve (bool ism2tsolve) {IsM2TSolve = ism2tsolve;}
- void Add_Material_Texture_Name (const char *materialname, const char *texturename);
- void Add_Texture_Name (unsigned patchindex, const char *materialname);
- void Add_Light (LightClass *light);
- bool Add_Vertex (unsigned vertexindex, const Vector3 &p, const Vector3 &n, unsigned patchindex, const Vector2 &t);
- bool Add_Vertex (unsigned vertexindex, const Vector3 &p, const Vector3 &n, unsigned patchindex, const ColorVector &c);
- bool Add_Patch_Face (unsigned patchfaceindex, unsigned patchindex, unsigned vertexindexcount, unsigned *vertexindices);
- // Database query functions.
- float Get_Brightness() {return (Brightness);}
- float Get_Contrast() {return (Contrast);}
- bool Is_Daylight() {return (IsDaylight);}
- bool Is_Exterior() {return (IsExterior);}
- bool Is_M2T_Solve() {return (IsM2TSolve);}
- float Filter_Sharpness() {return (FilterSharpness);}
- ProceduralTexture *Procedural_Texture() {return (ProceduralTexture);}
- unsigned Light_Count() {return (Lights.Count());}
- LightClass *Get_Light (unsigned l) {return (Lights [l]);}
- const char *Light_Exclusion_String() {return (LightExclusionString);}
- void Find_Vertex (const Vector3 &point, const Vector3 *smoothingnormalptr, W3dRGBStruct &vertexcolor, SolveStatistics &solvestatistics);
- void Find_Triangle (const Vector3 *points, const Vector3 &normal, PackingTriangle &triangle, SolveStatistics &solvestatistics);
- void Submit_Triangle (PackingTriangle &triangle);
- const TextureNameNode *Texture_Name (unsigned patchindex);
- void Pack();
- // Update the progress bar.
- void Step_It() {ProgressBar->StepIt();}
- // Static functions.
- static LightscapeSolve *Importer() {return (_ActiveImporter);}
- static const char *Asset_Directory() {return (LightmapPacker::Asset_Directory());}
- static const char *Asset_Directory (const char *filename) {return (LightmapPacker::Asset_Directory (filename));}
- static void Copy_Assets (const char *pathname) {LightmapPacker::Copy_Assets (pathname);}
- private:
- // Result of finding a face.
- enum FaceResultEnum {
- FACE_NOT_FOUND,
- FACE_AMBIGUOUS,
- FACE_FOUND
- };
- // Area of the face.
- enum FaceSizeEnum {
- FACE_DEGENERATE,
- FACE_UNDERSIZED,
- FACE_NOT_UNDERSIZED
- };
- struct VerticesStruct {
- // Equality operator.
- bool operator == (const VerticesStruct &v) {
- return ((Point == v.Point) &&
- (FaceNormal == v.FaceNormal) &&
- (PatchIndex == v.PatchIndex) &&
- (ValidColor == v.ValidColor) &&
- (Color == v.Color) &&
- (ValidUV == v.ValidUV) &&
- (UV == v.UV));
- }
- // Inequality operator.
- bool operator != (const VerticesStruct &v) {
- return (!(*this == v));
- }
- Vector3 Point;
- Vector3 FaceNormal;
- unsigned PatchIndex;
- bool ValidColor;
- ColorVector Color;
- bool ValidUV;
- Vector2 UV;
- };
- struct PatchFaceStruct {
- enum VerticesPerPatchFace {
- VERTICES_PER_PATCH_FACE = 4
- };
- // To indicate whether a patch face vertex index is valid.
- enum VertexIndexValidity {
- VERTEX_INDEX_INVALID = -1
- };
- // Equality operator.
- bool operator == (const PatchFaceStruct &p) {
- return ((PatchIndex == p.PatchIndex) &&
- (VertexIndices [0] == p.VertexIndices [0]) &&
- (VertexIndices [1] == p.VertexIndices [1]) &&
- (VertexIndices [2] == p.VertexIndices [2]) &&
- (VertexIndices [3] == p.VertexIndices [3]));
- }
- // Inequality operator.
- bool operator != (const PatchFaceStruct &p) {
- return (!(*this == p));
- }
- unsigned PatchIndex;
- unsigned VertexIndices [VERTICES_PER_PATCH_FACE];
- };
- // Member functions.
- void Find_Adjacent_Triangles (const PackingTriangle &principaltriangle, DynamicVectorClass <Triangle> &adjtriangles);
- void Find_Triangle (const Vector3 *points, const Vector3 &facenormal, VerticesStruct *vertices, FaceResultEnum &faceresult);
- void Find_Triangle (const Vector3 *points, float tolerance, bool centroidtest, const Vector3 *facenormal, VerticesStruct *vertices, FaceResultEnum &faceresult);
- void Find_Vertices (const Vector3 &point, float tolerance, DynamicVectorClass <VerticesStruct*> &vertices);
- // Miscellaneous convenience functions.
- FaceSizeEnum Face_Size (const Vector3 *points, unsigned count);
- unsigned Longest_Edge (const Vector3 *points, unsigned count, bool *usededges);
-
- float Manhatten_Distance (const Vector3 &v)
- {
- return (WWMath::Fabs (v.X) + WWMath::Fabs (v.Y) + WWMath::Fabs (v.Z));
- }
- // Comparison functions.
- static int Compare_Material_Texture_Names (const void *materialname0, const void *materialname1);
- static int Compare_Vertices (const void *vertexindexptr0, const void *vertexindexptr1);
- static int Compare_Patch_Faces (const void *patchface0, const void *patchface1);
- // Member data.
- float SmoothingAngle;
- float SpatialTolerance;
- float FilterSharpness;
- bool IsSolution; // Is the currently imported file a valid solve file?
- int PatchClusterCount; // Total patch cluster count over all parsed solve files.
- float Brightness;
- float Contrast;
- bool IsDaylight;
- bool IsExterior;
- bool IsM2TSolve;
- ProceduralTexture *ProceduralTexture;
- CProgressCtrl *ProgressBar;
- DynamicVectorClass <char *> MaterialTextureNames; // <material name, texture pathname> pairs for all materials in the solve.
- DynamicVectorClass <TextureNameNode*> TextureNames; // <texture pathname> for all patches in the solve.
- DynamicVectorClass <VerticesStruct> Vertices; // <point, uv coordinate, normal, material index> tuples for all vertices in the solve.
- DynamicVectorClass <unsigned> VertexIndices; // Indices into Vertices.
- DynamicVectorClass <PatchFaceStruct> PatchFaces; // <patch index, face> pairs for all faces in the solve.
- DynamicVectorClass <LightClass*> Lights; // All active lights in the solve.
- const char *LightExclusionString; // Do not add lights that contain this string.
- // Static data.
- static LightscapeSolve *_ActiveImporter; // Object currently importing (reading a solution file) (otherwise NULL).
- };
- class LsInformationFactory : public LtTBuilderFactory
- {
- protected:
- virtual LtTInfoBuilderApi *OnGetInfoBuilder();
- virtual LtTParameterBuilderApi *OnGetParameterBuilder();
- };
- class LsPreparationFactory : public LtTBuilderFactory
- {
- protected:
- virtual LtTInfoBuilderApi *OnGetInfoBuilder();
- virtual LtTParameterBuilderApi *OnGetParameterBuilder();
- virtual LtTMaterialBuilderApi *OnGetMaterialBuilder();
- virtual LtTLampBuilderApi *OnGetLampBuilder();
- virtual LtTMeshBuilderApi *OnGetMeshBuilder();
- };
- class LsMainFactory : public LtTBuilderFactory
- {
- public:
-
- LsMainFactory();
- unsigned Patch_Face_Count() {return (PatchFaceIndex);}
- void Patch_Face_Increment() {PatchFaceIndex++;}
- unsigned Vertex_Count() {return (VertexIndex);}
- void Vertex_Increment() {VertexIndex++;}
- unsigned Patch_Count() {return (PatchIndex);}
- void Patch_Increment() {PatchIndex++; LightscapeSolve::Importer()->Step_It();}
- protected:
-
- virtual LtTInfoBuilderApi *OnGetInfoBuilder();
- virtual LtTParameterBuilderApi *OnGetParameterBuilder();
- virtual LtTMeshBuilderApi *OnGetMeshBuilder();
- private:
-
- unsigned PatchFaceIndex;
- unsigned VertexIndex;
- unsigned PatchIndex;
- };
- class LsInfoBuilder : public LtTBaseInfoBuilder
- {
- protected:
- LsInfoBuilder (LtTBuilderFactory *factory);
- LtTBool Finish();
- friend class LsInformationFactory;
- friend class LsPreparationFactory;
- friend class LsMainFactory;
- };
- class LsParameterBuilder : public LtTBaseParameterBuilder
- {
- protected:
- LsParameterBuilder (LtTBuilderFactory *factory);
- LtTBool Finish();
- friend class LsInformationFactory;
- friend class LsPreparationFactory;
- friend class LsMainFactory;
- };
- class LsMaterialBuilder : public LtTBaseMaterialBuilder
- {
- protected:
- LsMaterialBuilder (LtTBuilderFactory *factory);
- LtTBool Finish();
- friend class LsPreparationFactory;
- };
- class LsLampBuilder : public LtTBaseLampBuilder
- {
- protected:
- LsLampBuilder (LtTBuilderFactory *factory);
- LtTBool Finish();
- friend class LsPreparationFactory;
- };
- class LsMeshInquirer : public LtTBaseMeshBuilder
- {
- protected:
- LsMeshInquirer (LtTBuilderFactory *factory);
- LtTBool Finish();
- friend class LsPreparationFactory;
- };
- class LsMeshBuilder : public LtTBaseMeshBuilder
- {
- protected:
- LsMeshBuilder (LtTBuilderFactory *factory);
- ~LsMeshBuilder();
-
- LtTBool Finish();
- void SetFaces (const int facecount, const LtTFace *v);
- int GetFaceCount() const;
- const LtTFace *GetFaces() const;
- LsMainFactory *FactoryPtr;
- private:
- struct FaceVertexStruct {
- // Equality operator.
- bool operator == (const FaceVertexStruct &fv) {
- return ((Point == fv.Point) && (Color == fv.Color) && (Weight == fv.Weight));
- }
- // Inequality operator.
- bool operator != (const FaceVertexStruct &fv) {
- return (!(*this == fv));
- }
- Vector3 Point;
- ColorVector Color;
- float Weight;
- };
- LtTFace *Faces;
- int FaceCount;
- int AllocatedCount;
- friend class LsMainFactory;
- friend class VertexUser;
- };
- class VertexUser
- {
- public:
- VertexUser (const LsMeshBuilder &meshbuilder);
- ~VertexUser () {delete [] UsedVertexIndices;}
- bool Is_Used (unsigned vertexindex)
- {
- ASSERT (vertexindex < Count);
- return (UsedVertexIndices [vertexindex] != UNUSED);
- }
-
- void Set_Index (unsigned vertexindex, unsigned usedvertexindex)
- {
- ASSERT (Is_Used (vertexindex));
- UsedVertexIndices [vertexindex] = usedvertexindex;
- }
-
- unsigned Get_Index (unsigned vertexindex)
- {
- ASSERT (vertexindex < Count);
-
- // This vertex must have previously been set.
- ASSERT (UsedVertexIndices [vertexindex] >= 0);
- return (UsedVertexIndices [vertexindex]);
- }
- private:
- enum VertexUsage {
- UNUSED = -2,
- USED = -1
- };
- VertexUser() {}
- unsigned Count;
- int *UsedVertexIndices;
- };
- class LightscapeMeshSolve
- {
- public:
- LightscapeMeshSolve (LightscapeSolve &solve, ChunkClass &trianglechunk, ChunkClass &vertexchunk);
- ~LightscapeMeshSolve();
- W3dRGBStruct Vertex_Color (unsigned vertexindex) const;
- unsigned Vertex_Color_Count() const {return (VertexCount);}
- const char *Lightmap_Pathname (unsigned lightmapindex) const;
- unsigned Lightmap_Index (unsigned faceindex) const;
- W3dTexCoordStruct Lightmap_UV (unsigned facevertexindex) const;
- unsigned Lightmap_Count() const {return (LightmapCount);}
- const SolveStatistics *Get_Statistics() const {return (&Statistics);}
- private:
-
- unsigned VertexCount; // No. of vertices in mesh.
- unsigned FaceCount; // No. of faces in mesh.
- unsigned FaceVertexCount; // No. of face-vertices in mesh.
- unsigned LightmapCount; // No. of lightmaps used by mesh.
- W3dRGBStruct *VertexColors; // Array of vertex colors.
- Vector2 *FaceVertexUVs; // Array to map a face-vertex index to a UV coordinate.
- unsigned *FaceRemapLightmapIndices; // Array to map a face to a zero-based lightmap index.
- unsigned *LightmapIndices; // Array to map a zero-based lightmap index to a 'real' lightmap index.
- SolveStatistics Statistics; // Statistics counters.
- };
- #endif // LIGHTSCAPE_H
|