static void _init_glview(Evas_Object *win, GLData *gld) { Evas_Object *bg, *bx, *bt, *gl; Ecore_Animator *ani; bg = elm_bg_add(win); elm_win_resize_object_add(win, bg); evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(bg); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); //-//-//-// THIS IS WHERE GL INIT STUFF HAPPENS (ALA EGL) //-// // create a new glview object gl = elm_glview_add(win); gld->glapi = elm_glview_gl_api_get(gl); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); // mode is simply for supporting alpha, depth buffering, and stencil // buffering. elm_glview_mode_set(gl, ELM_GLVIEW_ALPHA | ELM_GLVIEW_DEPTH); // resize policy tells glview what to do with the surface when it // resizes. ELM_GLVIEW_RESIZE_POLICY_RECREATE will tell it to // destroy the current surface and recreate it to the new size elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE); // render policy tells glview how it would like glview to render // gl code. ELM_GLVIEW_RENDER_POLICY_ON_DEMAND will have the gl // calls called in the pixel_get callback, which only gets called // if the object is visible, hence ON_DEMAND. ALWAYS mode renders // it despite the visibility of the object. elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND); // initialize callback function gets registered here elm_glview_init_func_set(gl, _init_gl); // delete callback function gets registered here elm_glview_del_func_set(gl, _del_gl); elm_glview_resize_func_set(gl, _resize_gl); elm_glview_render_func_set(gl, _draw_gl); //-// //-//-//-// END GL INIT BLOB elm_box_pack_end(bx, gl); evas_object_show(gl); elm_object_focus_set(gl, EINA_TRUE); // animating - just a demo. as long as you trigger an update on the image // object via elm_glview_changed_set() it will be updated. // // NOTE: if you delete gl, this animator will keep running trying to access // gl so you'd better delete this animator with ecore_animator_del(). ani = ecore_animator_add(_anim, gl); evas_object_data_set(gl, "ani", ani); evas_object_data_set(gl, "gld", gld); evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _del, gl); // add an 'OK' button to end the program bt = elm_button_add(win); elm_object_text_set(bt, "OK"); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx, bt); evas_object_show(bt); evas_object_smart_callback_add(bt, "clicked", _on_done, win); evas_object_resize(win, 320, 480); }
static bool app_create(void *data) { /* Hook to take necessary actions before main event loop starts * Initialize UI resources and application's data * If this function returns true, the main loop of application starts * If this function returns false, the application is terminated. */ Evas_Object *gl; appdata_s *ad = data; if (!data) return false; /* Create the window */ ad->win = add_win(ad->name); if (!ad->win) return false; create_indicator(ad); evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL); eext_object_event_callback_add(ad->win, EEXT_CALLBACK_BACK, win_back_cb, ad); /* Create and initialize GLView */ gl = elm_glview_add(ad->conform); ELEMENTARY_GLVIEW_GLOBAL_USE(gl); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); /* Request a surface with alpha and a depth buffer */ elm_glview_mode_set(gl, ELM_GLVIEW_DEPTH); /* The resize policy tells GLView what to do with the surface when it * resizes. ELM_GLVIEW_RESIZE_POLICY_RECREATE will tell it to * destroy the current surface and recreate it to the new size. */ elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE); /* The render policy sets how GLView should render GL code. * ELM_GLVIEW_RENDER_POLICY_ON_DEMAND will have the GL callback * called only when the object is visible. * ELM_GLVIEW_RENDER_POLICY_ALWAYS would cause the callback to be * called even if the object were hidden. */ elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND); /* The initialize callback function gets registered here */ elm_glview_init_func_set(gl, init_gl); /* The delete callback function gets registered here */ elm_glview_del_func_set(gl, del_gl); /* The resize callback function gets registered here */ elm_glview_resize_func_set(gl, resize_gl); /* The render callback function gets registered here */ elm_glview_render_func_set(gl, draw_gl); /* Add the GLView to the conformant and show it */ elm_object_content_set(ad->conform, gl); evas_object_show(gl); elm_object_focus_set(gl, EINA_TRUE); /* This adds an animator so that the app will regularly * trigger updates of the GLView using elm_glview_changed_set(). * * NOTE: If you delete GL, this animator will keep running trying to access * GL so this animator needs to be deleted with ecore_animator_del(). */ ad->ani = ecore_animator_add(anim, gl); evas_object_data_set(gl, "ad", ad); evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, del_anim, gl); evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, mouse_down_cb, ad); evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_UP, mouse_up_cb, ad); evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_MOVE, mouse_move_cb, ad); evas_object_show(ad->win); /* Return true: the main loop will now start running */ return true; }
EAPI_MAIN int elm_main(int argc, char **argv) { Evas_Object *win, *bg, *bx, *bt, *gl; Ecore_Animator *ani; GLData *gld = NULL; if (!(gld = calloc(1, sizeof(GLData)))) return 1; // set the engine to opengl_x11 // if commented out, ELM will choose one elm_config_engine_set("opengl_x11"); win = elm_win_add(NULL, "glview simple", ELM_WIN_BASIC); elm_win_title_set(win, "GLView Simple"); elm_win_autodel_set(win, EINA_TRUE); elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED); bg = elm_bg_add(win); elm_win_resize_object_add(win, bg); evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_show(bg); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(win, bx); evas_object_show(bx); //-//-//-// THIS IS WHERE GL INIT STUFF HAPPENS (ALA EGL) //-// // create a new glview object gl = elm_glview_add(win); gld->glapi = elm_glview_gl_api_get(gl); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); // mode is simply for supporting alpha, depth buffering, and stencil // buffering. elm_glview_mode_set(gl, ELM_GLVIEW_ALPHA | ELM_GLVIEW_DEPTH); // resize policy tells glview what to do with the surface when it // resizes. ELM_GLVIEW_RESIZE_POLICY_RECREATE will tell it to // destroy the current surface and recreate it to the new size elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE); // render policy tells glview how it would like glview to render // gl code. ELM_GLVIEW_RENDER_POLICY_ON_DEMAND will have the gl // calls called in the pixel_get callback, which only gets called // if the object is visible, hence ON_DEMAND. ALWAYS mode renders // it despite the visibility of the object. elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND); // initialize callback function gets registered here elm_glview_init_func_set(gl, _init_gl); // delete callback function gets registered here elm_glview_del_func_set(gl, _del_gl); elm_glview_resize_func_set(gl, _resize_gl); elm_glview_render_func_set(gl, _draw_gl); //-// //-//-//-// END GL INIT BLOB elm_box_pack_end(bx, gl); evas_object_show(gl); elm_object_focus_set(gl, EINA_TRUE); // animating - just a demo. as long as you trigger an update on the image // object via elm_glview_changed_set() it will be updated. // // NOTE: if you delete gl, this animator will keep running trying to access // gl so you'd better delete this animator with ecore_animator_del(). ani = ecore_animator_add(_anim, gl); evas_object_data_set(gl, "ani", ani); evas_object_data_set(gl, "gld", gld); evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, _del, gl); // add an 'OK' button to end the program bt = elm_button_add(win); elm_object_text_set(bt, "OK"); evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0.0); elm_box_pack_end(bx, bt); evas_object_show(bt); evas_object_smart_callback_add(bt, "clicked", _on_done, win); evas_object_resize(win, 320, 480); evas_object_show(win); // run the mainloop and process events and callbacks elm_run(); elm_shutdown(); return 0; }
static bool app_create(void *data) { /* Hook to take necessary actions before main event loop starts * Initialize UI resources and application's data * If this function returns true, the main loop of application starts * If this function returns false, the application is terminated. */ Evas_Object *gl; Application *ad = (Application *)data; if (!data) return false; /* Create and initialize GLView */ elm_config_accel_preference_set("opengl"); /* Create the window */ ad->_win = add_win("cocos2d-x"); if (!ad->_win) return false; int rots[2]; rots[0] = ad->_orientation; rots[1] = rots[0] + 180 % 360; elm_win_wm_rotation_available_rotations_set(ad->_win, rots, 2); ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, _key_down_cb, ad); ecore_event_handler_add(ECORE_EVENT_KEY_UP, _key_up_cb, ad); gl = elm_glview_add(ad->_win); elm_win_resize_object_add(ad->_win, gl); ELEMENTARY_GLVIEW_GLOBAL_USE(gl); evas_object_size_hint_align_set(gl, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(gl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); /* Create and initialize GLView */ ad->initGLContextAttrs(); auto attrs = GLView::getGLContextAttrs(); auto mode = get_glview_mode(attrs); elm_glview_mode_set(gl, mode); /* The resize policy tells GLView what to do with the surface when it * resizes. ELM_GLVIEW_RESIZE_POLICY_RECREATE will tell it to * destroy the current surface and recreate it to the new size. */ //elm_glview_resize_policy_set(gl, ELM_GLVIEW_RESIZE_POLICY_RECREATE); /* The render policy sets how GLView should render GL code. * ELM_GLVIEW_RENDER_POLICY_ON_DEMAND will have the GL callback * called only when the object is visible. * ELM_GLVIEW_RENDER_POLICY_ALWAYS would cause the callback to be * called even if the object were hidden. */ elm_glview_render_policy_set(gl, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND); /* The initialize callback function gets registered here */ elm_glview_init_func_set(gl, init_gl); /* The delete callback function gets registered here */ elm_glview_del_func_set(gl, del_gl); /* The resize callback function gets registered here */ // Cocos2d-x doesn't support to change orientation from portrait to landscape. // So comment next line. // elm_glview_resize_func_set(gl, resize_gl); /* The render callback function gets registered here */ elm_glview_render_func_set(gl, draw_gl); /* Add the GLView to the box and show it */ evas_object_show(gl); elm_object_focus_set(gl, EINA_TRUE); /* This adds an animator so that the app will regularly * trigger updates of the GLView using elm_glview_changed_set(). * * NOTE: If you delete GL, this animator will keep running trying to access * GL so this animator needs to be deleted with ecore_animator_del(). */ ecore_animator_source_set(ECORE_ANIMATOR_SOURCE_TIMER); ad->_ani = ecore_animator_add(anim, gl); evas_object_data_set(gl, "ani", ad->_ani); evas_object_event_callback_add(gl, EVAS_CALLBACK_DEL, del_anim, gl); /* Add Mouse Event Callbacks */ evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_DOWN, touch_down_cb, ad); evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_MOVE, touch_move_cb, ad); evas_object_event_callback_add(gl, EVAS_CALLBACK_MOUSE_UP, touch_up_cb, ad); evas_object_event_callback_add(gl, EVAS_CALLBACK_MULTI_DOWN, touches_down_cb, ad); evas_object_event_callback_add(gl, EVAS_CALLBACK_MULTI_MOVE, touches_move_cb, ad); evas_object_event_callback_add(gl, EVAS_CALLBACK_MULTI_UP, touches_up_cb, ad); create_indicator(ad); return true; }
Evas_Object * SampleView::CreateView(void *data) const { appdata_s *ad = static_cast<appdata_s *>(data); /* Create and initialize GLView */ Evas_Object *glview = elm_glview_version_add(ad->navi, EVAS_GL_GLES_3_X); //Evas_Object* glview = elm_glview_add(ad->navi); //for GLES 2.0 ELEMENTARY_GLVIEW_GLOBAL_USE(glview); evas_object_size_hint_align_set(glview, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_size_hint_weight_set(glview, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); /* Request a surface with alpha and a depth buffer */ elm_glview_mode_set(glview, ELM_GLVIEW_DEPTH); /* The resize policy tells GLView what to do with the surface when it * resizes. ELM_GLVIEW_RESIZE_POLICY_RECREATE will tell it to * destroy the current surface and recreate it to the new size. */ elm_glview_resize_policy_set(glview, ELM_GLVIEW_RESIZE_POLICY_RECREATE); /* The render policy sets how GLView should render GL code. * ELM_GLVIEW_RENDER_POLICY_ON_DEMAND will have the GL callback * called only when the obj is visible. * ELM_GLVIEW_RENDER_POLICY_ALWAYS would cause the callback to be * called even if the obj were hidden. */ elm_glview_render_policy_set(glview, ELM_GLVIEW_RENDER_POLICY_ON_DEMAND); /* The initialize callback function gets registered here */ elm_glview_init_func_set(glview, init_glview); /* The delete callback function gets registered here */ elm_glview_del_func_set(glview, del_glview); /* The resize callback function gets registered here */ elm_glview_resize_func_set(glview, resize_glview); /* The render callback function gets registered here */ elm_glview_render_func_set(glview, draw_glview); /* This adds an animator so that the app will regularly * trigger updates of the GLView using elm_glview_changed_set(). * * NOTE: If you delete GL, this animator will keep running trying to access * GL so this animator needs to be deleted with ecore_animator_del(). */ Ecore_Animator *ani = ecore_animator_add(anim_cb, glview); evas_object_event_callback_add(glview, EVAS_CALLBACK_DEL, del_anim_cb, glview); // evas_object_event_callback_add(glview, EVAS_CALLBACK_MOUSE_DOWN, mouse_down_cb, ad); evas_object_event_callback_add(glview, EVAS_CALLBACK_MOUSE_UP, mouse_up_cb, ad); evas_object_event_callback_add(glview, EVAS_CALLBACK_MOUSE_MOVE, mouse_move_cb, ad); evas_object_data_set(glview, "ad", ad); evas_object_data_set(glview, "ani", ani); evas_object_data_set(glview, "sv", this); return glview; }