@babylonjs/loaders 9.25.0 → 9.26.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FBX/fbxConstraintBehavior.d.ts +188 -0
- package/FBX/fbxConstraintBehavior.js +532 -0
- package/FBX/fbxConstraintBehavior.js.map +1 -0
- package/FBX/fbxFileLoader.pure.d.ts +175 -6
- package/FBX/fbxFileLoader.pure.js +1521 -286
- package/FBX/fbxFileLoader.pure.js.map +1 -1
- package/FBX/index.d.ts +4 -1
- package/FBX/index.js +1 -0
- package/FBX/index.js.map +1 -1
- package/FBX/interpreter/animation.d.ts +73 -33
- package/FBX/interpreter/animation.js +620 -223
- package/FBX/interpreter/animation.js.map +1 -1
- package/FBX/interpreter/animationCurve.d.ts +91 -0
- package/FBX/interpreter/animationCurve.js +623 -0
- package/FBX/interpreter/animationCurve.js.map +1 -0
- package/FBX/interpreter/blendShapes.js +9 -18
- package/FBX/interpreter/blendShapes.js.map +1 -1
- package/FBX/interpreter/connections.d.ts +1 -1
- package/FBX/interpreter/connections.js +173 -34
- package/FBX/interpreter/connections.js.map +1 -1
- package/FBX/interpreter/constraints.d.ts +68 -0
- package/FBX/interpreter/constraints.js +143 -0
- package/FBX/interpreter/constraints.js.map +1 -0
- package/FBX/interpreter/fbxInterpreter.d.ts +89 -4
- package/FBX/interpreter/fbxInterpreter.js +474 -122
- package/FBX/interpreter/fbxInterpreter.js.map +1 -1
- package/FBX/interpreter/geometry.d.ts +1 -1
- package/FBX/interpreter/geometry.js +150 -92
- package/FBX/interpreter/geometry.js.map +1 -1
- package/FBX/interpreter/legacyDocument.d.ts +11 -0
- package/FBX/interpreter/legacyDocument.js +425 -0
- package/FBX/interpreter/legacyDocument.js.map +1 -0
- package/FBX/interpreter/materialModel.d.ts +71 -0
- package/FBX/interpreter/materialModel.js +622 -0
- package/FBX/interpreter/materialModel.js.map +1 -0
- package/FBX/interpreter/materials.d.ts +13 -1
- package/FBX/interpreter/materials.js +88 -5
- package/FBX/interpreter/materials.js.map +1 -1
- package/FBX/interpreter/nodeTransform.d.ts +32 -0
- package/FBX/interpreter/nodeTransform.js +54 -0
- package/FBX/interpreter/nodeTransform.js.map +1 -0
- package/FBX/interpreter/nurbs.d.ts +99 -0
- package/FBX/interpreter/nurbs.js +627 -0
- package/FBX/interpreter/nurbs.js.map +1 -0
- package/FBX/interpreter/propertyTemplates.d.ts +23 -0
- package/FBX/interpreter/propertyTemplates.js +109 -2
- package/FBX/interpreter/propertyTemplates.js.map +1 -1
- package/FBX/interpreter/rig.js +16 -0
- package/FBX/interpreter/rig.js.map +1 -1
- package/FBX/interpreter/sceneDiagnostics.js +28 -3
- package/FBX/interpreter/sceneDiagnostics.js.map +1 -1
- package/FBX/interpreter/skeleton.d.ts +4 -18
- package/FBX/interpreter/skeleton.js +16 -94
- package/FBX/interpreter/skeleton.js.map +1 -1
- package/FBX/parsers/fbxAsciiParser.js +119 -9
- package/FBX/parsers/fbxAsciiParser.js.map +1 -1
- package/FBX/parsers/fbxBinaryParser.js +74 -22
- package/FBX/parsers/fbxBinaryParser.js.map +1 -1
- package/FBX/pure.d.ts +1 -0
- package/FBX/pure.js +1 -0
- package/FBX/pure.js.map +1 -1
- package/FBX/types/fbxTypes.d.ts +18 -2
- package/FBX/types/fbxTypes.js +40 -12
- package/FBX/types/fbxTypes.js.map +1 -1
- package/SPLAT/gaussianSplattingStream.d.ts +31 -0
- package/SPLAT/gaussianSplattingStream.js +49 -0
- package/SPLAT/gaussianSplattingStream.js.map +1 -1
- package/USD/index.d.ts +2 -0
- package/USD/index.js +4 -0
- package/USD/index.js.map +1 -0
- package/USD/pure.d.ts +3 -0
- package/USD/pure.js +5 -0
- package/USD/pure.js.map +1 -0
- package/USD/usdCommandProtocol.d.ts +83 -0
- package/USD/usdCommandProtocol.js +173 -0
- package/USD/usdCommandProtocol.js.map +1 -0
- package/USD/usdFileLoader.d.ts +6 -0
- package/USD/usdFileLoader.js +9 -0
- package/USD/usdFileLoader.js.map +1 -0
- package/USD/usdFileLoader.metadata.d.ts +20 -0
- package/USD/usdFileLoader.metadata.js +18 -0
- package/USD/usdFileLoader.metadata.js.map +1 -0
- package/USD/usdFileLoader.pure.d.ts +102 -0
- package/USD/usdFileLoader.pure.js +341 -0
- package/USD/usdFileLoader.pure.js.map +1 -0
- package/USD/usdFileLoader.types.d.ts +11 -0
- package/USD/usdFileLoader.types.js +2 -0
- package/USD/usdFileLoader.types.js.map +1 -0
- package/USD/usdLoadingOptions.d.ts +123 -0
- package/USD/usdLoadingOptions.js +3 -0
- package/USD/usdLoadingOptions.js.map +1 -0
- package/USD/usdSceneMaterializer.d.ts +9 -0
- package/USD/usdSceneMaterializer.js +982 -0
- package/USD/usdSceneMaterializer.js.map +1 -0
- package/USD/usdWorkerMessages.d.ts +57 -0
- package/USD/usdWorkerMessages.js +3 -0
- package/USD/usdWorkerMessages.js.map +1 -0
- package/dynamic.js +10 -0
- package/dynamic.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/package.json +4 -3
- package/pure.d.ts +1 -0
- package/pure.js +1 -0
- package/pure.js.map +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nurbs.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/nurbs.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\n/**\n * NURBS curves and surfaces, and polyline (\"Line\") geometry.\n *\n * The basis evaluation and tessellation follow the FBX SDK conventions as implemented by ufbx: knot spans are\n * subdivided uniformly, closed and periodic curves wrap their control points, and surfaces are tessellated into\n * quads (degenerate quads at poles become triangles) with welded positions along the wrapped edges.\n */\nimport { type FBXNode, findChildByName, getPropertyValue, cleanFBXName, getNodeArray } from \"../types/fbxTypes\";\nimport { type FBXGeometryData, type FBXGeometryDiagnostic } from \"./geometry\";\nimport { getPropertyEntries } from \"./propertyTemplates\";\n\nexport type FBXNurbsTopology = \"open\" | \"closed\" | \"periodic\";\n\n/** Knot vector and derived data of one parametric direction. */\nexport interface FBXNurbsBasis {\n order: number;\n topology: FBXNurbsTopology;\n knots: Float64Array;\n /** Parameter range that the curve is defined on */\n tMin: number;\n tMax: number;\n /** Distinct knot values inside [tMin, tMax], i.e. the boundaries of the non-empty spans */\n spans: Float64Array;\n /** False when the knot vector is too short or not monotonic */\n valid: boolean;\n}\n\n/** NURBS curve: homogeneous control points (x, y, z, w) and a basis. */\nexport interface FBXNurbsCurveData {\n basis: FBXNurbsBasis;\n /** Control points as x,y,z,w */\n controlPoints: Float64Array;\n numControlPoints: number;\n}\n\n/** NURBS surface: control points laid out as `v * numU + u`. */\nexport interface FBXNurbsSurfaceData {\n basisU: FBXNurbsBasis;\n basisV: FBXNurbsBasis;\n numU: number;\n numV: number;\n /** Control points as x,y,z,w */\n controlPoints: Float64Array;\n flipNormals: boolean;\n /** Span subdivision stored in the file (Step), 0 when absent */\n stepU: number;\n stepV: number;\n}\n\n/** Polyline geometry ready for a lines mesh: one or more open or closed point runs. */\nexport interface FBXCurveGeometryData {\n id: number;\n name: string;\n kind: \"line\" | \"nurbsCurve\";\n /** Each polyline as x,y,z triples; closed runs repeat their first point at the end */\n polylines: Float64Array[];\n /** Display colour from the geometry's Color property */\n color: [number, number, number] | null;\n diagnostics: FBXGeometryDiagnostic[];\n}\n\nconst MAX_NURBS_ORDER = 128;\nconst DEFAULT_SPAN_SUBDIVISION = 4;\nconst MAX_FILE_SPAN_SUBDIVISION = 16;\nconst MAX_SPAN_SUBDIVISION = 64;\n\nfunction readTopology(form: string | undefined): FBXNurbsTopology {\n return form === \"Closed\" ? \"closed\" : form === \"Periodic\" ? \"periodic\" : \"open\";\n}\n\nexport function createNurbsBasis(order: number, form: string | undefined, knots: Float64Array): FBXNurbsBasis {\n const basis: FBXNurbsBasis = { order, topology: readTopology(form), knots, tMin: 0, tMax: 0, spans: new Float64Array(0), valid: false };\n if (order > 1 && order <= MAX_NURBS_ORDER) {\n const degree = order - 1;\n if (knots.length >= 2 * degree + 1) {\n basis.tMin = knots[degree];\n basis.tMax = knots[knots.length - degree - 1];\n const maxSpans = knots.length - 2 * degree;\n const spans: number[] = [];\n let prev = -Infinity;\n for (let i = 0; i < maxSpans; i++) {\n const t = knots[degree + i];\n if (t !== prev) {\n spans.push(t);\n prev = t;\n }\n }\n basis.spans = Float64Array.from(spans);\n basis.valid = true;\n for (let i = 1; i < knots.length; i++) {\n if (!(knots[i - 1] <= knots[i])) {\n basis.valid = false;\n break;\n }\n }\n }\n }\n return basis;\n}\n\nfunction nurbsWeight(knots: Float64Array, knot: number, degree: number, u: number): number {\n if (knot < 0 || knot >= knots.length || knots.length - knot < degree) {\n return 0;\n }\n const prevU = knots[knot];\n const nextU = knots[knot + degree];\n if (prevU >= nextU) {\n return 0;\n }\n if (u <= prevU) {\n return 0;\n }\n if (u >= nextU) {\n return 1;\n }\n return (u - prevU) / (nextU - prevU);\n}\n\nfunction nurbsDeriv(knots: Float64Array, knot: number, degree: number): number {\n if (knot < 0 || knot >= knots.length || knots.length - knot < degree) {\n return 0;\n }\n const prevU = knots[knot];\n const nextU = knots[knot + degree];\n if (prevU >= nextU) {\n return 0;\n }\n return degree / (nextU - prevU);\n}\n\n/**\n * Evaluates the basis functions (and their derivatives) that are non-zero at `u`.\n * @returns index of the first influencing control point, or -1 when the basis cannot be evaluated\n */\nexport function evaluateNurbsBasis(basis: FBXNurbsBasis, u: number, weights: Float64Array, derivatives: Float64Array | null): number {\n if (basis.order <= 1 || !basis.valid) {\n return -1;\n }\n const degree = basis.order - 1;\n const knots = basis.knots;\n let knot: number;\n if (u <= basis.tMin) {\n knot = degree;\n u = basis.tMin;\n } else if (u >= basis.tMax) {\n knot = knots.length - degree - 2;\n u = basis.tMax;\n } else {\n // Knot span [knots[knot], knots[knot + 1]) containing u\n let lo = 0;\n let hi = knots.length - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (knots[mid + 1] <= u) {\n lo = mid + 1;\n } else {\n hi = mid;\n }\n }\n if (!(knots[lo] <= u && u < knots[lo + 1])) {\n return -1;\n }\n knot = lo;\n }\n if (knot < degree) {\n return -1;\n }\n\n weights[0] = 1;\n for (let p = 1; p <= degree; p++) {\n let prev = 0;\n let g = 1 - nurbsWeight(knots, knot - p + 1, p, u);\n let dg = 0;\n const last = derivatives !== null && p === degree;\n if (last) {\n dg = nurbsDeriv(knots, knot - p + 1, p);\n }\n for (let i = p; i > 0; i--) {\n const f = nurbsWeight(knots, knot - p + i, p, u);\n const weight = weights[i - 1];\n weights[i] = f * weight + g * prev;\n if (last) {\n const df = nurbsDeriv(knots, knot - p + i, p);\n derivatives![i] = df * weight - dg * prev;\n dg = df;\n }\n prev = weight;\n g = 1 - f;\n }\n weights[0] = g * prev;\n if (last) {\n derivatives![0] = -dg * prev;\n }\n }\n return knot - degree;\n}\n\n/** Evaluates a curve point; `out` receives position (0..2) and derivative (3..5). */\nexport function evaluateNurbsCurve(curve: FBXNurbsCurveData, u: number, out: Float64Array, weights: Float64Array, derivs: Float64Array): boolean {\n const base = evaluateNurbsBasis(curve.basis, u, weights, derivs);\n if (base < 0 || curve.numControlPoints === 0) {\n return false;\n }\n const order = curve.basis.order;\n let px = 0,\n py = 0,\n pz = 0,\n pw = 0,\n dx = 0,\n dy = 0,\n dz = 0,\n dw = 0;\n const cp = curve.controlPoints;\n for (let i = 0; i < order; i++) {\n const ix = ((base + i) % curve.numControlPoints) * 4;\n const w = weights[i] * cp[ix + 3];\n const d = derivs[i] * cp[ix + 3];\n px += cp[ix] * w;\n py += cp[ix + 1] * w;\n pz += cp[ix + 2] * w;\n pw += w;\n dx += cp[ix] * d;\n dy += cp[ix + 1] * d;\n dz += cp[ix + 2] * d;\n dw += d;\n }\n const rcp = pw !== 0 ? 1 / pw : 0;\n out[0] = px * rcp;\n out[1] = py * rcp;\n out[2] = pz * rcp;\n out[3] = (dx - dw * out[0]) * rcp;\n out[4] = (dy - dw * out[1]) * rcp;\n out[5] = (dz - dw * out[2]) * rcp;\n return true;\n}\n\n/** Evaluates a surface point; `out` receives position (0..2), du (3..5) and dv (6..8). */\nexport function evaluateNurbsSurface(\n surface: FBXNurbsSurfaceData,\n u: number,\n v: number,\n out: Float64Array,\n scratch: { wu: Float64Array; wv: Float64Array; du: Float64Array; dv: Float64Array }\n): boolean {\n const baseU = evaluateNurbsBasis(surface.basisU, u, scratch.wu, scratch.du);\n const baseV = evaluateNurbsBasis(surface.basisV, v, scratch.wv, scratch.dv);\n if (baseU < 0 || baseV < 0 || surface.numU === 0 || surface.numV === 0) {\n return false;\n }\n const orderU = surface.basisU.order;\n const orderV = surface.basisV.order;\n const cp = surface.controlPoints;\n let px = 0,\n py = 0,\n pz = 0,\n pw = 0;\n let ux = 0,\n uy = 0,\n uz = 0,\n uw = 0;\n let vx = 0,\n vy = 0,\n vz = 0,\n vw = 0;\n for (let vi = 0; vi < orderV; vi++) {\n const vix = (baseV + vi) % surface.numV;\n const weightV = scratch.wv[vi];\n const derivV = scratch.dv[vi];\n for (let ui = 0; ui < orderU; ui++) {\n const uix = (baseU + ui) % surface.numU;\n const weightU = scratch.wu[ui];\n const derivU = scratch.du[ui];\n const ix = (vix * surface.numU + uix) * 4;\n const cw = cp[ix + 3];\n const w = weightU * weightV * cw;\n const wdu = derivU * weightV * cw;\n const wdv = derivV * weightU * cw;\n const x = cp[ix],\n y = cp[ix + 1],\n z = cp[ix + 2];\n px += x * w;\n py += y * w;\n pz += z * w;\n pw += w;\n ux += x * wdu;\n uy += y * wdu;\n uz += z * wdu;\n uw += wdu;\n vx += x * wdv;\n vy += y * wdv;\n vz += z * wdv;\n vw += wdv;\n }\n }\n const rcp = pw !== 0 ? 1 / pw : 0;\n out[0] = px * rcp;\n out[1] = py * rcp;\n out[2] = pz * rcp;\n out[3] = (ux - uw * out[0]) * rcp;\n out[4] = (uy - uw * out[1]) * rcp;\n out[5] = (uz - uw * out[2]) * rcp;\n out[6] = (vx - vw * out[0]) * rcp;\n out[7] = (vy - vw * out[1]) * rcp;\n out[8] = (vz - vw * out[2]) * rcp;\n return true;\n}\n\n/**\n * Tessellates a curve into a polyline with `subdivision` segments per knot span. Closed and periodic curves\n * end on a copy of their first point.\n */\nexport function tessellateNurbsCurve(curve: FBXNurbsCurveData, subdivision: number = DEFAULT_SPAN_SUBDIVISION): Float64Array | null {\n const basis = curve.basis;\n if (!basis.valid || curve.numControlPoints === 0 || basis.spans.length === 0) {\n return null;\n }\n const numSub = Math.max(1, Math.floor(subdivision));\n const numSpans = basis.spans.length;\n const isOpen = basis.topology === \"open\";\n const numIndices = numSpans + (numSpans - 1) * (numSub - 1);\n const numVertices = numIndices - (isOpen ? 0 : 1);\n const points = new Float64Array(numIndices * 3);\n const weights = new Float64Array(basis.order + 1);\n const derivs = new Float64Array(basis.order + 1);\n const out = new Float64Array(6);\n for (let spanIx = 0; spanIx < numSpans; spanIx++) {\n const numSplits = spanIx + 1 === numSpans ? 1 : numSub;\n for (let subIx = 0; subIx < numSplits; subIx++) {\n const ix = spanIx * numSub + subIx;\n if (ix < numVertices) {\n let u = basis.spans[spanIx];\n if (subIx > 0) {\n const t = subIx / numSub;\n u = u * (1 - t) + t * basis.spans[spanIx + 1];\n }\n if (evaluateNurbsCurve(curve, u, out, weights, derivs)) {\n points[ix * 3] = out[0];\n points[ix * 3 + 1] = out[1];\n points[ix * 3 + 2] = out[2];\n }\n } else {\n points[ix * 3] = points[0];\n points[ix * 3 + 1] = points[1];\n points[ix * 3 + 2] = points[2];\n }\n }\n }\n return points;\n}\n\n/** Span subdivision to use for a surface direction: an explicit override, else the file's Step, else 4. */\nexport function resolveSpanSubdivision(fileStep: number, override: number | undefined): number {\n if (override !== undefined && Number.isFinite(override) && override > 0) {\n return Math.min(MAX_SPAN_SUBDIVISION, Math.max(1, Math.floor(override)));\n }\n if (fileStep > 0) {\n return Math.min(MAX_FILE_SPAN_SUBDIVISION, Math.floor(fileStep));\n }\n return DEFAULT_SPAN_SUBDIVISION;\n}\n\n/**\n * Tessellates a surface into triangles. Positions on wrapped (closed/periodic) edges and at poles are welded\n * exactly like the FBX SDK does, so degenerate quads collapse into triangles.\n */\nexport function tessellateNurbsSurface(\n surface: FBXNurbsSurfaceData,\n subU: number,\n subV: number\n): { positions: Float64Array; indices: Uint32Array; normals: Float64Array; uvs: Float64Array } | null {\n const basisU = surface.basisU;\n const basisV = surface.basisV;\n if (!basisU.valid || !basisV.valid || surface.numU === 0 || surface.numV === 0 || basisU.spans.length < 2 || basisV.spans.length < 2) {\n return null;\n }\n const openU = basisU.topology === \"open\";\n const openV = basisV.topology === \"open\";\n const spansU = basisU.spans.length;\n const spansV = basisV.spans.length;\n const facesU = (spansU - 1) * subU;\n const facesV = (spansV - 1) * subV;\n const indicesU = spansU + (spansU - 1) * (subU - 1);\n const indicesV = spansV + (spansV - 1) * (subV - 1);\n const numAttribs = indicesU * indicesV;\n const numFaces = facesU * facesV;\n if (numAttribs > 0x3fffffff || numFaces > 0x3fffffff) {\n return null;\n }\n\n // Unique (welded) positions and per-attribute-vertex data\n const positionIx = new Uint32Array(numAttribs);\n const welded = new Float64Array(numAttribs * 3);\n let numPositions = 0;\n const attribUv = new Float64Array(numAttribs * 2);\n const scratch = {\n wu: new Float64Array(basisU.order + 1),\n wv: new Float64Array(basisV.order + 1),\n du: new Float64Array(basisU.order + 1),\n dv: new Float64Array(basisV.order + 1),\n };\n const out = new Float64Array(9);\n\n for (let spanV = 0; spanV < spansV; spanV++) {\n const splitsV = spanV + 1 === spansV ? 1 : subV;\n for (let splitV = 0; splitV < splitsV; splitV++) {\n const ixV = spanV * subV + splitV;\n let v = basisV.spans[spanV];\n if (splitV > 0) {\n const t = splitV / splitsV;\n v = v * (1 - t) + t * basisV.spans[spanV + 1];\n }\n const originalV = v;\n if (spanV + 1 === spansV && !openV) {\n v = basisV.spans[0];\n }\n for (let spanU = 0; spanU < spansU; spanU++) {\n const splitsU = spanU + 1 === spansU ? 1 : subU;\n for (let splitU = 0; splitU < splitsU; splitU++) {\n const ixU = spanU * subU + splitU;\n let u = basisU.spans[spanU];\n if (splitU > 0) {\n const t = splitU / splitsU;\n u = u * (1 - t) + t * basisU.spans[spanU + 1];\n }\n const originalU = u;\n if (spanU + 1 === spansU && !openU) {\n u = basisU.spans[0];\n }\n\n let px = 0,\n py = 0,\n pz = 0;\n if (evaluateNurbsSurface(surface, u, v, out, scratch)) {\n px = out[0];\n py = out[1];\n pz = out[2];\n }\n\n // Positions that wrap around to an already emitted neighbour are welded.\n const neighbors: number[] = [];\n if ((spanV === 0 && (spanU > 0 || splitU > 0)) || (spanU === 0 && (spanV > 0 || splitV > 0))) {\n neighbors.push(0);\n }\n if (spanV + 1 === spansV) {\n neighbors.push(ixU);\n if (spanU > 0 || splitU > 0) {\n neighbors.push(ixV * indicesU);\n }\n }\n if (spanU + 1 === spansU) {\n neighbors.push(ixV * indicesU);\n if (spanV > 0 || splitV > 0) {\n neighbors.push(indicesU - 1);\n }\n }\n\n const ix = ixV * indicesU + ixU;\n let posIx = numPositions;\n for (const nb of neighbors) {\n if (nb >= ix) {\n continue;\n }\n const nbPos = positionIx[nb];\n const dx = welded[nbPos * 3] - px;\n const dy = welded[nbPos * 3 + 1] - py;\n const dz = welded[nbPos * 3 + 2] - pz;\n if (dx * dx + dy * dy + dz * dz < 0.0000001) {\n posIx = nbPos;\n break;\n }\n }\n positionIx[ix] = posIx;\n if (posIx === numPositions) {\n welded[posIx * 3] = px;\n welded[posIx * 3 + 1] = py;\n welded[posIx * 3 + 2] = pz;\n numPositions++;\n }\n attribUv[ix * 2] = originalU;\n attribUv[ix * 2 + 1] = originalV;\n }\n }\n }\n }\n\n // Faces: quads, or triangles where two consecutive corners share a welded position\n const triangles: number[] = [];\n const faceCorners = [0, 0, 0, 0];\n const faceVerts = [0, 0, 0, 0];\n for (let faceV = 0; faceV < facesV; faceV++) {\n for (let faceU = 0; faceU < facesU; faceU++) {\n faceCorners[0] = faceV * indicesU + faceU;\n faceCorners[1] = faceV * indicesU + faceU + 1;\n faceCorners[2] = (faceV + 1) * indicesU + faceU + 1;\n faceCorners[3] = (faceV + 1) * indicesU + faceU;\n for (let i = 0; i < 4; i++) {\n faceVerts[i] = positionIx[faceCorners[i]];\n }\n let count = 4;\n for (let prev = 0; prev < 4; prev++) {\n const next = (prev + 1) % 4;\n if (faceVerts[prev] === faceVerts[next]) {\n for (let i = next; i < 3; i++) {\n faceCorners[i] = faceCorners[i + 1];\n faceVerts[i] = faceVerts[i + 1];\n }\n count = 3;\n break;\n }\n }\n triangles.push(faceCorners[0], faceCorners[1], faceCorners[2]);\n if (count === 4) {\n triangles.push(faceCorners[0], faceCorners[2], faceCorners[3]);\n }\n }\n }\n\n // Smooth normals: area-weighted face normals accumulated per welded position\n const posNormals = new Float64Array(numPositions * 3);\n for (let t = 0; t < triangles.length; t += 3) {\n const a = positionIx[triangles[t]] * 3;\n const b = positionIx[triangles[t + 1]] * 3;\n const c = positionIx[triangles[t + 2]] * 3;\n const e1x = welded[b] - welded[a],\n e1y = welded[b + 1] - welded[a + 1],\n e1z = welded[b + 2] - welded[a + 2];\n const e2x = welded[c] - welded[a],\n e2y = welded[c + 1] - welded[a + 1],\n e2z = welded[c + 2] - welded[a + 2];\n const nx = e1y * e2z - e1z * e2y;\n const ny = e1z * e2x - e1x * e2z;\n const nz = e1x * e2y - e1y * e2x;\n for (const p of [a, b, c]) {\n posNormals[p] += nx;\n posNormals[p + 1] += ny;\n posNormals[p + 2] += nz;\n }\n }\n const flip = surface.flipNormals ? -1 : 1;\n for (let p = 0; p < numPositions; p++) {\n const x = posNormals[p * 3],\n y = posNormals[p * 3 + 1],\n z = posNormals[p * 3 + 2];\n const len = Math.hypot(x, y, z);\n if (len > 0) {\n posNormals[p * 3] = (x / len) * flip;\n posNormals[p * 3 + 1] = (y / len) * flip;\n posNormals[p * 3 + 2] = (z / len) * flip;\n }\n }\n\n const positions = new Float64Array(numAttribs * 3);\n const normals = new Float64Array(numAttribs * 3);\n for (let ix = 0; ix < numAttribs; ix++) {\n const p = positionIx[ix] * 3;\n positions[ix * 3] = welded[p];\n positions[ix * 3 + 1] = welded[p + 1];\n positions[ix * 3 + 2] = welded[p + 2];\n normals[ix * 3] = posNormals[p];\n normals[ix * 3 + 1] = posNormals[p + 1];\n normals[ix * 3 + 2] = posNormals[p + 2];\n }\n return { positions, indices: Uint32Array.from(triangles), normals, uvs: attribUv };\n}\n\nfunction readFloatArray(node: FBXNode, name: string): Float64Array | null {\n const child = findChildByName(node, name);\n if (!child) {\n return null;\n }\n const array = getNodeArray(child);\n if (!array) {\n return null;\n }\n return array instanceof Float64Array ? array : Float64Array.from(array as ArrayLike<number>);\n}\n\nfunction readColor(node: FBXNode): [number, number, number] | null {\n const entry = getPropertyEntries(node).find((e) => e.name === \"Color\");\n if (!entry || typeof entry.values[0] !== \"number\" || typeof entry.values[1] !== \"number\" || typeof entry.values[2] !== \"number\") {\n return null;\n }\n return [entry.values[0], entry.values[1], entry.values[2]];\n}\n\n/** Reads a NurbsCurve geometry node. */\nexport function extractNurbsCurve(node: FBXNode): FBXNurbsCurveData | null {\n const orderNode = findChildByName(node, \"Order\");\n const formNode = findChildByName(node, \"Form\");\n const order = orderNode ? (getPropertyValue<number>(orderNode, 0) ?? 0) : 0;\n const form = formNode ? getPropertyValue<string>(formNode, 0) : undefined;\n const points = readFloatArray(node, \"Points\");\n const knots = readFloatArray(node, \"KnotVector\");\n if (!points || !knots || points.length % 4 !== 0) {\n return null;\n }\n return { basis: createNurbsBasis(order, form, knots), controlPoints: points, numControlPoints: points.length / 4 };\n}\n\n/** Reads a NurbsSurface geometry node. */\nexport function extractNurbsSurface(node: FBXNode): FBXNurbsSurfaceData | null {\n const orderNode = findChildByName(node, \"NurbsSurfaceOrder\");\n const dimensionsNode = findChildByName(node, \"Dimensions\");\n const stepNode = findChildByName(node, \"Step\");\n const formNode = findChildByName(node, \"Form\");\n const flipNode = findChildByName(node, \"FlipNormals\");\n const orderU = orderNode ? (getPropertyValue<number>(orderNode, 0) ?? 0) : 0;\n const orderV = orderNode ? (getPropertyValue<number>(orderNode, 1) ?? 0) : 0;\n const numU = dimensionsNode ? (getPropertyValue<number>(dimensionsNode, 0) ?? 0) : 0;\n const numV = dimensionsNode ? (getPropertyValue<number>(dimensionsNode, 1) ?? 0) : 0;\n const stepU = stepNode ? (getPropertyValue<number>(stepNode, 0) ?? 0) : 0;\n const stepV = stepNode ? (getPropertyValue<number>(stepNode, 1) ?? 0) : 0;\n const formU = formNode ? getPropertyValue<string>(formNode, 0) : undefined;\n const formV = formNode ? getPropertyValue<string>(formNode, 1) : undefined;\n const flipValue = flipNode ? getPropertyValue<number | boolean>(flipNode, 0) : 0;\n const points = readFloatArray(node, \"Points\");\n const knotsU = readFloatArray(node, \"KnotVectorU\");\n const knotsV = readFloatArray(node, \"KnotVectorV\");\n if (!points || !knotsU || !knotsV || points.length % 4 !== 0 || points.length / 4 !== numU * numV || numU <= 0 || numV <= 0) {\n return null;\n }\n return {\n basisU: createNurbsBasis(orderU, formU, knotsU),\n basisV: createNurbsBasis(orderV, formV, knotsV),\n numU,\n numV,\n controlPoints: points,\n flipNormals: flipValue === true || flipValue === 1,\n stepU: typeof stepU === \"number\" ? stepU : 0,\n stepV: typeof stepV === \"number\" ? stepV : 0,\n };\n}\n\n/** Tessellates a NurbsSurface geometry node into mesh geometry. */\nexport function nurbsSurfaceToGeometry(node: FBXNode, geometryId: number, subdivisionOverride: number | undefined): FBXGeometryData | null {\n const name = cleanFBXName(getPropertyValue<string>(node, 1) ?? \"NurbsSurface\");\n const surface = extractNurbsSurface(node);\n const diagnostics: FBXGeometryDiagnostic[] = [];\n if (!surface) {\n return null;\n }\n const subU = resolveSpanSubdivision(surface.stepU, subdivisionOverride);\n const subV = resolveSpanSubdivision(surface.stepV, subdivisionOverride);\n const tess = tessellateNurbsSurface(surface, subU, subV);\n if (!tess) {\n diagnostics.push({ type: \"nurbs-invalid\", message: `NURBS surface '${name}' has an invalid basis and was skipped.` });\n return {\n id: geometryId,\n name,\n positions: new Float64Array(0),\n indices: new Uint32Array(0),\n normals: null,\n uvs: null,\n uvSets: [],\n colors: null,\n tangents: null,\n binormals: null,\n controlPointIndices: null,\n materialIndices: null,\n diagnostics,\n };\n }\n return {\n id: geometryId,\n name,\n positions: tess.positions,\n indices: tess.indices,\n normals: tess.normals,\n uvs: tess.uvs,\n uvSets: [{ name: \"map1\", data: tess.uvs }],\n colors: null,\n tangents: null,\n binormals: null,\n controlPointIndices: null,\n materialIndices: null,\n diagnostics,\n };\n}\n\n/** Reads a NurbsCurve geometry node into a tessellated polyline. */\nexport function extractNurbsCurveGeometry(node: FBXNode, geometryId: number, subdivision: number = DEFAULT_SPAN_SUBDIVISION): FBXCurveGeometryData {\n const name = cleanFBXName(getPropertyValue<string>(node, 1) ?? \"NurbsCurve\");\n const diagnostics: FBXGeometryDiagnostic[] = [];\n const curve = extractNurbsCurve(node);\n const polyline = curve ? tessellateNurbsCurve(curve, subdivision) : null;\n if (!polyline) {\n diagnostics.push({ type: \"nurbs-invalid\", message: `NURBS curve '${name}' has an invalid basis and was skipped.` });\n }\n return { id: geometryId, name, kind: \"nurbsCurve\", polylines: polyline ? [polyline] : [], color: readColor(node), diagnostics };\n}\n\n/**\n * Reads a Line geometry node: Points plus PointsIndex where a negative index (~index) ends a segment, as in\n * polygon vertex indices.\n */\nexport function extractLineGeometry(node: FBXNode, geometryId: number): FBXCurveGeometryData {\n const name = cleanFBXName(getPropertyValue<string>(node, 1) ?? \"Line\");\n const diagnostics: FBXGeometryDiagnostic[] = [];\n const points = readFloatArray(node, \"Points\");\n const indexNode = findChildByName(node, \"PointsIndex\");\n const rawIndices = indexNode ? getNodeArray(indexNode) : null;\n const polylines: Float64Array[] = [];\n if (points && points.length % 3 === 0) {\n const numPoints = points.length / 3;\n const indices: number[] = rawIndices ? Array.from(rawIndices as ArrayLike<number>) : Array.from({ length: numPoints }, (_, i) => i);\n let current: number[] = [];\n const flush = () => {\n if (current.length >= 2) {\n polylines.push(Float64Array.from(current));\n } else if (current.length === 1) {\n diagnostics.push({ type: \"degenerate-polygon\", message: `Line '${name}' has a single-point segment that was skipped.` });\n }\n current = [];\n };\n for (let i = 0; i < indices.length; i++) {\n let ix = indices[i];\n const ends = ix < 0;\n if (ends) {\n ix = ~ix;\n }\n if (ix >= 0 && ix < numPoints) {\n current.push(points[ix * 3], points[ix * 3 + 1], points[ix * 3 + 2]);\n } else {\n diagnostics.push({ type: \"layer-index-out-of-bounds\", message: `Line '${name}' references point ${ix} outside its ${numPoints} points.`, index: i });\n }\n if (ends) {\n flush();\n }\n }\n flush();\n }\n return { id: geometryId, name, kind: \"line\", polylines, color: readColor(node), diagnostics };\n}\n"]}
|
|
@@ -20,3 +20,26 @@ export declare function resolveNumberProperty(node: FBXNode, template: FBXProper
|
|
|
20
20
|
export declare function resolveVector2Property(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string, fallback: [number, number]): [number, number];
|
|
21
21
|
export declare function resolveVector3Property(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string, fallback: [number, number, number]): [number, number, number];
|
|
22
22
|
export declare function resolvePropertyValues(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string): FBXPropertyValue[] | undefined;
|
|
23
|
+
/** A property from a Properties70 ("P") or Properties60 ("Property") block. */
|
|
24
|
+
export interface FBXPropertyEntry {
|
|
25
|
+
name: string;
|
|
26
|
+
type: string;
|
|
27
|
+
flags: string;
|
|
28
|
+
values: FBXPropertyValue[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Lists the properties declared directly on an object, from both the 7.x and 6.x property blocks.
|
|
32
|
+
* @param node - Object node
|
|
33
|
+
* @returns Property entries in declaration order (empty when the node has no property block)
|
|
34
|
+
*/
|
|
35
|
+
export declare function getPropertyEntries(node: FBXNode | undefined): FBXPropertyEntry[];
|
|
36
|
+
/** Value of a user property: scalars as-is, vectors and colours as number arrays. */
|
|
37
|
+
export type FBXUserPropertyValue = string | number | boolean | number[];
|
|
38
|
+
/**
|
|
39
|
+
* User-defined properties of an object: those flagged "U" (user) in the property flags. Every DCC exports custom
|
|
40
|
+
* attributes this way (Maya extra attributes, 3ds Max user properties, Blender custom properties).
|
|
41
|
+
* @param node - Object node
|
|
42
|
+
* @returns Map of property name to value, or undefined when the object has none
|
|
43
|
+
*/
|
|
44
|
+
export declare function extractUserProperties(node: FBXNode): Record<string, FBXUserPropertyValue> | undefined;
|
|
45
|
+
export declare function userPropertyValue(values: FBXPropertyValue[], typeName?: string): FBXUserPropertyValue | undefined;
|
|
@@ -94,8 +94,115 @@ function extractPropertyTemplate(objectType, templateName, templateNode) {
|
|
|
94
94
|
}
|
|
95
95
|
return { objectType, templateName, properties };
|
|
96
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Lists the properties declared directly on an object, from both the 7.x and 6.x property blocks.
|
|
99
|
+
* @param node - Object node
|
|
100
|
+
* @returns Property entries in declaration order (empty when the node has no property block)
|
|
101
|
+
*/
|
|
102
|
+
export function getPropertyEntries(node) {
|
|
103
|
+
const out = [];
|
|
104
|
+
if (!node) {
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
for (const container of node.children) {
|
|
108
|
+
if (container.name !== "Properties70" && container.name !== "Properties60") {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
for (const p of container.children) {
|
|
112
|
+
if (p.name !== "P" && p.name !== "PS" && p.name !== "Property") {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const name = getPropertyValue(p, 0);
|
|
116
|
+
if (typeof name !== "string") {
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
// The layout follows the entry node, not its container: `P` / `PS` carry name, type, label and flags,
|
|
120
|
+
// `Property` carries name, type and flags. Transitional 6.x files write `P` entries inside Properties60.
|
|
121
|
+
const hasLabel = p.name !== "Property";
|
|
122
|
+
const type = getPropertyValue(p, 1);
|
|
123
|
+
const flags = getPropertyValue(p, hasLabel ? 3 : 2);
|
|
124
|
+
out.push({
|
|
125
|
+
name,
|
|
126
|
+
type: typeof type === "string" ? type : "",
|
|
127
|
+
flags: typeof flags === "string" ? flags : "",
|
|
128
|
+
values: p.properties.slice(hasLabel ? 4 : 3).map((property) => property.value),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* User-defined properties of an object: those flagged "U" (user) in the property flags. Every DCC exports custom
|
|
136
|
+
* attributes this way (Maya extra attributes, 3ds Max user properties, Blender custom properties).
|
|
137
|
+
* @param node - Object node
|
|
138
|
+
* @returns Map of property name to value, or undefined when the object has none
|
|
139
|
+
*/
|
|
140
|
+
export function extractUserProperties(node) {
|
|
141
|
+
const result = {};
|
|
142
|
+
let any = false;
|
|
143
|
+
for (const entry of getPropertyEntries(node)) {
|
|
144
|
+
if (!entry.flags.includes("U")) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const value = userPropertyValue(entry.values, entry.type);
|
|
148
|
+
if (value !== undefined) {
|
|
149
|
+
result[entry.name] = value;
|
|
150
|
+
any = true;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return any ? result : undefined;
|
|
154
|
+
}
|
|
155
|
+
/** Property types whose extra values are limits or labels rather than components (value, min, max). */
|
|
156
|
+
const SCALAR_PROPERTY_TYPES = new Set([
|
|
157
|
+
"Integer",
|
|
158
|
+
"int",
|
|
159
|
+
"Number",
|
|
160
|
+
"double",
|
|
161
|
+
"Float",
|
|
162
|
+
"float",
|
|
163
|
+
"Bool",
|
|
164
|
+
"bool",
|
|
165
|
+
"Enum",
|
|
166
|
+
"enum",
|
|
167
|
+
"Visibility",
|
|
168
|
+
"Roll",
|
|
169
|
+
"Weight",
|
|
170
|
+
"Distance",
|
|
171
|
+
"KTime",
|
|
172
|
+
"Time",
|
|
173
|
+
]);
|
|
174
|
+
export function userPropertyValue(values, typeName) {
|
|
175
|
+
if (values.length === 0) {
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
const first = values[0];
|
|
179
|
+
if (typeName !== undefined && SCALAR_PROPERTY_TYPES.has(typeName) && (typeof first === "number" || typeof first === "boolean")) {
|
|
180
|
+
return typeof first === "boolean" ? first : first;
|
|
181
|
+
}
|
|
182
|
+
if (values.length === 1) {
|
|
183
|
+
return typeof first === "string" || typeof first === "number" || typeof first === "boolean" ? first : undefined;
|
|
184
|
+
}
|
|
185
|
+
const numbers = [];
|
|
186
|
+
for (const v of values) {
|
|
187
|
+
if (typeof v === "number") {
|
|
188
|
+
numbers.push(v);
|
|
189
|
+
}
|
|
190
|
+
else if (typeof v === "boolean") {
|
|
191
|
+
numbers.push(v ? 1 : 0);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (numbers.length === values.length) {
|
|
198
|
+
return numbers;
|
|
199
|
+
}
|
|
200
|
+
return typeof first === "string" ? first : undefined;
|
|
201
|
+
}
|
|
97
202
|
function findLocalPropertyValues(node, propertyName) {
|
|
98
203
|
const propertyContainers = [findChildByName(node, "Properties70"), findChildByName(node, "Properties60")].filter((child) => child !== undefined);
|
|
204
|
+
// When a property is declared more than once the SDK keeps the last declaration.
|
|
205
|
+
let found;
|
|
99
206
|
for (const container of propertyContainers) {
|
|
100
207
|
for (const propertyNode of container.children) {
|
|
101
208
|
if (propertyNode.name !== "P" && propertyNode.name !== "Property") {
|
|
@@ -104,10 +211,10 @@ function findLocalPropertyValues(node, propertyName) {
|
|
|
104
211
|
if (getPropertyValue(propertyNode, 0) !== propertyName) {
|
|
105
212
|
continue;
|
|
106
213
|
}
|
|
107
|
-
|
|
214
|
+
found = propertyNode.properties.slice(propertyNode.name === "Property" ? 3 : 4).map((property) => property.value);
|
|
108
215
|
}
|
|
109
216
|
}
|
|
110
|
-
return
|
|
217
|
+
return found;
|
|
111
218
|
}
|
|
112
219
|
function extractPropertyNode(node) {
|
|
113
220
|
const name = getPropertyValue(node, 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propertyTemplates.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/propertyTemplates.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\r\nimport { type FBXDocument, type FBXNode, type FBXPropertyValue, findChildByName, findDocumentNode, getPropertyValue } from \"../types/fbxTypes\";\r\n\r\nexport interface FBXTemplateProperty {\r\n name: string;\r\n propertyType: string;\r\n label: string;\r\n flags: string;\r\n values: FBXPropertyValue[];\r\n}\r\n\r\nexport interface FBXPropertyTemplate {\r\n objectType: string;\r\n templateName: string;\r\n properties: Map<string, FBXTemplateProperty>;\r\n}\r\n\r\nexport type FBXPropertyTemplateMap = Map<string, Map<string, FBXPropertyTemplate>>;\r\n\r\nexport function extractPropertyTemplates(doc: FBXDocument): FBXPropertyTemplateMap {\r\n const templates: FBXPropertyTemplateMap = new Map();\r\n const definitions = findDocumentNode(doc, \"Definitions\");\r\n if (!definitions) {\r\n return templates;\r\n }\r\n\r\n for (const objectTypeNode of definitions.children) {\r\n if (objectTypeNode.name !== \"ObjectType\") {\r\n continue;\r\n }\r\n\r\n const objectType = getPropertyValue<string>(objectTypeNode, 0);\r\n if (!objectType) {\r\n continue;\r\n }\r\n\r\n for (const templateNode of objectTypeNode.children) {\r\n if (templateNode.name !== \"PropertyTemplate\") {\r\n continue;\r\n }\r\n\r\n const templateName = getPropertyValue<string>(templateNode, 0);\r\n if (!templateName) {\r\n continue;\r\n }\r\n\r\n const template = extractPropertyTemplate(objectType, templateName, templateNode);\r\n let templatesByName = templates.get(objectType);\r\n if (!templatesByName) {\r\n templatesByName = new Map();\r\n templates.set(objectType, templatesByName);\r\n }\r\n templatesByName.set(templateName, template);\r\n }\r\n }\r\n\r\n return templates;\r\n}\r\n\r\nexport function getPropertyTemplate(templates: FBXPropertyTemplateMap, objectType: string, templateName?: string): FBXPropertyTemplate | undefined {\r\n const templatesByName = templates.get(objectType);\r\n if (!templatesByName) {\r\n return undefined;\r\n }\r\n if (templateName) {\r\n return templatesByName.get(templateName);\r\n }\r\n return templatesByName.values().next().value;\r\n}\r\n\r\nexport function getTemplatePropertyValue<T extends FBXPropertyValue>(template: FBXPropertyTemplate | undefined, propertyName: string, valueIndex = 0): T | undefined {\r\n return template?.properties.get(propertyName)?.values[valueIndex] as T | undefined;\r\n}\r\n\r\nexport function resolvePropertyValue<T extends FBXPropertyValue>(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string, valueIndex = 0): T | undefined {\r\n return resolvePropertyValues(node, template, propertyName)?.[valueIndex] as T | undefined;\r\n}\r\n\r\nexport function resolveNumberProperty(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string, fallback: number): number {\r\n return toNumber(resolvePropertyValue(node, template, propertyName)) ?? fallback;\r\n}\r\n\r\nexport function resolveVector2Property(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string, fallback: [number, number]): [number, number] {\r\n const values = resolvePropertyValues(node, template, propertyName);\r\n if (!values) {\r\n return fallback;\r\n }\r\n const x = toNumber(values[0]);\r\n const y = toNumber(values[1]);\r\n return x !== undefined && y !== undefined ? [x, y] : fallback;\r\n}\r\n\r\nexport function resolveVector3Property(\r\n node: FBXNode,\r\n template: FBXPropertyTemplate | undefined,\r\n propertyName: string,\r\n fallback: [number, number, number]\r\n): [number, number, number] {\r\n const values = resolvePropertyValues(node, template, propertyName);\r\n if (!values) {\r\n return fallback;\r\n }\r\n const x = toNumber(values[0]);\r\n const y = toNumber(values[1]);\r\n const z = toNumber(values[2]);\r\n return x !== undefined && y !== undefined && z !== undefined ? [x, y, z] : fallback;\r\n}\r\n\r\nexport function resolvePropertyValues(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string): FBXPropertyValue[] | undefined {\r\n return findLocalPropertyValues(node, propertyName) ?? template?.properties.get(propertyName)?.values;\r\n}\r\n\r\nfunction toNumber(value: FBXPropertyValue | undefined): number | undefined {\r\n if (typeof value === \"number\") {\r\n return value;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction extractPropertyTemplate(objectType: string, templateName: string, templateNode: FBXNode): FBXPropertyTemplate {\r\n const properties = new Map<string, FBXTemplateProperty>();\r\n const properties70 = findChildByName(templateNode, \"Properties70\");\r\n\r\n for (const propertyNode of properties70?.children ?? []) {\r\n if (propertyNode.name !== \"P\") {\r\n continue;\r\n }\r\n\r\n const property = extractPropertyNode(propertyNode);\r\n if (property) {\r\n properties.set(property.name, property);\r\n }\r\n }\r\n\r\n return { objectType, templateName, properties };\r\n}\r\n\r\nfunction findLocalPropertyValues(node: FBXNode, propertyName: string): FBXPropertyValue[] | undefined {\r\n const propertyContainers = [findChildByName(node, \"Properties70\"), findChildByName(node, \"Properties60\")].filter((child): child is FBXNode => child !== undefined);\r\n\r\n for (const container of propertyContainers) {\r\n for (const propertyNode of container.children) {\r\n if (propertyNode.name !== \"P\" && propertyNode.name !== \"Property\") {\r\n continue;\r\n }\r\n if (getPropertyValue<string>(propertyNode, 0) !== propertyName) {\r\n continue;\r\n }\r\n return propertyNode.properties.slice(propertyNode.name === \"Property\" ? 3 : 4).map((property) => property.value);\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction extractPropertyNode(node: FBXNode): FBXTemplateProperty | null {\r\n const name = getPropertyValue<string>(node, 0);\r\n if (!name) {\r\n return null;\r\n }\r\n\r\n return {\r\n name,\r\n propertyType: getPropertyValue<string>(node, 1) ?? \"\",\r\n label: getPropertyValue<string>(node, 2) ?? \"\",\r\n flags: getPropertyValue<string>(node, 3) ?? \"\",\r\n values: node.properties.slice(4).map((property) => property.value),\r\n };\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"propertyTemplates.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/propertyTemplates.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,OAAO,EAAyD,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAkB/I,MAAM,UAAU,wBAAwB,CAAC,GAAgB;IACrD,MAAM,SAAS,GAA2B,IAAI,GAAG,EAAE,CAAC;IACpD,MAAM,WAAW,GAAG,gBAAgB,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACzD,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,KAAK,MAAM,cAAc,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;QAChD,IAAI,cAAc,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACvC,SAAS;QACb,CAAC;QAED,MAAM,UAAU,GAAG,gBAAgB,CAAS,cAAc,EAAE,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,SAAS;QACb,CAAC;QAED,KAAK,MAAM,YAAY,IAAI,cAAc,CAAC,QAAQ,EAAE,CAAC;YACjD,IAAI,YAAY,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAC3C,SAAS;YACb,CAAC;YAED,MAAM,YAAY,GAAG,gBAAgB,CAAS,YAAY,EAAE,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChB,SAAS;YACb,CAAC;YAED,MAAM,QAAQ,GAAG,uBAAuB,CAAC,UAAU,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;YACjF,IAAI,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAChD,IAAI,CAAC,eAAe,EAAE,CAAC;gBACnB,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC;gBAC5B,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;YAC/C,CAAC;YACD,eAAe,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiC,EAAE,UAAkB,EAAE,YAAqB;IAC5G,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,CAAC,eAAe,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,YAAY,EAAE,CAAC;QACf,OAAO,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,eAAe,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAA6B,QAAyC,EAAE,YAAoB,EAAE,UAAU,GAAG,CAAC;IAChJ,OAAO,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,UAAU,CAAkB,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAA6B,IAAa,EAAE,QAAyC,EAAE,YAAoB,EAAE,UAAU,GAAG,CAAC;IAC3J,OAAO,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC,UAAU,CAAkB,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAa,EAAE,QAAyC,EAAE,YAAoB,EAAE,QAAgB;IAClI,OAAO,QAAQ,CAAC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC,IAAI,QAAQ,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAa,EAAE,QAAyC,EAAE,YAAoB,EAAE,QAA0B;IAC7I,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,sBAAsB,CAClC,IAAa,EACb,QAAyC,EACzC,YAAoB,EACpB,QAAkC;IAElC,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAa,EAAE,QAAyC,EAAE,YAAoB;IAChH,OAAO,uBAAuB,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,QAAQ,EAAE,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;AACzG,CAAC;AAED,SAAS,QAAQ,CAAC,KAAmC;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,uBAAuB,CAAC,UAAkB,EAAE,YAAoB,EAAE,YAAqB;IAC5F,MAAM,UAAU,GAAG,IAAI,GAAG,EAA+B,CAAC;IAC1D,MAAM,YAAY,GAAG,eAAe,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAEnE,KAAK,MAAM,YAAY,IAAI,YAAY,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;QACtD,IAAI,YAAY,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;YAC5B,SAAS;QACb,CAAC;QAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;QACnD,IAAI,QAAQ,EAAE,CAAC;YACX,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5C,CAAC;IACL,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AACpD,CAAC;AAUD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAyB;IACxD,MAAM,GAAG,GAAuB,EAAE,CAAC;IACnC,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,GAAG,CAAC;IACf,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,IAAI,SAAS,CAAC,IAAI,KAAK,cAAc,IAAI,SAAS,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YACzE,SAAS;QACb,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC7D,SAAS;YACb,CAAC;YACD,MAAM,IAAI,GAAG,gBAAgB,CAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,SAAS;YACb,CAAC;YACD,sGAAsG;YACtG,yGAAyG;YACzG,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;YACvC,MAAM,IAAI,GAAG,gBAAgB,CAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,gBAAgB,CAAS,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5D,GAAG,CAAC,IAAI,CAAC;gBACL,IAAI;gBACJ,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAC1C,KAAK,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBAC7C,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;aACjF,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAKD;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAa;IAC/C,MAAM,MAAM,GAAyC,EAAE,CAAC;IACxD,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,SAAS;QACb,CAAC;QACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YAC3B,GAAG,GAAG,IAAI,CAAC;QACf,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACpC,CAAC;AAED,uGAAuG;AACvG,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IAClC,SAAS;IACT,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,YAAY;IACZ,MAAM;IACN,QAAQ;IACR,UAAU;IACV,OAAO;IACP,MAAM;CACT,CAAC,CAAC;AAEH,MAAM,UAAU,iBAAiB,CAAC,MAA0B,EAAE,QAAiB;IAC3E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,QAAQ,KAAK,SAAS,IAAI,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC,EAAE,CAAC;QAC7H,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACtD,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACpH,CAAC;IACD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACrB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACJ,MAAM;QACV,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QACnC,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACzD,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAa,EAAE,YAAoB;IAChE,MAAM,kBAAkB,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,eAAe,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAoB,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAEnK,iFAAiF;IACjF,IAAI,KAAqC,CAAC;IAC1C,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;QACzC,KAAK,MAAM,YAAY,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC5C,IAAI,YAAY,CAAC,IAAI,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAChE,SAAS;YACb,CAAC;YACD,IAAI,gBAAgB,CAAS,YAAY,EAAE,CAAC,CAAC,KAAK,YAAY,EAAE,CAAC;gBAC7D,SAAS;YACb,CAAC;YACD,KAAK,GAAG,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtH,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAa;IACtC,MAAM,IAAI,GAAG,gBAAgB,CAAS,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO;QACH,IAAI;QACJ,YAAY,EAAE,gBAAgB,CAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QACrD,KAAK,EAAE,gBAAgB,CAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QAC9C,KAAK,EAAE,gBAAgB,CAAS,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QAC9C,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;KACrE,CAAC;AACN,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\nimport { type FBXDocument, type FBXNode, type FBXPropertyValue, findChildByName, findDocumentNode, getPropertyValue } from \"../types/fbxTypes\";\n\nexport interface FBXTemplateProperty {\n name: string;\n propertyType: string;\n label: string;\n flags: string;\n values: FBXPropertyValue[];\n}\n\nexport interface FBXPropertyTemplate {\n objectType: string;\n templateName: string;\n properties: Map<string, FBXTemplateProperty>;\n}\n\nexport type FBXPropertyTemplateMap = Map<string, Map<string, FBXPropertyTemplate>>;\n\nexport function extractPropertyTemplates(doc: FBXDocument): FBXPropertyTemplateMap {\n const templates: FBXPropertyTemplateMap = new Map();\n const definitions = findDocumentNode(doc, \"Definitions\");\n if (!definitions) {\n return templates;\n }\n\n for (const objectTypeNode of definitions.children) {\n if (objectTypeNode.name !== \"ObjectType\") {\n continue;\n }\n\n const objectType = getPropertyValue<string>(objectTypeNode, 0);\n if (!objectType) {\n continue;\n }\n\n for (const templateNode of objectTypeNode.children) {\n if (templateNode.name !== \"PropertyTemplate\") {\n continue;\n }\n\n const templateName = getPropertyValue<string>(templateNode, 0);\n if (!templateName) {\n continue;\n }\n\n const template = extractPropertyTemplate(objectType, templateName, templateNode);\n let templatesByName = templates.get(objectType);\n if (!templatesByName) {\n templatesByName = new Map();\n templates.set(objectType, templatesByName);\n }\n templatesByName.set(templateName, template);\n }\n }\n\n return templates;\n}\n\nexport function getPropertyTemplate(templates: FBXPropertyTemplateMap, objectType: string, templateName?: string): FBXPropertyTemplate | undefined {\n const templatesByName = templates.get(objectType);\n if (!templatesByName) {\n return undefined;\n }\n if (templateName) {\n return templatesByName.get(templateName);\n }\n return templatesByName.values().next().value;\n}\n\nexport function getTemplatePropertyValue<T extends FBXPropertyValue>(template: FBXPropertyTemplate | undefined, propertyName: string, valueIndex = 0): T | undefined {\n return template?.properties.get(propertyName)?.values[valueIndex] as T | undefined;\n}\n\nexport function resolvePropertyValue<T extends FBXPropertyValue>(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string, valueIndex = 0): T | undefined {\n return resolvePropertyValues(node, template, propertyName)?.[valueIndex] as T | undefined;\n}\n\nexport function resolveNumberProperty(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string, fallback: number): number {\n return toNumber(resolvePropertyValue(node, template, propertyName)) ?? fallback;\n}\n\nexport function resolveVector2Property(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string, fallback: [number, number]): [number, number] {\n const values = resolvePropertyValues(node, template, propertyName);\n if (!values) {\n return fallback;\n }\n const x = toNumber(values[0]);\n const y = toNumber(values[1]);\n return x !== undefined && y !== undefined ? [x, y] : fallback;\n}\n\nexport function resolveVector3Property(\n node: FBXNode,\n template: FBXPropertyTemplate | undefined,\n propertyName: string,\n fallback: [number, number, number]\n): [number, number, number] {\n const values = resolvePropertyValues(node, template, propertyName);\n if (!values) {\n return fallback;\n }\n const x = toNumber(values[0]);\n const y = toNumber(values[1]);\n const z = toNumber(values[2]);\n return x !== undefined && y !== undefined && z !== undefined ? [x, y, z] : fallback;\n}\n\nexport function resolvePropertyValues(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string): FBXPropertyValue[] | undefined {\n return findLocalPropertyValues(node, propertyName) ?? template?.properties.get(propertyName)?.values;\n}\n\nfunction toNumber(value: FBXPropertyValue | undefined): number | undefined {\n if (typeof value === \"number\") {\n return value;\n }\n return undefined;\n}\n\nfunction extractPropertyTemplate(objectType: string, templateName: string, templateNode: FBXNode): FBXPropertyTemplate {\n const properties = new Map<string, FBXTemplateProperty>();\n const properties70 = findChildByName(templateNode, \"Properties70\");\n\n for (const propertyNode of properties70?.children ?? []) {\n if (propertyNode.name !== \"P\") {\n continue;\n }\n\n const property = extractPropertyNode(propertyNode);\n if (property) {\n properties.set(property.name, property);\n }\n }\n\n return { objectType, templateName, properties };\n}\n\n/** A property from a Properties70 (\"P\") or Properties60 (\"Property\") block. */\nexport interface FBXPropertyEntry {\n name: string;\n type: string;\n flags: string;\n values: FBXPropertyValue[];\n}\n\n/**\n * Lists the properties declared directly on an object, from both the 7.x and 6.x property blocks.\n * @param node - Object node\n * @returns Property entries in declaration order (empty when the node has no property block)\n */\nexport function getPropertyEntries(node: FBXNode | undefined): FBXPropertyEntry[] {\n const out: FBXPropertyEntry[] = [];\n if (!node) {\n return out;\n }\n for (const container of node.children) {\n if (container.name !== \"Properties70\" && container.name !== \"Properties60\") {\n continue;\n }\n for (const p of container.children) {\n if (p.name !== \"P\" && p.name !== \"PS\" && p.name !== \"Property\") {\n continue;\n }\n const name = getPropertyValue<string>(p, 0);\n if (typeof name !== \"string\") {\n continue;\n }\n // The layout follows the entry node, not its container: `P` / `PS` carry name, type, label and flags,\n // `Property` carries name, type and flags. Transitional 6.x files write `P` entries inside Properties60.\n const hasLabel = p.name !== \"Property\";\n const type = getPropertyValue<string>(p, 1);\n const flags = getPropertyValue<string>(p, hasLabel ? 3 : 2);\n out.push({\n name,\n type: typeof type === \"string\" ? type : \"\",\n flags: typeof flags === \"string\" ? flags : \"\",\n values: p.properties.slice(hasLabel ? 4 : 3).map((property) => property.value),\n });\n }\n }\n return out;\n}\n\n/** Value of a user property: scalars as-is, vectors and colours as number arrays. */\nexport type FBXUserPropertyValue = string | number | boolean | number[];\n\n/**\n * User-defined properties of an object: those flagged \"U\" (user) in the property flags. Every DCC exports custom\n * attributes this way (Maya extra attributes, 3ds Max user properties, Blender custom properties).\n * @param node - Object node\n * @returns Map of property name to value, or undefined when the object has none\n */\nexport function extractUserProperties(node: FBXNode): Record<string, FBXUserPropertyValue> | undefined {\n const result: Record<string, FBXUserPropertyValue> = {};\n let any = false;\n for (const entry of getPropertyEntries(node)) {\n if (!entry.flags.includes(\"U\")) {\n continue;\n }\n const value = userPropertyValue(entry.values, entry.type);\n if (value !== undefined) {\n result[entry.name] = value;\n any = true;\n }\n }\n return any ? result : undefined;\n}\n\n/** Property types whose extra values are limits or labels rather than components (value, min, max). */\nconst SCALAR_PROPERTY_TYPES = new Set([\n \"Integer\",\n \"int\",\n \"Number\",\n \"double\",\n \"Float\",\n \"float\",\n \"Bool\",\n \"bool\",\n \"Enum\",\n \"enum\",\n \"Visibility\",\n \"Roll\",\n \"Weight\",\n \"Distance\",\n \"KTime\",\n \"Time\",\n]);\n\nexport function userPropertyValue(values: FBXPropertyValue[], typeName?: string): FBXUserPropertyValue | undefined {\n if (values.length === 0) {\n return undefined;\n }\n const first = values[0];\n if (typeName !== undefined && SCALAR_PROPERTY_TYPES.has(typeName) && (typeof first === \"number\" || typeof first === \"boolean\")) {\n return typeof first === \"boolean\" ? first : first;\n }\n if (values.length === 1) {\n return typeof first === \"string\" || typeof first === \"number\" || typeof first === \"boolean\" ? first : undefined;\n }\n const numbers: number[] = [];\n for (const v of values) {\n if (typeof v === \"number\") {\n numbers.push(v);\n } else if (typeof v === \"boolean\") {\n numbers.push(v ? 1 : 0);\n } else {\n break;\n }\n }\n if (numbers.length === values.length) {\n return numbers;\n }\n return typeof first === \"string\" ? first : undefined;\n}\n\nfunction findLocalPropertyValues(node: FBXNode, propertyName: string): FBXPropertyValue[] | undefined {\n const propertyContainers = [findChildByName(node, \"Properties70\"), findChildByName(node, \"Properties60\")].filter((child): child is FBXNode => child !== undefined);\n\n // When a property is declared more than once the SDK keeps the last declaration.\n let found: FBXPropertyValue[] | undefined;\n for (const container of propertyContainers) {\n for (const propertyNode of container.children) {\n if (propertyNode.name !== \"P\" && propertyNode.name !== \"Property\") {\n continue;\n }\n if (getPropertyValue<string>(propertyNode, 0) !== propertyName) {\n continue;\n }\n found = propertyNode.properties.slice(propertyNode.name === \"Property\" ? 3 : 4).map((property) => property.value);\n }\n }\n\n return found;\n}\n\nfunction extractPropertyNode(node: FBXNode): FBXTemplateProperty | null {\n const name = getPropertyValue<string>(node, 0);\n if (!name) {\n return null;\n }\n\n return {\n name,\n propertyType: getPropertyValue<string>(node, 1) ?? \"\",\n label: getPropertyValue<string>(node, 2) ?? \"\",\n flags: getPropertyValue<string>(node, 3) ?? \"\",\n values: node.properties.slice(4).map((property) => property.value),\n };\n}\n"]}
|
package/FBX/interpreter/rig.js
CHANGED
|
@@ -48,6 +48,22 @@ function buildRig(rootModelId, skins, objectMap) {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
+
// Skeleton models below the clusters (leaf joints, "_end" effectors) are part of the same rig even without
|
|
52
|
+
// clusters of their own; keeping them as bones lets inherit-mode handling and animation stay uniform.
|
|
53
|
+
const pending = Array.from(rigModelIds);
|
|
54
|
+
while (pending.length > 0) {
|
|
55
|
+
const parentId = pending.pop();
|
|
56
|
+
for (const conn of objectMap.connections) {
|
|
57
|
+
if (conn.type !== "OO" || conn.parentId !== parentId || rigModelIds.has(conn.childId)) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const child = objectMap.objects.get(conn.childId);
|
|
61
|
+
if (child && child.name === "Model" && isSkeletonModel(child)) {
|
|
62
|
+
rigModelIds.add(conn.childId);
|
|
63
|
+
pending.push(conn.childId);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
51
67
|
const warnings = collectTransformLinkWarnings(sourceBonesByModelId);
|
|
52
68
|
const preferredBoneByModelId = new Map();
|
|
53
69
|
for (const [modelId, sources] of Array.from(sourceBonesByModelId)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rig.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/rig.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\r\nimport { type FBXObjectMap } from \"./connections\";\r\nimport { type FBXBoneData, type FBXSkinData, extractBoneTransform, isSkeletonModel } from \"./skeleton\";\r\n\r\nimport { cleanFBXName, getPropertyValue } from \"../types/fbxTypes\";\r\n\r\nexport type FBXRigBoneData = FBXBoneData;\r\n\r\nexport interface FBXSkinBindingData {\r\n skinId: number;\r\n geometryId: number;\r\n rigId: string;\r\n skinBoneIndexToRigBoneIndex: number[];\r\n clusterModelIds: Set<number>;\r\n}\r\n\r\nexport interface FBXRigData {\r\n id: string;\r\n rootModelIds: number[];\r\n bones: FBXRigBoneData[];\r\n modelIdToBoneIndex: Map<number, number>;\r\n clusterModelIds: Set<number>;\r\n skinBindings: FBXSkinBindingData[];\r\n warnings: string[];\r\n}\r\n\r\nexport function resolveRigs(objectMap: FBXObjectMap, skins: FBXSkinData[]): FBXRigData[] {\r\n if (skins.length === 0) {\r\n return [];\r\n }\r\n\r\n const groupByRoot = new Map<number, FBXSkinData[]>();\r\n\r\n for (const skin of skins) {\r\n const clusterModelIds = skin.bones.filter((bone) => bone.isCluster).map((bone) => bone.modelId);\r\n if (clusterModelIds.length === 0) {\r\n continue;\r\n }\r\n\r\n const rootModelId = findRigGroupingRoot(clusterModelIds, objectMap);\r\n const group = groupByRoot.get(rootModelId);\r\n if (group) {\r\n group.push(skin);\r\n } else {\r\n groupByRoot.set(rootModelId, [skin]);\r\n }\r\n }\r\n\r\n return Array.from(groupByRoot.entries())\r\n .sort(([a], [b]) => compareNumber(a, b))\r\n .map(([rootModelId, groupSkins]) => buildRig(rootModelId, groupSkins, objectMap));\r\n}\r\n\r\nfunction buildRig(rootModelId: number, skins: FBXSkinData[], objectMap: FBXObjectMap): FBXRigData {\r\n const clusterModelIds = new Set<number>();\r\n const rigModelIds = new Set<number>();\r\n const sourceBonesByModelId = new Map<number, FBXBoneData[]>();\r\n const sourceOrderByModelId = new Map<number, number>();\r\n\r\n for (const skin of skins) {\r\n for (const bone of skin.bones) {\r\n if (!sourceOrderByModelId.has(bone.modelId)) {\r\n sourceOrderByModelId.set(bone.modelId, sourceOrderByModelId.size);\r\n }\r\n\r\n let sources = sourceBonesByModelId.get(bone.modelId);\r\n if (!sources) {\r\n sources = [];\r\n sourceBonesByModelId.set(bone.modelId, sources);\r\n }\r\n sources.push(bone);\r\n\r\n if (!bone.isCluster) {\r\n continue;\r\n }\r\n\r\n clusterModelIds.add(bone.modelId);\r\n for (const ancestorId of getModelAncestorChain(bone.modelId, objectMap)) {\r\n rigModelIds.add(ancestorId);\r\n }\r\n }\r\n }\r\n\r\n const warnings = collectTransformLinkWarnings(sourceBonesByModelId);\r\n const preferredBoneByModelId = new Map<number, FBXBoneData>();\r\n for (const [modelId, sources] of Array.from(sourceBonesByModelId)) {\r\n preferredBoneByModelId.set(modelId, choosePreferredBoneSource(sources));\r\n }\r\n\r\n const parentByModelId = buildParentMap(rigModelIds, objectMap);\r\n const orderedModelIds = orderParentsBeforeChildren(rigModelIds, parentByModelId, sourceOrderByModelId);\r\n const bones: FBXRigBoneData[] = [];\r\n const modelIdToBoneIndex = new Map<number, number>();\r\n\r\n for (const modelId of orderedModelIds) {\r\n const sourceBone = preferredBoneByModelId.get(modelId) ?? createFallbackBone(modelId, objectMap);\r\n if (!sourceBone) {\r\n continue;\r\n }\r\n\r\n const parentModelId = parentByModelId.get(modelId);\r\n const parentIndex = parentModelId === undefined ? -1 : (modelIdToBoneIndex.get(parentModelId) ?? -1);\r\n const index = bones.length;\r\n const bone: FBXRigBoneData = {\r\n ...sourceBone,\r\n index,\r\n parentIndex,\r\n isCluster: clusterModelIds.has(modelId),\r\n };\r\n bones.push(bone);\r\n modelIdToBoneIndex.set(modelId, index);\r\n }\r\n\r\n const skinBindings = skins.map((skin) => buildSkinBinding(skin, `rig_${rootModelId.toString()}`, modelIdToBoneIndex));\r\n\r\n return {\r\n id: `rig_${rootModelId.toString()}`,\r\n rootModelIds: bones.filter((bone) => bone.parentIndex < 0).map((bone) => bone.modelId),\r\n bones,\r\n modelIdToBoneIndex,\r\n clusterModelIds,\r\n skinBindings,\r\n warnings,\r\n };\r\n}\r\n\r\nfunction buildSkinBinding(skin: FBXSkinData, rigId: string, modelIdToBoneIndex: Map<number, number>): FBXSkinBindingData {\r\n const skinBoneIndexToRigBoneIndex = skin.bones.map((bone) => {\r\n const rigBoneIndex = modelIdToBoneIndex.get(bone.modelId);\r\n if (rigBoneIndex === undefined && bone.isCluster) {\r\n throw new Error(`FBX rig resolver: cluster bone ${bone.name} is missing from resolved rig ${rigId}`);\r\n }\r\n return rigBoneIndex ?? -1;\r\n });\r\n\r\n return {\r\n skinId: skin.id,\r\n geometryId: skin.geometryId,\r\n rigId,\r\n skinBoneIndexToRigBoneIndex,\r\n clusterModelIds: new Set(skin.bones.filter((bone) => bone.isCluster).map((bone) => bone.modelId)),\r\n };\r\n}\r\n\r\nfunction findRigGroupingRoot(clusterModelIds: number[], objectMap: FBXObjectMap): number {\r\n const lca = findLowestCommonAncestor(clusterModelIds, objectMap) ?? clusterModelIds[0];\r\n let root = lca;\r\n let parentId = findModelParentId(root, objectMap);\r\n\r\n while (parentId !== undefined) {\r\n const parentNode = objectMap.objects.get(parentId);\r\n if (!parentNode || parentNode.name !== \"Model\" || !isSkeletonModel(parentNode)) {\r\n break;\r\n }\r\n\r\n root = parentId;\r\n parentId = findModelParentId(parentId, objectMap);\r\n }\r\n\r\n return root;\r\n}\r\n\r\nfunction findLowestCommonAncestor(modelIds: number[], objectMap: FBXObjectMap): number | undefined {\r\n if (modelIds.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const chains = modelIds.map((modelId) => getModelAncestorChain(modelId, objectMap));\r\n const common = new Set(chains[0]);\r\n for (const chain of chains.slice(1)) {\r\n for (const modelId of Array.from(common)) {\r\n if (!chain.includes(modelId)) {\r\n common.delete(modelId);\r\n }\r\n }\r\n }\r\n\r\n return chains[0].find((modelId) => common.has(modelId));\r\n}\r\n\r\nfunction getModelAncestorChain(modelId: number, objectMap: FBXObjectMap): number[] {\r\n const chain: number[] = [];\r\n let currentId: number | undefined = modelId;\r\n\r\n while (currentId !== undefined) {\r\n const node = objectMap.objects.get(currentId);\r\n if (!node || node.name !== \"Model\") {\r\n break;\r\n }\r\n\r\n chain.push(currentId);\r\n currentId = findModelParentId(currentId, objectMap);\r\n }\r\n\r\n return chain;\r\n}\r\n\r\nfunction buildParentMap(modelIds: Set<number>, objectMap: FBXObjectMap): Map<number, number> {\r\n const parentByModelId = new Map<number, number>();\r\n\r\n for (const modelId of Array.from(modelIds)) {\r\n const parentId = findModelParentId(modelId, objectMap);\r\n if (parentId !== undefined && modelIds.has(parentId)) {\r\n parentByModelId.set(modelId, parentId);\r\n }\r\n }\r\n\r\n return parentByModelId;\r\n}\r\n\r\nfunction orderParentsBeforeChildren(modelIds: Set<number>, parentByModelId: Map<number, number>, sourceOrderByModelId: Map<number, number>): number[] {\r\n const childrenByModelId = new Map<number, number[]>();\r\n for (const modelId of Array.from(modelIds)) {\r\n const parentId = parentByModelId.get(modelId);\r\n if (parentId === undefined) {\r\n continue;\r\n }\r\n\r\n let children = childrenByModelId.get(parentId);\r\n if (!children) {\r\n children = [];\r\n childrenByModelId.set(parentId, children);\r\n }\r\n children.push(modelId);\r\n }\r\n\r\n for (const children of Array.from(childrenByModelId.values())) {\r\n children.sort((a, b) => compareSourceOrder(a, b, sourceOrderByModelId));\r\n }\r\n\r\n const roots = Array.from(modelIds)\r\n .filter((modelId) => !parentByModelId.has(modelId))\r\n .sort((a, b) => compareSourceOrder(a, b, sourceOrderByModelId));\r\n const ordered: number[] = [];\r\n const queue = [...roots];\r\n\r\n while (queue.length > 0) {\r\n const modelId = queue.shift()!;\r\n ordered.push(modelId);\r\n queue.push(...(childrenByModelId.get(modelId) ?? []));\r\n }\r\n\r\n return ordered;\r\n}\r\n\r\nfunction findModelParentId(modelId: number, objectMap: FBXObjectMap): number | undefined {\r\n const parentConnection = objectMap.connections.find((conn) => conn.type === \"OO\" && conn.childId === modelId && objectMap.objects.get(conn.parentId)?.name === \"Model\");\r\n return parentConnection?.parentId;\r\n}\r\n\r\nfunction choosePreferredBoneSource(sources: FBXBoneData[]): FBXBoneData {\r\n return (\r\n sources.find((bone) => bone.isCluster && bone.transformLinkMatrix) ??\r\n sources.find((bone) => bone.isCluster) ??\r\n sources.find((bone) => bone.modelBindPoseMatrix) ??\r\n sources[0]\r\n );\r\n}\r\n\r\nfunction collectTransformLinkWarnings(sourceBonesByModelId: Map<number, FBXBoneData[]>): string[] {\r\n const warnings: string[] = [];\r\n\r\n for (const [modelId, sources] of Array.from(sourceBonesByModelId)) {\r\n const matrices = sources.filter((bone) => bone.isCluster && bone.transformLinkMatrix).map((bone) => bone.transformLinkMatrix!);\r\n if (matrices.length < 2) {\r\n continue;\r\n }\r\n\r\n const first = matrices[0];\r\n if (matrices.some((matrix) => !areMatricesEquivalent(first, matrix, 1e-5))) {\r\n warnings.push(`Model ${modelId.toString()} has differing Cluster.TransformLink matrices across skins`);\r\n }\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\nfunction areMatricesEquivalent(a: Float64Array, b: Float64Array, epsilon: number): boolean {\r\n if (a.length !== b.length) {\r\n return false;\r\n }\r\n for (let i = 0; i < a.length; i++) {\r\n if (Math.abs(a[i] - b[i]) > epsilon) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n}\r\n\r\nfunction createFallbackBone(modelId: number, objectMap: FBXObjectMap): FBXBoneData | null {\r\n const modelNode = objectMap.objects.get(modelId);\r\n if (!modelNode || modelNode.name !== \"Model\") {\r\n return null;\r\n }\r\n\r\n const transform = extractBoneTransform(modelNode);\r\n return {\r\n modelId,\r\n name: cleanFBXName(getPropertyValue<string>(modelNode, 1) ?? `Bone${modelId.toString()}`),\r\n index: -1,\r\n parentIndex: -1,\r\n isCluster: false,\r\n translation: transform.translation,\r\n rotation: transform.rotation,\r\n preRotation: transform.preRotation,\r\n postRotation: transform.postRotation,\r\n rotationPivot: transform.rotationPivot,\r\n scalingPivot: transform.scalingPivot,\r\n rotationOffset: transform.rotationOffset,\r\n scalingOffset: transform.scalingOffset,\r\n scale: transform.scale,\r\n rotationOrder: transform.rotationOrder,\r\n inheritType: transform.inheritType,\r\n clusterMode: \"Unknown\",\r\n bindPoseMatrix: null,\r\n transformLinkMatrix: null,\r\n transformAssociateModelMatrix: null,\r\n modelBindPoseMatrix: null,\r\n diagnostics: [],\r\n };\r\n}\r\n\r\nfunction compareNumber(a: number, b: number): number {\r\n return a < b ? -1 : a > b ? 1 : 0;\r\n}\r\n\r\nfunction compareSourceOrder(a: number, b: number, sourceOrderByModelId: Map<number, number>): number {\r\n const aOrder = sourceOrderByModelId.get(a) ?? Number.MAX_SAFE_INTEGER;\r\n const bOrder = sourceOrderByModelId.get(b) ?? Number.MAX_SAFE_INTEGER;\r\n return aOrder - bOrder || compareNumber(a, b);\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"rig.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/rig.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\nimport { type FBXObjectMap } from \"./connections\";\nimport { type FBXBoneData, type FBXSkinData, extractBoneTransform, isSkeletonModel } from \"./skeleton\";\n\nimport { cleanFBXName, getPropertyValue } from \"../types/fbxTypes\";\n\nexport type FBXRigBoneData = FBXBoneData;\n\nexport interface FBXSkinBindingData {\n skinId: number;\n geometryId: number;\n rigId: string;\n skinBoneIndexToRigBoneIndex: number[];\n clusterModelIds: Set<number>;\n}\n\nexport interface FBXRigData {\n id: string;\n rootModelIds: number[];\n bones: FBXRigBoneData[];\n modelIdToBoneIndex: Map<number, number>;\n clusterModelIds: Set<number>;\n skinBindings: FBXSkinBindingData[];\n warnings: string[];\n}\n\nexport function resolveRigs(objectMap: FBXObjectMap, skins: FBXSkinData[]): FBXRigData[] {\n if (skins.length === 0) {\n return [];\n }\n\n const groupByRoot = new Map<number, FBXSkinData[]>();\n\n for (const skin of skins) {\n const clusterModelIds = skin.bones.filter((bone) => bone.isCluster).map((bone) => bone.modelId);\n if (clusterModelIds.length === 0) {\n continue;\n }\n\n const rootModelId = findRigGroupingRoot(clusterModelIds, objectMap);\n const group = groupByRoot.get(rootModelId);\n if (group) {\n group.push(skin);\n } else {\n groupByRoot.set(rootModelId, [skin]);\n }\n }\n\n return Array.from(groupByRoot.entries())\n .sort(([a], [b]) => compareNumber(a, b))\n .map(([rootModelId, groupSkins]) => buildRig(rootModelId, groupSkins, objectMap));\n}\n\nfunction buildRig(rootModelId: number, skins: FBXSkinData[], objectMap: FBXObjectMap): FBXRigData {\n const clusterModelIds = new Set<number>();\n const rigModelIds = new Set<number>();\n const sourceBonesByModelId = new Map<number, FBXBoneData[]>();\n const sourceOrderByModelId = new Map<number, number>();\n\n for (const skin of skins) {\n for (const bone of skin.bones) {\n if (!sourceOrderByModelId.has(bone.modelId)) {\n sourceOrderByModelId.set(bone.modelId, sourceOrderByModelId.size);\n }\n\n let sources = sourceBonesByModelId.get(bone.modelId);\n if (!sources) {\n sources = [];\n sourceBonesByModelId.set(bone.modelId, sources);\n }\n sources.push(bone);\n\n if (!bone.isCluster) {\n continue;\n }\n\n clusterModelIds.add(bone.modelId);\n for (const ancestorId of getModelAncestorChain(bone.modelId, objectMap)) {\n rigModelIds.add(ancestorId);\n }\n }\n }\n\n // Skeleton models below the clusters (leaf joints, \"_end\" effectors) are part of the same rig even without\n // clusters of their own; keeping them as bones lets inherit-mode handling and animation stay uniform.\n const pending = Array.from(rigModelIds);\n while (pending.length > 0) {\n const parentId = pending.pop()!;\n for (const conn of objectMap.connections) {\n if (conn.type !== \"OO\" || conn.parentId !== parentId || rigModelIds.has(conn.childId)) {\n continue;\n }\n const child = objectMap.objects.get(conn.childId);\n if (child && child.name === \"Model\" && isSkeletonModel(child)) {\n rigModelIds.add(conn.childId);\n pending.push(conn.childId);\n }\n }\n }\n\n const warnings = collectTransformLinkWarnings(sourceBonesByModelId);\n const preferredBoneByModelId = new Map<number, FBXBoneData>();\n for (const [modelId, sources] of Array.from(sourceBonesByModelId)) {\n preferredBoneByModelId.set(modelId, choosePreferredBoneSource(sources));\n }\n\n const parentByModelId = buildParentMap(rigModelIds, objectMap);\n const orderedModelIds = orderParentsBeforeChildren(rigModelIds, parentByModelId, sourceOrderByModelId);\n const bones: FBXRigBoneData[] = [];\n const modelIdToBoneIndex = new Map<number, number>();\n\n for (const modelId of orderedModelIds) {\n const sourceBone = preferredBoneByModelId.get(modelId) ?? createFallbackBone(modelId, objectMap);\n if (!sourceBone) {\n continue;\n }\n\n const parentModelId = parentByModelId.get(modelId);\n const parentIndex = parentModelId === undefined ? -1 : (modelIdToBoneIndex.get(parentModelId) ?? -1);\n const index = bones.length;\n const bone: FBXRigBoneData = {\n ...sourceBone,\n index,\n parentIndex,\n isCluster: clusterModelIds.has(modelId),\n };\n bones.push(bone);\n modelIdToBoneIndex.set(modelId, index);\n }\n\n const skinBindings = skins.map((skin) => buildSkinBinding(skin, `rig_${rootModelId.toString()}`, modelIdToBoneIndex));\n\n return {\n id: `rig_${rootModelId.toString()}`,\n rootModelIds: bones.filter((bone) => bone.parentIndex < 0).map((bone) => bone.modelId),\n bones,\n modelIdToBoneIndex,\n clusterModelIds,\n skinBindings,\n warnings,\n };\n}\n\nfunction buildSkinBinding(skin: FBXSkinData, rigId: string, modelIdToBoneIndex: Map<number, number>): FBXSkinBindingData {\n const skinBoneIndexToRigBoneIndex = skin.bones.map((bone) => {\n const rigBoneIndex = modelIdToBoneIndex.get(bone.modelId);\n if (rigBoneIndex === undefined && bone.isCluster) {\n throw new Error(`FBX rig resolver: cluster bone ${bone.name} is missing from resolved rig ${rigId}`);\n }\n return rigBoneIndex ?? -1;\n });\n\n return {\n skinId: skin.id,\n geometryId: skin.geometryId,\n rigId,\n skinBoneIndexToRigBoneIndex,\n clusterModelIds: new Set(skin.bones.filter((bone) => bone.isCluster).map((bone) => bone.modelId)),\n };\n}\n\nfunction findRigGroupingRoot(clusterModelIds: number[], objectMap: FBXObjectMap): number {\n const lca = findLowestCommonAncestor(clusterModelIds, objectMap) ?? clusterModelIds[0];\n let root = lca;\n let parentId = findModelParentId(root, objectMap);\n\n while (parentId !== undefined) {\n const parentNode = objectMap.objects.get(parentId);\n if (!parentNode || parentNode.name !== \"Model\" || !isSkeletonModel(parentNode)) {\n break;\n }\n\n root = parentId;\n parentId = findModelParentId(parentId, objectMap);\n }\n\n return root;\n}\n\nfunction findLowestCommonAncestor(modelIds: number[], objectMap: FBXObjectMap): number | undefined {\n if (modelIds.length === 0) {\n return undefined;\n }\n\n const chains = modelIds.map((modelId) => getModelAncestorChain(modelId, objectMap));\n const common = new Set(chains[0]);\n for (const chain of chains.slice(1)) {\n for (const modelId of Array.from(common)) {\n if (!chain.includes(modelId)) {\n common.delete(modelId);\n }\n }\n }\n\n return chains[0].find((modelId) => common.has(modelId));\n}\n\nfunction getModelAncestorChain(modelId: number, objectMap: FBXObjectMap): number[] {\n const chain: number[] = [];\n let currentId: number | undefined = modelId;\n\n while (currentId !== undefined) {\n const node = objectMap.objects.get(currentId);\n if (!node || node.name !== \"Model\") {\n break;\n }\n\n chain.push(currentId);\n currentId = findModelParentId(currentId, objectMap);\n }\n\n return chain;\n}\n\nfunction buildParentMap(modelIds: Set<number>, objectMap: FBXObjectMap): Map<number, number> {\n const parentByModelId = new Map<number, number>();\n\n for (const modelId of Array.from(modelIds)) {\n const parentId = findModelParentId(modelId, objectMap);\n if (parentId !== undefined && modelIds.has(parentId)) {\n parentByModelId.set(modelId, parentId);\n }\n }\n\n return parentByModelId;\n}\n\nfunction orderParentsBeforeChildren(modelIds: Set<number>, parentByModelId: Map<number, number>, sourceOrderByModelId: Map<number, number>): number[] {\n const childrenByModelId = new Map<number, number[]>();\n for (const modelId of Array.from(modelIds)) {\n const parentId = parentByModelId.get(modelId);\n if (parentId === undefined) {\n continue;\n }\n\n let children = childrenByModelId.get(parentId);\n if (!children) {\n children = [];\n childrenByModelId.set(parentId, children);\n }\n children.push(modelId);\n }\n\n for (const children of Array.from(childrenByModelId.values())) {\n children.sort((a, b) => compareSourceOrder(a, b, sourceOrderByModelId));\n }\n\n const roots = Array.from(modelIds)\n .filter((modelId) => !parentByModelId.has(modelId))\n .sort((a, b) => compareSourceOrder(a, b, sourceOrderByModelId));\n const ordered: number[] = [];\n const queue = [...roots];\n\n while (queue.length > 0) {\n const modelId = queue.shift()!;\n ordered.push(modelId);\n queue.push(...(childrenByModelId.get(modelId) ?? []));\n }\n\n return ordered;\n}\n\nfunction findModelParentId(modelId: number, objectMap: FBXObjectMap): number | undefined {\n const parentConnection = objectMap.connections.find((conn) => conn.type === \"OO\" && conn.childId === modelId && objectMap.objects.get(conn.parentId)?.name === \"Model\");\n return parentConnection?.parentId;\n}\n\nfunction choosePreferredBoneSource(sources: FBXBoneData[]): FBXBoneData {\n return (\n sources.find((bone) => bone.isCluster && bone.transformLinkMatrix) ??\n sources.find((bone) => bone.isCluster) ??\n sources.find((bone) => bone.modelBindPoseMatrix) ??\n sources[0]\n );\n}\n\nfunction collectTransformLinkWarnings(sourceBonesByModelId: Map<number, FBXBoneData[]>): string[] {\n const warnings: string[] = [];\n\n for (const [modelId, sources] of Array.from(sourceBonesByModelId)) {\n const matrices = sources.filter((bone) => bone.isCluster && bone.transformLinkMatrix).map((bone) => bone.transformLinkMatrix!);\n if (matrices.length < 2) {\n continue;\n }\n\n const first = matrices[0];\n if (matrices.some((matrix) => !areMatricesEquivalent(first, matrix, 1e-5))) {\n warnings.push(`Model ${modelId.toString()} has differing Cluster.TransformLink matrices across skins`);\n }\n }\n\n return warnings;\n}\n\nfunction areMatricesEquivalent(a: Float64Array, b: Float64Array, epsilon: number): boolean {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (Math.abs(a[i] - b[i]) > epsilon) {\n return false;\n }\n }\n return true;\n}\n\nfunction createFallbackBone(modelId: number, objectMap: FBXObjectMap): FBXBoneData | null {\n const modelNode = objectMap.objects.get(modelId);\n if (!modelNode || modelNode.name !== \"Model\") {\n return null;\n }\n\n const transform = extractBoneTransform(modelNode);\n return {\n modelId,\n name: cleanFBXName(getPropertyValue<string>(modelNode, 1) ?? `Bone${modelId.toString()}`),\n index: -1,\n parentIndex: -1,\n isCluster: false,\n translation: transform.translation,\n rotation: transform.rotation,\n preRotation: transform.preRotation,\n postRotation: transform.postRotation,\n rotationPivot: transform.rotationPivot,\n scalingPivot: transform.scalingPivot,\n rotationOffset: transform.rotationOffset,\n scalingOffset: transform.scalingOffset,\n scale: transform.scale,\n rotationOrder: transform.rotationOrder,\n inheritType: transform.inheritType,\n clusterMode: \"Unknown\",\n bindPoseMatrix: null,\n transformLinkMatrix: null,\n transformAssociateModelMatrix: null,\n modelBindPoseMatrix: null,\n diagnostics: [],\n };\n}\n\nfunction compareNumber(a: number, b: number): number {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n\nfunction compareSourceOrder(a: number, b: number, sourceOrderByModelId: Map<number, number>): number {\n const aOrder = sourceOrderByModelId.get(a) ?? Number.MAX_SAFE_INTEGER;\n const bOrder = sourceOrderByModelId.get(b) ?? Number.MAX_SAFE_INTEGER;\n return aOrder - bOrder || compareNumber(a, b);\n}\n"]}
|
|
@@ -1,6 +1,25 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */
|
|
2
2
|
import { cleanFBXName, getPropertyValue } from "../types/fbxTypes.js";
|
|
3
|
-
const HELPER_NODE_NAMES = new Set(["Character", "CharacterPose", "ControlSet", "ControlSetPlug"
|
|
3
|
+
const HELPER_NODE_NAMES = new Set(["Character", "CharacterPose", "ControlSet", "ControlSetPlug"]);
|
|
4
|
+
/** Node attribute subtypes that are converted (or intentionally represented as plain transform nodes). */
|
|
5
|
+
const HANDLED_NODE_ATTRIBUTES = new Set([
|
|
6
|
+
"Camera",
|
|
7
|
+
"Light",
|
|
8
|
+
"Null",
|
|
9
|
+
"LodGroup",
|
|
10
|
+
"LimbNode",
|
|
11
|
+
"Limb",
|
|
12
|
+
"Root",
|
|
13
|
+
"Skeleton",
|
|
14
|
+
"Marker",
|
|
15
|
+
"CameraSwitcher",
|
|
16
|
+
"Mesh",
|
|
17
|
+
"NurbsCurve",
|
|
18
|
+
"NurbsSurface",
|
|
19
|
+
"TrimNurbsSurface",
|
|
20
|
+
"Line",
|
|
21
|
+
"Boundary",
|
|
22
|
+
]);
|
|
4
23
|
export function extractSceneDiagnostics(objectMap) {
|
|
5
24
|
const diagnostics = objectMap.diagnostics.map((diagnostic) => ({
|
|
6
25
|
type: "connection-graph",
|
|
@@ -12,7 +31,13 @@ export function extractSceneDiagnostics(objectMap) {
|
|
|
12
31
|
for (const [id, node] of Array.from(objectMap.objects)) {
|
|
13
32
|
const subType = getPropertyValue(node, 2) ?? "";
|
|
14
33
|
if (node.name === "Constraint") {
|
|
15
|
-
|
|
34
|
+
// Aim, parent, position, rotation and scale constraints are evaluated at runtime; IK chains are not.
|
|
35
|
+
const typeChild = node.children.find((c) => c.name === "Type");
|
|
36
|
+
const constraintType = (typeChild ? getPropertyValue(typeChild, 0) : undefined) ?? subType;
|
|
37
|
+
const evaluated = new Set(["Aim", "Parent-Child", "Position From Positions", "Rotation From Rotations", "Scale From Scales"]);
|
|
38
|
+
if (!evaluated.has(constraintType)) {
|
|
39
|
+
diagnostics.push(createObjectDiagnostic(objectMap, id, node, "unsupported-constraint", `Constraint '${constraintType || cleanFBXName(getPropertyValue(node, 1) ?? "")}' is preserved as metadata but not evaluated at runtime.`));
|
|
40
|
+
}
|
|
16
41
|
continue;
|
|
17
42
|
}
|
|
18
43
|
if (HELPER_NODE_NAMES.has(node.name)) {
|
|
@@ -31,7 +56,7 @@ export function extractSceneDiagnostics(objectMap) {
|
|
|
31
56
|
diagnostics.push(createObjectDiagnostic(objectMap, id, node, "unsupported-deformer", `Deformer subtype '${subType}' is preserved as diagnostic data but not evaluated at runtime.`));
|
|
32
57
|
continue;
|
|
33
58
|
}
|
|
34
|
-
if (node.name === "NodeAttribute" && subType && subType
|
|
59
|
+
if (node.name === "NodeAttribute" && subType && !HANDLED_NODE_ATTRIBUTES.has(subType)) {
|
|
35
60
|
diagnostics.push(createObjectDiagnostic(objectMap, id, node, "unsupported-node-attribute", `NodeAttribute subtype '${subType}' is preserved as diagnostic data but not converted to a Babylon object.`));
|
|
36
61
|
}
|
|
37
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sceneDiagnostics.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/sceneDiagnostics.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,OAAO,EAAgB,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAyBjF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"sceneDiagnostics.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/sceneDiagnostics.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\nimport { type FBXNode, cleanFBXName, getPropertyValue } from \"../types/fbxTypes\";\n\nimport { type FBXObjectMap } from \"./connections\";\n\nexport type FBXSceneDiagnosticType =\n | \"unsupported-constraint\"\n | \"unsupported-helper\"\n | \"unsupported-deformer\"\n | \"unsupported-node-attribute\"\n | \"unsupported-pose\"\n | \"unsupported-layered-texture\"\n | \"connection-graph\";\n\nexport interface FBXSceneDiagnostic {\n type: FBXSceneDiagnosticType;\n message: string;\n objectId?: number;\n objectName?: string;\n nodeName?: string;\n subType?: string;\n /** Number of accepted parent graph edges for objectId, when objectId is known. */\n parentCount?: number;\n childCount?: number;\n}\n\nconst HELPER_NODE_NAMES = new Set([\"Character\", \"CharacterPose\", \"ControlSet\", \"ControlSetPlug\"]);\n\n/** Node attribute subtypes that are converted (or intentionally represented as plain transform nodes). */\nconst HANDLED_NODE_ATTRIBUTES = new Set([\n \"Camera\",\n \"Light\",\n \"Null\",\n \"LodGroup\",\n \"LimbNode\",\n \"Limb\",\n \"Root\",\n \"Skeleton\",\n \"Marker\",\n \"CameraSwitcher\",\n \"Mesh\",\n \"NurbsCurve\",\n \"NurbsSurface\",\n \"TrimNurbsSurface\",\n \"Line\",\n \"Boundary\",\n]);\n\nexport function extractSceneDiagnostics(objectMap: FBXObjectMap): FBXSceneDiagnostic[] {\n const diagnostics: FBXSceneDiagnostic[] = objectMap.diagnostics.map((diagnostic) => ({\n type: \"connection-graph\",\n message: diagnostic.message,\n objectId: diagnostic.childId,\n subType: diagnostic.reason,\n parentCount: diagnostic.childId === undefined ? undefined : objectMap.connections.filter((connection) => connection.childId === diagnostic.childId).length,\n }));\n\n for (const [id, node] of Array.from(objectMap.objects)) {\n const subType = getPropertyValue<string>(node, 2) ?? \"\";\n if (node.name === \"Constraint\") {\n // Aim, parent, position, rotation and scale constraints are evaluated at runtime; IK chains are not.\n const typeChild = node.children.find((c) => c.name === \"Type\");\n const constraintType = (typeChild ? getPropertyValue<string>(typeChild, 0) : undefined) ?? subType;\n const evaluated = new Set([\"Aim\", \"Parent-Child\", \"Position From Positions\", \"Rotation From Rotations\", \"Scale From Scales\"]);\n if (!evaluated.has(constraintType)) {\n diagnostics.push(\n createObjectDiagnostic(\n objectMap,\n id,\n node,\n \"unsupported-constraint\",\n `Constraint '${constraintType || cleanFBXName(getPropertyValue<string>(node, 1) ?? \"\")}' is preserved as metadata but not evaluated at runtime.`\n )\n );\n }\n continue;\n }\n\n if (HELPER_NODE_NAMES.has(node.name)) {\n diagnostics.push(\n createObjectDiagnostic(objectMap, id, node, \"unsupported-helper\", `${node.name} helper data is preserved as diagnostic data but not evaluated at runtime.`)\n );\n continue;\n }\n\n if (node.name === \"LayeredTexture\") {\n diagnostics.push(\n createObjectDiagnostic(\n objectMap,\n id,\n node,\n \"unsupported-layered-texture\",\n \"LayeredTexture is preserved as diagnostic data; runtime texture layer blending is not implemented.\"\n )\n );\n continue;\n }\n\n if (node.name === \"Pose\" && subType !== \"BindPose\") {\n diagnostics.push(\n createObjectDiagnostic(objectMap, id, node, \"unsupported-pose\", `Pose subtype '${subType}' is preserved as diagnostic data but not evaluated at runtime.`)\n );\n continue;\n }\n\n if (node.name === \"Deformer\" && !isSupportedDeformer(subType)) {\n diagnostics.push(\n createObjectDiagnostic(objectMap, id, node, \"unsupported-deformer\", `Deformer subtype '${subType}' is preserved as diagnostic data but not evaluated at runtime.`)\n );\n continue;\n }\n\n if (node.name === \"NodeAttribute\" && subType && !HANDLED_NODE_ATTRIBUTES.has(subType)) {\n diagnostics.push(\n createObjectDiagnostic(\n objectMap,\n id,\n node,\n \"unsupported-node-attribute\",\n `NodeAttribute subtype '${subType}' is preserved as diagnostic data but not converted to a Babylon object.`\n )\n );\n }\n }\n\n return diagnostics;\n}\n\nfunction isSupportedDeformer(subType: string): boolean {\n return subType === \"Skin\" || subType === \"Cluster\" || subType === \"BlendShape\" || subType === \"BlendShapeChannel\";\n}\n\nfunction createObjectDiagnostic(objectMap: FBXObjectMap, id: number, node: FBXNode, type: FBXSceneDiagnosticType, message: string): FBXSceneDiagnostic {\n return {\n type,\n message,\n objectId: id,\n objectName: cleanFBXName(getPropertyValue<string>(node, 1) ?? node.name),\n nodeName: node.name,\n subType: getPropertyValue<string>(node, 2) ?? \"\",\n parentCount: objectMap.connections.filter((connection) => connection.childId === id).length,\n childCount: objectMap.childrenOf.get(id)?.length ?? 0,\n };\n}\n"]}
|