Esempio n. 1
0
Ogre::SceneNode *EMDOgre::createOgreSceneNodeModel(EMDModel *model, Ogre::SceneNode *parent, Ogre::SceneManager *scene_manager) {
	Ogre::SceneNode *model_node = parent->createChildSceneNode();
	vector<EMDMesh *> &meshes = model->getMeshes();
	for (size_t i = 0; i < meshes.size(); i++) {
		vector<EMDSubmesh *> &submeshes = meshes[i]->getSubmeshes();
		if (!mesh_resources_created) {
			createOgreEntityMeshes(meshes[i]);
		}

		for (size_t j = 0; j < submeshes.size(); j++) {
			Ogre::Entity *entity = scene_manager->createEntity(meshes[i]->getName() + "_" + submeshes[j]->getMaterialName());
			entity->setMaterialName(name + "_" + submeshes[j]->getMaterialName());

			// Create Render Object Listeners depending on submesh definitions
			vector<EMDSubmeshDefinition> definitions = submeshes[j]->getDefinitions();

			EMBOgre *texture_pack = material_pack->getTexturePack();
			EMBOgre *texture_dyt_pack = material_pack->getDYTTexturePack();

			if (texture_pack && texture_dyt_pack) {
				vector<Ogre::TexturePtr> textures = texture_pack->getOgreTextures();
				vector<Ogre::TexturePtr> textures_dyt = texture_dyt_pack->getOgreTextures();

				for (size_t k = 0; k < definitions.size(); k++) {
					unsigned short texture_index = definitions[k].tex_index;
					unsigned short dyt_texture_index = definitions[k].tex_index;

					if (texture_index >= textures.size()) texture_index = textures.size()-1;
					if (dyt_texture_index >= textures_dyt.size()) dyt_texture_index = textures_dyt.size() - 1;

					EMDRenderObject *emd_render_object = new EMDRenderObject(textures[texture_index], textures_dyt[dyt_texture_index]);
					EMDRenderObjectAssignVisitor visitor(emd_render_object);
					entity->visitRenderables(&visitor);
					created_render_objects.push_back(emd_render_object);

					break; // FIXME: Figure out why there's multiple definitions
				}
			}

			// Share Skeleton Instances with ESK's fake entity
			if (skeleton) {
				if (entity->hasSkeleton()) {
					entity->shareSkeletonInstanceWith(skeleton->getEntity());
				}
			}

			model_node->attachObject(entity);
		}
	}
	return model_node;
}