#ifndef BLANK_MODEL_INSTANCE_HPP_
#define BLANK_MODEL_INSTANCE_HPP_
+#include "Part.hpp"
+#include "../graphics/glm.hpp"
+
#include <vector>
-#include <glm/glm.hpp>
#include <glm/gtc/quaternion.hpp>
namespace blank {
-class Model;
class DirectionalLighting;
+class Model;
+class Part;
-// TODO: this doesn't have to be a tree, actually
-// linearizing might be a good opportunity to optimize
class Instance {
friend class Model;
+ friend class Part;
public:
Instance();
+ ~Instance();
- operator bool() const noexcept { return part_model; }
- const Model &GetModel() const noexcept { return *part_model; }
-
- const glm::vec3 &Position() const noexcept { return position; }
- void Position(const glm::vec3 &p) noexcept { position = p; }
+ operator bool() const noexcept { return model; }
+ const Model &GetModel() const noexcept { return *model; }
- const glm::quat &Orientation() const noexcept { return orientation; }
- void Orientation(const glm::quat &o) noexcept { orientation = o; }
+ glm::mat4 BodyTransform() const noexcept;
+ Part::State &BodyState() noexcept;
- glm::mat4 LocalTransform() const noexcept;
- glm::mat4 GlobalTransform() const noexcept;
+ glm::mat4 EyesTransform() const noexcept;
+ Part::State &EyesState() noexcept;
- void Render(const glm::mat4 &, DirectionalLighting &) const;
+ void Render(const glm::mat4 &, DirectionalLighting &);
private:
- Instance &AddPart();
- bool HasParent() const noexcept { return parent; }
- Instance &Parent() const noexcept { return *parent; }
- bool IsRoot() const noexcept { return !HasParent(); }
-
-private:
- const Model *part_model;
- Instance *parent;
-
- glm::vec3 position;
- glm::quat orientation;
-
- std::vector<Instance> parts;
+ const Model *model;
+ std::vector<Part::State> state;
};