00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef _NURBS_SURFACE_SUBDIVISION_
00027 #define _NURBS_SURFACE_SUBDIVISION_
00028
00029 #include "nurbsS.h"
00030 #include <vector>
00031 #include <iostream>
00032
00035 namespace PLib {
00036
00052 template <class T>
00053 struct SurfSample {
00054 Point_nD<T,3> point ;
00055 Point_nD<T,3> normal ;
00056 T normLen ;
00057 T u,v ;
00058
00059 SurfSample<T>& operator=(const SurfSample<T>& s) ;
00060
00061 SurfSample() : normLen(-1),u(0),v(0) {;}
00062
00063 static T epsilon ;
00064 };
00065
00066
00067
00078 template <class T>
00079 class RenderMesh {
00080 public:
00081
00082 virtual void drawHeader() = 0;
00083 virtual void drawTriangle(const SurfSample<T>&, const SurfSample<T>&, const SurfSample<T>&) = 0;
00084 virtual void drawFooter() = 0;
00085 virtual void screenProject(const HPoint_nD<T,3> &worldPt, Point_nD<T,3> &screenPt ) = 0 ;
00086 };
00087
00088
00089 template <class T> class NurbSurface ;
00090
00108 template <class T>
00109 struct NurbsSubSurface {
00110 public:
00111 NurbsSubSurface(const NurbsSurface<T,3>& s) ;
00112 ~NurbsSubSurface() ;
00113
00114 void drawSubdivisionPS(ostream& os, T tolerance) ;
00115 void drawSubdivisionPS(const char* f, T tolerance) ;
00116
00117 void drawSubdivisionVRML(ostream& os, T tolerance, const Color& col=Color(0,0,255)) ;
00118 void drawSubdivisionVRML(const char* f, T tolerance, const Color& col=Color(0,0,255)) ;
00119
00120 void drawSubdivisionVRML97(ostream& os, T tolerance, const Color& col=Color(0,0,255)) ;
00121 void drawSubdivisionVRML97(const char* f, T tolerance, const Color& col=Color(0,0,255)) ;
00122
00123
00124 void drawSubdivisionPoints(BasicArray<Point_nD<T,3> > &pnts, T tolerance) ;
00125 void drawSubdivisionPoints(T tolerance) ;
00126
00127 protected:
00128
00129 void drawSubdivision(T tolerance) ;
00130 void initSurf() ;
00131 RenderMesh<T> *render;
00132 const NurbsSurface<T,3> &rsurf ;
00133 NurbSurface<T> *surf ;
00134 };
00135
00136
00144 template <class T>
00145 class RenderMeshPS : public RenderMesh<T> {
00146 public:
00147 RenderMeshPS(ostream& os): out(os) {;}
00148 virtual ~RenderMeshPS() {;}
00149 virtual void drawHeader() ;
00150 virtual void drawTriangle( const SurfSample<T> &v0, const SurfSample<T> &v1, const SurfSample<T> & v2 );
00151 void drawLine( const SurfSample<T> &v0, const SurfSample<T> &v1);
00152 virtual void drawFooter() ;
00153 virtual void screenProject(const HPoint_nD<T,3> &worldPt, Point_nD<T,3> &screenPt ) ;
00154 protected:
00155 ostream& out ;
00156 };
00157
00158
00159
00160
00168 template <class T>
00169 class RenderMeshVRML : public RenderMesh<T> {
00170 public:
00171 RenderMeshVRML(ostream& os,const Color& col): out(os), color(col) {;}
00172 virtual ~RenderMeshVRML() { ; }
00173 virtual void drawHeader() ;
00174 virtual void drawTriangle( const SurfSample<T> &v0, const SurfSample<T> &v1, const SurfSample<T> & v2 );
00175 virtual void drawFooter() ;
00176 virtual void screenProject(const HPoint_nD<T,3> &worldPt, Point_nD<T,3> &screenPt ) ;
00177 protected:
00178 int size ;
00179 ostream &out ;
00180 Color color ;
00181 };
00182
00190 template <class T>
00191 class RenderMeshVRML97 : public RenderMesh<T> {
00192 public:
00193 RenderMeshVRML97(ostream& os,const Color& col): out(os), color(col) { init = 1 ;}
00194 virtual ~RenderMeshVRML97() { ; }
00195 virtual void drawHeader() ;
00196 virtual void drawTriangle( const SurfSample<T> &v0, const SurfSample<T> &v1, const SurfSample<T> & v2 );
00197 virtual void drawFooter() ;
00198 virtual void screenProject(const HPoint_nD<T,3> &worldPt, Point_nD<T,3> &screenPt ) ;
00199 protected:
00200 int size ;
00201 ostream &out ;
00202 Color color ;
00203 Point_nD<T,3> p_min,p_max ;
00204 int init ;
00205 };
00206
00217 template <class T>
00218 class RenderMeshPoints : public RenderMesh<T> {
00219 public:
00220
00221 RenderMeshPoints(BasicArray<Point_nD<T,3> >& pts): points(pts) {;}
00222 virtual ~RenderMeshPoints() {; }
00223 virtual void drawHeader() ;
00224 virtual void drawTriangle( const SurfSample<T> &v0, const SurfSample<T> &v1, const SurfSample<T> & v2 );
00225 virtual void drawFooter() ;
00226 virtual void screenProject(const HPoint_nD<T,3> &worldPt, Point_nD<T,3> &screenPt ) ;
00227 protected:
00228
00229
00230 BasicArray<Point_nD<T,3> > &points;
00231 };
00232
00233
00234
00235
00236 }
00237
00238
00239 #endif