211QQuick3DAbstractLight::QQuick3DAbstractLight(QQuick3DNodePrivate &dd, QQuick3DNode *parent)
212 : QQuick3DNode(dd, parent)
214 , m_ambientColor(Qt::black) {}
288void QQuick3DAbstractLight::markAllDirty()
290 m_dirtyFlags = DirtyFlags(DirtyFlag::ShadowDirty)
291 | DirtyFlags(DirtyFlag::ColorDirty)
292 | DirtyFlags(DirtyFlag::BrightnessDirty)
293 | DirtyFlags(DirtyFlag::FadeDirty)
294 | DirtyFlags(DirtyFlag::AreaDirty)
295 | DirtyFlags(DirtyFlag::BakeModeDirty);
296 QQuick3DNode::markAllDirty();
310void QQuick3DAbstractLight::setAmbientColor(
const QColor &ambientColor)
312 if (m_ambientColor == ambientColor)
315 m_ambientColor = ambientColor;
316 m_dirtyFlags.setFlag(DirtyFlag::ColorDirty);
317 emit ambientColorChanged();
321void QQuick3DAbstractLight::setBrightness(
float brightness)
323 if (qFuzzyCompare(m_brightness, brightness))
326 m_brightness = brightness;
327 m_dirtyFlags.setFlag(DirtyFlag::BrightnessDirty);
328 emit brightnessChanged();
342void QQuick3DAbstractLight::setCastsShadow(
bool castsShadow)
344 if (m_castsShadow == castsShadow)
347 m_castsShadow = castsShadow;
348 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
349 emit castsShadowChanged();
353void QQuick3DAbstractLight::setShadowBias(
float shadowBias)
355 if (qFuzzyCompare(m_shadowBias, shadowBias))
358 m_shadowBias = shadowBias;
359 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
360 emit shadowBiasChanged();
364void QQuick3DAbstractLight::setShadowFactor(
float shadowFactor)
366 shadowFactor = qBound(0.0f, shadowFactor, 100.0f);
367 if (qFuzzyCompare(m_shadowFactor, shadowFactor))
370 m_shadowFactor = shadowFactor;
371 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
372 emit shadowFactorChanged();
376void QQuick3DAbstractLight::setShadowMapQuality(
377 QQuick3DAbstractLight::QSSGShadowMapQuality shadowMapQuality)
379 if (m_shadowMapQuality == shadowMapQuality)
382 m_shadowMapQuality = shadowMapQuality;
383 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
384 emit shadowMapQualityChanged();
432void QQuick3DAbstractLight::setShadowMapFar(
float shadowMapFar)
434 if (qFuzzyCompare(m_shadowMapFar, shadowMapFar))
437 m_shadowMapFar = shadowMapFar;
438 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
439 emit shadowMapFarChanged();
443void QQuick3DAbstractLight::setShadowFilter(
float shadowFilter)
445 if (qFuzzyCompare(m_shadowFilter, shadowFilter))
448 m_shadowFilter = shadowFilter;
449 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty);
450 emit shadowFilterChanged();
471QSSGRenderGraphObject *QQuick3DAbstractLight::updateSpatialNode(QSSGRenderGraphObject *node)
473 Q_ASSERT_X(node,
__FUNCTION__,
"Node must have been created in parent class.");
475 QQuick3DNode::updateSpatialNode(node);
477 QSSGRenderLight *light =
static_cast<QSSGRenderLight *>(node);
479 if (m_dirtyFlags.toInt() != 0)
480 light->markDirty(QSSGRenderLight::DirtyFlag::LightDirty);
482 if (m_dirtyFlags.testFlag(DirtyFlag::ColorDirty)) {
483 m_dirtyFlags.setFlag(DirtyFlag::ColorDirty,
false);
484 light->m_diffuseColor = QSSGUtils::color::sRGBToLinear(m_color).toVector3D();
485 light->m_specularColor = light->m_diffuseColor;
486 light->m_ambientColor = QSSGUtils::color::sRGBToLinear(m_ambientColor).toVector3D();
489 if (m_dirtyFlags.testFlag(DirtyFlag::BrightnessDirty)) {
490 m_dirtyFlags.setFlag(DirtyFlag::BrightnessDirty,
false);
491 light->m_brightness = m_brightness;
494 if (m_dirtyFlags.testFlag(DirtyFlag::ShadowDirty)) {
495 m_dirtyFlags.setFlag(DirtyFlag::ShadowDirty,
false);
496 light->m_castShadow = m_castsShadow;
497 light->m_shadowBias = m_shadowBias;
498 light->m_shadowFactor = m_shadowFactor;
499 light->m_shadowMapRes = mapToShadowResolution(m_shadowMapQuality);
500 light->m_softShadowQuality =
static_cast<QSSGRenderLight::SoftShadowQuality>(m_softShadowQuality);
501 light->m_shadowMapFar = m_shadowMapFar;
502 light->m_shadowFilter = m_shadowFilter;
503 light->m_pcfFactor = m_pcfFactor;
504 light->m_use32BitShadowmap = m_use32BitShadowmap;
507 if (m_dirtyFlags.testFlag(DirtyFlag::BakeModeDirty)) {
508 m_dirtyFlags.setFlag(DirtyFlag::BakeModeDirty,
false);
509 light->m_bakingEnabled = m_bakeMode != QSSGBakeMode::BakeModeDisabled;
510 light->m_fullyBaked = m_bakeMode == QSSGBakeMode::BakeModeAll;
518 light->m_scope = light;
520 light->m_scope =
static_cast<QSSGRenderNode*>(QQuick3DObjectPrivate::get(m_scope)->spatialNode);
522 light->m_scope =
nullptr;