2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2025-11-23 05:12:05 +00:00
Files
OpenAssetTools/src/ObjLoading/Game/T6/CustomMap/BSPCalculation.h
LJW-Dev b4073d74d9 WIP:
- Updated names to allign with the BSP naming structure
- Updated constants file and assoicated uses
2025-10-21 18:54:26 +08:00

76 lines
1.5 KiB
C++

#pragma once
#include <memory>
#include <vector>
#include "Game/T6/T6.h"
using namespace T6;
constexpr int MAX_NODE_SIZE = 512; // maximum size a BSP node can be before it becomes a leaf
enum PlaneAxis
{
AXIS_X,
AXIS_Y,
AXIS_Z
};
enum PlaneSide
{
SIDE_FRONT,
SIDE_BACK,
SIDE_INTERSECTS
};
class BSPObject
{
public:
vec3_t min;
vec3_t max;
int partitionIndex; // index of the partition the object is contained in
BSPObject(float xMin, float yMin, float zMin, float xMax, float yMax, float zMax, int objPartitionIndex);
};
class BSPLeaf
{
public:
std::vector<std::shared_ptr<BSPObject>> objectList;
void addObject(std::shared_ptr<BSPObject> object);
BSPObject* getObject(int index);
int getObjectCount();
};
class BSPTree;
class BSPNode
{
public:
std::unique_ptr<BSPTree> front;
std::unique_ptr<BSPTree> back;
PlaneAxis axis; // axis that the split plane is on
float distance; // distance from the origin (0, 0, 0) to the plane
BSPNode(std::unique_ptr<BSPTree> frontTree, std::unique_ptr<BSPTree> backTree, PlaneAxis nodeAxis, float nodeDistance);
PlaneSide objectIsInfront(BSPObject* object);
};
class BSPTree
{
public:
bool isLeaf;
std::unique_ptr<BSPLeaf> leaf;
std::unique_ptr<BSPNode> node;
int level; // level in the BSP tree
vec3_t min;
vec3_t max;
BSPTree(float xMin, float yMin, float zMin, float xMax, float yMax, float zMax, int treeLevel);
void splitTree();
void addObjectToTree(std::shared_ptr<BSPObject> object);
};