mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-04-29 08:15:44 +00:00
Merge pull request #269 from Areloch/ExpandedLightPreferences
Adds additional light preferences
This commit is contained in:
commit
b9e482bd7e
4 changed files with 115 additions and 2 deletions
|
|
@ -52,6 +52,11 @@ bool AdvancedLightBinManager::smDiffuseLightViz = false;
|
||||||
bool AdvancedLightBinManager::smSpecularLightViz = false;
|
bool AdvancedLightBinManager::smSpecularLightViz = false;
|
||||||
bool AdvancedLightBinManager::smDetailLightingViz = false;
|
bool AdvancedLightBinManager::smDetailLightingViz = false;
|
||||||
|
|
||||||
|
S32 AdvancedLightBinManager::smMaximumNumOfLights = -1;
|
||||||
|
bool AdvancedLightBinManager::smUseLightFade = false;
|
||||||
|
F32 AdvancedLightBinManager::smLightFadeStart = 50;
|
||||||
|
F32 AdvancedLightBinManager::smLightFadeEnd = 75;
|
||||||
|
|
||||||
ImplementEnumType( ShadowFilterMode,
|
ImplementEnumType( ShadowFilterMode,
|
||||||
"The shadow filtering modes for Advanced Lighting shadows.\n"
|
"The shadow filtering modes for Advanced Lighting shadows.\n"
|
||||||
"@ingroup AdvancedLighting" )
|
"@ingroup AdvancedLighting" )
|
||||||
|
|
@ -178,6 +183,15 @@ void AdvancedLightBinManager::consoleInit()
|
||||||
Con::addVariable("$AL::DetailLightingViz", TypeBool, &smDetailLightingViz,
|
Con::addVariable("$AL::DetailLightingViz", TypeBool, &smDetailLightingViz,
|
||||||
"Enables debug rendering of the PSSM shadows.\n"
|
"Enables debug rendering of the PSSM shadows.\n"
|
||||||
"@ingroup AdvancedLighting\n");
|
"@ingroup AdvancedLighting\n");
|
||||||
|
|
||||||
|
Con::addVariable("$pref::maximumNumOfLights",
|
||||||
|
TypeS32, &smMaximumNumOfLights,
|
||||||
|
"The maximum number of local lights that can be rendered at a time. If set to -1, then no limit.\n");
|
||||||
|
|
||||||
|
Con::addVariable("$pref::useLightFade", TypeBool, &smUseLightFade, "Indicates if local lights should utilize the distance-based object fadeout logic.\n");
|
||||||
|
Con::addVariable("$pref::lightFadeStart", TypeF32, &smLightFadeStart, "Distance at which light fading begins if $pref::useLightFade is on.\n");
|
||||||
|
Con::addVariable("$pref::lightFadeEnd", TypeF32, &smLightFadeEnd, "Distance at which light fading should have fully faded if $pref::useLightFade is on.\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AdvancedLightBinManager::setTargetSize(const Point2I &newTargetSize)
|
bool AdvancedLightBinManager::setTargetSize(const Point2I &newTargetSize)
|
||||||
|
|
@ -260,6 +274,72 @@ void AdvancedLightBinManager::clearAllLights()
|
||||||
mNumLightsCulled = 0;
|
mNumLightsCulled = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
S32 QSORT_CALLBACK AdvancedLightBinManager::_lightScoreCmp(const LightBinEntry* a, const LightBinEntry* b)
|
||||||
|
{
|
||||||
|
F32 diff = a->lightInfo->getScore() - b->lightInfo->getScore();
|
||||||
|
return diff > 0 ? 1 : diff < 0 ? -1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdvancedLightBinManager::_scoreLights(const MatrixF& cameraTrans)
|
||||||
|
{
|
||||||
|
PROFILE_SCOPE(AdvancedLightBinManager_scoreLights);
|
||||||
|
|
||||||
|
if (!LIGHTMGR)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Get all the lights.
|
||||||
|
const Point3F lumDot(0.2125f, 0.7154f, 0.0721f);
|
||||||
|
|
||||||
|
for (LightBinIterator itr = mLightBin.begin(); itr != mLightBin.end(); itr++)
|
||||||
|
{
|
||||||
|
// Get the light.
|
||||||
|
LightBinEntry& light = *itr;
|
||||||
|
|
||||||
|
F32 luminace = 0.0f;
|
||||||
|
F32 weight = 0.0f;
|
||||||
|
F32 score = 0.0f;
|
||||||
|
|
||||||
|
const bool isSpot = light.lightInfo->getType() == LightInfo::Spot;
|
||||||
|
const bool isPoint = light.lightInfo->getType() == LightInfo::Point;
|
||||||
|
|
||||||
|
if (isPoint || isSpot)
|
||||||
|
{
|
||||||
|
Point3F distVec = light.lightInfo->getPosition() - cameraTrans.getPosition();
|
||||||
|
F32 dist = distVec.len();
|
||||||
|
|
||||||
|
score = dist;// light.lightInfo->getRange().x / mMax(dist, 1.0f);
|
||||||
|
|
||||||
|
// Get the luminocity.
|
||||||
|
luminace = mDot(light.lightInfo->getColor(), lumDot) * light.lightInfo->getBrightness();
|
||||||
|
|
||||||
|
weight = light.lightInfo->getPriority();
|
||||||
|
|
||||||
|
//Distance fading test
|
||||||
|
if (smUseLightFade)
|
||||||
|
{
|
||||||
|
if (dist > smLightFadeStart)
|
||||||
|
{
|
||||||
|
F32 brightness = light.lightInfo->getBrightness();
|
||||||
|
|
||||||
|
float fadeOutAmt = (dist - smLightFadeStart) / (smLightFadeEnd - smLightFadeStart);
|
||||||
|
fadeOutAmt = 1 - fadeOutAmt;
|
||||||
|
|
||||||
|
light.lightInfo->setFadeAmount(fadeOutAmt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
light.lightInfo->setFadeAmount(1.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
light.lightInfo->setScore(score * weight - luminace);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort them!
|
||||||
|
mLightBin.sort(_lightScoreCmp);
|
||||||
|
}
|
||||||
|
|
||||||
void AdvancedLightBinManager::render( SceneRenderState *state )
|
void AdvancedLightBinManager::render( SceneRenderState *state )
|
||||||
{
|
{
|
||||||
PROFILE_SCOPE( AdvancedLightManager_Render );
|
PROFILE_SCOPE( AdvancedLightManager_Render );
|
||||||
|
|
@ -354,9 +434,25 @@ void AdvancedLightBinManager::render( SceneRenderState *state )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Frustum& frustum = state->getCameraFrustum();
|
||||||
|
MatrixF invCam(frustum.getTransform());
|
||||||
|
invCam.inverse();
|
||||||
|
|
||||||
|
const MatrixF& cameraTrans = frustum.getTransform();
|
||||||
|
|
||||||
|
if(smUseLightFade || smMaximumNumOfLights != -1)
|
||||||
|
_scoreLights(cameraTrans);
|
||||||
|
|
||||||
|
S32 lightCount = 0;
|
||||||
|
|
||||||
// Blend the lights in the bin to the light buffer
|
// Blend the lights in the bin to the light buffer
|
||||||
for( LightBinIterator itr = mLightBin.begin(); itr != mLightBin.end(); itr++ )
|
for( LightBinIterator itr = mLightBin.begin(); itr != mLightBin.end(); itr++ )
|
||||||
{
|
{
|
||||||
|
if (smMaximumNumOfLights != -1 && lightCount >= smMaximumNumOfLights)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lightCount++;
|
||||||
|
|
||||||
LightBinEntry& curEntry = *itr;
|
LightBinEntry& curEntry = *itr;
|
||||||
LightInfo *curLightInfo = curEntry.lightInfo;
|
LightInfo *curLightInfo = curEntry.lightInfo;
|
||||||
if (curEntry.lightInfo->getType() >= LightInfo::Vector)
|
if (curEntry.lightInfo->getType() >= LightInfo::Vector)
|
||||||
|
|
@ -368,7 +464,7 @@ void AdvancedLightBinManager::render( SceneRenderState *state )
|
||||||
ShadowMapParams *lsp = curLightInfo->getExtended<ShadowMapParams>();
|
ShadowMapParams *lsp = curLightInfo->getExtended<ShadowMapParams>();
|
||||||
|
|
||||||
// Skip lights which won't affect the scene.
|
// Skip lights which won't affect the scene.
|
||||||
if ( !curLightMat || curLightInfo->getBrightness() <= 0.001f )
|
if (!curLightMat || curLightInfo->getBrightness() * curLightInfo->getFadeAmount() <= 0.001f)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
GFXDEBUGEVENT_SCOPE( AdvancedLightBinManager_Render_Light, ColorI::RED );
|
GFXDEBUGEVENT_SCOPE( AdvancedLightBinManager_Render_Light, ColorI::RED );
|
||||||
|
|
@ -694,7 +790,7 @@ void AdvancedLightBinManager::LightMaterialInfo::setLightParameters( const Light
|
||||||
MaterialParameters *matParams = matInstance->getMaterialParameters();
|
MaterialParameters *matParams = matInstance->getMaterialParameters();
|
||||||
|
|
||||||
matParams->setSafe( lightColor, lightInfo->getColor() );
|
matParams->setSafe( lightColor, lightInfo->getColor() );
|
||||||
matParams->setSafe( lightBrightness, lightInfo->getBrightness() );
|
matParams->setSafe(lightBrightness, lightInfo->getBrightness() * lightInfo->getFadeAmount());
|
||||||
|
|
||||||
switch( lightInfo->getType() )
|
switch( lightInfo->getType() )
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -108,6 +108,11 @@ public:
|
||||||
static bool smSpecularLightViz;
|
static bool smSpecularLightViz;
|
||||||
static bool smDetailLightingViz;
|
static bool smDetailLightingViz;
|
||||||
|
|
||||||
|
static S32 smMaximumNumOfLights;
|
||||||
|
static bool smUseLightFade;
|
||||||
|
static F32 smLightFadeEnd;
|
||||||
|
static F32 smLightFadeStart;
|
||||||
|
|
||||||
// Used for console init
|
// Used for console init
|
||||||
AdvancedLightBinManager( AdvancedLightManager *lm = NULL,
|
AdvancedLightBinManager( AdvancedLightManager *lm = NULL,
|
||||||
ShadowMapManager *sm = NULL,
|
ShadowMapManager *sm = NULL,
|
||||||
|
|
@ -130,6 +135,9 @@ public:
|
||||||
|
|
||||||
virtual bool setTargetSize(const Point2I &newTargetSize);
|
virtual bool setTargetSize(const Point2I &newTargetSize);
|
||||||
|
|
||||||
|
/// Scores the registered lights for sorting/ordering purposes
|
||||||
|
void _scoreLights(const MatrixF& cameraTrans);
|
||||||
|
|
||||||
// ConsoleObject interface
|
// ConsoleObject interface
|
||||||
DECLARE_CONOBJECT(AdvancedLightBinManager);
|
DECLARE_CONOBJECT(AdvancedLightBinManager);
|
||||||
|
|
||||||
|
|
@ -242,6 +250,8 @@ protected:
|
||||||
void _setupPerFrameParameters( const SceneRenderState *state );
|
void _setupPerFrameParameters( const SceneRenderState *state );
|
||||||
|
|
||||||
void setupSGData( SceneData &data, const SceneRenderState* state, LightInfo *light );
|
void setupSGData( SceneData &data, const SceneRenderState* state, LightInfo *light );
|
||||||
|
|
||||||
|
static S32 QSORT_CALLBACK _lightScoreCmp(const LightBinEntry* a, const LightBinEntry* b);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // _ADVANCEDLIGHTBINMANAGER_H_
|
#endif // _ADVANCEDLIGHTBINMANAGER_H_
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,7 @@ LightInfo::LightInfo()
|
||||||
mDynamicRefreshFreq( 8 ),
|
mDynamicRefreshFreq( 8 ),
|
||||||
mPriority( 1.0f ),
|
mPriority( 1.0f ),
|
||||||
mScore( 0.0f ),
|
mScore( 0.0f ),
|
||||||
|
mFadeAmount(1.0f),
|
||||||
mDebugRender( false )
|
mDebugRender( false )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -144,6 +144,9 @@ protected:
|
||||||
/// when prioritizing lights for rendering.
|
/// when prioritizing lights for rendering.
|
||||||
F32 mScore;
|
F32 mScore;
|
||||||
|
|
||||||
|
/// A temporary value which holds the amount this light is faded due to distance
|
||||||
|
F32 mFadeAmount;
|
||||||
|
|
||||||
/// Whether to render debugging visualizations
|
/// Whether to render debugging visualizations
|
||||||
/// for this light.
|
/// for this light.
|
||||||
bool mDebugRender;
|
bool mDebugRender;
|
||||||
|
|
@ -206,6 +209,9 @@ public:
|
||||||
void setScore( F32 score ) { mScore = score; }
|
void setScore( F32 score ) { mScore = score; }
|
||||||
F32 getScore() const { return mScore; }
|
F32 getScore() const { return mScore; }
|
||||||
|
|
||||||
|
void setFadeAmount(F32 fade) { mFadeAmount = fade; }
|
||||||
|
F32 getFadeAmount() const { return mFadeAmount; }
|
||||||
|
|
||||||
bool isDebugRenderingEnabled() const { return mDebugRender; }
|
bool isDebugRenderingEnabled() const { return mDebugRender; }
|
||||||
void enableDebugRendering( bool value ) { mDebugRender = value; }
|
void enableDebugRendering( bool value ) { mDebugRender = value; }
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue