#ifndef _NEO_OGRE_BASE_H_
#define _NEO_OGRE_BASE_H_
#include <Ogre.h>
class NeoOgreBase
{
public:
NeoOgreBase() : m_root(NULL), m_render_win(NULL), m_scene_mgr(NULL), m_camera(NULL){}
~NeoOgreBase(){if (m_root) delete m_root;}
void Run(void)
{
if (!Initialize())
{
exit(-1);
}
CreateScene();
m_root->startRendering();
}
protected:
bool Initialize(void)
{
m_root = new Ogre::Root("","");
#ifdef _DEBUG
m_root->loadPlugin( "RenderSystem_Direct3D9_d" ); // for a debug build
#else
m_root->loadPlugin( "RenderSystem_Direct3D9" ); // for a release build
#endif
//------------------------------------------------------------------------------------
// Ogre::RenderSystemList *render_sys_list = m_root->getAvailableRenderers(); //for 1.6
// Ogre::RenderSystemList::iterator it_render_sys(render_sys_list->begin() );//for 1.6
// while (it_render_sys != render_sys_list->end() ) //for 1.6
//------------------------------------------------------------------------------------
const Ogre::RenderSystemList &render_sys_list = m_root->getAvailableRenderers();//for 1.7
Ogre::RenderSystemList::const_iterator it_render_sys( render_sys_list.begin() );//for 1.7
while ( it_render_sys != render_sys_list.end() ) //for 1.7
{
Ogre::RenderSystem* render_sys = *(it_render_sys++);
if(render_sys->getName().find("Direct3D9") != Ogre::String::npos)
{
m_root->setRenderSystem(render_sys);
break;
}
}
if (m_root == NULL)
{
delete m_root;
return false;
}
m_root->initialise(false);//false表示不自動產生視窗,手動產生
m_render_win = m_root->createRenderWindow("Neo Ogre", 320, 240, false); //false表非全螢幕模式
m_scene_mgr = m_root->createSceneManager(Ogre::ST_GENERIC,"neo scene manager");
m_camera = m_scene_mgr->createCamera("MainCamera");
Ogre::Viewport* viewport = m_render_win->addViewport(m_camera);
viewport->setBackgroundColour(Ogre::ColourValue::Black); //same as ColourValue( 0, 0, 0 )
//設定camera
m_camera->setAspectRatio( Ogre::Real( viewport->getActualWidth() ) / Ogre::Real( viewport->getActualHeight() ) );
m_camera->setNearClipDistance( 10 );
m_camera->setFarClipDistance( 10000 );
m_camera->setFOVy( Ogre::Degree( 45 ) );
m_camera->setPosition( 0, 0, 1000 );
//增加材質
Ogre::MaterialPtr mtl;
mtl = Ogre::MaterialManager::getSingleton().create("NeoMatrial_0", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
mtl->setLightingEnabled(false);
mtl = Ogre::MaterialManager::getSingleton().create("CheeseCube", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
mtl->setLightingEnabled( true );
mtl->setAmbient(Ogre::ColourValue( 0.87, 0.77, 0.46 ) );
mtl->setDiffuse(Ogre::ColourValue( 0.87, 0.77, 0.46 ) );
return true;
}
protected:
virtual void CreateScene(void) = 0;
Ogre::Root* m_root;
Ogre::RenderWindow* m_render_win;
Ogre::SceneManager* m_scene_mgr;
Ogre::Camera* m_camera;
private:
};
#endif
main.cpp
#include <Ogre.h>
#include <iostream>
#include "NeoOgreBase.h"
using namespace Ogre;
class myOgre : public NeoOgreBase
{
protected:
void CreateScene(void)
{
Light *light = m_scene_mgr->createLight( "light0" );
light->setType( Light::LT_DIRECTIONAL );
light->setDirection( Vector3( 0, -1, -1 ) );
m_scene_mgr->setAmbientLight( ColourValue( 0.5, 0.5, 0.5 ) );
SceneNode *center_node = m_scene_mgr->getRootSceneNode()->createChildSceneNode();
//--------------------------------
std::ostringstream entity_name;
entity_name << "cube0";
Entity *ent = m_scene_mgr->createEntity(entity_name.str(), SceneManager::PT_CUBE );
ent->setMaterialName( "CheeseCube" );
SceneNode *scene_node = center_node->createChildSceneNode();
scene_node->rotate( Vector3::UNIT_Z, Degree( 0 ), SceneNode::TS_LOCAL );
scene_node->translate( Vector3( 0, 0, 0 ), SceneNode::TS_LOCAL );
scene_node->attachObject( ent );
//---------------------------------
entity_name << "cube1";
Entity *ent2 = m_scene_mgr->createEntity(entity_name.str(), SceneManager::PT_CUBE );
ent2->setMaterialName( "NeoMatrial_0" );
SceneNode *scene_node2 = center_node->createChildSceneNode();
scene_node2->rotate( Vector3::UNIT_Z, Degree( 0 ), SceneNode::TS_LOCAL );
scene_node2->translate( Vector3( 300, 0, 0 ), SceneNode::TS_LOCAL );
scene_node2->attachObject(ent2);
//---------------------------------
}
};
int main(int argc, char *argv[])
{
myOgre a;
a.Run();
return true;
}
沒有留言:
張貼留言