Skip to content

Commit

Permalink
Merge pull request orbitersim#447 from TheGondos/lua_beacons
Browse files Browse the repository at this point in the history
[Lua]Add beacon support
  • Loading branch information
jarmonik authored Mar 25, 2024
2 parents 8852860 + 8be0e69 commit 843e834
Show file tree
Hide file tree
Showing 23 changed files with 1,207 additions and 57 deletions.
18 changes: 18 additions & 0 deletions Orbitersdk/samples/Lua/DeltaGlider/Src/CockpitBrightnessDial.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
local PanelElement = require("PanelElement")

local CockpitBrightnessDial = Class(PanelElement)

function CockpitBrightnessDial:new (comp)
PanelElement.new(self, comp:DG())
self.component = comp
end

--------------------------------------------------------------

function CockpitBrightnessDial:ProcessMouseVC (event, p)
self.component:ModBrightness (p.x > 0.5)
return true
end


return CockpitBrightnessDial
137 changes: 137 additions & 0 deletions Orbitersdk/samples/Lua/DeltaGlider/Src/CockpitLight.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
local DGSubsystem = require("DGSubsystem")
local CockpitLightSwitch = require("CockpitLightSwitch")
local CockpitBrightnessDial = require("CockpitBrightnessDial")
local DGSwitch1 = require("DGSwitch1")

local meshres_vc = require("meshres_vc")
local GRP_VC = meshres_vc.GRP

-- FLOODLIGHT_SWITCH (VC): mouse catch area
local VC_FLOODLIGHT_SWITCH_mousearea = {_V(-0.12031,1.65220,6.93405),_V(-0.10031,1.65220,6.93405),_V(-0.12031,1.66256,6.89541),_V(-0.10031,1.66256,6.89541)}

-- FLOODLIGHT_SWITCH (VC): rotation reference
local VC_FLOODLIGHT_SWITCH_ref = _V(-0.11031,1.66028,6.91550)

-- FLOODLIGHT_SWITCH (VC): rotation axis
local VC_FLOODLIGHT_SWITCH_axis = _V(1.00000,0.00000,0.00000)
local VC_FLOODLIGHT_SWITCH_vofs = 99

-- FLOOD_BRIGHTNESS (VC): mouse catch area
local VC_FLOOD_BRIGHTNESS_mousearea = {_V(-0.09081,1.65484,6.92419),_V(-0.07121,1.65484,6.92419),_V(-0.09081,1.65992,6.90526),_V(-0.07121,1.65992,6.90526)}

-- FLOOD_BRIGHTNESS (VC): rotation reference
local VC_FLOOD_BRIGHTNESS_ref = _V(-0.08101,1.65738,6.91473)

-- FLOOD_BRIGHTNESS (VC): rotation axis
local VC_FLOOD_BRIGHTNESS_axis = _V(0.00000,0.96593,0.25882)

local CockpitLight = Class(DGSubsystem)

function CockpitLight:new (_subsys)
DGSubsystem.new(self, _subsys)
self.light = nil
self.light_mode = 0
self.brightness = 0.7

self.ELID_SWITCH, self.sw = self:AddElement (CockpitLightSwitch (self))
self.ELID_DIAL, self.dial = self:AddElement (CockpitBrightnessDial (self))

-- Floodlight brightness dial animation
local FloodBDialTransform = MGROUP_ROTATE (1, {GRP_VC.FLOOD_BRIGHTNESS}, VC_FLOOD_BRIGHTNESS_ref, VC_FLOOD_BRIGHTNESS_axis, -280*RAD)
self.anim_dial = self:DG():create_animation (0.5)
self:DG():add_animationcomponent (self.anim_dial, 0, 1, FloodBDialTransform)
end

--------------------------------------------------------------
local zero = _COLOUR4(0.0,0.0,0.0,0.0)
local wcol = _COLOUR4(1.0,1.0,1.0,0.0)
local rcol = _COLOUR4(0.6,0.05,0.0,0.0)
local att = {
range = 3,
att0 = 0,
att1 = 0,
att2 = 3
}

