]> git.localhorst.tv Git - blank.git/blobdiff - src/shape.hpp
use indices for model rendering
[blank.git] / src / shape.hpp
index 66827d08b27c1c1ed5064be731b1f7dca54adc90..af19bb12e8ccfbf75fd6205f1e5fecf08e30b6fe 100644 (file)
@@ -2,6 +2,7 @@
 #define BLANK_SHAPE_HPP_
 
 #include "geometry.hpp"
+#include "model.hpp"
 
 #include <vector>
 #include <glm/glm.hpp>
@@ -11,14 +12,55 @@ namespace blank {
 
 struct Shape {
 
-       virtual size_t VertexCount() const = 0;
-       virtual void Vertices(std::vector<glm::vec3> &, const glm::vec3 &pos = { 0.0f, 0.0f, 0.0f }) const = 0;
-       virtual void Normals(std::vector<glm::vec3> &) const = 0;
+       /// the number of vertices (and normals) this shape has
+       size_t VertexCount() const { return vtx; }
+       /// the number of vertex indices this shape has
+       size_t VertexIndexCount() const { return vtx_idx; }
+
+       /// fill given buffers with this shape's elements with an
+       /// optional offset
+       virtual void Vertices(
+               std::vector<glm::vec3> &vertex,
+               std::vector<glm::vec3> &normal,
+               std::vector<Model::Index> &index,
+               const glm::vec3 &elem_offset = { 0.0f, 0.0f, 0.0f },
+               Model::Index idx_offset = 0
+       ) const = 0;
+
+       /// the number of vertices this shape's outline has
+       size_t OutlineCount() const { return outl; }
+       /// the number of vertex indices this shape's outline has
+       size_t OutlineIndexCount() const { return outl_idx; }
+
+       /// fill given buffers with this shape's outline's elements with
+       /// an optional offset
+       virtual void Outline(
+               std::vector<glm::vec3> &vertex,
+               std::vector<OutlineModel::Index> &index,
+               const glm::vec3 &offset = { 0.0f, 0.0f, 0.0f },
+               OutlineModel::Index idx_offset = 0
+       ) const = 0;
+
+       /// 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 = 0;
+
+protected:
+       Shape(size_t vtx, size_t vtx_idx, size_t outl, size_t outl_idx)
+       : vtx(vtx), vtx_idx(vtx_idx), outl(outl), outl_idx(outl_idx) { }
 
-       virtual size_t OutlineCount() const = 0;
-       virtual void Outline(std::vector<glm::vec3> &, const glm::vec3 &pos = { 0.0f, 0.0f, 0.0f }) const = 0;
-
-       virtual bool Intersects(const Ray &, const glm::mat4 &, float &dist, glm::vec3 &normal) const = 0;
+private:
+       size_t vtx;
+       size_t vtx_idx;
+       size_t outl;
+       size_t outl_idx;
 
 };
 
@@ -27,12 +69,22 @@ class NullShape
 : public Shape {
 
 public:
-       size_t VertexCount() const override;
-       void Vertices(std::vector<glm::vec3> &, const glm::vec3 &) const override;
-       void Normals(std::vector<glm::vec3> &) const override;
-
-       size_t OutlineCount() const override;
-       void Outline(std::vector<glm::vec3> &, const glm::vec3 &) const override;
+       NullShape();
+
+       void Vertices(
+               std::vector<glm::vec3> &vertex,
+               std::vector<glm::vec3> &normal,
+               std::vector<Model::Index> &index,
+               const glm::vec3 &elem_offset = { 0.0f, 0.0f, 0.0f },
+               Model::Index idx_offset = 0
+       ) const override;
+
+       void Outline(
+               std::vector<glm::vec3> &vertex,
+               std::vector<OutlineModel::Index> &index,
+               const glm::vec3 &offset = { 0.0f, 0.0f, 0.0f },
+               OutlineModel::Index idx_offset = 0
+       ) const override;
 
        bool Intersects(const Ray &, const glm::mat4 &, float &, glm::vec3 &) const override;
 
@@ -45,12 +97,20 @@ class CuboidShape
 public:
        CuboidShape(const AABB &bounds);
 
-       size_t VertexCount() const override;
-       void Vertices(std::vector<glm::vec3> &, const glm::vec3 &) const override;
-       void Normals(std::vector<glm::vec3> &) const override;
-
-       size_t OutlineCount() const override;
-       void Outline(std::vector<glm::vec3> &, const glm::vec3 &) const override;
+       void Vertices(
+               std::vector<glm::vec3> &vertex,
+               std::vector<glm::vec3> &normal,
+               std::vector<Model::Index> &index,
+               const glm::vec3 &elem_offset = { 0.0f, 0.0f, 0.0f },
+               Model::Index idx_offset = 0
+       ) const override;
+
+       void Outline(
+               std::vector<glm::vec3> &vertex,
+               std::vector<OutlineModel::Index> &index,
+               const glm::vec3 &offset = { 0.0f, 0.0f, 0.0f },
+               OutlineModel::Index idx_offset = 0
+       ) const override;
 
        bool Intersects(const Ray &, const glm::mat4 &, float &, glm::vec3 &) const override;
 
@@ -66,12 +126,20 @@ class StairShape
 public:
        StairShape(const AABB &bounds, const glm::vec2 &clip);
 
-       size_t VertexCount() const override;
-       void Vertices(std::vector<glm::vec3> &, const glm::vec3 &) const override;
-       void Normals(std::vector<glm::vec3> &) const override;
-
-       size_t OutlineCount() const override;
-       void Outline(std::vector<glm::vec3> &, const glm::vec3 &) const override;
+       void Vertices(
+               std::vector<glm::vec3> &vertex,
+               std::vector<glm::vec3> &normal,
+               std::vector<Model::Index> &index,
+               const glm::vec3 &elem_offset = { 0.0f, 0.0f, 0.0f },
+               Model::Index idx_offset = 0
+       ) const override;
+
+       void Outline(
+               std::vector<glm::vec3> &vertex,
+               std::vector<OutlineModel::Index> &index,
+               const glm::vec3 &offset = { 0.0f, 0.0f, 0.0f },
+               OutlineModel::Index idx_offset = 0
+       ) const override;
 
        bool Intersects(const Ray &, const glm::mat4 &, float &, glm::vec3 &) const override;