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/Gems/PhysicsEntities/Assets/Scripts/Entities/Physics/WindArea.lua

137 lines
4.8 KiB
Lua

----------------------------------------------------------------------------------------------------
--
-- All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
-- its licensors.
--
-- For complete copyright and license terms please see the LICENSE at the root of this
-- distribution (the "License"). All use of this software is governed by the License,
-- or, if provided, by the license below or the license accompanying this file. Do not
-- remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--
--
----------------------------------------------------------------------------------------------------
-- Wind area
WindArea =
{
Properties =
{
bActive = 1, --[0,1,1,"Defines whether wind is blowing or not."]
Size = { x=10,y=10,z=10 },
bEllipsoidal = 1, --[0,1,1,"Forces an ellipsoidal falloff."]
FalloffInner = 0, --[0,100,0.1,"Distance after which the distance-based falloff begins."]
Dir = { x=0,y=0,z=0 },
Speed = 20, --[0,100,0.1,"Defines whether wind is blowing or not."]
AirResistance = 0, --[0,100,0.1,"Causes very light physicalised objects to experience a buoyancy force, if >0."]
AirDensity = 0, --[0,100,0.1,"Causes physicalised objects moving through the air to slow down, if >0."]
},
Editor =
{
Icon = "Tornado.bmp",
},
_PhysTable = { Area={}, },
}
-------------------------------------------------------
function WindArea:OnLoad(table)
self.bActive = table.bActive
end
-------------------------------------------------------
function WindArea:OnSave(table)
table.bActive = self.bActive
end
------------------------------------------------------------------------------------------------------
function WindArea:OnInit()
self.bActive = self.Properties.bActive;
if (self.bActive == 1) then
self:PhysicalizeThis();
end
end
------------------------------------------------------------------------------------------------------
-- OnPropertyChange called only by the editor.
------------------------------------------------------------------------------------------------------
function WindArea:OnPropertyChange()
self.bActive = self.Properties.bActive;
self:PhysicalizeThis();
end
------------------------------------------------------------------------------------------------------
-- OnReset called only by the editor.
------------------------------------------------------------------------------------------------------
function WindArea:OnReset()
end
------------------------------------------------------------------------------------------------------
function WindArea:PhysicalizeThis()
if (self.bActive == 1) then
local Properties = self.Properties;
local Area = self._PhysTable.Area;
if (Properties.bEllipsoidal == 1) then
Area.type = AREA_SPHERE;
Area.radius = LengthVector(Properties.Size) * 0.577;
else
Area.type = AREA_BOX;
end
Area.box_max = Properties.Size;
Area.box_min = { x = -Area.box_max.x, y = -Area.box_max.y, z = -Area.box_max.z };
if (Properties.bEllipsoidal == 1 or Properties.FalloffInner < 1) then
Area.falloffInner = Properties.FalloffInner;
else
Area.falloffInner = -1;
end
if (Properties.Dir.x == 0 and Properties.Dir.y == 0 and Properties.Dir.z == 0) then
Area.uniform = 0;
Area.wind = {x = 0, y = 0, z = Properties.Speed};
else
Area.uniform = 2;
Area.wind = { x = Properties.Dir.x * Properties.Speed, y = Properties.Dir.y * Properties.Speed, z = Properties.Dir.z * Properties.Speed };
end
Area.resistance = Properties.AirResistance;
Area.density = Properties.AirDensity;
self:Physicalize( 0,PE_AREA,self._PhysTable );
else
self:DestroyPhysics();
end
end
------------------------------------------------------------------------------------------------------
-- Event Handlers
------------------------------------------------------------------------------------------------------
function WindArea:Event_Activate()
if (self.bActive ~= 1) then
self.bActive = 1;
self:PhysicalizeThis();
end
end
function WindArea:Event_Deactivate()
if (self.bActive ~= 0) then
self.bActive = 0;
self:PhysicalizeThis();
end
end
function WindArea:Event_Speed( sender, Speed )
self.Properties.Speed = Speed;
self:OnPropertyChange();
end
WindArea.FlowEvents =
{
Inputs =
{
Deactivate = { WindArea.Event_Deactivate, "bool" },
Activate = { WindArea.Event_Activate, "bool" },
Speed = { WindArea.Event_Speed, "float" },
},
Outputs =
{
Deactivate = "bool",
Activate = "bool",
},
}