- split {curve,lattice,armature}_deform_verts out of mesh_deform
[blender.git] / source / blender / blenkernel / BKE_modifier.h
1 /**
2  *      
3  * $$ 
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 Object;
39
40 typedef enum {
41                 /* Should not be used, only for None modifier type */
42         eModifierTypeType_None,
43
44                 /* Modifier only does deformation, implies that modifier
45                  * type should have a valid deformVerts function. OnlyDeform
46                  * style modifiers implicitly accept either mesh or CV
47                  * input but should still declare flags appropriately.
48                  */
49         eModifierTypeType_OnlyDeform,
50
51         eModifierTypeType_Constructive,
52         eModifierTypeType_Nonconstructive,
53 } ModifierTypeType;
54
55 typedef enum {
56         eModifierTypeFlag_AcceptsMesh = (1<<0),
57         eModifierTypeFlag_AcceptsCVs = (1<<1),
58         eModifierTypeFlag_SupportsMapping = (1<<2),
59         eModifierTypeFlag_RequiresObject = (1<<3),
60 } ModifierTypeFlag;
61
62 typedef struct ModifierTypeInfo {
63         char name[32], structName[32];
64         ModifierTypeType type;
65         ModifierTypeFlag flags;
66
67                 /* Create new instance data for this modifier type.
68                  * 
69                  * This function must be present.
70                  */
71         struct ModifierData *(*allocData)(void);
72
73                 /* Return a boolean value indicating if this modifier is able to be calculated
74                  * based on the modifier data. This is *not* regarding the md->flag, that is
75                  * tested by the system, this is just if the data validates (for example, a
76                  * lattice will return false if the lattice object is not defined).
77                  *
78                  * This function must be present.
79                  */
80         int (*isDisabled)(struct ModifierData *md);
81
82                 /* Only for deform types, should apply the deformation
83                  * to the given vertex array. Object is guaranteed to be
84                  * non-NULL.
85                  */
86         void (*deformVerts)(struct ModifierData *md, struct Object *ob, float (*vertexCos)[3], int numVerts);
87
88                 /* For non-deform types: apply the modifier and return a new derived
89                  * data object (type is dependent on object type). If the _derivedData_
90                  * argument is non-NULL then the modifier should read the object data 
91                  * from the derived object instead of the _data_ object. 
92                  *
93                  * If the _vertexCos_ argument is non-NULL then the modifier should read 
94                  * the vertex coordinates from that (even if _derivedData_ is non-NULL).
95                  * The length of the _vertexCos_ array is either the number of verts in
96                  * the derived object (if non-NULL) or otherwise the number of verts in
97                  * the original object.
98                  *
99                  * The _useRenderParams_ indicates if the modifier is being applied in
100                  * the service of the renderer which may alter quality settings.
101                  *
102                  * The modifier is expected to release (or reuse) the _derivedData_ argument
103                  * if non-NULL. The modifier *MAY NOT* share the _vertexCos_ argument.
104                  *
105                  * It is possible for _ob_ to be NULL if the modifier type is not flagged
106                  * to require an object. A NULL _ob_ occurs when original coordinate data
107                  * is requested for an object.
108                  */
109         void *(*applyModifier)(struct ModifierData *md, void *data, struct Object *ob, 
110                                                                                 void *derivedData, float (*vertexCos)[3], int useRenderParams);
111 } ModifierTypeInfo;
112
113 ModifierTypeInfo *modifierType_get_info(ModifierType type);
114
115 #endif
116