# Collapse a picture window into a character rebound and mark

Manual Resolve/Fusion construction, not an executed or supplied Resolve project.
Native application validation and source-quality approval remain unverified.
The two original content variants count as one example. Source footage, its
performer, pixel-art character and branded knot are research references only.

## Canvas and native time

Use 1920×1080, 24000/1001 fps, 96 frames: local 0..95 inclusive. The source
interval is [2491,2587), with `sourceFrame = localFrame + 2491`. Preserve the
1001/24000-second frame duration; a 24 fps composition is not equivalent.
Use a matching timeline and silent export. Do not add voice, music or a tail.

`docs/controls.csv` lists every native frame. `src/geometry.json` holds the
aperture, body and mark bounds used by the implementation. These are approximate
raster measurements guiding original artwork, not recovered production controls.

## Layer construction

1. Start with opaque white over the full canvas.
2. Build the selected original room SVG as editable paths and its gradient.
   Add the vase or mobile SVG at pixel (680,190), size 560×720. Transform the
   object independently, around its own center, then merge it over the room.
3. Mask that picture branch with the animated aperture. Mask after merging the
   room and object. Do not scale the picture branch by the aperture's width.
4. Add a separate black circle at the aperture's upper-right corner. It overlaps
   the picture edge and white field; do not clip it inside the aperture mask.
5. Add falling streaks, droplets, original figure body, face and later limbs as
   separate branches. The figure overlaps the final picture frames.
6. At local 61, remove every figure branch and switch to the selected original
   mark. This is a hard replacement, not a character-to-mark morph or crossfade.

All SVGs contain original editable geometry. For the figure, rebuild the
normalized paths in `src/shapes.ts` with Polygon/B-Spline shapes and the matching
control points, then transform them using the body rectangle. Preserve the
separate face and limbs from `src/Scene.tsx`. Rasterized Loaders may help compare
frames but do not satisfy editable-shape construction. SVG gradients, curve
conversion and native rasterization require calibration in the application.

## Coordinate conversion

The code uses top-left pixel coordinates. Map a pixel point (x,y) to Fusion
Center (x/1920,1-y/1080); divide widths by 1920 and heights by 1080. The aperture
center is the midpoint of its bounds. Use straight edges and no corner rounding.
Keep each branch's alpha premultiplied and use normal Over compositing.

## Aperture, marker and independent picture

The aperture is full-frame through local 3. Every local frame 3..18 has an
explicit measured-bound key in `src/geometry.json`. The last window at 18 is
(840,472) to (1080,608), width 240 and height 136. At 19 the picture is absent.
Do not interpolate the visible picture through an extra zero-size frame.

The marker is absent at 0. Its authored radius is 4px at 1, 11px at 2, 20px at 3
and 22px at 4..18. Its center is (windowRight,windowTop), with no inset. The
canvas clips it while the corner is near the screen edge. Remove it at 19.
The small onset radii approximate raster observations; they are not source
opacity or vector-radius measurements.

The picture object uses linear scale 1→0.65 and vertical translation −20→35px
over local 0..18, around its own center (960,550). Its room remains full-frame
inside the aperture. This is an authored independent reframe, not a recovered
photographic camera move. The original vase/mobile replaces the source face.

## Figure timing and geometry

Use the figure's left, top, width and height from the native controls. Its
normalized body domain is 200×220. The path changes by pose; the changing bounds
provide squash and stretch. These original silhouettes differ from the source.

| Local frames | Body pose | Relationship |
| --- | --- | --- |
| 0..15 | Absent | Only picture and marker. |
| 16..19 | Falling | Picture remains through 18; body continues at 19. |
| 20..21 | Squash | Streaks are gone. |
| 22..33 | Puddle | Body spreads; four authored droplets move separately. |
| 34..35 | Neck | Body stretches upward from the pooled base. |
| 36..44 | Airborne oval | Droplets leave at 42, before limbs return. |
| 45..49 | Restored shape and limbs | Descend, then landing squash at 48/49. |
| 50..60 | Standing | Small arm settling, then hold. |
| 61..95 | Absent | Original mark replaces the character. |

At 16 only the source character's bottom fragment is visible at top 0..36. The
implementation authors a full body rectangle (872,−164) to (1044,36); this is
not a full-body source measurement. Subsequent falling bounds are approximately
17: (872,46)..(1044,244), 18: (872,256)..(1044,454), and
19: (872,468)..(1044,664). The figure remains above the shrinking picture at 18.

The measured body rectangles exclude dark outlines and can exclude detached
limbs or droplets. Treat them as approximate body guides, not whole-character
silhouette guarantees. The normalized paths are original, not traced film art.

## Face, streaks, droplets and limbs

The body palette is studio fill #cd775b, highlight #eab89b, ink #633a30; garden
fill #83a683, highlight #c4d6ad, ink #355b45. Face details remain separate from
the squash transform: two 6px eyes, a short stroked mouth, and a pose-dependent
vertical position. Refer to `src/Scene.tsx` for the exact editable coordinates.

Four authored streaks appear at 16..19 above the body, then disappear at 20.
Four droplets appear at 22..41 and disappear at 42. Puddle droplets bob near
the sides; after 34 they follow separate outward/upward/falling paths. Their
count and trajectories are authored approximations, not recovered source paths.
At 22..33 use lateral offsets ±(182 + index × 26 + sin(phase × 7 + index) × 8)px,
where index is 0 or 1 and phase=(frame−22)/12. At 34 and 35 use ±190 and ±216px
so the pooled base cannot cover them. At 36..41 use ±(112 + phase × 45 + index × 26)px
with phase=(frame−34)/8. The 26px pair spacing keeps each droplet separate.

Arms and feet appear at 45 and remain through 60. Arms settle from −14 to +5px
vertical extension over 45..53; feet remain independent rounded shapes. The
source's early folded hands and exact pixel-art limb poses are not reproduced.

## Hard handoff and mark

At 60 the standing figure is visible and the mark is absent. At 61 the figure,
face, limbs and effects are absent and the mark is visible at full opacity.
There is no shared silhouette, shape interpolation or composited overlap.

The mark stays centered at (960,540). Its container follows the sampled source
ink widths/heights: about 142×142 at 61, expanding toward 210×210 at 95. Original
mark paths and their bounds differ from the source knot. Rotate the whole mark
linearly from −42° at 61 to 0° at 75. This rotation and the interpolation of the
unmeasured 76..94 size interval are authored. No exact first perfectly static
source frame is claimed. Keep the actual final frame 95; do not add an outro hold.

## Verification limits

Inspect the independent aperture/object transforms, overlap at 16..18, impact,
rebound, earlier droplet exit and hard handoff. Confirm that no picture or black
corner marker survives at 19 and no figure survives at 61. The renderer and
manifest checks establish native timing, silence and implementation binding.
They do not establish perceived motion fidelity, an independent critique or
native Resolve behavior. Both variants remain source-grounded draft studies.
