{"record":{"id":"c4f36058bc708d83","repo":"BabylonJS/Babylon.js","slug":"missing-arrays-in-sog-data","errorCode":null,"errorMessage":"Missing arrays in SOG data.","messagePattern":"Missing arrays in SOG data\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/dev/loaders/src/SPLAT/sog.pure.ts","lineNumber":166,"sourceCode":"\r\nasync function ParseSogDatas(data: SOGRootData, imageDataArrays: IWebPImage[], scene: Scene): Promise<IParsedSplat> {\r\n    const splatCount = data.count ? data.count : data.means.shape[0];\r\n    const rowOutputLength = 3 * 4 + 3 * 4 + 4 + 4; // 32\r\n    const buffer = new ArrayBuffer(rowOutputLength * splatCount);\r\n\r\n    const position = new Float32Array(buffer);\r\n    const scale = new Float32Array(buffer);\r\n    const rgba = new Uint8ClampedArray(buffer);\r\n    const rot = new Uint8ClampedArray(buffer);\r\n\r\n    // Undo the symmetric log transform used at encode time:\r\n    const unlog = (n: number) => Math.sign(n) * (Math.exp(Math.abs(n)) - 1);\r\n\r\n    const meansl = imageDataArrays[0].bits;\r\n    const meansu = imageDataArrays[1].bits;\r\n    // Check that data.means.mins is an array\r\n    if (!Array.isArray(data.means.mins) || !Array.isArray(data.means.maxs)) {\r\n        throw new Error(\"Missing arrays in SOG data.\");\r\n    }\r\n\r\n    // --- Positions\r\n    for (let i = 0; i < splatCount; i++) {\r\n        const index = i * 4;\r\n        for (let j = 0; j < 3; j++) {\r\n            const meansMin = data.means.mins[j];\r\n            const meansMax = data.means.maxs[j];\r\n            const meansup = meansu[index + j];\r\n            const meanslow = meansl[index + j];\r\n            const q = (meansup << 8) | meanslow;\r\n            const n = Scalar.Lerp(meansMin, meansMax, q / 65535);\r\n            position[i * 8 + j] = unlog(n);\r\n        }\r\n    }\r\n\r\n    // --- Scales\r\n    const scales = imageDataArrays[2].bits;\r","sourceCodeStart":148,"sourceCodeEnd":184,"githubUrl":"https://github.com/BabylonJS/Babylon.js/blob/0592b347b8a4ee0236089ea86a749cacfdb266d8/packages/dev/loaders/src/SPLAT/sog.pure.ts#L148-L184","documentation":"ParseSogDatas reconstructs splat positions from min/max bounds stored in the SOG metadata. It requires data.means.mins and data.means.maxs to be arrays; if either is missing or of the wrong type, splat positions cannot be dequantized and this error is thrown. It indicates the SOG file's metadata is incomplete or malformed.","triggerScenarios":"ParseSogDatas invoked (via ParseSogMeta) on metadata JSON where means.mins or means.maxs is absent, null, or not an array.","commonSituations":"Hand-written or tool-generated SOG metadata missing the means bounds; truncated meta.json uploads; schema drift between SOG exporter versions and this loader.","solutions":["Regenerate the SOG asset so its metadata includes means.mins and means.maxs arrays.","Validate the SOG meta JSON (Array.isArray(meta.means.mins) && Array.isArray(meta.means.maxs)) before parsing.","Check for a version mismatch between the exporter that produced the file and the loader version; upgrade the loader.","Re-upload/repair truncated metadata files on the hosting server."],"exampleFix":"// before\nconst meta = JSON.parse(metaText);\nparseSogMeta(meta); // throws if meta.means.mins missing\n// after\nconst meta = JSON.parse(metaText);\nif (!Array.isArray(meta?.means?.mins) || !Array.isArray(meta?.means?.maxs)) {\n  throw new Error(\"SOG meta.json is missing means.mins/maxs\");\n}\nparseSogMeta(meta);","handlingStrategy":"validation","validationCode":"const meta = JSON.parse(metaText);\nif (!Array.isArray(meta?.means?.mins) || !Array.isArray(meta?.means?.maxs)) {\n  throw new Error(\"SOG meta.json must contain means.mins and means.maxs arrays\");\n}","typeGuard":"function hasSogMeansBounds(meta: unknown): meta is { means: { mins: number[]; maxs: number[] } } & Record<string, unknown> {\n  const m = meta as any;\n  return !!m && Array.isArray(m.means?.mins) && Array.isArray(m.means?.maxs);\n}","tryCatchPattern":"try {\n  await parseSogMeta(metaText, engine);\n} catch (e) {\n  if (String(e.message).includes(\"Missing arrays in SOG data\")) {\n    console.error(\"SOG metadata missing means bounds — regenerate or repair meta.json\", e);\n  } else throw e;\n}","preventionTips":["Validate SOG meta.json (means.mins/maxs presence and types) before parsing.","Keep exporter and loader versions aligned — schema drift causes missing fields.","Verify uploaded SOG bundles include an intact, complete meta.json.","Add a schema check (hand-rolled or zod) at the edge of your asset pipeline."],"tags":["splat","sog","metadata","schema-validation"],"backgroundTag":"missing-metadata-field","analyzedSha":"0592b347b8a4ee0236089ea86a749cacfdb266d8","analyzedAt":"2026-08-30T15:11:20.442Z","schemaVersion":2},"datasetVersion":"2026-08-30T18:17:15.746Z"}