aboutsummaryrefslogtreecommitdiff
path: root/src/scenes/speck_editor.lua
blob: 96176d055b759b6c1ca47c63652c4eac72340a0c (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
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},
  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:")
    -- TODO: implement these guys
    im.button("New")
    im.button("Open")

    if im.button("Save as") then
      save(editor)
    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