00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef __SIM_Utils_h__
00015 #define __SIM_Utils_h__
00016
00017 #include "SIM_API.h"
00018 #include "SIM_Data.h"
00019 #include "SIM_DataFilter.h"
00020 #include "SIM_Time.h"
00021 #include "SIM_Names.h"
00022 #include <GEO/GEO_Primitive.h>
00023 #include <UT/UT_SysSpecific.h>
00024 #include <UT/UT_RefArray.h>
00025
00026 class SIM_Solver;
00027 class SIM_Object;
00028 class SIM_Relationship;
00029
00030
00031
00032
00033 #define SIM_DATA_CAST(Data, DataClass) \
00034 ((DataClass *)(SIM_Data::castPointerToType( \
00035 static_cast<SIM_Data *>(Data), #DataClass)))
00036
00037
00038
00039 #define SIM_DATA_CASTCONST(Data, DataClass) \
00040 ((const DataClass *)(SIM_Data::castConstPointerToType( \
00041 static_cast<const SIM_Data *>(Data), #DataClass)))
00042
00043
00044
00045 #define SIM_DATA_GET(Parent, DataName, DataClass) \
00046 SIM_DATA_CAST((Parent).getNamedSubData(DataName), DataClass)
00047
00048
00049
00050 #define SIM_DATA_GETCONST(Parent, DataName, DataClass) \
00051 SIM_DATA_CASTCONST((Parent).getConstNamedSubData(DataName), DataClass)
00052
00053
00054
00055 #define SIM_DATA_GETNTH(Parent, DataClass, N, StartFrom, RecurseFilter) \
00056 SIM_DATA_CAST((Parent).getNthSubData( \
00057 NULL, SIM_DataFilterByType(#DataClass), N, \
00058 StartFrom, RecurseFilter), DataClass)
00059
00060
00061
00062 #define SIM_DATA_GETNTHCONST(Parent, DataClass, N, StartFrom, RecurseFilter) \
00063 SIM_DATA_CASTCONST((Parent).getNthConstSubData( \
00064 NULL, SIM_DataFilterByType(#DataClass), N, \
00065 StartFrom, RecurseFilter), DataClass)
00066
00067
00068 #define SIM_DATA_CREATE(Parent, DataName, DataClass, Flags) \
00069 ((DataClass *)(static_cast<SIM_Data &>(Parent)). \
00070 createNamedSubData(DataName, #DataClass, Flags))
00071
00072
00073
00074 #define SIM_DATA_GETORCREATE_ALT(Parent, DataName, DataClass) \
00075 SIM_DATA_CAST((Parent).getOrCreateAlternateRepresentation( \
00076 DataName, #DataClass), DataClass)
00077
00078
00079
00080
00081 template <class DataClass>
00082 void
00083 SIMconvertConstArray(const SIM_ConstDataArray &src,
00084 UT_PtrArray<const DataClass *> &dest,
00085 const char *DataClassName,
00086 bool includenulls = false)
00087 {
00088 const DataClass *converted;
00089
00090 dest.entries(0);
00091 for( int i = 0; i < src.entries(); i++ )
00092 {
00093 converted = src(i) ?
00094 (const DataClass *)src(i)->
00095 getConstPointerToType(DataClassName) :
00096 0;
00097 if( converted || includenulls )
00098 dest.append(converted);
00099 }
00100 }
00101
00102
00103
00104
00105 template <class DataClass>
00106 void
00107 SIMconvertArray(const SIM_DataArray &src,
00108 UT_PtrArray<DataClass *> &dest,
00109 const char *DataClassName,
00110 bool includenulls = false)
00111 {
00112 DataClass *converted;
00113 int i;
00114
00115 dest.entries(0);
00116 for( i = 0; i < src.entries(); i++ )
00117 {
00118 converted = src(i) ?
00119 (DataClass *)src(i)->getPointerToType(DataClassName) :
00120 0;
00121 if( converted || includenulls )
00122 dest.append(converted);
00123 }
00124 }
00125
00126
00127
00128 SIM_API void SIMgetPositionTransform(UT_DMatrix4 &result, const SIM_Object &);
00129
00130
00131 SIM_API void SIMgetGeometryTransform(UT_DMatrix4 &result, const SIM_Object &);
00132
00133
00134 SIM_API void SIMgetObjectProperties(
00135 const SIM_Object &obj,
00136 const UT_Vector3 &pos,
00137 const int ptnum,
00138 fpreal &friction,
00139 fpreal &bounce,
00140 fpreal &dynamicfriction);
00141
00142
00143
00144 SIM_API bool SIMisTri(const GEO_Primitive &prim);
00145
00146
00147
00148
00149 class SIM_API sim_EdgeDataEntry
00150 {
00151 public:
00152 sim_EdgeDataEntry(int pid_e0, int pid_e1, int fid0, int fid1,
00153 int pid_f0, int pid_f1)
00154 : myPidE0(pid_e0), myPidE1(pid_e1),
00155 myFid0(fid0), myFid1(fid1),
00156 myPidF0(pid_f0), myPidF1(pid_f1)
00157 { }
00158 sim_EdgeDataEntry()
00159 { }
00160
00161
00162 int myPidE0, myPidE1;
00163
00164
00165 int myFid0, myFid1;
00166
00167
00168
00169 int myPidF0, myPidF1;
00170 };
00171 typedef UT_RefArray<sim_EdgeDataEntry> SIM_EdgeData;
00172
00173
00174
00175
00176 SIM_API void SIMcalcEdgeData(SIM_EdgeData &edgeData, const GU_Detail &gdp);
00177
00178
00179
00180
00181
00182
00183 extern "C" {
00184 SYS_VISIBILITY_EXPORT extern void initializeSIM(void *data);
00185 }
00186
00187
00188
00189 SIM_API void initializeSIM();
00190
00191
00192
00193 SIM_API void
00194 SIMbuildAnchorGuideObjectLink(GU_Detail *gdp,
00195 GEO_Point *pt,
00196 const SIM_Object &object,
00197 const SIM_Options &options,
00198 const SIM_Relationship &rel);
00199 #endif
00200