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