void GHL_CALL RenderWebGL::DrawPrimitivesFromMemory(PrimitiveType type,VertexType v_type,const void* vertices,UInt32 v_amount,const UInt16* indexes,UInt32 prim_amount) { DoDrawPrimitives(v_type); TempBuffersSet* vbuffer = (v_type == VERTEX_TYPE_SIMPLE) ? m_vertex_buffers : m_vertex2_buffers; GL::GLuint vid = vbuffer->Get(v_amount,vertices); InvalidatePointers(); // always different buffer SetupVertexData(0,v_type); GL::GLenum element =gl.TRIANGLES; UInt32 iamount = prim_amount * 3; GetPrimitiveInfo(type,prim_amount,element,iamount); /*GL::GLuint iid = */m_index_buffers->Get(iamount,indexes); // for (UInt32 i=0;i<iamount;++i) { // assert(indexes[i]<v_amount); // } //LOG_INFO("DrawElements " << element << " " << iamount << " iid: " << iid << " vid: " << vid); CHECK_GL(gl.DrawElements(element, iamount, gl.UNSIGNED_SHORT, 0)); }
void MoonEGLContext::SyncDrawable () { Target *target = Top ()->GetTarget (); Target *cairo = target->GetCairoTarget (); MoonSurface *ms; Rect r = target->GetData (&ms); MoonEGLSurface *dst = (MoonEGLSurface *) ms; // clear target contents if (!target->GetInit ()) { if (!dst->GetEGLDisplay ()) GLContext::SetFramebuffer (); glClearColor (0.0, 0.0, 0.0, 0.0); glClear (GL_COLOR_BUFFER_BIT); // mark target contents as initialized target->SetInit (ms); } // initialize target contents with surface if (target->GetInit () != ms) { MoonEGLSurface *src = (MoonEGLSurface *) target->GetInit (); GLuint texture0 = src->Texture (); GLuint program = GetProjectProgram (1.0, 0); GLsizei width0 = src->Width (); GLsizei height0 = src->Height (); if (!dst->GetEGLDisplay ()) GLContext::SetFramebuffer (); SetViewport (); glUseProgram (program); SetupVertexData (NULL, 0, 0, width0, height0); SetupTexCoordData (); glVertexAttribPointer (0, 4, GL_FLOAT, GL_FALSE, 0, vertices); glVertexAttribPointer (1, 4, GL_FLOAT, GL_FALSE, 0, texcoords); glBindTexture (GL_TEXTURE_2D, texture0); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glUniform1i (glGetUniformLocation (program, "sampler0"), 0); glEnableVertexAttribArray (0); glEnableVertexAttribArray (1); glDrawArrays (GL_TRIANGLE_FAN, 0, 4); glDisableVertexAttribArray (1); glDisableVertexAttribArray (0); glBindTexture (GL_TEXTURE_2D, 0); glUseProgram (0); glBindFramebuffer (GL_FRAMEBUFFER, 0); // mark target contents as initialized target->SetInit (ms); } // render any cairo contents onto target if (cairo) { MoonSurface *mSrc; Rect rSrc = cairo->GetData (&mSrc); MoonEGLSurface *src = (MoonEGLSurface *) mSrc; GLuint texture0 = src->Texture (); GLuint program = GetProjectProgram (1.0, 0); GLsizei width0 = src->Width (); GLsizei height0 = src->Height (); if (!dst->GetEGLDisplay ()) GLContext::SetFramebuffer (); SetViewport (); glUseProgram (program); SetupVertexData (NULL, rSrc.x - r.x, rSrc.y - r.y, width0, height0); SetupTexCoordData (); glVertexAttribPointer (0, 4, GL_FLOAT, GL_FALSE, 0, vertices); glVertexAttribPointer (1, 4, GL_FLOAT, GL_FALSE, 0, texcoords); glBindTexture (GL_TEXTURE_2D, texture0); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glUniform1i (glGetUniformLocation (program, "sampler0"), 0); glEnableVertexAttribArray (0); glEnableVertexAttribArray (1); glEnable (GL_BLEND); glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glDrawArrays (GL_TRIANGLE_FAN, 0, 4); glDisable (GL_BLEND); glDisableVertexAttribArray (1); glDisableVertexAttribArray (0); glBindTexture (GL_TEXTURE_2D, 0); glUseProgram (0); glBindFramebuffer (GL_FRAMEBUFFER, 0); mSrc->unref (); target->SetCairoTarget (NULL); } ms->unref (); }