Render end cap at all times.
This commit is contained in:
parent
db73fc9e14
commit
bae3b711cf
|
@ -340,8 +340,29 @@ public class CurveRenderState {
|
||||||
float phi = (float)(Math.PI / divs);
|
float phi = (float)(Math.PI / divs);
|
||||||
float sinphi = (float)Math.sin(phi);
|
float sinphi = (float)Math.sin(phi);
|
||||||
float cosphi = (float)Math.cos(phi);
|
float cosphi = (float)Math.cos(phi);
|
||||||
float prev_ox = -offs_x;
|
float prev_ox = 0;
|
||||||
float prev_oy = -offs_y;
|
float prev_oy = -radius;
|
||||||
|
|
||||||
|
for (int j = 0; j < divs; j++) {
|
||||||
|
float ox = cosphi*prev_ox - sinphi*prev_oy;
|
||||||
|
float oy = sinphi*prev_ox + cosphi*prev_oy;
|
||||||
|
|
||||||
|
buff.put(1.0f); buff.put(0.5f);
|
||||||
|
buff.put(0); buff.put(0);
|
||||||
|
buff.put(0.0f); buff.put(1.0f);
|
||||||
|
buff.put(0.0f); buff.put(0.5f);
|
||||||
|
buff.put(0 + prev_ox); buff.put(0 + prev_oy);
|
||||||
|
buff.put(1.0f); buff.put(1.0f);
|
||||||
|
buff.put(0.0f); buff.put(0.5f);
|
||||||
|
buff.put(0 + ox); buff.put(0 + oy);
|
||||||
|
buff.put(1.0f); buff.put(1.0f);
|
||||||
|
|
||||||
|
prev_ox = ox; prev_oy = oy;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
prev_ox = -offs_x;
|
||||||
|
prev_oy = -offs_y;
|
||||||
|
|
||||||
for (int j = 0; j < divs; j++) {
|
for (int j = 0; j < divs; j++) {
|
||||||
float ox = cosphi*prev_ox - sinphi*prev_oy;
|
float ox = cosphi*prev_ox - sinphi*prev_oy;
|
||||||
|
@ -401,32 +422,6 @@ public class CurveRenderState {
|
||||||
buff.put(x + offs_x); buff.put(y + offs_y);
|
buff.put(x + offs_x); buff.put(y + offs_y);
|
||||||
buff.put(1.0f); buff.put(1.0f);
|
buff.put(1.0f); buff.put(1.0f);
|
||||||
|
|
||||||
if (i == curve.length-1) {
|
|
||||||
int divs = NewCurveStyleState.DIVIDES / 2;
|
|
||||||
|
|
||||||
float phi = (float)(Math.PI / divs);
|
|
||||||
float sinphi = (float)Math.sin(phi);
|
|
||||||
float cosphi = (float)Math.cos(phi);
|
|
||||||
float prev_ox = offs_x;
|
|
||||||
float prev_oy = offs_y;
|
|
||||||
|
|
||||||
for (int j = 0; j < divs; j++) {
|
|
||||||
float ox = cosphi*prev_ox - sinphi*prev_oy;
|
|
||||||
float oy = sinphi*prev_ox + cosphi*prev_oy;
|
|
||||||
|
|
||||||
buff.put(1.0f); buff.put(0.5f);
|
|
||||||
buff.put(x); buff.put(y);
|
|
||||||
buff.put(0.0f); buff.put(1.0f);
|
|
||||||
buff.put(0.0f); buff.put(0.5f);
|
|
||||||
buff.put(x + prev_ox);buff.put(y + prev_oy);
|
|
||||||
buff.put(1.0f); buff.put(1.0f);
|
|
||||||
buff.put(0.0f); buff.put(0.5f);
|
|
||||||
buff.put(x + ox); buff.put(y + oy);
|
|
||||||
buff.put(1.0f); buff.put(1.0f);
|
|
||||||
|
|
||||||
prev_ox = ox; prev_oy = oy;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
last_dx = diff_x;
|
last_dx = diff_x;
|
||||||
last_dy = diff_y;
|
last_dy = diff_y;
|
||||||
|
@ -459,6 +454,11 @@ public class CurveRenderState {
|
||||||
GL20.glUniform1i(staticState.texLoc, 0);
|
GL20.glUniform1i(staticState.texLoc, 0);
|
||||||
GL20.glUniform4f(staticState.colLoc, color.r, color.g, color.b, color.a);
|
GL20.glUniform4f(staticState.colLoc, color.r, color.g, color.b, color.a);
|
||||||
GL20.glUniform4f(staticState.colBorderLoc, borderColor.r, borderColor.g, borderColor.b, borderColor.a);
|
GL20.glUniform4f(staticState.colBorderLoc, borderColor.r, borderColor.g, borderColor.b, borderColor.a);
|
||||||
|
|
||||||
|
float lastSegmentX = to == 0 ? curve[1].x - curve[0].x : curve[to].x - curve[to-1].x;
|
||||||
|
float lastSegmentY = to == 0 ? curve[1].y - curve[0].y : curve[to].y - curve[to-1].y;
|
||||||
|
float lastSegmentInvLen = 1.f/(float)Math.hypot(lastSegmentX, lastSegmentY);
|
||||||
|
GL20.glUniform4f(staticState.endPointLoc, curve[to].x, curve[to].y, lastSegmentX * lastSegmentInvLen, lastSegmentY * lastSegmentInvLen);
|
||||||
//stride is 6*4 for the floats (4 bytes) (u,v)(x,y,z,w)
|
//stride is 6*4 for the floats (4 bytes) (u,v)(x,y,z,w)
|
||||||
//2*4 is for skipping the first 2 floats (u,v)
|
//2*4 is for skipping the first 2 floats (u,v)
|
||||||
GL20.glVertexAttribPointer(staticState.attribLoc, 4, GL11.GL_FLOAT, false, 6 * 4, 2 * 4);
|
GL20.glVertexAttribPointer(staticState.attribLoc, 4, GL11.GL_FLOAT, false, 6 * 4, 2 * 4);
|
||||||
|
@ -487,7 +487,7 @@ public class CurveRenderState {
|
||||||
private static class NewCurveStyleState {
|
private static class NewCurveStyleState {
|
||||||
/**
|
/**
|
||||||
* Used for new style Slider rendering, defines how many vertices there
|
* Used for new style Slider rendering, defines how many vertices there
|
||||||
* are in a circle.
|
* are in a circle. Must be even.
|
||||||
*/
|
*/
|
||||||
protected static final int DIVIDES = 30;
|
protected static final int DIVIDES = 30;
|
||||||
|
|
||||||
|
@ -500,6 +500,9 @@ public class CurveRenderState {
|
||||||
/** OpenGL shader attribute location of the texture coordinate attribute. */
|
/** OpenGL shader attribute location of the texture coordinate attribute. */
|
||||||
protected int texCoordLoc = 0;
|
protected int texCoordLoc = 0;
|
||||||
|
|
||||||
|
/** OpenGL shader uniform location of the end point attribute. */
|
||||||
|
protected int endPointLoc = 0;
|
||||||
|
|
||||||
/** OpenGL shader uniform location of the color attribute. */
|
/** OpenGL shader uniform location of the color attribute. */
|
||||||
protected int colLoc = 0;
|
protected int colLoc = 0;
|
||||||
|
|
||||||
|
@ -551,7 +554,9 @@ public class CurveRenderState {
|
||||||
program = GL20.glCreateProgram();
|
program = GL20.glCreateProgram();
|
||||||
int vtxShdr = GL20.glCreateShader(GL20.GL_VERTEX_SHADER);
|
int vtxShdr = GL20.glCreateShader(GL20.GL_VERTEX_SHADER);
|
||||||
int frgShdr = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER);
|
int frgShdr = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER);
|
||||||
GL20.glShaderSource(vtxShdr, "#version 110\n"
|
GL20.glShaderSource(vtxShdr, "#version 130\n"
|
||||||
|
+ "\n"
|
||||||
|
+ "uniform vec4 endPoint;\n"
|
||||||
+ "\n"
|
+ "\n"
|
||||||
+ "attribute vec4 in_position;\n"
|
+ "attribute vec4 in_position;\n"
|
||||||
+ "attribute vec2 in_tex_coord;\n"
|
+ "attribute vec2 in_tex_coord;\n"
|
||||||
|
@ -559,7 +564,12 @@ public class CurveRenderState {
|
||||||
+ "varying vec2 tex_coord;\n"
|
+ "varying vec2 tex_coord;\n"
|
||||||
+ "void main()\n"
|
+ "void main()\n"
|
||||||
+ "{\n"
|
+ "{\n"
|
||||||
+ " gl_Position = gl_ModelViewProjectionMatrix * in_position;\n"
|
+ " vec4 pos = in_position;\n"
|
||||||
|
+ " if (gl_VertexID < " + 3 * DIVIDES / 2 + ") {\n"
|
||||||
|
+ " mat2 rot = mat2(endPoint.zw, vec2(-1.0,1.0)*endPoint.wz);\n"
|
||||||
|
+ " pos.xy = endPoint.xy + rot * in_position.xy;\n"
|
||||||
|
+ " }\n"
|
||||||
|
+ " gl_Position = gl_ModelViewProjectionMatrix * pos;\n"
|
||||||
+ " tex_coord = in_tex_coord;\n"
|
+ " tex_coord = in_tex_coord;\n"
|
||||||
+ "}");
|
+ "}");
|
||||||
GL20.glCompileShader(vtxShdr);
|
GL20.glCompileShader(vtxShdr);
|
||||||
|
@ -604,6 +614,7 @@ public class CurveRenderState {
|
||||||
texCoordLoc = GL20.glGetAttribLocation(program, "in_tex_coord");
|
texCoordLoc = GL20.glGetAttribLocation(program, "in_tex_coord");
|
||||||
texLoc = GL20.glGetUniformLocation(program, "tex");
|
texLoc = GL20.glGetUniformLocation(program, "tex");
|
||||||
colLoc = GL20.glGetUniformLocation(program, "col_tint");
|
colLoc = GL20.glGetUniformLocation(program, "col_tint");
|
||||||
|
endPointLoc = GL20.glGetUniformLocation(program, "endPoint");
|
||||||
colBorderLoc = GL20.glGetUniformLocation(program, "col_border");
|
colBorderLoc = GL20.glGetUniformLocation(program, "col_border");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user