]> git.lizzy.rs Git - nothing.git/blobdiff - src/game/level/level_editor/layer_picker.c
Merge pull request #1093 from tsoding/1092
[nothing.git] / src / game / level / level_editor / layer_picker.c
index a082da17348b332fecb24cd78df5e39072faaedf..a458c83e512bb4ae89b4cbe4a74a96d38f2bd8c1 100644 (file)
@@ -1,4 +1,5 @@
 #include <stdbool.h>
+#include <string.h>
 
 #include <SDL.h>
 
 #define LAYER_SELECTED_OFFSET 15.0f
 
 static const Color LAYER_CELL_BACKGROUND_COLORS[LAYER_PICKER_N] = {
-    {1.0f, 0.0f, 0.0f, 1.0f},  // LAYER_PICKER_BOXES = 0,
-    {0.0f, 1.0f, 0.0f, 1.0f},  // LAYER_PICKER_PLATFORMS,
-    {0.0f, 0.0f, 1.0f, 1.0f},  // LAYER_PICKER_BACK_PLATFORMS,
-    {1.0f, 1.0f, 1.0f, 1.0f},  // LAYER_PICKER_GOALS
-    {1.0f, 0.2f, 0.6f, 1.0f},  // LAYER_PICKER_PLAYER
-    {0.6f, 0.6f, 1.0f, 1.0f},  // LAYER_PICKER_LAVA
-    {0.2f, 1.0f, 0.6f, 1.0f},  // LAYER_PICKER_REGIONS
-    {0.2f, 0.6f, 1.0f, 1.0f},  // LAYER_PICKER_BACKGROUND
-    {0.2f, 1.0f, 0.6f, 1.0f},  // LAYER_PICKER_LABELS
+    {1.0f, 0.0f, 0.0f, 1.0f}, // LAYER_PICKER_BACKGROUND
+    {0.0f, 1.0f, 0.0f, 1.0f}, // LAYER_PICKER_PLAYER
+    {0.6f, 0.6f, 1.0f, 1.0f}, // LAYER_PICKER_BACK_PLATFORMS
+    {0.0f, 0.0f, 1.0f, 1.0f}, // LAYER_PICKER_PLATFORMS
+    {1.0f, 1.0f, 1.0f, 1.0f}, // LAYER_PICKER_GOALS
+    {1.0f, 0.2f, 0.6f, 1.0f}, // LAYER_PICKER_LAVA
+    {0.2f, 1.0f, 0.6f, 1.0f}, // LAYER_PICKER_BOXES
+    {0.2f, 0.6f, 1.0f, 1.0f}, // LAYER_PICKER_LABELS
+    {0.2f, 1.0f, 0.6f, 1.0f}, // LAYER_PICKER_REGIONS
 };
 
 static const char *LAYER_CELL_TITLES[LAYER_PICKER_N] = {
-    "Boxes",                   // LAYER_PICKER_BOXES = 0,
-    "Platforms",               // LAYER_PICKER_PLATFORMS,
-    "Back Platforms",          // LAYER_PICKER_BACK_PLATFORMS,
-    "Goals",                   // LAYER_PICKER_GOALS
+    "Background",              // LAYER_PICKER_BACKGROUND
     "Player",                  // LAYER_PICKER_PLAYER
+    "Back Platforms",          // LAYER_PICKER_BACK_PLATFORMS
+    "Platforms",               // LAYER_PICKER_PLATFORMS
+    "Goals",                   // LAYER_PICKER_GOALS
     "Lava",                    // LAYER_PICKER_LAVA
-    "Regions",                 // LAYER_PICKER_REGIONS
-    "Background",              // LAYER_PICKER_BACKGROUND
+    "Boxes",                   // LAYER_PICKER_BOXES
     "Labels",                  // LAYER_PICKER_LABELS
+    "Regions",                 // LAYER_PICKER_REGIONS
 };
 
 inline static float layer_picker_max_width(void)
@@ -51,33 +52,36 @@ inline static float layer_picker_max_width(void)
 
 #define LAYER_CELL_WIDTH layer_picker_max_width()
 #define LAYER_CELL_HEIGHT (LAYER_TITLE_SIZE * FONT_CHAR_HEIGHT + LAYER_TITLE_PADDING * 2.0f)
