8696023fbe6d1184a11119fe6d46e906e0fac13a
[blender.git] / source / blender / makesrna / intern / rna_shader_fx.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file
18  * \ingroup RNA
19  */
20
21 #include <float.h>
22 #include <limits.h>
23 #include <stdlib.h>
24
25 #include "DNA_shader_fx_types.h"
26 #include "DNA_object_types.h"
27 #include "DNA_scene_types.h"
28
29 #include "MEM_guardedalloc.h"
30
31 #include "BLI_math.h"
32
33 #include "BLT_translation.h"
34
35 #include "BKE_animsys.h"
36
37 #include "RNA_access.h"
38 #include "RNA_define.h"
39 #include "RNA_enum_types.h"
40
41 #include "rna_internal.h"
42
43 #include "WM_api.h"
44 #include "WM_types.h"
45
46 const EnumPropertyItem rna_enum_object_shaderfx_type_items[] = {
47     {eShaderFxType_Blur, "FX_BLUR", ICON_SHADERFX, "Blur", "Apply Gaussian Blur to object"},
48     {eShaderFxType_Colorize,
49      "FX_COLORIZE",
50      ICON_SHADERFX,
51      "Colorize",
52      "Apply different tint effects"},
53     {eShaderFxType_Flip, "FX_FLIP", ICON_SHADERFX, "Flip", "Flip image"},
54     {eShaderFxType_Glow, "FX_GLOW", ICON_SHADERFX, "Glow", "Create a glow effect"},
55     {eShaderFxType_Light, "FX_LIGHT", ICON_SHADERFX, "Light", "Simulate illumination"},
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,
61      "FX_WAVE",
62      ICON_SHADERFX,
63      "Wave Distortion",
64      "Apply sinusoidal deformation"},
65     {0, NULL, 0, NULL, NULL},
66 };
67
68 static const EnumPropertyItem rna_enum_shaderfx_rim_modes_items[] = {
69     {eShaderFxRimMode_Normal, "NORMAL", 0, "Regular", ""},
70     {eShaderFxRimMode_Overlay, "OVERLAY", 0, "Overlay", ""},
71     {eShaderFxRimMode_Add, "ADD", 0, "Add", ""},
72     {eShaderFxRimMode_Subtract, "SUBTRACT", 0, "Subtract", ""},
73     {eShaderFxRimMode_Multiply, "MULTIPLY", 0, "Multiply", ""},
74     {eShaderFxRimMode_Divide, "DIVIDE", 0, "Divide", ""},
75     {0, NULL, 0, NULL, NULL}};
76
77 static const EnumPropertyItem rna_enum_shaderfx_glow_modes_items[] = {
78     {eShaderFxGlowMode_Luminance, "LUMINANCE", 0, "Luminance", ""},
79     {eShaderFxGlowMode_Color, "COLOR", 0, "Color", ""},
80     {0, NULL, 0, NULL, NULL}};
81
82 static const EnumPropertyItem rna_enum_shaderfx_colorize_modes_items[] = {
83     {eShaderFxColorizeMode_GrayScale, "GRAYSCALE", 0, "Gray Scale", ""},
84     {eShaderFxColorizeMode_Sepia, "SEPIA", 0, "Sepia", ""},
85     {eShaderFxColorizeMode_Duotone, "DUOTONE", 0, "Duotone", ""},
86     {eShaderFxColorizeMode_Transparent, "TRANSPARENT", 0, "Transparent", ""},
87     {eShaderFxColorizeMode_Custom, "CUSTOM", 0, "Custom", ""},
88     {0, NULL, 0, NULL, NULL}};
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, ID_RECALC_GEOMETRY);
164   WM_main_add_notifier(NC_OBJECT | ND_MODIFIER, 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( \
189         struct ReportList *UNUSED(reports), PointerRNA *ptr, PointerRNA value) \
190     { \
191       _type##ShaderFxData *tmd = (_type##ShaderFxData *)ptr->data; \
192       shaderfx_object_set(ptr->id.data, &tmd->_prop, _obtype, value); \
193     }
194
195 RNA_FX_OBJECT_SET(Light, object, OB_EMPTY);
196 RNA_FX_OBJECT_SET(Shadow, object, OB_EMPTY);
197 RNA_FX_OBJECT_SET(Swirl, object, OB_EMPTY);
198
199 #  undef RNA_FX_OBJECT_SET
200
201 #else
202
203 static void rna_def_shader_fx_blur(BlenderRNA *brna)
204 {
205   StructRNA *srna;
206   PropertyRNA *prop;
207
208   srna = RNA_def_struct(brna, "ShaderFxBlur", "ShaderFx");
209   RNA_def_struct_ui_text(srna, "Gaussian Blur Effect", "Gaussian Blur effect");
210   RNA_def_struct_sdna(srna, "BlurShaderFxData");
211   RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
212
213   prop = RNA_def_property(srna, "factor", PROP_INT, PROP_PIXEL);
214   RNA_def_property_int_sdna(prop, NULL, "radius");
215   RNA_def_property_range(prop, 0, INT_MAX);
216   RNA_def_property_ui_text(prop, "Factor", "Factor of Blur");
217   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
218
219   prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
220   RNA_def_property_int_sdna(prop, NULL, "samples");
221   RNA_def_property_range(prop, 0, 32);
222   RNA_def_property_ui_range(prop, 0, 32, 2, -1);
223   RNA_def_property_int_default(prop, 4);
224   RNA_def_property_ui_text(prop, "Samples", "Number of Blur Samples (zero, disable blur)");
225   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
226
227   prop = RNA_def_property(srna, "coc", PROP_FLOAT, PROP_NONE);
228   RNA_def_property_float_sdna(prop, NULL, "coc");
229   RNA_def_property_range(prop, 0.001f, 1.0f);
230   RNA_def_property_float_default(prop, 0.025f);
231   RNA_def_property_ui_text(prop, "Precision", "Define circle of confusion for depth of field");
232   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
233
234   prop = RNA_def_property(srna, "use_dof_mode", PROP_BOOLEAN, PROP_NONE);
235   RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_BLUR_DOF_MODE);
236   RNA_def_property_ui_text(prop,
237                            "Lock Focal Plane",
238                            "Blur using focal plane distance as factor to simulate depth of field "
239                            "effect (only in camera view)");
240   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
241 }
242
243 static void rna_def_shader_fx_colorize(BlenderRNA *brna)
244 {
245   StructRNA *srna;
246   PropertyRNA *prop;
247
248   srna = RNA_def_struct(brna, "ShaderFxColorize", "ShaderFx");
249   RNA_def_struct_ui_text(srna, "Colorize Effect", "Colorize effect");
250   RNA_def_struct_sdna(srna, "ColorizeShaderFxData");
251   RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
252
253   prop = RNA_def_property(srna, "factor", PROP_FLOAT, PROP_NONE);
254   RNA_def_property_float_sdna(prop, NULL, "factor");
255   RNA_def_property_range(prop, 0, 1.0);
256   RNA_def_property_ui_text(prop, "Factor", "Mix factor");
257   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
258
259   prop = RNA_def_property(srna, "low_color", PROP_FLOAT, PROP_COLOR_GAMMA);
260   RNA_def_property_range(prop, 0.0, 1.0);
261   RNA_def_property_float_sdna(prop, NULL, "low_color");
262   RNA_def_property_array(prop, 4);
263   RNA_def_property_ui_text(prop, "Low color", "First color used for effect");
264   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
265
266   prop = RNA_def_property(srna, "high_color", PROP_FLOAT, PROP_COLOR_GAMMA);
267   RNA_def_property_range(prop, 0.0, 1.0);
268   RNA_def_property_float_sdna(prop, NULL, "high_color");
269   RNA_def_property_array(prop, 4);
270   RNA_def_property_ui_text(prop, "Height color", "Second color used for effect");
271   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
272
273   prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
274   RNA_def_property_enum_sdna(prop, NULL, "mode");
275   RNA_def_property_enum_items(prop, rna_enum_shaderfx_colorize_modes_items);
276   RNA_def_property_ui_text(prop, "Mode", "Effect mode");
277   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
278 }
279
280 static void rna_def_shader_fx_wave(BlenderRNA *brna)
281 {
282   StructRNA *srna;
283   PropertyRNA *prop;
284
285   static EnumPropertyItem prop_shaderfx_wave_type_items[] = {
286       {0, "HORIZONTAL", 0, "Horizontal", ""},
287       {1, "VERTICAL", 0, "Vertical", ""},
288       {0, NULL, 0, NULL, NULL}};
289
290   srna = RNA_def_struct(brna, "ShaderFxWave", "ShaderFx");
291   RNA_def_struct_ui_text(srna, "Wave Deformation Effect", "Wave Deformation effect");
292   RNA_def_struct_sdna(srna, "WaveShaderFxData");
293   RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
294
295   prop = RNA_def_property(srna, "orientation", PROP_ENUM, PROP_NONE);
296   RNA_def_property_enum_sdna(prop, NULL, "orientation");
297   RNA_def_property_enum_items(prop, prop_shaderfx_wave_type_items);
298   RNA_def_property_ui_text(prop, "Orientation", "Direction of the wave");
299   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
300
301   prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
302   RNA_def_property_float_sdna(prop, NULL, "amplitude");
303   RNA_def_property_range(prop, 0, FLT_MAX);
304   RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of Wave");
305   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
306
307   prop = RNA_def_property(srna, "period", PROP_FLOAT, PROP_NONE);
308   RNA_def_property_float_sdna(prop, NULL, "period");
309   RNA_def_property_range(prop, 0, FLT_MAX);
310   RNA_def_property_ui_text(prop, "Period", "Period of Wave");
311   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
312
313   prop = RNA_def_property(srna, "phase", PROP_FLOAT, PROP_NONE);
314   RNA_def_property_float_sdna(prop, NULL, "phase");
315   RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
316   RNA_def_property_ui_text(prop, "Phase", "Phase Shift of Wave");
317   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
318 }
319
320 static void rna_def_shader_fx_pixel(BlenderRNA *brna)
321 {
322   StructRNA *srna;
323   PropertyRNA *prop;
324
325   srna = RNA_def_struct(brna, "ShaderFxPixel", "ShaderFx");
326   RNA_def_struct_ui_text(srna, "Pixelate Effect", "Pixelate effect");
327   RNA_def_struct_sdna(srna, "PixelShaderFxData");
328   RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
329
330   prop = RNA_def_property(srna, "size", PROP_INT, PROP_PIXEL);
331   RNA_def_property_int_sdna(prop, NULL, "size");
332   RNA_def_property_range(prop, 1, INT_MAX);
333   RNA_def_property_array(prop, 2);
334   RNA_def_property_ui_text(prop, "Size", "Pixel size");
335   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
336
337   prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA);
338   RNA_def_property_range(prop, 0.0, 1.0);
339   RNA_def_property_float_sdna(prop, NULL, "rgba");
340   RNA_def_property_array(prop, 4);
341   RNA_def_property_ui_text(prop, "Color", "Color used for lines");
342   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
343
344   prop = RNA_def_property(srna, "use_lines", PROP_BOOLEAN, PROP_NONE);
345   RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_PIXEL_USE_LINES);
346   RNA_def_property_ui_text(prop, "Lines", "Display lines between pixels");
347   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
348 }
349
350 static void rna_def_shader_fx_rim(BlenderRNA *brna)
351 {
352   StructRNA *srna;
353   PropertyRNA *prop;
354
355   srna = RNA_def_struct(brna, "ShaderFxRim", "ShaderFx");
356   RNA_def_struct_ui_text(srna, "Rim Effect", "Rim effect");
357   RNA_def_struct_sdna(srna, "RimShaderFxData");
358   RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
359
360   prop = RNA_def_property(srna, "offset", PROP_INT, PROP_PIXEL);
361   RNA_def_property_int_sdna(prop, NULL, "offset");
362   RNA_def_property_range(prop, -INT_MAX, INT_MAX);
363   RNA_def_property_ui_text(prop, "Offset", "Offset of the rim");
364   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
365
366   prop = RNA_def_property(srna, "rim_color", PROP_FLOAT, PROP_COLOR_GAMMA);
367   RNA_def_property_range(prop, 0.0, 1.0);
368   RNA_def_property_float_sdna(prop, NULL, "rim_rgb");
369   RNA_def_property_array(prop, 3);
370   RNA_def_property_ui_text(prop, "Rim Color", "Color used for Rim");
371   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
372
373   prop = RNA_def_property(srna, "mask_color", PROP_FLOAT, PROP_COLOR_GAMMA);
374   RNA_def_property_range(prop, 0.0, 1.0);
375   RNA_def_property_float_sdna(prop, NULL, "mask_rgb");
376   RNA_def_property_array(prop, 3);
377   RNA_def_property_ui_text(prop, "Mask Color", "Color that must be kept");
378   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
379
380   prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
381   RNA_def_property_enum_sdna(prop, NULL, "mode");
382   RNA_def_property_enum_items(prop, rna_enum_shaderfx_rim_modes_items);
383   RNA_def_property_ui_text(prop, "Mode", "Blend mode");
384   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
385
386   prop = RNA_def_property(srna, "blur", PROP_INT, PROP_PIXEL);
387   RNA_def_property_int_sdna(prop, NULL, "blur");
388   RNA_def_property_range(prop, 0, INT_MAX);
389   RNA_def_property_ui_text(
390       prop, "Blur", "Number of pixels for blurring rim (set to 0 to disable)");
391   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
392
393   prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
394   RNA_def_property_int_sdna(prop, NULL, "samples");
395   RNA_def_property_range(prop, 0, 32);
396   RNA_def_property_ui_range(prop, 0, 32, 2, -1);
397   RNA_def_property_int_default(prop, 4);
398   RNA_def_property_ui_text(prop, "Samples", "Number of Blur Samples (zero, disable blur)");
399   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
400 }
401
402 static void rna_def_shader_fx_shadow(BlenderRNA *brna)
403 {
404   static EnumPropertyItem prop_shaderfx_shadow_type_items[] = {
405       {0, "HORIZONTAL", 0, "Horizontal", ""},
406       {1, "VERTICAL", 0, "Vertical", ""},
407       {0, NULL, 0, NULL, NULL}};
408
409   StructRNA *srna;
410   PropertyRNA *prop;
411
412   srna = RNA_def_struct(brna, "ShaderFxShadow", "ShaderFx");
413   RNA_def_struct_ui_text(srna, "Shadow Effect", "Shadow effect");
414   RNA_def_struct_sdna(srna, "ShadowShaderFxData");
415   RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
416
417   prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
418   RNA_def_property_ui_text(prop, "Object", "Object to determine center of rotation");
419   RNA_def_property_pointer_funcs(prop, NULL, "rna_ShadowShaderFx_object_set", NULL, NULL);
420   RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
421   RNA_def_property_update(prop, 0, "rna_ShaderFx_dependency_update");
422
423   prop = RNA_def_property(srna, "offset", PROP_INT, PROP_PIXEL);
424   RNA_def_property_int_sdna(prop, NULL, "offset");
425   RNA_def_property_range(prop, -INT_MAX, INT_MAX);
426   RNA_def_property_ui_text(prop, "Offset", "Offset of the shadow");
427   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
428
429   prop = RNA_def_property(srna, "scale", PROP_FLOAT, PROP_NONE);
430   RNA_def_property_float_sdna(prop, NULL, "scale");
431   RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
432   RNA_def_property_ui_text(prop, "Scale", "Offset of the shadow");
433   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
434
435   prop = RNA_def_property(srna, "shadow_color", PROP_FLOAT, PROP_COLOR_GAMMA);
436   RNA_def_property_range(prop, 0.0, 1.0);
437   RNA_def_property_float_sdna(prop, NULL, "shadow_rgba");
438   RNA_def_property_array(prop, 4);
439   RNA_def_property_ui_text(prop, "Shadow Color", "Color used for Shadow");
440   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
441
442   prop = RNA_def_property(srna, "orientation", PROP_ENUM, PROP_NONE);
443   RNA_def_property_enum_sdna(prop, NULL, "orientation");
444   RNA_def_property_enum_items(prop, prop_shaderfx_shadow_type_items);
445   RNA_def_property_ui_text(prop, "Orientation", "Direction of the wave");
446   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
447
448   prop = RNA_def_property(srna, "amplitude", PROP_FLOAT, PROP_NONE);
449   RNA_def_property_float_sdna(prop, NULL, "amplitude");
450   RNA_def_property_range(prop, 0, FLT_MAX);
451   RNA_def_property_ui_text(prop, "Amplitude", "Amplitude of Wave");
452   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
453
454   prop = RNA_def_property(srna, "period", PROP_FLOAT, PROP_NONE);
455   RNA_def_property_float_sdna(prop, NULL, "period");
456   RNA_def_property_range(prop, 0, FLT_MAX);
457   RNA_def_property_ui_text(prop, "Period", "Period of Wave");
458   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
459
460   prop = RNA_def_property(srna, "phase", PROP_FLOAT, PROP_NONE);
461   RNA_def_property_float_sdna(prop, NULL, "phase");
462   RNA_def_property_range(prop, -FLT_MAX, FLT_MAX);
463   RNA_def_property_ui_text(prop, "Phase", "Phase Shift of Wave");
464   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
465
466   prop = RNA_def_property(srna, "rotation", PROP_FLOAT, PROP_ANGLE);
467   RNA_def_property_float_sdna(prop, NULL, "rotation");
468   RNA_def_property_range(prop, DEG2RAD(-360), DEG2RAD(360));
469   RNA_def_property_ui_range(prop, DEG2RAD(-360), DEG2RAD(360), 5, 2);
470   RNA_def_property_ui_text(prop, "Rotation", "Rotation around center or object");
471   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
472
473   prop = RNA_def_property(srna, "blur", PROP_INT, PROP_PIXEL);
474   RNA_def_property_int_sdna(prop, NULL, "blur");
475   RNA_def_property_range(prop, 0, INT_MAX);
476   RNA_def_property_ui_text(
477       prop, "Blur", "Number of pixels for blurring shadow (set to 0 to disable)");
478   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
479
480   prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
481   RNA_def_property_int_sdna(prop, NULL, "samples");
482   RNA_def_property_range(prop, 0, 32);
483   RNA_def_property_ui_range(prop, 0, 32, 2, -1);
484   RNA_def_property_int_default(prop, 4);
485   RNA_def_property_ui_text(prop, "Samples", "Number of Blur Samples (zero, disable blur)");
486   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
487
488   prop = RNA_def_property(srna, "use_object", PROP_BOOLEAN, PROP_NONE);
489   RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_SHADOW_USE_OBJECT);
490   RNA_def_property_ui_text(prop, "Use Object", "Use object as center of rotation");
491   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
492
493   prop = RNA_def_property(srna, "use_wave", PROP_BOOLEAN, PROP_NONE);
494   RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_SHADOW_USE_WAVE);
495   RNA_def_property_ui_text(prop, "Wave", "Use wave effect");
496   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
497 }
498
499 static void rna_def_shader_fx_glow(BlenderRNA *brna)
500 {
501   StructRNA *srna;
502   PropertyRNA *prop;
503
504   srna = RNA_def_struct(brna, "ShaderFxGlow", "ShaderFx");
505   RNA_def_struct_ui_text(srna, "Glow Effect", "Glow effect");
506   RNA_def_struct_sdna(srna, "GlowShaderFxData");
507   RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
508
509   prop = RNA_def_property(srna, "glow_color", PROP_FLOAT, PROP_COLOR_GAMMA);
510   RNA_def_property_range(prop, 0.0, 1.0);
511   RNA_def_property_float_sdna(prop, NULL, "glow_color");
512   RNA_def_property_array(prop, 3);
513   RNA_def_property_ui_text(prop, "Glow Color", "Color used for generated glow");
514   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
515
516   prop = RNA_def_property(srna, "select_color", PROP_FLOAT, PROP_COLOR_GAMMA);
517   RNA_def_property_range(prop, 0.0, 1.0);
518   RNA_def_property_float_sdna(prop, NULL, "select_color");
519   RNA_def_property_array(prop, 3);
520   RNA_def_property_ui_text(prop, "Select Color", "Color selected to apply glow");
521   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
522
523   prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
524   RNA_def_property_enum_sdna(prop, NULL, "mode");
525   RNA_def_property_enum_items(prop, rna_enum_shaderfx_glow_modes_items);
526   RNA_def_property_ui_text(prop, "Mode", "Glow mode");
527   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
528
529   prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_FACTOR);
530   RNA_def_property_float_sdna(prop, NULL, "threshold");
531   RNA_def_property_range(prop, 0.0f, 1.0f);
532   RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.1f, 3);
533   RNA_def_property_ui_text(prop, "Threshold", "Limit to select color for glow effect");
534   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
535
536   /* Use blur fields to make compatible with blur filter,
537    * but only makes public first array element. */
538   prop = RNA_def_property(srna, "radius", PROP_INT, PROP_PIXEL);
539   RNA_def_property_int_sdna(prop, NULL, "blur[0]");
540   RNA_def_property_range(prop, 0, INT_MAX);
541   RNA_def_property_ui_text(
542       prop, "Radius", "Number of pixels for blurring glow (set to 0 to disable)");
543   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
544
545   prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
546   RNA_def_property_int_sdna(prop, NULL, "samples");
547   RNA_def_property_range(prop, 1, 32);
548   RNA_def_property_ui_range(prop, 1, 32, 2, -1);
549   RNA_def_property_int_default(prop, 4);
550   RNA_def_property_ui_text(prop, "Samples", "Number of Blur Samples");
551   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
552
553   prop = RNA_def_property(srna, "use_alpha_mode", PROP_BOOLEAN, PROP_NONE);
554   RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_GLOW_USE_ALPHA);
555   RNA_def_property_ui_text(prop, "Use Alpha", "Glow only areas with alpha");
556   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
557 }
558
559 static void rna_def_shader_fx_swirl(BlenderRNA *brna)
560 {
561   StructRNA *srna;
562   PropertyRNA *prop;
563
564   srna = RNA_def_struct(brna, "ShaderFxSwirl", "ShaderFx");
565   RNA_def_struct_ui_text(srna, "Swirl Effect", "Swirl effect");
566   RNA_def_struct_sdna(srna, "SwirlShaderFxData");
567   RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
568
569   prop = RNA_def_property(srna, "radius", PROP_INT, PROP_PIXEL);
570   RNA_def_property_int_sdna(prop, NULL, "radius");
571   RNA_def_property_range(prop, 0, INT_MAX);
572   RNA_def_property_ui_text(prop, "Radius", "Radius to apply");
573   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
574
575   prop = RNA_def_property(srna, "angle", PROP_FLOAT, PROP_ANGLE);
576   RNA_def_property_float_sdna(prop, NULL, "angle");
577   RNA_def_property_range(prop, DEG2RAD(-5 * 360), DEG2RAD(5 * 360));
578   RNA_def_property_ui_range(prop, DEG2RAD(-5 * 360), DEG2RAD(5 * 360), 5, 2);
579   RNA_def_property_ui_text(prop, "Angle", "Angle of rotation");
580   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
581
582   prop = RNA_def_property(srna, "use_transparent", PROP_BOOLEAN, PROP_NONE);
583   RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_SWIRL_MAKE_TRANSPARENT);
584   RNA_def_property_ui_text(prop, "Transparent", "Make image transparent outside of radius");
585   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
586
587   prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
588   RNA_def_property_ui_text(prop, "Object", "Object to determine center location");
589   RNA_def_property_pointer_funcs(prop, NULL, "rna_SwirlShaderFx_object_set", NULL, NULL);
590   RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
591   RNA_def_property_update(prop, 0, "rna_ShaderFx_dependency_update");
592 }
593
594 static void rna_def_shader_fx_flip(BlenderRNA *brna)
595 {
596   StructRNA *srna;
597   PropertyRNA *prop;
598
599   srna = RNA_def_struct(brna, "ShaderFxFlip", "ShaderFx");
600   RNA_def_struct_ui_text(srna, "Flip Effect", "Flip effect");
601   RNA_def_struct_sdna(srna, "FlipShaderFxData");
602   RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
603
604   prop = RNA_def_property(srna, "flip_horizontal", PROP_BOOLEAN, PROP_NONE);
605   RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_FLIP_HORIZONTAL);
606   RNA_def_property_ui_text(prop, "Horizontal", "Flip image horizontally");
607   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
608
609   prop = RNA_def_property(srna, "flip_vertical", PROP_BOOLEAN, PROP_NONE);
610   RNA_def_property_boolean_sdna(prop, NULL, "flag", FX_FLIP_VERTICAL);
611   RNA_def_property_ui_text(prop, "Vertical", "Flip image vertically");
612   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
613 }
614
615 static void rna_def_shader_fx_light(BlenderRNA *brna)
616 {
617   StructRNA *srna;
618   PropertyRNA *prop;
619
620   srna = RNA_def_struct(brna, "ShaderFxLight", "ShaderFx");
621   RNA_def_struct_ui_text(srna, "Light Effect", "Light effect");
622   RNA_def_struct_sdna(srna, "LightShaderFxData");
623   RNA_def_struct_ui_icon(srna, ICON_SHADERFX);
624
625   prop = RNA_def_property(srna, "energy", PROP_FLOAT, PROP_NONE);
626   RNA_def_property_float_sdna(prop, NULL, "energy");
627   RNA_def_property_range(prop, 0, FLT_MAX);
628   RNA_def_property_ui_range(prop, 1, FLT_MAX, 1, 2);
629   RNA_def_property_ui_text(prop, "Energy", "Strength of light source");
630   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
631
632   prop = RNA_def_property(srna, "ambient", PROP_FLOAT, PROP_NONE);
633   RNA_def_property_float_sdna(prop, NULL, "ambient");
634   RNA_def_property_range(prop, 0, FLT_MAX);
635   RNA_def_property_ui_range(prop, 0, FLT_MAX, 1, 2);
636   RNA_def_property_ui_text(prop, "Ambient", "Strength of ambient light source");
637   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
638
639   prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
640   RNA_def_property_ui_text(prop, "Object", "Object to determine light source location");
641   RNA_def_property_pointer_funcs(prop, NULL, "rna_LightShaderFx_object_set", NULL, NULL);
642   RNA_def_property_flag(prop, PROP_EDITABLE | PROP_ID_SELF_CHECK);
643   RNA_def_property_update(prop, 0, "rna_ShaderFx_dependency_update");
644 }
645
646 void RNA_def_shader_fx(BlenderRNA *brna)
647 {
648   StructRNA *srna;
649   PropertyRNA *prop;
650
651   /* data */
652   srna = RNA_def_struct(brna, "ShaderFx", NULL);
653   RNA_def_struct_ui_text(srna, "ShaderFx", "Effect affecting the grease pencil object");
654   RNA_def_struct_refine_func(srna, "rna_ShaderFx_refine");
655   RNA_def_struct_path_func(srna, "rna_ShaderFx_path");
656   RNA_def_struct_sdna(srna, "ShaderFxData");
657
658   /* strings */
659   prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
660   RNA_def_property_string_funcs(prop, NULL, NULL, "rna_ShaderFx_name_set");
661   RNA_def_property_ui_text(prop, "Name", "Effect name");
662   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER | NA_RENAME, NULL);
663   RNA_def_struct_name_property(srna, prop);
664
665   /* enums */
666   prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
667   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
668   RNA_def_property_enum_sdna(prop, NULL, "type");
669   RNA_def_property_enum_items(prop, rna_enum_object_shaderfx_type_items);
670   RNA_def_property_ui_text(prop, "Type", "");
671   RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_ID); /* Abused, for "Light"... */
672
673   /* flags */
674   prop = RNA_def_property(srna, "show_viewport", PROP_BOOLEAN, PROP_NONE);
675   RNA_def_property_boolean_sdna(prop, NULL, "mode", eShaderFxMode_Realtime);
676   RNA_def_property_ui_text(prop, "Realtime", "Display effect in viewport");
677   RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
678   RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
679   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
680   RNA_def_property_ui_icon(prop, ICON_RESTRICT_VIEW_ON, 1);
681
682   prop = RNA_def_property(srna, "show_render", PROP_BOOLEAN, PROP_NONE);
683   RNA_def_property_boolean_sdna(prop, NULL, "mode", eShaderFxMode_Render);
684   RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
685   RNA_def_property_ui_text(prop, "Render", "Use effect during render");
686   RNA_def_property_ui_icon(prop, ICON_RESTRICT_RENDER_ON, 1);
687   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, NULL);
688
689   prop = RNA_def_property(srna, "show_in_editmode", PROP_BOOLEAN, PROP_NONE);
690   RNA_def_property_boolean_sdna(prop, NULL, "mode", eShaderFxMode_Editmode);
691   RNA_def_property_ui_text(prop, "Edit Mode", "Display effect in Edit mode");
692   RNA_def_property_update(prop, NC_OBJECT | ND_MODIFIER, "rna_ShaderFx_update");
693   RNA_def_property_ui_icon(prop, ICON_EDITMODE_HLT, 0);
694
695   prop = RNA_def_property(srna, "show_expanded", PROP_BOOLEAN, PROP_NONE);
696   RNA_def_property_flag(prop, PROP_NO_DEG_UPDATE);
697   RNA_def_property_boolean_sdna(prop, NULL, "mode", eShaderFxMode_Expanded);
698   RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_STATIC);
699   RNA_def_property_ui_text(prop, "Expanded", "Set effect expanded in the user interface");
700   RNA_def_property_ui_icon(prop, ICON_DISCLOSURE_TRI_RIGHT, 1);
701
702   /* types */
703   rna_def_shader_fx_blur(brna);
704   rna_def_shader_fx_colorize(brna);
705   rna_def_shader_fx_wave(brna);
706   rna_def_shader_fx_pixel(brna);
707   rna_def_shader_fx_rim(brna);
708   rna_def_shader_fx_shadow(brna);
709   rna_def_shader_fx_glow(brna);
710   rna_def_shader_fx_swirl(brna);
711   rna_def_shader_fx_flip(brna);
712   rna_def_shader_fx_light(brna);
713 }
714
715 #endif