Page MenuHome

Boolean targets can now be any object providing a MESH in GeometrySet
AbandonedPublic

Authored by Jaggz H (jaggz) on May 16 2021, 9:20 AM.
Tags
None
Tokens
"Love" token, awarded by hitrpr."Love" token, awarded by ogierm."Love" token, awarded by EAW."Like" token, awarded by intracube."Like" token, awarded by Imaginer.

Details

Summary

Text/curve/etc. objects are not usable as targets in Boolean operations -- the user must therefore convert them to mesh. Since, for quite some time, these objects do evaluate as mesh providers, and many modifiers can function on this mesh, this patch makes use of this allowing as a Boolean target, objects who's geometry_set_eval has GEO_COMPONENT_TYPE_MESH

It does not yet allow those objects to accept the boolean modifier, and no other modifiers have been extended to accept the geoset mesh type, just boolean for now.

Diff Detail

Repository
rB Blender
Branch
boolean-fonts (branched from master)
Build Status
Buildable 14589
Build 14589: arc lint + arc unit

Event Timeline

Jaggz H (jaggz) requested review of this revision.May 16 2021, 9:20 AM
Jaggz H (jaggz) created this revision.
Jaggz H (jaggz) retitled this revision from Rough modifications to allow OB_FONT boolean targets to Initial modifications allowing Text object (OB_FONT) boolean targets.May 16 2021, 8:34 PM

OB_FONT to accept mesh modifiers (ex. boolean)

Jaggz H (jaggz) added a comment.EditedMay 16 2021, 9:33 PM


The main purpose of this is to allow Text to be used directly as boolean targets.


With an additional change (a single 'line' of code), as seen above, other mesh modifiers may be added to text objects. (eModifierTypeFlag_AcceptsMesh). This allows modifiers to be used on text, like Boolean, Wireframe, Displace, etc. (Because some modifiers accepting true mesh objects will crash, a clean implementation of this should probably be put in as a separate patch, where the actual usable modifiers is handled).

Nevertheless, this text was then able to have a sphere booleaned onto it, followed by a wireframe.


This is an actual live editable "Text" object, with a sphere booleaned onto it, displaced, etc.

Jaggz H (jaggz) edited the summary of this revision. (Show Details)May 19 2021, 6:18 AM

Updating D11272: Initial modifications allowing Text object (OB_FONT) boolean targets

Okay, I removed the code allowing all Mesh modifiers on Text objects. That can be a different branch and requires more work.
I still have two issues I need help with:

  1. Function naming:

Hans mentioned not ending functions with digits. There are many in our code, but usually representing something (like dimensionality of vectors, bit addressing, etc.) In this case, it's only about the number of object types accepted. We have a macro and a function in intern/rna_modifier.c -- they accept a single object type. To allow two object types passed, I made a separate macro and function.
Original:
RNA_MOD_OBJECT_SET(_type, _prop, _obtype) (This ceates a unique function for each caller, to test object types)
modifier_object_set(..., int type, ...)
Added:
RNA_MOD_OBJECT_SET2(_type, _prop, _obtype, _obtype2)
modifier_object_set2(..., int type, int type2, ...)

Should I really name this "modifier_object_set_two()"? If we go to "set_multi()" I'll need to use varargs or compound literals (or require the caller to do setup, which is just more overhead).

  1. Modifier targets:

So, this patch currently works. The Object target property now lists OB_FONT types, and allows the eye-dropper selector to be used on them. HOWEVER, most modifiers have not been modified to accept this, and this results in the user seeing objects in the list, as if they're valid, but then the later test by the modifier itself blanking the field back out.
My initial simple fix was to change the tooltip to add "(Text objects may be listed here but not accepted by all modifiers)" -- but that ends up requiring a custom rna text for each of those modifiers :)
The other option is to begin changing each modifier's own testing of the object target to accept OB_FONT. Should I go about doing this?

  1. I don't want to waste my time if there's something severely wrong with this entire process.
ogierm added a subscriber: ogierm.
  • Removed digit 2 from functions/macros
  • Rebase to master
Thomas Dinges (dingto) resigned from this revision.Nov 27 2021, 9:48 PM

Can someone from the modeling module team please review this patch? :)

Hans Goudey (HooglyBoogly) requested changes to this revision.Nov 27 2021, 10:20 PM

