Files
OpenEngine/open_engine/include/open_engine/scene/components.hpp
2026-03-06 18:07:51 +01:00

159 lines
4.2 KiB
C++

#ifndef COMPONENTS_HPP
#define COMPONENTS_HPP
#include "open_engine/renderer/renderer3d.hpp"
#include "open_engine/scene/scene_camera.hpp"
#include "open_engine/renderer/texture.hpp"
#include "open_engine/renderer/renderer3d.hpp"
#include "open_engine/physics.hpp"
#include "open_engine/core/uuid.hpp"
#include <Jolt/Physics/Body/BodyCreationSettings.h>
#include <Jolt/Physics/Body/BodyInterface.h>
#include <Jolt/Physics/Body/MotionType.h>
#include <Jolt/Physics/Collision/ObjectLayer.h>
#include <Jolt/Physics/Collision/Shape/Shape.h>
#include <Jolt/Physics/EActivation.h>
#include <glm/ext/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <glm/fwd.hpp>
#include <glm/glm.hpp>
#define GLM_ENABLE_EXPERIMENTAL
#include <glm/gtx/quaternion.hpp>
#include <imgui_internal.h>
#include <imgui.h>
#include <string>
namespace OpenEngine {
struct IDComponent
{
UUID id;
IDComponent() = default;
IDComponent(const IDComponent&) = default;
IDComponent(const UUID& uuid) : id(uuid) {};
};
struct TagComponent
{
std::string tag;
TagComponent() = default;
TagComponent(const TagComponent&) = default;
TagComponent(const std::string& tag)
: tag(tag) {}
};
struct TransformComponent
{
glm::vec3 translation = { 0.0f, 0.0f, 0.0f };
glm::vec3 rotation = { 0.0f, 0.0f, 0.0f };
glm::vec3 scale = { 1.0f, 1.0f, 1.0f };
TransformComponent() = default;
TransformComponent(const TransformComponent&) = default;
TransformComponent(const glm::vec3& position)
: translation(position) {}
};
glm::mat4 GetTransformFromComp(TransformComponent& transform_comp);
struct SpriteRendererComponent
{
glm::vec4 color{ 1.0f, 1.0f, 1.0f, 1.0f };
Ref<Texture2D> texture;
float tiling_factor = 1.0f;
SpriteRendererComponent() = default;
SpriteRendererComponent(const SpriteRendererComponent&) = default;
SpriteRendererComponent(const glm::vec4& color)
: color(color) {}
};
struct CameraComponent
{
SceneCamera camera;
bool primary = true;
bool fixed_aspect_ratio = false;
CameraComponent() = default;
CameraComponent(const CameraComponent&) = default;
};
class NativeScriptableEntity;
struct NativeScriptComponent
{
NativeScriptableEntity* instance = nullptr;
NativeScriptableEntity* (*InstanciateScript)();
void (*DestroyInstanceScript)(NativeScriptComponent*);
template <typename T>
void Bind()
{
InstanciateScript = []() { return static_cast<NativeScriptableEntity*>(new T()); };
DestroyInstanceScript = [](NativeScriptComponent* nsc)
{
(delete nsc->instance);
nsc->instance = nullptr;
};
};
};
struct MeshComponent
{
Ref<Mesh> mesh;
PrimitiveType primitive_type = PrimitiveType::None;
MeshComponent() = default;
MeshComponent(const MeshComponent&) = default;
MeshComponent(const Ref<Mesh>& mesh)
: mesh(mesh) {};
};
struct MaterialComponent
{
Material material;
MaterialComponent() = default;
MaterialComponent(const MaterialComponent&) = default;
MaterialComponent(const Material& material)
: material(material) {};
};
struct PhysicsBodyComponent
{
BodyID body;
float linear_damping = 0.05f;
float angular_damping = 0.05f;
float gravity_factor = 1.0f;
float restitution = 0.8f;
float friction = 0.5f;
int type = (int)EMotionType::Static;
int initial_activation_state = (int)EActivation::Activate;
int layer = (int)Layers::MOVING;
PhysicsBodyComponent() = default;
PhysicsBodyComponent(const PhysicsBodyComponent&) = default;
};
// TODO: Let's add more shapes
struct BoxShapeComponent
{
glm::vec3 size = { 1.0f, 1.0f, 1.0f };
};
struct SphereShapeComponent
{
float radius = 1.0f;
};
}
#endif // COMPONENTS_HPP