Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquick3dreflectionprobe.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
5#include "qquick3dnode_p_p.h"
6
7#include <QtQuick3DRuntimeRender/private/qssgrenderreflectionprobe_p.h>
8#include <QtQuick3DUtils/private/qssgutils_p.h>
9
11
26 : QQuick3DNode(*(new QQuick3DNodePrivate(QQuick3DNodePrivate::Type::ReflectionProbe)), parent)
27{
28 QObject::connect(this, &QQuick3DReflectionProbe::scenePositionChanged, this, &QQuick3DReflectionProbe::updateDebugView);
29}
30
31void QQuick3DReflectionProbe::itemChange(QQuick3DObject::ItemChange change,
32 const QQuick3DObject::ItemChangeData &value)
33{
34 if (change == QQuick3DObject::ItemSceneChange)
35 updateSceneManager(value.sceneManager);
36}
37
61
68{
69 return m_clearColor;
70}
71
90
119
131{
132 return m_parallaxCorrection;
133}
134
147{
148 return m_boxSize;
149}
150
158{
159 return m_debugView;
160}
161
176{
177 return m_boxOffset;
178}
179
190{
191 return m_texture;
192}
193
200void QQuick3DReflectionProbe::scheduleUpdate()
201{
203 update();
204}
205
207{
208 if (m_quality == reflectionQuality)
209 return;
210
211 m_quality = reflectionQuality;
214 update();
215}
216
218{
219 if (m_clearColor == clearColor)
220 return;
221 m_clearColor = clearColor;
224 update();
225}
226
228{
229 if (m_refreshMode == newRefreshMode)
230 return;
231 m_refreshMode = newRefreshMode;
234 update();
235}
236
238{
239 if (m_timeSlicing == newTimeSlicing)
240 return;
241 m_timeSlicing = newTimeSlicing;
244 update();
245}
246
248{
249 if (m_parallaxCorrection == parallaxCorrection)
250 return;
251 m_parallaxCorrection = parallaxCorrection;
254 update();
255}
256
258{
259 if (m_boxSize == boxSize)
260 return;
261 m_boxSize = boxSize;
264 createDebugView();
265 updateDebugView();
266 update();
267}
268
269void QQuick3DReflectionProbe::setDebugView(bool debugView)
270{
271 if (m_debugView == debugView)
272 return;
273 m_debugView = debugView;
274 emit debugViewChanged();
275 createDebugView();
276 updateDebugView();
277}
278
279void QQuick3DReflectionProbe::setBoxOffset(const QVector3D &boxOffset)
280{
281 if (m_boxOffset == boxOffset)
282 return;
283 m_boxOffset = boxOffset;
285 emit boxOffsetChanged();
286 createDebugView();
287 updateDebugView();
288 update();
289}
290
291void QQuick3DReflectionProbe::setTexture(QQuick3DCubeMapTexture *newTexture)
292{
293 if (m_texture == newTexture)
294 return;
295 QQuick3DObjectPrivate::attachWatcher(this, &QQuick3DReflectionProbe::setTexture, newTexture, m_texture);
296 m_texture = newTexture;
298 emit textureChanged();
299 update();
300}
301
303{
304 if (!node) {
305 markAllDirty();
306 node = new QSSGRenderReflectionProbe();
307 }
308
310
311 QSSGRenderReflectionProbe *probe = static_cast<QSSGRenderReflectionProbe *>(node);
312
315 probe->reflectionMapRes = mapToReflectionResolution(m_quality);
316 }
317
320 probe->clearColor = m_clearColor;
321 }
322
325 switch (m_refreshMode) {
328 break;
331 break;
332 }
333 probe->hasScheduledUpdate = true;
334 }
335
338 switch (m_timeSlicing) {
341 break;
344 break;
347 break;
348 }
349 }
350
353 probe->parallaxCorrection = m_parallaxCorrection;
354 }
355
356 if (m_dirtyFlags.testFlag(DirtyFlag::BoxDirty)) {
357 m_dirtyFlags.setFlag(DirtyFlag::BoxDirty, false);
358 probe->boxSize = m_boxSize;
359 probe->boxOffset = m_boxOffset;
360 }
361
364 if (m_texture)
365 probe->texture = m_texture->getRenderImage();
366 else
367 probe->texture = nullptr;
368 }
369
370 return node;
371}
372
383
384void QQuick3DReflectionProbe::findSceneView()
385{
386 // If we have not specified a scene view we find the first available one
387 if (m_sceneView != nullptr)
388 return;
389
390 QObject *parent = this;
391 while (parent->parent() != nullptr) {
392 parent = parent->parent();
393 }
394
395 // Breath-first search through children
396 QList<QObject *> queue;
397 queue.append(parent);
398 while (!queue.empty()) {
399 auto node = queue.takeFirst();
400 if (auto converted = qobject_cast<QQuick3DViewport *>(node); converted != nullptr) {
401 m_sceneView = converted;
402 break;
403 }
404 queue.append(node->children());
405 }
406}
407
408void QQuick3DReflectionProbe::createDebugView()
409{
410
411 if (m_debugView) {
412 findSceneView();
413 if (!m_sceneView) {
414 qWarning() << "ReflectionProbe: Can not create debug view. A root View3D could not be found.";
415 return;
416 }
417
418 if (!m_debugViewGeometry)
419 m_debugViewGeometry = new QQuick3DGeometry(this);
420
421 m_debugViewGeometry->clear();
424 m_debugViewGeometry->setStride(12);
426
427 QVector<QVector3D> m_vertices;
428 //Lines
429 m_vertices.append(QVector3D(-0.5, -0.5, 0.5));
430 m_vertices.append(QVector3D(0.5, -0.5, 0.5));
431
432 m_vertices.append(QVector3D(0.5, -0.5, 0.5));
433 m_vertices.append(QVector3D(0.5, 0.5, 0.5));
434
435 m_vertices.append(QVector3D(0.5, 0.5, 0.5));
436 m_vertices.append(QVector3D(-0.5, 0.5, 0.5));
437
438 m_vertices.append(QVector3D(-0.5, 0.5, 0.5));
439 m_vertices.append(QVector3D(-0.5, -0.5, 0.5));
440
441 m_vertices.append(QVector3D(-0.5, -0.5, -0.5));
442 m_vertices.append(QVector3D(0.5, -0.5, -0.5));
443
444 m_vertices.append(QVector3D(0.5, -0.5, -0.5));
445 m_vertices.append(QVector3D(0.5, 0.5, -0.5));
446
447 m_vertices.append(QVector3D(0.5, 0.5, -0.5));
448 m_vertices.append(QVector3D(-0.5, 0.5, -0.5));
449
450 m_vertices.append(QVector3D(-0.5, 0.5, -0.5));
451 m_vertices.append(QVector3D(-0.5, -0.5, -0.5));
452
453 m_vertices.append(QVector3D(-0.5, 0.5, -0.5));
454 m_vertices.append(QVector3D(-0.5, 0.5, 0.5));
455
456 m_vertices.append(QVector3D(0.5, 0.5, -0.5));
457 m_vertices.append(QVector3D(0.5, 0.5, 0.5));
458
459 m_vertices.append(QVector3D(-0.5, -0.5, -0.5));
460 m_vertices.append(QVector3D(-0.5, -0.5, 0.5));
461
462 m_vertices.append(QVector3D(0.5, -0.5, -0.5));
463 m_vertices.append(QVector3D(0.5, -0.5, 0.5));
464
466 vertexData.resize(m_vertices.size() * 3 * sizeof(float));
467 float *data = reinterpret_cast<float *>(vertexData.data());
468 for (int i = 0; i < m_vertices.size(); i++) {
469 data[0] = m_vertices[i].x();
470 data[1] = m_vertices[i].y();
471 data[2] = m_vertices[i].z();
472 data += 3;
473 }
474
475 m_debugViewGeometry->setVertexData(vertexData);
476 m_debugViewGeometry->update();
477
478 if (!m_debugViewModel) {
479 m_debugViewModel = new QQuick3DModel();
480 m_debugViewModel->setParentItem(m_sceneView->scene());
481 m_debugViewModel->setParent(this);
482 m_debugViewModel->setCastsShadows(false);
483 m_debugViewModel->setCastsReflections(false);
484 m_debugViewModel->setGeometry(m_debugViewGeometry);
485 }
486
487 if (!m_debugViewMaterial) {
488 m_debugViewMaterial = new QQuick3DDefaultMaterial();
489 m_debugViewMaterial->setParentItem(m_debugViewModel);
490 m_debugViewMaterial->setParent(m_debugViewModel);
491 m_debugViewMaterial->setDiffuseColor(QColor(3, 252, 219));
493 m_debugViewMaterial->setCullMode(QQuick3DMaterial::NoCulling);
494 QQmlListReference materialsRef(m_debugViewModel, "materials");
495 materialsRef.append(m_debugViewMaterial);
496 }
497 } else {
498 if (m_debugViewModel) {
499 delete m_debugViewModel;
500 m_debugViewModel = nullptr;
501 m_debugViewMaterial = nullptr;
502 }
503
504 if (m_debugViewGeometry) {
505 delete m_debugViewGeometry;
506 m_debugViewGeometry = nullptr;
507 }
508 }
509}
510
511void QQuick3DReflectionProbe::updateDebugView()
512{
513 if (m_debugViewModel) {
514 m_debugViewModel->setPosition(scenePosition() + m_boxOffset);
515 m_debugViewModel->setScale(m_boxSize);
516 }
517}
518
519quint32 QQuick3DReflectionProbe::mapToReflectionResolution(ReflectionQuality quality)
520{
521 switch (quality) {
523 return 8;
525 return 9;
527 return 10;
529 return 11;
530 default:
531 break;
532 }
533 return 7;
534}
535
536void QQuick3DReflectionProbe::updateSceneManager(QQuick3DSceneManager *sceneManager)
537{
538 // Check all the resource value's scene manager, and update as necessary.
539 if (sceneManager)
540 QQuick3DObjectPrivate::refSceneManager(m_texture, *sceneManager);
541 else
543}
544
545
\inmodule QtCore
Definition qbytearray.h:57
The QColor class provides colors based on RGB, HSV or CMYK values.
Definition qcolor.h:31
\inmodule QtCore
Definition qobject.h:103
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
void setParent(QObject *parent)
Makes the object a child of parent.
Definition qobject.cpp:2195
The QQmlListReference class allows the manipulation of QQmlListProperty properties.
Definition qqmllist.h:183
void setLighting(QQuick3DDefaultMaterial::Lighting lighting)
void setDiffuseColor(QColor diffuseColor)
\qmltype Geometry \inherits Object3D \inqmlmodule QtQuick3D \instantiates QQuick3DGeometry
void setPrimitiveType(PrimitiveType type)
Sets the primitive type used for rendering to type.
void setStride(int stride)
Sets the stride of the vertex buffer to stride, measured in bytes.
void addAttribute(Attribute::Semantic semantic, int offset, Attribute::ComponentType componentType)
Adds vertex attribute description.
void setVertexData(const QByteArray &data)
Sets the vertex buffer data.
void clear()
Resets the geometry to its initial state, clearing previously set vertex and index data as well as at...
void setCullMode(QQuick3DMaterial::CullMode cullMode)
void setCastsShadows(bool castsShadows)
void setGeometry(QQuick3DGeometry *geometry)
QVector3D scenePosition
void setScale(const QVector3D &scale)
void markAllDirty() override
void setPosition(const QVector3D &position)
void scenePositionChanged()
QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node) override
void refSceneManager(QQuick3DSceneManager &)
static void attachWatcher(Context *context, Setter setter, Object3D *newO, Object3D *oldO)
Attach a object-destroyed-watcher to an object that's not owned.
QQuick3DObject * parent
\qmlproperty Object3D QtQuick3D::Object3D::parent This property holds the parent of the Object3D in a...
void setParentItem(QQuick3DObject *parentItem)
QQuick3DCubeMapTexture * texture
\qmlproperty CubeMapTexture ReflectionProbe::texture
void itemChange(ItemChange, const ItemChangeData &) override
QVector3D boxOffset
\qmlproperty vector3d ReflectionProbe::boxOffset
void setQuality(ReflectionQuality reflectionQuality)
void setParallaxCorrection(bool parallaxCorrection)
bool debugView
\qmlproperty bool ReflectionProbe::debugView
void setRefreshMode(ReflectionRefreshMode newRefreshMode)
QQuick3DReflectionProbe(QQuick3DNode *parent=nullptr)
\qmltype ReflectionProbe \inherits Node \inqmlmodule QtQuick3D
ReflectionRefreshMode refreshMode
void setTimeSlicing(ReflectionTimeSlicing newTimeSlicing)
ReflectionTimeSlicing timeSlicing
QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node) override
void setBoxSize(const QVector3D &newBoxSize)
void setClearColor(const QColor &clearColor)
QSSGRenderImage * getRenderImage()
QQuick3DNode * scene
The QVector3D class represents a vector or vertex in 3D space.
Definition qvectornd.h:171
Combined button and popup list for selecting options.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define qWarning
Definition qlogging.h:166
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
#define emit
unsigned int quint32
Definition qtypes.h:50
float vertexData[]
QQueue< int > queue
[0]
Definition moc.h:23