fabe20b378664dbf1bca8978718c6f388d16dc7f
[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 TransDataExtension {
59     float *rot;          /* Rotation of the data to transform (Faculative)                                 */
60     float  irot[3];      /* Initial rotation                                                               */
61     float *quat;         /* Rotation quaternion of the data to transform (Faculative)                      */
62     float  iquat[4];     /* Initial rotation quaternion                                                    */
63     float *size;         /* Size of the data to transform (Faculative)                                     */
64     float  isize[3];     /* Initial size                                                                   */
65         float  obmat[3][3];      /* Object matrix */
66
67         void *bone;                     /* BWARGH! old transform demanded it, added for now (ton) */
68 } TransDataExtension;
69
70 typedef struct TransData {
71         float  dist;         /* Distance to the nearest element (for Proportionnal Editing)                    */
72         float  factor;       /* Factor of the transformation (for Proportionnal Editing)                       */
73     float *loc;          /* Location of the data to transform                                              */
74     float  iloc[3];      /* Initial location                                                               */
75     float  center[3];
76     float  mtx[3][3];    /* Transformation matrix from data space to global space                          */
77     float  smtx[3][3];   /* Transformation matrix from global space to data space                          */
78         struct Object *ob;
79         struct TransDataExtension *ext;
80     int    flag;         /* Various flags */
81 } TransData;
82
83 typedef struct TransInfo {
84     int         mode;           /* current mode                         */
85     int       (*transform)(struct TransInfo *, short *);
86                                 /* transform function pointer           */
87     char        redraw;         /* redraw flag                          */
88     int         flags;          /* generic flags for special behaviors  */
89     int         total;          /* total number of transformed data     */
90         float           propsize;               /* proportional circle radius           */
91         char            proptext[20];   /* proportional falloff text                    */
92     float       center[3];      /* center of transformation             */
93     short       center2d[2];    /* center in screen coordinates         */
94     short       imval[2];       /* initial mouse position               */
95     TransData  *data;           /* transformed data (array)             */
96     TransCon    con;            /* transformed constraint               */
97     NumInput    num;            /* numerical input                      */
98     float       val;            /* init value for some transformations  */
99     float       fac;            /* factor for distance based transform  */
100 } TransInfo;
101
102
103 /* ******************** Macros & Prototypes *********************** */
104
105 /* MODE AND NUMINPUT FLAGS */
106 #define NOCONSTRAINT    1
107 #define NULLONE                 2
108 #define NONEGATIVE              4
109 #define NOZERO                  8
110 #define NOFRACTION              16
111
112 /* transinfo->mode */
113 #define TFM_REPEAT                      0
114 #define TFM_TRANSLATION         1
115 #define TFM_ROTATION            2
116 #define TFM_RESIZE                      3
117 #define TFM_TOSPHERE            4
118 #define TFM_SHEAR                       5
119 #define TFM_LAMP_ENERGY         6
120
121 #define APPLYCON                1
122 #define CONAXIS0                2
123 #define CONAXIS1                4
124 #define CONAXIS2                8
125
126 #define PROP_SHARP              0
127 #define PROP_SMOOTH             1
128 #define PROP_ROOT               2
129 #define PROP_LIN                3
130 #define PROP_CONST              4
131
132 /* transdata->flag */
133 #define TD_SELECTED             1
134 #define TD_NOACTION             2
135 #define TD_USEQUAT              4
136 #define TD_OBJECT               8
137
138 void Transform(int mode);
139
140 void initWrap(TransInfo *t);
141 int Wrap(TransInfo *t, short mval[2]);
142
143 void initShear(TransInfo *t);
144 int Shear(TransInfo *t, short mval[2]);
145
146 void initResize(TransInfo *t);
147 int Resize(TransInfo *t, short mval[2]);
148
149 void initTranslation(TransInfo *t);
150 int Translation(TransInfo *t, short mval[2]);
151
152 void initToSphere(TransInfo *t);
153 int ToSphere(TransInfo *t, short mval[2]);
154
155 void initRotation(TransInfo *t);
156 int Rotation(TransInfo *t, short mval[2]);
157
158 #endif
159