LatLong Compare Panorama
A before/after wipe that works inside the sphere
- before
- after
Every ComfyUI user eventually installs a slide-to-compare node - rgthree's Image Comparer is the one that shows up next to Manager and Impact Pack in "what do you actually install" answers. This is the panorama version of that idea, and the difference is not cosmetic: comparing two equirectangular images as flat PNGs is close to useless, because the seam sits at the edge of the crop and the poles are stretched into bands you can't read. Here you're looking at both images as spheres, in the same camera, wiping between them.
That matters most for the two places panorama workflows go wrong. Seam matching at the left/right edge is still the hard part of any ERP outpaint - Flux.2 Klein 360 ERP LoRAs, Qwen 360 Diffusion, all of them warn that the wrap edge needs post work - and pole melt is the other classic. Flip between the input and the Edge Blender output inside a 360 viewer and you can tell in two seconds whether the fix actually took.
How it works
It's an output node with no outputs, and it reuses the pack's own panorama viewers rather than shipping a separate UI. Two cases:
Both sides stills. Each image is turned into a viewer texture at max_width, and both are handed to the viewer with a shared camera - drag and both look directions move together, wheel to zoom, and a wipe slider crossfades. The README's detail is that both textures finish loading before the displayed frame changes, so a slow second image doesn't leave you comparing against a stale view.
Either side a batch. It switches to the video viewer path. The batches are indexed together: one shared frame index drives both sequences, fps sets playback, and play/pause plus scrub are the viewer's own controls.
A single image on one side is held across the entire other sequence - one still versus a 60-frame outpaint pass works exactly as you'd hope. Batches of different lengths where both are longer than one frame do not: you get Comparison batches must match, or one side must contain one image.
Inputs and outputs
- before and after - two IMAGE inputs. Names are literal; the wipe only ever shows one at a time.
- max_width (64–8192, default 2048) - the texture size for the viewer. This is display-only. It does not resize anything you save, and it does not affect your render.
- fps (1–120, default 24, optional) - only meaningful when a side has more than one frame.
No outputs at all. It's a terminal node, which also means it always executes: ComfyUI's cache works backwards from output nodes, so this thing and its two 2048-wide textures are re-built on every run (see the plumbing doc if that caching model is new to you). Keep your real deliverable on a separate SaveImage or Video Combine branch.
Install
ComfyUI Manager → search "ComfyUI LatLong", or:
cd ComfyUI/custom_nodes
git clone https://github.com/cedarconnor/comfyui-LatLong
cd comfyui-LatLong
python -m pip install -r requirements.txt
ComfyUI's Python (the embedded one on portable builds), Python 3.10+. Dependencies are numpy, opencv-python, scipy, torch, Pillow - no model files, nothing to download. Three.js r172 ships inside the repo's js/lib, so the viewer doesn't need a CDN connection. Restart, then right-click → Add Node → LatLong.
Common issues
If the viewer pane stays empty, it's almost always the frontend rather than the node - this pack's UI is a custom Three.js viewer, and the Nodes 2.0 frontend rewrite has been breaking third-party viewer behaviour across the ecosystem. Reload the page and check the browser console before you start reinstalling things.
Don't expect the wipe to show why something is wrong, only that it is. If the wrap edge is off, band_width-based measurements from LatLong Diagnostics give you a number where the wipe gives you a squint - use the wipe to confirm, the numbers to compare runs.
And don't use max_width as a downsizing step. It resizes the textures the viewer loads, not the images in your graph, so a 4K comparison at max_width 1024 still holds two full-resolution panoramas in memory. That's fine on 12 GB, less fun next to a video model.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| before | IMAGE | — | |
| after | IMAGE | — | |
| max_width | INT | 204864–8192 | — |
| fpsopt | INT | 241–120 | — |
Outputs (0)
No outputs