213QQuick3DAbstractLight::QQuick3DAbstractLight(QQuick3DNodePrivate &dd, QQuick3DNode *parent)
214 : QQuick3DNode(dd, parent)
216 , m_ambientColor(Qt::black) {}
290void QQuick3DAbstractLight::markAllDirty()
292 m_dirtyFlags = DirtyFlags(DirtyFlag::ShadowDirty)
293 | DirtyFlags(DirtyFlag::ColorDirty)
294 | DirtyFlags(DirtyFlag::BrightnessDirty)
295 | DirtyFlags(DirtyFlag::FadeDirty)
296 | DirtyFlags(DirtyFlag::AreaDirty)
297 | DirtyFlags(DirtyFlag::BakeModeDirty);
298 QQuick3DNode::markAllDirty();
312void QQuick3DAbstractLight::setAmbientColor(
const QColor &ambientColor)
314 if (m_ambientColor == ambientColor)
317 m_ambientColor = ambientColor;
318 m_dirtyFlags.setFlag(DirtyFlag::ColorDirty);
319 emit ambientColorChanged();
323void QQuick3DAbstractLight::setBrightness(
float brightness)
325 if (qFuzzyCompare(m_brightness, brightness))
328 m_brightness = brightness;
329 m_dirtyFlags.setFlag(DirtyFlag::BrightnessDirty);
330 emit brightnessChanged();
344void QQuick3DAbstractLight::setCastsShadow(
bool castsShadow)
346 if (m_castsShadow == castsShadow)
349 m_castsShadow = castsShadow;
350 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
351 emit castsShadowChanged();
355void QQuick3DAbstractLight::setShadowBias(
float shadowBias)
357 if (qFuzzyCompare(m_shadowBias, shadowBias))
360 m_shadowBias = shadowBias;
361 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
362 emit shadowBiasChanged();
366void QQuick3DAbstractLight::setShadowFactor(
float shadowFactor)
368 shadowFactor = qBound(0.0f, shadowFactor, 100.0f);
369 if (qFuzzyCompare(m_shadowFactor, shadowFactor))
372 m_shadowFactor = shadowFactor;
373 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
374 emit shadowFactorChanged();
378void QQuick3DAbstractLight::setShadowMapQuality(
379 QQuick3DAbstractLight::QSSGShadowMapQuality shadowMapQuality)
381 if (m_shadowMapQuality == shadowMapQuality)
384 m_shadowMapQuality = shadowMapQuality;
385 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
386 emit shadowMapQualityChanged();
434void QQuick3DAbstractLight::setShadowMapFar(
float shadowMapFar)
436 if (qFuzzyCompare(m_shadowMapFar, shadowMapFar))
439 m_shadowMapFar = shadowMapFar;
440 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
441 emit shadowMapFarChanged();
445void QQuick3DAbstractLight::setShadowFilter(
float shadowFilter)
447 if (qFuzzyCompare(m_shadowFilter, shadowFilter))
450 m_shadowFilter = shadowFilter;
451 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
452 emit shadowFilterChanged();
473QSSGRenderGraphObject *QQuick3DAbstractLight::updateSpatialNode(QSSGRenderGraphObject *node)
475 Q_ASSERT_X(node,
__FUNCTION__,
"Node must have been created in parent class.");
477 QQuick3DNode::updateSpatialNode(node);
479 QSSGRenderLight *light =
static_cast<QSSGRenderLight *>(node);
481 if (m_dirtyFlags.toInt() != 0)
482 light->markDirty(QSSGRenderLight::DirtyFlag::LightDirty);
484 if (m_dirtyFlags.testFlag(DirtyFlag::ColorDirty)) {
485 m_dirtyFlags.setFlag(DirtyFlag::ColorDirty,
false);
486 light->m_diffuseColor = QSSGUtils::color::sRGBToLinear(m_color).toVector3D();
487 light->m_specularColor = light->m_diffuseColor;
488 light->m_ambientColor = QSSGUtils::color::sRGBToLinear(m_ambientColor).toVector3D();
491 if (m_dirtyFlags.testFlag(DirtyFlag::BrightnessDirty)) {
492 m_dirtyFlags.setFlag(DirtyFlag::BrightnessDirty,
false);
493 light->m_brightness = m_brightness;
496 if (m_dirtyFlags.testFlag(DirtyFlag::ShadowDirty)) {
497 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty,
false);
498 light->m_castShadow = m_castsShadow;
499 light->m_shadowBias = m_shadowBias;
500 light->m_shadowFactor = m_shadowFactor;
501 light->m_shadowMapRes = mapToShadowResolution(m_shadowMapQuality);
502 light->m_softShadowQuality =
static_cast<QSSGRenderLight::SoftShadowQuality>(m_softShadowQuality);
503 light->m_shadowMapFar = m_shadowMapFar;
504 light->m_shadowFilter = m_shadowFilter;
505 light->m_pcfFactor = m_pcfFactor;
506 light->m_use32BitShadowmap = m_use32BitShadowmap;
509 if (m_dirtyFlags.testFlag(DirtyFlag::BakeModeDirty)) {
510 m_dirtyFlags.setFlag(DirtyFlag::BakeModeDirty,
false);
511 light->m_bakingEnabled = m_bakeMode != QSSGBakeMode::BakeModeDisabled;
512 light->m_fullyBaked = m_bakeMode == QSSGBakeMode::BakeModeAll;
520 light->m_scope = light;
522 light->m_scope =
static_cast<QSSGRenderNode*>(QQuick3DObjectPrivate::get(m_scope)->spatialNode);
524 light->m_scope =
nullptr;