58  mColorTextureParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"colorTexture" ), forwardRenderView.
colorTexture() );
 
   59  mDepthTextureParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"depthTexture" ), forwardRenderView.
depthTexture() );
 
   60  mShadowMapParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"shadowTexture" ), shadowRenderView.
mapTexture() );
 
   61  mAmbientOcclusionTextureParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"ssaoTexture" ), aoRenderView.
blurredFactorMapTexture() );
 
   62  mMaterial->addParameter( mColorTextureParameter );
 
   63  mMaterial->addParameter( mDepthTextureParameter );
 
   64  mMaterial->addParameter( mShadowMapParameter );
 
   65  mMaterial->addParameter( mAmbientOcclusionTextureParameter );
 
   70  mFarPlaneParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"farPlane" ), mMainCamera->farPlane() );
 
   71  mMaterial->addParameter( mFarPlaneParameter );
 
   72  connect( mMainCamera, &Qt3DRender::QCamera::farPlaneChanged, mFarPlaneParameter, [&]( 
float farPlane ) {
 
   73    mFarPlaneParameter->setValue( farPlane );
 
   75  mNearPlaneParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"nearPlane" ), mMainCamera->nearPlane() );
 
   76  mMaterial->addParameter( mNearPlaneParameter );
 
   77  connect( mMainCamera, &Qt3DRender::QCamera::nearPlaneChanged, mNearPlaneParameter, [&]( 
float nearPlane ) {
 
   78    mNearPlaneParameter->setValue( nearPlane );
 
   81  mLightFarPlaneParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"lightFarPlane" ), mLightCamera->farPlane() );
 
   82  mMaterial->addParameter( mLightFarPlaneParameter );
 
   83  connect( mLightCamera, &Qt3DRender::QCamera::farPlaneChanged, mLightFarPlaneParameter, [&]( 
float farPlane ) {
 
   84    mLightFarPlaneParameter->setValue( farPlane );
 
   86  mLightNearPlaneParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"lightNearPlane" ), mLightCamera->nearPlane() );
 
   87  mMaterial->addParameter( mLightNearPlaneParameter );
 
   88  connect( mLightCamera, &Qt3DRender::QCamera::nearPlaneChanged, mLightNearPlaneParameter, [&]( 
float nearPlane ) {
 
   89    mLightNearPlaneParameter->setValue( nearPlane );
 
   92  mMainCameraInvViewMatrixParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"invertedCameraView" ), mMainCamera->viewMatrix().inverted() );
 
   93  mMaterial->addParameter( mMainCameraInvViewMatrixParameter );
 
   94  mMainCameraInvProjMatrixParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"invertedCameraProj" ), mMainCamera->projectionMatrix().inverted() );
 
   95  mMaterial->addParameter( mMainCameraInvProjMatrixParameter );
 
   96  connect( mMainCamera, &Qt3DRender::QCamera::projectionMatrixChanged, mMainCameraInvProjMatrixParameter, [&]( 
const QMatrix4x4 &projectionMatrix ) {
 
   97    mMainCameraInvProjMatrixParameter->setValue( projectionMatrix.inverted() );
 
   99  connect( mMainCamera, &Qt3DRender::QCamera::viewMatrixChanged, mMainCameraInvViewMatrixParameter, [&]() {
 
  100    mMainCameraInvViewMatrixParameter->setValue( mMainCamera->viewMatrix().inverted() );
 
  103  mShadowMinX = 
new Qt3DRender::QParameter( QStringLiteral( 
"shadowMinX" ), QVariant::fromValue( 0.0f ) );
 
  104  mShadowMaxX = 
new Qt3DRender::QParameter( QStringLiteral( 
"shadowMaxX" ), QVariant::fromValue( 0.0f ) );
 
  105  mShadowMinY = 
new Qt3DRender::QParameter( QStringLiteral( 
"shadowMinY" ), QVariant::fromValue( 0.0f ) );
 
  106  mShadowMaxY = 
new Qt3DRender::QParameter( QStringLiteral( 
"shadowMaxY" ), QVariant::fromValue( 0.0f ) );
 
  112  mRenderShadowsParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"renderShadows" ), QVariant::fromValue( 0 ) );
 
  113  mMaterial->addParameter( mRenderShadowsParameter );
 
  115  mShadowBiasParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"shadowBias" ), QVariant::fromValue( 0.00001f ) );
 
  116  mMaterial->addParameter( mShadowBiasParameter );
 
  118  mEyeDomeLightingEnabledParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"edlEnabled" ), QVariant::fromValue( 0 ) );
 
  119  mEyeDomeLightingStrengthParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"edlStrength" ), QVariant::fromValue( 1000.0f ) );
 
  120  mEyeDomeLightingDistanceParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"edlDistance" ), QVariant::fromValue( 2.0f ) );
 
  121  mMaterial->addParameter( mEyeDomeLightingEnabledParameter );
 
  122  mMaterial->addParameter( mEyeDomeLightingStrengthParameter );
 
  123  mMaterial->addParameter( mEyeDomeLightingDistanceParameter );
 
  125  mAmbientOcclusionEnabledParameter = 
new Qt3DRender::QParameter( QStringLiteral( 
"ssaoEnabled" ), QVariant::fromValue( 0 ) );
 
  126  mMaterial->addParameter( mAmbientOcclusionEnabledParameter );
 
  128  mLightPosition = 
new Qt3DRender::QParameter( QStringLiteral( 
"lightPosition" ), QVariant::fromValue( QVector3D() ) );
 
  129  mLightDirection = 
new Qt3DRender::QParameter( QStringLiteral( 
"lightDirection" ), QVariant::fromValue( QVector3D() ) );
 
  130  mMaterial->addParameter( mLightPosition );
 
  131  mMaterial->addParameter( mLightDirection );
 
  133  const QString vertexShaderPath = QStringLiteral( 
"qrc:/shaders/postprocess.vert" );
 
  134  const QString fragmentShaderPath = QStringLiteral( 
"qrc:/shaders/postprocess.frag" );
 
  136  mShader->setVertexShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( vertexShaderPath ) ) );
 
  137  mShader->setFragmentShaderCode( Qt3DRender::QShaderProgram::loadSource( QUrl( fragmentShaderPath ) ) );
 
 
  156  float minX, maxX, minY, maxY, minZ, maxZ;
 
  157  QVector3D lookingAt = mMainCamera->viewCenter();
 
  158  const float d = 2 * ( mMainCamera->position() - mMainCamera->viewCenter() ).length();
 
  163  lookingAt = QVector3D( 0.5f * ( minX + maxX ), 0.5f * ( minY + maxY ), mMainCamera->viewCenter().z() );
 
  164  const QVector3D lightPosition = lookingAt + QVector3D( 0.0f, 0.0f, d );
 
  165  mLightCamera->setPosition( lightPosition );
 
  166  mLightCamera->setViewCenter( lookingAt );
 
  167  mLightCamera->setUpVector( QVector3D( 0.0f, 1.0f, 0.0f ) );
 
  168  mLightCamera->rotateAboutViewCenter( QQuaternion::rotationTo( QVector3D( 0.0f, 0.0f, -1.0f ), lightDirection ) );
 
  170  mLightCamera->setProjectionType( Qt3DRender::QCameraLens::ProjectionType::OrthographicProjection );
 
  171  mLightCamera->lens()->setOrthographicProjection(
 
  172    -0.7f * ( maxX - minX ), 0.7f * ( maxX - minX ),
 
  173    -0.7f * ( maxY - minY ), 0.7f * ( maxY - minY ),
 
  174    1.0f, 2 * ( lookingAt - lightPosition ).length()