Difference between revisions of "Tutorial - Setup Horde with Qt4"

From Horde3D Wiki
Jump to: navigation, search
m
Line 3: Line 3:
 
|content='''Here is a small example on how to use Horde with Qt4.'''  
 
|content='''Here is a small example on how to use Horde with Qt4.'''  
 
Keep in mind that the qt license is gpl and horde is lgpl and in order to use your app commercially you need to purchase a Qt license.
 
Keep in mind that the qt license is gpl and horde is lgpl and in order to use your app commercially you need to purchase a Qt license.
 +
*Since v4.5 the Qt framework is [http://www.qtsoftware.com/about/news/first-qt-solutions-available-under-lgpl available under the LGPL license] and therefore there are no more licensing conflicts if you build on top of v4.5.
 
{{CppSourceCode|
 
{{CppSourceCode|
 
description= glwidget.h|
 
description= glwidget.h|

Revision as of 03:24, 29 March 2009

Here is a small example on how to use Horde with Qt4.

Keep in mind that the qt license is gpl and horde is lgpl and in order to use your app commercially you need to purchase a Qt license.

glwidget.h
#ifndef GLWIDGET_H_INCLUDED

#define GLWIDGET_H_INCLUDED

#include <QtOpenGL/qgl.h>
#include <QKeyEvent>
#include <Horde3D.h>
#include <Horde3DUtils.h>


class GLWidget : public QGLWidget{
    Q_OBJECT

    public:
        GLWidget(QWidget *parent = 0);
        ~GLWidget();
        QSize minimumSizeHint() const;
        QSize sizeHint() const;

    protected:
        void initializeGL();
        void paintGL();
        void resizeGL(int width,int height);
        void mousePressEvent(QMouseEvent *event);
        void mouseMoveEvent(QMouseEvent *event);
        void keyPressEvent(QKeyEvent *event);

    private:
        ResHandle logoRes;
};



#endif // GLWIDGET_H_INCLUDED

Now the cpp file. the paintGL() function is the game loop.

glwidget.cpp
#include "../include/glwidget.h"

NodeHandle model = 0, cam = 0;

GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent){
    resize(sizeHint());
}

GLWidget::~GLWidget(){
    Horde3D::release();
}

QSize GLWidget::minimumSizeHint() const{
    return QSize(50,50);
}

QSize GLWidget::sizeHint() const{
    return QSize(800,600);
}

void GLWidget::initializeGL(){
    if(!Horde3D::init()){
        Horde3DUtils::dumpMessages();
        return;
    }

    Horde3DUtils::setResourcePath( ResourceTypes::SceneGraph, "models" );
    Horde3DUtils::setResourcePath( ResourceTypes::Geometry, "models" );
    Horde3DUtils::setResourcePath( ResourceTypes::Animation, "models" );
    Horde3DUtils::setResourcePath( ResourceTypes::Material, "materials" );
    Horde3DUtils::setResourcePath( ResourceTypes::Code, "shaders" );
    Horde3DUtils::setResourcePath( ResourceTypes::Shader, "shaders" );
    Horde3DUtils::setResourcePath( ResourceTypes::Texture2D, "textures" );
    Horde3DUtils::setResourcePath( ResourceTypes::TextureCube, "textures" );
    Horde3DUtils::setResourcePath( ResourceTypes::Effect, "effects" );
    Horde3DUtils::setResourcePath( ResourceTypes::Pipeline, "pipelines" );

    ResHandle pipeRes = Horde3D::addResource( ResourceTypes::Pipeline, "deferred.pipeline.xml",0);
    ResHandle modelRes = Horde3D::addResource(ResourceTypes::SceneGraph,"charecter.scene.xml",0);
    ResHandle animRes = Horde3D::addResource(ResourceTypes::Animation,"walk.anim.xml",0);
    ResHandle fontRes = Horde3D::addResource(ResourceTypes::Material,"font.material.xml",0);

    logoRes = Horde3D::addResource(ResourceTypes::Material,"logo.material.xml",0);

    Horde3DUtils::loadResourcesFromDisk("media");

    Horde3D::setOption( EngineOptions::LoadTextures, 1 );
    Horde3D::setOption( EngineOptions::TexCompression, 0 );
    Horde3D::setOption( EngineOptions::FastAnimation, 0 );
    Horde3D::setOption( EngineOptions::AnisotropyFactor, 8 );
    Horde3D::setOption( EngineOptions::ShadowMapSize, 2048 );
    Horde3D::setOption( EngineOptions::DebugViewMode,0.0f);
    model = Horde3D::addNodes(RootNode,modelRes);

    //Horde3D::setupModelAnimStage(model,0,animRes,"",true);

    NodeHandle light = Horde3D::addLightNode(RootNode,"Light1", 0,"LIGHTING","SHADOWMAP");

    Horde3D::setNodeTransform(light,0,2,0,0,00,0,1,1,1);

    Horde3D::setNodeParamf( light, LightNodeParams::Radius, 50 );
    Horde3D::setNodeParamf( light, LightNodeParams::FOV, 90 );
    Horde3D::setNodeParami( light, LightNodeParams::ShadowMapCount, 3 );
    Horde3D::setNodeParamf( light, LightNodeParams::ShadowSplitLambda, 0.9f );
    Horde3D::setNodeParamf( light, LightNodeParams::ShadowMapBias, 0.001f );
    Horde3D::setNodeParamf( light, LightNodeParams::Col_R, 0.9f );
    Horde3D::setNodeParamf( light, LightNodeParams::Col_G, 0.7f );
    Horde3D::setNodeParamf( light, LightNodeParams::Col_B, 0.75f );

    cam = Horde3D::addCameraNode(RootNode,"Camera",pipeRes);

}

void GLWidget::paintGL(){
    float curFps = 60;
    curFps = curFps + 10.0f * ( 1/curFps);
    Horde3D::setNodeTransform(model,curFps*10,0,0,0,0,0,1,1,1);
    Horde3D::showOverlay(0.75f,0,0,0,1,0,1,0,1,0.2f,1,1,0.75f,0.2f,0,1,7,logoRes);
    Horde3D::render(cam);
    Horde3D::clearOverlays();
    Horde3DUtils::dumpMessages();
}

void GLWidget::resizeGL(int width,int height){
    Horde3D::resize(0,0,800,600);
    Horde3D::setupCameraView(cam,45.0f,(float)width /height,0.1f,1000.0f);
}

void GLWidget::mousePressEvent(QMouseEvent *event){
    if (event->buttons() & Qt::LeftButton)
    {
      std::cout<<"left mouse button pressed";
    } 

}

void GLWidget::mouseMoveEvent(QMouseEvent *event){
    QPoint pnt = event->pos();
    
    if ( pnt.x() == 0 )
            std::cout<<"pointers xvalue equals zero";
    
    if ( pnt.y() == 0 )
            std::cout<<"pointers yvalue equals zero";
}

void GLWidget::keyPressEvent(QKeyEvent *event){

    switch( event->key() )
    {
      case Qt::Key_Up:
         std::cout<<"up pressed";

	 break;
      case Qt::Key_Down:
         std::cout<<"down pressed";
                 
         break;
      default:
         GLWidget::keyPressEvent( event );
    }

}

The very simple main.cpp

main.cpp
#include <qapplication.h>
#include <include/glwidget.h>

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

    widget.show();

    return app.exec();
}

Here is the custom pro file customized for ubuntu and my box you will need to modify this to your paths.

main.pro
######################################################################
# Automatically generated by qmake (2.01a) Mon Aug 4 18:39:01 2008
######################################################################

TEMPLATE = app
TARGET = 
DEPENDPATH += . include src
INCLUDEPATH += . include /usr/include/Horde3D1.0.0/Bindings/C++
LIBS += -L/usr/include/Horde3D1.0.0/Binaries/Linux_x86 -lHorde3D -lHorde3DUtils

QT += opengl

# Input
HEADERS += include/glwidget.h
SOURCES += main.cpp src/glwidget.cpp

--Rj 05:28, 5 August 2008 (CEST)

Horde With Qt4
H3DPlaceHolder.png
This tutorial introduces the use of Horde3D with Qt4
Version: 1.0
Compatible with Horde3D: 1.0 beta
Release date: 2008-08-5
Author(s): Raynaldo Rivera