efl

Форк
0
/
test_3d.c 
334 строки · 9.9 Кб
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 *
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
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
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
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
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
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
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
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
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
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
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 * elm_config_scale_get(),
331
                           480 * elm_config_scale_get());
332
   _cube_update(win, cube);
333
   evas_object_show(win);
334
}
335

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.