#ifndef BLANK_MODEL_MODEL_HPP_
#define BLANK_MODEL_MODEL_HPP_
-#include "geometry.hpp"
+#include "Part.hpp"
+#include "../graphics/glm.hpp"
#include <cstdint>
#include <list>
-#include <glm/glm.hpp>
+#include <vector>
#include <glm/gtc/quaternion.hpp>
std::uint32_t ID() const noexcept { return id; }
void ID(std::uint32_t i) noexcept { id = i; }
- const AABB &Bounds() const noexcept { return bounds; }
- void Bounds(const AABB &b) noexcept { bounds = b; }
+ Part &RootPart() noexcept { return root; }
+ const Part &RootPart() const noexcept { return root; }
+ Part &GetPart(std::size_t i) noexcept { return *part[i]; }
+ const Part &GetPart(std::size_t i) const noexcept { return *part[i]; }
- const glm::vec3 &Position() const noexcept { return position; }
- void Position(const glm::vec3 &p) noexcept { position = p; }
+ void SetBody(std::uint16_t id) { body_id = id; }
+ const Part &GetBodyPart() const noexcept { return GetPart(body_id); }
- const glm::quat &Orientation() const noexcept { return orientation; }
- void Orientation(const glm::quat &o) noexcept { orientation = o; }
-
- bool HasNodeMesh() const noexcept { return node_mesh; }
- void SetNodeMesh(const EntityMesh *m) noexcept { node_mesh = m; }
-
- const EntityMesh &NodeMesh() const noexcept { return *node_mesh; }
-
- Model &AddPart();
- bool HasParent() const noexcept { return parent; }
- Model &Parent() const noexcept { return *parent; }
- bool IsRoot() const noexcept { return !HasParent(); }
-
- glm::mat4 LocalTransform() const noexcept;
- glm::mat4 GlobalTransform() const noexcept;
+ void SetEyes(std::uint16_t id) { eyes_id = id; }
+ const Part &GetEyesPart() const noexcept { return GetPart(eyes_id); }
+ void Enumerate();
void Instantiate(Instance &) const;
private:
- Model *parent;
- const EntityMesh *node_mesh;
-
std::uint32_t id;
-
- AABB bounds;
-
- glm::vec3 position;
- glm::quat orientation;
-
- std::list<Model> parts;
+ Part root;
+ std::vector<Part *> part;
+ std::uint16_t body_id;
+ std::uint16_t eyes_id;
};