This commit fixes radiosity to correctly preserve and subdivide UV
[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 #define RAD_TWOSIDED    16
74
75
76 typedef struct RNode {                                  /* length: 104 */
77         struct RNode *down1, *down2, *up;
78         struct RNode *ed1, *ed2, *ed3, *ed4;
79         struct RPatch *par;
80
81         char lev1, lev2, lev3, lev4;            /* edgelevels */
82         short type;                                                     /* type: 4==QUAD, 3==TRIA */
83         short f;                                                        
84         float *v1, *v2, *v3, *v4;
85         float totrad[3], area;
86         
87         unsigned int col;
88         float uv[4][2];         /* when you change this: also do function set_correct_uv in editmesh.c, and there are more locations that use the size of this part */
89         struct TFace *tface;
90 } RNode;
91
92
93 typedef struct Elem {                                   /* length: 44 */
94         struct RPatch *par;
95
96         short type;                                                     /* type: 4==QUAD, 3==TRIA */
97         short f;                                                        /* bit 0: patch, bit 1: shootelement */
98         float *v1, *v2, *v3, *v4;
99         float totrad[3], area;
100         
101         unsigned int col;
102 } Elem;
103
104
105 typedef struct Face {                                   /* length: 52 */
106         float *v1, *v2, *v3, *v4;
107         unsigned int col, matindex;
108         float uv[4][2];         /* when you change this: also do function set_correct_uv in editmesh.c, and there are more locations that use the size of this part */
109         struct TFace *tface;
110 } Face;
111
112 /* rp->f1 */
113 #define RAD_NO_SPLIT    1
114
115 typedef struct RPatch {
116         struct RPatch *next, *prev;
117         RNode *first;                   /* first node==patch */
118
119         struct Object *from;
120         
121         int type;                               /* 3: TRIA, 4: QUAD */
122         short f, f1;                    /* flags f: if node, only for subdiv */
123
124         float ref[3], emit[3], unshot[3];
125         float cent[3], norm[3];
126         float area;
127         int matindex;
128         
129 } RPatch;
130
131
132 typedef struct VeNoCo {                         /* needed for splitconnected */
133         struct VeNoCo *next;
134         float *v;
135         float *n;
136         float *col;
137         int flag;
138 } VeNoCo;
139
140
141 typedef struct EdSort {                                 /* sort edges */
142         float *v1, *v2;
143         RNode *node;
144         int nr;
145 } EdSort;
146
147 typedef struct {
148         struct Radio *radio;
149         unsigned int *hemibuf;
150         struct ListBase patchbase;
151         int totpatch, totelem, totvert, totlamp;
152         RNode **elem;                                           /* global array with all pointers */
153         VeNoCo *verts;                                          /* temporal vertices from patches */
154         float *formfactors;                                 /* 1 factor per element */
155         float *topfactors, *sidefactors;    /* LUT for delta's */
156         int *index;                                             /* LUT for above LUT */
157         Face **facebase;
158         int totface;
159         float min[3], max[3], size[3], cent[3]; /* world */
160         float maxsize, totenergy;
161         float patchmin, patchmax;
162         float elemmin, elemmax;
163         float radfactor, lostenergy, igamma;            /* radfac is in button, radfactor is calculated */
164         int phase;
165         /* to preserve materials as used before, max 16 */
166         Material *matar[MAXMAT];
167         int totmat;
168         
169                 /* this part is a copy of struct Radio */
170         short hemires, maxiter;
171         short drawtype, flag;                   /* bit 0 en 1: show limits */
172         short subshootp, subshoote, nodelim, maxsublamp;
173         int maxnode;
174         float convergence;
175         float radfac, gamma;            /* for display */
176
177 } RadGlobal;
178
179 #endif /* radio_types.h */
180