Move geometry structs to own file

Also, the Ray got an unimplemented `intersects_triangle` method, so the kdtree intersection function should be complete.
This commit is contained in:
karl 2020-12-28 16:34:51 +01:00
parent 44f0699ab6
commit 97f8265014
2 changed files with 62 additions and 57 deletions

57
geometry.h Normal file
View File

@ -0,0 +1,57 @@
// Forward declarations
struct Point;
struct Node {
Node(int axis, Point *point, Node *left, Node *right)
: axis(axis), point(point), left(left), right(right) {}
int axis;
Point *point;
Node *left;
Node *right;
};
struct Triangle {
Triangle(Point *p1, Point *p2, Point *p3) : p1(p1), p2(p2), p3(p3) {}
Point *p1;
Point *p2;
Point *p3;
};
struct Point {
Point(float coordinates[3], Triangle *triangle)
: coordinates(coordinates), triangle(triangle) {}
Point operator+(const Point &other) const {
return Point(new float[3]{coordinates[0] + other.coordinates[0],
coordinates[1] + other.coordinates[1],
coordinates[2] + other.coordinates[2]},
nullptr);
}
Point operator*(float scalar) const {
return Point(
new float[3]{coordinates[0] * scalar, coordinates[1] * scalar, coordinates[2] * scalar},
nullptr);
}
float *coordinates;
Triangle *triangle;
};
struct Ray {
Ray(float origin[3], float direction[3]) : origin(origin), direction(direction) {}
float *origin;
float *direction;
bool intersects_triangle(Triangle *triangle) {
// TODO
return false;
}
};

View File

@ -1,64 +1,10 @@
#include "geometry.h"
#include <algorithm> #include <algorithm>
#include <glm/glm.hpp> #include <glm/glm.hpp>
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <vector> #include <vector>
// Forward declarations
struct Node;
struct Point;
struct Triangle;
struct Node {
Node(int axis, Point *point, Node *left, Node *right)
: axis(axis), point(point), left(left), right(right) {}
int axis;
Point *point;
Node *left;
Node *right;
};
struct Triangle {
Triangle(Point *p1, Point *p2, Point *p3) : p1(p1), p2(p2), p3(p3) {}
Point *p1;
Point *p2;
Point *p3;
};
struct Point {
Point(float coordinates[3], Triangle *triangle)
: coordinates(coordinates), triangle(triangle) {}
Point operator+(const Point &other) const {
return Point(new float[3]{coordinates[0] + other.coordinates[0],
coordinates[1] + other.coordinates[1],
coordinates[2] + other.coordinates[2]},
nullptr);
}
Point operator*(float scalar) const {
return Point(
new float[3]{coordinates[0] * scalar, coordinates[1] * scalar, coordinates[2] * scalar},
nullptr);
}
float *coordinates;
Triangle *triangle;
};
struct Ray {
Ray(float origin[3], float direction[3]) : origin(origin), direction(direction) {}
float *origin;
float *direction;
};
class KDTree { class KDTree {
public: public:
KDTree(std::vector<Point *> points) { root = build(points, 0); } KDTree(std::vector<Point *> points) { root = build(points, 0); }
@ -160,8 +106,10 @@ class KDTree {
if (near_result != nullptr) { return near_result; } if (near_result != nullptr) { return near_result; }
// No collision in the nearer side, so check for a collision directly here // No collision in the nearer side, so check for a collision directly here
Point *collision_here = nullptr; if (ray.intersects_triangle(node->point->triangle)) {
// TODO: Ray-triangle-intersection here // We do have a collision here, so we're done and can return this point!
return node->point;
}
// No collision here either. Does it make sense to also check the far node? // No collision here either. Does it make sense to also check the far node?
// Only if the axes are not parallel and if that area is not behind us // Only if the axes are not parallel and if that area is not behind us