Page MenuHome

Modifiers which deform spline points propagate across all users of the same data unexpectedly
Confirmed, HighPublicBUG

Description

Version: 2.81 build Oct 23 (Linux 64)

When a Curve Object Modifier uses the "Apply On Spline" setting, it seems to affect the curve data directly. This means that if a curve data block is used by multiple objects, a modifier on one of those objects will affect all the others.

To reproduce, open and inspect the attached file. Notice that the objects on the left both have deformation modifiers, while their clones on the right do not. However, the curve object still appears to be modified because it uses the same data as the modified curve object. This is not how modifiers are supposed to behave.

The expected behavior is demonstrated by the two mesh objects. Like the curve objects, they also share the same data, but the effect of the modifier is limited to the owner of the modifier.

Event Timeline

Germano Cavalcante (mano-wii) lowered the priority of this task from 90 to High.

I can confirm. Other objects are using the modified data.
This did not happen in Blender 2.79.

@Bastien Montagne (mont29), according to the modules's page, you maintain modifiers and curves.
Could you take a look?

Cc @Campbell Barton (campbellbarton).

this is not really my area, from quick look in code I have the impression that data onto which the modifier is applied is properly de-duplicated during eval, so I'd first suspect some issue in drawing code itself (also because outline does not follow shown geometry...). it also reminds me of some similar issue we had with meshes at some points, because drawing cache was per obdata and not per object or something like that... that was fixed for meshes, not sure if it was for other geometry types? We need @Clément Foucault (fclem) or @Jeroen Bakker (jbakker) to have a look at that first imho.

Hi, sorry, is there any chance this bug been looked at before the final release?

Also think thats an Eevee / drawing problem [Cycles renders this correctly...]

Its seems like a problem that has been lingering for a while and very bad for people doing rigs that involve curves, even if just for view port representation. Just came across it recently because Im a newcomer from another 3D package but its a worrying issue.

Both objects have the same ob->data but different ob->runtime.curve_cache.
The problem is that all drawing information is cached in ((Curve *)ob->data)->batch_cache.
I see two possible solutions:

  • also create mesh_eval for this type of modifier (pretessellatePoint) or,
  • move batch_cache from cu to curve_cache.