diff options
Diffstat (limited to 'src/game/game.c')
-rw-r--r-- | src/game/game.c | 126 |
1 files changed, 101 insertions, 25 deletions
diff --git a/src/game/game.c b/src/game/game.c index 25c71fa..47d70eb 100644 --- a/src/game/game.c +++ b/src/game/game.c @@ -1,41 +1,117 @@ -void game_init(State *state) +void init(State *state) { - U64 persistent_size = Megabytes(1); - state->persistent_arena = arena_alloc(persistent_size); - state->shader = create_shader_program(str8lit("shaders/default.vert"), - str8lit("shaders/default.frag")); - Vertex verts[] = { - vertex(v3(-0.5f, -0.5f, 0.0f)), - vertex(v3(0.0f, 0.5f, 0.0f)), - vertex(v3(0.5f, -0.5f, 0.0f)) - }; - - U32 indices[] = { 0, 1, 2 }; - - state->the_mesh = mesh(state->persistent_arena, verts, ArrayCount(verts), indices, ArrayCount(indices)); + U32 nmeshes; + Mesh *meshes; + + state->parena = arena_alloc(Kilobytes(256)); + + state->camera = camera_init(v3(0.0f, 0.0f, 3.0f), + 90.0f, 0.1f, 100.0f, + 0.0f, 0.0f, 0.0f); + state->camera_dp = V3_ZERO; + + state->mesh_shader = load_shader("shaders/default.vert", 0, "shaders/default.frag"); + state->ui_shader = load_shader("shaders/ui.vert", 0, "shaders/ui.frag"); + + state->texture = load_texture(state->parena, str8lit("data/textures/grid.png"), 0); + + nmeshes = 2; + meshes = arena_push(state->parena, nmeshes*sizeof(Mesh)); + meshes[0] = *mesh_gen_circle(state->parena, v3(0.0f, 0.0f, 2.0f), V3_ZERO, 3.0f, 6); + meshes[1] = *mesh_gen_quad(state->parena, V3_ZERO, v3(0.0f, 90.0f, 0.0f), 2.0f, 2.0f); + + mesh_add_texture(&meshes[0], state->texture); + + state->model = model_init(state->parena, V3_ZERO, V3_ZERO, meshes, nmeshes); } -void game_update_and_render(State *state, Input *input) +void update_camera_first_person(State *state, Input *input, F32 speed, F32 mouse_sens) +{ + V3 ddp, r, u, f; + + camera_get_vectors_first_person(&state->camera, &r, &u, &f); + ddp = V3_ZERO; + if (key_is_pressed(input->move_forward)) + ddp = v3add(ddp, v3inv(f)); + if (key_is_pressed(input->move_backward)) + ddp = v3add(ddp, f); + if (key_is_pressed(input->move_right)) + ddp = v3add(ddp, r); + if (key_is_pressed(input->move_left)) + ddp = v3add(ddp, v3inv(r)); + if (key_is_pressed(input->move_up)) + ddp = v3add(ddp, u); + if (key_is_pressed(input->move_down)) + ddp = v3add(ddp, v3inv(u)); + ddp = v3norm(ddp); + + state->camera.pos = v3add(state->camera.pos, state->camera_dp); + state->camera_dp = v3scalef(v3add(state->camera_dp, v3scalef(ddp, input->dt*speed)), 0.8f); + + /* NOTE(pryazha): Camera angles */ + if (input->capture_mouse) { + state->camera.yaw += input->mouse_offset.x*mouse_sens; + state->camera.pitch += input->mouse_offset.y*mouse_sens; + if (state->camera.pitch > 89.0f) + state->camera.pitch = 89.0f; + if (state->camera.pitch < -89.0f) + state->camera.pitch = -89.0f; + } +} + +void update_and_render(Window *wnd, State *state, Input *input) { /* NOTE(pryazha): Update */ - if (key_is_pressed(input->exit)) - input->is_running = 0; + if (key_first_press(input->exit)) { + if (input->capture_mouse) { + input->capture_mouse = 0; + } else { + input->is_running = 0; + } + } + + /* NOTE(pryazha): Camera movement */ + update_camera_first_person(state, input, 1.0f, 0.3f); + + state->model->rotate.z += 20.0f*input->dt; + state->model->rotate.x += 20.0f*input->dt; /* NOTE(pryazha): Render */ + MAT4 proj, view; + F32 ar; + Arena *ui_arena; + + glViewport(0, 0, wnd->width, wnd->height); + glClearColor(0.15f, 0.15f, 0.15f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); + + ar = (F32)wnd->width/(F32)wnd->height; + proj = camera_persp(state->camera, ar); + view = camera_get_view_matrix_first_person(&state->camera); + + model_draw(state->mesh_shader, &proj, &view, state->model); + + glUseProgram(state->ui_shader); + proj = ortho(0.0f, (F32)wnd->width, 0.0f, (F32)wnd->height, -1.0f, 1.0f); + shader_set_mat4fv(state->ui_shader, "proj", proj); + ui_arena = arena_alloc(0); + glDisable(GL_DEPTH_TEST); + + if (button(wnd, state->ui_shader, input, ui_arena, str8lit("some name"), + v2(wnd->width/8.0f, wnd->height/8.0f), 50.0f, 30.0f)) + { + input->capture_mouse = 1; + } - glUseProgram(state->shader); - F32 angle = 20.0f*state->t; - Mat4 model = mat4rotate(MAT4_IDENTITY, v3(0.0f, 0.0f, angle)); - shader_set_mat4fv(state->shader, "model", model); - mesh_draw(*state->the_mesh); + glEnable(GL_DEPTH_TEST); glUseProgram(0); + arena_release(ui_arena); state->t += input->dt; } -void game_clear(State *state) +void clear(State *state) { - arena_release(state->persistent_arena); + arena_release(state->parena); } |