- added data arguments to deformer modifiers, in case someone wants
[blender.git] / source / blender / blenkernel / BKE_modifier.h
1 /**
2  *      
3  * $Id$ 
4  *
5  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version. The Blender
11  * Foundation also sells licenses for use in proprietary software under
12  * the Blender License.  See http://www.blender.org/BL/ for information
13  * about this.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software Foundation,
22  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23  *
24  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
25  * All rights reserved.
26  *
27  * The Original Code is: all of this file.
28  *
29  * Contributor(s): none yet.
30  *
31  * ***** END GPL/BL DUAL LICENSE BLOCK *****
32  */
33 #ifndef BKE_MODIFIER_H
34 #define BKE_MODIFIER_H
35
36 struct DerivedMesh;
37 struct ModifierData;
38 struct DagForest;
39 struct DagNode;
40 struct Object;
41
42 typedef enum {
43                 /* Should not be used, only for None modifier type */
44         eModifierTypeType_None,
45
46                 /* Modifier only does deformation, implies that modifier
47                  * type should have a valid deformVerts function. OnlyDeform
48                  * style modifiers implicitly accept either mesh or CV
49                  * input but should still declare flags appropriately.
50                  */
51         eModifierTypeType_OnlyDeform,
52
53         eModifierTypeType_Constructive,
54         eModifierTypeType_Nonconstructive,
55 } ModifierTypeType;
56
57 typedef enum {
58         eModifierTypeFlag_AcceptsMesh = (1<<0),
59         eModifierTypeFlag_AcceptsCVs = (1<<1),
60         eModifierTypeFlag_SupportsMapping = (1<<2),
61         eModifierTypeFlag_SupportsEditmode = (1<<3),
62 } ModifierTypeFlag;
63
64 typedef struct ModifierTypeInfo {
65                 /* The user visible name for this modifier */
66         char name[32];
67
68                 /* The DNA struct name for the modifier data type, used to
69                  * write the DNA data out.
70                  */
71         char structName[32];
72
73                 /* The size of the modifier data type, used by allocation. */
74         int structSize;
75
76         ModifierTypeType type;
77         ModifierTypeFlag flags;
78
79                 /* Initialize new instance data for this modifier type, this function
80                  * should set modifier variables to their default values.
81                  * 
82                  * This function is optional.
83                  */
84         void (*initData)(struct ModifierData *md);
85
86                 /* Free internal modifier data variables, this function should
87                  * not free the _md_ variable itself.
88                  *
89                  * This function is optional.
90                  */
91         void (*freeData)(struct ModifierData *md);
92
93                 /* Return a boolean value indicating if this modifier is able to be calculated
94                  * based on the modifier data. This is *not* regarding the md->flag, that is
95                  * tested by the system, this is just if the data validates (for example, a
96                  * lattice will return false if the lattice object is not defined).
97                  *
98                  * This function is optional (assumes never disabled if not present).
99                  */
100         int (*isDisabled)(struct ModifierData *md);
101
102                 /* Add the appropriate relations to the DEP graph depending on the modifier
103                  * data. 
104                  *
105                  * This function is optional.
106                  */
107         void (*updateDepgraph)(struct ModifierData *md, struct DagForest *forest, struct Object *ob, struct DagNode *obNode);
108
109                 /* Should return true if the modifier needs to be recalculated on time changes.
110                  *
111                  * This function is optional (assumes false if not present).
112                  */
113         int (*dependsOnTime)(struct ModifierData *md);
114
115                 /* Only for deform types, should apply the deformation
116                  * to the given vertex array. If the deformer requires information from
117                  * the object it can obtain it from the _derivedData_ argument if non-NULL,
118                  * and otherwise the _ob_ argument.
119                  */
120         void (*deformVerts)(struct ModifierData *md, struct Object *ob, void *derivedData, float (*vertexCos)[3], int numVerts);
121
122                 /* Like deformVerts but called during editmode (for supporting modifiers) */
123         void (*deformVertsEM)(struct ModifierData *md, struct Object *ob, void *editData, void *derivedData, float (*vertexCos)[3], int numVerts);
124
125                 /* For non-deform types: apply the modifier and return a new derived
126                  * data object (type is dependent on object type). If the _derivedData_
127                  * argument is non-NULL then the modifier should read the object data 
128                  * from the derived object instead of the actual object data. 
129                  *
130                  * If the _vertexCos_ argument is non-NULL then the modifier should read 
131                  * the vertex coordinates from that (even if _derivedData_ is non-NULL).
132                  * The length of the _vertexCos_ array is either the number of verts in
133                  * the derived object (if non-NULL) or otherwise the number of verts in
134                  * the original object.
135                  *
136                  * The _useRenderParams_ indicates if the modifier is being applied in
137                  * the service of the renderer which may alter quality settings.
138                  *
139                  * The _isFinalCalc_ parameter indicates if the modifier is being calculated
140                  * for a final result or for something temporary (like orcos). This is a hack
141                  * at the moment, it is meant so subsurf can know if it is safe to reuse its
142                  * internal cache.
143                  *
144                  * The modifier is expected to release (or reuse) the _derivedData_ argument
145                  * if non-NULL. The modifier *MAY NOT* share the _vertexCos_ argument.
146                  */
147         void *(*applyModifier)(struct ModifierData *md, struct Object *ob, void *derivedData, float (*vertexCos)[3], int useRenderParams, int isFinalCalc);
148
149                 /* Like applyModifier but called during editmode (for supporting modifiers).
150                  * 
151                  * The derived object that is returned must support the operations that are expected
152                  * from editmode objects. The same qualifications regarding _derivedData_ and _vertexCos_
153                  * apply as for applyModifier.
154                  */
155         void *(*applyModifierEM)(struct ModifierData *md, struct Object *ob, void *editData, void *derivedData, float (*vertexCos)[3]);
156 } ModifierTypeInfo;
157
158 ModifierTypeInfo *modifierType_get_info(ModifierType type);
159
160         /* Modifier utility calls, do call through type pointer and return
161          * default values if pointer is optional.
162          */
163 struct ModifierData*    modifier_new                    (int type);
164 void                                    modifier_free                   (struct ModifierData *md);
165
166 int                                             modifier_dependsOnTime  (struct ModifierData *md);
167
168 #endif
169