00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __GEO_CaptureOverrideData_h__
00020 #define __GEO_CaptureOverrideData_h__
00021
00022 #include "GEO_API.h"
00023 #include <UT/UT_IntArray.h>
00024 #include <UT/UT_PtrArray.h>
00025
00026 class UT_Matrix4;
00027 class UT_IStream;
00028 class GB_Attribute;
00029 class GB_AttributeTable;
00030 class GB_AttributeData;
00031 class GB_PointGroup;
00032 class GEO_Detail;
00033 class GEO_CaptureOverrideDelta;
00034
00035 class geo_CaptureOverridePointData;
00036
00037 typedef int (*GEO_CaptureRegionDataCB)( void *user_data,
00038 char *full_cregion_path,
00039 char *relative_cregion_path,
00040 float *tube_data );
00041
00042 class GEO_API GEO_CaptureOverrideData
00043 {
00044 public:
00045 GEO_CaptureOverrideData();
00046 virtual ~GEO_CaptureOverrideData();
00047
00048 void destroy();
00049
00050 void getOpPaths( UT_StringList &paths );
00051 void getOpPathsCopy( UT_PtrArray<char *> &paths );
00052 void setOpPaths( const UT_PtrArray<char *> &paths );
00053 int changeOpPaths( const char *old_name,
00054 const char *new_name );
00055 void changeCaptureRegionRoot( const char *old_root,
00056 const char *new_root );
00057 void refreshCaptureFrameInfo( const GEO_Detail &gdp,
00058 GEO_CaptureRegionDataCB get_region,
00059 void *user_data );
00060
00061
00062 void applyOverrides(GEO_Detail &gdp);
00063
00064
00065
00066
00067 void mergeCaptureWeightOverridesDelta(
00068 GEO_CaptureOverrideDelta &delta );
00069 void undoCaptureWeightOverridesDelta(
00070 const GEO_CaptureOverrideDelta &delta );
00071
00072 bool overrideExists( int point_num ) const;
00073
00074
00075 int64 getMemoryUsage() const;
00076
00077 int save( ostream &os, int binary ) const;
00078 bool load( UT_IStream &is );
00079
00080 private:
00081
00082
00083
00084
00085
00086
00087
00088
00089 void setOverride(int point_num, const float *weights, int size,
00090 UT_IntArray &map_from_delta,
00091 const UT_PtrArray<char *> &delta_paths,
00092 const UT_PtrArray<float *> &delta_tubes,
00093 UT_IntArray *added_delta_paths,
00094 bool &max_size_invalid);
00095
00096 void updateIndexBounds( int point_num, bool exists,
00097 bool &min_invalid, bool &max_invalid );
00098
00099 int findPathIndex( const char *path ) const;
00100
00101 private:
00102 UT_PtrArray<char *> myRegionPaths;
00103 UT_PtrArray<float *> myCaptureTubes;
00104
00105
00106
00107
00108 UT_PtrArray<geo_CaptureOverridePointData *> myWeights;
00109
00110 int myMinPointIndex;
00111 int myMaxPointIndex;
00112
00113 int myNumOverrides;
00114 int myMaxWeightDataSize;
00115 };
00116
00117 enum
00118 {
00119 GEO_CAPTUREOVERRIDE_NO_CHANGE = 0,
00120 GEO_CAPTUREOVERRIDE_SET = 1,
00121 GEO_CAPTUREOVERRIDE_CHANGE = 2,
00122 GEO_CAPTUREOVERRIDE_UNSET = 3,
00123 };
00124
00125 class geo_CaptureOverrideDeltaData;
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 class GEO_API GEO_CaptureOverrideDelta
00138 {
00139 public:
00140 GEO_CaptureOverrideDelta();
00141 virtual ~GEO_CaptureOverrideDelta();
00142
00143 void copyForUndo( const GEO_CaptureOverrideDelta &other );
00144
00145
00146 void destroy();
00147
00148
00149 bool removesOverride( int point_num ) const;
00150 bool addsOverride( int point_num ) const;
00151
00152
00153
00154 void addedCaptureRegion( const GEO_Detail &gdp, const char *path,
00155 int cindex );
00156
00157
00158
00159
00160
00161 void initCaptureWeightChange( const GEO_Detail &gdp );
00162
00163
00164
00165
00166 void beginCaptureWeightChange( const GB_AttributeData &data );
00167 void endCaptureWeightChange( const GB_AttributeData &data,
00168 unsigned int point_index,
00169 int operation );
00170
00171 const UT_PtrArray<char *> &getPaths() const
00172 { return myRegionPaths; }
00173 const UT_PtrArray<float *> &getCaptureTubes() const
00174 { return myCaptureTubes; }
00175 UT_IntArray &getRegionsAddedToOverrides()
00176 { return myAddedRegionsToOverrides; }
00177 const UT_IntArray &getRegionsAddedToOverrides() const
00178 { return myAddedRegionsToOverrides; }
00179
00180 int getNumChanges() const { return myChanges.entries(); }
00181 const geo_CaptureOverrideDeltaData *getChange(int i) const
00182 { return myChanges(i); }
00183
00184
00185 void undoOverrideDeltas( GEO_Detail &gdp );
00186
00187
00188 int64 getMemoryUsage() const;
00189
00190 private:
00191 void convertAndStorePtData( const float *gdp_data,
00192 int num_point_regions,
00193 float *&store_data, int &store_size );
00194
00195 void prepareCaptureRegionChange( int path_index );
00196 void convertAndRestorePtData( float *gdp_data,
00197 int num_point_regions,
00198 const float *store_data,
00199 int store_size,
00200 int entry_size,
00201 const UT_IntArray &map_to_gdp,
00202 float *tmp_data );
00203
00204
00205 private:
00206 UT_PtrArray<char *> myRegionPaths;
00207 UT_PtrArray<float *> myCaptureTubes;
00208
00209
00210
00211
00212 UT_IntArray myAddedRegionsToGdp;
00213 UT_IntArray myAddedRegionsToOverrides;
00214
00215 UT_PtrArray<geo_CaptureOverrideDeltaData *> myChanges;
00216
00217
00218 GB_Attribute *mySavedPathAttrib;
00219 int mySavedTubeOffset;
00220 const GB_AttributeTable *mySavedAttribs;
00221 float *mySavedData;
00222 int mySavedDataOffset;
00223 unsigned int mySavedDataSize;
00224 UT_IntArray myMapFromGdp;
00225 };
00226
00227 #endif // __GEO_CaptureOverrideData_h__
00228