00001
00032 #ifndef LL_MANIPSCALE_H
00033 #define LL_MANIPSCALE_H
00034
00035
00036
00037
00038
00039
00040 #include "lltool.h"
00041 #include "v3math.h"
00042 #include "v4math.h"
00043 #include "llmanip.h"
00044 #include "llviewerobject.h"
00045 #include "llbbox.h"
00046
00047 class LLToolComposite;
00048 class LLColor4;
00049
00050 typedef enum e_scale_manipulator_type
00051 {
00052 SCALE_MANIP_CORNER,
00053 SCALE_MANIP_FACE
00054 } EScaleManipulatorType;
00055
00056
00057 class LLManipScale : public LLManip
00058 {
00059 public:
00060 class ManipulatorHandle
00061 {
00062 public:
00063 LLVector3 mPosition;
00064 EManipPart mManipID;
00065 EScaleManipulatorType mType;
00066
00067 ManipulatorHandle(LLVector3 pos, EManipPart id, EScaleManipulatorType type):mPosition(pos), mManipID(id), mType(type){}
00068 };
00069
00070
00071 LLManipScale( LLToolComposite* composite );
00072 ~LLManipScale();
00073
00074 virtual BOOL handleMouseDown( S32 x, S32 y, MASK mask );
00075 virtual BOOL handleMouseUp( S32 x, S32 y, MASK mask );
00076 virtual BOOL handleHover( S32 x, S32 y, MASK mask );
00077 virtual void render();
00078 virtual void handleSelect();
00079 virtual void handleDeselect();
00080
00081 virtual BOOL handleMouseDownOnPart(S32 x, S32 y, MASK mask);
00082 virtual void highlightManipulators(S32 x, S32 y);
00083 virtual BOOL canAffectSelection();
00084
00085 static void setUniform( BOOL b );
00086 static BOOL getUniform();
00087 static void setStretchTextures( BOOL b );
00088 static BOOL getStretchTextures();
00089 static void setShowAxes( BOOL b );
00090 static BOOL getShowAxes();
00091
00092 private:
00093 void renderCorners( const LLBBox& local_bbox );
00094 void renderFaces( const LLBBox& local_bbox );
00095 void renderEdges( const LLBBox& local_bbox );
00096 void renderBoxHandle( F32 x, F32 y, F32 z );
00097 void renderAxisHandle( const LLVector3& start, const LLVector3& end );
00098 void renderGuidelinesPart( const LLBBox& local_bbox );
00099 void renderSnapGuides( const LLBBox& local_bbox );
00100
00101 void revert();
00102
00103 inline void conditionalHighlight( U32 part, const LLColor4* highlight = NULL, const LLColor4* normal = NULL );
00104
00105 void drag( S32 x, S32 y );
00106 void dragFace( S32 x, S32 y );
00107 void dragCorner( S32 x, S32 y );
00108
00109 void sendUpdates( BOOL send_position_update, BOOL send_scale_update, BOOL corner = FALSE);
00110
00111 LLVector3 faceToUnitVector( S32 part ) const;
00112 LLVector3 cornerToUnitVector( S32 part ) const;
00113 LLVector3 edgeToUnitVector( S32 part ) const;
00114 LLVector3 partToUnitVector( S32 part ) const;
00115 LLVector3 unitVectorToLocalBBoxExtent( const LLVector3& v, const LLBBox& bbox ) const;
00116 F32 partToMaxScale( S32 part, const LLBBox& bbox ) const;
00117 F32 partToMinScale( S32 part, const LLBBox& bbox ) const;
00118 LLVector3 nearestAxis( const LLVector3& v ) const;
00119
00120 void stretchFace( const LLVector3& drag_start_agent, const LLVector3& drag_delta_agent);
00121
00122 void adjustTextureRepeats();
00123
00124 void updateSnapGuides(const LLBBox& bbox);
00125 private:
00126
00127 F32 mBoxHandleSize;
00128 F32 mScaledBoxHandleSize;
00129 EManipPart mManipPart;
00130 LLVector3d mDragStartPointGlobal;
00131 LLVector3d mDragStartCenterGlobal;
00132 LLVector3d mDragPointGlobal;
00133 LLVector3d mDragFarHitGlobal;
00134 S32 mLastMouseX;
00135 S32 mLastMouseY;
00136 BOOL mSendUpdateOnMouseUp;
00137 U32 mLastUpdateFlags;
00138 LLLinkedList<ManipulatorHandle> mProjectedManipulators;
00139 LLVector4 mManipulatorVertices[14];
00140 F32 mScaleSnapUnit1;
00141 F32 mScaleSnapUnit2;
00142 LLVector3 mScalePlaneNormal1;
00143 LLVector3 mScalePlaneNormal2;
00144 LLVector3 mSnapGuideDir1;
00145 LLVector3 mSnapGuideDir2;
00146 LLVector3 mSnapDir1;
00147 LLVector3 mSnapDir2;
00148 F32 mSnapRegimeOffset;
00149 F32 mSnapGuideLength;
00150 LLVector3 mScaleCenter;
00151 LLVector3 mScaleDir;
00152 F32 mScaleSnapValue;
00153 BOOL mInSnapRegime;
00154 F32* mManipulatorScales;
00155 };
00156
00157 #endif // LL_MANIPSCALE_H