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