// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only

/*!
    \example bakedlightmap
    \ingroup quick3d-examples
    \title Qt Quick 3D - Baked Lightmap Example
    \examplecategory {3D}
    \brief Demonstrates the use of baked lightmaps in a 3D scene.
    \image bakedlightmap-example.jpg
           {Cornell box with two boxes and ceiling light showing baked
           lightmap lighting}

    This example demonstrates using fully baked lighting in a scene. As a
    result, the rendered scene looks a lot more realistic, mainly because of
    the added indirect illumination. With the help of a checkbox it also allows
    disabling lightmapping, thus allowing comparing the rendering results of
    the real-time and fully baked approaches.

    \section1 Setting up the Light

    The scene has a single point light. When the checkbox is checked, the
    \l{Light::bakeMode}{bakeMode} of the light is set to Light.BakeModeAll.

    \snippet bakedlightmap/main.qml light

    Setting the property to a value other than
    \l{Light::bakeMode}{Light.BakeModeDisabled} serves a double purpose: at
    lightmap baking time it indicates that the light is part of the lightmapped
    scene, contributing to it. At run time, when rendering the scene normally,
    it indicates the light is a fully or partially baked light, which leads to
    disabling certain real time calculations in materials for lightmapped
    models. This is why the checkbox toggles \c both the bakeMode property on
    the Light and also the enabled property of the BakedLightmap associated
    with the Model objects.

    \section1 Setting up the Model

    The \l{https://en.wikipedia.org/wiki/Cornell_box}{Cornell box} is a Model
    with 8 submeshes. This is encapsulated as the Box type, an instance of
    which is instantiated in the main scene.

    \snippet bakedlightmap/main.qml model

    This model both \e{participates} in the lightmapped scene, and has a
    lightmap \e{baked for it}. The former is indicated by the
    \l{Model::usedInBakedLighting}{usedInBakedLighting} property. This alone
    does not ensure our box miniscene gets a lightmap baked for it, only that
    it participates in lightmapping (i.e. the light rays can bounce off the
    model when calculating indirect illumination).

    To get the lightmap fully generated and then stored during the baking
    process, a \l BakedLightmap object with \l{BakedLightmap::enabled}{enabled}
    set to \c true is set as well. The \l{BakedLightmap::key}{key} specifies a
    unique identifier.

    For simple deployment, the application can pack the generated lightmaps
    (\c{lightmaps.bin} file) into the execuatble via the Qt resource system.
    When rebaking the lightmap, the application needs to be built again so the
    changed file is picked up. The source for the lightmaps file is set in
    \l{Lightmapper} through the \l{Lightmapper::source}{source} property.
*/
