X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fshape.hpp;h=af19bb12e8ccfbf75fd6205f1e5fecf08e30b6fe;hb=82426ae2997d2b21703d2d5afb631a84736e975f;hp=66827d08b27c1c1ed5064be731b1f7dca54adc90;hpb=7caa2326d25d4fc5ba98318dfccb508bb3e16820;p=blank.git diff --git a/src/shape.hpp b/src/shape.hpp index 66827d0..af19bb1 100644 --- a/src/shape.hpp +++ b/src/shape.hpp @@ -2,6 +2,7 @@ #define BLANK_SHAPE_HPP_ #include "geometry.hpp" +#include "model.hpp" #include #include @@ -11,14 +12,55 @@ namespace blank { struct Shape { - virtual size_t VertexCount() const = 0; - virtual void Vertices(std::vector &, const glm::vec3 &pos = { 0.0f, 0.0f, 0.0f }) const = 0; - virtual void Normals(std::vector &) 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 &vertex, + std::vector &normal, + std::vector &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 &vertex, + std::vector &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 &, 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 &, const glm::vec3 &) const override; - void Normals(std::vector &) const override; - - size_t OutlineCount() const override; - void Outline(std::vector &, const glm::vec3 &) const override; + NullShape(); + + void Vertices( + std::vector &vertex, + std::vector &normal, + std::vector &index, + const glm::vec3 &elem_offset = { 0.0f, 0.0f, 0.0f }, + Model::Index idx_offset = 0 + ) const override; + + void Outline( + std::vector &vertex, + std::vector &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 &, const glm::vec3 &) const override; - void Normals(std::vector &) const override; - - size_t OutlineCount() const override; - void Outline(std::vector &, const glm::vec3 &) const override; + void Vertices( + std::vector &vertex, + std::vector &normal, + std::vector &index, + const glm::vec3 &elem_offset = { 0.0f, 0.0f, 0.0f }, + Model::Index idx_offset = 0 + ) const override; + + void Outline( + std::vector &vertex, + std::vector &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 &, const glm::vec3 &) const override; - void Normals(std::vector &) const override; - - size_t OutlineCount() const override; - void Outline(std::vector &, const glm::vec3 &) const override; + void Vertices( + std::vector &vertex, + std::vector &normal, + std::vector &index, + const glm::vec3 &elem_offset = { 0.0f, 0.0f, 0.0f }, + Model::Index idx_offset = 0 + ) const override; + + void Outline( + std::vector &vertex, + std::vector &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;