X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fshape.hpp;h=f31075b10fb48f8e2103bbad1349af97b9c10dfd;hb=e74f1ad236429f05db90c0ace825277e2a3fbc05;hp=434f427ec7b70473d86390288f1b2020e19a79e8;hpb=d6435142245c019523b9385048d6d79bdd2565f2;p=blank.git diff --git a/src/shape.hpp b/src/shape.hpp index 434f427..f31075b 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,30 +12,91 @@ 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_pos.size(); } + /// the number of vertex indices this shape has + size_t VertexIndexCount() const { return vtx_idx.size(); } + + /// fill given buffers with this shape's elements with an + /// optional offset + void Vertices( + Model::Positions &vertex, + Model::Normals &normal, + Model::Indices &index, + const Model::Position &elem_offset = { 0.0f, 0.0f, 0.0f }, + Model::Index idx_offset = 0 + ) const; + void Vertices( + Model::Positions &vertex, + Model::Normals &normal, + Model::Indices &index, + const glm::mat4 &transform, + Model::Index 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 = 0; + +protected: + void SetShape(const Model::Positions &pos, const Model::Normals &nrm, const Model::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; + } - virtual size_t OutlineCount() const = 0; - virtual void Outline(std::vector &, const glm::vec3 &pos = { 0.0f, 0.0f, 0.0f }) const = 0; +private: + Model::Positions vtx_pos; + Model::Normals vtx_nrm; + Model::Indices vtx_idx; - virtual bool Intersects(const Ray &, const glm::mat4 &, float &dist, glm::vec3 &normal) const = 0; + OutlineModel::Positions out_pos; + OutlineModel::Indices out_idx; }; -class CuboidShape +class NullShape : public Shape { public: - CuboidShape(const AABB &bounds); + NullShape(); + + bool Intersects(const Ray &, const glm::mat4 &, float &, glm::vec3 &) const override; + +}; - 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; +class CuboidShape +: public Shape { + +public: + CuboidShape(const AABB &bounds); bool Intersects(const Ray &, const glm::mat4 &, float &, glm::vec3 &) const override; @@ -50,13 +112,6 @@ 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; - bool Intersects(const Ray &, const glm::mat4 &, float &, glm::vec3 &) const override; private: