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