00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef __SIM_SolverBlend_h__
00015 #define __SIM_SolverBlend_h__
00016
00017 #include "SIM_API.h"
00018 #include <UT/UT_RefArray.h>
00019 #include "SIM_Solver.h"
00020 #include "SIM_OptionsUser.h"
00021
00022 class SIM_PerObjectBlendData;
00023
00024
00025
00026
00027 class SIM_API SIM_SolverBlend : public SIM_Solver,
00028 public SIM_OptionsUser
00029 {
00030 public:
00031 GETSET_DATA_FUNCS_S(SIM_NAME_BLENDDATANAME, BlendDataName);
00032 GETSET_DATA_FUNCS_S(SIM_NAME_BLENDFACTORSROOTNAME, BlendFactorsRootName);
00033 GETSET_DATA_FUNCS_B(SIM_NAME_MATCHBYNAME, MatchByName);
00034 GETSET_DATA_FUNCS_I(SIM_NAME_PRIMARYSOLVER, PrimarySolver);
00035
00036 protected:
00037
00038 explicit SIM_SolverBlend(const SIM_DataFactory *factory);
00039
00040 virtual ~SIM_SolverBlend();
00041
00042
00043 virtual SIM_Result solveObjectsSubclass(SIM_Engine &engine,
00044 SIM_ObjectArray &objects,
00045 SIM_ObjectArray &newobjects,
00046 SIM_ObjectArray &feedbacktoobjects,
00047 const SIM_Time ×tep);
00048
00049 virtual int getRequestedCacheSubclass();
00050 virtual void getImpulseMassMatrixSubclass(
00051 const SIM_Object &object,
00052 const UT_Vector3 &impulseworldpos,
00053 UT_DMatrix3 &immatrix) const;
00054 virtual void getPointImpulseMassMatrixSubclass(
00055 const SIM_Object &object,
00056 int ptnum, UT_DMatrix3 &immatrix) const;
00057 virtual fpreal getPropertyAtPositionSubclass(const SIM_Object &object,
00058 const UT_Vector3 &worldpos,
00059 const SIM_Property &property) const;
00060 virtual fpreal getPropertyAtPointSubclass(const SIM_Object &object,
00061 int ptnum, const SIM_Property &property) const;
00062 virtual void getDefaultColliderLabelSubclass(
00063 const SIM_Object &object,
00064 UT_String &label) const;
00065 virtual void getDefaultColliderSubclass(
00066 const SIM_Object &object,
00067 const UT_String &colliderlabel,
00068 UT_String &collidertype,
00069 bool &colliderreverseobjectroles) const;
00070
00071
00072 void getBlendFactorsSubdata(
00073 const SIM_ObjectArray &objects,
00074 const SIM_ObjectArray &newobjects,
00075 const char *blenddataname,
00076 const char *solverparmsroot,
00077 SIM_PerObjectBlendData *blenddata,
00078 UT_StringArray *subsolvernames);
00079
00080 private:
00081
00082 void getBlendFactorsSubdata(
00083 SIM_Object &object,
00084 const char *blenddataname,
00085 const char *solverparmsroot,
00086 SIM_PerObjectBlendData &blenddata,
00087 UT_StringArray *subsolvernames);
00088
00089 void prepareObjectsForSolve(
00090 const SIM_ObjectArray &objects,
00091 SIM_PerObjectBlendData *blenddata,
00092 int baseindex,
00093 int solverindex,
00094 const char *blenddataname);
00095 void cleanupObjectsAfterSolve(
00096 const SIM_ObjectArray &objects,
00097 SIM_PerObjectBlendData *blenddata,
00098 int baseindex,
00099 int solverindex,
00100 const char *blenddataname);
00101 void blendAllSolvedData(
00102 const SIM_ObjectArray &objects,
00103 SIM_PerObjectBlendData *blenddata,
00104 int baseindex,
00105 int numsolvers,
00106 const char *blenddataname);
00107
00108 const SIM_Solver *getCurrentSolver() const;
00109
00110 static const SIM_DopDescription *getSolverBlendDopDescription();
00111
00112 SIM_Solver *myCurrentSolver;
00113
00114 DECLARE_STANDARD_GETCASTTOTYPE();
00115 DECLARE_DATAFACTORY(SIM_SolverBlend,
00116 SIM_Solver,
00117 "Blend Solver",
00118 getSolverBlendDopDescription());
00119 };
00120
00121 #endif
00122