π§© Apply Splat Patch From Edited Views
Surgically editing a gaussian splat by painting over views (experimental)
- ply_data
- edited_repair_images
- repair_camera_poses
- repair_camera_intrinsics
- hole_masks
- patch_depth_maps
- patched_ply_data
Splat editing is the hard problem in this whole space. You can't just open a gaussian splat in an image editor - it's millions of points in 3D, not pixels. VNCCS_ApplySplatPatchFromEditedViews is this pack's experiment at cracking that: you edit rendered views of the splat (inpaint a hole, remove an object, repaint a wall), then this node projects those edits back into 3D and patches the underlying splat geometry. Edit the image, get the same edit in the 3D.
The "(experimental)" in the category is not decoration - this is the pack's splat_patch_poc.py (proof of concept). It's fiddly, it has a dozen tuning knobs, and it's exactly the kind of node you use when the standard workflow can't do what you need. But the idea - "fix it in 2D, it propagates to 3D" - is genuinely the future of splat editing, so it's worth understanding.
How it works
The concept: render the splat from repair cameras, inpaint/edit the resulting images (that's your job, outside this node - it doesn't generate content), then give the node the edited edited_repair_images plus the repair_camera_poses / repair_camera_intrinsics they were rendered with. The node unprojects the edited pixels back into 3D points, splats them, and blends the new patch into the original ply_data.
The knobs are the blend pipeline's guts:
blend_mode-replace_surface(default: remove old splats near the patch surface and put the new ones in),add_only(just add the patch, don't remove anything), orlegacy_project_mask(old mask-projection behavior).hole_masks/mask_threshold/mask_dilate- optional masks saying where to edit; the threshold and dilation control how far the patch bleeds past the mask edge.remove_old_splats,remove_depth_tolerance,replace_front_margin,replace_far_margin- how aggressively the old geometry under the patch gets removed, and how close to the new surface.patch_splat_scale(0.003) andpatch_opacity(0.95) - the size and alpha of the splats you're injecting.depth_fill_iterations- how many passes fill depth holes where the patch has no depth info.pixel_stride,max_patch_points_per_view,max_depth_render_points- point-density and memory guards.
The inputs that matter
ply_data- the splat bundle to patch.edited_repair_images,repair_camera_poses,repair_camera_intrinsics- required; these define the edits and where they came from.blend_mode- the single most important toggle. Start withreplace_surface.hole_masks- strongly recommended; without a mask the node has to guess what's an edit.
Outputs
patched_ply_data- the patched splat, ready for preview (viaVNCCS_BackgroundPreview) or further processing.
Install & troubleshooting
Shared pack install: ComfyUI Manager (search HY-World 2.0) or clone + pip install -r requirements.txt + python install.py. As a POC it leans on the pack's full splat stack (the vendored gsplat build), so a broken gsplat install will surface here as rendering/error noise - check that first, and don't install upstream gsplat alongside the fork.
Expect to iterate: too-tight masks clip the patch, too-loose ones pull in unedited content. If the old geometry ghosts through, raise remove_depth_tolerance / lower replace_front_margin; if the patch floats or z-fights, drop patch_splat_scale. And because the pack's author has been candid that the whole multi-camera path is rough, treat this node as a tool for fixing individual problem regions, not for re-splatting entire scenes - that's where the seams live.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| ply_data | PLY_DATA | β | |
| edited_repair_images | IMAGE | β | |
| repair_camera_poses | TENSOR | β | |
| repair_camera_intrinsics | TENSOR | β | |
| hole_masksopt | MASK | β | |
| patch_depth_mapsopt | IMAGE | β | |
| blend_modeopt | COMBO | replace_surface | 3 options: replace_surface, add_only, legacy_project_mask |
| mask_thresholdopt | FLOAT | 0.500β1 | β |
| mask_dilateopt | INT | 50β101 | β |
| remove_old_splatsopt | BOOLEAN | true | β |
| remove_depth_toleranceopt | FLOAT | 0.0000β2 | β |
| replace_front_marginopt | FLOAT | 0.0100β0.5 | β |
| replace_far_marginopt | FLOAT | 0.000β5 | β |
| depth_fill_iterationsopt | INT | 960β512 | β |
| min_patch_lumaopt | FLOAT | 0.0000β0.25 | β |
| patch_splat_scaleopt | FLOAT | 0.00300.0001β0.1 | β |
| patch_opacityopt | FLOAT | 0.950.01β1 | β |
| pixel_strideopt | INT | 11β16 | β |
| max_patch_points_per_viewopt | INT | 2500000β2000000 | β |
| max_depth_render_pointsopt | INT | 00β20000000 | β |
| debug_logopt | BOOLEAN | true | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| patched_ply_data | PLY_DATA | β |