examples/unsorted/evas/shooter/evas-3d-shooter-header.c

381 lines
12 KiB
C

#include "evas-3d-shooter-header.h"
void
evas_box3_set(Box3 *box, Evas_Real x0, Evas_Real y0, Evas_Real z0, Evas_Real x1, Evas_Real y1, Evas_Real z1)
{
box->p0.x = x0;
box->p0.y = y0;
box->p0.z = z0;
box->p1.x = x1;
box->p1.y = y1;
box->p1.z = z1;
}
void
_scale(Evas_3D_Node *node, Evas_Real scale)
{
eo_do(node, evas_3d_node_scale_set(1.0 * scale, 1.0 * scale, 1.0 * scale));
}
float
_distance(float x1, float z1, float x2, float z2)
{
return sqrt(pow(x2 - x1, 2) + pow(z2 - z1, 2));
}
void
_camera_setup(Scene_Data *data)
{
data->camera = eo_add(EVAS_3D_CAMERA_CLASS, evas);
eo_do(data->camera,
evas_3d_camera_projection_perspective_set(65.0, 1.0, 1.0, 300.0));
data->mediator_node = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_NODE));
data->camera_node = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_CAMERA));
eo_do(data->root_node, evas_3d_node_member_add(data->mediator_node));
eo_do(data->mediator_node, evas_3d_node_member_add(data->camera_node));
eo_do(data->camera_node,
evas_3d_node_camera_set(data->camera),
evas_3d_node_position_set(20.0, 80.0, 30.0);
evas_3d_node_look_at_set(EVAS_3D_SPACE_PARENT, 0.0, 0.0, 0.0, EVAS_3D_SPACE_PARENT, 0.0, 1.0, 0.0));
}
void
_light_setup(Scene_Data *data)
{
data->light = eo_add(EVAS_3D_LIGHT_CLASS, evas);
eo_do(data->light,
evas_3d_light_ambient_set(0.2, 0.2, 0.2, 1.0),
evas_3d_light_diffuse_set(1.0, 1.0, 1.0, 1.0),
evas_3d_light_specular_set(0.2, 0.2, 0.2, 1.0),
evas_3d_light_projection_perspective_set(100.0, 1.0, 1.0, 200.0));
data->light_node = eo_add(EVAS_3D_NODE_CLASS, evas,
evas_3d_node_constructor(EVAS_3D_NODE_TYPE_LIGHT));
eo_do(data->light_node,
evas_3d_node_light_set(data->light),
evas_3d_node_position_set(-30.0, 70.0, 0.0),
evas_3d_node_look_at_set(EVAS_3D_SPACE_PARENT, 0.0, 0.0, 0.0, EVAS_3D_SPACE_PARENT, 0.0, 0.0, 1.0));
eo_do(data->root_node, evas_3d_node_member_add(data->light_node));
}
Eina_Bool _mesh_aabb(Evas_3D_Mesh **mesh, Scene_Data *scene, int index)
{
Evas_Real x0, y0, z0, x1, y1, z1, r;
Evas_3D_Node *node = NULL;
if (fmod(index, 12) == 0)
node = scene->mesh_node_warrior;
else if (fmod(index, 12) == 1)
node = scene->mesh_node_eagle;
else if (fmod(index, 12) == 2)
node = scene->mesh_node_grass;
else if (fmod(index, 12) == 3)
node = scene->mesh_node_soldier;
else if (fmod(index, 12) == 4)
node = scene->mesh_node_tommy;
else if (fmod(index, 12) == 5)
node = scene->mesh_node_gazebo;
else if (fmod(index, 12) == 6)
node = scene->mesh_node_carpet;
else if (fmod(index, 12) == 7)
node = scene->mesh_node_wall[0];
else if (fmod(index, 12) == 8)
node = scene->mesh_node_wall[1];
else if (fmod(index, 12) == 9)
node = scene->mesh_node_column[1];
else if (fmod(index, 12) == 10)
node = scene->mesh_node_column_c;
else if (fmod(index, 12) == 11)
node = scene->mesh_node_snake;
eo_do(node,
evas_3d_node_bounding_sphere_get(&x0, &y0, &z0, &r));
eo_do(scene->mesh_node_ball,
evas_3d_node_scale_set(r, r, r),
evas_3d_node_position_set(x0, y0, z0));
eo_do(node,
evas_3d_node_bounding_box_get(&x0, &y0, &z0, &x1, &y1, &z1));
float vertixes[] =
{
x0, y0, z1, 0.0, 0.0, 1.0,
x0, y1, z1, 0.0, 0.0, 1.0,
x1, y1, z1, 0.0, 0.0, 1.0,
x1, y0, z1, 0.0, 0.0, 1.0,
x0, y0, z0, 0.0, 0.0, -1.0,
x1, y0, z0, 0.0, 0.0, -1.0,
x0, y1, z0, 0.0, 0.0, -1.0,
x1, y1, z0, 0.0, 0.0, -1.0,
x0, y0, z0, -1.0, 0.0, 0.0,
x0, y1, z0, -1.0, 0.0, 0.0,
x0, y0, z1, -1.0, 0.0, 0.0,
x0, y1, z1, -1.0, 0.0, 0.0,
x1, y0, z0, 1.0, 0.0, 0.0,
x1, y1, z0, 1.0, 0.0, 0.0,
x1, y1, z1, 1.0, 0.0, 0.0,
x1, y0, z1, 1.0, 0.0, 0.0,
x0, y1, z0, 0.0, 1.0, 0.0,
x1, y1, z0, 0.0, 1.0, 0.0,
x0, y1, z1, 0.0, 1.0, 0.0,
x1, y1, z1, 0.0, 1.0, 0.0,
x0, y0, z0, 0.0, -1.0, 0.0,
x1, y0, z0, 0.0, -1.0, 0.0,
x1, y0, z1, 0.0, -1.0, 0.0,
x0, y0, z1, 0.0, -1.0, 0.0
};
unsigned short indixes[] =
{
0, 1, 2, 3, 1, 2, 0, 3,
4, 5, 5, 7, 7, 6, 6, 4,
8, 9, 9, 11, 11, 10, 10, 8,
12, 13, 13, 14, 14, 15, 15, 12,
16, 17, 17, 19, 19, 18, 18, 16,
20, 21, 21, 22, 22, 23, 23, 20
};
if (*mesh)
{
eo_do(*mesh,
evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_LINES),
evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_POSITION, 6 * sizeof(float), &vertixes[ 0]),
evas_3d_mesh_index_data_copy_set(EVAS_3D_INDEX_FORMAT_UNSIGNED_SHORT, 48, &indixes[0]));
return EINA_TRUE;
}
return EINA_FALSE;
}
void _on_delete(Ecore_Evas *ee EINA_UNUSED)
{
ecore_main_loop_quit();
}
void _on_canvas_resize(Ecore_Evas *ee)
{
int w, h;
ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
evas_object_resize(background, w, h);
evas_object_resize(image, w, h);
evas_object_move(image, 0, 0);
}
Eina_Bool _horizontal_circle_resolution(Evas_3D_Node *node, Evas_Real x, Evas_Real z, Evas_Real r)
{
Evas_Real x0, y0, z0, x1, y1, z1;
eo_do(node,
evas_3d_node_bounding_box_get(&x0, &y0, &z0, &x1, &y1, &z1));
if (((x0 - x) * (x0 - x)) + ((z0 - z) * (z0 - z)) < r * r) return EINA_FALSE;
if (((x0 - x) * (x0 - x)) + ((z1 - z) * (z1 - z)) < r * r) return EINA_FALSE;
if (((x1 - x) * (x1 - x)) + ((z0 - z) * (z0 - z)) < r * r) return EINA_FALSE;
if (((x1 - x) * (x1 - x)) + ((z1 - z) * (z1 - z)) < r * r) return EINA_FALSE;
if ((((x + r < x0) && (x + r > x1)) || ((x + r > x0) && (x+r < x1))) && (((z < z0) && (z > z1)) || ((z > z0) && (z < z1))))
return EINA_FALSE;
if ((((x - r < x0) && (x - r > x1)) || ((x - r > x0) && (x-r < x1))) && (((z < z0) && (z > z1)) || ((z > z0) && (z < z1))))
return EINA_FALSE;
if ((((z + r < z0) && (z + r > z1)) || ((z + r > z0) && (z+r < z1))) && (((x < x0) && (x > x1)) || ((x > x0) && (x < x1))))
return EINA_FALSE;
if ((((z - r < z0) && (z - r > z1)) || ((z - r > z0) && (z-r < z1))) && (((x < x0) && (x > x1)) || ((x > x0) && (x < x1))))
return EINA_FALSE;
return EINA_TRUE;
}
Eina_Bool _horizontal_circle_object_resolution(Evas_3D_Node *node, Evas_3D_Node *node2, Evas_Real r)
{
Evas_Real x0, y0, z0, x1, y1, z1, x, y, z;
eo_do(node2,
evas_3d_node_position_get(EVAS_3D_SPACE_WORLD, &x, &y, &z));
eo_do(node,
evas_3d_node_bounding_box_get(&x0, &y0, &z0, &x1, &y1, &z1));
if (((x0 - x) * (x0 - x)) + ((z0 - z) * (z0 - z)) < r * r) return EINA_FALSE;
if (((x0 - x) * (x0 - x)) + ((z1 - z) * (z1 - z)) < r * r) return EINA_FALSE;
if (((x1 - x) * (x1 - x)) + ((z0 - z) * (z0 - z)) < r * r) return EINA_FALSE;
if (((x1 - x) * (x1 - x)) + ((z1 - z) * (z1 - z)) < r * r) return EINA_FALSE;
if ((((x + r < x0) && (x + r > x1)) || ((x + r > x0) && (x+r < x1))) && (((z < z0) && (z > z1)) || ((z > z0) && (z < z1))))
return EINA_FALSE;
if ((((x - r < x0) && (x - r > x1)) || ((x - r > x0) && (x-r < x1))) && (((z < z0) && (z > z1)) || ((z > z0) && (z < z1))))
return EINA_FALSE;
if ((((z + r < z0) && (z + r > z1)) || ((z + r > z0) && (z+r < z1))) && (((x < x0) && (x > x1)) || ((x > x0) && (x < x1))))
return EINA_FALSE;
if ((((z - r < z0) && (z - r > z1)) || ((z - r > z0) && (z-r < z1))) && (((x < x0) && (x > x1)) || ((x > x0) && (x < x1))))
return EINA_FALSE;
return EINA_TRUE;
}
Eina_Bool _horizontal_circle_position_resolution(Evas_3D_Node *node, Evas_Real x, Evas_Real z, Evas_Real r)
{
Evas_Real x0, y0, z0;
eo_do(node,
evas_3d_node_position_get(EVAS_3D_SPACE_PARENT, &x0, &y0, &z0));
if (((x0 - x) * (x0 - x)) + ((z0 - z) * (z0 - z)) < r * r) return EINA_FALSE;
return EINA_TRUE;
}
Eina_Bool _horizontal_position_resolution(Evas_3D_Node *node, Evas_Real x, Evas_Real z)
{
Evas_Real x0, y0, z0, x1, y1, z1;
eo_do(node,
evas_3d_node_bounding_box_get(&x0, &y0, &z0, &x1, &y1, &z1));
if ((x > x0) && (x < x1) && (z > z0) && (z < z1))
return EINA_FALSE;
if ((x > x0) && (x < x1) && (z < z0) && (z > z1))
return EINA_FALSE;
if ((x < x0) && (x > x1) && (z > z0) && (z < z1))
return EINA_FALSE;
if ((x < x0) && (x > x1) && (z < z0) && (z > z1))
return EINA_FALSE;
return EINA_TRUE;
}
/* Is actual for this example only */
Eina_Bool _horizontal_object_resolution(Evas_3D_Node *node, Evas_Real x1, Evas_Real z1, Evas_Real x2,
Evas_Real z2, Evas_Real x_move, Evas_Real z_move)
{
Evas_Real x3, y3, z3, x4, y4, z4;
eo_do(node,
evas_3d_node_bounding_box_get(&x3, &y3, &z3, &x4, &y4, &z4));
if ((x4 + x_move < x1) || (x4 + x_move > x2) ||
(z4 + z_move < z1) || (z4 + z_move > z2))
return EINA_FALSE;
return EINA_TRUE;
}
Eina_Bool _horizontal_frame_resolution(Evas_3D_Node *node, Evas_Real x1, Evas_Real z1, Evas_Real x2,
Evas_Real z2, Evas_Real *x_move, Evas_Real *z_move)
{
Evas_Real x3, y3, z3, x4, y4, z4;
*x_move = 0;
*z_move = 0;
eo_do(node,
evas_3d_node_bounding_box_get(&x3, &y3, &z3, &x4, &y4, &z4));
if (x3 < x1)
*x_move = x1 - x3;
else if (x4 > x2)
*x_move = x2 - x4;
if (z3 < z1)
*z_move = z1 - z3;
else if (z4 > z2)
*z_move = z2 - z4;
if ((*x_move != 0) || (*z_move != 0))
return EINA_FALSE;
return EINA_TRUE;
}
static void
_generate_square_grid(unsigned short *indices, int count)
{
int i, j;
unsigned short *index = &indices[0];
int vccount = count + 1;
for(j = 0; j < count; j++)
for(i = 0; i < count; i++)
{
*index++ = (unsigned short)(i + vccount * j);
*index++ = i + vccount * (j + 1);
*index++ = i + 1 + vccount * (j + 1);
*index++ = i + vccount * j;
*index++ = i + 1 + vccount * j;
*index++ = i + vccount * (j + 1) + 1;
}
}
void
_set_ball(Eo *mesh, int p)
{
int vcount, icount, vccount, i, j;
double dtheta, dfi, sinth, costh, fi, theta, sinfi, cosfi;
unsigned short *indices;
icount = p * p * 6;
vccount = p + 1;
vcount = vccount * vccount;
dtheta = M_PI / p;
dfi = 2 * M_PI / p;
vec3 *vertices = malloc(sizeof(vec3) * vcount);
vec3 *normals = malloc(sizeof(vec3) * vcount);
for (j = 0; j < vccount; j++)
{
theta = j * dtheta;
sinth = sin(theta);
costh = cos(theta);
for (i = 0; i < vccount; i++)
{
fi = i * dfi;
sinfi = sin(fi);
cosfi = cos(fi);
vertices[i + j * vccount].x = sinth * cosfi;
vertices[i + j * vccount].y = sinth * sinfi;
vertices[i + j * vccount].z = costh;
normals[i + j * vccount].x = vertices[i + j * vccount].x;
normals[i + j * vccount].y = vertices[i + j * vccount].y;
normals[i + j * vccount].z = vertices[i + j * vccount].z;
}
}
indices = malloc(sizeof(short) * icount);
_generate_square_grid(indices, p);
eo_do(mesh, evas_3d_mesh_vertex_count_set(vcount),
evas_3d_mesh_frame_add(0);
evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_POSITION,
sizeof(vec3), &vertices[0]);
evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_NORMAL,
sizeof(vec3), &normals[0]);
evas_3d_mesh_index_data_copy_set(EVAS_3D_INDEX_FORMAT_UNSIGNED_SHORT,
icount , &indices[0]));
free(vertices);
free(normals);
free(indices);
}