summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/base/three_surface.asy
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-03-27 22:27:57 +0000
committerKarl Berry <karl@freefriends.org>2019-03-27 22:27:57 +0000
commit9121faed0cf54a08882acf41120cf28fc3a32998 (patch)
treefe7f0c5e9ed02fe4a1fc389c27c88750c2807e43 /Build/source/utils/asymptote/base/three_surface.asy
parentb8e24fbf964b4030f68a8484a53d405869693266 (diff)
asy 2.48 sources
git-svn-id: svn://tug.org/texlive/trunk@50622 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.asy38
1 files changed, 24 insertions, 14 deletions
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;