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