| 398 | } |
| 399 | |
| 400 | void Viewer::loadEnvironmentLight() |
| 401 | { |
| 402 | // Load the requested radiance map. |
| 403 | mx::ImagePtr envRadianceMap = _imageHandler->acquireImage(_envRadianceFilename); |
| 404 | if (!envRadianceMap) |
| 405 | { |
| 406 | new ng::MessageDialog(this, ng::MessageDialog::Type::Warning, "Failed to load environment light"); |
| 407 | return; |
| 408 | } |
| 409 | |
| 410 | // If requested, normalize the environment upon loading. |
| 411 | if (_normalizeEnvironment) |
| 412 | { |
| 413 | envRadianceMap = mx::normalizeEnvironment(envRadianceMap, IDEAL_ENV_MAP_RADIANCE, MAX_ENV_TEXEL_RADIANCE); |
| 414 | if (_saveGeneratedLights) |
| 415 | { |
| 416 | _imageHandler->saveImage("NormalizedRadiance.hdr", envRadianceMap); |
| 417 | } |
| 418 | } |
| 419 | |
| 420 | // If requested, split the environment into indirect and direct components. |
| 421 | if (_splitDirectLight) |
| 422 | { |
| 423 | splitDirectLight(envRadianceMap, envRadianceMap, _lightRigDoc); |
| 424 | if (_saveGeneratedLights) |
| 425 | { |
| 426 | _imageHandler->saveImage("IndirectRadiance.hdr", envRadianceMap); |
| 427 | mx::writeToXmlFile(_lightRigDoc, "DirectLightRig.mtlx"); |
| 428 | } |
| 429 | } |
| 430 | |
| 431 | // Look for an irradiance map using an expected filename convention. |
| 432 | mx::ImagePtr envIrradianceMap; |
| 433 | if (!_normalizeEnvironment && !_splitDirectLight) |
| 434 | { |
| 435 | mx::FilePath envIrradiancePath = _envRadianceFilename.getParentPath() / IRRADIANCE_MAP_FOLDER / _envRadianceFilename.getBaseName(); |
| 436 | envIrradianceMap = _imageHandler->acquireImage(envIrradiancePath); |
| 437 | } |
| 438 | |
| 439 | // If not found, then generate an irradiance map via spherical harmonics. |
| 440 | if (!envIrradianceMap || envIrradianceMap->getWidth() == 1) |
| 441 | { |
| 442 | if (_generateReferenceIrradiance) |
| 443 | { |
| 444 | envIrradianceMap = mx::renderReferenceIrradiance(envRadianceMap, IRRADIANCE_MAP_WIDTH, IRRADIANCE_MAP_HEIGHT); |
| 445 | if (_saveGeneratedLights) |
| 446 | { |
| 447 | _imageHandler->saveImage("ReferenceIrradiance.hdr", envIrradianceMap); |
| 448 | } |
| 449 | } |
| 450 | else |
| 451 | { |
| 452 | mx::Sh3ColorCoeffs shIrradiance = mx::projectEnvironment(envRadianceMap, true); |
| 453 | envIrradianceMap = mx::renderEnvironment(shIrradiance, IRRADIANCE_MAP_WIDTH, IRRADIANCE_MAP_HEIGHT); |
| 454 | if (_saveGeneratedLights) |
| 455 | { |
| 456 | _imageHandler->saveImage("SphericalHarmonicIrradiance.hdr", envIrradianceMap); |
| 457 | } |
nothing calls this directly
no test coverage detected