GSoC 2025: Edit Mesh Mirror Improvements

Hello everyone, my name is Tariq Ganda Sulley, a final year electrical/electronics engineering student at the Kwame Nkrumah University of Science and Technology and I’ll be working on the edit mesh mirror improvements project for GSoC 2025.

Contact

Blender Chat: @tariq

Synopsis

The aim of this project is to extend and improve Blender’s edit mesh mirror functionality to support a broader range of operations. I will develop a robust solution that enables mirroring for sixteen operators (nine already completed), thereby making edit mesh mirroring a general modeling tool rather than a niche feature.

Benefits

Enhancing mirror editing in edit mode will streamline the modeling process, which will give artists more intuitive and efficient control over symmetrical models. With multi axis mirror support, artists can perform complex, symmetrical edits such as creasing edges, smoothing vertices, or extruding directly in edit mode, saving significant time over workarounds like deleting half the model and applying a mirror modifier.
Also, since shape keys depend on the actual vertex positions and an unapplied mirror modifier only affects the display rather than the underlying mesh, having true mirror editing directly in edit mode is essential for ensuring consistent deformations. For intricate, nearly finished models needing quick and precise tweaks, having edit mode mirroring support for the needed operators would eliminate the impracticality of rebuilding symmetry from scratch using a mirror modifier, ensuring consistency without disrupting already completed workflows.

Deliverables

  • Implementation of multi-axis mirror functionality in edit mode for seven operators currently lacking symmetry support: Inset Faces, Selection To Grid, Selection To Active, Vertex Crease, Extrude Individual, Extrude Along Normals, and Poke Faces building on the nine operators I’ve already completed making sixteen in total.
  • Comprehensive end user documentation alongside developer notes on the mirroring framework.
  • A set of tests to validate the mirroring functionality of targeted operators across diverse mesh topologies, paired with performance benchmarks to ensure interactive responsiveness.

Project Details

My proposal seeks to transform Blender’s edit mesh mirroring into a versatile, multi-axis modeling tool by enhancing its transformation system to support a wide array of operators. I’ll generalize and refine the existing mirror logic to address current limitations such as inconsistent symmetry support. This effort will involve a structured approach across three key areas:

Analyzing the Current System

I’ll start by analyzing how Blender’s transformation system handles edit mode operators.I’ll then examine operators that lack mirroring.This analysis will establish a baseline for extending symmetry support systematically across diverse operator types.

Standardizing Mirror Functionality

I’ll utilize and enhance Blender’s existing mirroring utilities already embedded in the codebase for caching and element retrieval to deliver consistent X, Y, Z symmetry across edit mode operators. These functions offer powerful features, like topology aware mirroring, but are underutilized in many cases. My plan is to integrate them universally, tweaking them where needed to support varied mesh elements (vertices, edges and faces).

Extending Operator Support

Building on my previous work, I’ll implement multi-axis mirroring for seven edit mode operators: Inset Faces, Selection to Grid, Selection to Active, Vertex Crease, Extrude Individual, Extrude Along Normals, and Poke Faces. These currently lack symmetry support in edit mode.

Prior Work

I have already started work on this project. Prior to working on them, I took my time to thoroughly test all the operators which were listed on the Blender ideas page upon which I realized that some of them already support mesh mirroring, particularly sliding (edge and vertex) with smooth vertices only being supported on the x axis.
Further engagement with the Blender community proved my point, pointing to the fact that it was a mistake to have included them on the ideas page which led me to refine my project scope to focus on actual unsupported operators.

Also, the extrude operator already had an option called mirror editing that mirrored an extruded region in any of the x,y,z axes but I found that the result of this was not useful to artists as the mirrored side was not a true extrusion. It was just raising the edges of the mirrored side to match the original which made the situation worse making the model unsymmetrical.


Blender’s current mirror editing for extrusion


My proposal

I have implemented the mesh mirror editing in the x,y and z axis for nine operators which you can find below. For every operator, I have a link to a video of the working implementation and notes that summarize how I implemented mesh mirroring.


Mark seam mirrored on the x,y,z axes
Mark Seam Video
Mark seam notes


Mark seam mirrored on Suzzane’s eyes


Smooth vertices mirrored on the z axis
Smooth Vertices Video
Smooth Vertices Notes


Edge crease mirrored on the x,y and z axes
Edge Crease Video
Edge Crease Notes


Mark sharp mirrored on the x,y and z axes
Mark Sharp Video
Mark Sharp Notes


Bevel weight mirrored on the x,y and z axes
Bevel Weight Video
Bevel Weight Notes


Bevel mirrored on the x,y and z axes
Bevel Video
Bevel Notes


Extrude region mirrored on the x,y and z axes
Extrude Region Video
Extrude Region Notes


Normals mirrored on the x,y and z axes
Normals Video
Normals Notes


Weights mirrored on the x axis
Weights Video
Weights Notes

Project Schedule