I would suggest a different approach than the one used here. Any object type can evaluate to a mesh not just mesh objects and text objects (well, currently point cloud objects, volume objects, curve objects, text objects, mesh objects).

So I think we should move away from checking the original object and instead check what data type(s) an object evaluates to.

This could be achieved by checking geometry_set_eval, though I'm not sure if these RNA property polls have access to evaluated data. It should be possible though.

What I suggest is more complicated, but I'm going to request changes, since I don't think what's here is a proper solution.

This revision now requires changes to proceed.Nov 27 2021, 10:20 PM

Rebased.
Updated to use the brand new Legacy curve def
set2 changed to setmulti

Hans Goudey (HooglyBoogly) requested changes to this revision.May 20 2022, 4:01 PM
This revision now requires changes to proceed.May 20 2022, 4:01 PM
  • Converting object filters to va args. Added curve support.
Jaggz H (jaggz) added a comment.EditedMay 21 2022, 10:34 AM

I spent quite a bit of time looking through to see what and how geometry_set_eval is to be used for this, but couldn't figure it out.
(I also saw a bunch of other nifty functions.) Personally I think there's a lot of power in allowing an option to choose a target's base mesh/final, etc. But anyway.

Yeah, polling needs to be able to also accurately reflect suitable targets. Hmm.

[Edit] For now, I went ahead and hard coded in the tests to allow mod bool to work on curves as well, since I needed it for a project and perhaps someone else finds this capability/patch useful for the time being.

I would suggest a different approach than the one used here. Any object type can evaluate to a mesh not just mesh objects and text objects (well, currently point cloud objects, volume objects, curve objects, text objects, mesh objects).

So I think we should move away from checking the original object and instead check what data type(s) an object evaluates to.

This could be achieved by checking geometry_set_eval, though I'm not sure if these RNA property polls have access to evaluated data. It should be possible though.

What I suggest is more complicated, but I'm going to request changes, since I don't think what's here is a proper solution.

  • Converted to geometryset methods. Objects offering GEO_COMPONENT_TYPE_MESH can now be boolean targets.
Jaggz H (jaggz) retitled this revision from Initial modifications allowing Text object (OB_FONT) boolean targets to Boolean targets can now be any object providing a MESH in GeometrySet.May 23 2022, 5:40 AM
Jaggz H (jaggz) edited the summary of this revision. (Show Details)

I'm getting inconsistent crashes, which I assume are resulting from something not handled by this patch.
To my eyes, it's not consistent what's going on here.
It can take hours for it to happen; the most recent of which is sitting in my gdb right now.
(It's caught by gdb so I don't see a crash.txt):

#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50             [0/1886]
#1  0x00007ffff75b1537 in __GI_abort () at abort.c:79
#2  0x0000000011f71543 in _BLI_assert_abort ()
    at /home/jaguar/blender-src/blender-git/blender/source/blender/blenlib/intern/BLI_assert. c:46
#3  0x000000000470d797 in BKE_editmesh_from_object (ob=0x7fffcc356608)
    at /home/jaguar/blender-src/blender-git/blender/source/blender/blenkernel/intern/editmesh.c:60
#4  0x0000000005d9a2a4 in snap_object_data_mesh_get (sctx=0x7fffc9746088, 
    ob_eval=0x7fffcc356608, me_eval=0x7fffd12be008, use_hide=false)
    at /home/jaguar/blender-src/blender-git/blender/source/blender/editors/transform/transform_snap_object.cc:287
#5  0x0000000005d9f329 in snapMesh (sctx=0x7fffc9746088, params=0x7fffffffc70c, 
    ob_eval=0x7fffcc356608, me_eval=0x7fffd12be008, obmat=0x7fffc93c7328, use_hide=false, 
    dist_px=0x7fffffffc51c, r_loc=0x7fffffffc594, r_no=0x7fffffffc588, 
    r_index=0x7fffffffc53c)
    at /home/jaguar/blender-src/blender-git/blender/source/blender/editors/transform/transform_snap_object.cc:2349
#6  0x0000000005da0464 in snap_obj_fn (sctx=0x7fffc9746088, params=0x7fffffffc70c, 
    ob_eval=0x7fffcc356608, obmat=0x7fffc93c7328, is_object_active=false, 
    data=0x7fffffffc470)
    at /home/jaguar/blender-src/blender-git/blender/source/blender/editors/transform/transform_snap_object.cc:2760
