metasurf

annotate examples/volume/src/cam.c @ 3:52664d3451ad

added volume rendering example
author John Tsiombikas <nuclear@member.fsf.org>
date Tue, 25 Oct 2011 13:30:03 +0300
parents
children
rev   line source
nuclear@3 1 #include <math.h>
nuclear@3 2 #include "cam.h"
nuclear@3 3
nuclear@3 4 #if defined(__APPLE__) && defined(__MACH__)
nuclear@3 5 #include <OpenGL/gl.h>
nuclear@3 6 #else
nuclear@3 7 #include <GL/gl.h>
nuclear@3 8 #endif
nuclear@3 9
nuclear@3 10 #define DR (M_PI / 180.0)
nuclear@3 11 #define DEG_TO_RAD(x) ((x) * DR)
nuclear@3 12
nuclear@3 13 typedef struct vec3 {
nuclear@3 14 float x, y, z;
nuclear@3 15 } vec3_t;
nuclear@3 16
nuclear@3 17 /* viewing parameters */
nuclear@3 18 #define DEF_THETA 0
nuclear@3 19 #define DEF_PHI 0
nuclear@3 20 #define DEF_DIST 0
nuclear@3 21 #define DEF_X 0
nuclear@3 22 #define DEF_Y 0
nuclear@3 23 #define DEF_Z 0
nuclear@3 24
nuclear@3 25 static float cam_theta = DEF_THETA, cam_phi = DEF_PHI;
nuclear@3 26 static float cam_dist = DEF_DIST;
nuclear@3 27 static vec3_t cam_pos = {DEF_X, DEF_Y, DEF_Z};
nuclear@3 28
nuclear@3 29 /* projection parameters */
nuclear@3 30 #define DEF_VFOV 45.0
nuclear@3 31 #define DEF_ASPECT 1.3333333
nuclear@3 32 #define DEF_NEAR 1.0
nuclear@3 33 #define DEF_FAR 1000.0
nuclear@3 34
nuclear@3 35 static float vfov = DEF_VFOV;
nuclear@3 36 static float aspect = DEF_ASPECT;
nuclear@3 37 static float nearclip = DEF_NEAR, farclip = DEF_FAR;
nuclear@3 38
nuclear@3 39 /* stereo parameters */
nuclear@3 40 #define DEF_EYE_SEP 0.1
nuclear@3 41 #define DEF_FOCUS_DIST 1.0
nuclear@3 42
nuclear@3 43 static float eye_sep = DEF_EYE_SEP;
nuclear@3 44 static float focus_dist = DEF_FOCUS_DIST;
nuclear@3 45
nuclear@3 46 static float pan_speed = 0.001;
nuclear@3 47 static float rot_speed = 0.5;
nuclear@3 48 static float zoom_speed = 0.1;
nuclear@3 49
nuclear@3 50 static float vmin_deg = -90.0, vmax_deg = 90.0;
nuclear@3 51
nuclear@3 52 void cam_reset(void)
nuclear@3 53 {
nuclear@3 54 cam_reset_view();
nuclear@3 55 cam_reset_proj();
nuclear@3 56 cam_reset_stereo();
nuclear@3 57 }
nuclear@3 58
nuclear@3 59 void cam_reset_view(void)
nuclear@3 60 {
nuclear@3 61 cam_theta = DEF_THETA;
nuclear@3 62 cam_phi = DEF_PHI;
nuclear@3 63 cam_dist = DEF_DIST;
nuclear@3 64 cam_pos.x = DEF_X;
nuclear@3 65 cam_pos.y = DEF_Y;
nuclear@3 66 cam_pos.z = DEF_Z;
nuclear@3 67 }
nuclear@3 68
nuclear@3 69 void cam_reset_proj(void)
nuclear@3 70 {
nuclear@3 71 vfov = DEF_VFOV;
nuclear@3 72 aspect = DEF_ASPECT;
nuclear@3 73 nearclip = DEF_NEAR;
nuclear@3 74 farclip = DEF_FAR;
nuclear@3 75 }
nuclear@3 76
nuclear@3 77 void cam_reset_stereo(void)
nuclear@3 78 {
nuclear@3 79 eye_sep = DEF_EYE_SEP;
nuclear@3 80 focus_dist = DEF_FOCUS_DIST;
nuclear@3 81 }
nuclear@3 82
nuclear@3 83 void cam_set_vrange(float min_deg, float max_deg)
nuclear@3 84 {
nuclear@3 85 vmin_deg = min_deg;
nuclear@3 86 vmax_deg = max_deg;
nuclear@3 87 }
nuclear@3 88
nuclear@3 89 void cam_move(float x, float y, float z)
nuclear@3 90 {
nuclear@3 91 cam_pos.x += x;
nuclear@3 92 cam_pos.y += y;
nuclear@3 93 cam_pos.z += z;
nuclear@3 94 }
nuclear@3 95
nuclear@3 96 void cam_rotate(float theta, float phi)
nuclear@3 97 {
nuclear@3 98 cam_phi += phi;
nuclear@3 99 cam_theta += theta;
nuclear@3 100 }
nuclear@3 101
nuclear@3 102 void cam_dolly(float dist)
nuclear@3 103 {
nuclear@3 104 cam_dist += dist;
nuclear@3 105 }
nuclear@3 106
nuclear@3 107 void cam_inp_pan_speed(float speed)
nuclear@3 108 {
nuclear@3 109 pan_speed = speed;
nuclear@3 110 }
nuclear@3 111
nuclear@3 112 void cam_inp_rotate_speed(float speed)
nuclear@3 113 {
nuclear@3 114 rot_speed = speed;
nuclear@3 115 }
nuclear@3 116
nuclear@3 117 void cam_inp_zoom_speed(float speed)
nuclear@3 118 {
nuclear@3 119 zoom_speed = speed;
nuclear@3 120 }
nuclear@3 121
nuclear@3 122
nuclear@3 123 void cam_inp_pan(int dx, int dy)
nuclear@3 124 {
nuclear@3 125 float dxf = dx * pan_speed;
nuclear@3 126 float dyf = dy * pan_speed;
nuclear@3 127 float angle = -DEG_TO_RAD(cam_theta);
nuclear@3 128
nuclear@3 129 cam_pos.x += cos(angle) * dxf + sin(angle) * dyf;
nuclear@3 130 cam_pos.z += -sin(angle) * dxf + cos(angle) * dyf;
nuclear@3 131 }
nuclear@3 132
nuclear@3 133 void cam_inp_height(int dh)
nuclear@3 134 {
nuclear@3 135 cam_pos.y += dh * pan_speed;
nuclear@3 136 }
nuclear@3 137
nuclear@3 138 void cam_inp_rotate(int dx, int dy)
nuclear@3 139 {
nuclear@3 140 cam_theta += dx * rot_speed;
nuclear@3 141 cam_phi += dy * rot_speed;
nuclear@3 142
nuclear@3 143 if(cam_phi < vmin_deg) cam_phi = vmin_deg;
nuclear@3 144 if(cam_phi > vmax_deg) cam_phi = vmax_deg;
nuclear@3 145 }
nuclear@3 146
nuclear@3 147 void cam_inp_zoom(int dz)
nuclear@3 148 {
nuclear@3 149 cam_dist += dz * zoom_speed;
nuclear@3 150 if(cam_dist < 0.001) {
nuclear@3 151 cam_dist = 0.001;
nuclear@3 152 }
nuclear@3 153 }
nuclear@3 154
nuclear@3 155 void cam_clip(float n, float f)
nuclear@3 156 {
nuclear@3 157 nearclip = n;
nuclear@3 158 farclip = f;
nuclear@3 159 }
nuclear@3 160
nuclear@3 161 void cam_fov(float f)
nuclear@3 162 {
nuclear@3 163 vfov = f;
nuclear@3 164 }
nuclear@3 165
nuclear@3 166 void cam_aspect(float a)
nuclear@3 167 {
nuclear@3 168 aspect = a;
nuclear@3 169 }
nuclear@3 170
nuclear@3 171 void cam_separation(float s)
nuclear@3 172 {
nuclear@3 173 eye_sep = s;
nuclear@3 174 }
nuclear@3 175
nuclear@3 176 void cam_focus_dist(float d)
nuclear@3 177 {
nuclear@3 178 focus_dist = d;
nuclear@3 179
nuclear@3 180 cam_separation(d / 30.0);
nuclear@3 181 }
nuclear@3 182
nuclear@3 183 void cam_view_matrix(void)
nuclear@3 184 {
nuclear@3 185 cam_stereo_view_matrix(CAM_CENTER);
nuclear@3 186 }
nuclear@3 187
nuclear@3 188 void cam_stereo_view_matrix(int eye)
nuclear@3 189 {
nuclear@3 190 static const float offs_sign[] = {0.0f, 0.5f, -0.5f}; /* center, left, right */
nuclear@3 191 float offs = eye_sep * offs_sign[eye];
nuclear@3 192
nuclear@3 193 glTranslatef(offs, 0, 0);
nuclear@3 194
nuclear@3 195 glTranslatef(0, 0, -cam_dist);
nuclear@3 196 glRotatef(cam_phi, 1, 0, 0);
nuclear@3 197 glRotatef(cam_theta, 0, 1, 0);
nuclear@3 198 glTranslatef(-cam_pos.x, -cam_pos.y, -cam_pos.z);
nuclear@3 199 }
nuclear@3 200
nuclear@3 201 void cam_proj_matrix(void)
nuclear@3 202 {
nuclear@3 203 cam_stereo_proj_matrix(CAM_CENTER);
nuclear@3 204 }
nuclear@3 205
nuclear@3 206 void cam_stereo_proj_matrix(int eye)
nuclear@3 207 {
nuclear@3 208 float vfov_rad = M_PI * vfov / 180.0;
nuclear@3 209 float top = nearclip * tan(vfov_rad * 0.5);
nuclear@3 210 float right = top * aspect;
nuclear@3 211
nuclear@3 212 static const float offs_sign[] = {0.0f, 1.0, -1.0}; /* center, left, right */
nuclear@3 213 float frust_shift = offs_sign[eye] * (eye_sep * 0.5 * nearclip / focus_dist);
nuclear@3 214
nuclear@3 215 glFrustum(-right + frust_shift, right + frust_shift, -top, top, nearclip, farclip);
nuclear@3 216 }