void update_game(Game* G) { float delta_time = (float)get_delta_time(G->timer); int ii; _control_camera(G, delta_time); set_view_matrix(G->graphics, mat4_inverse(transform_get_matrix(G->camera))); /* Dynamic Lights */ if(G->dynamic_lights) { G->sun_light.position = mat3_mul_vector(vec3_create(5,5,0), mat3_rotation_y((float)get_running_time(G->timer)*0.5f)); G->light_transform += delta_time; for(ii=0;ii<NUM_LIGHTS;++ii) { if(ii % 2) G->lights[ii].position.z = sinf((G->light_transform + ii * 1.0f)/2.0f) * 10.0f; else G->lights[ii].position.x = sinf((G->light_transform + ii * 1.0f)/2.0f) * 10.0f; } } add_light(G->graphics, G->sun_light); for(ii=0;ii<NUM_LIGHTS;++ii) { add_light(G->graphics, G->lights[ii]); } render_scene(G->scene, G->graphics); G->tap_timer += delta_time; /* Calculate FPS */ G->fps_time += delta_time; G->fps_count++; if(G->fps_time >= 1.0f) { G->fps = G->fps_count/G->fps_time; system_log("FPS: %f\n", G->fps); G->fps_time -= 1.0f; G->fps_count = 0; } { int width, height; float scale = 50.0f; float x = -G->width/2.0f; float y = G->height/2.0f-scale; char buffer[256] = {0}; // FPS sprintf(buffer, "FPS: %.2f", G->fps); add_string(G->ui, x, y, scale, buffer); y -= scale; // Renderer switch(renderer_type(G->graphics)) { case kForward: add_string(G->ui, x, y, scale, "Forward renderer"); break; case kLightPrePass: add_string(G->ui, x, y, scale, "Deferred Lighting"); break; case kDeferred: add_string(G->ui, x, y, scale, "Deferred Shading"); break; default: assert(!"Invalid renderer"); break; } y -= scale; // Resolution graphics_size(G->graphics, &width, &height); sprintf(buffer, "%dx%d", width, height); add_string(G->ui, x, y, scale, buffer); } }
int Game::on_frame(void) { // Handle OS events float delta_x = 0.0f; float delta_y = 0.0f; const SystemEvent* event = app_pop_event(); while (event) { switch(event->type) { case kEventResize: _render->resize(event->data.resize.width, event->data.resize.height); printf("W: %d H: %d\n", event->data.resize.width, event->data.resize.height); break; case kEventKeyDown: if(event->data.key == KEY_ESCAPE) return 1; if(event->data.key == KEY_F1) _render->toggle_debug_graphics(); if(event->data.key == KEY_F2) _render->toggle_deferred(); break; case kEventMouseDown: if(event->data.mouse.button == MOUSE_LEFT) app_lock_and_hide_cursor(); debug_output("Mouse: %.0f %.0f\n", event->data.mouse.x, event->data.mouse.y); break; case kEventMouseUp: if(event->data.mouse.button == MOUSE_LEFT) app_unlock_and_show_cursor(); break; case kEventMouseMove: delta_x += event->data.mouse.x; delta_y += event->data.mouse.y; break; default: break; } event = app_pop_event(); } // Beginning of frame stuff _delta_time = (float)timer_delta_time(&_timer); update_fps(&_fps, _delta_time); float3 xaxis = {1.0f, 0.0f, 0.0f}; quaternion q = quaternionFromAxisAngle(&xaxis, _delta_time*0.15f); Transform t = _world.entity(_sun_id)->transform(); t.orientation = quaternionMultiply(&q, &t.orientation); //_world.entity(_sun_id)->set_transform(t); if(quaternionGetZAxis(&t.orientation).y > 0.0f) { //_world.entity(_sun_id)->deactivate_component(kLightComponent); } else { //_world.entity(_sun_id)->activate_component(kLightComponent); } // Frame _control_camera(delta_x, delta_y); float4x4 view = TransformGetMatrix(&_camera); _render->set_3d_view_matrix(view); _world.update(_delta_time); _render->render(); // End of frame stuff if(++_frame_count % 16 == 0) { debug_output("%.2fms (%.0f FPS)\n", get_frametime(&_fps), get_fps(&_fps)); } return 0; }