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
|
register_comp("Speck_Editor", function(editor)
editor.filepath = "res/speck/test.speck.lua"
add_comp(editor, "Speck_System", editor.filepath)
end)
local PROPERTY_CUSTOM = {
spawn_shape = { "Point", "Circle", "Rectangle" },
spawn_amount_min = { min = 1, max = 64, step = 1 },
spawn_amount_max = { min = 1, max = 64, step = 1 },
spawn_width = { min = 0, max = 1024, step = 1 },
spawn_height = { min = 0, max = 1024, step = 1 },
spawn_radius = { min = 0, max = 1024, step = 1 },
scale_curve = {},
scale_start_min = { min = 0, max = 16 },
scale_start_max = { min = 0, max = 16 },
forcex = { min = -2048, max = 2048 },
forcey = { min = -2048, max = 2048 },
damping = { min = 0, max = 128 },
initial_velx_max = { min = 0, max = 2048 },
initial_velx_min = { min = 0, max = 2048 },
initial_vely_max = { min = 0, max = 2048 },
initial_vely_min = { min = 0, max = 2048 },
spread = { min = 0, max = 360 },
lifetime_min = { min = 0, max = 32 },
lifetime_max = { min = 0, max = 32 },
interval = { min = 0, max = 32, step = 0.01 },
texture_path = { is_file = true, directory = "res/img/" },
gradient = { is_file = true, directory = "res/img/" },
}
for key, _ in pairs(EASING_FUNCTIONS) do
PROPERTY_CUSTOM.scale_curve[#PROPERTY_CUSTOM.scale_curve + 1] = key
end
local PROPERTY_TYPES = {
["number"] = function(props, name, value, custom)
custom = custom or {}
im.layout({ 0.5, 1 })
im.text(name)
im.text(tostring(value))
im.layout()
props[name] = im.slider(
value, custom.min or 0, custom.max or 1, custom.step or 0.1)
end,
["boolean"] = function(props, name, value)
im.layout({ 0.25, 0.5, 1 })
im.text(name)
im.text(tostring(value))
if im.button("Toggle") then
props[name] = not value
end
im.layout()
end,
["string"] = function(props, name, value, custom)
im.layout({ 0.25, 0.8, 1 })
im.text(name)
im.text(value)
if custom.is_file then
if im.button("Change") then
lw.showFileDialog("openfile", function(files, _, _)
if not files[1] or files[1] == "" then
return
end
props[name] = trunc_filename_to_res(files[1])
end, { defaultname = custom.directory or "" })
end
end
im.layout()
end,
}
local function save(editor)
export_speck_sys(editor.speck_sys, editor.filepath)
end
local function speck_editor_ui_sys(editor)
local system = editor.speck_sys
im.begin_window("Speck Editor", 5, 5, 400, 1024, {})
im.text("Properties:")
for _, prop in ipairs(SPECK_EXPORTED_ARGS) do
local func = PROPERTY_TYPES[type(system[prop])]
if func then
func(editor.speck_sys, prop, system[prop], PROPERTY_CUSTOM[prop])
end
end
im.text("File:")
if im.button("Open") then
editor.filepath = lw.showFileDialog("savefile", function(files, _, _)
if not files[1] or files[1] == "" then
return
end
editor.filepath = trunc_filename_to_res(files[1])
editor.speck_sys = load_speck_sys_non_cached(editor.filepath)
end, { defaultname = "res/speck/" })
end
if im.button("Save as") then
editor.filepath = lw.showFileDialog("savefile", function(files, _, _)
if not files[1] or files[1] == "" then
return
end
editor.filepath = trunc_filename_to_res(files[1])
save(editor)
end, { defaultname = "res/speck/" })
end
if im.button("Save") then
save(editor)
end
im.end_window()
end
function start_speck_editor()
local scn = new_scene()
set_scene(scn)
event_bind(scn.on_update, "Speck_System", speck_update_sys)
event_bind(scn.on_draw, "Speck_System", speck_draw_sys)
event_bind(scn.on_ui, "Speck_Editor", speck_editor_ui_sys)
local editor = new_entity()
add_comp(editor, "Position", SCR_WIDTH / 2, SCR_HEIGHT / 2)
add_comp(editor, "Speck_Editor")
return scn
end
|