function CockpitLight:SetLight (mode, force)
if mode == self.light_mode and not force then return end -- nothing to do

if mode ~= self.light_mode then
self.light_mode = mode
self.sw:SetState (mode == 0 and DGSwitch1.CENTER or (mode == 1 and DGSwitch1.UP or DGSwitch1.DOWN))
self:DG():trigger_redrawarea(1, 0, self.ELID_SWITCH)
end

if self.light then
self:DG():del_lightemitter (self.light)
self.light = nil
end
if mode ~= 0 then
local col = (mode == 1 and wcol or rcol)
self.light = self:DG():add_pointlight(_V(0,1.65,6.68), att, col, col, zero)
self.light:set_visibility (VIS.COCKPIT)
self.light:activate(true)
local intens = 0.2 + self.brightness*0.8
self.light:set_intensity (intens)
end
end

--------------------------------------------------------------

function CockpitLight:ModBrightness (up)
local dt = oapi.get_simstep()
local db = dt * (up and 0.3 or -0.3)
self.brightness = math.max(0.0, math.min (1.0, self.brightness + db))
self:DG():set_animation (self.anim_dial, self.brightness)
if self.light_mode ~= 0 then
self:SetLight (self.light_mode, true)
end
end

--------------------------------------------------------------

function CockpitLight:clbkSaveState (scn)
if self.light_mode ~= 0 or self.brightness ~= 0.7 then
oapi.writescenario_string (scn, "FLOODLIGHT", string.format("%d %0.2f", self.light_mode, self.brightness))
end
end

--------------------------------------------------------------

function CockpitLight:clbkParseScenarioLine (line)
local match = {}
if scenario_line_match(line, "FLOODLIGHT %d %f", match) then
self.light_mode = math.max (0, math.min (2, math.res[1]))
self.brightness = math.max (0, math.min (1, math.res[2]))
return true
end
return false
end

--------------------------------------------------------------

function CockpitLight:clbkLoadVC (vcid)
if vcid ~= 0 then return false end

-- Floodlight switch
oapi.VC_register_area (self.ELID_SWITCH, PANEL_REDRAW.MOUSE, PANEL_MOUSE.LBDOWN)
oapi.VC_set_areaclickmode_quadrilateral (self.ELID_SWITCH, VC_FLOODLIGHT_SWITCH_mousearea)
self.sw:DefineAnimationVC (VC_FLOODLIGHT_SWITCH_ref, VC_FLOODLIGHT_SWITCH_axis, GRP_VC.SWITCH1, VC_FLOODLIGHT_SWITCH_vofs)

-- Floodlight brightness dial
oapi.VC_register_area (self.ELID_DIAL, PANEL_REDRAW.NEVER, PANEL_MOUSE.LBDOWN + PANEL_MOUSE.LBPRESSED + PANEL_MOUSE.LBUP)
oapi.VC_set_areaclickmode_quadrilateral (self.ELID_DIAL, VC_FLOOD_BRIGHTNESS_mousearea)

return true
end

function CockpitLight:clbkResetVC (vcid, hMesh)
self:SetLight (self.light_mode, true)
self:DG():set_animation (self.anim_dial, self.brightness)
end

function CockpitLight:GetLight ()
return self.light_mode
end

return CockpitLight
28 changes: 28 additions & 0 deletions Orbitersdk/samples/Lua/DeltaGlider/Src/CockpitLightSwitch.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
local DGSwitch1 = require("DGSwitch1")

local CockpitLightSwitch = Class(DGSwitch1)

function CockpitLightSwitch:new (comp)
DGSwitch1.new(self, comp:DG(), DGSwitch1.THREESTATE)
self.component = comp
end

--------------------------------------------------------------

function CockpitLightSwitch:ResetVC (hMesh)
self:SetState (self.component:GetLight())
DGSwitch1.ResetVC (self, hMesh)
end

--------------------------------------------------------------

function CockpitLightSwitch:ProcessMouseVC (event, p)
if DGSwitch1.ProcessMouseVC (self, event, p) then
local state = self:GetState()
self.component:SetLight (state)
return true
end
return false
end

