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 "game/level/level_editor/layer.h"
8 #include "system/stacktrace.h"
9 #include "system/nth_alloc.h"
10 #include "system/lt.h"
12 #include "level_editor.h"
14 // TODO(#802): Level Editor should modify boxes_layer instead of boxes
21 ColorPicker color_picker;
22 // TODO: boxes_layer is not connected with the level->boxes
27 LevelEditor *create_level_editor(void)
34 LevelEditor *level_editor = PUSH_LT(lt, nth_calloc(1, sizeof(LevelEditor)), free);
35 if (level_editor == NULL) {
38 level_editor->lt = lt;
40 level_editor->camera_position = vec(0.0f, 0.0f);
41 level_editor->camera_scale = 1.0f;
42 level_editor->proto_rect.color = rgba(1.0f, 0.0f, 0.0f, 1.0f);
43 level_editor->color_picker.position = vec(0.0f, 0.0f);
44 level_editor->color_picker.proto_rect = &level_editor->proto_rect;
45 level_editor->boxes_layer = PUSH_LT(lt, create_layer(), destroy_layer);
47 if (level_editor->boxes_layer == NULL) {
51 level_editor->drag = false;
56 void destroy_level_editor(LevelEditor *level_editor)
58 trace_assert(level_editor);
59 RETURN_LT0(level_editor->lt);
62 int level_editor_render(const LevelEditor *level_editor,
65 trace_assert(level_editor);
68 if (layer_render(level_editor->boxes_layer, camera) < 0) {
72 if (proto_rect_render(&level_editor->proto_rect, camera) < 0) {
76 if (color_picker_render(&level_editor->color_picker, camera) < 0) {
83 int level_editor_update(LevelEditor *level_editor,
86 trace_assert(level_editor);
88 if (proto_rect_update(&level_editor->proto_rect, delta_time) < 0) {
95 int level_editor_event(LevelEditor *level_editor,
96 const SDL_Event *event,
99 trace_assert(level_editor);
104 switch (event->type) {
105 case SDL_MOUSEWHEEL: {
106 // TODO(#679): zooming in edit mode is not smooth enough
107 if (event->wheel.y > 0) {
108 level_editor->camera_scale += 0.1f;
109 } else if (event->wheel.y < 0) {
110 level_editor->camera_scale = fmaxf(0.1f, level_editor->camera_scale - 0.1f);
114 case SDL_MOUSEBUTTONUP:
115 case SDL_MOUSEBUTTONDOWN: {
116 if (event->type == SDL_MOUSEBUTTONUP) {
117 const Vec position = camera_map_screen(camera, event->button.x, event->button.y);
118 if (layer_delete_rect_at(level_editor->boxes_layer, position) < 0) {
123 bool selected = false;
124 if (color_picker_mouse_button(
125 &level_editor->color_picker,
131 if (!selected && proto_rect_mouse_button(
132 &level_editor->proto_rect,
134 level_editor->boxes_layer,
139 if (event->type == SDL_MOUSEBUTTONDOWN && event->button.button == SDL_BUTTON_MIDDLE) {
140 level_editor->drag = true;
143 if (event->type == SDL_MOUSEBUTTONUP && event->button.button == SDL_BUTTON_MIDDLE) {
144 level_editor->drag = false;
148 case SDL_MOUSEMOTION: {
149 if (level_editor->drag) {
150 const Vec next_position = camera_map_screen(camera, event->motion.x, event->motion.y);
151 const Vec prev_position = camera_map_screen(
153 event->motion.x + event->motion.xrel,
154 event->motion.y + event->motion.yrel);
156 vec_add(&level_editor->camera_position,
157 vec_sub(next_position, prev_position));
160 if (proto_rect_mouse_motion(&level_editor->proto_rect, &event->motion, camera) < 0) {
169 int level_editor_focus_camera(LevelEditor *level_editor,
172 camera_center_at(camera, level_editor->camera_position);
173 camera_scale(camera, level_editor->camera_scale);