Merge branch 'master' into blender2.8
[blender.git] / source / blender / makesrna / intern / rna_shader_fx.c
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  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 /** \file blender/makesrna/intern/rna_shader_fx.c
22  *  \ingroup RNA
23  */
24
25
26 #include <float.h>
27 #include <limits.h>
28 #include <stdlib.h>
29
30 #include "DNA_shader_fx_types.h"
31 #include "DNA_object_types.h"
32 #include "DNA_scene_types.h"
33
34 #include "MEM_guardedalloc.h"
35
36 #include "BLI_math.h"
37
38 #include "BLT_translation.h"
39
40 #include "BKE_animsys.h"
41
42 #include "RNA_access.h"
43 #include "RNA_define.h"
44 #include "RNA_enum_types.h"
45
46 #include "rna_internal.h"
47
48 #include "WM_api.h"
49 #include "WM_types.h"
50
51 const EnumPropertyItem rna_enum_object_shaderfx_type_items[] = {
52         {eShaderFxType_Blur, "FX_BLUR", ICON_SHADERFX, "Blur", "Apply Gaussian Blur to object" },
53         {eShaderFxType_Colorize, "FX_COLORIZE", ICON_SHADERFX, "Colorize", "Apply different tint effects" },
54         {eShaderFxType_Flip, "FX_FLIP", ICON_SHADERFX, "Flip", "Flip image" },
55         {eShaderFxType_Glow, "FX_GLOW", ICON_SHADERFX, "Glow", "Create a glow effect" },
56         {eShaderFxType_Light, "FX_LIGHT", ICON_SHADERFX, "Light", "Simulate ilumination" },
57         {eShaderFxType_Pixel, "FX_PIXEL", ICON_SHADERFX, "Pixelate", "Pixelate image"},
58         {eShaderFxType_Rim, "FX_RIM", ICON_SHADERFX, "Rim", "Add a rim to the image" },
59         {eShaderFxType_Shadow, "FX_SHADOW", ICON_SHADERFX, "Shadow", "Create a shadow effect"},
60         {eShaderFxType_Swirl, "FX_SWIRL", ICON_SHADERFX, "Swirl", "Create a rotation distortion"},
61         {eShaderFxType_Wave, "FX_WAVE", ICON_SHADERFX, "Wave Distortion", "Apply sinusoidal deformation"},
62         {0, NULL, 0, NULL, NULL}
63 };
64
65 static const EnumPropertyItem rna_enum_shaderfx_rim_modes_items[] = {
66         {eShaderFxRimMode_Normal, "NORMAL", 0, "Normal", "" },
67         {eShaderFxRimMode_Overlay, "OVERLAY", 0, "Overlay", "" },
68         {eShaderFxRimMode_Add, "ADD", 0, "Add", "" },
69         {eShaderFxRimMode_Subtract, "SUBTRACT", 0, "Subtract", "" },
70         {eShaderFxRimMode_Multiply, "MULTIPLY", 0, "Multiply", "" },
71         {eShaderFxRimMode_Divide, "DIVIDE", 0, "Divide", "" },
72         {0, NULL, 0, NULL, NULL }
73 };
74
75 static const EnumPropertyItem rna_enum_shaderfx_glow_modes_items[] = {
76         {eShaderFxGlowMode_Luminance, "LUMINANCE", 0, "Luminance", "" },
77         {eShaderFxGlowMode_Color, "COLOR", 0, "Color", "" },
78         {0, NULL, 0, NULL, NULL }
79 };
80
81 static const EnumPropertyItem rna_enum_shaderfx_colorize_modes_items[] = {
82         {eShaderFxColorizeMode_GrayScale, "GRAYSCALE", 0, "Gray Scale", "" },
83         {eShaderFxColorizeMode_Sepia, "SEPIA", 0, "Sepia", "" },
84         {eShaderFxColorizeMode_BiTone, "BITONE", 0, "Bi-Tone", "" },
85         {eShaderFxColorizeMode_Transparent, "TRANSPARENT", 0, "Transparent", "" },
86         {eShaderFxColorizeMode_Custom, "CUSTOM", 0, "Custom", "" },
87         {0, NULL, 0, NULL, NULL }
88 };
89
90 #ifdef RNA_RUNTIME
91
92 #include "BKE_shader_fx.h"
93
94 #include "DEG_depsgraph.h"
95 #include "DEG_depsgraph_build.h"
96
97 static StructRNA *rna_ShaderFx_refine(struct PointerRNA *ptr)
98 {
99         ShaderFxData *md = (ShaderFxData *)ptr->data;
100
101         switch ((ShaderFxType)md->type) {
102                 case eShaderFxType_Blur:
103                         return &RNA_ShaderFxBlur;
104                 case eShaderFxType_Colorize:
105                         return &RNA_ShaderFxColorize;
106                 case eShaderFxType_Wave:
107                         return &RNA_ShaderFxWave;
108                 case eShaderFxType_Pixel:
109                         return &RNA_ShaderFxPixel;
110                 case eShaderFxType_Rim:
111                         return &RNA_ShaderFxRim;
112                 case eShaderFxType_Shadow:
113                         return &RNA_ShaderFxShadow;
114                 case eShaderFxType_Swirl:
115                         return &RNA_ShaderFxSwirl;
116                 case eShaderFxType_Flip:
117                         return &RNA_ShaderFxFlip;
118                 case eShaderFxType_Glow:
119                         return &RNA_ShaderFxGlow;
120                 case eShaderFxType_Light:
121                         return &RNA_ShaderFxLight;
122                         /* Default */
123                 case eShaderFxType_None:
124                 case NUM_SHADER_FX_TYPES:
125                         return &RNA_ShaderFx;
126         }
127
128         return &RNA_ShaderFx;
129 }
130
131 static void rna_ShaderFx_name_set(PointerRNA *ptr, const char *value)
132 {
133         ShaderFxData *gmd = ptr->data;
134         char oldname[sizeof(gmd->name)];
135
136         /* make a copy of the old name first */
137         BLI_strncpy(oldname, gmd->name, sizeof(gmd->name));
138
139         /* copy the new name into the name slot */
140         BLI_strncpy_utf8(gmd->name, value, sizeof(gmd->name));
141
142         /* make sure the name is truly unique */
143         if (ptr->id.data) {
144                 Object *ob = ptr->id.data;
145                 BKE_shaderfx_unique_name(&ob->shader_fx, gmd);
146         }
147
148         /* fix all the animation data which may link to this */
149         BKE_animdata_fix_paths_rename_all(NULL, "shader_effects", oldname, gmd->name);
150 }
151
152 static char *rna_ShaderFx_path(PointerRNA *ptr)
153 {
154         ShaderFxData *gmd = ptr->data;
155         char name_esc[sizeof(gmd->name) * 2];
156
157         BLI_strescape(name_esc, gmd->name, sizeof(name_esc));
158         return BLI_sprintfN("shader_effects[\"%s\"]", name_esc);
159 }
160
161 static void rna_ShaderFx_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
162 {
163         DEG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
164         WM_main_add_notifier(NC_OBJECT | ND_MODIFIER | NC_GPENCIL, ptr->id.data);
165 }
166
167 static void rna_ShaderFx_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
168 {
169         rna_ShaderFx_update(bmain, scene, ptr);
170         DEG_relations_tag_update(bmain);
171 }
172
173 /* Objects */
174
175 static void shaderfx_object_set(Object *self, Object **ob_p, int type, PointerRNA value)
176 {
177         Object *ob = value.data;
178
179         if (!self || ob != self) {
180                 if (!ob || type == OB_EMPTY || ob->type == type) {
181                         id_lib_extern((ID *)ob);
182                         *ob_p = ob;
183                 }
184         }
185 }
186
187 #define RNA_FX_OBJECT_SET(_type, _prop, _obtype)                                           \
188 static void rna_##_type##ShaderFx_##_prop##_set(PointerRNA *ptr, PointerRNA value)          \
189 {                                                                                           \
190         _type##ShaderFxData *tmd = (_type##ShaderFxData *)ptr->data;                            \
191         shaderfx_object_set(ptr->id.data, &tmd->_prop, _obtype, value);                         \
192 }
193
194 RNA_FX_OBJECT_SET(Light, object, OB_EMPTY);
195 RNA_FX_OBJECT_SET(Shadow, object, OB_EMPTY);
196 RNA_FX_OBJECT_SET(Swirl, object, OB_EMPTY);
197
198 #undef RNA_FX_OBJECT_SET
199
200 #else
201
202 static void rna_def_shader_fx_blur(BlenderRNA *brna)
203 {
204         StructRNA *srna;
205         PropertyRNA *prop;
206
207         srna = RNA_def_struct(brna, "ShaderFxBlur", "ShaderFx");
208         RNA_def_struct_ui_text(srna, "Gaussian Blur Effect", "Gaussian Blur effect");
209         RNA_def_struct_sdna(srna, "BlurShaderFxData");
210         RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
211
212         prop = RNA_def_property(srna, "factor", PROP_INT, PROP_PIXEL);
213         RNA_def_property_int_sdna(prop, NULL, "radius");
214         RNA_def_property_range(prop, 0, INT_MAX);
215         RNA_def_property_ui_text(prop, "Factor", "Factor of Blur");
216         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
217
218         prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
219         RNA_def_property_int_sdna(prop, NULL, "samples");
220         RNA_def_property_range(prop, 0, 32);
221         RNA_def_property_ui_range(prop, 0, 32, 2, -1);
222         RNA_def_property_int_default(prop, 4);
223         RNA_def_property_ui_text(prop, "Samples", "Number of Blur Samples (zero, disable blur)");
224         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
225
226         prop = RNA_def_property(srna, "coc", PROP_FLOAT, PROP_NONE);
227         RNA_def_property_float_sdna(prop, NULL, "coc");
228         RNA_def_property_range(prop, 0.001f, 1.0f);
229         RNA_def_property_float_default(prop, 0.025f);
230         RNA_def_property_ui_text(prop, "Precision", "Define circle of confusion for depth of field");
231         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
232
233         prop = RNA_def_property(srna, "use_dof_mode", PROP_BOOLEAN, PROP_NONE);
234         RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_BLUR_DOF_MODE);
235         RNA_def_property_ui_text(prop, "Lock Focal Plane", "Blur using focal plane distance as factor to simulate depth of field effect (only in camera view)");
236         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
237 }
238
239 static void rna_def_shader_fx_colorize(BlenderRNA *brna)
240 {
241         StructRNA *srna;
242         PropertyRNA *prop;
243
244         srna = RNA_def_struct(brna, "ShaderFxColorize", "ShaderFx");
245         RNA_def_struct_ui_text(srna, "Colorize Effect", "Colorize effect");
246         RNA_def_struct_sdna(srna, "ColorizeShaderFxData");
247         RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
248
249         prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
250         RNA_def_property_float_sdna(prop, NULL, "factor");
251         RNA_def_property_range(prop, 0, 1.0);
252         RNA_def_property_ui_text(prop, "Factor", "Mix factor");
253         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
254
255         prop = RNA_def_property(srna, "low_color", PROP_FLOAT, PROP_COLOR_GAMMA);
256         RNA_def_property_range(prop, 0.0, 1.0);
257         RNA_def_property_float_sdna(prop, NULL, "low_color");
258         RNA_def_property_array(prop, 4);
259         RNA_def_property_ui_text(prop, "Low color", "First color used for effect");
260         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
261
262         prop = RNA_def_property(srna, "high_color", PROP_FLOAT, PROP_COLOR_GAMMA);
263         RNA_def_property_range(prop, 0.0, 1.0);
264         RNA_def_property_float_sdna(prop, NULL, "high_color");
265         RNA_def_property_array(prop, 4);
266         RNA_def_property_ui_text(prop, "Height color", "Second color used for effect");
267         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
268
269         prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
270         RNA_def_property_enum_sdna(prop, NULL, "mode");
271         RNA_def_property_enum_items(prop, rna_enum_shaderfx_colorize_modes_items);
272         RNA_def_property_ui_text(prop, "Mode", "Effect mode");
273         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
274 }
275
276 static void rna_def_shader_fx_wave(BlenderRNA *brna)
277 {
278         StructRNA *srna;
279         PropertyRNA *prop;
280
281         static EnumPropertyItem prop_shaderfx_wave_type_items[] = {
282                 { 0, "HORIZONTAL", 0, "Horizontal", "" },
283                 { 1, "VERTICAL", 0, "Vertical", "" },
284                 { 0, NULL, 0, NULL, NULL }
285         };
286
287         srna = RNA_def_struct(brna, "ShaderFxWave", "ShaderFx");
288         RNA_def_struct_ui_text(srna, "Wave Deformation Effect", "Wave Deformation effect");
289         RNA_def_struct_sdna(srna, "WaveShaderFxData");
290         RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
291
292         prop = RNA_def_property(srna, "orientation", PROP_ENUM, PROP_NONE);
293         RNA_def_property_enum_sdna(prop, NULL, "orientation");
294         RNA_def_property_enum_items(prop, prop_shaderfx_wave_type_items);
295         RNA_def_property_ui_text(prop, "Orientation", "Direction of the wave");
296         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
297
298         prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
299         RNA_def_property_float_sdna(prop, NULL, "amplitude");
300         RNA_def_property_range(prop, 0, FLT_MAX);
301         RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of Wave");
302         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
303
304         prop = RNA_def_property(srna, "period", PROP_FLOAT, PROP_NONE);
305         RNA_def_property_float_sdna(prop, NULL, "period");
306         RNA_def_property_range(prop, 0, FLT_MAX);
307         RNA_def_property_ui_text(prop, "Period", "Period of Wave");
308         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
309
310         prop = RNA_def_property(srna, "phase", PROP_FLOAT, PROP_NONE);
311         RNA_def_property_float_sdna(prop, NULL, "phase");
312         RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
313         RNA_def_property_ui_text(prop, "Phase", "Phase Shift of Wave");
314         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
315 }
316
317 static void rna_def_shader_fx_pixel(BlenderRNA *brna)
318 {
319         StructRNA *srna;
320         PropertyRNA *prop;
321
322         srna = RNA_def_struct(brna, "ShaderFxPixel", "ShaderFx");
323         RNA_def_struct_ui_text(srna, "Pixelate Effect", "Pixelate effect");
324         RNA_def_struct_sdna(srna, "PixelShaderFxData");
325         RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
326
327         prop = RNA_def_property(srna, "size", PROP_INT, PROP_PIXEL);
328         RNA_def_property_int_sdna(prop, NULL, "size");
329         RNA_def_property_range(prop, 1, INT_MAX);
330         RNA_def_property_array(prop, 2);
331         RNA_def_property_ui_text(prop, "Size", "Pixel size");
332         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
333
334         prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA);
335         RNA_def_property_range(prop, 0.0, 1.0);
336         RNA_def_property_float_sdna(prop, NULL, "rgba");
337         RNA_def_property_array(prop, 4);
338         RNA_def_property_ui_text(prop, "Color", "Color used for lines");
339         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
340
341         prop = RNA_def_property(srna, "use_lines", PROP_BOOLEAN, PROP_NONE);
342         RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_PIXEL_USE_LINES);
343         RNA_def_property_ui_text(prop, "Lines", "Display lines between pixels");
344         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
345 }
346
347 static void rna_def_shader_fx_rim(BlenderRNA *brna)
348 {
349         StructRNA *srna;
350         PropertyRNA *prop;
351
352         srna = RNA_def_struct(brna, "ShaderFxRim", "ShaderFx");
353         RNA_def_struct_ui_text(srna, "Rim Effect", "Rim effect");
354         RNA_def_struct_sdna(srna, "RimShaderFxData");
355         RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
356
357         prop = RNA_def_property(srna, "offset", PROP_INT, PROP_PIXEL);
358         RNA_def_property_int_sdna(prop, NULL, "offset");
359         RNA_def_property_range(prop, -INT_MAX, INT_MAX);
360         RNA_def_property_ui_text(prop, "Offset", "Offset of the rim");
361         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
362
363         prop = RNA_def_property(srna, "rim_color", PROP_FLOAT, PROP_COLOR_GAMMA);
364         RNA_def_property_range(prop, 0.0, 1.0);
365         RNA_def_property_float_sdna(prop, NULL, "rim_rgb");
366         RNA_def_property_array(prop, 3);
367         RNA_def_property_ui_text(prop, "Rim Color", "Color used for Rim");
368         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
369
370         prop = RNA_def_property(srna, "mask_color", PROP_FLOAT, PROP_COLOR_GAMMA);
371         RNA_def_property_range(prop, 0.0, 1.0);
372         RNA_def_property_float_sdna(prop, NULL, "mask_rgb");
373         RNA_def_property_array(prop, 3);
374         RNA_def_property_ui_text(prop, "Mask Color", "Color that must be keept");
375         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
376
377         prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
378         RNA_def_property_enum_sdna(prop, NULL, "mode");
379         RNA_def_property_enum_items(prop, rna_enum_shaderfx_rim_modes_items);
380         RNA_def_property_ui_text(prop, "Mode", "Blend mode");
381         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
382
383         prop = RNA_def_property(srna, "blur", PROP_INT, PROP_PIXEL);
384         RNA_def_property_int_sdna(prop, NULL, "blur");
385         RNA_def_property_range(prop, 0, INT_MAX);
386         RNA_def_property_ui_text(prop, "Blur", "Number of pixels for bluring rim (set to 0 to disable)");
387         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
388
389         prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
390         RNA_def_property_int_sdna(prop, NULL, "samples");
391         RNA_def_property_range(prop, 0, 32);
392         RNA_def_property_ui_range(prop, 0, 32, 2, -1);
393         RNA_def_property_int_default(prop, 4);
394         RNA_def_property_ui_text(prop, "Samples", "Number of Blur Samples (zero, disable blur)");
395         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
396 }
397
398 static void rna_def_shader_fx_shadow(BlenderRNA *brna)
399 {
400         static EnumPropertyItem prop_shaderfx_shadow_type_items[] = {
401                 { 0, "HORIZONTAL", 0, "Horizontal", "" },
402                 { 1, "VERTICAL", 0, "Vertical", "" },
403                 { 0, NULL, 0, NULL, NULL }
404         };
405
406         StructRNA *srna;
407         PropertyRNA *prop;
408
409         srna = RNA_def_struct(brna, "ShaderFxShadow", "ShaderFx");
410         RNA_def_struct_ui_text(srna, "Shadow Effect", "Shadow effect");
411         RNA_def_struct_sdna(srna, "ShadowShaderFxData");
412         RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
413
414         prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
415         RNA_def_property_ui_text(prop, "Object", "Object to determine center of rotation");
416         RNA_def_property_pointer_funcs(prop, NULL, "rna_ShadowShaderFx_object_set", NULL, NULL);
417         RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
418         RNA_def_property_update(prop, 0, "rna_ShaderFx_dependency_update");
419
420         prop = RNA_def_property(srna, "offset", PROP_INT, PROP_PIXEL);
421         RNA_def_property_int_sdna(prop, NULL, "offset");
422         RNA_def_property_range(prop, -INT_MAX, INT_MAX);
423         RNA_def_property_ui_text(prop, "Offset", "Offset of the shadow");
424         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
425
426         prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
427         RNA_def_property_float_sdna(prop, NULL, "scale");
428         RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
429         RNA_def_property_ui_text(prop, "Scale", "Offset of the shadow");
430         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
431
432         prop = RNA_def_property(srna, "shadow_color", PROP_FLOAT, PROP_COLOR_GAMMA);
433         RNA_def_property_range(prop, 0.0, 1.0);
434         RNA_def_property_float_sdna(prop, NULL, "shadow_rgba");
435         RNA_def_property_array(prop, 4);
436         RNA_def_property_ui_text(prop, "Shadow Color", "Color used for Shadow");
437         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
438
439         prop = RNA_def_property(srna, "orientation", PROP_ENUM, PROP_NONE);
440         RNA_def_property_enum_sdna(prop, NULL, "orientation");
441         RNA_def_property_enum_items(prop, prop_shaderfx_shadow_type_items);
442         RNA_def_property_ui_text(prop, "Orientation", "Direction of the wave");
443         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
444
445         prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
446         RNA_def_property_float_sdna(prop, NULL, "amplitude");
447         RNA_def_property_range(prop, 0, FLT_MAX);
448         RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of Wave");
449         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
450
451         prop = RNA_def_property(srna, "period", PROP_FLOAT, PROP_NONE);
452         RNA_def_property_float_sdna(prop, NULL, "period");
453         RNA_def_property_range(prop, 0, FLT_MAX);
454         RNA_def_property_ui_text(prop, "Period", "Period of Wave");
455         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
456
457         prop = RNA_def_property(srna, "phase", PROP_FLOAT, PROP_NONE);
458         RNA_def_property_float_sdna(prop, NULL, "phase");
459         RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
460         RNA_def_property_ui_text(prop, "Phase", "Phase Shift of Wave");
461         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
462
463         prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ANGLE);
464         RNA_def_property_float_sdna(prop, NULL, "rotation");
465         RNA_def_property_range(prop, DEG2RAD(-360), DEG2RAD(360));
466         RNA_def_property_ui_range(prop, DEG2RAD(-360), DEG2RAD(360), 5, 2);
467         RNA_def_property_ui_text(prop, "Rotation", "Rotation around center or object");
468         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
469
470         prop = RNA_def_property(srna, "blur", PROP_INT, PROP_PIXEL);
471         RNA_def_property_int_sdna(prop, NULL, "blur");
472         RNA_def_property_range(prop, 0, INT_MAX);
473         RNA_def_property_ui_text(prop, "Blur", "Number of pixels for bluring shadow (set to 0 to disable)");
474         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
475
476         prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
477         RNA_def_property_int_sdna(prop, NULL, "samples");
478         RNA_def_property_range(prop, 0, 32);
479         RNA_def_property_ui_range(prop, 0, 32, 2, -1);
480         RNA_def_property_int_default(prop, 4);
481         RNA_def_property_ui_text(prop, "Samples", "Number of Blur Samples (zero, disable blur)");
482         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
483
484         prop = RNA_def_property(srna, "use_object", PROP_BOOLEAN, PROP_NONE);
485         RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_SHADOW_USE_OBJECT);
486         RNA_def_property_ui_text(prop, "Use Object", "Use object as center of rotation");
487         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
488
489         prop = RNA_def_property(srna, "use_wave", PROP_BOOLEAN, PROP_NONE);
490         RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_SHADOW_USE_WAVE);
491         RNA_def_property_ui_text(prop, "Wave", "Use wave effect");
492         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
493 }
494
495 static void rna_def_shader_fx_glow(BlenderRNA *brna)
496 {
497         StructRNA *srna;
498         PropertyRNA *prop;
499
500         srna = RNA_def_struct(brna, "ShaderFxGlow", "ShaderFx");
501         RNA_def_struct_ui_text(srna, "Glow Effect", "Glow effect");
502         RNA_def_struct_sdna(srna, "GlowShaderFxData");
503         RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
504
505         prop = RNA_def_property(srna, "glow_color", PROP_FLOAT, PROP_COLOR_GAMMA);
506         RNA_def_property_range(prop, 0.0, 1.0);
507         RNA_def_property_float_sdna(prop, NULL, "glow_color");
508         RNA_def_property_array(prop, 3);
509         RNA_def_property_ui_text(prop, "Glow Color", "Color used for generated glow");
510         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
511
512         prop = RNA_def_property(srna, "select_color", PROP_FLOAT, PROP_COLOR_GAMMA);
513         RNA_def_property_range(prop, 0.0, 1.0);
514         RNA_def_property_float_sdna(prop, NULL, "select_color");
515         RNA_def_property_array(prop, 3);
516         RNA_def_property_ui_text(prop, "Select Color", "Color selected to apply glow");
517         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
518
519         prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
520         RNA_def_property_enum_sdna(prop, NULL, "mode");
521         RNA_def_property_enum_items(prop, rna_enum_shaderfx_glow_modes_items);
522         RNA_def_property_ui_text(prop, "Mode", "Glow mode");
523         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
524
525         prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
526         RNA_def_property_float_sdna(prop, NULL, "threshold");
527         RNA_def_property_range(prop, 0.0f, 1.0f);
528         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1f, 3);
529         RNA_def_property_ui_text(prop, "Threshold", "Limit to select color for glow effect");
530         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
531
532         /* use blur fields to make compatible with blur filter, but only makes public first array element */
533         prop = RNA_def_property(srna, "radius", PROP_INT, PROP_PIXEL);
534         RNA_def_property_int_sdna(prop, NULL, "blur[0]");
535         RNA_def_property_range(prop, 0, INT_MAX);
536         RNA_def_property_ui_text(prop, "Radius", "Number of pixels for bluring glow (set to 0 to disable)");
537         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
538
539         prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
540         RNA_def_property_int_sdna(prop, NULL, "samples");
541         RNA_def_property_range(prop, 1, 32);
542         RNA_def_property_ui_range(prop, 1, 32, 2, -1);
543         RNA_def_property_int_default(prop, 4);
544         RNA_def_property_ui_text(prop, "Samples", "Number of Blur Samples");
545         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
546
547         prop = RNA_def_property(srna, "use_alpha_mode", PROP_BOOLEAN, PROP_NONE);
548         RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_GLOW_USE_ALPHA);
549         RNA_def_property_ui_text(prop, "Use Alpha", "Glow only areas with alpha");
550         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
551 }
552
553 static void rna_def_shader_fx_swirl(BlenderRNA *brna)
554 {
555         StructRNA *srna;
556         PropertyRNA *prop;
557
558         srna = RNA_def_struct(brna, "ShaderFxSwirl", "ShaderFx");
559         RNA_def_struct_ui_text(srna, "Swirl Effect", "Swirl effect");
560         RNA_def_struct_sdna(srna, "SwirlShaderFxData");
561         RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
562
563         prop = RNA_def_property(srna, "radius", PROP_INT, PROP_PIXEL);
564         RNA_def_property_int_sdna(prop, NULL, "radius");
565         RNA_def_property_range(prop, 0, INT_MAX);
566         RNA_def_property_ui_text(prop, "Radius", "Radius to apply");
567         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
568
569         prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
570         RNA_def_property_float_sdna(prop, NULL, "angle");
571         RNA_def_property_range(prop, DEG2RAD(-5 * 360), DEG2RAD(5 * 360));
572         RNA_def_property_ui_range(prop, DEG2RAD(-5 * 360), DEG2RAD(5 * 360), 5, 2);
573         RNA_def_property_ui_text(prop, "Angle", "Angle of rotation");
574         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
575
576         prop = RNA_def_property(srna, "transparent", PROP_BOOLEAN, PROP_NONE);
577         RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_SWIRL_MAKE_TRANSPARENT);
578         RNA_def_property_ui_text(prop, "Transparent", "Make image transparent outside of radius");
579         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
580
581         prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
582         RNA_def_property_ui_text(prop, "Object", "Object to determine center location");
583         RNA_def_property_pointer_funcs(prop, NULL, "rna_SwirlShaderFx_object_set", NULL, NULL);
584         RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
585         RNA_def_property_update(prop, 0, "rna_ShaderFx_dependency_update");
586 }
587
588 static void rna_def_shader_fx_flip(BlenderRNA *brna)
589 {
590         StructRNA *srna;
591         PropertyRNA *prop;
592
593         srna = RNA_def_struct(brna, "ShaderFxFlip", "ShaderFx");
594         RNA_def_struct_ui_text(srna, "Flip Effect", "Flip effect");
595         RNA_def_struct_sdna(srna, "FlipShaderFxData");
596         RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
597
598         prop = RNA_def_property(srna, "flip_horizontal", PROP_BOOLEAN, PROP_NONE);
599         RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_FLIP_HORIZONTAL);
600         RNA_def_property_ui_text(prop, "Horizontal", "Flip image horizontally");
601         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
602
603         prop = RNA_def_property(srna, "flip_vertical", PROP_BOOLEAN, PROP_NONE);
604         RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_FLIP_VERTICAL);
605         RNA_def_property_ui_text(prop, "Vertical", "Flip image vertically");
606         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
607 }
608
609 static void rna_def_shader_fx_light(BlenderRNA *brna)
610 {
611         StructRNA *srna;
612         PropertyRNA *prop;
613
614         srna = RNA_def_struct(brna, "ShaderFxLight", "ShaderFx");
615         RNA_def_struct_ui_text(srna, "Light Effect", "Light effect");
616         RNA_def_struct_sdna(srna, "LightShaderFxData");
617         RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
618
619         prop = RNA_def_property(srna, "energy", PROP_FLOAT, PROP_NONE);
620         RNA_def_property_float_sdna(prop, NULL, "energy");
621         RNA_def_property_range(prop, 0, FLT_MAX);
622         RNA_def_property_ui_range(prop, 1, FLT_MAX, 1, 2);
623         RNA_def_property_ui_text(prop, "Energy", "Strength of light source");
624         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
625
626         prop = RNA_def_property(srna, "ambient", PROP_FLOAT, PROP_NONE);
627         RNA_def_property_float_sdna(prop, NULL, "ambient");
628         RNA_def_property_range(prop, 0, FLT_MAX);
629         RNA_def_property_ui_range(prop, 0, FLT_MAX, 1, 2);
630         RNA_def_property_ui_text(prop, "Ambient", "Strength of ambient light source");
631         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
632
633         prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
634         RNA_def_property_ui_text(prop, "Object", "Object to determine light source location");
635         RNA_def_property_pointer_funcs(prop, NULL, "rna_LightShaderFx_object_set", NULL, NULL);
636         RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
637         RNA_def_property_update(prop, 0, "rna_ShaderFx_dependency_update");
638 }
639
640 void RNA_def_shader_fx(BlenderRNA *brna)
641 {
642         StructRNA *srna;
643         PropertyRNA *prop;
644
645         /* data */
646         srna = RNA_def_struct(brna, "ShaderFx", NULL);
647         RNA_def_struct_ui_text(srna, "ShaderFx", "Effect affecting the grease pencil object");
648         RNA_def_struct_refine_func(srna, "rna_ShaderFx_refine");
649         RNA_def_struct_path_func(srna, "rna_ShaderFx_path");
650         RNA_def_struct_sdna(srna, "ShaderFxData");
651
652         /* strings */
653         prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
654         RNA_def_property_string_funcs(prop, NULL, NULL, "rna_ShaderFx_name_set");
655         RNA_def_property_ui_text(prop, "Name", "Effect name");
656         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER | NA_RENAME, NULL);
657         RNA_def_struct_name_property(srna, prop);
658
659         /* enums */
660         prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
661         RNA_def_property_clear_flag(prop, PROP_EDITABLE);
662         RNA_def_property_enum_sdna(prop, NULL, "type");
663         RNA_def_property_enum_items(prop, rna_enum_object_shaderfx_type_items);
664         RNA_def_property_ui_text(prop, "Type", "");
665
666         /* flags */
667         prop = RNA_def_property(srna, "show_viewport", PROP_BOOLEAN, PROP_NONE);
668         RNA_def_property_boolean_sdna(prop, NULL, "mode", eShaderFxMode_Realtime);
669         RNA_def_property_ui_text(prop, "Realtime", "Display effect in viewport");
670         RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
671         RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
672         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
673         RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_OFF, 0);
674
675         prop = RNA_def_property(srna, "show_render", PROP_BOOLEAN, PROP_NONE);
676         RNA_def_property_boolean_sdna(prop, NULL, "mode", eShaderFxMode_Render);
677         RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
678         RNA_def_property_ui_text(prop, "Render", "Use effect during render");
679         RNA_def_property_ui_icon(prop, ICON_SCENE, 0);
680         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL);
681
682         prop = RNA_def_property(srna, "show_in_editmode", PROP_BOOLEAN, PROP_NONE);
683         RNA_def_property_boolean_sdna(prop, NULL, "mode", eShaderFxMode_Editmode);
684         RNA_def_property_ui_text(prop, "Edit Mode", "Display effect in Edit mode");
685         RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
686         RNA_def_property_ui_icon(prop, ICON_EDITMODE_HLT, 0);
687
688         prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
689         RNA_def_property_boolean_sdna(prop, NULL, "mode", eShaderFxMode_Expanded);
690         RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
691         RNA_def_property_ui_text(prop, "Expanded", "Set effect expanded in the user interface");
692         RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1);
693
694         /* types */
695         rna_def_shader_fx_blur(brna);
696         rna_def_shader_fx_colorize(brna);
697         rna_def_shader_fx_wave(brna);
698         rna_def_shader_fx_pixel(brna);
699         rna_def_shader_fx_rim(brna);
700         rna_def_shader_fx_shadow(brna);
701         rna_def_shader_fx_glow(brna);
702         rna_def_shader_fx_swirl(brna);
703         rna_def_shader_fx_flip(brna);
704         rna_def_shader_fx_light(brna);
705 }
706
707 #endif