return CockpitLightSwitch
6 changes: 3 additions & 3 deletions Orbitersdk/samples/Lua/DeltaGlider/Src/ComponentVessel.lua
Original file line number Diff line number Diff line change
Expand Up @@ -181,11 +181,11 @@ end
function ComponentVessel:clbkConsumeDirectKey(kstate)
for _, v in ipairs(self.ssys) do
local res = v:clbkConsumeDirectKey(kstate)
if res ~= 0 then
return res
if res then
return true
end
end
return 0
return false
end

function ComponentVessel:GetSsysId()
Expand Down
7 changes: 6 additions & 1 deletion Orbitersdk/samples/Lua/DeltaGlider/Src/DGSwitch1.lua
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ local th = 52.0/1024.0

function DGSwitch1:new (v, m)
PanelElement.new(self, v)

if m == nil then
m = DGSwitch1.TWOSTATE
end

self.mode = m
-- we always initiate as centered, even for 2state switches
self.state = DGSwitch1.CENTER
Expand Down Expand Up @@ -139,7 +144,7 @@ end

function DGSwitch1:Redraw2D (surf)
if self.state ~= self.vstate2 then
for i=1, 4 do
for i=1,4 do
self.grp.Vtx[self.vofs+i].tu = tu0[self.state+1] + (i%2 ~= 0 and tw or 0)
end
self.vstate2 = self.state
Expand Down
64 changes: 35 additions & 29 deletions Orbitersdk/samples/Lua/DeltaGlider/Src/Deltaglider.lua
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ local RcsSubsystem = require("RcsSubsystem")
local HoverSubsystem = require("HoverSubsystem")
local HUDControl = require("HUDControl")
local AvionicsSubsystem = require("AvionicsSubsystem")
local LightCtrlSubsystem = require("LightCtrlSubsystem")

local EMPTY_MASS = 11000.0 -- standard configuration
local EMPTY_MASS_SC = 13000.0 -- ramjet configuration
Expand Down Expand Up @@ -218,7 +219,7 @@ function DeltaGlider:new(fmodel)
-- self.ssys_pressurectrl = self:AddSubsystem(PressureSubsystem (self))
-- self.ssys_thermal = self:AddSubsystem(ThermalSubsystem (self))
-- self.ssys_docking = self:AddSubsystem(DockingCtrlSubsystem (self))
-- self.ssys_light = self:AddSubsystem(LightCtrlSubsystem (self))
self.ssys_light = self:AddSubsystem(LightCtrlSubsystem (self))
self.ssys_avionics = self:AddSubsystem(AvionicsSubsystem (self))
-- self.ssys_failure = self:AddSubsystem(FailureSubsystem (self))

Expand Down Expand Up @@ -1164,24 +1165,28 @@ function DeltaGlider:clbkSetClassCaps (cfg)
-- ************************* mesh ***************************

