| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the examples 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 CUBE_H |
| #define CUBE_H |
| |
| #include <QtOpenGL/qgl.h> |
| #include <QtCore/qvector.h> |
| #include <QtCore/qsequentialanimationgroup.h> |
| #include <QtGui/qmatrix4x4.h> |
| #include <QtGui/qvector3d.h> |
| #include <QtGui/qvector2d.h> |
| |
| QT_BEGIN_NAMESPACE |
| class QPropertyAnimation; |
| QT_END_NAMESPACE |
| |
| class Geometry |
| { |
| public: |
| void loadArrays() const; |
| void addQuad(const QVector3D &a, const QVector3D &b, |
| const QVector3D &c, const QVector3D &d, |
| const QVector<QVector2D> &tex); |
| void setColors(int start, GLfloat colors[4][4]); |
| const GLushort *indices() const { return faces.constData(); } |
| int count() const { return faces.count(); } |
| private: |
| QVector<GLushort> faces; |
| QVector<QVector3D> vertices; |
| QVector<QVector3D> normals; |
| QVector<QVector2D> texCoords; |
| QVector<QVector4D> colors; |
| int append(const QVector3D &a, const QVector3D &n, const QVector2D &t); |
| void addTri(const QVector3D &a, const QVector3D &b, const QVector3D &c, const QVector3D &n); |
| friend class Tile; |
| }; |
| |
| class Tile |
| { |
| public: |
| void draw() const; |
| void setColors(GLfloat[4][4]); |
| protected: |
| Tile(const QVector3D &loc = QVector3D()); |
| QVector3D location; |
| QQuaternion orientation; |
| private: |
| int start; |
| int count; |
| bool useFlatColor; |
| GLfloat faceColor[4]; |
| Geometry *geom; |
| friend class TileBuilder; |
| }; |
| |
| class TileBuilder |
| { |
| public: |
| enum { bl, br, tr, tl }; |
| explicit TileBuilder(Geometry *, qreal depth = 0.0f, qreal size = 1.0f); |
| Tile *newTile(const QVector3D &loc = QVector3D()) const; |
| void setColor(QColor c) { color = c; } |
| protected: |
| void initialize(Tile *) const; |
| QVector<QVector3D> verts; |
| QVector<QVector2D> tex; |
| int start; |
| int count; |
| Geometry *geom; |
| QColor color; |
| }; |
| |
| class Cube : public QObject, public Tile |
| { |
| Q_OBJECT |
| Q_PROPERTY(qreal range READ range WRITE setRange) |
| Q_PROPERTY(qreal altitude READ altitude WRITE setAltitude) |
| Q_PROPERTY(qreal rotation READ rotation WRITE setRotation) |
| public: |
| Cube(const QVector3D &loc = QVector3D()); |
| ~Cube(); |
| qreal range() { return location.x(); } |
| void setRange(qreal r); |
| qreal altitude() { return location.y(); } |
| void setAltitude(qreal a); |
| qreal rotation() { return rot; } |
| void setRotation(qreal r); |
| void removeBounce(); |
| void startAnimation(); |
| void setAnimationPaused(bool paused); |
| signals: |
| void changed(); |
| private: |
| qreal rot; |
| QPropertyAnimation *r; |
| QPropertyAnimation *rtn; |
| QSequentialAnimationGroup *animGroup; |
| qreal startx; |
| friend class CubeBuilder; |
| }; |
| |
| class CubeBuilder : public TileBuilder |
| { |
| public: |
| explicit CubeBuilder(Geometry *, qreal depth = 0.0f, qreal size = 1.0f); |
| Cube *newCube(const QVector3D &loc = QVector3D()) const; |
| private: |
| mutable int ix; |
| }; |
| |
| #endif // CUBE_H |