efl
746 строк · 20.9 Кб
1#ifdef HAVE_CONFIG_H2# include "elementary_config.h"3#endif4
5#include <Efl_Ui.h>6#include <Elementary.h>7#ifndef M_PI8#define M_PI 3.141592659#endif10
11typedef struct _Gear Gear;12typedef struct _GLData GLData;13struct _Gear14{
15GLfloat *vertices;16GLuint vbo;17int count;18};19
20// GL related data here..
21struct _GLData22{
23Evas_GL_API *glapi;24GLuint program;25GLuint vtx_shader;26GLuint fgmt_shader;27int initialized : 1;28int mouse_down : 1;29
30// Gear Stuff31GLfloat view_rotx;32GLfloat view_roty;33GLfloat view_rotz;34
35Gear *gear1;36Gear *gear2;37Gear *gear3;38
39GLfloat angle;40
41GLuint proj_location;42GLuint light_location;43GLuint color_location;44
45GLfloat proj[16];46GLfloat light[3];47};48
49static void gears_init(GLData *gld);50static void free_gear(Gear *gear);51static void gears_reshape(GLData *gld, int width, int height);52static void render_gears(GLData *gld);53
54//--------------------------------//
55// Gear Stuff....
56static GLfloat *57vert(GLfloat *p, GLfloat x, GLfloat y, GLfloat z, GLfloat *n)58{
59p[0] = x;60p[1] = y;61p[2] = z;62p[3] = n[0];63p[4] = n[1];64p[5] = n[2];65
66return p + 6;67}
68
69/* Draw a gear wheel. You'll probably want to call this function when
70* building a display list since we do a lot of trig here.
71*
72* Input: inner_radius - radius of hole at center
73* outer_radius - radius at center of teeth
74* width - width of gear
75* teeth - number of teeth
76* tooth_depth - depth of tooth
77*/
78static Gear *79make_gear(GLData *gld, GLfloat inner_radius, GLfloat outer_radius, GLfloat width,80GLint teeth, GLfloat tooth_depth)81{
82GLint i;83GLfloat r0, r1, r2;84GLfloat da;85GLfloat *v;86Gear *gear;87double s[5], c[5];88GLfloat normal[3];89const int tris_per_tooth = 20;90Evas_GL_API *gl = gld->glapi;91
92gear = (Gear*)malloc(sizeof(Gear));93if (gear == NULL)94return NULL;95
96r0 = inner_radius;97r1 = outer_radius - tooth_depth / 2.0;98r2 = outer_radius + tooth_depth / 2.0;99
100da = 2.0 * M_PI / teeth / 4.0;101
102gear->vertices = calloc(teeth * tris_per_tooth * 3 * 6,103sizeof *gear->vertices);104s[4] = 0;105c[4] = 1;106v = gear->vertices;107for (i = 0; i < teeth; i++)108{109s[0] = s[4];110c[0] = c[4];111s[1] = sin(i * 2.0 * M_PI / teeth + da);112c[1] = cos(i * 2.0 * M_PI / teeth + da);113s[2] = sin(i * 2.0 * M_PI / teeth + da * 2);114c[2] = cos(i * 2.0 * M_PI / teeth + da * 2);115s[3] = sin(i * 2.0 * M_PI / teeth + da * 3);116c[3] = cos(i * 2.0 * M_PI / teeth + da * 3);117s[4] = sin(i * 2.0 * M_PI / teeth + da * 4);118c[4] = cos(i * 2.0 * M_PI / teeth + da * 4);119
120normal[0] = 0.0;121normal[1] = 0.0;122normal[2] = 1.0;123
124v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal);125
126v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal);127v = vert(v, r2 * c[2], r2 * s[2], width * 0.5, normal);128v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal);129v = vert(v, r1 * c[3], r1 * s[3], width * 0.5, normal);130v = vert(v, r0 * c[0], r0 * s[0], width * 0.5, normal);131v = vert(v, r1 * c[4], r1 * s[4], width * 0.5, normal);132v = vert(v, r0 * c[4], r0 * s[4], width * 0.5, normal);133
134v = vert(v, r0 * c[4], r0 * s[4], width * 0.5, normal);135v = vert(v, r0 * c[0], r0 * s[0], width * 0.5, normal);136v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal);137v = vert(v, r0 * c[0], r0 * s[0], -width * 0.5, normal);138
139normal[0] = 0.0;140normal[1] = 0.0;141normal[2] = -1.0;142
143v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal);144
145v = vert(v, r0 * c[4], r0 * s[4], -width * 0.5, normal);146v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal);147v = vert(v, r0 * c[0], r0 * s[0], -width * 0.5, normal);148v = vert(v, r1 * c[3], r1 * s[3], -width * 0.5, normal);149v = vert(v, r1 * c[0], r1 * s[0], -width * 0.5, normal);150v = vert(v, r2 * c[2], r2 * s[2], -width * 0.5, normal);151v = vert(v, r2 * c[1], r2 * s[1], -width * 0.5, normal);152
153v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal);154
155v = vert(v, r1 * c[0], r1 * s[0], width * 0.5, normal);156v = vert(v, r1 * c[0], r1 * s[0], -width * 0.5, normal);157v = vert(v, r2 * c[1], r2 * s[1], width * 0.5, normal);158v = vert(v, r2 * c[1], r2 * s[1], -width * 0.5, normal);159v = vert(v, r2 * c[2], r2 * s[2], width * 0.5, normal);160v = vert(v, r2 * c[2], r2 * s[2], -width * 0.5, normal);161v = vert(v, r1 * c[3], r1 * s[3], width * 0.5, normal);162v = vert(v, r1 * c[3], r1 * s[3], -width * 0.5, normal);163v = vert(v, r1 * c[4], r1 * s[4], width * 0.5, normal);164v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal);165
166v = vert(v, r1 * c[4], r1 * s[4], -width * 0.5, normal);167}168
169gear->count = (v - gear->vertices) / 6;170
171gl->glGenBuffers(1, &gear->vbo);172gl->glBindBuffer(GL_ARRAY_BUFFER, gear->vbo);173gl->glBufferData(GL_ARRAY_BUFFER, gear->count * 6 * 4,174gear->vertices, GL_STATIC_DRAW);175
176return gear;177}
178
179static void180free_gear(Gear *gear)181{
182if (!gear) return;183free(gear->vertices);184free(gear);185}
186
187static void188multiply(GLfloat *m, const GLfloat *n)189{
190GLfloat tmp[16];191const GLfloat *row, *column;192div_t d;193int i, j;194
195for (i = 0; i < 16; i++)196{197tmp[i] = 0;198d = div(i, 4);199row = n + d.quot * 4;200column = m + d.rem;201for (j = 0; j < 4; j++)202tmp[i] += row[j] * column[j * 4];203}204memcpy(m, &tmp, sizeof tmp);205}
206
207static void208rotate(GLfloat *m, GLfloat angle, GLfloat x, GLfloat y, GLfloat z)209{
210double s, c;211
212s = sin(angle);213c = cos(angle);214GLfloat r[16] =215{216x * x * (1 - c) + c, y * x * (1 - c) + z * s, x * z * (1 - c) - y * s, 0,217x * y * (1 - c) - z * s, y * y * (1 - c) + c, y * z * (1 - c) + x * s, 0,218x * z * (1 - c) + y * s, y * z * (1 - c) - x * s, z * z * (1 - c) + c, 0,2190, 0, 0, 1220};221
222multiply(m, r);223}
224
225static void226translate(GLfloat *m, GLfloat x, GLfloat y, GLfloat z)227{
228GLfloat t[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, x, y, z, 1 };229
230multiply(m, t);231}
232
233static void234draw_gear(GLData *gld, Gear *gear, GLfloat *m,235GLfloat x, GLfloat y, GLfloat angle, const GLfloat *color)236{
237Evas_GL_API *gl = gld->glapi;238GLfloat tmp[16];239
240memcpy(tmp, m, sizeof tmp);241translate(tmp, x, y, 0);242rotate(tmp, 2 * M_PI * angle / 360.0, 0, 0, 1);243gl->glUniformMatrix4fv(gld->proj_location, 1, GL_FALSE, tmp);244gl->glUniform3fv(gld->light_location, 1, gld->light);245gl->glUniform4fv(gld->color_location, 1, color);246
247gl->glBindBuffer(GL_ARRAY_BUFFER, gear->vbo);248
249gl->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE,2506 * sizeof(GLfloat), NULL);251gl->glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE,2526 * sizeof(GLfloat), (GLfloat *)(0 + 3 * sizeof(GLfloat)));253gl->glEnableVertexAttribArray(0);254gl->glEnableVertexAttribArray(1);255gl->glDrawArrays(GL_TRIANGLE_STRIP, 0, gear->count);256}
257
258static void259gears_draw(GLData *gld)260{
261Evas_GL_API *gl = gld->glapi;262
263static const GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 };264static const GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 };265static const GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 };266GLfloat m[16];267
268gl->glClearColor(0x25 / 255., 0x13 / 255., 0.0, 1.0);269gl->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);270
271memcpy(m, gld->proj, sizeof m);272rotate(m, 2 * M_PI * gld->view_rotx / 360.0, 1, 0, 0);273rotate(m, 2 * M_PI * gld->view_roty / 360.0, 0, 1, 0);274rotate(m, 2 * M_PI * gld->view_rotz / 360.0, 0, 0, 1);275
276draw_gear(gld, gld->gear1, m, -3.0, -2.0, gld->angle, red);277draw_gear(gld, gld->gear2, m, 3.1, -2.0, -2 * gld->angle - 9.0, green);278draw_gear(gld, gld->gear3, m, -3.1, 4.2, -2 * gld->angle - 25.0, blue);279}
280
281static void render_gears(GLData *gld)282{
283gears_draw(gld);284
285gld->angle += 2.0;286}
287
288/* new window size or exposure */
289static void290gears_reshape(GLData *gld, int width, int height)291{
292Evas_GL_API *gl = gld->glapi;293
294GLfloat ar, m[16] = {2951.0, 0.0, 0.0, 0.0,2960.0, 1.0, 0.0, 0.0,2970.0, 0.0, 0.1, 0.0,2980.0, 0.0, 0.0, 1.0299};300
301if (width < height)302ar = width;303else304ar = height;305
306m[0] = 0.1 * ar / width;307m[5] = 0.1 * ar / height;308memcpy(gld->proj, m, sizeof gld->proj);309gl->glViewport(0, 0, (GLint) width, (GLint) height);310}
311
312static const char vertex_shader[] =313"uniform mat4 proj;\n"314"attribute vec4 position;\n"315"attribute vec4 normal;\n"316"varying vec3 rotated_normal;\n"317"varying vec3 rotated_position;\n"318"vec4 tmp;\n"319"void main()\n"320"{\n"321" gl_Position = proj * position;\n"322" rotated_position = gl_Position.xyz;\n"323" tmp = proj * normal;\n"324" rotated_normal = tmp.xyz;\n"325"}\n";326
327static const char fragment_shader[] =328"#ifdef GL_ES\n"329"precision mediump float;\n"330"#endif\n"331"uniform vec4 color;\n"332"uniform vec3 light;\n"333"varying vec3 rotated_normal;\n"334"varying vec3 rotated_position;\n"335"vec3 light_direction;\n"336"vec4 white = vec4(0.5, 0.5, 0.5, 1.0);\n"337"void main()\n"338"{\n"339" light_direction = normalize(light - rotated_position);\n"340" gl_FragColor = color + white * dot(light_direction, rotated_normal);\n"341"}\n";342
343static void344_print_gl_log(Evas_GL_API *gl, GLuint id)345{
346GLint log_len = 0;347char *log_info;348
349if (gl->glIsShader(id))350gl->glGetShaderiv(id, GL_INFO_LOG_LENGTH, &log_len);351else if (gl->glIsProgram(id))352gl->glGetProgramiv(id, GL_INFO_LOG_LENGTH, &log_len);353if (!log_len) return;354
355log_info = malloc(log_len * sizeof(char));356
357if (gl->glIsShader(id))358gl->glGetShaderInfoLog(id, log_len, NULL, log_info);359else if (gl->glIsProgram(id))360gl->glGetProgramInfoLog(id, log_len, NULL, log_info);361
362printf("%s", log_info);363free(log_info);364}
365
366static void367gears_init(GLData *gld)368{
369Evas_GL_API *gl = gld->glapi;370
371const char *p;372
373gl->glEnable(GL_CULL_FACE);374gl->glEnable(GL_DEPTH_TEST);375
376p = vertex_shader;377gld->vtx_shader = gl->glCreateShader(GL_VERTEX_SHADER);378gl->glShaderSource(gld->vtx_shader, 1, &p, NULL);379gl->glCompileShader(gld->vtx_shader);380_print_gl_log(gl, gld->vtx_shader);381
382p = fragment_shader;383gld->fgmt_shader = gl->glCreateShader(GL_FRAGMENT_SHADER);384gl->glShaderSource(gld->fgmt_shader, 1, &p, NULL);385gl->glCompileShader(gld->fgmt_shader);386_print_gl_log(gl, gld->fgmt_shader);387
388gld->program = gl->glCreateProgram();389gl->glAttachShader(gld->program, gld->vtx_shader);390gl->glAttachShader(gld->program, gld->fgmt_shader);391gl->glBindAttribLocation(gld->program, 0, "position");392gl->glBindAttribLocation(gld->program, 1, "normal");393
394gl->glLinkProgram(gld->program);395_print_gl_log(gl, gld->program);396
397gl->glUseProgram(gld->program);398gld->proj_location = gl->glGetUniformLocation(gld->program, "proj");399gld->light_location = gl->glGetUniformLocation(gld->program, "light");400gld->color_location = gl->glGetUniformLocation(gld->program, "color");401
402/* make the gears */403gld->gear1 = make_gear(gld, 1.0, 4.0, 1.0, 20, 0.7);404gld->gear2 = make_gear(gld, 0.5, 2.0, 2.0, 10, 0.7);405gld->gear3 = make_gear(gld, 1.3, 2.0, 0.5, 10, 0.7);406}
407
408static void409gldata_init(GLData *gld)410{
411gld->initialized = 0;412gld->mouse_down = 0;413
414gld->view_rotx = -20.0;415gld->view_roty = -30.0;416gld->view_rotz = 0.0;417gld->angle = 0.0;418
419gld->light[0] = 1.0;420gld->light[1] = 1.0;421gld->light[2] = -5.0;422}
423
424//-------------------------//
425
426static void427_init_gl(Evas_Object *obj)428{
429GLData *gld = evas_object_data_get(obj, "gld");430
431gld->glapi = elm_glview_gl_api_get(obj);432printf("GL_VERSION: %s\n", gld->glapi->glGetString(GL_VERSION));433fflush(stdout);434
435gears_init(gld);436}
437
438static void439_del_gl(Evas_Object *obj)440{
441GLData *gld = evas_object_data_get(obj, "gld");442if (!gld)443{444printf("Unable to get GLData.\n");445fflush(stdout);446return;447}448Evas_GL_API *gl = gld->glapi;449
450if (gl)451{452gl->glDeleteShader(gld->vtx_shader);453gl->glDeleteShader(gld->fgmt_shader);454gl->glDeleteProgram(gld->program);455gl->glDeleteBuffers(1, &gld->gear1->vbo);456gl->glDeleteBuffers(1, &gld->gear2->vbo);457gl->glDeleteBuffers(1, &gld->gear3->vbo);458}459
460free_gear(gld->gear1);461free_gear(gld->gear2);462free_gear(gld->gear3);463
464evas_object_data_del((Evas_Object*)obj, "..gld");465free(gld);466}
467
468static void469_resize_gl(Evas_Object *obj)470{
471int w, h;472GLData *gld = evas_object_data_get(obj, "gld");473
474elm_glview_size_get(obj, &w, &h);475
476// GL Viewport stuff. you can avoid doing this if viewport is all the477// same as last frame if you want478gears_reshape(gld, w,h);479}
480
481static void482_draw_gl(Evas_Object *obj)483{
484Evas_GL_API *gl = elm_glview_gl_api_get(obj);485GLData *gld = evas_object_data_get(obj, "gld");486if (!gld) return;487
488render_gears(gld);489gl->glFinish();490}
491
492static Eina_Bool493_anim(void *data)494{
495elm_glview_changed_set(data);496return EINA_TRUE;497}
498
499static Eina_Bool500_quit_idler(void *data)501{
502evas_object_del(data);503
504return ECORE_CALLBACK_CANCEL;505}
506
507static void508_on_done(void *data,509Evas_Object *obj EINA_UNUSED,510void *event_info EINA_UNUSED)511{
512ecore_idler_add(_quit_idler, data);513}
514
515static void516_on_direct(void *data,517Evas_Object *obj EINA_UNUSED,518void *event_info EINA_UNUSED)519{
520if (!data) return;521
522// ON_DEMAND is necessary for Direct Rendering523elm_glview_render_policy_set(data, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND);524elm_glview_mode_set(data, 0525| ELM_GLVIEW_ALPHA526| ELM_GLVIEW_DEPTH527| ELM_GLVIEW_DIRECT528);529}
530
531static void532_on_indirect(void *data,533Evas_Object *obj EINA_UNUSED,534void *event_info EINA_UNUSED)535{
536if (!data) return;537
538// note that with policy ALWAYS the window will flicker on resize539elm_glview_render_policy_set(data, ELM_GLVIEW_RENDER_POLICY_ALWAYS);540elm_glview_mode_set(data, 0541| ELM_GLVIEW_ALPHA542| ELM_GLVIEW_DEPTH543);544}
545
546static void547_del(void *data EINA_UNUSED, Evas *evas EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)548{
549Ecore_Animator *ani = evas_object_data_get(obj, "ani");550ecore_animator_del(ani);551}
552
553static void554_key_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info)555{
556Evas_Event_Key_Down *ev;557ev = (Evas_Event_Key_Down *)event_info;558GLData *gld = evas_object_data_get(obj, "gld");559
560if (strcmp(ev->key, "Left") == 0)561{562gld->view_roty += 5.0;563return;564}565
566if (strcmp(ev->key, "Right") == 0)567{568gld->view_roty -= 5.0;569return;570}571
572if (strcmp(ev->key, "Up") == 0)573{574gld->view_rotx += 5.0;575return;576}577
578if (strcmp(ev->key, "Down") == 0)579{580gld->view_rotx -= 5.0;581return;582}583if ((strcmp(ev->key, "Escape") == 0) ||584(strcmp(ev->key, "Return") == 0))585{586//_on_done(data, obj, event_info);587return;588}589}
590
591static void592_mouse_down(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)593{
594GLData *gld = evas_object_data_get(obj, "gld");595gld->mouse_down = 1;596}
597
598static void599_mouse_move(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)600{
601Evas_Event_Mouse_Move *ev;602ev = (Evas_Event_Mouse_Move *)event_info;603GLData *gld = evas_object_data_get(obj, "gld");604float dx = 0, dy = 0;605
606if (gld->mouse_down)607{608dx = ev->cur.canvas.x - ev->prev.canvas.x;609dy = ev->cur.canvas.y - ev->prev.canvas.y;610
611gld->view_roty += -1.0 * dx;612gld->view_rotx += -1.0 * dy;613}614}
615
616static void617_mouse_up(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)618{
619GLData *gld = evas_object_data_get(obj, "gld");620gld->mouse_down = 0;621}
622
623static void624_test_glview_do(Evas_GL_Context_Version version)625{
626Evas_Object *win, *bx, *bt, *gl, *lb;627Ecore_Animator *ani;628GLData *gld = NULL;629
630// alloc a data struct to hold our relevant gl info in631if (!(gld = calloc(1, sizeof(GLData)))) return;632gldata_init(gld);633
634#if 1635// add a Z-depth buffer to the window and try to use GL636Eina_Stringshare *accel;637accel = eina_stringshare_add(elm_config_accel_preference_get());638elm_config_accel_preference_set("gl:depth");639
640// new window - do the usual and give it a name, title and delete handler641win = elm_win_util_standard_add("glview", "GLView");642elm_win_autodel_set(win, EINA_TRUE);643
644// restore previous accel preference645elm_config_accel_preference_set(accel);646eina_stringshare_del(accel);647#else648win = efl_add_ref(EFL_UI_WIN_CLASS, NULL,649efl_ui_win_name_set(efl_added, "glview"),650efl_text_set(efl_added, "GLView"),651efl_ui_win_accel_preference_set(efl_added, "gl:depth"));652elm_win_autodel_set(win, EINA_TRUE);653#endif654
655bx = elm_box_add(win);656evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);657elm_win_resize_object_add(win, bx);658evas_object_show(bx);659
660// Add a GLView661gl = elm_glview_version_add(win, version);662if (gl)663{664evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL);665evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);666elm_glview_mode_set(gl, 0667| ELM_GLVIEW_ALPHA668| ELM_GLVIEW_DEPTH669);670elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE);671elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ALWAYS);672elm_glview_init_func_set(gl, _init_gl);673elm_glview_del_func_set(gl, _del_gl);674elm_glview_resize_func_set(gl, _resize_gl);675elm_glview_render_func_set(gl, _draw_gl);676elm_box_pack_end(bx, gl);677evas_object_show(gl);678
679// Add Mouse/Key Event Callbacks680elm_object_focus_set(gl, EINA_TRUE);681evas_object_event_callback_add(gl, EVAS_CALLBACK_KEY_DOWN, _key_down, gl);682evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, _mouse_down, gl);683evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_UP, _mouse_up, gl);684evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move, gl);685
686// Animator and other vars687ani = ecore_animator_add(_anim, gl);688evas_object_data_set(gl, "ani", ani);689evas_object_data_set(gl, "gld", gld);690evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _del, gl);691
692bt = elm_button_add(win);693elm_object_text_set(bt, "Direct Mode");694evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);695evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);696elm_box_pack_end(bx, bt);697evas_object_show(bt);698evas_object_smart_callback_add(bt, "clicked", _on_direct, gl);699
700bt = elm_button_add(win);701elm_object_text_set(bt, "Indirect Mode");702evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);703evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);704elm_box_pack_end(bx, bt);705evas_object_show(bt);706evas_object_smart_callback_add(bt, "clicked", _on_indirect, gl);707}708else709{710lb = elm_label_add(bx);711elm_object_text_set(lb, "<align=left> GL backend engine is not supported.<br/>"712" 1. Check your back-end engine or<br/>"713" 2. Run elementary_test with engine option or<br/>"714" ex) $ <b>ELM_ACCEL=gl</b> elementary_test<br/>"715" 3. Change your back-end engine from elementary_config.<br/></align>");716evas_object_size_hint_weight_set(lb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);717evas_object_size_hint_align_set(lb, EVAS_HINT_FILL, EVAS_HINT_FILL);718elm_box_pack_end(bx, lb);719evas_object_show(lb);720free(gld);721}722
723bt = elm_button_add(win);724elm_object_text_set(bt, "Close");725evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);726evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0);727elm_box_pack_end(bx, bt);728evas_object_show(bt);729evas_object_smart_callback_add(bt, "clicked", _on_done, win);730
731evas_object_resize(win, 320 * elm_config_scale_get(),732480 * elm_config_scale_get());733evas_object_show(win);734}
735
736void
737test_glview(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)738{
739_test_glview_do(EVAS_GL_GLES_2_X);740}
741
742void
743test_glview_gles3(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)744{
745_test_glview_do(EVAS_GL_GLES_3_X);746}
747