6ace02710b761deae45ac8d58f80887302106ee5
[blender.git] / source / blender / makesrna / intern / rna_material.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * Contributor(s): Blender Foundation (2008), Nathan Letwory
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 #include <float.h>
26 #include <stdlib.h>
27
28 #include "RNA_define.h"
29 #include "RNA_types.h"
30
31 #include "rna_internal.h"
32
33 #include "DNA_material_types.h"
34 #include "DNA_texture_types.h"
35
36 #include "WM_types.h"
37
38 #ifdef RNA_RUNTIME
39
40 static void *rna_Material_self_get(PointerRNA *ptr)
41 {
42         return ptr->id.data;
43 }
44
45 static void rna_Material_mode_halo_set(PointerRNA *ptr, int value)
46 {
47         Material *mat= (Material*)ptr->data;
48         
49         if(value)
50                 mat->mode |= MA_HALO;
51         else
52                 mat->mode &= ~(MA_HALO|MA_STAR|MA_HALO_XALPHA|MA_ZINV|MA_ENV);
53 }
54
55 static void rna_Material_mtex_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
56 {
57         Material *mat= (Material*)ptr->data;
58         rna_iterator_array_begin(iter, (void*)mat->mtex, sizeof(MTex*), MAX_MTEX, NULL);
59 }
60
61 #else
62
63 static void rna_def_material_colors(StructRNA *srna, PropertyRNA *prop)
64 {
65         static EnumPropertyItem prop_type_items[] = {
66                 {MA_RGB, "RGB", "RGB", ""},
67                 /* not used in blender yet
68                 {MA_CMYK, "CMYK", "CMYK", ""}, 
69                 {MA_YUV, "YUV", "YUV", ""}, */
70                 {MA_HSV, "HSV", "HSV", ""},
71                 {0, NULL, NULL, NULL}};
72         
73         prop= RNA_def_property(srna, "color_model", PROP_ENUM, PROP_NONE);
74         RNA_def_property_enum_sdna(prop, NULL, "colormodel");
75         RNA_def_property_enum_items(prop, prop_type_items);
76         RNA_def_property_ui_text(prop, "Color Model", "");
77         
78         prop= RNA_def_property(srna, "diffuse_color", PROP_FLOAT, PROP_COLOR);
79         RNA_def_property_float_sdna(prop, NULL, "r");
80         RNA_def_property_array(prop, 3);
81         RNA_def_property_ui_text(prop, "Diffuse Color", "");
82         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
83         
84         prop= RNA_def_property(srna, "specular_color", PROP_FLOAT, PROP_COLOR);
85         RNA_def_property_float_sdna(prop, NULL, "specr");
86         RNA_def_property_array(prop, 3);
87         RNA_def_property_ui_text(prop, "Specular Color", "");
88         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
89         
90         prop= RNA_def_property(srna, "mirror_color", PROP_FLOAT, PROP_COLOR);
91         RNA_def_property_float_sdna(prop, NULL, "mirr");
92         RNA_def_property_array(prop, 3);
93         RNA_def_property_ui_text(prop, "Mirror Color", "");
94         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
95         
96         prop= RNA_def_property(srna, "ambient_color", PROP_FLOAT, PROP_COLOR);
97         RNA_def_property_float_sdna(prop, NULL, "ambr");
98         RNA_def_property_array(prop, 3);
99         RNA_def_property_ui_text(prop, "Ambient Color", "");
100         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
101         
102         prop= RNA_def_property(srna, "alpha", PROP_FLOAT, PROP_NONE);
103         RNA_def_property_range(prop, 0.0f, 1.0f);
104         RNA_def_property_ui_text(prop, "Alpha", "");
105         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
106         
107         /* Color bands */
108         prop= RNA_def_property(srna, "color_ramp", PROP_POINTER, PROP_NONE);
109         RNA_def_property_pointer_sdna(prop, NULL, "ramp_col");
110         RNA_def_property_struct_type(prop, "ColorRamp");
111         RNA_def_property_ui_text(prop, "Color Ramp", "");
112
113         prop= RNA_def_property(srna, "specularity_ramp", PROP_POINTER, PROP_NONE);
114         RNA_def_property_pointer_sdna(prop, NULL, "ramp_spec");
115         RNA_def_property_struct_type(prop, "ColorRamp");
116         RNA_def_property_ui_text(prop, "Specularity Ramp", "");
117 }
118
119 static void rna_def_material_diffuse(StructRNA *srna, PropertyRNA *prop)
120 {
121         static EnumPropertyItem prop_diff_shader_items[] = {
122                 {MA_DIFF_LAMBERT, "DIFF_LAMBERT", "Lambert", ""},
123                 {MA_DIFF_ORENNAYAR, "DIFF_ORENNAYAR", "Oren-Nayar", ""},
124                 {MA_DIFF_TOON, "DIFF_TOON", "Toon", ""},
125                 {MA_DIFF_MINNAERT, "DIFF_MINNAERT", "Minnaert", ""},
126                 {MA_DIFF_FRESNEL, "DIFF_FRESNEL", "Fresnel", ""},
127                 {0, NULL, NULL, NULL}};
128         
129         prop= RNA_def_property(srna, "diffuse_shader", PROP_ENUM, PROP_NONE);
130         RNA_def_property_enum_sdna(prop, NULL, "diff_shader");
131         RNA_def_property_enum_items(prop, prop_diff_shader_items);
132         RNA_def_property_ui_text(prop, "Diffuse Shader Model", "");
133         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
134         
135         prop= RNA_def_property(srna, "diffuse_reflection", PROP_FLOAT, PROP_NONE);
136         RNA_def_property_float_sdna(prop, NULL, "ref");
137         RNA_def_property_range(prop, 0.0f, 1.0f);
138         RNA_def_property_ui_text(prop, "Diffuse Reflection", "Amount of diffuse reflection.");
139         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
140         
141         prop= RNA_def_property(srna, "roughness", PROP_FLOAT, PROP_NONE);
142         RNA_def_property_range(prop, 0.0f, 3.14f);
143         RNA_def_property_ui_text(prop, "Roughness", "Oren-Nayar Roughness");
144         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
145         
146         prop= RNA_def_property(srna, "params1_4", PROP_FLOAT, PROP_NONE);
147         RNA_def_property_float_sdna(prop, NULL, "param");
148         RNA_def_property_array(prop, 4);
149         RNA_def_property_range(prop, 0.0f, 5.0f);
150         RNA_def_property_ui_text(prop, "Params 1-4", "Parameters used for diffuse and specular Toon, and diffuse Fresnel shaders. Check documentation for details.");
151         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
152         
153         prop= RNA_def_property(srna, "darkness", PROP_FLOAT, PROP_NONE);
154         RNA_def_property_range(prop, 0.0f, 2.0f);
155         RNA_def_property_ui_text(prop, "Darkness", "Minnaert darkness.");
156         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
157 }
158
159 static void rna_def_material_raymirror(BlenderRNA *brna, StructRNA *parent)
160 {
161         StructRNA *srna;
162         PropertyRNA *prop;
163
164         static EnumPropertyItem prop_fadeto_mir_items[] = {
165                 {MA_RAYMIR_FADETOSKY, "RAYMIR_FADETOSKY", "Fade to sky color", ""},
166                 {MA_RAYMIR_FADETOMAT, "RAYMIR_FADETOMAT", "Fade to material color", ""},
167                 {0, NULL, NULL, NULL}};
168
169         srna= RNA_def_struct(brna, "MaterialRaytraceMirror", NULL);
170         RNA_def_struct_sdna(srna, "Material");
171         RNA_def_struct_parent(srna, parent);
172         RNA_def_struct_ui_text(srna, "Raytrace Mirror", "");
173
174         prop= RNA_def_property(parent, "raytrace_mirror", PROP_POINTER, PROP_NONE);
175         RNA_def_property_struct_type(prop, "MaterialRaytraceMirror");
176         RNA_def_property_pointer_funcs(prop, "rna_Material_self_get", NULL, NULL);
177         RNA_def_property_ui_text(prop, "Raytrace Mirror", "");
178         
179         prop= RNA_def_property(srna, "enable", PROP_BOOLEAN, PROP_NONE);
180         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_RAYMIRROR); /* use bitflags */
181         RNA_def_property_ui_text(prop, "Ray Mirror Mode", "Toggle raytrace mirror.");
182         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
183                 
184         prop= RNA_def_property(srna, "reflect", PROP_FLOAT, PROP_NONE);
185         RNA_def_property_float_sdna(prop, NULL, "ray_mirror");
186         RNA_def_property_range(prop, 0.0f, 1.0f);
187         RNA_def_property_ui_text(prop, "Ray Mirror", "Sets the amount mirror reflection for raytrace.");
188         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
189         
190         prop= RNA_def_property(srna, "fresnel", PROP_FLOAT, PROP_NONE);
191         RNA_def_property_float_sdna(prop, NULL, "fresnel_mir");
192         RNA_def_property_range(prop, 0.0f, 5.0f);
193         RNA_def_property_ui_text(prop, "Ray Mirror Fresnel", "Power of Fresnel for mirror reflection.");
194         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
195         
196         prop= RNA_def_property(srna, "fresnel_fac", PROP_FLOAT, PROP_NONE);
197         RNA_def_property_float_sdna(prop, NULL, "fresnel_mir_i");
198         RNA_def_property_range(prop, 0.0f, 1.0f);
199         RNA_def_property_ui_text(prop, "Ray Mirror Fresnel Factor", "Blending factor for Fresnel.");
200         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
201         
202         prop= RNA_def_property(srna, "gloss", PROP_FLOAT, PROP_NONE);
203         RNA_def_property_float_sdna(prop, NULL, "gloss_mir");
204         RNA_def_property_range(prop, 0.0f, 1.0f);
205         RNA_def_property_ui_text(prop, "Ray Mirror Gloss", "The shininess of the reflection. Values < 1.0 give diffuse, blurry reflections.");
206         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
207         
208         prop= RNA_def_property(srna, "gloss_aniso", PROP_FLOAT, PROP_NONE);
209         RNA_def_property_float_sdna(prop, NULL, "aniso_gloss_mir");
210         RNA_def_property_range(prop, 0.0f, 1.0f);
211         RNA_def_property_ui_text(prop, "Ray Mirror Gloss Aniso", "The shape of the reflection, from 0.0 (circular) to 1.0 (fully stretched along the tangent.");
212         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
213                 
214         prop= RNA_def_property(srna, "gloss_samples", PROP_INT, PROP_NONE);
215         RNA_def_property_int_sdna(prop, NULL, "samp_gloss_mir");
216         RNA_def_property_range(prop, 0, 1024);
217         RNA_def_property_ui_text(prop, "Ray Mirror Gloss Samples", "Number of cone samples averaged for blurry reflections.");
218         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
219         
220         prop= RNA_def_property(srna, "adapt_thresh", PROP_FLOAT, PROP_NONE);
221         RNA_def_property_float_sdna(prop, NULL, "adapt_thresh_mir");
222         RNA_def_property_range(prop, 0.0f, 1.0f);
223         RNA_def_property_ui_text(prop, "Ray Mirror Gloss Threshold", "Threshold for adaptive sampling. If a sample contributes less than this amount (as a percentage), sampling is stopped.");
224         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
225         
226         prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE);
227         RNA_def_property_int_sdna(prop, NULL, "ray_depth");
228         RNA_def_property_range(prop, 0, 10);
229         RNA_def_property_ui_text(prop, "Ray Mirror Depth", "Maximum allowed number of light inter-reflections.");
230         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
231         
232         prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_NONE);
233         RNA_def_property_float_sdna(prop, NULL, "dist_mir");
234         RNA_def_property_range(prop, 0.0f, 10000.0f);
235         RNA_def_property_ui_text(prop, "Ray Mirror Max Dist", "Maximum distance of reflected rays. Reflections further than this range fade to sky color or material color.");
236         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
237         
238         prop= RNA_def_property(srna, "fade_to", PROP_ENUM, PROP_NONE);
239         RNA_def_property_enum_sdna(prop, NULL, "fadeto_mir");
240         RNA_def_property_enum_items(prop, prop_fadeto_mir_items);
241         RNA_def_property_ui_text(prop, "Ray Mirror End Fade-out", "The color that rays with no intersection within the Max Distance take. Material color can be best for indoor scenes, sky color for outdoor.");
242         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
243 }
244
245 static void rna_def_material_raytra(BlenderRNA *brna, StructRNA *parent)
246 {
247         StructRNA *srna;
248         PropertyRNA *prop;
249
250         srna= RNA_def_struct(brna, "MaterialRaytraceTransparency", NULL);
251         RNA_def_struct_sdna(srna, "Material");
252         RNA_def_struct_parent(srna, parent);
253         RNA_def_struct_ui_text(srna, "Raytrace Transparency", "");
254
255         prop= RNA_def_property(parent, "raytrace_transparency", PROP_POINTER, PROP_NONE);
256         RNA_def_property_struct_type(prop, "MaterialRaytraceTransparency");
257         RNA_def_property_pointer_funcs(prop, "rna_Material_self_get", NULL, NULL);
258         RNA_def_property_ui_text(prop, "Raytrace Transparency", "");
259
260         prop= RNA_def_property(srna, "enable", PROP_BOOLEAN, PROP_NONE);
261         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_RAYTRANSP); /* use bitflags */
262         RNA_def_property_ui_text(prop, "Ray Transparency Mode", "Enables raytracing for transparent refraction rendering.");
263         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
264         
265         prop= RNA_def_property(srna, "ior", PROP_FLOAT, PROP_NONE);
266         RNA_def_property_float_sdna(prop, NULL, "ang");
267         RNA_def_property_range(prop, 1.0f, 3.0f);
268         RNA_def_property_ui_text(prop, "Ray Transparency IOR", "Sets angular index of refraction for raytraced refraction.");
269         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
270         
271         prop= RNA_def_property(srna, "fresnel", PROP_FLOAT, PROP_NONE);
272         RNA_def_property_float_sdna(prop, NULL, "fresnel_tra");
273         RNA_def_property_range(prop, 0.0f, 5.0f);
274         RNA_def_property_ui_text(prop, "Ray Transparency Fresnel", "Power of Fresnel for transparency (Ray or ZTransp).");
275         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
276         
277         prop= RNA_def_property(srna, "fresnel_fac", PROP_FLOAT, PROP_NONE);
278         RNA_def_property_float_sdna(prop, NULL, "fresnel_tra_i");
279         RNA_def_property_range(prop, 1.0f, 5.0f);
280         RNA_def_property_ui_text(prop, "Ray Transparency Fresnel Factor", "Blending factor for Fresnel.");
281         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
282         
283         prop= RNA_def_property(srna, "gloss", PROP_FLOAT, PROP_NONE);
284         RNA_def_property_float_sdna(prop, NULL, "gloss_tra");
285         RNA_def_property_range(prop, 0.0f, 1.0f);
286         RNA_def_property_ui_text(prop, "Ray Transparency Gloss", "The clarity of the refraction. Values < 1.0 give diffuse, blurry refractions.");
287         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
288         
289         prop= RNA_def_property(srna, "gloss_samples", PROP_INT, PROP_NONE);
290         RNA_def_property_int_sdna(prop, NULL, "samp_gloss_tra");
291         RNA_def_property_range(prop, 0, 1024);
292         RNA_def_property_ui_text(prop, "Ray Transparency Gloss Samples", "Number of cone samples averaged for blurry refractions.");
293         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
294         
295         prop= RNA_def_property(srna, "adapt_thresh", PROP_FLOAT, PROP_NONE);
296         RNA_def_property_float_sdna(prop, NULL, "adapt_thresh_tra");
297         RNA_def_property_range(prop, 0.0f, 1.0f);
298         RNA_def_property_ui_text(prop, "Ray Transparency Gloss Threshold", "Threshold for adaptive sampling. If a sample contributes less than this amount (as a percentage), sampling is stopped.");
299         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
300         
301         prop= RNA_def_property(srna, "depth", PROP_INT, PROP_NONE);
302         RNA_def_property_int_sdna(prop, NULL, "ray_depth_tra");
303         RNA_def_property_range(prop, 0, 10);
304         RNA_def_property_ui_text(prop, "Ray Transparency Depth", "Maximum allowed number of light inter-refractions.");
305         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
306         
307         prop= RNA_def_property(srna, "filter", PROP_FLOAT, PROP_NONE);
308         RNA_def_property_float_sdna(prop, NULL, "filter");
309         RNA_def_property_range(prop, 0.0f, 1.0f);
310         RNA_def_property_ui_text(prop, "Ray Transparency Filter", "Amount to blend in the material's diffuse color in raytraced transparency (simulating absorption).");
311         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
312         
313         prop= RNA_def_property(srna, "limit", PROP_FLOAT, PROP_NONE);
314         RNA_def_property_float_sdna(prop, NULL, "tx_limit");
315         RNA_def_property_range(prop, 0.0f, 100.0f);
316         RNA_def_property_ui_text(prop, "Ray Transparency Limit", "Maximum depth for light to travel through the transparent material before becoming fully filtered (0.0 is disabled).");
317         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
318         
319         prop= RNA_def_property(srna, "falloff", PROP_FLOAT, PROP_NONE);
320         RNA_def_property_float_sdna(prop, NULL, "tx_falloff");
321         RNA_def_property_range(prop, 0.1f, 10.0f);
322         RNA_def_property_ui_text(prop, "Ray Transparency Falloff", "Falloff power for transmissivity filter effect (1.0 is linear).");
323         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
324         
325         prop= RNA_def_property(srna, "specular_opacity", PROP_FLOAT, PROP_NONE);
326         RNA_def_property_float_sdna(prop, NULL, "spectra");
327         RNA_def_property_range(prop, 0.0f, 1.0f);
328         RNA_def_property_ui_text(prop, "Ray Transparency Specular Opacity", "Makes specular areas opaque on transparent materials.");
329         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
330 }
331
332 static void rna_def_material_halo(BlenderRNA *brna, StructRNA *parent)
333 {
334         StructRNA *srna;
335         PropertyRNA *prop;
336
337         srna= RNA_def_struct(brna, "MaterialHalo", NULL);
338         RNA_def_struct_sdna(srna, "Material");
339         RNA_def_struct_parent(srna, parent);
340         RNA_def_struct_ui_text(srna, "Halo", "");
341
342         prop= RNA_def_property(parent, "halo", PROP_POINTER, PROP_NONE);
343         RNA_def_property_struct_type(prop, "MaterialHalo");
344         RNA_def_property_pointer_funcs(prop, "rna_Material_self_get", NULL, NULL);
345         RNA_def_property_ui_text(prop, "Halo", "");
346
347         prop= RNA_def_property(srna, "enable", PROP_BOOLEAN, PROP_NONE);
348         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO); /* use bitflags */
349         RNA_def_property_ui_text(prop, "Halo Mode", "Enables halo rendering of material.");
350         RNA_def_property_boolean_funcs(prop, NULL, "rna_Material_mode_halo_set");
351         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
352         
353         prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
354         RNA_def_property_float_sdna(prop, NULL, "hasize");
355         RNA_def_property_range(prop, 0.0f, 100.0f);
356         RNA_def_property_ui_text(prop, "Halo Size", "Sets the dimension of the halo.");
357         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
358         
359         prop= RNA_def_property(srna, "hardness", PROP_INT, PROP_NONE);
360         RNA_def_property_int_sdna(prop, NULL, "har");
361         RNA_def_property_range(prop, 0, 127);
362         RNA_def_property_ui_text(prop, "Halo Hardness", "Sets the hardness of the halo.");
363         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
364         
365         prop= RNA_def_property(srna, "add", PROP_FLOAT, PROP_NONE);
366         RNA_def_property_float_sdna(prop, NULL, "add");
367         RNA_def_property_range(prop, 0.0f, 1.0f);
368         RNA_def_property_ui_text(prop, "Halo Add", "Sets the strength of the add effect.");
369         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
370         
371         prop= RNA_def_property(srna, "rings", PROP_INT, PROP_NONE);
372         RNA_def_property_int_sdna(prop, NULL, "ringc");
373         RNA_def_property_range(prop, 0, 24);
374         RNA_def_property_ui_text(prop, "Halo Rings", "Sets the number of rings rendered over the halo.");
375         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
376         
377         prop= RNA_def_property(srna, "lines", PROP_INT, PROP_NONE);
378         RNA_def_property_int_sdna(prop, NULL, "linec");
379         RNA_def_property_range(prop, 0, 250);
380         RNA_def_property_ui_text(prop, "Halo Lines", "Sets the number of star shaped lines rendered over the halo.");
381         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
382         
383         prop= RNA_def_property(srna, "star_tips", PROP_INT, PROP_NONE);
384         RNA_def_property_int_sdna(prop, NULL, "starc");
385         RNA_def_property_range(prop, 3, 50);
386         RNA_def_property_ui_text(prop, "Halo Star Tips", "Sets the number of points on the star shaped halo.");
387         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
388         
389         prop= RNA_def_property(srna, "seed", PROP_INT, PROP_NONE);
390         RNA_def_property_int_sdna(prop, NULL, "seed1");
391         RNA_def_property_range(prop, 0, 255);
392         RNA_def_property_ui_text(prop, "Halo Seed", "Randomizes ring dimension and line location.");
393         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
394         
395         prop= RNA_def_property(srna, "flare_mode", PROP_BOOLEAN, PROP_NONE);
396         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_FLARE); /* use bitflags */
397         RNA_def_property_ui_text(prop, "Halo Mode Flare", "Renders halo as a lensflare.");
398         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
399         
400         prop= RNA_def_property(srna, "flare_size", PROP_FLOAT, PROP_NONE);
401         RNA_def_property_float_sdna(prop, NULL, "flaresize");
402         RNA_def_property_range(prop, 0.1f, 25.0f);
403         RNA_def_property_ui_text(prop, "Halo Flare Size", "Sets the factor by which the flare is larger than the halo.");
404         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
405         
406         prop= RNA_def_property(srna, "flare_subsize", PROP_FLOAT, PROP_NONE);
407         RNA_def_property_float_sdna(prop, NULL, "subsize");
408         RNA_def_property_range(prop, 0.1f, 25.0f);
409         RNA_def_property_ui_text(prop, "Halo Flare Subsize", "Sets the dimension of the subflares, dots and circles.");
410         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
411         
412         prop= RNA_def_property(srna, "flare_boost", PROP_FLOAT, PROP_NONE);
413         RNA_def_property_float_sdna(prop, NULL, "flareboost");
414         RNA_def_property_range(prop, 0.1f, 10.0f);
415         RNA_def_property_ui_text(prop, "Halo Flare Boost", "Gives the flare extra strength.");
416         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
417         
418         prop= RNA_def_property(srna, "flare_seed", PROP_INT, PROP_NONE);
419         RNA_def_property_int_sdna(prop, NULL, "seed2");
420         RNA_def_property_range(prop, 0, 255);
421         RNA_def_property_ui_text(prop, "Halo Flare Seed", "Specifies an offset in the flare seed table.");
422         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
423         
424         prop= RNA_def_property(srna, "flares_sub", PROP_INT, PROP_NONE);
425         RNA_def_property_int_sdna(prop, NULL, "flarec");
426         RNA_def_property_range(prop, 1, 32);
427         RNA_def_property_ui_text(prop, "Halo Flares Sub", "Sets the number of subflares.");
428         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
429         
430         prop= RNA_def_property(srna, "rings_mode", PROP_BOOLEAN, PROP_NONE);
431         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_RINGS); /* use bitflags */
432         RNA_def_property_ui_text(prop, "Halo Mode Rings", "Renders rings over halo.");
433         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
434         
435         prop= RNA_def_property(srna, "lines_mode", PROP_BOOLEAN, PROP_NONE);
436         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_LINES); /* use bitflags */
437         RNA_def_property_ui_text(prop, "Halo Mode Lines", "Renders star shaped lines over halo.");
438         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
439         
440         prop= RNA_def_property(srna, "star_mode", PROP_BOOLEAN, PROP_NONE);
441         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_STAR); /* use bitflags */
442         RNA_def_property_ui_text(prop, "Halo Mode Star", "Renders halo as a star.");
443         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
444         
445         prop= RNA_def_property(srna, "texture_mode", PROP_BOOLEAN, PROP_NONE);
446         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALOTEX); /* use bitflags */
447         RNA_def_property_ui_text(prop, "Halo Mode Texture", "Gives halo a texture.");
448         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
449         
450         prop= RNA_def_property(srna, "puno_mode", PROP_BOOLEAN, PROP_NONE);
451         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALOPUNO); /* use bitflags */
452         RNA_def_property_ui_text(prop, "Halo Mode Puno", "Uses the vertex normal to specify the dimension of the halo.");
453         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
454         
455         prop= RNA_def_property(srna, "xalpha_mode", PROP_BOOLEAN, PROP_NONE);
456         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_XALPHA); /* use bitflags */
457         RNA_def_property_ui_text(prop, "Halo Mode Extreme Alpha", "Uses extreme alpha.");
458         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
459         
460         prop= RNA_def_property(srna, "shaded_mode", PROP_BOOLEAN, PROP_NONE);
461         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_SHADE); /* use bitflags */
462         RNA_def_property_ui_text(prop, "Halo Mode Shaded", "Lets halo receive light and shadows.");
463         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
464         
465         prop= RNA_def_property(srna, "soft_mode", PROP_BOOLEAN, PROP_NONE);
466         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_HALO_SOFT); /* use bitflags */
467         RNA_def_property_ui_text(prop, "Halo Mode Soft", "Softens the halo.");
468         RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING, NULL);
469 }
470
471 static void rna_def_material_sss(BlenderRNA *brna, StructRNA *parent)
472 {
473         StructRNA *srna;
474         PropertyRNA *prop;
475
476         srna= RNA_def_struct(brna, "MaterialSubsurfaceScattering", NULL);
477         RNA_def_struct_sdna(srna, "Material");
478         RNA_def_struct_parent(srna, parent);
479         RNA_def_struct_ui_text(srna, "Subsurface Scattering", "");
480
481         prop= RNA_def_property(parent, "subsurface_scattering", PROP_POINTER, PROP_NONE);
482         RNA_def_property_struct_type(prop, "MaterialSubsurfaceScattering");
483         RNA_def_property_pointer_funcs(prop, "rna_Material_self_get", NULL, NULL);
484         RNA_def_property_ui_text(prop, "Subsurface Scattering", "");
485
486         /* XXX: The labels for the array elements should really be R, G, B */
487         prop= RNA_def_property(srna, "radius", PROP_FLOAT, PROP_NONE);
488         RNA_def_property_float_sdna(prop, NULL, "sss_radius");
489         RNA_def_property_range(prop, 0.001, FLT_MAX);
490         RNA_def_property_ui_range(prop, 0.001, 10000, 1, 3);
491         RNA_def_property_ui_text(prop, "Radius", "Mean red/green/blue scattering path length.");
492
493         prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
494         RNA_def_property_float_sdna(prop, NULL, "sss_col");
495         RNA_def_property_ui_text(prop, "Color", "Scattering color.");
496
497         prop= RNA_def_property(srna, "error_tolerance", PROP_FLOAT, PROP_NONE);
498         RNA_def_property_float_sdna(prop, NULL, "sss_error");
499         RNA_def_property_ui_range(prop, 0.0001, 10, 1, 3);
500         RNA_def_property_ui_text(prop, "Error tolerance", "");
501
502         prop= RNA_def_property(srna, "object_scale", PROP_FLOAT, PROP_NONE);
503         RNA_def_property_float_sdna(prop, NULL, "sss_scale");
504         RNA_def_property_ui_range(prop, 0.001, 1000, 1, 3);
505         RNA_def_property_ui_text(prop, "Object Scale", "");
506
507         prop= RNA_def_property(srna, "index_of_refraction", PROP_FLOAT, PROP_NONE);
508         RNA_def_property_float_sdna(prop, NULL, "sss_ior");
509         RNA_def_property_ui_range(prop, 0.1, 2, 1, 3);
510         RNA_def_property_ui_text(prop, "Index of Refraction", "");
511
512         prop= RNA_def_property(srna, "blend_factor", PROP_FLOAT, PROP_NONE);
513         RNA_def_property_float_sdna(prop, NULL, "sss_colfac");
514         RNA_def_property_range(prop, 0, 1);
515         RNA_def_property_ui_text(prop, "Blend Factor", "");
516
517         prop= RNA_def_property(srna, "texture_scattering_factor", PROP_FLOAT, PROP_NONE);
518         RNA_def_property_float_sdna(prop, NULL, "sss_texfac");
519         RNA_def_property_range(prop, 0, 1);
520         RNA_def_property_ui_text(prop, "Texture Scattering Factor", "");
521
522         prop= RNA_def_property(srna, "front_weight", PROP_FLOAT, PROP_NONE);
523         RNA_def_property_float_sdna(prop, NULL, "sss_front");
524         RNA_def_property_range(prop, 0, 2);
525         RNA_def_property_ui_text(prop, "Front Weight", "");
526
527         prop= RNA_def_property(srna, "back_weight", PROP_FLOAT, PROP_NONE);
528         RNA_def_property_float_sdna(prop, NULL, "sss_back");
529         RNA_def_property_range(prop, 0, 10);
530         RNA_def_property_ui_text(prop, "Back Weight", "");
531
532         prop= RNA_def_property(srna, "enable", PROP_BOOLEAN, PROP_NONE);
533         RNA_def_property_boolean_sdna(prop, NULL, "sss_flag", MA_DIFF_SSS);
534         RNA_def_property_ui_text(prop, "Enable", "");
535 }
536
537 void rna_def_material_specularity(StructRNA *srna, PropertyRNA *prop)
538 {
539         prop= RNA_def_property(srna, "specularity", PROP_FLOAT, PROP_NONE);
540         RNA_def_property_float_sdna(prop, NULL, "spec");
541         RNA_def_property_range(prop, 0, 1);
542         RNA_def_property_ui_text(prop, "Specularity", "");
543
544         /* XXX: this field is also used for Halo hardness. should probably be fixed in DNA */
545         prop= RNA_def_property(srna, "specular_hardness", PROP_FLOAT, PROP_NONE);
546         RNA_def_property_float_sdna(prop, NULL, "har");
547         RNA_def_property_range(prop, 1, 511);
548         RNA_def_property_ui_text(prop, "Specular Hardness", "");
549
550         prop= RNA_def_property(srna, "specular_refraction", PROP_FLOAT, PROP_NONE);
551         RNA_def_property_float_sdna(prop, NULL, "refrac");
552         RNA_def_property_range(prop, 1, 10);
553         RNA_def_property_ui_text(prop, "Specular Refraction", "");
554
555         /* XXX: evil "param" field also does specular stuff */
556
557         prop= RNA_def_property(srna, "specular_slope", PROP_FLOAT, PROP_NONE);
558         RNA_def_property_float_sdna(prop, NULL, "rms");
559         RNA_def_property_range(prop, 0, 0.4);
560         RNA_def_property_ui_text(prop, "Specular Slope", "The standard deviation of surface slope.");
561 }
562
563 void rna_def_material_strand(StructRNA *srna, PropertyRNA *prop)
564 {
565         prop= RNA_def_property(srna, "strand_tangent_shading", PROP_BOOLEAN, PROP_NONE);
566         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_TANGENT_STR);
567         RNA_def_property_ui_text(prop, "Strand Tangent Shading", "Uses direction of strands as normal for tangent-shading.");
568         
569         prop= RNA_def_property(srna, "strand_surface_diffuse", PROP_BOOLEAN, PROP_NONE);
570         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_STR_SURFDIFF);
571         RNA_def_property_ui_text(prop, "Strand Surface Diffuse", "Make diffuse shading more similar to shading the surface.");
572
573         prop= RNA_def_property(srna, "strand_blend_distance", PROP_FLOAT, PROP_NONE);
574         RNA_def_property_float_sdna(prop, NULL, "strand_surfnor");
575         RNA_def_property_range(prop, 0, 10);
576         RNA_def_property_ui_text(prop, "Blend Distance", "Distance in Blender units over which to blend in the surface normal.");
577
578         prop= RNA_def_property(srna, "strand_blender_units", PROP_BOOLEAN, PROP_NONE);
579         RNA_def_property_boolean_sdna(prop, NULL, "mode", MA_STR_B_UNITS);
580         RNA_def_property_ui_text(prop, "Strand Blender Units", "Use Blender units for widths instead of pixels.");
581
582         /* XXX: range is different depending on (mode & MA_STR_B_UNITS) */
583         prop= RNA_def_property(srna, "strand_start_size", PROP_FLOAT, PROP_NONE);
584         RNA_def_property_float_sdna(prop, NULL, "strand_sta");
585         RNA_def_property_ui_text(prop, "Strand Start Size", "");
586
587         /* XXX: range is different depending on (mode & MA_STR_B_UNITS) */
588         prop= RNA_def_property(srna, "strand_end_size", PROP_FLOAT, PROP_NONE);
589         RNA_def_property_float_sdna(prop, NULL, "strand_end");
590         RNA_def_property_ui_text(prop, "Strand End Size", "");
591
592         prop= RNA_def_property(srna, "strand_minimum_size", PROP_FLOAT, PROP_NONE);
593         RNA_def_property_float_sdna(prop, NULL, "strand_min");
594         RNA_def_property_range(prop, 0.001, 10);
595         RNA_def_property_ui_text(prop, "Strand Minimum Size", "Minimum size of strands in pixels.");
596
597         prop= RNA_def_property(srna, "strand_shape", PROP_FLOAT, PROP_NONE);
598         RNA_def_property_float_sdna(prop, NULL, "strand_ease");
599         RNA_def_property_range(prop, -0.9, 0.9);
600         RNA_def_property_ui_text(prop, "Strand Shape", "Positive values make strands rounder, negative makes strands spiky.");
601
602         prop= RNA_def_property(srna, "strand_fade", PROP_FLOAT, PROP_NONE);
603         RNA_def_property_float_sdna(prop, NULL, "strand_widthfade");
604         RNA_def_property_range(prop, 0, 2);
605         RNA_def_property_ui_text(prop, "Strand Fade", "Transparency along the width of the strand.");
606
607         prop= RNA_def_property(srna, "strand_uv_layer", PROP_STRING, PROP_NONE);
608         RNA_def_property_string_sdna(prop, NULL, "strand_uvname");
609         RNA_def_property_ui_text(prop, "Strand UV Layer", "Name of UV layer to override.");
610 }
611
612 void RNA_def_material(BlenderRNA *brna)
613 {
614         StructRNA *srna= NULL;
615         PropertyRNA *prop= NULL;
616
617         srna= RNA_def_struct(brna, "Material", "ID");
618         RNA_def_struct_ui_text(srna, "Material", "DOC_BROKEN");
619
620         /* mtex */
621         prop= RNA_def_property(srna, "textures", PROP_COLLECTION, PROP_NONE);
622         RNA_def_property_struct_type(prop, "TextureSlot");
623         RNA_def_property_collection_funcs(prop, "rna_Material_mtex_begin", "rna_iterator_array_next", "rna_iterator_array_end", "rna_iterator_array_dereference_get", 0, 0, 0, 0);
624         RNA_def_property_ui_text(prop, "Textures", "");
625
626         prop= RNA_def_property(srna, "ambient", PROP_FLOAT, PROP_NONE);
627         RNA_def_property_float_sdna(prop, NULL, "amb");
628         RNA_def_property_range(prop, 0, 1);
629         RNA_def_property_ui_text(prop, "Ambient", "");
630
631         prop= RNA_def_property(srna, "emit", PROP_FLOAT, PROP_NONE);
632         RNA_def_property_range(prop, 0, 2);
633         RNA_def_property_ui_text(prop, "Emit", "Amount of light to emit.");
634
635         prop= RNA_def_property(srna, "translucency", PROP_FLOAT, PROP_NONE);
636         RNA_def_property_range(prop, 0, 1);
637         RNA_def_property_ui_text(prop, "Translucency", "Amount of diffuse shading on the back side.");
638                 
639         prop= RNA_def_property(srna, "cubic_interpolation", PROP_BOOLEAN, PROP_NONE);
640         RNA_def_property_boolean_sdna(prop, NULL, "shade_flag", MA_CUBIC);
641         RNA_def_property_ui_text(prop, "Cubic Interpolation", "Use cubic interpolation for diffuse values, for smoother transitions.");
642         
643         prop= RNA_def_property(srna, "object_color", PROP_BOOLEAN, PROP_NONE);
644         RNA_def_property_boolean_sdna(prop, NULL, "shade_flag", MA_OBCOLOR);
645         RNA_def_property_ui_text(prop, "Object Color", "Modulate the result with a per-object color.");
646
647         prop= RNA_def_property(srna, "shadow_bias", PROP_FLOAT, PROP_NONE);
648         RNA_def_property_float_sdna(prop, NULL, "sbias");
649         RNA_def_property_range(prop, 0, 0.25);
650         RNA_def_property_ui_text(prop, "Shadow Bias", "Shadow bias to prevent terminator problems on shadow boundary.");
651
652         prop= RNA_def_property(srna, "shadow_bias_factor", PROP_FLOAT, PROP_NONE);
653         RNA_def_property_float_sdna(prop, NULL, "lbias");
654         RNA_def_property_range(prop, 0, 10);
655         RNA_def_property_ui_text(prop, "Shadow Bias Factor", "Factor to multiple shadowbuffer bias with (0 is ignore.)");
656
657         prop= RNA_def_property(srna, "shadow_casting_alpha", PROP_FLOAT, PROP_NONE);
658         RNA_def_property_float_sdna(prop, NULL, "shad_alpha");
659         RNA_def_property_range(prop, 0.001, 1);
660         RNA_def_property_ui_text(prop, "Shadow Casting Alpha", "Shadow casting alpha, only in use for Irregular Shadowbuffer.");
661
662         /* XXX: does Material.septex get RNA? */
663         
664         /* colors */
665         rna_def_material_colors(srna, prop);
666         /* diffuse shaders */
667         rna_def_material_diffuse(srna, prop);
668         /* raytrace mirror */
669         rna_def_material_raymirror(brna, srna);
670         /* raytrace transparency */
671         rna_def_material_raytra(brna, srna);
672         /* Halo settings */
673         rna_def_material_halo(brna, srna);
674         /* Subsurface scattering */
675         rna_def_material_sss(brna, srna);
676         /* specularity */
677         rna_def_material_specularity(srna, prop);
678         /* strand */
679         rna_def_material_strand(srna, prop);
680
681         /* nodetree */
682         prop= RNA_def_property(srna, "nodetree", PROP_POINTER, PROP_NONE);
683         RNA_def_property_ui_text(prop, "Node Tree", "");
684 }
685
686 #endif
687
688