diff --git a/intern/cycles/blender/addon/__init__.py b/intern/cycles/blender/addon/__init__.py index 235d19e91e8..eb792af7264 100644 --- a/intern/cycles/blender/addon/__init__.py +++ b/intern/cycles/blender/addon/__init__.py @@ -107,7 +107,13 @@ def engine_exit(): engine.exit() +classes = ( + CyclesRender, +) + + def register(): + from bpy.utils import register_class from . import ui from . import properties from . import presets @@ -122,12 +128,15 @@ def register(): properties.register() ui.register() presets.register() - bpy.utils.register_module(__name__) + + for cls in classes: + register_class(cls) bpy.app.handlers.version_update.append(version_update.do_versions) def unregister(): + from bpy.utils import unregister_class from . import ui from . import properties from . import presets @@ -138,4 +147,6 @@ def unregister(): ui.unregister() properties.unregister() presets.unregister() - bpy.utils.unregister_module(__name__) + + for cls in classes: + unregister_class(cls) diff --git a/intern/cycles/blender/addon/presets.py b/intern/cycles/blender/addon/presets.py index f97b51b629d..82c4ffc6e50 100644 --- a/intern/cycles/blender/addon/presets.py +++ b/intern/cycles/blender/addon/presets.py @@ -82,12 +82,23 @@ class AddPresetSampling(AddPresetBase, Operator): preset_subdir = "cycles/sampling" +classes = ( + AddPresetIntegrator, + AddPresetSampling, +) + + def register(): - pass + from bpy.utils import register_class + for cls in classes: + register_class(cls) def unregister(): - pass + from bpy.utils import unregister_class + for cls in classes: + unregister_class(cls) + if __name__ == "__main__": register() diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 0de224f6218..eec897474c5 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -1714,17 +1714,75 @@ def get_panels(): return panels + +classes = ( + CYCLES_MT_sampling_presets, + CYCLES_MT_integrator_presets, + CyclesRender_PT_sampling, + CyclesRender_PT_geometry, + CyclesRender_PT_light_paths, + CyclesRender_PT_motion_blur, + CyclesRender_PT_film, + CyclesRender_PT_performance, + CyclesRender_PT_layer_options, + CyclesRender_PT_layer_passes, + CyclesRender_PT_views, + Cycles_PT_post_processing, + CyclesCamera_PT_dof, + Cycles_PT_context_material, + CyclesObject_PT_motion_blur, + CyclesObject_PT_cycles_settings, + CYCLES_OT_use_shading_nodes, + CyclesLamp_PT_preview, + CyclesLamp_PT_lamp, + CyclesLamp_PT_nodes, + CyclesLamp_PT_spot, + CyclesWorld_PT_preview, + CyclesWorld_PT_surface, + CyclesWorld_PT_volume, + CyclesWorld_PT_ambient_occlusion, + CyclesWorld_PT_mist, + CyclesWorld_PT_ray_visibility, + CyclesWorld_PT_settings, + CyclesMaterial_PT_preview, + CyclesMaterial_PT_surface, + CyclesMaterial_PT_volume, + CyclesMaterial_PT_displacement, + CyclesMaterial_PT_settings, + CyclesTexture_PT_context, + CyclesTexture_PT_node, + CyclesTexture_PT_mapping, + CyclesTexture_PT_colors, + CyclesParticle_PT_textures, + CyclesRender_PT_bake, + CyclesRender_PT_debug, + CyclesParticle_PT_CurveSettings, + CyclesScene_PT_simplify, +) + + def register(): + from bpy.utils import register_class + bpy.types.RENDER_PT_render.append(draw_device) bpy.types.VIEW3D_HT_header.append(draw_pause) for panel in get_panels(): panel.COMPAT_ENGINES.add('CYCLES') + for cls in classes: + register_class(cls) + + def unregister(): + from bpy.utils import unregister_class + bpy.types.RENDER_PT_render.remove(draw_device) bpy.types.VIEW3D_HT_header.remove(draw_pause) for panel in get_panels(): if 'CYCLES' in panel.COMPAT_ENGINES: panel.COMPAT_ENGINES.remove('CYCLES') + + for cls in classes: + unregister_class(cls) diff --git a/intern/cycles/kernel/closure/bsdf_microfacet_multi.h b/intern/cycles/kernel/closure/bsdf_microfacet_multi.h index cea59adfebe..aa4b91eac40 100644 --- a/intern/cycles/kernel/closure/bsdf_microfacet_multi.h +++ b/intern/cycles/kernel/closure/bsdf_microfacet_multi.h @@ -43,7 +43,7 @@ ccl_device_forceinline float D_ggx_aniso(const float3 wm, const float2 alpha) ccl_device_forceinline float2 mf_sampleP22_11(const float cosI, const float2 randU) { if(cosI > 0.9999f || cosI < 1e-6f) { - const float r = sqrtf(randU.x / (1.0f - randU.x)); + const float r = sqrtf(randU.x / max(1.0f - randU.x, 1e-7f)); const float phi = M_2PI_F * randU.y; return make_float2(r*cosf(phi), r*sinf(phi)); } @@ -83,7 +83,7 @@ ccl_device_forceinline float3 mf_sample_vndf(const float3 wi, const float2 alpha const float3 wi_11 = normalize(make_float3(alpha.x*wi.x, alpha.y*wi.y, wi.z)); const float2 slope_11 = mf_sampleP22_11(wi_11.z, randU); - const float2 cossin_phi = normalize(make_float2(wi_11.x, wi_11.y)); + const float2 cossin_phi = safe_normalize(make_float2(wi_11.x, wi_11.y)); const float slope_x = alpha.x*(cossin_phi.x * slope_11.x - cossin_phi.y * slope_11.y); const float slope_y = alpha.y*(cossin_phi.y * slope_11.x + cossin_phi.x * slope_11.y); diff --git a/release/scripts/startup/bl_operators/anim.py b/release/scripts/startup/bl_operators/anim.py index e1a0b3c9908..78fcf0dd124 100644 --- a/release/scripts/startup/bl_operators/anim.py +++ b/release/scripts/startup/bl_operators/anim.py @@ -28,11 +28,11 @@ if "bpy" in locals(): import bpy from bpy.types import Operator from bpy.props import ( - IntProperty, - BoolProperty, - EnumProperty, - StringProperty, - ) + IntProperty, + BoolProperty, + EnumProperty, + StringProperty, +) class ANIM_OT_keying_set_export(Operator): @@ -115,30 +115,30 @@ class ANIM_OT_keying_set_export(Operator): # Find material or lamp using this node tree... id_bpy_path = "bpy.data.nodes[\"%s\"]" found = False - + for mat in bpy.data.materials: if mat.node_tree == ksp.id: id_bpy_path = "bpy.data.materials[\"%s\"].node_tree" % (mat.name) found = True - break; - + break + if not found: for lamp in bpy.data.lamps: if lamp.node_tree == ksp.id: id_bpy_path = "bpy.data.lamps[\"%s\"].node_tree" % (lamp.name) found = True - break; - + break + if not found: - self.report({'WARN'}, "Could not find material or lamp using Shader Node Tree - %s" % (ksp.id)) + self.report({'WARN'}, "Could not find material or lamp using Shader Node Tree - %s" % (ksp.id)) elif ksp.id.bl_rna.identifier.startswith("CompositorNodeTree"): # Find compositor nodetree using this node tree... for scene in bpy.data.scenes: if scene.node_tree == ksp.id: id_bpy_path = "bpy.data.scenes[\"%s\"].node_tree" % (scene.name) - break; + break else: - self.report({'WARN'}, "Could not find scene using Compositor Node Tree - %s" % (ksp.id)) + self.report({'WARN'}, "Could not find scene using Compositor Node Tree - %s" % (ksp.id)) else: idtype_list = ksp.id.bl_rna.name.lower() + "s" id_bpy_path = "bpy.data.%s[\"%s\"]" % (idtype_list, ksp.id.name) @@ -302,9 +302,11 @@ class ClearUselessActions(Operator): bl_label = "Clear Useless Actions" bl_options = {'REGISTER', 'UNDO'} - only_unused = BoolProperty(name="Only Unused", + only_unused = BoolProperty( + name="Only Unused", description="Only unused (Fake User only) actions get considered", - default=True) + default=True, + ) @classmethod def poll(cls, context): @@ -393,7 +395,7 @@ class UpdateAnimatedTransformConstraint(Operator): except: pass ret = (data, new_path) - #print(ret) + # print(ret) return ret @@ -419,4 +421,4 @@ classes = ( BakeAction, ClearUselessActions, UpdateAnimatedTransformConstraint, -) \ No newline at end of file +) diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py index c384600344e..06ae1847d06 100644 --- a/release/scripts/startup/bl_ui/properties_material.py +++ b/release/scripts/startup/bl_ui/properties_material.py @@ -71,6 +71,7 @@ class MATERIAL_MT_specials(Menu): class MATERIAL_UL_matslots(UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): # assert(isinstance(item, bpy.types.MaterialSlot) # ob = data diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py index 593312fc071..2c27c68ed9d 100644 --- a/release/scripts/startup/bl_ui/properties_particle.py +++ b/release/scripts/startup/bl_ui/properties_particle.py @@ -23,11 +23,11 @@ from rna_prop_ui import PropertyPanel from bpy.app.translations import pgettext_iface as iface_ from bl_ui.properties_physics_common import ( - point_cache_ui, - effector_weights_ui, - basic_force_field_settings_ui, - basic_force_field_falloff_ui, - ) + point_cache_ui, + effector_weights_ui, + basic_force_field_settings_ui, + basic_force_field_falloff_ui, +) def particle_panel_enabled(context, psys): @@ -108,6 +108,7 @@ def find_modifier(ob, psys): class PARTICLE_UL_particle_systems(bpy.types.UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index, flt_flag): ob = data psys = item @@ -117,8 +118,10 @@ class PARTICLE_UL_particle_systems(bpy.types.UIList): layout.prop(psys, "name", text="", emboss=False, icon_value=icon) if md: - layout.prop(md, "show_render", emboss=False, icon_only=True, icon='RESTRICT_RENDER_OFF' if md.show_render else 'RESTRICT_RENDER_ON') - layout.prop(md, "show_viewport", emboss=False, icon_only=True, icon='RESTRICT_VIEW_OFF' if md.show_viewport else 'RESTRICT_VIEW_ON') + layout.prop(md, "show_render", emboss=False, icon_only=True, + icon='RESTRICT_RENDER_OFF' if md.show_render else 'RESTRICT_RENDER_ON') + layout.prop(md, "show_viewport", emboss=False, icon_only=True, + icon='RESTRICT_VIEW_OFF' if md.show_viewport else 'RESTRICT_VIEW_ON') elif self.layout_type == 'GRID': layout.alignment = 'CENTER' @@ -401,7 +404,8 @@ class PARTICLE_PT_hair_dynamics(ParticleButtonsPanel, Panel): label = "ERROR" icon = 'ERROR' box.label(label, icon=icon) - box.label("Iterations: %d .. %d (avg. %d)" % (result.min_iterations, result.max_iterations, result.avg_iterations)) + box.label("Iterations: %d .. %d (avg. %d)" % + (result.min_iterations, result.max_iterations, result.avg_iterations)) box.label("Error: %.5f .. %.5f (avg. %.5f)" % (result.min_error, result.max_error, result.avg_error)) @@ -423,7 +427,12 @@ class PARTICLE_PT_cache(ParticleButtonsPanel, Panel): phystype = psys.settings.physics_type if phystype == 'NO' or phystype == 'KEYED': return False - return (psys.settings.type in {'EMITTER', 'REACTOR'} or (psys.settings.type == 'HAIR' and (psys.use_hair_dynamics or psys.point_cache.is_baked))) and engine in cls.COMPAT_ENGINES + return ( + (psys.settings.type in {'EMITTER', 'REACTOR'} or + (psys.settings.type == 'HAIR' and + (psys.use_hair_dynamics or psys.point_cache.is_baked))) and + engine in cls.COMPAT_ENGINES + ) def draw(self, context): psys = context.particle_system @@ -743,7 +752,8 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, Panel): layout.label(text="Fluid interaction:") row = layout.row() - row.template_list("UI_UL_list", "particle_targets", psys, "targets", psys, "active_particle_target_index", rows=4) + row.template_list("UI_UL_list", "particle_targets", psys, "targets", + psys, "active_particle_target_index", rows=4) col = row.column() sub = col.row() @@ -760,7 +770,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, Panel): row = layout.row() if part.physics_type == 'KEYED': col = row.column() - #doesn't work yet + # doesn't work yet #col.alert = key.valid col.prop(key, "object", text="") col.prop(key, "system", text="System") @@ -770,7 +780,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, Panel): col.prop(key, "duration") elif part.physics_type == 'BOIDS': sub = row.row() - #doesn't work yet + # doesn't work yet #sub.alert = key.valid sub.prop(key, "object", text="") sub.prop(key, "system", text="System") @@ -778,7 +788,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, Panel): layout.prop(key, "alliance", expand=True) elif part.physics_type == 'FLUID': sub = row.row() - #doesn't work yet + # doesn't work yet #sub.alert = key.valid sub.prop(key, "object", text="") sub.prop(key, "system", text="System") @@ -831,7 +841,8 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel, Panel): row.label(text="") row = layout.row() - row.template_list("UI_UL_list", "particle_boids_rules", state, "rules", state, "active_boid_rule_index", rows=4) + row.template_list("UI_UL_list", "particle_boids_rules", state, + "rules", state, "active_boid_rule_index", rows=4) col = row.column() sub = col.row() @@ -848,7 +859,7 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel, Panel): if rule: row = layout.row() row.prop(rule, "name", text="") - #somebody make nice icons for boids here please! -jahka + # somebody make nice icons for boids here please! -jahka row.prop(rule, "use_in_air", icon='TRIA_UP', text="") row.prop(rule, "use_on_land", icon='TRIA_DOWN', text="") diff --git a/release/scripts/startup/bl_ui/properties_physics_smoke.py b/release/scripts/startup/bl_ui/properties_physics_smoke.py index e6182c2ec74..f2e6c1e22e3 100644 --- a/release/scripts/startup/bl_ui/properties_physics_smoke.py +++ b/release/scripts/startup/bl_ui/properties_physics_smoke.py @@ -21,9 +21,9 @@ import bpy from bpy.types import Panel from bl_ui.properties_physics_common import ( - point_cache_ui, - effector_weights_ui, - ) + point_cache_ui, + effector_weights_ui, +) class PhysicButtonsPanel: @@ -380,23 +380,23 @@ class PHYSICS_PT_smoke_display_settings(PhysicButtonsPanel, Panel): do_axis_slicing = (slice_method == 'AXIS_ALIGNED') do_full_slicing = (axis_slice_method == 'FULL') - row = layout.row(); + row = layout.row() row.enabled = do_axis_slicing row.prop(domain, "axis_slice_method") - col = layout.column(); + col = layout.column() col.enabled = not do_full_slicing and do_axis_slicing col.prop(domain, "slice_axis") col.prop(domain, "slice_depth") - row = layout.row(); + row = layout.row() row.enabled = do_full_slicing or not do_axis_slicing row.prop(domain, "slice_per_voxel") layout.separator() layout.label(text="Debug:") layout.prop(domain, "draw_velocity") - col = layout.column(); + col = layout.column() col.enabled = domain.draw_velocity col.prop(domain, "vector_draw_type") col.prop(domain, "vector_scale") @@ -404,7 +404,7 @@ class PHYSICS_PT_smoke_display_settings(PhysicButtonsPanel, Panel): layout.separator() layout.label(text="Color Mapping:") layout.prop(domain, "use_color_ramp") - col = layout.column(); + col = layout.column() col.enabled = domain.use_color_ramp col.prop(domain, "coba_field") col.template_color_ramp(domain, "color_ramp", expand=True) diff --git a/release/scripts/startup/bl_ui/properties_texture.py b/release/scripts/startup/bl_ui/properties_texture.py index caeccb9bb9d..d05527b7ef6 100644 --- a/release/scripts/startup/bl_ui/properties_texture.py +++ b/release/scripts/startup/bl_ui/properties_texture.py @@ -21,15 +21,15 @@ import bpy from bpy.types import Menu, Panel, UIList from bpy.types import ( - Brush, - FreestyleLineStyle, - Lamp, - Material, - Object, - ParticleSettings, - Texture, - World, - ) + Brush, + FreestyleLineStyle, + Lamp, + Material, + Object, + ParticleSettings, + Texture, + World, +) from rna_prop_ui import PropertyPanel @@ -60,6 +60,7 @@ class TEXTURE_MT_envmap_specials(Menu): class TEXTURE_UL_texslots(UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): # assert(isinstance(item, bpy.types.MaterialTextureSlot) ma = data @@ -198,7 +199,8 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel, Panel): if tex_collection: row = layout.row() - row.template_list("TEXTURE_UL_texslots", "", idblock, "texture_slots", idblock, "active_texture_index", rows=2) + row.template_list("TEXTURE_UL_texslots", "", idblock, "texture_slots", + idblock, "active_texture_index", rows=2) col = row.column(align=True) col.operator("texture.slot_move", text="", icon='TRIA_UP').type = 'UP' @@ -1210,12 +1212,22 @@ class TEXTURE_PT_influence(TextureSlotPanel, Panel): row = layout.row() sub = row.row() - sub.active = (tex.use_map_normal or tex.use_map_warp) and not (tex.texture.type == 'IMAGE' and (tex.texture.use_normal_map or tex.texture.use_derivative_map)) + sub.active = ( + (tex.use_map_normal or tex.use_map_warp) and + not (tex.texture.type == 'IMAGE' and + (tex.texture.use_normal_map or tex.texture.use_derivative_map)) + ) sub.prop(tex, "bump_method", text="Method") - # the space setting is supported for: derivative-maps + bump-maps (DEFAULT,BEST_QUALITY), not for normal-maps + # the space setting is supported for: derivative-maps + bump-maps + # (DEFAULT,BEST_QUALITY), not for normal-maps sub = row.row() - sub.active = (tex.use_map_normal or tex.use_map_warp) and not (tex.texture.type == 'IMAGE' and tex.texture.use_normal_map) and ((tex.bump_method in {'BUMP_LOW_QUALITY', 'BUMP_MEDIUM_QUALITY', 'BUMP_BEST_QUALITY'}) or (tex.texture.type == 'IMAGE' and tex.texture.use_derivative_map)) + sub.active = ( + (tex.use_map_normal or tex.use_map_warp) and + not (tex.texture.type == 'IMAGE' and tex.texture.use_normal_map) and + ((tex.bump_method in {'BUMP_LOW_QUALITY', 'BUMP_MEDIUM_QUALITY', 'BUMP_BEST_QUALITY'}) or + (tex.texture.type == 'IMAGE' and tex.texture.use_derivative_map)) + ) sub.prop(tex, "bump_objectspace", text="Space") diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index aca73aadaee..74472aca25c 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -284,7 +284,8 @@ class VIEW3D_MT_transform_object(VIEW3D_MT_transform_base): layout.separator() layout.operator_context = 'EXEC_REGION_WIN' - layout.operator("transform.transform", text="Align to Transform Orientation").mode = 'ALIGN' # XXX see alignmenu() in edit.c of b2.4x to get this working + # XXX see alignmenu() in edit.c of b2.4x to get this working + layout.operator("transform.transform", text="Align to Transform Orientation").mode = 'ALIGN' layout.separator() diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index 1febeebf9ea..f661f18fbc0 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -157,17 +157,10 @@ void BKE_blender_userdef_set_data(UserDef *userdef) U = *userdef; } -/** - * When loading a new userdef from file, - * or when exiting Blender. - */ -void BKE_blender_userdef_free_data(UserDef *userdef) +static void userdef_free_keymaps(UserDef *userdef) { -#define U _invalid_access_ /* ensure no accidental global access */ -#ifdef U /* quiet warning */ -#endif - - for (wmKeyMap *km = userdef->user_keymaps.first; km; km = km->next) { + for (wmKeyMap *km = userdef->user_keymaps.first, *km_next; km; km = km_next) { + km_next = km->next; for (wmKeyMapDiffItem *kmdi = km->diff_items.first; kmdi; kmdi = kmdi->next) { if (kmdi->add_item) { keymap_item_free(kmdi->add_item); @@ -185,8 +178,14 @@ void BKE_blender_userdef_free_data(UserDef *userdef) BLI_freelistN(&km->diff_items); BLI_freelistN(&km->items); - } + MEM_freeN(km); + } + BLI_listbase_clear(&userdef->user_keymaps); +} + +static void userdef_free_addons(UserDef *userdef) +{ for (bAddon *addon = userdef->addons.first, *addon_next; addon; addon = addon_next) { addon_next = addon->next; if (addon->prop) { @@ -195,6 +194,21 @@ void BKE_blender_userdef_free_data(UserDef *userdef) } MEM_freeN(addon); } + BLI_listbase_clear(&userdef->addons); +} + +/** + * When loading a new userdef from file, + * or when exiting Blender. + */ +void BKE_blender_userdef_free_data(UserDef *userdef) +{ +#define U _invalid_access_ /* ensure no accidental global access */ +#ifdef U /* quiet warning */ +#endif + + userdef_free_keymaps(userdef); + userdef_free_addons(userdef); for (uiFont *font = userdef->uifonts.first; font; font = font->next) { BLF_unload_id(font->blf_id); @@ -207,7 +221,6 @@ void BKE_blender_userdef_free_data(UserDef *userdef) BLI_freelistN(&userdef->uistyles); BLI_freelistN(&userdef->uifonts); BLI_freelistN(&userdef->themes); - BLI_freelistN(&userdef->user_keymaps); #undef U } diff --git a/source/blender/editors/space_view3d/drawarmature.c b/source/blender/editors/space_view3d/drawarmature.c index d61058744d0..b0e82877241 100644 --- a/source/blender/editors/space_view3d/drawarmature.c +++ b/source/blender/editors/space_view3d/drawarmature.c @@ -2578,7 +2578,6 @@ static void draw_ebones(View3D *v3d, ARegion *ar, Object *ob, const short dt) /* Draw name */ if (arm->flag & ARM_DRAWNAMES) { mid_v3_v3v3(vec, eBone->head, eBone->tail); - glRasterPos3fv(vec); view3d_cached_text_draw_add(vec, eBone->name, strlen(eBone->name), 10, 0, col); } /* Draw additional axes */ diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index 5292ab83cde..61645d8a091 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -1469,7 +1469,7 @@ void WM_OT_read_homefile(wmOperatorType *ot) RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); /* So the splash can be kept open after loading a file (for templates). */ - prop = RNA_def_boolean(ot->srna, "use_splash", true, "Splash", ""); + prop = RNA_def_boolean(ot->srna, "use_splash", false, "Splash", ""); RNA_def_property_flag(prop, PROP_HIDDEN | PROP_SKIP_SAVE); /* omit poll to run in background mode */