Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/blender/blender_geometry.cpp
| Show First 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | Geometry *BlenderSync::sync_geometry(BL::Depsgraph &b_depsgraph, | ||||
| bool object_updated, | bool object_updated, | ||||
| bool use_particle_hair, | bool use_particle_hair, | ||||
| TaskPool *task_pool) | TaskPool *task_pool) | ||||
| { | { | ||||
| /* Test if we can instance or if the object is modified. */ | /* Test if we can instance or if the object is modified. */ | ||||
| BL::ID b_ob_data = b_ob.data(); | BL::ID b_ob_data = b_ob.data(); | ||||
| BL::ID b_key_id = (BKE_object_is_modified(b_ob)) ? b_ob_instance : b_ob_data; | BL::ID b_key_id = (BKE_object_is_modified(b_ob)) ? b_ob_instance : b_ob_data; | ||||
| BL::Material material_override = view_layer.material_override; | BL::Material material_override = view_layer.material_override; | ||||
| Shader *default_shader = (b_ob.type() == BL::Object::type_VOLUME) ? scene->default_volume : | Shader *default_shader = (b_ob.type() == BL::Object::type_VOLUME) ? scene->get_default_volume() : | ||||
| scene->default_surface; | scene->get_default_surface(); | ||||
| Geometry::Type geom_type = determine_geom_type(b_ob, use_particle_hair); | Geometry::Type geom_type = determine_geom_type(b_ob, use_particle_hair); | ||||
| GeometryKey key(b_key_id.ptr.data, geom_type); | GeometryKey key(b_key_id.ptr.data, geom_type); | ||||
| /* Find shader indices. */ | /* Find shader indices. */ | ||||
| array<Node *> used_shaders; | array<Node *> used_shaders; | ||||
| BL::Object::material_slots_iterator slot; | BL::Object::material_slots_iterator slot; | ||||
| for (b_ob.material_slots.begin(slot); slot != b_ob.material_slots.end(); ++slot) { | for (b_ob.material_slots.begin(slot); slot != b_ob.material_slots.end(); ++slot) { | ||||
| Show All 38 Lines | Geometry *BlenderSync::sync_geometry(BL::Depsgraph &b_depsgraph, | ||||
| } | } | ||||
| else { | else { | ||||
| /* Test if we need to update existing geometry. */ | /* Test if we need to update existing geometry. */ | ||||
| sync = geometry_map.update(geom, b_key_id); | sync = geometry_map.update(geom, b_key_id); | ||||
| } | } | ||||
| if (!sync) { | if (!sync) { | ||||
| /* If transform was applied to geometry, need full update. */ | /* If transform was applied to geometry, need full update. */ | ||||
| if (object_updated && geom->transform_applied) { | if (object_updated && geom->get_transform_applied()) { | ||||
| ; | ; | ||||
| } | } | ||||
| /* Test if shaders changed, these can be object level so geometry | /* Test if shaders changed, these can be object level so geometry | ||||
| * does not get tagged for recalc. */ | * does not get tagged for recalc. */ | ||||
| else if (geom->get_used_shaders() != used_shaders) { | else if (geom->get_used_shaders() != used_shaders) { | ||||
| ; | ; | ||||
| } | } | ||||
| else { | else { | ||||
| /* Even if not tagged for recalc, we may need to sync anyway | /* Even if not tagged for recalc, we may need to sync anyway | ||||
| * because the shader needs different geometry attributes. */ | * because the shader needs different geometry attributes. */ | ||||
| bool attribute_recalc = false; | bool attribute_recalc = false; | ||||
| foreach (Node *node, geom->get_used_shaders()) { | foreach (Node *node, geom->get_used_shaders()) { | ||||
| Shader *shader = static_cast<Shader *>(node); | Shader *shader = static_cast<Shader *>(node); | ||||
| if (shader->need_update_geometry) { | if (shader->get_need_update_geometry()) { | ||||
| attribute_recalc = true; | attribute_recalc = true; | ||||
| } | } | ||||
| } | } | ||||
| if (!attribute_recalc) { | if (!attribute_recalc) { | ||||
| return geom; | return geom; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| geometry_synced.insert(geom); | geometry_synced.insert(geom); | ||||
| geom->name = ustring(b_ob_data.name().c_str()); | geom->set_name(ustring(b_ob_data.name().c_str())); | ||||
| /* Store the shaders immediately for the object attribute code. */ | /* Store the shaders immediately for the object attribute code. */ | ||||
| geom->set_used_shaders(used_shaders); | geom->set_used_shaders(used_shaders); | ||||
| auto sync_func = [=]() mutable { | auto sync_func = [=]() mutable { | ||||
| if (progress.get_cancel()) | if (progress.get_cancel()) | ||||
| return; | return; | ||||
| ▲ Show 20 Lines • Show All 80 Lines • Show Last 20 Lines | |||||