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