00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef NL_BEZIER_PATCH_H
00027 #define NL_BEZIER_PATCH_H
00028
00029 #include "nel/misc/types_nl.h"
00030 #include "nel/misc/vector.h"
00031 #include "nel/misc/vectord.h"
00032 #include "nel/misc/matrix.h"
00033
00034
00035 namespace NL3D
00036 {
00037
00038
00039 using NLMISC::CVector;
00040 using NLMISC::CVectorD;
00041 using NLMISC::CMatrix;
00042
00043
00044
00073 class CBezierPatch
00074 {
00075 public:
00077 CVector Vertices[4];
00079 CVector Tangents[8];
00081 CVector Interiors[4];
00082
00083
00084 public:
00086 CBezierPatch() {}
00087
00089 void make(CVector vertices[4], CVector normals[4]);
00091 void makeInteriors();
00093 void applyMatrix(const CMatrix &m);
00094
00096 CVector eval(float s, float t) const;
00098
00100
00102
00104
00105
00106
00108
00112 void subdivideS(CBezierPatch &left, CBezierPatch &right, float s=0.5f) const;
00116 void subdivideT(CBezierPatch &top, CBezierPatch &bottom, float t=0.5f) const;
00117
00118
00119
00120
00121 private:
00122 struct CBezierCurve
00123 {
00124 CVector P0, P1, P2, P3;
00125 void subdivide(CBezierCurve &left, CBezierCurve &right, float t);
00126 void set(const CVector &a, const CVector &b, const CVector &c, const CVector &d)
00127 {
00128 P0= a; P1= b; P2= c; P3= d;
00129 }
00130 void get(CVector &a, CVector &b, CVector &c, CVector &d)
00131 {
00132 a= P0; b= P1; c= P2; d= P3;
00133 }
00134 };
00135
00136 };
00137
00138
00139
00140 }
00141
00142
00143 #endif // NL_BEZIER_PATCH_H
00144
00145