3#include <glm/geometric.hpp>
13 inline bool intersect(
17 const glm::vec3 & orig,
18 const glm::vec3 & dir,
19 glm::vec3 & intersection,
20 glm::vec3 & barycentric,
24 glm::vec3 edge1 = v1 - v0;
25 glm::vec3 edge2 = v2 - v0;
27 glm::vec3 pvec = glm::cross(dir, edge2);
30 float det = glm::dot(edge1, pvec);
32 if (std::fabs(det) < std::numeric_limits<float>::epsilon())
return false;
35 if (det > 0.0) front =
true;
40 float inv_det = 1.0f / det;
43 glm::vec3 tvec = orig - v0;
46 u = glm::dot(tvec, pvec) * inv_det;
48 if (u < 0.0f || u > 1.0f)
52 glm::vec3 qvec = glm::cross(tvec, edge1);
55 v = glm::dot(dir, qvec) * inv_det;
57 if (v < 0.0f || u + v > 1.0f)
64 float t = glm::dot(edge2, qvec) * inv_det;
66 glm::vec3 itmp = orig + t * dir;
71 barycentric[0] =
static_cast<float>(w);
72 barycentric[1] =
static_cast<float>(u);
73 barycentric[2] =
static_cast<float>(v);
78 static double distanceToQuad(
79 const double xmin,
const double ymin,
80 const double xmax,
const double ymax,
81 const double x,
const double y,
82 double & cx,
double & cy)
88 return (x - xmin)*(x - xmin) + (y - ymin)*(y - ymin);
89 }
else if (y > ymax) {
92 return (x - xmin)*(x - xmin) + (y - ymax)*(y - ymax);
96 return (x - xmin)*(x - xmin);
98 }
else if (x > xmax) {
102 return (x - xmax)*(x - xmax) + (y - ymin) * (y - ymin);
103 }
else if (y > ymax) {
106 return (x - xmax)*(x - xmax) + (y - ymax)*(y - ymax);
110 return (x - xmax)*(x - xmax);
116 return (y - ymin)*(y - ymin);
117 }
else if (y > ymax) {
120 return (y - ymax)*(y - ymax);
@ Geometry
Store entity vector fields (vector<vec3>, vector<vec2>, vector<int>, vector<float>).
Contains all Cogs related functionality.