]> git.lizzy.rs Git - nothing.git/commitdiff
(#779) Implement ColorPicker
authorrexim <reximkut@gmail.com>
Sun, 7 Apr 2019 19:20:48 +0000 (02:20 +0700)
committerrexim <reximkut@gmail.com>
Sun, 7 Apr 2019 19:21:46 +0000 (02:21 +0700)
CMakeLists.txt
src/game/camera.c
src/game/camera.h
src/game/level/level_editor.c
src/game/level/level_editor/color_picker.c [new file with mode: 0644]
src/game/level/level_editor/color_picker.h [new file with mode: 0644]

index 76ec15cdb84e0da241c66533982c6bcf349902d9..8c271cc06cd781d6a8a9548cacc6a5e6a1a03e52 100644 (file)
@@ -151,6 +151,8 @@ add_executable(nothing
   src/game/level/level_editor/proto_rect.c
   src/game/level/level_editor.h
   src/game/level/level_editor.c
+  src/game/level/level_editor/color_picker.h
+  src/game/level/level_editor/color_picker.c
 )
 
 add_executable(svg2level
index 90b2c6db428188259d039859b4a3168532c03102..4019d1ed332315a5673d63ff05e03f55289b112c 100644 (file)
@@ -421,3 +421,33 @@ Vec camera_map_screen(const Camera *camera,
             es),
         camera->position);
 }
+
+int camera_fill_rect_screen(Camera *camera,
+                            Rect rect,
+                            Color color)
+{
+    trace_assert(camera);
+
+    const SDL_Rect sdl_rect = rect_for_sdl(rect);
+    const SDL_Color sdl_color = color_for_sdl(camera->blackwhite_mode ? color_desaturate(color) : color);
+
+    if (camera->debug_mode) {
+        if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a / 2) < 0) {
+            log_fail("SDL_SetRenderDrawColor: %s\n", SDL_GetError());
+            return -1;
+        }
+    } else {
+        if (SDL_SetRenderDrawColor(camera->renderer, sdl_color.r, sdl_color.g, sdl_color.b, sdl_color.a) < 0) {
+            log_fail("SDL_SetRenderDrawColor: %s\n", SDL_GetError());
+            return -1;
+        }
+    }
+
+    if (SDL_RenderFillRect(camera->renderer, &sdl_rect) < 0) {
+        log_fail("SDL_RenderFillRect: %s\n", SDL_GetError());
+        return -1;
+    }
+
+    return 0;
+
+}
index c546d202a8937a8bfafd33d0cd2603b0c70e4011..1a9c6b4e33c8cb7dd9df60f900a99c7da9cfa2da 100644 (file)
@@ -65,4 +65,8 @@ Rect camera_view_port(const Camera *camera);
 Vec camera_map_screen(const Camera *camera,
                       Sint32 x, Sint32 y);
 
+int camera_fill_rect_screen(Camera *camera,
+                            Rect rect,
+                            Color color);
+
 #endif  // CAMERA_H_
index eabebc18c84bc7ec3cfb26e74b3d6e9af225888a..75c3a39a549be85609772bdc177874712e9ba4ae 100644 (file)
@@ -3,6 +3,7 @@
 #include "game/camera.h"
 #include "game/level/boxes.h"
 #include "game/level/level_editor/proto_rect.h"
+#include "game/level/level_editor/color_picker.h"
 #include "system/stacktrace.h"
 #include "system/nth_alloc.h"
 
@@ -13,16 +14,23 @@ struct LevelEditor
     Vec camera_position;
     float camera_scale;
     ProtoRect proto_rect;
+    ColorPicker color_picker;
     Boxes *boxes;
 };
 
 LevelEditor *create_level_editor(Boxes *boxes)
 {
     LevelEditor *level_editor = nth_calloc(1, sizeof(LevelEditor));
+    if (level_editor == NULL) {
+        return NULL;
+    }
+
     level_editor->camera_position = vec(0.0f, 0.0f);
     level_editor->camera_scale = 1.0f;
     level_editor->boxes = boxes;
     level_editor->proto_rect.color = rgba(1.0f, 0.0f, 0.0f, 1.0f);
+    level_editor->color_picker.position = vec(0.0f, 0.0f);
+    level_editor->color_picker.proto_rect = &level_editor->proto_rect;
 
     return level_editor;
 }
