Related to #29092: make the working of the Mist Intensity option more clear in
[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         /* unused
165         prop= RNA_def_property(srna, "map_mist", PROP_BOOLEAN, PROP_NONE);
166         RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_MIST);
167         RNA_def_property_ui_text(prop, "Mist", "Causes the texture to affect the intensity of the mist");*/
168
169         prop= RNA_def_property(srna, "texture_coords", PROP_ENUM, PROP_NONE);
170         RNA_def_property_enum_sdna(prop, NULL, "texco");
171         RNA_def_property_enum_items(prop, texco_items);
172         RNA_def_property_ui_text(prop, "Texture Coordinates", "Texture coordinates used to map the texture onto the background");
173         RNA_def_property_update(prop, 0, "rna_World_update");
174
175         prop= RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
176         RNA_def_property_pointer_sdna(prop, NULL, "object");
177         RNA_def_property_struct_type(prop, "Object");
178         RNA_def_property_flag(prop, PROP_EDITABLE);
179         RNA_def_property_ui_text(prop, "Object", "Object to use for mapping with Object texture coordinates");
180         RNA_def_property_update(prop, 0, "rna_World_update");
181
182         prop= RNA_def_property(srna, "blend_factor", PROP_FLOAT, PROP_NONE);
183         RNA_def_property_float_sdna(prop, NULL, "blendfac");
184         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
185         RNA_def_property_ui_text(prop, "Blend Factor", "Amount texture affects color progression of the background");
186         RNA_def_property_update(prop, 0, "rna_World_update");
187
188         prop= RNA_def_property(srna, "horizon_factor", PROP_FLOAT, PROP_NONE);
189         RNA_def_property_float_sdna(prop, NULL, "colfac");
190         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
191         RNA_def_property_ui_text(prop, "Horizon Factor", "Amount texture affects color of the horizon");
192         RNA_def_property_update(prop, 0, "rna_World_update");
193
194         prop= RNA_def_property(srna, "zenith_up_factor", PROP_FLOAT, PROP_NONE);
195         RNA_def_property_float_sdna(prop, NULL, "zenupfac");
196         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
197         RNA_def_property_ui_text(prop, "Zenith Up Factor", "Amount texture affects color of the zenith above");
198         RNA_def_property_update(prop, 0, "rna_World_update");
199
200         prop= RNA_def_property(srna, "zenith_down_factor", PROP_FLOAT, PROP_NONE);
201         RNA_def_property_float_sdna(prop, NULL, "zendownfac");
202         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
203         RNA_def_property_ui_text(prop, "Zenith Down Factor", "Amount texture affects color of the zenith below");
204         RNA_def_property_update(prop, 0, "rna_World_update");
205 }
206
207 static void rna_def_lighting(BlenderRNA *brna)
208 {
209         StructRNA *srna;
210         PropertyRNA *prop;
211
212         static EnumPropertyItem blend_mode_items[] = {
213                 {WO_AOMUL, "MULTIPLY", 0, "Multiply", "Multiply direct lighting with ambient occlusion, darkening the result"},
214                 {WO_AOADD, "ADD", 0, "Add", "Add light and shadow"},
215                 {0, NULL, 0, NULL, NULL}};
216
217         static EnumPropertyItem prop_color_items[] = {
218                 {WO_AOPLAIN, "PLAIN", 0, "White", "Plain diffuse energy (white.)"},
219                 {WO_AOSKYCOL, "SKY_COLOR", 0, "Sky Color", "Use horizon and zenith color for diffuse energy"},
220                 {WO_AOSKYTEX, "SKY_TEXTURE", 0, "Sky Texture", "Does full Sky texture render for diffuse energy"},
221                 {0, NULL, 0, NULL, NULL}};
222
223         static EnumPropertyItem prop_sample_method_items[] = {
224                 {WO_AOSAMP_CONSTANT, "CONSTANT_JITTERED", 0, "Constant Jittered", "Fastest and gives the most noise"},
225                 {WO_AOSAMP_HALTON, "ADAPTIVE_QMC", 0, "Adaptive QMC", "Fast in high-contrast areas"},
226                 {WO_AOSAMP_HAMMERSLEY, "CONSTANT_QMC", 0, "Constant QMC", "Best quality"},
227                 {0, NULL, 0, NULL, NULL}};
228
229         static EnumPropertyItem prop_gather_method_items[] = {
230                 {WO_AOGATHER_RAYTRACE, "RAYTRACE", 0, "Raytrace", "Accurate, but slow when noise-free results are required"},
231                 {WO_AOGATHER_APPROX, "APPROXIMATE", 0, "Approximate", "Inaccurate, but faster and without noise"},
232                 {0, NULL, 0, NULL, NULL}};
233
234         srna= RNA_def_struct(brna, "WorldLighting", NULL);
235         RNA_def_struct_sdna(srna, "World");
236         RNA_def_struct_nested(brna, srna, "World");
237         RNA_def_struct_ui_text(srna, "Lighting", "Lighting for a World datablock");
238
239         /* ambient occlusion */
240         prop= RNA_def_property(srna, "use_ambient_occlusion", PROP_BOOLEAN, PROP_NONE);
241         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_AMB_OCC);
242         RNA_def_property_ui_text(prop, "Use Ambient Occlusion", "Use Ambient Occlusion to add shadowing based on distance between objects");
243         RNA_def_property_update(prop, 0, "rna_World_update");
244
245         prop= RNA_def_property(srna, "ao_factor", PROP_FLOAT, PROP_FACTOR);
246         RNA_def_property_float_sdna(prop, NULL, "aoenergy");
247         RNA_def_property_range(prop, 0, INT_MAX);
248         RNA_def_property_ui_range(prop, 0, 1, 0.1, 2);
249         RNA_def_property_ui_text(prop, "Factor", "Factor for ambient occlusion blending");
250         RNA_def_property_update(prop, 0, "rna_World_update");
251
252         prop= RNA_def_property(srna, "ao_blend_type", PROP_ENUM, PROP_NONE);
253         RNA_def_property_enum_sdna(prop, NULL, "aomix");
254         RNA_def_property_enum_items(prop, blend_mode_items);
255         RNA_def_property_ui_text(prop, "Blend Mode", "Defines how AO mixes with material shading");
256         RNA_def_property_update(prop, 0, "rna_World_update");
257
258         /* environment lighting */
259         prop= RNA_def_property(srna, "use_environment_light", PROP_BOOLEAN, PROP_NONE);
260         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_ENV_LIGHT);
261         RNA_def_property_ui_text(prop, "Use Environment Lighting", "Add light coming from the environment");
262         RNA_def_property_update(prop, 0, "rna_World_update");
263
264         prop= RNA_def_property(srna, "environment_energy", PROP_FLOAT, PROP_NONE);
265         RNA_def_property_float_sdna(prop, NULL, "ao_env_energy");
266         RNA_def_property_ui_range(prop, 0, FLT_MAX, 1, 3);
267         RNA_def_property_ui_text(prop, "Environment Color", "Defines the strength of environment light");
268         RNA_def_property_update(prop, 0, "rna_World_update");
269
270         prop= RNA_def_property(srna, "environment_color", PROP_ENUM, PROP_NONE);
271         RNA_def_property_enum_sdna(prop, NULL, "aocolor");
272         RNA_def_property_enum_items(prop, prop_color_items);
273         RNA_def_property_ui_text(prop, "Environment Color", "Defines where the color of the environment light comes from");
274         RNA_def_property_update(prop, 0, "rna_World_update");
275
276         /* indirect lighting */
277         prop= RNA_def_property(srna, "use_indirect_light", PROP_BOOLEAN, PROP_NONE);
278         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_INDIRECT_LIGHT);
279         RNA_def_property_ui_text(prop, "Use Indirect Lighting", "Add indirect light bouncing of surrounding objects");
280         RNA_def_property_update(prop, 0, "rna_World_update");
281
282         prop= RNA_def_property(srna, "indirect_factor", PROP_FLOAT, PROP_FACTOR);
283         RNA_def_property_float_sdna(prop, NULL, "ao_indirect_energy");
284         RNA_def_property_range(prop, 0, INT_MAX);
285         RNA_def_property_ui_range(prop, 0, 1, 0.1, 2);
286         RNA_def_property_ui_text(prop, "Indirect Factor", "Factor for how much surrounding objects contribute to light");
287         RNA_def_property_update(prop, 0, "rna_World_update");
288
289         prop= RNA_def_property(srna, "indirect_bounces", PROP_INT, PROP_UNSIGNED);
290         RNA_def_property_int_sdna(prop, NULL, "ao_indirect_bounces");
291         RNA_def_property_range(prop, 1, SHRT_MAX);
292         RNA_def_property_ui_text(prop, "Bounces", "Number of indirect diffuse light bounces");
293         RNA_def_property_update(prop, 0, "rna_World_update");
294
295         /* gathering parameters */
296         prop= RNA_def_property(srna, "gather_method", PROP_ENUM, PROP_NONE);
297         RNA_def_property_enum_sdna(prop, NULL, "ao_gather_method");
298         RNA_def_property_enum_items(prop, prop_gather_method_items);
299         RNA_def_property_ui_text(prop, "Gather Method", "");
300         RNA_def_property_update(prop, 0, "rna_World_update");
301
302         prop= RNA_def_property(srna, "passes", PROP_INT, PROP_NONE);
303         RNA_def_property_int_sdna(prop, NULL, "ao_approx_passes");
304         RNA_def_property_range(prop, 0, 10);
305         RNA_def_property_ui_text(prop, "Passes", "Number of preprocessing passes to reduce overocclusion");
306         RNA_def_property_update(prop, 0, "rna_World_update");
307
308         prop= RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
309         RNA_def_property_float_sdna(prop, NULL, "aodist");
310         RNA_def_property_ui_text(prop, "Distance", "Length of rays, defines how far away other faces give occlusion effect");
311         RNA_def_property_update(prop, 0, "rna_World_update");
312
313         prop= RNA_def_property(srna, "falloff_strength", PROP_FLOAT, PROP_NONE);
314         RNA_def_property_float_sdna(prop, NULL, "aodistfac");
315         RNA_def_property_ui_text(prop, "Strength", "Attenuation falloff strength, the higher, the less influence distant objects have");
316         RNA_def_property_update(prop, 0, "rna_World_update");
317
318         prop= RNA_def_property(srna, "bias", PROP_FLOAT, PROP_NONE);
319         RNA_def_property_float_sdna(prop, NULL, "aobias");
320         RNA_def_property_range(prop, 0, 0.5);
321         RNA_def_property_ui_text(prop, "Bias", "Bias (in radians) to prevent smoothed faces from showing banding (for Raytrace Constant Jittered)");
322         RNA_def_property_update(prop, 0, "rna_World_update");
323
324         prop= RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
325         RNA_def_property_float_sdna(prop, NULL, "ao_adapt_thresh");
326         RNA_def_property_range(prop, 0, 1);
327         RNA_def_property_ui_text(prop, "Threshold", "Samples below this threshold will be considered fully shadowed/unshadowed and skipped (for Raytrace Adaptive QMC)");
328         RNA_def_property_update(prop, 0, "rna_World_update");
329
330         prop= RNA_def_property(srna, "adapt_to_speed", PROP_FLOAT, PROP_NONE);
331         RNA_def_property_float_sdna(prop, NULL, "ao_adapt_speed_fac");
332         RNA_def_property_range(prop, 0, 1);
333         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)");
334         RNA_def_property_update(prop, 0, "rna_World_update");
335
336         prop= RNA_def_property(srna, "error_threshold", PROP_FLOAT, PROP_NONE);
337         RNA_def_property_float_sdna(prop, NULL, "ao_approx_error");
338         RNA_def_property_range(prop, 0.0001, 10);
339         RNA_def_property_ui_text(prop, "Error Tolerance", "Low values are slower and higher quality");
340         RNA_def_property_update(prop, 0, "rna_World_update");
341
342         prop= RNA_def_property(srna, "correction", PROP_FLOAT, PROP_NONE);
343         RNA_def_property_float_sdna(prop, NULL, "ao_approx_correction");
344         RNA_def_property_range(prop, 0, 1);
345         RNA_def_property_ui_range(prop, 0, 1, 0.1, 2);
346         RNA_def_property_ui_text(prop, "Correction", "Ad-hoc correction for over-occlusion due to the approximation");
347         RNA_def_property_update(prop, 0, "rna_World_update");
348
349         prop= RNA_def_property(srna, "use_falloff", PROP_BOOLEAN, PROP_NONE);
350         RNA_def_property_boolean_sdna(prop, NULL, "aomode", WO_AODIST);
351         RNA_def_property_ui_text(prop, "Falloff", "Distance will be used to attenuate shadows");
352         RNA_def_property_update(prop, 0, "rna_World_update");
353
354         prop= RNA_def_property(srna, "use_cache", PROP_BOOLEAN, PROP_NONE);
355         RNA_def_property_boolean_sdna(prop, NULL, "aomode", WO_AOCACHE);
356         RNA_def_property_ui_text(prop, "Pixel Cache", "Cache AO results in pixels and interpolate over neighbouring pixels for speedup");
357         RNA_def_property_update(prop, 0, "rna_World_update");
358
359         prop= RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
360         RNA_def_property_int_sdna(prop, NULL, "aosamp");
361         RNA_def_property_range(prop, 1, 128);
362         RNA_def_property_ui_text(prop, "Samples", "Amount of ray samples. Higher values give smoother results and longer rendering times");
363         RNA_def_property_update(prop, 0, "rna_World_update");
364
365         prop= RNA_def_property(srna, "sample_method", PROP_ENUM, PROP_NONE);
366         RNA_def_property_enum_sdna(prop, NULL, "ao_samp_method");
367         RNA_def_property_enum_items(prop, prop_sample_method_items);
368         RNA_def_property_ui_text(prop, "Sample Method", "Method for generating shadow samples (for Raytrace)");
369         RNA_def_property_update(prop, 0, "rna_World_update");
370 }
371
372 static void rna_def_world_mist(BlenderRNA *brna)
373 {
374         StructRNA *srna;
375         PropertyRNA *prop;
376         
377         static EnumPropertyItem falloff_items[] = {
378                 {0, "QUADRATIC", 0, "Quadratic", "Mist uses quadratic progression"},
379                 {1, "LINEAR", 0, "Linear", "Mist uses linear progression"},
380                 {2, "INVERSE_QUADRATIC", 0, "Inverse Quadratic", "Mist uses inverse quadratic progression"},
381                 {0, NULL, 0, NULL, NULL}};
382
383         srna= RNA_def_struct(brna, "WorldMistSettings", NULL);
384         RNA_def_struct_sdna(srna, "World");
385         RNA_def_struct_nested(brna, srna, "World");
386         RNA_def_struct_ui_text(srna, "World Mist", "Mist settings for a World data-block");
387
388         prop= RNA_def_property(srna, "use_mist", PROP_BOOLEAN, PROP_NONE);
389         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_MIST);
390         RNA_def_property_ui_text(prop, "Use Mist", "Occlude objects with the environment color as they are further away");
391         RNA_def_property_update(prop, 0, "rna_World_draw_update");
392
393         prop= RNA_def_property(srna, "intensity", PROP_FLOAT, PROP_NONE);
394         RNA_def_property_float_sdna(prop, NULL, "misi");
395         RNA_def_property_range(prop, 0, 1);
396         RNA_def_property_ui_text(prop, "Minimum", "Overall minimum intensity of the mist effect");
397         RNA_def_property_update(prop, 0, "rna_World_update");
398
399         prop= RNA_def_property(srna, "start", PROP_FLOAT, PROP_DISTANCE);
400         RNA_def_property_float_sdna(prop, NULL, "miststa");
401         RNA_def_property_range(prop, 0, FLT_MAX);
402         RNA_def_property_ui_range(prop, 0, 10000, 10, 2);
403         RNA_def_property_ui_text(prop, "Start", "Starting distance of the mist, measured from the camera");
404         RNA_def_property_update(prop, 0, "rna_World_draw_mist_update");
405
406         prop= RNA_def_property(srna, "depth", PROP_FLOAT, PROP_DISTANCE);
407         RNA_def_property_float_sdna(prop, NULL, "mistdist");
408         RNA_def_property_range(prop, 0, FLT_MAX);
409         RNA_def_property_ui_range(prop, 0, 10000, 10, 2);
410         RNA_def_property_ui_text(prop, "Depth", "Distance over which the mist effect fades in");
411         RNA_def_property_update(prop, 0, "rna_World_draw_mist_update");
412
413         prop= RNA_def_property(srna, "height", PROP_FLOAT, PROP_DISTANCE);
414         RNA_def_property_float_sdna(prop, NULL, "misthi");
415         RNA_def_property_range(prop, 0, 100);
416         RNA_def_property_ui_text(prop, "Height", "Control how much mist density decreases with height");
417         RNA_def_property_update(prop, 0, "rna_World_update");
418         
419         prop= RNA_def_property(srna, "falloff", PROP_ENUM, PROP_NONE);
420         RNA_def_property_enum_sdna(prop, NULL, "mistype");
421         RNA_def_property_enum_items(prop, falloff_items);
422         RNA_def_property_ui_text(prop, "Falloff", "Type of transition used to fade mist");
423         RNA_def_property_update(prop, 0, "rna_World_update");
424 }
425
426 static void rna_def_world_stars(BlenderRNA *brna)
427 {
428         StructRNA *srna;
429         PropertyRNA *prop;
430
431         srna= RNA_def_struct(brna, "WorldStarsSettings", NULL);
432         RNA_def_struct_sdna(srna, "World");
433         RNA_def_struct_nested(brna, srna, "World");
434         RNA_def_struct_ui_text(srna, "World Stars", "Stars settings for a World data-block");
435
436         prop= RNA_def_property(srna, "use_stars", PROP_BOOLEAN, PROP_NONE);
437         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_STARS);
438         RNA_def_property_ui_text(prop, "Use Stars", "Enable starfield generation");
439         RNA_def_property_update(prop, 0, "rna_World_stars_update");
440
441         prop= RNA_def_property(srna, "size", PROP_FLOAT, PROP_NONE);
442         RNA_def_property_float_sdna(prop, NULL, "starsize");
443         RNA_def_property_range(prop, 0, 10);
444         RNA_def_property_ui_text(prop, "Size", "Average screen dimension of stars");
445         RNA_def_property_update(prop, 0, "rna_World_draw_update"); /* use normal update since this isnt visualized */
446
447         prop= RNA_def_property(srna, "distance_min", PROP_FLOAT, PROP_DISTANCE);
448         RNA_def_property_float_sdna(prop, NULL, "starmindist");
449         RNA_def_property_range(prop, 0, 1000);
450         RNA_def_property_ui_text(prop, "Minimum Distance", "Minimum distance to the camera for stars");
451         RNA_def_property_update(prop, 0, "rna_World_stars_update");
452
453         prop= RNA_def_property(srna, "average_separation", PROP_FLOAT, PROP_NONE);
454         RNA_def_property_float_sdna(prop, NULL, "stardist");
455         RNA_def_property_range(prop, 2, 1000);
456         RNA_def_property_ui_text(prop, "Average Separation", "Average distance between any two stars");
457         RNA_def_property_update(prop, 0, "rna_World_stars_update");
458
459         prop= RNA_def_property(srna, "color_random", PROP_FLOAT, PROP_NONE);
460         RNA_def_property_float_sdna(prop, NULL, "starcolnoise");
461         RNA_def_property_range(prop, 0, 1);
462         RNA_def_property_ui_text(prop, "Color Randomization", "Randomize star colors");
463         RNA_def_property_update(prop, 0, "rna_World_stars_update");
464         
465         /* unused
466         prop= RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR);
467         RNA_def_property_float_sdna(prop, NULL, "starr");
468         RNA_def_property_array(prop, 3);
469         RNA_def_property_ui_text(prop, "Color", "Stars color");
470         RNA_def_property_update(prop, 0, "rna_World_update");*/
471 }
472
473 void RNA_def_world(BlenderRNA *brna)
474 {
475         StructRNA *srna;
476         PropertyRNA *prop;
477
478 /*
479         static EnumPropertyItem physics_engine_items[] = {
480                 {WOPHY_NONE, "NONE", 0, "None", ""},
481                 //{WOPHY_ENJI, "ENJI", 0, "Enji", ""},
482                 //{WOPHY_SUMO, "SUMO", 0, "Sumo (Deprecated)", ""},
483                 //{WOPHY_DYNAMO, "DYNAMO", 0, "Dynamo", ""},
484                 //{WOPHY_ODE, "ODE", 0, "ODE", ""},
485                 {WOPHY_BULLET, "BULLET", 0, "Bullet", ""},
486                 {0, NULL, 0, NULL, NULL}};
487 */
488
489         srna= RNA_def_struct(brna, "World", "ID");
490         RNA_def_struct_ui_text(srna, "World", "World datablock describing the environment and ambient lighting of a scene");
491         RNA_def_struct_ui_icon(srna, ICON_WORLD_DATA);
492
493         rna_def_animdata_common(srna);
494         rna_def_mtex_common(brna, srna, "rna_World_mtex_begin", "rna_World_active_texture_get",
495                 "rna_World_active_texture_set", NULL, "WorldTextureSlot", "WorldTextureSlots", "rna_World_update");
496
497         /* colors */
498         prop= RNA_def_property(srna, "horizon_color", PROP_FLOAT, PROP_COLOR);
499         RNA_def_property_float_sdna(prop, NULL, "horr");
500         RNA_def_property_array(prop, 3);
501         RNA_def_property_ui_text(prop, "Horizon Color", "Color at the horizon");
502         /* RNA_def_property_update(prop, 0, "rna_World_update"); */
503         /* render-only uses this */
504         RNA_def_property_update(prop, NC_WORLD|ND_WORLD_DRAW, "rna_World_update");
505
506         
507         prop= RNA_def_property(srna, "zenith_color", PROP_FLOAT, PROP_COLOR);
508         RNA_def_property_float_sdna(prop, NULL, "zenr");
509         RNA_def_property_array(prop, 3);
510         RNA_def_property_ui_text(prop, "Zenith Color", "Color at the zenith");
511         RNA_def_property_update(prop, 0, "rna_World_update");
512
513         prop= RNA_def_property(srna, "ambient_color", PROP_FLOAT, PROP_COLOR);
514         RNA_def_property_float_sdna(prop, NULL, "ambr");
515         RNA_def_property_array(prop, 3);
516         RNA_def_property_ui_text(prop, "Ambient Color", "Ambient color of the world");
517         RNA_def_property_update(prop, 0, "rna_World_update");
518
519         /* exp, range */
520         prop= RNA_def_property(srna, "exposure", PROP_FLOAT, PROP_NONE);
521         RNA_def_property_float_sdna(prop, NULL, "exp");
522         RNA_def_property_range(prop, 0.0, 1.0);
523         RNA_def_property_ui_text(prop, "Exposure", "Amount of exponential color correction for light");
524         RNA_def_property_update(prop, 0, "rna_World_update");
525
526         prop= RNA_def_property(srna, "color_range", PROP_FLOAT, PROP_NONE);
527         RNA_def_property_float_sdna(prop, NULL, "range");
528         RNA_def_property_range(prop, 0.2, 5.0);
529         RNA_def_property_ui_text(prop, "Range", "The color range that will be mapped to 0-1");
530         RNA_def_property_update(prop, 0, "rna_World_update");
531
532         /* sky type */
533         prop= RNA_def_property(srna, "use_sky_blend", PROP_BOOLEAN, PROP_NONE);
534         RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYBLEND);
535         RNA_def_property_ui_text(prop, "Blend Sky", "Render background with natural progression from horizon to zenith");
536         RNA_def_property_update(prop, 0, "rna_World_update");
537
538         prop= RNA_def_property(srna, "use_sky_paper", PROP_BOOLEAN, PROP_NONE);
539         RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYPAPER);
540         RNA_def_property_ui_text(prop, "Paper Sky", "Flatten blend or texture coordinates");
541         RNA_def_property_update(prop, 0, "rna_World_update");
542
543         prop= RNA_def_property(srna, "use_sky_real", PROP_BOOLEAN, PROP_NONE);
544         RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYREAL);
545         RNA_def_property_ui_text(prop, "Real Sky", "Render background with a real horizon, relative to the camera angle");
546         RNA_def_property_update(prop, 0, "rna_World_update");
547
548         /* nested structs */
549         prop= RNA_def_property(srna, "light_settings", PROP_POINTER, PROP_NONE);
550         RNA_def_property_flag(prop, PROP_NEVER_NULL);
551         RNA_def_property_struct_type(prop, "WorldLighting");
552         RNA_def_property_pointer_funcs(prop, "rna_World_lighting_get", NULL, NULL, NULL);
553         RNA_def_property_ui_text(prop, "Lighting", "World lighting settings");
554
555         prop= RNA_def_property(srna, "mist_settings", PROP_POINTER, PROP_NONE);
556         RNA_def_property_flag(prop, PROP_NEVER_NULL);
557         RNA_def_property_struct_type(prop, "WorldMistSettings");
558         RNA_def_property_pointer_funcs(prop, "rna_World_mist_get", NULL, NULL, NULL);
559         RNA_def_property_ui_text(prop, "Mist", "World mist settings");
560
561         prop= RNA_def_property(srna, "star_settings", PROP_POINTER, PROP_NONE);
562         RNA_def_property_flag(prop, PROP_NEVER_NULL);
563         RNA_def_property_struct_type(prop, "WorldStarsSettings");
564         RNA_def_property_pointer_funcs(prop, "rna_World_stars_get", NULL, NULL, NULL);
565         RNA_def_property_ui_text(prop, "Stars", "World stars settings");
566
567         rna_def_lighting(brna);
568         rna_def_world_mist(brna);
569         rna_def_world_stars(brna);
570         rna_def_world_mtex(brna);
571 }
572
573 #endif