UI: Tweak Sequencer Sidebar panels
[blender.git] / source / blender / makesdna / DNA_lightprobe_types.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software  Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file
18  * \ingroup DNA
19  */
20
21 #ifndef __DNA_LIGHTPROBE_TYPES_H__
22 #define __DNA_LIGHTPROBE_TYPES_H__
23
24 #include "DNA_defs.h"
25 #include "DNA_listBase.h"
26 #include "DNA_ID.h"
27
28 #include "BLI_assert.h"
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 struct AnimData;
35 struct Object;
36
37 typedef struct LightProbe {
38   ID id;
39   /** Animation data (must be immediately after id for utilities to use it). */
40   struct AnimData *adt;
41
42   /** For realtime probe objects. */
43   char type;
44   /** General purpose flags for probes. */
45   char flag;
46   /** Attenuation type. */
47   char attenuation_type;
48   /** Parallax type. */
49   char parallax_type;
50
51   /** Influence Radius. */
52   float distinf;
53   /** Parallax Radius. */
54   float distpar;
55   /** Influence falloff. */
56   float falloff;
57
58   float clipsta, clipend;
59
60   /** VSM visibility biases. */
61   float vis_bias, vis_bleedbias;
62   float vis_blur;
63
64   /** Intensity multiplier. */
65   float intensity;
66
67   /** Irradiance grid resolution. */
68   int grid_resolution_x;
69   int grid_resolution_y;
70   int grid_resolution_z;
71   char _pad1[4];
72
73   /** Object to use as a parallax origin. */
74   struct Object *parallax_ob;
75   /** Image to use on as lighting data. */
76   struct Image *image;
77   /** Object visibility group, inclusive or exclusive. */
78   struct Collection *visibility_grp;
79
80   /* Runtime display data */
81   float distfalloff, distgridinf;
82   char _pad[8];
83 } LightProbe;
84
85 /* Probe->type */
86 enum {
87   LIGHTPROBE_TYPE_CUBE = 0,
88   LIGHTPROBE_TYPE_PLANAR = 1,
89   LIGHTPROBE_TYPE_GRID = 2,
90 };
91
92 /* Probe->flag */
93 enum {
94   LIGHTPROBE_FLAG_CUSTOM_PARALLAX = (1 << 0),
95   LIGHTPROBE_FLAG_SHOW_INFLUENCE = (1 << 1),
96   LIGHTPROBE_FLAG_SHOW_PARALLAX = (1 << 2),
97   LIGHTPROBE_FLAG_SHOW_CLIP_DIST = (1 << 3),
98   LIGHTPROBE_FLAG_SHOW_DATA = (1 << 4),
99   LIGHTPROBE_FLAG_INVERT_GROUP = (1 << 5),
100 };
101
102 /* Probe->display */
103 enum {
104   LIGHTPROBE_DISP_WIRE = 0,
105   LIGHTPROBE_DISP_SHADED = 1,
106   LIGHTPROBE_DISP_DIFFUSE = 2,
107   LIGHTPROBE_DISP_REFLECTIVE = 3,
108 };
109
110 /* Probe->parallax && Probe->attenuation_type*/
111 enum {
112   LIGHTPROBE_SHAPE_ELIPSOID = 0,
113   LIGHTPROBE_SHAPE_BOX = 1,
114 };
115
116 /* ------- Eevee LightProbes ------- */
117 /* Needs to be there because written to file with the light-cache. */
118
119 /* IMPORTANT Padding in these structs is essential. It must match
120  * GLSL struct definition in lightprobe_lib.glsl. */
121
122 /* Must match CubeData. */
123 typedef struct LightProbeCache {
124   float position[3], parallax_type;
125   float attenuation_fac;
126   float attenuation_type;
127   float _pad3[2];
128   float attenuationmat[4][4];
129   float parallaxmat[4][4];
130 } LightProbeCache;
131
132 /* Must match GridData. */
133 typedef struct LightGridCache {
134   float mat[4][4];
135   /** Offset to the first irradiance sample in the pool. */
136   int resolution[3], offset;
137   float corner[3], attenuation_scale;
138   /** World space vector between 2 opposite cells. */
139   float increment_x[3], attenuation_bias;
140   float increment_y[3], level_bias;
141   float increment_z[3], _pad4;
142   float visibility_bias, visibility_bleed, visibility_range, _pad5;
143 } LightGridCache;
144
145 /* Theses are used as ubo data. They need to be aligned to size of vec4. */
146 BLI_STATIC_ASSERT_ALIGN(LightProbeCache, 16)
147 BLI_STATIC_ASSERT_ALIGN(LightGridCache, 16)
148
149 /* ------ Eevee Lightcache ------- */
150
151 typedef struct LightCacheTexture {
152   struct GPUTexture *tex;
153   /* Copy of GPU datas to create GPUTextures on file read. */
154   char *data;
155   int tex_size[3];
156   char data_type;
157   char components;
158   char _pad[2];
159 } LightCacheTexture;
160
161 typedef struct LightCache {
162   int flag;
163   /* only a single cache for now */
164   /** Number of probes to use for rendering. */
165   int cube_len, grid_len;
166   /** Number of mipmap level to use. */
167   int mips_len;
168   /** Size of a visibility/reflection sample. */
169   int vis_res, ref_res;
170   char _pad[4][2];
171   /* In the future, we could create a bigger texture containing
172    * multiple caches (for animation) and interpolate between the
173    * caches overtime to another texture. */
174   LightCacheTexture grid_tx;
175   /** Contains data for mipmap level 0. */
176   LightCacheTexture cube_tx;
177   /** Does not contains valid GPUTexture, only data. */
178   LightCacheTexture *cube_mips;
179   /* All lightprobes data contained in the cache. */
180   LightProbeCache *cube_data;
181   LightGridCache *grid_data;
182 } LightCache;
183
184 /* LightCache->flag */
185 enum {
186   LIGHTCACHE_BAKED = (1 << 0),
187   LIGHTCACHE_BAKING = (1 << 1),
188   LIGHTCACHE_CUBE_READY = (1 << 2),
189   LIGHTCACHE_GRID_READY = (1 << 3),
190   /* Update tagging */
191   LIGHTCACHE_UPDATE_CUBE = (1 << 4),
192   LIGHTCACHE_UPDATE_GRID = (1 << 5),
193   LIGHTCACHE_UPDATE_WORLD = (1 << 6),
194   LIGHTCACHE_UPDATE_AUTO = (1 << 7),
195 };
196
197 /* EEVEE_LightCacheTexture->data_type */
198 enum {
199   LIGHTCACHETEX_BYTE = (1 << 0),
200   LIGHTCACHETEX_FLOAT = (1 << 1),
201   LIGHTCACHETEX_UINT = (1 << 2),
202 };
203
204 #ifdef __cplusplus
205 }
206 #endif
207
208 #endif /* __DNA_LIGHTPROBE_TYPES_H__ */