Tools for preprocessing data files from Quake to make them suitable for use on PS1 hardware
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

47 lines
1.8 KiB

#pragma once
#include "bsp.h"
struct EdgeData
{
int edgeIndex = 0;
const edge_t* edge = nullptr;
std::vector<const face_t*> faces;
bool isSharpEdge = false;
};
struct Surface
{
std::unordered_set<const face_t*> 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<const face_t*, FaceBound> FaceBounds;
typedef std::unordered_map<const vertex_t*, std::unordered_set<const face_t*>> VertexFaces;
typedef std::vector<Surface> 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<const edge_t*, EdgeData> 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<const edge_t*, EdgeData>& 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);