00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __CHOP_Node_h__
00021 #define __CHOP_Node_h__
00022
00023 #include "CHOP_API.h"
00024 #include <UT/UT_ExpandArray.h>
00025 #include <UT/UT_NTStreamUtil.h>
00026
00027 #include <CL/CL_Clip.h>
00028 #include <CL/CL_Defines.h>
00029
00030 #include <PRM/PRM_Parm.h>
00031 #include <OP/OP_InputChangeHelper.h>
00032 #include <OP/OP_Node.h>
00033 #include <OP/OP_Network.h>
00034
00035 #include "CHOP_Error.h"
00036 #include "CHOP_Notes.h"
00037
00038 #define CHOP_AUDIO_FLAG 'a'
00039 #define CHOP_EXPORT_FLAG 'o'
00040
00041 class OP_OperatorTable;
00042 class OP_TemplatePair;
00043 class OP_VariablePair;
00044 class OP_OutputCodeParms;
00045 class CHOP_Handle;
00046 class CHOP_HandleData;
00047 class UT_Vector4;
00048 class CHOP_Fitter;
00049 class CL_FitParms;
00050 class OR_Mapping;
00051 class orPath;
00052 class orUnit;
00053 class CHOP_OutputClipManager;
00054 class CHOP_VariableList;
00055 class UT_IncludeFileManager;
00056
00057 typedef void (*CHOP_ReplaceCallback)(void *data, int replace);
00058
00059 typedef void (*CHOP_ConflictCallback)(void *data,
00060 void *ldata, CHOP_ReplaceCallback func,
00061 const char *source, const char *dest);
00062
00063 typedef UT_PtrArray<orUnit *> orUnitList;
00064 typedef UT_PtrArray<CHOP_Handle *> CHOP_HandleList;
00065
00066 extern "C" {
00067 DLLEXPORT extern void newChopOperator(OP_OperatorTable *table);
00068 };
00069
00070 #define CHOP_PARM_COUNT (8)
00071 #define CHOP_TAB "Common"
00072 #define NONE_TOKEN "none"
00073
00074 #define CHOP_OUT_CFUNC "_updateCParam"
00075 #define CHOP_OUT_IFUNC "_updateIParam"
00076
00077 #define CHOP_OUT_CPARAM "params.cUpdate"
00078 #define CHOP_OUT_IPARAM "params.iUpdate"
00079
00080
00081 #define CHOP_SWITCHER(cnt, nm) \
00082 static PRM_Default switcher[2] = \
00083 { \
00084 PRM_Default(cnt, nm), \
00085 PRM_Default(CHOP_PARM_COUNT, CHOP_TAB), \
00086 }
00087
00088 #define CHOP_SWITCHER2(cnt1,nm1,cnt2, nm2) \
00089 static PRM_Default switcher[3] = \
00090 { \
00091 PRM_Default(cnt1, nm1), \
00092 PRM_Default(cnt2, nm2), \
00093 PRM_Default(CHOP_PARM_COUNT, CHOP_TAB), \
00094 }
00095
00096 #define CHOP_SWITCHER3(cnt1,nm1,cnt2, nm2,cnt3,nm3) \
00097 static PRM_Default switcher[4] = \
00098 { \
00099 PRM_Default(cnt1, nm1), \
00100 PRM_Default(cnt2, nm2), \
00101 PRM_Default(cnt3, nm3), \
00102 PRM_Default(CHOP_PARM_COUNT, CHOP_TAB), \
00103 }
00104
00105 #define CHOP_SWITCHER4(cnt1,nm1,cnt2, nm2,cnt3,nm3,cnt4,nm4) \
00106 static PRM_Default switcher[5] = \
00107 { \
00108 PRM_Default(cnt1, nm1), \
00109 PRM_Default(cnt2, nm2), \
00110 PRM_Default(cnt3, nm3), \
00111 PRM_Default(cnt4, nm4), \
00112 PRM_Default(CHOP_PARM_COUNT, CHOP_TAB), \
00113 }
00114
00115 #define CHOP_SWITCHER5(cnt1,nm1,cnt2, nm2,cnt3,nm3,cnt4,nm4,cnt5,nm5) \
00116 static PRM_Default switcher[6] = \
00117 { \
00118 PRM_Default(cnt1, nm1), \
00119 PRM_Default(cnt2, nm2), \
00120 PRM_Default(cnt3, nm3), \
00121 PRM_Default(cnt4, nm4), \
00122 PRM_Default(cnt5, nm5), \
00123 PRM_Default(CHOP_PARM_COUNT, CHOP_TAB), \
00124 }
00125
00126 #define CHOP_SWITCHER6(cnt1,nm1,cnt2, nm2,cnt3,nm3,cnt4,nm4,cnt5,nm5,cnt6,nm6) \
00127 static PRM_Default switcher[7] = \
00128 { \
00129 PRM_Default(cnt1, nm1), \
00130 PRM_Default(cnt2, nm2), \
00131 PRM_Default(cnt3, nm3), \
00132 PRM_Default(cnt4, nm4), \
00133 PRM_Default(cnt5, nm5), \
00134 PRM_Default(cnt6, nm6), \
00135 PRM_Default(CHOP_PARM_COUNT, CHOP_TAB), \
00136 }
00137
00138 enum CHOP_SampleMatch { FIRST_RATE = 0,
00139 SAMPLE_MAX_RATE,
00140 SAMPLE_MIN_RATE,
00141 ERROR_IF_DIFF };
00142
00143 #define ARG_CHOP_SCOPE (myParmCommonBase + 0)
00144 #define ARG_CHOP_MATCH (myParmCommonBase + 1)
00145 #define ARG_CHOP_UNITS (myParmCommonBase + 2)
00146 #define ARG_CHOP_REALTIME (myParmCommonBase + 3)
00147 #define ARG_CHOP_UNLOAD (myParmCommonBase + 4)
00148 #define ARG_CHOP_EXPORT_PATH (myParmCommonBase + 5)
00149 #define ARG_CHOP_DCOLOR (myParmCommonBase + 6)
00150 #define ARG_CHOP_COLSTEP (myParmCommonBase + 7)
00151
00152
00153
00154 class CHOP_API CHOP_Node : public OP_Network
00155 {
00156 public:
00157
00158 virtual const char *getChildType() const;
00159 virtual const char *getOpType() const;
00160
00161 virtual OP_OpTypeId getChildTypeID() const;
00162 virtual OP_OpTypeId getOpTypeID() const;
00163
00164 virtual OP_DATA_TYPE getCookedDataType() const;
00165 static void buildOperatorTable(OP_OperatorTable &table);
00166 static void buildGameOperatorTable(OP_OperatorTable &table);
00167
00168 static OP_TemplatePair myTemplatePair;
00169 static OP_VariablePair myVariablePair;
00170 static PRM_Template myTemplateList[];
00171 static CH_LocalVariable myVariableList[];
00172
00173 virtual int getAudio() const;
00174 virtual int getExport() const;
00175 virtual int setAudio(int on_off);
00176 virtual int setExport(int on_off);
00177
00178
00179
00180
00181
00182 virtual OP_ERROR cookMyChop(OP_Context &context) = 0;
00183 virtual void cookMyHandles(OP_Context &context);
00184 CHOP_HandleList *getHandles(OP_Context &context);
00185
00186
00187
00188 virtual CHOP_Node *getAudioNodePtr()
00189 { return 0; }
00190
00191
00192 virtual const CL_Clip *getClip(OP_Context *context = 0);
00193
00194 int64 getMemoryUsage(void) const;
00195 const CL_Clip *inputClip(int idx, OP_Context &context);
00196 CL_Track *getTrack(const char *name);
00197 float getSampleRate();
00198
00199 UT_Color getColor(unsigned int index = 0) const;
00200
00201 virtual CH_Channel *getTrackChannel(const char *name);
00202
00203
00204
00205
00206 void globTracks(const char *pattern,
00207 CL_TrackListC *tlist,
00208 UT_PtrArray<OP_Node *> *olist = 0,
00209 OP_GlobContext *context = 0,
00210 int do_cook = 0,
00211 float t = 0,
00212 OP_Node *dependent = 0);
00213
00214
00215
00216
00217
00218 static float getGlobalRate(void);
00219
00220 static float getGlobalStart();
00221 static float getGlobalEnd();
00222
00223 static float getGlobalSampleStep();
00224
00225
00226
00227
00228 virtual float handleChanged(CHOP_Handle *handle,
00229 CHOP_HandleData *data);
00230
00231
00232
00233 int buildCacheInfo(OP_Context &context,
00234 CHOP_OutputClipManager *mgr);
00235
00236
00237
00238 int putNote(float t, const char *);
00239 int putNote(float t, int index);
00240 int putNote(int index, const char *);
00241
00242 const char *getNote(float t0) const;
00243 const char *getNote(int index) const;
00244 int getNotes(float t0, float t1,
00245 CHOP_NoteList &clist,
00246 CHOP_TimeList &tlist) const;
00247
00248
00249
00250
00251 OP_Channels *getFitData();
00252 void resampleFromFit();
00253 void setFitParms(const CL_FitParms &parms);
00254 void getFitParms(CL_FitParms &parms) const;
00255
00256
00257
00258
00259
00260 int copyFitChannels();
00261
00262
00263
00264
00265
00266
00267 static void addError(int code, const char *msg = 0)
00268 { UTaddError("CHOP", code, msg);}
00269
00270 static void addWarning(int code, const char *msg=0)
00271 { UTaddWarning("CHOP", code, msg);}
00272
00273
00274
00275
00276 static void setConflictCallback(CHOP_ConflictCallback func,
00277 void *data)
00278 {
00279 theConflictCallback = func;
00280 theConflictData = data;
00281 }
00282
00283
00284
00285
00286
00287 virtual void setExtraFlag(char flag, int onoff);
00288
00289
00290
00291
00292
00293
00294 virtual float shiftStart(float new_offset, float t);
00295
00296
00297
00298
00299 virtual void opChanged(OP_EventType reason, void *data=0);
00300 virtual int propagateModification(OP_Node *by_whom,
00301 OP_EventType reason,
00302 int parm_index,
00303 OP_PropagateData &data);
00304
00305
00306 virtual int usesRealtime() { return 0; }
00307 virtual int isRealtimeCook() { return 0; }
00308 virtual OP_ERROR doCookRealtime(OP_Context &context);
00309
00310 virtual void realtimeInit(float t);
00311 virtual void realtimeCleanup();
00312
00313
00314 virtual int getModifiedRange(int &first,int &last,int clear=1);
00315
00316 static void installCommands();
00317
00318
00319 static void setMaxSliceSize(float size) { myMaxRealtimeSlice = size; }
00320 static float getMaxSliceSize() { return myMaxRealtimeSlice; }
00321 static void setTimeSliceDefault(int state) { myTimeSliceDefault = state; }
00322 static int getTimeSliceDefault() { return myTimeSliceDefault; }
00323
00324 static void setSmartCook(int f) { mySmartCookFlag = f; }
00325 static int getSmartCook() { return mySmartCookFlag; }
00326
00327
00328
00329
00330
00331 static void buildEditorMenu(void *, PRM_Name *, int,
00332 const PRM_SpareData *, PRM_Parm *);
00333 static void buildNetMenu(void *, PRM_Name *, int,
00334 const PRM_SpareData *, PRM_Parm *);
00335 static void buildNodeMenu(void *, PRM_Name *, int,
00336 const PRM_SpareData *, PRM_Parm *);
00337
00338
00339
00340
00341
00342 int limitInfo() const
00343 { return myLimitInfo; }
00344
00345 void limitInfo(int yesno)
00346 { myLimitInfo = yesno; }
00347
00348
00349
00350 virtual void setMapping(int idx, int type, const char *label = 0);
00351 virtual int getMapping(int idx, const char *&label) const;
00352
00353 virtual void getNodeSpecificInfoText(OP_Context &context,
00354 int verbose,
00355 UT_WorkBuffer &text);
00356 void saveMapping( ostream &os, bool binary ) const;
00357 bool loadMapping( UT_IStream &is );
00358
00359
00360 virtual fpreal getW() const;
00361
00362 virtual fpreal getH() const;
00363
00364
00365
00366
00367 virtual void updateExports();
00368
00369
00370
00371 virtual bool findParmFromTrack(float t, const char *trackname,
00372 OP_Node *&node, PRM_Parm *&parm,
00373 int &vecidx);
00374
00375 protected:
00376 CHOP_Node(OP_Network *parent, const char *name, OP_Operator *entry);
00377 virtual ~CHOP_Node();
00378
00379 virtual void inputConnectChanged(int which_input);
00380
00381
00382 virtual void nodeUnlocked();
00383
00384
00385
00386 virtual void clearAndDestroy(void);
00387
00388 virtual OP_ERROR preCook(OP_Context &context);
00389 virtual void postCook();
00390
00391 virtual OP_ERROR cookMe(OP_Context &context);
00392 virtual OP_ERROR bypassMe (OP_Context &context, int &);
00393 virtual unsigned disableParms();
00394
00395 void initCommonBaseParm();
00396
00397 virtual void buildOpDependencies();
00398
00399
00400
00401 virtual void handleOpDependency( int referenced_op_id,
00402 const OP_Dependency &op_dep,
00403 OP_InterestType interest_type,
00404 bool &need_cook,
00405 const char *old_fullpath,
00406 const char *old_cwd,
00407 const char *old_chan_name);
00408
00409
00410
00411 virtual void handleChanNameDependency(const UT_String &chan_token,
00412 const UT_String &chan_alias,
00413 const char *old_chan_name,
00414 bool &need_cook);
00415
00416
00417
00418
00419
00420
00421
00422
00423 static void renameChanReference(UT_ExpandArray &chan_array,
00424 const UT_String &chan_token,
00425 const UT_String &chan_alias,
00426 const char *old_chan_name,
00427 bool &need_cook,
00428 UT_String &new_pattern);
00429
00430
00431 void addParmReferences(
00432 const UT_RefArray<opParmData> *plist,
00433 const CH_ChannelList *clist);
00434
00435
00436
00437
00438
00439 virtual int usesScope() const;
00440 virtual int usesSampleMatch() const;
00441 virtual int usesUnits();
00442
00443
00444
00445
00446
00447 void getScopedTracks(const CL_Clip *, CL_TrackListC &);
00448 int isScoped(const UT_String &name);
00449
00450
00451
00452
00453
00454 void destroyClip(void);
00455 void destroyHandles(void);
00456
00457
00458
00459
00460 const CL_Clip *copyInputAttributes(OP_Context &context,
00461 int destroy = 1);
00462
00463
00464
00465
00466
00467
00468 const CL_Clip *copyInput(OP_Context &context, int idx,
00469 int data, int slerps);
00470
00471
00472
00473
00474
00475
00476 float toSampleLength(float len,
00477 CL_Unit unit = UNIT_NONE,
00478 int end_width = 0);
00479 float toSample(float val,
00480 CL_Unit unit = UNIT_NONE,
00481 int end_width = 0);
00482 float toUnitLength(float len,
00483 CL_Unit unit = UNIT_NONE,
00484 int end_width = 0);
00485 float toUnit(float index,
00486 CL_Unit unit = UNIT_NONE,
00487 int end_width = 0);
00488
00489
00490
00491
00492
00493
00494 float toStandardStart(float is, OP_Context context,
00495 int relative, int ref_input = 1);
00496
00497 float toStandardEnd(float is, OP_Context context,
00498 int relative, int ref_input = 1);
00499
00500 float fromStandardStart(float os, OP_Context context,
00501 int relative, int ref_input,
00502 CL_Unit unit = UNIT_NONE);
00503
00504 float fromStandardEnd(float oe, OP_Context context,
00505 int relative, int ref_input,
00506 CL_Unit unit = UNIT_NONE);
00507
00508
00509
00510
00511
00512
00513 virtual int saveCookedData(const char *, OP_Context &);
00514 virtual int saveCookedData(ostream &os, OP_Context &, int binary);
00515 virtual bool loadCookedData(UT_IStream &is, const char*);
00516 virtual const char *getFileExtension(int binary) const;
00517 virtual void deleteCookedData();
00518
00519 virtual OP_ERROR save(ostream &os, const OP_SaveFlags &flags,
00520 const char *pathPrefix);
00521 virtual bool load(UT_IStream &is, const char *extension,
00522 const char *path=0);
00523
00524
00525
00526 void resetChangedSourceFlags();
00527
00528
00529
00530
00531
00532
00533
00534 bool useInputSource(unsigned idx, bool &changed, bool force)
00535 {
00536 return myInputChangeHelper.useInput(
00537 *this, idx, changed, force);
00538 }
00539
00540
00541
00542
00543
00544 void SCOPE_STRING(UT_String &str)
00545 { evalString(str,ARG_CHOP_SCOPE, 0, 0); }
00546
00547 CHOP_SampleMatch SAMPLE_MATCH()
00548 { return (CHOP_SampleMatch)
00549 evalInt(ARG_CHOP_MATCH, 0, 0); }
00550
00551 CL_Unit UNITS()
00552 { return (CL_Unit)
00553 evalInt(ARG_CHOP_UNITS, 0, 0); }
00554
00555 int REALTIME()
00556 { return evalInt(ARG_CHOP_REALTIME,0,0); }
00557
00558 int UNLOAD()
00559 { return evalInt(ARG_CHOP_UNLOAD,0,0); }
00560
00561 void EXPORT_PATH(UT_String &str)
00562 { evalString(str, ARG_CHOP_EXPORT_PATH, 0, 0); }
00563
00564 short myParmBase;
00565 short myParmCommonBase;
00566
00567 CL_Clip *myClip;
00568 CHOP_HandleList myHandles;
00569 float myHandleCookTime;
00570
00571
00572
00573
00574
00575 static void getStaticInterval(float t, int &istart, int &iend,
00576 int &last_iend, float start,
00577 float end, int current,
00578 const CL_Clip *clip);
00579
00580 virtual int getNetOverviewColor( UT_Color &color );
00581
00582 static void buildScopeMenu(void *data,
00583 PRM_Name *menuEntries, int thelistsize,
00584 const PRM_SpareData *spare, PRM_Parm *);
00585
00586
00587
00588
00589
00590 virtual const orUnitList *getOverrideUnits() const
00591 { return 0; }
00592
00593 virtual void stealOverrideUnits(orUnitList & )
00594 { }
00595
00596
00597
00598
00599
00600 void getMenuPath(UT_String &base,
00601 const UT_String &edit,
00602 const UT_String &net,
00603 const UT_String &node,
00604 int add_inputs = 1);
00605
00606 virtual void EDITOR_PATH(UT_String &str);
00607 virtual void NET_PATH(UT_String &str);
00608
00609
00610
00611 void setUnloadParent()
00612 { myUnloadParent = 1; }
00613
00614 private:
00615
00616
00617
00618
00619
00620 void updateOverrides();
00621 static void updateConflicts(void *data, int replace);
00622
00623 void saveOverrideUnits(ostream &os, bool binary);
00624 bool loadOverrideUnits(UT_IStream &is);
00625
00626 void destroyScopePatterns();
00627
00628 float getInputRate(int input_idx);
00629 static void initializeExpressions();
00630 void notifyOverrides(const OP_NodeList &list,
00631 const UT_IntArray &indices);
00632 void getFitInterval(int &istart, int &iend);
00633
00634 OP_ERROR doCook(OP_Context &context, int bypass);
00635
00636 void buildChannelMenu(PRM_Name *menuEntries,
00637 int themenusize);
00638
00639 bool loadFitData(UT_IStream &is, const char *path);
00640 void destroyAllFitData();
00641 void createFitCollection();
00642 void destroyFitCollection();
00643
00644 bool haveSeenModification( long counter );
00645
00646
00647 private:
00648
00649 char myUnloadParent;
00650
00651
00652
00653
00654 UT_ExpandArray myScopePatterns;
00655 char myScopeAll;
00656
00657 static PRM_ChoiceList scopeMenu;
00658 CHOP_Notes myNotes;
00659
00660 OP_Channels *myFitCollection;
00661 CL_Clip *myFitClip;
00662 CL_FitParms *myFitParms;
00663 float myFitError2;
00664 int myFitDirty;
00665 CHOP_Fitter *myFitter;
00666 orPath *myOrPathParms;
00667 int myRealtimeCookState;
00668
00669 static float myMaxRealtimeSlice;
00670 static int myTimeSliceDefault;
00671 static int mySmartCookFlag;
00672
00673 static int myLimitInfo;
00674
00675 OP_VERSION myHandleVersionParms;
00676
00677 static CHOP_ConflictCallback theConflictCallback;
00678 static void *theConflictData;
00679
00680 char myConflictPending;
00681
00682 OR_Mapping *myMapping;
00683
00684 long myLastModification;
00685
00686 OP_InputChangeHelper myInputChangeHelper;
00687
00688
00689 friend class CHOP_UndoFitDestroy;
00690 };
00691
00692
00693
00694 CHOP_API extern void
00695 CHOPgetVexReservedTemplateLists(UT_PtrArray<PRM_Template *> &tplatelists);
00696
00697 #undef FLT_PARM
00698 #undef INT_PARM
00699 #undef STR_PARM
00700 #undef FLT_SET
00701
00702 #endif