0146d1a2341d16e67469e563d62db62dac12d509
[blender.git] / source / blender / blenkernel / BKE_displist.h
1 /* display list (or rather multi purpose list) stuff */
2 /* 
3         $Id$
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 */
34
35 #ifndef BKE_DISPLIST_H
36 #define BKE_DISPLIST_H
37
38 /* dl->type */
39 #define DL_POLY                 0
40 #define DL_SEGM                 1
41 #define DL_SURF                 2
42 #define DL_TRIA                 3
43 #define DL_INDEX3               4
44 #define DL_INDEX4               5
45 #define DL_VERTCOL              6
46 #define DL_VERTS                7
47 #define DL_NORS                 8
48 #define DL_MESH                                 9
49
50 /* dl->flag */
51 #define DL_CYCL_U               1
52 #define DL_CYCL_V               2
53 #define DL_FRONT_CURVE  4
54 #define DL_BACK_CURVE   8
55
56 /* This should, of course, become a function */
57 #define DL_SURFINDEX(cyclu, cyclv, sizeu, sizev)            \
58 \
59 if( (cyclv)==0 && a==(sizev)-1) break;              \
60 if(cyclu) {                                                 \
61         p1= sizeu*a;                                        \
62                 p2= p1+ sizeu-1;                                    \
63                         p3= p1+ sizeu;                                      \
64                                 p4= p2+ sizeu;                                      \
65                                         b= 0;                                               \
66 }                                                           \
67 else {                                              \
68         p2= sizeu*a;                                        \
69                 p1= p2+1;                                           \
70                         p4= p2+ sizeu;                                      \
71                                 p3= p1+ sizeu;                                      \
72                                         b= 1;                                               \
73 }                                                           \
74 if( (cyclv) && a==sizev-1) {                        \
75         p3-= sizeu*sizev;                                   \
76                 p4-= sizeu*sizev;                                   \
77 }
78
79
80 /* prototypes */
81
82 struct Object;
83 struct Curve;
84 struct ListBase;
85 struct Material;
86 struct Bone;
87 struct Mesh;
88 struct TFace;
89 struct EditMesh;
90 struct EditEdge;
91 struct EditFace;
92
93 typedef struct DispListMesh DispListMesh;
94 struct DispListMesh {
95         int totvert, totedge, totface;
96         struct MVert *mvert;
97         struct MEdge *medge;
98         struct MCol *mcol;
99         struct MFace *mface;
100         struct TFace *tface;
101         struct EditEdge **editedge;     // added for subsurf, drawobject.c
102         struct EditFace **editface;     // added for subsurf, drawobject.c
103         float *nors; // facenormals
104         int flag;
105 };
106
107 void displistmesh_free(DispListMesh *dlm);
108 void displistmesh_calc_normals(DispListMesh *dlm);
109
110 void displistmesh_to_mesh(DispListMesh *dlm, struct Mesh *me);
111
112 DispListMesh *displistmesh_from_editmesh(struct EditMesh *em);
113 DispListMesh *displistmesh_from_mesh(struct Mesh *mesh, float *extverts);
114 DispListMesh *displistmesh_copy(DispListMesh *odlm);
115
116 /*
117  * All the different DispList.type's use the
118  * data in the displist structure in fairly
119  * different ways which can be rather confusing, 
120  * the best thing to do would be to make a structure
121  * for each displaylist type that has the fields
122  * needed w/ proper names, and then make the actual
123  * DispList structure a typed union.
124  *   - zr
125  */
126
127 /* needs splitting! */
128 typedef struct DispList {
129     struct DispList *next, *prev;
130     short type, flag;
131     int parts, nr;
132     short col, rt;              /* rt wordt gebruikt door initrenderNurbs */
133         float *verts, *nors;
134         int *index;
135         unsigned int *col1, *col2;
136         struct DispListMesh *mesh;
137         
138 } DispList;
139
140 extern void copy_displist(struct ListBase *lbn, struct ListBase *lb);
141 extern void free_disp_elem(DispList *dl);
142 extern void free_displist_by_type(struct ListBase *lb, int type);
143 extern DispList *find_displist_create(struct ListBase *lb, int type);
144 extern DispList *find_displist(struct ListBase *lb, int type);
145 extern void addnormalsDispList(struct Object *ob, struct ListBase *lb);
146 extern void count_displist(struct ListBase *lb, int *totvert, int *totface);
147 extern void curve_to_filledpoly(struct Curve *cu, struct ListBase *nurb, struct ListBase *dispbase);
148 extern void freedisplist(struct ListBase *lb);
149 extern int displist_has_faces(struct ListBase *lb);
150 extern float calc_taper(struct Object *taperobj, int cur, int tot);
151 extern void makeDispList(struct Object *ob);
152 extern void set_displist_onlyzero(int val);
153 extern void shadeDispList(struct Object *ob);
154 void freefastshade(void);
155 void boundbox_displist(struct Object *ob);
156 void imagestodisplist(void);
157 void reshadeall_displist(void);
158 void test_all_displists(void);
159
160 #endif
161