diff options
author | rodri <rgl@antares-labs.eu> | 2023-01-29 23:11:05 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2023-01-29 23:11:05 +0000 |
commit | a5c6374b77610cb2bcb794551475e092d990ef8b (patch) | |
tree | 9fc77cf42281a02fbc545afead9be30206b2bd32 /sys/include | |
parent | 08a080e8c2c775eda149d3e830bd4fad2c35f249 (diff) |
libgeometry revamp
Diffstat (limited to 'sys/include')
-rw-r--r-- | sys/include/geometry.h | 204 |
1 files changed, 126 insertions, 78 deletions
diff --git a/sys/include/geometry.h b/sys/include/geometry.h index 695518257..401ed2ae7 100644 --- a/sys/include/geometry.h +++ b/sys/include/geometry.h @@ -1,89 +1,137 @@ #pragma lib "libgeometry.a" #pragma src "/sys/src/libgeometry" -typedef double Matrix[4][4]; + +#define DEG 0.01745329251994330 /* π/180 */ + +typedef struct Point2 Point2; typedef struct Point3 Point3; +typedef double Matrix[3][3]; +typedef double Matrix3[4][4]; typedef struct Quaternion Quaternion; -typedef struct Space Space; -struct Point3{ +typedef struct RFrame RFrame; +typedef struct RFrame3 RFrame3; +typedef struct Triangle2 Triangle2; +typedef struct Triangle3 Triangle3; + +struct Point2 { + double x, y, w; +}; + +struct Point3 { double x, y, z, w; }; -struct Quaternion{ + +struct Quaternion { double r, i, j, k; }; -struct Space{ - Matrix t; - Matrix tinv; - Space *next; + +struct RFrame { + Point2 p; + Point2 bx, by; +}; + +struct RFrame3 { + Point3 p; + Point3 bx, by, bz; +}; + +struct Triangle2 +{ + Point2 p0, p1, p2; +}; + +struct Triangle3 { + Point3 p0, p1, p2; }; -/* - * 3-d point arithmetic - */ -Point3 add3(Point3 a, Point3 b); -Point3 sub3(Point3 a, Point3 b); -Point3 neg3(Point3 a); -Point3 div3(Point3 a, double b); -Point3 mul3(Point3 a, double b); -int eqpt3(Point3 p, Point3 q); -int closept3(Point3 p, Point3 q, double eps); -double dot3(Point3 p, Point3 q); -Point3 cross3(Point3 p, Point3 q); -double len3(Point3 p); -double dist3(Point3 p, Point3 q); -Point3 unit3(Point3 p); -Point3 midpt3(Point3 p, Point3 q); -Point3 lerp3(Point3 p, Point3 q, double alpha); -Point3 reflect3(Point3 p, Point3 p0, Point3 p1); -Point3 nearseg3(Point3 p0, Point3 p1, Point3 testp); -double pldist3(Point3 p, Point3 p0, Point3 p1); -double vdiv3(Point3 a, Point3 b); -Point3 vrem3(Point3 a, Point3 b); -Point3 pn2f3(Point3 p, Point3 n); -Point3 ppp2f3(Point3 p0, Point3 p1, Point3 p2); -Point3 fff2p3(Point3 f0, Point3 f1, Point3 f2); -Point3 pdiv4(Point3 a); -Point3 add4(Point3 a, Point3 b); -Point3 sub4(Point3 a, Point3 b); -/* - * Quaternion arithmetic - */ -void qtom(Matrix, Quaternion); -Quaternion mtoq(Matrix); -Quaternion qadd(Quaternion, Quaternion); -Quaternion qsub(Quaternion, Quaternion); -Quaternion qneg(Quaternion); -Quaternion qmul(Quaternion, Quaternion); -Quaternion qdiv(Quaternion, Quaternion); -Quaternion qunit(Quaternion); -Quaternion qinv(Quaternion); + +/* utils */ +double flerp(double, double, double); +double fclamp(double, double, double); + +/* Point2 */ +Point2 Pt2(double, double, double); +Point2 Vec2(double, double); +Point2 addpt2(Point2, Point2); +Point2 subpt2(Point2, Point2); +Point2 mulpt2(Point2, double); +Point2 divpt2(Point2, double); +Point2 lerp2(Point2, Point2, double); +double dotvec2(Point2, Point2); +double vec2len(Point2); +Point2 normvec2(Point2); +int edgeptcmp(Point2, Point2, Point2); +int ptinpoly(Point2, Point2*, ulong); + +/* Point3 */ +Point3 Pt3(double, double, double, double); +Point3 Vec3(double, double, double); +Point3 addpt3(Point3, Point3); +Point3 subpt3(Point3, Point3); +Point3 mulpt3(Point3, double); +Point3 divpt3(Point3, double); +Point3 lerp3(Point3, Point3, double); +double dotvec3(Point3, Point3); +Point3 crossvec3(Point3, Point3); +double vec3len(Point3); +Point3 normvec3(Point3); + +/* Matrix */ +void identity(Matrix); +void addm(Matrix, Matrix); +void subm(Matrix, Matrix); +void mulm(Matrix, Matrix); +void smulm(Matrix, double); +void transposem(Matrix); +double detm(Matrix); +double tracem(Matrix); +void adjm(Matrix); +void invm(Matrix); +Point2 xform(Point2, Matrix); + +/* Matrix3 */ +void identity3(Matrix3); +void addm3(Matrix3, Matrix3); +void subm3(Matrix3, Matrix3); +void mulm3(Matrix3, Matrix3); +void smulm3(Matrix3, double); +void transposem3(Matrix3); +double detm3(Matrix3); +double tracem3(Matrix3); +void adjm3(Matrix3); +void invm3(Matrix3); +Point3 xform3(Point3, Matrix3); + +/* Quaternion */ +Quaternion Quat(double, double, double, double); +Quaternion Quatvec(double, Point3); +Quaternion addq(Quaternion, Quaternion); +Quaternion subq(Quaternion, Quaternion); +Quaternion mulq(Quaternion, Quaternion); +Quaternion smulq(Quaternion, double); +Quaternion sdivq(Quaternion, double); +double dotq(Quaternion, Quaternion); +Quaternion invq(Quaternion); double qlen(Quaternion); +Quaternion normq(Quaternion); Quaternion slerp(Quaternion, Quaternion, double); -Quaternion qmid(Quaternion, Quaternion); -Quaternion qsqrt(Quaternion); -void qball(Rectangle, Mouse *, Quaternion *, void (*)(void), Quaternion *); -/* - * Matrix arithmetic - */ -void ident(Matrix); -void matmul(Matrix, Matrix); -void matmulr(Matrix, Matrix); -double determinant(Matrix); -void adjoint(Matrix, Matrix); -double invertmat(Matrix, Matrix); -/* - * Space stack routines - */ -Space *pushmat(Space *); -Space *popmat(Space *); -void rot(Space *, double, int); -void qrot(Space *, Quaternion); -void scale(Space *, double, double, double); -void move(Space *, double, double, double); -void xform(Space *, Matrix); -void ixform(Space *, Matrix, Matrix); -void look(Space *, Point3, Point3, Point3); -int persp(Space *, double, double, double); -void viewport(Space *, Rectangle, double); -Point3 xformpoint(Point3, Space *, Space *); -Point3 xformpointd(Point3, Space *, Space *); -Point3 xformplane(Point3, Space *, Space *); -#define radians(d) ((d)*.01745329251994329572) +Point3 qrotate(Point3, Point3, double); + +/* RFrame */ +Point2 rframexform(Point2, RFrame); +Point3 rframexform3(Point3, RFrame3); +Point2 invrframexform(Point2, RFrame); +Point3 invrframexform3(Point3, RFrame3); + +/* Triangle2 */ +Point2 centroid(Triangle2); +Point3 barycoords(Triangle2, Point2); + +/* Triangle3 */ +Point3 centroid3(Triangle3); + +/* Fmt */ +#pragma varargck type "v" Point2 +#pragma varargck type "V" Point3 +int vfmt(Fmt*); +int Vfmt(Fmt*); +void GEOMfmtinstall(void); |