"""Schema 8: a node has a pivot. `[:xform :pivot]` is back in the transform, as the point rotation and scale are composed about: `local = T(pos)·T(piv)·R·K·S·T(-piv)`. Schema 7 deleted it, on the argument that an anchor is a peg — true as algebra, and not true as a feature. A peg is a node, and a turn about a point that is not the turning node's own origin still has to solve for a position to hold that point still; that solution is an arc in the angle while a position channel tweens along the chord, so it is right on the frame it is written and wrong on every frame between two keys. A drawing escaped it, since its origin is the middle of what it draws. A symbol instance could not: its origin is its symbol's, which is the top-left corner of the stage, so one keyed turn of an instance swung its drawing round that corner on an orbit the size of the stage. CONVERTED, unlike 6 and 7, because adding this one is exact. A schema-7 node has no pivot; an absent pivot reads as [0 0]; and T(pos)·T(0)·M·T(-0) is T(pos)·M to the last bit of the mantissa. Every stored document therefore composes to exactly the matrices it composed to before, dense tier-2 transforms included, so there is nothing to guess at and no node a conversion could silently move. The version is restamped and nothing else is touched. What a converted document does NOT get is a pivot somebody chose: nodes placed before this carry none, so they still turn about their own origin until the first turn or scale writes one — `gesture/with-pivot`, from the middle of what the node draws at that moment — or until the cross is dragged (ctrl/cmd-drag on the stage). """ from django.db import migrations, models def forwards(apps, schema_editor): apps.get_model("clips", "Project").objects.update(schema_version=8) class Migration(migrations.Migration): dependencies = [("clips", "0016_an_anchor_is_a_peg")] operations = [ migrations.AlterField( model_name="project", name="schema_version", field=models.PositiveIntegerField(default=8), ), migrations.RunPython(forwards, migrations.RunPython.noop), ]