summaryrefslogtreecommitdiffstats
path: root/examples/opengl/legacy/shared/qtlogo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/opengl/legacy/shared/qtlogo.cpp')
-rw-r--r--examples/opengl/legacy/shared/qtlogo.cpp398
1 files changed, 0 insertions, 398 deletions
diff --git a/examples/opengl/legacy/shared/qtlogo.cpp b/examples/opengl/legacy/shared/qtlogo.cpp
deleted file mode 100644
index 9ad274ce09..0000000000
--- a/examples/opengl/legacy/shared/qtlogo.cpp
+++ /dev/null
@@ -1,398 +0,0 @@
-/****************************************************************************
-**
-** 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$
-**
-****************************************************************************/
-
-#include "qtlogo.h"
-
-#include <QGLWidget>
-#include <QMatrix4x4>
-#include <QVector3D>
-#include <QOpenGLFunctions_1_1>
-
-#include <qmath.h>
-
-static const qreal tee_height = 0.311126;
-static const qreal cross_width = 0.25;
-static const qreal bar_thickness = 0.113137;
-static const qreal logo_depth = 0.10;
-
-//! [0]
-struct Geometry
-{
- QVector<GLushort> faces;
- QVector<QVector3D> vertices;
- QVector<QVector3D> normals;
- void appendSmooth(const QVector3D &a, const QVector3D &n, int from);
- void appendFaceted(const QVector3D &a, const QVector3D &n);
- void finalize();
- void loadArrays(QOpenGLFunctions_1_1 *functions) const;
-};
-//! [0]
-
-//! [1]
-class Patch
-{
-public:
- enum Smoothing { Faceted, Smooth };
- Patch(Geometry *);
- void setSmoothing(Smoothing s) { sm = s; }
- void translate(const QVector3D &t);
- void rotate(qreal deg, QVector3D axis);
- void draw(QOpenGLFunctions_1_1 *functions) const;
- void addTri(const QVector3D &a, const QVector3D &b, const QVector3D &c, const QVector3D &n);
- void addQuad(const QVector3D &a, const QVector3D &b, const QVector3D &c, const QVector3D &d);
-
- GLushort start;
- GLushort count;
- GLushort initv;
-
- GLfloat faceColor[4];
- QMatrix4x4 mat;
- Smoothing sm;
- Geometry *geom;
-};
-//! [1]
-
-static inline void qSetColor(float colorVec[], QColor c)
-{
- colorVec[0] = c.redF();
- colorVec[1] = c.greenF();
- colorVec[2] = c.blueF();
- colorVec[3] = c.alphaF();
-}
-
-void Geometry::loadArrays(QOpenGLFunctions_1_1 *functions) const
-{
- functions->glVertexPointer(3, GL_FLOAT, 0, vertices.constData());
- functions->glNormalPointer(GL_FLOAT, 0, normals.constData());
-}
-
-void Geometry::finalize()
-{
- // TODO: add vertex buffer uploading here
-
- // Finish smoothing normals by ensuring accumulated normals are returned
- // to length 1.0.
- for (int i = 0; i < normals.count(); ++i)
- normals[i].normalize();
-}
-
-void Geometry::appendSmooth(const QVector3D &a, const QVector3D &n, int from)
-{
- // Smooth normals are achieved by averaging the normals for faces meeting
- // at a point. First find the point in geometry already generated
- // (working backwards, since most often the points shared are between faces
- // recently added).
- int v = vertices.count() - 1;
- for ( ; v >= from; --v)
- if (qFuzzyCompare(vertices[v], a))
- break;
-
- if (v < from) {
- // The vertex was not found so add it as a new one, and initialize
- // its corresponding normal
- v = vertices.count();
- vertices.append(a);
- normals.append(n);
- } else {
- // Vert found, accumulate normals into corresponding normal slot.
- // Must call finalize once finished accumulating normals
- normals[v] += n;
- }
-
- // In both cases (found or not) reference the vertex via its index
- faces.append(v);
-}
-
-void Geometry::appendFaceted(const QVector3D &a, const QVector3D &n)
-{
- // Faceted normals are achieved by duplicating the vertex for every
- // normal, so that faces meeting at a vertex get a sharp edge.
- int v = vertices.count();
- vertices.append(a);
- normals.append(n);
- faces.append(v);
-}
-
-Patch::Patch(Geometry *g)
- : start(g->faces.count())
- , count(0)
- , initv(g->vertices.count())
- , sm(Patch::Smooth)
- , geom(g)
-{
- qSetColor(faceColor, QColor(Qt::darkGray));
-}
-
-void Patch::rotate(qreal deg, QVector3D axis)
-{
- mat.rotate(deg, axis);
-}
-
-void Patch::translate(const QVector3D &t)
-{
- mat.translate(t);
-}
-
-//! [2]
-void Patch::draw(QOpenGLFunctions_1_1 *functions) const
-{
- functions->glPushMatrix();
- functions->glMultMatrixf(mat.constData());
- functions->glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, faceColor);
-
- const GLushort *indices = geom->faces.constData();
- functions->glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_SHORT, indices + start);
- functions->glPopMatrix();
-}
-//! [2]
-
-void Patch::addTri(const QVector3D &a, const QVector3D &b, const QVector3D &c, const QVector3D &n)
-{
- QVector3D norm = n.isNull() ? QVector3D::normal(a, b, c) : n;
-
- if (sm == Smooth) {
- geom->appendSmooth(a, norm, initv);
- geom->appendSmooth(b, norm, initv);
- geom->appendSmooth(c, norm, initv);
- } else {
- geom->appendFaceted(a, norm);
- geom->appendFaceted(b, norm);
- geom->appendFaceted(c, norm);
- }
-
- count += 3;
-}
-
-void Patch::addQuad(const QVector3D &a, const QVector3D &b, const QVector3D &c, const QVector3D &d)
-{
- QVector3D norm = QVector3D::normal(a, b, c);
-
- if (sm == Smooth) {
- addTri(a, b, c, norm);
- addTri(a, c, d, norm);
- } else {
- // If faceted share the two common vertices
- addTri(a, b, c, norm);
- int k = geom->vertices.count();
- geom->appendSmooth(a, norm, k);
- geom->appendSmooth(c, norm, k);
- geom->appendFaceted(d, norm);
- count += 3;
- }
-}
-
-static inline QVector<QVector3D> extrude(const QVector<QVector3D> &vertices, qreal depth)
-{
- QVector<QVector3D> extr = vertices;
- for (int v = 0; v < extr.count(); ++v)
- extr[v].setZ(extr[v].z() - depth);
- return extr;
-}
-
-class Rectoid
-{
-public:
- void translate(const QVector3D &t)
- {
- for (int i = 0; i < parts.count(); ++i)
- parts[i]->translate(t);
- }
-
- void rotate(qreal deg, QVector3D axis)
- {
- for (int i = 0; i < parts.count(); ++i)
- parts[i]->rotate(deg, axis);
- }
-
- // No special Rectoid destructor - the parts are fetched out of this member
- // variable, and destroyed by the new owner
- QList<Patch *> parts;
-};
-
-class RectPrism : public Rectoid
-{
-public:
- RectPrism(Geometry *g, qreal width, qreal height, qreal depth);
-};
-
-RectPrism::RectPrism(Geometry *g, qreal width, qreal height, qreal depth)
-{
- enum { bl, br, tr, tl };
- Patch *fb = new Patch(g);
- fb->setSmoothing(Patch::Faceted);
-
- // front face
- QVector<QVector3D> r(4);
- r[br].setX(width);
- r[tr].setX(width);
- r[tr].setY(height);
- r[tl].setY(height);
- QVector3D adjToCenter(-width / 2.0, -height / 2.0, depth / 2.0);
- for (int i = 0; i < 4; ++i)
- r[i] += adjToCenter;
- fb->addQuad(r[bl], r[br], r[tr], r[tl]);
-
- // back face
- QVector<QVector3D> s = extrude(r, depth);
- fb->addQuad(s[tl], s[tr], s[br], s[bl]);
-
- // side faces
- Patch *sides = new Patch(g);
- sides->setSmoothing(Patch::Faceted);
- sides->addQuad(s[bl], s[br], r[br], r[bl]);
- sides->addQuad(s[br], s[tr], r[tr], r[br]);
- sides->addQuad(s[tr], s[tl], r[tl], r[tr]);
- sides->addQuad(s[tl], s[bl], r[bl], r[tl]);
-
- parts << fb << sides;
-}
-
-class RectTorus : public Rectoid
-{
-public:
- RectTorus(Geometry *g, qreal iRad, qreal oRad, qreal depth, int numSectors);
-};
-
-RectTorus::RectTorus(Geometry *g, qreal iRad, qreal oRad, qreal depth, int k)
-{
- QVector<QVector3D> inside;
- QVector<QVector3D> outside;
- for (int i = 0; i < k; ++i) {
- qreal angle = (i * 2 * M_PI) / k;
- inside << QVector3D(iRad * qSin(angle), iRad * qCos(angle), depth / 2.0);
- outside << QVector3D(oRad * qSin(angle), oRad * qCos(angle), depth / 2.0);
- }
- inside << QVector3D(0.0, iRad, 0.0);
- outside << QVector3D(0.0, oRad, 0.0);
- QVector<QVector3D> in_back = extrude(inside, depth);
- QVector<QVector3D> out_back = extrude(outside, depth);
-
- // Create front, back and sides as separate patches so that smooth normals
- // are generated for the curving sides, but a faceted edge is created between
- // sides and front/back
- Patch *front = new Patch(g);
- for (int i = 0; i < k; ++i)
- front->addQuad(outside[i], inside[i],
- inside[(i + 1) % k], outside[(i + 1) % k]);
- Patch *back = new Patch(g);
- for (int i = 0; i < k; ++i)
- back->addQuad(in_back[i], out_back[i],
- out_back[(i + 1) % k], in_back[(i + 1) % k]);
- Patch *is = new Patch(g);
- for (int i = 0; i < k; ++i)
- is->addQuad(in_back[i], in_back[(i + 1) % k],
- inside[(i + 1) % k], inside[i]);
- Patch *os = new Patch(g);
- for (int i = 0; i < k; ++i)
- os->addQuad(out_back[(i + 1) % k], out_back[i],
- outside[i], outside[(i + 1) % k]);
- parts << front << back << is << os;
-}
-
-QtLogo::QtLogo(QObject *parent, int divisions, qreal scale)
- : QObject(parent)
- , geom(new Geometry())
-{
- buildGeometry(divisions, scale);
-}
-
-QtLogo::~QtLogo()
-{
- qDeleteAll(parts);
- delete geom;
-}
-
-void QtLogo::setColor(QColor c)
-{
- for (int i = 0; i < parts.count(); ++i)
- qSetColor(parts[i]->faceColor, c);
-}
-
-//! [3]
-void QtLogo::buildGeometry(int divisions, qreal scale)
-{
- qreal cw = cross_width * scale;
- qreal bt = bar_thickness * scale;
- qreal ld = logo_depth * scale;
- qreal th = tee_height *scale;
-
- RectPrism cross(geom, cw, bt, ld);
- RectPrism stem(geom, bt, th, ld);
-
- QVector3D z(0.0, 0.0, 1.0);
- cross.rotate(45.0, z);
- stem.rotate(45.0, z);
-
- qreal stem_downshift = (th + bt) / 2.0;
- stem.translate(QVector3D(0.0, -stem_downshift, 0.0));
-
- RectTorus body(geom, 0.20, 0.30, 0.1, divisions);
-
- parts << stem.parts << cross.parts << body.parts;
-
- geom->finalize();
-}
-//! [3]
-
-//! [4]
-void QtLogo::draw(QOpenGLFunctions_1_1 *functions) const
-{
- geom->loadArrays(functions);
-
- functions->glEnableClientState(GL_VERTEX_ARRAY);
- functions->glEnableClientState(GL_NORMAL_ARRAY);
-
- for (int i = 0; i < parts.count(); ++i)
- parts[i]->draw(functions);
-
- functions->glDisableClientState(GL_VERTEX_ARRAY);
- functions->glDisableClientState(GL_NORMAL_ARRAY);
-}
-//! [4]