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