game2006/server/gameserver/mapcollider.h
aozhiwei 8451dfd4c1 1
2023-11-04 08:51:03 +08:00

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);
};