From 09b288fa25f47975a9cb7159936fe55654f07277 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Wed, 20 Oct 2010 22:05:23 -0700 Subject: Add support for switching the camera. This allows the user to switch the camera between linear interpolation, unmodified C0 bezier curves, G1, and C1 curves. This also renames "G0" to "G1" in the code. --- src/main.cpp | 117 +++++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 82 insertions(+), 35 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index b272f67..c658614 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -45,41 +45,40 @@ static const GLUvec4 linear_control_points[] = { GLUvec4(0.0, 1.5f, 10.0f, 0.0f), GLUvec4(10.0, 1.5f, 0.0f, 0.0f), GLUvec4(-30.0, 1.5f, -30.0f, 0.0f), - }; /** * Basic C0 cameara control curves that hit the points in linear_control_points - * - * FINISHME: Fill these in. */ -#if 0 static const bezier_curve camera_curves[] = { - bezier_curve(GLUvec4(...), // start point - GLUvec4(...), // control - GLUvec4(...), // control - GLUvec4(...)), // end point - ... + bezier_curve(linear_control_points[0], // start point + GLUvec4(10.0f, 3.5f, 20.0f, 0.0f), // control + GLUvec4(15.0f, 3.5f, 5.0f, 0.0f), // control + linear_control_points[1]), // end point + bezier_curve(linear_control_points[1], + GLUvec4(15.0f, 1.5f, -20.0f, 0.0f), + GLUvec4(-10.0f, 1.5f, -35.0f, 0.0f), + linear_control_points[2]), + bezier_curve(linear_control_points[2], + GLUvec4(-40.0f, -0.5f, -10.0f, 0.0f), + GLUvec4(-25.0f, -0.5f, 12.0f, 0.0f), + linear_control_points[0]), + }; -#endif /** * Control curves from camera_curves "fixed" to be G1. * * \sa make_curves_g1 */ -#if 0 static bezier_curve camera_curves_G1[ELEMENTS_OF(camera_curves)]; -#endif /** * Control curves from camera_curves "fixed" to be C1. * * \sa make_curves_c1 */ -#if 0 static bezier_curve camera_curves_C1[ELEMENTS_OF(camera_curves)]; -#endif /** * Positions in 3-space of the spheres. @@ -103,7 +102,8 @@ static float specular_exponent[ELEMENTS_OF(sphere_locations)] = { */ enum { camera_linear, - camera_G0, + camera_C0, + camera_G1, camera_C1, } camera_mode = camera_linear; @@ -161,6 +161,47 @@ Redisplay(const patch_set_info *info) } +static void +update_camera(float total_t) +{ + /* Figure out which segment is active based on the + * following rules: + * Segment 0 is active from [0, 4) seconds (4 seconds) + * Segment 1 is active from [4, 6) seconds (2 seconds) + * Segment 2 is active from [6, 10) seconds (4 seconds) + * + * Also map the time to the interval [0, 1] (t_segment) + */ + int active_segment; + float t_segment; + if (total_t < 4.0) { + active_segment = 0; + t_segment = total_t / 4.0; + } else if (total_t < 6.0) { + active_segment = 1; + t_segment = (total_t - 4.0) / 2.0; + } else { + active_segment = 2; + t_segment = (total_t - 6.0) / 4.0; + } + + switch (camera_mode) { + case camera_linear: + eye = (1.0 - t_segment) * linear_control_points[active_segment] + t_segment * linear_control_points[(active_segment + 1) % ELEMENTS_OF(linear_control_points)]; + break; + case camera_C0: + eye = camera_curves[active_segment].position(t_segment); + break; + case camera_G1: + eye = camera_curves_G1[active_segment].position(t_segment); + break; + case camera_C1: + eye = camera_curves_C1[active_segment].position(t_segment); + break; + }; +} + + static void Idle(void) { @@ -174,24 +215,10 @@ Idle(void) if (anim) { static float total_t = 0.0; - /* FINISHME: Perform some calculations so that the - * FINISHME: timer wraps around to zero when the last - * FINISHME: segment of the camera track is completed. - */ + // Make the timer wrap around to zero after 10 seconds. total_t = fmod(total_t + dt, 10.0); - /* FINISHME: Based on the timer, determine which - * FINISHME: segment of the camera track is active. - */ - - /* FINISHME: Calculate t_segment as the time within the - * FINISHME: active segment. - */ - - - /* FINISHME: Calculate the camera position from the - * FINISHME: active segement and t_segment. - */ + update_camera(total_t); } } @@ -334,6 +361,10 @@ Init(void) printf("Keyboard input:\n" " f: Toggle fullscreen.\n" " a: Toggle animation of object.\n" + " 1: Use linear interpolation for camera position.\n" + " 2: Use C0 bezier curves for camera position.\n" + " 3: Use G1 bezier curves for camera position.\n" + " 4: Use C1 bezier curves for camera position.\n" " c: Re-load and compile shader program code.\n" " ESC: Exit program.\n"); @@ -370,18 +401,34 @@ Key(SDLKey sym, bool state) if (!state) return; - /* FINISHME: Add controls to cycle through the 3 camera control modes. - */ - switch (sym) { case SDLK_ESCAPE: done = true; break; - case 'f': SDL_WM_ToggleFullScreen(my_surf); break; + case '1': + printf("Switching to linear camera...\n"); + camera_mode = camera_linear; + break; + + case '2': + printf("Switching to C0 camera...\n"); + camera_mode = camera_C0; + break; + + case '3': + printf("Switching to G1 camera...\n"); + camera_mode = camera_G1; + break; + + case '4': + printf("Switching to C1 camera...\n"); + camera_mode = camera_C1; + break; + case ' ': case 'a': anim = !anim; -- cgit v1.2.3