]> git.localhorst.tv Git - blank.git/blobdiff - src/model/Shape.hpp
(data) shape prototype
[blank.git] / src / model / Shape.hpp
index d2e06952ed2eae5410ae4657e6a5d6af7c5249de..21602707b593132e6f9871beedcc98b0d6d83fab 100644 (file)
@@ -3,98 +3,53 @@
 
 #include "../graphics/BlockMesh.hpp"
 #include "../graphics/EntityMesh.hpp"
-#include "../graphics/OutlineMesh.hpp"
 
+#include <memory>
+#include <vector>
 #include <glm/glm.hpp>
 
 
 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 EntityMesh::Normal &VertexNormal(size_t idx) const noexcept { return vtx_nrm[idx]; }
-       EntityMesh::Normal VertexNormal(
-               size_t idx, const glm::mat4 &transform
-       ) const noexcept {
-               return EntityMesh::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(
-               EntityMesh::Buffer &out,
-               float tex_offset = 0.0f
+       void Fill(
+               EntityMesh::Buffer &,
+               const std::vector<float> &tex_map
        ) const;
-       void Vertices(
-               EntityMesh::Buffer &out,
+       void Fill(
+               EntityMesh::Buffer &,
                const glm::mat4 &transform,
-               float tex_offset = 0.0f,
-               EntityMesh::Index idx_offset = 0
+               const std::vector<float> &tex_map
        ) const;
-       void Vertices(
-               BlockMesh::Buffer &out,
+       void Fill(
+               BlockMesh::Buffer &,
                const glm::mat4 &transform,
-               float tex_offset = 0.0f,
-               BlockMesh::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
-       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(
-               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 EntityMesh::Positions &pos,
-               const EntityMesh::Normals &nrm,
-               const EntityMesh::Indices &idx);
-       void SetTexture(
-               const BlockMesh::TexCoords &tex_coords);
-       void SetOutline(
-               const OutlineMesh::Positions &pos,
-               const OutlineMesh::Indices &idx);
-
 private:
-       EntityMesh::Positions vtx_pos;
-       EntityMesh::Normals vtx_nrm;
-       EntityMesh::Indices vtx_idx;
-
-       BlockMesh::TexCoords vtx_tex_coords;
+       static float TexR(const std::vector<float> &, std::size_t) noexcept;
 
-       OutlineMesh::Positions out_pos;
-       OutlineMesh::Indices out_idx;
+private:
+       std::unique_ptr<CollisionBounds> bounds;
+       struct Vertex {
+               glm::vec3 position;
+               glm::vec3 normal;
+               glm::vec3 tex_st;
+               std::size_t tex_id;
+       };
+       std::vector<Vertex> vertices;
+       std::vector<std::size_t> indices;
 
 };