00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __SOP_CaptureOverride_h__
00021 #define __SOP_CaptureOverride_h__
00022
00023 #include "SOP_API.h"
00024 #include <UT/UT_HashTable.h>
00025 #include <UT/UT_IntArray.h>
00026 #include <UT/UT_PtrArray.h>
00027 #include <UT/UT_String.h>
00028 #include <PRM/PRM_Name.h>
00029 #include <PRM/PRM_Parm.h>
00030
00031 #include "SOP_CaptureData.h"
00032 #include "SOP_Node.h"
00033
00034
00035 #define SOP_CAPTUREOVERRIDE_GRP_IDX 0
00036
00037 class UT_Matrix4;
00038 class OP_Context;
00039
00040 class GEO_CaptureOverrideData;
00041 class GEO_CaptureOverrideDelta;
00042 class SOP_UndoCaptureOverride;
00043
00044 class SOP_API SOP_CaptureOverride : public SOP_Node
00045 {
00046 friend class SOP_UndoCaptureOverride;
00047 friend class SOP_UndoCaptureOverrideOpDepend;
00048
00049 public:
00050 SOP_CaptureOverride(OP_Network *net, const char *name, OP_Operator *entry);
00051 virtual ~SOP_CaptureOverride();
00052
00053 const UT_String & getUndoLabel() const { return myNewOpLabel; }
00054
00055 static OP_Node * ourConstructor(OP_Network*, const char*, OP_Operator*);
00056 static PRM_Template ourTemplateList[];
00057
00058 virtual unsigned disableParms();
00059
00060
00061
00062
00063 void beginNewOperation();
00064
00065 virtual OP_ERROR cookInputGroups( OP_Context &context, int alone );
00066
00067
00068 OP_ERROR updateInputGroups( OP_Context &context,
00069 bool changed_input, bool changed_group );
00070
00071
00072
00073 void updateCookSelection(
00074 bool changed_input, bool changed_group );
00075
00076
00077
00078
00079 bool hasWeightOverride( int point_num ) const;
00080
00081 void startNewChange( const int *points, int num_points,
00082 int clamp_negative, int normalize = 0 );
00083 void changeWeight( float t, const char *cregion,
00084 float weight, int add_weight );
00085 void changeWeight( float t,
00086 const UT_PtrArray<const char *> &cregions,
00087 float weight, int add_weight );
00088 void normalizeWeights( float t,
00089 const UT_PtrArray<const char *> &cregions );
00090
00091 void createCaptureWeightOverride( const int *points,
00092 int num_points, float t );
00093 void removeCaptureWeightOverride( const int *points,
00094 int num_points, float t );
00095
00096 int addAverageCaptureWeight( OP_Context &context,
00097 const UT_IntArray &points,
00098 UT_HashTable &averages );
00099
00100 virtual void setVisualization( int onoff );
00101
00102 protected:
00103 void applyPermanentOverrides(OP_Context *ctx = 0);
00104
00105 virtual OP_ERROR cookMySop( OP_Context &context );
00106
00107 virtual void applyAndClearCurrentDelta();
00108
00109 virtual void clearAllDeltas(float t);
00110
00111 virtual void buildOpDependencies();
00112 virtual void buildParmDependency( int parm_index );
00113 virtual void handleOpDependency( int referenced_op_id,
00114 const OP_Dependency &op_dep,
00115 OP_InterestType interest_type,
00116 bool &need_cook,
00117 const char *old_fullpath,
00118 const char *old_cwd,
00119 const char *old_chan_name );
00120
00121
00122
00123
00124 virtual OP_ERROR save(ostream &os, const OP_SaveFlags &flags,
00125 const char *path_prefix);
00126 virtual bool load(UT_IStream &is, const char *extension,
00127 const char *path=0);
00128
00129 private:
00130 PRM_Parm & getParmByName( PRM_Name &name )
00131 { return getParm( name.getToken() ); }
00132 const PRM_Parm & getParmByName( PRM_Name &name ) const
00133 { return getParm( name.getToken() ); }
00134
00135 void fixParmCRegionPathsForRootChange(
00136 const UT_String &old_full_root_path,
00137 const UT_String &full_root_path );
00138
00139 void setCRegionsParm( float t,
00140 const UT_PtrArray<const char *> &cregions );
00141
00142 OP_ERROR createCurrentDelta( OP_Context &context,
00143 const GB_PointGroup *pt_group );
00144
00145 int addCaptureRegion( UT_String &cregion_name );
00146
00147
00148 static void buildCregionMenu( void *, PRM_Name *, int,
00149 const PRM_SpareData *, PRM_Parm * );
00150 static int getCaptureRegionDetailData( void *user_data,
00151 char *full_cregion_path,
00152 char *rel_cregion_path,
00153 float *tube_data );
00154
00155
00156 void getSelString(UT_String &str)
00157 { evalString(str, SOP_CAPTUREOVERRIDE_GRP_IDX, 0, 0.0f); }
00158
00159
00160 static int applyStatic(void *, int idx,
00161 float t, const PRM_Template *);
00162
00163 static int clearallStatic(void *, int idx,
00164 float t, const PRM_Template *);
00165
00166 void checkCaptureRegions();
00167
00168 bool checkChangedSource(unsigned idx, OP_Context &context);
00169
00170 void rollbackCurrentOverridesDelta();
00171
00172 void ensureCaptureAttributesExist();
00173
00174
00175 void undoOverrideDeltas(
00176 GEO_CaptureOverrideDelta *delta);
00177 void redoOverrideDeltas(
00178 GEO_CaptureOverrideDelta *delta);
00179 void undoClearOverrides(
00180 SOP_UndoCaptureOverride *undo);
00181 void redoClearOverrides(
00182 SOP_UndoCaptureOverride *undo);
00183
00184 private:
00185 UT_String myNewOpLabel;
00186
00187 GEO_CaptureOverrideData *myPermanentOverrides;
00188 GEO_CaptureOverrideDelta *myCurrentOverridesDelta;
00189
00190 bool myCookedFlag;
00191 bool myApplyPermanentFlag;
00192
00193
00194 GU_DetailGroupPair myDetailGroupPair;
00195 const GB_BaseGroup *myGroup;
00196
00197 SOP_CaptureData myCaptureData;
00198 UT_String myRootPath;
00199 unsigned int myUpdatedColors : 1,
00200 myForceUpdateColors : 1;
00201
00202 static PRM_ChoiceList theCregionMenu;
00203 static int theCregionIndex;
00204 };
00205
00206 #endif // __SOP_CaptureOverride_h__
00207