X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmodel%2FShape.hpp;h=ac4dc8095f159e85e5eb3b7020e32895edaa903d;hb=3a487f44c26f9bb9d1a1c831406b6497b2b3b425;hp=c6964f9c410110d10e4ed48933b07bce0512eb42;hpb=5998b18978bd8e7a0c9deb516474634e1d3521c9;p=blank.git diff --git a/src/model/Shape.hpp b/src/model/Shape.hpp index c6964f9..ac4dc80 100644 --- a/src/model/Shape.hpp +++ b/src/model/Shape.hpp @@ -1,107 +1,55 @@ #ifndef BLANK_MODEL_SHAPE_HPP_ #define BLANK_MODEL_SHAPE_HPP_ -#include "BlockModel.hpp" -#include "EntityModel.hpp" -#include "OutlineModel.hpp" +#include "../graphics/BlockMesh.hpp" +#include "../graphics/EntityMesh.hpp" +#include #include #include namespace blank { -class AABB; -class Ray; +struct CollisionBounds; +class TokenStreamReader; -struct Shape { +class 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(); } +public: + Shape(); - 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)); - } + void Read(TokenStreamReader &); - /// fill given buffers with this shape's elements with an - /// optional transform and offset - void Vertices( - EntityModel::Positions &vertex, - EntityModel::Normals &normal, - EntityModel::Indices &index + void Fill( + EntityMesh::Buffer &, + const std::vector &tex_map ) const; - void Vertices( - EntityModel::Positions &vertex, - EntityModel::Normals &normal, - EntityModel::Indices &index, + void Fill( + EntityMesh::Buffer &, const glm::mat4 &transform, - EntityModel::Index idx_offset = 0 + const std::vector &tex_map ) const; - void Vertices( - BlockModel::Positions &vertex, - BlockModel::Indices &index, + void Fill( + BlockMesh::Buffer &, const glm::mat4 &transform, - BlockModel::Index idx_offset = 0 + 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 with - /// an optional offset - void Outline( - OutlineModel::Positions &vertex, - OutlineModel::Indices &index, - const OutlineModel::Position &offset = { 0.0f, 0.0f, 0.0f }, - OutlineModel::Index idx_offset = 0 - ) 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( - 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 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) { - vtx_pos = pos; - vtx_nrm = nrm; - vtx_idx = idx; - } - void SetOutline(const OutlineModel::Positions &pos, const OutlineModel::Indices &idx) { - out_pos = pos; - out_idx = idx; - } - private: - EntityModel::Positions vtx_pos; - EntityModel::Normals vtx_nrm; - EntityModel::Indices vtx_idx; + 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; };