X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fshape.cpp;fp=src%2Fshape.cpp;h=e974d068c0d494cf3c051b980a63e3b31837c826;hb=b79bc060068daf80c707f7ca08cb40a716367784;hp=0000000000000000000000000000000000000000;hpb=d5a078a95bb406936e472ba6b22257a442a7b2d4;p=blank.git diff --git a/src/shape.cpp b/src/shape.cpp new file mode 100644 index 0000000..e974d06 --- /dev/null +++ b/src/shape.cpp @@ -0,0 +1,104 @@ +#include "shape.hpp" + + +namespace blank { + +CuboidShape::CuboidShape(const AABB &b) +: Shape() +, bb(b) { + bb.Adjust(); +} + + +size_t CuboidShape::VertexCount() const { + return 36; +} + +void CuboidShape::Vertices(std::vector &out, const glm::vec3 &pos) const { + out.reserve(36); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.min.y, pos.z + bb.max.z); // front + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.max.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.min.y, pos.z + bb.min.z); // back + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.min.z); // top + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.max.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.min.y, pos.z + bb.min.z); // bottom + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.min.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.min.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.min.y, pos.z + bb.min.z); // left + out.emplace_back(pos.x + bb.min.x, pos.y + bb.min.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.min.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.min.z); // right + out.emplace_back(pos.x + bb.max.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.max.y, pos.z + bb.max.z); +} + +void CuboidShape::Normals(std::vector &out) const { + out.reserve(36); + out.insert(out.end(), 6, glm::vec3( 0.0f, 0.0f, 1.0f)); // front + out.insert(out.end(), 6, glm::vec3( 0.0f, 0.0f, -1.0f)); // back + out.insert(out.end(), 6, glm::vec3( 0.0f, 1.0f, 0.0f)); // top + out.insert(out.end(), 6, glm::vec3( 0.0f, -1.0f, 0.0f)); // bottom + out.insert(out.end(), 6, glm::vec3(-1.0f, 0.0f, 0.0f)); // left + out.insert(out.end(), 6, glm::vec3( 1.0f, 0.0f, 0.0f)); // right +} + + +size_t CuboidShape::OutlineCount() const { + return 24; +} + +void CuboidShape::Outline(std::vector &out, const glm::vec3 &pos) const { + out.reserve(24); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.min.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.min.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.min.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.min.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.max.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.min.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.min.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.min.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.max.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.max.x, pos.y + bb.max.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.max.y, pos.z + bb.max.z); + out.emplace_back(pos.x + bb.min.x, pos.y + bb.min.y, pos.z + bb.max.z); +} + +bool CuboidShape::Intersects(const Ray &ray, const glm::mat4 &M, float &dist, glm::vec3 &normal) const { + return Intersection(ray, bb, M, &dist, &normal); +} + +}