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
|
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 = {min = 0, max = 2048},
initial_vely = {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 = {},
gradient = {},
}
for key, _ in pairs(EASING_FUNCTIONS) do
PROPERTY_CUSTOM.scale_curve[#PROPERTY_CUSTOM.scale_curve+1] = key
end
local PROPERTY_TYPES = {
["number"] = function (name, value, custom)
custom = custom or {}
im.layout({0.5, 1})
im.text(name)
im.text(tostring(value))
im.layout()
return im.slider(value, custom.min or 0, custom.max or 1, custom.step or 0.1)
end,
["boolean"] = function (name, value, _)
im.layout({0.25, 0.5, 1})
im.text(name)
im.text(tostring(value))
if im.button("Toggle") then
return not value
end
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, 256, 1024, {})
im.text("Properties:")
for _, prop in ipairs(SPECK_EXPORTED_ARGS) do
local func = PROPERTY_TYPES[type(system[prop])]
if func then
system[prop] = func(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
|