Storyboard: how the film plays (timeline check) and one master picture per set-up
This commit is contained in:
parent
8a30838e29
commit
f892d3967b
1 changed files with 51 additions and 1 deletions
52
trailer.html
52
trailer.html
|
|
@ -361,6 +361,50 @@
|
||||||
+ '<button type="button" class="btn primary" data-showspeakers="' + esc(draft.id) + '">Show the person speaking instead</button></div>';
|
+ '<button type="button" class="btn primary" data-showspeakers="' + esc(draft.id) + '">Show the person speaking instead</button></div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HOW THE FILM PLAYS. After every join the whole film is listened to, word by
|
||||||
|
// word with a time on each, and laid against the shots: what was dropped, where
|
||||||
|
// nothing is heard, where lips move with no sound.
|
||||||
|
function clock(t) { t = Math.max(0, Number(t) || 0); var m = Math.floor(t / 60), x = Math.floor(t - m * 60); return m + ":" + (x < 10 ? "0" : "") + x; }
|
||||||
|
function filmCheckHtml() {
|
||||||
|
var fc = PKG.film_check;
|
||||||
|
if (!fc || !(fc.rows || []).length) return "";
|
||||||
|
var bad = fc.rows.filter(function (r) { return (r.faults || []).length; });
|
||||||
|
var names = { dropped: "words dropped", spill: "line outside its shot", dead_air: "dead air", mute_talk: "lips move, no sound", unscripted: "unscripted words", silent_gap: "silence mid-conversation" };
|
||||||
|
var head = '<h4>How the film plays' + (fc.seconds ? ' · ' + clock(fc.seconds) : '') + '</h4>'
|
||||||
|
+ '<p class="cont">The finished film was listened to word by word and laid against the shots. '
|
||||||
|
+ (bad.length ? '<b>' + bad.length + (bad.length === 1 ? ' shot needs' : ' shots need') + ' a look.</b>' : 'Every line is heard, in its own shot, with nothing odd either side.')
|
||||||
|
+ (fc.coverage != null ? ' ' + Math.round(fc.coverage * 100) + '% of the script is heard.' : '') + '</p>';
|
||||||
|
function row(r) {
|
||||||
|
var f = (r.faults || []).map(function (x) { return '<div style="color:#b00020"><b>' + esc(names[x.kind] || x.kind) + '</b> — ' + esc(x.what) + '</div>'; }).join("");
|
||||||
|
return '<tr style="vertical-align:top' + (f ? '' : ';opacity:.7') + '"><td style="white-space:nowrap;padding:3px 8px 3px 0">' + clock(r.from) + '–' + clock(r.to) + '</td>'
|
||||||
|
+ '<td style="white-space:nowrap;padding:3px 8px 3px 0"><a href="#shot-' + esc(r.shot) + '" data-gotoshot="' + esc(r.shot) + '">' + esc(r.shot) + '</a></td>'
|
||||||
|
+ '<td style="padding:3px 0">' + (r.says ? esc(r.says) : '<i>nobody speaks' + (r.title ? ' · ' + esc(r.title) : '') + '</i>') + f + '</td></tr>';
|
||||||
|
}
|
||||||
|
return '<div class="guide" style="margin-bottom:12px">' + head
|
||||||
|
+ (bad.length ? '<table style="border-collapse:collapse;font-size:13px">' + bad.map(row).join("") + '</table>' : '')
|
||||||
|
+ '<details style="margin-top:6px"><summary>Every shot, with its time in the film</summary><table style="border-collapse:collapse;font-size:13px">' + fc.rows.map(row).join("") + '</table></details></div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// ONE MASTER PICTURE PER SET-UP. Shots that start from the same place, people
|
||||||
|
// and things in hand get their first frames from one camera move off one
|
||||||
|
// picture, so the room and the telephone cannot change between them.
|
||||||
|
function viewsHtml(draft) {
|
||||||
|
var vs = PKG.views_state || {}, shots = PKG.shots || [];
|
||||||
|
if (vs.state === "working") return '<div class="guide" style="margin-bottom:12px"><p class="cont">Photographing each set-up from one master picture… about five minutes. The page will show the new pictures when it is done.</p></div>';
|
||||||
|
var places = {}, many = 0;
|
||||||
|
shots.forEach(function (x) { var k = String(x.scene || "").toLowerCase().trim(); if (k) places[k] = (places[k] || 0) + 1; });
|
||||||
|
Object.keys(places).forEach(function (k) { if (places[k] > 1) many += 1; });
|
||||||
|
var done = shots.filter(function (x) { return x.view_of; }).length;
|
||||||
|
if (!many || !shots.some(function (x) { return x.opening_url; })) return "";
|
||||||
|
var ups = (PKG.setups || []).filter(function (u) { return (u.shots || []).length > 1 && u.master_url; });
|
||||||
|
var strip = ups.map(function (u) { return '<a href="' + esc(u.master_url) + '" target="_blank" title="' + esc(u.state || "") + '"><img src="' + esc(u.master_url) + '" style="height:72px;border-radius:4px;margin:0 6px 6px 0" alt=""></a>'; }).join("");
|
||||||
|
return '<div class="guide" style="margin-bottom:12px"><h4>One master picture for each set-up</h4>'
|
||||||
|
+ (done ? '<p class="cont">' + done + ' of ' + shots.length + ' shots take their first frame from a camera move off their set-up’s master picture, so the room, the clothes and the things in hand are the same in every one.</p>' + strip
|
||||||
|
: '<p class="cont">' + many + ' places are seen in more than one shot. Drawn one at a time, a room and the things in it drift from picture to picture. This makes one wide master picture for each set-up (same place, same people, same things in hand), films a single camera move in from it, and gives each shot the frame at its own size of shot. About $0.70 a set-up. Shots already filmed will need filming again.</p>')
|
||||||
|
+ (vs.state === "failed" ? '<p class="cont" style="color:#b00020">' + esc(vs.note || "That did not work.") + '</p>' : '')
|
||||||
|
+ '<button type="button" class="btn' + (done ? '' : ' primary') + '" data-sceneviews="' + esc(draft.id) + '">' + (done ? 'Do it again for shots that have changed' : 'Photograph each set-up from one master') + '</button></div>';
|
||||||
|
}
|
||||||
|
|
||||||
function partsHtml(draft) {
|
function partsHtml(draft) {
|
||||||
var parts = DRAFTS.filter(function (d) { return /^part-/.test(String(d.writer)); });
|
var parts = DRAFTS.filter(function (d) { return /^part-/.test(String(d.writer)); });
|
||||||
var n = (PKG.shots || []).length;
|
var n = (PKG.shots || []).length;
|
||||||
|
|
@ -977,7 +1021,7 @@
|
||||||
DRAFTNOW = draft;
|
DRAFTNOW = draft;
|
||||||
return head + partsHtml(draft) + contestHtml() + guideHtml(meta) + probs + '<div class="bar">' + barHtml(meta) + '</div>'
|
return head + partsHtml(draft) + contestHtml() + guideHtml(meta) + probs + '<div class="bar">' + barHtml(meta) + '</div>'
|
||||||
+ '<div id="reelhost">' + reelHtml() + '</div>'
|
+ '<div id="reelhost">' + reelHtml() + '</div>'
|
||||||
+ spineHtml() + cutsHtml(meta) + reviewsHtml(meta) + wholeHtml() + speakerNoticeHtml(draft) + castHtml + propsHtml() + body;
|
+ spineHtml() + cutsHtml(meta) + reviewsHtml(meta) + wholeHtml() + filmCheckHtml() + speakerNoticeHtml(draft) + viewsHtml(draft) + castHtml + propsHtml() + body;
|
||||||
}
|
}
|
||||||
|
|
||||||
// THINGS THAT MUST STAY THE SAME. A face is held steady by a reference
|
// THINGS THAT MUST STAY THE SAME. A face is held steady by a reference
|
||||||
|
|
@ -1620,6 +1664,12 @@
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if ((el = hit("data-sceneviews"))) {
|
||||||
|
el.disabled = true;
|
||||||
|
r = await act("scene_views", { draft_id: el.getAttribute("data-sceneviews") });
|
||||||
|
if (r) { showMsg("msg", "Photographing each set-up from one master picture. About five minutes.", "ok"); await refresh(); }
|
||||||
|
return;
|
||||||
|
}
|
||||||
if ((el = hit("data-showspeakers"))) {
|
if ((el = hit("data-showspeakers"))) {
|
||||||
r = await act("show_speakers", { draft_id: el.getAttribute("data-showspeakers") });
|
r = await act("show_speakers", { draft_id: el.getAttribute("data-showspeakers") });
|
||||||
if (r) { showMsg("msg", "Re-framing " + (r.shots || []).length + " shots onto the person speaking. The words do not change.", "ok"); await refresh(); }
|
if (r) { showMsg("msg", "Re-framing " + (r.shots || []).length + " shots onto the person speaking. The words do not change.", "ok"); await refresh(); }
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue