00001
00002
00003 #ifndef __NURBS_SURFACE_H
00004 #define __NURBS_SURFACE_H
00005
00006 #include <opennurbs.h>
00007 #include <esg/Definitions.h>
00008 #include <esg/geometry/Geometry.h>
00009 #include <esg/geometry/Surface.h>
00010 #include <esg/Intersector.h>
00011 #include <esg/AutoPtr.h>
00012 #include <esg/spacesorting/SDS.h>
00013
00014 namespace esg {
00015
00025 class NurbsSurface : public Geometry {
00026 protected:
00027 Surface * _pSurface;
00028
00029 protected:
00030 void _triangulate_surface (const ON_NurbsSurface&,
00031 const SDS&,
00032 AutoPtr<Intersector>*);
00033
00034 virtual Mesh* _mesh (int ) const;
00035 virtual void _duplicate_attributes (const Geometry& src);
00036
00037
00038 virtual void _rotateX (float );
00039 virtual void _rotateY (float );
00040 virtual void _rotateZ (float );
00041 virtual void _rotate (float , const Vector3& );
00042 virtual void _rotate (const Matrix3&);
00043 virtual void _translate (float , float , float );
00044 virtual void _transform (const Matrix4&);
00045 virtual void _scale (float);
00046
00047 NurbsSurface () {}
00048
00049 public:
00050
00063 NurbsSurface (const SDS& ss,
00064 AutoPtr<Intersector>* it,
00065 int dimension,
00066 bool ratinal,
00067 int order0,
00068 int order1,
00069 int count0,
00070 int count1);
00071
00079 NurbsSurface(const SDS& ss,
00080 AutoPtr<Intersector>* it,
00081 const ON_NurbsSurface& sp);
00082
00086 virtual ~NurbsSurface ();
00087
00088 virtual void rayIntersection (PointEnv* pPE,
00089 int mask,
00090 const Vector3& origin,
00091 const Vector3& direction,
00092 float maxD = MAXFLOAT);
00093
00094 virtual bool mapToUV (const Vector3& v, Vector2& uv);
00095
00096 virtual void randomSample (int mask, PointEnv& pe, double* pdf) {
00097 if (_pSurface) _pSurface->randomSample(mask, pe, pdf);
00098 else pe.mask = ENV_HAVE_NOTHING;
00099 }
00100
00101 virtual bool randomDirection (const Vector3& pov,
00102 Vector3& dir,
00103 double* pdf) {
00104 return ((_pSurface) ?
00105 _pSurface->randomDirection(pov,dir,pdf) :
00106 false);
00107 }
00108
00109 virtual Interval extent (const Vector3& direction) const;
00110
00111 virtual Vector3 centroid (void) const;
00112
00113 virtual double radius (void) const;
00114
00115 virtual double radius (const Vector3& centroid) const;
00116
00117 virtual Geometry* clone (const Matrix4* pTrMat) const;
00118
00119 virtual bool separation (Geometry& geom, Vector3* pDir) {
00120 return false;
00121 }
00122
00123 virtual double distance (const Geometry& geom, Vector3* pDir) {
00124 return DBL_MIN;
00125 }
00126
00127 virtual void dump (const char* intent, const char* tab);
00128 };
00129
00130 };
00131
00132 #endif // __NURBS_SURFACE_H