6 changed files with 90 additions and 12 deletions
@ -1,4 +0,0 @@ |
|||||
#ifndef MATHDEF_H_ |
|
||||
#define MATHDEF_H_ |
|
||||
|
|
||||
#endif |
|
@ -0,0 +1,68 @@ |
|||||
|
#include "bvh.cpp" |
||||
|
#include <iostream> |
||||
|
#include <algorithm> |
||||
|
|
||||
|
bool CurveCurveBVHIntersect(BVH_AABB_NodePtr &BoxPtr1, BVH_AABB_NodePtr &BoxPtr2, std::vector<std::pair<BVH_AABB_NodePtr, BVH_AABB_NodePtr>> &IstNodePtr) |
||||
|
{ |
||||
|
AABB box1 = BoxPtr1->bound; |
||||
|
AABB box2 = BoxPtr2->bound; |
||||
|
|
||||
|
auto LineIntersect = [](double x1, double x2, double x1_, double x2_) |
||||
|
{ |
||||
|
bool LIntersect = false; |
||||
|
if ((x2 <= x2_ && x2 >= x1_) || (x1_ <= x2 && x1_ >= x1)) |
||||
|
LIntersect = true; |
||||
|
return LIntersect; |
||||
|
}; |
||||
|
auto BoxIntersect = [&]() |
||||
|
{ |
||||
|
double x1 = box1.Bmin.x, x1_ = box2.Bmin.x; |
||||
|
double x2 = box1.Bmax.x, x2_ = box2.Bmax.x; |
||||
|
double y1 = box1.Bmin.y, y1_ = box2.Bmin.y; |
||||
|
double y2 = box1.Bmax.y, y2_ = box2.Bmax.y; |
||||
|
double z1 = box1.Bmin.z, z1_ = box2.Bmin.z; |
||||
|
double z2 = box1.Bmax.z, z2_ = box2.Bmax.z; |
||||
|
if (LineIntersect(x1, x2, x1_, x2_) && LineIntersect(y1, y2, y1_, y2_) && LineIntersect(z1, z2, z1_, z2_)) |
||||
|
return true; |
||||
|
else |
||||
|
false; |
||||
|
}; |
||||
|
|
||||
|
int biggerbox = 1; |
||||
|
if (glm::distance(box1.Bmax, box1.Bmin) < glm::distance(box2.Bmax, box2.Bmin)) |
||||
|
biggerbox = 2; |
||||
|
|
||||
|
if (BoxIntersect()) |
||||
|
{ |
||||
|
if (biggerbox == 1) |
||||
|
{ |
||||
|
if (BoxPtr1->childPtr.size() == 0) |
||||
|
{ |
||||
|
std::pair<BVH_AABB_NodePtr, BVH_AABB_NodePtr> pi = std::make_pair(BoxPtr1, BoxPtr2); |
||||
|
IstNodePtr.push_back(pi); |
||||
|
return true; |
||||
|
} |
||||
|
for (auto it : BoxPtr1->childPtr) |
||||
|
{ |
||||
|
CurveCurveBVHIntersect(it, BoxPtr2, IstNodePtr) |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
if (BoxPtr2->childPtr.size() == 0) |
||||
|
{ |
||||
|
std::pair<BVH_AABB_NodePtr, BVH_AABB_NodePtr> pi = std::make_pair(BoxPtr2, BoxPtr1); |
||||
|
IstNodePtr.push_back(pi); |
||||
|
return true; |
||||
|
} |
||||
|
for (auto it : BoxPtr2->childPtr) |
||||
|
{ |
||||
|
CurveCurveBVHIntersect(BoxPtr1, it, IstNodePtr); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
return false; |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue