OGRE最小程序
来源:互联网 发布:多线程添加数据 编辑:程序博客网 时间:2024/06/08 15:14
// OgreTest.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include<Windows.h>
//#include "afx.h"
#include <OgreCamera.h>
#include <OgreEntity.h>
#include <OgreLogManager.h>
#include <OgreRoot.h>
#include <OgreViewport.h>
#include <OgreSceneManager.h>
#include <OgreRenderWindow.h>
#include <OgreConfigFile.h>
#include <OISEvents.h>
#include <OISInputManager.h>
#include <OISKeyboard.h>
#include <OISMouse.h>
#include <SdkTrays.h>
#include <SdkCameraMan.h>
#ifdef _DEBUG
#pragma comment(lib,"ogremain_d.lib")
#else
#pragma comment(lib,"ogremain.lib")
#endif
using namespace Ogre;
int iCount=0;
Camera * camera ;
class MyFrameListener : public FrameListener{
public:
bool frameStarted (const FrameEvent &evt);
bool frameEnded (const FrameEvent &evt );
};
bool MyFrameListener::frameStarted (const FrameEvent &evt)
{
//在每一帧画面渲染前,调用这里你写好的代码
iCount++;
//camera->setPosition(0, 10, iCount);
camera->moveRelative(Vector3(0.1,0.1,0.1));
return true;
}
bool MyFrameListener::frameEnded (const FrameEvent &evt )
{
//在每一帧画面渲染后,调用这里你写好的代码
/*if(iCount>2000)
{
return false;
}*/
return true;
}
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
{
try
{
/// Root的构造函数里会创建所有Factory以及Manager
/// 这里的3个参数,都是可以为空的(不是省略).
/// 第1个参数指明了插件配置的文件名. 这个文件里指明了我们将要使用的图形驱动(DX or GL)等DLL.
/// 既然是图形程序,所以肯定要有图形驱动了,如果这个参数为空,那么我们必须手动去加载图形驱动.
/// 第2个参数指明了OGRE的图形驱动配置文件。
/// 这个参数实际上是在调试的时候使用的,发布版本的时候肯定是不要它的.
/// 它在Root里的ShowDialg里使用,用来动态的配置当前要使用的图形驱动.
/// 如果我们可以确定我们要使用的图形驱动,完全可以配置我们自己的图形驱动. 具体代码可以参考下面.
/// 第3个参数指定了我们要使用的LOG文件名
Root * root = new Root("","","");
/// 我们手动加载图形驱动
#ifdef _DEBUG
root->loadPlugin("RenderSystem_Direct3D9_d");
#else
root->loadPlugin("Plugins/RenderSystem_Direct3D9");
#endif
/// 由于OGRE的资源加载都由ResourceGroupManager来管理,不通过WINDOWS直接管理.
/// 所以,要正常使用OGRE的资源加载,我们还得把我们的资源目录给加到这个Manager里去.
/// 说白了,就是资源的环境路径.
/// 最起码,当前目录是要加的吧 ^_^
/// 这里也有3个参数。
/// 第1个参数指明了我们要加入的资源的相对目录名
/// 第2个参数指明了我们要加入的资源属于什么资源包。
/// 这个参数比较诡异,到底这个参数要依据什么原则来填写呢。
/// 其实这个参数的名字OGRE的代码里已经定义好了.
/// 如果是文件系统包呢,就查看FileSystemArchiveFactory这个类的定义里的createInstance,名字为FileSystem
/// 如果是ZIP压缩包呢,就查看ZipArchiveFactory这个类的定义里的createInstance,名字为Zip
/// 也就是说,这个名字必须以ArchiveFactory的派生类里定义的为准,否则肯定会出错地.
/// 第3个参数就比较简单了,可以随便填写,它只是对资源做一个逻辑上的分类.
//root->showConfigDialog();
ResourceGroupManager::getSingleton().addResourceLocation(
".", "FileSystem", "General");
ResourceGroupManager::getSingleton().addResourceLocation(
"media", "FileSystem", "General");
//ResourceGroupManager::getSingleton().addResourceLocation(
//"D://ogreTest/WinMain/OgreTest/media/materials/scripts", "FileSystem", "General");
/// 做完以上这步,我们需要把这些资源路径里的文件信息都提取出来,以便加速查找.
/// 下面这个函数就是干这个苦差事的.
ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
/// 刚刚不是说了吗,我们把Root里的第二个参数给留空了,也就是说我们得自己指定一个RenderSystem,
/// 以及给它配置属性
/// 这里我们就用在Plugins里加载进OGRE里的第一个RenderSystem,我这里是DX
RenderSystem * render_system = root->getAvailableRenderers()[0];
/// 设置为窗口模式
render_system->setConfigOption("Full Screen","No");
/// 把这个RenderSystem给设为系统默认的
root->setRenderSystem(render_system);
//root->initialise(true, "test");
/// 好了, 有了RenderSystem,我们就可以初始化我们的Root了.(其实就是创建窗口的过程)
/// 这里我们把RenderSystem的名字也显示在窗口的标题栏中.
RenderWindow *render_win = root->initialise(true,String("my simple orge window,rendersystem : ") + render_system->getName());
//---------------------------------------------
/// 场景的渲染,SceneManager必须创建一个,这个就是我们的游戏舞台了
SceneManager * scene_mgr = root->createSceneManager(ST_EXTERIOR_CLOSE, "my scene");
/// 设置灯光的亮度
scene_mgr->setAmbientLight(ColourValue(0.0,0.8,0.0));
ColourValue fadeColour(0.93, 0.86, 0.76);
scene_mgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000);
//std::string terrain_cfg("tt.cfg");
//scene_mgr->setWorldGeometry(terrain_cfg);
//render_win->getViewport(0)->setBackgroundColour(fadeColour);
// Define the required skyplane
//scene_mgr->setSkyBox(true,"media/materials/scripts/Example-Water");
//scene_mgr->setSkyDome(true,"media/materials/scripts/facial");
/// 场景设置好了,但必须还得有个观察者,这个观察者在这里就是Camera
camera = scene_mgr->createCamera("my camera");
camera->setPosition(Vector3(0,0,500));
camera->lookAt(Vector3(0,0,-300));
camera->setNearClipDistance(20);
/// 有了观察者,但我们怎么看到场景的内容呢?
/// 我们还得需要一个眼睛,在这里叫做Viewport
Viewport* vp = render_win->addViewport(camera);
vp->setBackgroundColour(ColourValue(1,1,1));
/// 这里设置camera的图形比例,必须设置,否则图象会变形
camera->setAspectRatio(Real(vp->getActualWidth()) / Real(vp->getActualHeight()));
/// 我们通过例子里的资源模型ogrehead来做个演示
Entity *ent = scene_mgr->createEntity("Robot","media/models/ogrehead.mesh");
SceneNode *node = scene_mgr->getRootSceneNode()->createChildSceneNode("RobotNode");
node->setPosition(50,30,0);
node->attachObject(ent);
MyFrameListener myListener;
root->addFrameListener(&myListener);
root->startRendering();
// iCount=0;
//while(iCount<2000)
//{
//// //在这里处理引擎使用的网络消息。
//// //在这里处理引擎使用的输入消息。
//// //根据消息更新场景管理状态。
//// //根据新的场景管理状态,渲染下一帧。
// root->renderOneFrame();
// iCount++;
////
//// //检查是否需要退出渲染循环
//// //注意:NextMessageInQueue()这个函数只是为了便于解释程序含义
//// //而虚构出来的函数——Ogre引擎中并没有实现它。
// node->scale(1.0,1.0,1.001);
//}
//在这里进行你需要的清理工作
//然后,关闭Ogre
delete root;
}
catch (Ogre::Exception & e)
{
::MessageBox( NULL,
e.getFullDescription().c_str(),
"An exception has occured!",
MB_OK | MB_ICONERROR | MB_TASKMODAL);
}
}
- OGRE最小程序
- OGRE: Ogre第一个程序
- Ogre gpu程序
- 如何退出ogre程序
- Ogre gpu程序
- Ogre学习教程:Ogre第一个程序
- OGRE 1.9 的第一个程序(OGRE HelloWorld程序)
- OGRE 1.7 例子程序分析
- OGRE 1.7 例子程序分析
- OGRE 1.7 例子程序分析
- Ogre程序添加控制台显示
- OGRE之第一个程序
- 菜鸟也学Ogre-第一个Ogre程序
- Ogre学习笔记(二)创建第一个OGRE程序
- OGRE启动过程详解(OGRE HelloWorld程序原理解析)
- OGRE启动过程详解(OGRE HelloWorld程序原理解析)
- OGRE启动过程详解(OGRE HelloWorld程序原理解析)
- OGRE启动过程详解(OGRE HelloWorld程序原理解析)
- 怎样成为PHP 方向的一个合格的架构师
- n 皇后,试探法。新手
- BitNami-Redmine和VisualSVN-Server的快速配合
- 全局变量和局部变量在内存里的区别
- poj 3778 hdu 3412 An Odd Award Rule
- OGRE最小程序
- sql ntext數據類型字符替換
- MySql
- 初始化Direct3D
- Nginx中的server_name指令特性讲解
- 鼠标移动到指定位置,弹出层
- 使用iconv命令轻松实现linux下字符集编码的转换
- iPhone/Mac 针对内存管理的代码规范
- C++对象构造函数与析构函数的调用时间问题