diff --git a/apps/openmw/mwrender/npcanimation.cpp b/apps/openmw/mwrender/npcanimation.cpp index cdef5ce8b..439f6fa2d 100644 --- a/apps/openmw/mwrender/npcanimation.cpp +++ b/apps/openmw/mwrender/npcanimation.cpp @@ -365,16 +365,10 @@ void NpcAnimation::updateParts() std::vector NpcAnimation::insertBoundedPart(const std::string &mesh, const std::string &bonename) { - NifOgre::MeshPairList meshes = NIFLoader::load(mesh); - std::vector parts; - for(size_t i = 0;i < meshes.size();i++) - { - parts.push_back(mRend.getScene()->createEntity(meshes[i].first->getName())); - Ogre::Entity *part = parts.back(); - - part->setVisibilityFlags(RV_Actors); - mEntityList.mSkelBase->attachObjectToBone(bonename, part); - } + NifOgre::EntityList entities = NIFLoader::createEntities(mInsert, mesh); + std::vector &parts = entities.mEntities; + for(size_t i = 0;i < parts.size();i++) + parts[i]->setVisibilityFlags(RV_Actors); return parts; } diff --git a/apps/openmw/mwrender/sky.cpp b/apps/openmw/mwrender/sky.cpp index 8f49e03df..682a96419 100644 --- a/apps/openmw/mwrender/sky.cpp +++ b/apps/openmw/mwrender/sky.cpp @@ -509,16 +509,14 @@ void SkyManager::create() /// \todo sky_night_02.nif (available in Bloodmoon) mAtmosphereNight = mRootNode->createChildSceneNode(); - NifOgre::MeshPairList meshes = NifOgre::NIFLoader::load("meshes\\sky_night_01.nif"); - for(size_t i = 0;i < meshes.size();i++) + NifOgre::EntityList entities = NifOgre::NIFLoader::createEntities(mAtmosphereNight, "meshes\\sky_night_01.nif"); + for(size_t i = 0;i < entities.mEntities.size();i++) { - Entity* night1_ent = mSceneMgr->createEntity(meshes[i].first->getName()); + Entity* night1_ent = entities.mEntities[i]; night1_ent->setRenderQueueGroup(RQG_SkiesEarly+1); night1_ent->setVisibilityFlags(RV_Sky); night1_ent->setCastShadows(false); - mAtmosphereNight->attachObject(night1_ent); - for (unsigned int i=0; igetNumSubEntities(); ++i) { MaterialPtr mp = night1_ent->getSubEntity(i)->getMaterial(); @@ -589,17 +587,16 @@ void SkyManager::create() fshader->getDefaultParameters()->setNamedAutoConstant("emissive", GpuProgramParameters::ACT_SURFACE_EMISSIVE_COLOUR); mAtmosphereDay = mRootNode->createChildSceneNode(); - meshes = NifOgre::NIFLoader::load("meshes\\sky_atmosphere.nif"); - for(size_t i = 0;i < meshes.size();i++) + entities = NifOgre::NIFLoader::createEntities(mAtmosphereDay, "meshes\\sky_atmosphere.nif"); + for(size_t i = 0;i < entities.mEntities.size();i++) { - Entity* atmosphere_ent = mSceneMgr->createEntity(meshes[i].first->getName()); + Entity* atmosphere_ent = entities.mEntities[i]; atmosphere_ent->setCastShadows(false); ModVertexAlpha(atmosphere_ent, 0); atmosphere_ent->setRenderQueueGroup(RQG_SkiesEarly); atmosphere_ent->setVisibilityFlags(RV_Sky); - mAtmosphereDay->attachObject(atmosphere_ent); mAtmosphereMaterial = atmosphere_ent->getSubEntity(0)->getMaterial(); mAtmosphereMaterial = mAtmosphereMaterial->clone("Atmosphere"); @@ -677,13 +674,12 @@ void SkyManager::create() mCloudFragmentShader->getDefaultParameters()->setNamedAutoConstant("emissive", GpuProgramParameters::ACT_SURFACE_EMISSIVE_COLOUR); SceneNode* clouds_node = mRootNode->createChildSceneNode(); - meshes = NifOgre::NIFLoader::load("meshes\\sky_clouds_01.nif"); - for(size_t i = 0;i < meshes.size();i++) + entities = NifOgre::NIFLoader::createEntities(clouds_node, "meshes\\sky_clouds_01.nif"); + for(size_t i = 0;i < entities.mEntities.size();i++) { - Entity* clouds_ent = mSceneMgr->createEntity(meshes[i].first->getName()); + Entity* clouds_ent = entities.mEntities[i]; clouds_ent->setVisibilityFlags(RV_Sky); clouds_ent->setRenderQueueGroup(RQG_SkiesEarly+5); - clouds_node->attachObject(clouds_ent); mCloudMaterial = clouds_ent->getSubEntity(0)->getMaterial(); mCloudMaterial = mCloudMaterial->clone("Clouds"); diff --git a/components/nifogre/ogre_nif_loader.hpp b/components/nifogre/ogre_nif_loader.hpp index bd6f99b2f..f21069b75 100644 --- a/components/nifogre/ogre_nif_loader.hpp +++ b/components/nifogre/ogre_nif_loader.hpp @@ -85,11 +85,11 @@ typedef std::vector< std::pair > MeshPairList; */ class NIFLoader { -public: static MeshPairList load(const std::string &name, Ogre::SkeletonPtr *skel=NULL, const std::string &group="General"); +public: static EntityList createEntities(Ogre::SceneNode *parent, const std::string &name, const std::string &group="General");