Files
simian/include/ECSComponents.h
nick 36fd4047dc
Sync Docs to Gitea Wiki / Sync docs to Gitea wiki (push) Failing after 13m56s
CI / build-and-test (push) Failing after 14m19s
fix: scene scripts and asset restore
2026-03-10 20:03:44 +13:00

183 lines
5.1 KiB
C++

#pragma once
#include "raylib.h"
#include "raymath.h"
#include "entt.hpp"
#include <string>
#include <unordered_map>
// ECSTransform component - position, rotation, scale, and cached local matrix
struct ECSTransform {
Vector3 position;
Vector3 rotation; // Euler rotation (radians)
Vector3 scale;
Matrix localMatrix;
ECSTransform()
: position{0.0f, 0.0f, 0.0f}
, rotation{0.0f, 0.0f, 0.0f}
, scale{1.0f, 1.0f, 1.0f}
, localMatrix(MatrixIdentity()) {}
ECSTransform(Vector3 pos, Vector3 scl, Vector3 rot)
: position(pos), rotation(rot), scale(scl), localMatrix(MatrixIdentity()) {}
ECSTransform(Vector3 pos, Vector3 scl = {1.0f, 1.0f, 1.0f}, float rotY = 0.0f)
: position(pos)
, rotation{0.0f, rotY, 0.0f}
, scale(scl)
, localMatrix(MatrixIdentity()) {}
};
// Velocity component - for movement
struct Velocity {
Vector3 linear; // Linear velocity (units per second)
float angular; // Angular velocity (radians per second)
Velocity()
: linear{0.0f, 0.0f, 0.0f}
, angular(0.0f) {}
Velocity(Vector3 lin, float ang = 0.0f)
: linear(lin), angular(ang) {}
};
// ModelRenderer component - 3D model rendering data
struct ModelRenderer {
size_t modelId; // Index into models array
Color color; // Tint color
float outlineSize; // Outline thickness
unsigned int shaderId; // Shader to use (0 = no shader)
ModelRenderer()
: modelId(0)
, color(WHITE)
, outlineSize(0.0f)
, shaderId(0) {}
ModelRenderer(int model, Color col = WHITE, float outline = 0.0f, unsigned int shader = 0)
: modelId(model), color(col), outlineSize(outline), shaderId(shader) {}
};
// Texture component - material texture reference
struct TextureComponent {
unsigned int textureId;
TextureComponent() : textureId(0) {}
TextureComponent(unsigned int id) : textureId(id) {}
};
// UV transform component - tiling and offset for texture sampling
struct UVTransform {
Vector2 scale;
Vector2 offset;
float rotation;
UVTransform()
: scale{1.0f, 1.0f}
, offset{0.0f, 0.0f}
, rotation(0.0f) {}
UVTransform(Vector2 s, Vector2 o = {0.0f, 0.0f}, float r = 0.0f)
: scale(s), offset(o), rotation(r) {}
};
// Tag component - simple string identifier
struct Tag {
std::string name;
Tag() : name("") {}
Tag(const std::string& n) : name(n) {}
};
// ScriptComponent - per-entity script reference
struct ScriptComponent {
std::string scriptPath;
bool enabled = true;
bool started = false;
// Optional: name of the script class to instantiate. If empty, engine
// will attempt to pick a reasonable object type from the module.
std::string className;
// Opaque pointer to the script object instance (asIScriptObject*).
void* scriptInstance = nullptr;
// Persisted overrides for editable script fields (name -> raw value string).
std::unordered_map<std::string, std::string> scriptOverrides;
};
// SceneEntity component - marks entities owned by the scene
struct SceneEntity {
bool persistent = false;
std::string id;
};
// Hierarchy component - parent/child links using EnTT-friendly linked list
struct Hierarchy {
entt::entity parent{entt::null};
entt::entity first{entt::null};
entt::entity prev{entt::null};
entt::entity next{entt::null};
};
// WorldTransform component - computed from hierarchy + local transform
struct WorldTransform {
Vector3 position;
Vector3 rotation; // Euler rotation (radians)
Vector3 scale;
Matrix worldMatrix;
WorldTransform()
: position{0.0f, 0.0f, 0.0f}
, rotation{0.0f, 0.0f, 0.0f}
, scale{1.0f, 1.0f, 1.0f}
, worldMatrix(MatrixIdentity()) {}
};
// Camera3D component - camera settings
struct Camera3DComponent {
Vector3 position;
Vector3 target;
Vector3 up;
float fovy;
int projection; // 0 = CAMERA_PERSPECTIVE, 1 = CAMERA_ORTHOGRAPHIC
Camera3DComponent()
: position{0.0f, 10.0f, 10.0f}
, target{0.0f, 0.0f, 0.0f}
, up{0.0f, 1.0f, 0.0f}
, fovy(45.0f)
, projection(0) {}
};
// Light component - directional light
struct LightComponent {
Vector3 direction;
Color color;
float intensity;
LightComponent()
: direction{0.5f, 0.7f, 0.3f}
, color(WHITE)
, intensity(1.0f) {}
};
// Material component - references shader and material managers
struct MaterialComponent {
unsigned int materialId; // ID in MaterialManager
MaterialComponent() : materialId(0) {}
MaterialComponent(unsigned int id) : materialId(id) {}
};
// RenderPass component - controls rendering order and properties
struct RenderPassComponent {
int order; // Render order (lower = earlier)
bool depthTest; // Enable depth testing
bool depthWrite; // Enable depth writing
unsigned int shaderId; // Override shader for this pass (0 = use material shader)
RenderPassComponent()
: order(0)
, depthTest(true)
, depthWrite(true)
, shaderId(0) {}
};