Node socket values now only have soft limits, rather than hard limits, so you
[blender.git] / source / blender / makesrna / intern / rna_lamp.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Blender Foundation (2008).
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/makesrna/intern/rna_lamp.c
24  *  \ingroup RNA
25  */
26
27
28 #include <stdlib.h>
29
30 #include "RNA_define.h"
31 #include "RNA_enum_types.h"
32
33 #include "rna_internal.h"
34
35 #include "DNA_lamp_types.h"
36 #include "DNA_material_types.h"
37 #include "DNA_texture_types.h"
38
39 #include "BLI_math_base.h"
40
41 #ifdef RNA_RUNTIME
42
43 #include "MEM_guardedalloc.h"
44
45 #include "BKE_depsgraph.h"
46 #include "BKE_main.h"
47 #include "BKE_texture.h"
48
49 #include "ED_node.h"
50 #include "WM_api.h"
51 #include "WM_types.h"
52
53 static void rna_Lamp_buffer_size_set(PointerRNA *ptr, int value)
54 {
55         Lamp *la = (Lamp*)ptr->data;
56
57         CLAMP(value, 512, 10240);
58         la->bufsize = value;
59         la->bufsize &= (~15); /* round to multiple of 16 */
60 }
61
62 static PointerRNA rna_Lamp_sky_settings_get(PointerRNA *ptr)
63 {
64         return rna_pointer_inherit_refine(ptr, &RNA_LampSkySettings, ptr->id.data);
65 }
66
67 static void rna_Lamp_mtex_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
68 {
69         Lamp *la = (Lamp*)ptr->data;
70         rna_iterator_array_begin(iter, (void*)la->mtex, sizeof(MTex*), MAX_MTEX, 0, NULL);
71 }
72
73 static PointerRNA rna_Lamp_active_texture_get(PointerRNA *ptr)
74 {
75         Lamp *la = (Lamp*)ptr->data;
76         Tex *tex;
77
78         tex = give_current_lamp_texture(la);
79         return rna_pointer_inherit_refine(ptr, &RNA_Texture, tex);
80 }
81
82 static void rna_Lamp_active_texture_set(PointerRNA *ptr, PointerRNA value)
83 {
84         Lamp *la = (Lamp*)ptr->data;
85
86         set_current_lamp_texture(la, value.data);
87 }
88
89 static StructRNA* rna_Lamp_refine(struct PointerRNA *ptr)
90 {
91         Lamp *la = (Lamp*)ptr->data;
92
93         switch (la->type) {
94                 case LA_LOCAL:
95                         return &RNA_PointLamp;
96                 case LA_SUN:
97                         return &RNA_SunLamp;
98                 case LA_SPOT:
99                         return &RNA_SpotLamp;
100                 case LA_HEMI:
101                         return &RNA_HemiLamp;
102                 case LA_AREA:
103                         return &RNA_AreaLamp;
104                 default:
105                         return &RNA_Lamp;
106         }
107 }
108
109 static void rna_Lamp_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
110 {
111         Lamp *la = ptr->id.data;
112
113         DAG_id_tag_update(&la->id, 0);
114         if (scene->gm.matmode == GAME_MAT_GLSL)
115                 WM_main_add_notifier(NC_LAMP|ND_LIGHTING_DRAW, la);
116         else
117                 WM_main_add_notifier(NC_LAMP|ND_LIGHTING, la);
118 }
119
120 static void rna_Lamp_draw_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
121 {
122         Lamp *la = ptr->id.data;
123
124         DAG_id_tag_update(&la->id, 0);
125         WM_main_add_notifier(NC_LAMP|ND_LIGHTING_DRAW, la);
126 }
127
128 static void rna_Lamp_sky_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
129 {
130         Lamp *la = ptr->id.data;
131
132         DAG_id_tag_update(&la->id, 0);
133         WM_main_add_notifier(NC_LAMP|ND_SKY, la);
134 }
135
136 /* only for rad/deg conversion! can remove later */
137 static float rna_Lamp_spot_size_get(PointerRNA *ptr)
138 {
139         Lamp *la = ptr->id.data;
140         return DEG2RADF(la->spotsize);
141 }
142
143 static void rna_Lamp_spot_size_set(PointerRNA *ptr, float value)
144 {
145         Lamp *la = ptr->id.data;
146         la->spotsize = RAD2DEGF(value);
147 }
148
149 static void rna_Lamp_use_nodes_update(Main *blain, Scene *scene, PointerRNA *ptr)
150 {
151         Lamp *la = (Lamp*)ptr->data;
152
153         if (la->use_nodes && la->nodetree == NULL)
154                 ED_node_shader_default(scene, &la->id);
155         
156         rna_Lamp_update(blain, scene, ptr);
157 }
158
159 #else
160
161 EnumPropertyItem lamp_type_items[] = {
162         {LA_LOCAL, "POINT", 0, "Point", "Omnidirectional point light source"},
163         {LA_SUN, "SUN", 0, "Sun", "Constant direction parallel ray light source"},
164         {LA_SPOT, "SPOT", 0, "Spot", "Directional cone light source"},
165         {LA_HEMI, "HEMI", 0, "Hemi", "180 degree constant light source"},
166         {LA_AREA, "AREA", 0, "Area", "Directional area light source"},
167         {0, NULL, 0, NULL, NULL}};
168
169 static void rna_def_lamp_mtex(BlenderRNA *brna)
170 {
171         StructRNA *srna;
172         PropertyRNA *prop;
173
174         static EnumPropertyItem prop_texture_coordinates_items[] = {
175                 {TEXCO_GLOB, "GLOBAL", 0, "Global", "Use global coordinates for the texture coordinates"},
176                 {TEXCO_VIEW, "VIEW", 0, "View", "Use view coordinates for the texture coordinates"},
177                 {TEXCO_OBJECT, "OBJECT", 0, "Object", "Use linked object's coordinates for texture coordinates"},
178                 {0, NULL, 0, NULL, NULL}};
179
180         srna = RNA_def_struct(brna, "LampTextureSlot", "TextureSlot");
181         RNA_def_struct_sdna(srna, "MTex");
182         RNA_def_struct_ui_text(srna, "Lamp Texture Slot", "Texture slot for textures in a Lamp datablock");
183
184         prop = RNA_def_property(srna, "texture_coords", PROP_ENUM, PROP_NONE);
185         RNA_def_property_enum_sdna(prop, NULL, "texco");
186         RNA_def_property_enum_items(prop, prop_texture_coordinates_items);
187         RNA_def_property_ui_text(prop, "Texture Coordinates", "");
188
189         prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
190         RNA_def_property_pointer_sdna(prop, NULL, "object");
191         RNA_def_property_struct_type(prop, "Object");
192         RNA_def_property_flag(prop, PROP_EDITABLE);
193         RNA_def_property_ui_text(prop, "Object", "Object to use for mapping with Object texture coordinates");
194
195         prop = RNA_def_property(srna, "use_map_color", PROP_BOOLEAN, PROP_NONE);
196         RNA_def_property_boolean_sdna(prop, NULL, "mapto", LAMAP_COL);
197         RNA_def_property_ui_text(prop, "Color", "Let the texture affect the basic color of the lamp");
198         RNA_def_property_update(prop, 0, "rna_Lamp_update");
199
200         prop = RNA_def_property(srna, "use_map_shadow", PROP_BOOLEAN, PROP_NONE);
201         RNA_def_property_boolean_sdna(prop, NULL, "mapto", LAMAP_SHAD);
202         RNA_def_property_ui_text(prop, "Shadow", "Let the texture affect the shadow color of the lamp");
203         RNA_def_property_update(prop, 0, "rna_Lamp_update");
204
205         prop = RNA_def_property(srna, "color_factor", PROP_FLOAT, PROP_NONE);
206         RNA_def_property_float_sdna(prop, NULL, "colfac");
207         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
208         RNA_def_property_ui_text(prop, "Color Factor", "Amount texture affects color values");
209         RNA_def_property_update(prop, 0, "rna_Lamp_update");
210
211         prop = RNA_def_property(srna, "shadow_factor", PROP_FLOAT, PROP_NONE);
212         RNA_def_property_float_sdna(prop, NULL, "shadowfac");
213         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
214         RNA_def_property_ui_text(prop, "Shadow Factor", "Amount texture affects shadow");
215         RNA_def_property_update(prop, 0, "rna_Lamp_update");
216 }
217
218 static void rna_def_lamp_sky_settings(BlenderRNA *brna)
219 {
220         StructRNA *srna;
221         PropertyRNA *prop;
222
223         static EnumPropertyItem prop_skycolorspace_items[] = {
224                 {0, "SMPTE", 0, "SMPTE", ""},
225                 {1, "REC709", 0, "REC709", ""},
226                 {2, "CIE", 0, "CIE", ""},
227                 {0, NULL, 0, NULL, NULL}};
228                 
229         srna = RNA_def_struct(brna, "LampSkySettings", NULL);
230         RNA_def_struct_sdna(srna, "Lamp");
231         RNA_def_struct_nested(brna, srna, "SunLamp");
232         RNA_def_struct_ui_text(srna, "Lamp Sky Settings", "Sky related settings for a sun lamp");
233                 
234         prop = RNA_def_property(srna, "sky_color_space", PROP_ENUM, PROP_NONE);
235         RNA_def_property_enum_sdna(prop, NULL, "sky_colorspace");
236         RNA_def_property_enum_items(prop, prop_skycolorspace_items);
237         RNA_def_property_ui_text(prop, "Sky Color Space", "Color space to use for internal XYZ->RGB color conversion");
238         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
239
240         prop = RNA_def_property(srna, "sky_blend_type", PROP_ENUM, PROP_NONE);
241         RNA_def_property_enum_sdna(prop, NULL, "skyblendtype");
242         RNA_def_property_enum_items(prop, ramp_blend_items);
243         RNA_def_property_ui_text(prop, "Sky Blend Mode", "Blend mode for combining sun sky with world sky");
244         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
245         
246         /* Number values */
247         
248         prop = RNA_def_property(srna, "horizon_brightness", PROP_FLOAT, PROP_NONE);
249         RNA_def_property_range(prop, 0.0f, 20.0f);
250         RNA_def_property_ui_text(prop, "Horizon Brightness", "Horizon brightness");
251         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
252
253         prop = RNA_def_property(srna, "spread", PROP_FLOAT, PROP_NONE);
254         RNA_def_property_range(prop, 0.0f, 10.0f);
255         RNA_def_property_ui_text(prop, "Horizon Spread", "Horizon Spread");
256         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
257
258         prop = RNA_def_property(srna, "sun_brightness", PROP_FLOAT, PROP_NONE);
259         RNA_def_property_range(prop, 0.0f, 10.0f);
260         RNA_def_property_ui_text(prop, "Sun Brightness", "Sun brightness");
261         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
262
263         prop = RNA_def_property(srna, "sun_size", PROP_FLOAT, PROP_NONE);
264         RNA_def_property_range(prop, 0.0f, 10.0f);
265         RNA_def_property_ui_text(prop, "Sun Size", "Sun size");
266         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
267
268         prop = RNA_def_property(srna, "backscattered_light", PROP_FLOAT, PROP_NONE);
269         RNA_def_property_range(prop, -1.0f, 1.0f);
270         RNA_def_property_ui_text(prop, "Backscattered Light", "Backscattered light");
271         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
272
273         prop = RNA_def_property(srna, "sun_intensity", PROP_FLOAT, PROP_NONE);
274         RNA_def_property_range(prop, 0.0f, 10.0f);
275         RNA_def_property_ui_text(prop, "Sun Intensity", "Sun intensity");
276         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
277
278         prop = RNA_def_property(srna, "atmosphere_turbidity", PROP_FLOAT, PROP_NONE);
279         RNA_def_property_float_sdna(prop, NULL, "atm_turbidity");
280         RNA_def_property_range(prop, 1.0f, 30.0f);
281         RNA_def_property_ui_range(prop, 2.0f, 10.0f, 1, 2);
282         RNA_def_property_ui_text(prop, "Atmosphere Turbidity", "Sky turbidity");
283         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
284
285         prop = RNA_def_property(srna, "atmosphere_inscattering", PROP_FLOAT, PROP_NONE);
286         RNA_def_property_float_sdna(prop, NULL, "atm_inscattering_factor");
287         RNA_def_property_range(prop, 0.0f, 1.0f);
288         RNA_def_property_ui_text(prop, "Atmosphere Inscatter", "Scatter contribution factor");
289         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
290
291         prop = RNA_def_property(srna, "atmosphere_extinction", PROP_FLOAT, PROP_NONE);
292         RNA_def_property_float_sdna(prop, NULL, "atm_extinction_factor");
293         RNA_def_property_range(prop, 0.0f, 1.0f);
294         RNA_def_property_ui_text(prop, "Atmosphere Extinction", "Extinction scattering contribution factor");
295         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
296
297         prop = RNA_def_property(srna, "atmosphere_distance_factor", PROP_FLOAT, PROP_NONE);
298         RNA_def_property_float_sdna(prop, NULL, "atm_distance_factor");
299         RNA_def_property_range(prop, 0.0f, 500.0f);
300         RNA_def_property_ui_text(prop, "Atmosphere Distance Factor",
301                                  "Multiplier to convert blender units to physical distance");
302         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
303
304         prop = RNA_def_property(srna, "sky_blend", PROP_FLOAT, PROP_NONE);
305         RNA_def_property_float_sdna(prop, NULL, "skyblendfac");
306         RNA_def_property_range(prop, 0.0f, 2.0f);
307         RNA_def_property_ui_text(prop, "Sky Blend", "Blend factor with sky");
308         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
309
310         prop = RNA_def_property(srna, "sky_exposure", PROP_FLOAT, PROP_NONE);
311         RNA_def_property_range(prop, 0.0f, 20.0f);
312         RNA_def_property_ui_text(prop, "Sky Exposure", "Strength of sky shading exponential exposure correction");
313         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
314
315         /* boolean */
316         
317         prop = RNA_def_property(srna, "use_sky", PROP_BOOLEAN, PROP_NONE);
318         RNA_def_property_boolean_sdna(prop, NULL, "sun_effect_type", LA_SUN_EFFECT_SKY);
319         RNA_def_property_ui_text(prop, "Sky", "Apply sun effect on sky");
320         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
321
322         prop = RNA_def_property(srna, "use_atmosphere", PROP_BOOLEAN, PROP_NONE);
323         RNA_def_property_boolean_sdna(prop, NULL, "sun_effect_type", LA_SUN_EFFECT_AP);
324         RNA_def_property_ui_text(prop, "Atmosphere", "Apply sun effect on atmosphere");
325         RNA_def_property_update(prop, 0, "rna_Lamp_sky_update");
326 }
327
328 static void rna_def_lamp(BlenderRNA *brna)
329 {
330         StructRNA *srna;
331         PropertyRNA *prop;
332
333         srna = RNA_def_struct(brna, "Lamp", "ID");
334         RNA_def_struct_refine_func(srna, "rna_Lamp_refine");
335         RNA_def_struct_ui_text(srna, "Lamp", "Lamp datablock for lighting a scene");
336         RNA_def_struct_ui_icon(srna, ICON_LAMP_DATA);
337
338         prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
339         RNA_def_property_enum_items(prop, lamp_type_items);
340         RNA_def_property_ui_text(prop, "Type", "Type of Lamp");
341         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
342
343         prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
344         RNA_def_property_float_sdna(prop, NULL, "dist");
345         RNA_def_property_range(prop, 0, INT_MAX);
346         RNA_def_property_ui_range(prop, 0, 1000, 1, 3);
347         RNA_def_property_ui_text(prop, "Distance",
348                                  "Falloff distance - the light is at half the original intensity at this point");
349         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
350
351         prop = RNA_def_property(srna, "energy", PROP_FLOAT, PROP_NONE);
352         RNA_def_property_ui_range(prop, 0, 10, 1, 3);
353         RNA_def_property_ui_text(prop, "Energy", "Amount of light that the lamp emits");
354         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
355
356         prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
357         RNA_def_property_float_sdna(prop, NULL, "r");
358         RNA_def_property_array(prop, 3);
359         RNA_def_property_ui_text(prop, "Color", "Light color");
360         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
361
362         prop = RNA_def_property(srna, "use_own_layer", PROP_BOOLEAN, PROP_NONE);
363         RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_LAYER);
364         RNA_def_property_ui_text(prop, "Layer", "Illuminate objects only on the same layers the lamp is on");
365         RNA_def_property_update(prop, 0, "rna_Lamp_update");
366
367         prop = RNA_def_property(srna, "use_negative", PROP_BOOLEAN, PROP_NONE);
368         RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_NEG);
369         RNA_def_property_ui_text(prop, "Negative", "Cast negative light");
370         RNA_def_property_update(prop, 0, "rna_Lamp_update");
371
372         prop = RNA_def_property(srna, "use_specular", PROP_BOOLEAN, PROP_NONE);
373         RNA_def_property_boolean_negative_sdna(prop, NULL, "mode", LA_NO_SPEC);
374         RNA_def_property_ui_text(prop, "Specular", "Create specular highlights");
375         RNA_def_property_update(prop, 0, "rna_Lamp_update");
376
377         prop = RNA_def_property(srna, "use_diffuse", PROP_BOOLEAN, PROP_NONE);
378         RNA_def_property_boolean_negative_sdna(prop, NULL, "mode", LA_NO_DIFF);
379         RNA_def_property_ui_text(prop, "Diffuse", "Do diffuse shading");
380         RNA_def_property_update(prop, 0, "rna_Lamp_update");
381
382         /* nodes */
383         prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
384         RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
385         RNA_def_property_ui_text(prop, "Node Tree", "Node tree for node based lamps");
386
387         prop = RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE);
388         RNA_def_property_boolean_sdna(prop, NULL, "use_nodes", 1);
389         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
390         RNA_def_property_ui_text(prop, "Use Nodes", "Use shader nodes to render the lamp");
391         RNA_def_property_update(prop, 0, "rna_Lamp_use_nodes_update");
392         
393         /* common */
394         rna_def_animdata_common(srna);
395         
396         /* textures */
397         rna_def_mtex_common(brna, srna, "rna_Lamp_mtex_begin", "rna_Lamp_active_texture_get",
398                 "rna_Lamp_active_texture_set", NULL, "LampTextureSlot", "LampTextureSlots", "rna_Lamp_update");
399 }
400
401 static void rna_def_lamp_falloff(StructRNA *srna)
402 {
403         PropertyRNA *prop;
404
405         static EnumPropertyItem prop_fallofftype_items[] = {
406                 {LA_FALLOFF_CONSTANT, "CONSTANT", 0, "Constant", ""},
407                 {LA_FALLOFF_INVLINEAR, "INVERSE_LINEAR", 0, "Inverse Linear", ""},
408                 {LA_FALLOFF_INVSQUARE, "INVERSE_SQUARE", 0, "Inverse Square", ""},
409                 {LA_FALLOFF_CURVE, "CUSTOM_CURVE", 0, "Custom Curve", ""},
410                 {LA_FALLOFF_SLIDERS, "LINEAR_QUADRATIC_WEIGHTED", 0, "Lin/Quad Weighted", ""},
411                 {0, NULL, 0, NULL, NULL}};
412
413         prop = RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
414         RNA_def_property_enum_items(prop, prop_fallofftype_items);
415         RNA_def_property_ui_text(prop, "Falloff Type", "Intensity Decay with distance");
416         RNA_def_property_update(prop, 0, "rna_Lamp_update");
417         
418         prop = RNA_def_property(srna, "falloff_curve", PROP_POINTER, PROP_NONE);
419         RNA_def_property_pointer_sdna(prop, NULL, "curfalloff");
420         RNA_def_property_ui_text(prop, "Falloff Curve", "Custom Lamp Falloff Curve");
421         RNA_def_property_update(prop, 0, "rna_Lamp_update");
422
423         prop = RNA_def_property(srna, "use_sphere", PROP_BOOLEAN, PROP_NONE);
424         RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_SPHERE);
425         RNA_def_property_ui_text(prop, "Sphere", "Set light intensity to zero beyond lamp distance");
426         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
427
428         prop = RNA_def_property(srna, "linear_attenuation", PROP_FLOAT, PROP_NONE);
429         RNA_def_property_float_sdna(prop, NULL, "att1");
430         RNA_def_property_range(prop, 0.0f, 1.0f);
431         RNA_def_property_ui_text(prop, "Linear Attenuation", "Linear distance attenuation");
432         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
433
434         prop = RNA_def_property(srna, "quadratic_attenuation", PROP_FLOAT, PROP_NONE);
435         RNA_def_property_float_sdna(prop, NULL, "att2");
436         RNA_def_property_range(prop, 0.0f, 1.0f);
437         RNA_def_property_ui_text(prop, "Quadratic Attenuation", "Quadratic distance attenuation");
438         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
439 }
440
441 static void rna_def_lamp_shadow(StructRNA *srna, int spot, int area)
442 {
443         PropertyRNA *prop;
444
445         static EnumPropertyItem prop_shadow_items[] = {
446                 {0, "NOSHADOW", 0, "No Shadow", ""},
447                 {LA_SHAD_RAY, "RAY_SHADOW", 0, "Ray Shadow", "Use ray tracing for shadow"},
448                 {0, NULL, 0, NULL, NULL}};
449
450         static EnumPropertyItem prop_spot_shadow_items[] = {
451                 {0, "NOSHADOW", 0, "No Shadow", ""},
452                 {LA_SHAD_BUF, "BUFFER_SHADOW", 0, "Buffer Shadow", "Let spotlight produce shadows using shadow buffer"},
453                 {LA_SHAD_RAY, "RAY_SHADOW", 0, "Ray Shadow", "Use ray tracing for shadow"},
454                 {0, NULL, 0, NULL, NULL}};
455
456         static EnumPropertyItem prop_ray_sampling_method_items[] = {
457                 {LA_SAMP_HALTON, "ADAPTIVE_QMC", 0, "Adaptive QMC", ""},
458                 {LA_SAMP_HAMMERSLEY, "CONSTANT_QMC", 0, "Constant QMC", ""},
459                 {0, NULL, 0, NULL, NULL}};
460         
461         static EnumPropertyItem prop_spot_ray_sampling_method_items[] = {
462                 {LA_SAMP_HALTON, "ADAPTIVE_QMC", 0, "Adaptive QMC", ""},
463                 {LA_SAMP_HAMMERSLEY, "CONSTANT_QMC", 0, "Constant QMC", ""},
464                 {LA_SAMP_CONSTANT, "CONSTANT_JITTERED", 0, "Constant Jittered", ""},
465                 {0, NULL, 0, NULL, NULL}};
466
467         prop = RNA_def_property(srna, "shadow_method", PROP_ENUM, PROP_NONE);
468         RNA_def_property_enum_bitflag_sdna(prop, NULL, "mode");
469         RNA_def_property_enum_items(prop, (spot)? prop_spot_shadow_items: prop_shadow_items);
470         RNA_def_property_ui_text(prop, "Shadow Method", "Method to compute lamp shadow with");
471         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
472
473         prop = RNA_def_property(srna, "shadow_color", PROP_FLOAT, PROP_COLOR);
474         RNA_def_property_float_sdna(prop, NULL, "shdwr");
475         RNA_def_property_array(prop, 3);
476         RNA_def_property_ui_text(prop, "Shadow Color", "Color of shadows cast by the lamp");
477         RNA_def_property_update(prop, 0, "rna_Lamp_update");
478
479         prop = RNA_def_property(srna, "use_only_shadow", PROP_BOOLEAN, PROP_NONE);
480         RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_ONLYSHADOW);
481         RNA_def_property_ui_text(prop, "Only Shadow", "Cast shadows only, without illuminating objects");
482         RNA_def_property_update(prop, 0, "rna_Lamp_update");
483
484         prop = RNA_def_property(srna, "shadow_ray_sample_method", PROP_ENUM, PROP_NONE);
485         RNA_def_property_enum_sdna(prop, NULL, "ray_samp_method");
486         RNA_def_property_enum_items(prop, (area)? prop_spot_ray_sampling_method_items: prop_ray_sampling_method_items);
487         RNA_def_property_ui_text(prop, "Shadow Ray Sampling Method",
488                                  "Method for generating shadow samples: Adaptive QMC is fastest, "
489                                  "Constant QMC is less noisy but slower");
490         RNA_def_property_update(prop, 0, "rna_Lamp_update");
491
492         prop = RNA_def_property(srna, (area)? "shadow_ray_samples_x": "shadow_ray_samples", PROP_INT, PROP_NONE);
493         RNA_def_property_int_sdna(prop, NULL, "ray_samp");
494         RNA_def_property_range(prop, 1, 64);
495         RNA_def_property_ui_text(prop, (area)? "Shadow Ray Samples": "Shadow Ray Samples X",
496                                  "Number of samples taken extra (samples x samples)");
497         RNA_def_property_update(prop, 0, "rna_Lamp_update");
498
499         if (area) {
500                 prop = RNA_def_property(srna, "shadow_ray_samples_y", PROP_INT, PROP_NONE);
501                 RNA_def_property_int_sdna(prop, NULL, "ray_sampy");
502                 RNA_def_property_range(prop, 1, 64);
503                 RNA_def_property_ui_text(prop, "Shadow Ray Samples Y",
504                                          "Number of samples taken extra (samples x samples)");
505                 RNA_def_property_update(prop, 0, "rna_Lamp_update");
506         }
507
508         prop = RNA_def_property(srna, "shadow_adaptive_threshold", PROP_FLOAT, PROP_NONE);
509         RNA_def_property_float_sdna(prop, NULL, "adapt_thresh");
510         RNA_def_property_range(prop, 0.0f, 1.0f);
511         RNA_def_property_ui_text(prop, "Shadow Adaptive Threshold", "Threshold for Adaptive Sampling (Raytraced shadows)");
512         RNA_def_property_update(prop, 0, "rna_Lamp_update");
513
514         prop = RNA_def_property(srna, "shadow_soft_size", PROP_FLOAT, PROP_DISTANCE);
515         RNA_def_property_float_sdna(prop, NULL, "area_size");
516         RNA_def_property_ui_range(prop, 0, 100, 0.1, 3);
517         RNA_def_property_ui_text(prop, "Shadow Soft Size", "Light size for ray shadow sampling (Raytraced shadows)");
518         RNA_def_property_update(prop, 0, "rna_Lamp_update");
519
520         prop = RNA_def_property(srna, "use_shadow_layer", PROP_BOOLEAN, PROP_NONE);
521         RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_LAYER_SHADOW);
522         RNA_def_property_ui_text(prop, "Shadow Layer", "Objects on the same layers only cast shadows");
523         RNA_def_property_update(prop, 0, "rna_Lamp_update");
524 }
525
526 static void rna_def_point_lamp(BlenderRNA *brna)
527 {
528         StructRNA *srna;
529
530         srna = RNA_def_struct(brna, "PointLamp", "Lamp");
531         RNA_def_struct_sdna(srna, "Lamp");
532         RNA_def_struct_ui_text(srna, "Point Lamp", "Omnidirectional point lamp");
533         RNA_def_struct_ui_icon(srna, ICON_LAMP_POINT);
534
535         rna_def_lamp_falloff(srna);
536         rna_def_lamp_shadow(srna, 0, 0);
537 }
538
539 static void rna_def_area_lamp(BlenderRNA *brna)
540 {
541         StructRNA *srna;
542         PropertyRNA *prop;
543
544         static EnumPropertyItem prop_areashape_items[] = {
545                 {LA_AREA_SQUARE, "SQUARE", 0, "Square", ""},
546                 {LA_AREA_RECT, "RECTANGLE", 0, "Rectangle", ""},
547                 {0, NULL, 0, NULL, NULL}};
548
549         srna = RNA_def_struct(brna, "AreaLamp", "Lamp");
550         RNA_def_struct_sdna(srna, "Lamp");
551         RNA_def_struct_ui_text(srna, "Area Lamp", "Directional area lamp");
552         RNA_def_struct_ui_icon(srna, ICON_LAMP_AREA);
553
554         rna_def_lamp_shadow(srna, 0, 1);
555
556         prop = RNA_def_property(srna, "use_umbra", PROP_BOOLEAN, PROP_NONE);
557         RNA_def_property_boolean_sdna(prop, NULL, "ray_samp_type", LA_SAMP_UMBRA);
558         RNA_def_property_ui_text(prop, "Umbra", "Emphasize parts that are fully shadowed (Constant Jittered sampling)");
559         RNA_def_property_update(prop, 0, "rna_Lamp_update");
560
561         prop = RNA_def_property(srna, "use_dither", PROP_BOOLEAN, PROP_NONE);
562         RNA_def_property_boolean_sdna(prop, NULL, "ray_samp_type", LA_SAMP_DITHER);
563         RNA_def_property_ui_text(prop, "Dither", "Use 2x2 dithering for sampling  (Constant Jittered sampling)");
564         RNA_def_property_update(prop, 0, "rna_Lamp_update");
565
566         prop = RNA_def_property(srna, "use_jitter", PROP_BOOLEAN, PROP_NONE);
567         RNA_def_property_boolean_sdna(prop, NULL, "ray_samp_type", LA_SAMP_JITTER);
568         RNA_def_property_ui_text(prop, "Jitter", "Use noise for sampling  (Constant Jittered sampling)");
569         RNA_def_property_update(prop, 0, "rna_Lamp_update");
570
571         prop = RNA_def_property(srna, "shape", PROP_ENUM, PROP_NONE);
572         RNA_def_property_enum_sdna(prop, NULL, "area_shape");
573         RNA_def_property_enum_items(prop, prop_areashape_items);
574         RNA_def_property_ui_text(prop, "Shape", "Shape of the area lamp");
575         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
576
577         prop = RNA_def_property(srna, "size", PROP_FLOAT, PROP_DISTANCE);
578         RNA_def_property_float_sdna(prop, NULL, "area_size");
579         RNA_def_property_ui_range(prop, 0, 100, 0.1, 3);
580         RNA_def_property_ui_text(prop, "Size", "Size of the area of the area Lamp, X direction size for Rectangle shapes");
581         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
582
583         prop = RNA_def_property(srna, "size_y", PROP_FLOAT, PROP_DISTANCE);
584         RNA_def_property_float_sdna(prop, NULL, "area_sizey");
585         RNA_def_property_ui_range(prop, 0, 100, 0.1, 3);
586         RNA_def_property_ui_text(prop, "Size Y",
587                                  "Size of the area of the area Lamp in the Y direction for Rectangle shapes");
588         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
589
590         prop = RNA_def_property(srna, "gamma", PROP_FLOAT, PROP_NONE);
591         RNA_def_property_float_sdna(prop, NULL, "k");
592         RNA_def_property_ui_range(prop, 0.001, 2.0, 0.1, 3);
593         RNA_def_property_ui_text(prop, "Gamma", "Light gamma correction value");
594         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
595 }
596
597 static void rna_def_spot_lamp(BlenderRNA *brna)
598 {
599         StructRNA *srna;
600         PropertyRNA *prop;
601
602         static EnumPropertyItem prop_shadbuftype_items[] = {
603                 {LA_SHADBUF_REGULAR     , "REGULAR", 0, "Classical", "Classic shadow buffer"},
604                 {LA_SHADBUF_HALFWAY, "HALFWAY", 0, "Classic-Halfway",
605                                      "Regular buffer, averaging the closest and 2nd closest Z value to reducing "
606                                      "bias artifacts"},
607                 {LA_SHADBUF_IRREGULAR, "IRREGULAR", 0, "Irregular",
608                                        "Irregular buffer produces sharp shadow always, but it doesn't show up for raytracing"},
609                 {LA_SHADBUF_DEEP, "DEEP", 0, "Deep",
610                                   "Deep shadow buffer supports transparency and better filtering, at the cost of "
611                                   "more memory usage and processing time"},
612                 {0, NULL, 0, NULL, NULL}};
613
614         static EnumPropertyItem prop_shadbuffiltertype_items[] = {
615                 {LA_SHADBUF_BOX , "BOX", 0, "Box", "Apply the Box filter to shadow buffer samples"},
616                 {LA_SHADBUF_TENT, "TENT", 0, "Tent", "Apply the Tent Filter to shadow buffer samples"},
617                 {LA_SHADBUF_GAUSS, "GAUSS", 0, "Gauss", "Apply the Gauss filter to shadow buffer samples"},
618                 {0, NULL, 0, NULL, NULL}};
619
620         static EnumPropertyItem prop_numbuffer_items[] = {
621                 {1, "BUFFERS_1", 0, "1", "Only one buffer rendered"},
622                 {4, "BUFFERS_4", 0, "4", "Render 4 buffers for better AA, this quadruples memory usage"},
623                 {9, "BUFFERS_9", 0, "9", "Render 9 buffers for better AA, this uses nine times more memory"},
624                 {0, NULL, 0, NULL, NULL}};
625
626         srna = RNA_def_struct(brna, "SpotLamp", "Lamp");
627         RNA_def_struct_sdna(srna, "Lamp");
628         RNA_def_struct_ui_text(srna, "Spot Lamp", "Directional cone lamp");
629         RNA_def_struct_ui_icon(srna, ICON_LAMP_SPOT);
630
631         rna_def_lamp_falloff(srna);
632         rna_def_lamp_shadow(srna, 1, 0);
633
634         prop = RNA_def_property(srna, "use_square", PROP_BOOLEAN, PROP_NONE);
635         RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_SQUARE);
636         RNA_def_property_ui_text(prop, "Square", "Cast a square spot light shape");
637         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
638
639         prop = RNA_def_property(srna, "use_halo", PROP_BOOLEAN, PROP_NONE);
640         RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_HALO);
641         RNA_def_property_ui_text(prop, "Halo", "Render spotlight with a volumetric halo");
642         RNA_def_property_update(prop, 0, "rna_Lamp_update");
643
644         prop = RNA_def_property(srna, "halo_intensity", PROP_FLOAT, PROP_NONE);
645         RNA_def_property_float_sdna(prop, NULL, "haint");
646         RNA_def_property_ui_range(prop, 0, 5.0, 0.1, 3);
647         RNA_def_property_ui_text(prop, "Halo Intensity", "Brightness of the spotlight's halo cone");
648         RNA_def_property_update(prop, 0, "rna_Lamp_update");
649
650         prop = RNA_def_property(srna, "halo_step", PROP_INT, PROP_NONE);
651         RNA_def_property_int_sdna(prop, NULL, "shadhalostep");
652         RNA_def_property_range(prop, 0, 12);
653         RNA_def_property_ui_text(prop, "Halo Step", "Volumetric halo sampling frequency");
654         RNA_def_property_update(prop, 0, "rna_Lamp_update");
655
656         prop = RNA_def_property(srna, "shadow_buffer_size", PROP_INT, PROP_NONE);
657         RNA_def_property_int_sdna(prop, NULL, "bufsize");
658         RNA_def_property_range(prop, 512, 10240);
659         RNA_def_property_ui_text(prop, "Shadow Buffer Size",
660                                  "Resolution of the shadow buffer, higher values give crisper shadows "
661                                  "but use more memory");
662         RNA_def_property_int_funcs(prop, NULL, "rna_Lamp_buffer_size_set", NULL);
663         RNA_def_property_update(prop, 0, "rna_Lamp_update");
664
665         prop = RNA_def_property(srna, "shadow_filter_type", PROP_ENUM, PROP_NONE);
666         RNA_def_property_enum_sdna(prop, NULL, "filtertype");
667         RNA_def_property_enum_items(prop, prop_shadbuffiltertype_items);
668         RNA_def_property_ui_text(prop, "Shadow Filter Type", "Type of shadow filter (Buffer Shadows)");
669         RNA_def_property_update(prop, 0, "rna_Lamp_update");
670
671         prop = RNA_def_property(srna, "shadow_sample_buffers", PROP_ENUM, PROP_NONE);
672         RNA_def_property_enum_sdna(prop, NULL, "buffers");
673         RNA_def_property_enum_items(prop, prop_numbuffer_items);
674         RNA_def_property_ui_text(prop, "Shadow Sample Buffers",
675                                  "Number of shadow buffers to render for better AA, this increases memory usage");
676         RNA_def_property_update(prop, 0, "rna_Lamp_update");
677
678         prop = RNA_def_property(srna, "spot_blend", PROP_FLOAT, PROP_NONE);
679         RNA_def_property_float_sdna(prop, NULL, "spotblend");
680         RNA_def_property_range(prop, 0.0f ,1.0f);
681         RNA_def_property_ui_text(prop, "Spot Blend", "The softness of the spotlight edge");
682         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
683
684         prop = RNA_def_property(srna, "spot_size", PROP_FLOAT, PROP_ANGLE);
685         /* RNA_def_property_float_sdna(prop, NULL, "spotsize"); */
686         RNA_def_property_range(prop, M_PI/180.0, M_PI);
687         RNA_def_property_ui_text(prop, "Spot Size", "Angle of the spotlight beam");
688                 /* only for deg/rad conversion */
689         RNA_def_property_float_funcs(prop, "rna_Lamp_spot_size_get", "rna_Lamp_spot_size_set", NULL);
690         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
691
692         prop = RNA_def_property(srna, "show_cone", PROP_BOOLEAN, PROP_NONE);
693         RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_SHOW_CONE);
694         RNA_def_property_ui_text(prop, "Show Cone",
695                                  "Draw transparent cone in 3D view to visualize which objects are contained in it");
696         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
697
698         prop = RNA_def_property(srna, "shadow_buffer_clip_start", PROP_FLOAT, PROP_DISTANCE);
699         RNA_def_property_float_sdna(prop, NULL, "clipsta");
700         RNA_def_property_range(prop, 0.0f, 9999.0f);
701         RNA_def_property_ui_text(prop, "Shadow Buffer Clip Start",
702                                  "Shadow map clip start, below which objects will not generate shadows");
703         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
704
705         prop = RNA_def_property(srna, "shadow_buffer_clip_end", PROP_FLOAT, PROP_DISTANCE);
706         RNA_def_property_float_sdna(prop, NULL, "clipend");
707         RNA_def_property_range(prop, 0.0f, 9999.0f);
708         RNA_def_property_ui_text(prop, "Shadow Buffer Clip End",
709                                  "Shadow map clip end, beyond which objects will not generate shadows");
710         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
711
712         prop = RNA_def_property(srna, "shadow_buffer_bias", PROP_FLOAT, PROP_NONE);
713         RNA_def_property_float_sdna(prop, NULL, "bias");
714         RNA_def_property_range(prop, 0.001f, 5.0f);
715         RNA_def_property_ui_text(prop, "Shadow Buffer Bias", "Shadow buffer sampling bias");
716         RNA_def_property_update(prop, 0, "rna_Lamp_update");
717
718         prop = RNA_def_property(srna, "shadow_buffer_soft", PROP_FLOAT, PROP_NONE);
719         RNA_def_property_float_sdna(prop, NULL, "soft");
720         RNA_def_property_range(prop, 0.0f, 100.0f);
721         RNA_def_property_ui_text(prop, "Shadow Buffer Soft", "Size of shadow buffer sampling area");
722         RNA_def_property_update(prop, 0, "rna_Lamp_update");
723
724         prop = RNA_def_property(srna, "shadow_buffer_samples", PROP_INT, PROP_NONE);
725         RNA_def_property_int_sdna(prop, NULL, "samp");
726         RNA_def_property_range(prop, 1, 16);
727         RNA_def_property_ui_text(prop, "Samples", "Number of shadow buffer samples");
728         RNA_def_property_update(prop, 0, "rna_Lamp_update");
729
730         prop = RNA_def_property(srna, "shadow_buffer_type", PROP_ENUM, PROP_NONE);
731         RNA_def_property_enum_sdna(prop, NULL, "buftype");
732         RNA_def_property_enum_items(prop, prop_shadbuftype_items);
733         RNA_def_property_ui_text(prop, "Shadow Buffer Type", "Type of shadow buffer");
734         RNA_def_property_update(prop, 0, "rna_Lamp_update");
735
736         prop = RNA_def_property(srna, "use_auto_clip_start", PROP_BOOLEAN, PROP_NONE);
737         RNA_def_property_boolean_sdna(prop, NULL, "bufflag", LA_SHADBUF_AUTO_START);
738         RNA_def_property_ui_text(prop, "Autoclip Start",
739                                  "Automatic calculation of clipping-start, based on visible vertices");
740         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
741
742         prop = RNA_def_property(srna, "use_auto_clip_end", PROP_BOOLEAN, PROP_NONE);
743         RNA_def_property_boolean_sdna(prop, NULL, "bufflag", LA_SHADBUF_AUTO_END);
744         RNA_def_property_ui_text(prop, "Autoclip End", "Automatic calculation of clipping-end, based on visible vertices");
745         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
746
747         prop = RNA_def_property(srna, "compression_threshold", PROP_FLOAT, PROP_NONE);
748         RNA_def_property_float_sdna(prop, NULL, "compressthresh");
749         RNA_def_property_range(prop, 0.0f, 1.0f);
750         RNA_def_property_ui_text(prop, "Compress", "Deep shadow map compression threshold");
751         RNA_def_property_update(prop, 0, "rna_Lamp_update");
752 }
753
754 static void rna_def_sun_lamp(BlenderRNA *brna)
755 {
756         StructRNA *srna;
757         PropertyRNA *prop;
758
759         srna = RNA_def_struct(brna, "SunLamp", "Lamp");
760         RNA_def_struct_sdna(srna, "Lamp");
761         RNA_def_struct_ui_text(srna, "Sun Lamp", "Constant direction parallel ray lamp");
762         RNA_def_struct_ui_icon(srna, ICON_LAMP_SUN);
763
764         rna_def_lamp_shadow(srna, 0, 0);
765
766         /* sky */
767         prop = RNA_def_property(srna, "sky", PROP_POINTER, PROP_NONE);
768         RNA_def_property_flag(prop, PROP_NEVER_NULL);
769         RNA_def_property_struct_type(prop, "LampSkySettings");
770         RNA_def_property_pointer_funcs(prop, "rna_Lamp_sky_settings_get", NULL, NULL, NULL);
771         RNA_def_property_ui_text(prop, "Sky Settings", "Sky related settings for sun lamps");
772
773         rna_def_lamp_sky_settings(brna);
774 }
775
776 static void rna_def_hemi_lamp(BlenderRNA *brna)
777 {
778         StructRNA *srna;
779
780         srna = RNA_def_struct(brna, "HemiLamp", "Lamp");
781         RNA_def_struct_sdna(srna, "Lamp");
782         RNA_def_struct_ui_text(srna, "Hemi Lamp", "180 degree constant lamp");
783         RNA_def_struct_ui_icon(srna, ICON_LAMP_HEMI);
784 }
785
786 void RNA_def_lamp(BlenderRNA *brna)
787 {
788         rna_def_lamp(brna);
789         rna_def_point_lamp(brna);
790         rna_def_area_lamp(brna);
791         rna_def_spot_lamp(brna);
792         rna_def_sun_lamp(brna);
793         rna_def_hemi_lamp(brna);
794         rna_def_lamp_mtex(brna);
795 }
796
797 #endif