synched with trunk at revision 30243
[blender.git] / source / blender / makesrna / intern / rna_scene.c
index b75fce9..23b4596 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "DNA_group_types.h"
 #include "DNA_modifier_types.h"
+#include "DNA_particle_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_userdef_types.h"
 #include "BLI_math.h"
@@ -161,13 +162,13 @@ EnumPropertyItem image_type_items[] = {
 
 #include "BLI_threads.h"
 #include "BLI_editVert.h"
+#include "BLI_blenlib.h"
 
 #include "WM_api.h"
 
 #include "ED_info.h"
 #include "ED_node.h"
 #include "ED_view3d.h"
-#include "ED_object.h"
 #include "ED_mesh.h"
 #include "ED_keyframing.h"
 
@@ -201,7 +202,7 @@ static Base *rna_Scene_object_link(Scene *scene, bContext *C, ReportList *report
        if(scene == scene_act)
                ob->lay= base->lay;
 
-       ob->recalc |= OB_RECALC;
+       ob->recalc |= OB_RECALC_ALL;
 
        DAG_scene_sort(scene);
 
@@ -212,16 +213,21 @@ static void rna_Scene_object_unlink(Scene *scene, ReportList *reports, Object *o
 {
        Base *base= object_in_scene(ob, scene);
        if (!base) {
-               BKE_report(reports, RPT_ERROR, "Object is not in this scene.");
+               BKE_reportf(reports, RPT_ERROR, "Object '%s' is not in this scene '%s'.", ob->id.name+2, scene->id.name+2);
                return;
        }
        if (base==scene->basact && ob->mode != OB_MODE_OBJECT) {
-               BKE_report(reports, RPT_ERROR, "Object must be in 'Object Mode' to unlink.");
+               BKE_reportf(reports, RPT_ERROR, "Object '%s' must be in 'Object Mode' to unlink.", ob->id.name+2);
                return;
        }
+       if(scene->basact==base) {
+               scene->basact= NULL;
+       }
 
-       /* as long as ED_base_object_free_and_unlink calls free_libblock_us, we don't have to decrement ob->id.us */
-       ED_base_object_free_and_unlink(scene, base);
+       BLI_remlink(&scene->base, base);
+       MEM_freeN(base);
+
+       ob->id.us--;
 
        /* needed otherwise the depgraph will contain free'd objects which can crash, see [#20958] */
        DAG_scene_sort(scene);
@@ -272,7 +278,7 @@ static void rna_Scene_layer_set(PointerRNA *ptr, const int *values)
 {
        Scene *scene= (Scene*)ptr->data;
 
-       scene->lay= ED_view3d_scene_layer_set(scene->lay, values);
+       scene->lay= ED_view3d_scene_layer_set(scene->lay, values, &scene->layact);
 }
 
 static void rna_Scene_view3d_update(Main *bmain, Scene *unused, PointerRNA *ptr)
@@ -734,7 +740,7 @@ static int rna_RenderSettings_use_game_engine_get(PointerRNA *ptr)
 static void rna_SceneRenderLayer_layer_set(PointerRNA *ptr, const int *values)
 {
        SceneRenderLayer *rl= (SceneRenderLayer*)ptr->data;
-       rl->lay= ED_view3d_scene_layer_set(rl->lay, values);
+       rl->lay= ED_view3d_scene_layer_set(rl->lay, values, NULL);
 }
 
 static void rna_SceneRenderLayer_pass_update(Main *bmain, Scene *unused, PointerRNA *ptr)
@@ -799,10 +805,14 @@ static void rna_Scene_editmesh_select_mode_update(Main *bmain, Scene *scene, Poi
 static void object_simplify_update(Object *ob)
 {
        ModifierData *md;
+       ParticleSystem *psys;
 
        for(md=ob->modifiers.first; md; md=md->next)
                if(ELEM3(md->type, eModifierType_Subsurf, eModifierType_Multires, eModifierType_ParticleSystem))
-                       ob->recalc |= OB_RECALC_DATA;
+                       ob->recalc |= OB_RECALC_DATA|PSYS_RECALC_CHILD;
+
+       for(psys=ob->particlesystem.first; psys; psys=psys->next)
+               psys->recalc |= PSYS_RECALC_CHILD;
        
        if(ob->dup_group) {
                GroupObject *gob;
@@ -812,17 +822,24 @@ static void object_simplify_update(Object *ob)
        }
 }
 
-static void rna_Scene_simplify_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Scene_use_simplify_update(Main *bmain, Scene *scene, PointerRNA *ptr)
 {
+       Scene *sce;
        Base *base;
 
-       for(base= scene->base.first; base; base= base->next)
+       for(SETLOOPER(scene, base))
                object_simplify_update(base->object);
        
        DAG_ids_flush_update(0);
        WM_main_add_notifier(NC_GEOM|ND_DATA, NULL);
 }
 
+static void rna_Scene_simplify_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+{
+       if(scene->r.mode & R_SIMPLIFY)
+               rna_Scene_use_simplify_update(bmain, scene, ptr);
+}
+
 static int rna_Scene_sync_mode_get(PointerRNA *ptr)
 {
        Scene *scene= (Scene*)ptr->data;
@@ -2519,6 +2536,13 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Motion Samples", "Number of scene samples to take with motion blur");
        RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
        
+       prop= RNA_def_property(srna, "motion_blur_shutter", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "blurfac");
+       RNA_def_property_range(prop, 0.01f, 10.0f);
+       RNA_def_property_ui_range(prop, 0.01, 2.0f, 1, 0);
+       RNA_def_property_ui_text(prop, "Shutter", "Time taken in frames between shutter open and close");
+       RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
+       
        /* border */
        prop= RNA_def_property(srna, "use_border", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", R_BORDER);
@@ -2576,8 +2600,9 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
        
        prop= RNA_def_property(srna, "color_management", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "color_mgt_flag", R_COLOR_MANAGEMENT);
-       RNA_def_property_ui_text(prop, "Color Management", "Use color profiles and gamma corrected imaging pipeline");
-       RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS|NC_MATERIAL|ND_SHADING, "rna_RenderSettings_color_management_update");
+       RNA_def_property_ui_text(prop, "Color Management", "Use linear workflow - gamma corrected imaging pipeline");
+       RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, "rna_RenderSettings_color_management_update");
+
        
        prop= RNA_def_property(srna, "use_file_extension", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_EXTENSION);
@@ -2607,7 +2632,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
        RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
 
        prop= RNA_def_property(srna, "free_unused_nodes", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_FREE_IMAGE);
+       RNA_def_property_boolean_sdna(prop, NULL, "scemode", R_COMP_FREE);
        RNA_def_property_ui_text(prop, "Free Unused Nodes", "Free Nodes that are not used while compositing, to save memory");
        RNA_def_property_update(prop, NC_SCENE|ND_RENDER_OPTIONS, NULL);
 
@@ -2833,7 +2858,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna)
        prop= RNA_def_property(srna, "use_simplify", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "mode", R_SIMPLIFY);
        RNA_def_property_ui_text(prop, "Use Simplify", "Enable simplification of scene for quicker preview renders");
-       RNA_def_property_update(prop, 0, "rna_Scene_simplify_update");
+       RNA_def_property_update(prop, 0, "rna_Scene_use_simplify_update");
 
        prop= RNA_def_property(srna, "simplify_subdivision", PROP_INT, PROP_UNSIGNED);
        RNA_def_property_int_sdna(prop, NULL, "simplify_subsurf");
@@ -3002,7 +3027,7 @@ void RNA_def_scene(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "World", "World used for rendering the scene");
        RNA_def_property_update(prop, NC_SCENE|NC_WORLD, NULL);
 
-       prop= RNA_def_property(srna, "cursor_location", PROP_FLOAT, PROP_XYZ|PROP_UNIT_LENGTH);
+       prop= RNA_def_property(srna, "cursor_location", PROP_FLOAT, PROP_XYZ_LENGTH);
        RNA_def_property_float_sdna(prop, NULL, "cursor");
        RNA_def_property_ui_text(prop, "Cursor Location", "3D cursor location");
        RNA_def_property_ui_range(prop, -10000.0, 10000.0, 10, 4);
@@ -3046,7 +3071,7 @@ void RNA_def_scene(BlenderRNA *brna)
        RNA_def_property_int_funcs(prop, NULL, "rna_Scene_start_frame_set", NULL);
        RNA_def_property_range(prop, MINFRAME, MAXFRAME);
        RNA_def_property_ui_text(prop, "Start Frame", "First frame of the playback/rendering range");
-       RNA_def_property_update(prop, NC_SCENE|ND_FRAME, NULL);
+       RNA_def_property_update(prop, NC_SCENE|ND_FRAME_RANGE, NULL);
        
        prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_TIME);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
@@ -3054,7 +3079,7 @@ void RNA_def_scene(BlenderRNA *brna)
        RNA_def_property_int_funcs(prop, NULL, "rna_Scene_end_frame_set", NULL);
        RNA_def_property_range(prop, MINFRAME, MAXFRAME);
        RNA_def_property_ui_text(prop, "End Frame", "Final frame of the playback/rendering range");
-       RNA_def_property_update(prop, NC_SCENE|ND_FRAME, NULL);
+       RNA_def_property_update(prop, NC_SCENE|ND_FRAME_RANGE, NULL);
        
        prop= RNA_def_property(srna, "frame_step", PROP_INT, PROP_TIME);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);