HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SIM_VolumeInstanceSource.h
Go to the documentation of this file.
1 /*
2  * PROPRIETARY INFORMATION. This software is proprietary to
3  * Side Effects Software Inc., and is not to be reproduced,
4  * transmitted, or disclosed in any way without written permission.
5  *
6  * NAME: SIM_VolumeInstanceSource.h ( SIMZ Library, C++)
7  *
8  * COMMENTS:
9  * SIM_SourceRule is a representation of a sourcing operation. This is
10  * based on the features available on the Volume Source DOP.
11  * SIM_SourceInstanceIterator can be used to iterate over source instances
12  * of its given geometry.
13  * SIM_VolumeInstanceSource implements a DOP that is able to perform
14  * instanced field sourcing on the CPU (using packed source sets and
15  * instance points). See SIM_OpenCLMergeVDB for a node that does the same
16  * on the GPU (using NanoVDB).
17  */
18 
19 #ifndef __SIM_VolumeInstanceSource__
20 #define __SIM_VolumeInstanceSource__
21 
22 #include "SIMZ_API.h"
23 
24 #include <GAS/GAS_SubSolver.h>
25 #include <SIM/SIM_RawField.h>
26 
27 /// This class encapsulates a volume merging rule.
29 {
30 public:
31  /// Creates a default, invalid rule.
33  /// Populates the fields of this rule with values from the dictionary. Keys
34  /// are parameter names from the Volume Source DOP.
35  void createFromDictionary(const UT_OptionsHolder& dict);
36 
37  /// Returns the scale that takes timestep normalization into account.
38  fpreal32 getScale(fpreal32 timestep) const;
39  /// Converts the respective pull strength into a blend value, taking the
40  /// timestep into account.
41  fpreal32 getAccGuideBlend(fpreal32 timestep) const;
42  fpreal32 getDecGuideBlend(fpreal32 timestep) const;
43  fpreal32 getDirGuideBlend(fpreal32 timestep) const;
44 
45  /// Returns true if this rule needs to work on the entire vector at once
46  /// (that is, the rule cannot be correctly applied to each component of the
47  /// vector separately).
48  bool needsEntireVector() const;
49 
50  /// Initializes the internal coefficients for the given timestep. This
51  /// function must be called before applyOperation(), blendValues(), or
52  /// blendValuesNoWeight() functions are useable.
53  void setTimestep(fpreal32 timestep);
54 
55  /// Applies the operation encoded in this rule and puts the result in dest.
56  /// Use blendValues() functions instead if this rule prescribes the BLEND
57  /// operation.
58  void applyOperation(fpreal32 source, fpreal32& dest) const;
59  void applyOperation(const UT_Vector3F& source,
60  UT_Vector3F& dest) const;
61 
62  /// Applies the blend operation of this rule and puts the results in dest,
63  /// dest_weight.
64  /// Use applyOperation() functions instead if this rule does not prescribe
65  /// the BLEND operation.
66  void blendValues(fpreal32 source, fpreal32& dest,
67  fpreal32 source_weight, fpreal32& dest_weight) const;
68  void blendValues(const UT_Vector3F& source, UT_Vector3F& dest,
69  fpreal32 source_weight, fpreal32& dest_weight) const;
70 
71  /// Returns a source rule to apply the weight update part of this blend
72  /// operation. The functor's applyOperation method can be used, but the rule
73  /// may not be fully initialized for other purposes!
74  SIM_SourceRule getWeightUpdateRule() const;
75 
76 public:
77  /// This enumeration lists the supported field ranks. Token order should
78  /// match the respective menu.
79  enum FieldRank
80  {
81  SCALAR = 0,
83  };
84 
85  /// This enumeration lists the available sourcing operations. Token order
86  /// should match the respective menu.
88  {
89  COPY = 0,
90  ADD,
100  };
101 
102 protected:
103  /// Coefficients for internal use. These values incorporate the timestep.
108 
109 public:
110  /// Rank of the target and source fields.
112  /// Name of the source volume.
114  /// Name of the source weight volume.
116  /// Name of the target DOP field.
118  /// Name of the target DOP weight field.
120  /// The merging operation.
122  /// Pull strength for acceleration.
124  /// Pull strength for deceleration.
126  /// Pull strength for directional guiding.
128  /// The final scale applied while merging.
130 
131  /// Is the rule active?
133  /// If using the pull operation with a vector field, independently pull the
134  /// vector magnitudes and directions towards the goal? If false, each vector
135  /// component is pulled separately.
137  /// When comparing vectors, use their norms? If false, each component is
138  /// compared separately.
139  bool myUseNorm;
140  /// Should instance velocities be added to the source values? Only relevant
141  /// if rank is set to vector.
143  /// Clamp negative numbers to 0 after merging? Only has an effect with the
144  /// SUBTRACT operation.
146  /// Use the timestep while merging?
148 
149  /// Was the rule fully initialized? This flag will be false if a critical
150  /// part of the rule was missing when this rule was created.
151  bool myIsValid;
152 };
153 
154 /// This class can be used to iterate over source instances in the given
155 /// geometry.
157 {
158 public:
159  /// Creates an invalid iterator. setGeometry() must be called before this
160  /// iterator can be used. need_rules must be true if source rules will be
161  /// required later. need_vel must be true if instance velocities are
162  /// required.
163  SIM_SourceInstanceIterator(bool need_rules = true, bool need_vel = false);
164  /// Creates the iterator and initializes it for the given geometry.
165  /// need_rules must be true if source rules will be required later. need_vel
166  /// must be true if instance velocities are required.
167  SIM_SourceInstanceIterator(const GA_Detail* gdp, bool need_rules = true,
168  bool need_vel = false);
169 
170  /// Initializes this iterator for the given geometry.
171  void setGeometry(const GA_Detail* gdp);
172  /// Returns true if and only if this iterator is valid. That is, if the
173  /// instance geometry has all of the required attributes.
174  bool isValid() const;
175 
176  /// Restarts the iterator. Must be called to start iteration.
177  void rewind();
178  /// Returns true if and only if the iterator is at the ned of the list of
179  /// instances.
180  bool atEnd() const;
181  /// Advances the iterator to the next instance.
182  void advance();
183 
184  /// Returns the name of the current instance.
185  UT_StringHolder getName() const;
186  /// Returns the frame offset for the current instance.
187  fpreal32 getFrameOffset() const;
188  /// Returns the position for the current instance.
189  UT_Vector3F getPosition() const;
190  /// Returns the orientation of the current instance.
191  UT_QuaternionF getOrientation() const;
192  /// Returns the pivot of the current instance.
193  UT_Vector3F getPivot() const;
194 
195  /// Get the number of rules that the current instance prescribes. The
196  /// iterator needs to be told on creation that rules are needed to use this
197  /// method.
198  int getNumberOfRules() const;
199  /// Get a specific rule for the current instance. rule is the index of to
200  /// acquire, and must be between 0 and getNumberOfRules()-1 (inclusive). The
201  /// iterator needs to be told on creation that rules are needed to use this
202  /// method.
203  SIM_SourceRule getRule(int rule) const;
204 
205  /// Do the instances have linear or angular velocity? Will return false if
206  /// this iterator was told velocities aren't needed on creation.
207  bool hasVelocity() const;
208  /// Returns linear velocity of this instance. The iterator needs to be told
209  /// on creation that velocities are needed to use this method.
210  UT_Vector3F getLinearVelocity() const;
211  /// Returns angular velocity of this instance. The iterator needs to be told
212  /// on creation that velocities are needed to use this method.
213  UT_Vector3F getAngularVelocity() const;
214 
215 protected:
216  /// Updates the internal array of rules when the iterator shifts position.
217  void updateRulesArray();
218 
219 protected:
225 
230 
234 
236 };
237 
238 /// This class can be used to check if tiles of the given raw field intersect
239 /// the bounding box of the instanced primitive.
241 {
242 public:
243  /// Create a new tester. initTester() must be called on the created object
244  /// before intersections can be checked.
246 
247  /// Gets this object ready to perform intersection tests. Intersection tests
248  /// are done for tiles of the field, against the oriented bounding box of
249  /// the instanced primitive.
250  void initTester(const SIM_RawField* field, const GEO_Primitive* prim,
251  const UT_Vector3& pos, const UT_Quaternion& orient,
252  const UT_Vector3& pivot);
253 
254  /// Returns true if the tile (a chunk of 16x16x16 voxels) of field starting
255  /// at the given world location intersects the instanced primitive.
256  /// This function checks the tile as if it were complete; it is thus a
257  /// conservative test.
258  bool intersectsTile(const UT_Vector3& p) const;
259 
260 private:
261  /// Center of the instanced primitive (offset by half tile size).
262  UT_Vector3F myPrimCenter;
263  /// Basis vectors rotated per the instancing attributes.
264  UT_Vector3F myPrimX, myPrimY, myPrimZ;
265 
266  /// The 15 interval overlap constants used for queries.
267  float myTileCompare[15];
268 };
269 
270 /// This class implements the intanced sourcing logic.
272 {
273 public:
274  GET_DATA_FUNC_B("createmissing", CreateMissingFields);
275  GET_DATA_FUNC_S("matchfield", FieldToMatch);
276  GET_DATA_FUNC_B("resizefields", EnlargeFields);
277  GET_DATA_FUNC_B("fulltiles", FullTiles);
278 
279  GET_DATA_FUNC_I("referenceframe", CollectFrame);
280  GET_DATA_FUNC_I("input", Input);
281  GET_DATA_FUNC_S("soppath", SopPath);
282  GET_DATA_FUNC_S("instgeo", InstanceGeo);
283 
284 protected:
285  explicit SIM_VolumeInstanceSource(const SIM_DataFactory* factory);
286  ~SIM_VolumeInstanceSource() override;
287 
288  bool solveGasSubclass(SIM_Engine& engine,
289  SIM_Object* obj,
290  SIM_Time time,
291  SIM_Time timestep) override;
292 
293 private:
294  /// This struct holds the maximum conainer bounds. When AStatus(i) is
295  /// nonzero, ALoc(i) corresponds to the location of the barrier beyond which
296  /// we may not resize.
297  struct sim_ContainerBounds
298  {
299  UT_Vector3 myMaxLoc;
300  UT_Vector3 myMaxStatus;
301  UT_Vector3 myMinLoc;
302  UT_Vector3 myMinStatus;
303  };
304  /// This struct holds the position, orientation, and pivot of an instance.
305  struct sim_InstanceLocation
306  {
307  UT_Vector3 myPosition;
308  UT_Quaternion myOrientation;
309  UT_Vector3 myPivot;
310  };
311  /// This struct holds the linear and angular velocities of an instance.
312  struct sim_InstanceVelocity
313  {
314  UT_Vector3 myLinVelocity;
315  UT_Vector3 myAngVelocity;
316  };
317 
318  /// Reads the container bounds data on the object and puts the result in a
319  /// sim_ContainerBounds. Returns true if the data could all be read in the
320  /// right format. If false is returned, bounds may have partial edits.
321  static bool getContainerBounds(const SIM_Object* obj,
322  sim_ContainerBounds& bounds);
323 
324  /// Merges a single scalar field. Returns true if the target field was
325  /// modified.
326  bool mergeNthScalarField(SIM_ScalarField* target, SIM_ScalarField* weight,
327  const sim_ContainerBounds* bounds,
328  const GU_Detail* gdp, const SIM_SourceRule& rule,
329  const sim_InstanceLocation& location, int n) const;
330  /// Merges a single vector field. Returns true if the target field was
331  /// modified.
332  bool mergeNthVectorField(SIM_VectorField* target, SIM_ScalarField* weight,
333  const sim_ContainerBounds* bounds,
334  const GU_Detail* gdp, const SIM_SourceRule& rule,
335  const sim_InstanceLocation& location,
336  const sim_InstanceVelocity& vel, int n) const;
337 
338  /// Merges a single component of the vector field, for operations that don't
339  /// need the entire vector.
340  THREADED_METHOD8_CONST(SIM_VolumeInstanceSource, dest->shouldMultiThread(),
341  mixEachVoxelVC,
342  SIM_RawField*, dest,
343  const GEO_Primitive**, sources,
344  int, component,
345  const SIM_SourceRule&, rule,
346  const sim_InstanceLocation&, location,
347  bool, use_vel,
348  const sim_InstanceVelocity&, velocity,
349  const sim_TileIntersectionTester&, tester);
350  void mixEachVoxelVCPartial(SIM_RawField* dest,
351  const GEO_Primitive* sources[3], int component,
352  const SIM_SourceRule& rule,
353  const sim_InstanceLocation& location,
354  bool use_vel,
355  const sim_InstanceVelocity& velocity,
356  const sim_TileIntersectionTester& tester,
357  const UT_JobInfo& info) const;
358 
359  /// Merges a single component of the vector field, for operations that don't
360  /// need the entire vector. This function treats the source vector field as
361  /// contravariant.
363  mixEachVoxelVCContravariant,
364  SIM_RawField*, dest,
365  const GEO_Primitive**, sources,
366  int, component,
367  const SIM_SourceRule&, rule,
368  const sim_InstanceLocation&, location,
369  bool, use_vel,
370  const sim_InstanceVelocity&, velocity,
371  const sim_TileIntersectionTester&, tester);
372  void mixEachVoxelVCContravariantPartial(SIM_RawField* dest,
373  const GEO_Primitive* sources[3], int component,
374  const SIM_SourceRule& rule,
375  const sim_InstanceLocation& location,
376  bool use_vel,
377  const sim_InstanceVelocity& velocity,
378  const sim_TileIntersectionTester& tester,
379  const UT_JobInfo& info) const;
380 
381  /// Merges a single component of the vector field, for operations that need
382  /// the entire vector.
384  mixEachVoxelVC,
385  SIM_RawField*, dest,
386  SIM_RawField**, old_fields,
387  const GEO_Primitive**, sources,
388  int, component,
389  const SIM_SourceRule&, rule,
390  const sim_InstanceLocation&, location,
391  bool, use_vel,
392  const sim_InstanceVelocity&, velocity,
393  const sim_TileIntersectionTester&, tester,
394  bool, contravariant);
395  void mixEachVoxelVCPartial(SIM_RawField* dest,
396  SIM_RawField* old_fields[3],
397  const GEO_Primitive* sources[3], int component,
398  const SIM_SourceRule& rule,
399  const sim_InstanceLocation& location,
400  bool use_vel,
401  const sim_InstanceVelocity& velocity,
402  const sim_TileIntersectionTester& tester,
403  bool contravariant,
404  const UT_JobInfo& info) const;
405 
406  /// Merges all components of a vector field. The components must have
407  /// collocated samples.
409  dest[0]->shouldMultiThread(),
410  mixEachVoxelV,
411  SIM_RawField**, dest,
412  const GEO_Primitive**, sources,
413  const SIM_SourceRule&, rule,
414  const sim_InstanceLocation&, location,
415  bool, use_vel,
416  const sim_InstanceVelocity&, velocity,
417  const sim_TileIntersectionTester&, tester,
418  bool, contravariant);
419  void mixEachVoxelVPartial(SIM_RawField* dest[3],
420  const GEO_Primitive* sources[3],
421  const SIM_SourceRule& rule,
422  const sim_InstanceLocation& location,
423  bool use_vel,
424  const sim_InstanceVelocity& velocity,
425  const sim_TileIntersectionTester& tester,
426  bool contravariant,
427  const UT_JobInfo& info) const;
428 
429  /// Merges a vector field, when the operation is set to blend. This method
430  /// works on a single component and doesn't update the weight field.
432  target->shouldMultiThread(),
433  blendEachVoxelVCNoWeight,
435  const SIM_RawField*, weight,
436  const GEO_Primitive**, prims,
437  const GEO_Primitive*, weight_prim,
438  int, component,
439  const SIM_SourceRule&, rule,
440  const sim_InstanceLocation&, location,
441  bool, use_vel,
442  const sim_InstanceVelocity&, velocity,
443  const sim_TileIntersectionTester&, tester);
444  void blendEachVoxelVCNoWeightPartial(SIM_RawField* target,
445  const SIM_RawField* weight,
446  const GEO_Primitive* prims[3],
447  const GEO_Primitive* weight_prim,
448  int component,
449  const SIM_SourceRule& rule,
450  const sim_InstanceLocation& location,
451  bool use_vel,
452  const sim_InstanceVelocity& velocity,
454  const UT_JobInfo& info) const;
455 
456  /// Merges a vector field, when the operation is set to blend. This method
457  /// works on a single component (from a contravariant source) and doesn't
458  /// update the weight field.
460  target->shouldMultiThread(),
461  blendEachVoxelVCNoWeightContravariant,
463  const SIM_RawField*, weight,
464  const GEO_Primitive**, prims,
465  const GEO_Primitive*, weight_prim,
466  int, component,
467  const SIM_SourceRule&, rule,
468  const sim_InstanceLocation&, location,
469  bool, use_vel,
470  const sim_InstanceVelocity&, velocity,
471  const sim_TileIntersectionTester&, tester);
472  void blendEachVoxelVCNoWeightContravariantPartial(SIM_RawField* target,
473  const SIM_RawField* weight,
474  const GEO_Primitive* prims[3],
475  const GEO_Primitive* weight_prim,
476  int component,
477  const SIM_SourceRule& rule,
478  const sim_InstanceLocation& location,
479  bool use_vel,
480  const sim_InstanceVelocity& velocity,
481  const sim_TileIntersectionTester& test,
482  const UT_JobInfo& info) const;
483 
484  /// Merges a vector field, when the operation is set to blend. This method
485  /// works on all components of the field at once (so the field must be
486  /// collocated), but does not update the weight field.
488  targets[0]->shouldMultiThread(),
489  blendEachVoxelVNoWeight,
490  SIM_RawField**, targets,
491  const SIM_RawField*, weight,
492  const GEO_Primitive**, prims,
493  const GEO_Primitive*, weight_prim,
494  const SIM_SourceRule&, rule,
495  const sim_InstanceLocation&, location,
496  bool, use_vel,
497  const sim_InstanceVelocity&, velocity,
498  const sim_TileIntersectionTester&, test,
499  bool, contravariant);
500  void blendEachVoxelVNoWeightPartial(SIM_RawField* targets[3],
501  const SIM_RawField* weight,
502  const GEO_Primitive* prims[3],
503  const GEO_Primitive* weight_prim,
504  const SIM_SourceRule& rule,
505  const sim_InstanceLocation& location,
506  bool use_vel,
507  const sim_InstanceVelocity& velocity,
508  const sim_TileIntersectionTester& test,
509  bool contravariant,
510  const UT_JobInfo& info) const;
511 
512  /// Merges the vector field, when the operation is set to blend. This method
513  /// works on all components at once and updates the weights as well (so all
514  /// raw fields must be aligned).
516  targets[0]->shouldMultiThread(),
517  blendEachVoxelV,
518  SIM_RawField**, targets,
519  SIM_RawField*, weight,
520  const GEO_Primitive**, prims,
521  const GEO_Primitive*, weight_prim,
522  const SIM_SourceRule&, rule,
523  const sim_InstanceLocation&, location,
524  bool, use_vel,
525  const sim_InstanceVelocity&, velocity,
526  const sim_TileIntersectionTester&, tester,
527  bool, contravariant);
528  void blendEachVoxelVPartial(SIM_RawField* targets[3],
529  SIM_RawField* weight,
530  const GEO_Primitive* prims[3],
531  const GEO_Primitive* weight_prim,
532  const SIM_SourceRule& rule,
533  const sim_InstanceLocation& location,
534  bool use_vel,
535  const sim_InstanceVelocity& velocity,
536  const sim_TileIntersectionTester& tester,
537  bool contravariant, const UT_JobInfo& info)
538  const;
539 
540  /// Merges a scalar field.
542  mixEachVoxel,
543  SIM_RawField*, dest,
544  const GEO_Primitive*, source,
545  const SIM_SourceRule&, rule,
546  const sim_InstanceLocation&, location,
547  const sim_TileIntersectionTester&, tester);
548  void mixEachVoxelPartial(SIM_RawField* dest, const GEO_Primitive* source,
549  const SIM_SourceRule& rule,
550  const sim_InstanceLocation& location,
551  const sim_TileIntersectionTester& tester,
552  const UT_JobInfo& info) const;
553 
554  /// Merges a scalar field, when the operation is set to blend. This method
555  /// also updates the weight field (so target and weight must be aligned).
557  blendEachVoxel,
558  SIM_RawField*, dest,
559  SIM_RawField*, weight,
560  const GEO_Primitive*, prim,
561  const GEO_Primitive*, weight_prim,
562  const SIM_SourceRule&, rule,
563  const sim_InstanceLocation&, location,
564  const sim_TileIntersectionTester&, tester);
565  void blendEachVoxelPartial(SIM_RawField* target, SIM_RawField* weight,
566  const GEO_Primitive* prim,
567  const GEO_Primitive* weightp,
568  const SIM_SourceRule& rule,
569  const sim_InstanceLocation& location,
570  const sim_TileIntersectionTester& tester,
571  const UT_JobInfo& info) const;
572 
573  /// Merges a scalar field, when operation is set to blend. This method does
574  /// not write to the weight field.
576  blendEachVoxelNoWeight,
577  SIM_RawField*, dest,
578  const SIM_RawField*, weight,
579  const GEO_Primitive*, prim,
580  const GEO_Primitive*, weight_prim,
581  const SIM_SourceRule&, rule,
582  const sim_InstanceLocation&, location,
583  const sim_TileIntersectionTester&, tester);
584  void blendEachVoxelNoWeightPartial(SIM_RawField* target,
585  const SIM_RawField* weight,
586  const GEO_Primitive* prim,
587  const GEO_Primitive* weightp,
588  const SIM_SourceRule& rule,
589  const sim_InstanceLocation& location,
590  const sim_TileIntersectionTester& tester,
591  const UT_JobInfo& info) const;
592 
593  /// Creates a new field (of type FIELD) that matches scalar or vector (one
594  /// of the two must be valid).
595  template <typename FIELD>
596  void createField(FIELD*& f, const SIM_ScalarField* scalar,
597  const SIM_VectorField* vector, const UT_StringHolder& name,
598  SIM_Object& obj);
599 
600  /// Enlarges the given field to make sure its bounding box contains the
601  /// instanced primitive.
602  template <typename FIELD>
603  void resizeFieldIfNeeded(FIELD* field,
604  const sim_ContainerBounds* bounds,
605  const GEO_Primitive* prim,
606  const sim_InstanceLocation& location) const;
607 
608 private:
609  static const SIM_DopDescription* getDopDescription();
610 
613  "Volume Instance Source",
614  getDopDescription());
615 };
616 
617 #endif
618 
#define SIMZ_API
Definition: SIMZ_API.h:10
#define THREADED_METHOD8_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7, PARMTYPE8, PARMNAME8)
#define DECLARE_STANDARD_GETCASTTOTYPE()
Definition: SIM_DataUtils.h:50
typedef int(APIENTRYP RE_PFNGLXSWAPINTERVALSGIPROC)(int)
cvex test(vector P=0;int unbound=3;export float s=0;export vector Cf=0;)
Definition: test.vfl:11
Iteration over a range of elements.
Definition: GA_Iterator.h:29
bool intersectsTile(const UT_Vector3 &p) const
fpreal32 myAccGuideStr
Pull strength for acceleration.
GT_API const UT_StringHolder time
bool myActivate
Is the rule active?
UT_Array< UT_OptionsHolder > myRulesArray
virtual bool solveGasSubclass(SIM_Engine &engine, SIM_Object *obj, SIM_Time time, SIM_Time timestep)=0
This class encapsulates a volume merging rule.
float fpreal32
Definition: SYS_Types.h:200
bool shouldMultiThread() const
Returns true if this should be multithreaded.
Definition: SIM_RawField.h:151
void initTester(const SIM_RawField *field, const GEO_Primitive *prim, const UT_Vector3 &pos, const UT_Quaternion &orient, const UT_Vector3 &pivot)
#define THREADED_METHOD5_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5)
UT_StringHolder myTargetField
Name of the target DOP field.
#define DECLARE_DATAFACTORY(DataClass, SuperClass, Description, DopParms)
Definition: SIM_DataUtils.h:63
GLdouble n
Definition: glcorearb.h:2008
GLsizei GLenum * sources
Definition: glcorearb.h:2542
GLfloat f
Definition: glcorearb.h:1926
fpreal32 myFinalScale
Coefficients for internal use. These values incorporate the timestep.
fpreal32 myDirGuideStr
Pull strength for directional guiding.
#define GET_DATA_FUNC_I(DataName, FuncName)
#define THREADED_METHOD7_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7)
UT_StringHolder mySourceWeight
Name of the source weight volume.
PXL_API const char * getName(const ColorSpace *space)
Return the name of the color space.
#define THREADED_METHOD10_CONST(CLASSNAME, DOMULTI, METHOD, PARMTYPE1, PARMNAME1, PARMTYPE2, PARMNAME2, PARMTYPE3, PARMNAME3, PARMTYPE4, PARMNAME4, PARMTYPE5, PARMNAME5, PARMTYPE6, PARMNAME6, PARMTYPE7, PARMNAME7, PARMTYPE8, PARMNAME8, PARMTYPE9, PARMNAME9, PARMTYPE10, PARMNAME10)
GLsizei GLsizei GLchar * source
Definition: glcorearb.h:803
GLint location
Definition: glcorearb.h:805
GLenum target
Definition: glcorearb.h:1667
SourceOperation myOperation
The merging operation.
UT_StringHolder myTargetWeight
Name of the target DOP weight field.
GLuint const GLchar * name
Definition: glcorearb.h:786
fpreal32 myScale
The final scale applied while merging.
GA_API const UT_StringHolder orient
#define SCALAR(T)
Simplify checking for scalar types.
Definition: GA_Handle.h:498
UT_StringHolder mySourceField
Name of the source volume.
#define GET_DATA_FUNC_B(DataName, FuncName)
fpreal32 myDecGuideStr
Pull strength for deceleration.
This class holds a three dimensional scalar field.
Vec3< typename MatType::value_type > getScale(const MatType &mat)
Return a Vec3 representing the lengths of the passed matrix's upper 3×3's rows.
Definition: Mat.h:633
GA_API const UT_StringHolder pivot
Container class for all geometry.
Definition: GA_Detail.h:96
This class holds a three dimensional vector field.
#define GET_DATA_FUNC_S(DataName, FuncName)
This class implements the intanced sourcing logic.
FieldRank myRank
Rank of the target and source fields.
bool myNormalizeTimestep
Use the timestep while merging?