123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- ----------------------------------------------------------------------------------------------------
- --
- -- 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
- --
- --
- --
- ----------------------------------------------------------------------------------------------------
- RigidBody = {
- type = "RigidBody",
- MapVisMask = 0,
- Properties = {
- soclasses_SmartObjectClass = "",
- bAutoGenAIHidePts = 0,
- objModel = "Objects/box.cgf",
- Density = 5000,
- Mass = 1,
- bResting = 1, -- If rigid body is originally in resting state.
- bVisible = 1, -- If rigid body is originally visible.
- bRigidBodyActive = 1, -- If rigid body is originally created OR will be created only on OnActivate.
- bActivateOnRocketDamage = 0, -- Activate when a rocket hit the entity.
- Impulse = {X=0,Y=0,Z=0}, -- Impulse to apply at event.
- max_time_step = 0.01,
- sleep_speed = 0.04,
- damping = 0,
- water_damping = 1.5,
- water_resistance = 0,
- },
- temp_vec={x=0,y=0,z=0},
- PhysParams = { mass=0,density=0 },
-
- updateTime = 500,
- gravityUpdate = 0,
-
- Editor={
- Icon = "physicsobject.bmp",
- IconOnTop=1,
- },
- }
- -------------------------------------------------------
- function RigidBody:OnInit()
- self.ModelName = "";
- self.Mass = 0;
- self:OnReset();
-
- -- System.Log( "here1" );
- end
- -------------------------------------------------------
- function RigidBody:OnReset()
- --self:NetPresent(nil);
- if (self.ModelName ~= self.Properties.objModel or self.Mass ~= self.Properties.Mass) then
- self.Mass = self.Properties.Mass;
- self.ModelName = self.Properties.objModel;
- self:LoadObject( 0,self.ModelName );
- end
-
- local Properties = self.Properties;
- if (Properties.bVisible == 0) then
- self:DrawSlot( 0,0 );
- else
- self:DrawSlot( 0,1 );
- end
- local physType;
- if (self.Properties.bRigidBodyActive == 1) then
- physType = PE_RIGID;
- self.PhysParams.density = Properties.Density;
- self.PhysParams.mass = Properties.Mass;
- else
- physType = PE_STATIC;
- end
- self:Physicalize( 0,physType,self.PhysParams );
- self:SetPhysicParams(PHYSICPARAM_SIMULATION, self.Properties );
- self:SetPhysicParams(PHYSICPARAM_BUOYANCY, self.Properties );
-
- if (self.Properties.bResting == 0) then
- self:AwakePhysics(1);
- else
- self:AwakePhysics(0);
- end
-
- -- Mark AI hideable flag.
- if (self.Properties.bAutoGenAIHidePts == 1) then
- self:SetFlags(ENTITY_FLAG_AI_HIDEABLE, 0); -- set
- else
- self:SetFlags(ENTITY_FLAG_AI_HIDEABLE, 2); -- remove
- end
- end
- -------------------------------------------------------
- function RigidBody:OnPropertyChange()
- self:OnReset();
- end
- -------------------------------------------------------
- function RigidBody:OnContact( player )
- self:Event_OnTouch( player );
- end
- -------------------------------------------------------
- function RigidBody:OnDamage( hit )
- --System.LogToConsole( "On Damage" );
- if( hit.ipart ) then
- self:AddImpulse( hit.ipart, hit.pos, hit.dir, hit.impact_force_mul );
- -- else
- -- self:AddImpulse( -1, hit.pos, hit.dir, hit.impact_force_mul );
- end
- if(self.Properties.bActivateOnRocketDamage)then
- if(hit.explosion)then
- self:AwakePhysics(1);
- end
- end
- end
- -------------------------------------------------------
- function RigidBody:OnShutDown()
- end
- -------------------------------------------------------
- function RigidBody:OnTimer()
- -- System.Log("RigidBody OnTimer");
- -- self:SetTimer( 0,1000 );
- end
- function RigidBody:OnUpdate()
- --FIXME: all this timing stuff will be replaced by OnTimer once it will work again
- self.gravityUpdate = self.gravityUpdate + _frametime;
-
- if (self.gravityUpdate < 0.5) then
- return;
- end
-
- self.gravityUpdate = 0.0;
- EntityUpdateGravity(self);
- end
- -------------------------------------------------------
- -- Input events
- -------------------------------------------------------
- function RigidBody:Event_AddImpulse(sender)
- self.temp_vec.x=self.Properties.Impulse.X;
- self.temp_vec.y=self.Properties.Impulse.Y;
- self.temp_vec.z=self.Properties.Impulse.Z;
- self:AddImpulse(0,nil,self.temp_vec,1);
- end
- -------------------------------------------------------
- function RigidBody:Event_Activate(sender)
- --create rigid body
- self:CreateRigidBody( self.Properties.Density,self.Properties.Mass,0 );
- self:Activate(1);
- self:AwakePhysics(1);
- end
- -------------------------------------------------------
- function RigidBody:Event_Show(sender)
- self:DrawSlot( 0,1 );
- end
- -------------------------------------------------------
- function RigidBody:Event_Hide(sender)
- self:DrawSlot( 0,0 );
- end
- -------------------------------------------------------
- -- Output events
- -------------------------------------------------------
- function RigidBody:Event_OnTouch(sender)
- BroadcastEvent( self,"OnTouch" );
- end
- RigidBody.FlowEvents =
- {
- Inputs =
- {
- Activate = { RigidBody.Event_Activate, "bool" },
- AddImpulse = { RigidBody.Event_AddImpulse, "bool" },
- Hide = { RigidBody.Event_Hide, "bool" },
- Show = { RigidBody.Event_Show, "bool" },
- OnTouch = { RigidBody.Event_OnTouch, "bool" },
- },
- Outputs =
- {
- Activate = "bool",
- AddImpulse = "bool",
- Hide = "bool",
- Show = "bool",
- OnTouch = "bool",
- },
- }
|