00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __SOP_Muscle_h__
00022 #define __SOP_Muscle_h__
00023
00024 #include "SOP_API.h"
00025 #include <CH/CH_Channel.h>
00026 #include <PRM/PRM_Include.h>
00027 #include <PRM/PRM_Shared.h>
00028 #include <PRM/PRM_Name.h>
00029 #include <UT/UT_PtrArray.h>
00030 #include <UT/UT_RefArray.h>
00031 #include <UT/UT_FloatArray.h>
00032 #include "SOP_Node.h"
00033
00034 enum {
00035 SOP_MUSCLE_SWITCHER = 0,
00036
00037 #define SOP_MUSCLE_NUM_MUSCLE_PARMS (25)
00038 SOP_MUSCLE_NAME,
00039 SOP_MUSCLE_RESTANCHOR,
00040 SOP_MUSCLE_POSITIONBIAS,
00041 SOP_MUSCLE_SCALE,
00042
00043 #define SOP_MUSCLE_NUM_MODEL_PARMS (17)
00044 SOP_MUSCLE_HANDLEHEADING,
00045
00046 SOP_MUSCLE_PRIMSPERSEGMENT,
00047
00048 SOP_MUSCLE_CONTROL1,
00049 SOP_MUSCLE_CONTROL1SCALE,
00050 SOP_MUSCLE_SEPARATOR1,
00051
00052 SOP_MUSCLE_CONTROL2,
00053 SOP_MUSCLE_CONTROL2SCALE,
00054 SOP_MUSCLE_CONTROL2POS,
00055 SOP_MUSCLE_SEPARATOR2,
00056
00057 SOP_MUSCLE_CONTROL3,
00058 SOP_MUSCLE_CONTROL3SCALE,
00059 SOP_MUSCLE_CONTROL3POS,
00060 SOP_MUSCLE_SEPARATOR3,
00061
00062 SOP_MUSCLE_CONTROL4,
00063 SOP_MUSCLE_CONTROL4SCALE,
00064 SOP_MUSCLE_CONTROL4POS,
00065 SOP_MUSCLE_SEPARATOR4,
00066
00067 SOP_MUSCLE_CONTROL5,
00068 SOP_MUSCLE_CONTROL5SCALE,
00069
00070 SOP_MUSCLE_ENDSEPARATOR,
00071
00072 SOP_MUSCLE_NUMINPUTS,
00073
00074 #define SOP_MUSCLE_NUM_PREFERENCE_PARMS (5)
00075 SOP_MUSCLE_TYPE,
00076 SOP_MUSCLE_COLORTOGGLE,
00077 SOP_MUSCLE_COLOR,
00078 SOP_MUSCLE_ENABLEGRADIENT,
00079 SOP_MUSCLE_GRADIENT,
00080
00081 #define SOP_MUSCLE_NUM_CENTERLINE_PARMS (5)
00082 SOP_MUSCLE_BASIS,
00083 SOP_MUSCLE_SAMPLEDIVS,
00084 SOP_MUSCLE_FIRSTCV,
00085 SOP_MUSCLE_LASTCV,
00086 SOP_MUSCLE_CVTENSION,
00087
00088 SOP_MUSCLE_NUMPARMS
00089 };
00090
00091
00092 enum SOP_MuscleType {
00093 SOP_MUSCLE_META = 0,
00094 SOP_MUSCLE_SPHERE
00095 };
00096
00097
00098 enum sop_MuscleControlType {
00099 SOP_MUSCLE_PROFILES = 0,
00100 SOP_MUSCLE_HANDLES
00101 };
00102
00103 #define NUM_SEGMENTS 4
00104 #define DEFAULT_CENTER_GROUP "center"
00105
00106 class GU_DetailHandle;
00107 class GU_PrimPoly;
00108 class GU_MuscleParms;
00109 class GU_Muscle;
00110
00111 class UT_FloatArray;
00112 class UT_String;
00113 class UT_Vector3Array;
00114
00115 class SOP_API SOP_Muscle : public SOP_Node
00116 {
00117 public:
00118 SOP_Muscle(OP_Network *net, const char *name, OP_Operator *entry);
00119 virtual ~SOP_Muscle();
00120
00121 virtual unsigned disableParms();
00122
00123 static OP_Node *myConstructor(OP_Network *net, const char *name,
00124 OP_Operator *entry);
00125
00126 static PRM_Template myTemplateList[];
00127
00128
00129
00130 void changeGradient()
00131 { myGradientChanged = true; }
00132
00133
00134
00135 void changeInputs();
00136
00137 bool getTranslates(OP_Context &context,
00138 UT_RefArray<UT_Matrix4> &translates);
00139
00140 bool getRotates(OP_Context &context,
00141 UT_RefArray<UT_Matrix4> &rotates);
00142
00143 const GEO_PrimPoly *getCenterCurve(OP_Context &context);
00144
00145 void getCurrColorValues(UT_Vector3 &color)
00146 {
00147 color[0] = myCurrColorValuesRGB[0];
00148 color[1] = myCurrColorValuesRGB[1];
00149 color[2] = myCurrColorValuesRGB[2];
00150 }
00151
00152 protected:
00153 virtual OP_ERROR cookMySop(OP_Context &context);
00154 virtual const char *inputLabel(unsigned idx) const;
00155
00156
00157
00158 virtual void checkChannelDependencies(
00159 CH_Channel *ch,
00160 CH_CHANGE_TYPE reason);
00161
00162 private:
00163
00164
00165
00166
00167 OP_ERROR setupInputs(int numInputs);
00168
00169
00170 void cookFailed();
00171
00172
00173
00174 void setupGradientValues(int numMeta, float t);
00175
00176
00177 void verifyNames();
00178
00179 void setupMuscleParms(GU_MuscleParms &parms,
00180 float &t);
00181
00182 bool getInputsChanged();
00183
00184 GU_Muscle *getGUMuscle();
00185
00186
00187 int NUMINPUTS()
00188 {
00189 return evalInt(SOP_MUSCLE_NUMINPUTS, 0, 0);
00190 }
00191
00192 void INPUTSTRING(int i, UT_String &str)
00193 {
00194 evalStringInst("inputname#", &i, str, 0, 0);
00195 }
00196
00197 void RESTANCHOR(UT_String &str)
00198 {
00199 evalString(str, SOP_MUSCLE_RESTANCHOR, 0, 0);
00200 }
00201
00202 void CENTERGROUP(UT_String &str)
00203 {
00204 str = DEFAULT_CENTER_GROUP;
00205 }
00206
00207 float POSITIONBIAS()
00208 {
00209 return evalFloat(SOP_MUSCLE_POSITIONBIAS, 0, 0);
00210 }
00211
00212 SOP_MuscleType MUSCLETYPE()
00213 {
00214 int type = evalInt(SOP_MUSCLE_TYPE, 0, 0);
00215
00216 switch (type)
00217 {
00218 case SOP_MUSCLE_META:
00219 return SOP_MUSCLE_META;
00220 case SOP_MUSCLE_SPHERE:
00221 return SOP_MUSCLE_SPHERE;
00222 default:
00223 return SOP_MUSCLE_META;
00224 }
00225 }
00226
00227 void MUSCLENAME(UT_String &str)
00228 {
00229 evalString(str, SOP_MUSCLE_NAME, 0, 0);
00230 }
00231
00232 bool DOCOLOR()
00233 {
00234 return evalInt(SOP_MUSCLE_COLORTOGGLE, 0, 0);
00235 }
00236
00237 float CR(float t)
00238 {
00239 return evalFloat(SOP_MUSCLE_COLOR, 0, t);
00240 }
00241
00242 float CG(float t)
00243 {
00244 return evalFloat(SOP_MUSCLE_COLOR, 1, t);
00245 }
00246
00247 float CB(float t)
00248 {
00249 return evalFloat(SOP_MUSCLE_COLOR, 2, t);
00250 }
00251
00252 int BASIS()
00253 {
00254 return evalInt(SOP_MUSCLE_BASIS, 0, 0);
00255 }
00256
00257 int SAMPLEDIVS(float t)
00258 {
00259 return evalInt(SOP_MUSCLE_SAMPLEDIVS, 0, t);
00260 }
00261
00262 int FIRSTCV(float t)
00263 {
00264 return evalInt(SOP_MUSCLE_FIRSTCV, 0, t);
00265 }
00266
00267 int LASTCV(float t)
00268 {
00269 return evalInt(SOP_MUSCLE_LASTCV, 0, t);
00270 }
00271
00272 float CVTENSION(float t)
00273 {
00274 return evalFloat(SOP_MUSCLE_CVTENSION, 0, t);
00275 }
00276
00277 bool DOGRADIENT()
00278 {
00279 return evalInt(SOP_MUSCLE_ENABLEGRADIENT, 0, 0);
00280 }
00281
00282 float GRADIENT(float t)
00283 {
00284 return evalFloat(SOP_MUSCLE_GRADIENT, 0, t);
00285 }
00286
00287 float CONTROL1SCALE(int i, float t)
00288 {
00289 return evalFloat(SOP_MUSCLE_CONTROL1SCALE, i, t);
00290 }
00291
00292 float CONTROL2SCALE(int i, float t)
00293 {
00294 return evalFloat(SOP_MUSCLE_CONTROL2SCALE, i, t);
00295 }
00296
00297 float CONTROL3SCALE(int i, float t)
00298 {
00299 return evalFloat(SOP_MUSCLE_CONTROL3SCALE, i, t);
00300 }
00301
00302 float CONTROL4SCALE(int i, float t)
00303 {
00304 return evalFloat(SOP_MUSCLE_CONTROL4SCALE, i, t);
00305 }
00306
00307 float CONTROL5SCALE(int i, float t)
00308 {
00309 return evalFloat(SOP_MUSCLE_CONTROL5SCALE, i, t);
00310 }
00311
00312 float CONTROL2POS(float t)
00313 {
00314 return evalFloat(SOP_MUSCLE_CONTROL2POS, 0, t);
00315 }
00316
00317 float CONTROL3POS(float t)
00318 {
00319 return evalFloat(SOP_MUSCLE_CONTROL3POS, 0, t);
00320 }
00321
00322 float CONTROL4POS(float t)
00323 {
00324 return evalFloat(SOP_MUSCLE_CONTROL4POS, 0, t);
00325 }
00326
00327 int PRIMSPERSEGMENT()
00328 {
00329 return evalInt(SOP_MUSCLE_PRIMSPERSEGMENT, 0, 0);
00330 }
00331
00332 float MUSCLESCALE(int i, float t)
00333 {
00334 return evalFloat(SOP_MUSCLE_SCALE, i, t);
00335 }
00336
00337 private:
00338
00339
00340
00341 GB_PrimitiveGroup *myPrimitives;
00342
00343
00344
00345 int myNumPrimitives;
00346
00347
00348
00349
00350
00351
00352 GB_PointGroup *myCenterPoints;
00353
00354
00355 UT_PtrArray<OP_Node *> myAnchorInputs;
00356
00357
00358
00359 UT_PtrArray<SOP_Node *> mySOPInputs;
00360
00361
00362 UT_RefArray<GU_DetailHandle> myAnchorGdhs;
00363
00364
00365 UT_PtrArray<const GU_Detail *> myAnchorGdps;
00366
00367
00368
00369 UT_RefArray<UT_String> myAnchorPaths;
00370
00371
00372
00373 bool myGradientChanged;
00374
00375
00376 UT_FloatArray myGradientValues;
00377
00378
00379 UT_Vector3 myCurrColorValuesRGB;
00380
00381
00382
00383
00384 bool myIsDirty;
00385
00386
00387
00388 bool myInputsChanged;
00389
00390
00391 SOP_MuscleType myCurrentType;
00392
00393
00394
00395 GU_Detail *myExtraGdp;
00396
00397 GU_Muscle *myMuscle;
00398
00399 GU_MuscleParms *myMuscleParms;
00400 };
00401
00402 #endif