main.cpp Example File | Runtime 2.1

Qt 3D Studio | Runtime | Qt 3D Studio Runtime: Dynamic Scene Manipulation C++ Example | main.cpp Example File

Qt 3D Studio Runtime 2.1 Manual

# main.cpp Example File

scenemanip/main.cpp

      /****************************************************************************
      **
      ** Copyright (C) 2018 The Qt Company Ltd.
      ** Contact: https://www.qt.io/licensing/
      **
      ** This file is part of Qt 3D Studio.
      **
      ** $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 <QGuiApplication>
      #include <QQmlContext>
      #include <QQuickView>
      #include <QTime>
      #include <QTimer>
      #include <Q3DSPresentation>

      #include <private/q3dsengine_p.h>
      #include <private/q3dsuippresentation_p.h>

      class SceneManipulator : public QObject
      {
          Q_OBJECT

      public slots:
          void doIt(Q3DSPresentation *pres);

      private:
          QTimer m_timer;
          int m_dynCount = 0;
      };

      void SceneManipulator::doIt(Q3DSPresentation *pres)
      {
          Q3DSEngine *engine = pres->engine();
          Q3DSUipPresentation *presentation = engine->presentation();
          Q3DSSlide *slide1 = static_cast<Q3DSSlide *>(presentation->masterSlide()->firstChild());

          Q3DSModelNode *prim = presentation->newObject<Q3DSModelNode>(QByteArrayLiteral("dynmodel") + QByteArray::number(m_dynCount));
          switch (qrand() % 4) {
          case 0:
              prim->setMesh(QLatin1String("#Cube"));
              break;
          case 1:
              prim->setMesh(QLatin1String("#Sphere"));
              break;
          case 2:
              prim->setMesh(QLatin1String("#Cylinder"));
              break;
          case 3:
              prim->setMesh(QLatin1String("#Cone"));
              break;
          }

          Q3DSDefaultMaterial *primMat = presentation->newObject<Q3DSDefaultMaterial>(QByteArrayLiteral("dynmat") + QByteArray::number(m_dynCount));
          prim->appendChildNode(primMat);

          prim->setPosition(QVector3D((qrand() % 600) - 300, (qrand() % 600) - 300, 0));
          prim->setRotation(QVector3D(30, 45, 0));
          const float scale = ((qrand() % 100) + 1) / 100.0f;
          prim->setScale(QVector3D(scale, scale, scale));

          slide1->addObject(primMat);
          slide1->addObject(prim);

          ++m_dynCount;

          // go live
          presentation->objectByName<Q3DSLayerNode>(QLatin1String("Layer"))->appendChildNode(prim);

          // Animations cannot be managed dynamically for now. However, nothing
          // prevents us from changing properties as we see fit:
          m_timer.setInterval(30);
          connect(&m_timer, &QTimer::timeout, this, [prim] {
              QVector3D v = prim->position();
              v.setX(v.x() - 1);
              QVector3D r = prim->rotation();
              r.setY(r.y() + 1);
              prim->notifyPropertyChanges({
                                              prim->setPosition(v),
                                              prim->setRotation(r)
                                          });
          });
          m_timer.start();
      }

      int main(int argc, char *argv[])
      {
          QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
          qputenv("QSG_INFO", "1");
          QGuiApplication app(argc, argv);

          qsrand(QTime::currentTime().msec());

          // Use the ideal format (i.e. OpenGL version and profile) recommended by
          // the Qt 3D Studio runtime. Without this the format set on the QQuickView
          // would be used instead.
          QSurfaceFormat::setDefaultFormat(Q3DS::surfaceFormat());

          QQuickView viewer;

          SceneManipulator manip;
          viewer.rootContext()->setContextProperty("sceneManipulator", &manip);

          viewer.setSource(QUrl("qrc:/main.qml"));

          viewer.setTitle(QStringLiteral("Qt 3D Studio Example"));
          viewer.setResizeMode(QQuickView::SizeRootObjectToView);
          viewer.resize(1280, 720);
          viewer.show();

          return app.exec();
      }

      #include "main.moc"