209QQuick3DAbstractLight::QQuick3DAbstractLight(QQuick3DNodePrivate &dd, QQuick3DNode *parent)
210 : QQuick3DNode(dd, parent)
212 , m_ambientColor(Qt::black) {}
286void QQuick3DAbstractLight::markAllDirty()
288 m_dirtyFlags = DirtyFlags(DirtyFlag::ShadowDirty)
289 | DirtyFlags(DirtyFlag::ColorDirty)
290 | DirtyFlags(DirtyFlag::BrightnessDirty)
291 | DirtyFlags(DirtyFlag::FadeDirty)
292 | DirtyFlags(DirtyFlag::AreaDirty)
293 | DirtyFlags(DirtyFlag::BakeModeDirty);
294 QQuick3DNode::markAllDirty();
308void QQuick3DAbstractLight::setAmbientColor(
const QColor &ambientColor)
310 if (m_ambientColor == ambientColor)
313 m_ambientColor = ambientColor;
314 m_dirtyFlags.setFlag(DirtyFlag::ColorDirty);
315 emit ambientColorChanged();
319void QQuick3DAbstractLight::setBrightness(
float brightness)
321 if (qFuzzyCompare(m_brightness, brightness))
324 m_brightness = brightness;
325 m_dirtyFlags.setFlag(DirtyFlag::BrightnessDirty);
326 emit brightnessChanged();
340void QQuick3DAbstractLight::setCastsShadow(
bool castsShadow)
342 if (m_castsShadow == castsShadow)
345 m_castsShadow = castsShadow;
346 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
347 emit castsShadowChanged();
351void QQuick3DAbstractLight::setShadowBias(
float shadowBias)
353 if (qFuzzyCompare(m_shadowBias, shadowBias))
356 m_shadowBias = shadowBias;
357 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
358 emit shadowBiasChanged();
362void QQuick3DAbstractLight::setShadowFactor(
float shadowFactor)
364 shadowFactor = qBound(0.0f, shadowFactor, 100.0f);
365 if (qFuzzyCompare(m_shadowFactor, shadowFactor))
368 m_shadowFactor = shadowFactor;
369 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
370 emit shadowFactorChanged();
374void QQuick3DAbstractLight::setShadowMapQuality(
375 QQuick3DAbstractLight::QSSGShadowMapQuality shadowMapQuality)
377 if (m_shadowMapQuality == shadowMapQuality)
380 m_shadowMapQuality = shadowMapQuality;
381 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
382 emit shadowMapQualityChanged();
430void QQuick3DAbstractLight::setShadowMapFar(
float shadowMapFar)
432 if (qFuzzyCompare(m_shadowMapFar, shadowMapFar))
435 m_shadowMapFar = shadowMapFar;
436 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
437 emit shadowMapFarChanged();
441void QQuick3DAbstractLight::setShadowFilter(
float shadowFilter)
443 if (qFuzzyCompare(m_shadowFilter, shadowFilter))
446 m_shadowFilter = shadowFilter;
447 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
448 emit shadowFilterChanged();
469QSSGRenderGraphObject *QQuick3DAbstractLight::updateSpatialNode(QSSGRenderGraphObject *node)
471 Q_ASSERT_X(node,
__FUNCTION__,
"Node must have been created in parent class.");
473 QQuick3DNode::updateSpatialNode(node);
475 QSSGRenderLight *light =
static_cast<QSSGRenderLight *>(node);
477 if (m_dirtyFlags.toInt() != 0)
478 light->markDirty(QSSGRenderLight::DirtyFlag::LightDirty);
480 if (m_dirtyFlags.testFlag(DirtyFlag::ColorDirty)) {
481 m_dirtyFlags.setFlag(DirtyFlag::ColorDirty,
false);
482 light->m_diffuseColor = QSSGUtils::color::sRGBToLinear(m_color).toVector3D();
483 light->m_specularColor = light->m_diffuseColor;
484 light->m_ambientColor = QSSGUtils::color::sRGBToLinear(m_ambientColor).toVector3D();
487 if (m_dirtyFlags.testFlag(DirtyFlag::BrightnessDirty)) {
488 m_dirtyFlags.setFlag(DirtyFlag::BrightnessDirty,
false);
489 light->m_brightness = m_brightness;
492 if (m_dirtyFlags.testFlag(DirtyFlag::ShadowDirty)) {
493 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty,
false);
494 light->m_castShadow = m_castsShadow;
495 light->m_shadowBias = m_shadowBias;
496 light->m_shadowFactor = m_shadowFactor;
497 light->m_shadowMapRes = mapToShadowResolution(m_shadowMapQuality);
498 light->m_softShadowQuality =
static_cast<QSSGRenderLight::SoftShadowQuality>(m_softShadowQuality);
499 light->m_shadowMapFar = m_shadowMapFar;
500 light->m_shadowFilter = m_shadowFilter;
501 light->m_pcfFactor = m_pcfFactor;
502 light->m_use32BitShadowmap = m_use32BitShadowmap;
505 if (m_dirtyFlags.testFlag(DirtyFlag::BakeModeDirty)) {
506 m_dirtyFlags.setFlag(DirtyFlag::BakeModeDirty,
false);
507 light->m_bakingEnabled = m_bakeMode != QSSGBakeMode::BakeModeDisabled;
508 light->m_fullyBaked = m_bakeMode == QSSGBakeMode::BakeModeAll;
516 light->m_scope = light;
518 light->m_scope =
static_cast<QSSGRenderNode*>(QQuick3DObjectPrivate::get(m_scope)->spatialNode);
520 light->m_scope =
nullptr;