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