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