From 9121faed0cf54a08882acf41120cf28fc3a32998 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 27 Mar 2019 22:27:57 +0000 Subject: asy 2.48 sources git-svn-id: svn://tug.org/texlive/trunk@50622 c570f23f-e606-0410-a88d-b1316a301751 --- .../source/utils/asymptote/base/three_surface.asy | 38 ++++++++++++++-------- 1 file changed, 24 insertions(+), 14 deletions(-) (limited to 'Build/source/utils/asymptote/base/three_surface.asy') diff --git a/Build/source/utils/asymptote/base/three_surface.asy b/Build/source/utils/asymptote/base/three_surface.asy index 6e10246c774..b3eebee45cc 100644 --- a/Build/source/utils/asymptote/base/three_surface.asy +++ b/Build/source/utils/asymptote/base/three_surface.asy @@ -1409,11 +1409,32 @@ void draw3D(frame f, int type=0, patch s, triple center=O, material m, PRCshininess,s.colors,interaction.type,prc); } +int computeNormals(triple[] v, int[][] vi, triple[] n, int[][] ni) +{ + triple lastnormal=O; + for(int i=0; i < vi.length; ++i) { + int[] vii=vi[i]; + int[] nii=ni[i]; + triple normal=normal(new triple[] {v[vii[0]],v[vii[1]],v[vii[2]]}); + if(normal != lastnormal || n.length == 0) { + n.push(normal); + lastnormal=normal; + } + nii[0]=nii[1]=nii[2]=n.length-1; + } + return ni.length; +} + // Draw triangles on a frame. void draw(frame f, triple[] v, int[][] vi, triple[] n={}, int[][] ni={}, material m=currentpen, pen[] p={}, int[][] pi={}, light light=currentlight) { + bool normals=ni.length > 0; + if(!normals) { + ni=new int[vi.length][3]; + normals=computeNormals(v,vi,n,ni) > 0; + } if(p.length > 0) m=mean(p); m=material(m,light); @@ -1428,23 +1449,12 @@ void draw(picture pic=currentpicture, triple[] v, int[][] vi, triple[] n={}, int[][] ni={}, material m=currentpen, pen[] p={}, int[][] pi={}, light light=currentlight) { - bool colors=pi.length > 0; bool normals=ni.length > 0; - if(!colors && !normals) { - n=new triple[]; + if(!normals) { ni=new int[vi.length][3]; - triple lastnormal=O; - for(int i=0; i < vi.length; ++i) { - int[] vii=vi[i]; - int[] nii=ni[i]; - triple normal=normal(new triple[] {v[vii[0]],v[vii[1]],v[vii[2]]}); - if(normal != lastnormal || n.length == 0) { - n.push(normal); - lastnormal=normal; - } - nii[0]=nii[1]=nii[2]=n.length-1; - } + normals=computeNormals(v,vi,n,ni) > 0; } + bool colors=pi.length > 0; pic.add(new void(frame f, transform3 t, picture pic, projection P) { triple[] v=t*v; -- cgit v1.2.3