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