I will focus on delivering multi-axis mirroring for seven operators essential to symmetrical modeling workflows which are Vertex Crease, Inset Faces, Extrude Individual, Extrude Along Normals (distinct from my prior Extrude Region work), Poke Faces,Selection to Cursor and Selection to Grid all widely used by artists. Building on my completed multi-axis mirroring implementations for nine operators, I aim to showcase a total of sixteen operators in my final presentation. I would work for the full 350 hours in total(~30 hours a work). There will be no conflicts with my activities in school. Should I complete these seven ahead of schedule, I plan to expand the scope by integrating additional operators(loop cut).

Weeks 1–2:

  • Sync with my mentor to align on deliverables and review prior work.
  • Analyze Blender’s existing edit mesh mirror code and document its limitations.
  • Outline a concise design plan for the new multi-axis symmetry framework.
  • Define initial testing and benchmarking criteria for the upcoming development.

Weeks 3–4:

  • Implement multi-axis mirroring for Poke Faces and Vertex Crease.

Weeks 5–6:

  • Implement multi-axis mirroring for Selection to Grid and Selection to Active.

Weeks 7–8:

  • Implement multi-axis mirroring for Extrude Individual and Extrude Along Normals.

Weeks 9–10:

  • Implement multi-axis mirroring for Inset Faces.
  • Begin testing and benchmarking phase.
  • Reserve buffer time for any remaining work.

Weeks 11–12:

  • Finalize code and documentation.
  • Prepare for final evaluation.
22 Likes

Week 1:

This week, I started reviewing my prior work with my mentor. My initial approach to implementing mesh mirroring, even though it worked was quite verbose because I was implementing the mirroring logic in the function of every operator.
Under Mr. Campbell’s mentorship, I am building a EditMeshSymmetryHelper class that will serve as the central hub to handle all mirroring logic to make the code reusable as possible.
I currenly have an open pr where I am fine tuning my implementation with guidance from Mr. Campbell. I would give a visual representation of the EditMeshSymmetryHelper class when I’m done fine tuning it. (Most likely, it would be in my week 2 report)

Also, after inspecting the existing code the of the edit mode operators, I found out that the limitation that prevented them from having symmetry in edit mode was because they had no symmetry aware state. As a result, their execution path was identical regardless of whether the user had enabled X, Y or Z axes mirroring . A critical question which is required for mirror support (Is the symmetrical counterpart of this element selected) was never asked. So the operators had no mechanism to identify that an unselected edge/vertex/face on one side of the mesh should be processed because its mirror on the other side has been selected too.

Using the EditMeshSymmetryHelper class, I have implemented mirroring for mark seam, smooth vertices and poke faces. Poke faces was an operator I planned to tackle in the third week but I have implemented it now as a proof of concept that my EditMeshSymmetry helper class will work on operators that work on vertices(Smooth Vertices), edges(Mark Seam) and faces (Poke faces)

https://projects.blender.org/blender/blender/pulls/139748

15 Likes

Nice to see the progress, and nice to hear about the generalized approach you are taking!

5 Likes

Week 2
This week, I continued refining my EditMeshSymmetryhelper class.
I’ll be diving into the implementation of this class by giving a high level overview.

My implementation defines the EditMeshSymmetryHelper class, which manages symmetry-aware operations in Blender’s edit mode for meshes.

The create_if_needed method checks for valid mesh data and whether symmetry is enabled. If both are true, it constructs the helper object. Inside the constructor, mirror data is prepared by looping through each active symmetry axis and mapping symmetric pairs of vertices, edges, and faces for quick access. I store these mirrored counterparts in a hash map (blender::Map) to enable fast lookup during edit operations.

Explanation of some function parameters:

em is a pointer to the BMEditMesh, which represents the editable version of the mesh data in edit mode (vertices, edges, faces in BMesh format).

mesh is a pointer to the Mesh data-block of the object, which holds the original mesh data (like symmetry flags and edit settings).

mesh->symmetry is a bitflag integer that indicates which symmetry axes (X, Y, Z) are enabled for the mesh in edit mode.

use_topology_mirror is a boolean variable that determines whether topological symmetry (instead of geometric symmetry) should be used when finding mirrored mesh elements.

ob is a pointer to a Blender Object

After the user performs an action on a mesh element, I check whether any mirrored counterpart is affected using is_any_mirror_*_selected. If so, I synchronize the effect by setting or clearing the relevant flags on the mirrored elements using set_flag_on_mirror_*

In the coming weeks, I would be extending mirroring support to more operators.
I already have three pr’s that implement mirroring for seven operators namely mark seam,poke faces,smooth vertices, mark sharp, edge crease, vertex crease and bevel weight.

GSOC-2025-edit-mesh-mirroring-(mark seam/poke faces/smooth vertices)

GSOC-2025-edit-mesh-mirroring-mark-sharp

WIP: gsoc-2025-edit-mesh-mirroring-edge-crease-vertex-crease-and-bevelweight

4 Likes