自定义QtCreator添加Ogre新建模板

3 篇文章 0 订阅
2 篇文章 0 订阅

进入自己的QtCreator目录下,路径:

换成自己的

D:\Qt\Qt5.2.1-vs\Tools\QtCreator\share\qtcreator\templates\wizards


复制多一份hello world 改名为ogre

把wizard_sample.xml 改为 wizard.xml  QtCreator 只认这个文件名

打开wizard.xml

找到

<wizard version="1" kind="project"
        class="qt4project" firstpage="10"
        id="A.HelloWorld" category="B.CustomProjects">
    <icon>console.png</icon>
    <description>Creates a hello-world-project with custom message.</description>
    <displayname>Hello World</displayname>;
    <displaycategory>Custom Projects</displaycategory>
    <files>
        <file source="main.cpp" openeditor="true"/>
        <file source="project.pro" target="%ProjectName%.pro" openproject="true"/>
    </files>


改为

<wizard version="1" kind="project"
        class="qt4project" firstpage="10"
        id="A.HelloWorld" category="B.CustomProjects">
    <icon>qtogre.png</icon>
    <description>Creates a ogre-project.</description>
    <displayname>ogre</displayname>;
    <displaycategory>Custom Projects</displaycategory>
    <files>
        <file source="main.cpp" openeditor="true"/>
        <file source="ogreview.cpp" openeditor="true"/>
        <file source="ogreview.h" openeditor="true"/>
        <file source="project.pro" target="%ProjectName%.pro" openproject="true"/>
    </files>


project.pro 文件清掉内容,写入以下

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
DEFINES -= UNICODE
TARGET = qtclient
TEMPLATE = app

unix {
	# You may need to change this include directory
	INCLUDEPATH += /usr/include/OGRE
	CONFIG += link_pkgconfig
	PKGCONFIG += OGRE
}
win32 {
	LIBS *= user32.lib
	LIBS += -L$(OGRE_HOME)\\boost\\lib
	release:LIBS += -L$(OGRE_HOME)\\lib\\release
	debug:LIBS += -L$(OGRE_HOME)\\lib\\debug
	INCLUDEPATH += $(OGRE_HOME)\\include
	INCLUDEPATH += $(OGRE_HOME)\\include\\OGRE
	INCLUDEPATH += $(OGRE_HOME)\\boost
	# If you are using Ogre 1.9 also include the following line:
	# INCLUDEPATH += $(OGRE_HOME)\\include\\OGRE\\Overlay
}
debug {
	TARGET = $$join(TARGET,,,d)
	LIBS *= -lOgreMain_d
	# If you are using Ogre 1.9 also include -lOgreOverlay_d, like this:
	# LIBS *= -lOgreMain_d -lOIS_d -lOgreOverlay_d
}
release {
	LIBS *= -lOgreMain
	# If you are using Ogre 1.9 also include -lOgreOverlay, like this:
	# LIBS *= -lOgreMain -lOIS -lOgreOverlay
}
SOURCES += main.cpp \
    ogreview.cpp

HEADERS  += \
    ogreview.h



在ogre文件夹里面添加ogreview.h  ogreview.cpp  main.cpp(默认已有)


ogreview.h

#ifndef OGREVIEW_H
#define OGREVIEW_H

#include <OGRE/Ogre.h>
#include <QWidget>
#include <QKeyEvent>
#include <QMouseEvent>

class OgreView : public QWidget
{
    Q_OBJECT

public:
    OgreView(QWidget* parent );
    ~OgreView();
    //QSize minimumSizeHint() const;
    //QSize sizeHint() const;
protected:
    void setupView();//创建Ogre使用的内容,场景内容;
    void update();//通过它,手动更新场景内容
    void setupResources();//
    void createScene();
    void createLight();
    void resizeEvent(QResizeEvent* evt);//窗口可能缩放
    void timerEvent(QTimerEvent* evt);//可以设一时钟来更新窗口
    void paintEvent(QPaintEvent* evt);//呵,当然得处理了
            //消息响应

