34ab8b95e7bbee584c37f062e1753b451bf3a9e8
[blender.git] / source / blender / src / transform_ndofinput.c
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: all of this file.
24  *
25  * Contributor(s): Martin Poirier
26  *
27  * ***** END GPL/BL DUAL LICENSE BLOCK *****
28  */
29  
30  #include <math.h>                      /* fabs */
31 #include <stdio.h>                      /* for sprintf          */
32
33 #include "BKE_global.h"         /* for G                        */
34 #include "BKE_utildefines.h"    /* ABS */
35
36 #include "DNA_view3d_types.h" /* for G.vd (view3d) */
37
38 #include "BIF_mywindow.h"
39
40 #include "mydevice.h"           /* for KEY defines      */
41
42 #include "transform.h"
43
44 int updateNDofMotion(NDofInput *n); // return 0 when motion is null
45 void resetNDofInput(NDofInput *n);
46
47 void initNDofInput(NDofInput *n)
48 {
49     int i;
50
51         n->flag = 0;
52         n->axis = 0;
53         
54         resetNDofInput(n);
55         
56         for(i = 0; i < 3; i++)
57         {
58                 n->factor[i] = 1.0f;
59         }
60 }
61
62 void resetNDofInput(NDofInput *n)
63 {       
64         int i;
65         for(i = 0; i < 7; i++)
66         {
67                 n->fval[i] = 0.0f;
68         }
69 }
70
71  
72 int handleNDofInput(NDofInput *n, unsigned short event, short val)
73 {
74         int retval = 0;
75
76         switch(event)
77         {
78                 case NDOFMOTION:
79                         if (updateNDofMotion(n) == 0)
80                         {
81                                 retval = NDOF_NOMOVE;
82                         }
83                         else
84                         {
85                                 retval = NDOF_REFRESH;
86                         }
87                         break;
88                 case NDOFBUTTON:
89                         if (val == 1) 
90                         {
91                                 retval = NDOF_CONFIRM;
92                         }
93                         else if (val == 2) 
94                         {
95                                 retval = NDOF_CANCEL;
96                                 resetNDofInput(n);
97                                 n->flag &= ~NDOF_INIT;
98                         }
99                         break;
100         }
101         
102         return retval;
103 }
104
105 int hasNDofInput(NDofInput *n)
106 {
107         return (n->flag & NDOF_INIT) == NDOF_INIT;
108 }
109
110 void applyNDofInput(NDofInput *n, float *vec)
111 {
112         if (hasNDofInput(n))
113         {
114                 int i, j;
115                 
116                 for (i = 0, j = 0; i < 7; i++)
117                 {
118                         if (n->axis & (1 << i))
119                         {
120                                 vec[j] = n->fval[i] * n->factor[j];
121                                 j++;
122                         }
123                 }
124         }
125 }
126
127
128 int updateNDofMotion(NDofInput *n)
129 {
130     float fval[7];
131     int i;
132     int retval = 0;
133
134         getndof(fval);
135
136         if (G.vd->ndoffilter)
137                 filterNDOFvalues(fval);
138                 
139         for(i = 0; i < 7; i++)
140         {
141                 if (!retval && fval[i] != 0.0f)
142                 {
143                         retval = 1;
144                 }
145                 
146                 n->fval[i] += fval[i] / 1024.0f;
147         }
148         
149         n->flag |= NDOF_INIT;
150         
151         return retval;
152 }
153
154
155
156