Boxes▲
Sélectionnez
/**
**************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the demonstration applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
** * Redistributions of source code must retain the above copyright
** notice, this list of conditions and the following disclaimer.
** * Redistributions in binary form must reproduce the above copyright
** notice, this list of conditions and the following disclaimer in
** the documentation and/or other materials provided with the
** distribution.
** * Neither the name of The Qt Company Ltd nor the names of its
** contributors may be used to endorse or promote products derived
** from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
***************************************************************************
*/
#ifndef SCENE_H
#define SCENE_H
//#include <GL/glew.h>
#include
"glextensions.h"
#include <QtWidgets>
#include <QtOpenGL>
#include
"roundedbox.h"
#include
"gltrianglemesh.h"
#include
"trackball.h"
#include
"glbuffers.h"
#include
"qtbox.h"
class
QMatrix4x4;
class
ParameterEdit : public
QWidget
{
public
:
virtual
void
emitChange() =
0
;
}
;
class
ColorEdit : public
ParameterEdit
{
Q_OBJECT
public
:
ColorEdit(QRgb initialColor, int
id);
QRgb color() const
{
return
m_color;}
void
emitChange() override
{
emit colorChanged(m_color, m_id); }
public
slots:
void
editDone();
signals
:
void
colorChanged(QRgb color, int
id);
protected
:
void
mousePressEvent(QMouseEvent *
event) override
;
void
setColor(QRgb color); // also emits colorChanged()
private
:
QGraphicsScene *
m_dialogParentScene;
QLineEdit *
m_lineEdit;
QFrame *
m_button;
QRgb m_color;
int
m_id;
}
;
class
FloatEdit : public
ParameterEdit
{
Q_OBJECT
public
:
FloatEdit(float
initialValue, int
id);
float
value() const
{
return
m_value;}
void
emitChange() override
{
emit valueChanged(m_value, m_id); }
public
slots:
void
editDone();
signals
:
void
valueChanged(float
value, int
id);
private
:
QGraphicsScene *
m_dialogParentScene;
QLineEdit *
m_lineEdit;
float
m_value;
int
m_id;
}
;
class
GraphicsWidget : public
QGraphicsProxyWidget
{
public
:
GraphicsWidget() : QGraphicsProxyWidget(0
, Qt::
Window) {}
protected
:
QVariant itemChange(GraphicsItemChange change, const
QVariant &
amp;value) override
;
void
resizeEvent(QGraphicsSceneResizeEvent *
event) override
;
void
paint(QPainter *
painter, const
QStyleOptionGraphicsItem *
option, QWidget *
widget) override
;
}
;
class
TwoSidedGraphicsWidget : public
QObject
{
Q_OBJECT
public
:
TwoSidedGraphicsWidget(QGraphicsScene *
scene);
void
setWidget(int
index, QWidget *
widget);
QWidget *
widget(int
index);
public
slots:
void
flip();
protected
slots:
void
animateFlip();
private
:
GraphicsWidget *
m_proxyWidgets[2
];
int
m_current;
int
m_angle; // angle in degrees
int
m_delta;
}
;
class
RenderOptionsDialog : public
QDialog
{
Q_OBJECT
public
:
RenderOptionsDialog();
int
addTexture(const
QString &
amp;name);
int
addShader(const
QString &
amp;name);
void
emitParameterChanged();
protected
slots:
void
setColorParameter(QRgb color, int
id);
void
setFloatParameter(float
value, int
id);
signals
:
void
dynamicCubemapToggled(int
);
void
colorParameterChanged(const
QString &
amp;, QRgb);
void
floatParameterChanged(const
QString &
amp;, float
);
void
textureChanged(int
);
void
shaderChanged(int
);
void
doubleClicked();
protected
:
void
mouseDoubleClickEvent(QMouseEvent *
event) override
;
QVector&
lt;QByteArray&
gt; m_parameterNames;
QComboBox *
m_textureCombo;
QComboBox *
m_shaderCombo;
QVector&
lt;ParameterEdit *&
gt; m_parameterEdits;
}
;
class
ItemDialog : public
QDialog
{
Q_OBJECT
public
:
enum
ItemType {
QtBoxItem,
CircleItem,
SquareItem,
}
;
ItemDialog();
public
slots:
void
triggerNewQtBox();
void
triggerNewCircleItem();
void
triggerNewSquareItem();
signals
:
void
doubleClicked();
void
newItemTriggered(ItemDialog::
ItemType type);
protected
:
void
mouseDoubleClickEvent(QMouseEvent *
event) override
;
}
;
class
Scene : public
QGraphicsScene
{
Q_OBJECT
public
:
Scene(int
width, int
height, int
maxTextureSize);
~
Scene();
void
drawBackground(QPainter *
painter, const
QRectF &
amp;rect) override
;
public
slots:
void
setShader(int
index);
void
setTexture(int
index);
void
toggleDynamicCubemap(int
state);
void
setColorParameter(const
QString &
amp;name, QRgb color);
void
setFloatParameter(const
QString &
amp;name, float
value);
void
newItem(ItemDialog::
ItemType type);
protected
:
void
renderBoxes(const
QMatrix4x4 &
amp;view, int
excludeBox =
-
2
);
void
setStates();
void
setLights();
void
defaultStates();
void
renderCubemaps();
void
mousePressEvent(QGraphicsSceneMouseEvent *
event) override
;
void
mouseReleaseEvent(QGraphicsSceneMouseEvent *
event) override
;
void
mouseMoveEvent(QGraphicsSceneMouseEvent *
event) override
;
void
wheelEvent(QGraphicsSceneWheelEvent *
event) override
;
private
:
void
initGL();
QPointF pixelPosToViewPos(const
QPointF&
amp; p);
QTime m_time;
int
m_lastTime;
int
m_mouseEventTime;
int
m_distExp;
int
m_frame;
int
m_maxTextureSize;
int
m_currentShader;
int
m_currentTexture;
bool
m_dynamicCubemap;
bool
m_updateAllCubemaps;
RenderOptionsDialog *
m_renderOptions;
ItemDialog *
m_itemDialog;
QTimer *
m_timer;
GLRoundedBox *
m_box;
TrackBall m_trackBalls[3
];
QVector&
lt;GLTexture *&
gt; m_textures;
GLTextureCube *
m_environment;
GLTexture3D *
m_noise;
GLRenderTargetCube *
m_mainCubemap;
QVector&
lt;GLRenderTargetCube *&
gt; m_cubemaps;
QVector&
lt;QGLShaderProgram *&
gt; m_programs;
QGLShader *
m_vertexShader;
QVector&
lt;QGLShader *&
gt; m_fragmentShaders;
QGLShader *
m_environmentShader;
QGLShaderProgram *
m_environmentProgram;
}
;
#endif