Commit: a796cbf3072f0084e886e1b48abdff1a30d26aaa
Author: Julian Eisel
Date:   Tue Aug 9 21:12:23 2016 +0200
Branches: temp_localview_split
https://developer.blender.org/rBa796cbf3072f0084e886e1b48abdff1a30d26aaa

Make Cycles work with new local view

===================================================================

M       intern/cycles/blender/blender_object.cpp
M       intern/cycles/blender/blender_sync.cpp
M       intern/cycles/blender/blender_sync.h
M       intern/cycles/blender/blender_util.h
M       source/blender/makesrna/intern/rna_screen.c

===================================================================

diff --git a/intern/cycles/blender/blender_object.cpp 
b/intern/cycles/blender/blender_object.cpp
index f305e8e..0ab3843 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -533,6 +533,8 @@ void BlenderSync::sync_objects(BL::SpaceView3D& b_v3d, 
float motion_time)
 {
        /* layer data */
        uint scene_layer = render_layer.scene_layer;
+       const bool is_localview = render_layer.localview != 0;
+       uint scene_localview = is_localview ? render_layer.localview : -1;
        bool motion = motion_time != 0.0f;
        
        if(!motion) {
@@ -571,20 +573,16 @@ void BlenderSync::sync_objects(BL::SpaceView3D& b_v3d, 
float motion_time)
        bool cancel = false;
        bool use_portal = false;
 
-       uint layer_override = get_layer(b_engine.layer_override());
        for(; b_sce && !cancel; b_sce = b_sce.background_set()) {
-               /* Render layer's scene_layer is affected by local view already,
-                * which is not a desired behavior here.
-                */
-               uint scene_layers = layer_override ? layer_override : 
get_layer(b_scene.layers());
                for(b_sce.object_bases.begin(b_base); b_base != 
b_sce.object_bases.end() && !cancel; ++b_base) {
                        BL::Object b_ob = b_base->object();
                        bool hide = (render_layer.use_viewport_visibility)? 
b_ob.hide(): b_ob.hide_render();
-                       uint ob_layer = get_layer(b_base->layers(),
-                                                 b_base->layers_local_view(),
-                                                 object_is_light(b_ob),
-                                                 scene_layers);
-                       hide = hide || !(ob_layer & scene_layer);
+                       uint ob_layer = get_layer(b_base->layers());
+                       /* use -1 to ignore local view if we're not in a local 
view or if object is a
+                        * light (only check layer bits then, like Blender 
Internal and viewport) */
+                       uint ob_localview = (is_localview && 
!object_is_light(b_ob)) ?
+                                               
get_localview(b_ob.layers_local_view().viewbits()) : -1;
+                       hide = hide || !(ob_layer & scene_layer) || 
!(ob_localview & scene_localview);
 
                        if(!hide) {
                                progress.set_sync_status("Synchronizing 
object", b_ob.name());
diff --git a/intern/cycles/blender/blender_sync.cpp 
b/intern/cycles/blender/blender_sync.cpp
index e7e57b2..7a4b260 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -375,7 +375,7 @@ void BlenderSync::sync_render_layers(BL::SpaceView3D& 
b_v3d, const char *layer)
                        layer = layername.c_str();
                }
                else {
-                       render_layer.scene_layer = get_layer(b_v3d.layers(), 
b_v3d.layers_local_view());
+                       render_layer.scene_layer = get_layer(b_v3d.layers());
                        render_layer.layer = render_layer.scene_layer;
                        render_layer.exclude_layer = 0;
                        render_layer.holdout_layer = 0;
@@ -387,6 +387,11 @@ void BlenderSync::sync_render_layers(BL::SpaceView3D& 
b_v3d, const char *layer)
                        render_layer.use_viewport_visibility = true;
                        render_layer.samples = 0;
                        render_layer.bound_samples = false;
+
+                       BL::LocalViewAreaData localview_data = 
b_v3d.local_view();
+                       if (localview_data) {
+                               render_layer.localview = 
get_localview(localview_data.info().viewbits());
+                       }
                        return;
                }
        }
diff --git a/intern/cycles/blender/blender_sync.h 
b/intern/cycles/blender/blender_sync.h
index b8b9597..998211a 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -179,7 +179,7 @@ private:
 
        struct RenderLayerInfo {
                RenderLayerInfo()
-               : scene_layer(0), layer(0),
+               : scene_layer(0), layer(0), localview(0),
                  holdout_layer(0), exclude_layer(0),
                  material_override(PointerRNA_NULL),
                  use_background_shader(true),
@@ -193,6 +193,7 @@ private:
                string name;
                uint scene_layer;
                uint layer;
+               uint localview;
                uint holdout_layer;
                uint exclude_layer;
                BL::Material material_override;
diff --git a/intern/cycles/blender/blender_util.h 
b/intern/cycles/blender/blender_util.h
index d5dbaba..ea5b09f 100644
--- a/intern/cycles/blender/blender_util.h
+++ b/intern/cycles/blender/blender_util.h
@@ -299,33 +299,17 @@ static inline uint get_layer(const BL::Array<int, 20>& 
array)
        return layer;
 }
 
-static inline uint get_layer(const BL::Array<int, 20>& array,
-                             const BL::Array<int, 8>& local_array,
-                             bool is_light = false,
-                             uint scene_layers = (1 << 20) - 1)
+static inline uint get_localview(const BL::Array<int, 32>& array)
 {
-       uint layer = 0;
-
-       for(uint i = 0; i < 20; i++)
-               if(array[i])
-                       layer |= (1 << i);
+       uint localview = 0;
 
-       if(is_light) {
-               /* Consider light is visible if it was visible without layer
-                * override, which matches behavior of Blender Internal.
-                */
-               if(layer & scene_layers) {
-                       for(uint i = 0; i < 8; i++)
-                               layer |= (1 << (20+i));
+       for(uint i = 0; i < 32; i++) {
+               if(array[i]) {
+                       localview |= (1 << i);
                }
        }
-       else {
-               for(uint i = 0; i < 8; i++)
-                       if(local_array[i])
-                               layer |= (1 << (20+i));
-       }
 
-       return layer;
+       return localview;
 }
 
 static inline float3 get_float3(PointerRNA& ptr, const char *name)
diff --git a/source/blender/makesrna/intern/rna_screen.c 
b/source/blender/makesrna/intern/rna_screen.c
index df17226..5344857 100644
--- a/source/blender/makesrna/intern/rna_screen.c
+++ b/source/blender/makesrna/intern/rna_screen.c
@@ -200,6 +200,7 @@ static void rna_def_localview_info(BlenderRNA *brna)
        RNA_def_struct_ui_text(srna, "Local View Info", "");
 
        prop = RNA_def_property(srna, "viewbits", PROP_BOOLEAN, 
PROP_LAYER_MEMBER);
+       RNA_def_property_boolean_sdna(prop, NULL, "viewbits", 1);
        RNA_def_property_array(prop, 32);
        RNA_def_property_clear_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Local View Layers", "");

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to