void animateTextures(MMesh * mesh, MTexturesAnim * texturesAnim, float t) { MTextureAnim * texAnim = texturesAnim->getTexturesAnim(); float rotation; MVector2 translate; MVector2 scale; unsigned int tex; unsigned int texSize = texturesAnim->getTexturesAnimNumber(); for (tex = 0; tex < texSize; tex++) { MTexture * texture = mesh->getTexture(tex); // rotation if(animateFloat(texAnim->getRotationKeys(), texAnim->getRotationKeysNumber(), t, &rotation)) texture->setTexRotate(rotation); // translate if(animateVector2(texAnim->getTranslateKeys(), texAnim->getTranslateKeysNumber(), t, &translate)) texture->setTexTranslate(translate); // scale if(animateVector2(texAnim->getScaleKeys(), texAnim->getScaleKeysNumber(), t, &scale)) texture->setTexScale(scale); texAnim++; } }
// Textures anim bin export bool exportTexturesAnimBin(const char * filename, MTexturesAnim * 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_TA_HEADER, sizeof(char), 8, file); // version M_fwrite(&version, sizeof(int), 1, file); // textures unsigned int t, texturesAnimNumber = anim->getTexturesAnimNumber(); MTextureAnim * texturesAnim = anim->getTexturesAnim(); M_fwrite(&texturesAnimNumber, sizeof(int), 1, file); for(t=0; t<texturesAnimNumber; t++) { MTextureAnim * texAnim = &(texturesAnim[t]); unsigned int translateKeysNumber = texAnim->getTranslateKeysNumber(); unsigned int scaleKeysNumber = texAnim->getScaleKeysNumber(); unsigned int rotationKeysNumber = texAnim->getRotationKeysNumber(); MKey * translateKeys = texAnim->getTranslateKeys(); MKey * scaleKeys = texAnim->getScaleKeys(); MKey * rotationKeys = texAnim->getRotationKeys(); writeKeys(file, translateKeys, M_VARIABLE_VEC2, translateKeysNumber); writeKeys(file, scaleKeys, M_VARIABLE_VEC2, scaleKeysNumber); writeKeys(file, rotationKeys, M_VARIABLE_FLOAT, rotationKeysNumber); } M_fclose(file); return true; }
bool xmlTextureAnimLoad(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); // TextureAnim TiXmlElement * textureAnimNode = pRootNode->FirstChildElement("TextureAnim"); if(! textureAnimNode) return false; unsigned int texturesAnimNumber = 0; textureAnimNode->QueryUIntAttribute("num", &texturesAnimNumber); if(texturesAnimNumber == 0) return false; // create textures anim MTexturesAnim * texturesAnim = (MTexturesAnim *)data; MTextureAnim * texAnims = texturesAnim->allocTexturesAnim(texturesAnimNumber); // Texture TiXmlElement * textureNode = textureAnimNode->FirstChildElement("Texture"); for(textureNode; textureNode; textureNode=textureNode->NextSiblingElement("Texture")) { // translate TiXmlElement * translateNode = textureNode->FirstChildElement("translate"); if(translateNode) { unsigned int kSize = 0; translateNode->QueryUIntAttribute("num", &kSize); MKey * keys = texAnims->allocTranslateKeys(kSize); readVector2Keys(translateNode, keys); } // scale TiXmlElement * scaleNode = textureNode->FirstChildElement("scale"); if(scaleNode) { unsigned int kSize = 0; scaleNode->QueryUIntAttribute("num", &kSize); MKey * keys = texAnims->allocScaleKeys(kSize); readVector2Keys(scaleNode, keys); } // rotate TiXmlElement * rotateNode = textureNode->FirstChildElement("rotate"); if(rotateNode) { unsigned int kSize = 0; rotateNode->QueryUIntAttribute("num", &kSize); MKey * keys = texAnims->allocRotationKeys(kSize); readFloatKeys(rotateNode, keys); } texAnims++; } return true; }