efl/src/examples/evas/shooter/evas-3d-shooter.c

1513 lines
60 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* This is example of 3d-shooter done with help of evas-3d
*
* Basic control: 'w' - to go forward, 's' - to go back, 'a' - to the left, 'd' - to the right,
* right mouse down - to activate camera rotation, mouse wheel down - to deactivate camera rotation,
* left mouse down - to fire, 'space' - to jump. The warrior is atackable, the snake isn't,
* this possibility is given by presence of the bounding box, which fixes the rocket entry.
* The warrior isn't passable for camera, neither is wall. There is a possibility to go upstairs
* and break down.
*
* Compile with "gcc -g evas-3d-shooter.c evas-3d-shooter-header.c -o evas-3d-shooter `pkg-config --libs --cflags efl evas ecore ecore-evas eo` -lm"
*/
#include "evas-3d-shooter-header.h"
#define WIDTH 1920
#define HEIGHT 1080
#define SOLDIER_RADIUS_1 5.2 /* camera couldn't get сloser to soldier than SOLDIER_RADIUS_1 */
#define SOLDIER_RADIUS_2 5.3 /* soldier couldn't get сloser to camera than SOLDIER_RADIUS_2 */
#define WALL_RADIUS 2.2 /* camera couldn't get сloser to wall than WALL_RADIUS */
#define JUMP_HIGHT 4
#define GUN_DIR_X 2
#define GUN_DIR_Y -2
#define GUN_DIR_Z 105
#define GUN_SPEED 0.001
Evas_3D_Scene *global_scene = NULL;
Ecore_Evas *ecore_evas = NULL;
static float angle_camera = 0.0f;
static float angle_eagle = 180.0f;
static float d_angle_camera = 0.0;
float d_angle_eagle = 0.3;
float world_position = 0.0;
float camera_position = 25.0;
float camera_move = 0.0;
float space_move = 0.0;
float old_space_position = 0.0;
float fall_speed = 0.0;
int d_i = 1;
int rocket_indicator = 0;
int gun_indicator = 0;
int mouse_diff_x = 0;
int mouse_diff_y = 0;
int mouse_old_x = 0;
int mouse_old_y = 0;
int camera_indicator = 0;
int lateral_motion_indicator = 0;
int step_indicator = 0;
int fall_indicator = 0;
typedef struct _Ecore_Timers
{
Ecore_Timer *t;
void *data;
} Timers;
static float cage_vertices[] =
{
/* Front */
-1.0, 0.2, 0.4, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0,
1.0, 0.2, 0.4, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0,
-1.0, -0.2, 0.4, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
1.0, -0.2, 0.4, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0,
/* Back */
1.0, 0.2, -0.4, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0,
-1.0, 0.2, -0.4, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0,
1.0, -0.2, -0.4, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0,
-1.0, -0.2, -0.4, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0,
/* Left */
-1.0, 0.2, -0.4, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0,
-1.0, 0.2, 0.4, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0,
-1.0, -0.2, -0.4, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0,
-1.0, -0.2, 0.4, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0,
/* Right */
1.0, 0.2, 0.4, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0,
1.0, 0.2, -0.4, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0,
1.0, -0.2, 0.4, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0,
1.0, -0.2, -0.4, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0,
/* Top */
-1.0, 0.2, -0.4, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
1.0, 0.2, -0.4, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0,
-1.0, 0.2, 0.4, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0,
1.0, 0.2, 0.4, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0,
/* Bottom */
1.0, -0.2, -0.4, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0,
-1.0, -0.2, -0.4, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, -0.2, 0.4, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0,
-1.0, -0.2, 0.4, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0,
};
static float grass_vertices[] =
{
/* Top */
-6.5, 0.0, -4.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
6.5, 0.0, -4.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0,
-6.5, 0.0, 4.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0,
6.5, 0.0, 4.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0,
};
static float wall_vertices[] =
{
/* Front */
-1.0, 1.0, 4.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0,
1.0, 1.0, 4.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0,
-1.0, -1.0, 4.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
1.0, -1.0, 4.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0,
/* Back */
1.0, 1.0, -4.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0,
-1.0, 1.0, -4.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0,
1.0, -1.0, -4.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0,
-1.0, -1.0, -4.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0,
/* Left */
-1.0, 1.0, -4.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0,
-1.0, 1.0, 4.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0,
-1.0, -1.0, -4.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0,
-1.0, -1.0, 4.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0,
/* Right */
1.0, 1.0, 4.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0,
1.0, 1.0, -4.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0,
1.0, -1.0, 4.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0,
1.0, -1.0, -4.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0,
/* Top */
-1.0, 1.0, -4.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
1.0, 1.0, -4.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0,
-1.0, 1.0, 4.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0,
1.0, 1.0, 4.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0,
/* Bottom */
1.0, -1.0, -4.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0,
-1.0, -1.0, -4.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0, -1.0, 4.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0,
-1.0, -1.0, 4.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0,
};
static float bricks_vertices[] =
{
/* Front */
-10.0, 10.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0,
10.0, 10.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0,
-10.0, -10.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
10.0, -10.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0,
/* Back */
10.0, 10.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0,
-10.0, 10.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0,
10.0, -10.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0,
-10.0, -10.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0,
/* Left */
-10.0, 10.0, -1.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0,
-10.0, 10.0, 1.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0,
-10.0, -10.0, -1.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0,
-10.0, -10.0, 1.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0,
/* Right */
10.0, 10.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0,
10.0, 10.0, -1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0,
10.0, -10.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0,
10.0, -10.0, -1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 0.0,
/* Top */
-10.0, 10.0, -1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0,
10.0, 10.0, -1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0,
-10.0, 10.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0,
10.0, 10.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0,
/* Bottom */
10.0, -10.0, -1.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0,
-10.0, -10.0, -1.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0,
10.0, -10.0, 1.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0,
-10.0, -10.0, 1.0, 0.0, -1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0,
};
static const unsigned short cube_indices[] =
{
/* Front */
0, 1, 2, 2, 1, 3,
/* Back */
4, 5, 6, 6, 5, 7,
/* Left */
8, 9, 10, 10, 9, 11,
/* Right */
12, 13, 14, 14, 13, 15,
/* Top */
16, 17, 18, 18, 17, 19,
/* Bottom */
20, 21, 22, 22, 21, 23
};
static const unsigned short grass_indices[] =
{
/* Top */
0, 1, 2, 2, 1, 3
};
static float wave_vertices_butt[20000];
static unsigned short wave_indices_butt[20000];
static float wave_vertices[20000];
static unsigned short wave_indices[20000];
static float wave_vertices2[20000];
static unsigned short wave_indices2[20000];
static int vertex_count = 0;
static vertex *vertices = NULL;
static int index_count = 0;
static unsigned short *indices = NULL;
static void
_key_down(void *data,
Evas *e EINA_UNUSED,
Evas_Object *eo EINA_UNUSED,
void *event_info)
{
Evas_Event_Key_Down *ev = event_info;
Evas_Real x, y, z;
Scene_Data *scene = (Scene_Data *)data;
if (!strcmp(ev->key, "space"))
{
if (space_move == 0.0)
{
space_move = 0.25;
eo_do(scene->mediator_node,
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x, &y, &z));
old_space_position = y;
}
}
if (!strcmp(ev->key, "s"))
{
lateral_motion_indicator = 0;
camera_move = 0.3;
}
else if (!strcmp(ev->key, "w"))
{
lateral_motion_indicator = 0;
camera_move = -0.3;
}
else if (!strcmp(ev->key, "d"))
{
lateral_motion_indicator = 1;
camera_move = 0.3;
}
else if (!strcmp(ev->key, "a"))
{
lateral_motion_indicator = 1;
camera_move = -0.3;
}
}
static void
_key_up(void *data,
Evas *e EINA_UNUSED,
Evas_Object *eo EINA_UNUSED,
void *event_info)
{
Evas_Event_Key_Down *ev = event_info;
Evas_Real x, y, z;
Scene_Data *scene = (Scene_Data *)data;
if (!strcmp(ev->key, "space"))
{
if (space_move == 0.0)
{
space_move = 0.25;
eo_do(scene->mediator_node,
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x, &y, &z));
old_space_position = y;
}
}
if (!strcmp(ev->key, "s"))
camera_move = 0;
else if (!strcmp(ev->key, "w"))
camera_move = 0;
else if (!strcmp(ev->key, "d"))
camera_move = 0;
else if (!strcmp(ev->key, "a"))
camera_move = 0;
}
/* animate camera, create artificial intelligence of warrior */
static Eina_Bool
_animate_camera(void *data)
{
Scene_Data *scene = (Scene_Data *)data;
Evas_Real x, y, z;
Evas_Real x1, y1, z1;
Evas_Real x2, y2, z2;
int i = 0;
float x_move, x_move_lateral, z_move, z_move_lateral;
angle_camera += d_angle_camera;
x_move = camera_move * sin(angle_camera * M_PI / 180);
z_move = camera_move * cos(angle_camera * M_PI / 180);
x_move_lateral = camera_move * sin((angle_camera + 90) * M_PI / 180);
z_move_lateral = camera_move * cos((angle_camera + 90) * M_PI / 180);
eo_do(scene->mediator_node,
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x, &y, &z));
eo_do(scene->mesh_node_world,
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x1, &y1, &z1));
step_indicator = 0;
for ( i = 1; i < 10; i++)
{
if (!_horizontal_position_resolution(scene->mesh_node_level[i],x, z))
step_indicator = i;
}
if (space_move != 0.0 && y + space_move > old_space_position + JUMP_HIGHT)
space_move = -0.25;
else if (space_move != 0.0 && y + space_move < old_space_position)
{
space_move = 0.0;
}
if (fall_speed != 0)
{
if (y - fall_speed < 0)
{
eo_do(scene->mediator_node,
evas_3d_node_position_set(x, 0, z));
fall_speed = 0.0;
}
else
{
eo_do(scene->mediator_node,
evas_3d_node_position_set(x, y - fall_speed, z));
fall_speed += 0.04;
}
}
else if ((lateral_motion_indicator == 0) &&
(_horizontal_circle_resolution(scene->mesh_node_level[10], x + x_move, z + z_move, SOLDIER_RADIUS_1)) &&
(_horizontal_circle_resolution(scene->mesh_node_level[0], x + x_move, z + z_move, WALL_RADIUS)))
{
eo_do(scene->mediator_node,
evas_3d_node_position_set(x + x_move, y + space_move, z + z_move));
eo_do(scene->mesh_node_world,
evas_3d_node_position_set(x1 + x_move, y1, z1 + z_move));
}
else if ((_horizontal_circle_resolution(scene->mesh_node_level[10], x + x_move_lateral, z + z_move_lateral, SOLDIER_RADIUS_1))&&
(_horizontal_circle_resolution(scene->mesh_node_level[0], x + x_move_lateral, z + z_move_lateral, WALL_RADIUS)))
{
eo_do(scene->mediator_node,
evas_3d_node_position_set(x + x_move_lateral, y + space_move, z + z_move_lateral));
eo_do(scene->mesh_node_world,
evas_3d_node_position_set(x1 + x_move_lateral, y1, z1 + z_move_lateral));
}
eo_do(scene->mediator_node,
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x, &y, &z));
for ( i = 1; i < 10; i++)
{
if (!_horizontal_position_resolution(scene->mesh_node_level[i], x, z) && step_indicator == i - 1)
{
eo_do(scene->mediator_node,
evas_3d_node_position_set(x, y + 2, z));
}
else if (_horizontal_position_resolution(scene->mesh_node_level[i], x, z) && (step_indicator == i) && y != 0)
{
if (!_horizontal_position_resolution(scene->mesh_node_level[i - 1], x, z))
{
eo_do(scene->mediator_node,
evas_3d_node_position_set(x, y - 2, z));
}
else if (_horizontal_position_resolution(scene->mesh_node_level[i + 1], x, z))
fall_speed = 0.02;
}
}
eo_do(scene->mediator_node,
evas_3d_node_orientation_angle_axis_set(angle_camera, 0, 1.0, 0.0),
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x, &y, &z));
eo_do(scene->mesh_node_level[10],
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x1, &y1, &z1));
eo_do(scene->mesh_node_snake,
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x2, &y2, &z2));
if (_horizontal_circle_resolution(scene->mesh_node_level[10], (x1 - x) * 0.001 + x, (z1 - z) * 0.001 + z, SOLDIER_RADIUS_2))
{
eo_do(scene->mesh_node_level[10],
evas_3d_node_position_set((x - x1) * 0.001 + x1, y1, (z - z1) * 0.001 + z1));
}
if (_horizontal_circle_resolution(scene->mesh_node_snake, (x2 - x) * 0.001 + x, (z2 - z) * 0.001 + z, SOLDIER_RADIUS_2))
{
eo_do(scene->mesh_node_snake,
evas_3d_node_position_set((x - x2) * 0.001 + x2, y2, (z - z2) * 0.001 + z2));
}
eo_do(scene->mesh_node_level[10],
evas_3d_node_look_at_set(EVAS_3D_SPACE_PARENT, 0.0, -1000.0, 0.0, EVAS_3D_SPACE_PARENT,
(z - z1) / sqrt(pow(z - z1, 2) + pow(x1 - x, 2)), 0, (x1 - x) / sqrt(pow(z - z1, 2) + pow(x1 - x, 2))));
eo_do(scene->mesh_node_snake,
evas_3d_node_look_at_set(EVAS_3D_SPACE_PARENT, 0.0, -1000.0, 0.0, EVAS_3D_SPACE_PARENT,
(z - z2)/sqrt(pow(z - z2, 2) + pow(x2 - x, 2)), 0, (x2 - x) / sqrt(pow(z - z2, 2) + pow(x2 - x, 2))));
return EINA_TRUE;
}
static Eina_Bool
_animate_scene_gun(void *data)
{
static float angle = 0.0f;
static float gun_angle = 0.0f;
static float rocket_parametr = 0.0f;
static float gun_parametr = 0.0f;
int i = 0;
Evas_Real x, y, z;
Evas_Real x1, y1, z1;
static int frame = 0;
Scene_Data *scene = (Scene_Data *)data;
float sinus = sin(angle_camera * M_PI / 180);
float cosinus = cos(angle_camera * M_PI / 180);
/* rocket and gun movement */
angle_eagle += d_angle_eagle;
gun_angle += 3 * d_angle_eagle;
eo_do(scene->mesh_node_eagle,
evas_3d_node_orientation_angle_axis_set(angle_eagle - 180, 0.0, 1.0, 0.0),
/* equation of eagle flight */
evas_3d_node_position_set(20 * sin((angle_eagle + 90) * M_PI / 180), 20 + 10 * sin(angle_eagle * M_PI / 180),
20.0 * cos((angle_eagle + 90) * M_PI / 180)));
for ( i = 0; i < 3; i++)
{
eo_do(scene->mesh_node_gun_bling[i],
evas_3d_node_orientation_angle_axis_set(1, 1, 1, 0));
}
eo_do(scene->mesh_node_gun,
evas_3d_node_orientation_angle_axis_set(1, 1, 1, 0));
eo_do(scene->mesh_node_gun_butt,
evas_3d_node_orientation_angle_axis_set(1, 1, 1, 0));
eo_do(scene->mesh_node_gun_cage,
evas_3d_node_orientation_angle_axis_set(1, 1, 1, 0));
if (rocket_indicator == 3)
{
rocket_indicator = 0;
}
else if (rocket_indicator == 0)
{
/* almost hidden rocket */
_scale(scene->mesh_node_rocket, 0.004);
}
else if (rocket_indicator == 1)
{
_scale(scene->mesh_node_rocket, 0.4);
eo_do(scene->rocket,
evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT, 0.8, 0.8, 0.8, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE, 0.2, 0.2, 0.0, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR, 0.5, 0.5, 0.5, 1.0));
rocket_indicator = 2;
eo_do(scene->mediator_node,
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x, &y, &z));
eo_do(scene->mesh_node_rocket,
evas_3d_node_position_set(2, -2, 0));
rocket_parametr = 0;
}
else if (rocket_indicator == 2)
{
rocket_parametr += 0.02;
/* equation of rocket flight */
eo_do(scene->mesh_node_rocket,
evas_3d_node_position_set(2, -2, 0.0 - 105 * rocket_parametr));
}
if (gun_indicator == 1)
{
gun_indicator = 2;
eo_do(scene->mesh_node_gun,
evas_3d_node_position_set(2, -2, -4.0));
eo_do(scene->mesh_node_gun_bling[0],
evas_3d_node_position_set(1.9, -1.3, -3.0));
eo_do(scene->mesh_node_gun_bling[1],
evas_3d_node_position_set(1.9, -1.4, -2.5));
eo_do(scene->mesh_node_gun_bling[2],
evas_3d_node_position_set(1.9, -1.4, -3.5));
gun_parametr = 0.0;
}
/* parametric equations of gun movement, (GUN_DIR_X, GUN_DIR_Y, GUN_DIR_Z) is direction vector */
else if (gun_indicator == 2)
{
gun_parametr += GUN_SPEED;
eo_do(scene->mesh_node_gun,
evas_3d_node_position_set(2 + GUN_DIR_X * gun_parametr,
-2 + GUN_DIR_Y * gun_parametr, -4.0 + GUN_DIR_Z * gun_parametr));
eo_do(scene->mesh_node_gun_butt,
evas_3d_node_position_set(2 + GUN_DIR_X * gun_parametr / 3,
-2 + GUN_DIR_Y * gun_parametr / 3, -3.0 + GUN_DIR_Z * gun_parametr / 3));
eo_do(scene->mesh_node_gun_cage,
evas_3d_node_position_set(1 + GUN_DIR_X * gun_parametr / 3,
-2 + GUN_DIR_Y * gun_parametr / 3, -3.0 + GUN_DIR_Z * gun_parametr / 3));
for (i = 0; i < 3; i++)
{
eo_do(scene->mesh_node_gun_bling[i],
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x, &y, &z),
evas_3d_node_position_set(x + GUN_DIR_X * GUN_SPEED / 3, y + GUN_DIR_Y * GUN_SPEED / 3, z + GUN_DIR_Z * GUN_SPEED / 3));
}
if (-4.0 + 105 * gun_parametr >= -2.0)
{
gun_indicator = 3;
}
}
else if (gun_indicator == 3)
{
gun_parametr-= GUN_SPEED / 2;
eo_do(scene->mesh_node_gun,
evas_3d_node_position_set(2 + GUN_DIR_X * gun_parametr,
-2 + GUN_DIR_Y * gun_parametr, -4.0 + GUN_DIR_Z * gun_parametr));
eo_do(scene->mesh_node_gun_butt,
evas_3d_node_position_set(2 + GUN_DIR_X * gun_parametr / 3,
-2 + GUN_DIR_Y * gun_parametr / 3, -3.0 + GUN_DIR_Z * gun_parametr / 3));
eo_do(scene->mesh_node_gun_cage,
evas_3d_node_position_set(1 + GUN_DIR_X * gun_parametr / 3,
-2 + GUN_DIR_Y * gun_parametr / 3, -3.0 + GUN_DIR_Z * gun_parametr / 3));
for (i = 0; i < 3; i++)
{
eo_do(scene->mesh_node_gun_bling[i],
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x, &y, &z),
evas_3d_node_position_set(x - GUN_DIR_X * 0.5 * GUN_SPEED / 3,
y - GUN_DIR_Y * 0.5 * GUN_SPEED / 3, z - GUN_DIR_Z * 0.5 * GUN_SPEED / 3));
}
eo_do(scene->mesh_node_gun,
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x, &y, &z));
if (z <= -4.0)
{
gun_indicator = 4;
gun_parametr = 0;
}
}
if (angle_eagle > 360.0) angle -= 360.0f;
eo_do(scene->mesh_node_level[10],
evas_3d_node_orientation_angle_axis_set(90, 1.0, 0.0, 0.0),
evas_3d_node_mesh_frame_set(scene->mesh_level[2], frame));
eo_do(scene->mesh_node_snake,
evas_3d_node_mesh_frame_set(scene->mesh_snake, frame));
/* create bounding box */
_mesh_aabb(&scene->mesh_cube, scene);
/* one way to stop the rocket */
if (rocket_indicator == 2)
{
Box3 boxy;
eo_do(scene->mesh_node_level[10],
evas_3d_node_bounding_box_get(&x, &y, &z, &x1, &y1, &z1));
evas_box3_set(&boxy, x, y, z, x1, y1, z1);
eo_do(scene->mesh_node_rocket,
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x, &y, &z));
eo_do(scene->mediator_node,
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x1, &y1, &z1));
if (((z * sinus + x * cosinus + x1) >= boxy.p0.x) && ((z * sinus + x * cosinus + x1) <= boxy.p1.x) &&
((z * cosinus - x * sinus + z1) >= boxy.p0.z) && ((z * cosinus - x * sinus + z1) <= boxy.p1.z))
{
eo_do(scene->rocket,
evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT, 0.8, 0.8, 0.8, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE, 0.9, 0.1, 0.1, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR, 0.5, 0.5, 0.5, 1.0));
_scale(scene->mesh_node_rocket, 1);
rocket_indicator = 3;
}
}
frame += 32;
if (frame > 256 * 20) frame = 0;
return ECORE_CALLBACK_RENEW;
}
static void
_on_mouse_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *o EINA_UNUSED, void *info)
{
Evas_Event_Mouse_Down *ev = info;
if (ev->button == 1)
{
rocket_indicator = 1;
gun_indicator = 1;
}
/* camera default settings */
d_angle_camera = 0.0;
}
/* emit signals independently */
static Eina_Bool
_continue_camera(void *data)
{
if (camera_indicator == 1)
{
evas_event_feed_mouse_down(evas, 3, EVAS_BUTTON_NONE, 0, &data);
}
return EINA_TRUE;
}
/* calculate new angle of rotation */
static void
_reload_camera(void *data, Evas *e EINA_UNUSED, Evas_Object *eo EINA_UNUSED, void *event_info)
{
Evas_Event_Mouse_Down *ev = event_info;
Evas_3D_Node *n;
Evas_3D_Mesh *m;
Evas_Real s, t;
eo_do(global_scene,
evas_3d_scene_pick(ev->canvas.x, ev->canvas.y, &n, &m, &s, &t));
d_angle_camera = 0;
if (n || m)
{
mouse_diff_x = ev->canvas.x - mouse_old_x;
mouse_diff_y = ev->canvas.y - mouse_old_y;
mouse_old_x = ev->canvas.x;
mouse_old_y = ev->canvas.y;
if (camera_indicator == 1)
d_angle_camera = (float) -mouse_diff_x / 100;
}
if (ev->button == 3)
{
if (camera_indicator == 0)
{
ecore_timer_add(0.160, _continue_camera, &data);
}
camera_indicator = 1;
}
}
static void
_play_scene(void *data EINA_UNUSED,
Evas *e EINA_UNUSED,
Evas_Object *eo EINA_UNUSED,
void *event_info)
{
Evas_Event_Mouse_Down *ev = event_info;
if (ev->button == 2)
{
d_angle_eagle = 0.1;
d_i = 1;
if (camera_indicator == 1) camera_indicator = 2;
d_angle_camera = 0;
}
}
void
_world_init(int precision)
{
int i, j;
unsigned short *index;
double lati, y , r, longi;
vec3 e1, e2;
float du1, du2, dv1, dv2, f;
vec3 tangent;
vertex_count = (precision + 1) * (precision + 1);
index_count = precision * precision * 6;
/* Allocate buffer. */
vertices = malloc(sizeof(vertex) * vertex_count);
indices = malloc(sizeof(unsigned short) * index_count);
for (i = 0; i <= precision; i++)
{
lati = (M_PI * (double)i) / (double)precision;
y = cos(lati);
r = fabs(sin(lati));
for (j = 0; j <= precision; j++)
{
longi = (M_PI * 2.0 * j) / precision;
vertex *v = &vertices[i * (precision + 1) + j];
if (j == 0 || j == precision)
v->position.x = 0.0;
else
v->position.x = r * sin(longi);
v->position.y = y;
if (j == 0 || j == precision)
v->position.z = r;
else
v->position.z = r * cos(longi);
v->normal = v->position;
if (v->position.x > 0.0)
{
v->tangent.x = -v->normal.y;
v->tangent.y = v->normal.x;
v->tangent.z = v->normal.z;
}
else
{
v->tangent.x = v->normal.y;
v->tangent.y = -v->normal.x;
v->tangent.z = v->normal.z;
}
v->color.x = v->position.x;
v->color.y = v->position.y;
v->color.z = v->position.z;
v->color.w = 1.0;
if (j == precision)
v->texcoord.x = 1.0;
else if (j == 0)
v->texcoord.x = 0.0;
else
v->texcoord.x = (double)j / (double)precision;
if (i == precision)
v->texcoord.y = 1.0;
else if (i == 0)
v->texcoord.y = 0.0;
else
v->texcoord.y = 1.0 - (double)i / (double)precision;
}
}
index = &indices[0];
for (i = 0; i < precision; i++)
{
for (j = 0; j < precision; j++)
{
*index++ = i * (precision + 1) + j;
*index++ = i * (precision + 1) + j + 1;
*index++ = (i + 1) * (precision + 1) + j;
*index++ = (i + 1) * (precision + 1) + j;
*index++ = i * (precision + 1) + j + 1;
*index++ = (i + 1) * (precision + 1) + j + 1;
}
}
for (i = 0; i < index_count; i += 3)
{
vertex *v0 = &vertices[indices[i + 0]];
vertex *v1 = &vertices[indices[i + 1]];
vertex *v2 = &vertices[indices[i + 2]];
e1.x = v1->position.x - v0->position.x;
e1.y = v1->position.y - v0->position.y;
e1.z = v1->position.z - v0->position.z;
e2.x = v2->position.x - v0->position.x;
e2.y = v2->position.y - v0->position.y;
e2.z = v2->position.z - v0->position.z;
du1 = v1->texcoord.x - v0->texcoord.x;
dv1 = v1->texcoord.y - v0->texcoord.y;
du2 = v2->texcoord.x - v0->texcoord.x;
dv2 = v2->texcoord.y - v0->texcoord.y;
f = 1.0 / (du1 * dv2 - du2 * dv1);
tangent.x = f * (dv2 * e1.x - dv1 * e2.x);
tangent.y = f * (dv2 * e1.y - dv1 * e2.y);
tangent.z = f * (dv2 * e1.z - dv1 * e2.z);
v0->tangent = tangent;
}
for (i = 0; i <= precision; i++)
{
for (j = 0; j <= precision; j++)
{
if (j == precision)
{
vertex *v = &vertices[i * (precision + 1) + j];
v->tangent = vertices[i * (precision + 1)].tangent;
}
}
}
}
void
_mesh_setup_gun_planet(Scene_Data *data)
{
_world_init(100);
/* Setup material and texture for world. */
data->material_world = eo_add(EVAS_3D_MATERIAL_CLASS, evas);
eo_do(data->material_world,
evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE),
evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT, 0.0, 0.0, 0.0, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE, 0.5, 0.5, 0.5, 0.9),
evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR, 1.0, 1.0, 1.0, 1.0),
evas_3d_material_shininess_set(50.0));
/* Setup material and texture for eagle. */
data->mesh_eagle = eo_add(EVAS_3D_MESH_CLASS, evas);
eo_do(data->mesh_eagle, efl_file_set("shooter/eagle.obj", NULL));
data->material_eagle = eo_add(EVAS_3D_MATERIAL_CLASS, evas);
eo_do(data->mesh_eagle,
evas_3d_mesh_frame_material_set(0, data->material_eagle));
data->texture_diffuse_eagle = eo_add(EVAS_3D_TEXTURE_CLASS, evas);
eo_do(data->texture_diffuse_eagle,
evas_3d_texture_file_set("eagle.png", NULL),
evas_3d_texture_filter_set(EVAS_3D_TEXTURE_FILTER_NEAREST, EVAS_3D_TEXTURE_FILTER_NEAREST),
evas_3d_texture_wrap_set(EVAS_3D_WRAP_MODE_REPEAT, EVAS_3D_WRAP_MODE_REPEAT));
eo_do(data->material_eagle,
evas_3d_material_texture_set(EVAS_3D_MATERIAL_DIFFUSE, data->texture_diffuse_eagle),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_NORMAL, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_NORMAL, EINA_TRUE),
evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT, 0.01, 0.01, 0.01, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE, 1.0, 1.0, 1.0, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR, 1.0, 1.0, 1.0, 1.0),
evas_3d_material_shininess_set(100.0));
eo_do(data->mesh_eagle,
evas_3d_mesh_shade_mode_set(EVAS_3D_SHADE_MODE_DIFFUSE));
data->mesh_node_eagle = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH));
eo_do(data->mesh_node_eagle,
evas_3d_node_position_set(-20, 20, 0));
eo_do(data->root_node,
evas_3d_node_member_add(data->mesh_node_eagle));
eo_do(data->mesh_node_eagle,
evas_3d_node_mesh_add(data->mesh_eagle));
_scale(data->mesh_node_eagle, 0.05);
/* Setup mesh for world. */
data->mesh_world = eo_add(EVAS_3D_MESH_CLASS, evas);
eo_do(data->mesh_world,
evas_3d_mesh_vertex_count_set(vertex_count),
evas_3d_mesh_frame_add(0),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_POSITION,
sizeof(vertex), &vertices[0].position),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_NORMAL,
sizeof(vertex), &vertices[0].normal),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_TANGENT,
sizeof(vertex), &vertices[0].tangent),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_COLOR,
sizeof(vertex), &vertices[0].color);
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_TEXCOORD,
sizeof(vertex), &vertices[0].texcoord),
evas_3d_mesh_index_data_set(EVAS_3D_INDEX_FORMAT_UNSIGNED_SHORT, index_count, &indices[0]),
evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES));
data->mesh_node_world = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH));
eo_do(data->root_node,
evas_3d_node_member_add(data->mesh_node_world));
eo_do(data->mesh_node_world,
evas_3d_node_mesh_add(data->mesh_world));
eo_do(data->mesh_world,
evas_3d_mesh_shade_mode_set(EVAS_3D_SHADE_MODE_DIFFUSE),
evas_3d_mesh_frame_material_set(0, data->material_world));
eo_do(data->mesh_node_world,
evas_3d_node_position_set(0.0, 0.0, 0.0));
_scale(data->mesh_node_world, 70.0);
/* Setup mesh for gun */
data->gun = eo_add(EVAS_3D_MATERIAL_CLASS, evas);
float curve [12] ={ 0.55, -2.5, 0.50, -2.25, 0.4, -2, 0.5, 0, 0.5, 1, 0.5, 5};
_add_solid_of_revolution(&curve[0], 5, wave_vertices, wave_indices);
eo_do(data->gun,
evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE),
evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT, 0.9, 0.8, 0.8, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE, 0.2, 0.2, 0.2, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR, 1.0, 1.0, 1.0, 1.0),
evas_3d_material_shininess_set(100.0));
data->mesh_gun = eo_add(EVAS_3D_MESH_CLASS, evas);
eo_do(data->mesh_gun,
evas_3d_mesh_vertex_count_set(10000),
evas_3d_mesh_frame_add(0),
/* 12 = 3 + 3 + 4 +2 : size of one vertex without TANGENT */
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_POSITION,
12 * sizeof(float), &wave_vertices[ 0]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_NORMAL,
12 * sizeof(float), &wave_vertices[ 3]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_COLOR,
12 * sizeof(float), &wave_vertices[ 6]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_TEXCOORD,
12 * sizeof(float), &wave_vertices[10]),
evas_3d_mesh_index_data_set(EVAS_3D_INDEX_FORMAT_UNSIGNED_SHORT,
10000, &wave_indices[0]),
evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES),
evas_3d_mesh_shade_mode_set(EVAS_3D_SHADE_MODE_PHONG),
evas_3d_mesh_frame_material_set(0, data->gun));
data->mesh_node_gun = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH));
eo_do(data->mediator_node,
evas_3d_node_member_add(data->mesh_node_gun));
eo_do(data->mesh_node_gun,
evas_3d_node_mesh_add(data->mesh_gun),
evas_3d_node_position_set(2, -2, -4.0));
/* Setup mesh for gun butt */
data->material_gun_butt = eo_add(EVAS_3D_MATERIAL_CLASS, evas);
float curve_butt [22] = { 0.5, -1, 0.61, -0.8, 0.67, -0.6, 0.72, -0.4, 0.75, -0.2, 0.77, 0, 0.75, 0.2, 0.72, 0.4, 0.67, 0.6, 0.61, 0.8, 0.5, 1,};
_add_solid_of_revolution(&curve_butt[0], 10, wave_vertices_butt, wave_indices_butt);
eo_do(data->material_gun_butt,
evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE),
evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT, 0.9, 0.8, 0.8, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE, 0.2, 0.2, 0.2, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR, 1.0, 1.0, 1.0, 1.0),
evas_3d_material_shininess_set(100.0));
data->mesh_gun_butt = eo_add(EVAS_3D_MESH_CLASS, evas);
eo_do(data->mesh_gun_butt,
evas_3d_mesh_vertex_count_set(10000),
evas_3d_mesh_frame_add(0),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_POSITION,
12 * sizeof(float), &wave_vertices_butt[ 0]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_NORMAL,
12 * sizeof(float), &wave_vertices_butt[ 3]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_COLOR,
12 * sizeof(float), &wave_vertices_butt[ 6]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_TEXCOORD,
12 * sizeof(float), &wave_vertices_butt[10]),
evas_3d_mesh_index_data_set(EVAS_3D_INDEX_FORMAT_UNSIGNED_SHORT,
10000, &wave_indices_butt[0]),
evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES),
evas_3d_mesh_shade_mode_set(EVAS_3D_SHADE_MODE_PHONG),
evas_3d_mesh_frame_material_set(0, data->material_gun_butt));
data->mesh_node_gun_butt = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH));
eo_do(data->mediator_node,
evas_3d_node_member_add(data->mesh_node_gun_butt));
eo_do(data->mesh_node_gun_butt,
evas_3d_node_mesh_add(data->mesh_gun_butt),
evas_3d_node_position_set(2, -2, -3.0));
/* Setup mesh for gun cage */
data->material_gun_cage = eo_add(EVAS_3D_MATERIAL_CLASS, evas);
eo_do(data->material_gun_cage,
evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE),
evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT, 0.2, 0.2, 0.2, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE, 0.8, 0.8, 0.8, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR, 1.0, 1.0, 1.0, 1.0),
evas_3d_material_shininess_set(70.0));
data->mesh_gun_cage = eo_add(EVAS_3D_MESH_CLASS, evas);
eo_do(data->mesh_gun_cage,
evas_3d_mesh_vertex_count_set(24),
evas_3d_mesh_frame_add(0),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_POSITION,
12 * sizeof(float), &cage_vertices[ 0]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_NORMAL,
12 * sizeof(float), &cage_vertices[ 3]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_COLOR,
12 * sizeof(float), &cage_vertices[ 6]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_TEXCOORD,
12 * sizeof(float), &cage_vertices[10]),
evas_3d_mesh_index_data_set(EVAS_3D_INDEX_FORMAT_UNSIGNED_SHORT,
36, &cube_indices[0]),
evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES),
evas_3d_mesh_shade_mode_set(EVAS_3D_SHADE_MODE_PHONG),
evas_3d_mesh_frame_material_set(0, data->material_gun_cage));
data->mesh_node_gun_cage = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH));
eo_do(data->mediator_node,
evas_3d_node_member_add(data->mesh_node_gun_cage));
eo_do(data->mesh_node_gun_cage,
evas_3d_node_mesh_add(data->mesh_gun_cage),
evas_3d_node_position_set(1, -2, -3.0));
_scale(data->mesh_node_gun_cage, 0.5);
/* Setup mesh for rocket */
data->rocket = eo_add(EVAS_3D_MATERIAL_CLASS, evas);
float rocket_curve [18] = { 0.0, -1, 0.5, -0.866, 0.707, -0.707, 0.866, -0.5, 1, 0, 0.866, 0.5, 0.707, 0.707, 0.5, 0.866, 0, 1 };
_add_solid_of_revolution(&rocket_curve[0], 8, wave_vertices2, wave_indices2);
eo_do(data->rocket,
evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE),
evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT, 0.8, 0.8, 0.8, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE, 0.2, 0.2, 0.0, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR, 0.5, 0.5, 0.5, 1.0),
evas_3d_material_shininess_set(100.0));
data->mesh_rocket = eo_add(EVAS_3D_MESH_CLASS, evas);
eo_do(data->mesh_rocket,
evas_3d_mesh_vertex_count_set(10000),
evas_3d_mesh_frame_add(0),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_POSITION,
12 * sizeof(float), &wave_vertices2[ 0]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_NORMAL,
12 * sizeof(float), &wave_vertices2[ 3]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_COLOR,
12 * sizeof(float), &wave_vertices2[ 6]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_TEXCOORD,
12 * sizeof(float), &wave_vertices2[10]),
evas_3d_mesh_index_data_set(EVAS_3D_INDEX_FORMAT_UNSIGNED_SHORT,
10000, &wave_indices2[0]),
evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES),
evas_3d_mesh_shade_mode_set(EVAS_3D_SHADE_MODE_PHONG),
evas_3d_mesh_frame_material_set(0, data->rocket));
data->mesh_node_rocket = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH));
eo_do(data->mediator_node,
evas_3d_node_member_add(data->mesh_node_rocket));
eo_do(data->mesh_node_rocket,
evas_3d_node_mesh_add(data->mesh_rocket),
evas_3d_node_position_set(2, -2, 0.0));
_scale(data->mesh_node_rocket, 0.4);
/* Set material for bounding box */
data->material_cube = eo_add(EVAS_3D_MATERIAL_CLASS, evas);
eo_do(data->material_cube,
evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE));
data->mesh_cube = eo_add(EVAS_3D_MESH_CLASS, evas);
eo_do(data->mesh_cube,
evas_3d_mesh_index_data_set(EVAS_3D_INDEX_FORMAT_UNSIGNED_SHORT,
36, &cube_indices[0]),
evas_3d_mesh_vertex_count_set(24),
evas_3d_mesh_frame_add(0),
evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_LINES),
evas_3d_mesh_shade_mode_set(EVAS_3D_SHADE_MODE_DIFFUSE),
evas_3d_mesh_frame_material_set(0, data->material_cube));
data->mesh_node_cube = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH));
eo_do(data->root_node,
evas_3d_node_member_add(data->mesh_node_cube));
eo_do(data->mesh_node_cube,
evas_3d_node_mesh_add(data->mesh_cube));
}
void
_mesh_setup_grass(Scene_Data *data, int index)
{
/* Setup material and texture for grass. */
data->material_grass = eo_add(EVAS_3D_MATERIAL_CLASS, evas);
data->texture_diffuse_grass = eo_add(EVAS_3D_TEXTURE_CLASS, evas);
eo_do(data->texture_diffuse_grass,
evas_3d_texture_file_set("shooter/grass6.png", NULL),
evas_3d_texture_filter_set(EVAS_3D_TEXTURE_FILTER_LINEAR, EVAS_3D_TEXTURE_FILTER_LINEAR));
eo_do(data->material_grass,
evas_3d_material_texture_set(EVAS_3D_MATERIAL_DIFFUSE, data->texture_diffuse_grass),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE),
evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT, 0.2, 0.2, 0.2, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE, 0.8, 0.8, 0.8, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR, 1.0, 1.0, 1.0, 1.0),
evas_3d_material_shininess_set(50.0));
/* Setup mesh for grass. */
data->mesh_grass[index] = eo_add(EVAS_3D_MESH_CLASS, evas);
eo_do(data->mesh_grass[index],
evas_3d_mesh_vertex_count_set(vertex_count),
evas_3d_mesh_frame_add(0),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_POSITION,
12 * sizeof(float), &grass_vertices[ 0]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_NORMAL,
12 * sizeof(float), &grass_vertices[ 3]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_COLOR,
12 * sizeof(float), &grass_vertices[ 6]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_TEXCOORD,
12 * sizeof(float), &grass_vertices[10]),
evas_3d_mesh_index_data_set(EVAS_3D_INDEX_FORMAT_UNSIGNED_SHORT,
6, &grass_indices[0]),
evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES));
data->mesh_node_grass[index] = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH));
eo_do(data->root_node,
evas_3d_node_member_add(data->mesh_node_grass[index]));
eo_do(data->mesh_node_grass[index],
evas_3d_node_mesh_add(data->mesh_grass[index]));
eo_do(data->mesh_grass[index],
evas_3d_mesh_shade_mode_set(EVAS_3D_SHADE_MODE_DIFFUSE),
evas_3d_mesh_frame_material_set(0, data->material_grass));
/* placing of grass carpet on the floor grid */
eo_do(data->mesh_node_grass[index],
evas_3d_node_position_set(-36 + 26 * fmod(index, 5), -10.0, -52 + 16 * (index - fmod(index, 5)) / 5));
_scale(data->mesh_node_grass[index], 2.0);
}
void
_mesh_setup_gun_bling(Scene_Data *data, int index)
{
/* Setup mesh for gun bling */
data->material_gun_bling = eo_add(EVAS_3D_MATERIAL_CLASS, evas);
eo_do(data->material_gun_bling,
evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE),
evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT, 0.4, 0.4, 0.8, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE, 0.9, 0.9, 0.9, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR, 0.0, 1.0, 0.0, 1.0),
evas_3d_material_shininess_set(500.0));
data->mesh_gun_bling[index] = eo_add(EVAS_3D_MESH_CLASS, evas);
eo_do(data->mesh_gun_bling[index],
evas_3d_mesh_vertex_count_set(vertex_count),
evas_3d_mesh_frame_add(0),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_POSITION,
sizeof(vertex), &vertices[0].position),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_NORMAL,
sizeof(vertex), &vertices[0].normal),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_TANGENT,
sizeof(vertex), &vertices[0].tangent),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_COLOR,
sizeof(vertex), &vertices[0].color),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_TEXCOORD,
sizeof(vertex), &vertices[0].texcoord),
evas_3d_mesh_index_data_set(EVAS_3D_INDEX_FORMAT_UNSIGNED_SHORT, index_count, &indices[0]),
evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES));
data->mesh_node_gun_bling[index] = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH));
eo_do(data->mediator_node,
evas_3d_node_member_add(data->mesh_node_gun_bling[index]));
eo_do(data->mesh_node_gun_bling[index],
evas_3d_node_mesh_add(data->mesh_gun_bling[index]));
eo_do(data->mesh_gun_bling[index],
evas_3d_mesh_shade_mode_set(EVAS_3D_SHADE_MODE_PHONG),
evas_3d_mesh_frame_material_set(0, data->material_gun_bling));
_scale(data->mesh_node_gun_bling[index], 0.2);
if (index == 0)
eo_do(data->mesh_node_gun_bling[index],
evas_3d_node_position_set(1.9, -1.3, -3.0));
else if (index == 1)
eo_do(data->mesh_node_gun_bling[index],
evas_3d_node_position_set(1.9, -1.4, -2.5));
else
eo_do(data->mesh_node_gun_bling[index],
evas_3d_node_position_set(1.9, -1.4, -3.5));
}
void
_mesh_setup(Scene_Data *data, float *isource, int index)
{
/* Setup mesh. */
data->mesh_level[index] = eo_add(EVAS_3D_MESH_CLASS, evas);
eo_do(data->mesh_level[index],
evas_3d_mesh_vertex_count_set(24),
evas_3d_mesh_frame_add(0),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_POSITION,
12 * sizeof(float), &isource[ 0]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_NORMAL,
12 * sizeof(float), &isource[ 3]),
evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_TEXCOORD,
12 * sizeof(float), &isource[10]));
data->material_level = eo_add(EVAS_3D_MATERIAL_CLASS, evas);
eo_do(data->mesh_level[index],
evas_3d_mesh_frame_material_set(0, data->material_level));
eo_do(data->material_level,
evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE),
evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT, 0.2, 0.2, 0.2, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE, 0.8, 0.8, 0.8, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR, 1.0, 1.0, 1.0, 1.0),
evas_3d_material_shininess_set(100.0));
data->texture = eo_add(EVAS_3D_TEXTURE_CLASS, evas);
if (index)
eo_do(data->texture,
evas_3d_texture_file_set("shooter/brick-stone.png", NULL));
else
eo_do(data->texture,
evas_3d_texture_file_set("shooter/stena_kirpichi.png", NULL));
eo_do(data->texture,
evas_3d_texture_filter_set(EVAS_3D_TEXTURE_FILTER_NEAREST, EVAS_3D_TEXTURE_FILTER_NEAREST),
evas_3d_texture_wrap_set(EVAS_3D_WRAP_MODE_REPEAT, EVAS_3D_WRAP_MODE_REPEAT));
eo_do(data->material_level,
evas_3d_material_texture_set(EVAS_3D_MATERIAL_DIFFUSE, data->texture),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_NORMAL, EINA_TRUE));
eo_do(data->mesh_level[index],
evas_3d_mesh_index_data_set(EVAS_3D_INDEX_FORMAT_UNSIGNED_SHORT,
36, &cube_indices[0]),
evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES),
evas_3d_mesh_shade_mode_set(EVAS_3D_SHADE_MODE_DIFFUSE));
}
void
_mesh_setup_warrior(Scene_Data *data, int index)
{
data->mesh_level[index] = eo_add(EVAS_3D_MESH_CLASS, evas);
eo_do(data->mesh_level[index], efl_file_set("shooter/warrior.md2", NULL));
data->material_level = eo_add(EVAS_3D_MATERIAL_CLASS, evas);
eo_do(data->mesh_level[index],
evas_3d_mesh_frame_material_set(0, data->material_level));
data->texture = eo_add(EVAS_3D_TEXTURE_CLASS, evas);
eo_do(data->texture,
evas_3d_texture_file_set("shooter/warrior.png", NULL),
evas_3d_texture_filter_set(EVAS_3D_TEXTURE_FILTER_NEAREST, EVAS_3D_TEXTURE_FILTER_NEAREST),
evas_3d_texture_wrap_set(EVAS_3D_WRAP_MODE_REPEAT, EVAS_3D_WRAP_MODE_REPEAT));
eo_do(data->material_level,
evas_3d_material_texture_set(EVAS_3D_MATERIAL_DIFFUSE, data->texture),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_NORMAL, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_NORMAL, EINA_TRUE),
evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT, 0.01, 0.01, 0.01, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE, 1.0, 1.0, 1.0, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR, 1.0, 1.0, 1.0, 1.0),
evas_3d_material_shininess_set(100.0));
eo_do(data->mesh_level[index],
evas_3d_mesh_shade_mode_set(EVAS_3D_SHADE_MODE_DIFFUSE));
}
void
_mesh_setup_snake(Scene_Data *data)
{
data->mesh_snake = eo_add(EVAS_3D_MESH_CLASS, evas);
eo_do(data->mesh_snake, efl_file_set("shooter/snake.md2", NULL));
data->material_snake = eo_add(EVAS_3D_MATERIAL_CLASS, evas);
eo_do(data->mesh_snake,
evas_3d_mesh_frame_material_set(0, data->material_snake));
data->texture_snake = eo_add(EVAS_3D_TEXTURE_CLASS, evas);
eo_do(data->texture_snake,
evas_3d_texture_file_set("shooter/snake.png", NULL),
evas_3d_texture_filter_set(EVAS_3D_TEXTURE_FILTER_NEAREST, EVAS_3D_TEXTURE_FILTER_NEAREST),
evas_3d_texture_wrap_set(EVAS_3D_WRAP_MODE_REPEAT, EVAS_3D_WRAP_MODE_REPEAT));
eo_do(data->material_snake,
evas_3d_material_texture_set(EVAS_3D_MATERIAL_DIFFUSE, data->texture_snake),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_NORMAL, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE),
evas_3d_material_enable_set(EVAS_3D_MATERIAL_NORMAL, EINA_TRUE),
evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT, 0.01, 0.01, 0.01, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE, 1.0, 1.0, 1.0, 1.0),
evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR, 1.0, 1.0, 1.0, 1.0),
evas_3d_material_shininess_set(100.0));
eo_do(data->mesh_snake,
evas_3d_mesh_shade_mode_set(EVAS_3D_SHADE_MODE_DIFFUSE));
data->mesh_node_snake = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH));
eo_do(data->mesh_node_snake,
evas_3d_node_position_set(-15, -10, 0),
evas_3d_node_scale_set(0.15, 0.15, 0.15));
eo_do(data->root_node,
evas_3d_node_member_add(data->mesh_node_snake));
eo_do(data->mesh_node_snake,
evas_3d_node_mesh_add(data->mesh_snake));
_scale(data->mesh_node_snake, 0.15);
}
void
_scene_setup(Scene_Data *data)
{
global_scene = eo_add(EVAS_3D_SCENE_CLASS, evas);
eo_do(global_scene,
evas_3d_scene_size_set(WIDTH, HEIGHT),
evas_3d_scene_background_color_set(0.5, 0.5, 0.5, 0.0));
data->root_node = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_NODE));
_camera_setup(data);
_light_setup(data);
_mesh_setup_gun_planet(data);
_mesh_setup_snake(data);
int i = 0;
for ( i = 0; i < 3; i++)
_mesh_setup_gun_bling(data, i);
for ( i = 0; i < 30; i++)
_mesh_setup_grass(data, i);
_mesh_setup(data, bricks_vertices, 0);
_mesh_setup(data, wall_vertices, 1);
data->mesh_node_level[0] = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH));
eo_do(data->root_node,
evas_3d_node_member_add(data->mesh_node_level[0]));
eo_do(data->mesh_node_level[0],
evas_3d_node_mesh_add(data->mesh_level[0]),
evas_3d_node_position_set(0, 0, -15));
int offset = 0;
Box3 box, cbox;
evas_box3_empty_set(&box);
evas_box3_empty_set(&cbox);
evas_box3_set(&box, -8.0, -8.0, 0.0, -8.0, -8.0, 0.0);
Evas_Real bx, by, bz;
for ( i = 1; i < 10; ++i)
{
data->mesh_node_level[i] = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH));
eo_do(data->mesh_node_level[i],
evas_3d_node_position_set(-8 + offset, -8 + offset, -10),
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &bx, &by, &bz));
evas_box3_set(&cbox, 0.0, 0.0, 0.0, -8 + offset, -8 + offset, 5);
evas_box3_union(&box, &box, &cbox);
eo_do(data->root_node,
evas_3d_node_member_add(data->mesh_node_level[i]));
eo_do(data->mesh_node_level[i],
evas_3d_node_mesh_add(data->mesh_level[1]));
offset += 2;
}
_mesh_setup_warrior(data, 2);
data->mesh_node_level[10] = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH));
eo_do(data->mesh_node_level[10],
evas_3d_node_position_set(17, -10, 0),
evas_3d_node_scale_set(0.15, 0.15, 0.15));
eo_do(data->root_node,
evas_3d_node_member_add(data->mesh_node_level[10]));
eo_do(data->mesh_node_level[10],
evas_3d_node_mesh_add(data->mesh_level[2]));
_mesh_aabb(&data->mesh_cube, data);
eo_do(global_scene,
evas_3d_scene_root_node_set(data->root_node),
evas_3d_scene_camera_node_set(data->camera_node));
}
int
main(void)
{
Scene_Data data;
if (!ecore_evas_init()) return 0;
ecore_evas = ecore_evas_new("opengl_x11", 0, 0, WIDTH, HEIGHT, NULL);
if (!ecore_evas) return 0;
ecore_evas_callback_delete_request_set(ecore_evas, _on_delete);
ecore_evas_callback_resize_set(ecore_evas, _on_canvas_resize);
ecore_evas_show(ecore_evas);
evas = ecore_evas_get(ecore_evas);
_scene_setup(&data);
/* Add a background rectangle objects. */
background = evas_object_rectangle_add(evas);
evas_object_color_set(background, 0, 0, 0, 255);
evas_object_move(background, 0, 0);
evas_object_resize(background, WIDTH, HEIGHT);
evas_object_show(background);
/* Add an image object for 3D scene rendering. */
image = evas_object_image_filled_add(evas);
evas_object_move(image, 0, 0);
evas_object_resize(image, WIDTH, HEIGHT);
evas_object_show(image);
/* Set the image object as render target for 3D scene. */
eo_do(image,
evas_obj_image_scene_set(global_scene));
evas_object_focus_set(image, EINA_TRUE);
/* Add animation timer callback. */
Timers timers[4];
timers[0].t = ecore_timer_add(0.016, _animate_scene_gun, &data);
timers[0].data = &data;
timers[1].t = ecore_timer_add(0.016, _animate_camera, &data);
timers[0].data = &data;
evas_object_event_callback_add(image, EVAS_CALLBACK_MOUSE_DOWN, _reload_camera, &data);
evas_object_event_callback_add(image, EVAS_CALLBACK_MOUSE_DOWN, _on_mouse_down, &timers);
evas_object_event_callback_add(image, EVAS_CALLBACK_MOUSE_UP, _play_scene, &data);
evas_object_event_callback_add(image, EVAS_CALLBACK_KEY_DOWN, _key_down, &data);
evas_object_event_callback_add(image, EVAS_CALLBACK_KEY_UP, _key_up, &data);
/* Enter main loop. */
ecore_main_loop_begin();
ecore_evas_free(ecore_evas);
ecore_evas_shutdown();
return 0;
}