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"
12 PlayerLayer create_player_layer(Vec position, Color color)
14 return (PlayerLayer) {
16 .color_picker = create_color_picker_from_rgba(color),
21 PlayerLayer create_player_layer_from_line_stream(LineStream *line_stream)
23 trace_assert(line_stream);
25 const char *line = line_stream_next(line_stream);
28 char colorstr[7] = "000000";
29 Point position = vec(0.0f, 0.0f);
32 sscanf(line, "%f%f%6s", &position.x, &position.y, colorstr);
34 #define BOUND_EXPECTED 3
35 if (bound != BOUND_EXPECTED) {
36 log_fail("Could not read Player Layer properly. Parsed tokens: %d. Expected: %d\n",
37 bound, BOUND_EXPECTED);
41 return create_player_layer(position, hexstr(colorstr));
44 LayerPtr player_layer_as_layer(PlayerLayer *player_layer)
53 int player_layer_render(const PlayerLayer *player_layer,
57 trace_assert(player_layer);
63 player_layer->position,
66 color_picker_rgba(&player_layer->color_picker),
67 rgba(1.0f, 1.0f, 1.0f, active ? 1.0f : 0.5f))) < 0) {
71 if (active && color_picker_render(
72 &player_layer->color_picker,
80 static void player_layer_revert_position(void *layer, Context context)
84 PlayerLayer *player_layer = layer;
85 player_layer->position = *((Point*)context.data);
89 void player_layer_revert_color(void *layer, Context context)
92 PlayerLayer *player_layer = layer;
94 trace_assert(sizeof(Color) <= CONTEXT_SIZE);
95 Color *color = (Color *)context.data;
97 player_layer->color_picker = create_color_picker_from_rgba(*color);
98 player_layer->prev_color = *color;
101 int player_layer_event(PlayerLayer *player_layer,
102 const SDL_Event *event,
103 const Camera *camera,
104 UndoHistory *undo_history)
106 trace_assert(player_layer);
108 trace_assert(camera);
109 trace_assert(undo_history);
112 if (color_picker_event(
113 &player_layer->color_picker,
120 if (selected && !color_picker_drag(&player_layer->color_picker)) {
125 player_layer_revert_color,
126 &player_layer->prev_color,
127 sizeof(player_layer->prev_color)));
128 player_layer->prev_color = color_picker_rgba(&player_layer->color_picker);
132 event->type == SDL_MOUSEBUTTONDOWN &&
133 event->button.button == SDL_BUTTON_LEFT) {
135 .layer = player_layer,
136 .revert = player_layer_revert_position
138 trace_assert(sizeof(player_layer->position) <= CONTEXT_SIZE);
139 memcpy(action.context.data, &player_layer->position, sizeof(player_layer->position));
140 undo_history_push(undo_history, action);
142 player_layer->position =
143 camera_map_screen(camera,
151 int player_layer_dump_stream(const PlayerLayer *player_layer,
154 trace_assert(player_layer);
155 trace_assert(filedump);
157 fprintf(filedump, "%f %f ", player_layer->position.x, player_layer->position.y);
158 color_hex_to_stream(color_picker_rgba(&player_layer->color_picker), filedump);
159 fprintf(filedump, "\n");