/** ecs component (unit of composable functionality) */

module re.ecs.component;

import re.ecs.entity;
import re.math.transform;
public import re.util.reflect;

/// the composable unit of functionality
abstract class Component : ReflectableObject {
    mixin Reflect;

    /// owner entity
    public Entity entity;

    /// initialize the component. entity is already set.
    public void setup() {
    }

    /// release resources and clean up
    public void destroy() {
    }

    /// forward to entity.transform
    @property public ref Transform transform() {
        return entity.transform;
    }
}

/// basic component classification
enum ComponentType {
    Base,
    Updatable,
    Renderable,
    UpdatableRenderable
}

/// reference to a stored component
struct ComponentId {
    /// index in storage
    size_t index;
    /// entity owner index
    size_t owner;
    /// component classification
    ComponentType type;
}