Added custom vertex/edge/face data for meshes:
[blender.git] / source / blender / radiosity / extern / include / radio_types.h
1 /*
2  * radio_types.h
3  *
4  * $Id$
5  *
6  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version. The Blender
12  * Foundation also sells licenses for use in proprietary software under
13  * the Blender License.  See http://www.blender.org/BL/ for information
14  * about this.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software Foundation,
23  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24  *
25  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
26  * All rights reserved.
27  *
28  * The Original Code is: all of this file.
29  *
30  * Contributor(s): none yet.
31  *
32  * ***** END GPL/BL DUAL LICENSE BLOCK *****
33  */
34
35 /*  #include "misc_util.h" */ /* for listbase...*/
36
37
38 #ifndef RADIO_TYPES_H
39 #define RADIO_TYPES_H
40
41 #include "DNA_listBase.h" 
42 #include "DNA_material_types.h" 
43
44 struct Render;
45 struct CustomData;
46
47 #define DTWIRE          0
48 #define DTGOUR          2
49 #define DTSOLID         1
50
51 #define PI  M_PI
52 #define RAD_MAXFACETAB  1024
53 #define RAD_NEXTFACE(a) if( ((a) & 1023)==0 ) face= RG.facebase[(a)>>10]; else face++;
54
55 /* RG.phase */
56 #define RAD_SHOOTE      1
57 #define RAD_SHOOTP      2
58 #define RAD_SOLVE       3
59
60 typedef struct RadView {
61         float cam[3], tar[3], up[3];
62         float wx1, wx2, wy1, wy2;
63         float mynear, myfar;
64         float viewmat[4][4], winmat[4][4];
65         unsigned int *rect, *rectz;
66         short rectx, recty;
67         int wid;
68
69 } RadView;
70
71 /* rn->f */
72 #define RAD_PATCH               1
73 #define RAD_SHOOT               2
74 #define RAD_SUBDIV              4
75 #define RAD_BACKFACE    8
76 #define RAD_TWOSIDED    16
77
78
79 typedef struct RNode {                                  /* length: 104 */
80         struct RNode *down1, *down2, *up;
81         struct RNode *ed1, *ed2, *ed3, *ed4;
82         struct RPatch *par;
83
84         char lev1, lev2, lev3, lev4;            /* edgelevels */
85         short type;                                                     /* type: 4==QUAD, 3==TRIA */
86         short f;                                                        
87         float *v1, *v2, *v3, *v4;
88         float totrad[3], area;
89         
90         unsigned int col;
91         int orig;                                                       /* index in custom face data */
92 } RNode;
93
94
95 typedef struct Face {                                   /* length: 52 */
96         float *v1, *v2, *v3, *v4;
97         unsigned int col, matindex;
98         int orig;                                                       /* index in custom face data */
99 } Face;
100
101 /* rp->f1 */
102 #define RAD_NO_SPLIT    1
103
104 typedef struct RPatch {
105         struct RPatch *next, *prev;
106         RNode *first;                   /* first node==patch */
107
108         struct Object *from;
109         
110         int type;                               /* 3: TRIA, 4: QUAD */
111         short f, f1;                    /* flags f: if node, only for subdiv */
112
113         float ref[3], emit[3], unshot[3];
114         float cent[3], norm[3];
115         float area;
116         int matindex;
117         
118 } RPatch;
119
120
121 typedef struct VeNoCo {                         /* needed for splitconnected */
122         struct VeNoCo *next;
123         float *v;
124         float *n;
125         float *col;
126         int flag;
127 } VeNoCo;
128
129
130 typedef struct EdSort {                                 /* sort edges */
131         float *v1, *v2;
132         RNode *node;
133         int nr;
134 } EdSort;
135
136 typedef struct {
137         struct Radio *radio;
138         unsigned int *hemibuf;
139         struct ListBase patchbase;
140         int totpatch, totelem, totvert, totlamp;
141         RNode **elem;                                           /* global array with all pointers */
142         VeNoCo *verts;                                          /* temporal vertices from patches */
143         float *formfactors;                                 /* 1 factor per element */
144         float *topfactors, *sidefactors;    /* LUT for delta's */
145         int *index;                                             /* LUT for above LUT */
146         Face **facebase;
147         int totface;
148         float min[3], max[3], size[3], cent[3]; /* world */
149         float maxsize, totenergy;
150         float patchmin, patchmax;
151         float elemmin, elemmax;
152         float radfactor, lostenergy, igamma;            /* radfac is in button, radfactor is calculated */
153         int phase;
154         struct Render *re;                                                      /* for calling hemizbuf correctly */
155         /* to preserve materials as used before, max 16 */
156         Material *matar[MAXMAT];
157         int totmat;
158
159         /* for preserving face data */
160         int mfdatatot;
161         struct CustomData *mfdata;
162         struct RNode **mfdatanodes;
163         
164                 /* this part is a copy of struct Radio */
165         short hemires, maxiter;
166         short drawtype, flag;                   /* bit 0 en 1: show limits */
167         short subshootp, subshoote, nodelim, maxsublamp;
168         int maxnode;
169         float convergence;
170         float radfac, gamma;            /* for display */
171
172 } RadGlobal;
173
174 #endif /* radio_types.h */
175