[SLP Merge] 2011/7/18 16:11
[framework/uifw/elementary.git] / src / bin / test_3d.c
1 #include <Elementary.h>
2 #ifdef HAVE_CONFIG_H
3 # include "elementary_config.h"
4 #endif
5 #ifndef ELM_LIB_QUICKLAUNCH
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 *
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_add(evas);
48         c->side[i].o = o;
49         snprintf(buf, sizeof(buf), "%s/images/%s",
50                  PACKAGE_DATA_DIR, "twofish.jpg");
51         evas_object_image_file_set(o, buf, NULL);
52         evas_object_image_fill_set(o, 0, 0, 256, 256);
53         evas_object_resize(o, 256, 256);
54         evas_object_image_smooth_scale_set(o, 0);
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
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 foc, Evas_Coord z0)
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    evas_map_smooth_set(m, 0);
102
103    for (i = 0; i < 6; i++)
104      {
105         Evas_Coord tz[4];
106
107         for (j = 0; j < 4; j++)
108           {
109              evas_map_point_coord_set(m, j,
110                                       c->side[i].pt[j].x + x,
111                                       c->side[i].pt[j].y + y,
112                                       c->side[i].pt[j].z + z);
113              evas_map_point_image_uv_set(m, j,
114                                          c->side[i].pt[j].u,
115                                          c->side[i].pt[j].v);
116              evas_map_point_color_set(m, j, 255, 255, 255, 255);
117           }
118         evas_map_util_3d_rotate(m, dx, dy, dz, x, y, z);
119         evas_map_util_3d_lighting(m, -1000, -1000, -1000,
120                                   255, 255, 255,
121                                   20, 20, 20);
122         evas_map_util_3d_perspective(m, cx, cy, foc, z0);
123         if (evas_map_util_clockwise_get(m))
124           {
125              evas_object_map_enable_set(c->side[i].o, 1);
126              evas_object_map_set(c->side[i].o, m);
127              evas_object_show(c->side[i].o);
128           }
129         else
130            evas_object_hide(c->side[i].o);
131
132         order[i] = i;
133         for (j = 0; j < 4; j++)
134            evas_map_point_coord_get(m, j, NULL, NULL, &(tz[j]));
135         mz[i] = (tz[0] + tz[1] + tz[2] + tz[3]) / 4;
136      }
137    sorted = 0;
138    do
139      {
140         sorted = 1;
141         for (i = 0; i < 5; i++)
142           {
143              if (mz[order[i]] > mz[order[i + 1]])
144                {
145                   j = order[i];
146                   order[i] = order[i + 1];
147                   order[i + 1] = j;
148                   sorted = 0;
149                }
150           }
151      }
152    while (!sorted);
153
154    evas_object_raise(c->side[order[0]].o);
155    for (i = 1; i < 6; i++)
156       evas_object_stack_below(c->side[order[i]].o, c->side[order[i - 1]].o);
157    evas_map_free(m);
158 }
159
160 /*
161 static void
162 _cube_free(Cube *c)
163 {
164    int i;
165
166    for (i = 0; i < 6; i++) evas_object_del(c->side[i].o);
167    free(c);
168 }
169 */
170
171 static void
172 _cube_update(Evas_Object *win, Cube *c)
173 {
174    Evas_Coord w, h;
175
176    evas_object_geometry_get(win, NULL, NULL, &w, &h);
177    _cube_pos(c,
178              (w / 2), (h / 2), 512,
179              rotx, roty, rotz,
180              (w / 2) + cxo, (h / 2) + cyo, z0v, focv);
181 }
182
183 void
184 _ch_rot_x(void *data, Evas_Object *obj, void *event_info __UNUSED__)
185 {
186    Evas_Object *win = data;
187    rotx = elm_slider_value_get(obj);
188    _cube_update(win, cube);
189 }
190
191 void
192 _ch_rot_y(void *data, Evas_Object *obj, void *event_info __UNUSED__)
193 {
194    Evas_Object *win = data;
195    roty = elm_slider_value_get(obj);
196    _cube_update(win, cube);
197 }
198
199 void
200 _ch_rot_z(void *data, Evas_Object *obj, void *event_info __UNUSED__)
201 {
202    Evas_Object *win = data;
203    rotz = elm_slider_value_get(obj);
204    _cube_update(win, cube);
205 }
206
207 void
208 _ch_cx(void *data, Evas_Object *obj, void *event_info __UNUSED__)
209 {
210    Evas_Object *win = data;
211    cxo = elm_slider_value_get(obj);
212    _cube_update(win, cube);
213 }
214
215 void
216 _ch_cy(void *data, Evas_Object *obj, void *event_info __UNUSED__)
217 {
218    Evas_Object *win = data;
219    cyo = elm_slider_value_get(obj);
220    _cube_update(win, cube);
221 }
222
223 void
224 _ch_foc(void *data, Evas_Object *obj, void *event_info __UNUSED__)
225 {
226    Evas_Object *win = data;
227    focv = elm_slider_value_get(obj);
228    _cube_update(win, cube);
229 }
230
231 void
232 _ch_z0(void *data, Evas_Object *obj, void *event_info __UNUSED__)
233 {
234    Evas_Object *win = data;
235    z0v = elm_slider_value_get(obj);
236    _cube_update(win, cube);
237 }
238
239 void
240 test_3d(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
241 {
242    Evas_Object *win, *bg, *bx, *sl;
243
244    win = elm_win_add(NULL, "3d", ELM_WIN_BASIC);
245    elm_win_title_set(win, "3D");
246    elm_win_autodel_set(win, 1);
247
248    bg = elm_bg_add(win);
249    elm_win_resize_object_add(win, bg);
250    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
251    evas_object_show(bg);
252
253    cube = _cube_new(evas_object_evas_get(win), 240, 240, 240);
254
255    bx = elm_box_add(win);
256    evas_object_layer_set(bx, 10);
257    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
258    elm_win_resize_object_add(win, bx);
259    evas_object_show(bx);
260
261    sl = elm_slider_add(win);
262    elm_object_text_set(sl, "Rot X");
263    elm_slider_unit_format_set(sl, "%1.0f units");
264    elm_slider_span_size_set(sl, 360);
265    elm_slider_min_max_set(sl, 0, 360);
266    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
267    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
268    elm_box_pack_end(bx, sl);
269    evas_object_smart_callback_add(sl, "changed", _ch_rot_x, win);
270    evas_object_show(sl);
271
272    sl = elm_slider_add(win);
273    elm_object_text_set(sl, "Rot Y");
274    elm_slider_unit_format_set(sl, "%1.0f units");
275    elm_slider_span_size_set(sl, 360);
276    elm_slider_min_max_set(sl, 0, 360);
277    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
278    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
279    elm_box_pack_end(bx, sl);
280    evas_object_smart_callback_add(sl, "changed", _ch_rot_y, win);
281    evas_object_show(sl);
282
283    sl = elm_slider_add(win);
284    elm_object_text_set(sl, "Rot Z");
285    elm_slider_unit_format_set(sl, "%1.0f units");
286    elm_slider_span_size_set(sl, 360);
287    elm_slider_min_max_set(sl, 0, 360);
288    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
289    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
290    elm_box_pack_end(bx, sl);
291    evas_object_smart_callback_add(sl, "changed", _ch_rot_z, win);
292    evas_object_show(sl);
293
294    sl = elm_slider_add(win);
295    elm_object_text_set(sl, "CX Off");
296    elm_slider_unit_format_set(sl, "%1.0f units");
297    elm_slider_span_size_set(sl, 360);
298    elm_slider_min_max_set(sl, -320, 320);
299    elm_slider_value_set(sl, cxo);
300    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
301    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
302    elm_box_pack_end(bx, sl);
303    evas_object_smart_callback_add(sl, "changed", _ch_cx, win);
304    evas_object_show(sl);
305
306    sl = elm_slider_add(win);
307    elm_object_text_set(sl, "CY Off");
308    elm_slider_unit_format_set(sl, "%1.0f units");
309    elm_slider_span_size_set(sl, 360);
310    elm_slider_min_max_set(sl, -320, 320);
311    elm_slider_value_set(sl, cyo);
312    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
313    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
314    elm_box_pack_end(bx, sl);
315    evas_object_smart_callback_add(sl, "changed", _ch_cy, win);
316    evas_object_show(sl);
317
318    sl = elm_slider_add(win);
319    elm_object_text_set(sl, "Foc");
320    elm_slider_unit_format_set(sl, "%1.0f units");
321    elm_slider_span_size_set(sl, 360);
322    elm_slider_min_max_set(sl, 1, 2000);
323    elm_slider_value_set(sl, focv);
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_foc, win);
328    evas_object_show(sl);
329
330    sl = elm_slider_add(win);
331    elm_object_text_set(sl, "Z0");
332    elm_slider_unit_format_set(sl, "%1.0f units");
333    elm_slider_span_size_set(sl, 360);
334    elm_slider_min_max_set(sl, -2000, 2000);
335    elm_slider_value_set(sl, z0v);
336    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
337    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
338    elm_box_pack_end(bx, sl);
339    evas_object_smart_callback_add(sl, "changed", _ch_z0, win);
340    evas_object_show(sl);
341
342    evas_object_resize(win, 480, 480);
343    _cube_update(win, cube);
344    evas_object_show(win);
345 }
346 #endif