90 lines
2.9 KiB
C++
90 lines
2.9 KiB
C++
/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 */
|
|
|
|
#include "scene/image_sky.h"
|
|
|
|
#include "util/image_metadata.h"
|
|
|
|
#include "sky_nishita.h"
|
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
SkyLoader::SkyLoader(const bool multiple_scattering,
|
|
const float sun_elevation,
|
|
const float altitude,
|
|
const float air_density,
|
|
const float aerosol_density,
|
|
const float ozone_density)
|
|
: multiple_scattering(multiple_scattering),
|
|
sun_elevation(sun_elevation),
|
|
altitude(altitude),
|
|
air_density(air_density),
|
|
aerosol_density(aerosol_density),
|
|
ozone_density(ozone_density)
|
|
{
|
|
}
|
|
|
|
SkyLoader::~SkyLoader() = default;
|
|
|
|
bool SkyLoader::load_metadata(ImageMetaData &metadata,
|
|
const ImageLoaderParams & /*params*/,
|
|
Progress & /*progress*/)
|
|
{
|
|
metadata.width = 512;
|
|
metadata.height = 256;
|
|
metadata.channels = 3;
|
|
metadata.type = IMAGE_DATA_TYPE_FLOAT4;
|
|
metadata.is_compressible_as_srgb = false;
|
|
return true;
|
|
}
|
|
|
|
bool SkyLoader::load_pixels(const ImageMetaData &metadata, void *pixels)
|
|
{
|
|
/* Precompute Sky LUT */
|
|
int width = metadata.width;
|
|
int height = metadata.height;
|
|
float *pixel_data = (float *)pixels;
|
|
if (multiple_scattering) {
|
|
SKY_multiple_scattering_precompute_texture(pixel_data,
|
|
metadata.channels,
|
|
width,
|
|
height,
|
|
sun_elevation,
|
|
altitude,
|
|
air_density,
|
|
aerosol_density,
|
|
ozone_density);
|
|
}
|
|
else {
|
|
SKY_single_scattering_precompute_texture(pixel_data,
|
|
metadata.channels,
|
|
width,
|
|
height,
|
|
sun_elevation,
|
|
altitude,
|
|
air_density,
|
|
aerosol_density,
|
|
ozone_density);
|
|
}
|
|
|
|
metadata.conform_pixels(pixels);
|
|
return true;
|
|
}
|
|
|
|
string SkyLoader::name() const
|
|
{
|
|
return "sky_multiple_scattering";
|
|
}
|
|
|
|
bool SkyLoader::equals(const ImageLoader &other) const
|
|
{
|
|
const SkyLoader &other_sky = (const SkyLoader &)other;
|
|
return multiple_scattering == other_sky.multiple_scattering &&
|
|
sun_elevation == other_sky.sun_elevation && altitude == other_sky.altitude &&
|
|
air_density == other_sky.air_density && aerosol_density == other_sky.aerosol_density &&
|
|
ozone_density == other_sky.ozone_density;
|
|
}
|
|
|
|
CCL_NAMESPACE_END
|