#include "cubeview.h"
#include "qglcube.h"
#include "qglteapot.h"
#include <QtCore/qpropertyanimation.h>
#include <QtGui/QOpenGLFramebufferObject>
CubeView::CubeView(QWindow *parent)
: QGLView(parent)
, fbo(0)
, tangle(0.0f)
, cangle(0.0f)
, oangle(0.0f)
{
QGLBuilder builder;
builder.newSection(QGL::Faceted);
builder << QGLCube(1.5f);
cube = builder.currentNode();
cube->setObjectName(QLatin1String("Cube"));
builder.newSection();
builder << QGLTeapot();
teapot = builder.currentNode();
teapot->setObjectName(QLatin1String("Teapot"));
scene = builder.finalizedSceneNode();
scene->setParent(this);
QPropertyAnimation *animation;
animation = new QPropertyAnimation(this, "teapotAngle", this);
animation->setStartValue(0.0f);
animation->setEndValue(360.0f);
animation->setDuration(1000);
animation->setLoopCount(-1);
animation->start();
animation = new QPropertyAnimation(this, "cubeAngle", this);
animation->setStartValue(0.0f);
animation->setEndValue(360.0f);
animation->setDuration(5000);
animation->setLoopCount(-1);
animation->start();
animation = new QPropertyAnimation(this, "orbitAngle", this);
animation->setStartValue(0.0f);
animation->setEndValue(360.0f);
animation->setDuration(5000);
animation->setLoopCount(-1);
animation->start();
innerCamera = new QGLCamera(this);
}
CubeView::~CubeView()
{
qtlogo.cleanupResources();
delete fbo;
}
void CubeView::initializeGL(QGLPainter *)
{
fbo = new QOpenGLFramebufferObject(512, 512, QOpenGLFramebufferObject::Depth);
fboSurface.setFramebufferObject(fbo);
QImage textureImage(QLatin1String(":/qtlogo.png"));
qtlogo.setImage(textureImage);
glEnable(GL_BLEND);
}
void CubeView::paintGL(QGLPainter *painter)
{
painter->modelViewMatrix().push();
painter->projectionMatrix().push();
painter->pushSurface(&fboSurface);
painter->setCamera(innerCamera);
painter->modelViewMatrix().rotate(tangle, 0.0f, 1.0f, 0.0f);
painter->setFaceColor(QGL::AllFaces, QColor(170, 202, 0));
painter->setStandardEffect(QGL::LitMaterial);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
teapot->draw(painter);
painter->popSurface();
painter->projectionMatrix().pop();
painter->modelViewMatrix().pop();
painter->modelViewMatrix().rotate(oangle, 0.0f, 1.0f, 0.0f);
QMatrix4x4 m = painter->modelViewMatrix();
QVector3D cube1pos(-1.5f, 0.0f, 0.0f);
QVector3D cube2pos(1.5f, 0.0f, 0.0f);
if (m.map(cube1pos).z() < m.map(cube2pos).z()) {
drawCube1(painter, cube1pos);
drawCube2(painter, cube2pos);
} else {
drawCube2(painter, cube2pos);
drawCube1(painter, cube1pos);
}
}
void CubeView::drawCube1(QGLPainter *painter, const QVector3D &posn)
{
painter->modelViewMatrix().push();
qtlogo.bind();
painter->setFaceColor(QGL::AllFaces, QColor(202, 100, 0, 150));
painter->setStandardEffect(QGL::LitDecalTexture2D);
painter->modelViewMatrix().translate(posn);
painter->modelViewMatrix().rotate(cangle, 1.0f, -1.0f, 1.0f);
glCullFace(GL_FRONT);
glEnable(GL_CULL_FACE);
cube->draw(painter);
glCullFace(GL_BACK);
cube->draw(painter);
glDisable(GL_CULL_FACE);
painter->modelViewMatrix().pop();
}
void CubeView::drawCube2(QGLPainter *painter, const QVector3D &posn)
{
painter->modelViewMatrix().push();
painter->setFaceColor(QGL::AllFaces, QColor(0, 160, 202, 125));
painter->setStandardEffect(QGL::LitDecalTexture2D);
glBindTexture(GL_TEXTURE_2D, fbo->texture());
glEnable(GL_TEXTURE_2D);
painter->modelViewMatrix().translate(posn);
painter->modelViewMatrix().rotate(cangle, 1.0f, 1.0f, 1.0f);
glCullFace(GL_FRONT);
glEnable(GL_CULL_FACE);
cube->draw(painter);
glCullFace(GL_BACK);
cube->draw(painter);
glDisable(GL_CULL_FACE);
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
painter->modelViewMatrix().pop();
}