tge/tools/map2dif plus/morianBasics.h
2025-02-17 23:17:30 -06:00

106 lines
2.5 KiB
C++

//-----------------------------------------------------------------------------
// Torque Game Engine
// Copyright (C) GarageGames.com, Inc.
//-----------------------------------------------------------------------------
#ifndef _MORIANBASICS_H_
#define _MORIANBASICS_H_
//Includes
#ifndef _PLATFORM_H_
#include "platform/platform.h"
#endif
#ifndef _TVECTOR_H_
#include "core/tVector.h"
#endif
#ifndef _MPOINT_H_
#include "math/mPoint.h"
#endif
static const F64 gcPlaneDistanceEpsilon = 0.00001;
static const F64 gcPointEpsilon = 0.01;
static const U32 MaxWindingPoints = 64;
static const U32 MaxWindingNodes = 96;
enum BrushType {
StructuralBrush = 0,
PortalBrush = 1,
DetailBrush = 2,
CollisionBrush = 3,
VehicleCollisionBrush = 4
};
enum PlaneSide {
PlaneFront = 1,
PlaneOn = 0,
PlaneBack = -1
};
enum SpecialPlaneSide {
PlaneSpecialFront = 1 << 0,
PlaneSpecialOn = 1 << 1,
PlaneSpecialBack = 1 << 2
};
class UniqueVector : public Vector<U32>
{
public:
UniqueVector(U32 size) : Vector<U32>(size) { }
UniqueVector() : Vector<U32>(32) { }
void pushBackUnique(U32);
};
struct PlaneEQ
{
Point3D normal;
F64 dist;
PlaneSide whichSide(const Point3D&) const;
PlaneSide whichSideLow(const Point3D&) const;
PlaneSide whichSidePerfect(const Point3D&) const;
F64 distanceToPlane(const Point3D&) const;
void neg() { normal.neg(); dist = -dist; }
};
struct Winding {
U32 numIndices;
U32 numNodes;
U32 numZoneIds;
U32 indices[MaxWindingPoints];
U32 solidNodes[MaxWindingNodes];
U32 zoneIds[8];
U32 brushId;
Winding* pNext;
Winding() : numNodes(0), numZoneIds(0), numIndices(0) { }
void insertZone(U32 zone)
{
// FIXME: lame sort to make sure the zones stay sorted
for (U32 i = 0; i < numZoneIds; i++)
if (zoneIds[i] == zone)
return;
AssertFatal(numZoneIds < 8, "Error, too many zones on a surface. Increase count from 8");
zoneIds[numZoneIds++] = zone;
extern int FN_CDECL cmpZoneNum(const void*, const void*);
dQsort(zoneIds, numZoneIds, sizeof(U32), cmpZoneNum);
}
};
//------------------------------------------------------------------------------
//-------------------------------------- Inlines
//
inline void UniqueVector::pushBackUnique(U32 newElem)
{
for (U32 i = 0; i < size(); i++)
if (operator[](i) == newElem)
return;
push_back(newElem);
}
#endif //_MORIANBASICS_H_