00001
00002
00003
00004 #ifndef Facearray_H
00005 #define Facearray_H
00006
00007 #include <stdio.h>
00008 #include "face.h"
00009 #include "nodearray.h"
00010 #include "edgearray.h"
00011 #include "geometryreplicator.h"
00012
00013 #ifdef __APPLE__
00014 #include <OpenGL/gl.h>
00015 #else
00016 #include <GL/gl.h>
00017 #endif // __APPLE__
00018
00019 class NodeArray;
00020 class EdgeArray;
00021 class Object;
00022
00023 class FaceArray
00024 {
00025 private:
00026 int numfaces, maxfaces;
00027 Face* *faces;
00028
00029
00030 NodeArray* nodearray_p;
00031 EdgeArray* edgearray_p;
00032
00033 public:
00034 FaceArray(NodeArray* nodearray_p_in, EdgeArray* edgearray_p_in);
00035 ~FaceArray();
00036 static const char* rcsid;
00037 static int debug;
00038 NodeArray* getNodeArray();
00039
00040
00041 void reset(void);
00042 int getMeshFaceData(FILE *meshfile);
00043 int getSMFFaceData(FILE *meshfile);
00044 int getOBJFaceData(FILE *meshfile);
00045 void SaveMeshFaceData(ostream& os);
00046 void SaveSMFFaceData(ostream& os);
00047 void SaveVRMLFaceData(ostream& os);
00048 void SaveSTLFaceData(ostream& os);
00049 int getNumFaces();
00050 Face* getFace(int i);
00051 Face* getFace(Edge* e, Node* n);
00052 int getIndex(Face* f);
00053 Object* getObject();
00054 double getVolume();
00055 double getExactZVolume(int Num_Face_Surface);
00056 double getSurfaceArea();
00057 friend ostream& operator<<(ostream& os, const FaceArray& fa);
00058
00059
00060 void allocateFaces(int i);
00061 int addFace();
00062 int addFace(int i1, int i2, int i3);
00063
00064
00065 void DrawFaces(int do_texture);
00066 void drawlabels(float offset);
00067 void drawnormals();
00068 void drawmarkers();
00069 void computeIsobarys();
00070 void computeNormals(void);
00071 void DeleteFace(int index);
00072 void DeleteFace(Face *f);
00073 void EraseFace(Face *f);
00074 void EraseFacesOfColor(int color);
00075 void DeleteAllFaces();
00076 void WriteDXF(ostream& os);
00077 Node* subdivideFace(Face *initial_p, Node* node_S, Face* *t1_p = NULL,
00078 Face* *t2_p = NULL, Face* *t3_p = NULL);
00079 Node* subdivideFace(Face *initial_p, Point3D S, Face* *t1_p = NULL,
00080 Face* *t2_p = NULL, Face* *t3_p = NULL);
00081 Face* unSubdivideFace(Node* n_in);
00082 void SanityCheck(NodeArray* real_na_p, EdgeArray* real_ea_p);
00083 void Cleanup();
00084 double DistanceToNearestFace(Point3D p);
00085 Face* ClosestFaceToPoint(Point3D pt);
00086 void ReorderFacesBasedOnViewingMatrix(double* model, double* proj,
00087 GLint* view);
00088 void GeometryReplicate(GeometryReplicator* gr);
00089 };
00090
00091 inline int FaceArray::getNumFaces()
00092 { return (numfaces); }
00093
00094 inline Face* FaceArray::getFace(int i)
00095 { if ((i < 0) || (i >= getNumFaces())) return(NULL);
00096 else return (faces[i]);
00097 }
00098
00099 inline Object* FaceArray::getObject()
00100 { return (nodearray_p->getObject()); }
00101
00102 inline NodeArray* FaceArray::getNodeArray()
00103 { return (nodearray_p); }
00104
00105 #endif