File size: 2,000 Bytes
970fc3e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import { entityLabel } from "./entity-label.mjs";
import { actorMotionId } from "./actors.mjs";
function previewScope(scene, ids = []) {
  const entities = [...scene.objects || [], ...scene.actors || []], byId = new Map(entities.map((o) => [o.id, o]));
  const owners = [...new Set(ids)], missingIds = owners.filter((id) => !byId.has(id)), targets = new Set(owners.filter((id) => byId.has(id)));
  const cast = scene.doorPerformance, path = scene.behaviors?.path, binding = scene.behaviors?.binding;
  if (cast?.enabled && targets.has(cast.doorId)) {
    for (const id of cast.actorIds) if (byId.has(id)) targets.add(id);
  }
  if (binding && path?.id === binding.pathId && targets.has(binding.doorId)) {
    for (const id of path.actorIds) if (byId.has(id)) targets.add(id);
  }
  const targetIds = [...targets], objectIds = (scene.objects || []).filter((o) => targets.has(o.id)).map((o) => o.id);
  const actorIds = (scene.actors || []).filter((a) => targets.has(a.id) && (a.motionPlan || actorMotionId(a))).map((a) => a.id);
  const floodIds = (scene.floods || []).filter((f) => targets.has(f.objectId || f.doorId)).map((f) => f.id);
  const playable = !missingIds.length && (actorIds.length > 0 || floodIds.length > 0 || (scene.objects || []).some((o) => targets.has(o.id) && o.track));
  return { ownerIds: owners, targetIds, objectIds, actorIds, floodIds, missingIds, playable, label: targetIds.map((id) => entityLabel(byId.get(id)) || id).join(", ") };
}
function isolatePreviewActors(scene, frames, scope) {
  if (!scope) return frames;
  const active = new Set(scope.actorIds), saved = new Map((scene.actors || []).map((a) => [a.id, a]));
  return frames.map((f) => {
    const a = saved.get(f.id);
    if (active.has(f.id) || !a) return f;
    return { ...f, ...a, position: [...a.position], assetId: a.assetId, motionId: null, motionPlan: null, motionOffset: [0, 0, 0], pose: "rest", clipTime: 0, preview: false, visible: true };
  });
}
export {
  isolatePreviewActors,
  previewScope
};