ogre1.7 cookbook_OgreWin32Application

环境配置: win32Application

新工程的debug目录下需要:

ogre.cfg

resources_d.cfg

plugins_d.cfg

OgreMain_d.dll

RenderSystem_Direct3D9_d.dll(RenderSystem_GL_d.dll)

Plugin_ParticleFX_d.dll

 

#pragma once

#include "Ogre.h"

class CEngine
{
public:
    CEngine(HWND hWnd);
    ~CEngine();

public:
    Ogre::Root* m_Root;
    Ogre::SceneManager* m_sceneMgr;
    Ogre::RenderWindow* m_renderWindow;
    Ogre::Camera* m_camera;
};
#include "stdafx.h"
#include "Engine.h"

#include <string>

CEngine::CEngine(HWND hWnd)
{
    TCHAR szPath[MAX_PATH];
    GetModuleFileName(NULL, szPath, MAX_PATH);

    std::string path(szPath);
    int pos = path.find_last_of("\\");
    if (pos != std::string::npos)
    {
        path = path.substr(0, pos);
        path += "\\";
    }

    m_Root = new Ogre::Root("", "", Ogre::String(path) + Ogre::String("OgreWin32.log"));

    Ogre::ConfigFile ogreConfigFile;
    ogreConfigFile.load(Ogre::String(path) + Ogre::String("ogre.cfg"));

    Ogre::String renderSystemName = ogreConfigFile.getSetting("Render System");
    if (renderSystemName == "Direct3D9 Rendering Subsystem")
    {
#ifdef _DEBUG
        m_Root->loadPlugin("RenderSystem_Direct3D9_d");
#else
        m_Root->loadPlugin("RenderSystem_Direct3D9");
#endif
    }
    else if(renderSystemName == "OpenGL Rendering Subsystem")
        {
#ifdef _DEBUG
            m_Root->loadPlugin("RenderSystem_GL_d");
#else
            m_Root->loadPlugin("RenderSystem_GL");
#endif
        }
        else
        {
#ifdef _DEBUG         
            m_Root->loadPlugin("RenderSystem_Direct3D9_d");
#else
            m_Root->loadPlugin("RenderSystem_Direct3D9");
#endif
        }

#ifdef _DEBUG
    m_Root->loadPlugin("Plugin_ParticleFX_d");
#else
    m_Root->loadPlugin("Plugin_ParticleFX");
#endif

        Ogre::RenderSystemList renderList = m_Root->getAvailableRenderers();
        m_Root->setRenderSystem(renderList[0]);

        m_Root->initialise(false);
        m_sceneMgr = m_Root->createSceneManager(Ogre::ST_GENERIC, "ogreWin32");

        Ogre::NameValuePairList params;
        params["externalWindowHandle"] = Ogre::StringConverter::toString((long)hWnd);
        params["vsync"] = "true";

        RECT rect;
        GetClientRect(hWnd, &rect);
        Ogre::RenderTarget* renderWindow = NULL;
        try
        {
            m_renderWindow = m_Root->createRenderWindow("ogreWin32", rect.right - rect.left,
                rect.bottom - rect.top, false, &params);
        }
        catch (...)
        {
            MessageBox(hWnd, "failed create ogre render window", "initialize rendr system",
                MB_OK | MB_ICONSTOP);
            exit(EXIT_SUCCESS);
        }

        Ogre::ConfigFile cf;
        cf.load(Ogre::String(path) + Ogre::String("resources_d.cfg"));

        Ogre::ConfigFile::SectionIterator seci = cf.getSectionIterator();
        Ogre::String secName, typeName, archName;
        while (seci.hasMoreElements())
        {
            secName = seci.peekNextKey();
            Ogre::ConfigFile::SettingsMultiMap* settings = seci.getNext();
            Ogre::ConfigFile::SettingsMultiMap::iterator ite;
            for (ite = settings->begin(); ite != settings->end(); ++ite)
            {
                typeName = ite->first;
                archName = ite->second;
                Ogre::ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName);
            }
        }

        Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

        m_camera = m_sceneMgr->createCamera("ogrewin32 camera");
        m_camera->setNearClipDistance(0.5);
        m_camera->setFarClipDistance(5000);
        m_camera->setCastShadows(false);
        m_camera->setUseRenderingDistance(true);
        m_camera->setPosition(Ogre::Vector3(200.0, 50.0, 100.0));
        Ogre::SceneNode* camerNode = NULL;
        camerNode = m_sceneMgr->getRootSceneNode()->createChildSceneNode("camer node");

        Ogre::Viewport* viewPort = NULL;
        if (0 == m_renderWindow->getNumViewports())
        {
            viewPort = m_renderWindow->addViewport(m_camera);
            viewPort->setBackgroundColour(Ogre::ColourValue(0.8, 1.0, 0.8));
        }

        m_camera->setAutoAspectRatio(true);

        Ogre::MeshManager::getSingleton().createPlane("floor", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
            Ogre::Plane(Ogre::Vector3::UNIT_Y, -30), 1000, 1000, 10, 10, true, 1, 8, 8, Ogre::Vector3::UNIT_Z);

        // create a floor entity, give it a material, and place it at the origin
        Ogre::Entity* floor = m_sceneMgr->createEntity("Floor", "floor");
        floor->setMaterialName("Examples/BumpyMetal");
        m_sceneMgr->getRootSceneNode()->attachObject(floor);

        Ogre::Entity* entity = m_sceneMgr->createEntity("Sinbad", "Sinbad.mesh");
        Ogre::SceneNode* sinbadNode = m_sceneMgr->getRootSceneNode()->createChildSceneNode();
        sinbadNode->attachObject(entity);
        sinbadNode->scale(10.0f, 10.0f, 10.0f);
        sinbadNode->setPosition(Ogre::Vector3(0, 30, 0));

        Ogre::AxisAlignedBox robotBox = entity->getBoundingBox();
        Ogre::Vector3 center = robotBox.getCenter();
        m_camera->lookAt(center);

        m_sceneMgr->setAmbientLight(Ogre::ColourValue(0.3, 0.3, 0.3));
        Ogre::Light* light = m_sceneMgr->createLight();
        light->setType(Ogre::Light::LT_POINT);
        light->setPosition(-10, 40, 20);
        light->setSpecularColour(Ogre::ColourValue::White);
}