-- ********************* beacon lights **********************
--[[
static VECTOR3 beaconpos[8] = {{-8.6,0,-3.3}, {8.6,0,-3.3}, {0,0.5,-7.5}, {0,2.2,2}, {0,-1.4,2}, {-8.9,2.5,-5.4}, {8.9,2.5,-5.4}, {2.5,-0.5,6.5}};
static VECTOR3 beaconpos_scram = {0,-1.8,2};
static VECTOR3 beaconcol[8] = {{1.0,0.5,0.5}, {0.5,1.0,0.5}, {1,1,1}, {1,0.6,0.6}, {1,0.6,0.6}, {1,1,1}, {1,1,1} , {1,1,1}};
for (i = 0; i < 8; i++) {
beacon[i].shape = (i < 3 ? BEACONSHAPE_DIFFUSE : BEACONSHAPE_STAR);
beacon[i].pos = beaconpos+i;
beacon[i].col = beaconcol+i;
beacon[i].size = (i < 3 || i == 7 ? 0.3 : 0.55);
beacon[i].falloff = (i < 3 ? 0.4 : 0.6);
beacon[i].period = (i < 3 ? 0 : i < 5 ? 2 : i < 7 ? 1.13 : 0);
beacon[i].duration = (i < 5 ? 0.1 : 0.05);
beacon[i].tofs = (6-i)*0.2;
beacon[i].active = false;
AddBeacon (beacon+i);
}
if (ssys_scram) beacon[4].pos = &beaconpos_scram;
]]
local beaconpos = {_V(-8.6,0,-3.3), _V(8.6,0,-3.3), _V(0,0.5,-7.5), _V(0,2.2,2), _V(0,-1.4,2), _V(-8.9,2.5,-5.4), _V(8.9,2.5,-5.4), _V(2.5,-0.5,6.5)}
local beaconpos_scram = _V(0,-1.8,2)
local beaconcol = {_V(1.0,0.5,0.5), _V(0.5,1.0,0.5), _V(1,1,1), _V(1,0.6,0.6), _V(1,0.6,0.6), _V(1,1,1), _V(1,1,1) , _V(1,1,1)}
self.beacon = {}
for i=1,8 do
self.beacon[i] = oapi.create_beacon({
shape = i < 4 and BEACONSHAPE.DIFFUSE or BEACONSHAPE.STAR,
pos = beaconpos[i],
col = beaconcol[i],
size = (i < 4 or i == 8) and 0.3 or 0.55,
falloff = i < 4 and 0.4 or 0.6,
period = i < 4 and 0 or (i < 6 and 2 or (i < 8 and 1.13 or 0)),
duration = i < 6 and 0.1 or 0.05,
tofs = (6-i-1)*0.2,
active = false
})
self:add_beacon (self.beacon[i])
end
if self.ssys_scram then
beacon[5].pos = beaconpos_scram
end

self.exmesh_tpl = oapi.load_mesh_global(self:ScramVersion() and "DG/deltaglider" or "DG/deltaglider_ns")
self:set_mesh_visibility_mode (self:add_mesh (self.exmesh_tpl), MESHVIS.EXTERNAL)
self.panelmesh0 = oapi.load_mesh_global ("DG/dg_2dpanel0")
Expand Down Expand Up @@ -1250,14 +1255,15 @@ function DeltaGlider:clbkSaveState (scn)
if self.panelcol ~= 0 then
oapi.writescenario_int (scn, "PANELCOL", self.panelcol)
end
--[[
for (i = 0; i < 8; i++)
if (beacon[i].active) {
snprintf (cbuf, sizeof(cbuf) - 1, "%d %d %d %d", beacon[0].active, beacon[3].active, beacon[5].active, beacon[7].active);
oapiWriteScenario_string (scn, (char*)"LIGHTS", cbuf);
break;
}
]]

local written = false
for i=1,8 do
if self.beacon[i].active and not written then
local cbuf = string.format("%d %d %d %d", self.beacon[1].active, self.beacon[4].active, self.beacon[6].active, self.beacon[8].active)
oapi.writescenario_string (scn, "LIGHTS", cbuf)
written = true
end
end
if self.tankconfig ~= 0 then
oapi.writescenario_int (scn, "TANKCONFIG", self.tankconfig)
end
Expand Down Expand Up @@ -1628,8 +1634,8 @@ end
-- Process buffered key events
-- --------------------------------------------------------------
function DeltaGlider:clbkConsumeBufferedKey (key, down, kstate)
if not down then return 0 end -- only process keydown events
if self:playback() then return 0 end -- don't allow manual user input during a playback
if not down then return false end -- only process keydown events
if self:playback() then return false end -- don't allow manual user input during a playback

return ComponentVessel.clbkConsumeBufferedKey (self, key, down, kstate)
end
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
local PanelElement = require("PanelElement")

local InstrumentBrightnessDial = Class(PanelElement)


function InstrumentBrightnessDial:new (comp)
PanelElement.new(self, comp:DG())
self.component = comp
end

--------------------------------------------------------------

function InstrumentBrightnessDial:ProcessMouseVC (event, p)
self.component:ModBrightness (p.x > 0.5)
return true
end


return InstrumentBrightnessDial
Loading

0 comments on commit 843e834

Please sign in to comment.