diff options
author | Karl Berry <karl@freefriends.org> | 2020-03-03 22:35:09 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-03-03 22:35:09 +0000 |
commit | f6bb2b5974c9dc15a4530842100d30fe1981b973 (patch) | |
tree | 62ef95efa54d91b6eafb6df99f330dc136f77f29 /Build/source/utils/asymptote/drawsurface.cc | |
parent | 24dbc0b1802756862bedad6a4088f50aad68b51b (diff) |
asy 2.63 sources
git-svn-id: svn://tug.org/texlive/trunk@54034 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/asymptote/drawsurface.cc')
-rw-r--r-- | Build/source/utils/asymptote/drawsurface.cc | 204 |
1 files changed, 125 insertions, 79 deletions
diff --git a/Build/source/utils/asymptote/drawsurface.cc b/Build/source/utils/asymptote/drawsurface.cc index b2a2de61738..921541a84f5 100644 --- a/Build/source/utils/asymptote/drawsurface.cc +++ b/Build/source/utils/asymptote/drawsurface.cc @@ -58,18 +58,11 @@ void setcolors(bool colors, const RGBAColour& specular, double shininess, double metallic, double fresnel0, jsfile *out) { - Material m; - if(colors) { - static glm::vec4 Black(0.0,0.0,0.0,diffuse.A); - m=Material(Black,Black, - glm::vec4(specular.R,specular.G,specular.B,specular.A), - shininess,metallic,fresnel0); - } else - m=Material(glm::vec4(diffuse.R,diffuse.G,diffuse.B,diffuse.A), - glm::vec4(emissive.R,emissive.G,emissive.B,emissive.A), - glm::vec4(specular.R,specular.G,specular.B,specular.A), - shininess,metallic,fresnel0); - + Material m=Material(glm::vec4(diffuse.R,diffuse.G,diffuse.B,diffuse.A), + glm::vec4(emissive.R,emissive.G,emissive.B,emissive.A), + glm::vec4(specular.R,specular.G,specular.B,specular.A), + shininess,metallic,fresnel0); + MaterialMap::iterator p=materialMap.find(m); if(p != materialMap.end()) materialIndex=p->second; else { @@ -89,7 +82,7 @@ void drawBezierPatch::bounds(const double* t, bbox3& b) { double x,y,z; double X,Y,Z; - + if(straight) { triple Vertices[4]; if(t == NULL) { @@ -103,13 +96,13 @@ void drawBezierPatch::bounds(const double* t, bbox3& b) Vertices[2]=t*controls[12]; Vertices[3]=t*controls[15]; } - + boundstriples(x,y,z,X,Y,Z,4,Vertices); } else { double cx[16]; double cy[16]; double cz[16]; - + if(t == NULL) { for(int i=0; i < 16; ++i) { triple v=controls[i]; @@ -125,26 +118,26 @@ void drawBezierPatch::bounds(const double* t, bbox3& b) cz[i]=v.getz(); } } - + double c0=cx[0]; double fuzz=Fuzz*run::norm(cx,16); x=bound(cx,min,b.empty ? c0 : min(c0,b.left),fuzz,maxdepth); X=bound(cx,max,b.empty ? c0 : max(c0,b.right),fuzz,maxdepth); - + c0=cy[0]; fuzz=Fuzz*run::norm(cy,16); y=bound(cy,min,b.empty ? c0 : min(c0,b.bottom),fuzz,maxdepth); Y=boundtri(cy,max,b.empty ? c0 : max(c0,b.top),fuzz,maxdepth); - + c0=cz[0]; fuzz=Fuzz*run::norm(cz,16); z=bound(cz,min,b.empty ? c0 : min(c0,b.near),fuzz,maxdepth); Z=bound(cz,max,b.empty ? c0 : max(c0,b.far),fuzz,maxdepth); - } - + } + b.add(x,y,z); b.add(X,Y,Z); - + if(t == NULL) { Min=triple(x,y,z); Max=triple(X,Y,Z); @@ -207,11 +200,11 @@ void drawBezierPatch::ratio(const double* t, pair &b, double (*m)(double, double bool drawBezierPatch::write(prcfile *out, unsigned int *, double, groupsmap&) { - if(invisible || !prc) + if(invisible || primitive) return true; RGBAColour Black(0.0,0.0,0.0,diffuse.A); - PRCmaterial m(Black,diffuse,emissive,specular,opacity,PRCshininess); + PRCmaterial m(Black,diffuse,emissive,specular,opacity,shininess); if(straight) { triple vertices[]={controls[0],controls[12],controls[3],controls[15]}; @@ -229,7 +222,7 @@ bool drawBezierPatch::write(prcfile *out, unsigned int *, double, groupsmap&) bool drawBezierPatch::write(jsfile *out) { #ifdef HAVE_LIBGLM - if(invisible) + if(invisible || primitive) return true; if(billboard) { @@ -446,11 +439,11 @@ void drawBezierTriangle::ratio(const double* t, pair &b, bool drawBezierTriangle::write(prcfile *out, unsigned int *, double, groupsmap&) { - if(invisible) + if(invisible || primitive) return true; RGBAColour Black(0.0,0.0,0.0,diffuse.A); - PRCmaterial m(Black,diffuse,emissive,specular,opacity,PRCshininess); + PRCmaterial m(Black,diffuse,emissive,specular,opacity,shininess); static const double third=1.0/3.0; static const double third2=2.0/3.0; @@ -470,7 +463,7 @@ bool drawBezierTriangle::write(prcfile *out, unsigned int *, double, bool drawBezierTriangle::write(jsfile *out) { #ifdef HAVE_LIBGLM - if(invisible) + if(invisible || primitive) return true; if(billboard) { @@ -573,7 +566,7 @@ bool drawNurbs::write(prcfile *out, unsigned int *, double, groupsmap&) return true; RGBAColour Black(0.0,0.0,0.0,diffuse.A); - PRCmaterial m(Black,diffuse,emissive,specular,opacity,PRCshininess); + PRCmaterial m(Black,diffuse,emissive,specular,opacity,shininess); out->addSurface(udegree,vdegree,nu,nv,controls,uknots,vknots,m,weights); return true; @@ -676,17 +669,13 @@ void drawNurbs::render(double size2, const triple& b, const triple& B, // TODO: implement NURBS renderer } -void drawSphere::P(triple& t, double x, double y, double z) +void drawPRC::P(triple& t, double x, double y, double z) { - if(half) { - double temp=z; z=x; x=-temp; - } - if(T == NULL) { t=triple(x,y,z); return; } - + double f=T[12]*x+T[13]*y+T[14]*z+T[15]; if(f == 0.0) run::dividebyzero(); f=1.0/f; @@ -695,6 +684,14 @@ void drawSphere::P(triple& t, double x, double y, double z) (T[8]*x+T[9]*y+T[10]*z+T[11])*f); } +void drawSphere::P(triple& t, double x, double y, double z) +{ + if(half) { + double temp=z; z=x; x=-temp; + } + drawPRC::P(t,x,y,z); +} + bool drawSphere::write(prcfile *out, unsigned int *, double, groupsmap&) { if(invisible) @@ -759,6 +756,31 @@ bool drawSphere::write(prcfile *out, unsigned int *, double, groupsmap&) return true; } +bool drawSphere::write(jsfile *out) +{ +#ifdef HAVE_LIBGLM + if(invisible) + return true; + + drawElement::centerIndex=0; + + setcolors(false,diffuse,emissive,specular,shininess,metallic,fresnel0,out); + + triple O,E; + P(E,1.0,0.0,0.0); + P(O,0.0,0.0,0.0); + triple X=E-O; + double r=length(X); + + if(half) + out->addSphere(O,r,half,X.polar(false),X.azimuth(false)); + else + out->addSphere(O,r); + +#endif + return true; +} + bool drawCylinder::write(prcfile *out, unsigned int *, double, groupsmap&) { if(invisible) @@ -772,6 +794,31 @@ bool drawCylinder::write(prcfile *out, unsigned int *, double, groupsmap&) return true; } +bool drawCylinder::write(jsfile *out) +{ +#ifdef HAVE_LIBGLM + if(invisible) + return true; + + drawElement::centerIndex=0; + + setcolors(false,diffuse,emissive,specular,shininess,metallic,fresnel0,out); + + triple E,H,O; + P(E,1.0,0.0,0.0); + P(H,0.0,0.0,1.0); + P(O,0.0,0.0,0.0); + triple X=E-O; + triple Z=H-O; + double r=length(X); + double h=length(Z); + + out->addCylinder(O,r,h,Z.polar(false),Z.azimuth(false),core); + +#endif + return true; +} + bool drawDisk::write(prcfile *out, unsigned int *, double, groupsmap&) { if(invisible) @@ -785,54 +832,53 @@ bool drawDisk::write(prcfile *out, unsigned int *, double, groupsmap&) return true; } -bool drawTube::write(prcfile *out, unsigned int *, double, groupsmap&) +bool drawDisk::write(jsfile *out) { +#ifdef HAVE_LIBGLM if(invisible) return true; - RGBAColour Black(0.0,0.0,0.0,diffuse.A); - PRCmaterial m(Black,diffuse,emissive,specular,opacity,shininess); + drawElement::centerIndex=0; - Int n=center.length(); - - if(center.piecewisestraight()) { - triple *centerControls=new(UseGC) triple[n+1]; - for(Int i=0; i <= n; ++i) - centerControls[i]=center.point(i); - size_t N=n+1; - triple *controls=new(UseGC) triple[N]; - for(Int i=0; i <= n; ++i) - controls[i]=g.point(i); - out->addTube(N,centerControls,controls,true,m); - } else { - size_t N=3*n+1; - triple *centerControls=new(UseGC) triple[N]; - centerControls[0]=center.point((Int) 0); - centerControls[1]=center.postcontrol((Int) 0); - size_t k=1; - for(Int i=1; i < n; ++i) { - centerControls[++k]=center.precontrol(i); - centerControls[++k]=center.point(i); - centerControls[++k]=center.postcontrol(i); - } - centerControls[++k]=center.precontrol(n); - centerControls[++k]=center.point(n); - - triple *controls=new(UseGC) triple[N]; - controls[0]=g.point((Int) 0); - controls[1]=g.postcontrol((Int) 0); - k=1; - for(Int i=1; i < n; ++i) { - controls[++k]=g.precontrol(i); - controls[++k]=g.point(i); - controls[++k]=g.postcontrol(i); - } - controls[++k]=g.precontrol(n); - controls[++k]=g.point(n); - - out->addTube(N,centerControls,controls,false,m); - } - + setcolors(false,diffuse,emissive,specular,shininess,metallic,fresnel0,out); + + triple E,H,O; + P(E,1.0,0.0,0.0); + P(H,0.0,0.0,1.0); + P(O,0.0,0.0,0.0); + triple X=E-O; + triple Z=H-O; + double r=length(X); + + out->addDisk(O,r,Z.polar(false),Z.azimuth(false)); + +#endif + return true; +} + +bool drawTube::write(jsfile *out) +{ +#ifdef HAVE_LIBGLM + if(invisible) + return true; + + drawElement::centerIndex=0; + + setcolors(false,diffuse,emissive,specular,shininess,metallic,fresnel0,out); + + bbox3 b; + b.add(T*m); + b.add(T*triple(m.getx(),m.gety(),M.getz())); + b.add(T*triple(m.getx(),M.gety(),m.getz())); + b.add(T*triple(m.getx(),M.gety(),M.getz())); + b.add(T*triple(M.getx(),m.gety(),m.getz())); + b.add(T*triple(M.getx(),m.gety(),M.getz())); + b.add(T*triple(M.getx(),M.gety(),m.getz())); + b.add(T*M); + + out->addTube(g,width,b.Min(),b.Max(),core); + +#endif return true; } @@ -891,11 +937,11 @@ bool drawTriangles::write(prcfile *out, unsigned int *, double, groupsmap&) if(nC) { const RGBAColour white(1,1,1,opacity); const RGBAColour black(0,0,0,opacity); - const PRCmaterial m(black,white,black,specular,opacity,PRCshininess); + const PRCmaterial m(black,white,black,specular,opacity,shininess); out->addTriangles(nP,P,nI,PI,m,nN,N,NI,0,NULL,NULL,nC,C,CI,0,NULL,NULL,30); } else { RGBAColour Black(0.0,0.0,0.0,diffuse.A); - const PRCmaterial m(Black,diffuse,emissive,specular,opacity,PRCshininess); + const PRCmaterial m(Black,diffuse,emissive,specular,opacity,shininess); out->addTriangles(nP,P,nI,PI,m,nN,N,NI,0,NULL,NULL,0,NULL,NULL,0,NULL,NULL,30); } |