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

82 lines
2.1 KiB
C++

//
// Copyright Contributors to the MaterialX Project
// SPDX-License-Identifier: Apache-2.0
//
#include <MaterialXRender/LightHandler.h>
#include <MaterialXGenShader/HwShaderGenerator.h>
#include <MaterialXGenShader/GenContext.h>
MATERIALX_NAMESPACE_BEGIN
const int DEFAULT_ENV_SAMPLE_COUNT = 16;
void LightHandler::addLightSource(NodePtr node)
{
_lightSources.push_back(node);
}
LightIdMap LightHandler::computeLightIdMap(const vector<NodePtr>& nodes)
{
std::unordered_map<string, unsigned int> idMap;
unsigned int id = 1;
for (const auto& node : nodes)
{
auto nodedef = node->getNodeDef();
if (nodedef)
{
const string& name = nodedef->getName();
if (!idMap.count(name))
{
idMap[name] = id++;
}
}
}
return idMap;
}
void LightHandler::findLights(DocumentPtr doc, vector<NodePtr>& lights)
{
lights.clear();
for (NodePtr node : doc->getNodes())
{
const TypeDesc* type = TypeDesc::get(node->getType());
if (*type == *Type::LIGHTSHADER)
{
lights.push_back(node);
}
}
}
void LightHandler::registerLights(DocumentPtr doc, const vector<NodePtr>& lights, GenContext& context)
{
// Clear context light user data which is set when bindLightShader()
// is called. This is necessary in case the light types have already been
// registered.
HwShaderGenerator::unbindLightShaders(context);
if (!lights.empty())
{
// Create a list of unique nodedefs and ids for them
_lightIdMap = computeLightIdMap(lights);
for (const auto& id : _lightIdMap)
{
NodeDefPtr nodeDef = doc->getNodeDef(id.first);
if (nodeDef)
{
HwShaderGenerator::bindLightShader(*nodeDef, id.second, context);
}
}
}
// Make sure max light count is large enough
const unsigned int lightCount = (unsigned int) lights.size();
if (lightCount > context.getOptions().hwMaxActiveLightSources)
{
context.getOptions().hwMaxActiveLightSources = lightCount;
}
}
MATERIALX_NAMESPACE_END