#include "entity.hpp"
-#include "chunk.hpp"
+#include "geometry.hpp"
+#include "shape.hpp"
#include <cmath>
#include <glm/gtx/transform.hpp>
+namespace {
+
+blank::Model::Buffer model_buffer;
+
+}
namespace blank {
Entity::Entity()
-: velocity()
-, position()
+: shape(nullptr)
+, model()
+, velocity(0, 0, 0)
+, position(0, 0, 0)
+, chunk(0, 0, 0)
+, angular_velocity(1.0f, 0.0f, 0.0f, 0.0f)
, rotation(1.0f) {
}
+void Entity::SetShape(const Shape *s, const glm::vec3 &color) {
+ shape = s;
+ model_buffer.Clear();
+ shape->Vertices(model_buffer.vertices, model_buffer.normals, model_buffer.indices);
+ model_buffer.colors.resize(shape->VertexCount(), color);
+ model.Update(model_buffer);
+}
+
+void Entity::SetShapeless() {
+ shape = nullptr;
+}
+
+
void Entity::Velocity(const glm::vec3 &vel) {
velocity = vel;
}
Position(position + delta);
}
+void Entity::AngularVelocity(const glm::quat &v) {
+ angular_velocity = v;
+}
+
void Entity::Rotation(const glm::mat4 &rot) {
rotation = rot;
}
+void Entity::Rotate(const glm::quat &delta) {
+ Rotation(rotation * glm::mat4_cast(delta));
+}
+
glm::mat4 Entity::Transform(const Chunk::Pos &chunk_offset) const {
const glm::vec3 chunk_pos = (chunk - chunk_offset) * Chunk::Extent();
return glm::translate(position + chunk_pos) * rotation;
Ray Entity::Aim(const Chunk::Pos &chunk_offset) const {
glm::mat4 transform = Transform(chunk_offset);
- glm::vec4 from = transform * glm::vec4(0.0f, 0.0f, 1.0f, 1.0f);
+ glm::vec4 from = transform * glm::vec4(0.0f, 0.0f, 0.0f, 1.0f);
from /= from.w;
glm::vec4 to = transform * glm::vec4(0.0f, 0.0f, -1.0f, 1.0f);
to /= to.w;
void Entity::Update(int dt) {
Move(velocity * float(dt));
+ Rotate(angular_velocity * float(dt));
+}
+
+
+void Entity::Draw() {
+ model.Draw();
}
}