1 #include "test.h"
2 #ifdef HAVE_CONFIG_H
3 # include "elementary_config.h"
4 #endif
5 #include <Elementary.h>
6 
7 typedef struct _Point
8 {
9    Evas_Coord x, y, z, u, v;
10 } Point;
11 
12 typedef struct _Side
13 {
14    Evas_Object *o;
15    Point pt[4];
16 } Side;
17 
18 typedef struct _Cube
19 {
20    Side side[6];
21 } Cube;
22 
23 static Cube *cube;
24 static double rotx = 0.0, roty = 0.0, rotz = 0.0;
25 static double cxo = 0.0, cyo = 0.0, focv = 256.0, z0v = 0.0;
26 #define POINT(n, p, xx, yy, zz, uu, vv) \
27    c->side[n].pt[p].x = xx; \
28    c->side[n].pt[p].y = yy; \
29    c->side[n].pt[p].z = zz; \
30    c->side[n].pt[p].u = uu; \
31    c->side[n].pt[p].v = vv
32 
33 static Cube *
_cube_new(Evas * evas,Evas_Coord w,Evas_Coord h,Evas_Coord d)34 _cube_new(Evas *evas, Evas_Coord w, Evas_Coord h, Evas_Coord d)
35 {
36    Cube *c;
37    int i;
38 
39    w -= (w / 2);
40    h -= (h / 2);
41    d -= (d / 2);
42    c = calloc(1, sizeof(Cube));
43    for (i = 0; i < 6; i++)
44      {
45         Evas_Object *o;
46         char buf[PATH_MAX];
47         o = evas_object_image_filled_add(evas);
48         c->side[i].o = o;
49         snprintf(buf, sizeof(buf), "%s/images/%s",
50                  elm_app_data_dir_get(), "twofish.jpg");
51         evas_object_image_file_set(o, buf, NULL);
52         evas_object_resize(o, 256, 256);
53         evas_object_pass_events_set(o, EINA_TRUE);
54         evas_object_color_set(o, 235, 235, 235, 235);
55         evas_object_show(o);
56      }
57    POINT(0, 0, -w, -h, -d,   0,   0);
58    POINT(0, 1,  w, -h, -d, 256,   0);
59    POINT(0, 2,  w,  h, -d, 256, 256);
60    POINT(0, 3, -w,  h, -d,   0, 256);
61 
62    POINT(1, 0,  w, -h, -d,   0,   0);
63    POINT(1, 1,  w, -h,  d, 256,   0);
64    POINT(1, 2,  w,  h,  d, 256, 256);
65    POINT(1, 3,  w,  h, -d,   0, 256);
66 
67    POINT(2, 0,  w, -h,  d,   0,   0);
68    POINT(2, 1, -w, -h,  d, 256,   0);
69    POINT(2, 2, -w,  h,  d, 256, 256);
70    POINT(2, 3,  w,  h,  d,   0, 256);
71 
72    POINT(3, 0, -w, -h,  d,   0,   0);
73    POINT(3, 1, -w, -h, -d, 256,   0);
74    POINT(3, 2, -w,  h, -d, 256, 256);
75    POINT(3, 3, -w,  h,  d,   0, 256);
76 
77    POINT(4, 0, -w, -h,  d,   0,   0);
78    POINT(4, 1,  w, -h,  d, 256,   0);
79    POINT(4, 2,  w, -h, -d, 256, 256);
80    POINT(4, 3, -w, -h, -d,   0, 256);
81 
82    POINT(5, 0, -w,  h, -d,   0,   0);
83    POINT(5, 1,  w,  h, -d, 256,   0);
84    POINT(5, 2,  w,  h,  d, 256, 256);
85    POINT(5, 3, -w,  h,  d,   0, 256);
86 
87    return c;
88 }
89 
90 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 z0,Evas_Coord foc)91 _cube_pos(Cube *c,
92           Evas_Coord x, Evas_Coord y, Evas_Coord z,
93           double dx, double dy, double dz,
94           Evas_Coord cx, Evas_Coord cy, Evas_Coord z0, Evas_Coord foc)
95 {
96    Evas_Map *m;
97    int i, j, order[6], sorted;
98    Evas_Coord mz[6];
99 
100    m = evas_map_new(4);
101 
102    for (i = 0; i < 6; i++)
103      {
104         Evas_Coord tz[4];
105 
106         for (j = 0; j < 4; j++)
107           {
108              evas_map_point_coord_set(m, j,
109                                       c->side[i].pt[j].x + x,
110                                       c->side[i].pt[j].y + y,
111                                       c->side[i].pt[j].z + z);
112              evas_map_point_image_uv_set(m, j,
113                                          c->side[i].pt[j].u,
114                                          c->side[i].pt[j].v);
115              evas_map_point_color_set(m, j, 255, 255, 255, 255);
116           }
117         evas_map_util_3d_rotate(m, dx, dy, dz, x, y, z);
118         evas_map_util_3d_lighting(m, -1000, -1000, -1000,
119                                   255, 255, 255,
120                                   20, 20, 20);
121         evas_map_util_3d_perspective(m, cx, cy, z0, foc);
122         if (evas_map_util_clockwise_get(m))
123           {
124              evas_object_map_enable_set(c->side[i].o, EINA_TRUE);
125              evas_object_map_set(c->side[i].o, m);
126              evas_object_show(c->side[i].o);
127           }
128         else
129            evas_object_hide(c->side[i].o);
130 
131         order[i] = i;
132         for (j = 0; j < 4; j++)
133            evas_map_point_coord_get(m, j, NULL, NULL, &(tz[j]));
134         mz[i] = (tz[0] + tz[1] + tz[2] + tz[3]) / 4;
135      }
136    do
137      {
138         sorted = 1;
139         for (i = 0; i < 5; i++)
140           {
141              if (mz[order[i]] > mz[order[i + 1]])
142                {
143                   j = order[i];
144                   order[i] = order[i + 1];
145                   order[i + 1] = j;
146                   sorted = 0;
147                }
148           }
149      }
150    while (!sorted);
151 
152    evas_object_raise(c->side[order[0]].o);
153    for (i = 1; i < 6; i++)
154       evas_object_stack_below(c->side[order[i]].o, c->side[order[i - 1]].o);
155    evas_map_free(m);
156 }
157 
158 static void
_cube_update(Evas_Object * win,Cube * c)159 _cube_update(Evas_Object *win, Cube *c)
160 {
161    Evas_Coord w, h;
162 
163    evas_object_geometry_get(win, NULL, NULL, &w, &h);
164    _cube_pos(c,
165              (w / 2), (h / 2), 512,
166              rotx, roty, rotz,
167              (w / 2) + cxo, (h / 2) + cyo, z0v, focv);
168 }
169 
170 void
_ch_rot_x(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)171 _ch_rot_x(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
172 {
173    Evas_Object *win = data;
174    rotx = elm_slider_value_get(obj);
175    _cube_update(win, cube);
176 }
177 
178 void
_ch_rot_y(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)179 _ch_rot_y(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
180 {
181    Evas_Object *win = data;
182    roty = elm_slider_value_get(obj);
183    _cube_update(win, cube);
184 }
185 
186 void
_ch_rot_z(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)187 _ch_rot_z(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
188 {
189    Evas_Object *win = data;
190    rotz = elm_slider_value_get(obj);
191    _cube_update(win, cube);
192 }
193 
194 void
_ch_cx(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)195 _ch_cx(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
196 {
197    Evas_Object *win = data;
198    cxo = elm_slider_value_get(obj);
199    _cube_update(win, cube);
200 }
201 
202 void
_ch_cy(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)203 _ch_cy(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
204 {
205    Evas_Object *win = data;
206    cyo = elm_slider_value_get(obj);
207    _cube_update(win, cube);
208 }
209 
210 void
_ch_foc(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)211 _ch_foc(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
212 {
213    Evas_Object *win = data;
214    focv = elm_slider_value_get(obj);
215    _cube_update(win, cube);
216 }
217 
218 void
_ch_z0(void * data,Evas_Object * obj,void * event_info EINA_UNUSED)219 _ch_z0(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
220 {
221    Evas_Object *win = data;
222    z0v = elm_slider_value_get(obj);
223    _cube_update(win, cube);
224 }
225 
226 void
test_3d(void * data EINA_UNUSED,Evas_Object * obj EINA_UNUSED,void * event_info EINA_UNUSED)227 test_3d(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
228 {
229    Evas_Object *win, *bx, *sl;
230 
231    win = elm_win_util_standard_add("evas-map-3d", "Evas Map 3D");
232    elm_win_autodel_set(win, EINA_TRUE);
233 
234    cube = _cube_new(evas_object_evas_get(win), 240, 240, 240);
235 
236    bx = elm_box_add(win);
237    evas_object_layer_set(bx, 10);
238    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
239    elm_win_resize_object_add(win, bx);
240    evas_object_show(bx);
241 
242    sl = elm_slider_add(win);
243    elm_object_text_set(sl, "Rot X");
244    elm_slider_unit_format_set(sl, "%1.0f units");
245    elm_slider_indicator_format_set(sl, "%1.0f units");
246    elm_slider_span_size_set(sl, 360);
247    elm_slider_min_max_set(sl, 0, 360);
248    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
249    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
250    elm_box_pack_end(bx, sl);
251    evas_object_smart_callback_add(sl, "changed", _ch_rot_x, win);
252    evas_object_show(sl);
253 
254    sl = elm_slider_add(win);
255    elm_object_text_set(sl, "Rot Y");
256    elm_slider_unit_format_set(sl, "%1.0f units");
257    elm_slider_indicator_format_set(sl, "%1.0f units");
258    elm_slider_span_size_set(sl, 360);
259    elm_slider_min_max_set(sl, 0, 360);
260    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
261    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
262    elm_box_pack_end(bx, sl);
263    evas_object_smart_callback_add(sl, "changed", _ch_rot_y, win);
264    evas_object_show(sl);
265 
266    sl = elm_slider_add(win);
267    elm_object_text_set(sl, "Rot Z");
268    elm_slider_unit_format_set(sl, "%1.0f units");
269    elm_slider_indicator_format_set(sl, "%1.0f units");
270    elm_slider_span_size_set(sl, 360);
271    elm_slider_min_max_set(sl, 0, 360);
272    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
273    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
274    elm_box_pack_end(bx, sl);
275    evas_object_smart_callback_add(sl, "changed", _ch_rot_z, win);
276    evas_object_show(sl);
277 
278    sl = elm_slider_add(win);
279    elm_object_text_set(sl, "PX Off");
280    elm_slider_unit_format_set(sl, "%1.0f units");
281    elm_slider_indicator_format_set(sl, "%1.0f units");
282    elm_slider_span_size_set(sl, 360);
283    elm_slider_min_max_set(sl, -320, 320);
284    elm_slider_value_set(sl, cxo);
285    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
286    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
287    elm_box_pack_end(bx, sl);
288    evas_object_smart_callback_add(sl, "changed", _ch_cx, win);
289    evas_object_show(sl);
290 
291    sl = elm_slider_add(win);
292    elm_object_text_set(sl, "PY Off");
293    elm_slider_unit_format_set(sl, "%1.0f units");
294    elm_slider_indicator_format_set(sl, "%1.0f units");
295    elm_slider_span_size_set(sl, 360);
296    elm_slider_min_max_set(sl, -320, 320);
297    elm_slider_value_set(sl, cyo);
298    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
299    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
300    elm_box_pack_end(bx, sl);
301    evas_object_smart_callback_add(sl, "changed", _ch_cy, win);
302    evas_object_show(sl);
303 
304    sl = elm_slider_add(win);
305    elm_object_text_set(sl, "Foc");
306    elm_slider_unit_format_set(sl, "%1.0f units");
307    elm_slider_indicator_format_set(sl, "%1.0f units");
308    elm_slider_span_size_set(sl, 360);
309    elm_slider_min_max_set(sl, 1, 2000);
310    elm_slider_value_set(sl, focv);
311    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
312    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
313    elm_box_pack_end(bx, sl);
314    evas_object_smart_callback_add(sl, "changed", _ch_foc, win);
315    evas_object_show(sl);
316 
317    sl = elm_slider_add(win);
318    elm_object_text_set(sl, "Z0");
319    elm_slider_unit_format_set(sl, "%1.0f units");
320    elm_slider_indicator_format_set(sl, "%1.0f units");
321    elm_slider_span_size_set(sl, 360);
322    elm_slider_min_max_set(sl, -2000, 2000);
323    elm_slider_value_set(sl, z0v);
324    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
325    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
326    elm_box_pack_end(bx, sl);
327    evas_object_smart_callback_add(sl, "changed", _ch_z0, win);
328    evas_object_show(sl);
329 
330    evas_object_resize(win, 480, 480);
331    _cube_update(win, cube);
332    evas_object_show(win);
333 }
334