Preferences: remove author field
[blender.git] / source / blender / makesdna / DNA_lightprobe_types.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  * Contributor(s): Blender Foundation
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  *
22  */
23
24 /** \file DNA_lightprobe_types.h
25  *  \ingroup DNA
26  */
27
28 #ifndef __DNA_LIGHTPROBE_TYPES_H__
29 #define __DNA_LIGHTPROBE_TYPES_H__
30
31 #include "DNA_defs.h"
32 #include "DNA_listBase.h"
33 #include "DNA_ID.h"
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 struct Object;
40 struct AnimData;
41
42 typedef struct LightProbe {
43         ID id;
44         /** Animation data (must be immediately after id for utilities to use it). */
45         struct AnimData *adt;
46
47         /** For realtime probe objects. */
48         char type;
49         /** General purpose flags for probes. */
50         char flag;
51         /** Attenuation type. */
52         char attenuation_type;
53         /** Parallax type. */
54         char parallax_type;
55
56         /** Influence Radius. */
57         float distinf;
58         /** Parallax Radius. */
59         float distpar;
60         /** Influence falloff. */
61         float falloff;
62
63         float clipsta, clipend;
64
65         /** VSM visibility biases. */
66         float vis_bias, vis_bleedbias;
67         float vis_blur;
68
69         /** Intensity multiplier. */
70         float intensity;
71
72         /** Irradiance grid resolution. */
73         int grid_resolution_x;
74         int grid_resolution_y;
75         int grid_resolution_z;
76         int pad1;
77
78         /** Object to use as a parallax origin. */
79         struct Object *parallax_ob;
80         /** Image to use on as lighting data. */
81         struct Image *image;
82         /** Object visibility group, inclusive or exclusive. */
83         struct Collection *visibility_grp;
84
85         /* Runtime display data */
86         float distfalloff, distgridinf;
87         float pad[2];
88 } LightProbe;
89
90 /* Probe->type */
91 enum {
92         LIGHTPROBE_TYPE_CUBE      = 0,
93         LIGHTPROBE_TYPE_PLANAR    = 1,
94         LIGHTPROBE_TYPE_GRID      = 2,
95 };
96
97 /* Probe->flag */
98 enum {
99         LIGHTPROBE_FLAG_CUSTOM_PARALLAX = (1 << 0),
100         LIGHTPROBE_FLAG_SHOW_INFLUENCE  = (1 << 1),
101         LIGHTPROBE_FLAG_SHOW_PARALLAX   = (1 << 2),
102         LIGHTPROBE_FLAG_SHOW_CLIP_DIST  = (1 << 3),
103         LIGHTPROBE_FLAG_SHOW_DATA       = (1 << 4),
104         LIGHTPROBE_FLAG_INVERT_GROUP    = (1 << 5),
105 };
106
107 /* Probe->display */
108 enum {
109         LIGHTPROBE_DISP_WIRE         = 0,
110         LIGHTPROBE_DISP_SHADED       = 1,
111         LIGHTPROBE_DISP_DIFFUSE      = 2,
112         LIGHTPROBE_DISP_REFLECTIVE   = 3,
113 };
114
115 /* Probe->parallax && Probe->attenuation_type*/
116 enum {
117         LIGHTPROBE_SHAPE_ELIPSOID   = 0,
118         LIGHTPROBE_SHAPE_BOX        = 1,
119 };
120
121 /* ------- Eevee LightProbes ------- */
122 /* Needs to be there because written to file
123  * with the lightcache. */
124
125 typedef struct LightProbeCache {
126         float position[3], parallax_type;
127         float attenuation_fac;
128         float attenuation_type;
129         float pad3[2];
130         float attenuationmat[4][4];
131         float parallaxmat[4][4];
132 } LightProbeCache;
133
134 typedef struct LightGridCache {
135         float mat[4][4];
136         /** Offset to the first irradiance sample in the pool. */
137         int resolution[3], offset;
138         float corner[3], attenuation_scale;
139         /** World space vector between 2 opposite cells. */
140         float increment_x[3], attenuation_bias;
141         float increment_y[3], level_bias;
142         float increment_z[3], pad4;
143         float visibility_bias, visibility_bleed, visibility_range, pad5;
144 } LightGridCache;
145
146 /* ------ Eevee Lightcache ------- */
147
148 typedef struct LightCacheTexture {
149         struct GPUTexture *tex;
150         /* Copy of GPU datas to create GPUTextures on file read. */
151         char *data;
152         int tex_size[3];
153         char data_type;
154         char components;
155         char pad[2];
156 } LightCacheTexture;
157
158 typedef struct LightCache {
159         int flag;
160         /* only a single cache for now */
161         /** Number of probes to use for rendering. */
162         int cube_len, grid_len;
163         /** Number of mipmap level to use. */
164         int mips_len;
165         /** Size of a visibility/reflection sample. */
166         int vis_res, ref_res;
167         int pad[2];
168         /* In the future, we could create a bigger texture containing
169          * multiple caches (for animation) and interpolate between the
170          * caches overtime to another texture. */
171         LightCacheTexture grid_tx;
172         /** Contains data for mipmap level 0. */
173         LightCacheTexture cube_tx;
174         /** Does not contains valid GPUTexture, only data. */
175         LightCacheTexture *cube_mips;
176         /* All lightprobes data contained in the cache. */
177         LightProbeCache *cube_data;
178         LightGridCache  *grid_data;
179 } LightCache;
180
181 /* LightCache->flag */
182 enum {
183         LIGHTCACHE_BAKED            = (1 << 0),
184         LIGHTCACHE_BAKING           = (1 << 1),
185         LIGHTCACHE_CUBE_READY       = (1 << 2),
186         LIGHTCACHE_GRID_READY       = (1 << 3),
187         /* Update tagging */
188         LIGHTCACHE_UPDATE_CUBE      = (1 << 4),
189         LIGHTCACHE_UPDATE_GRID      = (1 << 5),
190         LIGHTCACHE_UPDATE_WORLD     = (1 << 6),
191         LIGHTCACHE_UPDATE_AUTO      = (1 << 7),
192 };
193
194 /* EEVEE_LightCacheTexture->data_type */
195 enum {
196         LIGHTCACHETEX_BYTE          = (1 << 0),
197         LIGHTCACHETEX_FLOAT         = (1 << 1),
198         LIGHTCACHETEX_UINT          = (1 << 2),
199 };
200
201 #ifdef __cplusplus
202 }
203 #endif
204
205 #endif /* __DNA_LIGHTPROBE_TYPES_H__ */