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