File size: 4,093 Bytes
b6a38d7 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
DefineClass.XCabinetBase =
{
__parents = {"XDialog"},
properties = {
{ category = "Scene", id = "HideDialogs", name = "Hide Dialogs", editor = "bool", default = true },
{ category = "Scene", id = "LeaveDialogsOpen", editor = "string_list", default = {}, items = ListAllDialogs, arbitrary_value = true, },
{ category = "Scene", id = "InitialDialogMode", name = "Initial Dialog Mode", editor = "text", default = false },
{ category = "Scene", id = "Lightmodel", name = "Lightmodel", editor = "combo", items = LightmodelsCombo, default = false },
{ category = "Scene", id = "SetupScene", name = "Setup Scene", editor = "func", params = "self", default = function() end },
{ category = "Scene", id = "RestorePrevScene", name = "Restore Prev Scene", editor = "func", params = "self", default = function() end },
},
hidden_meshes = false,
fadeinout = true,
restore_light_model = false,
lightmodel_cubemaps = false,
}
function XCabinetBase:Init()
if self.fadeinout then
XDialog:new({
Id = "idFade",
ZOrder = 1000,
Visible = false,
Background = RGBA(0, 0, 0, 255),
FadeInTime = 300,
FadeOutTime = 300,
RolloverZoomInTime = 1000,
RolloverZoomOutTime = 1000,
}, self)
end
end
function XCabinetBase:Transition(opening, inout)
if opening == "open" and inout == "begin" then
self.idFade:SetVisible(true)
SetRolloverEnabled(false)
Sleep(self.idFade.FadeInTime)
WaitNextFrame(5)
elseif opening == "open" and inout == "end" then
self.idFade:SetVisible(false)
SetRolloverEnabled(true)
elseif opening == "close" and inout == "begin" then
self.idFade:SetVisible(true)
Sleep(self.idFade.FadeInTime)
WaitNextFrame(5)
elseif opening == "close" and inout == "end" then
self.idFade:SetVisible(false)
-- delete all children except for idFade
for i = #self, 1, -1 do
if self[i].Id ~= "idFade" then
self[i]:delete()
end
end
Sleep(self.idFade.FadeOutTime)
end
end
function XCabinetBase:CabinetRoutine()
end
function XCabinetBase:Open(...)
XDialog.Open(self, ...)
self:CreateThread("SetupScene", function()
self:Transition("open", "begin")
if self.Lightmodel then
-- We need to override the wind that is to come with the current wind, as it is sync.
WindOverride = CurrentWindAnimProps()
if LightmodelOverride then
self.restore_light_model = LightmodelOverride
end
self.lightmodel_cubemaps = PreloadLightmodelCubemaps(self.Lightmodel)
SetLightmodelOverride(1, self.Lightmodel)
end
if self.HideDialogs then
XHideDialogs:new({Id = "idHideDialogs", LeaveDialogIds = self.LeaveDialogsOpen}, self):Open()
end
-- Hide everything on the map
self.hidden_meshes = {}
MapForEach("map", "Mesh", function(o)
if o:GetEnumFlags(const.efVisible) ~= 0 then
self.hidden_meshes[#self.hidden_meshes + 1] = o
o:ClearEnumFlags(const.efVisible)
end
end)
self:SetupScene()
if self.InitialDialogMode then
self:SetMode(self.InitialDialogMode)
end
self:Transition("open", "end")
self:CabinetRoutine()
end)
end
function XCabinetBase:Close(...)
local force = ...
if force then
self:OnCloseAfterBlackFadeIn()
self:OnCloseAfterBlackFadeOut()
XDialog.Close(self)
return
end
self:CreateThread("SetupScene", function()
self:Transition("close", "begin")
self:OnCloseAfterBlackFadeIn()
if self:HasMember("idHideDialogs") and self.idHideDialogs.window_state ~= "destroying" then
self.idHideDialogs:delete()
end
self:Transition("close", "end")
self:OnCloseAfterBlackFadeOut()
XDialog.Close(self)
end)
end
function XCabinetBase:OnCloseAfterBlackFadeIn()
self:RestorePrevScene()
if self.Lightmodel then
if self.lightmodel_cubemaps then
self.lightmodel_cubemaps:Done()
self.lightmodel_cubemaps = false
end
SetLightmodelOverride(1, self.restore_light_model)
WindOverride = false
end
end
function XCabinetBase:OnCloseAfterBlackFadeOut()
if not self.hidden_meshes then return end
-- Restore hidden meshes
for _, mesh in ipairs(self.hidden_meshes) do
if IsValid(mesh) then
mesh:SetEnumFlags(const.efVisible)
end
end
end |