]> git.lizzy.rs Git - nothing.git/blob - src/game/level/level_editor/player_layer.c
Fix PlayerLayer click-through problem
[nothing.git] / src / game / level / level_editor / player_layer.c
1 #include <stdio.h>
2
3 #include <SDL.h>
4
5 #include "game/camera.h"
6 #include "system/stacktrace.h"
7 #include "player_layer.h"
8 #include "system/nth_alloc.h"
9 #include "system/log.h"
10
11 PlayerLayer create_player_layer(Vec position, Color color)
12 {
13     return (PlayerLayer) {
14         .position = position,
15         .color_picker = create_color_picker_from_rgba(color),
16     };
17 }
18
19 PlayerLayer create_player_layer_from_line_stream(LineStream *line_stream)
20 {
21     trace_assert(line_stream);
22
23     const char *line = line_stream_next(line_stream);
24     trace_assert(line);
25
26     char colorstr[7] = "000000";
27     Point position = vec(0.0f, 0.0f);
28
29     const int bound =
30         sscanf(line, "%f%f%6s", &position.x, &position.y, colorstr);
31
32 #define BOUND_EXPECTED 3
33     if (bound != BOUND_EXPECTED) {
34         log_fail("Could not read Player Layer properly. Parsed tokens: %d. Expected: %d\n",
35                  bound, BOUND_EXPECTED);
36     }
37 #undef BOUND_EXPECTED
38
39     return create_player_layer(position, hexstr(colorstr));
40 }
41
42 LayerPtr player_layer_as_layer(PlayerLayer *player_layer)
43 {
44     LayerPtr layer = {
45         .type = LAYER_PLAYER,
46         .ptr = player_layer
47     };
48     return layer;
49 }
50
51 int player_layer_render(const PlayerLayer *player_layer,
52                         Camera *camera,
53                         int active)
54 {
55     trace_assert(player_layer);
56     trace_assert(camera);
57
58     if (camera_fill_rect(
59             camera,
60             rect_from_vecs(
61                 player_layer->position,
62                 vec(25.0f, 25.0f)),
63             color_scale(
64                 color_picker_rgba(&player_layer->color_picker),
65                 rgba(1.0f, 1.0f, 1.0f, active ? 1.0f : 0.5f))) < 0) {
66         return -1;
67     }
68
69     if (active && color_picker_render(&player_layer->color_picker, camera)) {
70         return -1;
71     }
72
73     return 0;
74 }
75
76
77 int player_layer_event(PlayerLayer *player_layer,
78                        const SDL_Event *event,
79                        const Camera *camera)
80 {
81     trace_assert(player_layer);
82     trace_assert(event);
83     trace_assert(camera);
84
85
86     int selected = 0;
87     if (color_picker_event(
88             &player_layer->color_picker,
89             event,
90             &selected) < 0) {
91         return -1;
92     }
93
94     if (!selected &&
95         event->type == SDL_MOUSEBUTTONDOWN &&
96         event->button.button == SDL_BUTTON_LEFT) {
97         player_layer->position =
98             camera_map_screen(camera,
99                               event->button.x,
100                               event->button.y);
101     }
102
103     return 0;
104 }
105
106 int player_layer_dump_stream(const PlayerLayer *player_layer,
107                              FILE *filedump)
108 {
109     trace_assert(player_layer);
110     trace_assert(filedump);
111
112     fprintf(filedump, "%f %f ", player_layer->position.x, player_layer->position.y);
113     color_hex_to_stream(color_picker_rgba(&player_layer->color_picker), filedump);
114     fprintf(filedump, "\n");
115
116     return 0;
117 }