00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef __MUDBOXSDK_BRUSH_H__
00016 #define __MUDBOXSDK_BRUSH_H__
00017
00018 #include <QtCore/QHash>
00019 #include <QtCore/QSharedPointer>
00020 #include <QtCore/QCoreApplication>
00021
00022 namespace mudbox {
00023
00025 class MBDLL_DECL BrushConfiguration
00026 {
00027 public:
00028 typedef enum
00029 {
00030 PaintTools,
00031 SculptTools,
00032 PoseTools,
00033 SelectTools
00034 } PredefinedCategory;
00035
00036 public:
00038 BrushConfiguration( );
00039 BrushConfiguration( const ClassDesc *pClass, unsigned int iID, const QString& sStringID, const QString& sDisplayName, const QString& sCategory, const QString& sCategoryTr, const QString& sToolTip );
00040 BrushConfiguration( const ClassDesc *pClass, unsigned int iID, const QString& sStringID, const QString& sDisplayName, PredefinedCategory nCategory, const QString& sToolTip );
00041 ~BrushConfiguration( );
00043 unsigned int ID( void ) const;
00046 virtual QString Name( void ) const;
00048 virtual QString StringID( void ) const;
00050 virtual QString DisplayName( void ) const;
00052 virtual void SetDisplayName( const QString & sDisplayName );
00054 virtual QString ToolTip( void ) const;
00056 virtual const ClassDesc *OperationClass( void ) const;
00058 virtual QString Category() const;
00060 virtual QString DisplayCategory() const;
00062 virtual void Serialize( Stream& s );
00063
00064 private:
00065 const ClassDesc *m_pClass;
00066 unsigned int m_iID;
00067 QString m_sStringID, m_sToolTip, m_sCategory;
00068 QString m_sDisplayName, m_sCategoryTr;
00069 Action* m_pAction;
00070 };
00071
00073 enum MirrorMode
00074 {
00076 eMirrorNone,
00078 eMirrorX,
00080 eMirrorY,
00082 eMirrorZ,
00084 eMirrorLocalX,
00086 eMirrorLocalY,
00088 eMirrorLocalZ,
00090 eMirrorTangent
00091 };
00092
00094 struct MBDLL_DECL MirrorConfiguration
00095 {
00097 MirrorConfiguration( void );
00098 MirrorConfiguration( const MirrorConfiguration &v );
00100 enum MirrorMode MirrorMode( void ) const;
00102 void SetMirrorMode( enum MirrorMode mode );
00104 const Store<mudbox::Vector> &MirrorPlaneNormals( void ) const { return m_aMirrorPlaneNormals; };
00106 const Store<mudbox::Vector> &MirrorPlanePositions( void ) const { return m_aMirrorPlanePositions; };
00108 bool IsMirrorLocal( void ) const { return m_bMirrorLocal; };
00110 int MirrorPlanes( void ) const { return m_iMirrorPlanes; };
00114 Matrix TransformationMatrix(
00115 const SurfacePoint *pSourceLocation,
00116
00117
00118 bool bNormalizeLocalFrame = false
00119 ) const;
00122 Vector Transform(
00123 const Vector &cSource,
00124 float fW,
00125 const SurfacePoint *pSourceLocation
00126
00127
00128 ) const;
00129
00130 inline bool operator ==( const MirrorConfiguration & ) const throw() { return false; };
00131 inline bool operator !=( const MirrorConfiguration &v ) const throw() { return !operator ==( v ); };
00132
00134 virtual void Serialize( Stream& s );
00135
00136 private:
00138 Matrix AxisTransformationMatrix(
00139 const SurfacePoint *pSourceLocation
00140
00141
00142 ) const;
00146 Matrix TangentTransformationMatrix(
00147 const SurfacePoint *pSourceLocation,
00148
00149
00150 bool bNormalizeLocalFrame = false
00151 ) const;
00152
00153 bool m_bMirrorLocal;
00154 int m_iMirrorPlanes;
00155 Store<mudbox::Vector> m_aMirrorPlaneNormals;
00156 Store<mudbox::Vector> m_aMirrorPlanePositions;
00157
00158 friend class BrushOperation;
00159 };
00160
00161 typedef AttributeInstance<MirrorConfiguration> amirrorcfg;
00162
00163 MBDLL_DECL AttributeWidget *CreateNewMirrorConfigurationWidget( QWidget *pParent, int iWidth, amirrorcfg *pAttribute );
00164
00165 template <> inline
00166 AttributeWidget *amirrorcfg::CreateEditorWidget( QWidget *pParent, int iWidth ) { return CreateNewMirrorConfigurationWidget( pParent, iWidth, this ); };
00167
00168 template <> inline
00169 Attribute::AttributeType amirrorcfg::Type( void ) const { return typeUnknown; };
00170
00171 template <> inline
00172 QString amirrorcfg::AsString( bool ) const { return QString::number(m_cValue.MirrorMode()); };
00173
00174 template <> inline
00175 void amirrorcfg::SetFromString( const QString &mode, bool , bool ) { m_cValue.SetMirrorMode(MirrorMode(mode.toInt())); };
00176
00177
00179 struct MBDLL_DECL StampConfiguration
00180 {
00181 StampConfiguration( void )
00182 {
00183 m_bActive = false;
00184 m_bOrientToStroke = true;
00185 m_bStretch = false;
00186 m_bFlipX = m_bFlipY = m_bRandomize = m_bRandomizeFlipX = m_bRandomizeFlipY = false;
00187 m_fRotation = m_fRandomizeScale = m_fRandomizeStrength = 0.0f;
00188 m_fRandomizeRotation = 0.35f;
00189 m_fRandomizePositionX = m_fRandomizePositionY = 0.4f;
00190 }
00191
00192 void Serialize( Stream &s );
00193
00194 inline bool operator ==( const StampConfiguration & ) const throw() { return false; };
00195 inline bool operator !=( const StampConfiguration &v ) const throw() { return !operator ==( v ); };
00196
00197 QString m_sFileName;
00198 bool m_bActive;
00199 bool m_bOrientToStroke, m_bStretch;
00200 bool m_bFlipX, m_bFlipY;
00201 float m_fRotation;
00202 bool m_bRandomize, m_bRandomizeFlipX, m_bRandomizeFlipY;
00203 float m_fRandomizeScale, m_fRandomizeRotation, m_fRandomizePositionX, m_fRandomizePositionY, m_fRandomizeStrength;
00204 };
00205
00206 typedef AttributeInstance<StampConfiguration> astampcfg;
00207
00208 MBDLL_DECL AttributeWidget *CreateNewStampConfigurationWidget( QWidget *pParent, int iWidth, astampcfg *pAttribute );
00209
00210 template <> inline
00211 AttributeWidget *astampcfg::CreateEditorWidget( QWidget *pParent, int iWidth ) { return CreateNewStampConfigurationWidget( pParent, iWidth, this ); };
00212
00213 template <> inline
00214 Attribute::AttributeType astampcfg::Type( void ) const { return typeUnknown; };
00215
00216 template<> inline
00217 QString astampcfg::AsString( bool ) const
00218 {
00219 return QString("%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12 %13")
00220 .arg(m_cValue.m_bActive)
00221 .arg(m_cValue.m_bOrientToStroke)
00222 .arg(m_cValue.m_bStretch)
00223 .arg(m_cValue.m_bFlipX)
00224 .arg(m_cValue.m_bFlipY)
00225 .arg(m_cValue.m_fRotation)
00226 .arg(m_cValue.m_bRandomize)
00227 .arg(m_cValue.m_bRandomizeFlipX)
00228 .arg(m_cValue.m_bRandomizeFlipY)
00229 .arg(m_cValue.m_fRandomizeScale)
00230 .arg(m_cValue.m_fRandomizeRotation)
00231 .arg(m_cValue.m_fRandomizePositionX)
00232 .arg(m_cValue.m_fRandomizePositionY)
00233 .arg(m_cValue.m_fRandomizeStrength);
00234 };
00235
00236 template<> inline
00237 void astampcfg::SetFromString( const QString &s , bool , bool )
00238 {
00239 m_cValue.m_bActive = s.section( ' ', 0,0 ) == "1" ? true : false;
00240 m_cValue.m_bOrientToStroke = s.section( ' ', 1,1 ) == "1" ? true : false;
00241 m_cValue.m_bStretch = s.section( ' ', 2,2) == "1" ? true : false;
00242 m_cValue.m_bFlipX = s.section( ' ', 3,3 ) == "1" ? true : false;
00243 m_cValue.m_bFlipY = s.section( ' ', 4,4 ) == "1" ? true : false;
00244 m_cValue.m_fRotation = s.section( ' ', 5,5 ).toFloat();
00245 m_cValue.m_bRandomize = s.section( ' ', 6,6 ) == "1" ? true : false;
00246 m_cValue.m_bRandomizeFlipX = s.section( ' ', 7,7 ) == "1" ? true : false;
00247 m_cValue.m_bRandomizeFlipY = s.section( ' ', 8,8 ) == "1" ? true : false;
00248 m_cValue.m_fRandomizeScale = s.section( ' ', 9,9 ).toFloat();
00249 m_cValue.m_fRandomizeRotation = s.section( ' ', 10,10 ).toFloat();
00250 m_cValue.m_fRandomizePositionX = s.section( ' ', 11,11 ).toFloat();
00251 m_cValue.m_fRandomizePositionY = s.section( ' ', 12,12 ).toFloat();
00252 m_cValue.m_fRandomizeStrength =s.section( ' ', 13,13 ).toFloat();
00253 };
00254
00261 class MBDLL_DECL BrushOperation : public Operation
00262 {
00263 Q_DECLARE_TR_FUNCTIONS(mudbox::BrushOperation)
00264 DECLARE_CLASS;
00265 public:
00267 enum Direction
00268 {
00269 eDirNormal,
00270 eDirAveragedNormal,
00271 eDirVertexNormal,
00272 eDirForward,
00273 eDirRight,
00274 eDirX,
00275 eDirY,
00276 eDirZ,
00277 eDirCamera,
00278 eDirScreen,
00279 eDirXY,
00280 eDirXZ,
00281 eDirYZ
00282 };
00283
00285 enum Modifier
00286 {
00287 eModNormal,
00288 eModAdditive,
00289 eModInverted,
00290 eModNoEffect
00291 };
00292
00294 enum TriggerType
00295 {
00296 eTriggerPrimary,
00297 eTriggerSecondary,
00298 eTriggerTertiary
00299 };
00300
00302 enum MaskType
00303 {
00304 eMaskAny = -1,
00305 eMaskStamp,
00306 eMaskStencil,
00307 eMaskTypeCount
00308 };
00309
00312 enum StampSizingMode
00313 {
00315 eStampSizingNone,
00317 eStampSizingRadius,
00319 eStampSizingDiameter
00320 };
00321
00323 struct BrushBehavior
00324 {
00325 enum BehaviorType
00326 {
00327 eBehaviorNone,
00328 eBehaviorBrush,
00329 eBehaviorAttribute
00330 };
00331
00332 BrushBehavior( void ) { m_eType = eBehaviorNone; m_sTarget = ""; m_iHotkey = 0; };
00333 BrushBehavior( BehaviorType type, QString target, int iHotkey ) : m_eType( type ), m_sTarget( target ), m_iHotkey( iHotkey ) {};
00334
00335 BehaviorType m_eType;
00336 QString m_sTarget;
00337 int m_iHotkey;
00338 };
00339
00341 BrushOperation( void );
00342
00344 virtual QString StringID( const ClassDesc *pClass = 0 ) const;
00346 virtual QString DisplayName( void ) const;
00347
00349 virtual void OnNodeEvent( const Attribute &cAttribute, NodeEventType eType );
00350
00352 virtual bool IsScreenSpace( void ) const;
00354 virtual float BrushSize( void ) const;
00356 virtual float BrushStrength( void ) const;
00358 virtual void SetBrushSize( float fSize );
00360 virtual void SetBrushStrength( float fStrength );
00362 virtual float EffectiveBrushSize( void ) const;
00364 virtual float EffectiveBrushStrength( void ) const;
00366 virtual float BrushSizeBias( void ) const;
00368 virtual float BrushStrengthBias( void ) const;
00370 virtual float MaxBrushSize( void ) const;
00372 virtual float MaxBrushStrength( void ) const;
00373
00375 virtual bool UsesStrokeSmoothing( void ) const;
00377 virtual float StrokeSmoothingDistance( void ) const;
00379 virtual void SetStrokeSmoothing( bool bEnable, float fDistance );
00381 virtual bool HasCustomCursor( void );
00382
00384 virtual bool UsesSteadyStroke( void ) const;
00386 virtual float SteadyStrokeDistance( void ) const;
00388 virtual void SetSteadyStroke( bool bEnable, float fDistance );
00389
00391 virtual enum StampSizingMode StampSizingMode( void ) const;
00393 virtual void SetStampSizingMode( enum StampSizingMode eMode );
00394
00396 virtual const NURBSCurve *Falloff( void ) const;
00398 virtual void SetFalloff( NURBSCurve *pCurve );
00400 virtual const Store<float> &FalloffData( void ) const;
00402 inline float FalloffValue( float fValue ) const
00403 {
00404 return FalloffData()[int(fValue*(FalloffData().ItemCount()-1))];
00405 };
00407 virtual bool UsesFalloffBasedOnFacingAngle( void ) const;
00409 virtual void SetFalloffBasedOnFacingAngle( bool bEnable );
00410
00412 virtual bool UsesStampRandomize( void ) const;
00414 virtual void SetStampRandomize( bool bEnable );
00415
00417 virtual bool IsMaskEnabled( MaskType type = eMaskAny ) const;
00419 virtual const Image *MaskImage( MaskType type = eMaskAny ) const;
00421 virtual Matrix MaskMatrix( MaskType type = eMaskAny ) const;
00423 virtual bool IsMaskInverted( MaskType type = eMaskAny ) const;
00425 virtual float MaskFactor( MaskType type = eMaskAny ) const;
00427 virtual bool IsMaskTiled( MaskType type = eMaskAny ) const;
00429 virtual QString MaskName( MaskType type = eMaskAny ) const;
00431 virtual bool MaskBuildUp( MaskType type = eMaskAny ) const;
00433 virtual const Image *MaskOpacityImage( MaskType type = eMaskAny ) const;
00435 virtual float MaskOffset( MaskType type = eMaskAny ) const;
00437 virtual void OnMaskChanged( MaskType type = eMaskAny );
00438
00440 virtual float BuildUpRate( void ) const;
00442 virtual bool PatchesAtRelease( void ) const;
00444 virtual bool PressureControlsBrushSize( void ) const;
00446 virtual bool PressureControlsBrushStrength( void ) const;
00448 virtual bool IsInverted( void ) const;
00450 virtual bool IsOrientedToSurface( void ) const;
00451
00453 Direction Direction( void ) const;
00455 Vector DirectionVector( unsigned int iVertexIndex ) const;
00457 virtual void SetDirectionVector( const Vector &vDirection ) const;
00459 Vector PreviousPatchPosition( void ) const;
00460
00462 virtual void BeginStroke( Mesh *pMesh, Modifier eModifier, TriggerType eTriggerType );
00464 virtual void EndStroke( void );
00466 virtual void MouseMove( float fXPosition, float fYPosition, float fXDelta, float fYDelta, AxisAlignedBoundingBox &cDirtyWorldArea, float fSize, float fPressure, float fStrength );
00468 virtual void AddPatch( const SurfacePoint *pPoint, const Vector &vPatchCenter, float fSize, float fPressure, float fStrength, AxisAlignedBoundingBox &cDirtyWorldArea );
00470 virtual void Flood( Mesh *pTarget, float fStrength = 1.0f, bool bFromCamera = false );
00471
00473 virtual void SetInactive();
00475 virtual void SetActiveConfiguration( BrushConfiguration *config );
00477 virtual void SetActiveConfiguration( const QString &sName );
00479 virtual BrushConfiguration *ActiveConfiguration( void ) const;
00480
00482 static void AddConfiguration( BrushConfiguration *config );
00484 static unsigned int ConfigurationCount( void );
00486 static BrushConfiguration *Configuration( unsigned int iIndex );
00487
00489 const StampConfiguration &StampConfig( void ) const;
00491 void SetStampConfig( StampConfiguration &newConfig );
00493 void SetStamp( bool bEnable, const QString &sFileName = "" );
00494
00496 void SetBrushSizeScale( float fScale );
00498 void SetBrushStrengthScale( float fScale );
00499
00501 bool UsesGlobalBrushSize( void ) const;
00502
00505 Modifier CurrentModifier( void ) const;
00506
00508 const MirrorConfiguration &MirrorConfig( void ) const;
00510 virtual void SetMirrorConfig( MirrorConfiguration newConfig );
00511
00516 virtual bool IsConfigurationInited( BrushConfiguration *config ) const;
00519 virtual void StoreConfiguration( BrushConfiguration *config );
00523 virtual void RestoreConfiguration( BrushConfiguration *config );
00525 static void SerializeConfigurationStates( Stream &s );
00526
00528 virtual QString OverlayIcon( void );
00530 virtual QPointF OverlayOffset( void );
00531
00533 virtual bool ExecuteAndInvert( void );
00535 virtual void Serialize( Stream &s );
00537 virtual BrushOperation &operator =( const BrushOperation &op );
00538
00541 virtual bool CanLockLayer( void ) const;
00542
00545 virtual bool CustomPicker( void );
00546
00549 virtual Node *AttributeHolderNode( void );
00550
00552 virtual void SetFalloffIndex( int iIndex );
00553
00555 virtual int FalloffIndex( void ) const;
00556
00558 virtual unsigned int AlternateBehaviorCount( void ) const;
00559
00561 virtual const BrushBehavior &AlternateBehavior( unsigned int iIndex ) const;
00562
00564 virtual bool IsSnapToCurve( void ) const;
00565
00567 virtual float SnapDistance( void ) const;
00568
00569 protected:
00571 abool m_bScreenSpace;
00572 abool m_bInverted;
00573 abool m_bOrientToSurface;
00574 afloatr m_fNormalBrushSize, m_fNormalBrushStrength;
00575 afloatr m_fScreenBrushSize, m_fScreenBrushStrength;
00576 afloatr m_fMaxBrushSize, m_fMaxBrushStrength;
00577 afloatr m_fBrushSizeBias, m_fBrushStrengthBias;
00578 acheckablefloat m_fStrokeSmoothing;
00579 acheckablefloat m_fSteadyStroke;
00580 abool m_bRememberSize;
00581 aenum m_iDirection;
00582 astampcfg m_cStampCfg;
00583 amirrorcfg m_cMirrorCfg;
00584 aevent m_cFlood;
00585 aevent m_cFloodFromCamera;
00586 avoid m_vPressure;
00587 acurveptr m_cFalloff;
00588 aint m_iFalloffIndex;
00589 aptr<NURBSCurve> m_pFalloffCurve;
00590 AttributeCheckableFloatArray m_aFalloffBasedonFacingAngle;
00591 aevent m_cReset;
00592
00593 Modifier m_eModifier;
00594 TriggerType m_eTriggerType;
00595 float m_fBrushSizeScale;
00596 float m_fBrushStrengthScale;
00597 BrushConfiguration *m_pActiveConfiguration;
00598
00599 BrushBehavior m_cAlternateBehavior1, m_cAlternateBehavior2;
00600
00601 acheckablefloat m_fSnapToCurve;
00602
00603 private:
00604 static QHash< BrushConfiguration *, QSharedPointer<mudbox::BrushOperation> > s_aConfigurationStates;
00605 static Store<BrushConfiguration *> s_aConfigurations;
00606 };
00607
00608 #define MB_ADD_CONFIG( classname, id, name, nametr, category, tooltip ) \
00609 mudbox::BrushOperation::AddConfiguration( new BrushConfiguration( classname::StaticClass(), id, name, nametr, category, tooltip ) );
00610
00611 #define MB_ADD_CONFIG2( classname, id, name, nametr, category, categoryTr, tooltip ) \
00612 mudbox::BrushOperation::AddConfiguration( new BrushConfiguration( classname::StaticClass(), id, name, nametr, category, categoryTr, tooltip ) );
00613
00614 };
00615
00616 #endif