cgm_vec3 pt, norm;
};
+struct vertex {
+ cgm_vec3 pos, norm;
+ cgm_vec2 uv;
+};
+
+struct poly {
+ struct vertex *verts; /* dynarr */
+};
+
float plane_dist(const struct plane *p, const cgm_vec3 *pt);
float plane_sdist(const struct plane *p, const cgm_vec3 *pt);
-void midplane(struct plane *p, const cgm_vec3 *a, const cgm_vec3 *b);
+void midplane(struct plane *p, const cgm_vec3 *a, const cgm_vec3 *b, float offs);
+
+void poly_plane(const struct poly *poly, struct plane *plane);
+int plane_poly(const struct plane *plane, struct poly *poly, float size);
+
+/* returns negative if there's no intersection, parametric distance if there is */
+float ray_plane(const cgm_ray *ray, const struct plane *plane);
+float ray_poly(const cgm_ray *ray, const struct poly *poly);
+
+int init_poly(struct poly *p);
+void destroy_poly(struct poly *p);
+int clip_poly(struct poly *pout, const struct poly *pin, const struct plane *plane);
+
+int poly_poly(const struct poly *p1, const struct poly *p2);
#endif /* GEOM_H_ */