X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fworld%2FEntity.cpp;fp=src%2Fworld%2FEntity.cpp;h=6b23cacf8cccfc1d11aa9f86479be1df3523d174;hb=b7d09e1e35ef90282c97509e0020b20db3c7ea9f;hp=0000000000000000000000000000000000000000;hpb=e53a0e2e711a7d8bd9b0ddacd1360aa14370643f;p=blank.git diff --git a/src/world/Entity.cpp b/src/world/Entity.cpp new file mode 100644 index 0000000..6b23cac --- /dev/null +++ b/src/world/Entity.cpp @@ -0,0 +1,114 @@ +#include "Entity.hpp" + +#include "../model/geometry.hpp" +#include "../model/Shape.hpp" + +#include +#include + +namespace { + +blank::Model::Buffer model_buffer; + +} + +namespace blank { + +Entity::Entity() noexcept +: 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() noexcept { + shape = nullptr; +} + + +void Entity::Velocity(const glm::vec3 &vel) noexcept { + velocity = vel; +} + +void Entity::Position(const Block::Pos &pos) noexcept { + position = pos; + while (position.x >= Chunk::width) { + position.x -= Chunk::width; + ++chunk.x; + } + while (position.x < 0) { + position.x += Chunk::width; + --chunk.x; + } + while (position.y >= Chunk::height) { + position.y -= Chunk::height; + ++chunk.y; + } + while (position.y < 0) { + position.y += Chunk::height; + --chunk.y; + } + while (position.z >= Chunk::depth) { + position.z -= Chunk::depth; + ++chunk.z; + } + while (position.z < 0) { + position.z += Chunk::depth; + --chunk.z; + } +} + +void Entity::Move(const glm::vec3 &delta) noexcept { + Position(position + delta); +} + +void Entity::AngularVelocity(const glm::quat &v) noexcept { + angular_velocity = v; +} + +void Entity::Rotation(const glm::mat4 &rot) noexcept { + rotation = rot; +} + +void Entity::Rotate(const glm::quat &delta) noexcept { + Rotation(rotation * glm::mat4_cast(delta)); +} + +glm::mat4 Entity::Transform(const Chunk::Pos &chunk_offset) const noexcept { + 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 noexcept { + glm::mat4 transform = Transform(chunk_offset); + 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; + return Ray{ glm::vec3(from), glm::normalize(glm::vec3(to - from)) }; +} + +void Entity::Update(int dt) noexcept { + Move(velocity * float(dt)); + Rotate(angular_velocity * float(dt)); +} + + +void Entity::Draw() noexcept { + model.Draw(); +} + +}