{"record":{"id":"00c8e2fd358b687f","repo":"Comfy-Org/ComfyUI","slug":"mergesplat-connect-at-least-one-splat","errorCode":null,"errorMessage":"MergeSplat: connect at least one splat.","messagePattern":"MergeSplat: connect at least one splat\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"comfy_extras/nodes_gaussian_splat.py","lineNumber":1237,"sourceCode":"    def define_schema(cls):\n        # Autogrow: a splat0/splat1/... input list that grows a fresh slot as you connect splats.\n        splats = IO.Autogrow.TemplatePrefix(IO.Splat.Input(\"splat\"), prefix=\"splat\", min=2, max=32)\n        return IO.Schema(\n            node_id=\"MergeSplat\",\n            display_name=\"Merge Splats\",\n            search_aliases=[\"union splat\", \"densify gaussian\", \"combine splat\", \"merge gaussian\"],\n            category=\"3d/splat\",\n            description=\"Concatenate any number of gaussian splats into one. Unioning several decodes of the same \"\n                        \"latent at different seeds densifies the surface, this can improve surface quality when meshing.\",\n            inputs=[IO.Autogrow.Input(\"splats\", template=splats)],\n            outputs=[IO.Splat.Output(display_name=\"splat\")],\n        )\n\n    @classmethod\n    def execute(cls, splats: IO.Autogrow.Type) -> IO.NodeOutput:\n        gs = [v for v in splats.values() if v is not None]\n        if not gs:\n            raise ValueError(\"MergeSplat: connect at least one splat.\")\n        return IO.NodeOutput(_merge_gaussians(gs))\n\n\ndef _inverse_covariance(scale, quat):\n    # Per-splat Sigma^-1 = R diag(1/s^2) R^T. scale (N,3) linear std, quat (N,4) wxyz -> (N,3,3).\n    q = quat / quat.norm(dim=1, keepdim=True).clamp_min(1e-12)\n    w, x, y, z = q.unbind(-1)\n    R = torch.stack([\n        1 - 2 * (y * y + z * z), 2 * (x * y - w * z), 2 * (x * z + w * y),\n        2 * (x * y + w * z), 1 - 2 * (x * x + z * z), 2 * (y * z - w * x),\n        2 * (x * z - w * y), 2 * (y * z + w * x), 1 - 2 * (x * x + y * y),\n    ], dim=1).reshape(-1, 3, 3)\n    inv_s2 = 1.0 / scale.clamp_min(1e-8) ** 2                       # (N, 3)\n    return torch.einsum(\"nij,nj,nkj->nik\", R, inv_s2, R)\n\n\ndef _splat_density(xyz, opacity, scale, quat, rgb, res, kernel, device, color_sharpen=1.0, chunk=4096, progress=None,\n                   col_dtype=torch.float16):","sourceCodeStart":1219,"sourceCodeEnd":1255,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_extras/nodes_gaussian_splat.py#L1219-L1255","documentation":"Raised by MergeSplat.execute when the Autogrow 'splats' input contains no connected values (all entries None or the input is empty). The node needs at least one SPLAT to produce an output, so it fails fast rather than emitting a meaningless empty splat. This is the user-facing check; the deeper _merge_gaussians has its own equivalent guard.","triggerScenarios":"Executing a MergeSplat node with zero connected splat wires; all its inputs muted/bypassed upstream so they deliver None; a workflow template instantiated without wiring the merge inputs.","commonSituations":"Building a densify-with-multiple-seeds workflow and running it before connecting the decode outputs; bypassing every upstream producer during debugging.","solutions":["Connect at least one splat output to a 'splats' input of the node.","Unmute/unbypass the upstream splat nodes.","Autogrow sockets accept any count >= 0, so make sure at least one wire actually carries a SPLAT."],"exampleFix":"null","handlingStrategy":"validation","validationCode":"gs = [v for v in splats.values() if v is not None]\nif not gs:\n    raise ValueError('MergeSplat: connect at least one splat.')","typeGuard":"def merge_inputs_ready(splats) -> bool:\n    return any(v is not None for v in splats.values())","tryCatchPattern":"try:\n    out = MergeSplat().execute(splats)\nexcept ValueError as e:\n    if 'connect at least one splat' in str(e):\n        skip_merge()\n    else:\n        raise","preventionTips":["Wire at least one splat output before running the workflow.","Unmute upstream producers feeding the merge."],"tags":["gaussian-splatting","empty-input","node","workflow"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}