]> git.localhorst.tv Git - blank.git/blobdiff - src/model/Shape.hpp
glm backwards compatibility
[blank.git] / src / model / Shape.hpp
index c6964f9c410110d10e4ed48933b07bce0512eb42..80dc4a33ba6d28803f9de4b603e1cf83b2b00b9f 100644 (file)
 #ifndef BLANK_MODEL_SHAPE_HPP_
 #define BLANK_MODEL_SHAPE_HPP_
 
-#include "BlockModel.hpp"
-#include "EntityModel.hpp"
-#include "OutlineModel.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 <memory>
 #include <vector>
-#include <glm/glm.hpp>
 
 
 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();
+
+       void Read(TokenStreamReader &);
+
+       bool FaceFilled(Block::Face face) const noexcept {
+               return fill[face];
+       }
 
-       /// 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(); }
+       std::size_t VertexCount() const noexcept { return vertices.size(); }
+       std::size_t IndexCount() const noexcept { return indices.size(); }
 
-       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));
+       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));
        }
 
-       /// 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<float> &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<float> &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<float> &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;
+       size_t OutlineCount() const noexcept;
+       size_t OutlineIndexCount() const noexcept;
+       void Outline(PrimitiveMesh::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) {
-               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;
-       }
+       ) const noexcept;
 
 private:
-       EntityModel::Positions vtx_pos;
-       EntityModel::Normals vtx_nrm;
-       EntityModel::Indices vtx_idx;
+       static float TexR(const std::vector<float> &, std::size_t) noexcept;
 
-       OutlineModel::Positions out_pos;
-       OutlineModel::Indices out_idx;
+private:
+       std::unique_ptr<CollisionBounds> bounds;
+       struct Vertex {
+               glm::vec3 position;
+               glm::vec3 normal;
+               glm::vec2 tex_st;
+               std::size_t tex_id;
+       };
+       std::vector<Vertex> vertices;
+       std::vector<std::size_t> indices;
+       Faces fill;
 
 };