00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef __GEO_CaptureData__
00024 #define __GEO_CaptureData__
00025
00026 #include "GEO_API.h"
00027 #include <UT/UT_FloatArray.h>
00028 #include <UT/UT_IntArray.h>
00029 #include <UT/UT_Matrix4.h>
00030 #include <UT/UT_RefArray.h>
00031 #include <UT/UT_String.h>
00032
00033 #define GEO_CAPTUREDATA_DEFAULT_VALUE -1.0F
00034
00035 enum GEO_CaptureData_PtAtr_Entry {
00036 I_GEO_CAPTUREDATA_INDEX = 0,
00037 I_GEO_CAPTUREDATA_WEIGHT,
00038 GEO_CAPTUREDATA_PT_ATR_ENTRY_SZ
00039 };
00040
00041 enum GEO_CaptureData_DetailAtr_Entry {
00042 I_GEO_CAPTUREDATA_XFORM = 0,
00043 I_GEO_CAPTUREDATA_BCAP = 16,
00044 I_GEO_CAPTUREDATA_TCAP,
00045 I_GEO_CAPTUREDATA_TAPERX,
00046 I_GEO_CAPTUREDATA_TAPERZ,
00047 GEO_CAPTUREDATA_DETAIL_ATR_ENTRY_SZ
00048 };
00049
00050 enum GEO_MetaCaptureData_DetailAtr_Entry
00051 {
00052 I_GEO_METACAPTUREDATA_XFORM = 0,
00053 GEO_METACAPTUREDATA_DETAIL_ATR_ENTRY_SZ = 16
00054 };
00055
00056 enum GEO_MetaRestData_DetailAtr_Entry
00057 {
00058 I_GEO_METARESTDATA_XFORM = 0,
00059 GEO_METARESTDATA_DETAIL_ATR_ENTRY_SZ = 16
00060 };
00061
00062 class GEO_Detail;
00063 class GB_PointGroup;
00064
00065 class GEO_API GEO_CaptureRegionData
00066 {
00067 public:
00068 GEO_CaptureRegionData() {};
00069 ~GEO_CaptureRegionData() {};
00070
00071 const UT_String &getPath() const { return myPath; }
00072 int changeString( const char *from, const char *to, bool fullword )
00073 { return myPath.changeString( from, to, fullword ); }
00074 const UT_Matrix4 &getXform() const { return myXform; }
00075 float getXtaper() const { return myXtaper; }
00076 float getZtaper() const { return myZtaper; }
00077 float getTopCapHeight() const { return myTopCapHeight; }
00078 float getBotCapHeight() const { return myBotCapHeight; }
00079 float getMinWeight() const { return myMinWeight; }
00080 float getMaxWeight() const { return myMaxWeight; }
00081 int getID() const { return myID; }
00082 unsigned getPrimNum() const { return myPrimNum; }
00083
00084 void setPath (const UT_String &path) { myPath.harden(path); }
00085 void setXform(const UT_Matrix4 &xf) { myXform = xf; }
00086 void setXZtapers(float x, float z) { myXtaper = x; myZtaper=z; }
00087 void setTopCapHeight(float h) { myTopCapHeight = h; }
00088 void setBotCapHeight(float h) { myBotCapHeight = h; }
00089 void setMinWeight(float m) { myMinWeight = m; }
00090 void setMaxWeight(float m) { myMaxWeight = m; }
00091 void setID(int id) { myID = id; }
00092 void setPrimNum(unsigned pn) { myPrimNum = pn; }
00093
00094
00095 GEO_CaptureRegionData &operator= (const GEO_CaptureRegionData &d);
00096 unsigned operator== (const GEO_CaptureRegionData &d) const;
00097
00098 private:
00099 UT_String myPath;
00100 UT_Matrix4 myXform;
00101 float myXtaper;
00102 float myZtaper;
00103 float myTopCapHeight;
00104 float myBotCapHeight;
00105 float myMinWeight;
00106 float myMaxWeight;
00107 int myID;
00108 unsigned myPrimNum;
00109 };
00110
00111 class GEO_API GEO_CaptureData
00112 {
00113 public:
00114 GEO_CaptureData();
00115 ~GEO_CaptureData();
00116
00117 void initialize( const UT_String &sop_path,
00118 float capture_frame, int num_pts=0, int num_regions=0,
00119 int num_entries_per_pnt=0 );
00120
00121
00122
00123
00124 unsigned int getNumRegions() const { return myRegionData.entries(); }
00125
00126 const UT_String ®ionPath (unsigned i) const
00127 { return myRegionData(i).getPath();}
00128 const UT_Matrix4 ®ionXform(unsigned i)const
00129 { return myRegionData(i).getXform();}
00130 int regionID (unsigned i) const
00131 { return myRegionData(i).getID();}
00132 int regionPrimNum(unsigned i) const
00133 { return (int)myRegionData(i).getPrimNum(); }
00134 float taperX(unsigned i) const
00135 { return myRegionData(i).getXtaper(); }
00136 float taperZ(unsigned i) const
00137 { return myRegionData(i).getZtaper(); }
00138 float topCap(unsigned i) const
00139 { return myRegionData(i).getTopCapHeight(); }
00140 float botCap(unsigned i) const
00141 { return myRegionData(i).getBotCapHeight(); }
00142 float minWeight(unsigned i) const
00143 { return myRegionData(i).getMinWeight(); }
00144 float maxWeight(unsigned i) const
00145 { return myRegionData(i).getMaxWeight(); }
00146
00147 int changeString( const char *from, const char *to,
00148 bool fullword );
00149
00150 void updateRegionPath(unsigned int i,
00151 const UT_String &new_path,
00152 int new_op_id);
00153
00154
00155 int findRegion(const UT_String ®ion_path,unsigned primnum)const;
00156 int findRegion(int OPuniqueID, unsigned primnum )const;
00157
00158 void getRegionList(int OPuniqueID, UT_IntArray ®ions) const;
00159
00160
00161 int appendRegion( int opID, const UT_String &path,
00162 int tube_prim_num, const UT_Matrix4 &xform,
00163 float taperx, float taperz,
00164 float bot_cap, float top_cap,
00165 float min_weight, float max_weight );
00166
00167 int saveOverrideFile( const UT_String &filename,
00168 const GB_PointGroup *pt_group=0,
00169 const GEO_Detail *gdp=0,
00170 int binary=0) const;
00171 int saveOverrideFile( ostream &os,
00172 const GB_PointGroup *pt_group=0,
00173 const GEO_Detail *gdp=0,
00174 int binary=0) const;
00175
00176
00177
00178 bool loadOverrideFile( const char *filename, int &line_num );
00179
00180
00181
00182
00183
00184
00185
00186 void appendSortedPtEntry( int point_num, int idx, float weight );
00187
00188 int getNumEntriesPerPt() const { return myMaxEntriesPerPt; }
00189 int getNumStoredPts() const { return myPtEntry.entries(); }
00190
00191
00192
00193
00194 void transferToGdp( GEO_Detail *gdp, bool destroy, float blend,
00195 bool relative_skel_root ) const;
00196 int transferFromGdp(const GEO_Detail *gdp,const GB_PointGroup *pt_group);
00197
00198
00199
00200 static void parseDetailData( const float *data, int idx,
00201 UT_Matrix4 &xform,
00202 float &taperx, float &taperz,
00203 float &top_scale, float &bot_scale);
00204 static void parsePointData( const float *data, int idx,
00205 int ®ion_idx, float &weight );
00206
00207
00208
00209
00210
00211
00212
00213 float getPointWeight(int point_idx, int region_idx, int *prev_array_idx = NULL);
00214
00215 private:
00216 bool loadOverrideFile( UT_IStream &is, int &line_num );
00217
00218 int savePointEntry(ostream &os, int i, const float *pt_data,
00219 bool binary) const;
00220
00221
00222 void computeSkelRootPath( UT_String &root_path ) const;
00223 int putDetailDataInGdp( GEO_Detail *gdp, bool replace,
00224 bool relative_skel_root,
00225 UT_IntArray ®ion_map ) const;
00226 int putPointDataInGdp( GEO_Detail *gdp, bool replace, float blend,
00227 const UT_IntArray ®ion_map ) const;
00228 int getDetailDataFromGdp( const GEO_Detail *gdp );
00229 int getPointDataFromGdp( const GEO_Detail *gdp,
00230 const GB_PointGroup *pt_group );
00231
00232 private:
00233 class geo_PtEntry
00234 {
00235 public:
00236 geo_PtEntry() : pt_num(-1), num_entries(0)
00237 {
00238 }
00239 int pt_num;
00240 int num_entries;
00241 };
00242
00243 float myCaptureFrame;
00244 UT_String mySopPath;
00245 UT_RefArray<GEO_CaptureRegionData> myRegionData;
00246 UT_RefArray<geo_PtEntry> myPtEntry;
00247 UT_FloatArray myPtData;
00248 int myMaxEntriesPerPt;
00249 };
00250
00251 #endif