ultimatepp/uppsrc/GLDraw/Polygon.cpp
cxl 32ef80dfc6 GLCtrl: GTK partially fixed
git-svn-id: svn://ultimatepp.org/upp/trunk@12567 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2018-11-23 08:50:54 +00:00

91 lines
No EOL
2.1 KiB
C++

#include "GLDraw.h"
namespace Upp {
GLCode& GLSimpleCode()
{
static GLCode program(R"(
attribute vec2 aPos;
uniform vec2 offset;
uniform vec2 scale;
void main()
{
gl_Position = vec4(scale * aPos + offset, 0, 1);
}
)", R"(
uniform vec4 color;
void main()
{
gl_FragColor = color;
}
)");
return program;
}
void GLDrawStencil(Color color, double alpha)
{
GLCode& program = GLSimpleCode();
static int ioffset = program["offset"];
static int iscale = program["scale"];
static int icolor = program["color"];
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
GLRectMesh().Draw(program(ioffset, -1, -1)(iscale, 2, 2)(icolor, color, alpha));
glDisable(GL_STENCIL_TEST);
}
void GLDrawPolygons(const GLContext2D& dd, bool generic, Pointf at, const GLVertexData& mesh, Sizef scale, Color color)
{
GL_TIMING("GLDrawPolygons");
if(IsNull(color))
return;
GLCode& program = GLSimpleCode();
static int ioffset = program["offset"];
static int iscale = program["scale"];
static int icolor = program["color"];
program(ioffset, Pointf(dd.vs) * at + dd.off)
(iscale, dd.vs * scale);
if(generic) {
glDisable(GL_BLEND);
glDisable(GL_CULL_FACE);
glEnable(GL_STENCIL_TEST);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glStencilFunc(GL_NEVER, 0, 1);
glStencilOp(GL_INVERT, GL_INVERT, GL_INVERT);
mesh.Draw(program);
GLDrawStencil(color, dd.alpha);
}
else {
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
mesh.Draw(program(icolor, color, dd.alpha));
}
}
void GLDrawPolygons(const GLContext2D& dd, Pointf at, const GLVertexData& mesh, Sizef scale, Color color)
{
GLDrawPolygons(dd, true, at, mesh, scale, color);
}
void GLDrawConvexPolygons(const GLContext2D& dd, Pointf at, const GLVertexData& mesh, Sizef scale, Color color)
{
GLDrawPolygons(dd, false, at, mesh, scale, color);
}
};