/* ---------------------------------------------------------------------- *
 * begin common part
 * ---------------------------------------------------------------------- */
#define PI 3.14159265358979323846

#define PHI             1.6180339887
#define PHYLLOTAXIS     (2 * PI * (PHI - 1) / PHI)
#define PHYLLOTAXIS360  (360 * (PHI - 1) / PHI)

void randomSeed(unsigned int seed);
void randomizeByTime(void);
double randomInRange(double min, double max);

double radians(double deg);

void strokeWeight(double w);
void stroke(unsigned int color);
void strokeOpacity(double opacity);
void noStroke(void);
void fill(unsigned int color);
void fillOpacity(double opacity);
void noFill(void);
void textFont(char* font, double size);

int hsb1(double h, double s, double v);
int hsb100(double h, double s, double v);
int hsb360(double h, double s, double v);
int hsb255(double h, double s, double v);

int hsl1(double h, double s, double v);
int hsl100(double h, double s, double v);
int hsl360(double h, double s, double v);
int hsl255(double h, double s, double v);

int rgb1(double h, double s, double v);
int rgb100(double h, double s, double v);
int rgb255(double h, double s, double v);

int bw1(double v);
int bw100(double v);
int bw255(double v);

int rotateH360(int color, double a);
int rotateH(int color);
int addS100(int color, double a);
int scaleS(int color, double a);
int addB100(int color, double a);
int scaleB(int color, double a);

double cos360(double deg);
double sin360(double deg);

/* ---------------------------------------------------------------------- *
 * end common part
 * ---------------------------------------------------------------------- */

void printVector(double v[3]);
void thickness(double t);
void start();
void resetMatrix();
void finish();

// 3D primitives
void box(double width, double height, double depth);
void sphere(double radius);
void cone(double radius, double height);
void nonuniformCylinder(double radius, double height, double topRadius);
void cylinder(double radius, double height);
void line(double x1, double y1, double z1, double x2, double y2, double z2);
void triangle(double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3);
void point(double x, double y, double z);

// Transforms
void applyMatrix(double n00, double n01, double n02, double n03
                , double n10, double n11, double n12, double n13
                , double n20, double n21, double n22, double n23
                , double n30, double n31, double n32, double n33);
void pushMatrix();
void popMatrix();
void scale(double x, double y, double z);
void translate(double x, double y, double z);
void rotate(double angle);
void rotateX(double angle);
void rotateY(double angle);
void rotateZ(double angle);

// Images
void imageBB(char* url, double x, double y, double z, double w, double h); // with Bounding Box
void image(char* url, double x, double y, double z);
void imageO(char* url);
void objectBB(char* url, double x, double y, double z, double w, double h, double d); // with Bounding Box
void object(char* url, double x, double y, double z);
void objectO(char* url);

// Text
void text(char* data, double x, double y, double z, ...);
void textO(char* data, ...);

// Curves
void curve(double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3, double x4, double y4, double z4);void bezier(double x1, double y1, double z1, double cx1, double cy1, double cz1, double cx2, double cy2, double cz2, double x2, double y2, double z2);

// Vertex
void beginShape();
void endShape(int close);

void vertex(double x, double y, double z);
void qbezierVertex(double cx, double cy, double cz, double x, double y, double z);
void bezierVertex(double cx1, double cy1, double cz1, double cx2, double cy2, double cz2, double x, double y, double z);
void curveVertex(double x, double y, double z);

// 2D Shapes
void begin2DShape();
void vertex2D(double x, double y);
void qbezierVertex2D(double cx, double cy, double x, double y);
void bezierVertex2D(double cx1, double cy1, double cx2, double cy2, double x, double y);
void curveVertex2D(double x, double y);
void end2DShape();

void rect(double x, double y, double w, double h);
void roundRect(double x, double y, double w, double h, double rw, double rh);
void ellipse(double x, double y, double w, double h);
