246 lines
15 KiB
C
246 lines
15 KiB
C
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
|
||
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
|
||
|
||
#define FOG_COLOR 0.5, 0.5, 0.5
|
||
#define FOG_FACTOR 0.01
|
||
#define WIDTH 1920
|
||
#define HEIGHT 1080
|
||
#define SOLDIER_RADIUS 5.3 /* soldier couldn't get сloser to camera than SOLDIER_RADIUS */
|
||
#define COLUMN_RADIUS 3.0 /* warrior couldn't get сloser to any column than WARRIOR_COLUMN */
|
||
#define WALL_RADIUS 2.2 /* camera couldn't get сloser to wall than WALL_RADIUS */
|
||
#define JUMP_HIGHT 4
|
||
#define GUN_DIR_X 0
|
||
#define GUN_DIR_Y -2
|
||
#define GUN_DIR_Z 105
|
||
#define ROCKET_POS_X 0.4
|
||
#define ROCKET_POS_Y -3.1
|
||
#define ROCKET_POS_Z 0.0
|
||
#define TOMMY_POS_X 1.0
|
||
#define TOMMY_POS_Y -3.3
|
||
#define TOMMY_POS_Z -9.0
|
||
#define TOMMY_JUMP_X 0.7
|
||
#define TOMMY_JUMP_Y 3.3
|
||
#define TOMMY_JUMP_Z -4.1
|
||
|
||
|
||
#define GUN_SPEED 0.001
|
||
#define WARRIOR_SPEED 0.001
|
||
#define WARRIOR_SPEED2 0.003
|
||
#define SNAKE_SPEED 0.1
|
||
#define SNAKE_SPEED2 0.001
|
||
#define ROCKET_SPEED 2
|
||
#define TO_RADIAN M_PI / 180
|
||
#define JUMP 0.2
|
||
#define STEP 2.5
|
||
#define FALL_SPEED_UP 0.04
|
||
#define CAMERA_SPEED 2
|
||
#define CAMERA_MOVE 0.3
|
||
|
||
#define SOLDIER_FRAME_X1 -43
|
||
#define SOLDIER_FRAME_X2 76
|
||
#define SOLDIER_FRAME_Z1 -55
|
||
#define SOLDIER_FRAME_Z2 30.3
|
||
#define ROCKET_FRAME_X1 -47
|
||
#define ROCKET_FRAME_X2 80
|
||
#define ROCKET_FRAME_Z1 -59
|
||
#define ROCKET_FRAME_Z2 34
|
||
#define SNAKE_FRAME_X1 -47
|
||
#define SNAKE_FRAME_X2 79
|
||
#define SNAKE_FRAME_Z1 -59
|
||
#define SNAKE_FRAME_Z2 32
|
||
|
||
typedef struct _vec3
|
||
{
|
||
float x;
|
||
float y;
|
||
float z;
|
||
} vec3;
|
||
|
||
typedef struct _vec2
|
||
{
|
||
float x;
|
||
float y;
|
||
} vec2;
|
||
|
||
#define KEY_MOTION(way) \
|
||
{ \
|
||
for (i = 0; (motion_vec[i] > 0) && (!pressed); i++) \
|
||
pressed = (motion_vec[i] == way); \
|
||
\
|
||
if (!pressed) \
|
||
motion_vec[i] = way; \
|
||
\
|
||
if ((way == 1) || (way == 3)) \
|
||
camera_move = CAMERA_MOVE; \
|
||
else \
|
||
camera_move = -CAMERA_MOVE; \
|
||
\
|
||
if (way < 3) \
|
||
lateral_motion_indicator = 0; \
|
||
else \
|
||
lateral_motion_indicator = 1; \
|
||
}
|
||
|
||
#define KEY_MOTION_DOWN(way) \
|
||
{ \
|
||
while ((motion_vec[i] != way) && (i < 4)) \
|
||
i++; \
|
||
for (j = i; j < 3; j++) \
|
||
motion_vec[j] = motion_vec[j + 1]; \
|
||
motion_vec[3] = 0; \
|
||
\
|
||
i = 0; \
|
||
while (motion_vec[i] > 0) \
|
||
i++; \
|
||
if (i > 0) \
|
||
{ \
|
||
if ((motion_vec[i - 1] == 1) || (motion_vec[i - 1] == 3)) \
|
||
camera_move = CAMERA_MOVE; \
|
||
else \
|
||
camera_move = -CAMERA_MOVE; \
|
||
\
|
||
if (motion_vec[i-1] < 3) \
|
||
lateral_motion_indicator = 0; \
|
||
else \
|
||
lateral_motion_indicator = 1; \
|
||
} \
|
||
else \
|
||
camera_move = 0; \
|
||
}
|
||
|
||
|
||
#define ENABLE_FOG(mesh) \
|
||
evas_canvas3d_mesh_fog_enable_set(mesh, EINA_TRUE); \
|
||
evas_canvas3d_mesh_fog_color_set(mesh, FOG_COLOR, FOG_FACTOR);
|
||
|
||
|
||
#define DISABLE_FOG(mesh) \
|
||
evas_canvas3d_mesh_fog_enable_set(mesh, EINA_FALSE);
|
||
|
||
|
||
#define ENABLE_NORMAL(mesh) \
|
||
evas_canvas3d_mesh_shade_mode_set(mesh, EVAS_CANVAS3D_SHADE_MODE_NORMAL_MAP);
|
||
|
||
|
||
#define DISABLE_NORMAL(mesh) \
|
||
evas_canvas3d_mesh_shade_mode_set(mesh, EVAS_CANVAS3D_SHADE_MODE_PHONG);
|
||
|
||
|
||
#define ADD_MESH(Object, Name, a, d, s) \
|
||
data->material_##Object = eo_add(EVAS_CANVAS3D_MATERIAL_CLASS, evas); \
|
||
\
|
||
evas_canvas3d_material_enable_set(data->material_##Object, EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT, EINA_TRUE); \
|
||
evas_canvas3d_material_enable_set(data->material_##Object, EVAS_CANVAS3D_MATERIAL_ATTRIB_DIFFUSE, EINA_TRUE); \
|
||
evas_canvas3d_material_enable_set(data->material_##Object, EVAS_CANVAS3D_MATERIAL_ATTRIB_SPECULAR, EINA_TRUE); \
|
||
evas_canvas3d_material_enable_set(data->material_##Object, EVAS_CANVAS3D_MATERIAL_ATTRIB_NORMAL, EINA_TRUE); \
|
||
evas_canvas3d_material_color_set(data->material_##Object, EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT, a, a, a, 1.0); \
|
||
evas_canvas3d_material_color_set(data->material_##Object, EVAS_CANVAS3D_MATERIAL_ATTRIB_DIFFUSE, d, d, d, 1.0); \
|
||
evas_canvas3d_material_color_set(data->material_##Object, EVAS_CANVAS3D_MATERIAL_ATTRIB_SPECULAR, s, s, s, 1.0); \
|
||
evas_canvas3d_material_shininess_set(data->material_##Object, 50.0); \
|
||
\
|
||
data->mesh_##Name = eo_add(EVAS_CANVAS3D_MESH_CLASS, evas);
|
||
|
||
#define SETUP_DEFAULT_MESH(Object, Name, Shade_Mode) \
|
||
evas_canvas3d_mesh_shade_mode_set(data->mesh_##Name, EVAS_CANVAS3D_SHADE_MODE_##Shade_Mode); \
|
||
evas_canvas3d_mesh_vertex_assembly_set(data->mesh_##Name, EVAS_CANVAS3D_VERTEX_ASSEMBLY_TRIANGLES); \
|
||
evas_canvas3d_mesh_frame_material_set(data->mesh_##Name, 0, data->material_##Object);
|
||
|
||
|
||
#define SETUP_MESH_NODE(Name) \
|
||
data->mesh_node_##Name = eo_add(EVAS_CANVAS3D_NODE_CLASS, evas, evas_canvas3d_node_constructor(eoid, EVAS_CANVAS3D_NODE_TYPE_MESH)); \
|
||
\
|
||
evas_canvas3d_node_mesh_add(data->mesh_node_##Name, data->mesh_##Name);
|
||
|
||
|
||
#define MATERIAL_TEXTURE_SET(Object, Name, file, image) \
|
||
efl_file_set(data->mesh_##Name, file, NULL); \
|
||
\
|
||
SETUP_DEFAULT_MESH(Object, Name, PHONG) \
|
||
data->texture_diffuse_##Object = eo_add(EVAS_CANVAS3D_TEXTURE_CLASS, evas); \
|
||
\
|
||
evas_canvas3d_texture_atlas_enable_set(data->texture_diffuse_##Object, EINA_FALSE); \
|
||
evas_canvas3d_texture_file_set(data->texture_diffuse_##Object, image, NULL); \
|
||
evas_canvas3d_texture_filter_set(data->texture_diffuse_##Object, EVAS_CANVAS3D_TEXTURE_FILTER_NEAREST, \
|
||
EVAS_CANVAS3D_TEXTURE_FILTER_NEAREST); \
|
||
evas_canvas3d_texture_wrap_set(data->texture_diffuse_##Object, EVAS_CANVAS3D_WRAP_MODE_REPEAT, EVAS_CANVAS3D_WRAP_MODE_REPEAT); \
|
||
\
|
||
evas_canvas3d_material_texture_set(data->material_##Object, EVAS_CANVAS3D_MATERIAL_ATTRIB_DIFFUSE, \
|
||
data->texture_diffuse_##Object); \
|
||
evas_canvas3d_material_texture_set(data->material_##Object, EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT, \
|
||
data->texture_diffuse_##Object);
|
||
|
||
|
||
#define CUBE_TEXTURE_SET(Object, Name, vertex, image) \
|
||
evas_canvas3d_mesh_from_primitive_set(data->mesh_##Name, 0, data->cube_primitive); \
|
||
evas_canvas3d_mesh_frame_vertex_data_set(data->mesh_##Name, 0, EVAS_CANVAS3D_VERTEX_ATTRIB_TEXCOORD, \
|
||
2 * sizeof(float), vertex); \
|
||
SETUP_DEFAULT_MESH(Object, Name, NORMAL_MAP) \
|
||
data->texture_diffuse_##Object = eo_add(EVAS_CANVAS3D_TEXTURE_CLASS, evas); \
|
||
\
|
||
evas_canvas3d_texture_atlas_enable_set(data->texture_diffuse_##Object, EINA_FALSE); \
|
||
evas_canvas3d_texture_file_set(data->texture_diffuse_##Object, image, NULL); \
|
||
evas_canvas3d_texture_filter_set(data->texture_diffuse_##Object, EVAS_CANVAS3D_TEXTURE_FILTER_NEAREST, \
|
||
EVAS_CANVAS3D_TEXTURE_FILTER_NEAREST); \
|
||
evas_canvas3d_texture_wrap_set(data->texture_diffuse_##Object, EVAS_CANVAS3D_WRAP_MODE_REPEAT, EVAS_CANVAS3D_WRAP_MODE_REPEAT); \
|
||
\
|
||
evas_canvas3d_material_texture_set(data->material_##Object, EVAS_CANVAS3D_MATERIAL_ATTRIB_DIFFUSE, \
|
||
data->texture_diffuse_##Object); \
|
||
evas_canvas3d_material_texture_set(data->material_##Object, EVAS_CANVAS3D_MATERIAL_ATTRIB_AMBIENT, \
|
||
data->texture_diffuse_##Object);
|
||
|
||
|
||
#define NORMAL_SET(Object, Name, normal) \
|
||
data->texture_normal_##Object = eo_add(EVAS_CANVAS3D_TEXTURE_CLASS, evas); \
|
||
\
|
||
evas_canvas3d_texture_atlas_enable_set(data->texture_normal_##Object, EINA_FALSE); \
|
||
evas_canvas3d_texture_file_set(data->texture_normal_##Object, normal, NULL); \
|
||
evas_canvas3d_texture_filter_set(data->texture_normal_##Object, EVAS_CANVAS3D_TEXTURE_FILTER_NEAREST, \
|
||
EVAS_CANVAS3D_TEXTURE_FILTER_NEAREST); \
|
||
evas_canvas3d_texture_wrap_set(data->texture_normal_##Object, EVAS_CANVAS3D_WRAP_MODE_REPEAT, EVAS_CANVAS3D_WRAP_MODE_REPEAT); \
|
||
\
|
||
evas_canvas3d_material_texture_set(data->material_##Object, EVAS_CANVAS3D_MATERIAL_ATTRIB_NORMAL, \
|
||
data->texture_normal_##Object); \
|
||
\
|
||
evas_canvas3d_mesh_shade_mode_set(data->mesh_##Name, EVAS_CANVAS3D_SHADE_MODE_NORMAL_MAP);
|
||
|
||
#define TEXTCOORDS_SET(Name, fb1, fb2, lr1, lr2, tb1, tb2) \
|
||
static float Name##_textcoords[] = \
|
||
{ \
|
||
/* Front */ \
|
||
0.0, 0.0, \
|
||
fb1, 0.0, \
|
||
fb1, fb2, \
|
||
0.0, fb2, \
|
||
\
|
||
/* Left */ \
|
||
lr1, 0.0, \
|
||
lr1, lr2, \
|
||
0.0, lr2, \
|
||
0.0, 0.0, \
|
||
\
|
||
/* Back */ \
|
||
0.0, 0.0, \
|
||
fb1, 0.0, \
|
||
fb1, fb2, \
|
||
0.0, fb2, \
|
||
\
|
||
/* Right */ \
|
||
0.0, lr2, \
|
||
0.0, 0.0, \
|
||
lr1, 0.0, \
|
||
lr1, lr2, \
|
||
\
|
||
/* Top */ \
|
||
0.0, 0.0, \
|
||
0.0, tb2, \
|
||
tb1, tb2, \
|
||
tb1, 0.0, \
|
||
\
|
||
/* Bottom */ \
|
||
tb1, 0.0, \
|
||
tb1, tb2, \
|
||
0.0, tb2, \
|
||
0.0, 0.0, \
|
||
};
|
||
|