Browse Source

Remove artifacts at line endings (see 4f9c5db78143).

vrld 13 years ago
parent
commit
26780681ea
1 changed files with 8 additions and 5 deletions
  1. 8 5
      src/modules/graphics/opengl/Graphics.cpp

+ 8 - 5
src/modules/graphics/opengl/Graphics.cpp

@@ -807,7 +807,7 @@ namespace opengl
 
 	// precondition:
 	// glEnableClientState(GL_VERTEX_ARRAY);
-	static void draw_overdraw(Vector* overdraw, size_t count, bool looping)
+	static void draw_overdraw(Vector* overdraw, size_t count, float pixel_size, bool looping)
 	{
 		// if not looping, the outer overdraw vertices need to be displaced
 		// to cover the line endings, i.e.:
@@ -820,11 +820,13 @@ namespace opengl
 		{
 			Vector s = overdraw[1] - overdraw[3];
 			s.normalize();
+			s *= pixel_size;
 			overdraw[1] += s;
 			overdraw[2*count-1] += s;
 
 			Vector t = overdraw[count-1] - overdraw[count-3];
 			t.normalize();
+			t *= pixel_size;
 			overdraw[count-1] += t;
 			overdraw[count+1] += t;
 
@@ -872,6 +874,7 @@ namespace opengl
 		bool looping = (coords[0] == coords[count-2]) && (coords[1] == coords[count-1]);
 
 		float halfwidth       = lineWidth/2.f;
+		float pixel_size      = 1.f;
 		float overdraw_factor = .0f;
 
 		if (lineStyle == LINE_SMOOTH) {
@@ -879,9 +882,9 @@ namespace opengl
 			// TODO: is there a better way to get the pixel size at the current scale?
 			GLfloat m[16];
 			glGetFloatv(GL_MODELVIEW_MATRIX, m);
-			float det = m[0]*m[5]*m[10] + m[4]*m[9]*m[2] + m[8]*m[1]*m[6];
-			det      -= m[2]*m[5]*m[8]  + m[6]*m[9]*m[0] + m[10]*m[1]*m[4];
-			float pixel_size = 1. / sqrt(det);
+			float det  = m[0]*m[5]*m[10] + m[4]*m[9]*m[2] + m[8]*m[1]*m[6];
+			det       -= m[2]*m[5]*m[8]  + m[6]*m[9]*m[0] + m[10]*m[1]*m[4];
+			pixel_size = 1.f / sqrt(det);
 
 			overdraw_factor = pixel_size / halfwidth;
 			halfwidth = std::max(.0f, halfwidth - .25f*pixel_size);
@@ -919,7 +922,7 @@ namespace opengl
 
 		// draw the line halo (antialiasing)
 		if (lineStyle == LINE_SMOOTH)
-			draw_overdraw(overdraw, count, looping);
+			draw_overdraw(overdraw, count, pixel_size, looping);
 
 		glDisableClientState(GL_VERTEX_ARRAY);
 		glEnable(GL_TEXTURE_2D);