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

360 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_Canvas3D_Node *node, Evas_Real scale)
{
evas_canvas3d_node_scale_set(node, 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 = efl_add(EVAS_CANVAS3D_CAMERA_CLASS, evas);
evas_canvas3d_camera_projection_perspective_set(data->camera, 65.0, 1.0, 1.0, 300.0);
data->mediator_node = efl_add(EVAS_CANVAS3D_NODE_CLASS, evas, evas_canvas3d_node_constructor(efl_added, EVAS_CANVAS3D_NODE_TYPE_NODE));
data->camera_node = efl_add(EVAS_CANVAS3D_NODE_CLASS, evas, evas_canvas3d_node_constructor(efl_added, EVAS_CANVAS3D_NODE_TYPE_CAMERA));
evas_canvas3d_node_member_add(data->root_node, data->mediator_node);
evas_canvas3d_node_member_add(data->mediator_node, data->camera_node);
evas_canvas3d_node_camera_set(data->camera_node, data->camera);
evas_canvas3d_node_position_set(data->camera_node, 20.0, 80.0, 30.0);
evas_canvas3d_node_look_at_set(data->camera_node, EVAS_CANVAS3D_SPACE_PARENT, 0.0, 0.0, 0.0, EVAS_CANVAS3D_SPACE_PARENT, 0.0, 1.0, 0.0);
}
void
_light_setup(Scene_Data *data)
{
data->light = efl_add(EVAS_CANVAS3D_LIGHT_CLASS, evas);
evas_canvas3d_light_ambient_set(data->light, 0.2, 0.2, 0.2, 1.0);
evas_canvas3d_light_diffuse_set(data->light, 1.0, 1.0, 1.0, 1.0);
evas_canvas3d_light_specular_set(data->light, 0.2, 0.2, 0.2, 1.0);
evas_canvas3d_light_projection_perspective_set(data->light, 100.0, 1.0, 1.0, 200.0);
data->light_node = efl_add(EVAS_CANVAS3D_NODE_CLASS, evas, evas_canvas3d_node_constructor(efl_added, EVAS_CANVAS3D_NODE_TYPE_LIGHT));
evas_canvas3d_node_light_set(data->light_node, data->light);
evas_canvas3d_node_position_set(data->light_node, -30.0, 70.0, 0.0);
evas_canvas3d_node_look_at_set(data->light_node, EVAS_CANVAS3D_SPACE_PARENT, 0.0, 0.0, 0.0, EVAS_CANVAS3D_SPACE_PARENT, 0.0, 0.0, 1.0);
evas_canvas3d_node_member_add(data->root_node, data->light_node);
}
Eina_Bool _mesh_aabb(Evas_Canvas3D_Mesh **mesh, Scene_Data *scene, int index)
{
Evas_Real x0, y0, z0, x1, y1, z1, r;
Evas_Canvas3D_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;
evas_canvas3d_node_bounding_sphere_get(node, &x0, &y0, &z0, &r);
evas_canvas3d_node_scale_set(scene->mesh_node_ball, r, r, r);
evas_canvas3d_node_position_set(scene->mesh_node_ball, x0, y0, z0);
evas_canvas3d_node_bounding_box_get(node, &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)
{
evas_canvas3d_mesh_vertex_assembly_set(*mesh, EVAS_CANVAS3D_VERTEX_ASSEMBLY_LINES);
evas_canvas3d_mesh_frame_vertex_data_copy_set(*mesh, 0, EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION, 6 * sizeof(float), &vertixes[ 0]);
evas_canvas3d_mesh_index_data_copy_set(*mesh, EVAS_CANVAS3D_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_Canvas3D_Node *node, Evas_Real x, Evas_Real z, Evas_Real r)
{
Evas_Real x0, y0, z0, x1, y1, z1;
evas_canvas3d_node_bounding_box_get(node, &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_Canvas3D_Node *node, Evas_Canvas3D_Node *node2, Evas_Real r)
{
Evas_Real x0, y0, z0, x1, y1, z1, x, y, z;
evas_canvas3d_node_position_get(node2, EVAS_CANVAS3D_SPACE_WORLD, &x, &y, &z);
evas_canvas3d_node_bounding_box_get(node, &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_Canvas3D_Node *node, Evas_Real x, Evas_Real z, Evas_Real r)
{
Evas_Real x0, y0, z0;
evas_canvas3d_node_position_get(node, EVAS_CANVAS3D_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_Canvas3D_Node *node, Evas_Real x, Evas_Real z)
{
Evas_Real x0, y0, z0, x1, y1, z1;
evas_canvas3d_node_bounding_box_get(node, &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_Canvas3D_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;
evas_canvas3d_node_bounding_box_get(node, &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_Canvas3D_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;
evas_canvas3d_node_bounding_box_get(node, &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);
evas_canvas3d_mesh_vertex_count_set(mesh, vcount);
evas_canvas3d_mesh_frame_add(mesh, 0);
evas_canvas3d_mesh_frame_vertex_data_copy_set(mesh, 0, EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION, sizeof(vec3), &vertices[0]);
evas_canvas3d_mesh_frame_vertex_data_copy_set(mesh, 0, EVAS_CANVAS3D_VERTEX_ATTRIB_NORMAL, sizeof(vec3), &normals[0]);
evas_canvas3d_mesh_index_data_copy_set(mesh, EVAS_CANVAS3D_INDEX_FORMAT_UNSIGNED_SHORT, icount, &indices[0]);
free(vertices);
free(normals);
free(indices);
}