+ Line up the shot against its background plate. The plate sits behind, the camera shows through a mask you draw
+ around the foreground.
+
+
+
Load the background plate (a still or frame grab).
+
Start the camera. Move and scale the plate to match.
+
Draw a mask around where the foreground goes.
+
+ {error &&
{error}
}
+
+
+
+
+ );
+}
+
+function Action({ children, onClick, active, disabled }: { children: React.ReactNode; onClick: () => void; active?: boolean; disabled?: boolean }) {
+ return (
+
+ );
+}
diff --git a/public/set/sw.js b/public/set/sw.js
index a4b4256..caac9e7 100644
--- a/public/set/sw.js
+++ b/public/set/sw.js
@@ -1,4 +1,4 @@
-// Offline cache for /set (screen markers, spill checker, VFX report). Crews often have no signal on set:
+// Offline cache for /set (screen markers, spill checker, plate comp, VFX report). Crews often have no signal on set:
// once the page has loaded once, it and every marker image work offline.
// Must match OFFLINE_CACHE in components/set/MarkerPicker.tsx
const CACHE = "ttvfx-set-v1";
@@ -22,7 +22,7 @@ self.addEventListener("fetch", (event) => {
const url = new URL(req.url);
if (url.origin !== self.location.origin) return;
- // Pages (/set/, /set/spill/): network first so updates arrive, cached copy when offline.
+ // Pages (/set/, /set/spill/, /set/plate/): network first so updates arrive, cached copy when offline.
// Each page is cached under its own path so one never replaces the other.
if (req.mode === "navigate") {
const page = url.pathname.endsWith("/") ? url.pathname : url.pathname + "/";