Revision control

Copy as Markdown

// Copyright (C) 2008-2012 NVIDIA Corporation.
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
// Qt-Security score:significant reason:default
#include "qssgrenderableobjects_p.h"
#include "qssglayerrenderdata_p.h"
#include <QtQuick3DRuntimeRender/private/qssgrenderer_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrhicustommaterialsystem_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrenderlight_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrenderdefaultmaterialshadergenerator_p.h>
QT_BEGIN_NAMESPACE
struct QSSGRenderableImage;
class QSSGSubsetRenderable;
QSSGModelContext::QSSGModelContext(const QSSGRenderModel &inModel,
const QMatrix4x4 &inGlobalTransform,
const QMatrix3x3 &inNormalMatrix,
const QSSGRenderMvpArray &inModelViewProjections)
: model(inModel)
, globalTransform(inGlobalTransform)
, normalMatrix(inNormalMatrix)
, modelViewProjections(inModelViewProjections)
{
}
QSSGSubsetRenderable::QSSGSubsetRenderable(Type type,
QSSGRenderableObjectFlags inFlags,
const QVector3D &inWorldCenterPt,
QSSGRenderer *rendr,
const QSSGRenderSubset &inSubset,
const QSSGModelContext &inModelContext,
float inOpacity,
quint32 inSubsetLevelOfDetail,
const QSSGRenderGraphObject &mat,
QSSGRenderableImage *inFirstImage,
QSSGShaderDefaultMaterialKey inShaderKey,
const QSSGShaderLightListView &inLights,
bool anyLightHasShadows)
: QSSGRenderableObject(type,
inFlags,
inWorldCenterPt,
inSubset.bounds,
inModelContext.model.m_depthBiasSq,
inModelContext.model.instancingLodMin,
inModelContext.model.instancingLodMax)
, subsetLevelOfDetail(inSubsetLevelOfDetail)
, renderer(rendr)
, modelContext(inModelContext)
, subset(inSubset)
, opacity(inOpacity)
, material(mat)
, firstImage(inFirstImage)
, shaderDescription(inShaderKey)
, lights(inLights)
{
if (mat.type == QSSGRenderGraphObject::Type::CustomMaterial)
depthWriteMode = static_cast<const QSSGRenderCustomMaterial *>(&mat)->m_depthDrawMode;
else
depthWriteMode = static_cast<const QSSGRenderDefaultMaterial *>(&mat)->depthDrawMode;
const bool modelBlendParticle = (inModelContext.model.particleBuffer != nullptr
&& inModelContext.model.particleBuffer->particleCount());
if (modelBlendParticle)
globalBounds = inModelContext.model.particleBuffer->bounds();
else
globalBounds.transform(inModelContext.globalTransform);
// Do we need instanced bounds
const QSSGRenderInstanceTable *instanceTable = inModelContext.model.instanceTable;
isInstanced = instanceTable != nullptr;
if (!instanceTable || !anyLightHasShadows || !(inFlags.castsShadows() || inFlags.receivesShadows()))
return;
// Check for specified instancing shadow bounds
QSSGBounds3 bounds = QSSGBounds3(instanceTable->getShadowBoundsMinimum(), instanceTable->getShadowBoundsMaximum());
if (!bounds.isEmpty() && bounds.isFinite()) {
globalBoundsInstancing = bounds;
return;
}
// Calculate instancing shadow bounds
const auto points = globalBounds.toQSSGBoxPointsNoEmptyCheck();
for (int i = 0; i < instanceTable->count(); ++i) {
const QMatrix4x4 transform = instanceTable->getTransform(i);
for (const QVector3D &point : points) {
globalBoundsInstancing.include(transform.map(point));
}
}
}
QSSGParticlesRenderable::QSSGParticlesRenderable(QSSGRenderableObjectFlags inFlags,
const QVector3D &inWorldCenterPt,
QSSGRenderer *rendr,
const QMatrix4x4 &inGlobalTransform,
const QSSGRenderParticles &inParticles,
QSSGRenderableImage *inFirstImage,
QSSGRenderableImage *inColorTable,
const QSSGShaderLightListView &inLights,
float inOpacity,
QSSGShaderParticleMaterialKey inShaderKey)
: QSSGRenderableObject(Type::Particles,
inFlags,
inWorldCenterPt,
inParticles.m_particleBuffer.bounds(),
inParticles.m_depthBiasSq)
, renderer(rendr)
, particles(inParticles)
, firstImage(inFirstImage)
, colorTable(inColorTable)
, lights(inLights)
, globalTransform(inGlobalTransform)
, opacity(inOpacity)
, shaderDescription(inShaderKey)
{
// Bounds are in global space for _model blend_ particles
globalBounds = inParticles.m_particleBuffer.bounds();
if (inParticles.type != QSSGRenderParticles::Type::ModelBlendParticle)
globalBounds.transform(inGlobalTransform);
}
QT_END_NAMESPACE