00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <UT/UT_DSOVersion.h>
00032 #include <UT/UT_DirUtil.h>
00033 #include <GU/GU_Detail.h>
00034 #include <PRM/PRM_Include.h>
00035 #include <PRM/PRM_SpareData.h>
00036 #include <PRM/PRM_Parm.h>
00037 #include <OP/OP_Director.h>
00038 #include <OP/OP_Operator.h>
00039 #include <OP/OP_OperatorTable.h>
00040
00041 #include "SOP_HDKObject.h"
00042
00043 using namespace HDK_Sample;
00044
00045
00046 void
00047 newSopOperator(OP_OperatorTable *table)
00048 {
00049 table->addOperator(new OP_Operator("proto_objectmerge",
00050 "HDK Object Merge",
00051 SOP_HDKObject::myConstructor,
00052 SOP_HDKObject::myTemplateList,
00053 0, 0, 0, OP_FLAG_GENERATOR));
00054 }
00055
00056 static PRM_Name objnames[] =
00057 {
00058 PRM_Name("numobj", "Number of Objects"),
00059 PRM_Name("objpath#","Object #"),
00060 PRM_Name("xformpath","Transform Object"),
00061 PRM_Name("enable#", "Enable Merge #"),
00062 PRM_Name(0)
00063 };
00064
00065 static PRM_Template theObjectTemplates[] = {
00066 PRM_Template(PRM_TOGGLE, 1, &objnames[3], PRMoneDefaults),
00067 PRM_Template(PRM_STRING, PRM_TYPE_DYNAMIC_PATH, 1,
00068 &objnames[1], 0, 0,
00069 0, 0, &PRM_SpareData::sopPath),
00070 PRM_Template()
00071 };
00072
00073 PRM_Template
00074 SOP_HDKObject::myTemplateList[] =
00075 {
00076 PRM_Template(PRM_MULTITYPE_LIST, theObjectTemplates, 2, &objnames[0],
00077 PRMoneDefaults),
00078 PRM_Template(PRM_STRING, PRM_TYPE_DYNAMIC_PATH, 1, &objnames[2],
00079 0, 0, 0, 0, &PRM_SpareData::objPath),
00080 PRM_Template()
00081 };
00082
00083 OP_Node *
00084 SOP_HDKObject::myConstructor(OP_Network *net, const char *name,
00085 OP_Operator *entry)
00086 {
00087 return new SOP_HDKObject(net, name, entry);
00088 }
00089
00090
00091 SOP_HDKObject::SOP_HDKObject(OP_Network *net, const char *name,
00092 OP_Operator *entry) : SOP_Node(net, name, entry) {}
00093 SOP_HDKObject::~SOP_HDKObject() {}
00094
00095 unsigned
00096 SOP_HDKObject::disableParms()
00097 {
00098 UT_String objname;
00099 unsigned changed;
00100 int i, n;
00101
00102 changed = 0;
00103
00104 n = NUMOBJ();
00105 for (i = 1; i <= n; i++)
00106 {
00107 changed += enableParmInst(objnames[1].getToken(), &i, ENABLEMERGE(i));
00108 }
00109
00110 return changed;
00111 }
00112
00113 int
00114 SOP_HDKObject::getDandROpsEqual()
00115 {
00116 int objindex, numobj;
00117 UT_String objname;
00118 OP_Network *objptr;
00119
00120
00121 if( flags().getHardLocked() )
00122 return 1;
00123
00124 numobj = NUMOBJ();
00125
00126
00127 for (objindex = 1; objindex <= numobj; objindex++)
00128 {
00129 if (!ENABLEMERGE(objindex))
00130 continue;
00131
00132 SOPPATH(objname, objindex, 0.0f);
00133
00134 objptr = (OP_Network *) findNode((const char *) objname);
00135 if (!objptr)
00136 continue;
00137
00138
00139
00140
00141 if (objptr == this)
00142 {
00143 continue;
00144 }
00145
00146 if (!objptr->getDandROpsEqual())
00147 {
00148 return 0;
00149 }
00150 }
00151
00152 return 1;
00153 }
00154
00155 OP_ERROR
00156 SOP_HDKObject::cookMySop(OP_Context &context)
00157 {
00158 GU_Detail *cookedgdp;
00159 GB_PrimitiveGroup *xform_primgroup = 0;
00160 GB_PointGroup *xform_ptgroup = 0;
00161 OP_Network *xformobjptr;
00162 OP_Network *objptr;
00163 SOP_Node *sopptr;
00164 GU_Detail blank_gdp;
00165 int objindex;
00166 int numobj;
00167 int firstmerge = 1;
00168 UT_String objname, sopname;
00169 float t = context.myTime;
00170
00171
00172 int start_pt = 0, end_pt = 0;
00173 int start_prim = 0, end_prim = 0;
00174
00175 gdp->copy(blank_gdp, GB_COPY_START);
00176
00177
00178 XFORMPATH(objname, t);
00179 xformobjptr = (OP_Network *) findNode(objname);
00180 if (xformobjptr && xformobjptr->getOpTypeID() == SOP_OPTYPE_ID)
00181 {
00182
00183
00184
00185
00186 xformobjptr = xformobjptr->getCreator();
00187 }
00188
00189
00190
00191
00192 xformobjptr = (OP_Network *)CAST_OBJNODE(xformobjptr);
00193
00194 if (!xformobjptr && objname.isstring())
00195 {
00196
00197
00198 addError(SOP_BAD_SOP_MERGED, objname);
00199 }
00200
00201 numobj = NUMOBJ();
00202
00203 int cookrender;
00204
00205
00206 cookrender = getCreator()->isCookingRender();
00207
00208 for (objindex = 1; objindex <= numobj; objindex++)
00209 {
00210 int gotsopbyflag, savecookrender;
00211
00212 if (!ENABLEMERGE(objindex))
00213 continue;
00214
00215 gotsopbyflag = 0;
00216
00217 SOPPATH(sopname, objindex, t);
00218
00219 if (!sopname.isstring())
00220 {
00221 continue;
00222 }
00223
00224 sopptr = getSOPNode(sopname, 1);
00225
00226 if (sopptr == this)
00227 {
00228
00229 addWarning(SOP_ERR_SELFMERGE);
00230 continue;
00231 }
00232
00233 if (!sopptr)
00234 {
00235
00236 addWarning(SOP_BAD_SOP_MERGED, sopname);
00237 continue;
00238 }
00239
00240
00241 objptr = sopptr->getCreator();
00242
00243
00244 savecookrender = objptr->isCookingRender();
00245 objptr->setCookingRender(cookrender);
00246
00247
00248 cookedgdp = (GU_Detail *)sopptr->getCookedGeo(context);
00249
00250
00251 objptr->setCookingRender(savecookrender);
00252
00253 if (!cookedgdp)
00254 {
00255
00256 addWarning(SOP_BAD_SOP_MERGED, sopname);
00257 continue;
00258 }
00259
00260
00261 addExtraInput(objptr, OP_INTEREST_DATA);
00262
00263
00264 gdp->copy(*cookedgdp, GB_COPY_ADD);
00265
00266
00267 if (xformobjptr)
00268 {
00269 UT_Matrix4 xform, xform2;
00270
00271 if (firstmerge)
00272 {
00273 firstmerge = 0;
00274
00275
00276
00277 xform = objptr->getWorldTransform(context);
00278 xform2 = xformobjptr->getIWorldTransform(context);
00279 xform *= xform2;
00280
00281
00282
00283 end_prim = cookedgdp->primitives().entries();
00284 end_pt = cookedgdp->points().entries();
00285 start_prim = cookedgdp->primitives().entries();
00286 start_pt = cookedgdp->points().entries();
00287
00288 gdp->transform(xform, xform_primgroup, xform_ptgroup);
00289 }
00290 else
00291 {
00292 if (!xform_primgroup)
00293 xform_primgroup = gdp->newPrimitiveGroup("__objxform__", 1);
00294
00295 if (!xform_ptgroup)
00296 xform_ptgroup = gdp->newPointGroup("__objptxform__", 1);
00297
00298
00299
00300 xform_primgroup->clearEntries();
00301 xform_ptgroup->clearEntries();
00302
00303
00304
00305 end_prim += cookedgdp->primitives().entries();
00306 end_pt += cookedgdp->points().entries();
00307
00308 while (start_prim<end_prim)
00309 xform_primgroup->add(start_prim++);
00310
00311 while (start_pt<end_pt)
00312 xform_ptgroup->add(start_pt++);
00313
00314 xform = objptr->getWorldTransform(context);
00315 xform2 = xformobjptr->getIWorldTransform(context);
00316 xform *= xform2;
00317
00318 gdp->transform(xform, xform_primgroup, xform_ptgroup);
00319 }
00320 }
00321 }
00322
00323 if (xformobjptr)
00324 {
00325 addExtraInput(xformobjptr, OP_INTEREST_DATA);
00326 }
00327
00328
00329 gdp->copy(blank_gdp, GB_COPY_END);
00330
00331 if (error() < UT_ERROR_ABORT)
00332 select(GU_SPrimitive);
00333
00334 return error();
00335 }