46 lines
2.1 KiB
Python
46 lines
2.1 KiB
Python
|
|
"""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),
|
||
|
|
]
|