#define BLANK_MODEL_SHAPE_HPP_
#include "BlockModel.hpp"
-#include "Model.hpp"
+#include "EntityModel.hpp"
#include "OutlineModel.hpp"
-#include <vector>
#include <glm/glm.hpp>
namespace blank {
+class AABB;
class Ray;
struct Shape {
/// the number of vertex indices this shape has
size_t VertexIndexCount() const noexcept { return vtx_idx.size(); }
- const Model::Normal &VertexNormal(size_t idx) const noexcept { return vtx_nrm[idx]; }
- Model::Normal VertexNormal(
+ 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 Model::Normal(transform * glm::vec4(vtx_nrm[idx], 0.0f));
+ return EntityModel::Normal(transform * glm::vec4(vtx_nrm[idx], 0.0f));
}
/// fill given buffers with this shape's elements with an
/// optional transform and offset
void Vertices(
- Model::Positions &vertex,
- Model::Normals &normal,
- Model::Indices &index
+ EntityModel::Buffer &out,
+ float tex_offset = 0.0f
) const;
void Vertices(
- Model::Positions &vertex,
- Model::Normals &normal,
- Model::Indices &index,
+ EntityModel::Buffer &out,
const glm::mat4 &transform,
- Model::Index idx_offset = 0
+ float tex_offset = 0.0f,
+ EntityModel::Index idx_offset = 0
) const;
void Vertices(
- BlockModel::Positions &vertex,
- BlockModel::Indices &index,
+ BlockModel::Buffer &out,
const glm::mat4 &transform,
+ float tex_offset = 0.0f,
BlockModel::Index idx_offset = 0
) const;
/// 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;
+ /// fill given buffers with this shape's outline's elements
+ void Outline(OutlineModel::Buffer &out) const;
/// Check if given ray would pass though this shape if it were
/// transformed with given matrix.
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 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;
- }
+ 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);
private:
- Model::Positions vtx_pos;
- Model::Normals vtx_nrm;
- Model::Indices vtx_idx;
+ EntityModel::Positions vtx_pos;
+ EntityModel::Normals vtx_nrm;
+ EntityModel::Indices vtx_idx;
+
+ BlockModel::TexCoords vtx_tex_coords;
OutlineModel::Positions out_pos;
OutlineModel::Indices out_idx;