Eevee: TAA: Remove 32 sample limit.
[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_context.h"
46 #include "BKE_main.h"
47 #include "BKE_texture.h"
48
49 #include "DEG_depsgraph.h"
50
51 #include "ED_node.h"
52
53 #include "WM_api.h"
54
55 static PointerRNA rna_World_lighting_get(PointerRNA *ptr)
56 {
57         return rna_pointer_inherit_refine(ptr, &RNA_WorldLighting, ptr->id.data);
58 }
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         DEG_id_tag_update(&wo->id, 0);
93         WM_main_add_notifier(NC_WORLD | ND_WORLD, wo);
94 }
95
96 #if 0
97 static void rna_World_draw_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
98 {
99         World *wo = ptr->id.data;
100
101         DEG_id_tag_update(&wo->id, 0);
102         WM_main_add_notifier(NC_WORLD | ND_WORLD_DRAW, wo);
103 }
104 #endif
105
106 static void rna_World_draw_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
107 {
108         World *wo = ptr->id.data;
109
110         DEG_id_tag_update(&wo->id, 0);
111         WM_main_add_notifier(NC_WORLD | ND_WORLD_DRAW, wo);
112         WM_main_add_notifier(NC_OBJECT | ND_DRAW, NULL);
113 }
114
115 static void rna_World_use_nodes_update(bContext *C, PointerRNA *ptr)
116 {
117         World *wrld = (World *)ptr->data;
118
119         if (wrld->use_nodes && wrld->nodetree == NULL)
120                 ED_node_shader_default(C, &wrld->id);
121         
122         rna_World_update(CTX_data_main(C), CTX_data_scene(C), ptr);
123         rna_World_draw_update(CTX_data_main(C), CTX_data_scene(C), ptr);
124 }
125
126 #else
127
128 static void rna_def_world_mtex(BlenderRNA *brna)
129 {
130         StructRNA *srna;
131         PropertyRNA *prop;
132
133         static EnumPropertyItem texco_items[] = {
134                 {TEXCO_VIEW, "VIEW", 0, "View", "Use view vector for the texture coordinates"},
135                 {TEXCO_GLOB, "GLOBAL", 0, "Global", "Use global coordinates for the texture coordinates (interior mist)"},
136                 {TEXCO_ANGMAP, "ANGMAP", 0, "AngMap", "Use 360 degree angular coordinates, e.g. for spherical light probes"},
137                 {TEXCO_H_SPHEREMAP, "SPHERE", 0, "Sphere", "For 360 degree panorama sky, spherical mapped, only top half"},
138                 {TEXCO_EQUIRECTMAP, "EQUIRECT", 0, "Equirectangular", "For 360 degree panorama sky, equirectangular mapping"},
139                 {TEXCO_H_TUBEMAP, "TUBE", 0, "Tube", "For 360 degree panorama sky, cylindrical mapped, only top half"},
140                 {TEXCO_OBJECT, "OBJECT", 0, "Object", "Use linked object's coordinates for texture coordinates"},
141                 {0, NULL, 0, NULL, NULL}
142         };
143
144         srna = RNA_def_struct(brna, "WorldTextureSlot", "TextureSlot");
145         RNA_def_struct_sdna(srna, "MTex");
146         RNA_def_struct_ui_text(srna, "World Texture Slot", "Texture slot for textures in a World data-block");
147
148         /* map to */
149         prop = RNA_def_property(srna, "use_map_blend", PROP_BOOLEAN, PROP_NONE);
150         RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_BLEND);
151         RNA_def_property_ui_text(prop, "Blend", "Affect the color progression of the background");
152         RNA_def_property_update(prop, 0, "rna_World_update");
153
154         prop = RNA_def_property(srna, "use_map_horizon", PROP_BOOLEAN, PROP_NONE);
155         RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_HORIZ);
156         RNA_def_property_ui_text(prop, "Horizon", "Affect the color of the horizon");
157         RNA_def_property_update(prop, 0, "rna_World_update");
158
159         prop = RNA_def_property(srna, "use_map_zenith_up", PROP_BOOLEAN, PROP_NONE);
160         RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_ZENUP);
161         RNA_def_property_ui_text(prop, "Zenith Up", "Affect the color of the zenith above");
162         RNA_def_property_update(prop, 0, "rna_World_update");
163
164         prop = RNA_def_property(srna, "use_map_zenith_down", PROP_BOOLEAN, PROP_NONE);
165         RNA_def_property_boolean_sdna(prop, NULL, "mapto", WOMAP_ZENDOWN);
166         RNA_def_property_ui_text(prop, "Zenith Down", "Affect the color of the zenith below");
167         RNA_def_property_update(prop, 0, "rna_World_update");
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",
173                                  "Texture coordinates used to map the texture onto the background");
174         RNA_def_property_update(prop, 0, "rna_World_update");
175
176         prop = RNA_def_property(srna, "object", PROP_POINTER, PROP_NONE);
177         RNA_def_property_pointer_sdna(prop, NULL, "object");
178         RNA_def_property_struct_type(prop, "Object");
179         RNA_def_property_flag(prop, PROP_EDITABLE);
180         RNA_def_property_ui_text(prop, "Object", "Object to use for mapping with Object texture coordinates");
181         RNA_def_property_update(prop, 0, "rna_World_update");
182
183         prop = RNA_def_property(srna, "blend_factor", PROP_FLOAT, PROP_NONE);
184         RNA_def_property_float_sdna(prop, NULL, "blendfac");
185         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
186         RNA_def_property_ui_text(prop, "Blend Factor", "Amount texture affects color progression of the background");
187         RNA_def_property_update(prop, 0, "rna_World_update");
188
189         prop = RNA_def_property(srna, "horizon_factor", PROP_FLOAT, PROP_NONE);
190         RNA_def_property_float_sdna(prop, NULL, "colfac");
191         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
192         RNA_def_property_ui_text(prop, "Horizon Factor", "Amount texture affects color of the horizon");
193         RNA_def_property_update(prop, 0, "rna_World_update");
194
195         prop = RNA_def_property(srna, "zenith_up_factor", PROP_FLOAT, PROP_NONE);
196         RNA_def_property_float_sdna(prop, NULL, "zenupfac");
197         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
198         RNA_def_property_ui_text(prop, "Zenith Up Factor", "Amount texture affects color of the zenith above");
199         RNA_def_property_update(prop, 0, "rna_World_update");
200
201         prop = RNA_def_property(srna, "zenith_down_factor", PROP_FLOAT, PROP_NONE);
202         RNA_def_property_float_sdna(prop, NULL, "zendownfac");
203         RNA_def_property_ui_range(prop, 0, 1, 10, 3);
204         RNA_def_property_ui_text(prop, "Zenith Down Factor", "Amount texture affects color of the zenith below");
205         RNA_def_property_update(prop, 0, "rna_World_update");
206 }
207
208 static void rna_def_lighting(BlenderRNA *brna)
209 {
210         StructRNA *srna;
211         PropertyRNA *prop;
212
213         static EnumPropertyItem blend_mode_items[] = {
214                 {WO_AOMUL, "MULTIPLY", 0, "Multiply", "Multiply direct lighting with ambient occlusion, darkening the result"},
215                 {WO_AOADD, "ADD", 0, "Add", "Add light and shadow"},
216                 {0, NULL, 0, NULL, NULL}
217         };
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
226         static EnumPropertyItem prop_sample_method_items[] = {
227                 {WO_AOSAMP_CONSTANT, "CONSTANT_JITTERED", 0, "Constant Jittered", "Fastest and gives the most noise"},
228                 {WO_AOSAMP_HALTON, "ADAPTIVE_QMC", 0, "Adaptive QMC", "Fast in high-contrast areas"},
229                 {WO_AOSAMP_HAMMERSLEY, "CONSTANT_QMC", 0, "Constant QMC", "Best quality"},
230                 {0, NULL, 0, NULL, NULL}
231         };
232
233         static EnumPropertyItem prop_gather_method_items[] = {
234                 {WO_AOGATHER_RAYTRACE, "RAYTRACE", 0, "Raytrace", "Accurate, but slow when noise-free results are required"},
235                 {WO_AOGATHER_APPROX, "APPROXIMATE", 0, "Approximate", "Inaccurate, but faster and without noise"},
236                 {0, NULL, 0, NULL, NULL}
237         };
238
239         srna = RNA_def_struct(brna, "WorldLighting", NULL);
240         RNA_def_struct_sdna(srna, "World");
241         RNA_def_struct_nested(brna, srna, "World");
242         RNA_def_struct_ui_text(srna, "Lighting", "Lighting for a World data-block");
243
244         /* ambient occlusion */
245         prop = RNA_def_property(srna, "use_ambient_occlusion", PROP_BOOLEAN, PROP_NONE);
246         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_AMB_OCC);
247         RNA_def_property_ui_text(prop, "Use Ambient Occlusion",
248                                  "Use Ambient Occlusion to add shadowing based on distance between objects");
249         RNA_def_property_update(prop, 0, "rna_World_update");
250
251         prop = RNA_def_property(srna, "ao_factor", PROP_FLOAT, PROP_FACTOR);
252         RNA_def_property_float_sdna(prop, NULL, "aoenergy");
253         RNA_def_property_range(prop, 0, INT_MAX);
254         RNA_def_property_ui_range(prop, 0, 1, 0.1, 2);
255         RNA_def_property_ui_text(prop, "Factor", "Factor for ambient occlusion blending");
256         RNA_def_property_update(prop, 0, "rna_World_update");
257
258         prop = RNA_def_property(srna, "ao_blend_type", PROP_ENUM, PROP_NONE);
259         RNA_def_property_enum_sdna(prop, NULL, "aomix");
260         RNA_def_property_enum_items(prop, blend_mode_items);
261         RNA_def_property_ui_text(prop, "Blend Mode", "Defines how AO mixes with material shading");
262         RNA_def_property_update(prop, 0, "rna_World_update");
263
264         /* environment lighting */
265         prop = RNA_def_property(srna, "use_environment_light", PROP_BOOLEAN, PROP_NONE);
266         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_ENV_LIGHT);
267         RNA_def_property_ui_text(prop, "Use Environment Lighting", "Add light coming from the environment");
268         RNA_def_property_update(prop, 0, "rna_World_draw_update");
269
270         prop = RNA_def_property(srna, "environment_energy", PROP_FLOAT, PROP_NONE);
271         RNA_def_property_float_sdna(prop, NULL, "ao_env_energy");
272         RNA_def_property_ui_range(prop, 0, FLT_MAX, 1, 3);
273         RNA_def_property_ui_text(prop, "Environment Color", "Defines the strength of environment light");
274         RNA_def_property_update(prop, 0, "rna_World_draw_update");
275
276         prop = RNA_def_property(srna, "environment_color", PROP_ENUM, PROP_NONE);
277         RNA_def_property_enum_sdna(prop, NULL, "aocolor");
278         RNA_def_property_enum_items(prop, prop_color_items);
279         RNA_def_property_ui_text(prop, "Environment Color", "Defines where the color of the environment light comes from");
280         RNA_def_property_update(prop, 0, "rna_World_draw_update");
281
282         /* indirect lighting */
283         prop = RNA_def_property(srna, "use_indirect_light", PROP_BOOLEAN, PROP_NONE);
284         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_INDIRECT_LIGHT);
285         RNA_def_property_ui_text(prop, "Use Indirect Lighting", "Add indirect light bouncing of surrounding objects");
286         RNA_def_property_update(prop, 0, "rna_World_update");
287
288         prop = RNA_def_property(srna, "indirect_factor", PROP_FLOAT, PROP_FACTOR);
289         RNA_def_property_float_sdna(prop, NULL, "ao_indirect_energy");
290         RNA_def_property_range(prop, 0, INT_MAX);
291         RNA_def_property_ui_range(prop, 0, 1, 0.1, 2);
292         RNA_def_property_ui_text(prop, "Indirect Factor", "Factor for how much surrounding objects contribute to light");
293         RNA_def_property_update(prop, 0, "rna_World_update");
294
295         prop = RNA_def_property(srna, "indirect_bounces", PROP_INT, PROP_UNSIGNED);
296         RNA_def_property_int_sdna(prop, NULL, "ao_indirect_bounces");
297         RNA_def_property_range(prop, 1, SHRT_MAX);
298         RNA_def_property_ui_text(prop, "Bounces", "Number of indirect diffuse light bounces");
299         RNA_def_property_update(prop, 0, "rna_World_update");
300
301         /* gathering parameters */
302         prop = RNA_def_property(srna, "gather_method", PROP_ENUM, PROP_NONE);
303         RNA_def_property_enum_sdna(prop, NULL, "ao_gather_method");
304         RNA_def_property_enum_items(prop, prop_gather_method_items);
305         RNA_def_property_ui_text(prop, "Gather Method", "");
306         RNA_def_property_update(prop, 0, "rna_World_update");
307
308         prop = RNA_def_property(srna, "passes", PROP_INT, PROP_NONE);
309         RNA_def_property_int_sdna(prop, NULL, "ao_approx_passes");
310         RNA_def_property_range(prop, 0, 10);
311         RNA_def_property_ui_text(prop, "Passes", "Number of preprocessing passes to reduce over-occlusion");
312         RNA_def_property_update(prop, 0, "rna_World_update");
313
314         prop = RNA_def_property(srna, "distance", PROP_FLOAT, PROP_DISTANCE);
315         RNA_def_property_float_sdna(prop, NULL, "aodist");
316         RNA_def_property_ui_text(prop, "Distance",
317                                  "Length of rays, defines how far away other faces give occlusion effect");
318         RNA_def_property_update(prop, 0, "rna_World_update");
319
320         prop = RNA_def_property(srna, "falloff_strength", PROP_FLOAT, PROP_NONE);
321         RNA_def_property_float_sdna(prop, NULL, "aodistfac");
322         RNA_def_property_ui_text(prop, "Strength",
323                                  "Attenuation falloff strength, the higher, the less influence distant objects have");
324         RNA_def_property_update(prop, 0, "rna_World_update");
325
326         prop = RNA_def_property(srna, "bias", PROP_FLOAT, PROP_NONE);
327         RNA_def_property_float_sdna(prop, NULL, "aobias");
328         RNA_def_property_range(prop, 0, 0.5);
329         RNA_def_property_ui_text(prop, "Bias",
330                                  "Bias (in radians) to prevent smoothed faces from showing banding "
331                                  "(for Raytrace Constant Jittered)");
332         RNA_def_property_update(prop, 0, "rna_World_update");
333
334         prop = RNA_def_property(srna, "threshold", PROP_FLOAT, PROP_NONE);
335         RNA_def_property_float_sdna(prop, NULL, "ao_adapt_thresh");
336         RNA_def_property_range(prop, 0, 1);
337         RNA_def_property_ui_text(prop, "Threshold",
338                                  "Samples below this threshold will be considered fully shadowed/unshadowed and skipped "
339                                  "(for Raytrace Adaptive QMC)");
340         RNA_def_property_update(prop, 0, "rna_World_update");
341
342         prop = RNA_def_property(srna, "adapt_to_speed", PROP_FLOAT, PROP_NONE);
343         RNA_def_property_float_sdna(prop, NULL, "ao_adapt_speed_fac");
344         RNA_def_property_range(prop, 0, 1);
345         RNA_def_property_ui_text(prop, "Adapt To Speed",
346                                  "Use the speed vector pass to reduce AO samples in fast moving pixels - "
347                                  "higher values result in more aggressive sample reduction "
348                                  "(requires Vec pass enabled, for Raytrace Adaptive QMC)");
349         RNA_def_property_update(prop, 0, "rna_World_update");
350
351         prop = RNA_def_property(srna, "error_threshold", PROP_FLOAT, PROP_NONE);
352         RNA_def_property_float_sdna(prop, NULL, "ao_approx_error");
353         RNA_def_property_range(prop, 0.0001, 10);
354         RNA_def_property_ui_text(prop, "Error Tolerance", "Low values are slower and higher quality");
355         RNA_def_property_update(prop, 0, "rna_World_update");
356
357         prop = RNA_def_property(srna, "correction", PROP_FLOAT, PROP_NONE);
358         RNA_def_property_float_sdna(prop, NULL, "ao_approx_correction");
359         RNA_def_property_range(prop, 0, 1);
360         RNA_def_property_ui_range(prop, 0, 1, 0.1, 2);
361         RNA_def_property_ui_text(prop, "Correction", "Ad-hoc correction for over-occlusion due to the approximation");
362         RNA_def_property_update(prop, 0, "rna_World_update");
363
364         prop = RNA_def_property(srna, "use_falloff", PROP_BOOLEAN, PROP_NONE);
365         RNA_def_property_boolean_sdna(prop, NULL, "aomode", WO_AODIST);
366         RNA_def_property_ui_text(prop, "Falloff", "Distance will be used to attenuate shadows");
367         RNA_def_property_update(prop, 0, "rna_World_update");
368
369         prop = RNA_def_property(srna, "use_cache", PROP_BOOLEAN, PROP_NONE);
370         RNA_def_property_boolean_sdna(prop, NULL, "aomode", WO_AOCACHE);
371         RNA_def_property_ui_text(prop, "Pixel Cache",
372                                  "Cache AO results in pixels and interpolate over neighboring pixels for speedup");
373         RNA_def_property_update(prop, 0, "rna_World_update");
374
375         prop = RNA_def_property(srna, "samples", PROP_INT, PROP_NONE);
376         RNA_def_property_int_sdna(prop, NULL, "aosamp");
377         RNA_def_property_range(prop, 1, 128);
378         RNA_def_property_ui_text(prop, "Samples",
379                                  "Amount of ray samples. Higher values give smoother results and longer rendering times");
380         RNA_def_property_update(prop, 0, "rna_World_update");
381
382         prop = RNA_def_property(srna, "sample_method", PROP_ENUM, PROP_NONE);
383         RNA_def_property_enum_sdna(prop, NULL, "ao_samp_method");
384         RNA_def_property_enum_items(prop, prop_sample_method_items);
385         RNA_def_property_ui_text(prop, "Sample Method", "Method for generating shadow samples (for Raytrace)");
386         RNA_def_property_update(prop, 0, "rna_World_update");
387 }
388
389 static void rna_def_world_mist(BlenderRNA *brna)
390 {
391         StructRNA *srna;
392         PropertyRNA *prop;
393         
394         static EnumPropertyItem falloff_items[] = {
395                 {0, "QUADRATIC", 0, "Quadratic", "Use quadratic progression"},
396                 {1, "LINEAR", 0, "Linear", "Use linear progression"},
397                 {2, "INVERSE_QUADRATIC", 0, "Inverse Quadratic", "Use inverse quadratic progression"},
398                 {0, NULL, 0, NULL, NULL}
399         };
400
401         srna = RNA_def_struct(brna, "WorldMistSettings", NULL);
402         RNA_def_struct_sdna(srna, "World");
403         RNA_def_struct_nested(brna, srna, "World");
404         RNA_def_struct_ui_text(srna, "World Mist", "Mist settings for a World data-block");
405
406         prop = RNA_def_property(srna, "use_mist", PROP_BOOLEAN, PROP_NONE);
407         RNA_def_property_boolean_sdna(prop, NULL, "mode", WO_MIST);
408         RNA_def_property_ui_text(prop, "Use Mist", "Occlude objects with the environment color as they are further away");
409         RNA_def_property_update(prop, 0, "rna_World_draw_update");
410
411         prop = RNA_def_property(srna, "intensity", PROP_FLOAT, PROP_NONE);
412         RNA_def_property_float_sdna(prop, NULL, "misi");
413         RNA_def_property_range(prop, 0, 1);
414         RNA_def_property_ui_text(prop, "Minimum", "Overall minimum intensity of the mist effect");
415         RNA_def_property_update(prop, 0, "rna_World_draw_update");
416
417         prop = RNA_def_property(srna, "start", PROP_FLOAT, PROP_DISTANCE);
418         RNA_def_property_float_sdna(prop, NULL, "miststa");
419         RNA_def_property_range(prop, 0, FLT_MAX);
420         RNA_def_property_ui_range(prop, 0, 10000, 10, 2);
421         RNA_def_property_ui_text(prop, "Start", "Starting distance of the mist, measured from the camera");
422         RNA_def_property_update(prop, 0, "rna_World_draw_update");
423
424         prop = RNA_def_property(srna, "depth", PROP_FLOAT, PROP_DISTANCE);
425         RNA_def_property_float_sdna(prop, NULL, "mistdist");
426         RNA_def_property_range(prop, 0, FLT_MAX);
427         RNA_def_property_ui_range(prop, 0, 10000, 10, 2);
428         RNA_def_property_ui_text(prop, "Depth", "Distance over which the mist effect fades in");
429         RNA_def_property_update(prop, 0, "rna_World_draw_update");
430
431         prop = RNA_def_property(srna, "height", PROP_FLOAT, PROP_DISTANCE);
432         RNA_def_property_float_sdna(prop, NULL, "misthi");
433         RNA_def_property_range(prop, 0, 100);
434         RNA_def_property_ui_text(prop, "Height", "Control how much mist density decreases with height");
435         RNA_def_property_update(prop, 0, "rna_World_update");
436         
437         prop = RNA_def_property(srna, "falloff", PROP_ENUM, PROP_NONE);
438         RNA_def_property_enum_sdna(prop, NULL, "mistype");
439         RNA_def_property_enum_items(prop, falloff_items);
440         RNA_def_property_ui_text(prop, "Falloff", "Type of transition used to fade mist");
441         RNA_def_property_update(prop, 0, "rna_World_draw_update");
442 }
443
444 void RNA_def_world(BlenderRNA *brna)
445 {
446         StructRNA *srna;
447         PropertyRNA *prop;
448
449         srna = RNA_def_struct(brna, "World", "ID");
450         RNA_def_struct_ui_text(srna, "World",
451                                "World data-block describing the environment and ambient lighting of a scene");
452         RNA_def_struct_ui_icon(srna, ICON_WORLD_DATA);
453
454         rna_def_animdata_common(srna);
455         rna_def_mtex_common(brna, srna, "rna_World_mtex_begin", "rna_World_active_texture_get",
456                             "rna_World_active_texture_set", NULL, "WorldTextureSlot", "WorldTextureSlots",
457                             "rna_World_update", "rna_World_update");
458
459         /* colors */
460         prop = RNA_def_property(srna, "horizon_color", PROP_FLOAT, PROP_COLOR);
461         RNA_def_property_float_sdna(prop, NULL, "horr");
462         RNA_def_property_array(prop, 3);
463         RNA_def_property_ui_text(prop, "Horizon Color", "Color at the horizon");
464         /* RNA_def_property_update(prop, 0, "rna_World_update"); */
465         /* render-only uses this */
466         RNA_def_property_update(prop, 0, "rna_World_draw_update");
467         
468         prop = RNA_def_property(srna, "zenith_color", PROP_FLOAT, PROP_COLOR);
469         RNA_def_property_float_sdna(prop, NULL, "zenr");
470         RNA_def_property_array(prop, 3);
471         RNA_def_property_ui_text(prop, "Zenith Color", "Color at the zenith");
472         RNA_def_property_update(prop, 0, "rna_World_draw_update");
473
474         prop = RNA_def_property(srna, "ambient_color", PROP_FLOAT, PROP_COLOR);
475         RNA_def_property_float_sdna(prop, NULL, "ambr");
476         RNA_def_property_array(prop, 3);
477         RNA_def_property_ui_text(prop, "Ambient Color", "Ambient color of the world");
478         RNA_def_property_update(prop, 0, "rna_World_draw_update");
479
480         /* exp, range */
481         prop = RNA_def_property(srna, "exposure", PROP_FLOAT, PROP_NONE);
482         RNA_def_property_float_sdna(prop, NULL, "exp");
483         RNA_def_property_range(prop, 0.0, 1.0);
484         RNA_def_property_ui_text(prop, "Exposure", "Amount of exponential color correction for light");
485         RNA_def_property_update(prop, 0, "rna_World_update");
486
487         prop = RNA_def_property(srna, "color_range", PROP_FLOAT, PROP_NONE);
488         RNA_def_property_float_sdna(prop, NULL, "range");
489         RNA_def_property_range(prop, 0.2, 5.0);
490         RNA_def_property_ui_text(prop, "Range", "The color range that will be mapped to 0-1");
491         RNA_def_property_update(prop, 0, "rna_World_update");
492
493         /* sky type */
494         prop = RNA_def_property(srna, "use_sky_blend", PROP_BOOLEAN, PROP_NONE);
495         RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYBLEND);
496         RNA_def_property_ui_text(prop, "Blend Sky", "Render background with natural progression from horizon to zenith");
497         RNA_def_property_update(prop, NC_WORLD | ND_WORLD_DRAW, "rna_World_update");
498
499         prop = RNA_def_property(srna, "use_sky_paper", PROP_BOOLEAN, PROP_NONE);
500         RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYPAPER);
501         RNA_def_property_ui_text(prop, "Paper Sky", "Flatten blend or texture coordinates");
502         RNA_def_property_update(prop, NC_WORLD | ND_WORLD_DRAW, "rna_World_update");
503
504         prop = RNA_def_property(srna, "use_sky_real", PROP_BOOLEAN, PROP_NONE);
505         RNA_def_property_boolean_sdna(prop, NULL, "skytype", WO_SKYREAL);
506         RNA_def_property_ui_text(prop, "Real Sky", "Render background with a real horizon, relative to the camera angle");
507         RNA_def_property_update(prop, NC_WORLD | ND_WORLD_DRAW, "rna_World_update");
508
509         /* nested structs */
510         prop = RNA_def_property(srna, "light_settings", PROP_POINTER, PROP_NONE);
511         RNA_def_property_flag(prop, PROP_NEVER_NULL);
512         RNA_def_property_struct_type(prop, "WorldLighting");
513         RNA_def_property_pointer_funcs(prop, "rna_World_lighting_get", NULL, NULL, NULL);
514         RNA_def_property_ui_text(prop, "Lighting", "World lighting settings");
515
516         prop = RNA_def_property(srna, "mist_settings", PROP_POINTER, PROP_NONE);
517         RNA_def_property_flag(prop, PROP_NEVER_NULL);
518         RNA_def_property_struct_type(prop, "WorldMistSettings");
519         RNA_def_property_pointer_funcs(prop, "rna_World_mist_get", NULL, NULL, NULL);
520         RNA_def_property_ui_text(prop, "Mist", "World mist settings");
521
522         /* nodes */
523         prop = RNA_def_property(srna, "node_tree", PROP_POINTER, PROP_NONE);
524         RNA_def_property_pointer_sdna(prop, NULL, "nodetree");
525         RNA_def_property_ui_text(prop, "Node Tree", "Node tree for node based worlds");
526
527         prop = RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE);
528         RNA_def_property_boolean_sdna(prop, NULL, "use_nodes", 1);
529         RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
530         RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE);
531         RNA_def_property_ui_text(prop, "Use Nodes", "Use shader nodes to render the world");
532         RNA_def_property_update(prop, 0, "rna_World_use_nodes_update");
533
534         rna_def_lighting(brna);
535         rna_def_world_mist(brna);
536         rna_def_world_mtex(brna);
537 }
538
539 #endif