OpenVDB 13.0.1
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
381/// @cond OPENVDB_DOCS_INTERNAL
382
383namespace types_internal
384{
385template <size_t Bits, bool Signed> struct int_t;
386template <> struct int_t<8ul, true> { using type = int8_t; };
387template <> struct int_t<16ul, true> { using type = int16_t; };
388template <> struct int_t<32ul, true> { using type = int32_t; };
389template <> struct int_t<64ul, true> { using type = int64_t; };
390template <> struct int_t<8ul, false> { using type = uint8_t; };
391template <> struct int_t<16ul, false> { using type = uint16_t; };
392template <> struct int_t<32ul, false> { using type = uint32_t; };
393template <> struct int_t<64ul, false> { using type = uint64_t; };
394
395template <size_t Bits> struct flt_t;
396template <> struct flt_t<16ul> { using type = math::half; };
397template <> struct flt_t<32ul> { using type = float; };
398template <> struct flt_t<64ul> { using type = double; };
399}
400
401/// @endcond
402
403/// @brief Promotion classes which provide an interface for elevating and
404/// demoting a scalar or VDB type to a higher or lower precision. Integer
405/// types preserve their sign. Types promotion are only valid between
406/// 8 to 64 bits (long doubles are not supported).
407/// @{
408template<typename T>
410{
411private:
412 template <size_t bits>
413 using TypeT = typename std::conditional<std::is_integral<T>::value,
414 types_internal::int_t<bits, std::is_signed<T>::value>,
415 types_internal::flt_t<std::max(size_t(16), bits)>>::type;
416public:
417 static_assert(sizeof(T) <= 8ul, "Unsupported source type for promotion");
418
419#define OPENVDB_TARGET_BITS(SHIFT, PROMOTE) \
420 std::max(size_t(8), \
421 std::min(size_t(64), (PROMOTE ? size_t(8)*(sizeof(T)<<SHIFT) : \
422 size_t(8)*(sizeof(T)>>SHIFT))))
423 template <size_t Shift = ~0UL> using Promote = typename TypeT<OPENVDB_TARGET_BITS(Shift, true)>::type;
424 template <size_t Shift = ~0UL> using Demote = typename TypeT<OPENVDB_TARGET_BITS(Shift, false)>::type;
425#undef OPENVDB_TARGET_BITS
426
427 using Highest = typename TypeT<64ul>::type;
428 using Lowest = typename TypeT<8ul>::type;
431};
432
433template <typename T, template <typename> class ContainerT>
435{
436 template <size_t Shift = ~0UL> using Promote = ContainerT<typename PromoteType<T>::template Promote<Shift>>;
437 template <size_t Shift = ~0UL> using Demote = ContainerT<typename PromoteType<T>::template Demote<Shift>>;
438 using Highest = ContainerT<typename PromoteType<T>::Highest>;
439 using Lowest = ContainerT<typename PromoteType<T>::Lowest>;
440 using Next = ContainerT<typename PromoteType<T>::Next>;
441 using Previous = ContainerT<typename PromoteType<T>::Previous>;
442};
443
444template<typename T> struct PromoteType<math::Vec2<T>> : public PromoteContainerType<T, math::Vec2> {};
445template<typename T> struct PromoteType<math::Vec3<T>> : public PromoteContainerType<T, math::Vec3> {};
446template<typename T> struct PromoteType<math::Vec4<T>> : public PromoteContainerType<T, math::Vec4> {};
447template<typename T> struct PromoteType<math::Quat<T>> : public PromoteContainerType<T, math::Quat> {};
448template<typename T> struct PromoteType<math::Mat3<T>> : public PromoteContainerType<T, math::Mat3> {};
449template<typename T> struct PromoteType<math::Mat4<T>> : public PromoteContainerType<T, math::Mat4> {};
450/// @}
451
452
453////////////////////////////////////////
454
455
456/// @brief CanConvertType<FromType, ToType>::value is @c true if a value
457/// of type @a ToType can be constructed from a value of type @a FromType.
458template<typename FromType, typename ToType>
459struct CanConvertType { enum { value = std::is_constructible<ToType, FromType>::value }; };
460
461// Specializations for vector types, which can be constructed from values
462// of their own ValueTypes (or values that can be converted to their ValueTypes),
463// but only explicitly
464template<typename T> struct CanConvertType<T, math::Vec2<T> > { enum { value = true }; };
465template<typename T> struct CanConvertType<T, math::Vec3<T> > { enum { value = true }; };
466template<typename T> struct CanConvertType<T, math::Vec4<T> > { enum { value = true }; };
467template<typename T> struct CanConvertType<math::Vec2<T>, math::Vec2<T> > { enum {value = true}; };
468template<typename T> struct CanConvertType<math::Vec3<T>, math::Vec3<T> > { enum {value = true}; };
469template<typename T> struct CanConvertType<math::Vec4<T>, math::Vec4<T> > { enum {value = true}; };
470template<typename T0, typename T1>
471struct CanConvertType<T0, math::Vec2<T1> > { enum { value = CanConvertType<T0, T1>::value }; };
472template<typename T0, typename T1>
473struct CanConvertType<T0, math::Vec3<T1> > { enum { value = CanConvertType<T0, T1>::value }; };
474template<typename T0, typename T1>
475struct CanConvertType<T0, math::Vec4<T1> > { enum { value = CanConvertType<T0, T1>::value }; };
476template<> struct CanConvertType<PointIndex32, PointDataIndex32> { enum {value = true}; };
477template<> struct CanConvertType<PointDataIndex32, PointIndex32> { enum {value = true}; };
478template<typename T>
480template<typename T>
482
483
484////////////////////////////////////////
485
486
487/// @brief CopyConstness<T1, T2>::Type is either <tt>const T2</tt>
488/// or @c T2 with no @c const qualifier, depending on whether @c T1 is @c const.
489/// @details For example,
490/// - CopyConstness<int, int>::Type is @c int
491/// - CopyConstness<int, const int>::Type is @c int
492/// - CopyConstness<const int, int>::Type is <tt>const int</tt>
493/// - CopyConstness<const int, const int>::Type is <tt>const int</tt>
494template<typename FromType, typename ToType> struct CopyConstness {
495 using Type = typename std::remove_const<ToType>::type;
496};
497
498/// @cond OPENVDB_DOCS_INTERNAL
499template<typename FromType, typename ToType> struct CopyConstness<const FromType, ToType> {
500 using Type = const ToType;
501};
502/// @endcond
503
504
505////////////////////////////////////////
506template<class T>
507struct is_floating_point : std::is_floating_point<T> { };
508
509template<>
510struct is_floating_point<Half> : std::is_floating_point<float> { };
511
512
513template<class T>
514struct is_signed : std::is_signed<T> { };
515
516template<>
517struct is_signed<Half> : std::is_signed<float> { };
518
519
520////////////////////////////////////////
521
522
523// Add new items to the *end* of this list, and update NUM_GRID_CLASSES.
531
532static const Real LEVEL_SET_HALF_WIDTH = 3;
533
534/// The type of a vector determines how transforms are applied to it:
535/// <dl>
536/// <dt><b>Invariant</b>
537/// <dd>Does not transform (e.g., tuple, uvw, color)
538///
539/// <dt><b>Covariant</b>
540/// <dd>Apply inverse-transpose transformation: @e w = 0, ignores translation
541/// (e.g., gradient/normal)
542///
543/// <dt><b>Covariant Normalize</b>
544/// <dd>Apply inverse-transpose transformation: @e w = 0, ignores translation,
545/// vectors are renormalized (e.g., unit normal)
546///
547/// <dt><b>Contravariant Relative</b>
548/// <dd>Apply "regular" transformation: @e w = 0, ignores translation
549/// (e.g., displacement, velocity, acceleration)
550///
551/// <dt><b>Contravariant Absolute</b>
552/// <dd>Apply "regular" transformation: @e w = 1, vector translates (e.g., position)
553/// </dl>
562
563
564/// Specify how grids should be merged during certain (typically multithreaded) operations.
565/// <dl>
566/// <dt><b>MERGE_ACTIVE_STATES</b>
567/// <dd>The output grid is active wherever any of the input grids is active.
568///
569/// <dt><b>MERGE_NODES</b>
570/// <dd>The output grid's tree has a node wherever any of the input grids' trees
571/// has a node, regardless of any active states.
572///
573/// <dt><b>MERGE_ACTIVE_STATES_AND_NODES</b>
574/// <dd>The output grid is active wherever any of the input grids is active,
575/// and its tree has a node wherever any of the input grids' trees has a node.
576/// </dl>
582
583
584////////////////////////////////////////
585
586
587template<typename T> const char* typeNameAsString() { return typeid(T).name(); }
588template<> inline const char* typeNameAsString<bool>() { return "bool"; }
589template<> inline const char* typeNameAsString<ValueMask>() { return "mask"; }
590template<> inline const char* typeNameAsString<math::half>() { return "half"; }
591template<> inline const char* typeNameAsString<float>() { return "float"; }
592template<> inline const char* typeNameAsString<double>() { return "double"; }
593template<> inline const char* typeNameAsString<int8_t>() { return "int8"; }
594template<> inline const char* typeNameAsString<uint8_t>() { return "uint8"; }
595template<> inline const char* typeNameAsString<int16_t>() { return "int16"; }
596template<> inline const char* typeNameAsString<uint16_t>() { return "uint16"; }
597template<> inline const char* typeNameAsString<int32_t>() { return "int32"; }
598template<> inline const char* typeNameAsString<uint32_t>() { return "uint32"; }
599template<> inline const char* typeNameAsString<int64_t>() { return "int64"; }
600template<> inline const char* typeNameAsString<Vec2i>() { return "vec2i"; }
601template<> inline const char* typeNameAsString<Vec2s>() { return "vec2s"; }
602template<> inline const char* typeNameAsString<Vec2d>() { return "vec2d"; }
603template<> inline const char* typeNameAsString<Vec3U8>() { return "vec3u8"; }
604template<> inline const char* typeNameAsString<Vec3U16>() { return "vec3u16"; }
605template<> inline const char* typeNameAsString<Vec3i>() { return "vec3i"; }
606template<> inline const char* typeNameAsString<Vec3f>() { return "vec3s"; }
607template<> inline const char* typeNameAsString<Vec3d>() { return "vec3d"; }
608template<> inline const char* typeNameAsString<Vec4i>() { return "vec4i"; }
609template<> inline const char* typeNameAsString<Vec4f>() { return "vec4s"; }
610template<> inline const char* typeNameAsString<Vec4d>() { return "vec4d"; }
611template<> inline const char* typeNameAsString<std::string>() { return "string"; }
612template<> inline const char* typeNameAsString<Mat3s>() { return "mat3s"; }
613template<> inline const char* typeNameAsString<Mat3d>() { return "mat3d"; }
614template<> inline const char* typeNameAsString<Mat4s>() { return "mat4s"; }
615template<> inline const char* typeNameAsString<Mat4d>() { return "mat4d"; }
616template<> inline const char* typeNameAsString<math::Quats>() { return "quats"; }
617template<> inline const char* typeNameAsString<math::Quatd>() { return "quatd"; }
618template<> inline const char* typeNameAsString<PointIndex32>() { return "ptidx32"; }
619template<> inline const char* typeNameAsString<PointIndex64>() { return "ptidx64"; }
620template<> inline const char* typeNameAsString<PointDataIndex32>() { return "ptdataidx32"; }
621template<> inline const char* typeNameAsString<PointDataIndex64>() { return "ptdataidx64"; }
622
623
624////////////////////////////////////////
625
626
627/// @brief This struct collects both input and output arguments to "grid combiner" functors
628/// used with the tree::TypedGrid::combineExtended() and combine2Extended() methods.
629/// AValueType and BValueType are the value types of the two grids being combined.
630///
631/// @see openvdb/tree/Tree.h for usage information.
632///
633/// Setter methods return references to this object, to facilitate the following usage:
634/// @code
635/// CombineArgs<float> args;
636/// myCombineOp(args.setARef(aVal).setBRef(bVal).setAIsActive(true).setBIsActive(false));
637/// @endcode
638template<typename AValueType, typename BValueType = AValueType>
640{
641public:
642 using AValueT = AValueType;
643 using BValueT = BValueType;
644
646 : mAValPtr(nullptr)
647 , mBValPtr(nullptr)
649 , mAIsActive(false)
650 , mBIsActive(false)
651 , mResultIsActive(false)
652 {
653 }
654
655 /// Use this constructor when the result value is stored externally.
656 CombineArgs(const AValueType& a, const BValueType& b, AValueType& result,
657 bool aOn = false, bool bOn = false)
658 : mAValPtr(&a)
659 , mBValPtr(&b)
661 , mAIsActive(aOn)
662 , mBIsActive(bOn)
663 {
664 this->updateResultActive();
665 }
666
667 /// Use this constructor when the result value should be stored in this struct.
668 CombineArgs(const AValueType& a, const BValueType& b, bool aOn = false, bool bOn = false)
669 : mAValPtr(&a)
670 , mBValPtr(&b)
672 , mAIsActive(aOn)
673 , mBIsActive(bOn)
674 {
675 this->updateResultActive();
676 }
677
678 /// Get the A input value.
679 const AValueType& a() const { return *mAValPtr; }
680 /// Get the B input value.
681 const BValueType& b() const { return *mBValPtr; }
682 //@{
683 /// Get the output value.
684 const AValueType& result() const { return *mResultValPtr; }
685 AValueType& result() { return *mResultValPtr; }
686 //@}
687
688 /// Set the output value.
689 CombineArgs& setResult(const AValueType& val) { *mResultValPtr = val; return *this; }
690
691 /// Redirect the A value to a new external source.
692 CombineArgs& setARef(const AValueType& a) { mAValPtr = &a; return *this; }
693 /// Redirect the B value to a new external source.
694 CombineArgs& setBRef(const BValueType& b) { mBValPtr = &b; return *this; }
695 /// Redirect the result value to a new external destination.
696 CombineArgs& setResultRef(AValueType& val) { mResultValPtr = &val; return *this; }
697
698 /// @return true if the A value is active
699 bool aIsActive() const { return mAIsActive; }
700 /// @return true if the B value is active
701 bool bIsActive() const { return mBIsActive; }
702 /// @return true if the output value is active
703 bool resultIsActive() const { return mResultIsActive; }
704
705 /// Set the active state of the A value.
707 /// Set the active state of the B value.
709 /// Set the active state of the output value.
710 CombineArgs& setResultIsActive(bool b) { mResultIsActive = b; return *this; }
711
712protected:
713 /// By default, the result value is active if either of the input values is active,
714 /// but this behavior can be overridden by calling setResultIsActive().
716
717 const AValueType* mAValPtr; // pointer to input value from A grid
718 const BValueType* mBValPtr; // pointer to input value from B grid
719 AValueType mResultVal; // computed output value (unused if stored externally)
720 AValueType* mResultValPtr; // pointer to either mResultVal or an external value
721 bool mAIsActive, mBIsActive; // active states of A and B values
722 bool mResultIsActive; // computed active state (default: A active || B active)
723};
724
725
726/// This struct adapts a "grid combiner" functor to swap the A and B grid values
727/// (e.g., so that if the original functor computes a + 2 * b, the adapted functor
728/// will compute b + 2 * a).
729template<typename ValueType, typename CombineOp>
731{
732 SwappedCombineOp(CombineOp& _op): op(_op) {}
733
735 {
736 CombineArgs<ValueType> swappedArgs(args.b(), args.a(), args.result(),
737 args.bIsActive(), args.aIsActive());
738 op(swappedArgs);
739 args.setResultIsActive(swappedArgs.resultIsActive());
740 }
741
742 CombineOp& op;
743};
744
745
746////////////////////////////////////////
747
748
749/// @brief Tag dispatch class that distinguishes shallow copy constructors
750/// from deep copy constructors
751class ShallowCopy {};
752/// @brief Tag dispatch class that distinguishes topology copy constructors
753/// from deep copy constructors
755/// @brief Tag dispatch class that distinguishes constructors that deep copy
756class DeepCopy {};
757/// @brief Tag dispatch class that distinguishes constructors that steal
758class Steal {};
759/// @brief Tag dispatch class that distinguishes constructors during file input
761
762// For half compilation
763namespace math {
764template<>
765inline auto cwiseAdd(const Vec3H& v, const float s)
766{
767 Vec3H out;
768 const Half* ip = v.asPointer();
769 Half* op = out.asPointer();
770 for (unsigned i = 0; i < 3; ++i, ++op, ++ip) {
772 *op = *ip + s;
774 }
775 return out;
776}
777} // namespace math
778
779} // namespace OPENVDB_VERSION_NAME
780} // namespace openvdb
781
782
783#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:640
CombineArgs & setARef(const AValueType &a)
Redirect the A value to a new external source.
Definition Types.h:692
bool bIsActive() const
Definition Types.h:701
const AValueType & result() const
Get the output value.
Definition Types.h:684
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:656
bool mAIsActive
Definition Types.h:721
AValueType * mResultValPtr
Definition Types.h:720
void updateResultActive()
Definition Types.h:715
CombineArgs & setResultIsActive(bool b)
Set the active state of the output value.
Definition Types.h:710
const AValueType * mAValPtr
Definition Types.h:717
AValueType mResultVal
Definition Types.h:719
bool aIsActive() const
Definition Types.h:699
bool mBIsActive
Definition Types.h:721
CombineArgs & setBIsActive(bool b)
Set the active state of the B value.
Definition Types.h:708
const BValueType & b() const
Get the B input value.
Definition Types.h:681
const BValueType * mBValPtr
Definition Types.h:718
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:668
CombineArgs & setResultRef(AValueType &val)
Redirect the result value to a new external destination.
Definition Types.h:696
AValueType & result()
Definition Types.h:685
AValueType AValueT
Definition Types.h:642
CombineArgs & setBRef(const BValueType &b)
Redirect the B value to a new external source.
Definition Types.h:694
const AValueType & a() const
Get the A input value.
Definition Types.h:679
bool resultIsActive() const
Definition Types.h:703
bool mResultIsActive
Definition Types.h:722
BValueType BValueT
Definition Types.h:643
CombineArgs()
Definition Types.h:645
CombineArgs & setResult(const AValueType &val)
Set the output value.
Definition Types.h:689
CombineArgs & setAIsActive(bool b)
Set the active state of the A value.
Definition Types.h:706
Tag dispatch class that distinguishes constructors that deep copy.
Definition Types.h:756
Tag dispatch class that distinguishes constructors during file input.
Definition Types.h:760
Tag dispatch class that distinguishes shallow copy constructors from deep copy constructors.
Definition Types.h:751
Tag dispatch class that distinguishes constructors that steal.
Definition Types.h:758
Tag dispatch class that distinguishes topology copy constructors from deep copy constructors.
Definition Types.h:754
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:763
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:765
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
static const Real LEVEL_SET_HALF_WIDTH
Definition Types.h:532
math::Vec4< float > Vec4f
Definition Types.h:70
Index32 Index
Definition Types.h:34
math::Vec4< Index32 > Vec4I
Definition Types.h:69
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:524
@ GRID_FOG_VOLUME
Definition Types.h:527
@ GRID_STAGGERED
Definition Types.h:528
@ GRID_LEVEL_SET
Definition Types.h:526
@ GRID_UNKNOWN
Definition Types.h:525
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::decay_t< decltype(make_index_sequence_impl< N >())> make_index_sequence
Definition Types.h:285
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:530
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:577
@ MERGE_ACTIVE_STATES
Definition Types.h:578
@ MERGE_NODES
Definition Types.h:579
@ MERGE_ACTIVE_STATES_AND_NODES
Definition Types.h:580
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:554
@ VEC_CONTRAVARIANT_ABSOLUTE
Definition Types.h:559
@ VEC_CONTRAVARIANT_RELATIVE
Definition Types.h:558
@ VEC_COVARIANT
Definition Types.h:556
@ VEC_COVARIANT_NORMALIZE
Definition Types.h:557
@ VEC_INVARIANT
Definition Types.h:555
@ NUM_VEC_TYPES
Definition Types.h:561
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:587
PointIndex< Index32, 1 > PointDataIndex32
Definition Types.h:162
Definition Exceptions.h:13
#define OPENVDB_TARGET_BITS(SHIFT, PROMOTE)
Definition Types.h:419
CanConvertType<FromType, ToType>::value is true if a value of type ToType can be constructed from a v...
Definition Types.h:459
@ value
Definition Types.h:459
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:494
typename std::remove_const< ToType >::type Type
Definition Types.h:495
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:441
ContainerT< typename PromoteType< T >::template Demote< Shift > > Demote
Definition Types.h:437
ContainerT< typename PromoteType< T >::Highest > Highest
Definition Types.h:438
ContainerT< typename PromoteType< T >::Lowest > Lowest
Definition Types.h:439
ContainerT< typename PromoteType< T >::Next > Next
Definition Types.h:440
ContainerT< typename PromoteType< T >::template Promote< Shift > > Promote
Definition Types.h:436
Promotion classes which provide an interface for elevating and demoting a scalar or VDB type to a hig...
Definition Types.h:410
Promote< 1 > Next
Definition Types.h:429
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:423
Demote< 1 > Previous
Definition Types.h:430
typename TypeT< 8ul >::type Lowest
Definition Types.h:428
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:424
typename TypeT< 64ul >::type Highest
Definition Types.h:427
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:732
void operator()(CombineArgs< ValueType > &args)
Definition Types.h:734
CombineOp & op
Definition Types.h:742
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:507
Definition Types.h:514
#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