1*219b2ee8SDavid du Colombier #pragma lib "libgeometry.a" 2*219b2ee8SDavid du Colombier #pragma src "/sys/src/libgeometry" 3*219b2ee8SDavid du Colombier typedef double Matrix[4][4]; 4*219b2ee8SDavid du Colombier typedef struct Point3 Point3; 5*219b2ee8SDavid du Colombier typedef struct Quaternion Quaternion; 6*219b2ee8SDavid du Colombier typedef struct Space Space; 7*219b2ee8SDavid du Colombier struct Point3{ 8*219b2ee8SDavid du Colombier double x, y, z, w; 9*219b2ee8SDavid du Colombier }; 10*219b2ee8SDavid du Colombier struct Quaternion{ 11*219b2ee8SDavid du Colombier double r, i, j, k; 12*219b2ee8SDavid du Colombier }; 13*219b2ee8SDavid du Colombier struct Space{ 14*219b2ee8SDavid du Colombier Matrix t; 15*219b2ee8SDavid du Colombier Matrix tinv; 16*219b2ee8SDavid du Colombier Space *next; 17*219b2ee8SDavid du Colombier }; 18*219b2ee8SDavid du Colombier /* 19*219b2ee8SDavid du Colombier * 3-d point arithmetic 20*219b2ee8SDavid du Colombier */ 21*219b2ee8SDavid du Colombier Point3 add3(Point3 a, Point3 b); 22*219b2ee8SDavid du Colombier Point3 sub3(Point3 a, Point3 b); 23*219b2ee8SDavid du Colombier Point3 neg3(Point3 a); 24*219b2ee8SDavid du Colombier Point3 div3(Point3 a, double b); 25*219b2ee8SDavid du Colombier Point3 mul3(Point3 a, double b); 26*219b2ee8SDavid du Colombier int eqpt3(Point3 p, Point3 q); 27*219b2ee8SDavid du Colombier int closept3(Point3 p, Point3 q, double eps); 28*219b2ee8SDavid du Colombier double dot3(Point3 p, Point3 q); 29*219b2ee8SDavid du Colombier Point3 cross3(Point3 p, Point3 q); 30*219b2ee8SDavid du Colombier double len3(Point3 p); 31*219b2ee8SDavid du Colombier double dist3(Point3 p, Point3 q); 32*219b2ee8SDavid du Colombier Point3 unit3(Point3 p); 33*219b2ee8SDavid du Colombier Point3 midpt3(Point3 p, Point3 q); 34*219b2ee8SDavid du Colombier Point3 lerp3(Point3 p, Point3 q, double alpha); 35*219b2ee8SDavid du Colombier Point3 reflect3(Point3 p, Point3 p0, Point3 p1); 36*219b2ee8SDavid du Colombier Point3 nearseg3(Point3 p0, Point3 p1, Point3 testp); 37*219b2ee8SDavid du Colombier double pldist3(Point3 p, Point3 p0, Point3 p1); 38*219b2ee8SDavid du Colombier double vdiv3(Point3 a, Point3 b); 39*219b2ee8SDavid du Colombier Point3 vrem3(Point3 a, Point3 b); 40*219b2ee8SDavid du Colombier Point3 pn2f3(Point3 p, Point3 n); 41*219b2ee8SDavid du Colombier Point3 ppp2f3(Point3 p0, Point3 p1, Point3 p2); 42*219b2ee8SDavid du Colombier Point3 fff2p3(Point3 f0, Point3 f1, Point3 f2); 43*219b2ee8SDavid du Colombier Point3 pdiv4(Point3 a); 44*219b2ee8SDavid du Colombier Point3 add4(Point3 a, Point3 b); 45*219b2ee8SDavid du Colombier Point3 sub4(Point3 a, Point3 b); 46*219b2ee8SDavid du Colombier /* 47*219b2ee8SDavid du Colombier * Quaternion arithmetic 48*219b2ee8SDavid du Colombier */ 49*219b2ee8SDavid du Colombier void qtom(Matrix, Quaternion); 50*219b2ee8SDavid du Colombier Quaternion mtoq(Matrix); 51*219b2ee8SDavid du Colombier Quaternion qadd(Quaternion, Quaternion); 52*219b2ee8SDavid du Colombier Quaternion qsub(Quaternion, Quaternion); 53*219b2ee8SDavid du Colombier Quaternion qneg(Quaternion); 54*219b2ee8SDavid du Colombier Quaternion qmul(Quaternion, Quaternion); 55*219b2ee8SDavid du Colombier Quaternion qdiv(Quaternion, Quaternion); 56*219b2ee8SDavid du Colombier Quaternion qunit(Quaternion); 57*219b2ee8SDavid du Colombier Quaternion qinv(Quaternion); 58*219b2ee8SDavid du Colombier double qlen(Quaternion); 59*219b2ee8SDavid du Colombier Quaternion slerp(Quaternion, Quaternion, double); 60*219b2ee8SDavid du Colombier Quaternion qmid(Quaternion, Quaternion); 61*219b2ee8SDavid du Colombier Quaternion qsqrt(Quaternion); 62*219b2ee8SDavid du Colombier void qball(Rectangle, Mouse *, Quaternion *, void (*)(void), Quaternion *); 63*219b2ee8SDavid du Colombier /* 64*219b2ee8SDavid du Colombier * Matrix arithmetic 65*219b2ee8SDavid du Colombier */ 66*219b2ee8SDavid du Colombier void ident(Matrix); 67*219b2ee8SDavid du Colombier void matmul(Matrix, Matrix); 68*219b2ee8SDavid du Colombier void matmulr(Matrix, Matrix); 69*219b2ee8SDavid du Colombier double determinant(Matrix); 70*219b2ee8SDavid du Colombier void adjoint(Matrix, Matrix); 71*219b2ee8SDavid du Colombier double invertmat(Matrix, Matrix); 72*219b2ee8SDavid du Colombier /* 73*219b2ee8SDavid du Colombier * Space stack routines 74*219b2ee8SDavid du Colombier */ 75*219b2ee8SDavid du Colombier Space *pushmat(Space *); 76*219b2ee8SDavid du Colombier Space *popmat(Space *); 77*219b2ee8SDavid du Colombier void rot(Space *, double, int); 78*219b2ee8SDavid du Colombier void qrot(Space *, Quaternion); 79*219b2ee8SDavid du Colombier void scale(Space *, double, double, double); 80*219b2ee8SDavid du Colombier void move(Space *, double, double, double); 81*219b2ee8SDavid du Colombier void xform(Space *, Matrix); 82*219b2ee8SDavid du Colombier void ixform(Space *, Matrix, Matrix); 83*219b2ee8SDavid du Colombier void look(Space *, Point3, Point3, Point3); 84*219b2ee8SDavid du Colombier int persp(Space *, double, double, double); 85*219b2ee8SDavid du Colombier void viewport(Space *, Rectangle, double); 86*219b2ee8SDavid du Colombier Point3 xformpoint(Point3, Space *, Space *); 87*219b2ee8SDavid du Colombier Point3 xformpointd(Point3, Space *, Space *); 88*219b2ee8SDavid du Colombier Point3 xformplane(Point3, Space *, Space *); 89*219b2ee8SDavid du Colombier #define radians(d) ((d)*.01745329251994329572) 90