{"record":{"id":"f5b7df8cc3fdf38b","repo":"Comfy-Org/ComfyUI","slug":"moge-geometry-has-no-points-output","errorCode":null,"errorMessage":"moge_geometry has no points output.","messagePattern":"moge_geometry has no points output\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"comfy_extras/nodes_moge.py","lineNumber":360,"sourceCode":"            inputs=[\n                MoGeGeometry.Input(\"moge_geometry\"),\n                io.Int.Input(\"batch_index\", default=0, min=0, max=4096,\n                             tooltip=\"Which image of a batched MoGe geometry to mesh. Per-image vertex counts \"\n                                     \"differ, so batches can't be stacked into a single MESH.\"),\n                io.Int.Input(\"decimation\", default=1, min=1, max=8,\n                             tooltip=\"Vertex stride; 1 = full resolution.\"),\n                io.Float.Input(\"discontinuity_threshold\", default=0.04, min=0.0, max=1.0, step=0.01,\n                               tooltip=\"Drop pixels whose 3x3 depth span exceeds this fraction. 0 = off.\"),\n                io.Boolean.Input(\"texture\", default=True,\n                                 tooltip=\"Carry the source image through as the baseColor texture.\"),\n            ],\n            outputs=[io.Mesh.Output()],\n        )\n\n    @classmethod\n    def execute(cls, moge_geometry, batch_index, decimation, discontinuity_threshold, texture) -> io.NodeOutput:\n        if \"points\" not in moge_geometry:\n            raise ValueError(\"moge_geometry has no points output.\")\n        points = moge_geometry[\"points\"]\n        B = points.shape[0]\n        if batch_index >= B:\n            raise ValueError(f\"batch_index {batch_index} out of range; moge_geometry has batch size {B}.\")\n\n        # Pass depth so the rtol edge check sees radial depth -- for panoramas\n        # points[..., 2] = cos(phi)*r goes negative below the equator and the rtol clamp would drop the bottom half.\n        edge_depth = moge_geometry[\"depth\"][batch_index] if \"depth\" in moge_geometry else None\n        verts, faces, uvs = triangulate_grid_mesh(\n            points[batch_index], decimation=decimation,\n            discontinuity_threshold=discontinuity_threshold, depth=edge_depth,\n        )\n        if verts.shape[0] == 0 or faces.shape[0] == 0:\n            raise ValueError(\"MoGe produced an empty mesh; try discontinuity_threshold=0 or apply_mask=False.\")\n\n        if \"intrinsics\" not in moge_geometry:\n            # Panorama: rotate MoGe spherical (Z up) -> glTF (Y up, Z back), correct for inside-the-sphere viewing)\n            verts = verts[:, [1, 2, 0]].contiguous()","sourceCodeStart":342,"sourceCodeEnd":378,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_extras/nodes_moge.py#L342-L378","documentation":"Mesh extraction triangulates the 3D point cloud stored under moge_geometry['points']; without it there is no geometry to mesh. The node fails fast rather than attempting triangulation on a partial dict.","triggerScenarios":"Feeding a geometry dict from a depth-only or normals-only MoGe run into the mesh-export node.","commonSituations":"Mesh workflows wired to inference nodes configured without point output; reusing saved geometry between node versions.","solutions":["Run MoGe inference with points enabled so 'points' is in the geometry dict.","Verify 'points' in moge_geometry before the mesh node in the graph.","If only depth exists, re-run inference — depth alone cannot be triangulated by this node."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"if 'points' not in moge_geometry:\n    raise UserFacingError('re-run inference with points enabled')","typeGuard":"def geometry_has_points(geo) -> bool:\n    return 'points' in geo","tryCatchPattern":null,"preventionTips":["Always enable points in MoGe inference for mesh workflows.","Verify the geometry dict retains the points key through any transformations."],"tags":["moge","mesh","points","dict-keys"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}