4 #ifndef OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED 5 #define OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED 17 #include <tbb/blocked_range.h> 34 using Limits = std::numeric_limits<ValueType>;
37 constexpr
explicit Coord(
Int32 xyz): mVec{{xyz, xyz, xyz}} {}
39 explicit Coord(
const Vec3i& v): mVec{{v[0], v[1], v[2]}} {}
41 explicit Coord(
const Int32* v): mVec{{v[0], v[1], v[2]}} {}
94 return Coord(mVec[0] + dx, mVec[1] + dy, mVec[2] + dz);
114 return Coord(mVec[0] + rhs[0], mVec[1] + rhs[1], mVec[2] + rhs[2]);
118 return Coord(mVec[0] - rhs[0], mVec[1] - rhs[1], mVec[2] - rhs[2]);
126 Coord operator& (
Int32 n)
const {
return Coord(mVec[0] & n, mVec[1] & n, mVec[2] & n); }
127 Coord operator| (
Int32 n)
const {
return Coord(mVec[0] | n, mVec[1] | n, mVec[2] | n); }
128 Coord& operator&= (
Int32 n) { mVec[0]&=n; mVec[1]&=n; mVec[2]&=n;
return *
this; }
129 Coord& operator|= (
Int32 n) { mVec[0]|=n; mVec[1]|=n; mVec[2]|=n;
return *
this; }
152 return (mVec[0] == rhs.mVec[0] && mVec[1] == rhs.mVec[1] && mVec[2] == rhs.mVec[2]);
159 return this->x() < rhs.
x() ?
true : this->x() > rhs.
x() ?
false 160 : this->y() < rhs.
y() ?
true : this->y() > rhs.
y() ?
false 161 : this->z() < rhs.
z() ?
true :
false;
166 return this->x() < rhs.
x() ?
true : this->x() > rhs.
x() ?
false 167 : this->y() < rhs.
y() ?
true : this->y() > rhs.
y() ?
false 168 : this->z() <=rhs.
z() ?
true :
false;
178 mVec[0] =
std::min(mVec[0], other.mVec[0]);
179 mVec[1] =
std::min(mVec[1], other.mVec[1]);
180 mVec[2] =
std::min(mVec[2], other.mVec[2]);
186 mVec[0] =
std::max(mVec[0], other.mVec[0]);
187 mVec[1] =
std::max(mVec[1], other.mVec[1]);
188 mVec[2] =
std::max(mVec[2], other.mVec[2]);
211 return (a[0] < b[0] || a[1] < b[1] || a[2] < b[2]);
220 void read(std::istream& is) { is.read(reinterpret_cast<char*>(mVec.data()),
sizeof(mVec)); }
223 os.write(reinterpret_cast<const char*>(mVec.data()),
sizeof(mVec));
232 template<
int Log2N = 20>
235 const uint32_t* vec =
reinterpret_cast<const uint32_t*
>(mVec.data());
236 return ((1<<Log2N)-1) & (vec[0]*73856093 ^ vec[1]*19349669 ^ vec[2]*83492791);
240 std::array<Int32, 3> mVec;
260 template<
bool ZYXOrder>
271 operator bool()
const {
return ZYXOrder ? (mPos[0] <= mMax[0]) : (mPos[2] <= mMax[2]); }
277 return ((mPos == other.mPos) && (mMin == other.mMin) && (mMax == other.mMax));
282 template<
size_t a,
size_t b,
size_t c>
285 if (mPos[a] < mMax[a]) { ++mPos[a]; }
286 else if (mPos[b] < mMax[b]) { mPos[a] = mMin[a]; ++mPos[b]; }
287 else if (mPos[c] <= mMax[c]) { mPos[a] = mMin[a]; mPos[b] = mMin[b]; ++mPos[c]; }
289 Coord mPos, mMin, mMax;
303 : mMin(xMin, yMin, zMin), mMax(xMax, yMax, zMax)
311 const size_t n = this->maxExtent();
312 mMax[n] = (mMin[n] + mMax[n]) >> 1;
313 other.mMin[n] = mMax[n] + 1;
361 #if defined(__GNUC__) && !defined(__INTEL_COMPILER) 362 #pragma GCC diagnostic push 363 #pragma GCC diagnostic ignored "-Wstrict-overflow" 365 return (mMin[0] > mMax[0] || mMin[1] > mMax[1] || mMin[2] > mMax[2]);
366 #if defined(__GNUC__) && !defined(__INTEL_COMPILER) 367 #pragma GCC diagnostic pop 390 const Coord d = this->dim();
394 bool is_divisible()
const {
return mMin[0]<mMax[0] && mMin[1]<mMax[1] && mMin[2]<mMax[2]; }
397 size_t minExtent()
const {
return this->dim().minIndex(); }
400 size_t maxExtent()
const {
return this->dim().maxIndex(); }
405 return !(Coord::lessThan(xyz,mMin) || Coord::lessThan(mMax,xyz));
411 return !(Coord::lessThan(b.mMin,mMin) || Coord::lessThan(mMax,b.mMax));
417 return !(Coord::lessThan(mMax,b.mMin) || Coord::lessThan(b.mMax,mMin));
423 mMin.offset(-padding);
424 mMax.offset( padding);
430 return CoordBBox(mMin.offsetBy(-padding),mMax.offsetBy(padding));
436 mMin.minComponent(xyz);
437 mMax.maxComponent(xyz);
443 mMin.minComponent(bbox.
min());
444 mMax.maxComponent(bbox.
max());
449 mMin.maxComponent(bbox.
min());
450 mMax.minComponent(bbox.
max());
456 mMin.minComponent(min);
457 mMax.maxComponent(min.
offsetBy(dim-1));
476 p->
reset(mMin.x(), mMin.y(), mMin.z()); ++p;
477 p->
reset(mMin.x(), mMin.y(), mMax.z()); ++p;
478 p->
reset(mMin.x(), mMax.y(), mMin.z()); ++p;
479 p->
reset(mMin.x(), mMax.y(), mMax.z()); ++p;
480 p->
reset(mMax.x(), mMin.y(), mMin.z()); ++p;
481 p->
reset(mMax.x(), mMin.y(), mMax.z()); ++p;
482 p->
reset(mMax.x(), mMax.y(), mMin.z()); ++p;
483 p->
reset(mMax.x(), mMax.y(), mMax.z());
499 void read(std::istream& is) { mMin.read(is); mMax.read(is); }
501 void write(std::ostream& os)
const { mMin.write(os); mMax.write(os); }
513 os << xyz.
asVec3i();
return os;
552 template <
typename T>
563 template <
typename T>
578 os << b.
min() <<
" -> " << b.
max();
598 std::size_t
operator()(
const Coord& ijk)
const noexcept {
return ijk.Coord::hash<>(); }
603 #endif // OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED void expand(const Coord &xyz)
Expand this bounding box to enclose point (x, y, z).
Definition: Coord.h:434
Coord()
Definition: Coord.h:36
Int32 x() const
Definition: Coord.h:131
Coord(const Int32 *v)
Definition: Coord.h:41
int32_t Int32
Definition: Coord.h:28
void reset(const Coord &min, const Coord &max)
Definition: Coord.h:331
void read(std::istream &is)
Unserialize this bounding box from the given stream.
Definition: Coord.h:499
void write(std::ostream &os) const
Definition: Coord.h:221
void intersect(const CoordBBox &bbox)
Intersect this bounding box with the given bounding box.
Definition: Coord.h:447
Vec3i asVec3i() const
Definition: Coord.h:146
ZYXIterator begin() const
Return a ZYX-order iterator that points to the minimum coordinate.
Definition: Coord.h:342
Coord Abs(const Coord &xyz)
Definition: Coord.h:518
size_t hash() const
Return a hash value for this coordinate.
Definition: Coord.h:233
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
Vec3d asVec3d() const
Definition: Coord.h:144
CoordBBox & operator>>=(size_t n)
Bit-wise operations performed on both the min and max members.
Definition: Coord.h:491
ZYXIterator endZYX() const
Return a ZYX-order iterator that points past the maximum coordinate.
Definition: Coord.h:351
Coord & operator>>=(size_t n)
Definition: Coord.h:125
uint64_t Index64
Definition: Types.h:53
Index64 volume() const
Return the integer volume of coordinates spanned by this bounding box.
Definition: Coord.h:388
static Coord minComponent(const Coord &lhs, const Coord &rhs)
Return the component-wise minimum of the two Coords.
Definition: Coord.h:192
size_t minIndex() const
Return the index (0, 1 or 2) with the smallest value.
Definition: Coord.h:215
Coord & setZ(Int32 z)
Definition: Coord.h:82
bool operator!=(const Coord &rhs) const
Definition: Coord.h:154
Int32 z() const
Definition: Coord.h:133
Signed (x, y, z) 32-bit integer coordinates.
Definition: Coord.h:25
Coord & offset(Int32 dx, Int32 dy, Int32 dz)
Definition: Coord.h:84
static bool lessThan(const Coord &a, const Coord &b)
Definition: Coord.h:209
CoordBBox & operator<<=(size_t n)
Bit-wise operations performed on both the min and max members.
Definition: Coord.h:490
Int32 & z()
Definition: Coord.h:137
void expand(const Coord &min, Coord::ValueType dim)
Union this bounding box with the cubical bounding box of the given size and with the given minimum co...
Definition: Coord.h:454
const Coord & operator*() const
Return a const reference to the coordinate currently pointed to.
Definition: Coord.h:273
CoordBBox(CoordBBox &other, const tbb::split &)
Splitting constructor for use in TBB ranges.
Definition: Coord.h:308
Coord getEnd() const
Return the maximum coordinate plus one.
Definition: Coord.h:339
Int32 & x()
Definition: Coord.h:135
void asXYZ(Int32 &x, Int32 &y, Int32 &z) const
Definition: Coord.h:148
Coord & operator-=(const Coord &rhs)
Definition: Coord.h:105
Coord getStart() const
Return the minimum coordinate.
Definition: Coord.h:336
Coord argument_type
Definition: Coord.h:596
Int32 * asPointer()
Definition: Coord.h:143
void moveMax(const Coord &max)
Move this bounding box to the specified max.
Definition: Coord.h:467
bool empty() const
Return true if this bounding box is empty (i.e., encloses no coordinates).
Definition: Coord.h:359
Vec3< double > Vec3d
Definition: Vec3.h:665
constexpr Coord(Int32 xyz)
Definition: Coord.h:37
uint64_t Index64
Definition: Coord.h:254
static CoordBBox createCube(const Coord &min, ValueType dim)
Definition: Coord.h:316
const Coord & max() const
Definition: Coord.h:325
Vec3< typename promote< T, typename Coord::ValueType >::type > operator+(const Coord &v1, const Vec3< T > &v0)
Allow a Coord to be added to or subtracted from a Vec3.
Definition: Coord.h:539
static Coord round(const Vec3< T > &xyz)
Return xyz rounded to the closest integer coordinates (cell centered conversion). ...
Definition: Coord.h:51
static Coord maxComponent(const Coord &lhs, const Coord &rhs)
Return the component-wise maximum of the two Coords.
Definition: Coord.h:200
Axis-aligned bounding box of signed integer coordinates.
Definition: Coord.h:251
void resetToCube(const Coord &min, ValueType dim)
Definition: Coord.h:332
XYZIterator beginXYZ() const
Return an XYZ-order iterator that points to the minimum coordinate.
Definition: Coord.h:346
void split(ContainerT &out, const std::string &in, const char delim)
Definition: Name.h:43
Coord(const Vec3i &v)
Definition: Coord.h:39
Vec3< float > Vec3s
Definition: Vec3.h:664
Iterator & operator++()
Increment the iterator to point to the next coordinate.
Definition: Coord.h:269
void expand(const CoordBBox &bbox)
Union this bounding box with the given bounding box.
Definition: Coord.h:441
static Coord max()
Return the largest possible coordinate.
Definition: Coord.h:47
bool operator!=(const CoordBBox &rhs) const
Definition: Coord.h:356
bool operator>(const Coord &rhs) const
Lexicographic greater than.
Definition: Coord.h:171
void reset()
Definition: Coord.h:330
#define OPENVDB_ASSERT(X)
Definition: Assert.h:41
size_t maxIndex() const
Return the index (0, 1 or 2) with the largest value.
Definition: Coord.h:218
static Coord ceil(const Vec3< T > &xyz)
Return the largest integer coordinates that are not greater than xyz+1 (node centered conversion)...
Definition: Coord.h:64
std::size_t result_type
Definition: Coord.h:597
const Int32 * data() const
Definition: Coord.h:140
CoordBBox(ValueType xMin, ValueType yMin, ValueType zMin, ValueType xMax, ValueType yMax, ValueType zMax)
Construct from individual components of the min and max bounds.
Definition: Coord.h:301
Coord extents() const
Definition: Coord.h:385
Coord offsetBy(Int32 dx, Int32 dy, Int32 dz) const
Definition: Coord.h:92
std::ostream & operator<<(std::ostream &os, const CoordBBox &b)
Definition: Coord.h:576
Coord operator-(const Coord &rhs) const
Definition: Coord.h:116
int Floor(float x)
Return the floor of x.
Definition: Math.h:848
Coord & operator<<=(size_t n)
Definition: Coord.h:124
Iterator over the Coord domain covered by a CoordBBox.
Definition: Coord.h:261
OPENVDB_API std::istream & operator>>(std::istream &is, half &h)
Input h from is.
bool operator==(const CoordBBox &rhs) const
Definition: Coord.h:355
static Coord min()
Return the smallest possible coordinate.
Definition: Coord.h:44
bool empty(const char *str)
tests if a c-string str is empty, that is its first value is '\0'
Definition: Util.h:144
bool is_divisible() const
Return true if this bounding box can be subdivided [mainly for use by TBB].
Definition: Coord.h:394
Definition: Exceptions.h:13
CoordBBox(const Coord &min, const Coord &max)
Construct a bounding box with the given min and max bounds.
Definition: Coord.h:299
size_t MaxIndex(const Vec3T &v)
Return the index [0,1,2] of the largest value in a 3D vector.
Definition: Math.h:946
Int32 & y()
Definition: Coord.h:136
Coord::ValueType ValueType
Definition: Coord.h:255
Int32 * data()
Definition: Coord.h:141
Int32 ValueType
Definition: Coord.h:33
CoordBBox()
The default constructor produces an empty bounding box.
Definition: Coord.h:297
void getCornerPoints(Coord *p) const
Populates an array with the eight corner points of this bounding box.
Definition: Coord.h:473
ZYXIterator beginZYX() const
Return a ZYX-order iterator that points to the minimum coordinate.
Definition: Coord.h:344
size_t minExtent() const
Return the index (0, 1 or 2) of the shortest axis.
Definition: Coord.h:397
__hostdev__ uint32_t hash(uint32_t x)
Definition: common.h:14
Int32 operator[](size_t i) const
Definition: Coord.h:134
int Ceil(float x)
Return the ceiling of x.
Definition: Math.h:856
Int32 y() const
Definition: Coord.h:132
bool operator<=(const Coord &rhs) const
Lexicographic less than or equal to.
Definition: Coord.h:164
uint32_t Index32
Definition: Coord.h:29
Coord & offset(Int32 n)
Definition: Coord.h:91
void translate(const Coord &t)
Translate this bounding box by (tx, ty, tz).
Definition: Coord.h:461
bool hasVolume() const
Return true if this bounding box is nonempty (i.e., encloses at least one coordinate).
Definition: Coord.h:375
Iterator(const CoordBBox &b)
C-tor from a bounding box.
Definition: Coord.h:265
void write(std::ostream &os) const
Serialize this bounding box to the given stream.
Definition: Coord.h:501
bool operator>=(const Coord &rhs) const
Lexicographic greater than or equal to.
Definition: Coord.h:173
bool operator==(const Coord &rhs) const
Definition: Coord.h:150
uint32_t Index32
Definition: Types.h:52
static CoordBBox inf()
Return an "infinite" bounding box, as defined by the Coord value range.
Definition: Coord.h:322
Coord & reset(Int32 xyz)
Reset all three coordinates with the same specified argument.
Definition: Coord.h:78
static Coord floor(const Vec3< T > &xyz)
Return the largest integer coordinates that are not greater than xyz (node centered conversion)...
Definition: Coord.h:57
XYZIterator endXYZ() const
Return an XYZ-order iterator that points past the maximum coordinate.
Definition: Coord.h:353
Coord operator+(const Coord &rhs) const
Definition: Coord.h:112
openvdb::math::Coord Coord
Definition: Coord.h:595
math::Vec3< Index32 > Vec3I
Definition: Types.h:73
bool isInside(const Coord &xyz) const
Return true if point (x, y, z) is inside this bounding box.
Definition: Coord.h:403
Vec3s asVec3s() const
Definition: Coord.h:145
void maxComponent(const Coord &other)
Perform a component-wise maximum with the other Coord.
Definition: Coord.h:184
void expand(ValueType padding)
Pad this bounding box with the specified padding.
Definition: Coord.h:421
void read(std::istream &is)
Definition: Coord.h:220
bool operator<(const Coord &rhs) const
Lexicographic less than.
Definition: Coord.h:157
Vec3d getCenter() const
Return the floating-point position of the center of this bounding box.
Definition: Coord.h:378
Int32 & operator[](size_t i)
Definition: Coord.h:138
Coord & min()
Definition: Coord.h:327
const Int32 * asPointer() const
Definition: Coord.h:142
Coord & setY(Int32 y)
Definition: Coord.h:81
ZYXIterator end() const
Return a ZYX-order iterator that points past the maximum coordinate.
Definition: Coord.h:349
size_t maxExtent() const
Return the index (0, 1 or 2) of the longest axis.
Definition: Coord.h:400
std::numeric_limits< ValueType > Limits
Definition: Coord.h:34
bool operator!=(const Iterator &other) const
Return true if this iterator and the given iterator point to different coordinates.
Definition: Coord.h:280
float Round(float x)
Return x rounded to the nearest integer.
Definition: Math.h:819
Coord & setX(Int32 x)
Definition: Coord.h:80
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:121
Vec3< int32_t > Vec3i
Definition: Vec3.h:662
Coord dim() const
Return the dimensions of the coordinates spanned by this bounding box.
Definition: Coord.h:383
bool operator==(const Iterator &other) const
Return true if this iterator and the given iterator point to the same coordinate. ...
Definition: Coord.h:275
Coord offsetBy(Int32 n) const
Definition: Coord.h:96
CoordBBox expandBy(ValueType padding) const
Return a new instance that is expanded by the specified padding.
Definition: Coord.h:428
Vec3< typename promote< T, Coord::ValueType >::type > operator-(const Coord &v1, const Vec3< T > &v0)
Allow a Coord to be subtracted from a Vec3.
Definition: Coord.h:565
Coord & operator+=(const Coord &rhs)
Definition: Coord.h:98
Coord(const Vec3I &v)
Definition: Coord.h:40
Coord operator-() const
Definition: Coord.h:120
constexpr Coord(Int32 x, Int32 y, Int32 z)
Definition: Coord.h:38
void moveMin(const Coord &min)
Move this bounding box to the specified min.
Definition: Coord.h:464
std::size_t operator()(const Coord &ijk) const noexcept
Definition: Coord.h:598
void minComponent(const Coord &other)
Perform a component-wise minimum with the other Coord.
Definition: Coord.h:176
bool hasOverlap(const CoordBBox &b) const
Return true if the given bounding box overlaps with this bounding box.
Definition: Coord.h:415
Coord & reset(Int32 x, Int32 y, Int32 z)
Reset all three coordinates with the specified arguments.
Definition: Coord.h:70
bool isInside(const CoordBBox &b) const
Return true if the given bounding box is inside this bounding box.
Definition: Coord.h:409
const Coord & min() const
Definition: Coord.h:324
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:218
size_t MinIndex(const Vec3T &v)
Return the index [0,1,2] of the smallest value in a 3D vector.
Definition: Math.h:930
Vec3I asVec3I() const
Definition: Coord.h:147
Coord & max()
Definition: Coord.h:328