istereo

diff src/cam.c @ 20:21d58290e634

forgot the cam files
author John Tsiombikas <nuclear@mutantstargoat.com>
date Wed, 07 Sep 2011 10:15:35 +0300
parents
children ff055bff6a15
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/cam.c	Wed Sep 07 10:15:35 2011 +0300
     1.3 @@ -0,0 +1,170 @@
     1.4 +#include <math.h>
     1.5 +#include "opengl.h"
     1.6 +#include "cam.h"
     1.7 +#include "sanegl.h"
     1.8 +
     1.9 +#define DEG_TO_RAD(x)	(M_PI * (x) / 180.0)
    1.10 +
    1.11 +typedef struct vec3 {
    1.12 +	float x, y, z;
    1.13 +} vec3_t;
    1.14 +
    1.15 +/* viewing parameters */
    1.16 +#define DEF_THETA	0
    1.17 +#define DEF_PHI		0
    1.18 +#define DEF_DIST	0
    1.19 +#define DEF_X		0
    1.20 +#define DEF_Y		0
    1.21 +#define DEF_Z		0
    1.22 +
    1.23 +static float cam_theta = DEF_THETA, cam_phi = DEF_PHI;
    1.24 +static float cam_dist = DEF_DIST;
    1.25 +static vec3_t cam_pos = {DEF_X, DEF_Y, DEF_Z};
    1.26 +static float cam_speed = 1.0;
    1.27 +
    1.28 +/* projection parameters */
    1.29 +#define DEF_VFOV	45.0
    1.30 +#define DEF_ASPECT	1.3333333
    1.31 +#define DEF_NEAR	1.0
    1.32 +#define DEF_FAR		1000.0
    1.33 +
    1.34 +static float vfov = DEF_VFOV;
    1.35 +static float aspect = DEF_ASPECT;
    1.36 +static float nearclip = DEF_NEAR, farclip = DEF_FAR;
    1.37 +
    1.38 +/* stereo parameters */
    1.39 +#define DEF_EYE_SEP		0.1
    1.40 +#define DEF_FOCUS_DIST	1.0
    1.41 +
    1.42 +static float eye_sep = DEF_EYE_SEP;
    1.43 +static float focus_dist = DEF_FOCUS_DIST;
    1.44 +
    1.45 +
    1.46 +static float rot_speed = 0.5;
    1.47 +static float zoom_speed = 0.1;
    1.48 +
    1.49 +void cam_reset(void)
    1.50 +{
    1.51 +	cam_reset_view();
    1.52 +	cam_reset_proj();
    1.53 +	cam_reset_stereo();
    1.54 +}
    1.55 +
    1.56 +void cam_reset_view(void)
    1.57 +{
    1.58 +	cam_theta = DEF_THETA;
    1.59 +	cam_phi = DEF_PHI;
    1.60 +	cam_dist = DEF_DIST;
    1.61 +	cam_pos.x = DEF_X;
    1.62 +	cam_pos.y = DEF_Y;
    1.63 +	cam_pos.z = DEF_Z;
    1.64 +}
    1.65 +
    1.66 +void cam_reset_proj(void)
    1.67 +{
    1.68 +	vfov = DEF_VFOV;
    1.69 +	aspect = DEF_ASPECT;
    1.70 +	nearclip = DEF_NEAR;
    1.71 +	farclip = DEF_FAR;
    1.72 +}
    1.73 +
    1.74 +void cam_reset_stereo(void)
    1.75 +{
    1.76 +	eye_sep = DEF_EYE_SEP;
    1.77 +	focus_dist = DEF_FOCUS_DIST;
    1.78 +}
    1.79 +
    1.80 +void cam_pan(int dx, int dy)
    1.81 +{
    1.82 +	float dxf = dx * cam_speed;
    1.83 +	float dyf = dy * cam_speed;
    1.84 +	float angle = -DEG_TO_RAD(cam_theta);
    1.85 +
    1.86 +	cam_pos.x += cos(angle) * dxf + sin(angle) * dyf;
    1.87 +	cam_pos.z += -sin(angle) * dxf + cos(angle) * dyf;
    1.88 +}
    1.89 +
    1.90 +void cam_height(int dh)
    1.91 +{
    1.92 +	cam_pos.y += dh * cam_speed;
    1.93 +}
    1.94 +
    1.95 +void cam_rotate(int dx, int dy)
    1.96 +{
    1.97 +	cam_theta += dx * rot_speed;
    1.98 +	cam_phi += dy * rot_speed;
    1.99 +
   1.100 +	if(cam_phi < -90) cam_phi = -90;
   1.101 +	if(cam_phi > 90) cam_phi = 90;
   1.102 +}
   1.103 +
   1.104 +void cam_zoom(int dz)
   1.105 +{
   1.106 +	cam_dist += dz * zoom_speed;
   1.107 +	if(cam_dist < 0.001) {
   1.108 +		cam_dist = 0.001;
   1.109 +	}
   1.110 +}
   1.111 +
   1.112 +void cam_clip(float n, float f)
   1.113 +{
   1.114 +	nearclip = n;
   1.115 +	farclip = f;
   1.116 +}
   1.117 +
   1.118 +void cam_fov(float f)
   1.119 +{
   1.120 +	vfov = f;
   1.121 +}
   1.122 +
   1.123 +void cam_aspect(float a)
   1.124 +{
   1.125 +	aspect = a;
   1.126 +}
   1.127 +
   1.128 +void cam_separation(float s)
   1.129 +{
   1.130 +	eye_sep = s;
   1.131 +}
   1.132 +
   1.133 +void cam_focus_dist(float d)
   1.134 +{
   1.135 +	focus_dist = d;
   1.136 +
   1.137 +	cam_separation(d / 30.0);
   1.138 +}
   1.139 +
   1.140 +void cam_view_matrix(void)
   1.141 +{
   1.142 +	cam_stereo_view_matrix(CAM_CENTER);
   1.143 +}
   1.144 +
   1.145 +void cam_stereo_view_matrix(int eye)
   1.146 +{
   1.147 +	static const float offs_sign[] = {0.0f, 0.5f, -0.5f};	/* center, left, right */
   1.148 +	float offs = eye_sep * offs_sign[eye];
   1.149 +
   1.150 +	gl_translatef(offs, 0, 0);
   1.151 +
   1.152 +	gl_translatef(0, 0, -cam_dist);
   1.153 +	gl_rotatef(cam_phi, 1, 0, 0);
   1.154 +	gl_rotatef(cam_theta, 0, 1, 0);
   1.155 +	gl_translatef(-cam_pos.x, -cam_pos.y, -cam_pos.z);
   1.156 +}
   1.157 +
   1.158 +void cam_proj_matrix(void)
   1.159 +{
   1.160 +	cam_stereo_proj_matrix(CAM_CENTER);
   1.161 +}
   1.162 +
   1.163 +void cam_stereo_proj_matrix(int eye)
   1.164 +{
   1.165 +	float vfov_rad = M_PI * vfov / 180.0;
   1.166 +	float top = nearclip * tan(vfov_rad * 0.5);
   1.167 +	float right = top * aspect;
   1.168 +
   1.169 +	static const float offs_sign[] = {0.0f, 1.0, -1.0};	/* center, left, right */
   1.170 +	float frust_shift = offs_sign[eye] * (eye_sep * 0.5 * nearclip / focus_dist);
   1.171 +
   1.172 +	gl_frustum(-right + frust_shift, right + frust_shift, -top, top, nearclip, farclip);
   1.173 +}