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