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