/** * Load Animation */ void AnimationManager::loadAnim(const Common::String &animName) { clearAnim(); Common::String filename = animName + ".ANI"; Common::File f; if (!f.open(filename)) error("Failed to open %s", filename.c_str()); int filesize = f.size(); int nbytes = filesize - 115; char header[10]; char dummyBuf[15]; char filename1[15]; char filename2[15]; char filename3[15]; char filename4[15]; char filename5[15]; char filename6[15]; f.read(header, 10); f.read(dummyBuf, 15); f.read(filename1, 15); f.read(filename2, 15); f.read(filename3, 15); f.read(filename4, 15); f.read(filename5, 15); f.read(filename6, 15); if (READ_BE_UINT32(header) != MKTAG('A', 'N', 'I', 'S')) error("Invalid animation File: %s", filename.c_str()); const char *files[6] = { &filename1[0], &filename2[0], &filename3[0], &filename4[0], &filename5[0], &filename6[0] }; for (int idx = 0; idx <= 5; ++idx) { if (files[idx][0]) { if (!f.exists(files[idx])) error("Missing file %s in animation File: %s", files[idx], filename.c_str()); if (loadSpriteBank(idx + 1, files[idx])) error("Invalid sprite bank in animation File: %s", filename.c_str()); } } byte *data = _vm->_globals->allocMemory(nbytes + 1); f.read(data, nbytes); f.close(); for (int idx = 1; idx <= 20; ++idx) searchAnim(data, idx, nbytes); _vm->_globals->freeMemory(data); }
void Viewer::createMesh(QListWidgetItem *item) { animationed=false; if(animState != 0) { animState->setEnabled(false); animState=0; } mainNode->detachAllObjects(); if(mainEnt != 0) { ogreSceneManager->destroyEntity(mainEnt->getName()); mainEnt=0; } mainEnt = ogreSceneManager->createEntity(item->text().toAscii().constData(), item->text().toAscii().constData()); mainEnt->setCastShadows(true); mainNode->attachObject(mainEnt); Ogre::Real CHAR_HEIGHT=mainEnt->getBoundingBox().getMinimum().y; Ogre::Vector3 pos = mainNode->getPosition(); if (CHAR_HEIGHT < 0) { // if we've hit the ground, change to landing state pos.y = -CHAR_HEIGHT; mainNode->setPosition(pos); } else { pos.y = CHAR_HEIGHT; mainNode->setPosition(pos); } emit clearAnim(); Ogre::AnimationStateSet *set=mainEnt->getAllAnimationStates(); if(set != 0) { Ogre::AnimationStateIterator seci = set->getAnimationStateIterator(); while (seci.hasMoreElements()) { Ogre::AnimationState *anim=seci.getNext(); emit sendAnimName(anim->getAnimationName().c_str()); } set=0; } updateGL(); }