/* This function applies the information from the Photo_Object to the actual * evas objects. Zoom/rotate factors and etc. */ static void apply_changes(Photo_Object *po) { Evas_Map *map; map = evas_map_new(4); evas_map_point_coord_set(map, 0, po->bx, po->by, 0); evas_map_point_coord_set(map, 1, po->bx + po->bw, po->by, 0); evas_map_point_coord_set(map, 2, po->bx + po->bw, po->by + po->bh, 0); evas_map_point_coord_set(map, 3, po->bx, po->by + po->bh, 0); evas_map_point_image_uv_set(map, 0, 0, 0); evas_map_point_image_uv_set(map, 1, po->bw, 0); evas_map_point_image_uv_set(map, 2, po->bw, po->bh); evas_map_point_image_uv_set(map, 3, 0, po->bh); evas_map_util_rotate(map, po->rotate, po->bx + po->bw / 2, po->by + po->bh /2); evas_map_util_zoom(map, po->zoom, po->zoom, po->bx + po->bw / 2, po->by + po->bh /2); evas_object_map_enable_set(po->ic, EINA_TRUE); evas_object_map_set(po->ic, map); { Evas_Map *shadow_map = evas_map_new(4); evas_map_point_coord_set(shadow_map, 0, po->bx, po->by, 0); evas_map_point_coord_set(shadow_map, 1, po->bx + po->bw, po->by, 0); evas_map_point_coord_set(shadow_map, 2, po->bx + po->bw, po->by + po->bh, 0); evas_map_point_coord_set(shadow_map, 3, po->bx, po->by + po->bh, 0); evas_map_point_image_uv_set(shadow_map, 0, 0, 0); evas_map_point_image_uv_set(shadow_map, 1, SHADOW_W, 0); evas_map_point_image_uv_set(shadow_map, 2, SHADOW_W, SHADOW_H); evas_map_point_image_uv_set(shadow_map, 3, 0, SHADOW_H); evas_map_util_rotate(shadow_map, po->rotate, po->bx + po->bw / 2, po->by + po->bh /2); evas_map_util_zoom(shadow_map, po->zoom * po->shadow_zoom, po->zoom * po->shadow_zoom, po->bx + (po->bw / 2), po->by + (po->bh / 2)); evas_object_map_enable_set(po->shadow, EINA_TRUE); evas_object_map_set(po->shadow, shadow_map); evas_map_free(shadow_map); } /* Update the position of the hit box */ { Evas_Coord minx, miny, maxx, maxy; int i; evas_object_polygon_points_clear(po->hit); evas_map_point_coord_get(map, 0, &minx, &miny, NULL); maxx = minx; maxy = miny; evas_object_polygon_point_add(po->hit, minx, miny); for (i = 1 ; i <= 3 ; i++) { Evas_Coord x, y; evas_map_point_coord_get(map, i, &x, &y, NULL); evas_object_polygon_point_add(po->hit, x, y); if (x < minx) minx = x; else if (x > maxx) maxx = x; if (y < miny) miny = y; else if (y > maxy) maxy = y; } } evas_object_raise(po->shadow); evas_object_raise(po->ic); evas_object_raise(po->hit); evas_map_free(map); }
static void _cube_pos(Cube *c, Evas_Coord x, Evas_Coord y, Evas_Coord z, double dx, double dy, double dz, Evas_Coord cx, Evas_Coord cy, Evas_Coord foc, Evas_Coord z0) { Evas_Map *m; int i, j, order[6], sorted; Evas_Coord mz[6]; m = evas_map_new(4); evas_map_smooth_set(m, 0); for (i = 0; i < 6; i++) { Evas_Coord tz[4]; for (j = 0; j < 4; j++) { evas_map_point_coord_set(m, j, c->side[i].pt[j].x + x, c->side[i].pt[j].y + y, c->side[i].pt[j].z + z); evas_map_point_image_uv_set(m, j, c->side[i].pt[j].u, c->side[i].pt[j].v); evas_map_point_color_set(m, j, 255, 255, 255, 255); } evas_map_util_3d_rotate(m, dx, dy, dz, x, y, z); evas_map_util_3d_lighting(m, -1000, -1000, -1000, 255, 255, 255, 20, 20, 20); evas_map_util_3d_perspective(m, cx, cy, foc, z0); if (evas_map_util_clockwise_get(m)) { evas_object_map_enable_set(c->side[i].o, 1); evas_object_map_set(c->side[i].o, m); evas_object_show(c->side[i].o); } else evas_object_hide(c->side[i].o); order[i] = i; for (j = 0; j < 4; j++) evas_map_point_coord_get(m, j, NULL, NULL, &(tz[j])); mz[i] = (tz[0] + tz[1] + tz[2] + tz[3]) / 4; } sorted = 0; do { sorted = 1; for (i = 0; i < 5; i++) { if (mz[order[i]] > mz[order[i + 1]]) { j = order[i]; order[i] = order[i + 1]; order[i + 1] = j; sorted = 0; } } } while (!sorted); evas_object_raise(c->side[order[0]].o); for (i = 1; i < 6; i++) evas_object_stack_below(c->side[order[i]].o, c->side[order[i - 1]].o); evas_map_free(m); }