- added modifiers_getVirtualModifierList, returns pointer to first modifier
[blender.git] / source / blender / blenkernel / intern / deform.c
1 /*  deform.c   June 2001
2  *  
3  *  support for deformation groups
4  * 
5  *      Reevan McKay
6  *
7  * $Id$
8  *
9  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version. The Blender
15  * Foundation also sells licenses for use in proprietary software under
16  * the Blender License.  See http://www.blender.org/BL/ for information
17  * about this.
18  *
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, write to the Free Software Foundation,
26  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
27  *
28  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
29  * All rights reserved.
30  *
31  * The Original Code is: all of this file.
32  *
33  * Contributor(s): none yet.
34  *
35  * ***** END GPL/BL DUAL LICENSE BLOCK *****
36  */
37
38 #include <string.h>
39 #include <math.h>
40
41 #include "MEM_guardedalloc.h"
42
43 #include "DNA_curve_types.h"
44 #include "DNA_effect_types.h"
45 #include "DNA_lattice_types.h"
46 #include "DNA_mesh_types.h"
47 #include "DNA_meshdata_types.h"
48 #include "DNA_object_types.h"
49 #include "DNA_object_force.h"
50 #include "DNA_scene_types.h"
51
52 #include "BKE_curve.h"
53 #include "BKE_deform.h"
54 #include "BKE_displist.h"
55 #include "BKE_effect.h"
56 #include "BKE_global.h"
57 #include "BKE_key.h"
58 #include "BKE_lattice.h"
59 #include "BKE_object.h"
60 #include "BKE_softbody.h"
61 #include "BKE_utildefines.h"
62 #include "BKE_mesh.h"
63
64 #include "BLI_blenlib.h"
65 #include "BLI_arithb.h"
66
67 #ifdef HAVE_CONFIG_H
68 #include <config.h>
69 #endif
70
71
72 void copy_defgroups(ListBase *outbase, ListBase *inbase)
73 {
74         bDeformGroup *defgroup, *defgroupn;
75
76         outbase->first= outbase->last= 0;
77
78         for (defgroup = inbase->first; defgroup; defgroup=defgroup->next){
79                 defgroupn= copy_defgroup(defgroup);
80                 BLI_addtail(outbase, defgroupn);
81         }
82 }
83
84 bDeformGroup* copy_defgroup (bDeformGroup *ingroup)
85 {
86         bDeformGroup *outgroup;
87
88         if (!ingroup)
89                 return NULL;
90
91         outgroup=MEM_callocN(sizeof(bDeformGroup), "deformGroup");
92         
93         /* For now, just copy everything over. */
94         memcpy (outgroup, ingroup, sizeof(bDeformGroup));
95
96         outgroup->next=outgroup->prev=NULL;
97
98         return outgroup;
99 }
100
101 bDeformGroup *get_named_vertexgroup(Object *ob, char *name)
102 {
103         /* return a pointer to the deform group with this name
104          * or return NULL otherwise.
105          */
106         bDeformGroup *curdef;
107
108         for (curdef = ob->defbase.first; curdef; curdef=curdef->next){
109                 if (!strcmp(curdef->name, name)){
110                         return curdef;
111                 }
112         }
113         return NULL;
114 }
115
116 int  get_defgroup_num (Object *ob, bDeformGroup *dg)
117 {
118         /* Fetch the location of this deform group
119          * within the linked list of deform groups.
120          * (this number is stored in the deform
121          * weights of the deform verts to link them
122          * to this deform group) deform deform
123          * deform blah blah deform
124          */
125
126         bDeformGroup    *eg;
127         int def_nr;
128
129         eg = ob->defbase.first;
130         def_nr = 0;
131
132         /* loop through all deform groups
133          */
134         while (eg != NULL){
135
136                 /* if the current deform group is
137                  * the one we are after, return
138                  * def_nr
139                  */
140                 if (eg == dg){
141                         break;
142                 }
143                 ++def_nr;
144                 eg = eg->next;
145         }
146
147         /* if there was no deform group found then
148          * return -1 (should set up a nice symbolic
149          * constant for this)
150          */
151         if (eg == NULL) return -1;
152         
153         return def_nr;
154     
155 }
156
157 /* *************** HOOK ****************** */
158
159 int curve_modifier(Object *ob, char mode)
160 {
161         static ListBase nurb={NULL, NULL};
162         Curve *cu= ob->data;
163         Nurb *nu, *newnu;
164         int done= 0;
165         
166         do_curve_key(cu);
167         
168         /* conditions if it's needed */
169         if(ob->parent && ob->partype==PARSKEL); 
170         else if(ob->parent && ob->parent->type==OB_LATTICE);
171         else return 0;
172         
173         if(mode=='s') { // "start"
174                 /* copy  */
175                 nurb.first= nurb.last= NULL;    
176                 nu= cu->nurb.first;
177                 while(nu) {
178                         newnu= duplicateNurb(nu);
179                         BLI_addtail(&nurb, newnu);
180                         nu= nu->next;
181                 }
182         }
183         else if(mode=='e') {
184                 /* paste */
185                 freeNurblist(&cu->nurb);
186                 cu->nurb= nurb;
187         }
188         else if(mode=='a') {
189                 freeNurblist(&nurb);
190         }
191         
192         return done;
193 }
194
195 int lattice_modifier(Object *ob, char mode)
196 {
197         Lattice *lt = ob->data;
198
199         do_latt_key(lt);
200         
201         return 0;
202 }
203