2023-10-10 18:01:15 +00:00
|
|
|
#include "state.h"
|
|
|
|
|
2023-10-10 10:43:34 +00:00
|
|
|
#include <glad/glad.h>
|
|
|
|
#include <SDL2/SDL.h>
|
|
|
|
#include <linmath.h>
|
|
|
|
|
2023-10-10 11:35:29 +00:00
|
|
|
mat4x4 projection_matrix;
|
2023-10-10 15:06:01 +00:00
|
|
|
mat4x4 view_matrix;
|
2023-10-10 10:43:34 +00:00
|
|
|
|
2023-10-11 08:10:06 +00:00
|
|
|
float triangle_vertices[108] =
|
|
|
|
{
|
2023-10-10 18:01:15 +00:00
|
|
|
// Front
|
|
|
|
-0.5f, -0.5f, -0.5f,
|
2023-10-12 06:18:43 +00:00
|
|
|
-0.5f, 0.5f, -0.5f,
|
|
|
|
0.5f, -0.5f, -0.5f,
|
2023-10-10 18:01:15 +00:00
|
|
|
|
2023-10-12 06:18:43 +00:00
|
|
|
0.5f, 0.5f, -0.5f,
|
|
|
|
0.5f, -0.5f, -0.5f,
|
|
|
|
-0.5f, 0.5f, -0.5f,
|
2023-10-10 18:01:15 +00:00
|
|
|
|
|
|
|
// Back
|
2023-10-12 06:18:43 +00:00
|
|
|
0.5f, -0.5f, 0.5f,
|
|
|
|
-0.5f, 0.5f, 0.5f,
|
|
|
|
-0.5f, -0.5f, 0.5f,
|
2023-10-10 18:01:15 +00:00
|
|
|
|
2023-10-12 06:18:43 +00:00
|
|
|
-0.5f, 0.5f, 0.5f,
|
|
|
|
0.5f, -0.5f, 0.5f,
|
|
|
|
0.5f, 0.5f, 0.5f,
|
2023-10-10 18:01:15 +00:00
|
|
|
|
|
|
|
// Left
|
2023-10-12 06:18:43 +00:00
|
|
|
-0.5f, 0.5f, -0.5f,
|
2023-10-10 18:01:15 +00:00
|
|
|
-0.5f, -0.5f, -0.5f,
|
2023-10-12 06:18:43 +00:00
|
|
|
-0.5f, -0.5f, 0.5f,
|
2023-10-10 18:01:15 +00:00
|
|
|
|
2023-10-12 06:18:43 +00:00
|
|
|
-0.5f, -0.5f, 0.5f,
|
|
|
|
-0.5f, 0.5f, 0.5f,
|
|
|
|
-0.5f, 0.5f, -0.5f,
|
2023-10-10 18:01:15 +00:00
|
|
|
|
|
|
|
// Right
|
2023-10-12 06:18:43 +00:00
|
|
|
0.5f, -0.5f, 0.5f,
|
|
|
|
0.5f, -0.5f, -0.5f,
|
|
|
|
0.5f, 0.5f, -0.5f,
|
2023-10-10 18:01:15 +00:00
|
|
|
|
2023-10-12 06:18:43 +00:00
|
|
|
0.5f, 0.5f, -0.5f,
|
|
|
|
0.5f, 0.5f, 0.5f,
|
|
|
|
0.5f, -0.5f, 0.5f,
|
2023-10-10 18:01:15 +00:00
|
|
|
|
|
|
|
// Top
|
2023-10-12 06:18:43 +00:00
|
|
|
-0.5f, 0.5f, -0.5f,
|
|
|
|
-0.5f, 0.5f, 0.5f,
|
|
|
|
0.5f, 0.5f, -0.5f,
|
2023-10-10 18:01:15 +00:00
|
|
|
|
2023-10-12 06:18:43 +00:00
|
|
|
-0.5f, 0.5f, 0.5f,
|
|
|
|
0.5f, 0.5f, 0.5f,
|
|
|
|
0.5f, 0.5f, -0.5f,
|
2023-10-10 18:01:15 +00:00
|
|
|
|
|
|
|
// Bottom
|
2023-10-12 06:18:43 +00:00
|
|
|
-0.5f, -0.5f, 0.5f,
|
2023-10-10 18:01:15 +00:00
|
|
|
-0.5f, -0.5f, -0.5f,
|
2023-10-12 06:18:43 +00:00
|
|
|
0.5f, -0.5f, -0.5f,
|
2023-10-10 18:01:15 +00:00
|
|
|
|
2023-10-12 06:18:43 +00:00
|
|
|
0.5f, -0.5f, 0.5f,
|
|
|
|
-0.5f, -0.5f, 0.5f,
|
|
|
|
0.5f, -0.5f, -0.5f
|
2023-10-10 18:01:15 +00:00
|
|
|
};
|
2023-10-10 10:43:34 +00:00
|
|
|
|
2023-10-14 14:38:38 +00:00
|
|
|
void tc_move_viewer_to(float x, float y, float z)
|
|
|
|
{
|
|
|
|
if(tc_game_state_g.viewer == NULL) return;
|
|
|
|
|
|
|
|
tc_set_float_for_entity(tc_game_state_g.viewer, "pos_x", x);
|
|
|
|
tc_set_float_for_entity(tc_game_state_g.viewer, "pos_y", y);
|
|
|
|
tc_set_float_for_entity(tc_game_state_g.viewer, "pos_z", z);
|
|
|
|
}
|
|
|
|
|
|
|
|
void tc_rotate_viewer_to(float x, float y, float z)
|
|
|
|
{
|
|
|
|
if(tc_game_state_g.viewer == NULL) return;
|
|
|
|
|
|
|
|
tc_set_float_for_entity(tc_game_state_g.viewer, "rot_x", x);
|
|
|
|
tc_set_float_for_entity(tc_game_state_g.viewer, "rot_y", y);
|
|
|
|
tc_set_float_for_entity(tc_game_state_g.viewer, "rot_z", z);
|
|
|
|
}
|
|
|
|
|
|
|
|
void tc_get_viewer_position(float *x, float *y, float *z)
|
|
|
|
{
|
|
|
|
if(tc_game_state_g.viewer == NULL) return;
|
|
|
|
|
|
|
|
if(x != NULL) (*x) = tc_get_float_from_entity(tc_game_state_g.viewer, "pos_x");
|
|
|
|
if(y != NULL) (*y) = tc_get_float_from_entity(tc_game_state_g.viewer, "pos_y");
|
|
|
|
if(z != NULL) (*z) = tc_get_float_from_entity(tc_game_state_g.viewer, "pos_z");
|
|
|
|
}
|
|
|
|
|
|
|
|
void tc_get_viewer_rotation(float *x, float *y, float *z)
|
|
|
|
{
|
|
|
|
if(tc_game_state_g.viewer == NULL) return;
|
|
|
|
|
|
|
|
if(x != NULL) (*x) = tc_get_float_from_entity(tc_game_state_g.viewer, "rot_x");
|
|
|
|
if(y != NULL) (*y) = tc_get_float_from_entity(tc_game_state_g.viewer, "rot_y");
|
|
|
|
if(z != NULL) (*z) = tc_get_float_from_entity(tc_game_state_g.viewer, "rot_z");
|
|
|
|
}
|
2023-10-10 15:06:01 +00:00
|
|
|
|
2023-10-10 10:43:34 +00:00
|
|
|
void render_block(tc_block_s block)
|
|
|
|
{
|
2023-10-10 16:00:43 +00:00
|
|
|
mat4x4 model_matrix;
|
2023-10-11 13:01:54 +00:00
|
|
|
mat4x4_identity(model_matrix);
|
|
|
|
mat4x4_rotate_X(view_matrix, model_matrix, block.rotation.x);
|
|
|
|
mat4x4_rotate_Y(view_matrix, model_matrix, block.rotation.y);
|
|
|
|
mat4x4_rotate_Z(view_matrix, model_matrix, block.rotation.z);
|
|
|
|
mat4x4_translate_in_place(model_matrix, block.position.x, block.position.y, block.position.z);
|
2023-10-10 16:00:43 +00:00
|
|
|
|
2023-10-10 18:01:15 +00:00
|
|
|
int model_matrix_uniform_location = glGetUniformLocation(tc_game_state_g.renderer.draw_shader.program_id, "model_matrix");
|
2023-10-10 16:00:43 +00:00
|
|
|
glUniformMatrix4fv(model_matrix_uniform_location, 1, GL_FALSE, &model_matrix[0][0]);
|
|
|
|
|
2023-10-10 10:43:34 +00:00
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, block.drawing.vbo);
|
|
|
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *) 0);
|
|
|
|
glEnableVertexAttribArray(0);
|
2023-10-10 18:01:15 +00:00
|
|
|
glDrawArrays(GL_TRIANGLES, 0, 36);
|
2023-10-10 10:43:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
tc_block_s tc_new_block_at_3f(float x, float y, float z)
|
|
|
|
{
|
|
|
|
tc_block_s block;
|
|
|
|
block.position.x = x;
|
|
|
|
block.position.y = y;
|
|
|
|
block.position.z = z;
|
2023-10-11 13:01:54 +00:00
|
|
|
block.rotation.x = 0.0f;
|
|
|
|
block.rotation.y = 0.0f;
|
|
|
|
block.rotation.z = 0.0f;
|
2023-10-10 10:43:34 +00:00
|
|
|
glGenBuffers(1, &block.drawing.vbo);
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, block.drawing.vbo);
|
2023-10-10 18:01:15 +00:00
|
|
|
glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 108, &triangle_vertices[0], GL_STATIC_DRAW);
|
2023-10-10 10:43:34 +00:00
|
|
|
|
|
|
|
return block;
|
|
|
|
}
|
|
|
|
|
|
|
|
void render()
|
|
|
|
{
|
2023-10-12 16:52:05 +00:00
|
|
|
float color[4] = { 0.12f, 0.5f, 0.8f, 1.0f };
|
2023-10-10 10:43:34 +00:00
|
|
|
glClearBufferfv(GL_COLOR, 0, color);
|
2023-10-10 18:01:15 +00:00
|
|
|
float depth = 10000000.0f;
|
|
|
|
glClearBufferfv(GL_DEPTH, 0, &depth);
|
2023-10-10 10:43:34 +00:00
|
|
|
|
2023-10-13 12:00:49 +00:00
|
|
|
int fb_width = 0;
|
|
|
|
int fb_height = 0;
|
|
|
|
SDL_GetWindowSize(tc_game_state_g.renderer.window, &fb_width, &fb_height);
|
|
|
|
|
|
|
|
glViewport(0, 0, fb_width, fb_height);
|
|
|
|
mat4x4_perspective(projection_matrix, 120, ((float) fb_width) / ((float) fb_height), 0.0001f, 1000.0f);
|
2023-10-11 10:38:23 +00:00
|
|
|
|
2023-10-14 14:38:38 +00:00
|
|
|
tc_vec3_s camera_rotation;
|
|
|
|
tc_get_viewer_rotation(&camera_rotation.x, &camera_rotation.y, &camera_rotation.z);
|
|
|
|
|
|
|
|
tc_vec3_s camera_position;
|
|
|
|
tc_get_viewer_position(&camera_position.x, &camera_position.y, &camera_position.z);
|
2023-10-13 12:37:02 +00:00
|
|
|
|
2023-10-11 10:38:23 +00:00
|
|
|
mat4x4_identity(view_matrix);
|
2023-10-13 12:37:02 +00:00
|
|
|
mat4x4_rotate_X(view_matrix, view_matrix, camera_rotation.x);
|
|
|
|
mat4x4_rotate_Y(view_matrix, view_matrix, camera_rotation.y);
|
|
|
|
mat4x4_rotate_Z(view_matrix, view_matrix, camera_rotation.z);
|
2023-10-10 15:06:01 +00:00
|
|
|
|
2023-10-14 14:38:38 +00:00
|
|
|
mat4x4_translate_in_place(view_matrix, -camera_position.x, -camera_position.y, camera_position.z);
|
2023-10-11 10:38:23 +00:00
|
|
|
|
2023-10-10 18:01:15 +00:00
|
|
|
glUseProgram(tc_game_state_g.renderer.draw_shader.program_id);
|
2023-10-10 15:06:01 +00:00
|
|
|
|
2023-10-10 18:01:15 +00:00
|
|
|
int projection_uniform_location = glGetUniformLocation(tc_game_state_g.renderer.draw_shader.program_id, "projection_matrix");
|
2023-10-10 11:35:29 +00:00
|
|
|
glUniformMatrix4fv(projection_uniform_location, 1, GL_FALSE, &projection_matrix[0][0]);
|
|
|
|
|
2023-10-10 18:01:15 +00:00
|
|
|
int view_uniform_location = glGetUniformLocation(tc_game_state_g.renderer.draw_shader.program_id, "view_matrix");
|
2023-10-10 15:06:01 +00:00
|
|
|
glUniformMatrix4fv(view_uniform_location, 1, GL_FALSE, &view_matrix[0][0]);
|
|
|
|
// printf("%d\n", view_uniform_location);
|
|
|
|
|
2023-10-12 16:52:05 +00:00
|
|
|
tc_draw_world(tc_game_state_g.main_world);
|
2023-10-10 10:43:34 +00:00
|
|
|
|
2023-10-10 18:01:15 +00:00
|
|
|
SDL_GL_SwapWindow(tc_game_state_g.renderer.window);
|
2023-10-10 10:43:34 +00:00
|
|
|
}
|
|
|
|
|
2023-10-10 15:06:01 +00:00
|
|
|
bool shift_pressed = false;
|
|
|
|
bool go_up = false;
|
|
|
|
bool go_left = false;
|
|
|
|
bool go_right = false;
|
|
|
|
bool go_forward = false;
|
|
|
|
bool go_backwards = false;
|
2023-10-11 08:41:58 +00:00
|
|
|
bool rotate_left = false;
|
|
|
|
bool rotate_right = false;
|
2023-10-10 15:06:01 +00:00
|
|
|
|
|
|
|
bool update()
|
|
|
|
{
|
2023-10-14 14:38:38 +00:00
|
|
|
tc_vec3_s camera_rotation;
|
|
|
|
tc_get_viewer_rotation(&camera_rotation.x, &camera_rotation.y, &camera_rotation.z);
|
|
|
|
|
2023-10-10 15:06:01 +00:00
|
|
|
SDL_Event event;
|
|
|
|
while(SDL_PollEvent(&event))
|
|
|
|
{
|
|
|
|
switch(event.type)
|
|
|
|
{
|
|
|
|
case SDL_QUIT:
|
2023-10-10 18:01:15 +00:00
|
|
|
SDL_HideWindow(tc_game_state_g.renderer.window);
|
2023-10-10 15:06:01 +00:00
|
|
|
return false;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SDL_WINDOWEVENT:
|
|
|
|
{
|
|
|
|
if(event.window.event == SDL_WINDOWEVENT_RESIZED)
|
|
|
|
{
|
2023-10-13 12:00:49 +00:00
|
|
|
|
2023-10-10 15:06:01 +00:00
|
|
|
}
|
|
|
|
} break;
|
|
|
|
case SDL_KEYDOWN:
|
|
|
|
|
2023-10-11 08:41:58 +00:00
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_Q)
|
|
|
|
{
|
|
|
|
rotate_left = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_E)
|
|
|
|
{
|
|
|
|
rotate_right = true;
|
|
|
|
}
|
|
|
|
|
2023-10-10 15:06:01 +00:00
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_W)
|
|
|
|
{
|
|
|
|
go_forward = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_S)
|
|
|
|
{
|
|
|
|
go_backwards = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_A)
|
|
|
|
{
|
|
|
|
go_left = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_D)
|
|
|
|
{
|
|
|
|
go_right = true;;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_SPACE)
|
|
|
|
{
|
|
|
|
go_up = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_LSHIFT)
|
|
|
|
{
|
|
|
|
shift_pressed = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SDL_KEYUP:
|
|
|
|
|
2023-10-11 08:41:58 +00:00
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_Q)
|
|
|
|
{
|
|
|
|
rotate_left = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_E)
|
|
|
|
{
|
|
|
|
rotate_right = false;
|
|
|
|
}
|
|
|
|
|
2023-10-10 15:06:01 +00:00
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_W)
|
|
|
|
{
|
|
|
|
go_forward = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_S)
|
|
|
|
{
|
|
|
|
go_backwards = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_A)
|
|
|
|
{
|
|
|
|
go_left = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_D)
|
|
|
|
{
|
|
|
|
go_right = false;;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_SPACE)
|
|
|
|
{
|
|
|
|
go_up = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(event.key.keysym.scancode == SDL_SCANCODE_LSHIFT)
|
|
|
|
{
|
|
|
|
shift_pressed = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
break;
|
2023-10-13 12:37:02 +00:00
|
|
|
|
|
|
|
case SDL_MOUSEMOTION:
|
|
|
|
{
|
|
|
|
if(!(event.motion.state & SDL_BUTTON_LMASK)) break;
|
2023-10-14 14:38:38 +00:00
|
|
|
camera_rotation.y += event.motion.xrel / 50.0f;
|
|
|
|
camera_rotation.x += event.motion.yrel / 50.0f;
|
2023-10-13 12:37:02 +00:00
|
|
|
|
2023-10-14 14:38:38 +00:00
|
|
|
if(camera_rotation.x > (3.1415f/2.0f))
|
|
|
|
camera_rotation.x = (3.1415f/2.0f);
|
2023-10-13 12:37:02 +00:00
|
|
|
|
2023-10-14 14:38:38 +00:00
|
|
|
if(camera_rotation.x < -(3.1415f/2.0f))
|
|
|
|
camera_rotation.x = -(3.1415f/2.0f);
|
2023-10-13 12:37:02 +00:00
|
|
|
|
|
|
|
} break;
|
2023-10-10 15:06:01 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-14 14:38:38 +00:00
|
|
|
tc_vec3_s camera_position;
|
|
|
|
tc_get_viewer_position(&camera_position.x, &camera_position.y, &camera_position.z);
|
|
|
|
|
2023-10-10 15:06:01 +00:00
|
|
|
if(shift_pressed)
|
|
|
|
{
|
2023-10-14 14:38:38 +00:00
|
|
|
camera_position.y -= 0.25;
|
2023-10-10 15:06:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(go_up)
|
|
|
|
{
|
2023-10-14 14:38:38 +00:00
|
|
|
camera_position.y += 0.25;
|
2023-10-10 15:06:01 +00:00
|
|
|
}
|
|
|
|
|
2023-10-13 12:37:02 +00:00
|
|
|
|
|
|
|
|
|
|
|
tc_vec3_s difference_in_perspective;
|
|
|
|
difference_in_perspective.x = 0.0f;
|
|
|
|
difference_in_perspective.y = 0.0f;
|
|
|
|
difference_in_perspective.z = 0.0f;
|
|
|
|
|
2023-10-10 15:06:01 +00:00
|
|
|
if(go_left)
|
|
|
|
{
|
2023-10-13 12:37:02 +00:00
|
|
|
difference_in_perspective.x -= 0.45f;
|
2023-10-10 15:06:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(go_right)
|
|
|
|
{
|
2023-10-13 12:37:02 +00:00
|
|
|
difference_in_perspective.x += 0.45f;
|
2023-10-10 15:06:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(go_forward)
|
|
|
|
{
|
2023-10-13 12:37:02 +00:00
|
|
|
difference_in_perspective.z += 0.4f;
|
2023-10-10 15:06:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(go_backwards)
|
|
|
|
{
|
2023-10-13 12:37:02 +00:00
|
|
|
difference_in_perspective.z -= 0.4f;
|
2023-10-10 15:06:01 +00:00
|
|
|
}
|
2023-10-11 08:41:58 +00:00
|
|
|
|
2023-10-13 12:37:02 +00:00
|
|
|
mat4x4 position_matrix;
|
|
|
|
mat4x4_identity(position_matrix);
|
2023-10-11 08:41:58 +00:00
|
|
|
|
2023-10-13 12:37:02 +00:00
|
|
|
mat4x4_translate(position_matrix, difference_in_perspective.x, 0.0f, difference_in_perspective.z);
|
|
|
|
|
2023-10-14 14:38:38 +00:00
|
|
|
mat4x4_rotate_X(position_matrix, position_matrix, camera_rotation.x);
|
|
|
|
mat4x4_rotate_Y(position_matrix, position_matrix, camera_rotation.y);
|
|
|
|
mat4x4_rotate_Z(position_matrix, position_matrix, camera_rotation.z);
|
2023-10-13 12:37:02 +00:00
|
|
|
|
|
|
|
vec4 viewed_difference = { difference_in_perspective.x, 0.0f, difference_in_perspective.z };
|
|
|
|
vec4 raw_difference = { 0.0f, 0.0f, 0.0f };
|
|
|
|
mat4x4_mul_vec4(raw_difference, position_matrix, viewed_difference);
|
|
|
|
|
2023-10-14 14:38:38 +00:00
|
|
|
camera_position.x += raw_difference[0];
|
|
|
|
camera_position.z += raw_difference[2];
|
|
|
|
|
|
|
|
tc_move_viewer_to(camera_position.x, camera_position.y, camera_position.z);
|
|
|
|
tc_rotate_viewer_to(camera_rotation.x, camera_rotation.y, camera_rotation.z);
|
2023-10-11 08:41:58 +00:00
|
|
|
|
2023-10-14 14:38:38 +00:00
|
|
|
tc_game_state_g.main_world->spawn_loader->center.x = ((int32_t) camera_position.x) / 32 - UPDATE_DISTANCE;
|
|
|
|
tc_game_state_g.main_world->spawn_loader->center.y = ((int32_t) camera_position.y) / 32 - UPDATE_DISTANCE;
|
|
|
|
tc_game_state_g.main_world->spawn_loader->center.z = ((int32_t) camera_position.z) / 32 - UPDATE_DISTANCE;
|
2023-10-12 16:52:05 +00:00
|
|
|
|
|
|
|
tc_update_world(tc_game_state_g.main_world);
|
|
|
|
|
2023-10-10 15:06:01 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2023-10-10 10:43:34 +00:00
|
|
|
int main(int argc, char **argv)
|
|
|
|
{
|
2023-10-12 06:18:43 +00:00
|
|
|
tc_init();
|
2023-10-10 10:43:34 +00:00
|
|
|
|
|
|
|
int64_t frame_index = 1;
|
|
|
|
while(frame_index > 0)
|
|
|
|
{
|
2023-10-10 15:06:01 +00:00
|
|
|
if(!update())
|
2023-10-10 10:43:34 +00:00
|
|
|
{
|
2023-10-10 15:06:01 +00:00
|
|
|
frame_index = -1;
|
2023-10-10 10:43:34 +00:00
|
|
|
}
|
|
|
|
render();
|
|
|
|
|
|
|
|
if(frame_index == 1)
|
|
|
|
{
|
2023-10-10 18:01:15 +00:00
|
|
|
SDL_ShowWindow(tc_game_state_g.renderer.window);
|
2023-10-10 10:43:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
++frame_index;
|
|
|
|
SDL_Delay(1000/60);
|
|
|
|
}
|
|
|
|
|
2023-10-10 18:01:15 +00:00
|
|
|
tc_cleanup();
|
2023-10-10 10:43:34 +00:00
|
|
|
SDL_Quit();
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|