Convert to Mesh should work with Geometry Nodes

This post is related to this issue: ⚓ T89472 Object using Point Instance GN node can not be converted to mesh.

Basically, with the rise of GN, it’s becoming more and more common for users to want to “collapse” the result of whatever procedural modeling they do in GN. There are many cases where this is desired, such as exporting to game engines.

Unfortunately, the way Blender currently handles converting instances placed through GN or Particle System is very clumsy, and offloads tons of work onto the user, instead of handling it for them.

I’ve been needing to do that so often I actually wrote a script to do it:

    bl_idname = 'object.lk_applied_copy'

    bl_label = 'Applied Copy'

    @classmethod

    def poll(cls, context):

        return context.active_object is not None

    def execute(self, context):

        # Store active base object

        obj = context.active_object

        # Turn Instances into real objects (It selects the objects)

        bpy.ops.object.duplicates_make_real()

        bpy.context.view_layer.objects.active = bpy.context.selected_objects[0]

        # If base object had mesh instances, join them together and join them with base object

        if context.active_object is not obj:

            bpy.ops.object.make_single_user(object=False, obdata=True, material=False, animation=False)

            bpy.ops.object.join()

            bpy.ops.object.transform_apply(location=True, rotation=True, scale=True, properties=False)

            # Store merged instances oject

            instances = context.active_object

            # Clear selection and set base object to be selected and active

            bpy.ops.object.select_all(action="DESELECT")

            obj.select_set(True)

            bpy.context.view_layer.objects.active = obj

            # Duplicate base object and apply modifiers

            bpy.ops.object.duplicate()

            bpy.ops.object.convert(target='MESH')

            # Join merged instances to base object

            instances.select_set(True)

            bpy.ops.object.join()

        else:

            # Duplicate base object and apply modifiers

            bpy.ops.object.duplicate()

            bpy.ops.object.convert(target='MESH')

        return {'FINISHED'}

The length of it kinda shows how many manual steps users have to do to perform this simple task. Writing the script made me realize how ridiculous it is that such a basic functionality has to be scripted, and that most Blender users don’t even know how to use Python anyway.

So what I propose is to simply make the Convert to Mesh operator handle instances, so that it merges them together and joins them with the mesh for the user.