#7  0x0000000005d9ab3c in iter_snap_objects (sctx=0x7fffc9746088, params=0x7fffffffc70c, 
    sob_callback=0x5da0129 <snap_obj_fn(SnapObjectContext*, SnapObjectParams const*, Object*, 
float const (*) [4], bool, void*)>, data=0x7fffffffc470)
    at /home/jaguar/blender-src/blender-git/blender/source/blender/editors/transform/transform_snap_object.cc:485
#8  0x0000000005da0604 in snapObjectsRay (sctx=0x7fffc9746088, params=0x7fffffffc70c, 
    dist_px=0x7fffffffc51c, r_loc=0x7fffffffc594, r_no=0x7fffffffc588, 
    r_index=0x7fffffffc53c, r_ob=0x7fffffffc5a0, r_obmat=0x7fffffffc540)
    at /home/jaguar/blender-src/blender-git/blender/source/blender/editors/transform/transform_snap_object.cc:2840
#9  0x0000000005da100b in transform_snap_context_project_view3d_mixed_impl (
    sctx=0x7fffc9746088, depsgraph=0x7fffd5ab7908, region=0x7fffcc626b88, 
    v3d=0x7fffcc331008, snap_to_flag=23, params=0x7fffffffc70c, mval=0x7fffffffc728, 
    prev_co=0x7fffffffc71c, dist_px=0x7fffffffc718, r_loc=0x7fffffffc7d4, 
    r_no=0x7fffffffc7c8, r_index=0x7fffffffc730, r_ob=0x0, r_obmat=0x7fffffffc770, 
    r_face_nor=0x7fffffffc7bc)
    at /home/jaguar/blender-src/blender-git/blender/source/blender/editors/transform/transform_snap_object.cc:3153
#10 0x0000000005da11d5 in ED_transform_snap_object_project_view3d_ex (sctx=0x7fffc9746088, 
    depsgraph=0x7fffd5ab7908, region=0x7fffcc626b88, v3d=0x7fffcc331008, snap_to=23, 
    params=0x7fffffffc70c, mval=0x7fffffffc728, prev_co=0x7fffffffc71c, 
    dist_px=0x7fffffffc718, r_loc=0x7fffffffc7d4, r_no=0x7fffffffc7c8, 
    r_index=0x7fffffffc730, r_ob=0x0, r_obmat=0x7fffffffc770, r_face_nor=0x7fffffffc7bc)

Last night, not in a debug build, I got:

