// draw callback is where all the main GL rendering happens static void _draw_gl(Evas_Object *obj) { Evas_GL_API *gl = elm_glview_gl_api_get(obj); GLData *gld = evas_object_data_get(obj, "gld"); if (!gld) return; int w, h; elm_glview_size_get(obj, &w, &h); gl->glViewport(0, 0, w, h); gl->glClearColor(red, 0.8, 0.3, 1); gl->glClear(GL_COLOR_BUFFER_BIT); // Draw a Triangle gl->glEnable(GL_BLEND); gl->glUseProgram(gld->program); gl->glBindBuffer(GL_ARRAY_BUFFER, gld->vbo); gl->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); gl->glEnableVertexAttribArray(0); gl->glDrawArrays(GL_TRIANGLES, 0, 3); // Optional - Flush the GL pipeline gl->glFinish(); red -= 0.1; if (0.0 > red) red = 1.0; }
bool EwkView::createGLSurface() { if (!m_isAccelerated) return true; static Evas_GL_Config evasGLConfig = { EVAS_GL_RGBA_8888, EVAS_GL_DEPTH_BIT_8, EVAS_GL_STENCIL_NONE, EVAS_GL_OPTIONS_NONE, EVAS_GL_MULTISAMPLE_NONE }; // Recreate to current size: Replaces if non-null, and frees existing surface after (OwnPtr). m_evasGLSurface = EvasGLSurface::create(m_evasGL.get(), &evasGLConfig, size()); if (!m_evasGLSurface) return false; Evas_Native_Surface nativeSurface; evas_gl_native_surface_get(m_evasGL.get(), m_evasGLSurface->surface(), &nativeSurface); evas_object_image_native_surface_set(smartData()->image, &nativeSurface); evas_gl_make_current(m_evasGL.get(), m_evasGLSurface->surface(), m_evasGLContext->context()); Evas_GL_API* gl = evas_gl_api_get(m_evasGL.get()); const WKPoint& boundsEnd = WKViewUserViewportToContents(wkView(), WKPointMake(size().width(), size().height())); gl->glViewport(0, 0, boundsEnd.x, boundsEnd.y); gl->glClearColor(1.0, 1.0, 1.0, 0); gl->glClear(GL_COLOR_BUFFER_BIT); return true; }
bool EwkView::createGLSurface(const IntSize& viewSize) { if (!m_isHardwareAccelerated) return true; if (!m_evasGL) { Evas* evas = evas_object_evas_get(m_evasObject); m_evasGL = adoptPtr(evas_gl_new(evas)); if (!m_evasGL) { WARN("Failed to create Evas_GL, falling back to software mode."); m_isHardwareAccelerated = false; return false; } } if (!m_evasGLContext) { m_evasGLContext = EvasGLContext::create(m_evasGL.get()); if (!m_evasGLContext) { WARN("Failed to create GLContext."); return false; } } Ewk_View_Smart_Data* sd = smartData(); Evas_GL_Config evasGLConfig = { EVAS_GL_RGBA_8888, EVAS_GL_DEPTH_BIT_8, EVAS_GL_STENCIL_NONE, EVAS_GL_OPTIONS_NONE, EVAS_GL_MULTISAMPLE_NONE }; // Replaces if non-null, and frees existing surface after (OwnPtr). m_evasGLSurface = EvasGLSurface::create(m_evasGL.get(), &evasGLConfig, viewSize); if (!m_evasGLSurface) return false; Evas_Native_Surface nativeSurface; evas_gl_native_surface_get(m_evasGL.get(), m_evasGLSurface->surface(), &nativeSurface); evas_object_image_native_surface_set(sd->image, &nativeSurface); evas_gl_make_current(m_evasGL.get(), m_evasGLSurface->surface(), m_evasGLContext->context()); Evas_GL_API* gl = evas_gl_api_get(m_evasGL.get()); gl->glViewport(0, 0, viewSize.width() + sd->view.x, viewSize.height() + sd->view.y); gl->glClearColor(1.0, 1.0, 1.0, 0); gl->glClear(GL_COLOR_BUFFER_BIT); return true; }
bool EwkView::createGLSurface() { if (!m_isAccelerated) return true; static Evas_GL_Config evasGLConfig = { EVAS_GL_RGBA_8888, EVAS_GL_DEPTH_BIT_8, EVAS_GL_STENCIL_NONE, EVAS_GL_OPTIONS_NONE, EVAS_GL_MULTISAMPLE_NONE, #if defined(EVAS_GL_API_VERSION) && EVAS_GL_API_VERSION >= 2 EVAS_GL_GLES_2_X #endif }; // Recreate to current size: Replaces if non-null, and frees existing surface after (OwnPtr). if (deviceSize().width() && deviceSize().height()) { Evas_GL_Surface* surface = nullptr; surface = evas_gl_surface_create(m_evasGL, &evasGLConfig, deviceSize().width(), deviceSize().height()); if (!surface) return false; m_evasGLSurface = std::make_unique<EvasGLSurface>(m_evasGL, surface); } if (!m_evasGLSurface) return false; Evas_Native_Surface nativeSurface; evas_gl_native_surface_get(m_evasGL, m_evasGLSurface->surface(), &nativeSurface); evas_object_image_native_surface_set(smartData()->image, &nativeSurface); evas_gl_make_current(m_evasGL, m_evasGLSurface->surface(), m_evasGLContext->context()); Evas_GL_API* gl = evas_gl_api_get(m_evasGL); WKPoint boundsEnd = WKViewUserViewportToScene(wkView(), WKPointMake(deviceSize().width(), deviceSize().height())); gl->glViewport(0, 0, boundsEnd.x, boundsEnd.y); gl->glClearColor(1.0, 1.0, 1.0, 0); gl->glClear(GL_COLOR_BUFFER_BIT); return true; }
static void gears_draw(GLData *gld) { Evas_GL_API *gl = gld->glapi; static const GLfloat red[4] = { 0.8, 0.1, 0.0, 1.0 }; static const GLfloat green[4] = { 0.0, 0.8, 0.2, 1.0 }; static const GLfloat blue[4] = { 0.2, 0.2, 1.0, 1.0 }; GLfloat m[16]; gl->glClearColor(0.8, 0.8, 0.1, 0.5); gl->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); memcpy(m, gld->proj, sizeof m); rotate(m, 2 * M_PI * gld->view_rotx / 360.0, 1, 0, 0); rotate(m, 2 * M_PI * gld->view_roty / 360.0, 0, 1, 0); rotate(m, 2 * M_PI * gld->view_rotz / 360.0, 0, 0, 1); draw_gear(gld, gld->gear1, m, -3.0, -2.0, gld->angle, red); draw_gear(gld, gld->gear2, m, 3.1, -2.0, -2 * gld->angle - 9.0, green); draw_gear(gld, gld->gear3, m, -3.1, 4.2, -2 * gld->angle - 25.0, blue); }