forked from enlightenment/efl
ephysics: implement update of box faces objects
SVN revision: 79045
This commit is contained in:
parent
02d3fdb54b
commit
d2ed5cbb47
|
@ -1062,6 +1062,53 @@ _ephysics_body_del(EPhysics_Body *body)
|
||||||
free(body);
|
free(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ephysics_body_evas_obj_map_apply(EPhysics_Body *body, Evas_Map *map, Evas_Object *obj, Eina_Bool bfc, Eina_Bool update_cw)
|
||||||
|
{
|
||||||
|
EPhysics_Camera *camera = ephysics_world_camera_get(body->world);
|
||||||
|
|
||||||
|
if (ephysics_camera_perspective_enabled_get(camera))
|
||||||
|
{
|
||||||
|
int px, py, z0, foc;
|
||||||
|
ephysics_camera_perspective_get(camera, &px, &py, &z0, &foc);
|
||||||
|
evas_map_util_3d_perspective(map, px, py, z0, foc);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bfc)
|
||||||
|
{
|
||||||
|
if (evas_map_util_clockwise_get(map))
|
||||||
|
{
|
||||||
|
if (update_cw)
|
||||||
|
body->clockwise = EINA_TRUE;
|
||||||
|
evas_object_show(obj);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (update_cw)
|
||||||
|
body->clockwise = EINA_FALSE;
|
||||||
|
evas_map_free(map);
|
||||||
|
evas_object_hide(obj);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((body->light_apply) ||
|
||||||
|
(ephysics_world_light_all_bodies_get(body->world)))
|
||||||
|
{
|
||||||
|
int lr, lg, lb, ar, ag, ab;
|
||||||
|
Evas_Coord lx, ly, lz;
|
||||||
|
|
||||||
|
ephysics_world_point_light_position_get(body->world, &lx, &ly, &lz);
|
||||||
|
ephysics_world_point_light_color_get(body->world, &lr, &lg, &lb);
|
||||||
|
ephysics_world_ambient_light_color_get(body->world, &ar, &ag, &ab);
|
||||||
|
evas_map_util_3d_lighting(map, lx, ly, lz, lr, lg, lb, ar, ag, ab);
|
||||||
|
}
|
||||||
|
|
||||||
|
evas_object_map_set(obj, map);
|
||||||
|
evas_object_map_enable_set(obj, EINA_TRUE);
|
||||||
|
evas_map_free(map);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_ephysics_cloth_face_objs_update(EPhysics_Body *body __UNUSED__)
|
_ephysics_cloth_face_objs_update(EPhysics_Body *body __UNUSED__)
|
||||||
{
|
{
|
||||||
|
@ -1077,6 +1124,121 @@ _ephysics_cylinder_face_objs_update(EPhysics_Body *body __UNUSED__)
|
||||||
static void
|
static void
|
||||||
_ephysics_box_face_objs_update(EPhysics_Body *body)
|
_ephysics_box_face_objs_update(EPhysics_Body *body)
|
||||||
{
|
{
|
||||||
|
EPhysics_Body_Face_Obj *face_obj;
|
||||||
|
int i, x, y, z, wx, wy, wh, cx, cy;
|
||||||
|
EPhysics_Camera *camera;
|
||||||
|
Evas_Coord v[8][3];
|
||||||
|
btQuaternion quat;
|
||||||
|
btTransform trans;
|
||||||
|
btBoxShape *shape;
|
||||||
|
Evas_Map *map;
|
||||||
|
Eina_List *l;
|
||||||
|
double rate;
|
||||||
|
void *ldata;
|
||||||
|
|
||||||
|
ephysics_world_render_geometry_get(body->world, &wx, &wy, NULL,
|
||||||
|
NULL, &wh, NULL);
|
||||||
|
camera = ephysics_world_camera_get(body->world);
|
||||||
|
ephysics_camera_position_get(camera, &cx, &cy);
|
||||||
|
cx -= wx;
|
||||||
|
cy -= wy;
|
||||||
|
|
||||||
|
rate = ephysics_world_rate_get(body->world);
|
||||||
|
trans = _ephysics_body_transform_get(body);
|
||||||
|
|
||||||
|
x = (int) (trans.getOrigin().getX() * rate) - cx;
|
||||||
|
y = wh + wy - (int) (trans.getOrigin().getY() * rate) - cy;
|
||||||
|
z = (int) (trans.getOrigin().getZ() * rate);
|
||||||
|
|
||||||
|
shape = (btBoxShape *) body->collision_shape;
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
btVector3 vertice;
|
||||||
|
shape->getVertex(i, vertice);
|
||||||
|
v[i][0] = vertice.getX() * rate + x;
|
||||||
|
v[i][1] = - vertice.getY() * rate + y;
|
||||||
|
v[i][2] = vertice.getZ() * rate + z;
|
||||||
|
}
|
||||||
|
|
||||||
|
quat = trans.getRotation();
|
||||||
|
quat.normalize();
|
||||||
|
|
||||||
|
EINA_LIST_FOREACH(body->face_objs, l, ldata)
|
||||||
|
{
|
||||||
|
Evas_Object *obj;
|
||||||
|
Evas_Coord w, h;
|
||||||
|
|
||||||
|
face_obj = (EPhysics_Body_Face_Obj *)ldata;
|
||||||
|
obj = face_obj->obj;
|
||||||
|
evas_object_geometry_get(obj, NULL, NULL, &w, &h);
|
||||||
|
|
||||||
|
map = evas_map_new(4);
|
||||||
|
evas_map_point_image_uv_set(map, 0, 0, 0);
|
||||||
|
evas_map_point_image_uv_set(map, 1, w, 0);
|
||||||
|
evas_map_point_image_uv_set(map, 2, w, h);
|
||||||
|
evas_map_point_image_uv_set(map, 3, 0, h);
|
||||||
|
|
||||||
|
switch(face_obj->face)
|
||||||
|
{
|
||||||
|
case EPHYSICS_BODY_BOX_FACE_MIDDLE_FRONT:
|
||||||
|
evas_map_point_coord_set(map, 0, v[5][0], v[5][1], z);
|
||||||
|
evas_map_point_coord_set(map, 1, v[4][0], v[4][1], z);
|
||||||
|
evas_map_point_coord_set(map, 2, v[6][0], v[6][1], z);
|
||||||
|
evas_map_point_coord_set(map, 3, v[7][0], v[7][1], z);
|
||||||
|
break;
|
||||||
|
case EPHYSICS_BODY_BOX_FACE_MIDDLE_BACK:
|
||||||
|
evas_map_point_coord_set(map, 0, v[0][0], v[0][1], z);
|
||||||
|
evas_map_point_coord_set(map, 1, v[1][0], v[1][1], z);
|
||||||
|
evas_map_point_coord_set(map, 2, v[3][0], v[3][1], z);
|
||||||
|
evas_map_point_coord_set(map, 3, v[2][0], v[2][1], z);
|
||||||
|
break;
|
||||||
|
case EPHYSICS_BODY_BOX_FACE_FRONT:
|
||||||
|
evas_map_point_coord_set(map, 0, v[5][0], v[5][1], v[5][2]);
|
||||||
|
evas_map_point_coord_set(map, 1, v[4][0], v[4][1], v[4][2]);
|
||||||
|
evas_map_point_coord_set(map, 2, v[6][0], v[6][1], v[6][2]);
|
||||||
|
evas_map_point_coord_set(map, 3, v[7][0], v[7][1], v[7][2]);
|
||||||
|
break;
|
||||||
|
case EPHYSICS_BODY_BOX_FACE_BACK:
|
||||||
|
evas_map_point_coord_set(map, 0, v[0][0], v[0][1], v[0][2]);
|
||||||
|
evas_map_point_coord_set(map, 1, v[1][0], v[1][1], v[1][2]);
|
||||||
|
evas_map_point_coord_set(map, 2, v[3][0], v[3][1], v[3][2]);
|
||||||
|
evas_map_point_coord_set(map, 3, v[2][0], v[2][1], v[2][2]);
|
||||||
|
break;
|
||||||
|
case EPHYSICS_BODY_BOX_FACE_RIGHT:
|
||||||
|
evas_map_point_coord_set(map, 0, v[4][0], v[4][1], v[4][2]);
|
||||||
|
evas_map_point_coord_set(map, 1, v[0][0], v[0][1], v[0][2]);
|
||||||
|
evas_map_point_coord_set(map, 2, v[2][0], v[2][1], v[2][2]);
|
||||||
|
evas_map_point_coord_set(map, 3, v[6][0], v[6][1], v[6][2]);
|
||||||
|
break;
|
||||||
|
case EPHYSICS_BODY_BOX_FACE_LEFT:
|
||||||
|
evas_map_point_coord_set(map, 0, v[1][0], v[1][1], v[1][2]);
|
||||||
|
evas_map_point_coord_set(map, 1, v[5][0], v[5][1], v[5][2]);
|
||||||
|
evas_map_point_coord_set(map, 2, v[7][0], v[7][1], v[7][2]);
|
||||||
|
evas_map_point_coord_set(map, 3, v[3][0], v[3][1], v[3][2]);
|
||||||
|
break;
|
||||||
|
case EPHYSICS_BODY_BOX_FACE_TOP:
|
||||||
|
evas_map_point_coord_set(map, 0, v[1][0], v[1][1], v[1][2]);
|
||||||
|
evas_map_point_coord_set(map, 1, v[0][0], v[0][1], v[0][2]);
|
||||||
|
evas_map_point_coord_set(map, 2, v[4][0], v[4][1], v[4][2]);
|
||||||
|
evas_map_point_coord_set(map, 3, v[5][0], v[5][1], v[5][2]);
|
||||||
|
break;
|
||||||
|
case EPHYSICS_BODY_BOX_FACE_BOTTOM:
|
||||||
|
evas_map_point_coord_set(map, 0, v[7][0], v[7][1], v[7][2]);
|
||||||
|
evas_map_point_coord_set(map, 1, v[6][0], v[6][1], v[6][2]);
|
||||||
|
evas_map_point_coord_set(map, 2, v[2][0], v[2][1], v[2][2]);
|
||||||
|
evas_map_point_coord_set(map, 3, v[3][0], v[3][1], v[3][2]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
WRN("Face %i not updated", face_obj->face);
|
||||||
|
evas_map_free(map);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
evas_map_util_quat_rotate(map, quat.x(), -quat.y(), quat.z(), -quat.w(),
|
||||||
|
x, y, z);
|
||||||
|
_ephysics_body_evas_obj_map_apply(body, map, obj, EINA_TRUE,
|
||||||
|
EINA_FALSE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1141,45 +1303,8 @@ _ephysics_body_evas_object_default_update(EPhysics_Body *body)
|
||||||
quat.normalize();
|
quat.normalize();
|
||||||
evas_map_util_quat_rotate(map, quat.x(), quat.y(), quat.z(), -quat.w(),
|
evas_map_util_quat_rotate(map, quat.x(), quat.y(), quat.z(), -quat.w(),
|
||||||
x + (w * body->cm.x), y + (h * body->cm.y), z);
|
x + (w * body->cm.x), y + (h * body->cm.y), z);
|
||||||
|
_ephysics_body_evas_obj_map_apply(body, map, body->evas_obj,
|
||||||
if (ephysics_camera_perspective_enabled_get(camera))
|
body->back_face_culling, EINA_TRUE);
|
||||||
{
|
|
||||||
int px, py, z0, foc;
|
|
||||||
ephysics_camera_perspective_get(camera, &px, &py, &z0, &foc);
|
|
||||||
evas_map_util_3d_perspective(map, px, py, z0, foc);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (body->back_face_culling)
|
|
||||||
{
|
|
||||||
if (evas_map_util_clockwise_get(map))
|
|
||||||
{
|
|
||||||
body->clockwise = EINA_TRUE;
|
|
||||||
evas_object_show(body->evas_obj);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
body->clockwise = EINA_FALSE;
|
|
||||||
evas_map_free(map);
|
|
||||||
evas_object_hide(body->evas_obj);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((body->light_apply) ||
|
|
||||||
(ephysics_world_light_all_bodies_get(body->world)))
|
|
||||||
{
|
|
||||||
int lr, lg, lb, ar, ag, ab;
|
|
||||||
Evas_Coord lx, ly, lz;
|
|
||||||
|
|
||||||
ephysics_world_point_light_position_get(body->world, &lx, &ly, &lz);
|
|
||||||
ephysics_world_point_light_color_get(body->world, &lr, &lg, &lb);
|
|
||||||
ephysics_world_ambient_light_color_get(body->world, &ar, &ag, &ab);
|
|
||||||
evas_map_util_3d_lighting(map, lx, ly, lz, lr, lg, lb, ar, ag, ab);
|
|
||||||
}
|
|
||||||
|
|
||||||
evas_object_map_set(body->evas_obj, map);
|
|
||||||
evas_object_map_enable_set(body->evas_obj, EINA_TRUE);
|
|
||||||
evas_map_free(map);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in New Issue