Ejemplo n.º 1
0
/**
 * 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);
}
Ejemplo n.º 2
0
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();
}