From f1e79c3669f68804c471699badc56a4a33a23246 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 8 Aug 2022 03:05:28 +0000 Subject: CTAN sync 202208080305 --- graphics/asymptote/base/three_surface.asy | 37 +++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) (limited to 'graphics/asymptote/base/three_surface.asy') diff --git a/graphics/asymptote/base/three_surface.asy b/graphics/asymptote/base/three_surface.asy index 95f41a6181..04f269f73f 100644 --- a/graphics/asymptote/base/three_surface.asy +++ b/graphics/asymptote/base/three_surface.asy @@ -1384,7 +1384,8 @@ void draw3D(frame f, patch s, material m, if(prc() && light.on()) straight=false; // PRC vertex colors (for quads only) ignore lighting m=material(m); - m.diffuse(mean(s.colors)); + if(prc()) + m.diffuse(mean(s.colors)); } m=material(m,light,s.colors.length > 0); @@ -1423,7 +1424,7 @@ void draw(frame f, triple[] v, int[][] vi, triple[] n={}, int[][] ni={}, material m=currentpen, pen[] p={}, int[][] pi={}, light light=currentlight, render render=defaultrender) { - bool normals=n.length > 0; + bool normals=ni.length > 0; if(!normals) { ni=new int[vi.length][3]; normals=computeNormals(v,vi,n,ni) > 0; @@ -1431,6 +1432,35 @@ void draw(frame f, triple[] v, int[][] vi, if(p.length > 0) m=mean(p); m=material(m,light); + + if(prc()) { + int[] vertexNormal=new int[ni.length]; + int[] vertexPen=new int[pi.length]; + + bool pens=pi.length > 0; + + for(int i=0; i < vi.length; ++i) { + int[] vii=vi[i]; + int[] nii=ni[i]; + for(int j=0; j < 3; ++j) { + int V=vii[j]; + vertexNormal[V]=nii[j]; + if(pens) + vertexPen[V]=pi[i][j]; + } + } + + for(int i=0; i < vi.length; ++i) { + int[] vii=vi[i]; + for(int j=0; j < 3; ++j) { + int V=vii[j]; + ni[i][j]=vertexNormal[V]; + if(pens) + pi[i][j]=vertexPen[V]; + } + } + } + draw(f,v,vi,render.interaction.center,n,ni, m.p,m.opacity,m.shininess,m.metallic,m.fresnel0,p,pi, render.interaction.type); @@ -1441,8 +1471,7 @@ void draw(picture pic=currentpicture, triple[] v, int[][] vi, triple[] n={}, int[][] ni={}, material m=currentpen, pen[] p={}, int[][] pi={}, light light=currentlight, render render=defaultrender) { - bool prc=prc(); - bool normals=n.length > 0; + bool normals=ni.length > 0; if(!normals) { ni=new int[vi.length][3]; normals=computeNormals(v,vi,n,ni) > 0; -- cgit v1.2.3