OpenVDB 13.0.0
Loading...
Searching...
No Matches
Types.h
Go to the documentation of this file.
1// Copyright Contributors to the OpenVDB Project
2// SPDX-License-Identifier: Apache-2.0
3
4#ifndef OPENVDB_TYPES_HAS_BEEN_INCLUDED
5#define OPENVDB_TYPES_HAS_BEEN_INCLUDED
6
7#include "version.h"
8#include "Platform.h"
9#include "TypeList.h" // backwards compat
10
12
13#include <openvdb/math/Math.h>
14#include <openvdb/math/BBox.h>
15#include <openvdb/math/Quat.h>
16#include <openvdb/math/Vec2.h>
17#include <openvdb/math/Vec3.h>
18#include <openvdb/math/Vec4.h>
19#include <openvdb/math/Mat3.h>
20#include <openvdb/math/Mat4.h>
21#include <openvdb/math/Coord.h>
22#include <cstdint>
23#include <memory>
24#include <type_traits>
25
26
27namespace openvdb {
29namespace OPENVDB_VERSION_NAME {
30
31// One-dimensional scalar types
32using Index32 = uint32_t;
33using Index64 = uint64_t;
34using Index = Index32;
35using Int16 = int16_t;
36using Int32 = int32_t;
37using Int64 = int64_t;
38using Int = Int32;
39using Byte = unsigned char;
40using Real = double;
42
43// Two-dimensional vector types
48using math::Vec2i;
49using math::Vec2s;
50using math::Vec2d;
51
52// Three-dimensional vector types
59using math::Vec3i;
60using math::Vec3s;
61using math::Vec3d;
62
63using math::Coord;
64using math::CoordBBox;
66
67// Four-dimensional vector types
72using math::Vec4i;
73using math::Vec4s;
74using math::Vec4d;
75
76// Three-dimensional matrix types
78using math::Mat3s;
79using math::Mat3d;
80
81// Four-dimensional matrix types
83using math::Mat4s;
84using math::Mat4d;
85
86// Quaternions
88using math::Quats;
89using math::Quatd;
90
91// Dummy type for a voxel with a binary mask value, e.g. the active state
92class ValueMask {};
93
94// Use STL shared pointers from OpenVDB 4 on.
95template<typename T> using SharedPtr = std::shared_ptr<T>;
96template<typename T> using WeakPtr = std::weak_ptr<T>;
97
98/// @brief Return a new shared pointer that points to the same object
99/// as the given pointer but with possibly different <TT>const</TT>-ness.
100/// @par Example:
101/// @code
102/// FloatGrid::ConstPtr grid = ...;
103/// FloatGrid::Ptr nonConstGrid = ConstPtrCast<FloatGrid>(grid);
104/// FloatGrid::ConstPtr constGrid = ConstPtrCast<const FloatGrid>(nonConstGrid);
105/// @endcode
106template<typename T, typename U> inline SharedPtr<T>
107ConstPtrCast(const SharedPtr<U>& ptr) { return std::const_pointer_cast<T, U>(ptr); }
108
109/// @brief Return a new shared pointer that is either null or points to
110/// the same object as the given pointer after a @c dynamic_cast.
111/// @par Example:
112/// @code
113/// GridBase::ConstPtr grid = ...;
114/// FloatGrid::ConstPtr floatGrid = DynamicPtrCast<const FloatGrid>(grid);
115/// @endcode
116template<typename T, typename U> inline SharedPtr<T>
117DynamicPtrCast(const SharedPtr<U>& ptr) { return std::dynamic_pointer_cast<T, U>(ptr); }
118
119/// @brief Return a new shared pointer that points to the same object
120/// as the given pointer after a @c static_cast.
121/// @par Example:
122/// @code
123/// FloatGrid::Ptr floatGrid = ...;
124/// GridBase::Ptr grid = StaticPtrCast<GridBase>(floatGrid);
125/// @endcode
126template<typename T, typename U> inline SharedPtr<T>
127StaticPtrCast(const SharedPtr<U>& ptr) { return std::static_pointer_cast<T, U>(ptr); }
128
129
130////////////////////////////////////////
131
132
133/// @brief Integer wrapper, required to distinguish PointIndexGrid and
134/// PointDataGrid from Int32Grid and Int64Grid
135/// @note @c Kind is a dummy parameter used to create distinct types.
136template<typename IntType_, Index Kind>
138{
139 static_assert(std::is_integral<IntType_>::value, "PointIndex requires an integer value type");
140
141 using IntType = IntType_;
142
143 PointIndex(IntType i = IntType(0)): mIndex(i) {}
144
145 /// Explicit type conversion constructor
146 template<typename T> explicit PointIndex(T i): mIndex(static_cast<IntType>(i)) {}
147
148 operator IntType() const { return mIndex; }
149
150 /// Needed to support the <tt>(zeroVal<PointIndex>() + val)</tt> idiom.
151 template<typename T>
152 PointIndex operator+(T x) { return PointIndex(mIndex + IntType(x)); }
153
154private:
155 IntType mIndex;
156};
157
158
161
164
165
166////////////////////////////////////////
167
168/// @brief Macros to help determine whether or not a class has a particular
169/// member function.
170/// @details These macros work by instantiating unique templated instances
171/// of helper structs for a particular member function signature and name
172/// which can then be queried.
173/// - The first macro, INVOKABLE, defines a helper struct which determines
174/// if a member function can be called with a given set of argument types.
175/// Note that the return type is not provided.
176/// - The second macro defines a helper struct which determines if the
177/// member function exists with the _exact_ same signature, including
178/// all argument and function attributes (const-ness, noexcept, etc)
179///
180/// Use the first solution if all you want to determine is whether a given
181/// method can be called, and the second if you need exact resolution.
182/// @code
183/// // example class
184/// struct MyClass { int test(double) { return 0; } };
185///
186/// // The following examples work from the struct type created by:
187/// OPENVDB_INIT_INVOKABLE_MEMBER_FUNCTION(test);
188///
189/// // Will assert true!
190/// static_assert(OPENVDB_HAS_INVOKABLE_MEMBER_FUNCTION(MyClass, test, double));
191/// // Will assert true, int can be converted to double
192/// static_assert(OPENVDB_HAS_INVOKABLE_MEMBER_FUNCTION(MyClass, test, int));
193/// // Will assert false, needs at least one argument
194/// static_assert(OPENVDB_HAS_INVOKABLE_MEMBER_FUNCTION(MyClass, test);
195///
196///
197/// // The following examples work from the struct type created by:
198/// OPENVDB_INIT_MEMBER_FUNCTION(test);
199///
200/// // Will assert fail
201/// static_assert(OPENVDB_HAS_MEMBER_FUNCTION(MyClass, test, void(MyClass::*)(double)));
202/// // Only case where this assert true
203/// static_assert(OPENVDB_HAS_MEMBER_FUNCTION(MyClass, test, int(MyClass::*)(double)));
204///
205/// @endcode
206#define OPENVDB_INIT_INVOKABLE_MEMBER_FUNCTION(F) \
207 template <typename ClassT, typename... Args> \
208 struct HasInvokableMemberFunction_##F { \
209 private: \
210 template <typename T> \
211 static auto check(T*) -> \
212 decltype(std::declval<T>(). \
213 F(std::declval<Args>()...), std::true_type()); \
214 template <typename T> \
215 static auto check(...) -> std::false_type; \
216 public: \
217 static constexpr bool value = \
218 decltype(check<ClassT>(nullptr))::value; \
219 };
220#define OPENVDB_HAS_INVOKABLE_MEMBER_FUNCTION(T, F, ...) \
221 HasInvokableMemberFunction_##F<T, __VA_ARGS__>::value
222
223#define OPENVDB_INIT_MEMBER_FUNCTION(F) \
224 template<typename ClassT, typename Signature> \
225 struct HasMemberFunction_##F { \
226 template <typename U, U> struct sigmatch; \
227 template <typename U> static std::true_type \
228 check(sigmatch<Signature, &U::F>*); \
229 template <typename> static std::false_type check(...); \
230 static const bool value = std::is_same<std::true_type, \
231 decltype(check<ClassT>(nullptr))>::value; \
232 };
233#define OPENVDB_HAS_MEMBER_FUNCTION(T, F, S) \
234 HasMemberFunction_##F<T, S>::value
235
236
237////////////////////////////////////////
238
239
240/// @brief Helper metafunction used to determine if the first template
241/// parameter is a specialization of the class template given in the second
242/// template parameter
243template <typename T, template <typename...> class Template>
244struct IsSpecializationOf: public std::false_type {};
245
246template <typename... Args, template <typename...> class Template>
247struct IsSpecializationOf<Template<Args...>, Template>: public std::true_type {};
248
249
250////////////////////////////////////////
251
252
253/// @brief Re-implementation of C++17's index_sequence and the helper alias
254/// make_index_sequence. This was introduced to fix an issue with clang's
255/// builtin implementation which treats template specializations of builtin
256/// templates differently when a subsequent parameter is dependent. The
257/// result is a resolution failure during partial specialization selection.
258/// For example, the following will fail to specialize:
259///
260/// @code
261/// struct Test { static const int VALUE = 1; };
262///
263/// template <typename T, typename S = std::make_index_sequence<T::VALUE>>
264/// struct Item {};
265/// template <typename T> struct Adapter {};
266/// template <typename T> struct Adapter<Item<T>> {}; // FAIL: will never be selected.
267/// @endcode
268///
269/// This is fixed from Clang16. See also:
270/// https://reviews.llvm.org/D133262
271/// https://github.com/llvm/llvm-project/issues/42102
272/// https://github.com/llvm/llvm-project/issues/51928
273/// https://github.com/llvm/llvm-project/commit/f4ea3bd4b2086e6de10131b197aaf7d066a24df8
274template <std::size_t... Ns>
276
277template <std::size_t N, std::size_t... Is>
279 // only one branch is considered. The other may be ill-formed
280 if constexpr (N == 0) return index_sequence<Is...>(); // end case
281 else return make_index_sequence_impl<N-1, N-1, Is...>(); // recursion
282}
283
284template <std::size_t N>
286 std::decay_t<decltype(make_index_sequence_impl<N>())>;
287
288
289////////////////////////////////////////
290
291
292template<typename T, bool = IsSpecializationOf<T, math::Vec2>::value ||
296{
297 static const bool IsVec = true;
298 static const int Size = T::size;
299 using ElementType = typename T::ValueType;
300};
301
302template<typename T>
303struct VecTraits<T, false>
304{
305 static const bool IsVec = false;
306 static const int Size = 1;
307 using ElementType = T;
308};
309
310template<typename T, bool = IsSpecializationOf<T, math::Quat>::value>
312{
313 static const bool IsQuat = true;
314 static const int Size = T::size;
315 using ElementType = typename T::ValueType;
316};
317
318template<typename T>
319struct QuatTraits<T, false>
320{
321 static const bool IsQuat = false;
322 static const int Size = 1;
323 using ElementType = T;
324};
325
326template<typename T, bool = IsSpecializationOf<T, math::Mat3>::value ||
329{
330 static const bool IsMat = true;
331 static const int Size = T::size;
332 using ElementType = typename T::ValueType;
333};
334
335template<typename T>
336struct MatTraits<T, false>
337{
338 static const bool IsMat = false;
339 static const int Size = 1;
340 using ElementType = T;
341};
342
343template<typename T, bool = VecTraits<T>::IsVec ||
347{
348 static const bool IsVec = VecTraits<T>::IsVec;
349 static const bool IsQuat = QuatTraits<T>::IsQuat;
350 static const bool IsMat = MatTraits<T>::IsMat;
351 static const bool IsScalar = false;
352 static const int Size = T::size;
353 static const int Elements = IsMat ? Size*Size : Size;
354 using ElementType = typename T::ValueType;
355};
356
357template<typename T>
358struct ValueTraits<T, false>
359{
360 static const bool IsVec = false;
361 static const bool IsQuat = false;
362 static const bool IsMat = false;
363 static const bool IsScalar = true;
364 static const int Size = 1;
365 static const int Elements = 1;
366 using ElementType = T;
367};
368
369
370/// @brief Conversion classes for changing the underlying type of VDB types
371/// @{
372template<typename T, typename SubT> struct ConvertElementType { using Type = SubT; };
373template<typename T, typename SubT> struct ConvertElementType<math::Vec2<T>, SubT> { using Type = math::Vec2<SubT>; };
374template<typename T, typename SubT> struct ConvertElementType<math::Vec3<T>, SubT> { using Type = math::Vec3<SubT>; };
375template<typename T, typename SubT> struct ConvertElementType<math::Vec4<T>, SubT> { using Type = math::Vec4<SubT>; };
376template<typename T, typename SubT> struct ConvertElementType<math::Quat<T>, SubT> { using Type = math::Quat<SubT>; };
377template<typename T, typename SubT> struct ConvertElementType<math::Mat3<T>, SubT> { using Type = math::Mat3<SubT>; };
378template<typename T, typename SubT> struct ConvertElementType<math::Mat4<T>, SubT> { using Type = math::Mat4<SubT>; };
379/// @}
380
382{
383template <size_t Bits, bool Signed> struct int_t;
384template <> struct int_t<8ul, true> { using type = int8_t; };
385template <> struct int_t<16ul, true> { using type = int16_t; };
386template <> struct int_t<32ul, true> { using type = int32_t; };
387template <> struct int_t<64ul, true> { using type = int64_t; };
388template <> struct int_t<8ul, false> { using type = uint8_t; };
389template <> struct int_t<16ul, false> { using type = uint16_t; };
390template <> struct int_t<32ul, false> { using type = uint32_t; };
391template <> struct int_t<64ul, false> { using type = uint64_t; };
392
393template <size_t Bits> struct flt_t;
394template <> struct flt_t<16ul> { using type = math::half; };
395template <> struct flt_t<32ul> { using type = float; };
396template <> struct flt_t<64ul> { using type = double; };
397}
398
399/// @brief Promotion classes which provide an interface for elevating and
400/// demoting a scalar or VDB type to a higher or lower precision. Integer
401/// types preserve their sign. Types promotion are only valid between
402/// 8 to 64 bits (long doubles are not supported).
403/// @{
404template<typename T>
406{
407private:
408 template <size_t bits>
409 using TypeT = typename std::conditional<std::is_integral<T>::value,
411 types_internal::flt_t<std::max(size_t(16), bits)>>::type;
412public:
413 static_assert(sizeof(T) <= 8ul, "Unsupported source type for promotion");
414
415#define OPENVDB_TARGET_BITS(SHIFT, PROMOTE) \
416 std::max(size_t(8), \
417 std::min(size_t(64), (PROMOTE ? size_t(8)*(sizeof(T)<<SHIFT) : \
418 size_t(8)*(sizeof(T)>>SHIFT))))
419 template <size_t Shift = ~0UL> using Promote = typename TypeT<OPENVDB_TARGET_BITS(Shift, true)>::type;
420 template <size_t Shift = ~0UL> using Demote = typename TypeT<OPENVDB_TARGET_BITS(Shift, false)>::type;
421#undef OPENVDB_TARGET_BITS
422
423 using Highest = typename TypeT<64ul>::type;
424 using Lowest = typename TypeT<8ul>::type;
427};
428
429template <typename T, template <typename> class ContainerT>
431{
432 template <size_t Shift = ~0UL> using Promote = ContainerT<typename PromoteType<T>::template Promote<Shift>>;
433 template <size_t Shift = ~0UL> using Demote = ContainerT<typename PromoteType<T>::template Demote<Shift>>;
434 using Highest = ContainerT<typename PromoteType<T>::Highest>;
435 using Lowest = ContainerT<typename PromoteType<T>::Lowest>;
436 using Next = ContainerT<typename PromoteType<T>::Next>;
437 using Previous = ContainerT<typename PromoteType<T>::Previous>;
438};
439
440template<typename T> struct PromoteType<math::Vec2<T>> : public PromoteContainerType<T, math::Vec2> {};
441template<typename T> struct PromoteType<math::Vec3<T>> : public PromoteContainerType<T, math::Vec3> {};
442template<typename T> struct PromoteType<math::Vec4<T>> : public PromoteContainerType<T, math::Vec4> {};
443template<typename T> struct PromoteType<math::Quat<T>> : public PromoteContainerType<T, math::Quat> {};
444template<typename T> struct PromoteType<math::Mat3<T>> : public PromoteContainerType<T, math::Mat3> {};
445template<typename T> struct PromoteType<math::Mat4<T>> : public PromoteContainerType<T, math::Mat4> {};
446/// @}
447
448
449////////////////////////////////////////
450
451
452/// @brief CanConvertType<FromType, ToType>::value is @c true if a value
453/// of type @a ToType can be constructed from a value of type @a FromType.
454template<typename FromType, typename ToType>
455struct CanConvertType { enum { value = std::is_constructible<ToType, FromType>::value }; };
456
457// Specializations for vector types, which can be constructed from values
458// of their own ValueTypes (or values that can be converted to their ValueTypes),
459// but only explicitly
460template<typename T> struct CanConvertType<T, math::Vec2<T> > { enum { value = true }; };
461template<typename T> struct CanConvertType<T, math::Vec3<T> > { enum { value = true }; };
462template<typename T> struct CanConvertType<T, math::Vec4<T> > { enum { value = true }; };
463template<typename T> struct CanConvertType<math::Vec2<T>, math::Vec2<T> > { enum {value = true}; };
464template<typename T> struct CanConvertType<math::Vec3<T>, math::Vec3<T> > { enum {value = true}; };
465template<typename T> struct CanConvertType<math::Vec4<T>, math::Vec4<T> > { enum {value = true}; };
466template<typename T0, typename T1>
467struct CanConvertType<T0, math::Vec2<T1> > { enum { value = CanConvertType<T0, T1>::value }; };
468template<typename T0, typename T1>
469struct CanConvertType<T0, math::Vec3<T1> > { enum { value = CanConvertType<T0, T1>::value }; };
470template<typename T0, typename T1>
471struct CanConvertType<T0, math::Vec4<T1> > { enum { value = CanConvertType<T0, T1>::value }; };
472template<> struct CanConvertType<PointIndex32, PointDataIndex32> { enum {value = true}; };
473template<> struct CanConvertType<PointDataIndex32, PointIndex32> { enum {value = true}; };
474template<typename T>
476template<typename T>
478
479
480////////////////////////////////////////
481
482
483/// @brief CopyConstness<T1, T2>::Type is either <tt>const T2</tt>
484/// or @c T2 with no @c const qualifier, depending on whether @c T1 is @c const.
485/// @details For example,
486/// - CopyConstness<int, int>::Type is @c int
487/// - CopyConstness<int, const int>::Type is @c int
488/// - CopyConstness<const int, int>::Type is <tt>const int</tt>
489/// - CopyConstness<const int, const int>::Type is <tt>const int</tt>
490template<typename FromType, typename ToType> struct CopyConstness {
491 using Type = typename std::remove_const<ToType>::type;
492};
493
494/// @cond OPENVDB_DOCS_INTERNAL
495template<typename FromType, typename ToType> struct CopyConstness<const FromType, ToType> {
496 using Type = const ToType;
497};
498/// @endcond
499
500
501////////////////////////////////////////
502template<class T>
503struct is_floating_point : std::is_floating_point<T> { };
504
505template<>
506struct is_floating_point<Half> : std::is_floating_point<float> { };
507
508
509template<class T>
510struct is_signed : std::is_signed<T> { };
511
512template<>
513struct is_signed<Half> : std::is_signed<float> { };
514
515
516////////////////////////////////////////
517
518
519// Add new items to the *end* of this list, and update NUM_GRID_CLASSES.
527
528static const Real LEVEL_SET_HALF_WIDTH = 3;
529
530/// The type of a vector determines how transforms are applied to it:
531/// <dl>
532/// <dt><b>Invariant</b>
533/// <dd>Does not transform (e.g., tuple, uvw, color)
534///
535/// <dt><b>Covariant</b>
536/// <dd>Apply inverse-transpose transformation: @e w = 0, ignores translation
537/// (e.g., gradient/normal)
538///
539/// <dt><b>Covariant Normalize</b>
540/// <dd>Apply inverse-transpose transformation: @e w = 0, ignores translation,
541/// vectors are renormalized (e.g., unit normal)
542///
543/// <dt><b>Contravariant Relative</b>
544/// <dd>Apply "regular" transformation: @e w = 0, ignores translation
545/// (e.g., displacement, velocity, acceleration)
546///
547/// <dt><b>Contravariant Absolute</b>
548/// <dd>Apply "regular" transformation: @e w = 1, vector translates (e.g., position)
549/// </dl>
558
559
560/// Specify how grids should be merged during certain (typically multithreaded) operations.
561/// <dl>
562/// <dt><b>MERGE_ACTIVE_STATES</b>
563/// <dd>The output grid is active wherever any of the input grids is active.
564///
565/// <dt><b>MERGE_NODES</b>
566/// <dd>The output grid's tree has a node wherever any of the input grids' trees
567/// has a node, regardless of any active states.
568///
569/// <dt><b>MERGE_ACTIVE_STATES_AND_NODES</b>
570/// <dd>The output grid is active wherever any of the input grids is active,
571/// and its tree has a node wherever any of the input grids' trees has a node.
572/// </dl>
578
579
580////////////////////////////////////////
581
582
583template<typename T> const char* typeNameAsString() { return typeid(T).name(); }
584template<> inline const char* typeNameAsString<bool>() { return "bool"; }
585template<> inline const char* typeNameAsString<ValueMask>() { return "mask"; }
586template<> inline const char* typeNameAsString<math::half>() { return "half"; }
587template<> inline const char* typeNameAsString<float>() { return "float"; }
588template<> inline const char* typeNameAsString<double>() { return "double"; }
589template<> inline const char* typeNameAsString<int8_t>() { return "int8"; }
590template<> inline const char* typeNameAsString<uint8_t>() { return "uint8"; }
591template<> inline const char* typeNameAsString<int16_t>() { return "int16"; }
592template<> inline const char* typeNameAsString<uint16_t>() { return "uint16"; }
593template<> inline const char* typeNameAsString<int32_t>() { return "int32"; }
594template<> inline const char* typeNameAsString<uint32_t>() { return "uint32"; }
595template<> inline const char* typeNameAsString<int64_t>() { return "int64"; }
596template<> inline const char* typeNameAsString<Vec2i>() { return "vec2i"; }
597template<> inline const char* typeNameAsString<Vec2s>() { return "vec2s"; }
598template<> inline const char* typeNameAsString<Vec2d>() { return "vec2d"; }
599template<> inline const char* typeNameAsString<Vec3U8>() { return "vec3u8"; }
600template<> inline const char* typeNameAsString<Vec3U16>() { return "vec3u16"; }
601template<> inline const char* typeNameAsString<Vec3i>() { return "vec3i"; }
602template<> inline const char* typeNameAsString<Vec3f>() { return "vec3s"; }
603template<> inline const char* typeNameAsString<Vec3d>() { return "vec3d"; }
604template<> inline const char* typeNameAsString<Vec4i>() { return "vec4i"; }
605template<> inline const char* typeNameAsString<Vec4f>() { return "vec4s"; }
606template<> inline const char* typeNameAsString<Vec4d>() { return "vec4d"; }
607template<> inline const char* typeNameAsString<std::string>() { return "string"; }
608template<> inline const char* typeNameAsString<Mat3s>() { return "mat3s"; }
609template<> inline const char* typeNameAsString<Mat3d>() { return "mat3d"; }
610template<> inline const char* typeNameAsString<Mat4s>() { return "mat4s"; }
611template<> inline const char* typeNameAsString<Mat4d>() { return "mat4d"; }
612template<> inline const char* typeNameAsString<math::Quats>() { return "quats"; }
613template<> inline const char* typeNameAsString<math::Quatd>() { return "quatd"; }
614template<> inline const char* typeNameAsString<PointIndex32>() { return "ptidx32"; }
615template<> inline const char* typeNameAsString<PointIndex64>() { return "ptidx64"; }
616template<> inline const char* typeNameAsString<PointDataIndex32>() { return "ptdataidx32"; }
617template<> inline const char* typeNameAsString<PointDataIndex64>() { return "ptdataidx64"; }
618
619
620////////////////////////////////////////
621
622
623/// @brief This struct collects both input and output arguments to "grid combiner" functors
624/// used with the tree::TypedGrid::combineExtended() and combine2Extended() methods.
625/// AValueType and BValueType are the value types of the two grids being combined.
626///
627/// @see openvdb/tree/Tree.h for usage information.
628///
629/// Setter methods return references to this object, to facilitate the following usage:
630/// @code
631/// CombineArgs<float> args;
632/// myCombineOp(args.setARef(aVal).setBRef(bVal).setAIsActive(true).setBIsActive(false));
633/// @endcode
634template<typename AValueType, typename BValueType = AValueType>
636{
637public:
638 using AValueT = AValueType;
639 using BValueT = BValueType;
640
642 : mAValPtr(nullptr)
643 , mBValPtr(nullptr)
645 , mAIsActive(false)
646 , mBIsActive(false)
647 , mResultIsActive(false)
648 {
649 }
650
651 /// Use this constructor when the result value is stored externally.
652 CombineArgs(const AValueType& a, const BValueType& b, AValueType& result,
653 bool aOn = false, bool bOn = false)
654 : mAValPtr(&a)
655 , mBValPtr(&b)
657 , mAIsActive(aOn)
658 , mBIsActive(bOn)
659 {
660 this->updateResultActive();
661 }
662
663 /// Use this constructor when the result value should be stored in this struct.
664 CombineArgs(const AValueType& a, const BValueType& b, bool aOn = false, bool bOn = false)
665 : mAValPtr(&a)
666 , mBValPtr(&b)
668 , mAIsActive(aOn)
669 , mBIsActive(bOn)
670 {
671 this->updateResultActive();
672 }
673
674 /// Get the A input value.
675 const AValueType& a() const { return *mAValPtr; }
676 /// Get the B input value.
677 const BValueType& b() const { return *mBValPtr; }
678 //@{
679 /// Get the output value.
680 const AValueType& result() const { return *mResultValPtr; }
681 AValueType& result() { return *mResultValPtr; }
682 //@}
683
684 /// Set the output value.
685 CombineArgs& setResult(const AValueType& val) { *mResultValPtr = val; return *this; }
686
687 /// Redirect the A value to a new external source.
688 CombineArgs& setARef(const AValueType& a) { mAValPtr = &a; return *this; }
689 /// Redirect the B value to a new external source.
690 CombineArgs& setBRef(const BValueType& b) { mBValPtr = &b; return *this; }
691 /// Redirect the result value to a new external destination.
692 CombineArgs& setResultRef(AValueType& val) { mResultValPtr = &val; return *this; }
693
694 /// @return true if the A value is active
695 bool aIsActive() const { return mAIsActive; }
696 /// @return true if the B value is active
697 bool bIsActive() const { return mBIsActive; }
698 /// @return true if the output value is active
699 bool resultIsActive() const { return mResultIsActive; }
700
701 /// Set the active state of the A value.
703 /// Set the active state of the B value.
705 /// Set the active state of the output value.
706 CombineArgs& setResultIsActive(bool b) { mResultIsActive = b; return *this; }
707
708protected:
709 /// By default, the result value is active if either of the input values is active,
710 /// but this behavior can be overridden by calling setResultIsActive().
712
713 const AValueType* mAValPtr; // pointer to input value from A grid
714 const BValueType* mBValPtr; // pointer to input value from B grid
715 AValueType mResultVal; // computed output value (unused if stored externally)
716 AValueType* mResultValPtr; // pointer to either mResultVal or an external value
717 bool mAIsActive, mBIsActive; // active states of A and B values
718 bool mResultIsActive; // computed active state (default: A active || B active)
719};
720
721
722/// This struct adapts a "grid combiner" functor to swap the A and B grid values
723/// (e.g., so that if the original functor computes a + 2 * b, the adapted functor
724/// will compute b + 2 * a).
725template<typename ValueType, typename CombineOp>
727{
728 SwappedCombineOp(CombineOp& _op): op(_op) {}
729
731 {
732 CombineArgs<ValueType> swappedArgs(args.b(), args.a(), args.result(),
733 args.bIsActive(), args.aIsActive());
734 op(swappedArgs);
735 args.setResultIsActive(swappedArgs.resultIsActive());
736 }
737
738 CombineOp& op;
739};
740
741
742////////////////////////////////////////
743
744
745/// @brief Tag dispatch class that distinguishes shallow copy constructors
746/// from deep copy constructors
747class ShallowCopy {};
748/// @brief Tag dispatch class that distinguishes topology copy constructors
749/// from deep copy constructors
751/// @brief Tag dispatch class that distinguishes constructors that deep copy
752class DeepCopy {};
753/// @brief Tag dispatch class that distinguishes constructors that steal
754class Steal {};
755/// @brief Tag dispatch class that distinguishes constructors during file input
757
758// For half compilation
759namespace math {
760template<>
761inline auto cwiseAdd(const Vec3H& v, const float s)
762{
763 Vec3H out;
764 const Half* ip = v.asPointer();
765 Half* op = out.asPointer();
766 for (unsigned i = 0; i < 3; ++i, ++op, ++ip) {
768 *op = *ip + s;
770 }
771 return out;
772}
773} // namespace math
774
775} // namespace OPENVDB_VERSION_NAME
776} // namespace openvdb
777
778
779#endif // OPENVDB_TYPES_HAS_BEEN_INCLUDED
General-purpose arithmetic and comparison routines, most of which accept arbitrary value types (or at...
#define OPENVDB_NO_TYPE_CONVERSION_WARNING_BEGIN
Bracket code with OPENVDB_NO_TYPE_CONVERSION_WARNING_BEGIN/_END, to inhibit warnings about type conve...
Definition Platform.h:244
#define OPENVDB_NO_TYPE_CONVERSION_WARNING_END
Definition Platform.h:245
A TypeList provides a compile time sequence of heterogeneous types which can be accessed,...
This struct collects both input and output arguments to "grid combiner" functors used with the tree::...
Definition Types.h:636
CombineArgs & setARef(const AValueType &a)
Redirect the A value to a new external source.
Definition Types.h:688
bool bIsActive() const
Definition Types.h:697
const AValueType & result() const
Get the output value.
Definition Types.h:680
CombineArgs(const AValueType &a, const BValueType &b, AValueType &result, bool aOn=false, bool bOn=false)
Use this constructor when the result value is stored externally.
Definition Types.h:652
bool mAIsActive
Definition Types.h:717
AValueType * mResultValPtr
Definition Types.h:716
void updateResultActive()
Definition Types.h:711
CombineArgs & setResultIsActive(bool b)
Set the active state of the output value.
Definition Types.h:706
const AValueType * mAValPtr
Definition Types.h:713
AValueType mResultVal
Definition Types.h:715
bool aIsActive() const
Definition Types.h:695
bool mBIsActive
Definition Types.h:717
CombineArgs & setBIsActive(bool b)
Set the active state of the B value.
Definition Types.h:704
const BValueType & b() const
Get the B input value.
Definition Types.h:677
const BValueType * mBValPtr
Definition Types.h:714
CombineArgs(const AValueType &a, const BValueType &b, bool aOn=false, bool bOn=false)
Use this constructor when the result value should be stored in this struct.
Definition Types.h:664
CombineArgs & setResultRef(AValueType &val)
Redirect the result value to a new external destination.
Definition Types.h:692
AValueType & result()
Definition Types.h:681
AValueType AValueT
Definition Types.h:638
CombineArgs & setBRef(const BValueType &b)
Redirect the B value to a new external source.
Definition Types.h:690
const AValueType & a() const
Get the A input value.
Definition Types.h:675
bool resultIsActive() const
Definition Types.h:699
bool mResultIsActive
Definition Types.h:718
BValueType BValueT
Definition Types.h:639
CombineArgs()
Definition Types.h:641
CombineArgs & setResult(const AValueType &val)
Set the output value.
Definition Types.h:685
CombineArgs & setAIsActive(bool b)
Set the active state of the A value.
Definition Types.h:702
Tag dispatch class that distinguishes constructors that deep copy.
Definition Types.h:752
Tag dispatch class that distinguishes constructors during file input.
Definition Types.h:756
Tag dispatch class that distinguishes shallow copy constructors from deep copy constructors.
Definition Types.h:747
Tag dispatch class that distinguishes constructors that steal.
Definition Types.h:754
Tag dispatch class that distinguishes topology copy constructors from deep copy constructors.
Definition Types.h:750
Definition Types.h:92
Axis-aligned bounding box.
Definition BBox.h:24
Axis-aligned bounding box of signed integer coordinates.
Definition Coord.h:252
Signed (x, y, z) 32-bit integer coordinates.
Definition Coord.h:26
3x3 matrix class.
Definition Mat3.h:29
4x4 -matrix class.
Definition Mat4.h:31
Definition Quat.h:80
Definition Vec2.h:24
Definition Vec3.h:25
T * asPointer()
Definition Vec3.h:95
Definition Vec4.h:25
Definition Types.h:759
Vec2< int32_t > Vec2i
Definition Vec2.h:530
Mat4< float > Mat4s
Definition Mat4.h:1354
Vec2< double > Vec2d
Definition Vec2.h:533
Mat3< double > Mat3d
Definition Mat3.h:833
Vec2< float > Vec2s
Definition Vec2.h:532
Vec4< float > Vec4s
Definition Vec4.h:561
Mat3< float > Mat3s
Definition Mat3.h:832
Vec3< double > Vec3d
Definition Vec3.h:665
Mat4< double > Mat4d
Definition Mat4.h:1355
Vec4< int32_t > Vec4i
Definition Vec4.h:559
Quat< double > Quatd
Definition Quat.h:612
auto cwiseAdd(const Vec3H &v, const float s)
Definition Types.h:761
internal::half half
Definition HalfDecl.h:25
Vec3< int32_t > Vec3i
Definition Vec3.h:662
Vec4< double > Vec4d
Definition Vec4.h:562
Quat< float > Quats
Definition Quat.h:611
Vec3< float > Vec3s
Definition Vec3.h:664
Definition Types.h:382
static const Real LEVEL_SET_HALF_WIDTH
Definition Types.h:528
math::Vec4< float > Vec4f
Definition Types.h:70
Index32 Index
Definition Types.h:34
math::Vec4< Index32 > Vec4I
Definition Types.h:69
std::decay_t< decltype(make_index_sequence_impl< N >())> make_index_sequence
Definition Types.h:285
math::half Half
Definition Types.h:41
math::Vec3< uint16_t > Vec3U16
Definition Types.h:58
PointIndex< Index64, 1 > PointDataIndex64
Definition Types.h:163
math::Vec2< Real > Vec2R
Definition Types.h:44
int16_t Int16
Definition Types.h:35
PointIndex< Index64, 0 > PointIndex64
Definition Types.h:160
auto make_index_sequence_impl()
Definition Types.h:278
unsigned char Byte
Definition Types.h:39
math::Vec3< float > Vec3f
Definition Types.h:55
double Real
Definition Types.h:40
GridClass
Definition Types.h:520
@ GRID_FOG_VOLUME
Definition Types.h:523
@ GRID_STAGGERED
Definition Types.h:524
@ GRID_LEVEL_SET
Definition Types.h:522
@ GRID_UNKNOWN
Definition Types.h:521
int64_t Int64
Definition Types.h:37
PointIndex< Index32, 0 > PointIndex32
Definition Types.h:159
math::Vec2< Half > Vec2H
Definition Types.h:47
Int32 Int
Definition Types.h:38
math::Vec2< Index32 > Vec2I
Definition Types.h:45
std::weak_ptr< T > WeakPtr
Definition Types.h:96
math::Mat4< Real > Mat4R
Definition Types.h:82
uint32_t Index32
Definition Types.h:32
SharedPtr< T > ConstPtrCast(const SharedPtr< U > &ptr)
Return a new shared pointer that points to the same object as the given pointer but with possibly dif...
Definition Types.h:107
math::BBox< Vec3d > BBoxd
Definition Types.h:65
math::Mat3< Real > Mat3R
Definition Types.h:77
math::Vec3< Index32 > Vec3I
Definition Types.h:54
math::Vec3< Real > Vec3R
Definition Types.h:53
SharedPtr< T > DynamicPtrCast(const SharedPtr< U > &ptr)
Return a new shared pointer that is either null or points to the same object as the given pointer aft...
Definition Types.h:117
int32_t Int32
Definition Types.h:36
uint64_t Index64
Definition Types.h:33
@ NUM_GRID_CLASSES
Definition Types.h:526
math::Vec2< float > Vec2f
Definition Types.h:46
std::shared_ptr< T > SharedPtr
Definition Types.h:95
math::Vec4< Half > Vec4H
Definition Types.h:71
MergePolicy
Definition Types.h:573
@ MERGE_ACTIVE_STATES
Definition Types.h:574
@ MERGE_NODES
Definition Types.h:575
@ MERGE_ACTIVE_STATES_AND_NODES
Definition Types.h:576
math::Vec4< Real > Vec4R
Definition Types.h:68
math::Vec3< Half > Vec3H
Definition Types.h:56
math::Vec3< uint8_t > Vec3U8
Definition Types.h:57
VecType
Definition Types.h:550
@ VEC_CONTRAVARIANT_ABSOLUTE
Definition Types.h:555
@ VEC_CONTRAVARIANT_RELATIVE
Definition Types.h:554
@ VEC_COVARIANT
Definition Types.h:552
@ VEC_COVARIANT_NORMALIZE
Definition Types.h:553
@ VEC_INVARIANT
Definition Types.h:551
@ NUM_VEC_TYPES
Definition Types.h:557
SharedPtr< T > StaticPtrCast(const SharedPtr< U > &ptr)
Return a new shared pointer that points to the same object as the given pointer after a static_cast.
Definition Types.h:127
math::Quat< Real > QuatR
Definition Types.h:87
const char * typeNameAsString()
Definition Types.h:583
PointIndex< Index32, 1 > PointDataIndex32
Definition Types.h:162
Definition Exceptions.h:13
#define OPENVDB_TARGET_BITS(SHIFT, PROMOTE)
Definition Types.h:415
CanConvertType<FromType, ToType>::value is true if a value of type ToType can be constructed from a v...
Definition Types.h:455
@ value
Definition Types.h:455
math::Mat3< SubT > Type
Definition Types.h:377
math::Mat4< SubT > Type
Definition Types.h:378
math::Quat< SubT > Type
Definition Types.h:376
math::Vec2< SubT > Type
Definition Types.h:373
math::Vec3< SubT > Type
Definition Types.h:374
math::Vec4< SubT > Type
Definition Types.h:375
Conversion classes for changing the underlying type of VDB types.
Definition Types.h:372
SubT Type
Definition Types.h:372
CopyConstness<T1, T2>::Type is either const T2 or T2 with no const qualifier, depending on whether T1...
Definition Types.h:490
typename std::remove_const< ToType >::type Type
Definition Types.h:491
Helper metafunction used to determine if the first template parameter is a specialization of the clas...
Definition Types.h:244
T ElementType
Definition Types.h:340
static const int Size
Definition Types.h:339
static const bool IsMat
Definition Types.h:338
Definition Types.h:329
static const int Size
Definition Types.h:331
typename T::ValueType ElementType
Definition Types.h:332
static const bool IsMat
Definition Types.h:330
Integer wrapper, required to distinguish PointIndexGrid and PointDataGrid from Int32Grid and Int64Gri...
Definition Types.h:138
PointIndex(T i)
Explicit type conversion constructor.
Definition Types.h:146
PointIndex(IntType i=IntType(0))
Definition Types.h:143
PointIndex operator+(T x)
Needed to support the (zeroVal<PointIndex>() + val) idiom.
Definition Types.h:152
IntType_ IntType
Definition Types.h:141
ContainerT< typename PromoteType< T >::Previous > Previous
Definition Types.h:437
ContainerT< typename PromoteType< T >::template Demote< Shift > > Demote
Definition Types.h:433
ContainerT< typename PromoteType< T >::Highest > Highest
Definition Types.h:434
ContainerT< typename PromoteType< T >::Lowest > Lowest
Definition Types.h:435
ContainerT< typename PromoteType< T >::Next > Next
Definition Types.h:436
ContainerT< typename PromoteType< T >::template Promote< Shift > > Promote
Definition Types.h:432
Promotion classes which provide an interface for elevating and demoting a scalar or VDB type to a hig...
Definition Types.h:406
Promote< 1 > Next
Definition Types.h:425
typename TypeT< std::max(size_t(8), std::min(size_t(64),(true ? size_t(8) *(sizeof(T)<< Shift) : size_t(8) *(sizeof(T)> >Shift)))) >::type Promote
Definition Types.h:419
Demote< 1 > Previous
Definition Types.h:426
typename TypeT< 8ul >::type Lowest
Definition Types.h:424
typename TypeT< std::max(size_t(8), std::min(size_t(64),(false ? size_t(8) *(sizeof(T)<< Shift) : size_t(8) *(sizeof(T)> >Shift)))) >::type Demote
Definition Types.h:420
typename TypeT< 64ul >::type Highest
Definition Types.h:423
T ElementType
Definition Types.h:323
static const int Size
Definition Types.h:322
static const bool IsQuat
Definition Types.h:321
Definition Types.h:312
static const int Size
Definition Types.h:314
typename T::ValueType ElementType
Definition Types.h:315
static const bool IsQuat
Definition Types.h:313
SwappedCombineOp(CombineOp &_op)
Definition Types.h:728
void operator()(CombineArgs< ValueType > &args)
Definition Types.h:730
CombineOp & op
Definition Types.h:738
T ElementType
Definition Types.h:366
static const int Elements
Definition Types.h:365
static const bool IsVec
Definition Types.h:360
static const int Size
Definition Types.h:364
static const bool IsQuat
Definition Types.h:361
static const bool IsScalar
Definition Types.h:363
static const bool IsMat
Definition Types.h:362
Definition Types.h:347
static const int Elements
Definition Types.h:353
static const bool IsVec
Definition Types.h:348
static const int Size
Definition Types.h:352
typename T::ValueType ElementType
Definition Types.h:354
static const bool IsQuat
Definition Types.h:349
static const bool IsScalar
Definition Types.h:351
static const bool IsMat
Definition Types.h:350
T ElementType
Definition Types.h:307
static const bool IsVec
Definition Types.h:305
static const int Size
Definition Types.h:306
Definition Types.h:296
static const bool IsVec
Definition Types.h:297
static const int Size
Definition Types.h:298
typename T::ValueType ElementType
Definition Types.h:299
Re-implementation of C++17's index_sequence and the helper alias make_index_sequence....
Definition Types.h:275
Definition Types.h:503
Definition Types.h:510
math::half type
Definition Types.h:394
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition version.h.in:121
#define OPENVDB_USE_VERSION_NAMESPACE
Definition version.h.in:218