OGRE渲染输出到MFC.docx

上传人:b****2 文档编号:18008516 上传时间:2023-04-24 格式:DOCX 页数:10 大小:18.68KB
下载 相关 举报
OGRE渲染输出到MFC.docx_第1页
第1页 / 共10页
OGRE渲染输出到MFC.docx_第2页
第2页 / 共10页
OGRE渲染输出到MFC.docx_第3页
第3页 / 共10页
OGRE渲染输出到MFC.docx_第4页
第4页 / 共10页
OGRE渲染输出到MFC.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

OGRE渲染输出到MFC.docx

《OGRE渲染输出到MFC.docx》由会员分享,可在线阅读,更多相关《OGRE渲染输出到MFC.docx(10页珍藏版)》请在冰豆网上搜索。

OGRE渲染输出到MFC.docx

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);

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1