00001 /* 00002 * PROPRIETARY INFORMATION. This software is proprietary to 00003 * Side Effects Software Inc., and is not to be reproduced, 00004 * transmitted, or disclosed in any way without written permission. 00005 * 00006 * Produced by: 00007 * Ramin Kamal 00008 * Side Effects Software Inc 00009 * 477 Richmond Street West 00010 * Toronto, Ontario 00011 * Canada M5V 3E7 00012 * 416-504-9876 00013 * 00014 * NAME: OBJ_Shared.h ( Object Library, C++) 00015 * 00016 * COMMENTS: 00017 * These are structures that are needed by the rest of the 00018 * object library. 00019 */ 00020 00021 #ifndef __OBJ_Shared__ 00022 #define __OBJ_Shared__ 00023 00024 #include "OBJ_API.h" 00025 #include <UT/UT_Assert.h> 00026 #include <PRM/PRM_Default.h> 00027 00028 // These macros are used by all objects as a simple way of copying a 00029 // PRM_Template from one of the arrays below into their own PRM_Template 00030 // array. The second form exports the parm to the toolbox. 00031 class obj_SwitcherBuilder { 00032 public: 00033 obj_SwitcherBuilder(PRM_Default *switcher, int maxsize) 00034 { 00035 myPrev = 0; 00036 mySwitcher = switcher; 00037 myFolder = -1; 00038 myMaxSize = maxsize; 00039 myCount = 0; 00040 } 00041 ~obj_SwitcherBuilder() 00042 { 00043 UT_ASSERT(!myPrev && theCurrentSwitcher != this); 00044 if (theCurrentSwitcher == this) 00045 pop(); 00046 if (myFolder >= 0 && myFolder != myMaxSize) 00047 { 00048 UT_ASSERT(0 && "Forgot to call finish() didn't you?"); 00049 endFolder(); 00050 } 00051 } 00052 void push() 00053 { 00054 UT_ASSERT(myPrev == 0); 00055 myPrev = theCurrentSwitcher; 00056 theCurrentSwitcher = this; 00057 } 00058 static void pop() 00059 { 00060 UT_ASSERT(theCurrentSwitcher); 00061 obj_SwitcherBuilder *prev; 00062 prev = theCurrentSwitcher->myPrev; 00063 theCurrentSwitcher->myPrev = 0; 00064 theCurrentSwitcher = prev; 00065 } 00066 static void folder(const char *label) 00067 { 00068 UT_ASSERT(theCurrentSwitcher); 00069 theCurrentSwitcher->startFolder(label); 00070 } 00071 static void finish() 00072 { 00073 UT_ASSERT(theCurrentSwitcher); 00074 theCurrentSwitcher->endFolder(); 00075 pop(); 00076 } 00077 static void add() 00078 { 00079 if (theCurrentSwitcher) 00080 { 00081 UT_ASSERT(theCurrentSwitcher->isValid()); 00082 theCurrentSwitcher->myCount++; 00083 } 00084 } 00085 private: 00086 bool isValid() const 00087 { 00088 return myFolder >= 0 && myFolder < myMaxSize; 00089 } 00090 void startFolder(const char *label) 00091 { 00092 if (myCount || myFolder >= 0) 00093 { 00094 UT_ASSERT(myCount && myFolder >= 0); 00095 mySwitcher[myFolder].setOrdinal(myCount); 00096 } 00097 myFolder++; 00098 UT_ASSERT(myFolder < myMaxSize); 00099 mySwitcher[myFolder].setString(label); 00100 myCount = 0; 00101 } 00102 void endFolder() 00103 { 00104 // This is only called on the last folder 00105 UT_ASSERT(myCount > 0); 00106 UT_ASSERT(myFolder == myMaxSize-1); 00107 mySwitcher[myFolder].setOrdinal(myCount); 00108 myFolder = myMaxSize; 00109 } 00110 static obj_SwitcherBuilder *theCurrentSwitcher; 00111 obj_SwitcherBuilder *myPrev; 00112 PRM_Default *mySwitcher; 00113 int myFolder; 00114 int myCount; 00115 int myMaxSize; 00116 }; 00117 00118 00119 #define SET_DECL_SWITCHER(builder, switcher) \ 00120 obj_SwitcherBuilder builder(switcher, sizeof(switcher)/sizeof(PRM_Default)); 00121 #define SET_PUSH_SWITCHER(builder) builder.push(); 00122 #define SET_FOLDER(label) obj_SwitcherBuilder::folder(label); 00123 #define SET_POP_SWITCHER() obj_SwitcherBuilder::finish(); 00124 #define SET_TPLATE(src, idx) \ 00125 theTemplate[i] = src[idx]; i++; obj_SwitcherBuilder::add(); 00126 #define SET_TPLATE_NOINC(src, idx) \ 00127 theTemplate[i] = src[idx]; i++; 00128 #define SET_ADDED_TPLATE() obj_SwitcherBuilder::add(); 00129 #define SET_TPLATE_EX(src, idx) \ 00130 theTemplate[i] = src[idx]; \ 00131 obj_SwitcherBuilder::add(); \ 00132 theTemplate[i].setExportLevel(PRM_Template::PRM_EXPORT_TBX); i++; 00133 00134 class PRM_Template; 00135 00136 OBJ_API extern PRM_Template OBJbaseObsolete[]; 00137 OBJ_API extern PRM_Template OBJboneObsolete[]; 00138 OBJ_API extern PRM_Template OBJdopnetObsolete[]; 00139 OBJ_API extern PRM_Template OBJgeoObsolete[]; 00140 OBJ_API extern PRM_Template OBJcamObsolete[]; 00141 OBJ_API extern PRM_Template OBJfogObsolete[]; 00142 OBJ_API extern PRM_Template OBJambientObsolete[]; 00143 OBJ_API extern PRM_Template OBJlightObsolete[]; 00144 OBJ_API extern PRM_Template OBJfetchObsolete[]; 00145 OBJ_API extern PRM_Template OBJsoundObsolete[]; 00146 OBJ_API extern PRM_Template OBJmicrophoneObsolete[]; 00147 OBJ_API extern PRM_Template OBJhandleObsolete[]; 00148 OBJ_API extern PRM_Template OBJblendObsolete[]; 00149 00150 OBJ_API extern PRM_Template OBJbaseTemplate[]; 00151 OBJ_API extern PRM_Template OBJgeoTemplate[]; 00152 OBJ_API extern PRM_Template OBJnullTemplate[]; 00153 OBJ_API extern PRM_Template OBJboneTemplate[]; 00154 OBJ_API extern PRM_Template OBJcamTemplate[]; 00155 OBJ_API extern PRM_Template OBJcamSwitchTemplate[]; 00156 OBJ_API extern PRM_Template OBJstereoCameraTemplate[]; 00157 OBJ_API extern PRM_Template OBJambientTemplate[]; 00158 OBJ_API extern PRM_Template OBJfogTemplate[]; 00159 OBJ_API extern PRM_Template OBJhandleTemplate[]; 00160 OBJ_API extern PRM_Template OBJblendTemplate[]; 00161 OBJ_API extern PRM_Template OBJsoundTemplate[]; 00162 OBJ_API extern PRM_Template OBJmicrophoneTemplate[]; 00163 OBJ_API extern PRM_Template OBJsubnetTemplate[]; 00164 OBJ_API extern PRM_Template OBJfetchTemplate[]; 00165 OBJ_API extern PRM_Template OBJstickyTemplate[]; 00166 OBJ_API extern PRM_Template OBJstickyBlendTemplate[]; 00167 OBJ_API extern PRM_Template OBJstickySharedTemplate[]; 00168 OBJ_API extern PRM_Template OBJdopnetTemplate[]; 00169 OBJ_API extern PRM_Template OBJrivetTemplate[]; 00170 OBJ_API extern PRM_Template OBJmuscleTemplate[]; 00171 00172 OBJ_API extern PRM_Template OBJbaseITemplate[]; 00173 OBJ_API extern PRM_Template OBJgeoITemplate[]; 00174 OBJ_API extern PRM_Template OBJnullITemplate[]; 00175 OBJ_API extern PRM_Template OBJboneITemplate[]; 00176 OBJ_API extern PRM_Template OBJcamITemplate[]; 00177 OBJ_API extern PRM_Template OBJcamSwitchITemplate[]; 00178 OBJ_API extern PRM_Template OBJstereoCameraITemplate[]; 00179 OBJ_API extern PRM_Template OBJambientITemplate[]; 00180 OBJ_API extern PRM_Template OBJfogITemplate[]; 00181 OBJ_API extern PRM_Template OBJhandleITemplate[]; 00182 OBJ_API extern PRM_Template OBJblendITemplate[]; 00183 OBJ_API extern PRM_Template OBJsoundITemplate[]; 00184 OBJ_API extern PRM_Template OBJmicrophoneITemplate[]; 00185 OBJ_API extern PRM_Template OBJsubnetITemplate[]; 00186 OBJ_API extern PRM_Template OBJfetchITemplate[]; 00187 OBJ_API extern PRM_Template OBJstickyITemplate[]; 00188 OBJ_API extern PRM_Template OBJstickySharedITemplate[]; 00189 OBJ_API extern PRM_Template OBJstickyBlendITemplate[]; 00190 OBJ_API extern PRM_Template OBJdopnetITemplate[]; 00191 OBJ_API extern PRM_Template OBJrivetITemplate[]; 00192 OBJ_API extern PRM_Template OBJmuscleITemplate[]; 00193 00194 OBJ_API extern const char *displaySopToken; 00195 OBJ_API extern const char *renderSopToken; 00196 OBJ_API extern const char *boundingBoxToken; 00197 OBJ_API extern const char *boundingSphereToken; 00198 OBJ_API extern const char *input1ObjectToken; 00199 OBJ_API extern const char *input2ObjectToken; 00200 OBJ_API extern const char *input3ObjectToken; 00201 OBJ_API extern const char *input4ObjectToken; 00202 00203 #endif
1.5.9