summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/bezierpatch.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/bezierpatch.cc')
-rw-r--r--Build/source/utils/asymptote/bezierpatch.cc19
1 files changed, 10 insertions, 9 deletions
diff --git a/Build/source/utils/asymptote/bezierpatch.cc b/Build/source/utils/asymptote/bezierpatch.cc
index c75989c40df..f076d4643ac 100644
--- a/Build/source/utils/asymptote/bezierpatch.cc
+++ b/Build/source/utils/asymptote/bezierpatch.cc
@@ -31,6 +31,7 @@ GLuint BezierPatch::Ntvertices=0;
extern const double Fuzz2;
const double FillFactor=0.1;
+const double BezierFactor=0.4;
// Partially work around OpenGL transparency bug by sorting transparent
// triangles by their centroid depth.
@@ -58,7 +59,7 @@ void BezierPatch::init(double res, const triple& Min, const triple& Max,
{
empty=false;
res2=res*res;
- res3=res2;
+ Res2=BezierFactor*BezierFactor*res2;
Epsilon=FillFactor*res;
this->Min=Min;
this->Max=Max;
@@ -219,28 +220,28 @@ void BezierPatch::render(const triple *p,
triple m0=0.5*(P0+P1);
if(!flat0) {
- if((flat0=Straightness(p0,p[4],p[8],p12) < res3))
+ if((flat0=Straightness(p0,p[4],p[8],p12) < res2))
m0 -= Epsilon*unit(derivative(s1[0],s1[1],s1[2],s1[3]));
else m0=s0[12];
}
triple m1=0.5*(P1+P2);
if(!flat1) {
- if((flat1=Straightness(p12,p[13],p[14],p15) < res3))
+ if((flat1=Straightness(p12,p[13],p[14],p15) < res2))
m1 -= Epsilon*unit(derivative(s2[12],s2[8],s2[4],s2[0]));
else m1=s1[15];
}
triple m2=0.5*(P2+P3);
if(!flat2) {
- if((flat2=Straightness(p15,p[11],p[7],p3) < res3))
+ if((flat2=Straightness(p15,p[11],p[7],p3) < res2))
m2 -= Epsilon*unit(derivative(s3[15],s2[14],s2[13],s1[12]));
else m2=s2[3];
}
triple m3=0.5*(P3+P0);
if(!flat3) {
- if((flat3=Straightness(p0,p[1],p[2],p3) < res3))
+ if((flat3=Straightness(p0,p[1],p[2],p3) < res2))
m3 -= Epsilon*unit(derivative(s0[3],s0[7],s0[11],s0[15]));
else m3=s3[0];
}
@@ -356,7 +357,7 @@ void BezierTriangle::render(const triple *p,
bool flat0, bool flat1, bool flat2,
GLfloat *C0, GLfloat *C1, GLfloat *C2)
{
- if(Distance(p) < res2) { // Triangle is flat
+ if(Distance(p) < Res2) { // Triangle is flat
triple P[]={P0,P1,P2};
if(!offscreen(3,P)) {
std::vector<GLuint> &p=*pindices;
@@ -490,7 +491,7 @@ void BezierTriangle::render(const triple *p,
triple p0=0.5*(P1+P2);
if(!flat0) {
- if((flat0=Straightness(r300,p210,p120,u030) < res3))
+ if((flat0=Straightness(r300,p210,p120,u030) < res2))
p0 -= Epsilon*unit(derivative(c[0],c[2],c[5],c[9])+
derivative(c[0],c[1],c[3],c[6]));
else p0=r030;
@@ -498,7 +499,7 @@ void BezierTriangle::render(const triple *p,
triple p1=0.5*(P2+P0);
if(!flat1) {
- if((flat1=Straightness(l003,p012,p021,u030) < res3))
+ if((flat1=Straightness(l003,p012,p021,u030) < res2))
p1 -= Epsilon*unit(derivative(c[6],c[3],c[1],c[0])+
derivative(c[6],c[7],c[8],c[9]));
else p1=l030;
@@ -506,7 +507,7 @@ void BezierTriangle::render(const triple *p,
triple p2=0.5*(P0+P1);
if(!flat2) {
- if((flat2=Straightness(l003,p102,p201,r300) < res3))
+ if((flat2=Straightness(l003,p102,p201,r300) < res2))
p2 -= Epsilon*unit(derivative(c[9],c[8],c[7],c[6])+
derivative(c[9],c[5],c[2],c[0]));
else p2=l300;