50 lines
1.5 KiB
C++
50 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include <glm/glm.hpp>
|
|
|
|
#include <destrum/ObjectModel/Component.h>
|
|
#include <destrum/Physics/PhysicsTypes.h>
|
|
|
|
class Collider : public Component {
|
|
public:
|
|
explicit Collider(GameObject& owner)
|
|
: Component(owner) {}
|
|
|
|
~Collider() override = default;
|
|
|
|
void ImGuiInspector() override;
|
|
|
|
[[nodiscard]] virtual PhysicsShapeDesc BuildPhysicsShape() const = 0;
|
|
|
|
[[nodiscard]] bool IsTrigger() const { return m_IsTrigger; }
|
|
void SetTrigger(bool trigger) { m_IsTrigger = trigger; NotifyPhysicsChanged(); }
|
|
|
|
[[nodiscard]] const glm::vec3& GetCenterOffset() const { return m_CenterOffset; }
|
|
void SetCenterOffset(const glm::vec3& offset) { m_CenterOffset = offset; NotifyPhysicsChanged(); }
|
|
|
|
protected:
|
|
[[nodiscard]] nlohmann::json SerializeCollider() const {
|
|
return {
|
|
{"centerOffset", {m_CenterOffset.x, m_CenterOffset.y, m_CenterOffset.z}},
|
|
{"isTrigger", m_IsTrigger}
|
|
};
|
|
}
|
|
|
|
void DeserializeCollider(const nlohmann::json& data) {
|
|
if (data.contains("centerOffset")) {
|
|
const auto& offset = data.at("centerOffset");
|
|
m_CenterOffset = {
|
|
offset.at(0).get<float>(),
|
|
offset.at(1).get<float>(),
|
|
offset.at(2).get<float>()
|
|
};
|
|
}
|
|
if (data.contains("isTrigger")) {
|
|
m_IsTrigger = data.at("isTrigger").get<bool>();
|
|
}
|
|
}
|
|
|
|
bool m_IsTrigger{false};
|
|
glm::vec3 m_CenterOffset{0.0f};
|
|
};
|