1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include "entity.h"
#include <QGuiApplication>
#include <QPropertyAnimation>
#include <QUrl>
#include <QTimer>
#include <Qt3DCore/QEntity>
#include <Qt3DRender/QCamera>
#include <Qt3DCore/QTransform>
#include <Qt3DCore/qaspectengine.h>
#include <Qt3DInput/QInputAspect>
#include <Qt3DRender/QParameter>
#include <Qt3DExtras/QCylinderMesh>
#include <Qt3DRender/QRenderAspect>
#include <Qt3DRender/QGeometryRenderer>
#include <Qt3DRender/QCameraSelector>
#include <Qt3DExtras/QPhongMaterial>
#include <Qt3DExtras/QForwardRenderer>
#include <qmath.h>
#include <Qt3DExtras/qt3dwindow.h>
#include <Qt3DExtras/qfirstpersoncameracontroller.h>
#include <Qt3DRender/QRenderSurfaceSelector>
#include <Qt3DRender/QCameraSelector>
#include <Qt3DRender/QViewport>
#include <Qt3DRender/QNoDraw>
#include <Qt3DRender/QDebugOverlay>
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<Qt3DCore::QNode *>(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();
}
|