Fixed stroke semicircles drawing using shaderless OpenGL backend.
This commit is contained in:
parent
f38935459b
commit
2061947138
|
@ -1024,56 +1024,51 @@ void OPENGL_GAL::drawStrokedSemiCircle( const VECTOR2D& aCenterPoint, double aRa
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Compute the factors for the unit circle
|
// Compute the factors for the unit circle
|
||||||
double outerScale = lineWidth / aRadius / 2;
|
double innerScale = 1.0 - lineWidth / aRadius;
|
||||||
double innerScale = -outerScale;
|
|
||||||
outerScale += 1.0;
|
|
||||||
innerScale += 1.0;
|
|
||||||
|
|
||||||
if( innerScale < outerScale )
|
Save();
|
||||||
|
Translate( aCenterPoint );
|
||||||
|
Scale( VECTOR2D( aRadius, aRadius ) );
|
||||||
|
Rotate( aAngle );
|
||||||
|
|
||||||
|
// Draw the outline
|
||||||
|
VBO_VERTEX* circle = verticesCircle->GetVertices();
|
||||||
|
int next;
|
||||||
|
|
||||||
|
begin( GL_TRIANGLES );
|
||||||
|
|
||||||
|
for( int i = 0; i < ( 3 * CIRCLE_POINTS ) / 2; ++i )
|
||||||
{
|
{
|
||||||
Save();
|
// verticesCircle contains precomputed circle points interleaved with vertex
|
||||||
Translate( aCenterPoint );
|
// (0,0,0), so filled circles can be drawn as consecutive triangles, ie:
|
||||||
Rotate( aAngle );
|
// { 0,a,b, 0,c,d, 0,e,f, 0,g,h, ... }
|
||||||
|
// where letters stand for consecutive circle points and 0 for (0,0,0) vertex.
|
||||||
|
|
||||||
// Draw the outline
|
// We have to skip all (0,0,0) vertices (every third vertex)
|
||||||
VBO_VERTEX* circle = verticesCircle->GetVertices();
|
if( i % 3 == 0 )
|
||||||
int next;
|
|
||||||
|
|
||||||
begin( GL_TRIANGLES );
|
|
||||||
|
|
||||||
for( int i = 0; i < ( 3 * CIRCLE_POINTS ) / 2; ++i )
|
|
||||||
{
|
{
|
||||||
// verticesCircle contains precomputed circle points interleaved with vertex
|
i++;
|
||||||
// (0,0,0), so filled circles can be drawn as consecutive triangles, ie:
|
// Depending on the vertex, next circle point may be stored in the next vertex..
|
||||||
// { 0,a,b, 0,c,d, 0,e,f, 0,g,h, ... }
|
next = i + 1;
|
||||||
// where letters stand for consecutive circle points and 0 for (0,0,0) vertex.
|
}
|
||||||
|
else
|
||||||
// We have to skip all (0,0,0) vertices (every third vertex)
|
{
|
||||||
if( i % 3 == 0 )
|
// ..or 2 vertices away (in case it is preceded by (0,0,0) vertex)
|
||||||
{
|
next = i + 2;
|
||||||
i++;
|
|
||||||
// Depending on the vertex, next circle point may be stored in the next vertex..
|
|
||||||
next = i + 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// ..or 2 vertices away (in case it is preceded by (0,0,0) vertex)
|
|
||||||
next = i + 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
vertex3( circle[i].x * innerScale, circle[i].y * innerScale, layerDepth );
|
|
||||||
vertex3( circle[i].x * outerScale, circle[i].y * outerScale, layerDepth );
|
|
||||||
vertex3( circle[next].x * innerScale, circle[next].y * innerScale, layerDepth );
|
|
||||||
|
|
||||||
vertex3( circle[i].x * outerScale, circle[i].y * outerScale, layerDepth );
|
|
||||||
vertex3( circle[next].x * outerScale, circle[next].y * outerScale, layerDepth );
|
|
||||||
vertex3( circle[next].x * innerScale, circle[next].y * innerScale, layerDepth );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
end();
|
vertex3( circle[i].x * innerScale, circle[i].y * innerScale, layerDepth );
|
||||||
|
vertex3( circle[i].x, circle[i].y, layerDepth );
|
||||||
|
vertex3( circle[next].x * innerScale, circle[next].y * innerScale, layerDepth );
|
||||||
|
|
||||||
Restore();
|
vertex3( circle[i].x, circle[i].y, layerDepth );
|
||||||
|
vertex3( circle[next].x, circle[next].y, layerDepth );
|
||||||
|
vertex3( circle[next].x * innerScale, circle[next].y * innerScale, layerDepth );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
end();
|
||||||
|
|
||||||
|
Restore();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue