dff27e1c625eb92f36ac88bc262de0fd27bda094
[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 StructRNA *rna_Lamp_refine(struct PointerRNA *ptr)
67 {
68         Lamp *la = (Lamp *)ptr->data;
69
70         switch (la->type) {
71                 case LA_LOCAL:
72                         return &RNA_PointLamp;
73                 case LA_SUN:
74                         return &RNA_SunLamp;
75                 case LA_SPOT:
76                         return &RNA_SpotLamp;
77                 case LA_HEMI:
78                         return &RNA_HemiLamp;
79                 case LA_AREA:
80                         return &RNA_AreaLamp;
81                 default:
82                         return &RNA_Lamp;
83         }
84 }
85
86 static void rna_Lamp_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
87 {
88         Lamp *la = ptr->id.data;
89
90         DEG_id_tag_update(&la->id, 0);
91         WM_main_add_notifier(NC_LAMP | ND_LIGHTING, la);
92 }
93
94 static void rna_Lamp_draw_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
95 {
96         Lamp *la = ptr->id.data;
97
98         DEG_id_tag_update(&la->id, 0);
99         WM_main_add_notifier(NC_LAMP | ND_LIGHTING_DRAW, la);
100 }
101
102 static void rna_Lamp_use_nodes_update(bContext *C, PointerRNA *ptr)
103 {
104         Lamp *la = (Lamp *)ptr->data;
105
106         if (la->use_nodes && la->nodetree == NULL)
107                 ED_node_shader_default(C, &la->id);
108
109         rna_Lamp_update(CTX_data_main(C), CTX_data_scene(C), ptr);
110 }
111
112 #else
113 /* Don't define icons here, so they don't show up in the Lamp UI (properties Editor) - DingTo */
114 const EnumPropertyItem rna_enum_lamp_type_items[] = {
115         {LA_LOCAL, "POINT", 0, "Point", "Omnidirectional point light source"},
116         {LA_SUN, "SUN", 0, "Sun", "Constant direction parallel ray light source"},
117         {LA_SPOT, "SPOT", 0, "Spot", "Directional cone light source"},
118         {LA_HEMI, "HEMI", 0, "Hemi", "180 degree constant light source"},
119         {LA_AREA, "AREA", 0, "Area", "Directional area light source"},
120         {0, NULL, 0, NULL, NULL}
121 };
122
123 static void rna_def_lamp(BlenderRNA *brna)
124 {
125         StructRNA *srna;
126         PropertyRNA *prop;
127
128         srna = RNA_def_struct(brna, "Lamp", "ID");
129         RNA_def_struct_refine_func(srna, "rna_Lamp_refine");
130         RNA_def_struct_ui_text(srna, "Lamp", "Lamp data-block for lighting a scene");
131         RNA_def_struct_ui_icon(srna, ICON_LAMP_DATA);
132
133         prop = RNA_def_property(srna, "type", PROP_ENUM, PROP_NONE);
134         RNA_def_property_enum_items(prop, rna_enum_lamp_type_items);
135         RNA_def_property_ui_text(prop, "Type", "Type of Lamp");
136         RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_LAMP);
137         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
138
139         prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
140         RNA_def_property_float_sdna(prop, NULL, "dist");
141         RNA_def_property_range(prop, 0, INT_MAX);
142         RNA_def_property_ui_range(prop, 0, 1000, 1, 3);
143         RNA_def_property_ui_text(prop, "Distance",
144                                  "Falloff distance - the light is at half the original intensity at this point");
145         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
146
147         prop = RNA_def_property(srna, "energy", PROP_FLOAT, PROP_NONE);
148         RNA_def_property_ui_range(prop, 0, 10, 1, 3);
149         RNA_def_property_ui_text(prop, "Energy", "Amount of light that the lamp emits");
150         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
151
152         prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
153         RNA_def_property_float_sdna(prop, NULL, "r");
154         RNA_def_property_array(prop, 3);
155         RNA_def_property_ui_text(prop, "Color", "Light color");
156         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
157
158         prop = RNA_def_property(srna, "specular_factor", PROP_FLOAT, PROP_FACTOR);
159         RNA_def_property_float_sdna(prop, NULL, "spec_fac");
160         RNA_def_property_range(prop, 0.0f, 9999.0f);
161         RNA_def_property_ui_range(prop, 0.0f, 1.0f, 0.01, 2);
162         RNA_def_property_ui_text(prop, "Specular Factor", "Specular reflection multiplier");
163         RNA_def_property_update(prop, 0, "rna_Lamp_update");
164
165         /* nodes */
166         prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
167         RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
168         RNA_def_property_ui_text(prop, "Node Tree", "Node tree for node based lamps");
169
170         prop = RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE);
171         RNA_def_property_boolean_sdna(prop, NULL, "use_nodes", 1);
172         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
173         RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
174         RNA_def_property_ui_text(prop, "Use Nodes", "Use shader nodes to render the lamp");
175         RNA_def_property_update(prop, 0, "rna_Lamp_use_nodes_update");
176
177         /* common */
178         rna_def_animdata_common(srna);
179 }
180
181 static void rna_def_lamp_falloff(StructRNA *srna)
182 {
183         PropertyRNA *prop;
184
185         static const EnumPropertyItem prop_fallofftype_items[] = {
186                 {LA_FALLOFF_CONSTANT, "CONSTANT", 0, "Constant", ""},
187                 {LA_FALLOFF_INVLINEAR, "INVERSE_LINEAR", 0, "Inverse Linear", ""},
188                 {LA_FALLOFF_INVSQUARE, "INVERSE_SQUARE", 0, "Inverse Square", ""},
189                 {LA_FALLOFF_INVCOEFFICIENTS, "INVERSE_COEFFICIENTS", 0, "Inverse Coefficients", ""},
190                 {LA_FALLOFF_CURVE, "CUSTOM_CURVE", 0, "Custom Curve", ""},
191                 {LA_FALLOFF_SLIDERS, "LINEAR_QUADRATIC_WEIGHTED", 0, "Lin/Quad Weighted", ""},
192                 {0, NULL, 0, NULL, NULL}
193         };
194
195         prop = RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
196         RNA_def_property_enum_items(prop, prop_fallofftype_items);
197         RNA_def_property_ui_text(prop, "Falloff Type", "Intensity Decay with distance");
198         RNA_def_property_update(prop, 0, "rna_Lamp_update");
199
200         prop = RNA_def_property(srna, "falloff_curve", PROP_POINTER, PROP_NONE);
201         RNA_def_property_pointer_sdna(prop, NULL, "curfalloff");
202         RNA_def_property_ui_text(prop, "Falloff Curve", "Custom Lamp Falloff Curve");
203         RNA_def_property_update(prop, 0, "rna_Lamp_update");
204
205         prop = RNA_def_property(srna, "linear_attenuation", PROP_FLOAT, PROP_NONE);
206         RNA_def_property_float_sdna(prop, NULL, "att1");
207         RNA_def_property_range(prop, 0.0f, 1.0f);
208         RNA_def_property_ui_text(prop, "Linear Attenuation", "Linear distance attenuation");
209         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
210
211         prop = RNA_def_property(srna, "quadratic_attenuation", PROP_FLOAT, PROP_NONE);
212         RNA_def_property_float_sdna(prop, NULL, "att2");
213         RNA_def_property_range(prop, 0.0f, 1.0f);
214         RNA_def_property_ui_text(prop, "Quadratic Attenuation", "Quadratic distance attenuation");
215         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
216
217         prop = RNA_def_property(srna, "constant_coefficient", PROP_FLOAT, PROP_NONE);
218         RNA_def_property_float_sdna(prop, NULL, "coeff_const");
219         RNA_def_property_range(prop, 0.0f, FLT_MAX);
220         RNA_def_property_ui_text(prop, "Constant Coefficient",
221                                  "Constant distance attenuation coefficient");
222         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
223
224         prop = RNA_def_property(srna, "linear_coefficient", PROP_FLOAT, PROP_NONE);
225         RNA_def_property_float_sdna(prop, NULL, "coeff_lin");
226         RNA_def_property_range(prop, 0.0f, FLT_MAX);
227         RNA_def_property_ui_text(prop, "Linear Coefficient",
228                                  "Linear distance attenuation coefficient");
229         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
230
231         prop = RNA_def_property(srna, "quadratic_coefficient", PROP_FLOAT, PROP_NONE);
232         RNA_def_property_float_sdna(prop, NULL, "coeff_quad");
233         RNA_def_property_range(prop, 0.0f, FLT_MAX);
234         RNA_def_property_ui_text(prop, "Quadratic Coefficient",
235                                  "Quadratic distance attenuation coefficient");
236         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
237 }
238
239 static void rna_def_lamp_shadow(StructRNA *srna, int sun)
240 {
241         PropertyRNA *prop;
242
243         prop = RNA_def_property(srna, "use_shadow", PROP_BOOLEAN, PROP_NONE);
244         RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_SHADOW);
245         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
246
247         prop = RNA_def_property(srna, "shadow_buffer_size", PROP_INT, PROP_NONE);
248         RNA_def_property_int_sdna(prop, NULL, "bufsize");
249         RNA_def_property_range(prop, 128, 10240);
250         RNA_def_property_ui_text(prop, "Shadow Buffer Size",
251                                  "Resolution of the shadow buffer, higher values give crisper shadows "
252                                  "but use more memory");
253         RNA_def_property_int_funcs(prop, NULL, "rna_Lamp_buffer_size_set", NULL);
254         RNA_def_property_update(prop, 0, "rna_Lamp_update");
255
256         prop = RNA_def_property(srna, "shadow_buffer_clip_start", PROP_FLOAT, PROP_DISTANCE);
257         RNA_def_property_float_sdna(prop, NULL, "clipsta");
258         RNA_def_property_range(prop, 0.0f, 9999.0f);
259         RNA_def_property_ui_text(prop, "Shadow Buffer Clip Start",
260                                  "Shadow map clip start, below which objects will not generate shadows");
261         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
262
263         prop = RNA_def_property(srna, "shadow_buffer_clip_end", PROP_FLOAT, PROP_DISTANCE);
264         RNA_def_property_float_sdna(prop, NULL, "clipend");
265         RNA_def_property_range(prop, 0.0f, 9999.0f);
266         RNA_def_property_ui_text(prop, "Shadow Buffer Clip End",
267                                  "Shadow map clip end, beyond which objects will not generate shadows");
268         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
269
270         prop = RNA_def_property(srna, "shadow_buffer_bias", PROP_FLOAT, PROP_NONE);
271         RNA_def_property_float_sdna(prop, NULL, "bias");
272         RNA_def_property_range(prop, 0.001f, 9999.0f);
273         RNA_def_property_ui_range(prop, 0.001f, 5.0f, 1.0, 3);
274         RNA_def_property_ui_text(prop, "Shadow Buffer Bias", "Bias for reducing self shadowing");
275         RNA_def_property_update(prop, 0, "rna_Lamp_update");
276
277         prop = RNA_def_property(srna, "shadow_buffer_bleed_bias", PROP_FLOAT, PROP_NONE);
278         RNA_def_property_float_sdna(prop, NULL, "bleedbias");
279         RNA_def_property_range(prop, 0.f, 1.f);
280         RNA_def_property_ui_text(prop, "Shadow Buffer Bleed Bias", "Bias for reducing light-bleed on variance shadow maps");
281         RNA_def_property_update(prop, 0, "rna_Lamp_update");
282
283         prop = RNA_def_property(srna, "shadow_buffer_exp", PROP_FLOAT, PROP_NONE);
284         RNA_def_property_float_sdna(prop, NULL, "bleedexp");
285         RNA_def_property_range(prop, 1.0f, 9999.0f);
286         RNA_def_property_ui_text(prop, "Shadow Buffer Exponent", "Bias for reducing light-bleed on exponential shadow maps");
287         RNA_def_property_update(prop, 0, "rna_Lamp_update");
288
289         prop = RNA_def_property(srna, "shadow_buffer_soft", PROP_FLOAT, PROP_NONE);
290         RNA_def_property_float_sdna(prop, NULL, "soft");
291         RNA_def_property_range(prop, 0.0f, 100.0f);
292         RNA_def_property_ui_text(prop, "Shadow Buffer Soft", "Size of shadow buffer sampling area");
293         RNA_def_property_update(prop, 0, "rna_Lamp_update");
294
295         prop = RNA_def_property(srna, "shadow_buffer_samples", PROP_INT, PROP_NONE);
296         RNA_def_property_int_sdna(prop, NULL, "samp");
297         RNA_def_property_range(prop, 1, 16);
298         RNA_def_property_ui_text(prop, "Samples", "Number of shadow buffer samples");
299         RNA_def_property_update(prop, 0, "rna_Lamp_update");
300
301         prop = RNA_def_property(srna, "shadow_color", PROP_FLOAT, PROP_COLOR);
302         RNA_def_property_float_sdna(prop, NULL, "shdwr");
303         RNA_def_property_array(prop, 3);
304         RNA_def_property_ui_text(prop, "Shadow Color", "Color of shadows cast by the lamp");
305         RNA_def_property_update(prop, 0, "rna_Lamp_update");
306
307         prop = RNA_def_property(srna, "shadow_soft_size", PROP_FLOAT, PROP_DISTANCE);
308         RNA_def_property_float_sdna(prop, NULL, "area_size");
309         RNA_def_property_range(prop, 0.0f, FLT_MAX);
310         RNA_def_property_ui_range(prop, 0, 100, 0.1, 3);
311         RNA_def_property_ui_text(prop, "Shadow Soft Size", "Light size for ray shadow sampling (Raytraced shadows)");
312         RNA_def_property_update(prop, 0, "rna_Lamp_update");
313
314         /* Eevee */
315         prop = RNA_def_property(srna, "use_contact_shadow", PROP_BOOLEAN, PROP_NONE);
316         RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_SHAD_CONTACT);
317         RNA_def_property_ui_text(prop, "Contact Shadow", "Use screen space raytracing to have correct shadowing "
318                                                          "near occluder, or for small features that does not appear "
319                                                          "in shadow maps");
320         RNA_def_property_update(prop, 0, "rna_Lamp_update");
321
322         prop = RNA_def_property(srna, "contact_shadow_distance", PROP_FLOAT, PROP_DISTANCE);
323         RNA_def_property_float_sdna(prop, NULL, "contact_dist");
324         RNA_def_property_range(prop, 0.0f, 9999.0f);
325         RNA_def_property_ui_text(prop, "Contact Shadow Distance", "World space distance in which to search for "
326                                                                   "screen space occluder");
327         RNA_def_property_update(prop, 0, "rna_Lamp_update");
328
329         prop = RNA_def_property(srna, "contact_shadow_bias", PROP_FLOAT, PROP_NONE);
330         RNA_def_property_float_sdna(prop, NULL, "contact_bias");
331         RNA_def_property_range(prop, 0.001f, 9999.0f);
332         RNA_def_property_ui_range(prop, 0.001f, 5.0f, 1.0, 3);
333         RNA_def_property_ui_text(prop, "Contact Shadow Bias", "Bias to avoid self shadowing");
334         RNA_def_property_update(prop, 0, "rna_Lamp_update");
335
336         prop = RNA_def_property(srna, "contact_shadow_soft_size", PROP_FLOAT, PROP_NONE);
337         RNA_def_property_float_sdna(prop, NULL, "contact_spread");
338         RNA_def_property_range(prop, 0.0f, 9999.0f);
339         RNA_def_property_ui_text(prop, "Contact Shadow Soft", "Control how soft the contact shadows will be");
340         RNA_def_property_update(prop, 0, "rna_Lamp_update");
341
342         prop = RNA_def_property(srna, "contact_shadow_thickness", PROP_FLOAT, PROP_DISTANCE);
343         RNA_def_property_float_sdna(prop, NULL, "contact_thickness");
344         RNA_def_property_range(prop, 0.0f, 9999.0f);
345         RNA_def_property_ui_range(prop, 0, 100, 0.1, 3);
346         RNA_def_property_ui_text(prop, "Contact Shadow Thickness", "Pixel thickness used to detect occlusion");
347         RNA_def_property_update(prop, 0, "rna_Lamp_update");
348
349         if (sun) {
350                 prop = RNA_def_property(srna, "shadow_cascade_max_distance", PROP_FLOAT, PROP_DISTANCE);
351                 RNA_def_property_float_sdna(prop, NULL, "cascade_max_dist");
352                 RNA_def_property_range(prop, 0.0f, 9999.0f);
353                 RNA_def_property_ui_text(prop, "Cascade Max Distance", "End distance of the cascaded shadow map (only in perspective view)");
354                 RNA_def_property_update(prop, 0, "rna_Lamp_update");
355
356                 prop = RNA_def_property(srna, "shadow_cascade_count", PROP_INT, PROP_NONE);
357                 RNA_def_property_int_sdna(prop, NULL, "cascade_count");
358                 RNA_def_property_range(prop, 1, 4);
359                 RNA_def_property_ui_text(prop, "Cascade Count", "Number of texture used by the cascaded shadow map");
360                 RNA_def_property_update(prop, 0, "rna_Lamp_update");
361
362                 prop = RNA_def_property(srna, "shadow_cascade_exponent", PROP_FLOAT, PROP_FACTOR);
363                 RNA_def_property_float_sdna(prop, NULL, "cascade_exponent");
364                 RNA_def_property_range(prop, 0.0f, 1.0f);
365                 RNA_def_property_ui_text(prop, "Exponential Distribution", "Higher value increase resolution towards the viewpoint");
366                 RNA_def_property_update(prop, 0, "rna_Lamp_update");
367
368                 prop = RNA_def_property(srna, "shadow_cascade_fade", PROP_FLOAT, PROP_FACTOR);
369                 RNA_def_property_float_sdna(prop, NULL, "cascade_fade");
370                 RNA_def_property_range(prop, 0.0f, 1.0f);
371                 RNA_def_property_ui_text(prop, "Cascade Fade", "How smooth is the transition between each cascade");
372                 RNA_def_property_update(prop, 0, "rna_Lamp_update");
373         }
374 }
375
376 static void rna_def_point_lamp(BlenderRNA *brna)
377 {
378         StructRNA *srna;
379
380         srna = RNA_def_struct(brna, "PointLamp", "Lamp");
381         RNA_def_struct_sdna(srna, "Lamp");
382         RNA_def_struct_ui_text(srna, "Point Lamp", "Omnidirectional point lamp");
383         RNA_def_struct_ui_icon(srna, ICON_LAMP_POINT);
384
385         rna_def_lamp_falloff(srna);
386         rna_def_lamp_shadow(srna, 0);
387 }
388
389 static void rna_def_area_lamp(BlenderRNA *brna)
390 {
391         StructRNA *srna;
392         PropertyRNA *prop;
393
394         static const EnumPropertyItem prop_areashape_items[] = {
395                 {LA_AREA_SQUARE, "SQUARE", 0, "Square", ""},
396                 {LA_AREA_RECT, "RECTANGLE", 0, "Rectangle", ""},
397                 {LA_AREA_DISK, "DISK", 0, "Disk", ""},
398                 {LA_AREA_ELLIPSE, "ELLIPSE", 0, "Ellipse", ""},
399                 {0, NULL, 0, NULL, NULL}
400         };
401
402         srna = RNA_def_struct(brna, "AreaLamp", "Lamp");
403         RNA_def_struct_sdna(srna, "Lamp");
404         RNA_def_struct_ui_text(srna, "Area Lamp", "Directional area lamp");
405         RNA_def_struct_ui_icon(srna, ICON_LAMP_AREA);
406
407         rna_def_lamp_shadow(srna, 0);
408         rna_def_lamp_falloff(srna);
409
410         prop = RNA_def_property(srna, "shape", PROP_ENUM, PROP_NONE);
411         RNA_def_property_enum_sdna(prop, NULL, "area_shape");
412         RNA_def_property_enum_items(prop, prop_areashape_items);
413         RNA_def_property_ui_text(prop, "Shape", "Shape of the area lamp");
414         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
415
416         prop = RNA_def_property(srna, "size", PROP_FLOAT, PROP_DISTANCE);
417         RNA_def_property_float_sdna(prop, NULL, "area_size");
418         RNA_def_property_range(prop, 0.0f, FLT_MAX);
419         RNA_def_property_ui_range(prop, 0, 100, 0.1, 3);
420         RNA_def_property_ui_text(prop, "Size", "Size of the area of the area Lamp, X direction size for Rectangle shapes");
421         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
422
423         prop = RNA_def_property(srna, "size_y", PROP_FLOAT, PROP_DISTANCE);
424         RNA_def_property_range(prop, 0.0f, FLT_MAX);
425         RNA_def_property_float_sdna(prop, NULL, "area_sizey");
426         RNA_def_property_ui_range(prop, 0, 100, 0.1, 3);
427         RNA_def_property_ui_text(prop, "Size Y",
428                                  "Size of the area of the area Lamp in the Y direction for Rectangle shapes");
429         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
430 }
431
432 static void rna_def_spot_lamp(BlenderRNA *brna)
433 {
434         StructRNA *srna;
435         PropertyRNA *prop;
436
437         srna = RNA_def_struct(brna, "SpotLamp", "Lamp");
438         RNA_def_struct_sdna(srna, "Lamp");
439         RNA_def_struct_ui_text(srna, "Spot Lamp", "Directional cone lamp");
440         RNA_def_struct_ui_icon(srna, ICON_LAMP_SPOT);
441
442         rna_def_lamp_falloff(srna);
443         rna_def_lamp_shadow(srna, 0);
444
445         prop = RNA_def_property(srna, "use_square", PROP_BOOLEAN, PROP_NONE);
446         RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_SQUARE);
447         RNA_def_property_ui_text(prop, "Square", "Cast a square spot light shape");
448         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
449
450         prop = RNA_def_property(srna, "spot_blend", PROP_FLOAT, PROP_NONE);
451         RNA_def_property_float_sdna(prop, NULL, "spotblend");
452         RNA_def_property_range(prop, 0.0f, 1.0f);
453         RNA_def_property_ui_text(prop, "Spot Blend", "The softness of the spotlight edge");
454         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
455
456         prop = RNA_def_property(srna, "spot_size", PROP_FLOAT, PROP_ANGLE);
457         RNA_def_property_float_sdna(prop, NULL, "spotsize");
458         RNA_def_property_range(prop, DEG2RADF(1.0f), DEG2RADF(180.0f));
459         RNA_def_property_ui_text(prop, "Spot Size", "Angle of the spotlight beam");
460         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
461
462         prop = RNA_def_property(srna, "show_cone", PROP_BOOLEAN, PROP_NONE);
463         RNA_def_property_boolean_sdna(prop, NULL, "mode", LA_SHOW_CONE);
464         RNA_def_property_ui_text(prop, "Show Cone",
465                                  "Draw transparent cone in 3D view to visualize which objects are contained in it");
466         RNA_def_property_update(prop, 0, "rna_Lamp_draw_update");
467 }
468
469 static void rna_def_sun_lamp(BlenderRNA *brna)
470 {
471         StructRNA *srna;
472
473         srna = RNA_def_struct(brna, "SunLamp", "Lamp");
474         RNA_def_struct_sdna(srna, "Lamp");
475         RNA_def_struct_ui_text(srna, "Sun Lamp", "Constant direction parallel ray lamp");
476         RNA_def_struct_ui_icon(srna, ICON_LAMP_SUN);
477
478         rna_def_lamp_shadow(srna, 1);
479 }
480
481 static void rna_def_hemi_lamp(BlenderRNA *brna)
482 {
483         StructRNA *srna;
484
485         srna = RNA_def_struct(brna, "HemiLamp", "Lamp");
486         RNA_def_struct_sdna(srna, "Lamp");
487         RNA_def_struct_ui_text(srna, "Hemi Lamp", "180 degree constant lamp");
488         RNA_def_struct_ui_icon(srna, ICON_LAMP_HEMI);
489 }
490
491 void RNA_def_lamp(BlenderRNA *brna)
492 {
493         rna_def_lamp(brna);
494         rna_def_point_lamp(brna);
495         rna_def_area_lamp(brna);
496         rna_def_spot_lamp(brna);
497         rna_def_sun_lamp(brna);
498         rna_def_hemi_lamp(brna);
499 }
500
501 #endif