#ifndef BLANK_MODEL_SHAPE_HPP_
#define BLANK_MODEL_SHAPE_HPP_
-#include "BlockModel.hpp"
-#include "EntityModel.hpp"
-#include "OutlineModel.hpp"
-
+#include "CollisionBounds.hpp"
+#include "geometry.hpp"
+#include "../graphics/BlockMesh.hpp"
+#include "../graphics/EntityMesh.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];
+ }
+ };
+
+
+public:
+ Shape();
+
+ void Read(TokenStreamReader &);
-struct Shape {
+ 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::Buffer &out,
- float tex_offset = 0.0f
+ void Fill(
+ EntityMesh::Buffer &,
+ const std::vector<float> &tex_map
) const;
- void Vertices(
- EntityModel::Buffer &out,
+ void Fill(
+ EntityMesh::Buffer &,
const glm::mat4 &transform,
- float tex_offset = 0.0f,
- EntityModel::Index idx_offset = 0
+ const std::vector<float> &tex_map
) const;
- void Vertices(
- BlockModel::Buffer &out,
+ void Fill(
+ BlockMesh::Buffer &,
const glm::mat4 &transform,
- float tex_offset = 0.0f,
- 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::Buffer &out,
- 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(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(
+ 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);
- void SetTexture(
- const BlockModel::TexCoords &tex_coords);
- void SetOutline(
- const OutlineModel::Positions &pos,
- const OutlineModel::Indices &idx);
+ ) const noexcept;
private:
- EntityModel::Positions vtx_pos;
- EntityModel::Normals vtx_nrm;
- EntityModel::Indices vtx_idx;
-
- BlockModel::TexCoords vtx_tex_coords;
+ 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;
};