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