From 013b46d6bda4388736d7953746d6b335ce495b16 Mon Sep 17 00:00:00 2001 From: Mai Lavelle Date: Fri, 2 Sep 2016 21:37:17 -0400 Subject: Cycles: Replace object index hack with actual checks for SD_TRANSFORM_APPLIED Using ones complement for detecting if transform has been applied was confusing and led to several bugs. With this proper checks are made. Also added a few transforms where they were missing, mostly affecting baking and displacement when `P` is used in the shader (previously `P` was in the wrong space for these shaders) Also removed `TIME_INVALID` as this may have resulted in incorrect transforms in some cases. Reviewed By: brecht Differential Revision: https://developer.blender.org/D2192 --- intern/cycles/blender/blender_session.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'intern/cycles/blender') diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index 80a16e0ef27..c250a54f259 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -681,8 +681,7 @@ void BlenderSession::bake(BL::Object& b_object, } } - /* when used, non-instanced convention: object = ~object */ - int object = ~object_index; + int object = object_index; BakeData *bake_data = scene->bake_manager->init(object, tri_offset, num_pixels); -- cgit v1.2.3 From ab6a3dd6c150d0842d39e6a09b44b806ae2c53c1 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 14 Sep 2016 14:58:55 +0200 Subject: Fix T49341: Bad motion blur behavior in Cycles when using Speed effect in Sequencer Cycles was thinking it always rendering integer frame, which is not correct. --- intern/cycles/blender/blender_object.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'intern/cycles/blender') diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp index f305e8e17cc..f7f77dfb4cb 100644 --- a/intern/cycles/blender/blender_object.cpp +++ b/intern/cycles/blender/blender_object.cpp @@ -698,6 +698,7 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render, Camera prevcam = *(scene->camera); int frame_center = b_scene.frame_current(); + float subframe_center = b_scene.frame_subframe(); float frame_center_delta = 0.0f; if(scene->need_motion() != Scene::MOTION_PASS && @@ -711,7 +712,7 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render, assert(scene->camera->motion_position == Camera::MOTION_POSITION_START); frame_center_delta = shuttertime * 0.5f; } - float time = frame_center + frame_center_delta; + float time = frame_center + subframe_center + frame_center_delta; int frame = (int)floorf(time); float subframe = time - frame; python_thread_state_restore(python_thread_state); @@ -734,7 +735,7 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render, float shuttertime = scene->motion_shutter_time(); /* compute frame and subframe time */ - float time = frame_center + frame_center_delta + relative_time * shuttertime * 0.5f; + float time = frame_center + subframe_center + frame_center_delta + relative_time * shuttertime * 0.5f; int frame = (int)floorf(time); float subframe = time - frame; @@ -759,7 +760,7 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render, * function assumes it is being executed from python and will * try to save the thread state */ python_thread_state_restore(python_thread_state); - b_engine.frame_set(frame_center, 0.0f); + b_engine.frame_set(frame_center, subframe_center); python_thread_state_save(python_thread_state); /* tag camera for motion update */ -- cgit v1.2.3 From 799454821e490d8024468ba623b2e10e67736a55 Mon Sep 17 00:00:00 2001 From: Mai Lavelle Date: Sat, 17 Sep 2016 20:45:00 -0400 Subject: Cycles: Soft minimum for dice rates Use 0.5 as a soft minimum for dice rates to help from setting them too low. Lower values can still be set by typing in the value. --- intern/cycles/blender/addon/properties.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'intern/cycles/blender') diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py index 82a18b3f6a9..977d7f75bb7 100644 --- a/intern/cycles/blender/addon/properties.py +++ b/intern/cycles/blender/addon/properties.py @@ -367,14 +367,14 @@ class CyclesRenderSettings(bpy.types.PropertyGroup): cls.dicing_rate = FloatProperty( name="Dicing Rate", description="Size of a micropolygon in pixels", - min=0.1, max=1000.0, + min=0.1, max=1000.0, soft_min=0.5, default=1.0, subtype="PIXEL" ) cls.preview_dicing_rate = FloatProperty( name="Preview Dicing Rate", description="Size of a micropolygon in pixels during preview render", - min=0.1, max=1000.0, + min=0.1, max=1000.0, soft_min=0.5, default=8.0, subtype="PIXEL" ) @@ -1011,7 +1011,7 @@ class CyclesObjectSettings(bpy.types.PropertyGroup): cls.dicing_rate = FloatProperty( name="Dicing Scale", description="Multiplier for scene dicing rate (located in the Geometry Panel)", - min=0.1, max=1000.0, + min=0.1, max=1000.0, soft_min=0.5, default=1.0, ) -- cgit v1.2.3 From 940f360479f2d160e63d91dd7c64d4a91471fa73 Mon Sep 17 00:00:00 2001 From: Mai Lavelle Date: Sun, 18 Sep 2016 12:04:12 -0400 Subject: Cycles: Fix update of subdivision meshes when global dice rates change When subdivision settings were moved from meshes to objects this was missed, should work fine now. --- intern/cycles/blender/blender_mesh.cpp | 20 +------------ intern/cycles/blender/blender_sync.cpp | 53 +++++++++++++++------------------- intern/cycles/blender/blender_util.h | 25 ++++++++++++++++ 3 files changed, 50 insertions(+), 48 deletions(-) (limited to 'intern/cycles/blender') diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index c33bc4c263f..7c382fa0399 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -959,25 +959,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob, bool need_undeformed = mesh->need_attribute(scene, ATTR_STD_GENERATED); - mesh->subdivision_type = Mesh::SUBDIVISION_NONE; - - PointerRNA cobj = RNA_pointer_get(&b_ob.ptr, "cycles"); - - if(cobj.data && b_ob.modifiers.length() > 0 && experimental) { - BL::Modifier mod = b_ob.modifiers[b_ob.modifiers.length()-1]; - bool enabled = preview ? mod.show_viewport() : mod.show_render(); - - if(enabled && mod.type() == BL::Modifier::type_SUBSURF && RNA_boolean_get(&cobj, "use_adaptive_subdivision")) { - BL::SubsurfModifier subsurf(mod); - - if(subsurf.subdivision_type() == BL::SubsurfModifier::subdivision_type_CATMULL_CLARK) { - mesh->subdivision_type = Mesh::SUBDIVISION_CATMULL_CLARK; - } - else { - mesh->subdivision_type = Mesh::SUBDIVISION_LINEAR; - } - } - } + mesh->subdivision_type = object_subdivision_type(b_ob, preview, experimental); BL::Mesh b_mesh = object_to_mesh(b_data, b_ob, b_scene, true, !preview, need_undeformed, mesh->subdivision_type); diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp index e7e57b2be36..4ca202ac40d 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -103,6 +103,27 @@ bool BlenderSync::sync_recalc() if(b_lamp->is_updated() || (b_lamp->node_tree() && b_lamp->node_tree().is_updated())) shader_map.set_recalc(*b_lamp); + bool dicing_prop_changed = false; + + if(experimental) { + PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); + + float updated_dicing_rate = preview ? RNA_float_get(&cscene, "preview_dicing_rate") + : RNA_float_get(&cscene, "dicing_rate"); + + if(dicing_rate != updated_dicing_rate) { + dicing_rate = updated_dicing_rate; + dicing_prop_changed = true; + } + + int updated_max_subdivisions = RNA_int_get(&cscene, "max_subdivisions"); + + if(max_subdivisions != updated_max_subdivisions) { + max_subdivisions = updated_max_subdivisions; + dicing_prop_changed = true; + } + } + BL::BlendData::objects_iterator b_ob; for(b_data.objects.begin(b_ob); b_ob != b_data.objects.end(); ++b_ob) { @@ -112,7 +133,9 @@ bool BlenderSync::sync_recalc() } if(object_is_mesh(*b_ob)) { - if(b_ob->is_updated_data() || b_ob->data().is_updated()) { + if(b_ob->is_updated_data() || b_ob->data().is_updated() || + (dicing_prop_changed && object_subdivision_type(*b_ob, preview, experimental) != Mesh::SUBDIVISION_NONE)) + { BL::ID key = BKE_object_is_modified(*b_ob)? *b_ob: b_ob->data(); mesh_map.set_recalc(key); } @@ -129,42 +152,14 @@ bool BlenderSync::sync_recalc() } } - bool dicing_prop_changed = false; - - if(experimental) { - PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); - - float updated_dicing_rate = preview ? RNA_float_get(&cscene, "preview_dicing_rate") - : RNA_float_get(&cscene, "dicing_rate"); - - if(dicing_rate != updated_dicing_rate) { - dicing_rate = updated_dicing_rate; - dicing_prop_changed = true; - } - - int updated_max_subdivisions = RNA_int_get(&cscene, "max_subdivisions"); - - if(max_subdivisions != updated_max_subdivisions) { - max_subdivisions = updated_max_subdivisions; - dicing_prop_changed = true; - } - } - BL::BlendData::meshes_iterator b_mesh; for(b_data.meshes.begin(b_mesh); b_mesh != b_data.meshes.end(); ++b_mesh) { if(b_mesh->is_updated()) { mesh_map.set_recalc(*b_mesh); } - else if(dicing_prop_changed) { - PointerRNA cmesh = RNA_pointer_get(&b_mesh->ptr, "cycles"); - - if(RNA_enum_get(&cmesh, "subdivision_type")) - mesh_map.set_recalc(*b_mesh); - } } - BL::BlendData::worlds_iterator b_world; for(b_data.worlds.begin(b_world); b_world != b_data.worlds.end(); ++b_world) { diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h index e79f2bbb27d..e606696fb7b 100644 --- a/intern/cycles/blender/blender_util.h +++ b/intern/cycles/blender/blender_util.h @@ -17,6 +17,8 @@ #ifndef __BLENDER_UTIL_H__ #define __BLENDER_UTIL_H__ +#include "mesh.h" + #include "util_map.h" #include "util_path.h" #include "util_set.h" @@ -561,6 +563,29 @@ static inline BL::DomainFluidSettings object_fluid_domain_find(BL::Object b_ob) return BL::DomainFluidSettings(PointerRNA_NULL); } +static inline Mesh::SubdivisionType object_subdivision_type(BL::Object& b_ob, bool preview, bool experimental) +{ + PointerRNA cobj = RNA_pointer_get(&b_ob.ptr, "cycles"); + + if(cobj.data && b_ob.modifiers.length() > 0 && experimental) { + BL::Modifier mod = b_ob.modifiers[b_ob.modifiers.length()-1]; + bool enabled = preview ? mod.show_viewport() : mod.show_render(); + + if(enabled && mod.type() == BL::Modifier::type_SUBSURF && RNA_boolean_get(&cobj, "use_adaptive_subdivision")) { + BL::SubsurfModifier subsurf(mod); + + if(subsurf.subdivision_type() == BL::SubsurfModifier::subdivision_type_CATMULL_CLARK) { + return Mesh::SUBDIVISION_CATMULL_CLARK; + } + else { + return Mesh::SUBDIVISION_LINEAR; + } + } + } + + return Mesh::SUBDIVISION_NONE; +} + /* ID Map * * Utility class to keep in sync with blender data. -- cgit v1.2.3 From 6c28d3bac26b22049768824bef6ae9d0e82bb71f Mon Sep 17 00:00:00 2001 From: Mai Lavelle Date: Sun, 18 Sep 2016 13:21:29 -0400 Subject: Fix T49245: Adaptive Subdivision with Auto Smooth causes weird mesh appearance --- intern/cycles/blender/blender_mesh.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'intern/cycles/blender') diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp index 7c382fa0399..ff1d49ffd12 100644 --- a/intern/cycles/blender/blender_mesh.cpp +++ b/intern/cycles/blender/blender_mesh.cpp @@ -606,7 +606,7 @@ static void create_mesh(Scene *scene, int numtris = 0; int numcorners = 0; int numngons = 0; - bool use_loop_normals = b_mesh.use_auto_smooth(); + bool use_loop_normals = b_mesh.use_auto_smooth() && (mesh->subdivision_type != Mesh::SUBDIVISION_CATMULL_CLARK); BL::Mesh::vertices_iterator v; BL::Mesh::tessfaces_iterator f; -- cgit v1.2.3 From 772dab9df1fb208bfe2486b7ca6760da051f42f6 Mon Sep 17 00:00:00 2001 From: Mai Lavelle Date: Sun, 18 Sep 2016 22:11:07 -0400 Subject: Cycles: Fix typo that would sometimes result in subsurf modifier being disabled --- intern/cycles/blender/blender_util.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'intern/cycles/blender') diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h index e606696fb7b..f17a61f0ac8 100644 --- a/intern/cycles/blender/blender_util.h +++ b/intern/cycles/blender/blender_util.h @@ -57,11 +57,10 @@ static inline BL::Mesh object_to_mesh(BL::BlendData& data, BL::Modifier subsurf_mod = object.modifiers[object.modifiers.length()-1]; subsurf_mod_show_render = subsurf_mod.show_render(); - subsurf_mod_show_viewport = subsurf_mod.show_render(); + subsurf_mod_show_viewport = subsurf_mod.show_viewport(); subsurf_mod.show_render(false); subsurf_mod.show_viewport(false); - } BL::Mesh me = data.meshes.new_from_object(scene, object, apply_modifiers, (render)? 2: 1, false, calc_undeformed); -- cgit v1.2.3