diff options
Diffstat (limited to 'src/extantz/camera.c')
-rw-r--r-- | src/extantz/camera.c | 60 |
1 files changed, 56 insertions, 4 deletions
diff --git a/src/extantz/camera.c b/src/extantz/camera.c index d221ea0..c4b4757 100644 --- a/src/extantz/camera.c +++ b/src/extantz/camera.c | |||
@@ -1,6 +1,37 @@ | |||
1 | #include "extantz.h" | 1 | #include "extantz.h" |
2 | 2 | ||
3 | 3 | ||
4 | Eina_Bool animateCamera(globals *ourGlobals) | ||
5 | { | ||
6 | Evas_Real x, y, z, w; | ||
7 | EPhysics_Quaternion *quat = ephysics_quaternion_new(); | ||
8 | EPhysics_Quaternion *quat1 = ephysics_quaternion_new(); | ||
9 | EPhysics_Quaternion *result = ephysics_quaternion_new(); | ||
10 | |||
11 | Scene_Data *scene = ourGlobals->scene; | ||
12 | |||
13 | // Camera movement. | ||
14 | ephysics_quaternion_euler_set(quat1, ourGlobals->gld.move->r, ourGlobals->gld.move->s, ourGlobals->gld.move->t); | ||
15 | eo_do(scene->camera_node, evas_3d_node_orientation_get(EVAS_3D_SPACE_PARENT, &x, &y, &z, &w)); | ||
16 | ephysics_quaternion_set(quat, x, y, z, w); | ||
17 | ephysics_quaternion_multiply(quat, quat1, result); | ||
18 | ephysics_quaternion_normalize(result); | ||
19 | ephysics_quaternion_get(result, &x, &y, &z, &w); | ||
20 | eo_do(scene->camera_node, evas_3d_node_orientation_set(x, y, z, w)); | ||
21 | |||
22 | eo_do(scene->camera_node, evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x, &y, &z)); | ||
23 | x -= ourGlobals->gld.move->x; | ||
24 | y -= ourGlobals->gld.move->y; | ||
25 | z -= ourGlobals->gld.move->z; | ||
26 | eo_do(scene->camera_node, evas_3d_node_position_set(x, y, z)); | ||
27 | |||
28 | free(result); | ||
29 | free(quat1); | ||
30 | free(quat); | ||
31 | |||
32 | return EINA_TRUE; | ||
33 | } | ||
34 | |||
4 | static void _on_camera_input_down(void *data, Evas *evas, Evas_Object *obj, void *event_info) | 35 | static void _on_camera_input_down(void *data, Evas *evas, Evas_Object *obj, void *event_info) |
5 | { | 36 | { |
6 | globals *ourGlobals = data; | 37 | globals *ourGlobals = data; |
@@ -151,10 +182,31 @@ static Eina_Bool _cb_event_GL(void *data, Evas_Object *obj, Evas_Object *src, Ev | |||
151 | return processed; | 182 | return processed; |
152 | } | 183 | } |
153 | 184 | ||
154 | void cameraAdd(globals *ourGlobals, Evas_Object *win) | 185 | Evas_3D_Node *cameraAdd(globals *ourGlobals, Scene_Data *scene, Evas_Object *image) |
155 | { | 186 | { |
187 | Evas_3D_Node *result = NULL; | ||
188 | Evas_3D_Camera *camera; | ||
189 | |||
190 | camera = eo_add(EVAS_3D_CAMERA_CLASS, ourGlobals->evas, | ||
191 | evas_3d_camera_projection_perspective_set(60.0, 1.0, 1.0, 500.0) | ||
192 | ); | ||
193 | |||
194 | result = evas_3d_node_add(ourGlobals->evas, EVAS_3D_NODE_TYPE_CAMERA); | ||
195 | eo_do(result, | ||
196 | evas_3d_node_camera_set(camera), | ||
197 | evas_3d_node_position_set(50.0, 0.0, 20.0), | ||
198 | evas_3d_node_look_at_set(EVAS_3D_SPACE_PARENT, 0.0, 0.0, 20.0, EVAS_3D_SPACE_PARENT, 0.0, 0.0, 1.0) | ||
199 | ); | ||
200 | |||
201 | eo_do(scene->root_node, evas_3d_node_member_add(result)); | ||
202 | eo_do(scene->scene, evas_3d_scene_camera_node_set(result)); | ||
203 | |||
156 | // In this code, we are making our own camera, so grab it's input when we are focused. | 204 | // In this code, we are making our own camera, so grab it's input when we are focused. |
157 | evas_object_event_callback_add(win, EVAS_CALLBACK_KEY_DOWN, _on_camera_input_down, ourGlobals); | 205 | evas_object_event_callback_add(image, EVAS_CALLBACK_KEY_DOWN, _on_camera_input_down, ourGlobals); |
158 | evas_object_event_callback_add(win, EVAS_CALLBACK_KEY_UP, _on_camera_input_up, ourGlobals); | 206 | evas_object_event_callback_add(image, EVAS_CALLBACK_KEY_UP, _on_camera_input_up, ourGlobals); |
159 | elm_object_event_callback_add(win, _cb_event_GL, ourGlobals); | 207 | elm_object_event_callback_add(image, _cb_event_GL, ourGlobals); |
208 | |||
209 | ourGlobals->gld.move = calloc(1, sizeof(cameraMove)); | ||
210 | |||
211 | return result; | ||
160 | } | 212 | } |