OGRE渲染输出到MFC.docx
《OGRE渲染输出到MFC.docx》由会员分享,可在线阅读,更多相关《OGRE渲染输出到MFC.docx(10页珍藏版)》请在冰豆网上搜索。
OGRE渲染输出到MFC
OGRE渲染输出到MFC
作者:
qlwuu|日期:
2005-06-28
折腾了一天基本搞定, 其实也挺容易, 关键要注意几个地方
1)因为不在使用OGRE默认的配置窗口来初始化RenderSystem,现在这一步必须自己来做。
首先设置配置文件路径,然后轮询可用的RenderSystem。
这里默认使用Direct3D9 Render System。
// 和原来一样设置插件、资源路径,设置过后就可以轮讯可用的RenderSystem了
setupResources();
// 指定使用Direct3D9 Render System渲染子系统。
RenderSystemList *rl = Root:
:
getSingleton().getAvailableRenderers();
RenderSystemList:
:
iterator it = rl->begin();
D3D9RenderSystem *mRSys = NULL;
while( it !
= rl->end() )
{
if( -1 !
= ( *it )->getName().find( "3D9" ) )
{
mRSys = ( D3D9RenderSystem* )( *it );
break;
}
it++;
}
// 配置框中的选项需要手动设置。
mRSys->initConfigOptions();
mRSys->setConfigOption( "Anti aliasing", "None" );
mRSys->setConfigOption( "Floating-point mode", "Fastest" );
mRSys->setConfigOption( "Full Screen", "No" );
mRSys->setConfigOption( "Rendering Device", "NVIDIA GeForce2 MX/MX 400" );
mRSys->setConfigOption( "VSync", "No" );
mRSys->setConfigOption( "Video Mode", "640 x 480 @ 32-bit colour" );
// 起用
mRoot->setRenderSystem( mRSys );
2)剩下的初始化过程和ExampleApplication基本一致,只不过现在不需要由OGRE自动创建窗体,应该将MFC视图的句柄传过去初始化。
// 初始化,传入false表示不需要OGRE自动创建窗口
mRoot->initialise( false );
// 手动创建渲染窗口,在这里我们将MFC视图的句柄传入
NamevaluePairList miscParams;
miscParams["externalWindowHandle"] = StringConverter:
:
toString( ( size_t )mWnd );
mWindow = mRoot->createRenderWindow( "View", 640, 480, false, &miscParams );
到次初始化过程已经完毕,这时候运行程序就得到一个漆黑的MFC窗口。
3)因为现在使用是视图的WndProc,我们必须自己处理更新和触发FrameStart事件.
// 触发FrameStart, FrameEnd事件
void update( void )
{
mRoot->_fireFrameStarted();
mWindow->update();
mRoot->_fireFrameEnded();
}
//在视图的OnDraw时间里,调用update
void CMFCRenderView:
:
OnDraw(CDC* /*pDC*/)
{
CMFCRenderDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!
pDoc)
return;
// TODO:
在此处为本机数据添加绘制代码
update();
}
这样还不够,WM_PAINT事件并不由我们控制,当窗体静静的趟在那的时候是不会触发的,因此我们通过设置一个timer来模拟没帧的更新,
// 20ms触发一次
SetTimer( 100, 20, 0 );
void CMFCRenderView:
:
OnTimer(UINT nIDEvent)
{
// TODO:
在此添加消息处理程序代码和/或调用默认值
update();
__super:
:
OnTimer(nIDEvent);
}
注意:
(1)
初始化可以在OnDraw(CDC*pDC)的第一次执行时候进行,而不能在PreCreateWindow(CREATESTRUCT&cs)或者COgreMFCView()或者OnCreate()这个CView的子类初始化的时候进行因为这个时候,View对应的HWND实际上还没初始化出来呢...
(2)
初始化完了一定记得用RenderWindow*window->update()一下,否则看不出来-__-||
MFCOGRE代码:
//OgreMFCView.cpp:
COgreMFCView类的实现
//
#include"stdafx.h"
#include"OgreMFC.h"
#include"OgreMFCDoc.h"
#include"OgreMFCView.h"
#include"OgreRenderSystem.h"
#include"OgreRoot.h"
#include"OgreGLRenderSystem.h"
#include"OgreD3D9RenderSystem.h"
#include"OgreCommon.h"
#include"OgreRenderWindow.h"
#include"OgreStringConverter.h"
#include"OgreConfigFile.h"
#include"OgreCamera.h"
#include"OgreViewport.h"
#include"OgreMeshManager.h"
#include"OgreEntity.h"
#include".\ogremfcview.h"
usingnamespaceOgre;
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//COgreMFCView
IMPLEMENT_DYNCREATE(COgreMFCView,CView)
BEGIN_MESSAGE_MAP(COgreMFCView,CView)
//标准打印命令
ON_COMMAND(ID_FILE_PRINT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:
:
OnFilePrintPreview)
ON_WM_CREATE()
END_MESSAGE_MAP()
//COgreMFCView构造/析构
COgreMFCView:
:
COgreMFCView()
{
}
COgreMFCView:
:
~COgreMFCView()
{
}
BOOLCOgreMFCView:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
在此处通过修改CREATESTRUCTcs来修改窗口类或
//样式
returnCView:
:
PreCreateWindow(cs);
}
//COgreMFCView绘制
voidCOgreMFCView:
:
OnDraw(CDC*pDC)
{
staticboolonce=true;
COgreMFCDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
if(!
pDoc)
return;
//TODO:
在此处为本机数据添加绘制代码
//RECTrect={20,30,180,230};
//pDC->DrawText("ZTZTZTZTZTZTTZT!
",&rect,DT_CENTER);
staticRoot*mRoot;
staticRenderWindow*mWindow;
staticSceneManager*mSceneMgr;
staticCamera*mCamera;
if(once)
{
mRoot=newRoot();
setupResources();
RenderSystemList*rl=Root:
:
getSingleton().getAvailableRenderers();
//D3D9RenderSystem
GLRenderSystem*rsys=NULL;
RenderSystemList:
:
iteratorit=rl->begin();
while(it!
=rl->end())
{
if(-1!
=(*it)->getName().find("GL"))
{
rsys=(GLRenderSystem*)(*it);
break;
}
it++;
}
//rsys->initConfigOptions();
rsys->setConfigOption("ColourDepth","32");
//rsys->setConfigOption("Antialiasing","None");
//rsys->setConfigOption("Floating-pointmode","Fastest");
rsys->setConfigOption("FullScreen","No");
//rsys->setConfigOption("RenderingDevice","NVIDIAGeForceFX5700VE");
rsys->setConfigOption("VSync","No");
//rsys->setConfigOption("VideoMode","800x600@32-bitcolour");
rsys->setConfigOption("VideoMode","800x600");
rsys->setConfigOption("DisplayFrequency","60");
//起用
mRoot->setRenderSystem(rsys);
mRoot->initialise(false);
NameValuePairListmiscParams;
unsignedinth=(unsignedint)this->GetSafeHwnd();
miscParams["externalWindowHandle"]=StringConverter:
:
toString(h);
mWindow=NULL;
mWindow=mRoot->createRenderWindow("View",640,480,false,&miscParams);
once=false;
mSceneMgr=mRoot->getSceneManager(ST_GENERIC);
//Createthecamera
mCamera=mSceneMgr->createCamera("PlayerCam");
//Positionitat500inZdirection
mCamera->setPosition(Vector3(0,0,500));
//Lookbackalong-Z
mCamera->lookAt(Vector3(0,0,-300));
mCamera->setNearClipDistance(5);
//Createoneviewport,entirewindow
Viewport*vp=mWindow->addViewport(mCamera);
vp->setBackgroundColour(ColourValue(0,0,0));
//Alterthecameraaspectratiotomatchtheviewport
mCamera->setAspectRatio(
Real(vp->getActualWidth())/Real(vp->getActualHeight()));
ResourceGroupManager:
:
getSingleton().initialiseAllResourceGroups();
//createScene();
//Setambientlight
mSceneMgr->setAmbientLight(ColourValue(0.5,0.5,0.5));
//Createaskydome
mSceneMgr->setSkyDome(true,"Examples/CloudySky",5,8);
//Createalight
Light*l=mSceneMgr->createLight("MainLight");
//Acceptdefaultsettings:
pointlight,whitediffuse,justsetposition
//NBIcouldattachthelighttoaSceneNodeifIwantedittomoveautomaticallywith
//otherobjects,butIdon't
l->setPosition(20,80,50);
Entity*ent;
//Defineafloorplanemesh
Planep;
p.normal=Vector3:
:
UNIT_Y;
p.d=200;
MeshManager:
:
getSingleton().createPlane("FloorPlane",
ResourceGroupManager:
:
DEFAULT_RESOURCE_GROUP_NAME,
p,2000,2000,1,1,true,1,5,5,Vector3:
:
UNIT_Z);
//Createanentity(thefloor)
ent=mSceneMgr->createEntity("floor","FloorPlane");
ent->setMaterialName("Examples/RustySteel");
mSceneMgr->getRootSceneNode()->attachObject(ent);
ent=mSceneMgr->createEntity("head","ogrehead.mesh");
//Attachtochildofrootnode,betterforculling(otherwiseboundsarethecombinationofthe2)
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent);
mWindow->update();
}
else
{
//mRoot->startRendering();
mWindow->update();
//drawScene();
}
}
//COgreMFCView打印
BOOLCOgreMFCView:
:
OnPreparePrinting(CPrintInfo*pInfo)
{
//默认准备
returnDoPreparePrinting(pInfo);
}
voidCOgreMFCView:
:
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
打印前添加额外的初始化
}
voidCOgreMFCView:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
打印后添加清除过程
}
//COgreMFCView诊断
#ifdef_DEBUG
voidCOgreMFCView:
:
AssertValid()const
{
CView:
:
AssertValid();
}
voidCOgreMFCView:
:
Dump(CDumpContext&dc)const
{
CView:
:
Dump(dc);
}
COgreMFCDoc*COgreMFCView:
:
GetDocument()const//非调试版本是内联的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COgreMFCDoc)));
return(COgreMFCDoc*)m_pDocument;
}
#endif//_DEBUG
//COgreMFCView消息处理程序
intCOgreMFCView:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CView:
:
OnCreate(lpCreateStruct)==-1)
return-1;
//TODO:
在此处添加构造代码
return0;
}
voidCOgreMFCView:
:
setupResources(void)
{
//Loadresourcepathsfromconfigfile
ConfigFilecf;
cf.load("resources.cfg");
//Gothroughallsections&settingsinthefile
ConfigFile:
:
SectionIteratorseci=cf.getSectionIterator();
StringsecName,typeName,archName;
while(seci.hasMoreElements())
{
secName=seci.peekNextKey();
ConfigFile:
:
SettingsMultiMap*settings=seci.getNext();
ConfigFile:
:
SettingsMultiMap:
:
iteratori;
for(i=settings->begin();i!
=settings->end();++i)
{
typeName=i->first;
archName=i->second;
ResourceGroupManager:
:
getSingleton().addResourceLocation(
archName,typeName,secName);
}
}
}