]> git.lizzy.rs Git - nothing.git/blob - src/game/level/level_editor.c
(#779) Implement ColorPicker
[nothing.git] / src / game / level / level_editor.c
1 #include <stdbool.h>
2
3 #include "game/camera.h"
4 #include "game/level/boxes.h"
5 #include "game/level/level_editor/proto_rect.h"
6 #include "game/level/level_editor/color_picker.h"
7 #include "system/stacktrace.h"
8 #include "system/nth_alloc.h"
9
10 #include "level_editor.h"
11
12 struct LevelEditor
13 {
14     Vec camera_position;
15     float camera_scale;
16     ProtoRect proto_rect;
17     ColorPicker color_picker;
18     Boxes *boxes;
19 };
20
21 LevelEditor *create_level_editor(Boxes *boxes)
22 {
23     LevelEditor *level_editor = nth_calloc(1, sizeof(LevelEditor));
24     if (level_editor == NULL) {
25         return NULL;
26     }
27
28     level_editor->camera_position = vec(0.0f, 0.0f);
29     level_editor->camera_scale = 1.0f;
30     level_editor->boxes = boxes;
31     level_editor->proto_rect.color = rgba(1.0f, 0.0f, 0.0f, 1.0f);
32     level_editor->color_picker.position = vec(0.0f, 0.0f);
33     level_editor->color_picker.proto_rect = &level_editor->proto_rect;
34
35     return level_editor;
36 }
37
38 void destroy_level_editor(LevelEditor *level_editor)
39 {
40     trace_assert(level_editor);
41     free(level_editor);
42 }
43
44 int level_editor_render(const LevelEditor *level_editor,
45                         Camera *camera)
46 {
47     trace_assert(level_editor);
48     trace_assert(camera);
49
50     if (proto_rect_render(&level_editor->proto_rect, camera) < 0) {
51         return -1;
52     }
53
54     if (color_picker_render(&level_editor->color_picker, camera) < 0) {
55         return -1;
56     }
57
58     return 0;
59 }
60
61 int level_editor_update(LevelEditor *level_editor,
62                         float delta_time)
63 {
64     trace_assert(level_editor);
65
66     if (proto_rect_update(&level_editor->proto_rect, delta_time) < 0) {
67         return -1;
68     }
69
70     return 0;
71 }
72
73 int level_editor_event(LevelEditor *level_editor,
74                        const SDL_Event *event,
75                        const Camera *camera)
76 {
77     trace_assert(level_editor);
78     trace_assert(event);
79
80     switch (event->type) {
81     case SDL_MOUSEMOTION: {
82         const float sens = 1.0f / level_editor->camera_scale * 0.25f;
83         vec_add(&level_editor->camera_position,
84                 vec((float) event->motion.xrel * sens, (float) event->motion.yrel * sens));
85     } break;
86
87     case SDL_MOUSEWHEEL: {
88         // TODO(#679): zooming in edit mode is not smooth enough
89         if (event->wheel.y > 0) {
90             level_editor->camera_scale += 0.1f;
91         } else if (event->wheel.y < 0) {
92             level_editor->camera_scale = fmaxf(0.1f, level_editor->camera_scale - 0.1f);
93         }
94     } break;
95     }
96
97     if (proto_rect_event(
98             &level_editor->proto_rect,
99             event,
100             camera,
101             level_editor->boxes) < 0) {
102         return -1;
103     }
104
105     if (color_picker_event(&level_editor->color_picker, event) < 0) {
106         return -1;
107     }
108
109     return 0;
110 }
111
112 int level_editor_focus_camera(LevelEditor *level_editor,
113                               Camera *camera)
114 {
115     camera_center_at(camera, level_editor->camera_position);
116     camera_scale(camera, level_editor->camera_scale);
117     return 0;
118 }