Merging r58475 through r58700 from trunk into soc-2013-depsgraph_mt
[blender.git] / source / blender / editors / transform / transform.h
index 1585fb1ad6b07f8926ba62c84959b5fc1b9a375e..4a1c4203a4370d2c606c9e79102340a7fd0c9162 100644 (file)
 
 #include "ED_transform.h"
 #include "ED_numinput.h"
+#include "ED_view3d.h"
 
 #include "DNA_listBase.h"
 
 #include "BLI_smallhash.h"
-#include "BKE_tessmesh.h"
+#include "BKE_editmesh.h"
 
 /* ************************** Types ***************************** */
 
@@ -52,12 +53,7 @@ struct Object;
 struct View3D;
 struct ScrArea;
 struct Scene;
-struct bPose;
 struct bConstraint;
-struct BezTriple;
-struct wmOperatorType;
-struct wmOperator;
-struct wmWindowManager;
 struct wmKeyMap;
 struct wmKeyConfig;
 struct bContext;
@@ -65,7 +61,6 @@ struct wmEvent;
 struct wmTimer;
 struct ARegion;
 struct ReportList;
-struct SmallHash;
 
 typedef struct TransSnapPoint {
        struct TransSnapPoint *next, *prev;
@@ -77,7 +72,7 @@ typedef struct TransSnap {
        short   target;
        short   modePoint;
        short   modeSelect;
-       short   align;
+       bool    align;
        char    project;
        char    snap_self;
        short   peel;
@@ -108,15 +103,15 @@ typedef struct TransCon {
        int   imval[2];      /* initial mouse value for visual calculation                                */
                             /* the one in TransInfo is not garanty to stay the same (Rotates change it)  */
        int   mode;          /* Mode flags of the Constraint                                              */
-       void  (*drawExtra)(struct TransInfo *);
+       void  (*drawExtra)(struct TransInfo *t);
                             /* For constraints that needs to draw differently from the other
                              * uses this instead of the generic draw function                            */
-       void  (*applyVec)(struct TransInfo *, struct TransData *, float *, float *, float *);
+       void  (*applyVec)(struct TransInfo *t, struct TransData *td, const float in[3], float out[3], float pvec[3]);
                             /* Apply function pointer for linear vectorial transformation                */
                             /* The last three parameters are pointers to the in/out/printable vectors    */
-       void  (*applySize)(struct TransInfo *, struct TransData *, float [3][3]);
+       void  (*applySize)(struct TransInfo *t, struct TransData *td, float smat[3][3]);
                             /* Apply function pointer for size transformation */
-       void  (*applyRot)(struct TransInfo *, struct TransData *, float [3], float *);
+       void  (*applyRot)(struct TransInfo *t, struct TransData *td, float vec[3], float *angle);
                             /* Apply function pointer for rotation transformation */
 } TransCon;
 
@@ -143,6 +138,7 @@ typedef struct TransDataExtension {
                              * namely when a bone is in "NoLocal" or "Hinge" mode)... */
        float  r_smtx[3][3]; /* Invers of previous one. */
        int    rotOrder;        /* rotation mode,  as defined in eRotationModes (DNA_action_types.h) */
+       float oloc[3], orot[3], oquat[4], orotAxis[3], orotAngle; /* Original object transformation used for rigid bodies */
 } TransDataExtension;
 
 typedef struct TransData2D {
@@ -188,38 +184,64 @@ typedef struct TransDataNla {
 struct LinkNode;
 struct GHash;
 
-typedef struct TransDataSlideVert {
-       struct BMVert vup, vdown;
-       struct BMVert origvert;
-
-       struct BMVert *up, *down;
+typedef struct TransDataEdgeSlideVert {
+       struct BMVert *v_a, *v_b;
        struct BMVert *v;
+       float v_co_orig[3];
 
        float edge_len;
 
-       float upvec[3], downvec[3];
-} TransDataSlideVert;
+       /* add origvert.co to get the original locations */
+       float dir_a[3], dir_b[3];
+
+       int loop_nr;
+} TransDataEdgeSlideVert;
 
-typedef struct SlideData {
-       TransDataSlideVert *sv;
+typedef struct EdgeSlideData {
+       TransDataEdgeSlideVert *sv;
        int totsv;
        
-       struct SmallHash vhash;
-       struct SmallHash origfaces;
+       struct GHash *origfaces;
 
-       int start[2], end[2];
+       int mval_start[2], mval_end[2];
        struct BMEditMesh *em;
 
        /* flag that is set when origfaces is initialized */
-       int origfaces_init;
+       bool use_origfaces;
+       struct BMesh *bm_origfaces;
+
+       float perc;
+
+       bool is_proportional;
+       bool flipped_vtx;
+
+       int curr_sv_index;
+} EdgeSlideData;
+
+
+typedef struct TransDataVertSlideVert {
+       BMVert *v;
+       float   co_orig_3d[3];
+       float   co_orig_2d[2];
+       float (*co_link_orig_3d)[3];
+       float (*co_link_orig_2d)[2];
+       int     co_link_tot;
+       int     co_link_curr;
+} TransDataVertSlideVert;
+
+typedef struct VertSlideData {
+       TransDataVertSlideVert *sv;
+       int totsv;
+
+       struct BMEditMesh *em;
 
        float perc;
 
-       int is_proportional;
-       int flipped_vtx;
+       bool is_proportional;
+       bool flipped_vtx;
 
        int curr_sv_index;
-} SlideData;
+} VertSlideData;
 
 typedef struct TransData {
        float  dist;         /* Distance needed to affect element (for Proportionnal Editing)                  */
@@ -243,8 +265,8 @@ typedef struct TransData {
 } TransData;
 
 typedef struct MouseInput {
-       void    (*apply)(struct TransInfo *, struct MouseInput *, const int [2], float [3]);
-       void    (*post)(struct TransInfo *, float [3]);
+       void    (*apply)(struct TransInfo *t, struct MouseInput *mi, const int mval[2], float output[3]);
+       void    (*post)(struct TransInfo *t, float values[3]);
 
        int     imval[2];               /* initial mouse position                */
        char    precision;
@@ -264,7 +286,7 @@ typedef struct TransInfo {
        float       fac;            /* factor for distance based transform  */
        int       (*transform)(struct TransInfo *, const int *);
                                                                /* transform function pointer           */
-       int       (*handleEvent)(struct TransInfo *, struct wmEvent *);
+       int       (*handleEvent)(struct TransInfo *, const struct wmEvent *);
                                                                /* event handler function pointer  RETURN 1 if redraw is needed */
        int         total;          /* total number of transformed data     */
        TransData  *data;           /* transformed data (array)             */
@@ -297,7 +319,6 @@ typedef struct TransInfo {
        float           vec[3];                 /* translation, to show for widget      */
        float           mat[3][3];              /* rot/rescale, to show for widget      */
 
-       char            *undostr;               /* if set, uses this string for undo            */
        float           spacemtx[3][3]; /* orientation matrix of the current space      */
        char            spacename[64];  /* name of the current space, MAX_NAME          */
 
@@ -320,7 +341,7 @@ typedef struct TransInfo {
        float           auto_values[4];
        float           axis[3];
        float           axis_orig[3];   /* TransCon can change 'axis', store the original value here */
-
+       
        void            *view;
        struct bContext *context; /* Only valid (non null) during an operator called function. */
        struct ScrArea  *sa;
@@ -328,8 +349,11 @@ typedef struct TransInfo {
        struct Scene    *scene;
        struct ToolSettings *settings;
        struct wmTimer *animtimer;
+       struct wmKeyMap *keymap;  /* so we can do lookups for header text */
        int         mval[2];        /* current mouse position               */
-       struct Object   *obedit;
+       float       zfac;           /* use for 3d view */
+       struct Object *obedit;
+       float          obedit_mat[3][3]; /* normalized editmode matrix (T_EDIT only) */
        void            *draw_handle_apply;
        void            *draw_handle_view;
        void            *draw_handle_pixel;
@@ -370,6 +394,8 @@ typedef struct TransInfo {
 
 #define T_PROP_EDIT                    (1 << 11)
 #define T_PROP_CONNECTED       (1 << 12)
+#define T_PROP_PROJECTED       (1 << 25)
+#define T_PROP_EDIT_ALL                (T_PROP_EDIT | T_PROP_CONNECTED | T_PROP_PROJECTED)
 
 #define T_V3D_ALIGN                    (1 << 14)
        /* for 2d views like uv or ipo */
@@ -449,26 +475,28 @@ typedef struct TransInfo {
 #define POINT_INIT             4
 #define MULTI_POINTS   8
 
-int initTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op, struct wmEvent *event, int mode);
+int initTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op, const struct wmEvent *event, int mode);
 void saveTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op);
-int  transformEvent(TransInfo *t, struct wmEvent *event);
+int  transformEvent(TransInfo *t, const struct wmEvent *event);
 void transformApply(struct bContext *C, TransInfo *t);
 int  transformEnd(struct bContext *C, TransInfo *t);
 
 void setTransformViewMatrices(TransInfo *t);
 void convertViewVec(TransInfo *t, float r_vec[3], int dx, int dy);
+void projectIntViewEx(TransInfo *t, const float vec[3], int adr[2], const eV3DProjTest flag);
 void projectIntView(TransInfo *t, const float vec[3], int adr[2]);
+void projectFloatViewEx(TransInfo *t, const float vec[3], float adr[2], const eV3DProjTest flag);
 void projectFloatView(TransInfo *t, const float vec[3], float adr[2]);
 
 void applyAspectRatio(TransInfo *t, float *vec);
 void removeAspectRatio(TransInfo *t, float *vec);
 
 void initWarp(TransInfo *t);
-int handleEventWarp(TransInfo *t, struct wmEvent *event);
+int handleEventWarp(TransInfo *t, const struct wmEvent *event);
 int Warp(TransInfo *t, const int mval[2]);
 
 void initShear(TransInfo *t);
-int handleEventShear(TransInfo *t, struct wmEvent *event);
+int handleEventShear(TransInfo *t, const struct wmEvent *event);
 int Shear(TransInfo *t, const int mval[2]);
 
 void initResize(TransInfo *t);
@@ -504,10 +532,6 @@ int Trackball(TransInfo *t, const int mval[2]);
 void initPushPull(TransInfo *t);
 int PushPull(TransInfo *t, const int mval[2]);
 
-void initBevel(TransInfo *t);
-int handleEventBevel(TransInfo *t, struct wmEvent *event);
-int Bevel(TransInfo *t, const int mval[2]);
-
 void initBevelWeight(TransInfo *t);
 int BevelWeight(TransInfo *t, const int mval[2]);
 
@@ -524,9 +548,13 @@ void initBoneRoll(TransInfo *t);
 int BoneRoll(TransInfo *t, const int mval[2]);
 
 void initEdgeSlide(TransInfo *t);
-int handleEventEdgeSlide(TransInfo *t, struct wmEvent *event);
+int handleEventEdgeSlide(TransInfo *t, const struct wmEvent *event);
 int EdgeSlide(TransInfo *t, const int mval[2]);
 
+void initVertSlide(TransInfo *t);
+int handleEventVertSlide(TransInfo *t, const struct wmEvent *event);
+int VertSlide(TransInfo *t, const int mval[2]);
+
 void initTimeTranslate(TransInfo *t);
 int TimeTranslate(TransInfo *t, const int mval[2]);
 
@@ -561,20 +589,22 @@ void flushTransGraphData(TransInfo *t);
 void remake_graph_transdata(TransInfo *t, struct ListBase *anim_data);
 void flushTransUVs(TransInfo *t);
 void flushTransParticles(TransInfo *t);
-int clipUVTransform(TransInfo *t, float *vec, int resize);
+bool clipUVTransform(TransInfo *t, float vec[2], const bool resize);
+void clipUVData(TransInfo *t);
 void flushTransNodes(TransInfo *t);
 void flushTransSeq(TransInfo *t);
 void flushTransTracking(TransInfo *t);
 void flushTransMasking(TransInfo *t);
 
 /*********************** exported from transform_manipulator.c ********** */
-int gimbal_axis(struct Object *ob, float gmat[][3]); /* return 0 when no gimbal for selection */
+int gimbal_axis(struct Object *ob, float gmat[3][3]); /* return 0 when no gimbal for selection */
 int calc_manipulator_stats(const struct bContext *C);
 
 /*********************** TransData Creation and General Handling *********** */
 void createTransData(struct bContext *C, TransInfo *t);
 void sort_trans_data_dist(TransInfo *t);
 void special_aftertrans_update(struct bContext *C, TransInfo *t);
+int  special_transform_moving(TransInfo *t);
 
 void transform_autoik_update(TransInfo *t, short mode);
 
@@ -590,13 +620,14 @@ void drawConstraint(TransInfo *t);
 
 void getConstraintMatrix(TransInfo *t);
 void setConstraint(TransInfo *t, float space[3][3], int mode, const char text[]);
+void setAxisMatrixConstraint(TransInfo *t, int mode, const char text[]);
 void setLocalConstraint(TransInfo *t, int mode, const char text[]);
 void setUserConstraint(TransInfo *t, short orientation, int mode, const char text[]);
 
 void constraintNumInput(TransInfo *t, float vec[3]);
 
-int isLockConstraint(TransInfo *t);
-int getConstraintSpaceDimension(TransInfo *t);
+bool isLockConstraint(TransInfo *t);
+int  getConstraintSpaceDimension(TransInfo *t);
 char constraintModeToChar(TransInfo *t);
 
 void startConstraint(TransInfo *t);
@@ -619,21 +650,21 @@ typedef enum {
 void snapGrid(TransInfo *t, float *val);
 void snapGridAction(TransInfo *t, float *val, GearsType action);
 
-int activeSnap(TransInfo *t);
-int validSnap(TransInfo *t);
+bool activeSnap(TransInfo *t);
+bool validSnap(TransInfo *t);
 
 void initSnapping(struct TransInfo *t, struct wmOperator *op);
 void applyProject(TransInfo *t);
 void applySnapping(TransInfo *t, float *vec);
 void resetSnapping(TransInfo *t);
-int  handleSnapping(TransInfo *t, struct wmEvent *event);
+bool handleSnapping(TransInfo *t, const struct wmEvent *event);
 void drawSnapping(const struct bContext *C, TransInfo *t);
-int usingSnappingNormal(TransInfo *t);
-int validSnappingNormal(TransInfo *t);
+bool usingSnappingNormal(TransInfo *t);
+bool validSnappingNormal(TransInfo *t);
 
 void getSnapPoint(TransInfo *t, float vec[3]);
 void addSnapPoint(TransInfo *t);
-int updateSelectedSnapPoint(TransInfo *t);
+bool updateSelectedSnapPoint(TransInfo *t);
 void removeSnapPoint(TransInfo *t);
 
 /********************** Mouse Input ******************************/
@@ -649,27 +680,27 @@ typedef enum {
        INPUT_HORIZONTAL_ABSOLUTE,
        INPUT_VERTICAL_RATIO,
        INPUT_VERTICAL_ABSOLUTE,
-       INPUT_CUSTOM_RATIO
+       INPUT_CUSTOM_RATIO,
+       INPUT_CUSTOM_RATIO_FLIP
 } MouseInputMode;
 
-void initMouseInput(TransInfo *t, MouseInput *mi, int center[2], int mval[2]);
+void initMouseInput(TransInfo *t, MouseInput *mi, const int center[2], const int mval[2]);
 void initMouseInputMode(TransInfo *t, MouseInput *mi, MouseInputMode mode);
-int handleMouseInput(struct TransInfo *t, struct MouseInput *mi, struct wmEvent *event);
+int handleMouseInput(struct TransInfo *t, struct MouseInput *mi, const struct wmEvent *event);
 void applyMouseInput(struct TransInfo *t, struct MouseInput *mi, const int mval[2], float output[3]);
 
-void setCustomPoints(TransInfo *t, MouseInput *mi, int start[2], int end[2]);
-void setInputPostFct(MouseInput *mi, void      (*post)(struct TransInfo *, float [3]));
+void setCustomPoints(TransInfo *t, MouseInput *mi, const int start[2], const int end[2]);
+void setInputPostFct(MouseInput *mi, void      (*post)(struct TransInfo *t, float values[3]));
 
 /*********************** Generics ********************************/
 
-int initTransInfo(struct bContext *C, TransInfo *t, struct wmOperator *op, struct wmEvent *event);
-void postTrans (struct bContext *C, TransInfo *t);
+int initTransInfo(struct bContext *C, TransInfo *t, struct wmOperator *op, const struct wmEvent *event);
+void postTrans(struct bContext *C, TransInfo *t);
+void resetTransModal(TransInfo *t);
 void resetTransRestrictions(TransInfo *t);
 
 void drawLine(TransInfo *t, const float center[3], const float dir[3], char axis, short options);
 
-void drawNonPropEdge(const struct bContext *C, TransInfo *t);
-
 /* DRAWLINE options flags */
 #define DRAWLIGHT      1
 
@@ -692,13 +723,9 @@ void getViewVector(TransInfo *t, float coord[3], float vec[3]);
 
 void initTransformOrientation(struct bContext *C, TransInfo *t);
 
-struct TransformOrientation *createObjectSpace(struct bContext *C, struct ReportList *reports, char *name, int overwrite);
-struct TransformOrientation *createMeshSpace(struct bContext *C, struct ReportList *reports, char *name, int overwrite);
-struct TransformOrientation *createBoneSpace(struct bContext *C, struct ReportList *reports, char *name, int overwrite);
-
 /* Those two fill in mat and return non-zero on success */
-int createSpaceNormal(float mat[3][3], float normal[3]);
-int createSpaceNormalTangent(float mat[3][3], float normal[3], float tangent[3]);
+bool createSpaceNormal(float mat[3][3], const float normal[3]);
+bool createSpaceNormalTangent(float mat[3][3], const float normal[3], const float tangent[3]);
 
 struct TransformOrientation *addMatrixSpace(struct bContext *C, float mat[3][3], char name[], int overwrite);
 void applyTransformOrientation(const struct bContext *C, float mat[3][3], char *name);
@@ -711,8 +738,15 @@ void applyTransformOrientation(const struct bContext *C, float mat[3][3], char *
 
 int getTransformOrientation(const struct bContext *C, float normal[3], float plane[3], int activeOnly);
 
-void freeSlideTempFaces(SlideData *sld);
-void freeSlideVerts(TransInfo *t);
-void projectSVData(TransInfo *t, int final);
+void freeEdgeSlideTempFaces(EdgeSlideData *sld);
+void freeEdgeSlideVerts(TransInfo *t);
+void projectEdgeSlideData(TransInfo *t, bool is_final);
+
+void freeVertSlideVerts(TransInfo *t);
+
+
+/* TODO. transform_queries.c */
+bool checkUseLocalCenter_GraphEdit(TransInfo *t);
+bool checkUseAxisMatrix(TransInfo *t);
 
 #endif