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 #include "undo_history.h"
11 #include "system/memory.h"
20 PlayerUndoContext player_layer_create_undo_context(PlayerLayer *player_layer)
22 PlayerUndoContext context = {
23 .layer = player_layer,
24 .position = player_layer->position,
25 .color = player_layer->prev_color
32 void player_layer_undo(void *context, size_t context_size)
34 trace_assert(context);
35 trace_assert(sizeof(PlayerUndoContext) == context_size);
37 PlayerUndoContext *undo_context = context;
38 PlayerLayer *player_layer = undo_context->layer;
40 player_layer->position = undo_context->position;
41 player_layer->color_picker = create_color_picker_from_rgba(undo_context->color);
42 player_layer->prev_color = undo_context->color;
45 PlayerLayer create_player_layer(Vec2f position, Color color)
47 return (PlayerLayer) {
49 .color_picker = create_color_picker_from_rgba(color),
54 PlayerLayer create_player_layer_from_line_stream(LineStream *line_stream)
56 trace_assert(line_stream);
58 const char *line = line_stream_next(line_stream);
61 char colorstr[7] = "000000";
62 Vec2f position = vec(0.0f, 0.0f);
65 sscanf(line, "%f%f%6s", &position.x, &position.y, colorstr);
67 #define BOUND_EXPECTED 3
68 if (bound != BOUND_EXPECTED) {
69 log_fail("Could not read Player Layer properly. Parsed tokens: %d. Expected: %d\n",
70 bound, BOUND_EXPECTED);
74 return create_player_layer(position, hexstr(colorstr));
77 PlayerLayer chop_player_layer(Memory *memory, String *input)
82 String line = chop_by_delim(input, '\n');
83 float x = strtof(string_to_cstr(memory, chop_word(&line)), NULL);
84 float y = strtof(string_to_cstr(memory, chop_word(&line)), NULL);
85 Color color = hexs(chop_word(&line));
87 return create_player_layer(vec(x, y), color);
90 LayerPtr player_layer_as_layer(PlayerLayer *player_layer)
99 int player_layer_render(const PlayerLayer *player_layer,
100 const Camera *camera,
103 trace_assert(player_layer);
104 trace_assert(camera);
106 if (camera_fill_rect(
109 player_layer->position,
112 color_picker_rgba(&player_layer->color_picker),
113 rgba(1.0f, 1.0f, 1.0f, active ? 1.0f : 0.5f))) < 0) {
117 if (active && color_picker_render(
118 &player_layer->color_picker,
126 int player_layer_event(PlayerLayer *player_layer,
127 const SDL_Event *event,
128 const Camera *camera,
129 UndoHistory *undo_history)
131 trace_assert(player_layer);
133 trace_assert(camera);
134 trace_assert(undo_history);
137 if (color_picker_event(
138 &player_layer->color_picker,
145 if (selected && !color_picker_drag(&player_layer->color_picker)) {
146 PlayerUndoContext context =
147 player_layer_create_undo_context(player_layer);
153 player_layer->prev_color = color_picker_rgba(&player_layer->color_picker);
157 event->type == SDL_MOUSEBUTTONDOWN &&
158 event->button.button == SDL_BUTTON_LEFT) {
160 PlayerUndoContext context =
161 player_layer_create_undo_context(player_layer);
166 &context, sizeof(context));
168 player_layer->position =
169 camera_map_screen(camera,
177 int player_layer_dump_stream(const PlayerLayer *player_layer,
180 trace_assert(player_layer);
181 trace_assert(filedump);
183 fprintf(filedump, "%f %f ", player_layer->position.x, player_layer->position.y);
184 color_hex_to_stream(color_picker_rgba(&player_layer->color_picker), filedump);
185 fprintf(filedump, "\n");