GSoC 2021: Porting Popular Modifiers To Geometry Nodes: Weekly Reports

Hello everyone! This is the Weekly Reports thread for my GSOC project: “Porting Popular Modifiers To Geometry Nodes.”

More coming soon.


Week 1
Studied the Code from remesh, solidify and decimate modifier.
Made some initial mockups for how the nodes could look like.
I created the corresponding tasks on
⚓ T89050 Solidify Node
⚓ T89051 Decimate Node
⚓ T89052 Remesh Node

Started to work on the solidify node to test how to generalize functions between Modifier and Node and especially how to handle masking which is done with vertex groups using DefVerts in the modifiers and with attributes for the node.
Pushed the initial branch: origin/gsoc-2021-porting-modifiers-to-nodes-solidify
And uploaded a WIP-Patch (because I like to work with this on Phabricator) ⚙ D11575 Geometry Nodes: Solidify Node


7 posts were split to a new topic: Geometry / Function Nodes

Week 2

Started to look more into Remesh and Decimate and initialized branches for both with the basic node setup.

Made the solidify nodes layout a bit nicer e.g. made it a bit wider so that Thickness and Boundary are not cut.

Removed simple mode from Solidify node and removed Mode dropdown

Fill and Rim options are now independent an both positive. Before it was Fill and Rim Only before, with Rim Only only working when Fill was pn.

Generalized output vertex groups in the solidify code and made it work with attributes in the node. Note that what part of the model is rim and what part of the model is fill is not quite obvious and maybe can be optimized later. For now I keep the behavior same as the Modifier.

Generalized Modifiers Material Offset so it can use face attributes.
This gives the expected results with my materials example.
Not sure if I keep that many attributes inputs, but maybe they make sense.


Week 3

This week I mostly did polishing and cleanup for the solidify node.
I consolidated Thickness float socket and Distance Attribute socket into one with a dropdown to switch between float and attribute input like used in other nodes. Also I removed the vertex output attributes and because face output return the expected result and should implicitly convert to vertex domain where needed.
Also renamed Shell to Fill but this may be a controversial decision. Feedback is welcome.

Next week I plan to work on the decimate node.


Week 4

This Week I started porting the decimate modifier.
After a first test, I decided to split it into 3 seperate nodes instead of one with a mode dropdown. I’m happy with how this went and way less code was required than for the solidify modifier.
The resulting nodes are:

  1. Collapse

  2. Unsubdivide

  3. Dissolve

For everybody who wants to test or play with it:
I pushed a public branch to git: soc-2021-porting-modifiers-to-nodes-decimate
And created a patch ⚙ D11791 Geometry Nodes: Collapse Node, Dissolve Node, Unsubdivide Node


Decimate planar and limited dissolve operator allow multiple choices for delimit, but node only has single choice drop-down. Is this node ui limitation or more complex issue?




would not be better separate the triangular option in a separate node? because i donot see reason to mix in a modifier when you have the node.


Why should it be separate? We already have a triangulate node. Why would there be a need to have another separate node. I think having it on the collapse node is fine.

1 Like

because that is the philosophy of nodes, one operation, one node.

I mean there is already a node that does the exact same thing (and it’s like one of those first nodes we had in 2.92), just use the “fixed” mode and they behave exactly the same.

The same goes for modifier stack, you could always put a triangulate modifier after decimate modifier, but with it on the decimate it is just more convenient.

Modifier list is more a content for all solutions and work with a list of modifier is hard, so the list be reduced. Nodes are easy to concatenate, and the idea is to have always atomic solutions easy to maintain.

Sorry for answering late. You are true. But in this case the triagulate option is not really ment to triangulate the mesh. It’s more for allowing the algorithm to use triangles, which is just an option how the current algorithm works. Its still a question to expose this or not.


Week 5
This week I refined the Collapse, Unsubdivide and Dissolve Nodes.

  • did code cleanup on all three nodes.
  • added selection to Unsubdivide.
  • added attribute delimiter to Dissolve Node.
    Attribute delimiter works with two modes.
    1. Selection: Just take what is selected and use it as delimiter.
    2. Border: Take the border between selected and unselected as delimiter.

PS: In the videos the modes are still called Edge (now Selection) and Face (now Border)


Good Point. I changed this to work with attributes instead.

Week 6

Besides further polishing Collapse, Unsubdivide, Dissolve Nodes,
I started working on porting the Remesh modifier.

I added two new nodes: Remesh Voxel and Remesh Blocks.

I also added a initial patch for the new geometry module for shared code between modifier and nodes and started moving all instances where I previously moved shared code to blender kernel to geometry.


What about having a voxel amount mode? It should be less likely to cause the user to use a super heavy value by accident and cause crash. This mode is in volume to mesh modifier (and node) if I remember it correctly and it really helps.

Week 7

This week I made a Quadriflow remesh node, which turned out to be way to slow to be usable.

I added a mode dropdown to the remesh blocks node

I made a port of the weld modifier.
(I already made a merge by distance node earlier this year but using another algorithm, which to put it simple, works a bit better and feels more complete)


I have a bit of problem trying to understand this sentence. Is the better and more complete one the one you newly made? Or is the old one? I first read the sentence as the old one but I don’t think it make sense for you make a new one while the old one is better.

What I was trying to say is, that the Modifier works a bit better. And better only means that:

  1. felt a bit nicer to use.
  2. I assume an established and proven algorithm to work better than my new implementation.