You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Assets/Engine/Scripts/Entities/Lights/EnvironmentLight.lua

249 lines
7.5 KiB
Lua

----------------------------------------------------------------------------------------------------
--
-- Copyright (c) Contributors to the Open 3D Engine Project.
-- For complete copyright and license terms please see the LICENSE at the root of this distribution.
--
-- SPDX-License-Identifier: Apache-2.0 OR MIT
--
--
--
----------------------------------------------------------------------------------------------------
Script.ReloadScript("Scripts/Entities/Lights/Light.lua")
EnvironmentLight =
{
Properties =
{
_nVersion = -1,
bActive = 0,
BoxSizeX = 10,
BoxSizeY = 10,
BoxSizeZ = 10,
Color =
{
clrDiffuse = { x=1,y=1,z=1 },
fDiffuseMultiplier = 1,
fSpecularMultiplier = 1,
},
Projection =
{
bBoxProject = 0,
fBoxWidth = 10,
fBoxHeight = 10,
fBoxLength = 10,
},
Options =
{
bAffectsThisAreaOnly = 1,
bIgnoresVisAreas = 0,
bDeferredClipBounds = 0,
_texture_deferred_cubemap = "",
SortPriority = 0,
fAttenuationFalloffMax = 0.3,
bVolumetricFog = 1, --[0,1,1,"Enables the light to affect volumetric fog."]
bAffectsVolumetricFogOnly = 0, --[0,1,0,"Enables the light to affect only volumetric fog."]
},
OptionsAdvanced =
{
texture_deferred_cubemap = "",
},
},
Editor =
{
ShowBounds = 0,
AbsoluteRadius = 1,
},
_LightTable = {},
}
LightSlot = 1
function EnvironmentLight:OnInit()
self:SetFlags(ENTITY_FLAG_CLIENT_ONLY, 0);
self:OnReset();
self:Activate(1); -- Force OnUpdate to get called
self:CacheResources("EnvironmentLight.lua");
end
function EnvironmentLight:CacheResources(requesterName)
if ( self.Properties.OptionsAdvanced.texture_deferred_cubemap == "" ) then
self.Properties.OptionsAdvanced.texture_deferred_cubemap = self.Properties.Options._texture_deferred_cubemap;
end
end
function EnvironmentLight:OnShutDown()
self:FreeSlot(LightSlot);
end
function EnvironmentLight:OnLoad(props)
self:OnReset()
self:ActivateLight(props.bActive)
end
function EnvironmentLight:OnSave(props)
props.bActive = self.bActive
end
function EnvironmentLight:OnLevelLoaded()
if (self.Properties.Options.bDeferredClipBounds) then
self:UpdateLightClipBounds(LightSlot);
end
end
function EnvironmentLight:OnPropertyChange()
self:OnReset();
self:ActivateLight( self.bActive );
if (self.Properties.Options.bAffectsThisAreaOnly == 1) then
self:UpdateLightClipBounds(LightSlot);
end
end
-- optimization for common animated trackview properties, to avoid fully recreating everything on every animated frame
function EnvironmentLight:OnPropertyAnimated( name )
local changeTakenCareOf = false;
if (name=="fDiffuseMultiplier" or name=="fSpecularMultiplier") then
changeTakenCareOf = true;
local Color = self.Properties.Color;
local diffuse_mul = Color.fDiffuseMultiplier;
local specular_multiplier = Color.fSpecularMultiplier;
local diffuse_color = { x=Color.clrDiffuse.x*diffuse_mul, y=Color.clrDiffuse.y*diffuse_mul, z=Color.clrDiffuse.z*diffuse_mul };
self:SetLightColorParams( LightSlot, diffuse_color, specular_multiplier);
end
return changeTakenCareOf;
end
function EnvironmentLight:OnUpdate(dt)
if (self.bActive == 1 and self.Properties.Options.bAffectsThisAreaOnly == 1) then
self:UpdateLightClipBounds(LightSlot);
end
if (not System.IsEditor()) then
self:Activate(0);
end
end
function EnvironmentLight:OnReset()
if (self.bActive ~= self.Properties.bActive) then
self:ActivateLight( self.Properties.bActive );
end
end
function EnvironmentLight:ActivateLight( enable )
if (enable and enable ~= 0) then
self.bActive = 1;
self:LoadLightToSlot(LightSlot);
self:ActivateOutput( "Active",true );
else
self.bActive = 0;
self:FreeSlot(LightSlot);
self:ActivateOutput( "Active",false );
end
end
function EnvironmentLight:LoadLightToSlot( nSlot )
local props = self.Properties;
local Color = props.Color;
local Options = props.Options;
local OptionsAdvanced = props.OptionsAdvanced;
local Projection = props.Projection;
local diffuse_mul = Color.fDiffuseMultiplier;
local specular_mul = Color.fSpecularMultiplier;
local lt = self._LightTable;
lt.radius = 0.5 * (props.BoxSizeX*props.BoxSizeX + props.BoxSizeY*props.BoxSizeY + props.BoxSizeZ*props.BoxSizeZ) ^ 0.5;
lt.box_size_x = props.BoxSizeX;
lt.box_size_y = props.BoxSizeY;
lt.box_size_z = props.BoxSizeZ;
lt.diffuse_color = { x=Color.clrDiffuse.x*diffuse_mul, y=Color.clrDiffuse.y*diffuse_mul, z=Color.clrDiffuse.z*diffuse_mul };
lt.specular_multiplier = specular_mul;
if ( OptionsAdvanced.texture_deferred_cubemap == "" ) then
OptionsAdvanced.texture_deferred_cubemap = Options._texture_deferred_cubemap;
end
lt.deferred_cubemap = OptionsAdvanced.texture_deferred_cubemap;
lt.this_area_only = Options.bAffectsThisAreaOnly;
lt.ignore_visareas = Options.bIgnoresVisAreas;
lt.volumetric_fog = Options.bVolumetricFog;
lt.volumetric_fog_only = Options.bAffectsVolumetricFogOnly;
lt.box_projection = Projection.bBoxProject; -- settings for box projection
lt.box_width = Projection.fBoxWidth;
lt.box_height = Projection.fBoxHeight;
lt.box_length = Projection.fBoxLength;
lt.sort_priority = Options.SortPriority;
lt.attenuation_falloff_max = Options.fAttenuationFalloffMax;
lt.lightmap_linear_attenuation = 1;
lt.is_rectangle_light = 0;
lt.is_sphere_light = 0;
lt.area_sample_number = 1;
lt.RAE_AmbientColor = { x = 0, y = 0, z = 0 };
lt.RAE_MaxShadow = 1;
lt.RAE_DistMul = 1;
lt.RAE_DivShadow = 1;
lt.RAE_ShadowHeight = 1;
lt.RAE_FallOff = 2;
lt.RAE_VisareaNumber = 0;
self:LoadLight( nSlot,lt );
end
function EnvironmentLight:Event_Enable()
if (self.bActive == 0) then
self:ActivateLight( 1 );
end
end
function EnvironmentLight:Event_Disable()
if (self.bActive == 1) then
self:ActivateLight( 0 );
end
end
function Light:NotifySwitchOnOffFromParent(wantOn)
local wantOff = wantOn~=true;
if (self.bActive == 1 and wantOff) then
self:ActivateLight( 0 );
elseif (self.bActive == 0 and wantOn) then
self:ActivateLight( 1 );
end
end
------------------------------------------------------------------------------------------------------
-- Event Handlers
------------------------------------------------------------------------------------------------------
function EnvironmentLight:Event_Active( bActive )
if (self.bActive == 0 and bActive == true) then
self:ActivateLight( 1 );
else
if (self.bActive == 1 and bActive == false) then
self:ActivateLight( 0 );
end
end
end
------------------------------------------------------------------------------------------------------
-- Event descriptions.
------------------------------------------------------------------------------------------------------
EnvironmentLight.FlowEvents =
{
Inputs =
{
Active = { EnvironmentLight.Event_Active,"bool" },
Enable = { EnvironmentLight.Event_Enable,"bool" },
Disable = { EnvironmentLight.Event_Disable,"bool" },
},
Outputs =
{
Active = "bool",
},
}