Transform project.
[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 center[3];     /* transformation centre to define where to draw the view widget             
49                             ALWAYS in global space. Unlike the transformation center                  */
50     int   mode;          /* Mode flags of the Constraint                                              */
51     void  (*applyVec)(struct TransInfo *, struct TransData *, float *, float *);
52                          /* Apply function pointer for linear vectorial transformation                */
53                          /* The last two parameters are pointers to the in/out vectors                */
54     void  (*applyRot)(struct TransInfo *, struct TransData *, float [3]);
55                          /* Apply function pointer for rotation transformation (prototype will change */
56 } TransCon;
57
58 typedef struct TransDataIpokey {
59         int flag;                                       /* which keys */
60         float *locx, *locy, *locz;      /* channel pointers */
61         float *rotx, *roty, *rotz;
62         float *quatx, *quaty, *quatz, *quatw;
63         float *sizex, *sizey, *sizez;
64         float oldloc[9];                        /* storage old values */
65         float oldrot[9];
66         float oldsize[9];
67         float oldquat[12];
68 } TransDataIpokey;
69
70 typedef struct TransDataExtension {
71         float drot[3];           /* Initial object drot */
72         float dsize[3];          /* Initial object dsize */
73     float *rot;          /* Rotation of the data to transform (Faculative)                                 */
74     float  irot[3];      /* Initial rotation                                                               */
75     float *quat;         /* Rotation quaternion of the data to transform (Faculative)                      */
76     float  iquat[4];     /* Initial rotation quaternion                                                    */
77     float *size;         /* Size of the data to transform (Faculative)                                     */
78     float  isize[3];     /* Initial size                                                                   */
79         float  obmat[3][3];      /* Object matrix */  
80
81         void *bone;                     /* ARGH! old transform demanded it, added for now (ton) */
82 } TransDataExtension;
83
84 typedef struct TransData {
85         float  dist;         /* Distance to the nearest element (for Proportionnal Editing)                    */
86         float  factor;       /* Factor of the transformation (for Proportionnal Editing)                       */
87     float *loc;          /* Location of the data to transform                                              */
88     float  iloc[3];      /* Initial location                                                               */
89     float  center[3];
90     float  mtx[3][3];    /* Transformation matrix from data space to global space                          */
91     float  smtx[3][3];   /* Transformation matrix from global space to data space                          */
92         struct Object *ob;
93         TransDataExtension *ext;        /* for objects, poses. 1 single malloc per TransInfo! */
94         TransDataIpokey *tdi;           /* for objects, ipo keys. per transdata a malloc */
95     int    flag;         /* Various flags */
96 } TransData;
97
98 typedef struct TransInfo {
99     int         mode;           /* current mode                         */
100     int       (*transform)(struct TransInfo *, short *);
101                                 /* transform function pointer           */
102     char        redraw;         /* redraw flag                          */
103     int         flags;          /* generic flags for special behaviors  */
104     int         total;          /* total number of transformed data     */
105         float           propsize;               /* proportional circle radius           */
106         char            proptext[20];   /* proportional falloff text                    */
107     float       center[3];      /* center of transformation             */
108     short       center2d[2];    /* center in screen coordinates         */
109     short       imval[2];       /* initial mouse position               */
110     TransData  *data;           /* transformed data (array)             */
111     TransCon    con;            /* transformed constraint               */
112     NumInput    num;            /* numerical input                      */
113     float       val;            /* init value for some transformations  */
114     float       fac;            /* factor for distance based transform  */
115 } TransInfo;
116
117
118 /* ******************** Macros & Prototypes *********************** */
119
120 /* MODE AND NUMINPUT FLAGS */
121 #define NOCONSTRAINT    1
122 #define NULLONE                 2
123 #define NONEGATIVE              4
124 #define NOZERO                  8
125 #define NOFRACTION              16
126
127 /* transinfo->mode */
128 #define TFM_REPEAT                      0
129 #define TFM_TRANSLATION         1
130 #define TFM_ROTATION            2
131 #define TFM_RESIZE                      3
132 #define TFM_TOSPHERE            4
133 #define TFM_SHEAR                       5
134 #define TFM_LAMP_ENERGY         6
135
136 #define APPLYCON                1
137 #define CONAXIS0                2
138 #define CONAXIS1                4
139 #define CONAXIS2                8
140
141 #define PROP_SHARP              0
142 #define PROP_SMOOTH             1
143 #define PROP_ROOT               2
144 #define PROP_LIN                3
145 #define PROP_CONST              4
146
147 /* transdata->flag */
148 #define TD_SELECTED             1
149 #define TD_NOACTION             2
150 #define TD_USEQUAT              4
151 #define TD_OBJECT               8
152
153 void Transform(int mode);
154
155 void initWrap(TransInfo *t);
156 int Wrap(TransInfo *t, short mval[2]);
157
158 void initShear(TransInfo *t);
159 int Shear(TransInfo *t, short mval[2]);
160
161 void initResize(TransInfo *t);
162 int Resize(TransInfo *t, short mval[2]);
163
164 void initTranslation(TransInfo *t);
165 int Translation(TransInfo *t, short mval[2]);
166
167 void initToSphere(TransInfo *t);
168 int ToSphere(TransInfo *t, short mval[2]);
169
170 void initRotation(TransInfo *t);
171 int Rotation(TransInfo *t, short mval[2]);
172
173 #endif
174