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