mirror of
https://github.com/nzp-team/vhlt.git
synced 2024-11-25 05:11:28 +00:00
136 lines
No EOL
3.6 KiB
C++
136 lines
No EOL
3.6 KiB
C++
#ifndef WINDING_H__
|
|
#define WINDING_H__
|
|
#include "cmdlib.h" //--vluzacn
|
|
|
|
#if _MSC_VER >= 1000
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "basictypes.h"
|
|
#include "mathtypes.h"
|
|
#include "win32fix.h"
|
|
#include "mathlib.h"
|
|
#include "bspfile.h"
|
|
#include "boundingbox.h"
|
|
|
|
#define MAX_POINTS_ON_WINDING 128
|
|
// TODO: FIX THIS STUPID SHIT (MAX_POINTS_ON_WINDING)
|
|
|
|
#define BASE_WINDING_DISTANCE 9000
|
|
|
|
#define SIDE_FRONT 0
|
|
#define SIDE_ON 2
|
|
#define SIDE_BACK 1
|
|
#define SIDE_CROSS -2
|
|
|
|
#ifdef HLCSG_HLBSP_DOUBLEPLANE
|
|
#ifdef HLBSP
|
|
#ifndef DOUBLEVEC_T
|
|
#error you must add -dDOUBLEVEC_T to the project!
|
|
#endif
|
|
#define dplane_t plane_t
|
|
#define g_dplanes g_mapplanes
|
|
typedef struct
|
|
{
|
|
vec3_t normal;
|
|
vec3_t unused_origin;
|
|
vec_t dist;
|
|
planetypes type;
|
|
} dplane_t;
|
|
extern dplane_t g_dplanes[MAX_INTERNAL_MAP_PLANES];
|
|
#endif
|
|
#endif
|
|
class Winding
|
|
{
|
|
public:
|
|
// General Functions
|
|
void Print() const;
|
|
void getPlane(dplane_t& plane) const;
|
|
void getPlane(vec3_t& normal, vec_t& dist) const;
|
|
vec_t getArea() const;
|
|
void getBounds(BoundingBox& bounds) const;
|
|
void getBounds(vec3_t& mins, vec3_t& maxs) const;
|
|
void getCenter(vec3_t& center) const;
|
|
Winding* Copy() const;
|
|
void Check(
|
|
#ifdef ZHLT_WINDING_EPSILON
|
|
vec_t epsilon = ON_EPSILON
|
|
#endif
|
|
) const; // Developer check for validity
|
|
bool Valid() const; // Runtime/user/normal check for validity
|
|
void addPoint(const vec3_t newpoint);
|
|
void insertPoint(const vec3_t newpoint, const unsigned int offset);
|
|
|
|
// Specialized Functions
|
|
void RemoveColinearPoints(
|
|
#ifdef ZHLT_WINDING_EPSILON
|
|
vec_t epsilon = ON_EPSILON
|
|
#endif
|
|
);
|
|
bool Clip(const dplane_t& split, bool keepon
|
|
#ifdef ZHLT_WINDING_EPSILON
|
|
, vec_t epsilon = ON_EPSILON
|
|
#endif
|
|
); // For hlbsp
|
|
void Clip(const dplane_t& split, Winding** front, Winding** back
|
|
#ifdef ZHLT_WINDING_EPSILON
|
|
, vec_t epsilon = ON_EPSILON
|
|
#endif
|
|
);
|
|
void Clip(const vec3_t normal, const vec_t dist, Winding** front, Winding** back
|
|
#ifdef ZHLT_WINDING_EPSILON
|
|
, vec_t epsilon = ON_EPSILON
|
|
#endif
|
|
);
|
|
bool Chop(const vec3_t normal, const vec_t dist
|
|
#ifdef ZHLT_WINDING_EPSILON
|
|
, vec_t epsilon = ON_EPSILON
|
|
#endif
|
|
);
|
|
void Divide(const dplane_t& split, Winding** front, Winding** back
|
|
#ifdef ZHLT_WINDING_EPSILON
|
|
, vec_t epsilon = ON_EPSILON
|
|
#endif
|
|
);
|
|
int WindingOnPlaneSide(const vec3_t normal, const vec_t dist
|
|
#ifdef ZHLT_WINDING_EPSILON
|
|
, vec_t epsilon = ON_EPSILON
|
|
#endif
|
|
);
|
|
void CopyPoints(vec3_t *points, int &numpoints);
|
|
|
|
void initFromPoints(vec3_t *points, UINT32 numpoints);
|
|
void Reset(void); // Resets the structure
|
|
|
|
protected:
|
|
void resize(UINT32 newsize);
|
|
|
|
public:
|
|
// Construction
|
|
Winding(); // Do nothing :)
|
|
Winding(vec3_t *points, UINT32 numpoints); // Create from raw points
|
|
Winding(const dface_t& face
|
|
#ifdef ZHLT_WINDING_EPSILON
|
|
, vec_t epsilon = ON_EPSILON
|
|
#endif
|
|
);
|
|
Winding(const dplane_t& face);
|
|
Winding(const vec3_t normal, const vec_t dist);
|
|
Winding(UINT32 points);
|
|
Winding(const Winding& other);
|
|
virtual ~Winding();
|
|
Winding& operator=(const Winding& other);
|
|
|
|
// Misc
|
|
private:
|
|
void initFromPlane(const vec3_t normal, const vec_t dist);
|
|
|
|
public:
|
|
// Data
|
|
UINT32 m_NumPoints;
|
|
vec3_t* m_Points;
|
|
protected:
|
|
UINT32 m_MaxPoints;
|
|
};
|
|
|
|
#endif |