X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmodel%2FShape.hpp;h=2f79f82b941459592cb0affbb44734191055f2e9;hb=7e782291e0ce39eb2d4e8c1df28f682c313e6f8d;hp=312b1aafd1cf212951ffeee433ed2a22b99da5bf;hpb=8ab4ea13545cccbacbd1ed610968d3f481c1b3c8;p=blank.git diff --git a/src/model/Shape.hpp b/src/model/Shape.hpp index 312b1aa..2f79f82 100644 --- a/src/model/Shape.hpp +++ b/src/model/Shape.hpp @@ -1,104 +1,105 @@ #ifndef BLANK_MODEL_SHAPE_HPP_ #define BLANK_MODEL_SHAPE_HPP_ -#include "BlockModel.hpp" -#include "EntityModel.hpp" -#include "OutlineModel.hpp" -#include "SkyBoxModel.hpp" - +#include "CollisionBounds.hpp" +#include "geometry.hpp" +#include "../graphics/BlockMesh.hpp" +#include "../graphics/EntityMesh.hpp" +#include "../world/Block.hpp" + +#include +#include #include namespace blank { -class AABB; -class Ray; +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]; + } + }; + -struct Shape { +public: + Shape(); - /// the number of vertices (and normals) this shape has - size_t VertexCount() const noexcept { return vtx_pos.size(); } - /// the number of vertex indices this shape has - size_t VertexIndexCount() const noexcept { return vtx_idx.size(); } + void Read(TokenStreamReader &); - const EntityModel::Normal &VertexNormal(size_t idx) const noexcept { return vtx_nrm[idx]; } - EntityModel::Normal VertexNormal( - size_t idx, const glm::mat4 &transform - ) const noexcept { - return EntityModel::Normal(transform * glm::vec4(vtx_nrm[idx], 0.0f)); + bool FaceFilled(Block::Face face) const noexcept { + return fill[face]; } - /// fill given buffers with this shape's elements with an - /// optional transform and offset - void Vertices( - EntityModel::Buffer &out, - float tex_offset = 0.0f + 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 ) const; - void Vertices( - EntityModel::Buffer &out, + void Fill( + EntityMesh::Buffer &, const glm::mat4 &transform, - float tex_offset = 0.0f, - EntityModel::Index idx_offset = 0 + const std::vector &tex_map ) const; - void Vertices( - BlockModel::Buffer &out, + void Fill( + BlockMesh::Buffer &, const glm::mat4 &transform, - float tex_offset = 0.0f, - BlockModel::Index idx_offset = 0 - ) const; - void Vertices( - SkyBoxModel::Buffer &out + const std::vector &tex_map, + std::size_t idx_offset = 0 ) const; - /// the number of vertices this shape's outline has - size_t OutlineCount() const { return out_pos.size(); } - /// the number of vertex indices this shape's outline has - size_t OutlineIndexCount() const { return out_idx.size(); } - - /// fill given buffers with this shape's outline's elements - void Outline(OutlineModel::Buffer &out) const; + size_t OutlineCount() const noexcept; + size_t OutlineIndexCount() const noexcept; + void Outline(OutlineMesh::Buffer &out) const; - /// Check if given ray would pass though this shape if it were - /// transformed with given matrix. - /// If true, dist and normal hold the intersection distance and - /// normal, otherwise their content is undefined. - virtual bool Intersects( + bool Intersects( const Ray &, const glm::mat4 &, float &dist, glm::vec3 &normal - ) const noexcept = 0; - - /// Check for intersection with given OBB. - /// The OBB is defined by box and box_M, M is applied to the shape. - virtual bool Intersects( + ) const noexcept; + bool Intersects( const glm::mat4 &M, const AABB &box, const glm::mat4 &box_M, float &depth, glm::vec3 &normal - ) const noexcept = 0; - -protected: - void SetShape( - const EntityModel::Positions &pos, - const EntityModel::Normals &nrm, - const EntityModel::Indices &idx); - void SetTexture( - const BlockModel::TexCoords &tex_coords); - void SetOutline( - const OutlineModel::Positions &pos, - const OutlineModel::Indices &idx); + ) const noexcept; private: - EntityModel::Positions vtx_pos; - EntityModel::Normals vtx_nrm; - EntityModel::Indices vtx_idx; - - BlockModel::TexCoords vtx_tex_coords; + static float TexR(const std::vector &, std::size_t) noexcept; - OutlineModel::Positions out_pos; - OutlineModel::Indices out_idx; +private: + std::unique_ptr bounds; + struct Vertex { + glm::vec3 position; + glm::vec3 normal; + glm::vec2 tex_st; + std::size_t tex_id; + }; + std::vector vertices; + std::vector indices; + Faces fill; };