115 lines
2.9 KiB
C++
115 lines
2.9 KiB
C++
#pragma once
|
|
|
|
#include <glm/gtc/quaternion.hpp>
|
|
#include <glm/gtx/quaternion.hpp>
|
|
#include <glm/gtx/euler_angles.hpp>
|
|
|
|
namespace mc
|
|
{
|
|
const float MAP_SCALE = 10;
|
|
|
|
enum ColliderType_e
|
|
{
|
|
kNoneCollider = 0,
|
|
kBoxCollider = 1,
|
|
kMeshCollider = 2
|
|
};
|
|
|
|
enum ColliderAssembly_e
|
|
{
|
|
kCA_Floor = 0,//地板
|
|
kCA_Wall = 1,//墙壁
|
|
kCA_Roof = 2,//屋顶
|
|
kCA_FloororRoof = 3,//屋顶+上层地板
|
|
kCA_Stairs = 4,//楼梯
|
|
kCA_Window = 9,//窗,主要为了射击穿透
|
|
kCA_Other = 10,//其他,装饰品
|
|
kCA_Grass = 19,//草,需要抖动
|
|
kCA_Water = 20,//水
|
|
kCA_Box = 21,//箱子
|
|
kCA_Shield = 22,//盾
|
|
kCA_WallShield = 23,//能量盾
|
|
|
|
kCA_Surface = 100,//地表
|
|
kCA_End
|
|
};
|
|
|
|
struct Bounds
|
|
{
|
|
glm::vec3 center = glm::vec3(0.0f, 0.0f, 0.0f);
|
|
glm::vec3 size = glm::vec3(0.0f, 0.0f, 0.0f);
|
|
};
|
|
|
|
struct ColliderNode;
|
|
struct Triangle
|
|
{
|
|
ColliderNode* node = nullptr;
|
|
glm::vec3 vert0 = glm::vec3(0.0f, 0.0f, 0.0f);
|
|
glm::vec3 vert1 = glm::vec3(0.0f, 0.0f, 0.0f);
|
|
glm::vec3 vert2 = glm::vec3(0.0f, 0.0f, 0.0f);
|
|
float min_y = 0.0f;
|
|
float max_y = 0.0f;
|
|
int check_flag = 0;
|
|
};
|
|
|
|
struct Transform
|
|
{
|
|
glm::vec3 local_position = glm::vec3(0.0f, 0.0f, 0.0f);
|
|
glm::quat local_rotation = glm::quat_identity<float, glm::qualifier::defaultp>();
|
|
glm::vec3 local_scale = glm::vec3(0.0f, 0.0f, 0.0f);
|
|
void Read(std::shared_ptr<a8::XObject> xobj);
|
|
};
|
|
|
|
struct Mesh
|
|
{
|
|
std::vector<glm::vec3> vertices;
|
|
std::vector<int> raw_triangles;
|
|
std::vector<Triangle> triangles;
|
|
Bounds bounds;
|
|
};
|
|
|
|
struct Collider
|
|
{
|
|
int type = kNoneCollider;
|
|
int ca_type = 0;
|
|
bool enabled = false;
|
|
bool is_trigger = false;
|
|
Bounds bounds;
|
|
|
|
virtual ~Collider() {};
|
|
virtual void Read(std::shared_ptr<a8::XObject> xobj);
|
|
};
|
|
|
|
struct MeshCollider : public Collider
|
|
{
|
|
Mesh mesh;
|
|
virtual void Read(std::shared_ptr<a8::XObject> xobj) override;
|
|
};
|
|
|
|
struct BoxCollider : public Collider
|
|
{
|
|
glm::vec3 center = glm::vec3(0.0f, 0.0f, 0.0f);
|
|
glm::vec3 size = glm::vec3(0.0f, 0.0f, 0.0f);
|
|
std::vector<Triangle> triangles;
|
|
virtual void Read(std::shared_ptr<a8::XObject> xobj) override;
|
|
};
|
|
|
|
struct ColliderNode
|
|
{
|
|
ColliderNode* parent = nullptr;
|
|
std::string name;
|
|
Bounds bounds;
|
|
Transform transform;
|
|
std::vector<std::shared_ptr<Collider>> colliders;
|
|
std::map<std::string, std::shared_ptr<ColliderNode>> childs;
|
|
|
|
void Read(std::shared_ptr<a8::XObject> xobj);
|
|
};
|
|
|
|
void RotateBounds(const glm::vec3& center,
|
|
const glm::vec3& size,
|
|
const glm::quat& quat,
|
|
std::vector<glm::vec3>& points);
|
|
|
|
};
|