1b594e6d49275d6116cd9d5d55850d2b6b457a1b
[blender.git] / source / blender / blenkernel / BKE_DerivedMesh.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 BKE_DERIVEDMESH_H
34 #define BKE_DERIVEDMESH_H
35
36 /* TODO (Probably)
37  *
38  *  o Make drawMapped* functions take a predicate function that
39  *    determines whether to draw the edge (this predicate can
40  *    also set color, etc). This will be slightly more general 
41  *    and allow some of the functions to be collapsed.
42  *  o Once accessor functions are added then single element draw
43  *    functions can be implemented using primitive accessors.
44  *  o Add function to dispatch to renderer instead of using
45  *    conversion to DLM.
46  */
47
48 struct MVert;
49 struct Object;
50 struct EditMesh;
51 struct DispListMesh;
52 struct ModifierData;
53
54 typedef struct DerivedMesh DerivedMesh;
55 struct DerivedMesh {
56         /* Misc. Queries */
57
58                 /* Also called in Editmode */
59         int (*getNumVerts)(DerivedMesh *dm);
60                 /* Also called in Editmode */
61         int (*getNumFaces)(DerivedMesh *dm);
62
63                 /* Iterate over each mapped vertex in the derived mesh, calling the
64                  * given function with the original vert and the mapped vert's new
65                  * coordinate and normal. For historical reasons the normal can be
66                  * passed as a float or short array, only one should be non-NULL.
67                  */
68         void (*foreachMappedVert)(DerivedMesh *dm, void (*func)(void *userData, int index, float *co, float *no_f, short *no_s), void *userData);
69
70                 /* Iterate over each mapped vertex in the derived mesh, calling the
71                  * given function with the original vert and the mapped edge's new
72                  * coordinates.
73                  */
74         void (*foreachMappedEdge)(DerivedMesh *dm, void (*func)(void *userData, int index, float *v0co, float *v1co), void *userData);
75
76                 /* Iterate over each mapped face in the derived mesh, calling the
77                  * given function with the original face and the mapped face's (or
78                  * faces') center and normal.
79                  */
80         void (*foreachMappedFaceCenter)(DerivedMesh *dm, void (*func)(void *userData, int index, float *cent, float *no), void *userData);
81
82                 /* Convert to new DispListMesh, should be free'd by caller.
83                  *
84                  * If allowShared is true then the caller is committing to not free'ng
85                  * the DerivedMesh before free'ng the DispListMesh, which means that
86                  * certain fields of the returned DispListMesh can safely be share with
87                  * the DerivedMesh's internal data.
88                  */
89         struct DispListMesh* (*convertToDispListMesh)(DerivedMesh *dm, int allowShared);
90
91                 /* Iterate over all vertex points, calling DO_MINMAX with given args.
92                  *
93                  * Also called in Editmode
94                  */
95         void (*getMinMax)(DerivedMesh *dm, float min_r[3], float max_r[3]);
96
97         /* Direct Access Operations */
98         /*  o Can be undefined */
99         /*  o Must be defined for modifiers that only deform however */
100                         
101                 /* Get vertex location, undefined if index is not valid */
102         void (*getVertCo)(DerivedMesh *dm, int index, float co_r[3]);
103
104                 /* Fill the array (of length .getNumVerts()) with all vertex locations  */
105         void (*getVertCos)(DerivedMesh *dm, float (*cos_r)[3]);
106
107                 /* Get vertex normal, undefined if index is not valid */
108         void (*getVertNo)(DerivedMesh *dm, int index, float no_r[3]);
109
110         /* Drawing Operations */
111
112                         /* Draw all vertices as bgl points (no options) */
113         void (*drawVerts)(DerivedMesh *dm);
114
115                         /* Draw edges in the UV mesh (if exists) */
116         void (*drawUVEdges)(DerivedMesh *dm);
117
118                         /* Draw all edges as lines (no options) 
119                          *
120                          * Also called for *final* editmode DerivedMeshes
121                          */
122         void (*drawEdges)(DerivedMesh *dm, int drawLooseEdges);
123         
124                         /* Draw all loose edges (edges w/ no adjoining faces) */
125         void (*drawLooseEdges)(DerivedMesh *dm);
126
127                         /* Draw all faces
128                          *  o Set face normal or vertex normal based on inherited face flag
129                          *  o Use inherited face material index to call setMaterial
130                          *  o Only if setMaterial returns true
131                          *
132                          * Also called for *final* editmode DerivedMeshes
133                          */
134         void (*drawFacesSolid)(DerivedMesh *dm, int (*setMaterial)(int));
135
136                         /* Draw all faces
137                          *  o If useTwoSided, draw front and back using col arrays
138                          *  o col1,col2 are arrays of length numFace*4 of 4 component colors
139                          *    in ABGR format, and should be passed as per-face vertex color.
140                          */
141         void (*drawFacesColored)(DerivedMesh *dm, int useTwoSided, unsigned char *col1, unsigned char *col2);
142
143                         /* Draw all faces uses TFace 
144                          *  o Drawing options too complicated to enumerate, look at code.
145                          */
146         void (*drawMappedFacesTex)(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int matnr), void *userData);
147
148                         /* Draw mapped faces (no color, or texture)
149                          *  o Only if !setDrawOptions or setDrawOptions(userData, mapped-face-index, drawSmooth_r) returns true
150                          *
151                          * If drawSmooth is set to true then vertex normals should be set and glShadeModel
152                          * called with GL_SMOOTH. Otherwise the face normal should be set and glShadeModel
153                          * called with GL_FLAT.
154                          *
155                          * The setDrawOptions is allowed to not set drawSmooth (for example, when lighting
156                          * is disabled), in which case the implementation should draw as smooth shaded.
157                          */
158         void (*drawMappedFaces)(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors);
159
160                         /* Draw mapped edges as lines
161                          *  o Only if !setDrawOptions or setDrawOptions(userData, mapped-edge) returns true
162                          */
163         void (*drawMappedEdges)(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData);
164
165                         /* Draw mapped edges as lines with interpolation values
166                          *  o Only if !setDrawOptions or setDrawOptions(userData, mapped-edge, mapped-v0, mapped-v1, t) returns true
167                          *
168                          * NOTE: This routine is optional!
169                          */
170         void (*drawMappedEdgesInterp)(DerivedMesh *dm, 
171                                                                         int (*setDrawOptions)(void *userData, int index), 
172                                                                         void (*setDrawInterpOptions)(void *userData, int index, float t),
173                                                                         void *userData);
174
175         void (*release)(DerivedMesh *dm);
176 };
177
178     /* Simple function to get me->totvert amount of vertices/normals,
179        correctly deformed and subsurfered. Needed especially when vertexgroups are involved.
180        In use now by vertex/weigt paint and particles */
181 float *mesh_get_mapped_verts_nors(struct Object *ob);
182
183         /* Internal function, just temporarily exposed */
184 DerivedMesh *derivedmesh_from_displistmesh(struct DispListMesh *dlm, float (*vertexCos)[3]);
185
186 DerivedMesh *mesh_get_derived_final(struct Object *ob, int *needsFree_r);
187 DerivedMesh *mesh_get_derived_deform(struct Object *ob, int *needsFree_r);
188
189 DerivedMesh *mesh_create_derived_for_modifier(struct Object *ob, struct ModifierData *md);
190
191 DerivedMesh *mesh_create_derived_render(struct Object *ob);
192 DerivedMesh *mesh_create_derived_no_deform(struct Object *ob, float (*vertCos)[3]);
193 DerivedMesh *mesh_create_derived_no_deform_render(struct Object *ob, float (*vertCos)[3]);
194
195 DerivedMesh *editmesh_get_derived_base(void);
196 DerivedMesh *editmesh_get_derived_cage(int *needsFree_r);
197 DerivedMesh *editmesh_get_derived_cage_and_final(DerivedMesh **final_r, int *cageNeedsFree_r, int *finalNeedsFree_r);
198
199 #endif
200