#pragma once #include "bsp.h" struct EdgeData { int edgeIndex = 0; const edge_t* edge = nullptr; std::vector faces; bool isSharpEdge = false; }; struct Surface { std::unordered_set faces; }; struct FaceBound { BoundBox worldBounds; double minS = DBL_MAX, minT = DBL_MAX; double maxS = DBL_MIN, maxT = DBL_MIN; void addTexturePoint(double s, double t) { if (s < minS) minS = s; if (s > maxS) maxS = s; if (t < minT) minT = t; if (t > maxT) maxT = t; } }; typedef std::unordered_map FaceBounds; typedef std::unordered_map> VertexFaces; typedef std::vector SurfaceList; bool sample_lightmap(const world_t* world, const face_t* face, const FaceBound& bounds, const Vec3& point, unsigned char* outSample); unsigned char sample_lightmap(const world_t* world, const face_t* face, const FaceBound& bounds, const Vec3& point); void export_lightmap(const world_t* world, const face_t* face, const FaceBound& bounds, int faceIdx); std::unordered_map analyze_edges(const world_t* world); unsigned char compute_faceVertex_light(const world_t* world, const face_t* face, unsigned short vertexIndex, const FaceBounds& faceBounds, const std::unordered_map& edgeData); unsigned char compute_faceVertex_light2(const world_t* world, const face_t* face, unsigned short vertexIndex, const FaceBounds& faceBounds, const VertexFaces& vertexFaces); SurfaceList group_surfaces(const world_t* world, const VertexFaces& vertexFaces); unsigned char compute_faceVertex_light4(const world_t* world, const face_t* refFace, const FaceBounds& faceBounds, Vec3 point); unsigned char compute_faceVertex_light5(const world_t* world, const face_t* refFace, const FaceBounds& faceBounds, Vec3 point);