00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef __SIM_ForceVortex_h__
00017 #define __SIM_ForceVortex_h__
00018
00019 #include "SIM_API.h"
00020 #include "SIM_Force.h"
00021 #include "SIM_OptionsUser.h"
00022
00023 #include <UT/UT_ThreadedAlgorithm.h>
00024
00025 class GU_RayIntersect;
00026 class GU_MinInfo;
00027
00028 class UT_FloatArray;
00029 class UT_Vector3Array;
00030
00031
00032
00033
00034 class SIM_API SIM_ForceVortex : public SIM_Force,
00035 public SIM_OptionsUser
00036 {
00037 public:
00038
00039 GETSET_DATA_FUNCS_S(SIM_NAME_RADIUS, RadiusAttribName);
00040
00041 GETSET_DATA_FUNCS_S(SIM_NAME_VELOCITY, VelocityAttribName);
00042
00043 GETSET_DATA_FUNCS_I(SIM_NAME_VELOCITYTYPE, VelocityType);
00044
00045 GETSET_DATA_FUNCS_S(SIM_NAME_DIRECTION, DirectionAttribName);
00046
00047 GETSET_DATA_FUNCS_I(SIM_NAME_DIRECTIONTYPE, DirectionType);
00048
00049 GETSET_DATA_FUNCS_F(SIM_NAME_DRAGCONSTANT, DragConstant);
00050
00051 GETSET_DATA_FUNCS_S(SIM_NAME_MAXDISTANCE, MaxDistanceAttribName);
00052
00053 GETSET_DATA_FUNCS_F(SIM_NAME_DENSITY, Density);
00054
00055 GETSET_DATA_FUNCS_S(SIM_NAME_LIFTFORCE, LiftForceAttribName);
00056
00057 GETSET_DATA_FUNCS_F(SIM_NAME_FALLOFF, Falloff);
00058
00059 GETSET_DATA_FUNCS_F(SIM_NAME_LIFTMULT, LiftMult);
00060
00061 GETSET_DATA_FUNCS_I(SIM_NAME_SAMPLEMODE, SampleMode);
00062
00063 protected:
00064 explicit SIM_ForceVortex(const SIM_DataFactory *factory);
00065 virtual ~SIM_ForceVortex();
00066
00067
00068
00069
00070
00071
00072
00073
00074 virtual void getForceSubclass(const SIM_Object &object,
00075 const UT_Vector3 &position,
00076 const UT_Vector3 &velocity,
00077 const UT_Vector3 &angvel,
00078 const fpreal mass,
00079 UT_Vector3 &force,
00080 UT_Vector3 &torque) const;
00081
00082
00083
00084
00085 virtual bool getForceSetSubclass(const SIM_Object &object,
00086 const UT_Vector3Array &positions,
00087 const UT_Vector3Array &velocities,
00088 const UT_Vector3Array &angvelocities,
00089 const UT_FloatArray &masses,
00090 UT_Vector3Array &forces,
00091 UT_Vector3Array &torques) const;
00092
00093 virtual SIM_ForceSample getOptimalForceSamplingSubclass() const;
00094
00095 virtual SIM_Guide *createGuideObjectSubclass() const;
00096 virtual void buildGuideGeometrySubclass(const SIM_RootData &root,
00097 const SIM_Options &options,
00098 const GU_DetailHandle &gdh,
00099 UT_DMatrix4 *xform,
00100 const SIM_Time &t) const;
00101
00102 bool shouldMultiThread() const { return true; }
00103
00104 private:
00105 void createCircleGuide(GU_Detail *gdp,
00106 const UT_Vector3 ¢er,
00107 const UT_Quaternion &orient,
00108 fpreal rad, fpreal frad,
00109 int divisions, int clroff,
00110 const UT_Vector3 &clr) const;
00111 UT_Vector3 getPolyOrbitalDirection(const GEO_Primitive *prim,
00112 int i, int j) const;
00113 void getPointData(const GEO_Primitive * &prim,
00114 GU_RayIntersect &ray,
00115 const UT_DMatrix4 &geoxform,
00116 int doff, int roff, int moff,
00117 int ind, int defaultval,
00118 GEO_Point * &pt,
00119 UT_Vector3 &x,
00120 UT_Vector3 &dir,
00121 fpreal &u,
00122 fpreal &rad, fpreal &maxd,
00123 UT_Quaternion &rot, fpreal hack) const;
00124
00125
00126 THREADED_METHOD6_CONST(SIM_ForceVortex, shouldMultiThread(),
00127 calculateForceSet,
00128 const UT_Vector3Array &, positions,
00129 const UT_Vector3Array &, velocities,
00130 const UT_FloatArray &, masses,
00131 UT_Vector3Array &, forces,
00132 UT_Vector3Array &, torques,
00133 GU_RayIntersect *, intersect)
00134 void calculateForceSetPartial(
00135 const UT_Vector3Array &positions,
00136 const UT_Vector3Array &velocities,
00137 const UT_FloatArray &masses,
00138 UT_Vector3Array &forces,
00139 UT_Vector3Array &torques,
00140 GU_RayIntersect *intersect,
00141 const UT_JobInfo &info) const;
00142
00143 static const SIM_DopDescription *getForceVortexDopDescription();
00144
00145 DECLARE_STANDARD_GETCASTTOTYPE();
00146 DECLARE_DATAFACTORY(SIM_ForceVortex,
00147 SIM_Force,
00148 "Vortex Force",
00149 getForceVortexDopDescription());
00150 };
00151
00152 #endif
00153