55 lines
1.6 KiB
C++
55 lines
1.6 KiB
C++
|
|
#pragma once
|
|
|
|
#include "hw_levelmesh.h"
|
|
#include "tarray.h"
|
|
#include "vectors.h"
|
|
#include "r_defs.h"
|
|
|
|
struct FLevelLocals;
|
|
|
|
struct Surface
|
|
{
|
|
SurfaceType type;
|
|
int typeIndex;
|
|
int numVerts;
|
|
unsigned int startVertIndex;
|
|
secplane_t plane;
|
|
sector_t *controlSector;
|
|
bool bSky;
|
|
};
|
|
|
|
class DoomLevelMesh : public hwrenderer::LevelMesh
|
|
{
|
|
public:
|
|
DoomLevelMesh(FLevelLocals &doomMap);
|
|
|
|
TArray<Surface> Surfaces;
|
|
|
|
private:
|
|
void CreateSubsectorSurfaces(FLevelLocals &doomMap);
|
|
void CreateCeilingSurface(FLevelLocals &doomMap, subsector_t *sub, sector_t *sector, int typeIndex, bool is3DFloor);
|
|
void CreateFloorSurface(FLevelLocals &doomMap, subsector_t *sub, sector_t *sector, int typeIndex, bool is3DFloor);
|
|
void CreateSideSurfaces(FLevelLocals &doomMap, side_t *side);
|
|
|
|
static bool IsTopSideSky(sector_t* frontsector, sector_t* backsector, side_t* side);
|
|
static bool IsTopSideVisible(side_t* side);
|
|
static bool IsBottomSideVisible(side_t* side);
|
|
static bool IsSkySector(sector_t* sector);
|
|
static bool IsControlSector(sector_t* sector);
|
|
|
|
static secplane_t ToPlane(const FVector3& pt1, const FVector3& pt2, const FVector3& pt3)
|
|
{
|
|
FVector3 n = ((pt2 - pt1) ^ (pt3 - pt2)).Unit();
|
|
float d = pt1 | n;
|
|
secplane_t p;
|
|
p.set(n.X, n.Y, n.Z, d);
|
|
return p;
|
|
}
|
|
|
|
static FVector2 ToFVector2(const DVector2& v) { return FVector2((float)v.X, (float)v.Y); }
|
|
static FVector3 ToFVector3(const DVector3& v) { return FVector3((float)v.X, (float)v.Y, (float)v.Z); }
|
|
static FVector4 ToFVector4(const DVector4& v) { return FVector4((float)v.X, (float)v.Y, (float)v.Z, (float)v.W); }
|
|
|
|
static bool IsDegenerate(const FVector3 &v0, const FVector3 &v1, const FVector3 &v2);
|
|
};
|