Revision control
Copy as Markdown
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
// Qt-Security score:significant reason:default
#include "sceneeffects_p.h"
QT_BEGIN_NAMESPACE
SceneEffectBase::SceneEffectBase(QQuick3DObject *parent)
: QQuick3DEffect(parent)
{
}
QQuick3DSceneEnvironment *SceneEffectBase::environment() const
{
return m_environment;
}
void SceneEffectBase::setEnvironment(QQuick3DSceneEnvironment *newEnvironment)
{
if (m_environment == newEnvironment)
return;
if (auto env = qobject_cast<SceneEffectEnvironment *>(m_environment))
unregisterWithEnv(env);
m_environment = newEnvironment;
QQuick3DObjectPrivate::attachWatcher(this, &SceneEffectBase::setEnvironment, newEnvironment, m_environment);
if (auto env = qobject_cast<SceneEffectEnvironment *>(m_environment))
registerWithEnv(env);
emit environmentChanged();
}
void SceneEffectBase::scheduleEnvUpdate()
{
if (m_environment)
m_environment->update();
}
MainSceneEffect::MainSceneEffect(QQuick3DObject *p)
: SceneEffectBase(p)
{
}
void MainSceneEffect::registerWithEnv(SceneEffectEnvironment *newEnvironment)
{
if (newEnvironment)
newEnvironment->setMainSceneEffect(this);
}
void MainSceneEffect::unregisterWithEnv(SceneEffectEnvironment *oldEnvironment)
{
if (oldEnvironment)
oldEnvironment->setMainSceneEffect(nullptr);
}
DepthOfFieldEffect::DepthOfFieldEffect(QQuick3DObject *p)
: SceneEffectBase(p)
{
}
void DepthOfFieldEffect::registerWithEnv(SceneEffectEnvironment *newEnvironment)
{
if (newEnvironment)
newEnvironment->setDeptOfFieldEffect(this);
}
void DepthOfFieldEffect::unregisterWithEnv(SceneEffectEnvironment *oldEnvironment)
{
if (oldEnvironment)
oldEnvironment->setDeptOfFieldEffect(nullptr);
}
bool DepthOfFieldEffect::enabled() const
{
return m_enabled;
}
void DepthOfFieldEffect::setEnabled(bool newEnabled)
{
if (m_enabled == newEnabled)
return;
m_enabled = newEnabled;
scheduleEnvUpdate();
emit enabledChanged();
}
SsgiEnvEffect::SsgiEnvEffect(QQuick3DObject *p)
: SceneEffectBase(p)
{
}
void SsgiEnvEffect::registerWithEnv(SceneEffectEnvironment *newEnvironment)
{
if (newEnvironment)
newEnvironment->setSsgiEffect(this);
}
void SsgiEnvEffect::unregisterWithEnv(SceneEffectEnvironment *oldEnvironment)
{
if (oldEnvironment)
oldEnvironment->setSsgiEffect(nullptr);
}
bool SsgiEnvEffect::enabled() const
{
return m_enabled;
}
void SsgiEnvEffect::setEnabled(bool newEnabled)
{
if (m_enabled == newEnabled)
return;
m_enabled = newEnabled;
scheduleEnvUpdate();
emit enabledChanged();
}
SsrEnvEffect::SsrEnvEffect(QQuick3DObject *p)
: SceneEffectBase(p)
{
}
void SsrEnvEffect::registerWithEnv(SceneEffectEnvironment *newEnvironment)
{
if (newEnvironment)
newEnvironment->setSsrEffect(this);
}
void SsrEnvEffect::unregisterWithEnv(SceneEffectEnvironment *oldEnvironment)
{
if (oldEnvironment)
oldEnvironment->setSsrEffect(nullptr);
}
bool SsrEnvEffect::enabled() const
{
return m_enabled;
}
void SsrEnvEffect::setEnabled(bool newEnabled)
{
if (m_enabled == newEnabled)
return;
m_enabled = newEnabled;
scheduleEnvUpdate();
emit enabledChanged();
}
SceneEffectEnvironment::SceneEffectEnvironment(QQuick3DObject *p)
: QQuick3DSceneEnvironment(p)
{
}
void SceneEffectEnvironment::setMainSceneEffect(MainSceneEffect *tonemapper)
{
if (m_tonemapper == tonemapper)
return;
QQuick3DObjectPrivate::attachWatcher(this, &SceneEffectEnvironment::setMainSceneEffect, tonemapper, m_tonemapper);
m_tonemapper = tonemapper;
}
void SceneEffectEnvironment::setDeptOfFieldEffect(DepthOfFieldEffect *dof)
{
if (m_dof == dof)
return;
QQuick3DObjectPrivate::attachWatcher(this, &SceneEffectEnvironment::setDeptOfFieldEffect, dof, m_dof);
m_dof = dof;
}
void SceneEffectEnvironment::setSsgiEffect(SsgiEnvEffect *ssgi)
{
if (m_ssgi == ssgi)
return;
QQuick3DObjectPrivate::attachWatcher(this, &SceneEffectEnvironment::setSsgiEffect, ssgi, m_ssgi);
m_ssgi = ssgi;
}
void SceneEffectEnvironment::setSsrEffect(SsrEnvEffect *ssr)
{
if (m_ssr == ssr)
return;
QQuick3DObjectPrivate::attachWatcher(this, &SceneEffectEnvironment::setSsrEffect, ssr, m_ssr);
m_ssr = ssr;
}
QSSGRenderGraphObject *SceneEffectEnvironment::updateSpatialNode(QSSGRenderGraphObject *node)
{
m_effects = QQuick3DSceneEnvironment::effectList();
if (m_ssgi && m_ssgi->enabled())
m_effects.push_back(m_ssgi);
if (m_ssr && m_ssr->enabled()) {
m_effects.push_back(m_ssr);
}
if (m_dof && m_dof->enabled())
m_effects.push_back(m_dof);
if (m_tonemapper)
m_effects.push_back(m_tonemapper);
node = QQuick3DSceneEnvironment::updateSpatialNode(node);
return node;
}
const QVector<QQuick3DEffect *> &SceneEffectEnvironment::effectList() const
{
return m_effects;
}
bool SceneEffectEnvironment::useBuiltinTonemapper() const
{
return false;
}
QT_END_NAMESPACE