CEngine::~CEngine()
{
    //clear scene..
    if (m_sceneMgr)
        m_sceneMgr->clearScene();

    //unload resource..
    Ogre::ResourceGroupManager::ResourceManagerIterator resMgrs =
        Ogre::ResourceGroupManager::getSingleton().getResourceManagerIterator();

    while (resMgrs.hasMoreElements())
    {
        resMgrs.getNext()->unloadUnreferencedResources();
    }

    if (m_sceneMgr)
    {
        m_Root->destroySceneManager(m_sceneMgr);
        m_sceneMgr = 0;
    }

    if (m_renderWindow)
    {
        m_renderWindow->removeAllViewports();
    }

    if (m_Root)
    {
        delete m_Root;
        m_Root = 0;
    }
}

CEngine* pEngine = NULL;
void InitEngine(HWND hwnd);
void CloseEngine();

//

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

InitEngine(hWnd);

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

 

return TRUE;
}

///

case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
pEngine->m_Root->renderOneFrame();
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);

CloseEngine();

break;

///

void InitEngine(HWND hwnd)
{
pEngine = new CEngine(hwnd);
}

void CloseEngine()
{
if (pEngine)
{
delete pEngine;
pEngine = NULL;
}
}

注意的事:

初次加入.mesh到一个节点后,只画出了模型,但是没有皮肤,是因为没有正确的载入材质的原因.

要想正确的载入材质,Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();

必须被调用.

而且locateResource(读取resources_d.cfg)和上面的loadResource必须在创建了Ogre::RenderTarget* renderWindow之后调用。

另外就是需要Plugin_ParticleFX_d.dll这个dll,以为内在initialiseAllResourceGroups中会用到.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值