#define IA64_UNAT_REGNUM (IA64_AR0_REGNUM+36) #define IA64_FPSR_REGNUM (IA64_AR0_REGNUM+40) #define IA64_ITC_REGNUM (IA64_AR0_REGNUM+44) #define IA64_PFS_REGNUM (IA64_AR0_REGNUM+64) #define IA64_LC_REGNUM (IA64_AR0_REGNUM+65) #define IA64_EC_REGNUM (IA64_AR0_REGNUM+66) #define REGISTER_INDEX(N) (REGISTER_BYTE(N) / sizeof (unsigned long)) #define ptoff(V) ((unsigned int) &((struct pt_regs *)0x0)->V) struct reg_to_ptreg_index { unsigned int reg; unsigned int ptregoff; }; struct reg_to_ptreg_index gr_reg_to_ptreg_index[] = { {IA64_GR0_REGNUM + 8, ptoff(r8)}, {IA64_GR0_REGNUM + 9, ptoff(r9)}, {IA64_GR0_REGNUM + 10, ptoff(r10)}, {IA64_GR0_REGNUM + 11, ptoff(r11)}, {IA64_GR0_REGNUM + 1, ptoff(r1)}, {IA64_GR0_REGNUM + 12, ptoff(r12)}, {IA64_GR0_REGNUM + 13, ptoff(r13)}, {IA64_GR0_REGNUM + 14, ptoff(r14)}, {IA64_GR0_REGNUM + 15, ptoff(r15)}, }; struct reg_to_ptreg_index br_reg_to_ptreg_index[] = { {IA64_BR0_REGNUM, ptoff(b0)}, {IA64_BR0_REGNUM + 6, ptoff(b6)}, {IA64_BR0_REGNUM + 7, ptoff(b7)}, };
OP_ERROR SOP_UniPdist::cookMySop(OP_Context &context) { // Before we do anything, we must lock our inputs. Before returning, // we have to make sure that the inputs get unlocked. if (lockInputs(context) >= UT_ERROR_ABORT) return error(); // Duplicate input geometry duplicateSource(0, context); float time = context.getTime(); float dist = evalFloat(distanceName.getToken(), 0, time); GA_PointGroup *removeGroup = gdp->newPointGroup(REMOVE_GROUP_NAME); GA_PointGroup *keepGroup = gdp->newPointGroup(KEEP_GROUP_NAME); // Flag the SOP as being time dependent (i.e. cook on time changes) flags().timeDep = 1; //Create a removeAttrib GA_RWHandleI removeAttrib(gdp->addIntTuple(GA_ATTRIB_POINT, "__remove__", 1)); //Creating PointTree GEO_PointTreeGAOffset pttree; //Build PointTree with all the points pttree.build(gdp,NULL); //Create the Array wich holds the distance for the current point in the for loop UT_FloatArray ptdist; // Index offset const GA_IndexMap points = gdp->getPointMap(); GA_Size ptoffsetindex; ptoffsetindex = points.offsetSize()-points.indexSize(); //set all for (GA_Iterator ptoff(gdp->getPointRange()); !ptoff.atEnd(); ++ptoff) { removeAttrib.set(*ptoff,0); } // loop over all points, find second closest point for (GA_Iterator ptoff(gdp->getPointRange()); !ptoff.atEnd(); ++ptoff) { int removeMe; removeMe = int(removeAttrib.get(*ptoff)); if(removeMe) { removeGroup->addIndex(*ptoff-ptoffsetindex); continue; } // Create the Array which holds a list sorted on distance to current point in the for loop GEO_PointTree::IdxArrayType plist; //plist UT_Vector3 pos = gdp->getPos3(*ptoff); // create pos pttree.findAllCloseIdx(pos,dist,plist); // find all points within the search radius unsigned int tempListP = plist.entries(); //create a int for entries in the array for(int i=0;i < tempListP; ++i) { removeAttrib.set(plist[i],1); //set the tempList points to be removed } removeAttrib.set(*ptoff,0); keepGroup->addIndex(*ptoff-ptoffsetindex); } pttree.clear(); //clear the pointtree unlockInputs(); return error(); }
#define IA64_PFS_REGNUM (IA64_AR0_REGNUM+64) #define IA64_LC_REGNUM (IA64_AR0_REGNUM+65) #define IA64_EC_REGNUM (IA64_AR0_REGNUM+66) #ifndef USE_UNWIND struct regs_to_cpu_user_resgs_index { unsigned int reg; unsigned int ptregoff; }; #define ptoff(V) ((unsigned int)&((struct cpu_user_regs*)0x0)->V) // gr static const struct regs_to_cpu_user_resgs_index gr_reg_to_cpu_user_regs_index[] = { {IA64_GR0_REGNUM + 8, ptoff(r8)}, {IA64_GR0_REGNUM + 9, ptoff(r9)}, {IA64_GR0_REGNUM + 10, ptoff(r10)}, {IA64_GR0_REGNUM + 11, ptoff(r11)}, {IA64_GR0_REGNUM + 1, ptoff(r1)}, {IA64_GR0_REGNUM + 12, ptoff(r12)}, {IA64_GR0_REGNUM + 13, ptoff(r13)}, {IA64_GR0_REGNUM + 15, ptoff(r15)}, {IA64_GR0_REGNUM + 14, ptoff(r14)}, {IA64_GR0_REGNUM + 2, ptoff(r2)}, {IA64_GR0_REGNUM + 3, ptoff(r3)}, {IA64_GR0_REGNUM + 16, ptoff(r16)}, {IA64_GR0_REGNUM + 17, ptoff(r17)}, {IA64_GR0_REGNUM + 18, ptoff(r18)}, {IA64_GR0_REGNUM + 19, ptoff(r19)},