{"record":{"id":"df0d8d4ecaed57d7","repo":"BabylonJS/Babylon.js","slug":"context-primitives-are-missing","errorCode":null,"errorMessage":"${context}: Primitives are missing","messagePattern":"(.+?): Primitives are missing","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/dev/loaders/src/glTF/2.0/glTFLoader.pure.ts","lineNumber":1081,"sourceCode":"        return Promise.all(promises).then(() => {\r\n            this._forEachPrimitive(node, (babylonMesh) => {\r\n                const asMesh = babylonMesh as Mesh;\r\n                if (!asMesh.isAnInstance && asMesh.geometry && asMesh.geometry.useBoundingInfoFromGeometry) {\r\n                    // simply apply the world matrices to the bounding info - the extends are already ok\r\n                    babylonMesh._updateBoundingInfo();\r\n                } else {\r\n                    babylonMesh.refreshBoundingInfo(true, true);\r\n                }\r\n            });\r\n\r\n            return node._babylonTransformNode!;\r\n        });\r\n    }\r\n\r\n    private _loadMeshAsync(context: string, node: INode, mesh: IMesh, assign: (babylonTransformNode: TransformNode) => void): Promise<TransformNode> {\r\n        const primitives = mesh.primitives;\r\n        if (!primitives || !primitives.length) {\r\n            throw new Error(`${context}: Primitives are missing`);\r\n        }\r\n\r\n        if (primitives[0].index == undefined) {\r\n            ArrayItem.Assign(primitives);\r\n        }\r\n\r\n        const promises = new Array<Promise<unknown>>();\r\n\r\n        this.logOpen(`${context} ${mesh.name || \"\"}`);\r\n\r\n        const name = node.name || `node${node.index}`;\r\n\r\n        if (primitives.length === 1) {\r\n            const primitive = mesh.primitives[0];\r\n            promises.push(\r\n                this._loadMeshPrimitiveAsync(`${context}/primitives/${primitive.index}`, name, node, mesh, primitive, (babylonMesh) => {\r\n                    node._babylonTransformNode = babylonMesh;\r\n                    node._primitiveBabylonMeshes = [babylonMesh];\r","sourceCodeStart":1063,"sourceCodeEnd":1099,"githubUrl":"https://github.com/BabylonJS/Babylon.js/blob/0592b347b8a4ee0236089ea86a749cacfdb266d8/packages/dev/loaders/src/glTF/2.0/glTFLoader.pure.ts#L1063-L1099","documentation":"A glTF mesh must contain at least one primitive. When _loadMeshAsync encounters a mesh whose 'primitives' array is missing or empty, it throws because there is no geometry to build a Babylon mesh from.","triggerScenarios":"Loading a glTF asset containing a mesh entry like { \"primitives\": [] } or a mesh with no primitives property at all.","commonSituations":"Models exported from DCC tools with empty meshes; hand-edited or programmatically generated glTF where primitives were removed; asset-optimization scripts that stripped primitives but left the mesh node.","solutions":["Fix the asset: ensure every mesh has at least one primitive (remove empty meshes with gltf-transform prune or similar)","Re-export the model from the DCC tool after cleaning up unused/empty meshes","Edit the glTF JSON to delete the empty mesh and any nodes referencing it"],"exampleFix":"// before (in .gltf)\n// { \"meshes\": [ { \"name\": \"empty\", \"primitives\": [] } ] }\n// after\n// { \"meshes\": [ { \"name\": \"solid\", \"primitives\": [ { \"attributes\": { \"POSITION\": 0 }, \"indices\": 1 } ] } ] }","handlingStrategy":"validation","validationCode":"// Check meshes have primitives before loading\nconst emptyMeshes = (gltf.meshes ?? [])\n  .map((m, i) => [m, i])\n  .filter(([m]) => !m.primitives || m.primitives.length === 0)\n  .map(([, i]) => i);\nif (emptyMeshes.length) console.warn(`Meshes without primitives: ${emptyMeshes}`);","typeGuard":"function meshHasPrimitives(mesh) {\n  return Array.isArray(mesh.primitives) && mesh.primitives.length > 0;\n}","tryCatchPattern":"try {\n  await loader.loadAsync(url);\n} catch (e) {\n  if (e.message.includes(\": Primitives are missing\")) {\n    console.error(\"Asset contains an empty mesh — prune it with gltf-transform\");\n  } else throw e;\n}","preventionTips":["Validate assets with glTF-Validator before deployment","Clean up unused/empty meshes in the DCC tool before exporting","Prune orphan nodes/meshes with gltf-transform prune"],"tags":["gltf","malformed-asset","mesh"],"backgroundTag":"gltf-invalid-asset-structure","analyzedSha":"0592b347b8a4ee0236089ea86a749cacfdb266d8","analyzedAt":"2026-08-30T15:11:20.442Z","schemaVersion":2},"datasetVersion":"2026-08-30T18:17:15.746Z"}