4 #ifndef OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED 5 #define OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED 16 #include <tbb/blocked_range.h> 33 using Limits = std::numeric_limits<ValueType>;
36 constexpr
explicit Coord(
Int32 xyz): mVec{{xyz, xyz, xyz}} {}
38 explicit Coord(
const Vec3i& v): mVec{{v[0], v[1], v[2]}} {}
40 explicit Coord(
const Int32* v): mVec{{v[0], v[1], v[2]}} {}
93 return Coord(mVec[0] + dx, mVec[1] + dy, mVec[2] + dz);
113 return Coord(mVec[0] + rhs[0], mVec[1] + rhs[1], mVec[2] + rhs[2]);
117 return Coord(mVec[0] - rhs[0], mVec[1] - rhs[1], mVec[2] - rhs[2]);
125 Coord operator& (
Int32 n)
const {
return Coord(mVec[0] & n, mVec[1] & n, mVec[2] & n); }
126 Coord operator| (
Int32 n)
const {
return Coord(mVec[0] | n, mVec[1] | n, mVec[2] | n); }
127 Coord& operator&= (
Int32 n) { mVec[0]&=n; mVec[1]&=n; mVec[2]&=n;
return *
this; }
128 Coord& operator|= (
Int32 n) { mVec[0]|=n; mVec[1]|=n; mVec[2]|=n;
return *
this; }
151 return (mVec[0] == rhs.mVec[0] && mVec[1] == rhs.mVec[1] && mVec[2] == rhs.mVec[2]);
158 return this->x() < rhs.
x() ?
true : this->x() > rhs.
x() ?
false 159 : this->y() < rhs.
y() ?
true : this->y() > rhs.
y() ?
false 160 : this->z() < rhs.
z() ?
true :
false;
165 return this->x() < rhs.
x() ?
true : this->x() > rhs.
x() ?
false 166 : this->y() < rhs.
y() ?
true : this->y() > rhs.
y() ?
false 167 : this->z() <=rhs.
z() ?
true :
false;
177 mVec[0] =
std::min(mVec[0], other.mVec[0]);
178 mVec[1] =
std::min(mVec[1], other.mVec[1]);
179 mVec[2] =
std::min(mVec[2], other.mVec[2]);
185 mVec[0] =
std::max(mVec[0], other.mVec[0]);
186 mVec[1] =
std::max(mVec[1], other.mVec[1]);
187 mVec[2] =
std::max(mVec[2], other.mVec[2]);
210 return (a[0] < b[0] || a[1] < b[1] || a[2] < b[2]);
219 void read(std::istream& is) { is.read(reinterpret_cast<char*>(mVec.data()),
sizeof(mVec)); }
222 os.write(reinterpret_cast<const char*>(mVec.data()),
sizeof(mVec));
231 template<
int Log2N = 20>
234 const uint32_t* vec =
reinterpret_cast<const uint32_t*
>(mVec.data());
235 return ((1<<Log2N)-1) & (vec[0]*73856093 ^ vec[1]*19349669 ^ vec[2]*83492791);
239 std::array<Int32, 3> mVec;
259 template<
bool ZYXOrder>
270 operator bool()
const {
return ZYXOrder ? (mPos[0] <= mMax[0]) : (mPos[2] <= mMax[2]); }
276 return ((mPos == other.mPos) && (mMin == other.mMin) && (mMax == other.mMax));
281 template<
size_t a,
size_t b,
size_t c>
284 if (mPos[a] < mMax[a]) { ++mPos[a]; }
285 else if (mPos[b] < mMax[b]) { mPos[a] = mMin[a]; ++mPos[b]; }
286 else if (mPos[c] <= mMax[c]) { mPos[a] = mMin[a]; mPos[b] = mMin[b]; ++mPos[c]; }
288 Coord mPos, mMin, mMax;
302 : mMin(xMin, yMin, zMin), mMax(xMax, yMax, zMax)
309 assert(this->is_divisible());
310 const size_t n = this->maxExtent();
311 mMax[n] = (mMin[n] + mMax[n]) >> 1;
312 other.mMin[n] = mMax[n] + 1;
360 #if defined(__GNUC__) && !defined(__INTEL_COMPILER) 361 #pragma GCC diagnostic push 362 #pragma GCC diagnostic ignored "-Wstrict-overflow" 364 return (mMin[0] > mMax[0] || mMin[1] > mMax[1] || mMin[2] > mMax[2]);
365 #if defined(__GNUC__) && !defined(__INTEL_COMPILER) 366 #pragma GCC diagnostic pop 371 operator bool()
const {
return !this->empty(); }
382 Coord dim()
const {
return empty() ?
Coord(0) : (mMax.offsetBy(1) - mMin); }
389 const Coord d = this->dim();
393 bool is_divisible()
const {
return mMin[0]<mMax[0] && mMin[1]<mMax[1] && mMin[2]<mMax[2]; }
396 size_t minExtent()
const {
return this->dim().minIndex(); }
399 size_t maxExtent()
const {
return this->dim().maxIndex(); }
404 return !(Coord::lessThan(xyz,mMin) || Coord::lessThan(mMax,xyz));
410 return !(Coord::lessThan(b.mMin,mMin) || Coord::lessThan(mMax,b.mMax));
416 return !(Coord::lessThan(mMax,b.mMin) || Coord::lessThan(b.mMax,mMin));
422 mMin.offset(-padding);
423 mMax.offset( padding);
429 return CoordBBox(mMin.offsetBy(-padding),mMax.offsetBy(padding));
435 mMin.minComponent(xyz);
436 mMax.maxComponent(xyz);
442 mMin.minComponent(bbox.
min());
443 mMax.maxComponent(bbox.
max());
448 mMin.maxComponent(bbox.
min());
449 mMax.minComponent(bbox.
max());
455 mMin.minComponent(min);
456 mMax.maxComponent(min.
offsetBy(dim-1));
474 assert(p !=
nullptr);
475 p->
reset(mMin.x(), mMin.y(), mMin.z()); ++p;
476 p->
reset(mMin.x(), mMin.y(), mMax.z()); ++p;
477 p->
reset(mMin.x(), mMax.y(), mMin.z()); ++p;
478 p->
reset(mMin.x(), mMax.y(), mMax.z()); ++p;
479 p->
reset(mMax.x(), mMin.y(), mMin.z()); ++p;
480 p->
reset(mMax.x(), mMin.y(), mMax.z()); ++p;
481 p->
reset(mMax.x(), mMax.y(), mMin.z()); ++p;
482 p->
reset(mMax.x(), mMax.y(), mMax.z());
498 void read(std::istream& is) { mMin.read(is); mMax.read(is); }
500 void write(std::ostream& os)
const { mMin.write(os); mMax.write(os); }
512 os << xyz.
asVec3i();
return os;
551 template <
typename T>
562 template <
typename T>
577 os << b.
min() <<
" -> " << b.
max();
597 std::size_t
operator()(
const Coord& ijk)
const noexcept {
return ijk.Coord::hash<>(); }
602 #endif // OPENVDB_MATH_COORD_HAS_BEEN_INCLUDED size_t maxIndex() const
Return the index (0, 1 or 2) with the largest value.
Definition: Coord.h:217
bool operator!=(const Iterator &other) const
Return true if this iterator and the given iterator point to different coordinates.
Definition: Coord.h:279
Coord::ValueType ValueType
Definition: Coord.h:254
size_t hash() const
Return a hash value for this coordinate.
Definition: Coord.h:232
CoordBBox()
The default constructor produces an empty bounding box.
Definition: Coord.h:296
const Int32 * data() const
Definition: Coord.h:139
math::Vec3< Index32 > Vec3I
Definition: Types.h:73
void getCornerPoints(Coord *p) const
Populates an array with the eight corner points of this bounding box.
Definition: Coord.h:472
Vec3s asVec3s() const
Definition: Coord.h:144
void reset()
Definition: Coord.h:329
bool operator>=(const Coord &rhs) const
Lexicographic greater than or equal to.
Definition: Coord.h:172
static Coord max()
Return the largest possible coordinate.
Definition: Coord.h:46
void maxComponent(const Coord &other)
Perform a component-wise maximum with the other Coord.
Definition: Coord.h:183
Int32 z() const
Definition: Coord.h:132
Int32 ValueType
Definition: Coord.h:32
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:300
Coord extents() const
Definition: Coord.h:384
bool operator!=(const Coord &rhs) const
Definition: Coord.h:153
void translate(const Coord &t)
Translate this bounding box by (tx, ty, tz).
Definition: Coord.h:460
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
bool hasVolume() const
Return true if this bounding box is nonempty (i.e., encloses at least one coordinate).
Definition: Coord.h:374
Int32 x() const
Definition: Coord.h:130
void write(std::ostream &os) const
Serialize this bounding box to the given stream.
Definition: Coord.h:500
Int32 y() const
Definition: Coord.h:131
Coord & offset(Int32 n)
Definition: Coord.h:90
Axis-aligned bounding box of signed integer coordinates.
Definition: Coord.h:250
int Floor(float x)
Return the floor of x.
Definition: Math.h:848
Int32 & operator[](size_t i)
Definition: Coord.h:137
Signed (x, y, z) 32-bit integer coordinates.
Definition: Coord.h:24
Vec3d asVec3d() const
Definition: Coord.h:143
Iterator(const CoordBBox &b)
C-tor from a bounding box.
Definition: Coord.h:264
ZYXIterator beginZYX() const
Return a ZYX-order iterator that points to the minimum coordinate.
Definition: Coord.h:343
Coord operator+(const Coord &rhs) const
Definition: Coord.h:111
void expand(ValueType padding)
Pad this bounding box with the specified padding.
Definition: Coord.h:420
size_t minExtent() const
Return the index (0, 1 or 2) of the shortest axis.
Definition: Coord.h:396
Vec3d getCenter() const
Return the floating-point position of the center of this bounding box.
Definition: Coord.h:377
bool operator==(const Coord &rhs) const
Definition: Coord.h:149
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:538
Coord argument_type
Definition: Coord.h:595
Coord offsetBy(Int32 n) const
Definition: Coord.h:95
static CoordBBox inf()
Return an "infinite" bounding box, as defined by the Coord value range.
Definition: Coord.h:321
XYZIterator endXYZ() const
Return an XYZ-order iterator that points past the maximum coordinate.
Definition: Coord.h:352
static Coord minComponent(const Coord &lhs, const Coord &rhs)
Return the component-wise minimum of the two Coords.
Definition: Coord.h:191
bool operator==(const Iterator &other) const
Return true if this iterator and the given iterator point to the same coordinate. ...
Definition: Coord.h:274
CoordBBox expandBy(ValueType padding) const
Return a new instance that is expanded by the specified padding.
Definition: Coord.h:427
Coord Abs(const Coord &xyz)
Definition: Coord.h:517
int Ceil(float x)
Return the ceiling of x.
Definition: Math.h:856
void moveMin(const Coord &min)
Move this bounding box to the specified min.
Definition: Coord.h:463
bool isInside(const Coord &xyz) const
Return true if point (x, y, z) is inside this bounding box.
Definition: Coord.h:402
BBox< Coord > CoordBBox
Definition: NanoVDB.h:2535
bool hasOverlap(const CoordBBox &b) const
Return true if the given bounding box overlaps with this bounding box.
Definition: Coord.h:414
bool isInside(const CoordBBox &b) const
Return true if the given bounding box is inside this bounding box.
Definition: Coord.h:408
const Coord & min() const
Definition: Coord.h:323
Vec3< double > Vec3d
Definition: Vec3.h:664
uint64_t Index64
Definition: Types.h:53
Coord & operator+=(const Coord &rhs)
Definition: Coord.h:97
Coord(const Int32 *v)
Definition: Coord.h:40
void expand(const Coord &xyz)
Expand this bounding box to enclose point (x, y, z).
Definition: Coord.h:433
Coord & min()
Definition: Coord.h:326
Coord & operator<<=(size_t n)
Definition: Coord.h:123
Int32 & x()
Definition: Coord.h:134
OPENVDB_API std::istream & operator>>(std::istream &is, half &h)
Input h from is.
ZYXIterator end() const
Return a ZYX-order iterator that points past the maximum coordinate.
Definition: Coord.h:348
void read(std::istream &is)
Definition: Coord.h:219
Vec3< float > Vec3s
Definition: Vec3.h:663
Int32 operator[](size_t i) const
Definition: Coord.h:133
size_t maxExtent() const
Return the index (0, 1 or 2) of the longest axis.
Definition: Coord.h:399
Coord & reset(Int32 xyz)
Reset all three coordinates with the same specified argument.
Definition: Coord.h:77
const Int32 * asPointer() const
Definition: Coord.h:141
Coord & setY(Int32 y)
Definition: Coord.h:80
std::size_t result_type
Definition: Coord.h:596
Coord dim() const
Return the dimensions of the coordinates spanned by this bounding box.
Definition: Coord.h:382
Coord & operator>>=(size_t n)
Definition: Coord.h:124
ZYXIterator begin() const
Return a ZYX-order iterator that points to the minimum coordinate.
Definition: Coord.h:341
std::numeric_limits< ValueType > Limits
Definition: Coord.h:33
Coord & reset(Int32 x, Int32 y, Int32 z)
Reset all three coordinates with the specified arguments.
Definition: Coord.h:69
Vec3I asVec3I() const
Definition: Coord.h:146
static Coord floor(const Vec3< T > &xyz)
Return the largest integer coordinates that are not greater than xyz (node centered conversion)...
Definition: Coord.h:56
Iterator & operator++()
Increment the iterator to point to the next coordinate.
Definition: Coord.h:268
Definition: Exceptions.h:13
bool operator<=(const Coord &rhs) const
Lexicographic less than or equal to.
Definition: Coord.h:163
bool operator<(const Coord &rhs) const
Lexicographic less than.
Definition: Coord.h:156
Coord & offset(Int32 dx, Int32 dy, Int32 dz)
Definition: Coord.h:83
static bool lessThan(const Coord &a, const Coord &b)
Definition: Coord.h:208
constexpr Coord(Int32 x, Int32 y, Int32 z)
Definition: Coord.h:37
Coord & max()
Definition: Coord.h:327
float Round(float x)
Return x rounded to the nearest integer.
Definition: Math.h:819
Coord & operator-=(const Coord &rhs)
Definition: Coord.h:104
CoordBBox & operator<<=(size_t n)
Bit-wise operations performed on both the min and max members.
Definition: Coord.h:489
static Coord maxComponent(const Coord &lhs, const Coord &rhs)
Return the component-wise maximum of the two Coords.
Definition: Coord.h:199
void asXYZ(Int32 &x, Int32 &y, Int32 &z) const
Definition: Coord.h:147
void reset(const Coord &min, const Coord &max)
Definition: Coord.h:330
Coord getEnd() const
Return the maximum coordinate plus one.
Definition: Coord.h:338
Coord & setZ(Int32 z)
Definition: Coord.h:81
bool operator>(const Coord &rhs) const
Lexicographic greater than.
Definition: Coord.h:170
__hostdev__ uint32_t hash(uint32_t x)
Definition: common.h:14
void read(std::istream &is)
Unserialize this bounding box from the given stream.
Definition: Coord.h:498
Int32 * asPointer()
Definition: Coord.h:142
Coord()
Definition: Coord.h:35
Coord getStart() const
Return the minimum coordinate.
Definition: Coord.h:335
void intersect(const CoordBBox &bbox)
Intersect this bounding box with the given bounding box.
Definition: Coord.h:446
Int32 & z()
Definition: Coord.h:136
constexpr Coord(Int32 xyz)
Definition: Coord.h:36
Coord offsetBy(Int32 dx, Int32 dy, Int32 dz) const
Definition: Coord.h:91
CoordBBox & operator>>=(size_t n)
Bit-wise operations performed on both the min and max members.
Definition: Coord.h:490
bool empty() const
Return true if this bounding box is empty (i.e., encloses no coordinates).
Definition: Coord.h:358
ZYXIterator endZYX() const
Return a ZYX-order iterator that points past the maximum coordinate.
Definition: Coord.h:350
Coord & setX(Int32 x)
Definition: Coord.h:79
static Coord min()
Return the smallest possible coordinate.
Definition: Coord.h:43
Index64 volume() const
Return the integer volume of coordinates spanned by this bounding box.
Definition: Coord.h:387
uint64_t Index64
Definition: Coord.h:253
Iterator over the Coord domain covered by a CoordBBox.
Definition: Coord.h:260
const Coord & max() const
Definition: Coord.h:324
openvdb::math::Coord Coord
Definition: Coord.h:594
Coord(const Vec3i &v)
Definition: Coord.h:38
uint32_t Index32
Definition: Coord.h:28
Int32 & y()
Definition: Coord.h:135
void minComponent(const Coord &other)
Perform a component-wise minimum with the other Coord.
Definition: Coord.h:175
size_t minIndex() const
Return the index (0, 1 or 2) with the smallest value.
Definition: Coord.h:214
Int32 * data()
Definition: Coord.h:140
std::ostream & operator<<(std::ostream &os, const CoordBBox &b)
Definition: Coord.h:575
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:453
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:564
CoordBBox(CoordBBox &other, const tbb::split &)
Splitting constructor for use in TBB ranges.
Definition: Coord.h:307
Vec3i asVec3i() const
Definition: Coord.h:145
const Coord & operator*() const
Return a const reference to the coordinate currently pointed to.
Definition: Coord.h:272
int32_t Int32
Definition: Coord.h:27
Coord operator-() const
Definition: Coord.h:119
void expand(const CoordBBox &bbox)
Union this bounding box with the given bounding box.
Definition: Coord.h:440
size_t MaxIndex(const Vec3T &v)
Return the index [0,1,2] of the largest value in a 3D vector.
Definition: Math.h:947
bool operator!=(const CoordBBox &rhs) const
Definition: Coord.h:355
Coord(const Vec3I &v)
Definition: Coord.h:39
void moveMax(const Coord &max)
Move this bounding box to the specified max.
Definition: Coord.h:466
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h.in:121
void split(ContainerT &out, const std::string &in, const char delim)
Definition: Name.h:43
void write(std::ostream &os) const
Definition: Coord.h:220
Vec3< int32_t > Vec3i
Definition: Vec3.h:661
static CoordBBox createCube(const Coord &min, ValueType dim)
Definition: Coord.h:315
size_t MinIndex(const Vec3T &v)
Return the index [0,1,2] of the smallest value in a 3D vector.
Definition: Math.h:931
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:63
std::size_t operator()(const Coord &ijk) const noexcept
Definition: Coord.h:597
bool operator==(const CoordBBox &rhs) const
Definition: Coord.h:354
bool is_divisible() const
Return true if this bounding box can be subdivided [mainly for use by TBB].
Definition: Coord.h:393
uint32_t Index32
Definition: Types.h:52
Coord operator-(const Coord &rhs) const
Definition: Coord.h:115
CoordBBox(const Coord &min, const Coord &max)
Construct a bounding box with the given min and max bounds.
Definition: Coord.h:298
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h.in:212
void resetToCube(const Coord &min, ValueType dim)
Definition: Coord.h:331
static Coord round(const Vec3< T > &xyz)
Return xyz rounded to the closest integer coordinates (cell centered conversion). ...
Definition: Coord.h:50
XYZIterator beginXYZ() const
Return an XYZ-order iterator that points to the minimum coordinate.
Definition: Coord.h:345