added 3dengfx into the repo, probably not the correct version for this
[summerhack] / src / 3dengfx / src / 3dengfx / scfield.hpp
diff --git a/src/3dengfx/src/3dengfx/scfield.hpp b/src/3dengfx/src/3dengfx/scfield.hpp
new file mode 100644 (file)
index 0000000..8cafd8e
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+This file is part of the 3dengfx, realtime visualization system.
+
+Copyright (c) 2004, 2005 John Tsiombikas <nuclear@siggraph.org>
+
+3dengfx is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+3dengfx is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with 3dengfx; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+/* Scalar fields and polygonization
+ *
+ * Author: Mihalis Georgoulopoulos 2005
+ */
+
+#include <vector>
+#include "3dengfx/3denginefx_types.hpp"
+#include "n3dmath2/n3dmath2.hpp"
+#include "gfx/3dgeom.hpp"
+
+#ifndef _SCALAR_FIELD_HEADER_
+#define _SCALAR_FIELD_HEADER_
+
+class ScalarField
+{
+protected:
+       scalar_t *values;                                       // array that holds all values of the field
+       
+       unsigned int *edges_x, *edges_y, *edges_z;      // x- y- and z-aligned edges.
+                                                                                               // these arrays hold indices to the
+                                                                                               // vertex list, associated with the specific edge
+
+       unsigned int dimensions;                        // dimensions of the field
+       Vector3 from, to, cell_size;            // limits in space of the field
+
+       // Mesh storage
+       std::vector <Vertex> verts;
+       std::vector <Triangle> tris;
+
+       // Evaluators
+       scalar_t (*evaluate)(const Vector3 &vec, scalar_t t);
+       Vector3 (*get_normal)(const Vector3 &vec, scalar_t t);
+
+       // private methods
+       unsigned int add_vertex(const Vertex &vert);    // adds a vertex and returns its index
+       void clear();                           // clears the std::vectors that hold mesh data
+       void evaluate_all(scalar_t t);
+       void process_cell(int x, int y, int z, scalar_t isolevel);
+
+       unsigned int get_value_index(int x, int y, int z);
+       Vector3 def_eval_normals(const Vector3 &vec, scalar_t t);
+
+public:
+
+       // constructor
+       ScalarField();
+       ScalarField(unsigned int dimensions, const Vector3 &from, const Vector3 &to);
+       ~ScalarField();
+
+       void set_dimensions(unsigned int dimensions);
+       
+       // draw the 3d grid.
+       // if full, draws everything. If not, draws the bounding volume
+       void draw_field(bool full);
+
+       // Get / Set
+       void set_value(int x, int y, int z, scalar_t value);
+       scalar_t get_value(int x, int y, int z);
+
+       // get / set relative to cell
+       void set_value(int cx, int cy, int cz, int vert_index, scalar_t value);
+       scalar_t get_value(int cx, int cy, int cz, int vert_index);
+       
+       // edges are only addressed relative to a cell
+       void set_edge(int cx, int cy, int cz, int edge, unsigned int index);
+       unsigned int get_edge(int cx, int cy, int cz, int edge);
+
+       // Position in space
+       Vector3 get_position(int x, int y, int z);
+       Vector3 get_position(int cx, int cy, int cz, int vert_index);
+       void set_from_to(const Vector3 &from, const Vector3 &to);
+       Vector3 get_from();
+       Vector3 get_to();
+
+       // Evaluators
+       void set_evaluator(scalar_t (*evaluate)(const Vector3 &vec, scalar_t t));
+       void set_normal_evaluator(Vector3 (*get_normal)(const Vector3 &vec, scalar_t t));
+       
+       // last but not least 
+       void triangulate(TriMesh *mesh, scalar_t isolevel, scalar_t t, bool calc_normals);
+};
+
+#endif // ndef _SCALAR_FIELD_HEADER_