summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/drawsurface.cc
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2020-03-03 22:35:09 +0000
committerKarl Berry <karl@freefriends.org>2020-03-03 22:35:09 +0000
commitf6bb2b5974c9dc15a4530842100d30fe1981b973 (patch)
tree62ef95efa54d91b6eafb6df99f330dc136f77f29 /Build/source/utils/asymptote/drawsurface.cc
parent24dbc0b1802756862bedad6a4088f50aad68b51b (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.cc204
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);
}