void OgreApplication::InitPlugins(void){ try { /* Load plugin responsible for OpenGL render system */ Strings plugin_names; plugin_names.push_back("RenderSystem_GL"); Strings::iterator iter = plugin_names.begin(); Strings::iterator iter_end = plugin_names.end(); for (; iter != iter_end; iter++){ Ogre::String& plugin_name = (*iter); if (OGRE_DEBUG_MODE){ plugin_name.append("_d"); } ogre_root_->loadPlugin(plugin_name); } } catch (Ogre::Exception &e){ throw(OgreAppException(std::string("Ogre::Exception: ") + std::string(e.what()))); } catch(std::exception &e){ throw(OgreAppException(std::string("std::Exception: ") + std::string(e.what()))); } }
void OgreApplication::MainLoop(void){ try { /* Main loop to keep the application going */ ogre_root_->clearEventTimes(); while(!ogre_window_->isClosed()){ ogre_window_->update(false); ogre_window_->swapBuffers(); ogre_root_->renderOneFrame(); Ogre::WindowEventUtilities::messagePump(); } } catch (Ogre::Exception &e){ throw(OgreAppException(std::string("Ogre::Exception: ") + std::string(e.what()))); } catch(std::exception &e){ throw(OgreAppException(std::string("std::Exception: ") + std::string(e.what()))); } }
void OgreApplication::CreateParticleEntity(Ogre::String entity_name, Ogre::String object_name, Ogre::String material_name){ try { /* Create one instance of the torus (one entity) */ /* The same object can have multiple instances or entities */ /* Retrieve scene manager and root scene node */ Ogre::SceneManager* scene_manager = ogre_root_->getSceneManager("MySceneManager"); Ogre::SceneNode* root_scene_node = scene_manager->getRootSceneNode(); /* Create entity */ Ogre::Entity* entity = scene_manager->createEntity(object_name); /* Apply a material to the entity */ entity->setMaterialName(material_name); particle_material_name_ = material_name; /* Create a scene node for the entity */ /* The scene node keeps track of the entity's position */ Ogre::SceneNode* scene_node = root_scene_node->createChildSceneNode(entity_name); scene_node->attachObject(entity); /* Scale the entity */ scene_node->scale(0.5, 0.5, 0.5); } catch (Ogre::Exception &e){ throw(OgreAppException(std::string("Ogre::Exception: ") + std::string(e.what()))); } catch(std::exception &e){ throw(OgreAppException(std::string("std::Exception: ") + std::string(e.what()))); } }
void AsteroidGame::InitViewport(void){ try { /* Retrieve scene manager and root scene node */ Ogre::SceneManager* scene_manager = ogre_root_->createSceneManager(Ogre::ST_GENERIC, "MySceneManager"); Ogre::SceneNode* root_scene_node = scene_manager->getRootSceneNode(); /* Create camera object */ camera = scene_manager->createCamera("MyCamera"); Ogre::SceneNode* camera_scene_node = root_scene_node->createChildSceneNode("MyCameraNode"); camera_scene_node->attachObject(camera); camera->setNearClipDistance(camera_near_clip_distance_g); camera->setFarClipDistance(camera_far_clip_distance_g); camera->setPosition(camera_position_g); camera->lookAt(camera_look_at_g); //camera->setFixedYawAxis(true, camera_up_g); /* Create second camera object */ camera_2 = scene_manager->createCamera("MyCamera_2"); Ogre::SceneNode* camera_scene_node_2 = root_scene_node->createChildSceneNode("MyCameraNode_2"); camera_scene_node_2->attachObject(camera_2); camera_2->setNearClipDistance(camera_near_clip_distance_g); camera_2->setFarClipDistance(camera_far_clip_distance_g); camera_2->setPosition(camera_position_g); camera_2->lookAt(camera_look_at_g); //camera->setFixedYawAxis(true, camera_up_g); /*Create viewport */ Ogre::Viewport *viewport = ogre_window_->addViewport(camera, viewport_z_order_g, viewport_left_g, viewport_top_g, viewport_width_g, viewport_height_g); viewport->setAutoUpdated(true); viewport->setBackgroundColour(viewport_background_color_g); /* Set aspect ratio */ float ratio = float(viewport->getActualWidth()) / float(viewport->getActualHeight()); camera->setAspectRatio(ratio); camera_2->setAspectRatio(ratio); } catch (Ogre::Exception &e){ throw(OgreAppException(std::string("Ogre::Exception: ") + std::string(e.what()))); } catch(std::exception &e){ throw(OgreAppException(std::string("std::Exception: ") + std::string(e.what()))); } }
void OgreApplication::InitRootNode(void){ try { /* We need to have an Ogre root to be able to access all Ogre functions */ ogre_root_ = std::auto_ptr<Ogre::Root>(new Ogre::Root(config_filename_g, plugins_filename_g, log_filename_g)); //ogre_root_->showConfigDialog(); } catch (Ogre::Exception &e){ throw(OgreAppException(std::string("Ogre::Exception: ") + std::string(e.what()))); } catch(std::exception &e){ throw(OgreAppException(std::string("std::Exception: ") + std::string(e.what()))); } }
void OgreApplication::InitEvents(void){ try { /* Add this object as a FrameListener (see frameRenderingQueued event) */ ogre_root_->addFrameListener(this); /* Add this object as a WindowEventListener to handle the window resize event */ Ogre::WindowEventUtilities::addWindowEventListener(ogre_window_, this); } catch (Ogre::Exception &e){ throw(OgreAppException(std::string("Ogre::Exception: ") + std::string(e.what()))); } catch(std::exception &e){ throw(OgreAppException(std::string("std::Exception: ") + std::string(e.what()))); } }
void OgreApplication::LoadMaterials(void){ try { /* Load materials that can then be assigned to objects in the scene */ Ogre::String resource_group_name = "MyGame"; Ogre::ResourceGroupManager& resource_group_manager = Ogre::ResourceGroupManager::getSingleton(); resource_group_manager.createResourceGroup(resource_group_name); bool is_recursive = false; resource_group_manager.addResourceLocation(material_directory_g, "FileSystem", resource_group_name, is_recursive); resource_group_manager.initialiseResourceGroup(resource_group_name); resource_group_manager.loadResourceGroup(resource_group_name); } catch (Ogre::Exception &e){ throw(OgreAppException(std::string("Ogre::Exception: ") + std::string(e.what()))); } catch(std::exception &e){ throw(OgreAppException(std::string("std::Exception: ") + std::string(e.what()))); } }
void OgreApplication::InitRenderSystem(void){ try { const Ogre::RenderSystemList& render_system_list = ogre_root_->getAvailableRenderers(); if (render_system_list.size() == 0) { throw(OgreAppException(std::string("OgreApp::Exception: Sorry, no rendersystem was found."))); } Ogre::RenderSystem *render_system = render_system_list.at(0); ogre_root_->setRenderSystem(render_system); } catch (Ogre::Exception &e){ throw(OgreAppException(std::string("Ogre::Exception: ") + std::string(e.what()))); } catch(std::exception &e){ throw(OgreAppException(std::string("std::Exception: ") + std::string(e.what()))); } }
void OgreApplication::InitWindow(void){ try { /* Create main window for the application */ bool create_window_automatically = false; ogre_root_->initialise(create_window_automatically, window_title_g, custom_window_capacities_g); Ogre::NameValuePairList params; params["FSAA"] = "0"; params["vsync"] = "true"; ogre_window_ = ogre_root_->createRenderWindow(window_title_g, window_width_g, window_height_g, window_full_screen_g, ¶ms); ogre_window_->setActive(true); ogre_window_->setAutoUpdated(false); } catch (Ogre::Exception &e){ throw(OgreAppException(std::string("Ogre::Exception: ") + std::string(e.what()))); } catch(std::exception &e){ throw(OgreAppException(std::string("std::Exception: ") + std::string(e.what()))); } }
void OgreApplication::InitOIS(void){ /* Initialize the Object Oriented Input System (OIS) */ try { /* Initialize input manager */ OIS::ParamList pl; // Parameter list passed to the input manager initialization size_t windowHnd = 0; std::ostringstream windowHndStr; ogre_window_->getCustomAttribute("WINDOW", &windowHnd); windowHndStr << windowHnd; pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str())); pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND" ))); pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE"))); input_manager_ = OIS::InputManager::createInputSystem(pl); /*size_t hWnd = 0; ogre_window_->getCustomAttribute("WINDOW", &hWnd); input_manager_ = OIS::InputManager::createInputSystem(hWnd);*/ /* Initialize keyboard and mouse */ keyboard_ = static_cast<OIS::Keyboard*>(input_manager_->createInputObject(OIS::OISKeyboard, false)); mouse_ = static_cast<OIS::Mouse*>(input_manager_->createInputObject(OIS::OISMouse, false)); unsigned int width, height, depth; int top, left; ogre_window_->getMetrics(width, height, depth, left, top); const OIS::MouseState &ms = mouse_->getMouseState(); ms.width = width; ms.height = height; } catch(std::exception &e){ throw(OgreAppException(std::string("std::Exception: ") + std::string(e.what()))); } }
void OgreApplication::CreateWall(Ogre::String material_name){ try { /* Create two rectangles */ /* Retrieve scene manager and root scene node */ Ogre::SceneManager* scene_manager = ogre_root_->getSceneManager("MySceneManager"); Ogre::SceneNode* root_scene_node = scene_manager->getRootSceneNode(); /* Create the 3D object */ Ogre::ManualObject* object = NULL; Ogre::String object_name = "Wall"; object = scene_manager->createManualObject(object_name); object->setDynamic(false); /* Create triangle list for the object */ object->begin(material_name, Ogre::RenderOperation::OT_TRIANGLE_LIST); /* Add vertices */ /* One side of the "wall" */ object->position(-1.0,-1.0,0.0); object->normal(0.0, 0.0, -1.0); object->tangent(-1.0, 0.0, 0.0); object->textureCoord(1.0, 0.0); object->position(-1.0,1.0,0.0); object->normal(0.0, 0.0, -1.0); object->tangent(-1.0, 0.0, 0.0); object->textureCoord(1.0, 1.0); object->position(1.0,1.0,0.0); object->normal(0.0, 0.0, -1.0); object->tangent(-1.0, 0.0, 0.0); object->textureCoord(0.0, 1.0); object->position(1.0,-1.0,0.0); object->normal(0.0, 0.0, -1.0); object->tangent(-1.0, 0.0, 0.0); object->textureCoord(0.0, 0.0); /* The other side of the "wall" */ object->position(-1.0,-1.0,0.0); object->normal(0.0, 0.0, 1.0); object->tangent(1.0, 0.0, 0.0); object->textureCoord(0.0, 0.0); object->position(-1.0,1.0,0.0); object->normal(0.0, 0.0, 1.0); object->tangent(1.0, 0.0, 0.0); object->textureCoord(0.0, 1.0); object->position(1.0,1.0,0.0); object->normal(0.0, 0.0, 1.0); object->tangent(1.0, 0.0, 0.0); object->textureCoord(1.0, 1.0); object->position(1.0,-1.0,0.0); object->normal(0.0, 0.0, 1.0); object->tangent(1.0, 0.0, 0.0); object->textureCoord(1.0, 0.0); /* Add triangles */ /* One side */ object->triangle(0, 1, 2); object->triangle(0, 2, 3); /* The other side */ object->triangle(4, 7, 6); object->triangle(4, 6, 5); /* We finished the object */ object->end(); /* Convert triangle list to a mesh */ Ogre::String mesh_name = "Wall"; object->convertToMesh(mesh_name); /* Create one instance of the sphere (one entity) */ /* The same object can have multiple instances or entities */ Ogre::Entity* entity = scene_manager->createEntity(mesh_name); /* Apply a material to the entity to give it color */ /* We already did that above, so we comment it out here */ /* entity->setMaterialName(material_name); */ /* But, this call is useful if we have multiple entities with different materials */ /* Create a scene node for the entity */ /* The scene node keeps track of the entity's position */ Ogre::SceneNode* scene_node = root_scene_node->createChildSceneNode(mesh_name); scene_node->attachObject(entity); /* Position and rotate the entity with the scene node */ //scene_node->rotate(Ogre::Vector3(0, 1, 0), Ogre::Degree(60)); //scene_node->rotate(Ogre::Vector3(1, 0, 0), Ogre::Degree(30)); //scene_node->rotate(Ogre::Vector3(1, 0, 0), Ogre::Degree(-90)); //scene_node->translate(0.0, 0.0, 0.0); scene_node->scale(0.5, 0.5, 0.5); } catch (Ogre::Exception &e){ throw(OgreAppException(std::string("Ogre::Exception: ") + std::string(e.what()))); } catch(std::exception &e){ throw(OgreAppException(std::string("std::Exception: ") + std::string(e.what()))); } }
void OgreApplication::CreateParticleGeometry(Ogre::String object_name, int num_particles, float loop_radius, float circle_radius){ try { /* Retrieve scene manager and root scene node */ Ogre::SceneManager* scene_manager = ogre_root_->getSceneManager("MySceneManager"); Ogre::SceneNode* root_scene_node = scene_manager->getRootSceneNode(); /* Create the 3D object */ Ogre::ManualObject* object = NULL; object = scene_manager->createManualObject(object_name); object->setDynamic(false); /* Create point list for the object */ object->begin("", Ogre::RenderOperation::OT_POINT_LIST); /* Initialize random numbers */ std::srand(std::time(0)); /* Create a set of points which will be the particles */ /* This is similar to drawing a torus: we will sample points on the surface of the torus */ float maxspray = 0.5; // This is how much we allow the points to wander around float u, v, w, theta, phi, spray; // Work variables for (int i = 0; i < num_particles; i++){ // Randomly select two numbers to define a point on the torus u = ((double) rand() / (RAND_MAX)); v = ((double) rand() / (RAND_MAX)); float x,y,z; x = ((double) rand() / (RAND_MAX))+0.5; y = ((double) rand() / (RAND_MAX))-0.5; z = ((double) rand() / (RAND_MAX))-0.5; // Use u and v to define the point on the torus theta = u * Ogre::Math::TWO_PI; phi = v * Ogre::Math::TWO_PI; Ogre::Vector3 center = Ogre::Vector3(loop_radius*cos(theta), loop_radius*sin(theta), 0.0); Ogre::Vector3 normal = Ogre::Vector3(cos(theta)*cos(phi), sin(theta)*cos(phi), sin(phi)); object->position(0,0,0); // Position of the point object->normal(2*x,y,z); object->colour(Ogre::ColourValue(((float) i)/((float) num_particles), 0.0, 1.0 - (((float) i)/((float) num_particles)))); object->textureCoord(Ogre::Vector2(0.0, 0.0)); // Now sample a point on a sphere to define a direction for points to wander around u = ((double) rand() / (RAND_MAX)); v = ((double) rand() / (RAND_MAX)); w = ((double) rand() / (RAND_MAX)); theta = u * Ogre::Math::TWO_PI; phi = acos(2.0*v * -1.0); spray = maxspray*pow((float) w, (float) (1.0/3.0)); // Cubic root Ogre::Vector3 wander = Ogre::Vector3(spray*sin(theta)*sin(phi), spray*cos(theta)*sin(phi), cos(phi)); //object->normal(wander); } /* We finished the object */ object->end(); /* Convert triangle list to a mesh */ object->convertToMesh(object_name); } catch (Ogre::Exception &e){ throw(OgreAppException(std::string("Ogre::Exception: ") + std::string(e.what()))); } catch(std::exception &e){ throw(OgreAppException(std::string("std::Exception: ") + std::string(e.what()))); } }