    void keyPressEvent(QKeyEvent* evt);
    void mousePressEvent(QMouseEvent* evt);
    void mouseReleaseEvent(QMouseEvent* evt);
    void wheelEvent(QWheelEvent* evt);

    //有关Ogre
    Ogre::RenderWindow* mRenderWindow;
    Ogre::SceneManager* mSceneMgr;
    Ogre::Camera* mCamera;
    Ogre::Viewport* mVp;
    Ogre::Root* mRoot;
    Ogre::Light* mainLight;
    Ogre::Entity* mainEnt;
    Ogre::SceneNode* mainNode;
    Ogre::Real angleX;
    Ogre::Real angleY;
    Ogre::Real rotX;
    Ogre::Real rotY;
    Ogre::Vector3 mDirection;
    Ogre::Real mRotate;
    Ogre::Vector2 mousePos;
    bool mouseLeftPressed;
    bool mouseRightPressed;
    bool mouseMiddleBtn;

};
#endif // OGREVIEW_H

ogreview.cpp

#include "mainwindow.h"

OgreView::OgreView(QWidget* parent) : QWidget(parent,Qt::WindowFlags(Qt::MSWindowsOwnDC))
{
    mRenderWindow = NULL;
    mSceneMgr = NULL;
    mVp = NULL;
    mainEnt = NULL;
    mainNode = NULL;
    angleX = 1;
    angleY = 1;
    rotX = 1;
    rotY = 1;
    mDirection = NULL;
    mRotate = 1;
    mousePos = NULL;
    mouseLeftPressed = false;
    mouseRightPressed = false;
    mouseMiddleBtn = false;
    setupResources();
}

OgreView::~OgreView()
{
    // destroy Viewport and RenderWindow
    if( mVp )
    {
        mRenderWindow->removeViewport(mVp->getZOrder());
        mVp = 0;
    }

    Ogre::Root::getSingleton().detachRenderTarget(mRenderWindow);
    mRenderWindow = 0;

    if(mRoot != NULL)
    {
        delete mRoot;
        mRoot = 0;
    }
}


void OgreView::setupResources()
{
    mRoot = new Ogre::Root("plugins_d.cfg");
    Ogre::ConfigFile cf;
    cf.load("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 i;
        for(i=settings->begin(); i!=settings->end(); ++i)
        {
            typeName = i->first;
            archName = i->second;
            Ogre::ResourceGroupManager::getSingleton().addResourceLocation(archName, typeName, secName);
        }
    }

    mRoot->restoreConfig();
    mRoot->initialise(false);
}

