CTransformShape *CScene::createInstance(const string &shapeName) { // We must attach a bank to the scene (a ShapeBank handle the shape caches and // the creation/deletion of the instances) nlassert( _ShapeBank != NULL ); // If the shape is not present in the bank if (_ShapeBank->getPresentState( shapeName ) != CShapeBank::Present) { // Load it from file _ShapeBank->load( shapeName ); if (_ShapeBank->getPresentState( shapeName ) != CShapeBank::Present) { return NULL; } } // Then create a reference to the shape CTransformShape *pTShp = _ShapeBank->addRef( shapeName )->createInstance(*this); if (pTShp) pTShp->setDistMax(pTShp->Shape->getDistMax()); // Look if this instance get lightmap information #if defined(__GNUC__) && __GNUC__ < 3 CMeshBase *pMB = (CMeshBase*)((IShape*)(pTShp->Shape)); #else // not GNUC CMeshBase *pMB = dynamic_cast<CMeshBase*>((IShape*)(pTShp->Shape)); #endif // not GNUC CMeshBaseInstance *pMBI = dynamic_cast<CMeshBaseInstance*>( pTShp ); if( ( pMB != NULL ) && ( pMBI != NULL ) ) { // Init lightmap information pMBI->initAnimatedLightIndex (*this); // Auto animations //========================== if (_AutomaticAnimationSet) { if (pMB->getAutoAnim()) { std::string animName = toLower(CFile::getFilenameWithoutExtension(shapeName)); uint animID = _AutomaticAnimationSet->getAnimationIdByName(animName); if (animID != CAnimationSet::NotFound) { CChannelMixer *chanMix = new CChannelMixer; chanMix->setAnimationSet((CAnimationSet *) _AutomaticAnimationSet); chanMix->setSlotAnimation(0, animID); pMBI->registerToChannelMixer(chanMix, ""); // Gives this object ownership of the channel mixer so we don't need to keep track of it pMBI->setChannelMixerOwnerShip(true); } } } } CLandscapeModel *pLM = dynamic_cast<CLandscapeModel*>( pTShp ); if( pLM != NULL ) { // Init lightmap information pLM->Landscape.initAnimatedLightIndex (*this); } return pTShp; }