]>
Dogcows Code - chaz/yoink/blob - src/moof/camera.cc
2 /*] Copyright (c) 2009-2010, Charles McGarvey [**************************
3 **] All rights reserved.
7 * Distributable under the terms and conditions of the 2-clause BSD license;
8 * see the file COPYING for a complete text of the license.
10 **************************************************************************/
19 void camera::position(const vector3
& position
)
21 state_
.position
= position
;
24 void camera::rotation(const quaternion
& rotation
)
26 state_
.orientation
= rotation
;
29 void camera::look_at(const vector3
& point
)
31 // FIXME: this doesn't work as expected
32 quaternion_rotation_aim_at(state_
.orientation
, state_
.position
, point
,
33 vector3(0.0, 1.0, 0.0));
37 void camera::projection(const matrix4
& projection
)
39 projection_
= projection
;
42 void camera::projection(scalar fovy
, scalar aspect
, scalar abutting
,
45 matrix_perspective_yfov_RH(projection_
, fovy
, aspect
, abutting
,
46 distant
, z_clip_neg_one
);
50 void camera::upload_to_gl(scalar alpha
) const
54 glMatrixMode(GL_PROJECTION
);
55 glMultMatrix(projection_
.data());
57 glMatrixMode(GL_MODELVIEW
);
58 glMultMatrix(modelview_
.data());
61 void camera::calculate(scalar alpha
) const
63 state3 state
= rigid_body3::state(alpha
);
65 matrix_rotation_quaternion(modelview_
, state
.orientation
);
68 matrix_translation(translate
, state
.position
);
70 modelview_
*= translate
;
72 frustum_
.init(modelview_
, projection_
);
76 void camera::update(scalar t
, scalar dt
)
78 rigid_body3::update(t
, dt
);
81 void camera::draw(scalar alpha
) const
87 void camera::handle_event(const event
& event
)
89 const scalar ds
= 50.0;
94 if (event
.key
.keysym
.sym
== SDLK_RIGHT
)
96 state_
.position
[0] -= ds
;
98 else if (event
.key
.keysym
.sym
== SDLK_LEFT
)
100 state_
.position
[0] += ds
;
102 else if (event
.key
.keysym
.sym
== SDLK_UP
)
104 state_
.position
[1] -= ds
;
106 else if (event
.key
.keysym
.sym
== SDLK_DOWN
)
108 state_
.position
[1] += ds
;
110 else if (event
.key
.keysym
.sym
== SDLK_PAGEUP
)
112 state_
.position
[2] += ds
;
114 else if (event
.key
.keysym
.sym
== SDLK_PAGEDOWN
)
116 state_
.position
[2] -= ds
;
120 case SDL_MOUSEMOTION
:
122 scalar xrel
= rad(scalar(event
.motion
.xrel
) / 6.0);
123 scalar yrel
= rad(scalar(event
.motion
.yrel
) / 6.0);
125 quaternion rotation
= state_
.orientation
;
127 quaternion_rotate_about_world_x(rotation
, yrel
);
128 //mRotation.normalize();
129 quaternion_rotate_about_world_y(rotation
, xrel
);
131 rotation
.normalize();
132 state_
.orientation
= rotation
;
136 case SDL_MOUSEBUTTONDOWN
:
137 if (event
.button
.button
== SDL_BUTTON_WHEELUP
)
139 state_
.position
[2] -= ds
;
141 else if (event
.button
.button
== SDL_BUTTON_WHEELDOWN
)
143 state_
.position
[2] -= ds
;
This page took 0.044668 seconds and 4 git commands to generate.