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 chop_player_layer(Memory *memory, String *input)
59 String line = chop_by_delim(input, '\n');
60 float x = strtof(string_to_cstr(memory, chop_word(&line)), NULL);
61 float y = strtof(string_to_cstr(memory, chop_word(&line)), NULL);
62 Color color = hexs(chop_word(&line));
64 return create_player_layer(vec(x, y), color);
67 LayerPtr player_layer_as_layer(PlayerLayer *player_layer)
76 int player_layer_render(const PlayerLayer *player_layer,
80 trace_assert(player_layer);
86 player_layer->position,
89 color_picker_rgba(&player_layer->color_picker),
90 rgba(1.0f, 1.0f, 1.0f, active ? 1.0f : 0.5f))) < 0) {
94 if (active && color_picker_render(
95 &player_layer->color_picker,
103 int player_layer_event(PlayerLayer *player_layer,
104 const SDL_Event *event,
105 const Camera *camera,
106 UndoHistory *undo_history)
108 trace_assert(player_layer);
110 trace_assert(camera);
111 trace_assert(undo_history);
114 if (color_picker_event(
115 &player_layer->color_picker,
122 if (selected && !color_picker_drag(&player_layer->color_picker)) {
123 PlayerUndoContext context =
124 player_layer_create_undo_context(player_layer);
130 player_layer->prev_color = color_picker_rgba(&player_layer->color_picker);
134 event->type == SDL_MOUSEBUTTONDOWN &&
135 event->button.button == SDL_BUTTON_LEFT) {
137 PlayerUndoContext context =
138 player_layer_create_undo_context(player_layer);
143 &context, sizeof(context));
145 player_layer->position =
146 camera_map_screen(camera,
154 int player_layer_dump_stream(const PlayerLayer *player_layer,
157 trace_assert(player_layer);
158 trace_assert(filedump);
160 fprintf(filedump, "%f %f ", player_layer->position.x, player_layer->position.y);
161 color_hex_to_stream(color_picker_rgba(&player_layer->color_picker), filedump);
162 fprintf(filedump, "\n");