diff options
author | Karl Berry <karl@freefriends.org> | 2021-01-02 16:31:31 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2021-01-02 16:31:31 +0000 |
commit | 6457cd3f6e21e23e21db6dafff021d17f5457567 (patch) | |
tree | 08f169333e47c5fc1c50e828cf3a0f50bdf9b508 /Build/source/utils/asymptote/base/three_surface.asy | |
parent | dc2504a4c02af0ec2fff00e6b833c6143a06b4cd (diff) |
asy 2.68 sources
git-svn-id: svn://tug.org/texlive/trunk@57291 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/asymptote/base/three_surface.asy')
-rw-r--r-- | Build/source/utils/asymptote/base/three_surface.asy | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/Build/source/utils/asymptote/base/three_surface.asy b/Build/source/utils/asymptote/base/three_surface.asy index 8348d7ac3af..7d64ad22d72 100644 --- a/Build/source/utils/asymptote/base/three_surface.asy +++ b/Build/source/utils/asymptote/base/three_surface.asy @@ -1374,6 +1374,10 @@ void draw3D(frame f, patch s, triple center=O, material m, bool primitive=false) { bool straight=s.straight && s.planar; + + // Planar Bezier surfaces require extra precision in WebGL + int digits=s.planar && !straight ? 12 : settings.digits; + if(s.colors.length > 0) { if(prc() && light.on()) straight=false; // PRC vertex colors (for quads only) ignore lighting @@ -1383,7 +1387,7 @@ void draw3D(frame f, patch s, triple center=O, material m, (s.triangular ? drawbeziertriangle : draw) (f,s.P,center,straight,m.p,m.opacity,m.shininess, - m.metallic,m.fresnel0,s.colors,interaction.type,primitive); + m.metallic,m.fresnel0,s.colors,interaction.type,digits,primitive); } void _draw(frame f, path3 g, triple center=O, material m, @@ -1500,8 +1504,18 @@ void tensorshade(transform t=identity(), frame f, patch s, p.push(p[0]); s=tensor(s); } else p=s.colors(m,light); - tensorshade(f,box(t*s.min(P),t*s.max(P)),m.diffuse(), - p,t*project(s.external(),P,1),t*project(s.internal(),P)); + path g=t*project(s.external(),P,1); + pair[] internal=t*project(s.internal(),P); + pen fillrule=m.diffuse(); + if(inside(g,internal[0],fillrule) && inside(g,internal[1],fillrule) && + inside(g,internal[2],fillrule) && inside(g,internal[3],fillrule)) { + if(p[0] == p[1] && p[1] == p[2] && p[2] == p[3]) + fill(f,g,fillrule+p[0]); + else + tensorshade(f,g,fillrule,p,internal); + } else { + tensorshade(f,box(t*s.min(P),t*s.max(P)),fillrule,p,g,internal); + } } restricted pen[] nullpens={nullpen}; |