summaryrefslogtreecommitdiff
path: root/graphics/asymptote/drawsurface.h
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-08-07 03:02:55 +0000
committerNorbert Preining <norbert@preining.info>2020-08-07 03:02:55 +0000
commit3710c23789342d9d88783cbe9ad23eb5263a7c33 (patch)
tree1c40b2bfb9f6b652f7877ad0991f5d6b44391154 /graphics/asymptote/drawsurface.h
parentd99fea72e367e8d4d2809b43b3b0206b1bb526b8 (diff)
CTAN sync 202008070302
Diffstat (limited to 'graphics/asymptote/drawsurface.h')
-rw-r--r--graphics/asymptote/drawsurface.h228
1 files changed, 114 insertions, 114 deletions
diff --git a/graphics/asymptote/drawsurface.h b/graphics/asymptote/drawsurface.h
index 3b0ba2de83..9a8010a8d0 100644
--- a/graphics/asymptote/drawsurface.h
+++ b/graphics/asymptote/drawsurface.h
@@ -23,7 +23,7 @@ namespace camp {
#ifdef HAVE_LIBGLM
void storecolor(GLfloat *colors, int i, const vm::array &pens, int j);
-#endif
+#endif
class drawSurface : public drawElement {
protected:
@@ -42,23 +42,23 @@ protected:
bool invisible;
Interaction interaction;
bool billboard;
- size_t centerIndex;
-
+ size_t centerIndex;
+
triple Min,Max;
int digits;
bool primitive;
-
+
public:
#ifdef HAVE_GL
BezierCurve C;
bool transparent;
-#endif
-
+#endif
+
string wrongsize() {
return (ncontrols == 16 ? "4x4" : "triangular")+
string(" array of triples and array of 4 pens required");
}
-
+
void init() {
#ifdef HAVE_LIBOSMESA
billboard=false;
@@ -67,7 +67,7 @@ public:
#endif
centerIndex=0;
}
-
+
drawSurface(const vm::array& g, size_t ncontrols, triple center,
bool straight, const vm::array&p, double opacity,
double shininess, double metallic, double fresnel0,
@@ -80,7 +80,7 @@ public:
init();
if(checkArray(&g) != 4 || checkArray(&p) != 3)
reportError(wrongsize());
-
+
size_t k=0;
controls=new(UseGC) triple[ncontrols];
for(unsigned int i=0; i < 4; ++i) {
@@ -91,24 +91,24 @@ public:
for(unsigned int j=0; j < n; ++j)
controls[k++]=vm::read<triple>(gi,j);
}
-
+
pen surfacepen=vm::read<camp::pen>(p,0);
invisible=surfacepen.invisible();
-
+
diffuse=rgba(surfacepen);
emissive=rgba(vm::read<camp::pen>(p,1));
specular=rgba(vm::read<camp::pen>(p,2));
-
+
size_t nodes=(ncontrols == 16 ? 4 : 3);
size_t size=checkArray(&pens);
if(size > 0) {
if(size != nodes) reportError("one vertex pen required per node");
colors=new(UseGC) prc::RGBAColour[nodes];
for(size_t i=0; i < nodes; ++i)
- colors[i]=rgba(vm::read<camp::pen>(pens,i));
+ colors[i]=rgba(vm::read<camp::pen>(pens,i));
} else colors=NULL;
}
-
+
drawSurface(const double* t, const drawSurface *s) :
drawElement(s->KEY), ncontrols(s->ncontrols), straight(s->straight),
diffuse(s->diffuse), emissive(s->emissive), specular(s->specular),
@@ -121,83 +121,83 @@ public:
for(unsigned int i=0; i < ncontrols; ++i)
controls[i]=t*s->controls[i];
} else controls=NULL;
-
+
center=t*s->center;
}
-
+
virtual ~drawSurface() {}
bool is3D() {return true;}
};
-
+
class drawBezierPatch : public drawSurface {
-public:
+public:
#ifdef HAVE_GL
BezierPatch S;
-#endif
-
+#endif
+
drawBezierPatch(const vm::array& g, triple center, bool straight,
- const vm::array&p, double opacity, double shininess,
- double metallic, double fresnel0, const vm::array &pens,
+ const vm::array&p, double opacity, double shininess,
+ double metallic, double fresnel0, const vm::array &pens,
Interaction interaction, int digits, bool primitive) :
drawSurface(g,16,center,straight,p,opacity,shininess,metallic,fresnel0,
pens,interaction,digits,primitive) {}
drawBezierPatch(const double* t, const drawBezierPatch *s) :
drawSurface(t,s) {}
-
+
void bounds(const double* t, bbox3& b);
-
+
void ratio(const double* t, pair &b, double (*m)(double, double),
double fuzz, bool &first);
-
+
void meshinit() {
if(billboard)
centerIndex=centerindex(center);
}
-
+
bool write(prcfile *out, unsigned int *, double, groupsmap&);
bool write(jsfile *out);
-
+
void render(double, const triple& b, const triple& B,
double perspective, bool remesh);
drawElement *transformed(const double* t);
};
-
+
class drawBezierTriangle : public drawSurface {
public:
#ifdef HAVE_GL
BezierTriangle S;
-#endif
-
+#endif
+
drawBezierTriangle(const vm::array& g, triple center, bool straight,
const vm::array&p, double opacity, double shininess,
double metallic, double fresnel0, const vm::array &pens,
Interaction interaction, int digits, bool primitive) :
drawSurface(g,10,center,straight,p,opacity,shininess,metallic,fresnel0,
pens,interaction,digits,primitive) {}
-
+
drawBezierTriangle(const double* t, const drawBezierTriangle *s) :
drawSurface(t,s) {}
-
+
void bounds(const double* t, bbox3& b);
-
+
void ratio(const double* t, pair &b, double (*m)(double, double),
double fuzz, bool &first);
-
+
void meshinit() {
if(billboard)
centerIndex=centerindex(center);
}
-
+
bool write(prcfile *out, unsigned int *, double, groupsmap&);
bool write(jsfile *out);
-
+
void render(double, const triple& b, const triple& B,
double perspective, bool remesh);
drawElement *transformed(const double* t);
};
-
+
class drawNurbs : public drawElement {
protected:
size_t udegree,vdegree;
@@ -214,16 +214,16 @@ protected:
double fresnel0;
triple normal;
bool invisible;
-
+
triple Min,Max;
-
+
#ifdef HAVE_LIBGLM
GLfloat *colors;
GLfloat *Controls;
GLfloat *uKnots;
GLfloat *vKnots;
-#endif
-
+#endif
+
public:
drawNurbs(const vm::array& g, const vm::array* uknot, const vm::array* vknot,
const vm::array* weight, const vm::array&p, double opacity,
@@ -232,59 +232,59 @@ public:
: drawElement(key), opacity(opacity), shininess(shininess),
metallic(metallic), fresnel0(fresnel0) {
size_t weightsize=checkArray(weight);
-
+
const string wrongsize="Inconsistent NURBS data";
nu=checkArray(&g);
-
+
if(nu == 0 || (weightsize != 0 && weightsize != nu) || checkArray(&p) != 3)
reportError(wrongsize);
-
+
vm::array *g0=vm::read<vm::array*>(g,0);
nv=checkArray(g0);
-
+
size_t n=nu*nv;
controls=new(UseGC) triple[n];
-
+
size_t k=0;
for(size_t i=0; i < nu; ++i) {
vm::array *gi=vm::read<vm::array*>(g,i);
- if(checkArray(gi) != nv)
+ if(checkArray(gi) != nv)
reportError(wrongsize);
for(size_t j=0; j < nv; ++j)
controls[k++]=vm::read<triple>(gi,j);
}
-
+
if(weightsize > 0) {
size_t k=0;
weights=new(UseGC) double[n];
for(size_t i=0; i < nu; ++i) {
vm::array *weighti=vm::read<vm::array*>(weight,i);
- if(checkArray(weighti) != nv)
+ if(checkArray(weighti) != nv)
reportError(wrongsize);
for(size_t j=0; j < nv; ++j)
weights[k++]=vm::read<double>(weighti,j);
}
} else weights=NULL;
-
+
size_t nuknots=checkArray(uknot);
size_t nvknots=checkArray(vknot);
-
+
if(nuknots <= nu+1 || nuknots > 2*nu || nvknots <= nv+1 || nvknots > 2*nv)
reportError(wrongsize);
udegree=nuknots-nu-1;
vdegree=nvknots-nv-1;
-
+
run::copyArrayC(uknots,uknot,0,UseGC);
run::copyArrayC(vknots,vknot,0,UseGC);
-
+
pen surfacepen=vm::read<camp::pen>(p,0);
invisible=surfacepen.invisible();
-
+
diffuse=rgba(surfacepen);
emissive=rgba(vm::read<camp::pen>(p,1));
specular=rgba(vm::read<camp::pen>(p,2));
-
+
#ifdef HAVE_LIBGLM
Controls=NULL;
int size=checkArray(&pens);
@@ -296,45 +296,45 @@ public:
storecolor(colors,12,pens,2);
storecolor(colors,4,pens,3);
} else colors=NULL;
-#endif
+#endif
}
-
+
drawNurbs(const double* t, const drawNurbs *s) :
drawElement(s->KEY), udegree(s->udegree), vdegree(s->vdegree), nu(s->nu),
nv(s->nv), weights(s->weights), uknots(s->uknots), vknots(s->vknots),
diffuse(s->diffuse),
emissive(s->emissive), specular(s->specular), opacity(s->opacity),
shininess(s->shininess), invisible(s->invisible) {
-
+
const size_t n=nu*nv;
controls=new(UseGC) triple[n];
for(unsigned int i=0; i < n; ++i)
controls[i]=t*s->controls[i];
-
+
#ifdef HAVE_LIBGLM
Controls=NULL;
colors=s->colors;
-#endif
+#endif
}
-
+
bool is3D() {return true;}
-
+
void bounds(const double* t, bbox3& b);
-
+
virtual ~drawNurbs() {}
bool write(prcfile *out, unsigned int *, double, groupsmap&);
-
+
void displacement();
void ratio(const double* t, pair &b, double (*m)(double, double), double,
bool &first);
void render(double size2, const triple& b, const triple& B,
double perspective, bool remesh);
-
+
drawElement *transformed(const double* t);
};
-
+
// Draw a transformed PRC object.
class drawPRC : public drawElementLC {
protected:
@@ -350,36 +350,36 @@ public:
void init(const vm::array&p) {
if(checkArray(&p) != 3)
reportError(need3pens);
-
+
pen surfacepen=vm::read<camp::pen>(p,0);
invisible=surfacepen.invisible();
-
+
diffuse=rgba(surfacepen);
emissive=rgba(vm::read<camp::pen>(p,1));
specular=rgba(vm::read<camp::pen>(p,2));
}
-
+
drawPRC(const vm::array& t, const vm::array&p, double opacity,
double shininess, double metallic, double fresnel0) :
drawElementLC(t), opacity(opacity), shininess(shininess),
metallic(metallic), fresnel0(fresnel0) {
init(p);
}
-
+
drawPRC(const vm::array&p, double opacity,
double shininess, double metallic, double fresnel0) :
drawElementLC(NULL), opacity(opacity), shininess(shininess),
metallic(metallic), fresnel0(fresnel0) {
init(p);
}
-
+
drawPRC(const double* t, const drawPRC *s) :
drawElementLC(t,s), diffuse(s->diffuse),
emissive(s->emissive), specular(s->specular), opacity(s->opacity),
shininess(s->shininess), metallic(s->metallic), fresnel0(s->fresnel0),
invisible(s->invisible) {
}
-
+
virtual void P(triple& t, double x, double y, double z);
virtual bool write(prcfile *out, unsigned int *, double, groupsmap&) {
@@ -393,7 +393,7 @@ public:
double (*)(double, double), double, bool&) {}
};
-
+
// Output a unit sphere primitive.
class drawSphere : public drawPRC {
bool half;
@@ -405,17 +405,17 @@ public:
drawSphere(const double* t, const drawSphere *s) :
drawElement(s->KEY), drawPRC(t,s), half(s->half), type(s->type) {}
-
+
void P(triple& t, double x, double y, double z);
-
+
bool write(prcfile *out, unsigned int *, double, groupsmap&);
bool write(jsfile *out);
-
+
drawElement *transformed(const double* t) {
return new drawSphere(t,this);
}
};
-
+
// Output a unit cylinder primitive.
class drawCylinder : public drawPRC {
bool core;
@@ -427,15 +427,15 @@ public:
drawCylinder(const double* t, const drawCylinder *s) :
drawPRC(t,s), core(s->core) {}
-
+
bool write(prcfile *out, unsigned int *, double, groupsmap&);
bool write(jsfile *out);
-
+
drawElement *transformed(const double* t) {
return new drawCylinder(t,this);
}
};
-
+
// Draw a unit disk.
class drawDisk : public drawPRC {
public:
@@ -445,15 +445,15 @@ public:
drawDisk(const double* t, const drawDisk *s) :
drawPRC(t,s) {}
-
+
bool write(prcfile *out, unsigned int *, double, groupsmap&);
bool write(jsfile *out);
-
+
drawElement *transformed(const double* t) {
return new drawDisk(t,this);
}
};
-
+
// Draw a tube.
class drawTube : public drawPRC {
protected:
@@ -474,7 +474,7 @@ public:
for(size_t i=0; i < 4; ++i)
g[i]=vm::read<triple>(G,i);
}
-
+
drawTube(const double* t, const drawTube *s) :
drawElement(s->KEY), drawPRC(t,s), width(s->width), m(s->m), M(s->M),
core(s->core) {
@@ -482,7 +482,7 @@ public:
for(size_t i=0; i < 4; ++i)
g[i]=t*s->g[i];
}
-
+
bool write(jsfile *out);
drawElement *transformed(const double* t) {
@@ -490,14 +490,14 @@ public:
}
};
-
+
class drawBaseTriangles : public drawElement {
protected:
#ifdef HAVE_GL
Triangles R;
bool transparent;
-#endif
-
+#endif
+
size_t nP;
triple* P;
size_t nN;
@@ -506,12 +506,12 @@ protected:
size_t Ni;
uint32_t (*PI)[3];
uint32_t (*NI)[3];
-
+
triple Min,Max;
static const string wrongsize;
static const string outofrange;
-
+
public:
drawBaseTriangles(const vm::array& v, const vm::array& vi,
const vm::array& n, const vm::array& ni) {
@@ -519,7 +519,7 @@ public:
P=new(UseGC) triple[nP];
for(size_t i=0; i < nP; ++i)
P[i]=vm::read<triple>(v,i);
-
+
nI=checkArray(&vi);
PI=new(UseGC) uint32_t[nI][3];
for(size_t i=0; i < nI; ++i) {
@@ -532,13 +532,13 @@ public:
PIi[j]=index;
}
}
-
+
nN=checkArray(&n);
if(nN) {
N=new(UseGC) triple[nN];
for(size_t i=0; i < nN; ++i)
N[i]=vm::read<triple>(n,i);
-
+
Ni=checkArray(&ni);
if(Ni == 0 && nN == nP)
NI=PI;
@@ -565,7 +565,7 @@ public:
P=new(UseGC) triple[nP];
for(size_t i=0; i < nP; i++)
P[i]=t*s->P[i];
-
+
PI=new(UseGC) uint32_t[nI][3];
for(size_t i=0; i < nI; ++i) {
uint32_t *PIi=PI[i];
@@ -601,27 +601,27 @@ public:
}
}
}
-
+
bool is3D() {return true;}
-
+
void bounds(const double* t, bbox3& b);
-
+
void ratio(const double* t, pair &b, double (*m)(double, double),
double fuzz, bool &first);
-
+
virtual ~drawBaseTriangles() {}
-
+
drawElement *transformed(const double* t) {
return new drawBaseTriangles(t,this);
}
};
-
+
class drawTriangles : public drawBaseTriangles {
size_t nC;
prc::RGBAColour*C;
uint32_t (*CI)[3];
size_t Ci;
-
+
// Asymptote material data
prc::RGBAColour diffuse;
prc::RGBAColour emissive;
@@ -631,7 +631,7 @@ class drawTriangles : public drawBaseTriangles {
double metallic;
double fresnel0;
bool invisible;
-
+
public:
drawTriangles(const vm::array& v, const vm::array& vi,
const vm::array& n, const vm::array& ni,
@@ -643,19 +643,19 @@ public:
if(checkArray(&p) != 3)
reportError(need3pens);
-
+
const pen surfacepen=vm::read<camp::pen>(p,0);
invisible=surfacepen.invisible();
diffuse=rgba(surfacepen);
-
+
nC=checkArray(&c);
if(nC) {
C=new(UseGC) prc::RGBAColour[nC];
for(size_t i=0; i < nC; ++i)
C[i]=rgba(vm::read<camp::pen>(c,i));
-
+
size_t nI=checkArray(&vi);
-
+
Ci=checkArray(&ci);
if(Ci == 0 && nC == nP)
CI=PI;
@@ -679,18 +679,18 @@ public:
}
specular=rgba(vm::read<camp::pen>(p,2));
}
-
+
drawTriangles(const double* t, const drawTriangles *s) :
drawBaseTriangles(t,s), nC(s->nC),
diffuse(s->diffuse), emissive(s->emissive),
- specular(s->specular), opacity(s->opacity), shininess(s->shininess),
+ specular(s->specular), opacity(s->opacity), shininess(s->shininess),
metallic(s->metallic), fresnel0(s->fresnel0), invisible(s->invisible) {
-
+
if(nC) {
C=new(UseGC) prc::RGBAColour[nC];
for(size_t i=0; i < nC; ++i)
C[i]=s->C[i];
-
+
CI=new(UseGC) uint32_t[nI][3];
for(size_t i=0; i < nI; ++i) {
uint32_t *CIi=CI[i];
@@ -700,15 +700,15 @@ public:
}
}
}
-
+
virtual ~drawTriangles() {}
-
+
void render(double size2, const triple& b, const triple& B,
double perspective, bool remesh);
-
+
bool write(prcfile *out, unsigned int *, double, groupsmap&);
bool write(jsfile *out);
-
+
drawElement *transformed(const double* t) {
return new drawTriangles(t,this);
}