FBX: Add correct light locations and falloff values.
Fbx lights are stored in the scene graph as well as having separate light properties. The separate light properties have a light position and direction that is already fully transformed based on its position in the scene graph so this results in the assimp light being transformed twice. Since the scene graph contains all the relevant transformations the light position and direction can just use default values. Fbx specifies lights along the negative y axis so the default light values have a up and direction set accordingly. The DecayStart value specifies the distance from the light that the light intensity will drop to half. Using the default assimp falloff equation of f=1/c+lr+qr^2 then the falloff coefficients can be calculated for either c,l or q accordingly by setting r=DecayStart and f=0.5. Fixes #851pull/1131/head
parent
685c737051
commit
b34a552fb7
|
@ -640,7 +640,7 @@ void Converter::ConvertLight( const Model& model, const Light& light )
|
||||||
|
|
||||||
out_light->mName.Set( FixNodeName( model.Name() ) );
|
out_light->mName.Set( FixNodeName( model.Name() ) );
|
||||||
|
|
||||||
const float intensity = light.Intensity();
|
const float intensity = light.Intensity() / 100.0f;
|
||||||
const aiVector3D& col = light.Color();
|
const aiVector3D& col = light.Color();
|
||||||
|
|
||||||
out_light->mColorDiffuse = aiColor3D( col.x, col.y, col.z );
|
out_light->mColorDiffuse = aiColor3D( col.x, col.y, col.z );
|
||||||
|
@ -650,6 +650,11 @@ void Converter::ConvertLight( const Model& model, const Light& light )
|
||||||
|
|
||||||
out_light->mColorSpecular = out_light->mColorDiffuse;
|
out_light->mColorSpecular = out_light->mColorDiffuse;
|
||||||
|
|
||||||
|
//lights are defined along negative y direction
|
||||||
|
out_light->mPosition = aiVector3D(0.0f);
|
||||||
|
out_light->mDirection = aiVector3D(0.0f, -1.0f, 0.0f);
|
||||||
|
out_light->mUp = aiVector3D(0.0f, 0.0f, -1.0f);
|
||||||
|
|
||||||
switch ( light.LightType() )
|
switch ( light.LightType() )
|
||||||
{
|
{
|
||||||
case Light::Type_Point:
|
case Light::Type_Point:
|
||||||
|
@ -679,17 +684,23 @@ void Converter::ConvertLight( const Model& model, const Light& light )
|
||||||
ai_assert( false );
|
ai_assert( false );
|
||||||
}
|
}
|
||||||
|
|
||||||
// XXX: how to best convert the near and far decay ranges?
|
float decay = light.DecayStart();
|
||||||
switch ( light.DecayType() )
|
switch ( light.DecayType() )
|
||||||
{
|
{
|
||||||
case Light::Decay_None:
|
case Light::Decay_None:
|
||||||
out_light->mAttenuationConstant = 1.0f;
|
out_light->mAttenuationConstant = decay;
|
||||||
|
out_light->mAttenuationLinear = 0.0f;
|
||||||
|
out_light->mAttenuationQuadratic = 0.0f;
|
||||||
break;
|
break;
|
||||||
case Light::Decay_Linear:
|
case Light::Decay_Linear:
|
||||||
out_light->mAttenuationLinear = 1.0f;
|
out_light->mAttenuationConstant = 0.0f;
|
||||||
|
out_light->mAttenuationLinear = 2.0f / decay;
|
||||||
|
out_light->mAttenuationQuadratic = 0.0f;
|
||||||
break;
|
break;
|
||||||
case Light::Decay_Quadratic:
|
case Light::Decay_Quadratic:
|
||||||
out_light->mAttenuationQuadratic = 1.0f;
|
out_light->mAttenuationConstant = 0.0f;
|
||||||
|
out_light->mAttenuationLinear = 0.0f;
|
||||||
|
out_light->mAttenuationQuadratic = 2.0f / (decay * decay);
|
||||||
break;
|
break;
|
||||||
case Light::Decay_Cubic:
|
case Light::Decay_Cubic:
|
||||||
FBXImporter::LogWarn( "cannot represent cubic attenuation, set to Quadratic" );
|
FBXImporter::LogWarn( "cannot represent cubic attenuation, set to Quadratic" );
|
||||||
|
|
|
@ -302,12 +302,12 @@ public:
|
||||||
fbx_simple_property(DrawVolumetricLight, bool, true)
|
fbx_simple_property(DrawVolumetricLight, bool, true)
|
||||||
fbx_simple_property(DrawGroundProjection, bool, true)
|
fbx_simple_property(DrawGroundProjection, bool, true)
|
||||||
fbx_simple_property(DrawFrontFacingVolumetricLight, bool, false)
|
fbx_simple_property(DrawFrontFacingVolumetricLight, bool, false)
|
||||||
fbx_simple_property(Intensity, float, 1.0f)
|
fbx_simple_property(Intensity, float, 100.0f)
|
||||||
fbx_simple_property(InnerAngle, float, 0.0f)
|
fbx_simple_property(InnerAngle, float, 0.0f)
|
||||||
fbx_simple_property(OuterAngle, float, 45.0f)
|
fbx_simple_property(OuterAngle, float, 45.0f)
|
||||||
fbx_simple_property(Fog, int, 50)
|
fbx_simple_property(Fog, int, 50)
|
||||||
fbx_simple_enum_property(DecayType, Decay, 0)
|
fbx_simple_enum_property(DecayType, Decay, 2)
|
||||||
fbx_simple_property(DecayStart, int, 0)
|
fbx_simple_property(DecayStart, float, 1.0f)
|
||||||
fbx_simple_property(FileName, std::string, "")
|
fbx_simple_property(FileName, std::string, "")
|
||||||
|
|
||||||
fbx_simple_property(EnableNearAttenuation, bool, false)
|
fbx_simple_property(EnableNearAttenuation, bool, false)
|
||||||
|
|
Loading…
Reference in New Issue