World Mist
[blender.git] / source / blender / makesrna / intern / rna_world.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Blender Foundation (2008).
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/makesrna/intern/rna_world.c
24  *  \ingroup RNA
25  */
26
27
28 #include <float.h>
29 #include <stdlib.h>
30
31 #include "RNA_define.h"
32
33 #include "rna_internal.h"
34
35 #include "DNA_material_types.h"
36 #include "DNA_texture_types.h"
37 #include "DNA_world_types.h"
38
39 #include "WM_types.h"
40
41 #ifdef RNA_RUNTIME
42
43 #include "MEM_guardedalloc.h"
44
45 #include "BKE_depsgraph.h"
46 #include "BKE_main.h"
47 #include "BKE_texture.h"
48
49 #include "WM_api.h"
50
51 static PointerRNA rna_World_lighting_get(PointerRNA *ptr)
52 {
53         return rna_pointer_inherit_refine(ptr, &RNA_WorldLighting, ptr->id.data);
54 }
55
56 static PointerRNA rna_World_stars_get(PointerRNA *ptr)
57 {
58         return rna_pointer_inherit_refine(ptr, &RNA_WorldStarsSettings, ptr->id.data);
59 }
60
61 static PointerRNA rna_World_mist_get(PointerRNA *ptr)
62 {
63         return rna_pointer_inherit_refine(ptr, &RNA_WorldMistSettings, ptr->id.data);
64 }
65
66 static void rna_World_mtex_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
67 {
68         World *wo= (World*)ptr->data;
69         rna_iterator_array_begin(iter, (void*)wo->mtex, sizeof(MTex*), MAX_MTEX, 0, NULL);
70 }
71
72 static PointerRNA rna_World_active_texture_get(PointerRNA *ptr)
73 {
74         World *wo= (World*)ptr->data;
75         Tex *tex;
76
77         tex= give_current_world_texture(wo);
78         return rna_pointer_inherit_refine(ptr, &RNA_Texture, tex);
79 }
80
81 static void rna_World_active_texture_set(PointerRNA *ptr, PointerRNA value)
82 {
83         World *wo= (World*)ptr->data;
84
85         set_current_world_texture(wo, value.data);
86 }
87
88 static void rna_World_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
89 {
90         World *wo= ptr->id.data;
91
92         DAG_id_tag_update(&wo->id, 0);
93         WM_main_add_notifier(NC_WORLD, wo);
94 }
95
96 static void rna_World_draw_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
97 {
98         World *wo= ptr->id.data;
99
100         DAG_id_tag_update(&wo->id, 0);
101         WM_main_add_notifier(NC_WORLD|ND_WORLD_DRAW, wo);
102 }
103
104 /* so camera mist limits redraw */
105 static void rna_World_draw_mist_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
106 {
107         World *wo= ptr->id.data;
108
109         DAG_id_tag_update(&wo->id, 0);
110         WM_main_add_notifier(NC_WORLD|ND_WORLD_DRAW, wo);
111         WM_main_add_notifier(NC_OBJECT|ND_DRAW, NULL);
112 }
113
114 static void rna_World_stars_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
115 {
116         World *wo= ptr->id.data;
117
118         DAG_id_tag_update(&wo->id, 0);
119         WM_main_add_notifier(NC_WORLD|ND_WORLD_STARS, wo);
120 }
121
122
123 #else
124
125 static void rna_def_world_mtex(BlenderRNA *brna)
126 {
127         StructRNA *srna;
128         PropertyRNA *prop;
129
130         static EnumPropertyItem texco_items[] = {
131                 {TEXCO_VIEW, "VIEW", 0, "View", "Uses view vector for the texture coordinates"},
132                 {TEXCO_GLOB, "GLOBAL", 0, "Global", "Uses global coordinates for the texture coordinates (interior mist)"},
133                 {TEXCO_ANGMAP, "ANGMAP", 0, "AngMap", "Uses 360 degree angular coordinates, e.g. for spherical light probes"},
134                 {TEXCO_H_SPHEREMAP, "SPHERE", 0, "Sphere", "For 360 degree panorama sky, spherical mapped, only top half"},
135                 {TEXCO_H_TUBEMAP, "TUBE", 0, "Tube", "For 360 degree panorama sky, cylindrical mapped, only top half"},
136                 {TEXCO_OBJECT, "OBJECT", 0, "Object", "Uses linked object's coordinates for texture coordinates"},
137                 {0, NULL, 0, NULL, NULL}};
138
139         srna= RNA_def_struct(brna, "WorldTextureSlot", "TextureSlot");
140         RNA_def_struct_sdna(srna, "MTex");
141         RNA_def_struct_ui_text(srna, "World Texture Slot", "Texture slot for textures in a World datablock");
142
143         /* map to */
144         prop= RNA_def_property(srna, "use_map_blend", PROP_BOOLEAN, PROP_NONE);
145         RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_BLEND);
146         RNA_def_property_ui_text(prop, "Blend", "Affect the color progression of the background");
147         RNA_def_property_update(prop, 0, "rna_World_update");
148
149         prop= RNA_def_property(srna, "use_map_horizon", PROP_BOOLEAN, PROP_NONE);
150         RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_HORIZ);
151         RNA_def_property_ui_text(prop, "Horizon", "Affect the color of the horizon");
152         RNA_def_property_update(prop, 0, "rna_World_update");
153
154         prop= RNA_def_property(srna, "use_map_zenith_up", PROP_BOOLEAN, PROP_NONE);
155         RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_ZENUP);
156         RNA_def_property_ui_text(prop, "Zenith Up", "Affect the color of the zenith above");
157         RNA_def_property_update(prop, 0, "rna_World_update");
158
159         prop= RNA_def_property(srna, "use_map_zenith_down", PROP_BOOLEAN, PROP_NONE);
160         RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_ZENDOWN);
161         RNA_def_property_ui_text(prop, "Zenith Down", "Affect the color of the zenith below");
162         RNA_def_property_update(prop, 0, "rna_World_update");
163
164         prop= RNA_def_property(srna, "texture_coords", PROP_ENUM, PROP_NONE);
165         RNA_def_property_enum_sdna(prop, NULL, "texco");
166         RNA_def_property_enum_items(prop, texco_items);
167         RNA_def_property_ui_text(prop, "Texture Coordinates", "Texture coordinates used to map the texture onto the background");
168         RNA_def_property_update(prop, 0, "rna_World_update");
169
170         prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
171         RNA_def_property_pointer_sdna(prop, NULL, "object");
172         RNA_def_property_struct_type(prop, "Object");
173         RNA_def_property_flag(prop, PROP_EDITABLE);
174         RNA_def_property_ui_text(prop, "Object", "Object to use for mapping with Object texture coordinates");
175         RNA_def_property_update(prop, 0, "rna_World_update");
176
177         prop= RNA_def_property(srna, "blend_factor", PROP_FLOAT, PROP_NONE);
178         RNA_def_property_float_sdna(prop, NULL, "blendfac");
179         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
180         RNA_def_property_ui_text(prop, "Blend Factor", "Amount texture affects color progression of the background");
181         RNA_def_property_update(prop, 0, "rna_World_update");
182
183         prop= RNA_def_property(srna, "horizon_factor", PROP_FLOAT, PROP_NONE);
184         RNA_def_property_float_sdna(prop, NULL, "colfac");
185         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
186         RNA_def_property_ui_text(prop, "Horizon Factor", "Amount texture affects color of the horizon");
187         RNA_def_property_update(prop, 0, "rna_World_update");
188
189         prop= RNA_def_property(srna, "zenith_up_factor", PROP_FLOAT, PROP_NONE);
190         RNA_def_property_float_sdna(prop, NULL, "zenupfac");
191         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
192         RNA_def_property_ui_text(prop, "Zenith Up Factor", "Amount texture affects color of the zenith above");
193         RNA_def_property_update(prop, 0, "rna_World_update");
194
195         prop= RNA_def_property(srna, "zenith_down_factor", PROP_FLOAT, PROP_NONE);
196         RNA_def_property_float_sdna(prop, NULL, "zendownfac");
197         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
198         RNA_def_property_ui_text(prop, "Zenith Down Factor", "Amount texture affects color of the zenith below");
199         RNA_def_property_update(prop, 0, "rna_World_update");
200 }
201
202 static void rna_def_lighting(BlenderRNA *brna)
203 {
204         StructRNA *srna;
205         PropertyRNA *prop;
206
207         static EnumPropertyItem blend_mode_items[] = {
208                 {WO_AOMUL, "MULTIPLY", 0, "Multiply", "Multiply direct lighting with ambient occlusion, darkening the result"},
209                 {WO_AOADD, "ADD", 0, "Add", "Add light and shadow"},
210                 {0, NULL, 0, NULL, NULL}};
211
212         static EnumPropertyItem prop_color_items[] = {
213                 {WO_AOPLAIN, "PLAIN", 0, "White", "Plain diffuse energy (white.)"},
214                 {WO_AOSKYCOL, "SKY_COLOR", 0, "Sky Color", "Use horizon and zenith color for diffuse energy"},
215                 {WO_AOSKYTEX, "SKY_TEXTURE", 0, "Sky Texture", "Does full Sky texture render for diffuse energy"},
216                 {0, NULL, 0, NULL, NULL}};
217
218         static EnumPropertyItem prop_sample_method_items[] = {
219                 {WO_AOSAMP_CONSTANT, "CONSTANT_JITTERED", 0, "Constant Jittered", "Fastest and gives the most noise"},
220                 {WO_AOSAMP_HALTON, "ADAPTIVE_QMC", 0, "Adaptive QMC", "Fast in high-contrast areas"},
221                 {WO_AOSAMP_HAMMERSLEY, "CONSTANT_QMC", 0, "Constant QMC", "Best quality"},
222                 {0, NULL, 0, NULL, NULL}};
223
224         static EnumPropertyItem prop_gather_method_items[] = {
225                 {WO_AOGATHER_RAYTRACE, "RAYTRACE", 0, "Raytrace", "Accurate, but slow when noise-free results are required"},
226                 {WO_AOGATHER_APPROX, "APPROXIMATE", 0, "Approximate", "Inaccurate, but faster and without noise"},
227                 {0, NULL, 0, NULL, NULL}};
228
229         srna= RNA_def_struct(brna, "WorldLighting", NULL);
230         RNA_def_struct_sdna(srna, "World");
231         RNA_def_struct_nested(brna, srna, "World");
232         RNA_def_struct_ui_text(srna, "Lighting", "Lighting for a World datablock");
233
234         /* ambient occlusion */
235         prop= RNA_def_property(srna, "use_ambient_occlusion", PROP_BOOLEAN, PROP_NONE);
236         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_AMB_OCC);
237         RNA_def_property_ui_text(prop, "Use Ambient Occlusion", "Use Ambient Occlusion to add shadowing based on distance between objects");
238         RNA_def_property_update(prop, 0, "rna_World_update");
239
240         prop= RNA_def_property(srna, "ao_factor", PROP_FLOAT, PROP_FACTOR);
241         RNA_def_property_float_sdna(prop, NULL, "aoenergy");
242         RNA_def_property_range(prop, 0, INT_MAX);
243         RNA_def_property_ui_range(prop, 0, 1, 0.1, 2);
244         RNA_def_property_ui_text(prop, "Factor", "Factor for ambient occlusion blending");
245         RNA_def_property_update(prop, 0, "rna_World_update");
246
247         prop= RNA_def_property(srna, "ao_blend_type", PROP_ENUM, PROP_NONE);
248         RNA_def_property_enum_sdna(prop, NULL, "aomix");
249         RNA_def_property_enum_items(prop, blend_mode_items);
250         RNA_def_property_ui_text(prop, "Blend Mode", "Defines how AO mixes with material shading");
251         RNA_def_property_update(prop, 0, "rna_World_update");
252
253         /* environment lighting */
254         prop= RNA_def_property(srna, "use_environment_light", PROP_BOOLEAN, PROP_NONE);
255         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_ENV_LIGHT);
256         RNA_def_property_ui_text(prop, "Use Environment Lighting", "Add light coming from the environment");
257         RNA_def_property_update(prop, 0, "rna_World_update");
258
259         prop= RNA_def_property(srna, "environment_energy", PROP_FLOAT, PROP_NONE);
260         RNA_def_property_float_sdna(prop, NULL, "ao_env_energy");
261         RNA_def_property_ui_range(prop, 0, FLT_MAX, 1, 3);
262         RNA_def_property_ui_text(prop, "Environment Color", "Defines the strength of environment light");
263         RNA_def_property_update(prop, 0, "rna_World_update");
264
265         prop= RNA_def_property(srna, "environment_color", PROP_ENUM, PROP_NONE);
266         RNA_def_property_enum_sdna(prop, NULL, "aocolor");
267         RNA_def_property_enum_items(prop, prop_color_items);
268         RNA_def_property_ui_text(prop, "Environment Color", "Defines where the color of the environment light comes from");
269         RNA_def_property_update(prop, 0, "rna_World_update");
270
271         /* indirect lighting */
272         prop= RNA_def_property(srna, "use_indirect_light", PROP_BOOLEAN, PROP_NONE);
273         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_INDIRECT_LIGHT);
274         RNA_def_property_ui_text(prop, "Use Indirect Lighting", "Add indirect light bouncing of surrounding objects");
275         RNA_def_property_update(prop, 0, "rna_World_update");
276
277         prop= RNA_def_property(srna, "indirect_factor", PROP_FLOAT, PROP_FACTOR);
278         RNA_def_property_float_sdna(prop, NULL, "ao_indirect_energy");
279         RNA_def_property_range(prop, 0, INT_MAX);
280         RNA_def_property_ui_range(prop, 0, 1, 0.1, 2);
281         RNA_def_property_ui_text(prop, "Indirect Factor", "Factor for how much surrounding objects contribute to light");
282         RNA_def_property_update(prop, 0, "rna_World_update");
283
284         prop= RNA_def_property(srna, "indirect_bounces", PROP_INT, PROP_UNSIGNED);
285         RNA_def_property_int_sdna(prop, NULL, "ao_indirect_bounces");
286         RNA_def_property_range(prop, 1, SHRT_MAX);
287         RNA_def_property_ui_text(prop, "Bounces", "Number of indirect diffuse light bounces");
288         RNA_def_property_update(prop, 0, "rna_World_update");
289
290         /* gathering parameters */
291         prop= RNA_def_property(srna, "gather_method", PROP_ENUM, PROP_NONE);
292         RNA_def_property_enum_sdna(prop, NULL, "ao_gather_method");
293         RNA_def_property_enum_items(prop, prop_gather_method_items);
294         RNA_def_property_ui_text(prop, "Gather Method", "");
295         RNA_def_property_update(prop, 0, "rna_World_update");
296
297         prop= RNA_def_property(srna, "passes", PROP_INT, PROP_NONE);
298         RNA_def_property_int_sdna(prop, NULL, "ao_approx_passes");
299         RNA_def_property_range(prop, 0, 10);
300         RNA_def_property_ui_text(prop, "Passes", "Number of preprocessing passes to reduce overocclusion");
301         RNA_def_property_update(prop, 0, "rna_World_update");
302
303         prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
304         RNA_def_property_float_sdna(prop, NULL, "aodist");
305         RNA_def_property_ui_text(prop, "Distance", "Length of rays, defines how far away other faces give occlusion effect");
306         RNA_def_property_update(prop, 0, "rna_World_update");
307
308         prop= RNA_def_property(srna, "falloff_strength", PROP_FLOAT, PROP_NONE);
309         RNA_def_property_float_sdna(prop, NULL, "aodistfac");
310         RNA_def_property_ui_text(prop, "Strength", "Attenuation falloff strength, the higher, the less influence distant objects have");
311         RNA_def_property_update(prop, 0, "rna_World_update");
312
313         prop= RNA_def_property(srna, "bias", PROP_FLOAT, PROP_NONE);
314         RNA_def_property_float_sdna(prop, NULL, "aobias");
315         RNA_def_property_range(prop, 0, 0.5);
316         RNA_def_property_ui_text(prop, "Bias", "Bias (in radians) to prevent smoothed faces from showing banding (for Raytrace Constant Jittered)");
317         RNA_def_property_update(prop, 0, "rna_World_update");
318
319         prop= RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
320         RNA_def_property_float_sdna(prop, NULL, "ao_adapt_thresh");
321         RNA_def_property_range(prop, 0, 1);
322         RNA_def_property_ui_text(prop, "Threshold", "Samples below this threshold will be considered fully shadowed/unshadowed and skipped (for Raytrace Adaptive QMC)");
323         RNA_def_property_update(prop, 0, "rna_World_update");
324
325         prop= RNA_def_property(srna, "adapt_to_speed", PROP_FLOAT, PROP_NONE);
326         RNA_def_property_float_sdna(prop, NULL, "ao_adapt_speed_fac");
327         RNA_def_property_range(prop, 0, 1);
328         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)");
329         RNA_def_property_update(prop, 0, "rna_World_update");
330
331         prop= RNA_def_property(srna, "error_threshold", PROP_FLOAT, PROP_NONE);
332         RNA_def_property_float_sdna(prop, NULL, "ao_approx_error");
333         RNA_def_property_range(prop, 0.0001, 10);
334         RNA_def_property_ui_text(prop, "Error Tolerance", "Low values are slower and higher quality");
335         RNA_def_property_update(prop, 0, "rna_World_update");
336
337         prop= RNA_def_property(srna, "correction", PROP_FLOAT, PROP_NONE);
338         RNA_def_property_float_sdna(prop, NULL, "ao_approx_correction");
339         RNA_def_property_range(prop, 0, 1);
340         RNA_def_property_ui_range(prop, 0, 1, 0.1, 2);
341         RNA_def_property_ui_text(prop, "Correction", "Ad-hoc correction for over-occlusion due to the approximation");
342         RNA_def_property_update(prop, 0, "rna_World_update");
343
344         prop= RNA_def_property(srna, "use_falloff", PROP_BOOLEAN, PROP_NONE);
345         RNA_def_property_boolean_sdna(prop, NULL, "aomode", WO_AODIST);
346         RNA_def_property_ui_text(prop, "Falloff", "Distance will be used to attenuate shadows");
347         RNA_def_property_update(prop, 0, "rna_World_update");
348
349         prop= RNA_def_property(srna, "use_cache", PROP_BOOLEAN, PROP_NONE);
350         RNA_def_property_boolean_sdna(prop, NULL, "aomode", WO_AOCACHE);
351         RNA_def_property_ui_text(prop, "Pixel Cache", "Cache AO results in pixels and interpolate over neighbouring pixels for speedup");
352         RNA_def_property_update(prop, 0, "rna_World_update");
353
354         prop= RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
355         RNA_def_property_int_sdna(prop, NULL, "aosamp");
356         RNA_def_property_range(prop, 1, 128);
357         RNA_def_property_ui_text(prop, "Samples", "Amount of ray samples. Higher values give smoother results and longer rendering times");
358         RNA_def_property_update(prop, 0, "rna_World_update");
359
360         prop= RNA_def_property(srna, "sample_method", PROP_ENUM, PROP_NONE);
361         RNA_def_property_enum_sdna(prop, NULL, "ao_samp_method");
362         RNA_def_property_enum_items(prop, prop_sample_method_items);
363         RNA_def_property_ui_text(prop, "Sample Method", "Method for generating shadow samples (for Raytrace)");
364         RNA_def_property_update(prop, 0, "rna_World_update");
365 }
366
367 static void rna_def_world_mist(BlenderRNA *brna)
368 {
369         StructRNA *srna;
370         PropertyRNA *prop;
371         
372         static EnumPropertyItem falloff_items[] = {
373                 {0, "QUADRATIC", 0, "Quadratic", "Mist uses quadratic progression"},
374                 {1, "LINEAR", 0, "Linear", "Mist uses linear progression"},
375                 {2, "INVERSE_QUADRATIC", 0, "Inverse Quadratic", "Mist uses inverse quadratic progression"},
376                 {0, NULL, 0, NULL, NULL}};
377
378         srna= RNA_def_struct(brna, "WorldMistSettings", NULL);
379         RNA_def_struct_sdna(srna, "World");
380         RNA_def_struct_nested(brna, srna, "World");
381         RNA_def_struct_ui_text(srna, "World Mist", "Mist settings for a World data-block");
382
383         prop= RNA_def_property(srna, "use_mist", PROP_BOOLEAN, PROP_NONE);
384         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_MIST);
385         RNA_def_property_ui_text(prop, "Use Mist", "Occlude objects with the environment color as they are further away");
386         RNA_def_property_update(prop, 0, "rna_World_draw_update");
387
388         prop= RNA_def_property(srna, "intensity", PROP_FLOAT, PROP_NONE);
389         RNA_def_property_float_sdna(prop, NULL, "misi");
390         RNA_def_property_range(prop, 0, 1);
391         RNA_def_property_ui_text(prop, "Minimum", "Overall minimum intensity of the mist effect");
392         RNA_def_property_update(prop, 0, "rna_World_update");
393
394         prop= RNA_def_property(srna, "start", PROP_FLOAT, PROP_DISTANCE);
395         RNA_def_property_float_sdna(prop, NULL, "miststa");
396         RNA_def_property_range(prop, 0, FLT_MAX);
397         RNA_def_property_ui_range(prop, 0, 10000, 10, 2);
398         RNA_def_property_ui_text(prop, "Start", "Starting distance of the mist, measured from the camera");
399         RNA_def_property_update(prop, 0, "rna_World_draw_mist_update");
400
401         prop= RNA_def_property(srna, "depth", PROP_FLOAT, PROP_DISTANCE);
402         RNA_def_property_float_sdna(prop, NULL, "mistdist");
403         RNA_def_property_range(prop, 0, FLT_MAX);
404         RNA_def_property_ui_range(prop, 0, 10000, 10, 2);
405         RNA_def_property_ui_text(prop, "Depth", "Distance over which the mist effect fades in");
406         RNA_def_property_update(prop, 0, "rna_World_draw_mist_update");
407
408         prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_DISTANCE);
409         RNA_def_property_float_sdna(prop, NULL, "misthi");
410         RNA_def_property_range(prop, 0, 100);
411         RNA_def_property_ui_text(prop, "Height", "Control how much mist density decreases with height");
412         RNA_def_property_update(prop, 0, "rna_World_update");
413         
414         prop= RNA_def_property(srna, "falloff", PROP_ENUM, PROP_NONE);
415         RNA_def_property_enum_sdna(prop, NULL, "mistype");
416         RNA_def_property_enum_items(prop, falloff_items);
417         RNA_def_property_ui_text(prop, "Falloff", "Type of transition used to fade mist");
418         RNA_def_property_update(prop, 0, "rna_World_update");
419 }
420
421 static void rna_def_world_stars(BlenderRNA *brna)
422 {
423         StructRNA *srna;
424         PropertyRNA *prop;
425
426         srna= RNA_def_struct(brna, "WorldStarsSettings", NULL);
427         RNA_def_struct_sdna(srna, "World");
428         RNA_def_struct_nested(brna, srna, "World");
429         RNA_def_struct_ui_text(srna, "World Stars", "Stars settings for a World data-block");
430
431         prop= RNA_def_property(srna, "use_stars", PROP_BOOLEAN, PROP_NONE);
432         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_STARS);
433         RNA_def_property_ui_text(prop, "Use Stars", "Enable starfield generation");
434         RNA_def_property_update(prop, 0, "rna_World_stars_update");
435
436         prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
437         RNA_def_property_float_sdna(prop, NULL, "starsize");
438         RNA_def_property_range(prop, 0, 10);
439         RNA_def_property_ui_text(prop, "Size", "Average screen dimension of stars");
440         RNA_def_property_update(prop, 0, "rna_World_draw_update"); /* use normal update since this isnt visualized */
441
442         prop= RNA_def_property(srna, "distance_min", PROP_FLOAT, PROP_DISTANCE);
443         RNA_def_property_float_sdna(prop, NULL, "starmindist");
444         RNA_def_property_range(prop, 0, 1000);
445         RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance to the camera for stars");
446         RNA_def_property_update(prop, 0, "rna_World_stars_update");
447
448         prop= RNA_def_property(srna, "average_separation", PROP_FLOAT, PROP_NONE);
449         RNA_def_property_float_sdna(prop, NULL, "stardist");
450         RNA_def_property_range(prop, 2, 1000);
451         RNA_def_property_ui_text(prop, "Average Separation", "Average distance between any two stars");
452         RNA_def_property_update(prop, 0, "rna_World_stars_update");
453
454         prop= RNA_def_property(srna, "color_random", PROP_FLOAT, PROP_NONE);
455         RNA_def_property_float_sdna(prop, NULL, "starcolnoise");
456         RNA_def_property_range(prop, 0, 1);
457         RNA_def_property_ui_text(prop, "Color Randomization", "Randomize star colors");
458         RNA_def_property_update(prop, 0, "rna_World_stars_update");
459 }
460
461 void RNA_def_world(BlenderRNA *brna)
462 {
463         StructRNA *srna;
464         PropertyRNA *prop;
465
466 /*
467         static EnumPropertyItem physics_engine_items[] = {
468                 {WOPHY_NONE, "NONE", 0, "None", ""},
469                 //{WOPHY_ENJI, "ENJI", 0, "Enji", ""},
470                 //{WOPHY_SUMO, "SUMO", 0, "Sumo (Deprecated)", ""},
471                 //{WOPHY_DYNAMO, "DYNAMO", 0, "Dynamo", ""},
472                 //{WOPHY_ODE, "ODE", 0, "ODE", ""},
473                 {WOPHY_BULLET, "BULLET", 0, "Bullet", ""},
474                 {0, NULL, 0, NULL, NULL}};
475 */
476
477         srna= RNA_def_struct(brna, "World", "ID");
478         RNA_def_struct_ui_text(srna, "World", "World datablock describing the environment and ambient lighting of a scene");
479         RNA_def_struct_ui_icon(srna, ICON_WORLD_DATA);
480
481         rna_def_animdata_common(srna);
482         rna_def_mtex_common(brna, srna, "rna_World_mtex_begin", "rna_World_active_texture_get",
483                 "rna_World_active_texture_set", NULL, "WorldTextureSlot", "WorldTextureSlots", "rna_World_update");
484
485         /* colors */
486         prop= RNA_def_property(srna, "horizon_color", PROP_FLOAT, PROP_COLOR);
487         RNA_def_property_float_sdna(prop, NULL, "horr");
488         RNA_def_property_array(prop, 3);
489         RNA_def_property_ui_text(prop, "Horizon Color", "Color at the horizon");
490         /* RNA_def_property_update(prop, 0, "rna_World_update"); */
491         /* render-only uses this */
492         RNA_def_property_update(prop, NC_WORLD|ND_WORLD_DRAW, "rna_World_update");
493
494         
495         prop= RNA_def_property(srna, "zenith_color", PROP_FLOAT, PROP_COLOR);
496         RNA_def_property_float_sdna(prop, NULL, "zenr");
497         RNA_def_property_array(prop, 3);
498         RNA_def_property_ui_text(prop, "Zenith Color", "Color at the zenith");
499         RNA_def_property_update(prop, 0, "rna_World_update");
500
501         prop= RNA_def_property(srna, "ambient_color", PROP_FLOAT, PROP_COLOR);
502         RNA_def_property_float_sdna(prop, NULL, "ambr");
503         RNA_def_property_array(prop, 3);
504         RNA_def_property_ui_text(prop, "Ambient Color", "Ambient color of the world");
505         RNA_def_property_update(prop, 0, "rna_World_update");
506
507         /* exp, range */
508         prop= RNA_def_property(srna, "exposure", PROP_FLOAT, PROP_NONE);
509         RNA_def_property_float_sdna(prop, NULL, "exp");
510         RNA_def_property_range(prop, 0.0, 1.0);
511         RNA_def_property_ui_text(prop, "Exposure", "Amount of exponential color correction for light");
512         RNA_def_property_update(prop, 0, "rna_World_update");
513
514         prop= RNA_def_property(srna, "color_range", PROP_FLOAT, PROP_NONE);
515         RNA_def_property_float_sdna(prop, NULL, "range");
516         RNA_def_property_range(prop, 0.2, 5.0);
517         RNA_def_property_ui_text(prop, "Range", "The color range that will be mapped to 0-1");
518         RNA_def_property_update(prop, 0, "rna_World_update");
519
520         /* sky type */
521         prop= RNA_def_property(srna, "use_sky_blend", PROP_BOOLEAN, PROP_NONE);
522         RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYBLEND);
523         RNA_def_property_ui_text(prop, "Blend Sky", "Render background with natural progression from horizon to zenith");
524         RNA_def_property_update(prop, 0, "rna_World_update");
525
526         prop= RNA_def_property(srna, "use_sky_paper", PROP_BOOLEAN, PROP_NONE);
527         RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYPAPER);
528         RNA_def_property_ui_text(prop, "Paper Sky", "Flatten blend or texture coordinates");
529         RNA_def_property_update(prop, 0, "rna_World_update");
530
531         prop= RNA_def_property(srna, "use_sky_real", PROP_BOOLEAN, PROP_NONE);
532         RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYREAL);
533         RNA_def_property_ui_text(prop, "Real Sky", "Render background with a real horizon, relative to the camera angle");
534         RNA_def_property_update(prop, 0, "rna_World_update");
535
536         /* nested structs */
537         prop= RNA_def_property(srna, "light_settings", PROP_POINTER, PROP_NONE);
538         RNA_def_property_flag(prop, PROP_NEVER_NULL);
539         RNA_def_property_struct_type(prop, "WorldLighting");
540         RNA_def_property_pointer_funcs(prop, "rna_World_lighting_get", NULL, NULL, NULL);
541         RNA_def_property_ui_text(prop, "Lighting", "World lighting settings");
542
543         prop= RNA_def_property(srna, "mist_settings", PROP_POINTER, PROP_NONE);
544         RNA_def_property_flag(prop, PROP_NEVER_NULL);
545         RNA_def_property_struct_type(prop, "WorldMistSettings");
546         RNA_def_property_pointer_funcs(prop, "rna_World_mist_get", NULL, NULL, NULL);
547         RNA_def_property_ui_text(prop, "Mist", "World mist settings");
548
549         prop= RNA_def_property(srna, "star_settings", PROP_POINTER, PROP_NONE);
550         RNA_def_property_flag(prop, PROP_NEVER_NULL);
551         RNA_def_property_struct_type(prop, "WorldStarsSettings");
552         RNA_def_property_pointer_funcs(prop, "rna_World_stars_get", NULL, NULL, NULL);
553         RNA_def_property_ui_text(prop, "Stars", "World stars settings");
554
555         rna_def_lighting(brna);
556         rna_def_world_mist(brna);
557         rna_def_world_stars(brna);
558         rna_def_world_mtex(brna);
559 }
560
561 #endif