Merging r46111 through r46136 from trunk into soc-2011-tomato
[blender-staging.git] / source / blender / render / intern / include / shadbuf.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #ifndef __SHADBUF_H__
29 #define __SHADBUF_H__
30
31 /** \file blender/render/intern/include/shadbuf.h
32  *  \ingroup render
33  */
34
35 #include "render_types.h"
36
37 struct ObjectRen;
38
39 /**
40  * Calculates shadowbuffers for a vector of shadow-giving lamps
41  * \param lar The vector of lamps
42  */
43 void makeshadowbuf(struct Render *re, LampRen *lar);
44 void freeshadowbuf(struct LampRen *lar);
45
46 void threaded_makeshadowbufs(struct Render *re);
47
48 /**
49  * Determines the shadow factor for a face and lamp. There is some
50  * communication with global variables here.
51  * \return The shadow factors: 1.0 for no shadow, 0.0 for complete
52  *         shadow.
53  * \param shb The shadowbuffer to find the shadow factor in.
54  * \param inp The inproduct between viewvector and ?
55  *
56  */
57 float testshadowbuf(struct Render *re, struct ShadBuf *shb, const float rco[3], const float dxco[3], const float dyco[3], float inp, float mat_bias);
58
59 /**
60  * Determines the shadow factor for lamp <lar>, between <p1>
61  * and <p2>. (Which CS?)
62  */
63 float shadow_halo(LampRen *lar, const float p1[3], const float p2[3]);
64
65 /**
66  * Irregular shadowbuffer
67  */
68
69 struct MemArena;
70 struct APixstr;
71
72 void ISB_create(RenderPart *pa, struct APixstr *apixbuf);
73 void ISB_free(RenderPart *pa);
74 float ISB_getshadow(ShadeInput *shi, ShadBuf *shb);
75
76 /* data structures have to be accessible both in camview(x, y) as in lampview(x, y) */
77 /* since they're created per tile rendered, speed goes over memory requirements */
78
79
80 /* buffer samples, allocated in camera buffer and pointed to in lampbuffer nodes */
81 typedef struct ISBSample {
82         float zco[3];                   /* coordinate in lampview projection */
83         short *shadfac;                 /* initialized zero = full lighted */
84         int obi;                                /* object for face lookup */
85         int facenr;                             /* index in faces list */       
86 } ISBSample;
87
88 /* transparent version of buffer sample */
89 typedef struct ISBSampleA {
90         float zco[3];                           /* coordinate in lampview projection */
91         short *shadfac;                         /* NULL = full lighted */
92         int obi;                                        /* object for face lookup */
93         int facenr;                                     /* index in faces list */       
94         struct ISBSampleA *next;        /* in end, we want the first items to align with ISBSample */
95 } ISBSampleA;
96
97 /* used for transparent storage only */
98 typedef struct ISBShadfacA {
99         struct ISBShadfacA *next;
100         int obi;
101         int facenr;
102         float shadfac;
103 } ISBShadfacA;
104
105 /* What needs to be stored to evaluate shadow, for each thread in ShadBuf */
106 typedef struct ISBData {
107         short *shadfacs;                                /* simple storage for solid only */
108         ISBShadfacA **shadfaca;
109         struct MemArena *memarena;
110         int minx, miny, rectx, recty;   /* copy from part disprect */
111 } ISBData;
112
113 #endif /* __SHADBUF_H__ */
114