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"
19 UndoContext player_layer_create_undo_context(PlayerLayer *player_layer)
21 UndoContext context = {
22 .layer = player_layer,
23 .position = player_layer->position,
24 .color = player_layer->prev_color
31 void player_layer_undo(void *context, size_t context_size)
33 trace_assert(context);
34 trace_assert(sizeof(UndoContext) == context_size);
36 UndoContext *undo_context = context;
37 PlayerLayer *player_layer = undo_context->layer;
39 player_layer->position = undo_context->position;
40 player_layer->color_picker = create_color_picker_from_rgba(undo_context->color);
41 player_layer->prev_color = undo_context->color;
44 PlayerLayer create_player_layer(Vec position, Color color)
46 return (PlayerLayer) {
48 .color_picker = create_color_picker_from_rgba(color),
53 PlayerLayer create_player_layer_from_line_stream(LineStream *line_stream)
55 trace_assert(line_stream);
57 const char *line = line_stream_next(line_stream);
60 char colorstr[7] = "000000";
61 Point position = vec(0.0f, 0.0f);
64 sscanf(line, "%f%f%6s", &position.x, &position.y, colorstr);
66 #define BOUND_EXPECTED 3
67 if (bound != BOUND_EXPECTED) {
68 log_fail("Could not read Player Layer properly. Parsed tokens: %d. Expected: %d\n",
69 bound, BOUND_EXPECTED);
73 return create_player_layer(position, hexstr(colorstr));
76 LayerPtr player_layer_as_layer(PlayerLayer *player_layer)
85 int player_layer_render(const PlayerLayer *player_layer,
89 trace_assert(player_layer);
95 player_layer->position,
98 color_picker_rgba(&player_layer->color_picker),
99 rgba(1.0f, 1.0f, 1.0f, active ? 1.0f : 0.5f))) < 0) {
103 if (active && color_picker_render(
104 &player_layer->color_picker,
112 int player_layer_event(PlayerLayer *player_layer,
113 const SDL_Event *event,
114 const Camera *camera,
115 UndoHistory *undo_history)
117 trace_assert(player_layer);
119 trace_assert(camera);
120 trace_assert(undo_history);
123 if (color_picker_event(
124 &player_layer->color_picker,
131 if (selected && !color_picker_drag(&player_layer->color_picker)) {
132 UndoContext context =
133 player_layer_create_undo_context(player_layer);
139 player_layer->prev_color = color_picker_rgba(&player_layer->color_picker);
143 event->type == SDL_MOUSEBUTTONDOWN &&
144 event->button.button == SDL_BUTTON_LEFT) {
146 UndoContext context =
147 player_layer_create_undo_context(player_layer);
152 &context, sizeof(context));
154 player_layer->position =
155 camera_map_screen(camera,
163 int player_layer_dump_stream(const PlayerLayer *player_layer,
166 trace_assert(player_layer);
167 trace_assert(filedump);
169 fprintf(filedump, "%f %f ", player_layer->position.x, player_layer->position.y);
170 color_hex_to_stream(color_picker_rgba(&player_layer->color_picker), filedump);
171 fprintf(filedump, "\n");