ultimatepp/bazaar/GLPainter/Line.cpp
cxl 4c776bd7f2 GLPainter: DrawGL
git-svn-id: svn://ultimatepp.org/upp/trunk@12402 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2018-10-23 16:08:33 +00:00

87 lines
No EOL
2.2 KiB
C++

#include "GLPainter.h"
namespace Upp {
void GLDrawPolylines(const GLContext2D& dd, Pointf at, const GLVertexData& mesh, Sizef scale,
double width, Color color, double alpha)
{
static GLCode program(R"(
#version 330 core
in vec4 pos;
uniform vec2 offset;
uniform vec2 scale;
uniform vec2 scale2;
uniform vec2 width;
void main()
{
vec2 v = scale2 * pos.zw;
gl_Position = vec4(scale * (scale2 * pos.xy + width * normalize(vec2(-v.y, v.x))) + offset, 0, 1);
}
)", R"(
#version 330 core
uniform vec4 color;
void main()
{
gl_FragColor = color;
}
)");
static int ioffset = program["offset"];
static int iscale = program["scale"];
static int iscale2 = program["scale2"];
static int iwidth = program["width"];
static int icolor = program["color"];
alpha *= dd.alpha;
program(ioffset, Pointf(dd.vs) * at + Sizef(-1, 1))
(iscale, dd.vs)
(iscale2, scale)
(iwidth, Sizef(width / 2, width / 2))
(icolor, color, alpha)
;
if(alpha == 1) {
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
mesh.Draw(program);
}
else {
glDisable(GL_BLEND);
glDisable(GL_CULL_FACE);
glEnable(GL_STENCIL_TEST);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glStencilFunc(GL_NEVER, 1, 1);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
mesh.Draw(program);
GLDrawStencil(color, dd.alpha * alpha);
}
}
void DashPolyline(Vector<Vector<Pointf>>& polyline, const Vector<Pointf>& line,
const Vector<double>& pattern, double distance = 0)
{
struct LineStore : LinearPathConsumer {
Vector<Vector<Pointf>>& polyline;
void Move(const Pointf& p) override { DLOG("MOVE " << p); polyline.Add().Add(p); }
void Line(const Pointf& p) override { DLOG("LINE " << p); polyline.Top().Add(p); }
LineStore(Vector<Vector<Pointf>>& polyline) : polyline(polyline) {}
};
LineStore st(polyline);
Dasher dasher;
dasher.target = &st;
dasher.Init(pattern, distance);
for(int i = 0; i < line.GetCount(); i++)
if(i)
dasher.Line(line[i]);
else
dasher.Move(line[i]);
dasher.End();
}
};