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