2.5 / Nodes / Transformations
[blender.git] / source / blender / editors / transform / transform.h
index b8e439f5d10bce06286842fff2a69018bc769764..806afa8e624978598ab362191fb2c990d57f5cb9 100644 (file)
@@ -46,6 +46,7 @@ struct bPose;
 struct bConstraint;
 struct BezTriple;
 struct wmOperatorType;
+struct wmOperator;
 struct bContext;
 struct wmEvent;
 struct ARegion;
@@ -77,6 +78,7 @@ typedef struct NumInput {
 typedef struct TransSnap {
        short   modePoint;
        short   modeTarget;
+       int             mode;
        int     status;
        float   snapPoint[3];
        float   snapTarget[3];
@@ -173,16 +175,27 @@ typedef struct TransData {
 /*#endif*/
 } TransData;
 
+typedef struct MouseInput {
+       void    (*apply)(struct TransInfo *, struct MouseInput *, short [2], float [3]);
+       
+    short   imval[2];          /* initial mouse position                */
+       char    precision;      
+       short   precision_mval[2];      /* mouse position when precision key was pressed */
+       int             center[2];
+       float   factor;
+} MouseInput;
+
 typedef struct TransInfo {
     int         mode;           /* current mode                         */
     int                flag;           /* generic flags for special behaviors  */
+    int                        modifiers;              /* special modifiers, by function, not key */
        short           state;                  /* current state (running, canceled,...)*/
-    int         context;        /* current context                      */
+    int         options;        /* current context/options for transform                      */
     float       val;            /* init value for some transformations (and rotation angle)  */
     float       fac;            /* factor for distance based transform  */
     int       (*transform)(struct TransInfo *, short *);
                                 /* transform function pointer           */
-       int       (*handleEvent)(struct TransInfo *, struct wmEvent *event);
+       int       (*handleEvent)(struct TransInfo *, struct wmEvent *);
                                                                /* event handler function pointer  RETURN 1 if redraw is needed */
     int         total;          /* total number of transformed data     */
     TransData  *data;           /* transformed data (array)             */
@@ -192,13 +205,13 @@ typedef struct TransInfo {
     TransSnap  tsnap;
     NumInput    num;            /* numerical input                      */
     NDofInput   ndof;           /* ndof input                           */
+    MouseInput mouse;                  /* mouse input                          */
     char        redraw;         /* redraw flag                          */
        float           propsize;               /* proportional circle radius           */
        char            proptext[20];   /* proportional falloff text                    */
     float       center[3];      /* center of transformation             */
     int         center2d[2];    /* center in screen coordinates         */
     short       imval[2];       /* initial mouse position               */
-       short           shiftmval[2];   /* mouse position when shift was pressed */
        short       idx_max;            /* maximum index on the input vector    */
        float           snap[3];                /* Snapping Gears                                               */
        
@@ -228,8 +241,8 @@ typedef struct TransInfo {
        struct ScrArea  *sa;
        struct ARegion  *ar;
        struct Scene    *scene;
-       struct wmEvent  *event; /* last event, reset at the start of each transformApply and nulled at the transformEnd */
-    short       mval[2];       /* current mouse position               */
+    short       mval[2];        /* current mouse position               */
+    struct Object   *obedit;
 } TransInfo;
 
 
@@ -256,8 +269,6 @@ typedef struct TransInfo {
 #define T_POSE                 (1 << 2)
 #define T_TEXTURE              (1 << 3)
 #define T_CAMERA               (1 << 4)
-               // when shift pressed, higher resolution transform. cannot rely on G.qual, need event!
-#define T_SHIFT_MOD            (1 << 5)
                // trans on points, having no rotation/scale 
 #define T_POINTS               (1 << 6)
                // for manipulator exceptions, like scaling using center point, drawing help lines
@@ -272,9 +283,6 @@ typedef struct TransInfo {
 #define T_PROP_EDIT                    (1 << 11)
 #define T_PROP_CONNECTED       (1 << 12)
 
-       /* if MMB is pressed or not */
-#define        T_MMB_PRESSED           (1 << 13)
-
 #define T_V3D_ALIGN                    (1 << 14)
        /* for 2d views like uv or ipo */
 #define T_2D_EDIT                      (1 << 15) 
@@ -284,6 +292,13 @@ typedef struct TransInfo {
        /* auto-ik is on */
 #define T_AUTOIK                       (1 << 18)
 
+/* TransInfo->modifiers */
+#define        MOD_CONSTRAINT_SELECT   0x01
+#define        MOD_PRECISION                   0x02
+#define        MOD_SNAP_GEARS                  0x04
+#define        MOD_CONSTRAINT_PLANE    0x08
+
+
 /* ******************************************************************************** */
 
 /* transinfo->con->mode */
@@ -332,10 +347,11 @@ typedef struct TransInfo {
 
 void TFM_OT_transform(struct wmOperatorType *ot);
 
-void initTransform(struct bContext *C, struct TransInfo *t, int mode, int context, struct wmEvent *event);
+void initTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op, struct wmEvent *event);
+void saveTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op);
 void transformEvent(TransInfo *t, struct wmEvent *event);
 void transformApply(TransInfo *t);
-int  transformEnd(TransInfo *t);
+int  transformEnd(struct bContext *C, TransInfo *t);
 
 void setTransformViewMatrices(TransInfo *t);
 void convertViewVec(TransInfo *t, float *vec, short dx, short dy);
@@ -424,6 +440,7 @@ void flushTransIpoData(TransInfo *t);
 void flushTransUVs(TransInfo *t);
 void flushTransParticles(TransInfo *t);
 int clipUVTransform(TransInfo *t, float *vec, int resize);
+void flushTransNodes(TransInfo *t);
 
 /*********************** exported from transform_manipulator.c ********** */
 void draw_manipulator_ext(struct ScrArea *sa, int type, char axis, int col, float vec[3], float mat[][3]);
@@ -485,6 +502,26 @@ void drawSnapping(TransInfo *t);
 int usingSnappingNormal(TransInfo *t);
 int validSnappingNormal(TransInfo *t);
 
+/********************** Mouse Input ******************************/
+
+typedef enum {
+       INPUT_NONE,
+       INPUT_VECTOR,
+       INPUT_SPRING,
+       INPUT_SPRING_FLIP,
+       INPUT_ANGLE,
+       INPUT_TRACKBALL,
+       INPUT_HORIZONTAL_RATIO,
+       INPUT_HORIZONTAL_ABSOLUTE,
+       INPUT_VERTICAL_RATIO,
+       INPUT_VERTICAL_ABSOLUTE
+} MouseInputMode;
+
+void initMouseInput(TransInfo *t, MouseInput *mi, int center[2], short mval[2]);
+void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode);
+int handleMouseInput(struct TransInfo *t, struct MouseInput *mi, struct wmEvent *event);
+void applyMouseInput(struct TransInfo *t, struct MouseInput *mi, short mval[2], float output[3]);
+
 /*********************** Generics ********************************/
 
 void initTransInfo(struct bContext *C, TransInfo *t, struct wmEvent *event);
@@ -502,6 +539,7 @@ TransDataCurveHandleFlags *initTransDataCurveHandes(TransData *td, struct BezTri
 
 void applyTransObjects(TransInfo *t);
 void restoreTransObjects(TransInfo *t);
+void restoreTransNodes(TransInfo *t);
 void recalcData(TransInfo *t);
 
 void calculateCenter(TransInfo *t);