summaryrefslogtreecommitdiff
path: root/thirdparty/thekla_atlas/nvmath/Box.h
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/thekla_atlas/nvmath/Box.h')
-rw-r--r--thirdparty/thekla_atlas/nvmath/Box.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/thirdparty/thekla_atlas/nvmath/Box.h b/thirdparty/thekla_atlas/nvmath/Box.h
new file mode 100644
index 0000000000..19b5f2a3a5
--- /dev/null
+++ b/thirdparty/thekla_atlas/nvmath/Box.h
@@ -0,0 +1,103 @@
+// This code is in the public domain -- castanyo@yahoo.es
+
+#pragma once
+#ifndef NV_MATH_BOX_H
+#define NV_MATH_BOX_H
+
+#include "Vector.h"
+
+#include <float.h> // FLT_MAX
+
+namespace nv
+{
+ class Vector;
+ class Stream;
+ class Sphere;
+
+ // Axis Aligned Bounding Box.
+ class Box
+ {
+ public:
+
+ inline Box() {}
+ inline Box(const Box & b) : minCorner(b.minCorner), maxCorner(b.maxCorner) {}
+ inline Box(const Vector3 & mins, const Vector3 & maxs) : minCorner(mins), maxCorner(maxs) {}
+
+ Box & operator=(const Box & b);
+
+ operator const float * () const { return reinterpret_cast<const float *>(this); }
+
+ // Clear the bounds.
+ void clearBounds();
+
+ // min < max
+ bool isValid() const;
+
+ // Build a cube centered on center and with edge = 2*dist
+ void cube(const Vector3 & center, float dist);
+
+ // Build a box, given center and extents.
+ void setCenterExtents(const Vector3 & center, const Vector3 & extents);
+
+ // Get box center.
+ Vector3 center() const;
+
+ // Return extents of the box.
+ Vector3 extents() const;
+
+ // Return extents of the box.
+ float extents(uint axis) const;
+
+ // Add a point to this box.
+ void addPointToBounds(const Vector3 & p);
+
+ // Add a box to this box.
+ void addBoxToBounds(const Box & b);
+
+ // Add sphere to this box.
+ void addSphereToBounds(const Vector3 & p, float r);
+
+ // Translate box.
+ void translate(const Vector3 & v);
+
+ // Scale the box.
+ void scale(float s);
+
+ // Expand the box by a fixed amount.
+ void expand(float r);
+
+ // Get the area of the box.
+ float area() const;
+
+ // Get the volume of the box.
+ float volume() const;
+
+ // Return true if the box contains the given point.
+ bool contains(const Vector3 & p) const;
+
+ // Split the given box in 8 octants and assign the ith one to this box.
+ void setOctant(const Box & box, const Vector3 & center, int i);
+
+
+ // Clip the given segment against this box.
+ bool clipSegment(const Vector3 & origin, const Vector3 & dir, float * t_near, float * t_far) const;
+
+
+ friend Stream & operator<< (Stream & s, Box & box);
+
+ const Vector3 & corner(int i) const { return (&minCorner)[i]; }
+
+ Vector3 minCorner;
+ Vector3 maxCorner;
+ };
+
+ float distanceSquared(const Box &box, const Vector3 &point);
+ bool overlap(const Box &box, const Sphere &sphere);
+
+ // p is ray origin, id is inverse ray direction.
+ bool intersect(const Box & box, const Vector3 & p, const Vector3 & id, float * t);
+
+} // nv namespace
+
+
+#endif // NV_MATH_BOX_H