Beispiel #1
0
void OnTimer(int value)
{
	// Move the camera using user input
	if (keyIsDown('a'))
	{
		vec3 dir = VectorSub(targetPos, cameraPos);
		vec3 right_vec = CrossProduct(dir, upVector);
		right_vec = Normalize(right_vec);

		cameraPos = VectorSub(cameraPos, right_vec);
		targetPos = VectorSub(targetPos, right_vec);
	}
	else if (keyIsDown('d'))
	{
		vec3 dir = VectorSub(targetPos, cameraPos);
		vec3 right_vec = CrossProduct(dir, upVector);
		right_vec = Normalize(right_vec);

		cameraPos = VectorAdd(cameraPos, right_vec);
		targetPos = VectorAdd(targetPos, right_vec);
	}

	if (keyIsDown('w'))
	{
		vec3 dir = VectorSub(targetPos, cameraPos);
		dir = Normalize(dir);
		cameraPos = VectorAdd(cameraPos, dir);
		targetPos = VectorAdd(targetPos, dir);
	}
	if (keyIsDown('s'))
	{
		vec3 dir = VectorSub(targetPos, cameraPos);
		dir = Normalize(dir);
		cameraPos = VectorSub(cameraPos, dir);
		targetPos = VectorSub(targetPos, dir);
	}

	glutPostRedisplay();
	glutTimerFunc(20, &OnTimer, value);
}
Beispiel #2
0
void check_keys(void){
        VectorSub(&obj_pos, &cam_pos, &vdiff);
        if(keyIsDown('w')){
                ScalarMult(&vdiff, move_speed, &vdiff);
                Normalize(&vdiff);
                VectorAdd(&vdiff, &cam_pos, &cam_pos);
                VectorAdd(&vdiff, &obj_pos, &obj_pos);
        } else if (keyIsDown('s')) {
                ScalarMult(&vdiff, move_speed, &vdiff);
                Normalize(&vdiff);
                VectorSub(&cam_pos, &vdiff, &cam_pos);
                VectorSub(&obj_pos, &vdiff, &obj_pos);
        } else if (keyIsDown('a')) {
                CrossProduct(&up, &vdiff, &vdiff);
                Normalize(&vdiff);
                ScalarMult(&vdiff, move_speed, &vdiff);
                VectorAdd(&vdiff, &cam_pos, &cam_pos);
                VectorAdd(&vdiff, &obj_pos, &obj_pos);
        } else if (keyIsDown('d')) {
                CrossProduct(&up, &vdiff, &vdiff);
                Normalize(&vdiff);
                ScalarMult(&vdiff, move_speed, &vdiff);
                VectorSub(&cam_pos, &vdiff, &cam_pos);
                VectorSub(&obj_pos, &vdiff, &obj_pos);
        } else if (keyIsDown('u')) {
                cam_pos.y += 0.1;
                obj_pos.y += 0.1;
        } else if (keyIsDown('j')) {
                cam_pos.y -= 0.1;
                obj_pos.y -= 0.1;
        } else if (keyIsDown('r')) {
                if(dr < 80){
                        dr += 0.5; 
                }
        } else if (keyIsDown('t')) {
                if(dr > -80){
                        dr -= 0.5; 
                }
        } else if (keyIsDown('q')) {
                exit(0);
        }
}
Beispiel #3
0
void checkKeyDowns()
{
	
	
	
	
	if (keyIsDown('d'))
	{
		vec3 lp = VectorSub(l,p);
		vec3 dir = CrossProduct(v, lp);
		p = VectorSub(p, ScalarMult(Normalize(dir), 0.1));
		l = VectorSub(l, ScalarMult(Normalize(dir), 0.1));
	}
	if (keyIsDown('a'))
	{
		vec3 lp = VectorSub(l,p);
		vec3 dir = CrossProduct(lp, v);
		p = VectorSub(p, ScalarMult(Normalize(dir), 0.1));
		l = VectorSub(l, ScalarMult(Normalize(dir), 0.1));
	}
	if (keyIsDown('s'))
	{
		vec3 lp = VectorSub(l,p);
		p = VectorSub(p, ScalarMult(Normalize(lp), 0.1));
		l = VectorSub(l, ScalarMult(Normalize(lp), 0.1));
	}
	if (keyIsDown('w'))
	{
		vec3 lp = VectorSub(l,p);
		p = VectorAdd(p, ScalarMult(Normalize(lp), 0.1));
		l = VectorAdd(l, ScalarMult(Normalize(lp), 0.1));
	}
	if (keyIsDown('r'))
	{
		vec3 lp = VectorSub(l,p);
		vec3 dir = CrossProduct(v, lp);
		l = VectorSub(l, ScalarMult(Normalize(dir), 0.5));
	}
	if (keyIsDown('e'))
	{
		vec3 lp = VectorSub(l,p);
		vec3 dir = CrossProduct(v, lp);
		l = VectorAdd(l, ScalarMult(Normalize(dir), 0.5));
	}
	
	/*
	float y1 = ttex.imageData[((int)p.x + (int)p.z * ttex.width) * (ttex.bpp/8)] / 25.0;
	float y2 = ttex.imageData[(((int)p.x + 1) + ((int)p.z + 1) * ttex.width) * (ttex.bpp/8)] / 25.0;
	float diff = ((p.x - (int)p.x) + (p.z - (int)p.z))/2;
	float yDiff = y2-y1;
	float y = y1 + diff * yDiff + 5;			
	p.y = y;
	l.y = y;
	*/
	//printf("X : %4.2f - Y : %4.2f - Z : %4.2f\n", p.x, p.y, p.z);	
}
Beispiel #4
0
void OnTimer(int value) {
	xModify = 0.0;
	zModify = 0.0;
	
	
	if (keyIsDown('w')){
		zModify = -0.08;
	} 
	if (keyIsDown('s')){
		zModify = 0.08;
	} 
	if (keyIsDown('a')){
		xModify = -0.08;
	} 
	if (keyIsDown('d')){
		xModify = 0.08;
	}

	xValue += xModify;
	zValue += zModify;

    glutPostRedisplay();
    glutTimerFunc(20, &OnTimer, value);
}
Beispiel #5
0
void check_keys(void){
        VectorSub(&obj_pos, &cam_pos, &vdiff);
        if(!fly){
                vdiff.y = 0;
        }
        if(keyIsDown('w')){
                ScalarMult(&vdiff, move_speed, &vdiff);
                Normalize(&vdiff);
                VectorAdd(&vdiff, &cam_pos, &cam_pos);
                if(!fly){
                        cam_pos.y = calculate_height(cam_pos.x, cam_pos.z, ttex.width, vertexArray) + cam_height;
                }
                VectorAdd(&vdiff, &obj_pos, &obj_pos);
        } else if (keyIsDown('s')) {
                ScalarMult(&vdiff, move_speed, &vdiff);
                Normalize(&vdiff);
                VectorSub(&cam_pos, &vdiff, &cam_pos);
                if(!fly){
                        cam_pos.y = calculate_height(cam_pos.x, cam_pos.z, ttex.width, vertexArray) + cam_height;
                }
                VectorSub(&obj_pos, &vdiff, &obj_pos);
        } else if (keyIsDown('a')) {
                CrossProduct(&up, &vdiff, &vdiff);
                Normalize(&vdiff);
                ScalarMult(&vdiff, move_speed, &vdiff);
                VectorAdd(&vdiff, &cam_pos, &cam_pos);
                if(!fly){
                        cam_pos.y = calculate_height(cam_pos.x, cam_pos.z, ttex.width, vertexArray) + cam_height;
                }
                VectorAdd(&vdiff, &obj_pos, &obj_pos);
        } else if (keyIsDown('d')) {
                CrossProduct(&up, &vdiff, &vdiff);
                Normalize(&vdiff);
                ScalarMult(&vdiff, move_speed, &vdiff);
                VectorSub(&cam_pos, &vdiff, &cam_pos);
                if(!fly){
                        cam_pos.y = calculate_height(cam_pos.x, cam_pos.z, ttex.width, vertexArray) + cam_height;
                }
                VectorSub(&obj_pos, &vdiff, &obj_pos);                                
        } else if (keyIsDown('q')) {
                exit(0);
        } else if (keyIsDown('p')) {
                printf("Your position is; x=%f, y=%f, z=%f\n", cam_pos.x, cam_pos.y, cam_pos.z);
                printf("Ground height is; y=%f\n", calculate_height(cam_pos.x, cam_pos.z, ttex.width, vertexArray));
        } else if (keyIsDown('f')){
                fly = !fly; 
        }
}
Beispiel #6
0
void checkKeyDowns()
{
	if (keyIsDown('d'))
	{
		vec3 lp = VectorSub(l,p);
		vec3 dir = CrossProduct(v, lp);
		p = VectorSub(p, Normalize(dir));
		l = VectorSub(l, Normalize(dir));
	}
	if (keyIsDown('a'))
	{
		vec3 lp = VectorSub(l,p);
		vec3 dir = CrossProduct(lp, v);
		p = VectorSub(p, Normalize(dir));
		l = VectorSub(l, Normalize(dir));
	}
	if (keyIsDown('s'))
	{
		vec3 lp = VectorSub(l,p);
		p = VectorSub(p, Normalize(lp));
		l = VectorSub(l, Normalize(lp));
	}
	if (keyIsDown('w'))
	{
		vec3 lp = VectorSub(l,p);
		p = VectorAdd(p, Normalize(lp));
		l = VectorAdd(l, Normalize(lp));
	}
	if (keyIsDown('r'))
	{
		vec3 lp = VectorSub(l,p);
		vec3 dir = CrossProduct(v, lp);
		l = VectorSub(l, Normalize(dir));
	}
	if (keyIsDown('e'))
	{
		vec3 lp = VectorSub(l,p);
		vec3 dir = CrossProduct(v, lp);
		l = VectorAdd(l, Normalize(dir));
	}
	//printf("X : %4.2f - Y : %4.2f - Z : %4.2f\n", p.x, p.y, p.z);	
}
Beispiel #7
0
void check_keyboard()
{
    if(keyIsDown('q')) {
        exit(0);
    } else if(keyIsDown('w')) {
        cam_pos.z -= 1.0;

    } else if(keyIsDown('s')) {
        cam_pos.z += 1.0;
    } else if(keyIsDown('a')) {
        cam_pos.x -= 1.0;
    } else if(keyIsDown('d')) {
        cam_pos.x += 1.0;
    } else if(keyIsDown('u')) {
        cam_pos.x = 0;
        cam_pos.y = 0;
        cam_pos.z = 1;
    }

}
Beispiel #8
0
void OnTimer(int value)
{
	glutTimerFunc(20, &OnTimer, value);

	old_t = t;
	t = (GLfloat)glutGet(GLUT_ELAPSED_TIME)/1000.0;
	delta_t = (t - old_t);
	//printf("%f\n", delta_t);

	GLfloat tmpppp[3] = {cow.pos.x, cow.pos.y, cow.pos.z};
	glUniform3fv(glGetUniformLocation(g_shader, "cow_pos"), 1, tmpppp);


	turn_cow(&cow, -m_angle);
	update_cow(&cow, delta_t);
	update_fence(&ff, &cow, delta_t);
	move_cow(&cow, m_angle);
	update_floor(&f, &cow);
	update_wall(&wall, &cow, delta_t);
	update_ball(&ball, &cow, delta_t);
	update_farmer(&farmer);
        if(keyIsDown('k'))
	update_ragdoll(&ragdoll, delta_t);

	if(check_collision_2(&cow.bb, &wall.bb))
	{
	  //printf("yey\n");
	  glUniform1i(glGetUniformLocation(g_shader, "collision"), 1);
	  //cow.momentum = SetVector(-cow.momentum.x, cow.momentum.y, -cow.momentum.z);
	  //wall_collision(wall, cow);
	}
	else
	  glUniform1i(glGetUniformLocation(g_shader, "collision"), 0);



	//printf("%f, %f\n", delta_t, old_t);
	glUniform1f(glGetUniformLocation(g_shader, "time"), t);


	mat4 proj_matrix = frustum(-1, 1, -1, 1, 1, 750.0);
	mat4 cam_matrix = lookAt(cam_dist*cos(m_angle)+cow.pos.x, 9+cow.pos.y,  cam_dist*sin(m_angle)+cow.pos.z, cow.pos.x, 8.5+cow.pos.y, cow.pos.z, 0.0, 1.0, 0.0);
	//mat4 cam_matrix = lookAt(200+200*cos(cam_angle), 0,  200, 0, 8, 0, 0.0, 1.0, 0.0);

	//g_shader = loadShaders("shader.vert" , "shader.frag");
	//glUseProgram(g_shader);

	glUniformMatrix4fv(glGetUniformLocation(g_shader, "proj_matrix"), 1, GL_TRUE, proj_matrix.m);
	glUniformMatrix4fv(glGetUniformLocation(g_shader, "cam_matrix"), 1, GL_TRUE, cam_matrix.m);
	//glutDisplayFunc(DisplayWindow);

	//draw_cow(&cow, g_shader);
	//draw_bone(&bone, g_shader);

	mat4 tmp, testjoint, testjoint2;
	testjoint = IdentityMatrix();

	joint_s * j = &head_joint[0];
	joint_s * jc = j->child[0];
	joint_s * jcc = jc->child[0];
	//joint_s * jp = j->parent;
	//joint_s * jpp = jp->parent;

	float Ms[8][4*4];
	float legMs[8][4*4];
	float currpos[8*3] = {0};
	float bonepos[8*3] = {0};
	float legcurrpos[8*3] = {0};
	float legbonepos[8*3] = {0};
	//GLfloat * Mtmp = Ms;
	int i=0, ii=0;
	//jc->R = ArbRotate(SetVector(0,0,1), cos(4*t/(i+1))/2.5);
	//j->R = ArbRotate(SetVector(0,0,1), 0);
	j->R = ArbRotate(SetVector(0,0,1), sin(4*t/(3+1))/1.2);
	//jcc->R = ArbRotate(SetVector(0,0,1), cos(8*t/(2+1))/4);
	mat4 Mpacc, Minvacc, tmptrans, tmppp, invtrans;
	tmppp = IdentityMatrix();


	float freq = 7;//Norm(cow.speed)/4;

	if(Norm(cow.momentum) < .5)
	  freq = 0;
	else if(Norm(cow.momentum) > 5)
	  freq = 20;
	//printf("%f\n", freq);

	j = &thigh_joint[0];
	jc = j->child[0];
	j->R = ArbRotate(SetVector(0,0,1), sin(freq*t)/1.5);
	jc->R = ArbRotate(SetVector(0,0,1), cos(freq*t)/2.5);

	j = &thigh_joint[1];
	jc = j->child[0];
	j->R = ArbRotate(SetVector(0,0,1), -cos(freq*t)/2.5);
	jc->R = ArbRotate(SetVector(0,0,1), sin(freq*t)/2.5);


	j = &thigh_joint[2];
	jc = j->child[0];
	j->R = ArbRotate(SetVector(0,0,1), sin(freq*t)/1.5);
	jc->R = ArbRotate(SetVector(0,0,1), cos(freq*t)/2.5);

	j = &thigh_joint[3];
	jc = j->child[0];
	j->R = ArbRotate(SetVector(0,0,1), -cos(freq*t)/2.5);
	jc->R = ArbRotate(SetVector(0,0,1), sin(freq*t)/2.5);


	j = &legbase_joint[0];
	//j->R = ArbRotate(SetVector(1,0,0), -cos(7*t/(i+1)));
	//j->R = ArbRotate(SetVector(1,0,0), -M_PI/6);

	j = &thigh_joint[0];
	//j->R = Mult(ArbRotate(SetVector(1,0,0), cos(7*t/(i+1))), j->R);
	//j->R = Mult(ArbRotate(SetVector(1,0,0), M_PI/6), j->R);

	i = 0;
	tmppp = IdentityMatrix();
	//legbase_joint[0].R = ArbRotate(SetVector(0,0,1), cos(3*t)/2);

	//legs
	calc_bone_transform(&legbase_joint[0], 0);
	calc_bone_transform(&legbase_joint[1], 0);
	calc_bone_transform(&legbase_joint[2], 0);
	calc_bone_transform(&legbase_joint[3], 0);

	j = &tail_joint[0];
	j->R = ArbRotate(SetVector(0,0,1), -M_PI/2.5);
	j = &tail_joint[1];
	j->R = ArbRotate(SetVector(0,0,1), -M_PI/8.5);

	//j = &tail_joint[1];
	//j->R = ArbRotate(SetVector(0,0,1), 0);
	j = &tail_joint[2];
	//j->R = ArbRotate(SetVector(0,0,1), 0);
	j = &tail_joint[3];
	j->R = ArbRotate(SetVector(0,0,1), 0);

	//body
	j = &body_joint[1];
	//j->R = ArbRotate(SetVector(0,0,1), cos(t*7)/9.5);
	j->R = ArbRotate(SetVector(0,1,0), m_angle + cow.angle);
	j->R = Mult(j->R, ArbRotate(SetVector(0,0,1), cos(freq*t)/9));

	calc_bone_transform(&body_joint[0],0);

	//tail
	//j = &tail_joint[1];
	//j->R = ArbRotate(SetVector(0,0,1), -M_PI/2.5);

	//j = &tail_joint[1];
	//j->R = ArbRotate(SetVector(0,0,1), 0);

	//j = &tail_joint[2];
	//j->R = ArbRotate(SetVector(0,0,1), 0);

	//j = &tail_joint[3];
	//j->R = ArbRotate(SetVector(0,0,1), 0);

	//calc_bone_transform(&tail_joint[0],0);

	//head
	j = &head_joint[0];

	j->R = ArbRotate(SetVector(0,0,1), sin(7*t)/9.5);

	calc_bone_transform(&head_joint[0],0);



	j = &farmer.skeleton.joints[2];
	//j->R = Rx(cos(4*t));
	j->R = Mult(Rx(M_PI/2.2 + sin(5*t)/11), Ry(cos(-5*t)/2));

	j = &farmer.skeleton.joints[3];
	//j->R = Rx(cos(4*t));
	j->R = Mult(Rx(-M_PI/2.2 + sin(5*t)/11), Ry(cos(5*t)/2));

	//left shoulder (her right)
	//jc = &farmer.skeleton.joints[3];
	//jc->R = Rx(-sin(3*t));

	jc = &farmer.skeleton.joints[4];
	jc->R = Ry(M_PI/3 + cos(5*t)/8);

	jc = &farmer.skeleton.joints[5];
	jc->R = Ry(-M_PI/3 + cos(5*t)/8);


	jc = &farmer.skeleton.joints[10];
	//jc->R = Rz(M_PI/3);
	jc->R = Rz(.5-cos(5*t));

	jc = &farmer.skeleton.joints[12];
	jc->R = Rz((-1-cos(5*t))/2);


	jc = &farmer.skeleton.joints[11];
	//jc->R = Rz(M_PI/3);
	jc->R = Rz(.5+cos(5*t));

	jc = &farmer.skeleton.joints[13];
	jc->R = Rz((-1-cos(5*t))/2);


	calc_bone_transform(&farmer.skeleton.joints[0], 0);
	calc_bone_transform(&farmer.skeleton.joints[2], 0);
	calc_bone_transform(&farmer.skeleton.joints[3], 0);
	//calc_bone_transform(&farmer.skeleton.joints[4], 0);
	calc_bone_transform(&farmer.skeleton.joints[1], 0);

	calc_bone_transform(&farmer.skeleton.joints[10], 0);

	calc_bone_transform(&farmer.skeleton.joints[11], 0);
//	calc_bone_transform(&farmer.skeleton.joints[8], 0);
//	calc_bone_transform(&farmer.skeleton.joints[9], 0);

	glutPostRedisplay();
}
Beispiel #9
0
void keyController(){
    xModify = 0.0;
    zModify = 0.0;
    angleMod = 0.0;
    camMod = 0.0;
    rotate = camPos + M_PI / 2;
    float rotateFront = 0.0;
    float rotateSide = 0.0;
    speed = 0.8;


    if (keyIsDown('<')){
        speed = 2.0;
    }
    
    if (keyIsDown('w')){
        xModify += -0.2 * cos(camPos);
        zModify += -0.2 * sin(camPos);
    }
    if (keyIsDown('s')){
        xModify += 0.2 * cos(camPos);
        zModify += 0.2 * sin(camPos);
        rotateFront = - M_PI;
    }
    if (keyIsDown('a')){
        xModify += -0.2 * sin(camPos);
        zModify += 0.2 * cos(camPos);
        rotateSide = - M_PI / 2;
    }
    if (keyIsDown('d')){
        xModify += 0.2 * sin(camPos);
        zModify += -0.2 * cos(camPos);
        rotateSide = M_PI / 2;
    } 

    if (keyIsDown('w') && keyIsDown('a')){
        rotate += - M_PI / 4;
    } else if (keyIsDown('w') && keyIsDown('d')){
        rotate += M_PI / 4;
    } else if (keyIsDown('s') && keyIsDown('a')){
        rotate += - 3 * M_PI / 4;
    } else if (keyIsDown('s') && keyIsDown('d')){
        rotate += 3 * M_PI / 4;
    } else {
        rotate += rotateFront + rotateSide;
    }

    if (keyIsDown('e')) {
        angleMod = M_PI / 60;
        camMod = M_PI / 60;
    } else if (keyIsDown('q')) {
        angleMod = -M_PI / 60;
        camMod = -M_PI / 60;
    }

    if (keyIsDown('m')) {
        menuPressed = !menuPressed;
    }

    if (keyIsDown(' ') && yValue == 0.5) { 
        gravity = -0.18;
        yValue = 0.55;
    }

    if (gravity < 0 && yValue > 0.5) {
        gravity += 0.035;
        yModify -= gravity;
    } else if (yValue > 1.5) {
        gravity += 0.01;
        yModify -= gravity;
    } else {
        yModify = 0;
        yValue = 0.5;
        gravity = 0;
    }
}
Beispiel #10
0
void timer(int i)
{

    VectorSub(&l,&p,&viewDirection);
    Normalize(&viewDirection);
    viewDirection.y = 0;

    CrossProduct(&viewDirection,&toTheSky,&leftRight);
    Normalize(&leftRight);


    if(keyIsDown('s')){
        VectorSub(&p,&viewDirection,&p);
        VectorSub(&l,&viewDirection,&l);
    }


    if(keyIsDown('w')){
        VectorAdd(&p,&viewDirection,&p);
        VectorAdd(&l,&viewDirection,&l);
    }


    if(keyIsDown('a')){
        VectorSub(&p,&leftRight,&p);
        VectorSub(&l,&leftRight,&l);
    }

    if(keyIsDown('d')){
        VectorAdd(&p,&leftRight,&p);
        VectorAdd(&l,&leftRight,&l);
    }


    Point3D offsetVector;

    if(keyIsDown('q')){
        yOffset = yOffset-0.2;
    }

    if(keyIsDown('e')){
       yOffset = yOffset+0.2;
    }



    //GLfloat h = getHeightInPoint(p.x,p.z);

    p.y = yOffset;
    l.y = yOffset;


    if(keyIsDown('z')){
        glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
    }
    if(keyIsDown('x')){
        glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
    }



    glutPostRedisplay();

	glutTimerFunc(20, &timer, i);
	glutPostRedisplay();
}
//Keyhandler class to move araound in the world.
void Camera::handleKeyPress()
{
  //w,a,s,d to move forward,backwards and sideways
  if(keyIsDown('w'))
    {
      vec3 w = Normalize(VectorSub(lookAtPoint,position));
      lookAtPoint = VectorAdd(lookAtPoint,ScalarMult(w,velocity));
      position = VectorAdd(position,ScalarMult(w,velocity));
    }  
  if(keyIsDown('s'))
    {
      vec3 s = Normalize(VectorSub(position,lookAtPoint));
      lookAtPoint = VectorAdd(lookAtPoint,ScalarMult(s,velocity));
      position = VectorAdd(position,ScalarMult(s,velocity));
    }
  if(keyIsDown('a'))
    {
      vec3 w = VectorSub(lookAtPoint,position);
      vec3 a = Normalize(CrossProduct(upVector,w));
      lookAtPoint = VectorAdd(lookAtPoint,ScalarMult(a,velocity));
      position = VectorAdd(position,ScalarMult(a,velocity));
    }
  if(keyIsDown('d'))
    {
      vec3 w = VectorSub(lookAtPoint,position);
      vec3 d = Normalize(CrossProduct(w,upVector));
      lookAtPoint = VectorAdd(lookAtPoint,ScalarMult(d,velocity));
      position = VectorAdd(position,ScalarMult(d,velocity));
    }
  //y,h,g,j to rotate camera up, left, down right
  if(keyIsDown('y'))
    {
      vec3 w = VectorSub(lookAtPoint,position);
      vec3 a = Normalize(VectorAdd(w,ScalarMult(upVector,1.0/10.0)));
      lookAtPoint = VectorAdd(position,a);
    }  
  if(keyIsDown('h'))
    {
      vec3 w = VectorSub(lookAtPoint,position);
      vec3 a = Normalize(VectorAdd(w,ScalarMult(upVector,-1.0/10.0)));
      lookAtPoint = VectorAdd(position,a);
    }
  if(keyIsDown('g'))
    {
      vec3 w = VectorSub(lookAtPoint,position);
      vec3 a = Normalize(CrossProduct(upVector,w));
      a = Normalize(VectorAdd(w,ScalarMult(a,1.0/10.0)));
      lookAtPoint = VectorAdd(position,a);
    }
  if(keyIsDown('j'))
    {
      vec3 w = VectorSub(lookAtPoint,position);
      vec3 a = Normalize(CrossProduct(upVector,w));
      a = Normalize(VectorAdd(w,ScalarMult(a,-1.0/10.0)));
      lookAtPoint = VectorAdd(position,a);
    }
  //space and c to increase or decrease height
  if(keyIsDown(' '))
    {
      vec3 w = vec3(0,1,0);
      lookAtPoint = VectorAdd(lookAtPoint,ScalarMult(w,velocity));
      position = VectorAdd(position,ScalarMult(w,velocity));
    }
  if(keyIsDown('c'))
    {
      vec3 w = vec3(0,-1,0);
      lookAtPoint = VectorAdd(lookAtPoint,ScalarMult(w,velocity));
      position = VectorAdd(position,ScalarMult(w,velocity));
    }
  //p and o to toggle warp pointer on and off
  if(keyIsDown('p'))
    {
      warpPointer = true;
    }
  if(keyIsDown('P'))
    {
      warpPointer = false;
    }
  //m and n to toggle flight mode on and off
  if(keyIsDown('m'))
    {
      flying = true;
    }
  if(keyIsDown('M') && !followFlock)
    {
      flying = false;
    }
  //+ and - to increase or decrease movement speed
  if(keyIsDown('+'))
    {
      velocity = min(3.0,velocity + 1.0);
    }
  if(keyIsDown('-'))
    {
      velocity = max(1.0,velocity - 1.0);
    }

  //1 and 3 to lock or unlock frustum, for debugging purposes
  if(keyIsDown('1'))
    {
      lockFrustum = true;
    }
  if(keyIsDown('!'))
    {
      lockFrustum = false;
    }
  if(keyIsDown('o') && timer > 20 && flying)
    {
      timer = 0;
      followFlock = true;
      flockIndex++; // Follow next flock each time 'o' is pressed.
    }
  if(keyIsDown('O') && followFlock)
    {
      followFlock = false;
      flockIndex--; // Next time 'o' is pressed, we will follow the previous followed flock.
    }
  if(keyIsDown('0') && birdView && followFlock)
    {
      birdView = false;
    }
  if(keyIsDown('=') && !birdView && followFlock)
    {
      birdView = true;
    }

  timer++;
}