# Blender 3.3.0, Commit date: 2022-05-23 03:33, Hash ea97c24c02b7
bpy.context.space_data.shading.type = 'SOLID'  # Property
bpy.context.space_data.shading.type = 'MATERIAL'  # Property
bpy.ops.image.replace(filepath="//feeding-pump.png", relative_path=True)  # Operator
bpy.ops.object.editmode_toggle()  # Operator
bpy.ops.transform.translate(value=(3.1665e-08, 0.00513303, 0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.translate(value=(0, 0, 0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.translate(value=(0, -5.96046e-08, 0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.translate(value=(9.68575e-08, -2.98023e-08, 0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.object.editmode_toggle()  # Operator
Saved "feeding-pump-enclosure-15-svideo_191573_autosave.blend"  # Info
bpy.ops.object.hide_view_clear()  # Operator
bpy.ops.outliner.item_activate(deselect_all=True)  # Operator
bpy.ops.outliner.collection_drop()  # Operator
bpy.ops.outliner.collection_drop()  # Operator
bpy.ops.outliner.collection_drop()  # Operator
bpy.data.scenes["Scene"].(null) = True  # Property
bpy.data.scenes["Scene"].(null) = False  # Property
bpy.data.scenes["Scene"].(null) = True  # Property
bpy.data.scenes["Scene"].(null) = False  # Property
bpy.ops.outliner.item_activate(deselect_all=True)  # Operator
bpy.ops.outliner.item_activate(deselect_all=True)  # Operator
bpy.ops.outliner.item_activate(deselect_all=True)  # Operator
bpy.ops.outliner.item_activate(deselect_all=True)  # Operator
bpy.data.scenes["Scene"].(null) = True  # Property
bpy.data.scenes["Scene"].(null) = False  # Property
bpy.ops.outliner.item_activate(deselect_all=True)  # Operator
bpy.ops.outliner.collection_drop()  # Operator
bpy.data.scenes["Scene"].(null) = True  # Property
bpy.data.scenes["Scene"].(null) = False  # Property
bpy.data.scenes["Scene"].(null) = True  # Property
bpy.data.scenes["Scene"].(null) = False  # Property
bpy.ops.outliner.collection_drop()  # Operator
bpy.data.scenes["Scene"].(null) = True  # Property
bpy.ops.outliner.collection_drop()  # Operator
bpy.ops.object.editmode_toggle()  # Operator
bpy.ops.mesh.shortest_path_pick(edge_mode='SELECT', use_fill=False, index=69)  # Operator
bpy.ops.mesh.shortest_path_pick(edge_mode='SELECT', use_fill=False, index=28)  # Operator
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='EDGE')  # Operator
bpy.ops.mesh.subdivide()  # Operator
bpy.ops.transform.edge_slide(value=0.5722, mirror=True, correct_uv=True)  # Operator
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='VERT')  # Operator
bpy.ops.mesh.vert_connect_path()  # Operator
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='FACE')  # Operator
bpy.context.object.modifiers["Solidify"].show_viewport = False  # Property
bpy.context.object.modifiers["Bevel"].show_viewport = False  # Property
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='VERT')  # Operator
bpy.ops.mesh.vert_connect_path()  # Operator
bpy.ops.mesh.hide(unselected=False)  # Operator
bpy.ops.mesh.edge_face_add()  # Operator
bpy.ops.mesh.f2()  # Operator
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='EDGE')  # Operator
bpy.ops.mesh.edge_face_add()  # Operator
bpy.ops.object.material_slot_assign()  # Operator
bpy.ops.mesh.f2()  # Operator
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='FACE')  # Operator
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='EDGE')  # Operator
bpy.ops.mesh.subdivide()  # Operator
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='VERT')  # Operator
bpy.ops.transform.translate(value=(0, 0, -0.00493865), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(False, False, True), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.translate(value=(-0.00336161, 0, 0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(True, False, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.mesh.edge_face_add()  # Operator
bpy.ops.mesh.f2()  # Operator
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='EDGE')  # Operator
bpy.ops.mesh.edge_face_add()  # Operator
bpy.ops.object.material_slot_assign()  # Operator
bpy.ops.mesh.f2()  # Operator
bpy.ops.mesh.edge_face_add()  # Operator
bpy.ops.object.material_slot_assign()  # Operator
bpy.ops.mesh.f2()  # Operator
bpy.ops.mesh.edge_face_add()  # Operator
bpy.ops.object.material_slot_assign()  # Operator
bpy.ops.mesh.f2()  # Operator
bpy.ops.mesh.f2()  # Operator
bpy.ops.mesh.select_all(action='TOGGLE')  # Operator
bpy.ops.mesh.select_all(action='TOGGLE')  # Operator
bpy.ops.mesh.normals_make_consistent(inside=False)  # Operator
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='FACE')  # Operator
bpy.ops.mesh.normals_make_consistent(inside=False)  # Operator
bpy.ops.mesh.normals_make_consistent(inside=True)  # Operator
bpy.ops.mesh.normals_make_consistent(inside=False)  # Operator
bpy.context.space_data.shading.type = 'SOLID'  # Property
bpy.ops.mesh.normals_make_consistent(inside=False)  # Operator
bpy.ops.mesh.normals_make_consistent(inside=True)  # Operator
bpy.ops.mesh.normals_make_consistent(inside=False)  # Operator
bpy.ops.mesh.normals_make_consistent(inside=True)  # Operator
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='VERT')  # Operator
bpy.ops.mesh.shortest_path_pick(edge_mode='SELECT', use_fill=False, index=3)  # Operator
bpy.context.space_data.context = 'DATA'  # Property
bpy.ops.object.vertex_group_add()  # Operator
bpy.data.objects["Enclosure TOP"].(null) = 7  # Property
bpy.data.objects["Enclosure TOP"].(null) = "SVideo Chunk"  # Property
bpy.context.space_data.context = 'MODIFIER'  # Property
bpy.ops.object.modifier_copy(modifier="Mask")  # Operator
bpy.context.object.modifiers["Mask.001"].vertex_group = ""  # Property
bpy.context.object.modifiers["Mask.001"].vertex_group = "SVideo Chunk"  # Property
bpy.context.object.modifiers["Mask.001"].invert_vertex_group = True  # Property
bpy.ops.object.editmode_toggle()  # Operator
bpy.ops.object.editmode_toggle()  # Operator
bpy.ops.mesh.reveal()  # Operator
bpy.context.space_data.context = 'DATA'  # Property
bpy.ops.object.editmode_toggle()  # Operator
bpy.ops.object.editmode_toggle()  # Operator
bpy.ops.mesh.select_all(action='DESELECT')  # Operator
bpy.ops.object.vertex_group_select()  # Operator
bpy.ops.mesh.select_all(action='DESELECT')  # Operator
bpy.ops.object.editmode_toggle()  # Operator
bpy.context.space_data.context = 'MODIFIER'  # Property
bpy.context.object.modifiers["B+Stands Top"].show_viewport = False  # Property
bpy.context.object.modifiers["B+Txt-Play"].show_viewport = False  # Property
bpy.context.object.modifiers["B-BarrelPower"].show_viewport = False  # Property
bpy.context.object.modifiers["B-BarrelPump"].show_viewport = False  # Property
bpy.context.object.modifiers["B-NubsFemme"].show_viewport = False  # Property
bpy.context.object.modifiers["B-Button Holes"].show_viewport = False  # Property
bpy.context.object.modifiers["B-Pot Holes"].show_viewport = False  # Property
bpy.context.object.modifiers["B-EspPort"].show_viewport = False  # Property
bpy.context.object.modifiers["Mask"].show_viewport = False  # Property
bpy.context.object.modifiers["Mask.001"].show_viewport = False  # Property
bpy.context.object.modifiers["Mask"].show_viewport = True  # Property
bpy.context.object.modifiers["Mask.001"].show_viewport = True  # Property
bpy.context.space_data.context = 'DATA'  # Property
bpy.ops.object.editmode_toggle()  # Operator
bpy.ops.mesh.select_all(action='DESELECT')  # Operator
bpy.data.objects["Enclosure TOP"].(null) = 4  # Property
bpy.ops.object.vertex_group_select()  # Operator
bpy.ops.mesh.select_all(action='DESELECT')  # Operator
bpy.ops.object.vertex_group_select()  # Operator
bpy.ops.mesh.select_all(action='INVERT')  # Operator
bpy.ops.mesh.select_all(action='DESELECT')  # Operator
bpy.ops.object.editmode_toggle()  # Operator
bpy.ops.object.editmode_toggle()  # Operator
bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='FACE')  # Operator
bpy.ops.mesh.normals_make_consistent(inside=False)  # Operator
bpy.ops.object.editmode_toggle()  # Operator
bpy.context.space_data.context = 'MODIFIER'  # Property
bpy.context.object.modifiers["Bevel"].show_viewport = True  # Property

