Go to the
documentation of this file.
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 namespace mudbox {
00016
00017 class MBDLL_DECL NURBSCurve : public CurveBase
00018 {
00019 public:
00020 DECLARE_CLASS;
00021
00022 NURBSCurve( int iDegree = 2, bool bFalloff = false );
00023 ~NURBSCurve( void );
00024
00025 inline bool operator ==( const NURBSCurve & ) const throw() { return false; };
00026 inline bool operator !=( const NURBSCurve &v ) const throw() { return !operator ==( v ); };
00027
00028 void SetVisible( bool bVisible ) { m_bVisible = bVisible; };
00029 bool Visible( void ) { return m_bVisible; };
00030 bool AddCP( const Vector &v, int iIndex = -1 );
00031 void RemoveCP( unsigned int iIndex );
00032 void MoveCP( unsigned int iIndex, const Vector &v );
00033 void Interpolate( const QList<CurvePoint> &points );
00034 void RecalcKnots( void );
00035 int GetDegree( void ) { return m_iDegree; };
00036 void SetDegree( int iDegree );
00037 Matrix GetMatrix( void );
00038 void Display( bool bScreen = true );
00039 void Render();
00040 void Recalculate();
00041 void ProjectPoint( const Vector &vOrig, float fGuess, float &u, Vector &vProjected, float fMin = 0.001f, float fMax = 0.001f, int iMaxTry = 100 ) const;
00042 void BasisFunction( float u, int i, Store<float> &N ) const;
00043 void DeriveBasisFunction( int n, float u, int span, Store< Store<float> > &aDerF ) const;
00044 int FindSpan( float u ) const;
00045 void DeriveAt( float u, int iDeg, Store<Vector> &aDerivs ) const;
00046 inline float GetMaxParam( void ) const
00047 {
00048 if( m_aKnots.ItemCount() == 0 )
00049 return 0.0f;
00050 return m_aKnots[m_aKnots.ItemCount()-1];
00051 };
00052 inline Vector operator()( float u ) const
00053 {
00054 Vector v;
00055 if( m_iCPs <= m_iDegree )
00056 return v;
00057
00058 Store<float> aN( "NURBSCurve temp" );
00059 int iSpan = FindSpan(u);
00060 BasisFunction( u, iSpan, aN );
00061
00062 for( int i = m_iDegree; i >= 0; --i )
00063 {
00064 v += aN[i] * m_aCPs[iSpan-m_iDegree+i];
00065 };
00066 return v;
00067 };
00068 void Serialize( Stream &s );
00069 inline Vector TransformToWorld( const Vector &v )
00070 {
00071 Matrix m = GetMatrix();
00072 return m.Transform( v );
00073 };
00074 inline Vector TransformToLocal( const Vector &v )
00075 {
00076 Matrix m = GetMatrix();
00077 m.Invert();
00078 return m.Transform( v );
00079 };
00080 inline NURBSCurve &operator =( const NURBSCurve &c )
00081 {
00082 m_iDegree = c.m_iDegree;
00083 m_iCPs = c.m_iCPs;
00084 m_iSelectedCP = c.m_iSelectedCP;
00085 m_bEdited = c.m_bEdited;
00086 m_bVisible = c.m_bVisible;
00087 m_bClosed = c.m_bClosed;
00088 m_bPrecalculated = c.m_bPrecalculated;
00089 m_fTotalLength = c.m_fTotalLength;
00090 m_fPosX = c.m_fPosX;
00091 m_fPosY = c.m_fPosY;
00092 m_fAngle = c.m_fAngle;
00093 m_fScale = c.m_fScale;
00094 m_sName = c.m_sName;
00095 if( !m_pFalloff && c.m_pFalloff )
00096 m_pFalloff = new NURBSCurve( 3, false );
00097 if( c.m_pFalloff )
00098 *m_pFalloff = *(c.m_pFalloff);
00099 c.m_aCPs.Clone( m_aCPs );
00100 c.m_aKnots.Clone( m_aKnots );
00101 c.m_aPrecalc.Clone( m_aPrecalc );
00102 return *this;
00103 };
00104 void PrecalculateValues( void );
00105 void CalculateChordLengths( void );
00106 float GetChordPos( float fLength );
00107 void Close( void );
00108
00109 int m_iCPs, m_iSelectedCP;
00110 bool m_bEdited, m_bVisible, m_bClosed, m_bPrecalculated;
00111 float m_fTotalLength;
00112 float m_fPosX, m_fPosY, m_fAngle, m_fScale;
00113 QString m_sName;
00114 Store<Vector> m_aCPs;
00115 Store<float> m_aKnots;
00116 Store<float> m_aPrecalc;
00117 NURBSCurve *m_pFalloff;
00118
00119 protected:
00120 int m_iDegree;
00121
00122 struct ChordLength
00123 {
00124 ChordLength( float fPos = 0.0f, float fLength = 0.0f ) {m_fPos = fPos; m_fLength = fLength;};
00125 float m_fPos, m_fLength;
00126 };
00127 void CalculateChordLength( float fStart, float fEnd );
00128 Store<ChordLength> m_aChordLengths;
00129 };
00130
00131 class MBDLL_DECL NURBSCurveEditor
00132 {
00133 public:
00134 NURBSCurveEditor( NURBSCurve *pCurve );
00135 ~NURBSCurveEditor( void );
00136 void Refresh( void );
00137 void OnMouseClick( float fX, float fY );
00138 void OnMouseRelease( float fX, float fY );
00139 void OnMouseMove( float fX, float fY );
00140 void OnDelete( void );
00141 void MoveCPTo( const Vector &v );
00142
00143 NURBSCurve *m_pCurve;
00144 Vector m_vDragDistance, m_vStartDrag;
00145 };
00146
00147
00148 MBDLL_DECL AttributeWidget *CreateNewCurveWidget( QWidget *pParent, int iWidth, Attribute *pAttribute, bool bAddSnapAndStoreTo = true,
00149 bool bInAdjustColor = false );
00150
00151 class AttributeCurvePointer : public AttributePointer<NURBSCurve>
00152 {
00153 AttributeWidget *CreateEditorWidget( QWidget *pParent, int iWidth ) { return CreateNewCurveWidget( pParent, iWidth, this ); };
00154
00155 public:
00156 AttributeCurvePointer( Node *pOwner = 0, const QString &sID = "") : AttributePointer<NURBSCurve>( pOwner, sID ) { };
00157
00158 void SetPointerValue( NURBSCurve *cValue, bool bX = false )
00159 {
00160 NURBSCurve *curve = AttributePointer<NURBSCurve>::Value();
00161 NURBSCurve *newCurve = new NURBSCurve( 3 );
00162 if( curve )
00163 delete curve;
00164 if( cValue )
00165 *newCurve = *cValue;
00166 AttributePointer<NURBSCurve>::SetPointerValue( newCurve, bX );
00167 };
00168 };
00169
00170 typedef AttributeCurvePointer acurveptr;
00171
00172 };