#pragma once

#include <glm/glm.hpp>

using namespace glm;

struct Primitive
{
private:
    vec3 m_ambientColor;
    vec3 m_diffuseColor;
    vec3 m_specularColor;
    vec3 m_position;

public:
    vec3& ambientColor()                { return m_ambientColor; }
    const vec3& ambientColor() const    { return m_ambientColor; }

    vec3& diffuseColor()                { return m_diffuseColor; }
    const vec3& diffuseColor() const    { return m_diffuseColor; }

    vec3& specularColor()               { return m_specularColor; }
    const vec3& specularColor() const   { return m_specularColor; }

    vec3& position()                    { return m_position; }
    const vec3& position() const        { return m_position; }
};

struct Sphere : Primitive
{
private:
    float m_radius;

public:
    float& radius()             { return m_radius; }
    const float& radius() const { return m_radius; }
};

struct Torus : Primitive
{
private:
    float m_outerRadius;
    float m_innerRadius;

public:
    float& outerRadius()                { return m_outerRadius; }
    const float& outerRadius() const    { return m_outerRadius; }

    float& innerRadius()                { return m_innerRadius; }
    const float& innerRadius() const    { return m_innerRadius; }
};

struct Cube : Primitive
{
private:
    float m_size;

public:
    float& size()             { return m_size; }
    const float& size() const { return m_size; }
};

struct RoundedCube : Primitive
{
private:
    float m_size;
    float m_radius;

public:
    float& size()             { return m_size; }
    const float& size() const { return m_size; }

    float& radius()             { return m_radius; }
    const float& radius() const { return m_radius; }
};

struct Cylinder : Primitive
{
private:
    float m_height;
    float m_radius;

public:
    float& height()             { return m_height; }
    const float& height() const { return m_height; }

    float& radius()             { return m_radius; }
    const float& radius() const { return m_radius; }
};

struct Cone : Primitive
{
private:
    float m_height;
    float m_radius;

public:
    float& height()             { return m_height; }
    const float& height() const { return m_height; }

    float& radius()             { return m_radius; }
    const float& radius() const { return m_radius; }
};