// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB). // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #include "entity.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace Qt3DCore; using namespace Qt3DRender; int main(int ac, char **av) { QGuiApplication app(ac, av); Qt3DExtras::Qt3DWindow view; // FrameGraph { QRenderSurfaceSelector *surfaceSelector = new QRenderSurfaceSelector(); QCameraSelector *cameraSelector = new Qt3DRender::QCameraSelector(surfaceSelector); cameraSelector->setCamera(view.camera()); QClearBuffers *clearBuffers = new Qt3DRender::QClearBuffers(cameraSelector); clearBuffers->setClearColor(QColor(Qt::gray)); clearBuffers->setBuffers(QClearBuffers::ColorDepthBuffer); new QNoDraw(clearBuffers); const QRectF viewports[] = { {0.0f, 0.0f, 0.25f, 0.25f}, {0.25f, 0.0f, 0.25f, 0.25f}, {0.5f, 0.0f, 0.25f, 0.25f}, {0.75f, 0.0f, 0.25f, 0.25f}, {0.0f, 0.25f, 0.25f, 0.25f}, {0.25f, 0.25f, 0.25f, 0.25f}, {0.5f, 0.25f, 0.25f, 0.25f}, {0.75f, 0.25f, 0.25f, 0.25f}, {0.0f, 0.5f, 0.25f, 0.25f}, {0.25f, 0.5f, 0.25f, 0.25f}, {0.5f, 0.5f, 0.25f, 0.25f}, {0.75f, 0.5f, 0.25f, 0.25f}, {0.0f, 0.75f, 0.25f, 0.25f}, {0.25f, 0.75f, 0.25f, 0.25f}, {0.5f, 0.75f, 0.25f, 0.25f}, {0.75f, 0.75f, 0.25f, 0.25f}, }; for (const QRectF &vp : viewports) { QViewport *viewport = new Qt3DRender::QViewport(cameraSelector); viewport->setNormalizedRect(vp); } new QDebugOverlay(qobject_cast(cameraSelector->children().last())); view.setActiveFrameGraph(surfaceSelector); } QEntity *root = new QEntity(); // Mesh auto *mesh = new Qt3DExtras::QCylinderMesh(root); mesh->setRings(50.0f); mesh->setSlices(30.0f); mesh->setRadius(2.5f); mesh->setLength(5.0f); // Material auto phongMaterial = new Qt3DExtras::QPhongMaterial(root); auto effect = phongMaterial->effect(); // Camera QCamera *cameraEntity = view.camera(); cameraEntity->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f); cameraEntity->setPosition(QVector3D(0, 250.0f, 50.0f)); cameraEntity->setUpVector(QVector3D(0, 1, 0)); cameraEntity->setViewCenter(QVector3D(0, 0, 0)); // For camera controls Qt3DExtras::QFirstPersonCameraController *camController = new Qt3DExtras::QFirstPersonCameraController(root); camController->setCamera(cameraEntity); const double radius = 100.0; const int max = 1000; const double det = 1.0 / max; // Scene for (int i = 0; i < max; i++) { Entity *e = new Entity(effect, root); e->addComponent(mesh); const double angle = M_PI * 2.0 * double(i) * det * 10.; e->setDiffuseColor(QColor(int(qFabs(qCos(angle)) * 255.0), 204, 75)); e->setPosition(QVector3D(float(radius * qCos(angle)), float(-200.0 * i * det), float(radius * qSin(angle)))); e->setTheta(30.0f * i); e->setPhi(45.0f * i); QPropertyAnimation *animX = new QPropertyAnimation(e, QByteArrayLiteral("theta")); animX->setDuration(2400 * (i + 1)); animX->setStartValue(QVariant::fromValue(i * 30.0f)); animX->setEndValue(QVariant::fromValue((i + 1) * 390.0f)); animX->setLoopCount(-1); animX->start(); QPropertyAnimation *animZ = new QPropertyAnimation(e, QByteArrayLiteral("phi")); animZ->setDuration(2400 * (i + 1)); animZ->setStartValue(QVariant::fromValue(i * 20.0f)); animZ->setEndValue(QVariant::fromValue((i + 1) * 380.0f)); animZ->setLoopCount(-1); animZ->start(); } view.setRootEntity(root); view.show(); if (app.arguments().contains(("--bench"))) QTimer::singleShot(25 * 1000, &app, &QCoreApplication::quit); return app.exec(); }