--- /dev/null
+/**
+ * Copyright (c) 2002 Jamie Zawinski <jwz@jwz.org>
+ * Copyright (c) 2009 Andy Spencer <andy753421@gmail.com>
+ *
+ * Utility functions to create "marching cubes" meshes from 3d fields.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __MARCHING_H__
+#define __MARCHING_H__
+
+typedef struct {
+ double x;
+ double y;
+ double z;
+} XYZ;
+
+typedef struct {
+ XYZ p[3];
+} TRIANGLE;
+
+typedef struct {
+ XYZ p[8];
+ double val[8];
+} GRIDCELL;
+
+int march_one_cube(GRIDCELL grid, double isolevel, TRIANGLE *triangles);
+
+void do_function_normal (double x, double y, double z,
+ double (*compute_fn) (double x, double y, double z,
+ void *closure),
+ void *c);
+
+XYZ calc_normal (XYZ p, XYZ p1, XYZ p2);
+
+void do_normal(float x1, float y1, float z1,
+ float x2, float y2, float z2,
+ float x3, float y3, float z3);
+
+
+/* Given a function capable of generating a value at any XYZ position,
+ creates OpenGL faces for the solids defined.
+
+ init_fn is called at the beginning for initial, and returns an object.
+ free_fn is called at the end.
+
+ compute_fn is called for each XYZ in the specified grid, and returns
+ the double value of that coordinate. If smoothing is on, then
+ compute_fn will also be called twice more for each emitted vertex,
+ in order to calculate vertex normals (so don't assume it will only
+ be called with values falling on the grid boundaries.)
+
+ Points are inside an object if the are less than `isolevel', and
+ outside otherwise.
+
+ If polygon_count is specified, the number of faces generated will be
+ returned there.
+*/
+extern void
+marching_cubes (int grid_size, /* density of the mesh */
+ double isolevel, /* cutoff point for "in" versus "out" */
+ int wireframe_p, /* wireframe, or solid */
+ int smooth_p, /* smooth, or faceted */
+
+ void * (*init_fn) (double grid_size, void *closure1),
+ double (*compute_fn) (double x, double y, double z,
+ void *closure2),
+ void (*free_fn) (void *closure2),
+ void *closure1,
+
+ unsigned long *polygon_count);
+
+#endif /* __MARCHING_H__ */