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) if custom.is_file then im.layout({ 0.25, 0.8, 1 }) else im.layout({ 0.5, 1 }) end 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 "", attachtowindow = true }) 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/", attachtowindow = true }) 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/", attachtowindow = true }) 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", 0, 0) add_comp(editor, "Speck_Editor") return scn end