int ConfigFile::processLink(boost::shared_ptr<const urdf::Link> link,Vehicle &vehicle,int nlink,int njoint,int nmat, std::vector<Material> &materials){ vehicle.links[nlink].name=link->name; vehicle.links[nlink].geom.reset( new Geometry); if(link->visual) nmat= processVisual(link->visual,vehicle.links[nlink],nmat, materials); else{ vehicle.links[nlink].geom->type=4; vehicle.links[nlink].material=-1; memset(vehicle.links[nlink].position,0,3*sizeof(double)); memset(vehicle.links[nlink].rpy,0,3*sizeof(double)); memset(vehicle.links[nlink].quat,0,4*sizeof(double)); vehicle.links[nlink].quat[3]=1; } if(link->collision){ vehicle.links[nlink].cs.reset( new Geometry); processGeometry(link->collision->geometry.get(),vehicle.links[nlink].cs.get()); } else vehicle.links[nlink].cs.reset(); int linkNumber=nlink; for(uint i=0;i<link->child_joints.size();i++){ processJoint(link->child_joints[i],vehicle.joints[linkNumber],nlink,linkNumber+1); linkNumber=processLink(link->child_links[i],vehicle,linkNumber+1,linkNumber+1,nmat,materials); } return linkNumber; }
void ScaenaAnimationFileWriter::processJoint(MeshSkeletonJoint* skeleton, vector<float>* bufferMetadata){ // Guardo las transaformaciones de este joint en el vector de metadata para luego pasarlo a un buffer y serializar addTransformationsToMetadata(bufferMetadata, skeleton); // Recorro todos los hijos y proceso cada uno vector<MeshSkeletonJoint*>::iterator it = skeleton->getChilds()->begin(); while(it != skeleton->getChilds()->end()){ processJoint(*it, bufferMetadata); ++it; } }
void ScaenaAnimationWriter::processSkeleton(XmlTreeNode* parentNode, SkeletonDataTransfer* skeletonDataTransfer){ // Creo un nuevo nodo para el mesh XmlTreeNode* skeletonNode = new XmlTreeNode("Skeleton", parentNode); parentNode->addChild(skeletonNode); skeletonNode->addAttribute(new XmlNodeAttribute("Name", skeletonDataTransfer->jointName)); // Recorro todos los hijos y proceso cada uno list<SkeletonDataTransfer*>::iterator it = skeletonDataTransfer->getChilds()->begin(); while(it != skeletonDataTransfer->getChilds()->end()){ processJoint(skeletonNode, *it); ++it; } }
void ScaenaAnimationFileWriter::processSkeleton(XmlTreeNode* parentNode, MeshSkeleton* skeleton){ vector<float> bufferMetadata; // Recorro todos los joints hijos y proceso cada uno vector<MeshSkeletonJoint*>::iterator it = skeleton->getChilds()->begin(); while(it != skeleton->getChilds()->end()){ processJoint(*it, &bufferMetadata); ++it; } // Creamos el buffer final a grabar a partir de la metadata float* buffer = createBufferFromMetadata(&bufferMetadata); // Mandamos a serializar en binario y agregar al nodo XmlUtils::parseBufferInBinaryToNode("Data", buffer, bufferMetadata.size(), parentNode); delete buffer; }
void ScaenaAnimationWriter::processJoint(XmlTreeNode* parentNode, SkeletonDataTransfer* skeletonDataTransfer){ // Creo un nuevo nodo para el mesh XmlTreeNode* jointNode = new XmlTreeNode("Joint", parentNode); parentNode->addChild(jointNode); jointNode->addAttribute(new XmlNodeAttribute("Name", skeletonDataTransfer->jointName)); jointNode->addAttribute(new XmlNodeAttribute("Index", StringUtils::toString(skeletonDataTransfer->jointIndex - 2))); // -2 es porque no se cuenta ni el dt root ni el skeleton root // Me guardo las transformaciones (globales) del joint a la hora de cuando fue bindeado con el mesh serializeTransformationsToNode(jointNode, skeletonDataTransfer); // Recorro todos los hijos y proceso cada uno list<SkeletonDataTransfer*>::iterator it = skeletonDataTransfer->getChilds()->begin(); while(it != skeletonDataTransfer->getChilds()->end()){ processJoint(jointNode, *it); ++it; } }