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