# backtrace
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(BLI_system_backtrace+0x20) [0xc15d130]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0x118bc59]
/lib/x86_64-linux-gnu/libc.so.6(+0x3bd60) [0x7fc06d40cd60]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(GPU_indexbuf_set_tri_verts+0xb) [0xaad0b6b]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0x18e6555]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0x18df688]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0xc1619be]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0xc161d66]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0x16dc945]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0x16dcbfb]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0x16da490]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(BLI_task_parallel_range+0x20b) [0xc160adb]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0x18dfdf0]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0xc15dfe5]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0x16dc945]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0x16dcbfb]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0x16cae22]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(BLI_task_graph_work_and_wait+0x4e) [0xc15d6be]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0x187c778]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(DRW_draw_render_loop_ex+0x430) [0x187e0d0]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(view3d_main_region_draw+0x8f) [0x241e13f]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(ED_region_do_draw+0x861) [0x1be6cf1]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(wm_draw_update+0x75b) [0x16e54eb]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(WM_main+0x30) [0x16e2260]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(main+0x321) [0x108d541]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xea) [0x7fc06d3f7d0a]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(_start+0x2a) [0x118857a]

# Python backtrace

And yesterday/the day before:

# Blender 3.3.0, Commit date: 2022-05-23 03:33, Hash ea97c24c02b7
bpy.context.space_data.shading.type = 'SOLID'  # Property
bpy.ops.object.parent_set(type='OBJECT', keep_transform=True)  # Operator
bpy.ops.outliner.item_activate(deselect_all=True)  # Operator
bpy.ops.object.select_grouped(type='CHILDREN_RECURSIVE')  # Operator
bpy.ops.outliner.item_activate(deselect_all=True)  # Operator
bpy.ops.outliner.collection_duplicate()  # Operator
bpy.ops.outliner.item_activate(deselect_all=True)  # Operator
bpy.ops.outliner.item_activate(deselect_all=True)  # Operator
bpy.ops.transform.translate(value=(0, 0, 0.0673055), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(False, False, True), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.rotate(value=1.5708, orient_axis='Z', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(False, False, True), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.rotate(value=3.14159, orient_axis='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(True, False, False), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.translate(value=(1.60836e-18, 0.0543255, 0.0072434), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.translate(value=(2.44695e-18, -0.00384663, 0.0110201), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.translate(value=(2.41205e-19, -0.00396913, 0.00108629), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.context.space_data.shading.type = 'MATERIAL'  # Property
bpy.context.space_data.context = 'MODIFIER'  # Property
Saved "feeding-pump-enclosure-14-svideo.blend"  # Info
bpy.ops.object.modifier_add(type='BEVEL')  # Operator
bpy.context.object.modifiers["Bevel"].width = 0.00025  # Property
bpy.context.object.modifiers["Bevel"].segments = 2  # Property
bpy.context.object.modifiers["Bevel"].segments = 3  # Property
bpy.context.object.modifiers["Bevel"].segments = 2  # Property
bpy.context.object.modifiers["Bevel"].segments = 1  # Property
bpy.ops.transform.translate(value=(-0, -0, -5.44237e-05), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(False, False, True), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.translate(value=(-0.0369276, -0.00311889, 0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
X-Ray not available in current mode  # Info
X-Ray not available in current mode  # Info
bpy.context.space_data.shading.type = 'SOLID'  # Property
bpy.ops.transform.translate(value=(0.00391064, 0, 0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(True, False, False), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
Saved "feeding-pump-enclosure-14-svideo.blend"  # Info
bpy.ops.transform.translate(value=(-0.005, -0, -0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(True, False, False), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.object.select_grouped(type='CHILDREN_RECURSIVE')  # Operator
bpy.ops.object.select_grouped(type='PARENT')  # Operator
bpy.ops.transform.translate(value=(-0, -0.0114157, -0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(False, True, False), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.translate(value=(-0, -0.00933953, -0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(False, True, False), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.translate(value=(-0, -0.0033638, -0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(False, True, False), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.translate(value=(-0, -0.00268229, -0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(False, True, False), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.translate(value=(-0.00186508, -0.00085634, 0.00777427), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.translate(value=(0, 0.00936542, 0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(False, True, False), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.transform.translate(value=(0, 0.00520937, 0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(False, True, False), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
Saved "feeding-pump-enclosure-14-svideo.blend"  # Info
Saved "feeding-pump-enclosure-14-svideo.blend"  # Info
Saved "feeding-pump-enclosure-14-svideo.blend"  # Info
bpy.ops.object.editmode_toggle()  # Operator
bpy.ops.font.delete(type='PREVIOUS_OR_SELECTION')  # Operator
bpy.ops.font.delete(type='PREVIOUS_OR_SELECTION')  # Operator
bpy.ops.font.delete(type='PREVIOUS_OR_SELECTION')  # Operator
bpy.ops.font.delete(type='PREVIOUS_OR_SELECTION')  # Operator
bpy.ops.font.delete(type='PREVIOUS_OR_SELECTION')  # Operator
bpy.ops.font.text_paste()  # Operator
bpy.ops.object.editmode_toggle()  # Operator
bpy.context.space_data.context = 'DATA'  # Property
Saved "feeding-pump-enclosure-14-svideo.blend"  # Info
bpy.context.space_data.params.directory = "/usr/share/fonts/truetype/noto/NotoSansSymbols2-Regular.ttf"  # Property
bpy.context.space_data.params.filter_search = "symbol"  # Property
bpy.ops.font.open(filepath="//../../../../usr/share/fonts/truetype/noto/NotoKufiArabic-SemiBold.ttf", relative_path=True)  # Operator
bpy.context.space_data.params.filter_search = "symb"  # Property
bpy.ops.font.open(filepath="//../../../../usr/share/fonts/truetype/noto/NotoSansSymbols2-Regular.ttf")  # Operator
Saved "feeding-pump-enclosure-14-svideo.blend"  # Info
bpy.ops.transform.translate(value=(-0.000920805, 0.00341884, 0.00204191), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
Saved "feeding-pump-enclosure-14-svideo.blend"  # Info
Saved "feeding-pump-enclosure-14-svideo.blend"  # Info
bpy.context.space_data.context = 'MODIFIER'  # Property
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
bpy.ops.object.hide_view_set(unselected=False)  # Operator
Saved "feeding-pump-enclosure-14-svideo.blend"  # Info
bpy.ops.transform.translate(value=(-0.002, -0, -0), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(True, False, False), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
Saved "feeding-pump-enclosure-14-svideo.blend"  # Info
bpy.context.space_data.shading.type = 'MATERIAL'  # Property
bpy.ops.transform.translate(value=(-0.0601634, 7.16446e-05, -0.00065103), orient_axis_ortho='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False)  # Operator
bpy.ops.object.hide_view_clear()  # Operator
 
# backtrace
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(BLI_system_backtrace+0x20) [0xc15d130]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0x118bc59]
/lib/x86_64-linux-gnu/libc.so.6(+0x3bd60) [0x7f003062fd60]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(EEVEE_shadows_caster_register+0x27) [0x18a86e7]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(EEVEE_cache_populate+0x11b) [0x189131b]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender() [0x187c708]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(DRW_draw_render_loop_ex+0x430) [0x187e0d0]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(view3d_main_region_draw+0x8f) [0x241e13f]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(ED_region_do_draw+0x861) [0x1be6cf1]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(wm_draw_update+0x75b) [0x16e54eb]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(WM_main+0x30) [0x16e2260]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(main+0x321) [0x108d541]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xea) [0x7f003061ad0a]
/home/jaguar/blender-src/blender-git/build_linux/bin/blender(_start+0x2a) [0x118857a]
 
# Python backtrace
  • Collection-handling fix

Okay, finally. I've got a blend that seems to crash consistently with a debug build.

#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x00007ffff75b1537 in __GI_abort () at abort.c:79
#2  0x0000000011f71543 in _BLI_assert_abort ()
    at /.../blender/source/blender/blenlib/intern/BLI_assert.c:46
#3  0x0000000012068e7c in blender::meshintersect::init_face_merge_state (fms=0x7fffe51b52c0, 
    tris=..., tm=..., norm=...)
    at /.../blender/source/blender/blenlib/intern/mesh_boolean.cc:3064
#4  0x0000000012069e01 in blender::meshintersect::merge_tris_for_face (tris=..., tm=..., 
    imesh_in=..., arena=0x7fffe51b6278)
    at /.../blender/source/blender/blenlib/intern/mesh_boolean.cc:3292
#5  0x000000001206aeb1 in blender::meshintersect::polymesh_from_trimesh_with_dissolve (
    tm_out=..., imesh_in=..., arena=0x7fffe51b6278)
    at /.../blender/source/blender/blenlib/intern/mesh_boolean.cc:3482
#6  0x000000001206be14 in blender::meshintersect::boolean_mesh(blender::meshintersect::IMesh&, blender::meshintersect::BoolOpType, int, std::function<int (int)>, bool, bool, blender::meshintersect::IMesh*, blender::meshintersect::IMeshArena*) (imesh=..., 
    op=blender::meshintersect::BoolOpType::Difference, nshapes=5, shape_fn=..., 
    use_self=false, hole_tolerant=false, imesh_triangulated=0x0, arena=0x7fffe51b6278)
    at /.../blender/source/blender/blenlib/intern/mesh_boolean.cc:3712
#7  0x000000000620d7ff in blender::meshintersect::direct_mesh_boolean (meshes=..., 
    transforms=..., target_transform=..., material_remaps=..., use_self=false, 
    hole_tolerant=false, boolean_mode=2)
    at /.../blender/source/blender/blenkernel/intern/mesh_boolean_convert.cc:825
#8  0x0000000004f29b82 in exact_boolean_mesh (bmd=0x7fffe0e1a728, ctx=0x7fffe51b6d60, 
    mesh=0x7fffdf28b008)
    at /.../blender/source/blender/modifiers/intern/MOD_boolean.cc:448
#9  0x0000000004f29ce9 in modifyMesh (md=0x7fffe0e1a728, ctx=0x7fffe51b6d60, 
    mesh=0x7fffdf28b008)
    at /.../blender/source/blender/modifiers/intern/MOD_boolean.cc:472
#10 0x0000000004108ebc in BKE_modifier_modify_mesh (md=0x7fffe0e1a728, ctx=0x7fffe51b6d60, 
    me=0x7fffdf28b008)
    at /.../blender/source/blender/blenkernel/intern/modifier.c:972
#11 0x000000000460d6ca in modifier_modify_mesh_and_geometry_set (md=0x7fffe0e1a728, 
    mectx=..., input_mesh=0x7fffdf28b008, geometry_set=...)
    at /.../blender/source/blender/blenkernel/intern/DerivedMesh.cc:685
#12 0x000000000460e556 in mesh_calc_modifiers (depsgraph=0x7fffe7519008, 
    scene=0x7fffef069008, ob=0x7fffe7659008, use_deform=true, need_mapping=false, 
    dataMask=0x7fffe51b6f70, use_cache=true, allow_shared_mesh=true,
    r_deform=0x7fffe51b6f08, r_final=0x7fffe51b6f10, r_geometry_set=0x7fffe51b6f00)           
    at /.../blender/source/blender/blenkernel/intern/DerivedMesh.cc:1028
#13 0x0000000004610574 in mesh_build_data (depsgraph=0x7fffe7519008, scene=0x7fffef069008, 
    ob=0x7fffe7659008, dataMask=0x7fffe51b6f70, need_mapping=false)
    at /.../blender/source/blender/blenkernel/intern/DerivedMesh.cc:1613
#14 0x0000000004610ba3 in makeDerivedMesh (depsgraph=0x7fffe7519008, scene=0x7fffef069008, 
    ob=0x7fffe7659008, dataMask=0x7fffe51b6ff0)
    at /.../blender/source/blender/blenkernel/intern/DerivedMesh.cc:1784
#15 0x000000000418257c in BKE_object_handle_data_update (depsgraph=0x7fffe7519008, 
    scene=0x7fffef069008, ob=0x7fffe7659008)
    at /.../blender/source/blender/blenkernel/intern/object_update.c:173
#16 0x0000000004182d55 in BKE_object_eval_uber_data (depsgraph=0x7fffe7519008, 
    scene=0x7fffef069008, ob=0x7fffe7659008)
    at /.../blender/source/blender/blenkernel/intern/object_update.c:336
#17 0x0000000004d2c2ba in operator() (__closure=0x7fffe76a44c8, depsgraph=0x7fffe7519008)
    at /.../blender/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc:1451
#18 0x0000000004d37990 in std::__invoke_impl<void, blender::deg::DepsgraphNodeBuilder::build_object_data_geometry(Object*)::<lambda(Depsgraph*)>&, Depsgraph*>(std::__invoke_other, struct {
...} &) (__f=...) at /usr/include/c++/10/bits/invoke.h:60
#19 0x0000000004d34d49 in std::__invoke_r<void, blender::deg::DepsgraphNodeBuilder::build_obje
ct_data_geometry(Object*)::<lambda(Depsgraph*)>&, Depsgraph*>(struct {...} &) (__fn=...)
    at /usr/include/c++/10/bits/invoke.h:110
#20 0x0000000004d31dd8 in std::_Function_handler<void(Depsgraph*), blender::deg::DepsgraphNode
Builder::build_object_data_geometry(Object*)::<lambda(Depsgraph*)> >::_M_invoke(const std::_An
y_data &, Depsgraph *&&) (__functor=..., __args#0=@0x7fffe51b7130: 0x7fffe7519008)
    at /usr/include/c++/10/bits/std_function.h:291
#21 0x0000000004d0d5ef in std::function<void (Depsgraph*)>::operator()(Depsgraph*) const (
    this=0x7fffe76a44c8, __args#0=0x7fffe7519008)
    at /usr/include/c++/10/bits/std_function.h:622
#22 0x0000000004d0c835 in blender::deg::(anonymous namespace)::evaluate_node (
    state=0x7fffffffd8b0, operation_node=0x7fffe76a4408)
...
  • Merge branch 'master' into arcpatch-D11272_1

From discussions in chat, the conclusion was that geometry nodes is the solution here, since it allows you to use any object type. Filtering based on object type is problematic now that an object's evaluated geometry can consist of any type.