00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "GU_API.h"
00023 #include <UT/UT_Vector3.h>
00024 #include <UT/UT_Assert.h>
00025 #include <GEO/GEO_Point.h>
00026
00027 class GEO_Vertex;
00028 class GU_Detail;
00029 class GU_PrimPoly;
00030 class UT_BoundingBox;
00031
00032 class GU_API ISO_Corner {
00033 public:
00034 ISO_Corner()
00035 {
00036 myUserData = 0;
00037 myGdp = 0;
00038 myEdge[0] = myEdge[1] = myEdge[2] = 0;
00039 }
00040 ~ISO_Corner()
00041 {
00042 UT_ASSERT(!myUserData);
00043 freeVertexData();
00044 }
00045
00046 void setDetail(GU_Detail *gdp);
00047 void freeVertexData();
00048 void clearPoints();
00049 GEO_Vertex *getEdge(int idx)
00050 {
00051 if (!myEdge[0])
00052 allocateVertices();
00053 return myEdge[idx];
00054 }
00055
00056 GU_Detail *myGdp;
00057 void *myUserData;
00058 UT_Vector3 myPos;
00059 fpreal myDensity;
00060 bool isInside;
00061 private:
00062 void allocateVertices();
00063 GEO_Vertex *myEdge[3];
00064 };
00065
00066
00067 typedef float (*GU_IsoCallback)(const UT_Vector3 &pos);
00068 typedef float (*GU_IsoCornerFunc)(const ISO_Corner &corner);
00069
00070 class GU_API GU_IsoSurface {
00071 public:
00072 GU_IsoSurface();
00073 virtual ~GU_IsoSurface();
00074
00075
00076
00077
00078
00079
00080
00081 void setCallback(GU_IsoCallback edge_eval,
00082 GU_IsoCallback face_eval = 0,
00083 GU_IsoCornerFunc corner_test = 0);
00084 void polygonize(GU_Detail *gdp, const UT_BoundingBox &box,
00085 int xdivs, int ydivs, int zdivs);
00086
00087
00088
00089 virtual float evalCorner(const ISO_Corner &c)
00090 {
00091 return (myCorner) ? myCorner(c) : myEdge(c.myPos);
00092 }
00093 virtual float evalEdge(const UT_Vector3 &pos) { return myEdge(pos); }
00094 virtual float evalFace(const UT_Vector3 &pos) { return myFace(pos); }
00095
00096 ISO_Corner *getZ0() { return myZ0; }
00097 ISO_Corner *getZ1() { return myZ1; }
00098 void swapZ();
00099
00100
00101 int getDivs(int idx) { return myDivs[idx]; }
00102
00103
00104
00105
00106
00107
00108 virtual void prepEvalFunc(ISO_Corner *c0, ISO_Corner *c1, int dir);
00109
00110
00111
00112
00113 virtual void prepFaceFunc(ISO_Corner *c0[8]);
00114
00115
00116
00117
00118
00119 virtual void fillPointVertexAttributes(GEO_Vertex &vtx);
00120
00121
00122 virtual void fillPrimitiveAttributes(GU_PrimPoly *poly);
00123
00124 protected:
00125
00126
00127
00128 virtual void prepInsideOut(int xdivs, int ydivs, float z,
00129 ISO_Corner *array);
00130
00131
00132
00133
00134
00135 virtual void resetPass(const UT_BoundingBox &box);
00136
00137
00138
00139
00140
00141 virtual void cleanCorners(int xdivs, int ydivs, ISO_Corner *array);
00142
00143
00144 float getXInc() const { return myXInc; }
00145 float getYInc() const { return myYInc; }
00146 float getZInc() const { return myZInc; }
00147
00148 private:
00149 void fillArray(ISO_Corner *corner, float z);
00150
00151
00152
00153
00154 int myDivs[3];
00155 float myXInc, myYInc, myZInc;
00156 ISO_Corner *myZ0, *myZ1;
00157 GU_IsoCornerFunc myCorner;
00158 GU_IsoCallback myEdge;
00159 GU_IsoCallback myFace;
00160 };