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