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