| @@ -256,7 +256,6 @@ static int glnvg__createShader(struct GLNVGshader* shader, const char* name, con | |||
| glBindAttribLocation(prog, 0, "vertex"); | |||
| glBindAttribLocation(prog, 1, "tcoord"); | |||
| glBindAttribLocation(prog, 2, "color"); | |||
| glLinkProgram(prog); | |||
| glGetProgramiv(prog, GL_LINK_STATUS, &status); | |||
| @@ -314,13 +313,10 @@ static int glnvg__renderCreate(void* uptr) | |||
| "uniform vec2 viewSize;\n" | |||
| "in vec2 vertex;\n" | |||
| "in vec2 tcoord;\n" | |||
| "in vec4 color;\n" | |||
| "out vec2 ftcoord;\n" | |||
| "out vec4 fcolor;\n" | |||
| "out vec2 fpos;\n" | |||
| "void main(void) {\n" | |||
| " ftcoord = tcoord;\n" | |||
| " fcolor = color;\n" | |||
| " fpos = vertex;\n" | |||
| " gl_Position = vec4(2.0*vertex.x/viewSize.x - 1.0, 1.0 - 2.0*vertex.y/viewSize.y, 0, 1);\n" | |||
| "}\n"; | |||
| @@ -346,7 +342,6 @@ static int glnvg__renderCreate(void* uptr) | |||
| "uniform int texType;\n" | |||
| "uniform int type;\n" | |||
| "in vec2 ftcoord;\n" | |||
| "in vec4 fcolor;\n" | |||
| "in vec2 fpos;\n" | |||
| "out vec4 outColor;\n" | |||
| "\n" | |||
| @@ -394,7 +389,7 @@ static int glnvg__renderCreate(void* uptr) | |||
| " } else if (type == 3) { // Textured tris\n" | |||
| " vec4 color = texture(tex, ftcoord);\n" | |||
| " color = texType == 0 ? color : vec4(1,1,1,color.x);\n" | |||
| " outColor = color * fcolor;\n" | |||
| " outColor = color * innerCol;\n" | |||
| " }\n" | |||
| "}\n"; | |||
| @@ -419,7 +414,6 @@ static int glnvg__renderCreate(void* uptr) | |||
| "uniform int texType;\n" | |||
| "uniform int type;\n" | |||
| "in vec2 ftcoord;\n" | |||
| "in vec4 fcolor;\n" | |||
| "in vec2 fpos;\n" | |||
| "out vec4 outColor;\n" | |||
| "\n" | |||
| @@ -460,7 +454,7 @@ static int glnvg__renderCreate(void* uptr) | |||
| " } else if (type == 3) { // Textured tris\n" | |||
| " vec4 color = texture(tex, ftcoord);\n" | |||
| " color = texType == 0 ? color : vec4(1,1,1,color.x);\n" | |||
| " outColor = color * fcolor;\n" | |||
| " outColor = color * innerCol;\n" | |||
| " }\n" | |||
| "}\n"; | |||
| @@ -684,10 +678,7 @@ static void glnvg__fill(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
| glDisable(GL_CULL_FACE); | |||
| for (i = 0; i < npaths; i++) { | |||
| offset = paths[i].fillOffset * sizeof(struct NVGvertex); | |||
| glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)offset); | |||
| glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(offset + 2*sizeof(float))); | |||
| glDrawArrays(GL_TRIANGLE_FAN, 0, paths[i].fillCount); | |||
| glDrawArrays(GL_TRIANGLE_FAN, paths[i].fillOffset, paths[i].fillCount); | |||
| } | |||
| glEnable(GL_CULL_FACE); | |||
| @@ -695,10 +686,7 @@ static void glnvg__fill(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
| if (gl->edgeAntiAlias) { | |||
| // Draw fringes | |||
| for (i = 0; i < npaths; i++) { | |||
| offset = paths[i].strokeOffset * sizeof(struct NVGvertex); | |||
| glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)offset); | |||
| glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(offset + 2*sizeof(float))); | |||
| glDrawArrays(GL_TRIANGLE_STRIP, 0, paths[i].strokeCount); | |||
| glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); | |||
| } | |||
| } | |||
| @@ -721,10 +709,7 @@ static void glnvg__fill(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
| glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_DECR_WRAP); | |||
| glDisable(GL_CULL_FACE); | |||
| for (i = 0; i < npaths; i++) { | |||
| offset = paths[i].fillOffset * sizeof(struct NVGvertex); | |||
| glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)offset); | |||
| glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(offset + 2*sizeof(float))); | |||
| glDrawArrays(GL_TRIANGLE_FAN, 0, paths[i].fillCount); | |||
| glDrawArrays(GL_TRIANGLE_FAN, paths[i].fillOffset, paths[i].fillCount); | |||
| } | |||
| glEnable(GL_CULL_FACE); | |||
| @@ -733,7 +718,6 @@ static void glnvg__fill(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
| glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); | |||
| glEnable(GL_BLEND); | |||
| glEnableVertexAttribArray(1); | |||
| glnvg__setupPaint(gl, &call->paint, &call->scissor, 1.0001f); | |||
| if (gl->edgeAntiAlias) { | |||
| @@ -742,20 +726,14 @@ static void glnvg__fill(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
| // Draw fringes | |||
| for (i = 0; i < npaths; i++) { | |||
| offset = paths[i].strokeOffset * sizeof(struct NVGvertex); | |||
| glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)offset); | |||
| glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(offset + 2*sizeof(float))); | |||
| glDrawArrays(GL_TRIANGLE_STRIP, 0, paths[i].strokeCount); | |||
| glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); | |||
| } | |||
| } | |||
| // Draw fill | |||
| glStencilFunc(GL_NOTEQUAL, 0x0, 0xff); | |||
| glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO); | |||
| offset = call->triangleOffset * sizeof(struct NVGvertex); | |||
| glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)offset); | |||
| glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(offset + 2*sizeof(float))); | |||
| glDrawArrays(GL_TRIANGLES, 0, call->triangleCount); | |||
| glDrawArrays(GL_TRIANGLES, call->triangleOffset, call->triangleCount); | |||
| glDisable(GL_STENCIL_TEST); | |||
| } | |||
| @@ -772,10 +750,7 @@ static void glnvg__stroke(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
| // Draw Strokes | |||
| for (i = 0; i < npaths; i++) { | |||
| offset = paths[i].strokeOffset * sizeof(struct NVGvertex); | |||
| glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)offset); | |||
| glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(offset + 2*sizeof(float))); | |||
| glDrawArrays(GL_TRIANGLE_STRIP, 0, paths[i].strokeCount); | |||
| glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount); | |||
| } | |||
| } | |||
| @@ -793,15 +768,12 @@ static void glnvg__triangles(struct GLNVGcontext* gl, struct GLNVGcall* call) | |||
| glUniform2f(gl->shader.loc[GLNVG_LOC_VIEWSIZE], gl->viewWidth, gl->viewHeight); | |||
| glUniform1i(gl->shader.loc[GLNVG_LOC_TEX], 0); | |||
| glUniform1i(gl->shader.loc[GLNVG_LOC_TEXTYPE], tex->type == NVG_TEXTURE_RGBA ? 0 : 1); | |||
| glnvg__toFloatColor(color, call->paint.innerColor); | |||
| glUniform4fv(gl->shader.loc[GLNVG_LOC_INNERCOL], 1, color ); | |||
| glnvg__checkError("tris solid img loc"); | |||
| glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)offset); | |||
| glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(offset + 2 * sizeof(float))); | |||
| glnvg__toFloatColor(color, call->paint.innerColor); | |||
| glVertexAttrib4fv(2, color); | |||
| glDrawArrays(GL_TRIANGLES, 0, call->triangleCount); | |||
| glDrawArrays(GL_TRIANGLES, call->triangleOffset, call->triangleCount); | |||
| } | |||
| static void glnvg__renderFlush(void* uptr) | |||
| @@ -819,6 +791,8 @@ static void glnvg__renderFlush(void* uptr) | |||
| glBufferData(GL_ARRAY_BUFFER, gl->nverts * sizeof(struct NVGvertex), gl->verts, GL_STREAM_DRAW); | |||
| glEnableVertexAttribArray(0); | |||
| glEnableVertexAttribArray(1); | |||
| glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)0); | |||
| glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(0 + 2*sizeof(float))); | |||
| for (i = 0; i < gl->ncalls; i++) { | |||
| struct GLNVGcall* call = &gl->calls[i]; | |||