58d6658791d07c3b2f6fd1837035ef3625454d01
[blender.git] / source / blender / src / transform.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  */
32
33 #ifndef TRANSFORM_H
34 #define TRANSFORM_H
35
36 #include "transform_numinput.h"
37 #include "BIF_transform.h"
38
39 /* ************************** Types ***************************** */
40
41 struct TransInfo;
42 struct TransData;
43
44 typedef struct TransCon {
45     char  text[50];      /* Description of the Constraint for header_print                            */
46     float mtx[3][3];     /* Matrix of the Constraint space                                            */
47     float imtx[3][3];    /* Inverse Matrix of the Constraint space                                    */
48     float pmtx[3][3];    /* Projection Constraint Matrix (same as imtx with some axis == 0)           */
49     float center[3];     /* transformation centre to define where to draw the view widget             
50                             ALWAYS in global space. Unlike the transformation center                  */
51         short imval[2];      /* initial mouse value for visual calculation                                */
52                              /* the one in TransInfo is not garanty to stay the same (Rotates change it)  */
53     int   mode;          /* Mode flags of the Constraint                                              */
54         void  (*drawExtra)(struct TransInfo *);
55                                                  /* For constraints that needs to draw differently from the other
56                                                         uses this instead of the generic draw function                                                    */
57     void  (*applyVec)(struct TransInfo *, struct TransData *, float *, float *, float *);
58                          /* Apply function pointer for linear vectorial transformation                */
59                          /* The last three parameters are pointers to the in/out/printable vectors    */
60     void  (*applySize)(struct TransInfo *, struct TransData *, float [3][3]);
61                          /* Apply function pointer for rotation transformation (prototype will change */
62     void  (*applyRot)(struct TransInfo *, struct TransData *, float [3]);
63                          /* Apply function pointer for rotation transformation (prototype will change */
64 } TransCon;
65
66 typedef struct TransDataIpokey {
67         int flag;                                       /* which keys */
68         float *locx, *locy, *locz;      /* channel pointers */
69         float *rotx, *roty, *rotz;
70         float *quatx, *quaty, *quatz, *quatw;
71         float *sizex, *sizey, *sizez;
72         float oldloc[9];                        /* storage old values */
73         float oldrot[9];
74         float oldsize[9];
75         float oldquat[12];
76 } TransDataIpokey;
77
78 typedef struct TransDataExtension {
79         float drot[3];           /* Initial object drot */
80         float dsize[3];          /* Initial object dsize */
81     float *rot;          /* Rotation of the data to transform (Faculative)                                 */
82     float  irot[3];      /* Initial rotation                                                               */
83     float *quat;         /* Rotation quaternion of the data to transform (Faculative)                      */
84     float  iquat[4];     /* Initial rotation quaternion                                                    */
85     float *size;         /* Size of the data to transform (Faculative)                                     */
86     float  isize[3];     /* Initial size                                                                   */
87         float  obmat[3][3];      /* Object matrix */  
88         void *bone;                     /* ARGH! old transform demanded it, added for now (ton) */
89 } TransDataExtension;
90
91 typedef struct TransData {
92         float  dist;         /* Distance needed to affect element (for Proportionnal Editing)                  */
93         float  rdist;        /* Distance to the nearest element (for Proportionnal Editing)                    */
94         float  factor;       /* Factor of the transformation (for Proportionnal Editing)                       */
95     float *loc;          /* Location of the data to transform                                              */
96     float  iloc[3];      /* Initial location                                                               */
97         float *val;          /* Value pointer for special transforms */
98         float  ival;         /* Old value*/
99     float  center[3];    /* Individual data center                                                         */
100     float  mtx[3][3];    /* Transformation matrix from data space to global space                          */
101     float  smtx[3][3];   /* Transformation matrix from global space to data space                          */
102         float  axismtx[3][3];/* Axis orientation matrix of the data                                            */
103         struct Object *ob;
104         TransDataExtension *ext;        /* for objects, poses. 1 single malloc per TransInfo! */
105         TransDataIpokey *tdi;           /* for objects, ipo keys. per transdata a malloc */
106     int    flag;         /* Various flags */
107 } TransData;
108
109 typedef struct TransInfo {
110     int         mode;           /* current mode                         */
111     int         context;        /* current context                      */
112     int       (*transform)(struct TransInfo *, short *);
113                                 /* transform function pointer           */
114     char        redraw;         /* redraw flag                          */
115     int         flag;          /* generic flags for special behaviors  */
116     int         total;          /* total number of transformed data     */
117         float           propsize;               /* proportional circle radius           */
118         char            proptext[20];   /* proportional falloff text                    */
119     float       center[3];      /* center of transformation             */
120     short       center2d[2];    /* center in screen coordinates         */
121     short       imval[2];       /* initial mouse position               */
122         short           shiftmval[2];   /* mouse position when shift was pressed */
123         short       idx_max;
124         float           snap[3];                /* Snapping Gears                                               */
125     TransData  *data;           /* transformed data (array)             */
126         TransDataExtension *ext;        /* transformed data extension (array)   */
127     TransCon    con;            /* transformed constraint               */
128     NumInput    num;            /* numerical input                      */
129     float       val;            /* init value for some transformations (and rotation angle)  */
130     float       fac;            /* factor for distance based transform  */
131         
132         float           viewmat[4][4];  /* copy from G.vd, prevents feedback    */
133         float           viewinv[4][4];
134         float           persinv[4][4];
135         
136         float           vec[3];                 /* translation, to show for widget      */
137         float           mat[3][3];              /* rot/rescale, to show for widget      */
138 } TransInfo;
139
140
141 /* ******************** Macros & Prototypes *********************** */
142
143 /* MODE AND NUMINPUT FLAGS */
144 #define NOCONSTRAINT    1
145 #define NULLONE                 2
146 #define NONEGATIVE              4
147 #define NOZERO                  8
148 #define NOFRACTION              16
149 #define AFFECTALL               32
150
151 /* transinfo->flag */
152 #define T_OBJECT                1
153 #define T_EDIT                  2
154 #define T_POSE                  4
155 #define T_TEXTURE               8
156 #define T_CAMERA                16
157                 // when shift pressed, higher resolution transform. cannot rely on G.qual, need event!
158 #define T_SHIFT_MOD             32
159                 // for manipulator exceptions, like scaling using center point, drawing help lines
160 #define T_USES_MANIPULATOR      128
161
162
163 /* transinfo->con->mode */
164 #define CON_APPLY               1
165 #define CON_AXIS0               2
166 #define CON_AXIS1               4
167 #define CON_AXIS2               8
168 #define CON_SELECT              16
169 #define CON_NOFLIP              32      /* does not reorient vector to face viewport when on */
170
171 /* transdata->flag */
172 #define TD_SELECTED             1
173 #define TD_NOACTION             2
174 #define TD_USEQUAT              4
175 #define TD_NOTCONNECTED 8
176
177 void initWarp(TransInfo *t);
178 int Warp(TransInfo *t, short mval[2]);
179
180 void initShear(TransInfo *t);
181 int Shear(TransInfo *t, short mval[2]);
182
183 void initResize(TransInfo *t);
184 int Resize(TransInfo *t, short mval[2]);
185
186 void initTranslation(TransInfo *t);
187 int Translation(TransInfo *t, short mval[2]);
188
189 void initToSphere(TransInfo *t);
190 int ToSphere(TransInfo *t, short mval[2]);
191
192 void initRotation(TransInfo *t);
193 int Rotation(TransInfo *t, short mval[2]);
194
195 void initShrinkFatten(TransInfo *t);
196 int ShrinkFatten(TransInfo *t, short mval[2]);
197
198 void initTilt(TransInfo *t);
199 int Tilt(TransInfo *t, short mval[2]);
200
201 void initTrackball(TransInfo *t);
202 int Trackball(TransInfo *t, short mval[2]);
203
204 /* exported from transform.c */
205 struct ListBase;
206 void count_bone_select(struct ListBase *lb, int *counter);
207
208 /* exported from transform_manipulator.c */
209 struct ScrArea;
210 void draw_manipulator_ext(struct ScrArea *sa, int type, char axis, int col, float vec[3], float mat[][3]);
211
212
213 #endif
214