X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmodel%2FShape.hpp;h=80dc4a33ba6d28803f9de4b603e1cf83b2b00b9f;hb=dcd54cacda98c2c0f7cf0c7a9131fb858d8ee10a;hp=21602707b593132e6f9871beedcc98b0d6d83fab;hpb=bc48fbd6be3283a2e1aaa9249909fab32c617692;p=blank.git diff --git a/src/model/Shape.hpp b/src/model/Shape.hpp index 2160270..80dc4a3 100644 --- a/src/model/Shape.hpp +++ b/src/model/Shape.hpp @@ -1,26 +1,57 @@ #ifndef BLANK_MODEL_SHAPE_HPP_ #define BLANK_MODEL_SHAPE_HPP_ +#include "CollisionBounds.hpp" +#include "../geometry/primitive.hpp" #include "../graphics/BlockMesh.hpp" #include "../graphics/EntityMesh.hpp" +#include "../graphics/glm.hpp" +#include "../world/Block.hpp" #include #include -#include namespace blank { -struct CollisionBounds; class TokenStreamReader; class Shape { +public: + struct Faces { + bool face[Block::FACE_COUNT]; + Faces &operator =(const Faces &other) noexcept { + for (int i = 0; i < Block::FACE_COUNT; ++i) { + face[i] = other.face[i]; + } + return *this; + } + bool operator [](Block::Face f) const noexcept { + return face[f]; + } + }; + + public: Shape(); void Read(TokenStreamReader &); + bool FaceFilled(Block::Face face) const noexcept { + return fill[face]; + } + + std::size_t VertexCount() const noexcept { return vertices.size(); } + std::size_t IndexCount() const noexcept { return indices.size(); } + + const glm::vec3 &VertexNormal(size_t idx) const noexcept { + return vertices[idx].normal; + } + glm::vec3 VertexNormal(size_t idx, const glm::mat4 &M) const noexcept { + return glm::vec3(M * glm::vec4(VertexNormal(idx), 0.0f)); + } + void Fill( EntityMesh::Buffer &, const std::vector &tex_map @@ -37,6 +68,24 @@ public: std::size_t idx_offset = 0 ) const; + size_t OutlineCount() const noexcept; + size_t OutlineIndexCount() const noexcept; + void Outline(PrimitiveMesh::Buffer &out) const; + + bool Intersects( + const Ray &, + const glm::mat4 &, + float &dist, + glm::vec3 &normal + ) const noexcept; + bool Intersects( + const glm::mat4 &M, + const AABB &box, + const glm::mat4 &box_M, + float &depth, + glm::vec3 &normal + ) const noexcept; + private: static float TexR(const std::vector &, std::size_t) noexcept; @@ -45,11 +94,12 @@ private: struct Vertex { glm::vec3 position; glm::vec3 normal; - glm::vec3 tex_st; + glm::vec2 tex_st; std::size_t tex_id; }; std::vector vertices; std::vector indices; + Faces fill; };