RNA:
[blender.git] / source / blender / makesrna / intern / rna_world.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 <float.h>
26 #include <stdlib.h>
27
28 #include "RNA_define.h"
29 #include "RNA_types.h"
30
31 #include "rna_internal.h"
32
33 #include "DNA_material_types.h"
34 #include "DNA_texture_types.h"
35 #include "DNA_world_types.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 PointerRNA rna_World_ambient_occlusion_get(PointerRNA *ptr)
49 {
50         return rna_pointer_inherit_refine(ptr, &RNA_WorldAmbientOcclusion, ptr->id.data);
51 }
52
53 static PointerRNA rna_World_stars_get(PointerRNA *ptr)
54 {
55         return rna_pointer_inherit_refine(ptr, &RNA_WorldStarsSettings, ptr->id.data);
56 }
57
58 static PointerRNA rna_World_mist_get(PointerRNA *ptr)
59 {
60         return rna_pointer_inherit_refine(ptr, &RNA_WorldMistSettings, ptr->id.data);
61 }
62
63 static void rna_World_mtex_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
64 {
65         World *wo= (World*)ptr->data;
66         rna_iterator_array_begin(iter, (void*)wo->mtex, sizeof(MTex*), MAX_MTEX, 0, NULL);
67 }
68
69 static PointerRNA rna_World_active_texture_get(PointerRNA *ptr)
70 {
71         World *wo= (World*)ptr->data;
72         Tex *tex;
73
74         tex= give_current_world_texture(wo);
75         return rna_pointer_inherit_refine(ptr, &RNA_Texture, tex);
76 }
77
78 static void rna_World_active_texture_set(PointerRNA *ptr, PointerRNA value)
79 {
80         World *wo= (World*)ptr->data;
81
82         set_current_world_texture(wo, value.data);
83 }
84
85 static void rna_World_update(Main *bmain, Scene *scene, PointerRNA *ptr)
86 {
87         World *wo= ptr->id.data;
88
89         DAG_id_flush_update(&wo->id, 0);
90         WM_main_add_notifier(NC_WORLD, wo);
91 }
92
93 static void rna_World_draw_update(Main *bmain, Scene *scene, PointerRNA *ptr)
94 {
95         World *wo= ptr->id.data;
96
97         DAG_id_flush_update(&wo->id, 0);
98         WM_main_add_notifier(NC_WORLD|ND_WORLD_DRAW, wo);
99 }
100
101 #else
102
103 static void rna_def_world_mtex(BlenderRNA *brna)
104 {
105         StructRNA *srna;
106         PropertyRNA *prop;
107
108         static EnumPropertyItem texco_items[] = {
109                 {TEXCO_VIEW, "VIEW", 0, "View", "Uses view vector for the texture coordinates."},
110                 {TEXCO_GLOB, "GLOBAL", 0, "Global", "Uses global coordinates for the texture coordinates (interior mist)."},
111                 {TEXCO_ANGMAP, "ANGMAP", 0, "AngMap", "Uses 360 degree angular coordinates, e.g. for spherical light probes."},
112                 {TEXCO_H_SPHEREMAP, "SPHERE", 0, "Sphere", "For 360 degree panorama sky, spherical mapped, only top half."},
113                 {TEXCO_H_TUBEMAP, "TUBE", 0, "Tube", "For 360 degree panorama sky, cylindrical mapped, only top half."},
114                 {TEXCO_OBJECT, "OBJECT", 0, "Object", "Uses linked object's coordinates for texture coordinates."},
115                 {0, NULL, 0, NULL, NULL}};
116
117         srna= RNA_def_struct(brna, "WorldTextureSlot", "TextureSlot");
118         RNA_def_struct_sdna(srna, "MTex");
119         RNA_def_struct_ui_text(srna, "World Texture Slot", "Texture slot for textures in a World datablock.");
120
121         /* map to */
122         prop= RNA_def_property(srna, "map_blend", PROP_BOOLEAN, PROP_NONE);
123         RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_BLEND);
124         RNA_def_property_ui_text(prop, "Blend", "Affect the color progression of the background.");
125         RNA_def_property_update(prop, 0, "rna_World_update");
126
127         prop= RNA_def_property(srna, "map_horizon", PROP_BOOLEAN, PROP_NONE);
128         RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_HORIZ);
129         RNA_def_property_ui_text(prop, "Horizon", "Affect the color of the horizon.");
130         RNA_def_property_update(prop, 0, "rna_World_update");
131
132         prop= RNA_def_property(srna, "map_zenith_up", PROP_BOOLEAN, PROP_NONE);
133         RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_ZENUP);
134         RNA_def_property_ui_text(prop, "Zenith Up", "Affect the color of the zenith above.");
135         RNA_def_property_update(prop, 0, "rna_World_update");
136
137         prop= RNA_def_property(srna, "map_zenith_down", PROP_BOOLEAN, PROP_NONE);
138         RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_ZENDOWN);
139         RNA_def_property_ui_text(prop, "Zenith Down", "Affect the color of the zenith below.");
140         RNA_def_property_update(prop, 0, "rna_World_update");
141
142         /* unused
143         prop= RNA_def_property(srna, "map_mist", PROP_BOOLEAN, PROP_NONE);
144         RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_MIST);
145         RNA_def_property_ui_text(prop, "Mist", "Causes the texture to affect the intensity of the mist.");*/
146
147         prop= RNA_def_property(srna, "texture_coordinates", PROP_ENUM, PROP_NONE);
148         RNA_def_property_enum_sdna(prop, NULL, "texco");
149         RNA_def_property_enum_items(prop, texco_items);
150         RNA_def_property_ui_text(prop, "Texture Coordinates", "Texture coordinates used to map the texture onto the background.");
151         RNA_def_property_update(prop, 0, "rna_World_update");
152
153         prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
154         RNA_def_property_pointer_sdna(prop, NULL, "object");
155         RNA_def_property_struct_type(prop, "Object");
156         RNA_def_property_flag(prop, PROP_EDITABLE);
157         RNA_def_property_ui_text(prop, "Object", "Object to use for mapping with Object texture coordinates.");
158         RNA_def_property_update(prop, 0, "rna_World_update");
159
160         prop= RNA_def_property(srna, "blend_factor", PROP_FLOAT, PROP_NONE);
161         RNA_def_property_float_sdna(prop, NULL, "blendfac");
162         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
163         RNA_def_property_ui_text(prop, "Blend Factor", "Amount texture affects color progression of the background.");
164         RNA_def_property_update(prop, 0, "rna_World_update");
165
166         prop= RNA_def_property(srna, "horizon_factor", PROP_FLOAT, PROP_NONE);
167         RNA_def_property_float_sdna(prop, NULL, "colfac");
168         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
169         RNA_def_property_ui_text(prop, "Horizon Factor", "Amount texture affects color of the horizon.");
170         RNA_def_property_update(prop, 0, "rna_World_update");
171
172         prop= RNA_def_property(srna, "zenith_up_factor", PROP_FLOAT, PROP_NONE);
173         RNA_def_property_float_sdna(prop, NULL, "zenupfac");
174         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
175         RNA_def_property_ui_text(prop, "Zenith Up Factor", "Amount texture affects color of the zenith above.");
176         RNA_def_property_update(prop, 0, "rna_World_update");
177
178         prop= RNA_def_property(srna, "zenith_down_factor", PROP_FLOAT, PROP_NONE);
179         RNA_def_property_float_sdna(prop, NULL, "zendownfac");
180         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
181         RNA_def_property_ui_text(prop, "Zenith Down Factor", "Amount texture affects color of the zenith below.");
182         RNA_def_property_update(prop, 0, "rna_World_update");
183 }
184
185 static void rna_def_ambient_occlusion(BlenderRNA *brna)
186 {
187         StructRNA *srna;
188         PropertyRNA *prop;
189
190         static EnumPropertyItem blend_mode_items[] = {
191                 {WO_AOADD, "ADD", 0, "Add", "Add light and shadow."},
192                 {WO_AOSUB, "SUBTRACT", 0, "Subtract", "Subtract light and shadow (needs a normal light to make anything visible.)"},
193                 {WO_AOADDSUB, "BOTH", 0, "Both", "Both lighten and darken."},
194                 {0, NULL, 0, NULL, NULL}};
195
196         static EnumPropertyItem prop_color_items[] = {
197                 {WO_AOPLAIN, "PLAIN", 0, "White", "Plain diffuse energy (white.)"},
198                 {WO_AOSKYCOL, "SKY_COLOR", 0, "Sky Color", "Use horizon and zenith color for diffuse energy."},
199                 {WO_AOSKYTEX, "SKY_TEXTURE", 0, "Sky Texture", "Does full Sky texture render for diffuse energy."},
200                 {0, NULL, 0, NULL, NULL}};
201
202         static EnumPropertyItem prop_sample_method_items[] = {
203                 {WO_AOSAMP_CONSTANT, "CONSTANT_JITTERED", 0, "Constant Jittered", ""},
204                 {WO_AOSAMP_HALTON, "ADAPTIVE_QMC", 0, "Adaptive QMC", "Fast in high-contrast areas."},
205                 {WO_AOSAMP_HAMMERSLEY, "CONSTANT_QMC", 0, "Constant QMC", "Best quality."},
206                 {0, NULL, 0, NULL, NULL}};
207
208         static EnumPropertyItem prop_gather_method_items[] = {
209                 {WO_AOGATHER_RAYTRACE, "RAYTRACE", 0, "Raytrace", "Accurate, but slow when noise-free results are required."},
210                 {WO_AOGATHER_APPROX, "APPROXIMATE", 0, "Approximate", "Inaccurate, but faster and without noise."},
211                 {0, NULL, 0, NULL, NULL}};
212
213         srna= RNA_def_struct(brna, "WorldAmbientOcclusion", NULL);
214         RNA_def_struct_sdna(srna, "World");
215         RNA_def_struct_nested(brna, srna, "World");
216         RNA_def_struct_ui_text(srna, "Ambient Occlusion", "Ambient occlusion settings for a World datablock.");
217
218         prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
219         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_AMB_OCC);
220         RNA_def_property_ui_text(prop, "Enabled", "Use Ambient Occlusion to add light based on distance between elements, creating the illusion of omnipresent light");
221         RNA_def_property_update(prop, 0, "rna_World_update");
222
223         prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
224         RNA_def_property_float_sdna(prop, NULL, "aodist");
225         RNA_def_property_ui_text(prop, "Distance", "Length of rays, defines how far away other faces give occlusion effect.");
226         RNA_def_property_update(prop, 0, "rna_World_update");
227
228         prop= RNA_def_property(srna, "falloff_strength", PROP_FLOAT, PROP_NONE);
229         RNA_def_property_float_sdna(prop, NULL, "aodistfac");
230         RNA_def_property_ui_text(prop, "Strength", "Distance attenuation factor, the higher, the 'shorter' the shadows.");
231         RNA_def_property_update(prop, 0, "rna_World_update");
232
233         prop= RNA_def_property(srna, "energy", PROP_FLOAT, PROP_NONE);
234         RNA_def_property_float_sdna(prop, NULL, "aoenergy");
235         RNA_def_property_ui_range(prop, 0, 10, 0.1, 3);
236         RNA_def_property_ui_text(prop, "Energy", "Amount of enerygy generated by ambient occlusion.");
237         RNA_def_property_update(prop, 0, "rna_World_update");
238
239         prop= RNA_def_property(srna, "bias", PROP_FLOAT, PROP_NONE);
240         RNA_def_property_float_sdna(prop, NULL, "aobias");
241         RNA_def_property_range(prop, 0, 0.5);
242         RNA_def_property_ui_text(prop, "Bias", "Bias (in radians) to prevent smoothed faces from showing banding (for Raytrace Constant Jittered).");
243         RNA_def_property_update(prop, 0, "rna_World_update");
244
245         prop= RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
246         RNA_def_property_float_sdna(prop, NULL, "ao_adapt_thresh");
247         RNA_def_property_range(prop, 0, 1);
248         RNA_def_property_ui_text(prop, "Threshold", "Samples below this threshold will be considered fully shadowed/unshadowed and skipped (for Raytrace Adaptive QMC).");
249         RNA_def_property_update(prop, 0, "rna_World_update");
250
251         prop= RNA_def_property(srna, "adapt_to_speed", PROP_FLOAT, PROP_NONE);
252         RNA_def_property_float_sdna(prop, NULL, "ao_adapt_speed_fac");
253         RNA_def_property_range(prop, 0, 1);
254         RNA_def_property_ui_text(prop, "Adapt To Speed", "Use the speed vector pass to reduce AO samples in fast moving pixels. Higher values result in more aggressive sample reduction. Requires Vec pass enabled (for Raytrace Adaptive QMC).");
255         RNA_def_property_update(prop, 0, "rna_World_update");
256
257         prop= RNA_def_property(srna, "error_tolerance", PROP_FLOAT, PROP_NONE);
258         RNA_def_property_float_sdna(prop, NULL, "ao_approx_error");
259         RNA_def_property_range(prop, 0.0001, 10);
260         RNA_def_property_ui_text(prop, "Error Tolerance", "Low values are slower and higher quality (for Approximate).");
261         RNA_def_property_update(prop, 0, "rna_World_update");
262
263         prop= RNA_def_property(srna, "correction", PROP_FLOAT, PROP_NONE);
264         RNA_def_property_float_sdna(prop, NULL, "ao_approx_correction");
265         RNA_def_property_range(prop, 0, 1);
266         RNA_def_property_ui_range(prop, 0, 1, 0.1, 2);
267         RNA_def_property_ui_text(prop, "Correction", "Ad-hoc correction for over-occlusion due to the approximation (for Approximate).");
268         RNA_def_property_update(prop, 0, "rna_World_update");
269
270         prop= RNA_def_property(srna, "falloff", PROP_BOOLEAN, PROP_NONE);
271         RNA_def_property_boolean_sdna(prop, NULL, "aomode", WO_AODIST);
272         RNA_def_property_ui_text(prop, "Falloff", "");
273         RNA_def_property_update(prop, 0, "rna_World_update");
274
275         prop= RNA_def_property(srna, "pixel_cache", PROP_BOOLEAN, PROP_NONE);
276         RNA_def_property_boolean_sdna(prop, NULL, "aomode", WO_AOCACHE);
277         RNA_def_property_ui_text(prop, "Pixel Cache", "Cache AO results in pixels and interpolate over neighbouring pixels for speedup (for Approximate).");
278         RNA_def_property_update(prop, 0, "rna_World_update");
279
280         prop= RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
281         RNA_def_property_int_sdna(prop, NULL, "aosamp");
282         RNA_def_property_range(prop, 1, 32);
283         RNA_def_property_ui_text(prop, "Samples", "Amount of ray samples. Higher values give smoother results and longer rendering times");
284         RNA_def_property_update(prop, 0, "rna_World_update");
285
286         prop= RNA_def_property(srna, "blend_mode", PROP_ENUM, PROP_NONE);
287         RNA_def_property_enum_sdna(prop, NULL, "aomix");
288         RNA_def_property_enum_items(prop, blend_mode_items);
289         RNA_def_property_ui_text(prop, "Blend Mode", "Defines how AO mixes with material shading.");
290         RNA_def_property_update(prop, 0, "rna_World_update");
291
292         prop= RNA_def_property(srna, "color", PROP_ENUM, PROP_NONE);
293         RNA_def_property_enum_sdna(prop, NULL, "aocolor");
294         RNA_def_property_enum_items(prop, prop_color_items);
295         RNA_def_property_ui_text(prop, "Color", "Defines the color of the AO light");
296         RNA_def_property_update(prop, 0, "rna_World_update");
297
298         prop= RNA_def_property(srna, "sample_method", PROP_ENUM, PROP_NONE);
299         RNA_def_property_enum_sdna(prop, NULL, "ao_samp_method");
300         RNA_def_property_enum_items(prop, prop_sample_method_items);
301         RNA_def_property_ui_text(prop, "Sample Method", "Method for generating shadow samples (for Raytrace).");
302         RNA_def_property_update(prop, 0, "rna_World_update");
303
304         prop= RNA_def_property(srna, "gather_method", PROP_ENUM, PROP_NONE);
305         RNA_def_property_enum_sdna(prop, NULL, "ao_gather_method");
306         RNA_def_property_enum_items(prop, prop_gather_method_items);
307         RNA_def_property_ui_text(prop, "Gather Method", "");
308         RNA_def_property_update(prop, 0, "rna_World_update");
309
310         prop= RNA_def_property(srna, "passes", PROP_INT, PROP_NONE);
311         RNA_def_property_int_sdna(prop, NULL, "ao_approx_passes");
312         RNA_def_property_range(prop, 0, 10);
313         RNA_def_property_ui_text(prop, "Passes", "Number of preprocessing passes to reduce overocclusion (for Approximate).");
314         RNA_def_property_update(prop, 0, "rna_World_update");
315
316         prop= RNA_def_property(srna, "indirect_energy", PROP_FLOAT, PROP_UNSIGNED);
317         RNA_def_property_float_sdna(prop, NULL, "ao_indirect_energy");
318         RNA_def_property_ui_range(prop, 0, 10, 0.1, 3);
319         RNA_def_property_ui_text(prop, "Indirect", "Use approximate ambient occlusion for indirect diffuse lighting.");
320         RNA_def_property_update(prop, 0, "rna_World_update");
321
322         prop= RNA_def_property(srna, "indirect_bounces", PROP_INT, PROP_UNSIGNED);
323         RNA_def_property_int_sdna(prop, NULL, "ao_indirect_bounces");
324         RNA_def_property_ui_text(prop, "Bounces", "Number of indirect diffuse light bounces to use for approximate ambient occlusion.");
325         RNA_def_property_update(prop, 0, "rna_World_update");
326 }
327
328 static void rna_def_world_mist(BlenderRNA *brna)
329 {
330         StructRNA *srna;
331         PropertyRNA *prop;
332         
333         static EnumPropertyItem falloff_items[] = {
334                 {0, "QUADRATIC", 0, "Quadratic", "Mist uses quadratic progression."},
335                 {1, "LINEAR", 0, "Linear", "Mist uses linear progression."},
336                 {2, "INVERSE_QUADRATIC", 0, "Inverse Quadratic", "Mist uses inverse quadratic progression."},
337                 {0, NULL, 0, NULL, NULL}};
338
339         srna= RNA_def_struct(brna, "WorldMistSettings", NULL);
340         RNA_def_struct_sdna(srna, "World");
341         RNA_def_struct_nested(brna, srna, "World");
342         RNA_def_struct_ui_text(srna, "World Mist", "Mist settings for a World data-block.");
343
344         prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
345         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_MIST);
346         RNA_def_property_ui_text(prop, "Enabled", "Occlude objects with the environment color as they are further away.");
347         RNA_def_property_update(prop, 0, "rna_World_draw_update");
348
349         prop= RNA_def_property(srna, "intensity", PROP_FLOAT, PROP_NONE);
350         RNA_def_property_float_sdna(prop, NULL, "misi");
351         RNA_def_property_range(prop, 0, 1);
352         RNA_def_property_ui_text(prop, "Intensity", "Intensity of the mist effect.");
353         RNA_def_property_update(prop, 0, "rna_World_update");
354
355         prop= RNA_def_property(srna, "start", PROP_FLOAT, PROP_DISTANCE);
356         RNA_def_property_float_sdna(prop, NULL, "miststa");
357         RNA_def_property_range(prop, 0, FLT_MAX);
358         RNA_def_property_ui_range(prop, 0, 10000, 10, 2);
359         RNA_def_property_ui_text(prop, "Start", "Starting distance of the mist, measured from the camera");
360         RNA_def_property_update(prop, 0, "rna_World_draw_update");
361
362         prop= RNA_def_property(srna, "depth", PROP_FLOAT, PROP_DISTANCE);
363         RNA_def_property_float_sdna(prop, NULL, "mistdist");
364         RNA_def_property_range(prop, 0, FLT_MAX);
365         RNA_def_property_ui_range(prop, 0, 10000, 10, 2);
366         RNA_def_property_ui_text(prop, "Depth", "The distance over which the mist effect fades in");
367         RNA_def_property_update(prop, 0, "rna_World_draw_update");
368
369         prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_DISTANCE);
370         RNA_def_property_float_sdna(prop, NULL, "misthi");
371         RNA_def_property_range(prop, 0, 100);
372         RNA_def_property_ui_text(prop, "Height", "Control how much mist density decreases with height");
373         RNA_def_property_update(prop, 0, "rna_World_update");
374         
375         prop= RNA_def_property(srna, "falloff", PROP_ENUM, PROP_NONE);
376         RNA_def_property_enum_sdna(prop, NULL, "mistype");
377         RNA_def_property_enum_items(prop, falloff_items);
378         RNA_def_property_ui_text(prop, "Falloff", "Type of transition used to fade mist");
379         RNA_def_property_update(prop, 0, "rna_World_update");
380 }
381
382 static void rna_def_world_stars(BlenderRNA *brna)
383 {
384         StructRNA *srna;
385         PropertyRNA *prop;
386
387         srna= RNA_def_struct(brna, "WorldStarsSettings", NULL);
388         RNA_def_struct_sdna(srna, "World");
389         RNA_def_struct_nested(brna, srna, "World");
390         RNA_def_struct_ui_text(srna, "World Stars", "Stars setting for a World data-block.");
391
392         prop= RNA_def_property(srna, "enabled", PROP_BOOLEAN, PROP_NONE);
393         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_STARS);
394         RNA_def_property_ui_text(prop, "Enabled", "Enable starfield generation.");
395         RNA_def_property_update(prop, 0, "rna_World_update");
396
397         prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
398         RNA_def_property_float_sdna(prop, NULL, "starsize");
399         RNA_def_property_range(prop, 0, 10);
400         RNA_def_property_ui_text(prop, "Size", "Average screen dimension of stars.");
401         RNA_def_property_update(prop, 0, "rna_World_update");
402
403         prop= RNA_def_property(srna, "min_distance", PROP_FLOAT, PROP_DISTANCE);
404         RNA_def_property_float_sdna(prop, NULL, "starmindist");
405         RNA_def_property_range(prop, 0, 1000);
406         RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance to the camera for stars.");
407         RNA_def_property_update(prop, 0, "rna_World_update");
408
409         prop= RNA_def_property(srna, "average_separation", PROP_FLOAT, PROP_NONE);
410         RNA_def_property_float_sdna(prop, NULL, "stardist");
411         RNA_def_property_range(prop, 2, 1000);
412         RNA_def_property_ui_text(prop, "Average Separation", "Average distance between any two stars.");
413         RNA_def_property_update(prop, 0, "rna_World_update");
414
415         prop= RNA_def_property(srna, "color_randomization", PROP_FLOAT, PROP_NONE);
416         RNA_def_property_float_sdna(prop, NULL, "starcolnoise");
417         RNA_def_property_range(prop, 0, 1);
418         RNA_def_property_ui_text(prop, "Color Randomization", "Randomize star colors.");
419         RNA_def_property_update(prop, 0, "rna_World_update");
420         
421         /* unused
422         prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
423         RNA_def_property_float_sdna(prop, NULL, "starr");
424         RNA_def_property_array(prop, 3);
425         RNA_def_property_ui_text(prop, "Color", "Stars color.");
426         RNA_def_property_update(prop, 0, "rna_World_update");*/
427 }
428
429 void RNA_def_world(BlenderRNA *brna)
430 {
431         StructRNA *srna;
432         PropertyRNA *prop;
433
434 /*
435         static EnumPropertyItem physics_engine_items[] = {
436                 {WOPHY_NONE, "NONE", 0, "None", ""},
437                 //{WOPHY_ENJI, "ENJI", 0, "Enji", ""},
438                 //{WOPHY_SUMO, "SUMO", 0, "Sumo (Deprecated)", ""},
439                 //{WOPHY_DYNAMO, "DYNAMO", 0, "Dynamo", ""},
440                 //{WOPHY_ODE, "ODE", 0, "ODE", ""},
441                 {WOPHY_BULLET, "BULLET", 0, "Bullet", ""},
442                 {0, NULL, 0, NULL, NULL}};
443 */
444
445         srna= RNA_def_struct(brna, "World", "ID");
446         RNA_def_struct_ui_text(srna, "World", "World datablock describing the environment and ambient lighting of a scene.");
447         RNA_def_struct_ui_icon(srna, ICON_WORLD_DATA);
448
449         rna_def_animdata_common(srna);
450         rna_def_mtex_common(srna, "rna_World_mtex_begin", "rna_World_active_texture_get",
451                 "rna_World_active_texture_set", "WorldTextureSlot", "rna_World_update");
452
453         /* colors */
454         prop= RNA_def_property(srna, "horizon_color", PROP_FLOAT, PROP_COLOR);
455         RNA_def_property_float_sdna(prop, NULL, "horr");
456         RNA_def_property_array(prop, 3);
457         RNA_def_property_ui_text(prop, "Horizon Color", "Color at the horizon.");
458         RNA_def_property_update(prop, 0, "rna_World_update");
459         
460         prop= RNA_def_property(srna, "zenith_color", PROP_FLOAT, PROP_COLOR);
461         RNA_def_property_float_sdna(prop, NULL, "zenr");
462         RNA_def_property_array(prop, 3);
463         RNA_def_property_ui_text(prop, "Zenith Color", "Color at the zenith.");
464         RNA_def_property_update(prop, 0, "rna_World_update");
465
466         prop= RNA_def_property(srna, "ambient_color", PROP_FLOAT, PROP_COLOR);
467         RNA_def_property_float_sdna(prop, NULL, "ambr");
468         RNA_def_property_array(prop, 3);
469         RNA_def_property_ui_text(prop, "Ambient Color", "");
470         RNA_def_property_update(prop, 0, "rna_World_update");
471
472         /* exp, range */
473         prop= RNA_def_property(srna, "exposure", PROP_FLOAT, PROP_NONE);
474         RNA_def_property_float_sdna(prop, NULL, "exp");
475         RNA_def_property_range(prop, 0.0, 1.0);
476         RNA_def_property_ui_text(prop, "Exposure", "Amount of exponential color correction for light.");
477         RNA_def_property_update(prop, 0, "rna_World_update");
478
479         prop= RNA_def_property(srna, "range", PROP_FLOAT, PROP_NONE);
480         RNA_def_property_float_sdna(prop, NULL, "range");
481         RNA_def_property_range(prop, 0.2, 5.0);
482         RNA_def_property_ui_text(prop, "Range", "The color range that will be mapped to 0-1.");
483         RNA_def_property_update(prop, 0, "rna_World_update");
484
485         /* sky type */
486         prop= RNA_def_property(srna, "blend_sky", PROP_BOOLEAN, PROP_NONE);
487         RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYBLEND);
488         RNA_def_property_ui_text(prop, "Blend Sky", "Render background with natural progression from horizon to zenith.");
489         RNA_def_property_update(prop, 0, "rna_World_update");
490
491         prop= RNA_def_property(srna, "paper_sky", PROP_BOOLEAN, PROP_NONE);
492         RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYPAPER);
493         RNA_def_property_ui_text(prop, "Paper Sky", "Flatten blend or texture coordinates.");
494         RNA_def_property_update(prop, 0, "rna_World_update");
495
496         prop= RNA_def_property(srna, "real_sky", PROP_BOOLEAN, PROP_NONE);
497         RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYREAL);
498         RNA_def_property_ui_text(prop, "Real Sky", "Render background with a real horizon, relative to the camera angle.");
499         RNA_def_property_update(prop, 0, "rna_World_update");
500
501         /* nested structs */
502         prop= RNA_def_property(srna, "ambient_occlusion", PROP_POINTER, PROP_NONE);
503         RNA_def_property_flag(prop, PROP_NEVER_NULL);
504         RNA_def_property_struct_type(prop, "WorldAmbientOcclusion");
505         RNA_def_property_pointer_funcs(prop, "rna_World_ambient_occlusion_get", NULL, NULL);
506         RNA_def_property_ui_text(prop, "Ambient Occlusion", "World ambient occlusion settings.");
507
508         prop= RNA_def_property(srna, "mist", PROP_POINTER, PROP_NONE);
509         RNA_def_property_flag(prop, PROP_NEVER_NULL);
510         RNA_def_property_struct_type(prop, "WorldMistSettings");
511         RNA_def_property_pointer_funcs(prop, "rna_World_mist_get", NULL, NULL);
512         RNA_def_property_ui_text(prop, "Mist", "World mist settings.");
513
514         prop= RNA_def_property(srna, "stars", PROP_POINTER, PROP_NONE);
515         RNA_def_property_flag(prop, PROP_NEVER_NULL);
516         RNA_def_property_struct_type(prop, "WorldStarsSettings");
517         RNA_def_property_pointer_funcs(prop, "rna_World_stars_get", NULL, NULL);
518         RNA_def_property_ui_text(prop, "Stars", "World stars settings.");
519
520         rna_def_ambient_occlusion(brna);
521         rna_def_world_mist(brna);
522         rna_def_world_stars(brna);
523         rna_def_world_mtex(brna);
524 }
525
526 #endif
527