|
我用mSceneMgr->setWorldGeometry("terrain.cfg");设置地形时老是抛出异常(media路径没错)
相关代码
// OgreWin32.cpp : 定义应用程序的入口点。
//
#include "stdafx.h"
#include "OgreWin32.h"
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
using namespace Ogre;
Root *mRoot = 0; //
SceneManager *mSceneMgr = 0; //
Camera *mCamera = 0; //
Viewport* mViewPort = 0;
RenderWindow* mRenderWindow=0;
// 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable;
HWND hWnd;
// 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_OGREWIN32, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
mRoot = new Root();
ConfigFile cf;
cf.load("resources.cfg");
ConfigFile::SectionIterator seci = cf.getSectionIterator();
String secName, typeName, archName;
while (seci.hasMoreElements())
{
secName = seci.peekNextKey();
ConfigFile::SettingsMultiMap *settings = seci.getNext();
ConfigFile::SettingsMultiMap::iterator i;
for (i = settings->begin(); i != settings->end(); ++i)
{
typeName = i->first;
archName = i->second;
ResourceGroupManager::getSingleton().addResourceLocation(
archName, typeName, secName);
}
}
RenderSystemList *rsList = mRoot->getAvailableRenderers();
int c=0;
bool foundit = false;
RenderSystem *selectedRenderSystem=0;
while(c < (int) rsList->size())
{
selectedRenderSystem = rsList->at(c);
String rname = selectedRenderSystem->getName();
if(rname.compare("Direct3D9 Rendering Subsystem")==0)
{
foundit=true;
break;
}
c++; // <-- oh how clever
}
if(!foundit)
return FALSE; //we didn't find it...
//we found it, we might as well use it!
mRoot->setRenderSystem(selectedRenderSystem);
selectedRenderSystem->setConfigOption("Full Screen","No");
selectedRenderSystem->setConfigOption("Video Mode","800 x 600 @ 32-bit colour");
//retrieve the config option map
ConfigOptionMap comap = selectedRenderSystem->getConfigOptions();
//and now we need to run through all of it
ConfigOptionMap::const_iterator start = comap.begin();
ConfigOptionMap::const_iterator end = comap.end();
while(start != end)
{
String OptionName = start->first;
String CurrentValue = start->second.currentValue;
StringVector PossibleValues = start->second.possibleValues;
int c=0;
while (c < (int) PossibleValues.size())
{
String OneValue = PossibleValues.at(c);
c++;
}
start++;
}
//end boilerplate
mRoot->initialise(false,"Some Window Title");
NameValuePairList misc;
misc["externalWindowHandle"] = StringConverter::toString( (size_t)hWnd);
mRenderWindow = mRoot->createRenderWindow( "My sub render window", 800, 600, false, &misc );
ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
// choose sm
mSceneMgr = mRoot->createSceneManager(ST_EXTERIOR_CLOSE);
mSceneMgr->setAmbientLight(ColourValue(1, 1, 1));
mSceneMgr->setWorldGeometry("terrain.cfg");
//Entity *ent1 = mSceneMgr->createEntity( "ogre", "ogrehead.mesh" );
//SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode" );
//node1->attachObject( ent1 );
// --------------------
//Create the camera
mCamera = mSceneMgr->createCamera(" layerCam");
// Position it at 500 in Z direction
mCamera->setPosition(Ogre::Vector3(0,0,500));
// Look back along -Z
mCamera->lookAt(Ogre::Vector3(0,0,-300));
mCamera->setNearClipDistance(5);
// Set the viewport
mViewPort = mRenderWindow->addViewport(mCamera);
mViewPort->setBackgroundColour(Ogre::ColourValue(0.0f, 0.0f, 0.0f, 1.0f));
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_OGREWIN32);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
//placing renderOneFrame seems to allow for a clean shutdown.
//thanks to user lakin for that hint.
if (mRoot->renderOneFrame())
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
//// 执行应用程序初始化:
//if (!InitInstance (hInstance, nCmdShow))
//{
// return FALSE;
//}
// hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_OGREWIN32));
//
// // 主消息循环:
// while (GetMessage(&msg, NULL, 0, 0))
// {
// if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
// {
// TranslateMessage(&msg);
// DispatchMessage(&msg);
// }
// }
//
// return (int) msg.wParam;
//}
//
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
// 仅当希望
// 此代码与添加到 Windows 95 中的“RegisterClassEx”
// 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
// 这样应用程序就可以获得关联的
// “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_OGREWIN32));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_OGREWIN32);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
//
// 函数: InitInstance(HINSTANCE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // 将实例句柄存储在全局变量中
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
mRoot->detachRenderTarget(mRenderWindow);
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_ERASEBKGND:
return 1;
case WM_SIZE:
if (mCamera)
{
RECT rect;
GetClientRect(hWnd,&rect);
// notify "render window" instance
mRenderWindow->windowMovedOrResized();
// Adjust camera's aspect ratio, too
if ((rect.bottom - rect.top) != 0 && mCamera != 0)
mCamera->setAspectRatio((Ogre::Real)mRenderWindow->getWidth() / (Ogre::Real)mRenderWindow->getHeight());
mCamera->yaw(Radian(0));
Root::getSingletonPtr()->renderOneFrame();
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
|
|