summaryrefslogtreecommitdiff
path: root/engine-ocean/Game/Components/CollisionComponents/boundingtriangle.h
diff options
context:
space:
mode:
Diffstat (limited to 'engine-ocean/Game/Components/CollisionComponents/boundingtriangle.h')
-rw-r--r--engine-ocean/Game/Components/CollisionComponents/boundingtriangle.h68
1 files changed, 68 insertions, 0 deletions
diff --git a/engine-ocean/Game/Components/CollisionComponents/boundingtriangle.h b/engine-ocean/Game/Components/CollisionComponents/boundingtriangle.h
new file mode 100644
index 0000000..0263007
--- /dev/null
+++ b/engine-ocean/Game/Components/CollisionComponents/boundingtriangle.h
@@ -0,0 +1,68 @@
+#ifndef BOUNDINGTRIANGLE_H
+#define BOUNDINGTRIANGLE_H
+#include "Graphics/modeltransform.h"
+#include "glm/glm.hpp"
+#include <set>
+#include <vector>
+#include "BoundingShape.h"
+
+struct Bounds3f {
+ glm::vec3 min;
+ glm::vec3 max;
+};
+
+struct Triangle{
+ glm::vec3 vertexA; // one vertex
+ glm::vec3 vertexB;
+ glm::vec3 vertexC;
+
+ glm::vec3 edge1; // two edges
+ glm::vec3 edge2;
+
+ glm::vec3 normal;// = glm::cross(edge1, edge2);
+ Bounds3f bounds;
+
+
+};
+
+class BoundingTriangle : public BoundingShape
+{
+public:
+ BoundingTriangle(const std::vector<glm::vec3> &obj_data,
+ const std::shared_ptr<ModelTransform> &mt,
+ bool isGround = false);
+ std::vector<Triangle> getTriangleData();
+
+ Bounds3f getMeshBounds();
+ std::vector<glm::vec3> getSurfacePoints();
+ glm::vec3 getRandomSurfacePos();
+
+
+
+private:
+ void addTriangle(const glm::vec3 &vertexA, const glm::vec3 &vertexB, const glm::vec3 &vertexC);
+ void populateTriangleData(const std::vector<glm::vec3> &obj_data);
+ void calculateBounds(const std::vector<glm::vec3> &obj_data);
+ Bounds3f calculateTriangleBounds(const glm::vec3 &vertexA, const glm::vec3 &vertexB, const glm::vec3 &vertexC);
+
+ float getArea(const glm::vec3 &A, const glm::vec3 &B, const glm::vec3 &C);
+ glm::vec3 getCentroid(const glm::vec3 &A, const glm::vec3 &B, const glm::vec3 &C);
+ void tesselateTriangle(const glm::vec3 &A, const glm::vec3 &B, const glm::vec3 &C);
+
+
+ int m_datasize = 0;
+
+
+
+
+
+ std::vector<Triangle> m_triangles;
+ std::shared_ptr<ModelTransform> obj_mt;
+ std::set<glm::vec3> m_unique_surface_points;
+ std::vector<glm::vec3> m_surface_points;
+ bool m_isGround = false;
+
+ float min_x, min_y, min_z, max_x, max_y, max_z;
+};
+
+#endif // BOUNDINGTRIANGLE_H