Fix for bug: cross platform strand render differences with kink/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 #include "DNA_customdata_types.h"
39 #include "BKE_customdata.h"
40
41 /* dl->type */
42 #define DL_POLY                 0
43 #define DL_SEGM                 1
44 #define DL_SURF                 2
45 #define DL_INDEX3               4
46 #define DL_INDEX4               5
47 #define DL_VERTCOL              6
48 #define DL_VERTS                                7
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 #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 Base;
82 struct Object;
83 struct Curve;
84 struct ListBase;
85 struct Material;
86 struct Bone;
87 struct Mesh;
88
89
90 /* used for curves, nurbs, mball, importing */
91 typedef struct DispList {
92     struct DispList *next, *prev;
93     short type, flag;
94     int parts, nr;
95     short col, rt;              /* rt used by initrenderNurbs */
96         float *verts, *nors;
97         int *index;
98         unsigned int *col1, *col2;
99         int charidx;
100         int totindex;                           /* indexed array drawing surfaces */
101
102         unsigned int *bevelSplitFlag;
103 } DispList;
104
105 extern void copy_displist(struct ListBase *lbn, struct ListBase *lb);
106 extern void free_disp_elem(DispList *dl);
107 extern DispList *find_displist_create(struct ListBase *lb, int type);
108 extern DispList *find_displist(struct ListBase *lb, int type);
109 extern void addnormalsDispList(struct Object *ob, struct ListBase *lb);
110 extern void count_displist(struct ListBase *lb, int *totvert, int *totface);
111 extern void freedisplist(struct ListBase *lb);
112 extern int displist_has_faces(struct ListBase *lb);
113 extern void makeDerivedMesh(struct Object *ob, CustomDataMask dataMask);
114 extern void makeDispListSurf(struct Object *ob, struct ListBase *dispbase, int forRender);
115 extern void makeDispListCurveTypes(struct Object *ob, int forOrco);
116 extern void makeDispListMBall(struct Object *ob);
117 extern void shadeDispList(struct Base *base);
118 extern void shadeMeshMCol(struct Object *ob, struct Mesh *me);
119
120 void imagestodisplist(void);
121 void reshadeall_displist(void);
122 void filldisplist(struct ListBase *dispbase, struct ListBase *to);
123
124 void fastshade_free_render(void);
125
126 float calc_taper(struct Object *taperobj, int cur, int tot);
127
128 #endif
129