- added Mesh->derived and Mesh->decimated DerivedMesh pointers
[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 Object;
49 struct EditMesh;
50 struct DispListMesh;
51
52 typedef struct DerivedMesh DerivedMesh;
53 struct DerivedMesh {
54         /* Misc. Queries */
55
56         int (*getNumVerts)(DerivedMesh *dm);
57         int (*getNumFaces)(DerivedMesh *dm);
58
59         void (*getMappedVertCoEM)(DerivedMesh *dm, void *vert, float co_r[3]);
60
61                         /* Convert to new DispListMesh, should be free'd by caller */
62         struct DispListMesh* (*convertToDispListMesh)(DerivedMesh *dm);
63
64         /* Drawing Operations */
65
66                         /* Draw all vertices as bgl points (no options) */
67         void (*drawVerts)(DerivedMesh *dm);
68
69                         /* Draw all edges as lines (no options) */
70         void (*drawEdges)(DerivedMesh *dm);
71
72                         /* Draw mapped edges as lines (no options) */
73         void (*drawMappedEdges)(DerivedMesh *dm);
74                         
75                         /* Draw all edges without faces as lines (no options) */
76         void (*drawLooseEdges)(DerivedMesh *dm);
77
78                         
79                         /* Draw all faces
80                          *  o Set face normal or vertex normal based on inherited face flag
81                          *  o Use inherited face material index to call setMaterial
82                          */
83         void (*drawFacesSolid)(DerivedMesh *dm, void (*setMaterial)(int));
84
85                         /* Draw all faces
86                          *  o If useTwoSided, draw front and back using col arrays
87                          *  o col1,col2 are arrays of length numFace*4 of 4 component colors
88                          *    in ABGR format, and should be passed as per-face vertex color.
89                          */
90         void (*drawFacesColored)(DerivedMesh *dm, int useTwoSided, unsigned char *col1, unsigned char *col2);
91
92                         /* Draw all faces uses TFace 
93                          *  o Drawing options too complicated to enumerate, look at code.
94                          */
95         void (*drawFacesTex)(DerivedMesh *dm, int (*setDrawParams)(TFace *tf, int matnr));
96
97                         /* Draw single mapped vert as bgl point (no options) */
98         void (*drawMappedVertEM)(DerivedMesh *dm, void *vert);
99
100                         /* Draw mapped vertices as bgl points
101                          *  o Only if mapped EditVert->h==0
102                          */
103         void (*drawMappedVertsEM)(DerivedMesh *dm, int sel);
104
105                         /* Draw single mapped edge as lines (no options) */
106         void (*drawMappedEdgeEM)(DerivedMesh *dm, void *edge);
107
108                         /* Draw mapped edges as lines
109                          *  o If useColor==0, don't set color
110                          *  o If useColor==1, set color based on mapped (EditEdge->f&SELECT)
111                          *  o If useColor==2, set color based on mapped (EditVert->f&SELECT)
112                          *     - Should interpolate as nicely as possible across edge.
113                          *  o If onlySeams, only draw if mapped (EditEdge->seam)
114                          *  o Only if mapped EditEdge->h==0
115                          */
116         void (*drawMappedEdgesEM)(DerivedMesh *dm, int useColor, unsigned char *baseCol, unsigned char *selCol, int onlySeams);
117
118                         /* Draw all faces
119                          *  o If useColor, set color based on mapped (EditFace->f&SELECT)
120                          */
121         void (*drawFacesEM)(DerivedMesh *dm, int useColor, unsigned char *baseCol, unsigned char *selCol);
122
123                         /* Draw mapped verts as bgl points
124                          *  o Call setColor(offset+index) for each vert, where index is the
125                          *    vert's index in the EditMesh. Return offset+count where count
126                          *    is the total number of mapped verts.
127                          *  o Only if mapped EditVert->h==0
128                          */
129         int (*drawMappedVertsEMSelect)(DerivedMesh *dm, void (*setColor)(int index), int offset);
130
131                         /* Draw mapped edges as lines
132                          *  o Call setColor(offset+index) for each edge, where index is the
133                          *    edge's index in the EditMesh. Return offset+count where count
134                          *    is the total number of mapped edges.
135                          *  o Only if mapped EditEdge->h==0
136                          */
137         int (*drawMappedEdgesEMSelect)(DerivedMesh *dm, void (*setColor)(int index), int offset);
138
139                         /* Draw mapped faces
140                          *  o Call setColor(offset+index) for each face, where index is the
141                          *    face's index in the EditMesh. Return offset+count where count
142                          *    is the total number of mapped faces.
143                          *  o Only if mapped EditFace->h==0
144                          */
145         int (*drawMappedFacesEMSelect)(DerivedMesh *dm, void (*setColor)(int index), int offset);
146
147         void (*release)(DerivedMesh *dm);
148 };
149
150         /* Internal function, just temporarily exposed */
151 DerivedMesh *derivedmesh_from_displistmesh(struct EditMesh *em, struct DispListMesh *dlm);
152
153 DerivedMesh *mesh_get_derived(struct Object *ob);
154 DerivedMesh *mesh_get_base_derived(struct Object *ob);
155
156 DerivedMesh *mesh_get_derived_render(struct Object *ob, int *needsFree_r);
157
158         /* Utility function, just chooses appropriate DerivedMesh based
159          * on mesh flags. Release result if *needsFree_r is true.
160          */
161 DerivedMesh *mesh_get_cage_derived(struct Object *ob, int *needsFree_r);
162
163 #endif
164