@@ -43,6 +51,10 @@ int level_editor_render(const LevelEditor *level_editor,
         return -1;
     }
 
+    if (color_picker_render(&level_editor->color_picker, camera) < 0) {
+        return -1;
+    }
+
     return 0;
 }
 
@@ -90,6 +102,10 @@ int level_editor_event(LevelEditor *level_editor,
         return -1;
     }
 
+    if (color_picker_event(&level_editor->color_picker, event) < 0) {
+        return -1;
+    }
+
     return 0;
 }
 
diff --git a/src/game/level/level_editor/color_picker.c b/src/game/level/level_editor/color_picker.c
new file mode 100644 (file)
index 0000000..fde83bf
--- /dev/null
@@ -0,0 +1,76 @@
+#include <stdbool.h>
+
+#include "game/level/boxes.h"
+#include "system/stacktrace.h"
+#include "game/camera.h"
+#include "proto_rect.h"
+#include "color_picker.h"
+#include "color.h"
+
+#define COLOR_CELL_WIDTH 50.0f
+#define COLOR_CELL_HEIGHT 50.0f
+
+// TODO: Colors of ColorPicker are poor
+static Color colors[] = {
+    {1.0f, 0.0f, 0.0f, 1.0f},
+    {0.0f, 1.0f, 0.0f, 1.0f},
+    {0.0f, 0.0f, 1.0f, 1.0f}
+};
+static const size_t colors_count = sizeof(colors) / sizeof(Color);
+
+int color_picker_render(const ColorPicker *color_picker,
+                        Camera *camera)
+{
+    trace_assert(color_picker);
+    trace_assert(camera);
+
+    for (size_t i = 0; i < colors_count; ++i) {
+        if (camera_fill_rect_screen(
+                camera,
+                rect(COLOR_CELL_WIDTH * (float) i, 0,
+                     COLOR_CELL_WIDTH,
+                     COLOR_CELL_HEIGHT),
+                colors[i]) < 0) {
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+int color_picker_update(ColorPicker *color_picker,
+                        float delta_time)
+{
+    trace_assert(color_picker);
+    (void) delta_time;
+    return 0;
+}
+
+int color_picker_event(ColorPicker *color_picker,
+                       const SDL_Event *event)
+{
+    trace_assert(color_picker);
+    trace_assert(event);
+
+    switch (event->type) {
+    case SDL_MOUSEBUTTONDOWN: {
+        switch (event->button.button) {
+        case SDL_BUTTON_LEFT: {
+            for (size_t i = 0; i < colors_count; ++i) {
+                const Vec mouse_position = vec((float) event->button.x, (float) event->button.y);
+                const Rect color_cell =
+                    rect(COLOR_CELL_WIDTH * (float) i, 0,
+                         COLOR_CELL_WIDTH,
+                         COLOR_CELL_HEIGHT);
+                if (rect_contains_point(color_cell, mouse_position)) {
+                    color_picker->proto_rect->color = colors[i];
+                    break;
+                }
+            }
+        } break;
+        }
+    } break;
+    }
+
+    return 0;
+}
diff --git a/src/game/level/level_editor/color_picker.h b/src/game/level/level_editor/color_picker.h
new file mode 100644 (file)
index 0000000..b0ec76d
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef COLOR_PICKER_H_
+#define COLOR_PICKER_H_
+
+typedef struct {
+    ProtoRect *proto_rect;
+    Vec position;
+} ColorPicker;
+
+int color_picker_render(const ColorPicker *color_picker,
+                        Camera *camera);
+int color_picker_update(ColorPicker *color_picker,
+                        float delta_time);
+int color_picker_event(ColorPicker *color_picker,
+                       const SDL_Event *event);
+
+#endif  // COLOR_PICKER_H_