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