From 25e1fd462b10c5ad73abc0b7b6e70cd6cb489d6c Mon Sep 17 00:00:00 2001 From: gator Date: Sat, 19 Sep 2026 19:06:34 +0000 Subject: [PATCH] Things that must look the same: tracked objects with reference pictures; the picture check folds small things away --- trailer.html | 81 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 76 insertions(+), 5 deletions(-) diff --git a/trailer.html b/trailer.html index 8cc780a..a21f9f9 100644 --- a/trailer.html +++ b/trailer.html @@ -265,6 +265,8 @@ && (Date.now() - (Date.parse(PKG.pics_started || "") || 0)) < 15 * 60 * 1000) return true; if (String(PKG.look_state || "") && (Date.now() - (Date.parse(PKG.look_started || "") || 0)) < 15 * 60 * 1000) return true; + if (String(PKG.props_state || "") + && (Date.now() - (Date.parse(PKG.props_started || "") || 0)) < 15 * 60 * 1000) return true; return (PKG.shots || []).some(function (s) { return s.writing || s.drawing || s.fixing || s.varying || stillFilming(s); }); } @@ -862,7 +864,42 @@ DRAFTNOW = draft; return head + guideHtml(meta) + probs + '
' + barHtml(meta) + '
' + '
' + reelHtml() + '
' - + spineHtml() + cutsHtml(meta) + reviewsHtml(meta) + wholeHtml() + castHtml + body; + + spineHtml() + cutsHtml(meta) + reviewsHtml(meta) + wholeHtml() + castHtml + propsHtml() + body; + } + + // THINGS THAT MUST STAY THE SAME. A face is held steady by a reference + // picture; so is an urn, and so is a car. Without one, the object the whole + // story is about was three different objects in three shots. + function propsHtml() { + var props = PKG.props, busy = String(PKG.props_state || ""); + var head = '

Things that must look the same in every shot

'; + if (busy) head += '

' + esc(busy) + '\u2026 about a minute.

'; + if (PKG.props_note) head += '

' + esc(PKG.props_note) + '

'; + if (!props || !props.length) + return head + '

An object or a car that appears in more than one shot needs a reference ' + + 'picture, the way each character has one - otherwise it is drawn differently every time. ' + + (busy ? '' : '') + + '

'; + return head + '
' + props.map(function (p) { + var pics = [["url", p.kind === "vehicle" ? "outside" : ""], ["interior_url", "inside"]].map(function (f) { + return p[f[0]] ? '' : ''; }).join(""); + var where = (p.shots || []).map(function (x) { return x.id; }).join(", "); + var drawn = (p.shots || []).filter(function (x) { + return (PKG.shots || []).some(function (q) { return String(q.id) === String(x.id) && q.opening_url; }); }).length; + return '
' + (pics || 'not drawn yet') + '
' + + '' + esc(p.name || p.id) + 'in shots ' + esc(where) + '' + + '' + + (busy ? '' : '
' + + '' + + (drawn ? '' : '') + + '
') + + '
'; + }).join("") + '
' + + (busy ? '' : '

') + + ''; } // Every look a character has, in the order the story reaches them: the @@ -976,16 +1013,24 @@ var rows = dup.map(function (d) { return { what: "The same person appears twice: " + d, serious: true }; }) .concat(faults.map(function (f) { return { what: f.what, serious: f.severity === "serious", zoom: f.zoom_url || "" }; })); - return '
' - + 'The checker looked at this picture and sees:' + retried - + rows.map(function (r, i) { + var line = function (r, i) { // The close-up the checker was looking at. Nobody should have to // take "six fingers" on trust - and sometimes it is simply wrong. var zm = r.zoom ? '' : ''; return '' + zm + esc(r.what) + ' '; - }).join("") + }; + // What matters is said out loud. What merely differs from the description + // is there for anyone who wants it, and is not an alarm. + var big = "", small = "", nsmall = 0; + rows.forEach(function (r, i) { if (r.serious) big += line(r, i); else { small += line(r, i); nsmall++; } }); + return '
' + + (big ? 'The checker looked at this picture and sees:' + retried + big + : '\u2713 picture checked - nothing that needs fixing' + retried) + + (nsmall ? '
' + + nsmall + ' small thing' + (nsmall === 1 ? '' : 's') + ' it noticed \u2014 look only if the picture bothers you' + + small + '
' : '') + '
'; } @@ -1467,6 +1512,32 @@ + "automatically. This takes a few minutes." : (r.note || "Already checked."), "ok"); await refresh(); } return; } + if ((el = hit("data-findprops"))) { + el.disabled = true; + r = await act("find_props", { draft_id: CUR }); + if (r) { showMsg("msg", "Reading the script for objects that appear more than once, then drawing a reference for each. About two minutes.", "ok"); await refresh(); } + return; + } + if ((el = hit("data-propsave"))) { + var ppid = el.getAttribute("data-propsave"); + var pta = document.querySelector('[data-propdesc="' + ppid + '"]'); + el.disabled = true; + r = await act("set_prop", { draft_id: CUR, prop_id: ppid, description: pta ? pta.value : "", force: true }); + if (r) { showMsg("msg", "Drawing the reference picture, about $" + r.usd + ". When it looks right, redraw the shots that show it.", "ok"); await refresh(); } + return; + } + if ((el = hit("data-propshots"))) { + el.disabled = true; + r = await act("redraw_prop_shots", { draft_id: CUR, prop_id: el.getAttribute("data-propshots") }); + if (r) { showMsg("msg", "Redrawing those shots one after another, about $" + r.usd + ". A few minutes.", "ok"); await refresh(); } + return; + } + if ((el = hit("data-propdel"))) { + if (!confirm("Stop keeping this object the same from shot to shot?")) return; + el.disabled = true; + r = await act("remove_prop", { draft_id: CUR, prop_id: el.getAttribute("data-propdel") }); + if (r) await refresh(); return; + } if ((el = hit("data-fixfault"))) { var ff = el.getAttribute("data-fixfault").split("|"); var fs = (PKG.shots || []).filter(function (x) { return String(x.id) === ff[0]; })[0] || {};