Changeset View
Changeset View
Standalone View
Standalone View
intern/elbeem/intern/isosurface.h
| Context not available. | |||||
| } IsoLevelVertex; | } IsoLevelVertex; | ||||
| //! class to triangulate a scalar field, e.g. for | //! class to triangulate a scalar field, e.g. for | ||||
| // the fluid surface, templated by scalar field access object | // the fluid surface, templated by scalar field access object | ||||
| class IsoSurface : | class IsoSurface : | ||||
| public ntlGeometryObject //, public S | public ntlGeometryObject //, public S | ||||
| { | { | ||||
| Context not available. | |||||
| /*! set particle pointer */ | /*! set particle pointer */ | ||||
| void setParticles(ParticleTracer *pnt,float psize){ mpIsoParts = pnt; mPartSize=psize; }; | void setParticles(ParticleTracer *pnt,float psize){ mpIsoParts = pnt; mPartSize=psize; }; | ||||
| /*! set # of subdivisions, this has to be done before init! */ | /*! set # of subdivisions, this has to be done before init! */ | ||||
| void setSubdivs(int s) { | void setSubdivs(int s) { | ||||
| if(mInitDone) errFatal("IsoSurface::setSubdivs","Changing subdivs after init!", SIMWORLD_INITERROR); | if(mInitDone) errFatal("IsoSurface::setSubdivs","Changing subdivs after init!", SIMWORLD_INITERROR); | ||||
| if(s<1) s=1; | if(s<1) s=1; | ||||
| if(s>10) s=10; | if(s>10) s=10; | ||||
| Context not available. | |||||
| } | } | ||||
| int getSubdivs() { return mSubdivs;} | int getSubdivs() { return mSubdivs;} | ||||
| /*! set full edge settings, this has to be done before init! */ | /*! set full edge settings, this has to be done before init! */ | ||||
| void setUseFulledgeArrays(bool set) { | void setUseFulledgeArrays(bool set) { | ||||
| if(mInitDone) errFatal("IsoSurface::setUseFulledgeArrays","Changing usefulledge after init!", SIMWORLD_INITERROR); | if(mInitDone) errFatal("IsoSurface::setUseFulledgeArrays","Changing usefulledge after init!", SIMWORLD_INITERROR); | ||||
| mUseFullEdgeArrays = set;} | mUseFullEdgeArrays = set;} | ||||
| Context not available. | |||||
| //! data pointer | //! data pointer | ||||
| float *mpData; | float *mpData; | ||||
| //! Level of the iso surface | //! Level of the iso surface | ||||
| double mIsoValue; | double mIsoValue; | ||||
| //! Store all the triangles vertices | //! Store all the triangles vertices | ||||
| vector<IsoLevelVertex> mPoints; | vector<IsoLevelVertex> mPoints; | ||||
| //! use full arrays? (not for farfield) | //! use full arrays? (not for farfield) | ||||
| bool mUseFullEdgeArrays; | bool mUseFullEdgeArrays; | ||||
| //! Store indices of calculated points along the cubie edges | //! Store indices of calculated points along the cubie edges | ||||
| int *mpEdgeVerticesX; | int *mpEdgeVerticesX; | ||||
| int *mpEdgeVerticesY; | int *mpEdgeVerticesY; | ||||
| int *mpEdgeVerticesZ; | int *mpEdgeVerticesZ; | ||||
| int mEdgeArSize; | int mEdgeArSize; | ||||
| //! vector for all the triangles (stored as 3 indices) | //! vector for all the triangles (stored as 3 indices) | ||||
| vector<unsigned int> mIndices; | vector<unsigned int> mIndices; | ||||
| //! start and end vectors for the triangulation region to create triangles in | //! start and end vectors for the triangulation region to create triangles in | ||||
| ntlVec3Gfx mStart, mEnd; | ntlVec3Gfx mStart, mEnd; | ||||
| //! normalized domain extent from parametrizer/visualizer | //! normalized domain extent from parametrizer/visualizer | ||||
| ntlVec3Gfx mDomainExtent; | ntlVec3Gfx mDomainExtent; | ||||
| //! initialized? | //! initialized? | ||||
| bool mInitDone; | bool mInitDone; | ||||
| //! amount of surface smoothing | //! amount of surface smoothing | ||||
| float mSmoothSurface; | float mSmoothSurface; | ||||
| //! amount of normal smoothing | //! amount of normal smoothing | ||||
| float mSmoothNormals; | float mSmoothNormals; | ||||
| //! grid data | //! grid data | ||||
| vector<int> mAcrossEdge; | vector<int> mAcrossEdge; | ||||
| vector< vector<int> > mAdjacentFaces; | vector< vector<int> > mAdjacentFaces; | ||||
| //! cutoff border area | //! cutoff border area | ||||
| int mCutoff; | int mCutoff; | ||||
| //! cutoff heigh values | //! cutoff height values | ||||
| int *mCutArray; | int *mCutArray; | ||||
| //! particle pointer | //! particle pointer | ||||
| ParticleTracer *mpIsoParts; | ParticleTracer *mpIsoParts; | ||||
| //! particle size | //! particle size | ||||
| float mPartSize; | float mPartSize; | ||||
| //! no of subdivisions | //! no of subdivisions | ||||
| int mSubdivs; | int mSubdivs; | ||||
| //! trimesh vars | //! trimesh vars | ||||
| vector<int> flags; | vector<int> flags; | ||||
| int mFlagCnt; | int mFlagCnt; | ||||
| Context not available. | |||||
| vector< vector<int> > neighbors; | vector< vector<int> > neighbors; | ||||
| public: | public: | ||||
| // miscelleanous access functions | // miscelleanous access functions | ||||
| //! set geometry start (for renderer) | //! set geometry start (for renderer) | ||||
| void setStart(ntlVec3Gfx set) { mStart = set; }; | void setStart(ntlVec3Gfx set) { mStart = set; }; | ||||
| ntlVec3Gfx getStart() { return mStart; }; | ntlVec3Gfx getStart() { return mStart; }; | ||||
| //! set geometry end (for renderer) | //! set geometry end (for renderer) | ||||
| void setEnd(ntlVec3Gfx set) { mEnd = set; }; | void setEnd(ntlVec3Gfx set) { mEnd = set; }; | ||||
| ntlVec3Gfx getEnd() { return mEnd; }; | ntlVec3Gfx getEnd() { return mEnd; }; | ||||
| //! set iso level value for surface reconstruction | //! set iso level value for surface reconstruction | ||||
| inline void setIsolevel(double set) { mIsoValue = set; }; | inline void setIsolevel(double set) { mIsoValue = set; }; | ||||
| //! set loop subdiv num | //! set loop subdiv num | ||||
| inline void setSmoothSurface(float set) { mSmoothSurface = set; }; | inline void setSmoothSurface(float set) { mSmoothSurface = set; }; | ||||
| Context not available. | |||||
| inline float getSmoothSurface() { return mSmoothSurface; } | inline float getSmoothSurface() { return mSmoothSurface; } | ||||
| inline float getSmoothNormals() { return mSmoothNormals; } | inline float getSmoothNormals() { return mSmoothNormals; } | ||||
| // geometry object functions | // geometry object functions | ||||
| virtual void getTriangles(double t, vector<ntlTriangle> *triangles, | virtual void getTriangles(double t, vector<ntlTriangle> *triangles, | ||||
| vector<ntlVec3Gfx> *vertices, | vector<ntlVec3Gfx> *vertices, | ||||
| vector<ntlVec3Gfx> *normals, int objectId ); | vector<ntlVec3Gfx> *normals, int objectId ); | ||||
| //! for easy GUI detection get start of axis aligned bounding box, return NULL of no BB | //! for easy GUI detection get start of axis aligned bounding box, return NULL of no BB | ||||
| virtual inline ntlVec3Gfx *getBBStart() { return &mStart; } | virtual inline ntlVec3Gfx *getBBStart() { return &mStart; } | ||||
| virtual inline ntlVec3Gfx *getBBEnd() { return &mEnd; } | virtual inline ntlVec3Gfx *getBBEnd() { return &mEnd; } | ||||
| //! access data array | //! access data array | ||||
| inline float* getData(){ return mpData; } | inline float* getData(){ return mpData; } | ||||
| inline float* getData(int ii, int jj, int kk){ | inline float* getData(int ii, int jj, int kk){ | ||||
| #if ISO_STRICT_DEBUG==1 | #if ISO_STRICT_DEBUG==1 | ||||
| if(ii<0){ errMsg("IsoStrict"," invX- |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | if(ii<0){ errMsg("IsoStrict"," invX- |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | ||||
| if(jj<0){ errMsg("IsoStrict"," invY- |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | if(jj<0){ errMsg("IsoStrict"," invY- |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | ||||
| Context not available. | |||||
| if(ii>mSizex-1){ errMsg("IsoStrict"," invX+ |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | if(ii>mSizex-1){ errMsg("IsoStrict"," invX+ |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | ||||
| if(jj>mSizey-1){ errMsg("IsoStrict"," invY+ |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | if(jj>mSizey-1){ errMsg("IsoStrict"," invY+ |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | ||||
| if(kk>mSizez-1){ errMsg("IsoStrict"," invZ+ |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | if(kk>mSizez-1){ errMsg("IsoStrict"," invZ+ |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | ||||
| return mpData + ISOLEVEL_INDEX(ii, jj, kk); | return mpData + ISOLEVEL_INDEX(ii, jj, kk); | ||||
| #else //ISO_STRICT_DEBUG==1 | #else //ISO_STRICT_DEBUG==1 | ||||
| return mpData + ISOLEVEL_INDEX(ii, jj, kk); | return mpData + ISOLEVEL_INDEX(ii, jj, kk); | ||||
| #endif | #endif | ||||
| } | } | ||||
| inline float* lbmGetData(int ii, int jj, int kk){ | inline float* lbmGetData(int ii, int jj, int kk){ | ||||
| #if ISO_STRICT_DEBUG==1 | #if ISO_STRICT_DEBUG==1 | ||||
| ii++; jj++; kk++; | ii++; jj++; kk++; | ||||
| if(ii<0){ errMsg("IsoStrict"," invX- |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | if(ii<0){ errMsg("IsoStrict"," invX- |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | ||||
| Context not available. | |||||
| if(ii>mSizex-1){ errMsg("IsoStrict"," invX+ |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | if(ii>mSizex-1){ errMsg("IsoStrict"," invX+ |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | ||||
| if(jj>mSizey-1){ errMsg("IsoStrict"," invY+ |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | if(jj>mSizey-1){ errMsg("IsoStrict"," invY+ |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | ||||
| if(kk>mSizez-1){ errMsg("IsoStrict"," invZ+ |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | if(kk>mSizez-1){ errMsg("IsoStrict"," invZ+ |"<<ii<<","<<jj<<","<<kk); ISOSTRICT_EXIT; } | ||||
| return mpData + ISOLEVEL_INDEX(ii, jj, kk); | return mpData + ISOLEVEL_INDEX(ii, jj, kk); | ||||
| #else //ISO_STRICT_DEBUG==1 | #else //ISO_STRICT_DEBUG==1 | ||||
| return mpData + ISOLEVEL_INDEX(ii+1,jj+1,kk+1); | return mpData + ISOLEVEL_INDEX(ii+1,jj+1,kk+1); | ||||
| #endif | #endif | ||||
| } | } | ||||
| //! set cut off border | //! set cut off border | ||||
| Context not available. | |||||
| unsigned int *getIsoIndexArray() { | unsigned int *getIsoIndexArray() { | ||||
| return &(mIndices[0]); | return &(mIndices[0]); | ||||
| } | } | ||||
| // surface smoothing functions | // surface smoothing functions | ||||
| void setSmoothRad(float radi1, float radi2, ntlVec3Gfx mscc); | void setSmoothRad(float radi1, float radi2, ntlVec3Gfx mscc); | ||||
| void smoothSurface(float val, bool smoothNorm); | void smoothSurface(float val, bool smoothNorm); | ||||
| Context not available. | |||||
| #define ISOSURFACE_H | #define ISOSURFACE_H | ||||
| #endif | #endif | ||||
| Context not available. | |||||