/** renderable 3d model */

module re.gfx.shapes.model;

import re.ecs;
import re.gfx;
import re.math;
import re.ng.diag;
import re.math;
static import raylib;

/// represents a 3d model
class Model3D : Component, Renderable3D {
    mixin Reflect;
    /// the model
    public Model model;
    private Effect _effect;
    public Vector3 offset = Vector3.zero;

    this(Model model) {
        this.model = model;
        // default effect
        _effect = new Effect();
    }

    /// gets the effect
    @property ref Effect effect() {
        return _effect;
    }

    /// sets the effect
    @property Effect effect(Effect value) {
        _effect = value;
        // set shader for each material
        for (int i = 0; i < model.materialCount; i++) {
            model.materials[i].shader = _effect.shader;
        }
        return value;
    }

    @property BoundingBox bounds() {
        return Bounds.calculate(raylib.GetMeshBoundingBox(model.meshes[0]), entity.transform);
    }

    public void render() {
        raylib.DrawModelEx(model, transform.position + offset, transform.axis_angle.axis,
                transform.axis_angle.angle * C_RAD2DEG, transform.scale, effect.color);
    }

    public void debug_render() {
        DebugRender.default_debug_render(this, model);
    }
}