Expedite initialize.
[framework/uifw/expedite.git] / src / bin / image_map_3d_4.c
1 #undef FNAME
2 #undef NAME
3 #undef ICON
4
5 /* metadata */
6 #define FNAME image_map_3d_4_start
7 #define NAME "Image Map 3D 4"
8 #define ICON "3d.png"
9
10 #ifndef PROTO
11 # ifndef UI
12 #  include "main.h"
13
14 typedef struct _Point
15 {
16    Evas_Coord x, y, z, u, v;
17 } Point;
18
19 typedef struct _Side
20 {
21    Evas_Object *o;
22    Point pt[4];
23 } Side;
24
25 typedef struct _Cube
26 {
27    Side side[6];
28 } Cube;
29
30 /* standard var */
31 static int done = 0;
32
33 /* private data */
34 static Cube *cubes[5];
35
36 #define POINT(n, p, xx, yy, zz, uu, vv) \
37    c->side[n].pt[p].x = xx; \
38    c->side[n].pt[p].y = yy; \
39    c->side[n].pt[p].z = zz; \
40    c->side[n].pt[p].u = uu; \
41    c->side[n].pt[p].v = vv
42
43 static Cube *
44 _cube_new(Evas_Coord w, Evas_Coord h, Evas_Coord d)
45 {
46    Cube *c;
47    int i;
48
49    w -= (w / 2);
50    h -= (h / 2);
51    d -= (d / 2);
52    c = calloc(1, sizeof(Cube));
53    for (i = 0; i < 6; i++)
54      {
55         Evas_Object *o;
56         char buf[256];
57         o = evas_object_image_add(evas);
58         c->side[i].o = o;
59         snprintf(buf, sizeof(buf), "cube%i.png", i + 1);
60         evas_object_image_file_set(o, build_path(buf), NULL);
61         evas_object_image_fill_set(o, 0, 0, 256, 256);
62         evas_object_resize(o, 256, 256);
63         evas_object_show(o);
64      }
65    POINT(0, 0, -w, -h, -d,   0,   0);
66    POINT(0, 1,  w, -h, -d, 256,   0);
67    POINT(0, 2,  w,  h, -d, 256, 256);
68    POINT(0, 3, -w,  h, -d,   0, 256);
69
70    POINT(1, 0,  w, -h, -d,   0,   0);
71    POINT(1, 1,  w, -h,  d, 256,   0);
72    POINT(1, 2,  w,  h,  d, 256, 256);
73    POINT(1, 3,  w,  h, -d,   0, 256);
74    
75    POINT(2, 0,  w, -h,  d,   0,   0);
76    POINT(2, 1, -w, -h,  d, 256,   0);
77    POINT(2, 2, -w,  h,  d, 256, 256);
78    POINT(2, 3,  w,  h,  d,   0, 256);
79
80    POINT(3, 0, -w, -h,  d,   0,   0);
81    POINT(3, 1, -w, -h, -d, 256,   0);
82    POINT(3, 2, -w,  h, -d, 256, 256);
83    POINT(3, 3, -w,  h,  d,   0, 256);
84    
85    POINT(4, 0, -w, -h,  d,   0,   0);
86    POINT(4, 1,  w, -h,  d, 256,   0);
87    POINT(4, 2,  w, -h, -d, 256, 256);
88    POINT(4, 3, -w, -h, -d,   0, 256);
89    
90    POINT(5, 0, -w,  h, -d,   0,   0);
91    POINT(5, 1,  w,  h, -d, 256,   0);
92    POINT(5, 2,  w,  h,  d, 256, 256);
93    POINT(5, 3, -w,  h,  d,   0, 256);
94    
95    return c;
96 }
97
98 static void
99 _cube_pos(Cube *c,
100           Evas_Coord x, Evas_Coord y, Evas_Coord z,
101           double dx, double dy, double dz)
102 {
103    Evas_Map *m;
104    int i, j, order[6], sorted;
105    Evas_Coord mz[6];
106    
107    m = evas_map_new(4);
108
109    for (i = 0; i < 6; i++)
110      {
111         Evas_Coord tz[4];
112         
113         for (j = 0; j < 4; j++)
114           {
115              evas_map_point_coord_set(m, j,
116                                       c->side[i].pt[j].x + x, 
117                                       c->side[i].pt[j].y + y, 
118                                       c->side[i].pt[j].z + z);
119              evas_map_point_image_uv_set(m, j,
120                                       c->side[i].pt[j].u,
121                                       c->side[i].pt[j].v);
122              evas_map_point_color_set(m, j, 255, 255, 255, 128);
123           }
124         evas_map_util_3d_rotate(m, dx, dy, dz, x, y, z);
125         evas_map_util_3d_lighting(m, -1000, -1000, -1000,
126                                   255, 255, 255,
127                                   20, 20, 20);
128         evas_map_util_3d_perspective(m, (win_w / 2), (win_h / 2), 0, 512);
129         evas_object_map_enable_set(c->side[i].o, 1);
130         evas_object_map_set(c->side[i].o, m);
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 static void
161 _cube_free(Cube *c)
162 {
163    int i;
164    
165    for (i = 0; i < 6; i++) evas_object_del(c->side[i].o);
166    free(c);
167 }
168
169 /* setup */
170 static void _setup(void)
171 {
172    cubes[0] = _cube_new(128, 128, 256);
173    cubes[1] = _cube_new(256, 128, 128);
174    cubes[2] = _cube_new(256, 256, 128);
175    cubes[3] = _cube_new(128, 256, 128);
176    cubes[4] = _cube_new(256, 256, 256);
177
178    done = 0;
179 }
180
181 /* cleanup */
182 static void _cleanup(void)
183 {
184    _cube_free(cubes[0]);
185    _cube_free(cubes[1]);
186    _cube_free(cubes[2]);
187    _cube_free(cubes[3]);
188    _cube_free(cubes[4]);
189 }
190
191 /* loop - do things */
192 static void _loop(double t, int f)
193 {
194    _cube_pos(cubes[0], 
195              (win_w / 2) - 640, (win_h / 2) - 256, 512,
196              f / 2.0, f, f / 3.0);
197    _cube_pos(cubes[1], 
198              (win_w / 2) + 512, (win_h / 2) - 128, 384,
199              f / 3.0, f / 2.0, f / 4.0);
200    _cube_pos(cubes[2], 
201              (win_w / 2) - 384, (win_h / 2) + 128, 256, 
202              f / 2.0, f / 3.0, f);
203    _cube_pos(cubes[3], 
204              (win_w / 2) + 256, (win_h / 2) + 64, 128, 
205              f, f / 5.0, f / 2.0);
206    _cube_pos(cubes[4], 
207              (win_w / 2), (win_h / 2), 0, 
208              f / 4.0, f / 3.0, f / 5.0);
209    FPS_STD(NAME);
210 }
211
212 /* prepend special key handlers if interactive (before STD) */
213 static void _key(char *key)
214 {
215    KEY_STD;
216 }
217
218
219
220
221
222
223
224
225
226
227
228
229 /* template stuff - ignore */
230 # endif
231 #endif
232
233 #ifdef UI
234 _ui_menu_item_add(ICON, NAME, FNAME);
235 #endif
236
237 #ifdef PROTO
238 void FNAME(void);
239 #endif
240
241 #ifndef PROTO
242 # ifndef UI
243 void FNAME(void)
244 {
245    ui_func_set(_key, _loop);
246    _setup();
247 }
248 # endif
249 #endif
250 #undef FNAME
251 #undef NAME
252 #undef ICON