#ifdef HAVE_CONFIG_H # include #endif #include "Eo.h" #include "Evas.h" #include "Eo.hh" #include "Eina.hh" #include "Evas.hh" #include "main.h" #define EXPEDITE_CXX_TEST_IMPL #include "image_map_3d_flow_capi.h" /* standard var */ static int done = 0; #define CNUM 48 /* private data */ static efl::eina::list images; static efl::eina::list reflec; /* setup */ static void _setup(void) { evas::canvas canvas(::eo_ref(G_evas)); for (int i = 0; i < CNUM; i++) { char buf[256]; evas::image o1(efl::eo::parent = canvas); snprintf(buf, sizeof(buf), "cube%i.png", (i % 6) + 1); // XXX eo_do(o1._eo_ptr(), efl_file_set(build_path(buf), NULL)); // XXX o1.fill_set(0, 0, 256, 256); o1.evas::object::size_set(256, 256); o1.smooth_scale_set(0); o1.visibility_set(true); images.push_back(o1); evas::image o2(efl::eo::parent = canvas); snprintf(buf, sizeof(buf), "cube%i.png", (i % 6) + 1); // XXX eo_do(o2._eo_ptr(), efl_file_set(build_path(buf), NULL)); // XXX o2.fill_set(0, 0, 256, 256); o2.size_set(256, 256); o2.smooth_scale_set(0); o2.visibility_set(true); reflec.push_back(o2); } done = 0; } /* cleanup */ static void _cleanup(void) { for (evas::image& i : images) i.parent_set(efl::eo::base(nullptr)); images.clear(); for (evas::image& i : reflec) i.parent_set(efl::eo::base(nullptr)); reflec.clear(); } /* loop - do things */ static void _loop(double t, int f) { static Evas_Map *m = NULL; int center = 150; if (!m) m = evas_map_new(4); evas_map_smooth_set(m, 0); efl::eina::list::iterator it_i = images.begin(), end_i = images.end(), it_r = reflec.begin(), end_r = reflec.end(); for (int i = 0; i < CNUM && it_i != end_i && it_r != end_r; i++) { Evas_Coord x = (win_w / 2); Evas_Coord y = (win_h / 2); Evas_Coord w = 256; Evas_Coord h = 256; Evas_Coord c = (i - (CNUM / 2)) * (w / 4); c += (f % (6 * (w / 4))); double ang = (double)c / (double)center; if (ang > 0.0) ang = ang * ang; else ang = -ang * ang; ang *= -90.0; if (ang > 90.0) ang = 90.0; else if (ang < -90.0) ang = -90.0; if ((c > (-center)) && (c <= (center))) { double n = (double)c / (double)center; if (c > 0) { n = 1.0 - n; n = 1.0 - (n * n); } else { n = -(-1.0 - n); n = -(1.0 - (n * n)); } c = n * center * 2.0; } else if (c <= (-center)) c = (c + center) - (center * 2); else if (c > (center)) c = (c - center) + (center * 2); Evas_Coord z = 0; if ((c > (-center)) && (c <= (center))) { z = (c * (w / 2)) / center; if (z < 0) z = -z; z = (w / 2) - z; } x += c; x -= (w / 2); Evas_Coord xx = x + w; y -= (h / 2); Evas_Coord yy = y + h; if (c <= 0) { (*it_i).raise(); (*it_r).raise(); } else { (*it_i).lower(); (*it_r).lower(); } evas_map_point_coord_set (m, 0, x, y, -z); evas_map_point_image_uv_set(m, 0, 0, 0); evas_map_point_color_set (m, 0, 255, 255, 255, 255); evas_map_point_coord_set (m, 1, xx, y, -z); evas_map_point_image_uv_set(m, 1, 256, 0); evas_map_point_color_set (m, 1, 255, 255, 255, 255); evas_map_point_coord_set (m, 2, xx, yy, -z); evas_map_point_image_uv_set(m, 2, 256, 256); evas_map_point_color_set (m, 2, 255, 255, 255, 255); evas_map_point_coord_set (m, 3, x, yy, -z); evas_map_point_image_uv_set(m, 3, 0, 256); evas_map_point_color_set (m, 3, 255, 255, 255, 255); evas_map_util_3d_rotate(m, 0, ang, 0, x + (w / 2), y + (h / 2), 0); evas_map_util_3d_perspective(m, (win_w / 2), (win_h / 2), -256, 512); (*it_i).map_enable_set(1); (*it_i).map_set(m); evas_map_point_coord_set (m, 0, x, yy, -z); evas_map_point_image_uv_set(m, 0, 0, 256); evas_map_point_color_set (m, 0, 128, 128, 128, 128); evas_map_point_coord_set (m, 1, xx, yy, -z); evas_map_point_image_uv_set(m, 1, 256, 256); evas_map_point_color_set (m, 1, 128, 128, 128, 128); evas_map_point_coord_set (m, 2, xx, yy + h, -z); evas_map_point_image_uv_set(m, 2, 256, 0); evas_map_point_color_set (m, 2, 0, 0, 0, 0); evas_map_point_coord_set (m, 3, x, yy + h, -z); evas_map_point_image_uv_set(m, 3, 0, 0); evas_map_point_color_set (m, 3, 0, 0, 0, 0); evas_map_util_3d_rotate(m, 0, ang, 0, x + (w / 2), y + (h / 2), 0); evas_map_util_3d_perspective(m, (win_w / 2), (win_h / 2), -256, 512); (*it_r).map_enable_set(1); (*it_r).map_set(m); ++it_i; ++it_r; } FPS_STD(NAME); } /* prepend special key handlers if interactive (before STD) */ static void _key(char *key) { KEY_STD; } extern "C" void FNAME(void) { _setup(); ui_func_set(_key, _loop); }