aboutsummaryrefslogtreecommitdiff
path: root/src/scenes/speck_editor.lua
blob: 1484abec917db65e9612bbdc45417f414bbdb5e4 (plain)
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
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
  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