[Bf-blender-cvs] [a796cbf] temp_localview_split: Make Cycles work with new local view
Julian Eisel
noreply at git.blender.org
Tue Aug 9 21:13:15 CEST 2016
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", "");
More information about the Bf-blender-cvs
mailing list