00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __GU_IsoAdaptive__
00020 #define __GU_IsoAdaptive__
00021
00022 #include "GU_API.h"
00023 #include <GEO/GEO_PrimList.h>
00024 #include <UT/UT_HashTable.h>
00025 #include <UT/UT_RefArray.h>
00026 #include <UT/UT_PtrArray.h>
00027 #include <UT/UT_FloatArray.h>
00028
00029 class GU_Detail;
00030 class GEO_Point;
00031 class GEO_PrimVolume;
00032 class GEO_PrimPoly;
00033
00034 class gu_isotrisoup;
00035 class gu_isotri;
00036 class gu_isopt;
00037 class gu_isoedge;
00038
00039
00040
00041
00042
00043
00044
00045 class GU_API GU_IsoAdaptiveSampler
00046 {
00047 public:
00048 GU_IsoAdaptiveSampler();
00049 virtual ~GU_IsoAdaptiveSampler() {}
00050
00051
00052
00053 virtual float sample(const UT_Vector3 &pos) = 0;
00054
00055
00056 virtual UT_Vector3 gradient(const UT_Vector3 &pos) = 0;
00057
00058
00059
00060
00061
00062 virtual bool settle(UT_Vector3 &pos, float tol);
00063
00064
00065
00066
00067
00068 virtual bool hingeSettle(UT_Vector3 &result, UT_Vector3 center, UT_Vector3 stepdir, UT_Vector3 normal, float stepsize, float tol);
00069
00070
00071 float stepsize(const UT_Vector3 &pos);
00072
00073
00074
00075 void setStepScale(float minstep, float maxstep, float stepscale);
00076
00077
00078
00079 void setStepSizeSampler(GU_IsoAdaptiveSampler *sampler);
00080
00081
00082
00083
00084 void setCurvatureTestDist(float querydist);
00085
00086
00087
00088 virtual bool isInside(const UT_Vector3 &pos);
00089
00090 protected:
00091
00092
00093
00094
00095
00096
00097
00098
00099 virtual float stepsizeSubclass(const UT_Vector3 &pos);
00100
00101 float myMinStep, myMaxStep, myStepScale;
00102 float myQueryDist;
00103
00104 GU_IsoAdaptiveSampler *myStepSizeSampler;
00105 };
00106
00107
00108
00109
00110
00111 class gu_VolumeHierarchy;
00112
00113 class GU_API GU_IsoAdaptiveSamplerVolume : public GU_IsoAdaptiveSampler
00114 {
00115 public:
00116 GU_IsoAdaptiveSamplerVolume(const UT_PtrArray<const GEO_PrimVolume *> &vollist, float offset, bool invert, float overlap, bool usesmallest, bool strict);
00117 virtual ~GU_IsoAdaptiveSamplerVolume();
00118
00119 virtual float sample(const UT_Vector3 &pos);
00120 virtual UT_Vector3 gradient(const UT_Vector3 &pos);
00121
00122
00123 virtual bool isInside(const UT_Vector3 &pos);
00124 protected:
00125 gu_VolumeHierarchy *myHierarchy;
00126 const GEO_PrimVolume *myRefVolume;
00127 float myOffset;
00128
00129 float mySide;
00130
00131 bool myUseSmallest;
00132
00133 bool myStrict;
00134 };
00135
00136
00137
00138
00139
00140
00141 class GU_API GU_IsoAdaptive
00142 {
00143 public:
00144 GU_IsoAdaptive();
00145 virtual ~GU_IsoAdaptive();
00146
00147 void isosurface(GU_Detail *gdp,
00148 GU_IsoAdaptiveSampler &sampler,
00149 UT_Vector3 seedpos,
00150 float tol,
00151
00152
00153
00154 float maxchange,
00155 bool closegaps,
00156 bool flipedges,
00157 bool computenml,
00158 bool stopatvolume);
00159 protected:
00160
00161
00162 gu_isotri *buildSeedTri(UT_Vector3 seedpos);
00163
00164
00165
00166
00167 bool growEdge(gu_isoedge *edge, bool stopatvolume);
00168
00169
00170
00171
00172 bool checkOverlap(gu_isotri *ntri, UT_Vector3 testpos,
00173 gu_isotri *ignore, float searchscale);
00174
00175
00176
00177 bool cutEar(gu_isoedge *edge);
00178
00179
00180 private:
00181 gu_isotrisoup *mySoup;
00182 GU_IsoAdaptiveSampler *mySampler;
00183 float myTol;
00184 float myMaxShrink, myMaxGrow;
00185 };
00186
00187
00188 #endif