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"
10 #include "level_editor.h"
17 ColorPicker color_picker;
21 LevelEditor *create_level_editor(Boxes *boxes)
23 LevelEditor *level_editor = nth_calloc(1, sizeof(LevelEditor));
24 if (level_editor == NULL) {
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;
38 void destroy_level_editor(LevelEditor *level_editor)
40 trace_assert(level_editor);
44 int level_editor_render(const LevelEditor *level_editor,
47 trace_assert(level_editor);
50 if (proto_rect_render(&level_editor->proto_rect, camera) < 0) {
54 if (color_picker_render(&level_editor->color_picker, camera) < 0) {
61 int level_editor_update(LevelEditor *level_editor,
64 trace_assert(level_editor);
66 if (proto_rect_update(&level_editor->proto_rect, delta_time) < 0) {
73 int level_editor_event(LevelEditor *level_editor,
74 const SDL_Event *event,
77 trace_assert(level_editor);
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));
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);
98 &level_editor->proto_rect,
101 level_editor->boxes) < 0) {
105 if (color_picker_event(&level_editor->color_picker, event) < 0) {
112 int level_editor_focus_camera(LevelEditor *level_editor,
115 camera_center_at(camera, level_editor->camera_position);
116 camera_scale(camera, level_editor->camera_scale);