//一般都在这里写上场景初始化的一些信息
void OgreView::createScene()
{
    qDebug("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    mainEnt = mSceneMgr->createEntity("Head", "Sinbad.mesh");
    mainNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
    mainNode->attachObject(mainEnt);
    //搞个地板进去
    Ogre::Plane plane(Ogre::Vector3::UNIT_Y, -10);
    Ogre::MeshManager::getSingleton().createPlane("plane",Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,1500,1500,200,200,true,1,5,5,Ogre::Vector3::UNIT_Z);
    Ogre::Entity* ent = mSceneMgr->createEntity("LightPlaneEntity", "plane");
    mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(ent); ent->setMaterialName("Examples/BeachStones");
    //搞个天空盒子
    mSceneMgr->setSkyBox(true, "Examples/SpaceSkyBox");
}

//创建灯光,没啥好说的
void OgreView::createLight()
{
    mSceneMgr->setAmbientLight(Ogre::ColourValue(0.5, 0.5, 0.5));
    mainLight = mSceneMgr->createLight("MainLight");
    mainLight->setPosition(20,80,50);
}

//设置视角,创建摄像机
void OgreView::setupView()
{
    if(mRenderWindow)
        return;
    //createRenderWindow,当然必须得自己手工建窗口了,把窗口句柄扒出来....

    Ogre::NameValuePairList params;
    params["externalWindowHandle"] = Ogre::StringConverter::toString((size_t)(HWND)winId());
    mRenderWindow = mRoot->createRenderWindow("View", width(), height(), false, ¶ms);
    //SceneManager
    mSceneMgr = mRoot->createSceneManager(Ogre::ST_GENERIC);
    //setup camera & viewport
    mCamera = mSceneMgr->createCamera("PlayerCam");
    mCamera->setPosition(Ogre::Vector3(0,0,80));
    mCamera->lookAt(Ogre::Vector3(0,0,-300));
    mCamera->setNearClipDistance(5);
    mVp = mRenderWindow->addViewport(mCamera);
    mVp->setBackgroundColour(Ogre::ColourValue(0, 0.0, 0.0, 1));
    mCamera->setAspectRatio(Ogre::Real(mVp->getActualWidth()) / Ogre::Real(mVp->getActualHeight()));
    //resource
    Ogre::ResourceGroupManager::getSingleton().initialiseAllResourceGroups();
    //创建场景
    createScene();
    //创建灯光
    createLight();
    //定时更新窗口,不走原来的自动路线。
    startTimer(2);
}

void OgreView::paintEvent(QPaintEvent *evt)
{
    Q_UNUSED(evt);
    if(mRenderWindow == NULL)
        setupView();
    update();
}

void OgreView::timerEvent(QTimerEvent* evt)
{
    Q_UNUSED(evt);
    update();
}

void OgreView::update()
{
    //手工更新场景内容,而不是进入到连续的循环中
    if(mRenderWindow != NULL)
    {
       mRoot->renderOneFrame(); //顾名思义,渲染一帧就好了
    }
}


void OgreView::resizeEvent(QResizeEvent *evt)
{
    Q_UNUSED(evt);
    if (mRenderWindow != NULL)
    {
        mRenderWindow->windowMovedOrResized();
        mCamera->setAspectRatio(Ogre::Real(mVp->getActualWidth()) / Ogre::Real(mVp->getActualHeight()));
    }
}

void OgreView::keyPressEvent(QKeyEvent* evt)
{
    qDebug("keypressevent");
    if(mainEnt != NULL && mainNode != NULL)
    {
        switch(evt->key())
        {
            case Qt::Key_W:
            case Qt::Key_Up:
            {
                rotX = -0.1;
                mainNode->pitch(Ogre::Radian(rotX));
                break;
            }
            case Qt::Key_S:
            case Qt::Key_Down:
            {
                rotX = 0.1;
                mainNode->pitch(Ogre::Radian(rotX));
                break;
            }
            case Qt::Key_A:
            case Qt::Key_Left:
            {
                rotY = -0.1;
                mainNode->yaw(Ogre::Radian(rotY));
                break;
            }
            case Qt::Key_D:
            case Qt::Key_Right:
            {
                rotY = 0.1;
                mainNode->yaw(Ogre::Radian(rotY));
                break;
            }
        }
    }
}


void OgreView::mousePressEvent(QMouseEvent* evt)
{
    qDebug("mousePressEvent");
    if(evt->button() == Qt::LeftButton)
    {
         mouseLeftPressed = true;
    }
    if(evt->button() == Qt::RightButton)
    {
        mouseRightPressed = true;
        mousePos = Ogre::Vector2(evt->x(), evt->y());
    }
    if(evt->button() == Qt::MidButton)
    {
        mouseMiddleBtn = true;
    }
}

void OgreView::mouseReleaseEvent(QMouseEvent *evt)
{
    qDebug("mouseReleaseEvent");
    if(evt->button() == Qt::LeftButton)
    {
         mouseLeftPressed = false;
    }
    if(evt->button() == Qt::RightButton)
    {
        mouseRightPressed = false;
        mousePos = Ogre::Vector2(evt->x(), evt->y());
    }
    if(evt->button() == Qt::MidButton)
    {
        mouseMiddleBtn = false;
    }
}

void OgreView::wheelEvent(QWheelEvent* evt)
{
    mDirection.z = -evt->delta()/12;
    update();
    mDirection.z = 0;
}


把main.cpp内容改为:


#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include "ogreview.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget window;

    window.resize(800, 600);
    window.setWindowTitle("Simple example");

    OgreView* ogreWidget = new OgreView(&window);

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(ogreWidget);
    window.setLayout(layout);
    window.show();

    return app.exec();
}


然后重启QtCreator,按新建就可以看见了




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值