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