Cleanup: reorder report argument for pointer assignment
[blender.git] / source / blender / makesrna / intern / rna_material.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 <stdlib.h>
23
24 #include "DNA_material_types.h"
25 #include "DNA_texture_types.h"
26
27 #include "RNA_define.h"
28 #include "RNA_enum_types.h"
29
30 #include "rna_internal.h"
31
32 #include "WM_api.h"
33 #include "WM_types.h"
34
35 const EnumPropertyItem rna_enum_ramp_blend_items[] = {
36     {MA_RAMP_BLEND, "MIX", 0, "Mix", ""},
37     {0, "", ICON_NONE, NULL, NULL},
38     {MA_RAMP_DARK, "DARKEN", 0, "Darken", ""},
39     {MA_RAMP_MULT, "MULTIPLY", 0, "Multiply", ""},
40     {MA_RAMP_BURN, "BURN", 0, "Burn", ""},
41     {0, "", ICON_NONE, NULL, NULL},
42     {MA_RAMP_LIGHT, "LIGHTEN", 0, "Lighten", ""},
43     {MA_RAMP_SCREEN, "SCREEN", 0, "Screen", ""},
44     {MA_RAMP_DODGE, "DODGE", 0, "Dodge", ""},
45     {MA_RAMP_ADD, "ADD", 0, "Add", ""},
46     {0, "", ICON_NONE, NULL, NULL},
47     {MA_RAMP_OVERLAY, "OVERLAY", 0, "Overlay", ""},
48     {MA_RAMP_SOFT, "SOFT_LIGHT", 0, "Soft Light", ""},
49     {MA_RAMP_LINEAR, "LINEAR_LIGHT", 0, "Linear Light", ""},
50     {0, "", ICON_NONE, NULL, NULL},
51     {MA_RAMP_DIFF, "DIFFERENCE", 0, "Difference", ""},
52     {MA_RAMP_SUB, "SUBTRACT", 0, "Subtract", ""},
53     {MA_RAMP_DIV, "DIVIDE", 0, "Divide", ""},
54     {0, "", ICON_NONE, NULL, NULL},
55     {MA_RAMP_HUE, "HUE", 0, "Hue", ""},
56     {MA_RAMP_SAT, "SATURATION", 0, "Saturation", ""},
57     {MA_RAMP_COLOR, "COLOR", 0, "Color", ""},
58     {MA_RAMP_VAL, "VALUE", 0, "Value", ""},
59     {0, NULL, 0, NULL, NULL},
60 };
61
62 #ifdef RNA_RUNTIME
63
64 #  include "MEM_guardedalloc.h"
65
66 #  include "DNA_node_types.h"
67 #  include "DNA_object_types.h"
68 #  include "DNA_screen_types.h"
69 #  include "DNA_space_types.h"
70
71 #  include "BKE_colorband.h"
72 #  include "BKE_context.h"
73 #  include "BKE_main.h"
74 #  include "BKE_gpencil.h"
75 #  include "BKE_material.h"
76 #  include "BKE_texture.h"
77 #  include "BKE_node.h"
78 #  include "BKE_paint.h"
79 #  include "BKE_scene.h"
80 #  include "BKE_workspace.h"
81
82 #  include "DEG_depsgraph.h"
83 #  include "DEG_depsgraph_build.h"
84
85 #  include "ED_node.h"
86 #  include "ED_image.h"
87 #  include "ED_screen.h"
88 #  include "ED_gpencil.h"
89
90 static void rna_Material_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
91 {
92   Material *ma = ptr->id.data;
93
94   DEG_id_tag_update(&ma->id, ID_RECALC_SHADING);
95   WM_main_add_notifier(NC_MATERIAL | ND_SHADING, ma);
96 }
97
98 static void rna_Material_update_previews(Main *UNUSED(bmain),
99                                          Scene *UNUSED(scene),
100                                          PointerRNA *ptr)
101 {
102   Material *ma = ptr->id.data;
103
104   if (ma->nodetree)
105     BKE_node_preview_clear_tree(ma->nodetree);
106
107   WM_main_add_notifier(NC_MATERIAL | ND_SHADING_PREVIEW, ma);
108 }
109
110 static void rna_MaterialGpencil_update(Main *bmain, Scene *scene, PointerRNA *ptr)
111 {
112   Material *ma = ptr->id.data;
113
114   rna_Material_update(bmain, scene, ptr);
115   WM_main_add_notifier(NC_GPENCIL | ND_DATA, ma);
116 }
117
118 static void rna_MaterialGpencil_nopreview_update(Main *bmain, Scene *scene, PointerRNA *ptr)
119 {
120   Material *ma = ptr->id.data;
121
122   rna_Material_update(bmain, scene, ptr);
123   WM_main_add_notifier(NC_GPENCIL | ND_DATA, ma);
124 }
125
126 static void rna_Material_draw_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
127 {
128   Material *ma = ptr->id.data;
129
130   DEG_id_tag_update(&ma->id, ID_RECALC_SHADING);
131   WM_main_add_notifier(NC_MATERIAL | ND_SHADING_DRAW, ma);
132 }
133
134 static void rna_Material_texpaint_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
135 {
136   Material *ma = (Material *)ptr->data;
137   rna_iterator_array_begin(
138       iter, (void *)ma->texpaintslot, sizeof(TexPaintSlot), ma->tot_slots, 0, NULL);
139 }
140
141 static void rna_Material_active_paint_texture_index_update(Main *bmain,
142                                                            Scene *UNUSED(scene),
143                                                            PointerRNA *ptr)
144 {
145   bScreen *sc;
146   Material *ma = ptr->id.data;
147
148   if (ma->use_nodes && ma->nodetree) {
149     struct bNode *node;
150     int index = 0;
151     for (node = ma->nodetree->nodes.first; node; node = node->next) {
152       if (node->typeinfo->nclass == NODE_CLASS_TEXTURE &&
153           node->typeinfo->type == SH_NODE_TEX_IMAGE && node->id) {
154         if (index++ == ma->paint_active_slot) {
155           break;
156         }
157       }
158     }
159     if (node)
160       nodeSetActive(ma->nodetree, node);
161   }
162
163   if (ma->texpaintslot) {
164     Image *image = ma->texpaintslot[ma->paint_active_slot].ima;
165     for (sc = bmain->screens.first; sc; sc = sc->id.next) {
166       wmWindow *win = ED_screen_window_find(sc, bmain->wm.first);
167       if (win == NULL) {
168         continue;
169       }
170
171       Object *obedit = NULL;
172       {
173         ViewLayer *view_layer = WM_window_get_active_view_layer(win);
174         obedit = OBEDIT_FROM_VIEW_LAYER(view_layer);
175       }
176
177       ScrArea *sa;
178       for (sa = sc->areabase.first; sa; sa = sa->next) {
179         SpaceLink *sl;
180         for (sl = sa->spacedata.first; sl; sl = sl->next) {
181           if (sl->spacetype == SPACE_IMAGE) {
182             SpaceImage *sima = (SpaceImage *)sl;
183             if (!sima->pin) {
184               ED_space_image_set(bmain, sima, obedit, image, true);
185             }
186           }
187         }
188       }
189     }
190   }
191
192   DEG_id_tag_update(&ma->id, 0);
193   WM_main_add_notifier(NC_MATERIAL | ND_SHADING, ma);
194 }
195
196 static void rna_Material_use_nodes_update(bContext *C, PointerRNA *ptr)
197 {
198   Material *ma = (Material *)ptr->data;
199   Main *bmain = CTX_data_main(C);
200
201   if (ma->use_nodes && ma->nodetree == NULL)
202     ED_node_shader_default(C, &ma->id);
203
204   DEG_id_tag_update(&ma->id, ID_RECALC_COPY_ON_WRITE);
205   DEG_relations_tag_update(bmain);
206   rna_Material_draw_update(bmain, CTX_data_scene(C), ptr);
207 }
208
209 MTex *rna_mtex_texture_slots_add(ID *self_id, struct bContext *C, ReportList *reports)
210 {
211   MTex *mtex = BKE_texture_mtex_add_id(self_id, -1);
212   if (mtex == NULL) {
213     BKE_reportf(reports, RPT_ERROR, "Maximum number of textures added %d", MAX_MTEX);
214     return NULL;
215   }
216
217   /* for redraw only */
218   WM_event_add_notifier(C, NC_TEXTURE, CTX_data_scene(C));
219
220   return mtex;
221 }
222
223 MTex *rna_mtex_texture_slots_create(ID *self_id,
224                                     struct bContext *C,
225                                     ReportList *reports,
226                                     int index)
227 {
228   MTex *mtex;
229
230   if (index < 0 || index >= MAX_MTEX) {
231     BKE_reportf(reports, RPT_ERROR, "Index %d is invalid", index);
232     return NULL;
233   }
234
235   mtex = BKE_texture_mtex_add_id(self_id, index);
236
237   /* for redraw only */
238   WM_event_add_notifier(C, NC_TEXTURE, CTX_data_scene(C));
239
240   return mtex;
241 }
242
243 void rna_mtex_texture_slots_clear(ID *self_id, struct bContext *C, ReportList *reports, int index)
244 {
245   MTex **mtex_ar;
246   short act;
247
248   give_active_mtex(self_id, &mtex_ar, &act);
249
250   if (mtex_ar == NULL) {
251     BKE_report(reports, RPT_ERROR, "Mtex not found for this type");
252     return;
253   }
254
255   if (index < 0 || index >= MAX_MTEX) {
256     BKE_reportf(reports, RPT_ERROR, "Index %d is invalid", index);
257     return;
258   }
259
260   if (mtex_ar[index]) {
261     id_us_min((ID *)mtex_ar[index]->tex);
262     MEM_freeN(mtex_ar[index]);
263     mtex_ar[index] = NULL;
264     DEG_id_tag_update(self_id, 0);
265   }
266
267   /* for redraw only */
268   WM_event_add_notifier(C, NC_TEXTURE, CTX_data_scene(C));
269 }
270
271 static void rna_TexPaintSlot_uv_layer_get(PointerRNA *ptr, char *value)
272 {
273   TexPaintSlot *data = (TexPaintSlot *)(ptr->data);
274
275   if (data->uvname != NULL) {
276     BLI_strncpy_utf8(value, data->uvname, 64);
277   }
278   else {
279     value[0] = '\0';
280   }
281 }
282
283 static int rna_TexPaintSlot_uv_layer_length(PointerRNA *ptr)
284 {
285   TexPaintSlot *data = (TexPaintSlot *)(ptr->data);
286   return data->uvname == NULL ? 0 : strlen(data->uvname);
287 }
288
289 static void rna_TexPaintSlot_uv_layer_set(PointerRNA *ptr, const char *value)
290 {
291   TexPaintSlot *data = (TexPaintSlot *)(ptr->data);
292
293   if (data->uvname != NULL) {
294     BLI_strncpy_utf8(data->uvname, value, 64);
295   }
296 }
297
298 static bool rna_is_grease_pencil_get(PointerRNA *ptr)
299 {
300   Material *ma = (Material *)ptr->data;
301   if (ma->gp_style != NULL)
302     return true;
303
304   return false;
305 }
306
307 static void rna_gpcolordata_uv_update(Main *bmain, Scene *scene, PointerRNA *ptr)
308 {
309   /* update all uv strokes of this color */
310   Material *ma = ptr->id.data;
311   ED_gpencil_update_color_uv(bmain, ma);
312
313   rna_MaterialGpencil_update(bmain, scene, ptr);
314 }
315
316 static char *rna_GpencilColorData_path(PointerRNA *UNUSED(ptr))
317 {
318   return BLI_strdup("grease_pencil");
319 }
320
321 static int rna_GpencilColorData_is_stroke_visible_get(PointerRNA *ptr)
322 {
323   MaterialGPencilStyle *pcolor = ptr->data;
324   return (pcolor->stroke_rgba[3] > GPENCIL_ALPHA_OPACITY_THRESH);
325 }
326
327 static int rna_GpencilColorData_is_fill_visible_get(PointerRNA *ptr)
328 {
329   MaterialGPencilStyle *pcolor = (MaterialGPencilStyle *)ptr->data;
330   return ((pcolor->fill_rgba[3] > GPENCIL_ALPHA_OPACITY_THRESH) || (pcolor->fill_style > 0));
331 }
332
333 static void rna_GpencilColorData_stroke_image_set(PointerRNA *ptr,
334                                                   PointerRNA value,
335                                                   struct ReportList *UNUSED(reports))
336 {
337   MaterialGPencilStyle *pcolor = ptr->data;
338   ID *id = value.data;
339
340   id_us_plus(id);
341   pcolor->sima = (struct Image *)id;
342 }
343
344 static void rna_GpencilColorData_fill_image_set(PointerRNA *ptr,
345                                                 PointerRNA value,
346                                                 struct ReportList *UNUSED(reports))
347 {
348   MaterialGPencilStyle *pcolor = (MaterialGPencilStyle *)ptr->data;
349   ID *id = value.data;
350
351   id_us_plus(id);
352   pcolor->ima = (struct Image *)id;
353 }
354
355 #else
356
357 static void rna_def_material_display(StructRNA *srna)
358 {
359   PropertyRNA *prop;
360
361   prop = RNA_def_property(srna, "diffuse_color", PROP_FLOAT, PROP_COLOR);
362   RNA_def_property_float_sdna(prop, NULL, "r");
363   RNA_def_property_array(prop, 4);
364   RNA_def_property_ui_text(prop, "Diffuse Color", "Diffuse color of the material");
365   RNA_def_property_update(prop, 0, "rna_Material_draw_update");
366
367   prop = RNA_def_property(srna, "specular_color", PROP_FLOAT, PROP_COLOR);
368   RNA_def_property_float_sdna(prop, NULL, "specr");
369   RNA_def_property_array(prop, 3);
370   RNA_def_property_ui_text(prop, "Specular Color", "Specular color of the material");
371   RNA_def_property_update(prop, 0, "rna_Material_draw_update");
372
373   prop = RNA_def_property(srna, "roughness", PROP_FLOAT, PROP_FACTOR);
374   RNA_def_property_float_sdna(prop, NULL, "roughness");
375   RNA_def_property_float_default(prop, 0.25f);
376   RNA_def_property_range(prop, 0, 1);
377   RNA_def_property_ui_text(prop, "Roughness", "Roughness of the material");
378   RNA_def_property_update(prop, 0, "rna_Material_draw_update");
379
380   prop = RNA_def_property(srna, "specular_intensity", PROP_FLOAT, PROP_FACTOR);
381   RNA_def_property_float_sdna(prop, NULL, "spec");
382   RNA_def_property_float_default(prop, 0.5f);
383   RNA_def_property_range(prop, 0, 1);
384   RNA_def_property_ui_text(prop, "Specular", "How intense (bright) the specular reflection is");
385   RNA_def_property_update(prop, 0, "rna_Material_draw_update");
386
387   prop = RNA_def_property(srna, "metallic", PROP_FLOAT, PROP_FACTOR);
388   RNA_def_property_float_sdna(prop, NULL, "metallic");
389   RNA_def_property_range(prop, 0.0f, 1.0f);
390   RNA_def_property_ui_text(prop, "Metallic", "Amount of mirror reflection for raytrace");
391   RNA_def_property_update(prop, 0, "rna_Material_update");
392
393   /* Freestyle line color */
394   prop = RNA_def_property(srna, "line_color", PROP_FLOAT, PROP_COLOR);
395   RNA_def_property_float_sdna(prop, NULL, "line_col");
396   RNA_def_property_array(prop, 4);
397   RNA_def_property_ui_text(prop, "Line Color", "Line color used for Freestyle line rendering");
398   RNA_def_property_update(prop, 0, "rna_Material_update");
399
400   prop = RNA_def_property(srna, "line_priority", PROP_INT, PROP_NONE);
401   RNA_def_property_int_sdna(prop, NULL, "line_priority");
402   RNA_def_property_range(prop, 0, 32767);
403   RNA_def_property_ui_text(
404       prop, "Line Priority", "The line color of a higher priority is used at material boundaries");
405   RNA_def_property_update(prop, 0, "rna_Material_update");
406 }
407
408 static void rna_def_material_greasepencil(BlenderRNA *brna)
409 {
410   StructRNA *srna;
411   PropertyRNA *prop;
412
413   /* mode type styles */
414   static EnumPropertyItem gpcolordata_mode_types_items[] = {
415       {GP_STYLE_MODE_LINE, "LINE", 0, "Line", "Draw strokes using a continuous line"},
416       {GP_STYLE_MODE_DOTS, "DOTS", 0, "Dots", "Draw strokes using separated dots"},
417       {GP_STYLE_MODE_BOX, "BOX", 0, "Boxes", "Draw strokes using separated rectangle boxes"},
418       {0, NULL, 0, NULL, NULL},
419   };
420
421   /* stroke styles */
422   static EnumPropertyItem stroke_style_items[] = {
423       {GP_STYLE_STROKE_STYLE_SOLID, "SOLID", 0, "Solid", "Draw strokes with solid color"},
424       {GP_STYLE_STROKE_STYLE_TEXTURE, "TEXTURE", 0, "Texture", "Draw strokes using texture"},
425       {0, NULL, 0, NULL, NULL},
426   };
427
428   /* fill styles */
429   static EnumPropertyItem fill_style_items[] = {
430       {GP_STYLE_FILL_STYLE_SOLID, "SOLID", 0, "Solid", "Fill area with solid color"},
431       {GP_STYLE_FILL_STYLE_GRADIENT, "GRADIENT", 0, "Gradient", "Fill area with gradient color"},
432       {GP_STYLE_FILL_STYLE_CHESSBOARD,
433        "CHESSBOARD",
434        0,
435        "Checker Board",
436        "Fill area with chessboard pattern"},
437       {GP_STYLE_FILL_STYLE_TEXTURE, "TEXTURE", 0, "Texture", "Fill area with image texture"},
438       {0, NULL, 0, NULL, NULL},
439   };
440
441   static EnumPropertyItem fill_gradient_items[] = {
442       {GP_STYLE_GRADIENT_LINEAR, "LINEAR", 0, "Linear", "Fill area with gradient color"},
443       {GP_STYLE_GRADIENT_RADIAL, "RADIAL", 0, "Radial", "Fill area with radial gradient"},
444       {0, NULL, 0, NULL, NULL},
445   };
446
447   static EnumPropertyItem alignment_draw_items[] = {
448       {GP_STYLE_FOLLOW_PATH, "PATH", 0, "Path", "Follow stroke drawing path and object rotation"},
449       {GP_STYLE_FOLLOW_OBJ, "OBJECT", 0, "Object", "Follow object rotation only"},
450       {GP_STYLE_FOLLOW_FIXED,
451        "FIXED",
452        0,
453        "Fixed",
454        "Do not follow drawing path or object rotation and keeps aligned with viewport"},
455       {0, NULL, 0, NULL, NULL},
456   };
457
458   srna = RNA_def_struct(brna, "MaterialGPencilStyle", NULL);
459   RNA_def_struct_sdna(srna, "MaterialGPencilStyle");
460   RNA_def_struct_ui_text(srna, "Grease Pencil Color", "");
461   RNA_def_struct_path_func(srna, "rna_GpencilColorData_path");
462
463   prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA);
464   RNA_def_property_range(prop, 0.0, 1.0);
465   RNA_def_property_float_sdna(prop, NULL, "stroke_rgba");
466   RNA_def_property_array(prop, 4);
467   RNA_def_property_ui_text(prop, "Color", "");
468   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
469
470   /* Fill Drawing Color */
471   prop = RNA_def_property(srna, "fill_color", PROP_FLOAT, PROP_COLOR_GAMMA);
472   RNA_def_property_float_sdna(prop, NULL, "fill_rgba");
473   RNA_def_property_array(prop, 4);
474   RNA_def_property_range(prop, 0.0f, 1.0f);
475   RNA_def_property_ui_text(prop, "Fill Color", "Color for filling region bounded by each stroke");
476   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
477
478   /* Secondary Drawing Color */
479   prop = RNA_def_property(srna, "mix_color", PROP_FLOAT, PROP_COLOR_GAMMA);
480   RNA_def_property_float_sdna(prop, NULL, "mix_rgba");
481   RNA_def_property_array(prop, 4);
482   RNA_def_property_range(prop, 0.0f, 1.0f);
483   RNA_def_property_ui_text(prop, "Mix Color", "Color for mixing with primary filling color");
484   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
485
486   /* Mix factor */
487   prop = RNA_def_property(srna, "mix_factor", PROP_FLOAT, PROP_NONE);
488   RNA_def_property_float_sdna(prop, NULL, "mix_factor");
489   RNA_def_property_range(prop, 0.0f, 1.0f);
490   RNA_def_property_ui_text(prop, "Mix", "Mix Adjustment Factor");
491   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
492
493   /* Stroke Mix factor */
494   prop = RNA_def_property(srna, "mix_stroke_factor", PROP_FLOAT, PROP_NONE);
495   RNA_def_property_float_sdna(prop, NULL, "mix_stroke_factor");
496   RNA_def_property_range(prop, 0.0f, 1.0f);
497   RNA_def_property_ui_text(prop, "Mix", "Mix Stroke Color");
498   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
499
500   /* Scale factor for uv coordinates */
501   prop = RNA_def_property(srna, "pattern_scale", PROP_FLOAT, PROP_COORDS);
502   RNA_def_property_float_sdna(prop, NULL, "gradient_scale");
503   RNA_def_property_array(prop, 2);
504   RNA_def_property_ui_text(prop, "Scale", "Scale Factor for UV coordinates");
505   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
506
507   /* Shift factor to move pattern filling in 2d space */
508   prop = RNA_def_property(srna, "pattern_shift", PROP_FLOAT, PROP_COORDS);
509   RNA_def_property_float_sdna(prop, NULL, "gradient_shift");
510   RNA_def_property_array(prop, 2);
511   RNA_def_property_ui_text(prop, "Shift", "Shift filling pattern in 2d space");
512   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
513
514   /* Gradient angle */
515   prop = RNA_def_property(srna, "pattern_angle", PROP_FLOAT, PROP_ANGLE);
516   RNA_def_property_float_sdna(prop, NULL, "gradient_angle");
517   RNA_def_property_ui_text(prop, "Angle", "Pattern Orientation Angle");
518   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
519
520   /* Gradient radius */
521   prop = RNA_def_property(srna, "pattern_radius", PROP_FLOAT, PROP_NONE);
522   RNA_def_property_float_sdna(prop, NULL, "gradient_radius");
523   RNA_def_property_range(prop, 0.0001f, 10.0f);
524   RNA_def_property_ui_text(prop, "Radius", "Pattern Radius");
525   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
526
527   /* Box size */
528   prop = RNA_def_property(srna, "pattern_gridsize", PROP_FLOAT, PROP_NONE);
529   RNA_def_property_float_sdna(prop, NULL, "pattern_gridsize");
530   RNA_def_property_range(prop, 0.0001f, 10.0f);
531   RNA_def_property_ui_text(prop, "Size", "Box Size");
532   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
533
534   /* Texture angle */
535   prop = RNA_def_property(srna, "texture_angle", PROP_FLOAT, PROP_ANGLE);
536   RNA_def_property_float_sdna(prop, NULL, "texture_angle");
537   RNA_def_property_ui_text(prop, "Angle", "Texture Orientation Angle");
538   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
539
540   /* Scale factor for texture */
541   prop = RNA_def_property(srna, "texture_scale", PROP_FLOAT, PROP_COORDS);
542   RNA_def_property_float_sdna(prop, NULL, "texture_scale");
543   RNA_def_property_array(prop, 2);
544   RNA_def_property_ui_text(prop, "Scale", "Scale Factor for Texture");
545   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
546
547   /* Shift factor to move texture in 2d space */
548   prop = RNA_def_property(srna, "texture_offset", PROP_FLOAT, PROP_COORDS);
549   RNA_def_property_float_sdna(prop, NULL, "texture_offset");
550   RNA_def_property_array(prop, 2);
551   RNA_def_property_ui_text(prop, "Offset", "Shift Texture in 2d Space");
552   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
553
554   /* Texture opacity size */
555   prop = RNA_def_property(srna, "texture_opacity", PROP_FLOAT, PROP_NONE);
556   RNA_def_property_float_sdna(prop, NULL, "texture_opacity");
557   RNA_def_property_range(prop, 0.0f, 1.0f);
558   RNA_def_property_ui_text(prop, "Opacity", "Texture Opacity");
559   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
560
561   /* texture pixsize factor (used for UV along the stroke) */
562   prop = RNA_def_property(srna, "pixel_size", PROP_FLOAT, PROP_NONE);
563   RNA_def_property_float_sdna(prop, NULL, "texture_pixsize");
564   RNA_def_property_range(prop, 1, 5000);
565   RNA_def_property_ui_text(prop, "UV Factor", "Texture Pixel Size factor along the stroke");
566   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_gpcolordata_uv_update");
567
568   /* Flags */
569   prop = RNA_def_property(srna, "hide", PROP_BOOLEAN, PROP_NONE);
570   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_COLOR_HIDE);
571   RNA_def_property_ui_icon(prop, ICON_HIDE_OFF, -1);
572   RNA_def_property_ui_text(prop, "Hide", "Set color Visibility");
573   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_nopreview_update");
574
575   prop = RNA_def_property(srna, "lock", PROP_BOOLEAN, PROP_NONE);
576   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_COLOR_LOCKED);
577   RNA_def_property_ui_icon(prop, ICON_UNLOCKED, 1);
578   RNA_def_property_ui_text(
579       prop, "Locked", "Protect color from further editing and/or frame changes");
580   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_nopreview_update");
581
582   prop = RNA_def_property(srna, "ghost", PROP_BOOLEAN, PROP_NONE);
583   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_COLOR_ONIONSKIN);
584   RNA_def_property_ui_icon(prop, ICON_GHOST_ENABLED, 0);
585   RNA_def_property_ui_text(
586       prop, "Show in Ghosts", "Display strokes using this color when showing onion skins");
587   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_nopreview_update");
588
589   prop = RNA_def_property(srna, "texture_clamp", PROP_BOOLEAN, PROP_NONE);
590   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_COLOR_TEX_CLAMP);
591   RNA_def_property_ui_text(prop, "Clamp", "Do not repeat texture and clamp to one instance only");
592   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
593
594   prop = RNA_def_property(srna, "use_fill_texture_mix", PROP_BOOLEAN, PROP_NONE);
595   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_FILL_TEX_MIX);
596   RNA_def_property_ui_text(prop, "Mix Texture", "Mix texture image with filling color");
597   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
598
599   prop = RNA_def_property(srna, "use_stroke_texture_mix", PROP_BOOLEAN, PROP_NONE);
600   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_STROKE_TEX_MIX);
601   RNA_def_property_ui_text(prop, "Mix Texture", "Mix texture image with stroke color");
602   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
603
604   prop = RNA_def_property(srna, "flip", PROP_BOOLEAN, PROP_NONE);
605   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_COLOR_FLIP_FILL);
606   RNA_def_property_ui_text(prop, "Flip", "Flip filling colors");
607   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
608
609   prop = RNA_def_property(srna, "use_stroke_pattern", PROP_BOOLEAN, PROP_NONE);
610   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_STROKE_PATTERN);
611   RNA_def_property_ui_text(prop, "Pattern", "Use Stroke Texture as a pattern to apply color");
612   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
613
614   prop = RNA_def_property(srna, "use_fill_pattern", PROP_BOOLEAN, PROP_NONE);
615   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_FILL_PATTERN);
616   RNA_def_property_ui_text(prop, "Pattern", "Use Fill Texture as a pattern to apply color");
617   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
618
619   prop = RNA_def_property(srna, "show_stroke", PROP_BOOLEAN, PROP_NONE);
620   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_STROKE_SHOW);
621   RNA_def_property_ui_text(prop, "Show Stroke", "Show stroke lines of this material");
622   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
623
624   prop = RNA_def_property(srna, "show_fill", PROP_BOOLEAN, PROP_NONE);
625   RNA_def_property_boolean_sdna(prop, NULL, "flag", GP_STYLE_FILL_SHOW);
626   RNA_def_property_ui_text(prop, "Show Fill", "Show stroke fills of this material");
627   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
628
629   /* Mode to align Dots and Boxes to drawing path and object rotation */
630   prop = RNA_def_property(srna, "alignment_mode", PROP_ENUM, PROP_NONE);
631   RNA_def_property_enum_bitflag_sdna(prop, NULL, "alignment_mode");
632   RNA_def_property_enum_items(prop, alignment_draw_items);
633   RNA_def_property_ui_text(
634       prop, "Alignment", "Defines how align Dots and Boxes with drawing path and object rotation");
635   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_nopreview_update");
636
637   /* pass index for future compositing and editing tools */
638   prop = RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED);
639   RNA_def_property_int_sdna(prop, NULL, "index");
640   RNA_def_property_ui_text(prop, "Pass Index", "Index number for the \"Color Index\" pass");
641   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_nopreview_update");
642
643   /* mode type */
644   prop = RNA_def_property(srna, "mode", PROP_ENUM, PROP_NONE);
645   RNA_def_property_enum_bitflag_sdna(prop, NULL, "mode");
646   RNA_def_property_enum_items(prop, gpcolordata_mode_types_items);
647   RNA_def_property_ui_text(prop, "Mode Type", "Select draw mode for stroke");
648   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
649
650   /* stroke style */
651   prop = RNA_def_property(srna, "stroke_style", PROP_ENUM, PROP_NONE);
652   RNA_def_property_enum_bitflag_sdna(prop, NULL, "stroke_style");
653   RNA_def_property_enum_items(prop, stroke_style_items);
654   RNA_def_property_ui_text(prop, "Stroke Style", "Select style used to draw strokes");
655   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
656
657   /* stroke image texture */
658   prop = RNA_def_property(srna, "stroke_image", PROP_POINTER, PROP_NONE);
659   RNA_def_property_pointer_sdna(prop, NULL, "sima");
660   RNA_def_property_pointer_funcs(prop, NULL, "rna_GpencilColorData_stroke_image_set", NULL, NULL);
661   RNA_def_property_flag(prop, PROP_EDITABLE);
662   RNA_def_property_ui_text(prop, "Image", "");
663   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
664
665   /* fill style */
666   prop = RNA_def_property(srna, "fill_style", PROP_ENUM, PROP_NONE);
667   RNA_def_property_enum_bitflag_sdna(prop, NULL, "fill_style");
668   RNA_def_property_enum_items(prop, fill_style_items);
669   RNA_def_property_ui_text(prop, "Fill Style", "Select style used to fill strokes");
670   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
671
672   /* gradient type */
673   prop = RNA_def_property(srna, "gradient_type", PROP_ENUM, PROP_NONE);
674   RNA_def_property_enum_bitflag_sdna(prop, NULL, "gradient_type");
675   RNA_def_property_enum_items(prop, fill_gradient_items);
676   RNA_def_property_ui_text(prop, "Gradient Type", "Select type of gradient used to fill strokes");
677   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
678
679   /* fill image texture */
680   prop = RNA_def_property(srna, "fill_image", PROP_POINTER, PROP_NONE);
681   RNA_def_property_pointer_sdna(prop, NULL, "ima");
682   RNA_def_property_pointer_funcs(prop, NULL, "rna_GpencilColorData_fill_image_set", NULL, NULL);
683   RNA_def_property_flag(prop, PROP_EDITABLE);
684   RNA_def_property_ui_text(prop, "Image", "");
685   RNA_def_property_update(prop, NC_GPENCIL | ND_SHADING, "rna_MaterialGpencil_update");
686
687   /* Read-only state props (for simpler UI code) */
688   prop = RNA_def_property(srna, "is_stroke_visible", PROP_BOOLEAN, PROP_NONE);
689   RNA_def_property_boolean_funcs(prop, "rna_GpencilColorData_is_stroke_visible_get", NULL);
690   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
691   RNA_def_property_ui_text(
692       prop, "Is Stroke Visible", "True when opacity of stroke is set high enough to be visible");
693
694   prop = RNA_def_property(srna, "is_fill_visible", PROP_BOOLEAN, PROP_NONE);
695   RNA_def_property_boolean_funcs(prop, "rna_GpencilColorData_is_fill_visible_get", NULL);
696   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
697   RNA_def_property_ui_text(
698       prop, "Is Fill Visible", "True when opacity of fill is set high enough to be visible");
699 }
700
701 void RNA_def_material(BlenderRNA *brna)
702 {
703   StructRNA *srna;
704   PropertyRNA *prop;
705
706   /* Render Preview Types */
707   static const EnumPropertyItem preview_type_items[] = {
708       {MA_FLAT, "FLAT", ICON_MATPLANE, "Flat", "Flat XY plane"},
709       {MA_SPHERE, "SPHERE", ICON_MATSPHERE, "Sphere", "Sphere"},
710       {MA_CUBE, "CUBE", ICON_MATCUBE, "Cube", "Cube"},
711       {MA_HAIR, "HAIR", ICON_HAIR, "Hair", "Hair strands"},
712       {MA_SHADERBALL, "SHADERBALL", ICON_MATSHADERBALL, "Shader Ball", "Shader Ball"},
713       {MA_CLOTH, "CLOTH", ICON_MATCLOTH, "Cloth", "Cloth"},
714       {MA_FLUID, "FLUID", ICON_MATFLUID, "Fluid", "Fluid"},
715       {0, NULL, 0, NULL, NULL},
716   };
717
718   static EnumPropertyItem prop_eevee_blend_items[] = {
719       {MA_BM_SOLID, "OPAQUE", 0, "Opaque", "Render surface without transparency"},
720       {MA_BM_ADD,
721        "ADD",
722        0,
723        "Additive",
724        "Render surface and blend the result with additive blending"},
725       {MA_BM_MULTIPLY,
726        "MULTIPLY",
727        0,
728        "Multiply",
729        "Render surface and blend the result with multiplicative blending"},
730       {MA_BM_CLIP,
731        "CLIP",
732        0,
733        "Alpha Clip",
734        "Use the alpha threshold to clip the visibility (binary visibility)"},
735       {MA_BM_HASHED,
736        "HASHED",
737        0,
738        "Alpha Hashed",
739        "Use noise to dither the binary visibility (works well with multi-samples)"},
740       {MA_BM_BLEND,
741        "BLEND",
742        0,
743        "Alpha Blend",
744        "Render polygon transparent, depending on alpha channel of the texture"},
745       {0, NULL, 0, NULL, NULL},
746   };
747
748   static EnumPropertyItem prop_eevee_blend_shadow_items[] = {
749       {MA_BS_NONE, "NONE", 0, "None", "Material will cast no shadow"},
750       {MA_BS_SOLID, "OPAQUE", 0, "Opaque", "Material will cast shadows without transparency"},
751       {MA_BS_CLIP,
752        "CLIP",
753        0,
754        "Alpha Clip",
755        "Use the alpha threshold to clip the visibility (binary visibility)"},
756       {MA_BS_HASHED,
757        "HASHED",
758        0,
759        "Alpha Hashed",
760        "Use noise to dither the binary visibility and use filtering to reduce the noise"},
761       {0, NULL, 0, NULL, NULL},
762   };
763
764   srna = RNA_def_struct(brna, "Material", "ID");
765   RNA_def_struct_ui_text(
766       srna,
767       "Material",
768       "Material data-block to define the appearance of geometric objects for rendering");
769   RNA_def_struct_ui_icon(srna, ICON_MATERIAL_DATA);
770
771   /* Blending (only Eevee for now) */
772   prop = RNA_def_property(srna, "blend_method", PROP_ENUM, PROP_NONE);
773   RNA_def_property_enum_items(prop, prop_eevee_blend_items);
774   RNA_def_property_ui_text(prop, "Blend Mode", "Blend Mode for Transparent Faces");
775   RNA_def_property_update(prop, 0, "rna_Material_draw_update");
776
777   prop = RNA_def_property(srna, "shadow_method", PROP_ENUM, PROP_NONE);
778   RNA_def_property_enum_sdna(prop, NULL, "blend_shadow");
779   RNA_def_property_enum_items(prop, prop_eevee_blend_shadow_items);
780   RNA_def_property_ui_text(prop, "Shadow Mode", "Shadow mapping method");
781   RNA_def_property_update(prop, 0, "rna_Material_draw_update");
782
783   prop = RNA_def_property(srna, "alpha_threshold", PROP_FLOAT, PROP_FACTOR);
784   RNA_def_property_range(prop, 0, 1);
785   RNA_def_property_ui_text(prop,
786                            "Clip Threshold",
787                            "A pixel is rendered only if its alpha value is above this threshold");
788   RNA_def_property_update(prop, 0, "rna_Material_draw_update");
789
790   prop = RNA_def_property(srna, "show_transparent_back", PROP_BOOLEAN, PROP_NONE);
791   RNA_def_property_boolean_negative_sdna(prop, NULL, "blend_flag", MA_BL_HIDE_BACKFACE);
792   RNA_def_property_ui_text(prop,
793                            "Show Backface",
794                            "Limit transparency to a single layer "
795                            "(avoids transparency sorting problems)");
796   RNA_def_property_update(prop, 0, "rna_Material_draw_update");
797
798   prop = RNA_def_property(srna, "use_backface_culling", PROP_BOOLEAN, PROP_NONE);
799   RNA_def_property_boolean_sdna(prop, NULL, "blend_flag", MA_BL_CULL_BACKFACE);
800   RNA_def_property_ui_text(
801       prop, "Backface Culling", "Use back face culling to hide the back side of faces");
802   RNA_def_property_update(prop, 0, "rna_Material_draw_update");
803
804   prop = RNA_def_property(srna, "use_screen_refraction", PROP_BOOLEAN, PROP_NONE);
805   RNA_def_property_boolean_sdna(prop, NULL, "blend_flag", MA_BL_SS_REFRACTION);
806   RNA_def_property_ui_text(
807       prop, "Screen Space Refraction", "Use raytraced screen space refractions");
808   RNA_def_property_update(prop, 0, "rna_Material_draw_update");
809
810   prop = RNA_def_property(srna, "use_sss_translucency", PROP_BOOLEAN, PROP_NONE);
811   RNA_def_property_boolean_sdna(prop, NULL, "blend_flag", MA_BL_TRANSLUCENCY);
812   RNA_def_property_ui_text(
813       prop, "Subsurface Translucency", "Add translucency effect to subsurface");
814   RNA_def_property_update(prop, 0, "rna_Material_draw_update");
815
816   prop = RNA_def_property(srna, "refraction_depth", PROP_FLOAT, PROP_DISTANCE);
817   RNA_def_property_float_sdna(prop, NULL, "refract_depth");
818   RNA_def_property_range(prop, 0.0f, FLT_MAX);
819   RNA_def_property_ui_text(prop,
820                            "Refraction Depth",
821                            "Approximate the thickness of the object to compute two refraction "
822                            "event (0 is disabled)");
823   RNA_def_property_update(prop, 0, "rna_Material_draw_update");
824
825   /* For Preview Render */
826   prop = RNA_def_property(srna, "preview_render_type", PROP_ENUM, PROP_NONE);
827   RNA_def_property_enum_sdna(prop, NULL, "pr_type");
828   RNA_def_property_enum_items(prop, preview_type_items);
829   RNA_def_property_ui_text(prop, "Preview Render Type", "Type of preview render");
830   RNA_def_property_update(prop, 0, "rna_Material_update_previews");
831
832   prop = RNA_def_property(srna, "use_preview_world", PROP_BOOLEAN, PROP_NONE);
833   RNA_def_property_boolean_sdna(prop, NULL, "pr_flag", MA_PREVIEW_WORLD);
834   RNA_def_property_ui_text(
835       prop, "Preview World", "Use the current world background to light the preview render");
836   RNA_def_property_update(prop, 0, "rna_Material_update_previews");
837
838   prop = RNA_def_property(srna, "pass_index", PROP_INT, PROP_UNSIGNED);
839   RNA_def_property_int_sdna(prop, NULL, "index");
840   RNA_def_property_ui_text(
841       prop, "Pass Index", "Index number for the \"Material Index\" render pass");
842   RNA_def_property_update(prop, NC_OBJECT, "rna_Material_update");
843
844   /* nodetree */
845   prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
846   RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
847   RNA_def_property_ui_text(prop, "Node Tree", "Node tree for node based materials");
848
849   prop = RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE);
850   RNA_def_property_boolean_sdna(prop, NULL, "use_nodes", 1);
851   RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
852   RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
853   RNA_def_property_ui_text(prop, "Use Nodes", "Use shader nodes to render the material");
854   RNA_def_property_update(prop, 0, "rna_Material_use_nodes_update");
855
856   /* common */
857   rna_def_animdata_common(srna);
858   rna_def_texpaint_slots(brna, srna);
859
860   rna_def_material_display(srna);
861
862   /* grease pencil */
863   prop = RNA_def_property(srna, "grease_pencil", PROP_POINTER, PROP_NONE);
864   RNA_def_property_pointer_sdna(prop, NULL, "gp_style");
865   RNA_def_property_ui_text(
866       prop, "Grease Pencil Settings", "Grease pencil color settings for material");
867
868   prop = RNA_def_property(srna, "is_grease_pencil", PROP_BOOLEAN, PROP_NONE);
869   RNA_def_property_boolean_funcs(prop, "rna_is_grease_pencil_get", NULL);
870   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
871   RNA_def_property_ui_text(
872       prop, "Is Grease Pencil", "True if this material has grease pencil data");
873
874   rna_def_material_greasepencil(brna);
875
876   RNA_api_material(srna);
877 }
878
879 static void rna_def_texture_slots(BlenderRNA *brna,
880                                   PropertyRNA *cprop,
881                                   const char *structname,
882                                   const char *structname_slots)
883 {
884   StructRNA *srna;
885
886   FunctionRNA *func;
887   PropertyRNA *parm;
888
889   RNA_def_property_srna(cprop, structname_slots);
890   srna = RNA_def_struct(brna, structname_slots, NULL);
891   RNA_def_struct_sdna(srna, "ID");
892   RNA_def_struct_ui_text(srna, "Texture Slots", "Collection of texture slots");
893
894   /* functions */
895   func = RNA_def_function(srna, "add", "rna_mtex_texture_slots_add");
896   RNA_def_function_flag(func,
897                         FUNC_USE_SELF_ID | FUNC_NO_SELF | FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
898   parm = RNA_def_pointer(func, "mtex", structname, "", "The newly initialized mtex");
899   RNA_def_function_return(func, parm);
900
901   func = RNA_def_function(srna, "create", "rna_mtex_texture_slots_create");
902   RNA_def_function_flag(func,
903                         FUNC_USE_SELF_ID | FUNC_NO_SELF | FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
904   parm = RNA_def_int(
905       func, "index", 0, 0, INT_MAX, "Index", "Slot index to initialize", 0, INT_MAX);
906   RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
907   parm = RNA_def_pointer(func, "mtex", structname, "", "The newly initialized mtex");
908   RNA_def_function_return(func, parm);
909
910   func = RNA_def_function(srna, "clear", "rna_mtex_texture_slots_clear");
911   RNA_def_function_flag(func,
912                         FUNC_USE_SELF_ID | FUNC_NO_SELF | FUNC_USE_CONTEXT | FUNC_USE_REPORTS);
913   parm = RNA_def_int(func, "index", 0, 0, INT_MAX, "Index", "Slot index to clear", 0, INT_MAX);
914   RNA_def_parameter_flags(parm, 0, PARM_REQUIRED);
915 }
916
917 void rna_def_mtex_common(BlenderRNA *brna,
918                          StructRNA *srna,
919                          const char *begin,
920                          const char *activeget,
921                          const char *activeset,
922                          const char *activeeditable,
923                          const char *structname,
924                          const char *structname_slots,
925                          const char *update,
926                          const char *update_index)
927 {
928   PropertyRNA *prop;
929
930   /* mtex */
931   prop = RNA_def_property(srna, "texture_slots", PROP_COLLECTION, PROP_NONE);
932   RNA_def_property_struct_type(prop, structname);
933   RNA_def_property_collection_funcs(prop,
934                                     begin,
935                                     "rna_iterator_array_next",
936                                     "rna_iterator_array_end",
937                                     "rna_iterator_array_dereference_get",
938                                     NULL,
939                                     NULL,
940                                     NULL,
941                                     NULL);
942   RNA_def_property_ui_text(
943       prop, "Textures", "Texture slots defining the mapping and influence of textures");
944   rna_def_texture_slots(brna, prop, structname, structname_slots);
945
946   prop = RNA_def_property(srna, "active_texture", PROP_POINTER, PROP_NONE);
947   RNA_def_property_struct_type(prop, "Texture");
948   RNA_def_property_flag(prop, PROP_EDITABLE);
949   if (activeeditable) {
950     RNA_def_property_editable_func(prop, activeeditable);
951   }
952   RNA_def_property_pointer_funcs(prop, activeget, activeset, NULL, NULL);
953   RNA_def_property_ui_text(prop, "Active Texture", "Active texture slot being displayed");
954   RNA_def_property_update(prop, NC_MATERIAL | ND_SHADING_LINKS, update);
955
956   prop = RNA_def_property(srna, "active_texture_index", PROP_INT, PROP_UNSIGNED);
957   RNA_def_property_int_sdna(prop, NULL, "texact");
958   RNA_def_property_range(prop, 0, MAX_MTEX - 1);
959   RNA_def_property_ui_text(prop, "Active Texture Index", "Index of active texture slot");
960   RNA_def_property_update(prop, NC_MATERIAL | ND_SHADING_LINKS, update_index);
961 }
962
963 static void rna_def_tex_slot(BlenderRNA *brna)
964 {
965   StructRNA *srna;
966   PropertyRNA *prop;
967
968   srna = RNA_def_struct(brna, "TexPaintSlot", NULL);
969   RNA_def_struct_ui_text(
970       srna, "Texture Paint Slot", "Slot that contains information about texture painting");
971
972   prop = RNA_def_property(srna, "uv_layer", PROP_STRING, PROP_NONE);
973   RNA_def_property_string_maxlength(prop, 64); /* else it uses the pointer size! */
974   RNA_def_property_string_sdna(prop, NULL, "uvname");
975   RNA_def_property_string_funcs(prop,
976                                 "rna_TexPaintSlot_uv_layer_get",
977                                 "rna_TexPaintSlot_uv_layer_length",
978                                 "rna_TexPaintSlot_uv_layer_set");
979   RNA_def_property_ui_text(prop, "UV Map", "Name of UV map");
980   RNA_def_property_update(prop, NC_GEOM | ND_DATA, "rna_Material_update");
981
982   prop = RNA_def_property(srna, "is_valid", PROP_BOOLEAN, PROP_NONE);
983   RNA_def_property_boolean_sdna(prop, NULL, "valid", 1);
984   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
985   RNA_def_property_ui_text(prop, "Valid", "Slot has a valid image and UV map");
986 }
987
988 void rna_def_texpaint_slots(BlenderRNA *brna, StructRNA *srna)
989 {
990   PropertyRNA *prop;
991
992   rna_def_tex_slot(brna);
993
994   /* mtex */
995   prop = RNA_def_property(srna, "texture_paint_images", PROP_COLLECTION, PROP_NONE);
996   RNA_def_property_collection_sdna(prop, NULL, "texpaintslot", NULL);
997   RNA_def_property_collection_funcs(prop,
998                                     "rna_Material_texpaint_begin",
999                                     "rna_iterator_array_next",
1000                                     "rna_iterator_array_end",
1001                                     "rna_iterator_array_dereference_get",
1002                                     NULL,
1003                                     NULL,
1004                                     NULL,
1005                                     NULL);
1006   RNA_def_property_struct_type(prop, "Image");
1007   RNA_def_property_ui_text(
1008       prop, "Texture Slot Images", "Texture images used for texture painting");
1009
1010   prop = RNA_def_property(srna, "texture_paint_slots", PROP_COLLECTION, PROP_NONE);
1011   RNA_def_property_collection_funcs(prop,
1012                                     "rna_Material_texpaint_begin",
1013                                     "rna_iterator_array_next",
1014                                     "rna_iterator_array_end",
1015                                     "rna_iterator_array_get",
1016                                     NULL,
1017                                     NULL,
1018                                     NULL,
1019                                     NULL);
1020   RNA_def_property_struct_type(prop, "TexPaintSlot");
1021   RNA_def_property_ui_text(
1022       prop, "Texture Slots", "Texture slots defining the mapping and influence of textures");
1023
1024   prop = RNA_def_property(srna, "paint_active_slot", PROP_INT, PROP_UNSIGNED);
1025   RNA_def_property_range(prop, 0, SHRT_MAX);
1026   RNA_def_property_ui_text(
1027       prop, "Active Paint Texture Index", "Index of active texture paint slot");
1028   RNA_def_property_update(
1029       prop, NC_MATERIAL | ND_SHADING_LINKS, "rna_Material_active_paint_texture_index_update");
1030
1031   prop = RNA_def_property(srna, "paint_clone_slot", PROP_INT, PROP_UNSIGNED);
1032   RNA_def_property_range(prop, 0, SHRT_MAX);
1033   RNA_def_property_ui_text(prop, "Clone Paint Texture Index", "Index of clone texture paint slot");
1034   RNA_def_property_update(prop, NC_MATERIAL | ND_SHADING_LINKS, NULL);
1035 }
1036
1037 #endif