Files
Alexankharin-camera-comfyUI/__init__.py
T
AlexankharinandClaude Fable 5 456c9cacf8 Add per-frame video->4D splat pipeline with WAN disocclusion baking
New video4d_nodes.py for static-camera footage:
- TemporalStaticPlate: static/dynamic split from temporal median color+depth
  deviation, morphological closing, background completion from deep-depth
  quantiles (bg_min_separation guards against movers swaying in place),
  diffusion fill with behind-the-mover depth for never-revealed regions
- SplatFramesFromVideo: every frame = shared static base + per-frame dynamic
  splats (constant count, pixel-identity order); bimodal depth snap at
  silhouettes kills hair-veil smears; stride-1 seam band and
  background-pushed edge splats close static/dynamic seam holes
- RenderSplatSequence: render each frame along an interpolated trajectory
  (images + coverage masks + disparities)
- BakeRenderFill: unproject WAN-VACE-filled disocclusion pixels (depth
  continued from the rendered background by max-propagation) into the
  static layer, so the exported scene handles occlusions itself
- SaveSplats4DVideo: antimatter15 .splat frames -> streamable .splat4d
  (https://github.com/adamraudonis/splats4D, pip install splats4d)
- MedianFrames / BlendImagesByMask / ScaleMasks helpers

workflows/fisheye_video_to_splats4d.json wires the full graph including the
WAN 2.1 VACE render-space disocclusion fill (fisheye-space inpainting warps
wide-angle geometry - fill happens on pinhole renders) and intermediate
previews (depth, motion mask, plate, raw/WAN/baked novel renders, replay).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 15:32:12 +00:00

36 lines
1.5 KiB
Python

from .pointcloud_nodes import NODE_CLASS_MAPPINGS as NCM1
from .reprojection_nodes import NODE_CLASS_MAPPINGS as NCM2
from .metric_depth_nodes import NODE_CLASS_MAPPINGS as NCM3
from .flux_fisheye_filling_nodes import NODE_CLASS_MAPPINGS as NCM4
from .complex_nodes import NODE_CLASS_MAPPINGS as NCM5
from .video_nodes import NODE_CLASS_MAPPINGS as NCM6
from .GS_nodes import NODE_CLASS_MAPPINGS as NCM7
# Optional node packs: a missing/broken optional dependency must never kill the
# whole extension (mirrors how video_nodes degrades when video_depth_anything
# is unavailable).
try:
from .GS4D_nodes import NODE_CLASS_MAPPINGS as NCM8
except Exception as _exc:
print(f"[camera-comfyUI] Warning: GS4D_nodes could not be loaded, 4D splat nodes disabled: {_exc}")
NCM8 = {}
try:
from .pose_nodes import NODE_CLASS_MAPPINGS as NCM9
except Exception as _exc:
print(f"[camera-comfyUI] Warning: pose_nodes could not be loaded, pose estimation nodes disabled: {_exc}")
NCM9 = {}
try:
from .world_nodes import NODE_CLASS_MAPPINGS as NCM10
except Exception as _exc:
print(f"[camera-comfyUI] Warning: world_nodes could not be loaded, world-building nodes disabled: {_exc}")
NCM10 = {}
try:
from .video4d_nodes import NODE_CLASS_MAPPINGS as NCM11
except Exception as _exc:
print(f"[camera-comfyUI] Warning: video4d_nodes could not be loaded, per-frame 4D splat nodes disabled: {_exc}")
NCM11 = {}
NODE_CLASS_MAPPINGS = {**NCM1, **NCM2, **NCM3, **NCM4, **NCM5, **NCM6, **NCM7, **NCM8, **NCM9, **NCM10, **NCM11}
__all__ = ["NODE_CLASS_MAPPINGS"]