summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2010-10-20 22:05:23 -0700
committerKenneth Graunke <kenneth@whitecape.org>2010-10-21 00:30:36 -0700
commit09b288fa25f47975a9cb7159936fe55654f07277 (patch)
treeb4ae157fa85a020976b82da9dd163617ad9b965d
parentc6fdaaa42dc9c9365c260cc606df10f88425d479 (diff)
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.
-rwxr-xr-xsrc/main.cpp117
1 files 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;
@@ -162,6 +162,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)
{
static Uint32 last_t = ~0;
@@ -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;