Initial revision
[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 #define DTWIRE          0
45 #define DTGOUR          2
46 #define DTSOLID         1
47
48 #define PI  M_PI
49 #define RAD_MAXFACETAB  1024
50 #define RAD_NEXTFACE(a) if( ((a) & 1023)==0 ) face= RG.facebase[(a)>>10]; else face++;
51
52 /* RG.phase */
53 #define RAD_SHOOTE      1
54 #define RAD_SHOOTP      2
55 #define RAD_SOLVE       3
56
57 typedef struct RadView {
58         float cam[3], tar[3], up[3];
59         float wx1, wx2, wy1, wy2;
60         float mynear, myfar;
61         float viewmat[4][4], winmat[4][4];
62         unsigned int *rect, *rectz;
63         short rectx, recty;
64         int wid;
65
66 } RadView;
67
68 /* rn->f */
69 #define RAD_PATCH               1
70 #define RAD_SHOOT               2
71 #define RAD_SUBDIV              4
72 #define RAD_BACKFACE    8
73
74
75 typedef struct RNode {                                  /* lengte: 76 */
76         struct RNode *down1, *down2, *up;
77         struct RNode *ed1, *ed2, *ed3, *ed4;
78         struct RPatch *par;
79
80         char lev1, lev2, lev3, lev4;            /* edgelevels */
81         short type;                                                     /* type: 4==QUAD, 3==TRIA */
82         short f;                                                        
83         float *v1, *v2, *v3, *v4;
84         float totrad[3], area;
85         
86         unsigned int col;
87 } RNode;
88
89
90 typedef struct Elem {                                   /* lengte: 44 */
91         struct RPatch *par;
92
93         short type;                                                     /* type: 4==QUAD, 3==TRIA */
94         short f;                                                        /* bit 0: patch, bit 1: shootelement */
95         float *v1, *v2, *v3, *v4;
96         float totrad[3], area;
97         
98         unsigned int col;
99 } Elem;
100
101
102 typedef struct Face {                                   /* lengte: 24 */
103         float *v1, *v2, *v3, *v4;
104         unsigned int col, matindex;
105 } Face;
106
107 /* rp->f1 */
108 #define RAD_NO_SPLIT    1
109
110 typedef struct RPatch {
111         struct RPatch *next, *prev;
112         RNode *first;                   /* first node==patch */
113
114         struct Object *from;
115         
116         int type;                               /* 3: TRIA, 4: QUAD */
117         short f, f1;                    /* flags f: als node, alleen subdiv */
118
119         float ref[3], emit[3], unshot[3];
120         float cent[3], norm[3];
121         float area;
122         int matindex;
123         
124 } RPatch;
125
126
127 typedef struct VeNoCo {                         /* nodig voor splitconnected */
128         struct VeNoCo *next;
129         float *v;
130         float *n;
131         float *col;
132         int flag;
133 } VeNoCo;
134
135
136 typedef struct EdSort {                                 /* sorteren edges */
137         float *v1, *v2;
138         RNode *node;
139         int nr;
140 } EdSort;
141
142 typedef struct {
143         struct Radio *radio;
144         unsigned int *hemibuf;
145         struct ListBase patchbase;
146         int totpatch, totelem, totvert, totlamp;
147         RNode **elem;                                           /* globaal array van alle pointers */
148         VeNoCo *verts;                                          /* tijdelijk vertices van patches */
149         float *formfactors;                                 /* een factor per element */
150         float *topfactors, *sidefactors;    /* LUT voor delta's */
151         int *index;                                             /* LUT voor bovenstaande LUT */
152         Face **facebase;
153         int totface;
154         float min[3], max[3], size[3], cent[3]; /* world */
155         float maxsize, totenergy;
156         float patchmin, patchmax;
157         float elemmin, elemmax;
158         float radfactor, lostenergy, igamma;            /* radfac zit in button, radfactor wordt berekend */
159         int phase;
160         /* to preserve materials as used before, max 16 */
161         Material *matar[MAXMAT];
162         int totmat;
163         
164                 /* this part is a copy of struct Radio */
165         short hemires, maxiter;
166         short drawtype, flag;                   /* bit 0 en 1: limits laten zien */
167         short subshootp, subshoote, nodelim, maxsublamp;
168         int maxnode;
169         float convergence;
170         float radfac, gamma;            /* voor afbeelden */
171
172 } RadGlobal;
173
174 #endif /* radio_types.h */