+#define LAYER_CELL_REFERENCE 1980.0f
+#define LAYER_CELL_WR_RATIO (LAYER_CELL_WIDTH / LAYER_CELL_REFERENCE)
+#define LAYER_CELL_HW_RATIO (LAYER_CELL_HEIGHT / LAYER_CELL_WIDTH)
+#define LAYER_TITLE_SW_RATIO (LAYER_TITLE_SIZE / LAYER_CELL_WIDTH)
+#define LAYER_TITLE_PW_RATIO (LAYER_TITLE_PADDING / LAYER_CELL_WIDTH)
+#define LAYER_CELL_OW_RATIO (LAYER_SELECTED_OFFSET / LAYER_CELL_WIDTH)
 
-inline static Vec layer_picker_position(const Camera *camera)
+int layer_picker_render(const LayerPicker *layer_picker,
+                        const Camera *camera)
 {
+    trace_assert(layer_picker);
     trace_assert(camera);
 
     const Rect viewport = camera_view_port_screen(camera);
 
-    Vec position = {
-        .x = 0.0f,
-        .y = viewport.h * 0.5f - LAYER_CELL_HEIGHT * LAYER_PICKER_N * 0.5f
-    };
-
-    return position;
-}
+    for (size_t i = 0; i < LAYER_PICKER_N; ++i) {
+        const Vec2f size = {
+            .x = viewport.w * LAYER_CELL_WR_RATIO,
+            .y = viewport.w * LAYER_CELL_WR_RATIO * LAYER_CELL_HW_RATIO
+        };
 
-int layer_picker_render(const LayerPicker *layer_picker,
-                        Camera *camera)
-{
-    trace_assert(layer_picker);
-    trace_assert(camera);
+        Vec2f position = {
+            .x = 0.0f,
+            .y = viewport.h * 0.5f - size.y * LAYER_PICKER_N * 0.5f
+        };
 
-    for (size_t i = 0; i < LAYER_PICKER_N; ++i) {
-        Vec position = layer_picker_position(camera);
         Color color = LAYER_CELL_BACKGROUND_COLORS[i];
 
         if (*layer_picker == i) {
-            position.x += LAYER_SELECTED_OFFSET;
+            position.x += size.x * LAYER_CELL_OW_RATIO;
         } else {
             color.a *= 0.70f;
         }
@@ -86,9 +90,8 @@ int layer_picker_render(const LayerPicker *layer_picker,
                 camera,
                 rect(
                     position.x,
-                    LAYER_CELL_HEIGHT * (float) i + position.y,
-                    LAYER_CELL_WIDTH,
-                    LAYER_CELL_HEIGHT),
+                    size.y * (float) i + position.y,
+                    size.x, size.y),
                 color) < 0) {
             return -1;
         }
@@ -96,10 +99,11 @@ int layer_picker_render(const LayerPicker *layer_picker,
         if (camera_render_text_screen(
                 camera,
                 LAYER_CELL_TITLES[i],
-                vec(LAYER_TITLE_SIZE, LAYER_TITLE_SIZE),
+                vec(size.x * LAYER_TITLE_SW_RATIO,
+                    size.x * LAYER_TITLE_SW_RATIO),
                 color_invert(color),
-                vec(position.x + LAYER_TITLE_PADDING,
-                    LAYER_CELL_HEIGHT * (float) i + position.y + LAYER_TITLE_PADDING)) < 0) {
+                vec(position.x + size.x * LAYER_TITLE_PW_RATIO,
+                    size.y * (float) i + position.y + size.x * LAYER_TITLE_PW_RATIO)) < 0) {
             return -1;
         }
     }
@@ -116,15 +120,25 @@ int layer_picker_event(LayerPicker *layer_picker,
     trace_assert(event);
     trace_assert(camera);
 
-    const Vec position = layer_picker_position(camera);
+    const Rect viewport = camera_view_port_screen(camera);
+
+    const Vec2f size = {
+        .x = viewport.w * LAYER_CELL_WR_RATIO,
+        .y = viewport.w * LAYER_CELL_WR_RATIO * LAYER_CELL_HW_RATIO
+    };
+
+    const Vec2f position = {
+        .x = 0.0f,
+        .y = viewport.h * 0.5f - size.y * LAYER_PICKER_N * 0.5f
+    };
 
     switch (event->type) {
     case SDL_MOUSEBUTTONDOWN: {
         for (size_t i = 0; i < LAYER_PICKER_N; ++i) {
-            const Rect cell = rect(position.x,
-                                   LAYER_CELL_HEIGHT * (float) i + position.y,
-                                   LAYER_CELL_WIDTH,
-                                   LAYER_CELL_HEIGHT);
+            const Rect cell = rect(
+                position.x,
+                size.y * (float) i + position.y,
+                size.x, size.y);
             if (rect_contains_point(cell, vec((float) event->button.x, (float) event->button.y))) {
                 *layer_picker = i;
                 *selected = true;