void animateArmature(MArmature * armature, MArmatureAnim * armatureAnim, float t) { MObject3dAnim * bonesAnim = armatureAnim->getBonesAnim(); MVector3 position; MVector3 scale; MQuaternion rotation; unsigned int b; unsigned int bSize = armatureAnim->getBonesAnimNumber(); for (b = 0; b < bSize; b++) { MOBone * bone = armature->getBone(b); // position if(animateVector3(bonesAnim->getPositionKeys(), bonesAnim->getPositionKeysNumber(), t, &position)) bone->setPosition(position); // scale if(animateVector3(bonesAnim->getScaleKeys(), bonesAnim->getScaleKeysNumber(), t, &scale)) bone->setScale(scale); // rotation if(animateQuaternion(bonesAnim->getRotationKeys(), bonesAnim->getRotationKeysNumber(), t, &rotation)) bone->setRotation(rotation); bonesAnim++; } armature->processBonesLinking(); armature->updateBonesSkinMatrix(); }
// Armature anim bin export bool exportArmatureAnimBin(const char * filename, MArmatureAnim * anim) { int version = 1; // create file MFile * file = M_fopen(filename, "wb"); if(! file) { printf("Error : can't create file %s\n", filename); return false; } // header M_fwrite(M_AA_HEADER, sizeof(char), 8, file); // version M_fwrite(&version, sizeof(int), 1, file); // bones unsigned int b, bonesAnimNumber = anim->getBonesAnimNumber(); MObject3dAnim * bonesAnim = anim->getBonesAnim(); M_fwrite(&bonesAnimNumber, sizeof(int), 1, file); for(b=0; b<bonesAnimNumber; b++) { MObject3dAnim * objAnim = &(bonesAnim[b]); unsigned int positionKeysNumber = objAnim->getPositionKeysNumber(); unsigned int scaleKeysNumber = objAnim->getScaleKeysNumber(); unsigned int rotationKeysNumber = objAnim->getRotationKeysNumber(); MKey * positionKeys = objAnim->getPositionKeys(); MKey * scaleKeys = objAnim->getScaleKeys(); MKey * rotationKeys = objAnim->getRotationKeys(); writeKeys(file, positionKeys, M_VARIABLE_VEC3, positionKeysNumber); writeKeys(file, scaleKeys, M_VARIABLE_VEC3, scaleKeysNumber); writeKeys(file, rotationKeys, M_VARIABLE_QUAT, rotationKeysNumber); } M_fclose(file); return true; }
bool xmlArmatureAnimLoad(const char * filename, void * data) { TiXmlDocument doc(filename); if(! doc.LoadFile()) return false; TiXmlHandle hDoc(&doc); TiXmlElement * pRootNode; TiXmlHandle hRoot(0); // Maratis pRootNode = hDoc.FirstChildElement().Element(); if(! pRootNode) return false; if(strcmp(pRootNode->Value(), "Maratis") != 0) return false; hRoot = TiXmlHandle(pRootNode); // BonesAnim TiXmlElement * armatureAnimNode = pRootNode->FirstChildElement("ArmatureAnim"); if(! armatureAnimNode) return false; unsigned int bonesAnimNumber = 0; armatureAnimNode->QueryUIntAttribute("num", &bonesAnimNumber); if(bonesAnimNumber == 0) return false; // create armature anim MArmatureAnim * armatureAnim = (MArmatureAnim *)data; MObject3dAnim * objAnims = armatureAnim->allocBonesAnim(bonesAnimNumber); // Bone TiXmlElement * boneNode = armatureAnimNode->FirstChildElement("Bone"); for(boneNode; boneNode; boneNode=boneNode->NextSiblingElement("Bone")) { // position TiXmlElement * positionNode = boneNode->FirstChildElement("position"); if(positionNode) { unsigned int kSize = 0; positionNode->QueryUIntAttribute("num", &kSize); MKey * keys = objAnims->allocPositionKeys(kSize); readVector3Keys(positionNode, keys); } // rotation TiXmlElement * rotationNode = boneNode->FirstChildElement("rotation"); if(rotationNode) { unsigned int kSize = 0; rotationNode->QueryUIntAttribute("num", &kSize); MKey * keys = objAnims->allocRotationKeys(kSize); // k TiXmlElement * kNode = rotationNode->FirstChildElement("k"); for(kNode; kNode; kNode=kNode->NextSiblingElement("k")) { int t = 0; MVector3 euler; MQuaternion * rotation = keys->createQuaternionData(); kNode->QueryIntAttribute("t", &t); kNode->QueryFloatAttribute("x", &euler.x); kNode->QueryFloatAttribute("y", &euler.y); kNode->QueryFloatAttribute("z", &euler.z); rotation->setFromAngles(euler.x, euler.y, euler.z); keys->setT(t); keys++; } } // scale TiXmlElement * scaleNode = boneNode->FirstChildElement("scale"); if(scaleNode) { unsigned int kSize = 0; scaleNode->QueryUIntAttribute("num", &kSize); MKey * keys = objAnims->allocScaleKeys(kSize); readVector3Keys(scaleNode, keys); } objAnims++; } return true; }