Files
UnrealEngine/Engine/Source/ThirdParty/MaterialX/MaterialX-1.38.10/source/MaterialXRender/LightHandler.h
2025-05-18 13:04:45 +08:00

276 lines
6.5 KiB
C++

//
// Copyright Contributors to the MaterialX Project
// SPDX-License-Identifier: Apache-2.0
//
#ifndef MATERIALX_LIGHTHANDLER_H
#define MATERIALX_LIGHTHANDLER_H
/// @file
/// Handler for hardware lights
#include <MaterialXRender/Export.h>
#include <MaterialXRender/Image.h>
#include <MaterialXRender/Util.h>
#include <MaterialXCore/Document.h>
MATERIALX_NAMESPACE_BEGIN
extern MX_RENDER_API const int DEFAULT_ENV_SAMPLE_COUNT;
class GenContext;
/// Shared pointer to a LightHandler
using LightHandlerPtr = std::shared_ptr<class LightHandler>;
/// An unordered map from light names to light indices.
using LightIdMap = std::unordered_map<string, unsigned int>;
/// @class LightHandler
/// Utility light handler for creating and providing
/// light data for shader binding.
class MX_RENDER_API LightHandler
{
public:
LightHandler() :
_lightTransform(Matrix44::IDENTITY),
_directLighting(true),
_indirectLighting(true),
_usePrefilteredMap(false),
_envLightIntensity(1.0f),
_envSampleCount(DEFAULT_ENV_SAMPLE_COUNT),
_refractionTwoSided(false)
{
}
virtual ~LightHandler() { }
/// Create a new light handler
static LightHandlerPtr create() { return std::make_shared<LightHandler>(); }
/// @name Global State
/// @{
/// Set the light transform.
void setLightTransform(const Matrix44& mat)
{
_lightTransform = mat;
}
/// Return the light transform.
Matrix44 getLightTransform() const
{
return _lightTransform;
}
/// Set whether direct lighting is enabled.
void setDirectLighting(bool enable)
{
_directLighting = enable;
}
/// Return whether direct lighting is enabled.
bool getDirectLighting() const
{
return _directLighting;
}
/// Set whether indirect lighting is enabled.
void setIndirectLighting(bool enable)
{
_indirectLighting = enable;
}
/// Return whether indirect lighting is enabled.
bool getIndirectLighting() const
{
return _indirectLighting;
}
/// @}
/// @name Environment Lighting
/// @{
/// Set the environment radiance map
void setEnvRadianceMap(ImagePtr map)
{
_envRadianceMap = map;
}
/// Return the environment radiance map
ImagePtr getEnvRadianceMap() const
{
return _envRadianceMap;
}
/// Set the environment radiance map for the prefiltered environment lighting model.
void setEnvPrefilteredMap(ImagePtr map)
{
_envPrefilteredMap = map;
}
/// Return the environment radiance map for the prefiltered environment lighting model.
ImagePtr getEnvPrefilteredMap() const
{
return _envPrefilteredMap;
}
/// Set whether to use the prefiltered environment lighting model.
void setUsePrefilteredMap(bool val)
{
_usePrefilteredMap = val;
}
/// Return whether to use the prefiltered environment lighting model.
bool getUsePrefilteredMap()
{
return _usePrefilteredMap;
}
/// Set the environment irradiance map
void setEnvIrradianceMap(ImagePtr map)
{
_envIrradianceMap = map;
}
/// Return the environment irradiance map
ImagePtr getEnvIrradianceMap() const
{
return _envIrradianceMap;
}
/// Set the environment lighting sample count.
void setEnvSampleCount(int count)
{
_envSampleCount = count;
}
/// Return the environment lighting sample count.
int getEnvSampleCount() const
{
return _envSampleCount;
}
/// Set the environment light intensity.
void setEnvLightIntensity(const float intensity)
{
_envLightIntensity = intensity;
}
/// Return the environment light intensity.
float getEnvLightIntensity()
{
return _envLightIntensity;
}
/// Set the two-sided refraction property.
void setRefractionTwoSided(bool enable)
{
_refractionTwoSided = enable;
}
/// Return the two-sided refraction property.
int getRefractionTwoSided() const
{
return _refractionTwoSided;
}
/// @}
/// @name Albedo Table
/// @{
/// Set the directional albedo table
void setAlbedoTable(ImagePtr table)
{
_albedoTable = table;
}
/// Return the directional albedo table
ImagePtr getAlbedoTable() const
{
return _albedoTable;
}
/// @}
/// @name Light Sources
/// @{
/// Add a light source.
void addLightSource(NodePtr node);
/// Set the vector of light sources.
void setLightSources(const vector<NodePtr>& lights)
{
_lightSources = lights;
}
/// Return the vector of light sources.
const vector<NodePtr>& getLightSources() const
{
return _lightSources;
}
/// Return the first light source, if any, of the given category.
NodePtr getFirstLightOfCategory(const string& category)
{
for (NodePtr light : _lightSources)
{
if (light->getCategory() == category)
{
return light;
}
}
return nullptr;
}
/// @}
/// @name Light IDs
/// @{
/// Get a list of identifiers associated with a given light nodedef
const std::unordered_map<string, unsigned int>& getLightIdMap() const
{
return _lightIdMap;
}
/// From a set of nodes, create a mapping of corresponding
/// nodedef identifiers to numbers
LightIdMap computeLightIdMap(const vector<NodePtr>& nodes);
/// Find lights to use based on an input document
/// @param doc Document to scan for lights
/// @param lights List of lights found in document
void findLights(DocumentPtr doc, vector<NodePtr>& lights);
/// Register light node definitions and light count with a given generation context
/// @param doc Document containing light nodes and definitions
/// @param lights Lights to register
/// @param context Context to update
void registerLights(DocumentPtr doc, const vector<NodePtr>& lights, GenContext& context);
/// @}
protected:
Matrix44 _lightTransform;
bool _directLighting;
bool _indirectLighting;
bool _usePrefilteredMap;
ImagePtr _envRadianceMap;
ImagePtr _envPrefilteredMap;
ImagePtr _envIrradianceMap;
float _envLightIntensity;
int _envSampleCount;
bool _refractionTwoSided;
ImagePtr _albedoTable;
vector<NodePtr> _lightSources;
std::unordered_map<string, unsigned int> _lightIdMap;
};
MATERIALX_NAMESPACE_END
#endif