X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fentity.cpp;h=054af2a52950abe7842360be59f5192d2704aece;hb=83ed3de28841d1eecfca39ff540e804cf6809b32;hp=c572429067c6e0dd77bd4a21ac9e1dde7c864b14;hpb=1a7bbd64b1fef1f4e2f9303f820d6f3ce76cebf1;p=blank.git diff --git a/src/entity.cpp b/src/entity.cpp index c572429..054af2a 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -1,26 +1,49 @@ #include "entity.hpp" -#include "chunk.hpp" +#include "geometry.hpp" +#include "shape.hpp" #include #include +namespace { + +blank::Model::Buffer model_buffer; + +} namespace blank { -Entity::Entity() -: velocity() -, position() +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::Velocity(const glm::vec3 &vel) { +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 glm::vec3 &pos) { +void Entity::Position(const Block::Pos &pos) noexcept { position = pos; while (position.x >= Chunk::Width()) { position.x -= Chunk::Width(); @@ -48,30 +71,44 @@ void Entity::Position(const glm::vec3 &pos) { } } -void Entity::Move(const glm::vec3 &delta) { +void Entity::Move(const glm::vec3 &delta) noexcept { Position(position + delta); } -void Entity::Rotation(const glm::mat4 &rot) { +void Entity::AngularVelocity(const glm::quat &v) noexcept { + angular_velocity = v; +} + +void Entity::Rotation(const glm::mat4 &rot) noexcept { rotation = rot; } -glm::mat4 Entity::Transform(const glm::tvec3 &chunk_offset) const { +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 glm::tvec3 &chunk_offset) const { +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, 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; return Ray{ glm::vec3(from), glm::normalize(glm::vec3(to - from)) }; } -void Entity::Update(int dt) { +void Entity::Update(int dt) noexcept { Move(velocity * float(dt)); + Rotate(angular_velocity * float(dt)); +} + + +void Entity::Draw() noexcept { + model.Draw(); } }