- #include "IZ_app_video.h"
-
- void IZ_VideoUpdateForDebugTicks(IZ_VideoState* video_state, uint64_t ticks) {
- SDL_SetRenderDrawColor(video_state->renderer, 0x00, 0xff, 0xff, 0xff);
- u64 the_ticks = ticks;
- u8 column;
- u8 row;
- const u8 size = 4;
-
- u8 bit_index;
- for (bit_index = 0; bit_index < 64; bit_index += 1) {
- column = bit_index % 32;
- row = bit_index / 32;
-
- if (the_ticks & 0x1) {
- SDL_RenderFillRectF(video_state->renderer, &(SDL_FRect) {
- (f32) (video_state->config.width - ((column + 1) * size)),
- (f32) (video_state->config.height - ((row + 1) * size)),
- size,
- size
- });
- }
- the_ticks >>= 1;
- }
- }
-
- void IZ_VideoUpdateForDebugInput(IZ_VideoState* video_state, IZ_InputState* input_state) {
- SDL_SetRenderDrawColor(video_state->renderer, 0xff, 0xff, 0x00, 0xff);
- const u8 size = 4;
-
- u8 column;
- u8 row;
-
- u8 player_index;
- u8 control_index;
- for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
- IZ_Action the_action = input_state->action[player_index];
- for (control_index = 0; control_index < IZ_CONTROLS; control_index += 1) {
- column = (control_index % 4) + (player_index * 4);
- row = control_index / 4;
-
- if (the_action & 0x1) {
- SDL_RenderFillRectF(video_state->renderer, &(SDL_FRect) {
- (f32) (column * size),
- (f32) (row * size),
- size,
- size
- });
- }
- the_action >>= 1;
- }
- }
- }
-
- void IZ_VideoUpdateForDebugNet(IZ_VideoState* video_state, IZ_NetClientState* net_state) {
- const u8 size = 4;
-
- switch (net_state->status) {
- default:
- return;
- case IZ_NET_CLIENT_STATUS_ERROR:
- SDL_SetRenderDrawColor(video_state->renderer, 0xff, 0x00, 0x00, 0xff);
- break;
- case IZ_NET_CLIENT_STATUS_CONNECTING:
- SDL_SetRenderDrawColor(video_state->renderer, 0xff, 0xff, 0x00, 0xff);
- break;
- case IZ_NET_CLIENT_STATUS_CONNECTED:
- SDL_SetRenderDrawColor(video_state->renderer, 0x00, 0xff, 0x00, 0xff);
- break;
- }
-
- SDL_RenderFillRectF(video_state->renderer, &(SDL_FRect) {
- 0,
- (f32) (video_state->config.height - size),
- size,
- size,
- });
-
- if (!net_state->binding.connection) {
- return;
- }
-
- u8 column;
- u8 row;
-
- u8 player_index;
- u8 control_index;
- for (player_index = 0; player_index < IZ_PLAYERS; player_index += 1) {
- IZ_Action the_action = net_state->action[player_index];
- for (control_index = 0; control_index < IZ_CONTROLS; control_index += 1) {
- column = (control_index % 4) + (player_index * 4);
- row = control_index / 4;
-
- if (the_action & 0x1) {
- SDL_RenderFillRectF(video_state->renderer, &(SDL_FRect) {
- (f32) (column * size),
- (f32) ((row * size) + (video_state->config.height - (size * 5))),
- size,
- size
- });
- }
- the_action >>= 1;
- }
- }
- }
-
- void IZ_VideoUpdate(IZ_VideoState* video_state) {
- struct IZ_App* app = video_state->user_data;
- u64 ticks = IZ_AppGetTicks(app);
- IZ_InputState* input_state = IZ_AppGetInputState(app);
- IZ_NetClientState* net_state = IZ_AppGetNetState(app);
-
- if (ticks - video_state->last_update_at > 1000 / video_state->config.max_fps) {
- // Update window
- SDL_SetRenderDrawColor(video_state->renderer, 0x00, 0x00, 0x00, 0xff);
- SDL_RenderClear(video_state->renderer);
- u16 sprite_index;
- // TODO: optimize this, cut the loop as much as possible.
- for (sprite_index = 0; sprite_index < MAX_ACTIVE_SPRITES; sprite_index += 1) {
- if (!video_state->active_sprites[sprite_index].sprite.texture) {
- continue;
- }
- IZ_Sprite* sprite = &video_state->active_sprites[sprite_index].sprite;
- f32 draw_width = sprite->original_width * sprite->scale_factor;
- f32 draw_height = sprite->original_height * sprite->scale_factor;
- u8 flip_flag = 0;
- if (sprite->flip_x) {
- flip_flag |= SDL_FLIP_HORIZONTAL;
- }
- if (sprite->flip_y) {
- flip_flag |= SDL_FLIP_VERTICAL;
- }
- SDL_RenderCopyExF(video_state->renderer, sprite->texture, NULL, &(SDL_FRect) {
- // TODO honor each sprite's location in the world for calculation in the screen.
- .x = sprite->position.x,
- .y = sprite->position.y,
- .w = draw_width,
- .h = draw_height,
- }, sprite->rotate_degrees++, &(SDL_FPoint) {
- .x = draw_width / 2,
- .y = draw_height / 2,
- }, flip_flag);
-
- // our goal is to render the svg files and apply custom transforms to some SVG groups if ever.
- // TODO perhaps we can parse the SVG for easier transforms?
- }
-
- IZ_VideoUpdateForDebugTicks(video_state, ticks);
- IZ_VideoUpdateForDebugInput(video_state, input_state);
- IZ_VideoUpdateForDebugNet(video_state, net_state);
- SDL_RenderPresent(video_state->renderer);
- video_state->last_update_at = ticks;
- }
- }
|