@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":"materialModel.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/materialModel.ts"],"names":[],"mappings":"AAyKA,IAAW,IAIV;AAJD,WAAW,IAAI;IACX,yCAAa,CAAA;IACb,2CAAc,CAAA;IACd,iDAAiB,CAAA;AACrB,CAAC,EAJU,IAAI,KAAJ,IAAI,QAId;AACD,IAAW,SAIV;AAJD,WAAW,SAAS;IAChB,yCAAQ,CAAA;IACR,+CAAW,CAAA;IACX,iEAAoB,CAAA;AACxB,CAAC,EAJU,SAAS,KAAT,SAAS,QAInB;AACD,IAAW,WAKV;AALD,WAAW,WAAW;IAClB,qDAAY,CAAA;IACZ,qDAAY,CAAA;IACZ,uDAAa,CAAA;IACb,uDAAa,CAAA;AACjB,CAAC,EALU,WAAW,KAAX,WAAW,QAKrB;AAKD,MAAM,QAAQ,GAAe;IACzB,CAAC,cAAc,0BAAkB,CAAC,EAAE,SAAS,CAAC;IAC9C,CAAC,cAAc,0BAAkB,CAAC,EAAE,cAAc,CAAC;IACnD,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC;IACxC,CAAC,eAAe,0BAAkB,CAAC,EAAE,UAAU,CAAC;IAChD,CAAC,eAAe,0BAAkB,CAAC,EAAE,eAAe,CAAC;IACrD,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IAC1C,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IACvC,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC;IAC/C,CAAC,iBAAiB,0BAAkB,CAAC,EAAE,YAAY,CAAC;IACpD,CAAC,iBAAiB,0BAAkB,CAAC,EAAE,iBAAiB,CAAC;IACzD,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IAC9C,CAAC,mBAAmB,0BAAkB,CAAC,EAAE,aAAa,CAAC;IACvD,CAAC,mBAAmB,0BAAkB,CAAC,EAAE,kBAAkB,CAAC;IAC5D,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC;IACjD,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC;IAClD,CAAC,eAAe,0BAAkB,CAAC,EAAE,UAAU,CAAC;IAChD,CAAC,eAAe,0BAAkB,CAAC,EAAE,eAAe,CAAC;IACrD,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IAC1C,CAAC,cAAc,0BAAkB,CAAC,EAAE,SAAS,CAAC;IAC9C,CAAC,cAAc,0BAAkB,CAAC,EAAE,cAAc,CAAC;IACnD,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC;IACxC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAChC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;IAClC,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACtC,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC;IAClD,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC;IAClD,CAAC,0BAA0B,EAAE,CAAC,EAAE,CAAC,EAAE,0BAA0B,CAAC;CACjE,CAAC;AAEF,MAAM,WAAW,GAAe;IAC5B,CAAC,WAAW,0BAAkB,CAAC,EAAE,SAAS,CAAC;IAC3C,CAAC,WAAW,0BAAkB,CAAC,EAAE,cAAc,CAAC;IAChD,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC;IACrC,CAAC,mBAAmB,0BAAkB,CAAC,EAAE,aAAa,CAAC;IACvD,CAAC,mBAAmB,0BAAkB,CAAC,EAAE,kBAAkB,CAAC;IAC5D,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC;IACjD,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC;IAClD,CAAC,eAAe,0BAAkB,CAAC,EAAE,UAAU,CAAC;IAChD,CAAC,eAAe,0BAAkB,CAAC,EAAE,eAAe,CAAC;IACrD,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IAC1C,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;CACnC,CAAC;AAEF,MAAM,SAAS,GAAe;IAC1B,CAAC,WAAW,0BAAkB,CAAC,EAAE,SAAS,CAAC;IAC3C,CAAC,WAAW,0BAAkB,CAAC,EAAE,cAAc,CAAC;IAChD,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC;IACrC,CAAC,eAAe,0BAAkB,CAAC,EAAE,UAAU,CAAC;IAChD,CAAC,eAAe,0BAAkB,CAAC,EAAE,eAAe,CAAC;IACrD,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IAC1C,CAAC,WAAW,EAAE,CAAC,sCAA8B,WAAW,CAAC;IACzD,CAAC,WAAW,EAAE,CAAC,sCAA8B,mBAAmB,CAAC;IACjE,CAAC,mBAAmB,0BAAkB,CAAC,EAAE,aAAa,CAAC;IACvD,CAAC,mBAAmB,0BAAkB,CAAC,EAAE,kBAAkB,CAAC;IAC5D,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC;IACjD,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC;IAClD,CAAC,eAAe,0BAAkB,CAAC,EAAE,UAAU,CAAC;IAChD,CAAC,eAAe,0BAAkB,CAAC,EAAE,eAAe,CAAC;IACrD,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IAC1C,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;CACnC,CAAC;AAEF,MAAM,OAAO,GAAe;IACxB,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAC5B,CAAC,WAAW,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAC9C,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC;IACzC,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC;IAC/C,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAChC,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IACpC,CAAC,eAAe,0BAAkB,CAAC,EAAE,gBAAgB,CAAC;IACtD,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACrC,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,qBAAqB,CAAC;IACnD,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC;IAC/C,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IAC5C,CAAC,mBAAmB,0BAAkB,CAAC,EAAE,oBAAoB,CAAC;IAC9D,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC;IACjD,CAAC,qBAAqB,2BAAmB,CAAC,EAAE,sBAAsB,CAAC;IACnE,CAAC,+BAA+B,EAAE,CAAC,EAAE,CAAC,EAAE,iCAAiC,CAAC;IAC1E,CAAC,wBAAwB,EAAE,CAAC,EAAE,CAAC,EAAE,yBAAyB,CAAC;IAC3D,CAAC,4BAA4B,EAAE,CAAC,EAAE,CAAC,EAAE,8BAA8B,CAAC;IACpE,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;IACxC,CAAC,iBAAiB,0BAAkB,CAAC,EAAE,kBAAkB,CAAC;IAC1D,CAAC,kBAAkB,2BAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC7D,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IAC7C,CAAC,sBAAsB,EAAE,CAAC,EAAE,CAAC,EAAE,uBAAuB,CAAC;IACvD,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;IAC9B,CAAC,YAAY,0BAAkB,CAAC,EAAE,aAAa,CAAC;IAChD,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC;IAC3C,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAC5B,CAAC,WAAW,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAC9C,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IACzC,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IAC7B,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC;IAC3C,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC;IACvC,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC;IACnC,CAAC,qBAAqB,0BAAkB,CAAC,EAAE,mBAAmB,CAAC;IAC/D,CAAC,yBAAyB,EAAE,CAAC,EAAE,CAAC,EAAE,uBAAuB,CAAC;IAC1D,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,qBAAqB,CAAC;IAClD,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC;IACtC,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IACpC,CAAC,eAAe,0BAAkB,CAAC,EAAE,gBAAgB,CAAC;IACtD,CAAC,SAAS,2BAAmB,CAAC,EAAE,SAAS,CAAC;IAC1C,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAChC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACnC,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;CAClC,CAAC;AACF,MAAM,YAAY,GAAmB,CAAC,CAAC,YAAY,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;AAExE,MAAM,UAAU,GAAe;IAC3B,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAC5B,CAAC,WAAW,0BAAkB,CAAC,EAAE,WAAW,CAAC;IAC7C,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC;IACxC,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IAC9C,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAChC,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IACpC,CAAC,eAAe,0BAAkB,CAAC,EAAE,eAAe,CAAC;IACrD,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC;IACpC,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC;IAClD,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IAC9C,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IAC5C,CAAC,mBAAmB,0BAAkB,CAAC,EAAE,mBAAmB,CAAC;IAC7D,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC;IAChD,CAAC,qBAAqB,2BAAmB,CAAC,EAAE,qBAAqB,CAAC;IAClE,CAAC,+BAA+B,EAAE,CAAC,EAAE,CAAC,EAAE,+BAA+B,CAAC;IACxE,CAAC,wBAAwB,EAAE,CAAC,EAAE,CAAC,EAAE,wBAAwB,CAAC;IAC1D,CAAC,4BAA4B,EAAE,CAAC,EAAE,CAAC,EAAE,4BAA4B,CAAC;IAClE,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;IACxC,CAAC,iBAAiB,0BAAkB,CAAC,EAAE,iBAAiB,CAAC;IACzD,CAAC,kBAAkB,2BAAmB,CAAC,EAAE,kBAAkB,CAAC;IAC5D,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC;IAC5C,CAAC,sBAAsB,EAAE,CAAC,EAAE,CAAC,EAAE,sBAAsB,CAAC;IACtD,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;IAC9B,CAAC,YAAY,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAC/C,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IAC1C,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAC5B,CAAC,WAAW,0BAAkB,CAAC,EAAE,WAAW,CAAC;IAC7C,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC;IACxC,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;IAC5B,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IAC1C,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACtC,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;IAClC,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC;IAChD,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC;IACpC,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IACpC,CAAC,eAAe,0BAAkB,CAAC,EAAE,eAAe,CAAC;IACrD,CAAC,SAAS,2BAAmB,CAAC,EAAE,SAAS,CAAC;IAC1C,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC;IAC5C,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IAC9C,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAChC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACnC,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;IAC/B,CAAC,YAAY,0BAAkB,CAAC,EAAE,cAAc,CAAC;IACjD,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC;IACtC,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IAC1C,CAAC,sBAAsB,EAAE,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC;IACpD,CAAC,yBAAyB,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;CACpD,CAAC;AACF,MAAM,eAAe,GAAmB;IACpC,CAAC,OAAO,EAAE,CAAC,EAAE,eAAe,CAAC;IAC7B,CAAC,YAAY,EAAE,CAAC,EAAE,YAAY,CAAC;IAC/B,CAAC,UAAU,EAAE,CAAC,EAAE,UAAU,CAAC;IAC3B,CAAC,qBAAqB,EAAE,CAAC,EAAE,qBAAqB,CAAC;IACjD,CAAC,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,CAAC;CAC9C,CAAC;AAEF,MAAM,gBAAgB,GAAe;IACjC,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC;IACnC,CAAC,WAAW,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAC9C,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAChC,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;IACxC,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IAC5C,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAChC,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACxC,CAAC,eAAe,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAClD,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;IAC1C,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC;IACzC,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;IACxC,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAClC,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IAC5C,CAAC,mBAAmB,0BAAkB,CAAC,EAAE,aAAa,CAAC;IACvD,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC;IAC1C,CAAC,uBAAuB,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC;IAC9C,CAAC,uBAAuB,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC;IAClD,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;IACxC,CAAC,qBAAqB,0BAAkB,CAAC,EAAE,WAAW,CAAC;IACvD,CAAC,iBAAiB,0BAAkB,CAAC,EAAE,mBAAmB,CAAC;IAC3D,CAAC,kBAAkB,2BAAmB,CAAC,EAAE,WAAW,CAAC;IACrD,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IACtC,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAC5B,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;IAC/B,CAAC,WAAW,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAC9C,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;IACrC,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IACzC,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IAC7B,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IACjC,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,wBAAwB,CAAC;IAC9C,CAAC,qBAAqB,0BAAkB,CAAC,EAAE,mBAAmB,CAAC;IAC/D,CAAC,yBAAyB,EAAE,CAAC,EAAE,CAAC,EAAE,uBAAuB,CAAC;IAC1D,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IACpC,CAAC,eAAe,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAClD,CAAC,SAAS,2BAAmB,CAAC,EAAE,QAAQ,CAAC;IACzC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAC3B,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACnC,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACzC,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,sBAAsB,CAAC;IACjD,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;CAC7C,CAAC;AACF,MAAM,qBAAqB,GAAmB;IAC1C,CAAC,YAAY,EAAE,CAAC,EAAE,aAAa,CAAC;IAChC,CAAC,UAAU,EAAE,CAAC,EAAE,eAAe,CAAC;IAChC,CAAC,kBAAkB,EAAE,CAAC,EAAE,eAAe,CAAC;IACxC,CAAC,uBAAuB,gCAAwB,sBAAsB,CAAC;IACvE,CAAC,uBAAuB,EAAE,CAAC,EAAE,eAAe,CAAC;IAC7C,CAAC,mCAAmC,EAAE,CAAC,EAAE,qBAAqB,CAAC;IAC/D,CAAC,2BAA2B,EAAE,CAAC,EAAE,oBAAoB,CAAC;CACzD,CAAC;AAEF,MAAM,QAAQ,GAAe;IACzB,CAAC,WAAW,0BAAkB,CAAC,EAAE,gBAAgB,CAAC;IAClD,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IACrC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IACrC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC;IAClC,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,uBAAuB,CAAC;IACnD,CAAC,eAAe,0BAAkB,CAAC,EAAE,eAAe,CAAC;IACrD,CAAC,eAAe,0BAAkB,CAAC,EAAE,oBAAoB,CAAC;IAC1D,CAAC,SAAS,2BAAmB,CAAC,EAAE,YAAY,CAAC;IAC7C,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,qBAAqB,CAAC;IAC3C,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,8BAA8B,CAAC;IACvD,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,2BAA2B,CAAC;IACjD,CAAC,YAAY,0BAAkB,CAAC,EAAE,sBAAsB,CAAC;IACzD,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,0BAA0B,CAAC;IACpD,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC;IAC9C,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC;IAC9C,CAAC,eAAe,0BAAkB,CAAC,EAAE,yBAAyB,CAAC;IAC/D,CAAC,eAAe,0BAAkB,CAAC,EAAE,yBAAyB,CAAC;IAC/D,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,wBAAwB,CAAC;IACtD,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,6BAA6B,CAAC;CACvD,CAAC;AACF,MAAM,aAAa,GAAmB;IAClC,CAAC,aAAa,EAAE,CAAC,EAAE,kBAAkB,CAAC;IACtC,CAAC,OAAO,EAAE,CAAC,EAAE,uBAAuB,CAAC;IACrC,CAAC,MAAM,EAAE,CAAC,EAAE,2BAA2B,CAAC;IACxC,CAAC,cAAc,EAAE,CAAC,EAAE,8BAA8B,CAAC;IACnD,CAAC,KAAK,EAAE,CAAC,EAAE,mCAAmC,CAAC;IAC/C,CAAC,UAAU,EAAE,CAAC,EAAE,0BAA0B,CAAC;IAC3C,CAAC,OAAO,EAAE,CAAC,EAAE,iBAAiB,CAAC;CAClC,CAAC;AAEF,MAAM,WAAW,GAAe;IAC5B,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC;IACnC,CAAC,WAAW,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAC9C,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC;IACzC,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,wBAAwB,CAAC;IACpD,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IACrC,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC;IAC3C,CAAC,eAAe,0BAAkB,CAAC,EAAE,gBAAgB,CAAC;IACtD,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,+BAA+B,CAAC;IAC7D,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACrC,CAAC,oBAAoB,EAAE,CAAC,EAAE,CAAC,EAAE,qBAAqB,CAAC;IACnD,CAAC,mBAAmB,0BAAkB,CAAC,EAAE,oBAAoB,CAAC;IAC9D,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC;IACjD,CAAC,qBAAqB,2BAAmB,CAAC,EAAE,sBAAsB,CAAC;IACnE,CAAC,+BAA+B,EAAE,CAAC,EAAE,CAAC,EAAE,iCAAiC,CAAC;IAC1E,CAAC,wBAAwB,EAAE,CAAC,EAAE,CAAC,EAAE,+BAA+B,CAAC;IACjE,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC;IAC/C,CAAC,iBAAiB,0BAAkB,CAAC,EAAE,kBAAkB,CAAC;IAC1D,CAAC,kBAAkB,2BAAmB,CAAC,EAAE,yBAAyB,CAAC;IACnE,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC;IAC9C,CAAC,sBAAsB,EAAE,CAAC,EAAE,CAAC,EAAE,+BAA+B,CAAC;IAC/D,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC;IACnC,CAAC,WAAW,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAC9C,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IACzC,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,2BAA2B,CAAC;IACrD,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IAC7B,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC;IACvC,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC;IACpC,CAAC,YAAY,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAC/C,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,gBAAgB,CAAC;IAC1C,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,CAAC;IAC3C,CAAC,gBAAgB,8BAAsB,CAAC,EAAE,oBAAoB,CAAC;IAC/D,CAAC,eAAe,0BAAkB,CAAC,EAAE,gBAAgB,CAAC;IACtD,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IAC5C,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,qBAAqB,CAAC;IAClD,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC;IACtC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAC3B,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACnC,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACzC,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,sBAAsB,CAAC;IACjD,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IACjC,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,mBAAmB,CAAC;IACzC,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,sBAAsB,CAAC;IAC5C,CAAC,SAAS,2BAAmB,CAAC,EAAE,kBAAkB,CAAC;CACtD,CAAC;AACF,MAAM,gBAAgB,GAAmB,CAAC,CAAC,YAAY,EAAE,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC;AAErF,MAAM,mBAAmB,GAAe;IACpC,CAAC,WAAW,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAC9C,CAAC,WAAW,0BAAkB,CAAC,EAAE,WAAW,CAAC;IAC7C,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAChC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC;IACpC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAChC,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;IAChC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAC3B,CAAC,eAAe,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAClD,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACzC,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IAC7C,CAAC,SAAS,2BAAmB,CAAC,EAAE,SAAS,CAAC;CAC7C,CAAC;AACF,MAAM,kBAAkB,GAAe;IACnC,CAAC,WAAW,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAC9C,CAAC,WAAW,0BAAkB,CAAC,EAAE,WAAW,CAAC;IAC7C,CAAC,eAAe,0BAAkB,CAAC,EAAE,UAAU,CAAC;IAChD,CAAC,eAAe,0BAAkB,CAAC,EAAE,UAAU,CAAC;IAChD,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;IACjC,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;IAChC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAC3B,CAAC,eAAe,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAClD,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC;IACzC,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IAC7C,CAAC,SAAS,2BAAmB,CAAC,EAAE,SAAS,CAAC;CAC7C,CAAC;AACF,MAAM,gBAAgB,GAAmB,CAAC,CAAC,uBAAuB,iCAAyB,eAAe,CAAC,CAAC,CAAC;AAE7G,MAAM,YAAY,GAAe;IAC7B,CAAC,WAAW,0BAAkB,CAAC,EAAE,OAAO,CAAC;IACzC,CAAC,WAAW,0BAAkB,CAAC,EAAE,YAAY,CAAC;IAC9C,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC;IAChC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC;IAC/B,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC;IAC7B,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,oBAAoB,CAAC;IAC9C,CAAC,eAAe,0BAAkB,CAAC,EAAE,UAAU,CAAC;IAChD,CAAC,kBAAkB,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;CACnC,CAAC;AAYF,MAAM,UAAU,GAA6B,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;AAEhK,MAAM,aAAa,GAAuC;IACtD,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE;IAChH,UAAU,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE;IACzG,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE;IACjH,kBAAkB,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE;IAC1F,qBAAqB,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE;IACnG,wBAAwB,EAAE;QACtB,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,qBAAqB;QAC/B,eAAe,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,CAAC;QACnG,aAAa,EAAE,MAAM;QACrB,oBAAoB,EAAE,SAAS;KAClC;IACD,qBAAqB,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE;IACpK,oBAAoB,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE;IACjK,YAAY,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,aAAa;QACvB,eAAe,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,kBAAkB,CAAC;QAC3F,aAAa,EAAE,KAAK;KACvB;IACD,eAAe,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE;IACvJ,aAAa,EAAE;QACX,IAAI,EAAE,YAAY;QAClB,QAAQ,EAAE,EAAE;QACZ,eAAe,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,CAAC;QAChF,aAAa,EAAE,MAAM;QACrB,aAAa,EAAE,MAAM;QACrB,oBAAoB,EAAE,MAAM;QAC5B,oBAAoB,EAAE,MAAM;KAC/B;CACJ,CAAC;AAEF,8GAA8G;AAC9G,MAAM,UAAU,eAAe,CAAC,IAAmB;IAC/C,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,UAAU,CAAC;AAC9E,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB,EAAE,CAAW;IAClD,QAAQ,SAAS,EAAE,CAAC;QAChB;YACI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM;QACV;YACI,+EAA+E;YAC/E,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;gBACjC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;oBACX,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACb,CAAC;YACL,CAAC;YACD,MAAM;QACV;YACI,MAAM;IACd,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,MAA0B;IAC7C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACrB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;aAAM,IAAI,OAAO,CAAC,KAAK,SAAS,EAAE,CAAC;YAChC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACJ,MAAM;QACV,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AAED,oHAAoH;AACpH,MAAM,UAAU,gBAAgB,CAAI,MAA4B;IAC5D,IAAI,UAAU,GAAkB,SAAS,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC;IACpD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtB,UAAU,GAAG,YAAY,CAAC;IAC9B,CAAC;SAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QAC3B,UAAU,GAAG,UAAU,CAAC;IAC5B,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,QAAQ,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC9B,KAAK,kBAAkB;gBACnB,OAAO,EAAE,UAAU,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;YACzE,KAAK,KAAK;gBACN,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;YACtE,KAAK,gBAAgB;gBACjB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;YACjE;gBACI,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;QAC/D,CAAC;IACL,CAAC;IACD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3F,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3F,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YACvC,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;QAC5F,CAAC;QACD,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YACvC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;QACrF,CAAC;QACD,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,EAAE,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YACvC,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC;QACnF,CAAC;QACD,IAAI,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;YACvC,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC;QAClF,CAAC;IACL,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAI,MAA4B;;IAChE,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,KAAK,GAAwB,EAAE,UAAU,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAEpG,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QACpC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC3D,CAAC;IAED,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAY,EAAE;QACpD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACpD,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAErD,MAAM,KAAK,GAAG,CACV,OAAmB,EACnB,MAAkD,EAClD,OAAe,EACf,MAAc,EACd,SAAkB,EAClB,WAAoB,EACpB,WAAoB,EACtB,EAAE;QACA,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC;YAClD,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACrC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,MAAd,MAAM,CAAC,OAAO,IAAM,EAAE,eAAe,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,EAAC,CAAC;gBAChF,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBACnD,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACzC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAClB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wBAC3B,IAAI,KAAK,6BAAqB,EAAE,CAAC;4BAC7B,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;4BAC5B,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;wBACvD,CAAC;6BAAM,CAAC;4BACJ,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;wBAClB,CAAC;wBACD,cAAc,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;wBACrC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC5F,IAAI,KAAK,yBAAiB,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;4BAC3C,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;wBACrB,CAAC;wBACD,IAAI,KAAK,0BAAkB,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;4BAC9C,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;4BAC5B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBAChC,CAAC;wBACD,GAAG,CAAC,eAAe,GAAG,UAAU,CAAC;oBACrC,CAAC;gBACL,CAAC;gBACD,IAAI,WAAW,EAAE,CAAC;oBACd,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAChD,IAAI,OAAO,EAAE,CAAC;wBACV,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;wBACtB,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC9B,CAAC;gBACL,CAAC;gBACD,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;oBACvB,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACzC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAClB,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBACvC,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC,CAAC;IAEF,oDAAoD;IACpD,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACtD,uFAAuF;IACvF,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QAC7C,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,aAAa,IAAI,EAAE,EAAE,KAAK,CAAC,aAAa,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3G,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,oBAAoB,IAAI,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC3D,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,oBAAoB,IAAI,EAAE,EAAE,KAAK,CAAC,oBAAoB,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACzH,CAAC;IACD,kBAAkB;IAClB,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,IAAI,GAAG,OAAC,KAAK,CAAC,QAAQ,EAAC,OAAO,SAAP,OAAO,IAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAC,CAAC;YAC/E,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACzC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;oBACrB,IAAI,KAAK,gCAAwB,EAAE,CAAC;wBAChC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;oBACpD,CAAC;oBACD,IAAI,KAAK,+BAAuB,EAAE,CAAC;wBAC/B,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;oBACjC,CAAC;oBACD,IAAI,KAAK,+BAAuB,EAAE,CAAC;wBAC/B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;oBACxB,CAAC;gBACL,CAAC;YACL,CAAC;YACD,IAAI,KAAK,gCAAwB,IAAI,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACxB,CAAC;QACL,CAAC;IACL,CAAC;IAED,kFAAkF;IAClF,MAAM,YAAY,GAAG,CAAC,MAAkD,EAAE,UAAkB,EAAE,SAAiB,EAAE,EAAE;QAC/G,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,MAAjB,MAAM,CAAC,UAAU,IAAM,EAAE,eAAe,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,EAAC,CAAC;QACtF,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO;QACX,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;IACzD,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;IAC3D,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,kBAAkB,EAAE,iBAAiB,CAAC,CAAC;IAC/D,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;IACnE,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;IAC3D,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;IACzD,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IACnD,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;IAC3D,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;IAC3D,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;IACrD,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,gBAAgB,EAAE,mBAAmB,CAAC,CAAC;IAC/D,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;IAEnE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,0BAA0B,EAAE,KAAK,EAAE,CAAC;QACvH,KAAK,CAAC,GAAG,CAAC,qBAAqB,GAAG;YAC9B,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACrF,eAAe,EAAE,CAAC;YAClB,cAAc,EAAE,KAAK;SACxB,CAAC;IACN,CAAC;IAED,2BAA2B;IAC3B,MAAM,MAAM,GAA6D;QACrE,CAAC,uBAAuB,EAAE,WAAW,EAAE,YAAY,CAAC;QACpD,CAAC,2BAA2B,EAAE,eAAe,EAAE,gBAAgB,CAAC;QAChE,CAAC,mCAAmC,EAAE,uBAAuB,EAAE,wBAAwB,CAAC;KAC3F,CAAC;IACF,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,MAAM,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;YACnC,IAAI,KAAK,EAAE,CAAC;gBACR,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;gBAC7B,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;YACpK,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;YACtB,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;QACtG,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,QAAQ,CAAI,GAAkC;IAC1D,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;IACpB,IAAI,GAAG,CAAC,eAAe,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,SAAS,CAAI,GAAkC;IAC3D,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\n/**\n * Unified material model.\n *\n * FBX materials come in many vendor flavours: the classic FbxSurfaceLambert / FbxSurfacePhong, Autodesk Standard\n * Surface (OSL), Arnold aiStandardSurface, 3ds Max Physical Material, 3ds Max PBR (metal/rough and spec/gloss),\n * the 3ds Max glTF material, OpenPBR, and Maya's Stingray PBS ShaderFX graph. Each stores its parameters under\n * different property names, sometimes behind a shader binding table.\n *\n * This module resolves any of them into two parameter sets, mirroring how the FBX SDK / ufbx expose materials:\n * `fbx` (the classic Lambert/Phong parameters) and `pbr` (a physically based parameter set), plus feature flags.\n */\nimport { type FBXPropertyValue } from \"../types/fbxTypes\";\n\nexport type FBXShaderType =\n | \"unknown\"\n | \"fbxLambert\"\n | \"fbxPhong\"\n | \"oslStandardSurface\"\n | \"arnoldStandardSurface\"\n | \"3dsMaxPhysicalMaterial\"\n | \"3dsMaxPbrMetalRough\"\n | \"3dsMaxPbrSpecGloss\"\n | \"gltfMaterial\"\n | \"openPbrMaterial\"\n | \"shaderFxGraph\";\n\n/** One resolved material parameter: a constant value and/or a texture. */\nexport interface FBXMaterialMap<TTexture> {\n /** Constant value (r,g,b,a for colours, x for scalars) */\n value?: number[];\n /** Number of meaningful components in `value` (1 for scalars, 3 or 4 for colours) */\n valueComponents: number;\n /** Texture bound to the parameter */\n texture?: TTexture;\n /** Whether the texture is enabled (some vendors carry an explicit toggle) */\n textureEnabled: boolean;\n}\n\nexport type FBXFbxMapName =\n | \"diffuseFactor\"\n | \"diffuseColor\"\n | \"specularFactor\"\n | \"specularColor\"\n | \"specularExponent\"\n | \"reflectionFactor\"\n | \"reflectionColor\"\n | \"transparencyFactor\"\n | \"transparencyColor\"\n | \"emissionFactor\"\n | \"emissionColor\"\n | \"ambientFactor\"\n | \"ambientColor\"\n | \"normalMap\"\n | \"bump\"\n | \"bumpFactor\"\n | \"displacement\"\n | \"displacementFactor\"\n | \"vectorDisplacement\"\n | \"vectorDisplacementFactor\";\n\nexport type FBXPbrMapName =\n | \"baseFactor\"\n | \"baseColor\"\n | \"roughness\"\n | \"metalness\"\n | \"diffuseRoughness\"\n | \"specularFactor\"\n | \"specularColor\"\n | \"specularIor\"\n | \"specularAnisotropy\"\n | \"specularRotation\"\n | \"transmissionFactor\"\n | \"transmissionColor\"\n | \"transmissionDepth\"\n | \"transmissionScatter\"\n | \"transmissionScatterAnisotropy\"\n | \"transmissionDispersion\"\n | \"transmissionRoughness\"\n | \"transmissionExtraRoughness\"\n | \"transmissionPriority\"\n | \"transmissionEnableInAov\"\n | \"subsurfaceFactor\"\n | \"subsurfaceColor\"\n | \"subsurfaceRadius\"\n | \"subsurfaceScale\"\n | \"subsurfaceAnisotropy\"\n | \"subsurfaceTintColor\"\n | \"subsurfaceType\"\n | \"sheenFactor\"\n | \"sheenColor\"\n | \"sheenRoughness\"\n | \"coatFactor\"\n | \"coatColor\"\n | \"coatRoughness\"\n | \"coatIor\"\n | \"coatAnisotropy\"\n | \"coatRotation\"\n | \"coatNormal\"\n | \"coatAffectBaseColor\"\n | \"coatAffectBaseRoughness\"\n | \"thinFilmFactor\"\n | \"thinFilmThickness\"\n | \"thinFilmIor\"\n | \"emissionFactor\"\n | \"emissionColor\"\n | \"opacity\"\n | \"indirectDiffuse\"\n | \"indirectSpecular\"\n | \"normalMap\"\n | \"tangentMap\"\n | \"displacementMap\"\n | \"matteFactor\"\n | \"matteColor\"\n | \"ambientOcclusion\"\n | \"glossiness\"\n | \"coatGlossiness\"\n | \"transmissionGlossiness\";\n\nexport type FBXMaterialFeatureName =\n | \"pbr\"\n | \"metalness\"\n | \"diffuse\"\n | \"specular\"\n | \"emission\"\n | \"transmission\"\n | \"coat\"\n | \"sheen\"\n | \"opacity\"\n | \"ambientOcclusion\"\n | \"matte\"\n | \"unlit\"\n | \"ior\"\n | \"diffuseRoughness\"\n | \"transmissionRoughness\"\n | \"thinWalled\"\n | \"caustics\"\n | \"exitToBackground\"\n | \"internalReflections\"\n | \"doubleSided\"\n | \"roughnessAsGlossiness\"\n | \"coatRoughnessAsGlossiness\"\n | \"transmissionRoughnessAsGlossiness\";\n\nexport interface FBXMaterialModel<TTexture> {\n shaderType: FBXShaderType;\n /** Prefix material property names carry for this shader (e.g. \"3dsMax|Parameters|\") */\n shaderPropPrefix: string;\n fbx: Partial<Record<FBXFbxMapName, FBXMaterialMap<TTexture>>>;\n pbr: Partial<Record<FBXPbrMapName, FBXMaterialMap<TTexture>>>;\n features: Partial<Record<FBXMaterialFeatureName, { enabled: boolean; explicit: boolean }>>;\n}\n\n/** Inputs needed to resolve a material, independent of the parse representation. */\nexport interface FBXMaterialSource<TTexture> {\n /** \"lambert\", \"phong\", \"unknown\", ... as written in the file */\n shadingModelName: string;\n /** Property values by full property name (e.g. \"DiffuseColor\", \"Maya|baseColor\", \"3dsMax|Parameters|roughness\") */\n props: Map<string, { type: string; values: FBXPropertyValue[] }>;\n /** Textures connected to the material by property name (OP connection property) */\n texturesByProp: Map<string, TTexture>;\n /** Connected shader implementation, when any */\n shader?: {\n renderApi: string;\n /** shader semantic name -> material property names */\n bindings: Map<string, string[]>;\n };\n}\n\nconst enum Flag {\n DefaultW1 = 1,\n WidenToRgb = 2,\n MultiplyValue = 4,\n}\nconst enum Transform {\n None = 0,\n InvertX = 1,\n UnknownShininess = 2,\n}\nconst enum FeatureFlag {\n Inverted = 1,\n IfExists = 2,\n IfTexture = 4,\n IfAround1 = 8,\n}\n\ntype MapEntry = [FBXPbrMapName | FBXFbxMapName, number, number, string];\ntype FeatureEntry = [FBXMaterialFeatureName, number, string];\n\nconst BASE_FBX: MapEntry[] = [\n [\"diffuseColor\", Flag.DefaultW1, 0, \"Diffuse\"],\n [\"diffuseColor\", Flag.DefaultW1, 0, \"DiffuseColor\"],\n [\"diffuseFactor\", 0, 0, \"DiffuseFactor\"],\n [\"specularColor\", Flag.DefaultW1, 0, \"Specular\"],\n [\"specularColor\", Flag.DefaultW1, 0, \"SpecularColor\"],\n [\"specularFactor\", 0, 0, \"SpecularFactor\"],\n [\"specularExponent\", 0, 0, \"Shininess\"],\n [\"specularExponent\", 0, 0, \"ShininessExponent\"],\n [\"reflectionColor\", Flag.DefaultW1, 0, \"Reflection\"],\n [\"reflectionColor\", Flag.DefaultW1, 0, \"ReflectionColor\"],\n [\"reflectionFactor\", 0, 0, \"ReflectionFactor\"],\n [\"transparencyColor\", Flag.DefaultW1, 0, \"Transparent\"],\n [\"transparencyColor\", Flag.DefaultW1, 0, \"TransparentColor\"],\n [\"transparencyFactor\", 0, 0, \"TransparentFactor\"],\n [\"transparencyFactor\", 0, 0, \"TransparencyFactor\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"Emissive\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"EmissiveColor\"],\n [\"emissionFactor\", 0, 0, \"EmissiveFactor\"],\n [\"ambientColor\", Flag.DefaultW1, 0, \"Ambient\"],\n [\"ambientColor\", Flag.DefaultW1, 0, \"AmbientColor\"],\n [\"ambientFactor\", 0, 0, \"AmbientFactor\"],\n [\"normalMap\", 0, 0, \"NormalMap\"],\n [\"bump\", 0, 0, \"Bump\"],\n [\"bumpFactor\", 0, 0, \"BumpFactor\"],\n [\"displacement\", 0, 0, \"Displacement\"],\n [\"displacementFactor\", 0, 0, \"DisplacementFactor\"],\n [\"vectorDisplacement\", 0, 0, \"VectorDisplacement\"],\n [\"vectorDisplacementFactor\", 0, 0, \"VectorDisplacementFactor\"],\n];\n\nconst LAMBERT_PBR: MapEntry[] = [\n [\"baseColor\", Flag.DefaultW1, 0, \"Diffuse\"],\n [\"baseColor\", Flag.DefaultW1, 0, \"DiffuseColor\"],\n [\"baseFactor\", 0, 0, \"DiffuseFactor\"],\n [\"transmissionColor\", Flag.DefaultW1, 0, \"Transparent\"],\n [\"transmissionColor\", Flag.DefaultW1, 0, \"TransparentColor\"],\n [\"transmissionFactor\", 0, 0, \"TransparentFactor\"],\n [\"transmissionFactor\", 0, 0, \"TransparencyFactor\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"Emissive\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"EmissiveColor\"],\n [\"emissionFactor\", 0, 0, \"EmissiveFactor\"],\n [\"normalMap\", 0, 0, \"NormalMap\"],\n];\n\nconst PHONG_PBR: MapEntry[] = [\n [\"baseColor\", Flag.DefaultW1, 0, \"Diffuse\"],\n [\"baseColor\", Flag.DefaultW1, 0, \"DiffuseColor\"],\n [\"baseFactor\", 0, 0, \"DiffuseFactor\"],\n [\"specularColor\", Flag.DefaultW1, 0, \"Specular\"],\n [\"specularColor\", Flag.DefaultW1, 0, \"SpecularColor\"],\n [\"specularFactor\", 0, 0, \"SpecularFactor\"],\n [\"roughness\", 0, Transform.UnknownShininess, \"Shininess\"],\n [\"roughness\", 0, Transform.UnknownShininess, \"ShininessExponent\"],\n [\"transmissionColor\", Flag.DefaultW1, 0, \"Transparent\"],\n [\"transmissionColor\", Flag.DefaultW1, 0, \"TransparentColor\"],\n [\"transmissionFactor\", 0, 0, \"TransparentFactor\"],\n [\"transmissionFactor\", 0, 0, \"TransparencyFactor\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"Emissive\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"EmissiveColor\"],\n [\"emissionFactor\", 0, 0, \"EmissiveFactor\"],\n [\"normalMap\", 0, 0, \"NormalMap\"],\n];\n\nconst OSL_PBR: MapEntry[] = [\n [\"baseFactor\", 0, 0, \"base\"],\n [\"baseColor\", Flag.DefaultW1, 0, \"base_color\"],\n [\"roughness\", 0, 0, \"specular_roughness\"],\n [\"diffuseRoughness\", 0, 0, \"diffuse_roughness\"],\n [\"metalness\", 0, 0, \"metalness\"],\n [\"specularFactor\", 0, 0, \"specular\"],\n [\"specularColor\", Flag.DefaultW1, 0, \"specular_color\"],\n [\"specularIor\", 0, 0, \"specular_IOR\"],\n [\"specularAnisotropy\", 0, 0, \"specular_anisotropy\"],\n [\"specularRotation\", 0, 0, \"specular_rotation\"],\n [\"transmissionFactor\", 0, 0, \"transmission\"],\n [\"transmissionColor\", Flag.DefaultW1, 0, \"transmission_color\"],\n [\"transmissionDepth\", 0, 0, \"transmission_depth\"],\n [\"transmissionScatter\", Flag.WidenToRgb, 0, \"transmission_scatter\"],\n [\"transmissionScatterAnisotropy\", 0, 0, \"transmission_scatter_anisotropy\"],\n [\"transmissionDispersion\", 0, 0, \"transmission_dispersion\"],\n [\"transmissionExtraRoughness\", 0, 0, \"transmission_extra_roughness\"],\n [\"subsurfaceFactor\", 0, 0, \"subsurface\"],\n [\"subsurfaceColor\", Flag.DefaultW1, 0, \"subsurface_color\"],\n [\"subsurfaceRadius\", Flag.WidenToRgb, 0, \"subsurface_radius\"],\n [\"subsurfaceScale\", 0, 0, \"subsurface_scale\"],\n [\"subsurfaceAnisotropy\", 0, 0, \"subsurface_anisotropy\"],\n [\"sheenFactor\", 0, 0, \"sheen\"],\n [\"sheenColor\", Flag.DefaultW1, 0, \"sheen_color\"],\n [\"sheenRoughness\", 0, 0, \"sheen_roughness\"],\n [\"coatFactor\", 0, 0, \"coat\"],\n [\"coatColor\", Flag.DefaultW1, 0, \"coat_color\"],\n [\"coatRoughness\", 0, 0, \"coat_roughness\"],\n [\"coatIor\", 0, 0, \"coat_IOR\"],\n [\"coatAnisotropy\", 0, 0, \"coat_anisotropy\"],\n [\"coatRotation\", 0, 0, \"coat_rotation\"],\n [\"coatNormal\", 0, 0, \"coat_normal\"],\n [\"coatAffectBaseColor\", Flag.DefaultW1, 0, \"coat_affect_color\"],\n [\"coatAffectBaseRoughness\", 0, 0, \"coat_affect_roughness\"],\n [\"thinFilmThickness\", 0, 0, \"thin_film_thickness\"],\n [\"thinFilmIor\", 0, 0, \"thin_film_IOR\"],\n [\"emissionFactor\", 0, 0, \"emission\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"emission_color\"],\n [\"opacity\", Flag.WidenToRgb, 0, \"opacity\"],\n [\"normalMap\", 0, 0, \"NormalMap\"],\n [\"normalMap\", 0, 0, \"normalCamera\"],\n [\"tangentMap\", 0, 0, \"tangent\"],\n];\nconst OSL_FEATURES: FeatureEntry[] = [[\"thinWalled\", 0, \"thin_walled\"]];\n\nconst ARNOLD_PBR: MapEntry[] = [\n [\"baseFactor\", 0, 0, \"base\"],\n [\"baseColor\", Flag.DefaultW1, 0, \"baseColor\"],\n [\"roughness\", 0, 0, \"specularRoughness\"],\n [\"diffuseRoughness\", 0, 0, \"diffuseRoughness\"],\n [\"metalness\", 0, 0, \"metalness\"],\n [\"specularFactor\", 0, 0, \"specular\"],\n [\"specularColor\", Flag.DefaultW1, 0, \"specularColor\"],\n [\"specularIor\", 0, 0, \"specularIOR\"],\n [\"specularAnisotropy\", 0, 0, \"specularAnisotropy\"],\n [\"specularRotation\", 0, 0, \"specularRotation\"],\n [\"transmissionFactor\", 0, 0, \"transmission\"],\n [\"transmissionColor\", Flag.DefaultW1, 0, \"transmissionColor\"],\n [\"transmissionDepth\", 0, 0, \"transmissionDepth\"],\n [\"transmissionScatter\", Flag.WidenToRgb, 0, \"transmissionScatter\"],\n [\"transmissionScatterAnisotropy\", 0, 0, \"transmissionScatterAnisotropy\"],\n [\"transmissionDispersion\", 0, 0, \"transmissionDispersion\"],\n [\"transmissionExtraRoughness\", 0, 0, \"transmissionExtraRoughness\"],\n [\"subsurfaceFactor\", 0, 0, \"subsurface\"],\n [\"subsurfaceColor\", Flag.DefaultW1, 0, \"subsurfaceColor\"],\n [\"subsurfaceRadius\", Flag.WidenToRgb, 0, \"subsurfaceRadius\"],\n [\"subsurfaceScale\", 0, 0, \"subsurfaceScale\"],\n [\"subsurfaceAnisotropy\", 0, 0, \"subsurfaceAnisotropy\"],\n [\"sheenFactor\", 0, 0, \"sheen\"],\n [\"sheenColor\", Flag.DefaultW1, 0, \"sheenColor\"],\n [\"sheenRoughness\", 0, 0, \"sheenRoughness\"],\n [\"coatFactor\", 0, 0, \"coat\"],\n [\"coatColor\", Flag.DefaultW1, 0, \"coatColor\"],\n [\"coatRoughness\", 0, 0, \"coatRoughness\"],\n [\"coatIor\", 0, 0, \"coatIOR\"],\n [\"coatAnisotropy\", 0, 0, \"coatAnisotropy\"],\n [\"coatRotation\", 0, 0, \"coatRotation\"],\n [\"coatNormal\", 0, 0, \"coatNormal\"],\n [\"thinFilmThickness\", 0, 0, \"thinFilmThickness\"],\n [\"thinFilmIor\", 0, 0, \"thinFilmIOR\"],\n [\"emissionFactor\", 0, 0, \"emission\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"emissionColor\"],\n [\"opacity\", Flag.WidenToRgb, 0, \"opacity\"],\n [\"indirectDiffuse\", 0, 0, \"indirectDiffuse\"],\n [\"indirectSpecular\", 0, 0, \"indirectSpecular\"],\n [\"normalMap\", 0, 0, \"NormalMap\"],\n [\"normalMap\", 0, 0, \"normalCamera\"],\n [\"tangentMap\", 0, 0, \"tangent\"],\n [\"matteColor\", Flag.DefaultW1, 0, \"aiMatteColor\"],\n [\"matteFactor\", 0, 0, \"aiMatteColorA\"],\n [\"subsurfaceType\", 0, 0, \"subsurfaceType\"],\n [\"transmissionPriority\", 0, 0, \"dielectricPriority\"],\n [\"transmissionEnableInAov\", 0, 0, \"transmitAovs\"],\n];\nconst ARNOLD_FEATURES: FeatureEntry[] = [\n [\"matte\", 0, \"aiEnableMatte\"],\n [\"thinWalled\", 0, \"thinWalled\"],\n [\"caustics\", 0, \"caustics\"],\n [\"internalReflections\", 0, \"internalReflections\"],\n [\"exitToBackground\", 0, \"exitToBackground\"],\n];\n\nconst MAX_PHYSICAL_PBR: MapEntry[] = [\n [\"baseFactor\", 0, 0, \"base_weight\"],\n [\"baseColor\", Flag.DefaultW1, 0, \"base_color\"],\n [\"roughness\", 0, 0, \"roughness\"],\n [\"diffuseRoughness\", 0, 0, \"diff_rough\"],\n [\"diffuseRoughness\", 0, 0, \"diff_roughness\"],\n [\"metalness\", 0, 0, \"metalness\"],\n [\"specularFactor\", 0, 0, \"reflectivity\"],\n [\"specularColor\", Flag.DefaultW1, 0, \"refl_color\"],\n [\"specularAnisotropy\", 0, 0, \"anisotropy\"],\n [\"specularRotation\", 0, 0, \"aniso_angle\"],\n [\"specularRotation\", 0, 0, \"anisoangle\"],\n [\"specularIor\", 0, 0, \"trans_ior\"],\n [\"transmissionFactor\", 0, 0, \"transparency\"],\n [\"transmissionColor\", Flag.DefaultW1, 0, \"trans_color\"],\n [\"transmissionDepth\", 0, 0, \"trans_depth\"],\n [\"transmissionRoughness\", 0, 0, \"trans_rough\"],\n [\"transmissionRoughness\", 0, 0, \"trans_roughness\"],\n [\"subsurfaceFactor\", 0, 0, \"scattering\"],\n [\"subsurfaceTintColor\", Flag.DefaultW1, 0, \"sss_color\"],\n [\"subsurfaceColor\", Flag.DefaultW1, 0, \"sss_scatter_color\"],\n [\"subsurfaceRadius\", Flag.WidenToRgb, 0, \"sss_depth\"],\n [\"subsurfaceScale\", 0, 0, \"sss_scale\"],\n [\"coatFactor\", 0, 0, \"coat\"],\n [\"coatFactor\", 0, 0, \"coating\"],\n [\"coatColor\", Flag.DefaultW1, 0, \"coat_color\"],\n [\"coatRoughness\", 0, 0, \"coat_rough\"],\n [\"coatRoughness\", 0, 0, \"coat_roughness\"],\n [\"coatIor\", 0, 0, \"coat_ior\"],\n [\"coatNormal\", 0, 0, \"coat_bump\"],\n [\"coatNormal\", 0, 0, \"clearcoat_bump_map_amt\"],\n [\"coatAffectBaseColor\", Flag.DefaultW1, 0, \"coat_affect_color\"],\n [\"coatAffectBaseRoughness\", 0, 0, \"coat_affect_roughness\"],\n [\"emissionFactor\", 0, 0, \"emission\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"emit_color\"],\n [\"opacity\", Flag.WidenToRgb, 0, \"cutout\"],\n [\"normalMap\", 0, 0, \"bump\"],\n [\"normalMap\", 0, 0, \"bump_map_amt\"],\n [\"displacementMap\", 0, 0, \"displacement\"],\n [\"displacementMap\", 0, 0, \"displacement_map_amt\"],\n [\"subsurfaceType\", 0, 0, \"subsurfaceType\"],\n];\nconst MAX_PHYSICAL_FEATURES: FeatureEntry[] = [\n [\"thinWalled\", 0, \"thin_walled\"],\n [\"specular\", 0, \"material_mode\"],\n [\"diffuseRoughness\", 0, \"material_mode\"],\n [\"transmissionRoughness\", FeatureFlag.Inverted, \"trans_roughness_lock\"],\n [\"roughnessAsGlossiness\", 0, \"roughness_inv\"],\n [\"transmissionRoughnessAsGlossiness\", 0, \"trans_roughness_inv\"],\n [\"coatRoughnessAsGlossiness\", 0, \"coat_roughness_inv\"],\n];\n\nconst GLTF_PBR: MapEntry[] = [\n [\"baseColor\", Flag.DefaultW1, 0, \"main|baseColor\"],\n [\"roughness\", 0, 0, \"main|roughness\"],\n [\"metalness\", 0, 0, \"main|metalness\"],\n [\"normalMap\", 0, 0, \"main|normal\"],\n [\"ambientOcclusion\", 0, 0, \"main|ambientOcclusion\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"main|emission\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"main|emissionColor\"],\n [\"opacity\", Flag.WidenToRgb, 0, \"main|Alpha\"],\n [\"coatFactor\", 0, 0, \"extension|clearcoat\"],\n [\"coatRoughness\", 0, 0, \"extension|clearcoatRoughness\"],\n [\"coatNormal\", 0, 0, \"extension|clearcoatNormal\"],\n [\"sheenColor\", Flag.DefaultW1, 0, \"extension|sheenColor\"],\n [\"sheenRoughness\", 0, 0, \"extension|sheenRoughness\"],\n [\"specularFactor\", 0, 0, \"extension|specular\"],\n [\"specularFactor\", 0, 0, \"extension|Specular\"],\n [\"specularColor\", Flag.DefaultW1, 0, \"extension|specularcolor\"],\n [\"specularColor\", Flag.DefaultW1, 0, \"extension|specularColor\"],\n [\"transmissionFactor\", 0, 0, \"extension|transmission\"],\n [\"specularIor\", 0, 0, \"extension|indexOfRefraction\"],\n];\nconst GLTF_FEATURES: FeatureEntry[] = [\n [\"doubleSided\", 0, \"main|DoubleSided\"],\n [\"sheen\", 0, \"extension|enableSheen\"],\n [\"coat\", 0, \"extension|enableClearCoat\"],\n [\"transmission\", 0, \"extension|enableTransmission\"],\n [\"ior\", 0, \"extension|enableIndexOfRefraction\"],\n [\"specular\", 0, \"extension|enableSpecular\"],\n [\"unlit\", 0, \"extension|unlit\"],\n];\n\nconst OPENPBR_PBR: MapEntry[] = [\n [\"baseFactor\", 0, 0, \"base_weight\"],\n [\"baseColor\", Flag.DefaultW1, 0, \"base_color\"],\n [\"roughness\", 0, 0, \"specular_roughness\"],\n [\"diffuseRoughness\", 0, 0, \"base_diffuse_roughness\"],\n [\"metalness\", 0, 0, \"base_metalness\"],\n [\"specularFactor\", 0, 0, \"specular_weight\"],\n [\"specularColor\", Flag.DefaultW1, 0, \"specular_color\"],\n [\"specularAnisotropy\", 0, 0, \"specular_roughness_anisotropy\"],\n [\"specularIor\", 0, 0, \"specular_ior\"],\n [\"transmissionFactor\", 0, 0, \"transmission_weight\"],\n [\"transmissionColor\", Flag.DefaultW1, 0, \"transmission_color\"],\n [\"transmissionDepth\", 0, 0, \"transmission_depth\"],\n [\"transmissionScatter\", Flag.WidenToRgb, 0, \"transmission_scatter\"],\n [\"transmissionScatterAnisotropy\", 0, 0, \"transmission_scatter_anisotropy\"],\n [\"transmissionDispersion\", 0, 0, \"transmission_dispersion_scale\"],\n [\"subsurfaceFactor\", 0, 0, \"subsurface_weight\"],\n [\"subsurfaceColor\", Flag.DefaultW1, 0, \"subsurface_color\"],\n [\"subsurfaceRadius\", Flag.WidenToRgb, 0, \"subsurface_radius_scale\"],\n [\"subsurfaceScale\", 0, 0, \"subsurface_radius\"],\n [\"subsurfaceAnisotropy\", 0, 0, \"subsurface_scatter_anisotropy\"],\n [\"coatFactor\", 0, 0, \"coat_weight\"],\n [\"coatColor\", Flag.DefaultW1, 0, \"coat_color\"],\n [\"coatRoughness\", 0, 0, \"coat_roughness\"],\n [\"coatAnisotropy\", 0, 0, \"coat_roughness_anisotropy\"],\n [\"coatIor\", 0, 0, \"coat_ior\"],\n [\"coatNormal\", 0, 0, \"coat_normal_map\"],\n [\"sheenFactor\", 0, 0, \"fuzz_weight\"],\n [\"sheenColor\", Flag.DefaultW1, 0, \"fuzz_color\"],\n [\"sheenRoughness\", 0, 0, \"fuzz_roughness\"],\n [\"emissionFactor\", 0, 0, \"emission_weight\"],\n [\"emissionFactor\", Flag.MultiplyValue, 0, \"emission_luminance\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"emission_color\"],\n [\"thinFilmFactor\", 0, 0, \"thin_film_weight\"],\n [\"thinFilmThickness\", 0, 0, \"thin_film_thickness\"],\n [\"thinFilmIor\", 0, 0, \"thin_film_ior\"],\n [\"normalMap\", 0, 0, \"bump\"],\n [\"normalMap\", 0, 0, \"bump_map_amt\"],\n [\"displacementMap\", 0, 0, \"displacement\"],\n [\"displacementMap\", 0, 0, \"displacement_map_amt\"],\n [\"coatNormal\", 0, 0, \"coat_bump\"],\n [\"coatNormal\", 0, 0, \"coat_bump_map_amt\"],\n [\"tangentMap\", 0, 0, \"geometry_tangent_map\"],\n [\"opacity\", Flag.WidenToRgb, 0, \"geometry_opacity\"],\n];\nconst OPENPBR_FEATURES: FeatureEntry[] = [[\"thinWalled\", 0, \"geometry_thin_walled\"]];\n\nconst MAX_METAL_ROUGH_PBR: MapEntry[] = [\n [\"baseColor\", Flag.DefaultW1, 0, \"base_color\"],\n [\"baseColor\", Flag.DefaultW1, 0, \"baseColor\"],\n [\"roughness\", 0, 0, \"roughness\"],\n [\"roughness\", 0, 0, \"Roughness_Map\"],\n [\"metalness\", 0, 0, \"metalness\"],\n [\"ambientOcclusion\", 0, 0, \"ao\"],\n [\"normalMap\", 0, 0, \"norm\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"emit_color\"],\n [\"displacementMap\", 0, 0, \"displacement\"],\n [\"displacementMap\", 0, 0, \"displacement_amt\"],\n [\"opacity\", Flag.WidenToRgb, 0, \"opacity\"],\n];\nconst MAX_SPEC_GLOSS_PBR: MapEntry[] = [\n [\"baseColor\", Flag.DefaultW1, 0, \"base_color\"],\n [\"baseColor\", Flag.DefaultW1, 0, \"baseColor\"],\n [\"specularColor\", Flag.DefaultW1, 0, \"Specular\"],\n [\"specularColor\", Flag.DefaultW1, 0, \"specular\"],\n [\"roughness\", 0, 0, \"glossiness\"],\n [\"ambientOcclusion\", 0, 0, \"ao\"],\n [\"normalMap\", 0, 0, \"norm\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"emit_color\"],\n [\"displacementMap\", 0, 0, \"displacement\"],\n [\"displacementMap\", 0, 0, \"displacement_amt\"],\n [\"opacity\", Flag.WidenToRgb, 0, \"opacity\"],\n];\nconst MAX_PBR_FEATURES: FeatureEntry[] = [[\"roughnessAsGlossiness\", FeatureFlag.IfAround1, \"useGlossiness\"]];\n\nconst SHADERFX_PBR: MapEntry[] = [\n [\"baseColor\", Flag.DefaultW1, 0, \"color\"],\n [\"baseColor\", Flag.DefaultW1, 0, \"base_color\"],\n [\"roughness\", 0, 0, \"roughness\"],\n [\"metalness\", 0, 0, \"metallic\"],\n [\"normalMap\", 0, 0, \"normal\"],\n [\"emissionFactor\", 0, 0, \"emissive_intensity\"],\n [\"emissionColor\", Flag.DefaultW1, 0, \"emissive\"],\n [\"ambientOcclusion\", 0, 0, \"ao\"],\n];\n\ninterface ShaderTable {\n maps: MapEntry[];\n features: FeatureEntry[];\n defaultFeatures: FBXMaterialFeatureName[];\n texturePrefix?: string;\n textureSuffix?: string;\n textureEnabledPrefix?: string;\n textureEnabledSuffix?: string;\n}\n\nconst PBR_COMMON: FBXMaterialFeatureName[] = [\"pbr\", \"metalness\", \"diffuse\", \"specular\", \"coat\", \"sheen\", \"transmission\", \"opacity\", \"ior\", \"diffuseRoughness\"];\n\nconst SHADER_TABLES: Record<FBXShaderType, ShaderTable> = {\n unknown: { maps: PHONG_PBR, features: [], defaultFeatures: [\"diffuse\", \"specular\", \"emission\", \"transmission\"] },\n fbxLambert: { maps: LAMBERT_PBR, features: [], defaultFeatures: [\"diffuse\", \"emission\", \"transmission\"] },\n fbxPhong: { maps: PHONG_PBR, features: [], defaultFeatures: [\"diffuse\", \"specular\", \"emission\", \"transmission\"] },\n oslStandardSurface: { maps: OSL_PBR, features: OSL_FEATURES, defaultFeatures: PBR_COMMON },\n arnoldStandardSurface: { maps: ARNOLD_PBR, features: ARNOLD_FEATURES, defaultFeatures: PBR_COMMON },\n \"3dsMaxPhysicalMaterial\": {\n maps: MAX_PHYSICAL_PBR,\n features: MAX_PHYSICAL_FEATURES,\n defaultFeatures: [\"pbr\", \"metalness\", \"diffuse\", \"coat\", \"sheen\", \"transmission\", \"opacity\", \"ior\"],\n textureSuffix: \"_map\",\n textureEnabledSuffix: \"_map_on\",\n },\n \"3dsMaxPbrMetalRough\": { maps: MAX_METAL_ROUGH_PBR, features: MAX_PBR_FEATURES, defaultFeatures: [\"pbr\", \"metalness\", \"diffuse\", \"opacity\"], textureSuffix: \"_map\" },\n \"3dsMaxPbrSpecGloss\": { maps: MAX_SPEC_GLOSS_PBR, features: MAX_PBR_FEATURES, defaultFeatures: [\"pbr\", \"specular\", \"diffuse\", \"opacity\"], textureSuffix: \"_map\" },\n gltfMaterial: {\n maps: GLTF_PBR,\n features: GLTF_FEATURES,\n defaultFeatures: [\"pbr\", \"metalness\", \"diffuse\", \"emission\", \"opacity\", \"ambientOcclusion\"],\n textureSuffix: \"Map\",\n },\n openPbrMaterial: { maps: OPENPBR_PBR, features: OPENPBR_FEATURES, defaultFeatures: PBR_COMMON, textureSuffix: \"_map\", textureEnabledSuffix: \"_map_on\" },\n shaderFxGraph: {\n maps: SHADERFX_PBR,\n features: [],\n defaultFeatures: [\"pbr\", \"metalness\", \"diffuse\", \"emission\", \"ambientOcclusion\"],\n texturePrefix: \"TEX_\",\n textureSuffix: \"_map\",\n textureEnabledPrefix: \"use_\",\n textureEnabledSuffix: \"_map\",\n },\n};\n\n/** Shader types whose parameters are physically based; the loader emits PBR materials for them by default. */\nexport function isPbrShaderType(type: FBXShaderType): boolean {\n return type !== \"unknown\" && type !== \"fbxLambert\" && type !== \"fbxPhong\";\n}\n\nfunction applyTransform(transform: number, v: number[]): void {\n switch (transform) {\n case Transform.InvertX:\n v[0] = 1 - v[0];\n break;\n case Transform.UnknownShininess:\n // Roughness from a Phong exponent, the same heuristic the FBX SDK / ufbx uses.\n if (v[0] >= 0) {\n v[0] = 1 - Math.sqrt(v[0]) * 0.1;\n if (v[0] < 0) {\n v[0] = 0;\n }\n }\n break;\n default:\n break;\n }\n}\n\nfunction numericValues(values: FBXPropertyValue[]): number[] {\n const out: number[] = [];\n for (const v of values) {\n if (typeof v === \"number\") {\n out.push(v);\n } else if (typeof v === \"boolean\") {\n out.push(v ? 1 : 0);\n } else {\n break;\n }\n }\n return out;\n}\n\n/** Detects the shader flavour of a material from its shading model name, connected shader and 3ds Max class ids. */\nexport function detectShaderType<T>(source: FBXMaterialSource<T>): { shaderType: FBXShaderType; shaderPropPrefix: string } {\n let shaderType: FBXShaderType = \"unknown\";\n const model = source.shadingModelName.toLowerCase();\n if (model === \"lambert\") {\n shaderType = \"fbxLambert\";\n } else if (model === \"phong\") {\n shaderType = \"fbxPhong\";\n }\n if (source.shader) {\n switch (source.shader.renderApi) {\n case \"ARNOLD_SHADER_ID\":\n return { shaderType: \"arnoldStandardSurface\", shaderPropPrefix: \"\" };\n case \"OSL\":\n return { shaderType: \"oslStandardSurface\", shaderPropPrefix: \"\" };\n case \"SFX_PBS_SHADER\":\n return { shaderType: \"shaderFxGraph\", shaderPropPrefix: \"\" };\n default:\n return { shaderType: \"unknown\", shaderPropPrefix: \"\" };\n }\n }\n if (shaderType === \"unknown\") {\n const a = (numericValues(source.props.get(\"3dsMax|ClassIDa\")?.values ?? [])[0] ?? 0) >>> 0;\n const b = (numericValues(source.props.get(\"3dsMax|ClassIDb\")?.values ?? [])[0] ?? 0) >>> 0;\n if (a === 0x3d6b1cec && b === 0xdeadc001) {\n return { shaderType: \"3dsMaxPhysicalMaterial\", shaderPropPrefix: \"3dsMax|Parameters|\" };\n }\n if (a === 0xf1551e33 && b === 0x37fb1337) {\n return { shaderType: \"openPbrMaterial\", shaderPropPrefix: \"3dsMax|Parameters|\" };\n }\n if (a === 0x38420192 && b === 0x45fe4e1b) {\n return { shaderType: \"gltfMaterial\", shaderPropPrefix: \"3dsMax|\" };\n }\n if (a === 0xd00f1e00 && b === 0xbe77e500) {\n return { shaderType: \"3dsMaxPbrMetalRough\", shaderPropPrefix: \"3dsMax|main|\" };\n }\n if (a === 0xd00f1e00 && b === 0x01dbad33) {\n return { shaderType: \"3dsMaxPbrSpecGloss\", shaderPropPrefix: \"3dsMax|main|\" };\n }\n }\n return { shaderType, shaderPropPrefix: \"\" };\n}\n\n/**\n * Resolves the unified material model from raw material data.\n */\nexport function resolveMaterialModel<T>(source: FBXMaterialSource<T>): FBXMaterialModel<T> {\n const { shaderType, shaderPropPrefix } = detectShaderType(source);\n const table = SHADER_TABLES[shaderType];\n const model: FBXMaterialModel<T> = { shaderType, shaderPropPrefix, fbx: {}, pbr: {}, features: {} };\n\n for (const f of table.defaultFeatures) {\n model.features[f] = { enabled: true, explicit: false };\n }\n\n const materialPropsFor = (semantic: string): string[] => {\n const bound = source.shader?.bindings.get(semantic);\n return bound && bound.length > 0 ? bound : [semantic];\n };\n const prefix = source.shader ? \"\" : shaderPropPrefix;\n\n const fetch = (\n entries: MapEntry[],\n target: Partial<Record<string, FBXMaterialMap<T>>>,\n prefix2: string,\n suffix: string,\n wantValue: boolean,\n wantTexture: boolean,\n wantEnabled: boolean\n ) => {\n for (const [mapName, flags, transform, prop] of entries) {\n const semantic = prefix + prefix2 + prop + suffix;\n for (const name of materialPropsFor(semantic)) {\n const entry = source.props.get(name);\n const map = (target[mapName] ??= { valueComponents: 0, textureEnabled: false });\n if (wantValue && entry && entry.type !== \"Reference\") {\n const nums = numericValues(entry.values);\n if (nums.length > 0) {\n const v = nums.slice(0, 4);\n if (flags & Flag.MultiplyValue) {\n v[0] *= map.value?.[0] ?? 1;\n map.value = [v[0], ...(map.value?.slice(1) ?? [])];\n } else {\n map.value = v;\n }\n applyTransform(transform, map.value);\n const components = nums.length >= 4 ? 4 : nums.length === 3 ? 3 : nums.length === 2 ? 2 : 1;\n if (flags & Flag.DefaultW1 && components < 4) {\n map.value[3] = 1;\n }\n if (flags & Flag.WidenToRgb && components === 1) {\n map.value[1] = map.value[0];\n map.value[2] = map.value[0];\n }\n map.valueComponents = components;\n }\n }\n if (wantTexture) {\n const texture = source.texturesByProp.get(name);\n if (texture) {\n map.texture = texture;\n map.textureEnabled = true;\n }\n }\n if (wantEnabled && entry) {\n const nums = numericValues(entry.values);\n if (nums.length > 0) {\n map.textureEnabled = nums[0] !== 0;\n }\n }\n }\n }\n };\n\n // Classic Lambert/Phong parameters are always read.\n fetch(BASE_FBX, model.fbx, \"\", \"\", true, true, false);\n // Shader specific parameters, textures with vendor prefix/suffix, and texture toggles.\n if (table.texturePrefix || table.textureSuffix) {\n fetch(table.maps, model.pbr, table.texturePrefix ?? \"\", table.textureSuffix ?? \"\", false, true, false);\n }\n fetch(table.maps, model.pbr, \"\", \"\", true, true, false);\n if (table.textureEnabledPrefix || table.textureEnabledSuffix) {\n fetch(table.maps, model.pbr, table.textureEnabledPrefix ?? \"\", table.textureEnabledSuffix ?? \"\", false, false, true);\n }\n // Feature toggles\n for (const [feature, flags, prop] of table.features) {\n const semantic = prefix + prop;\n for (const name of materialPropsFor(semantic)) {\n const entry = source.props.get(name);\n const info = (model.features[feature] ??= { enabled: false, explicit: false });\n if (entry && entry.type !== \"Reference\") {\n const nums = numericValues(entry.values);\n if (nums.length > 0) {\n info.enabled = nums[0] !== 0;\n info.explicit = true;\n if (flags & FeatureFlag.IfAround1) {\n info.enabled = nums[0] >= 0.5 && nums[0] <= 1.5;\n }\n if (flags & FeatureFlag.Inverted) {\n info.enabled = !info.enabled;\n }\n if (flags & FeatureFlag.IfExists) {\n info.enabled = true;\n }\n }\n }\n if (flags & FeatureFlag.IfTexture && source.texturesByProp.has(name)) {\n info.enabled = true;\n }\n }\n }\n\n // Factors default to 1 when the matching colour is set and non-zero, 0 otherwise.\n const updateFactor = (target: Partial<Record<string, FBXMaterialMap<T>>>, factorName: string, colorName: string) => {\n const factor = (target[factorName] ??= { valueComponents: 0, textureEnabled: false });\n if (factor.value) {\n return;\n }\n const color = target[colorName];\n const nonZero = color?.value && color.value.some((c) => c !== 0);\n factor.value = [nonZero ? 1 : 0];\n factor.valueComponents = 1;\n };\n updateFactor(model.fbx, \"diffuseFactor\", \"diffuseColor\");\n updateFactor(model.fbx, \"specularFactor\", \"specularColor\");\n updateFactor(model.fbx, \"reflectionFactor\", \"reflectionColor\");\n updateFactor(model.fbx, \"transparencyFactor\", \"transparencyColor\");\n updateFactor(model.fbx, \"emissionFactor\", \"emissionColor\");\n updateFactor(model.fbx, \"ambientFactor\", \"ambientColor\");\n updateFactor(model.pbr, \"baseFactor\", \"baseColor\");\n updateFactor(model.pbr, \"specularFactor\", \"specularColor\");\n updateFactor(model.pbr, \"emissionFactor\", \"emissionColor\");\n updateFactor(model.pbr, \"sheenFactor\", \"sheenColor\");\n updateFactor(model.pbr, \"thinFilmFactor\", \"thinFilmThickness\");\n updateFactor(model.pbr, \"transmissionFactor\", \"transmissionColor\");\n\n if (!model.pbr.transmissionRoughness?.value && model.pbr.roughness?.value && model.pbr.transmissionExtraRoughness?.value) {\n model.pbr.transmissionRoughness = {\n value: [model.pbr.roughness.value[0] + model.pbr.transmissionExtraRoughness.value[0]],\n valueComponents: 1,\n textureEnabled: false,\n };\n }\n\n // Roughness <-> glossiness\n const remaps: [FBXMaterialFeatureName, FBXPbrMapName, FBXPbrMapName][] = [\n [\"roughnessAsGlossiness\", \"roughness\", \"glossiness\"],\n [\"coatRoughnessAsGlossiness\", \"coatRoughness\", \"coatGlossiness\"],\n [\"transmissionRoughnessAsGlossiness\", \"transmissionRoughness\", \"transmissionGlossiness\"],\n ];\n for (const [feature, roughName, glossName] of remaps) {\n const rough = model.pbr[roughName];\n if (model.features[feature]?.enabled) {\n if (rough) {\n model.pbr[glossName] = rough;\n model.pbr[roughName] = rough.value ? { value: [1 - rough.value[0]], valueComponents: 1, textureEnabled: false } : { valueComponents: 0, textureEnabled: false };\n }\n } else if (rough?.value) {\n model.pbr[glossName] = { value: [1 - rough.value[0]], valueComponents: 1, textureEnabled: false };\n }\n }\n\n return model;\n}\n\n/** Colour (first three components) of a map, or undefined. */\nexport function mapColor<T>(map: FBXMaterialMap<T> | undefined): [number, number, number] | undefined {\n if (!map?.value) {\n return undefined;\n }\n const v = map.value;\n if (map.valueComponents === 1) {\n return [v[0], v[0], v[0]];\n }\n return [v[0], v[1] ?? v[0], v[2] ?? v[0]];\n}\n\n/** Scalar (first component) of a map, or undefined. */\nexport function mapScalar<T>(map: FBXMaterialMap<T> | undefined): number | undefined {\n return map?.value ? map.value[0] : undefined;\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type FBXNode } from "../types/fbxTypes.js";
|
|
2
2
|
import { type FBXObjectMap } from "./connections.js";
|
|
3
|
-
import { type FBXPropertyTemplateMap } from "./propertyTemplates.js";
|
|
3
|
+
import { type FBXPropertyTemplate, type FBXPropertyTemplateMap, type FBXUserPropertyValue } from "./propertyTemplates.js";
|
|
4
|
+
import { type FBXMaterialModel } from "./materialModel.js";
|
|
4
5
|
/** Parsed material data */
|
|
5
6
|
export interface FBXMaterialData {
|
|
6
7
|
id: number;
|
|
@@ -8,6 +9,10 @@ export interface FBXMaterialData {
|
|
|
8
9
|
type: "Lambert" | "Phong";
|
|
9
10
|
properties: FBXMaterialProperties;
|
|
10
11
|
textures: FBXTextureRef[];
|
|
12
|
+
/** Unified classic + PBR parameter model resolved from whichever shader flavour the file uses */
|
|
13
|
+
model: FBXMaterialModel<FBXTextureRef>;
|
|
14
|
+
/** User-defined properties */
|
|
15
|
+
userProperties?: Record<string, FBXUserPropertyValue>;
|
|
11
16
|
}
|
|
12
17
|
export interface FBXMaterialProperties {
|
|
13
18
|
diffuseColor?: [number, number, number];
|
|
@@ -43,8 +48,15 @@ export interface FBXTextureRef {
|
|
|
43
48
|
uvSetIndex?: number;
|
|
44
49
|
/** Which named UV set this texture uses */
|
|
45
50
|
uvSetName?: string;
|
|
51
|
+
/** WrapModeU: 0 = repeat, 1 = clamp */
|
|
52
|
+
wrapU?: number;
|
|
53
|
+
/** WrapModeV: 0 = repeat, 1 = clamp */
|
|
54
|
+
wrapV?: number;
|
|
55
|
+
/** Set when the texture came from a LayeredTexture (only the first layer is used) */
|
|
56
|
+
layeredTextureId?: number;
|
|
46
57
|
}
|
|
47
58
|
/**
|
|
48
59
|
* Extract material data from an FBX Material node.
|
|
49
60
|
*/
|
|
50
61
|
export declare function extractMaterial(materialNode: FBXNode, materialId: number, objectMap: FBXObjectMap, templates?: FBXPropertyTemplateMap): FBXMaterialData;
|
|
62
|
+
export declare function extractTextureRef(id: number, node: FBXNode, propertyName: string | undefined, objectMap: FBXObjectMap, template?: FBXPropertyTemplate): FBXTextureRef;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */
|
|
2
2
|
import { findChildByName, getPropertyValue, cleanFBXName } from "../types/fbxTypes.js";
|
|
3
3
|
import { getChildren } from "./connections.js";
|
|
4
|
-
import { getPropertyTemplate, resolvePropertyValue, resolvePropertyValues } from "./propertyTemplates.js";
|
|
4
|
+
import { extractUserProperties, getPropertyEntries, getPropertyTemplate, resolvePropertyValue, resolvePropertyValues, } from "./propertyTemplates.js";
|
|
5
|
+
import { resolveMaterialModel } from "./materialModel.js";
|
|
5
6
|
/**
|
|
6
7
|
* Extract material data from an FBX Material node.
|
|
7
8
|
*/
|
|
@@ -19,7 +20,69 @@ export function extractMaterial(materialNode, materialId, objectMap, templates)
|
|
|
19
20
|
// Find connected textures
|
|
20
21
|
const textureTemplate = templates ? (getPropertyTemplate(templates, "Texture", "FbxFileTexture") ?? getPropertyTemplate(templates, "Texture")) : undefined;
|
|
21
22
|
const textures = extractTextures(materialId, objectMap, textureTemplate);
|
|
22
|
-
|
|
23
|
+
// Resolve the unified material model (classic + PBR parameters) from all properties, textures and shader bindings.
|
|
24
|
+
const props = new Map();
|
|
25
|
+
for (const tp of template?.properties.values() ?? []) {
|
|
26
|
+
props.set(tp.name, { type: tp.propertyType, values: tp.values });
|
|
27
|
+
}
|
|
28
|
+
for (const entry of getPropertyEntries(materialNode)) {
|
|
29
|
+
props.set(entry.name, { type: entry.type, values: entry.values });
|
|
30
|
+
}
|
|
31
|
+
const texturesByProp = new Map();
|
|
32
|
+
for (const tex of textures) {
|
|
33
|
+
if (!texturesByProp.has(tex.propertyName)) {
|
|
34
|
+
texturesByProp.set(tex.propertyName, tex);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const source = { shadingModelName: shadingType, props, texturesByProp, shader: extractShaderInfo(materialId, objectMap) };
|
|
38
|
+
const model = resolveMaterialModel(source);
|
|
39
|
+
return { id: materialId, name, type, properties, textures, model, userProperties: extractUserProperties(materialNode) };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Shader implementation connected to a material (Arnold, OSL / Standard Surface, Stingray PBS): the RenderAPI names
|
|
43
|
+
* the flavour and the binding table maps shader semantics to material property names.
|
|
44
|
+
*/
|
|
45
|
+
function extractShaderInfo(materialId, objectMap) {
|
|
46
|
+
// The material is connected as a child of its Implementation (Material -> Implementation), so look at parents.
|
|
47
|
+
const implementations = objectMap.connections
|
|
48
|
+
.filter((conn) => conn.type === "OO" && conn.childId === materialId && objectMap.objects.get(conn.parentId)?.name === "Implementation")
|
|
49
|
+
.map((conn) => ({ id: conn.parentId, node: objectMap.objects.get(conn.parentId) }));
|
|
50
|
+
if (implementations.length === 0) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const impl = implementations[0];
|
|
54
|
+
const renderApi = getPropertyEntries(impl.node).find((e) => e.name === "RenderAPI")?.values[0];
|
|
55
|
+
const bindings = new Map();
|
|
56
|
+
const add = (shaderProp, materialProp) => {
|
|
57
|
+
const list = bindings.get(shaderProp);
|
|
58
|
+
if (list) {
|
|
59
|
+
list.push(materialProp);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
bindings.set(shaderProp, [materialProp]);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
for (const table of getChildren(objectMap, impl.id, "BindingTable")) {
|
|
66
|
+
for (const entry of table.node.children) {
|
|
67
|
+
if (entry.name !== "Entry") {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
const src = getPropertyValue(entry, 0);
|
|
71
|
+
const srcType = getPropertyValue(entry, 1);
|
|
72
|
+
const dst = getPropertyValue(entry, 2);
|
|
73
|
+
const dstType = getPropertyValue(entry, 3);
|
|
74
|
+
if (typeof src !== "string" || typeof dst !== "string") {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
if (srcType === "FbxPropertyEntry" && dstType === "FbxSemanticEntry") {
|
|
78
|
+
add(dst, src);
|
|
79
|
+
}
|
|
80
|
+
else if (srcType === "FbxSemanticEntry" && dstType === "FbxPropertyEntry") {
|
|
81
|
+
add(src, dst);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return { renderApi: typeof renderApi === "string" ? renderApi : "", bindings };
|
|
23
86
|
}
|
|
24
87
|
function extractMaterialProperties(materialNode, template) {
|
|
25
88
|
const props = {};
|
|
@@ -40,6 +103,23 @@ function extractTextures(materialId, objectMap, template) {
|
|
|
40
103
|
const textures = [];
|
|
41
104
|
const textureChildren = getChildren(objectMap, materialId, "Texture");
|
|
42
105
|
for (const { id, node, propertyName } of textureChildren) {
|
|
106
|
+
textures.push(extractTextureRef(id, node, propertyName, objectMap, template));
|
|
107
|
+
}
|
|
108
|
+
// LayeredTexture: several textures blended into one slot. Babylon has no layer blending, so the first layer
|
|
109
|
+
// stands in for the stack; the layer count is recorded on the ref for diagnostics.
|
|
110
|
+
for (const { id: layeredId, propertyName } of getChildren(objectMap, materialId, "LayeredTexture")) {
|
|
111
|
+
const layers = getChildren(objectMap, layeredId, "Texture");
|
|
112
|
+
if (layers.length === 0) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
const ref = extractTextureRef(layers[0].id, layers[0].node, propertyName, objectMap, template);
|
|
116
|
+
ref.layeredTextureId = layeredId;
|
|
117
|
+
textures.push(ref);
|
|
118
|
+
}
|
|
119
|
+
return textures;
|
|
120
|
+
}
|
|
121
|
+
export function extractTextureRef(id, node, propertyName, objectMap, template) {
|
|
122
|
+
{
|
|
43
123
|
const fileNameNode = findChildByName(node, "FileName");
|
|
44
124
|
const relFileNameNode = findChildByName(node, "RelativeFilename");
|
|
45
125
|
const fileName = fileNameNode ? (getPropertyValue(fileNameNode, 0) ?? "") : "";
|
|
@@ -57,6 +137,8 @@ function extractTextures(materialId, objectMap, template) {
|
|
|
57
137
|
}
|
|
58
138
|
uvTranslation ?? (uvTranslation = getNumberPairChild(node, "ModelUVTranslation"));
|
|
59
139
|
uvScaling ?? (uvScaling = getNumberPairChild(node, "ModelUVScaling"));
|
|
140
|
+
const wrapU = getNumberProperty(node, template, "WrapModeU");
|
|
141
|
+
const wrapV = getNumberProperty(node, template, "WrapModeV");
|
|
60
142
|
// Check for embedded texture data in connected Video node
|
|
61
143
|
let embeddedData = null;
|
|
62
144
|
const videoChildren = getChildren(objectMap, id, "Video");
|
|
@@ -72,7 +154,7 @@ function extractTextures(materialId, objectMap, template) {
|
|
|
72
154
|
}
|
|
73
155
|
}
|
|
74
156
|
}
|
|
75
|
-
|
|
157
|
+
return {
|
|
76
158
|
propertyName: propertyName ?? "DiffuseColor",
|
|
77
159
|
fileName,
|
|
78
160
|
relativeFileName,
|
|
@@ -82,9 +164,10 @@ function extractTextures(materialId, objectMap, template) {
|
|
|
82
164
|
uvScaling,
|
|
83
165
|
uvRotation,
|
|
84
166
|
uvSetName,
|
|
85
|
-
|
|
167
|
+
wrapU,
|
|
168
|
+
wrapV,
|
|
169
|
+
};
|
|
86
170
|
}
|
|
87
|
-
return textures;
|
|
88
171
|
}
|
|
89
172
|
// ── Helpers ────────────────────────────────────────────────────────────────────
|
|
90
173
|
function getMaterialTemplate(materialNode, templates) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"materials.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/materials.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\r\nimport { type FBXNode, findChildByName, getPropertyValue, cleanFBXName } from \"../types/fbxTypes\";\r\n\r\nimport { type FBXObjectMap, getChildren } from \"./connections\";\r\n\r\nimport { getPropertyTemplate, resolvePropertyValue, resolvePropertyValues, type FBXPropertyTemplate, type FBXPropertyTemplateMap } from \"./propertyTemplates\";\r\n\r\n/** Parsed material data */\r\nexport interface FBXMaterialData {\r\n id: number;\r\n name: string;\r\n type: \"Lambert\" | \"Phong\";\r\n properties: FBXMaterialProperties;\r\n textures: FBXTextureRef[];\r\n}\r\n\r\nexport interface FBXMaterialProperties {\r\n diffuseColor?: [number, number, number];\r\n diffuseFactor?: number;\r\n ambientColor?: [number, number, number];\r\n ambientFactor?: number;\r\n specularColor?: [number, number, number];\r\n specularFactor?: number;\r\n shininess?: number;\r\n emissiveColor?: [number, number, number];\r\n emissiveFactor?: number;\r\n opacity?: number;\r\n transparencyFactor?: number;\r\n}\r\n\r\nexport interface FBXTextureRef {\r\n /** Which material property this texture is connected to */\r\n propertyName: string;\r\n /** Absolute file path from the FBX */\r\n fileName: string;\r\n /** Relative file path from the FBX */\r\n relativeFileName: string;\r\n /** Texture node ID */\r\n id: number;\r\n /** Embedded texture data (from Video node Content), if available */\r\n embeddedData: Uint8Array | null;\r\n /** UV translation [u, v] */\r\n uvTranslation?: [number, number];\r\n /** UV scaling [u, v] */\r\n uvScaling?: [number, number];\r\n /** UV rotation in degrees */\r\n uvRotation?: number;\r\n /** Which UV set index this texture uses */\r\n uvSetIndex?: number;\r\n /** Which named UV set this texture uses */\r\n uvSetName?: string;\r\n}\r\n\r\n/**\r\n * Extract material data from an FBX Material node.\r\n */\r\nexport function extractMaterial(materialNode: FBXNode, materialId: number, objectMap: FBXObjectMap, templates?: FBXPropertyTemplateMap): FBXMaterialData {\r\n const name = cleanFBXName(getPropertyValue<string>(materialNode, 1) ?? \"Material\");\r\n const template = getMaterialTemplate(materialNode, templates);\r\n\r\n // Determine Lambert vs Phong from ShadingModel property\r\n const shadingModel = findChildByName(materialNode, \"ShadingModel\");\r\n const shadingType = shadingModel\r\n ? (getPropertyValue<string>(shadingModel, 0) ?? \"Lambert\")\r\n : (resolvePropertyValue<string>(materialNode, template, \"ShadingModel\") ?? \"Lambert\");\r\n const type: \"Lambert\" | \"Phong\" = shadingType.toLowerCase() === \"phong\" ? \"Phong\" : \"Lambert\";\r\n\r\n // Extract properties from Properties70\r\n const properties = extractMaterialProperties(materialNode, template);\r\n\r\n // Find connected textures\r\n const textureTemplate = templates ? (getPropertyTemplate(templates, \"Texture\", \"FbxFileTexture\") ?? getPropertyTemplate(templates, \"Texture\")) : undefined;\r\n const textures = extractTextures(materialId, objectMap, textureTemplate);\r\n\r\n return { id: materialId, name, type, properties, textures };\r\n}\r\n\r\nfunction extractMaterialProperties(materialNode: FBXNode, template?: FBXPropertyTemplate): FBXMaterialProperties {\r\n const props: FBXMaterialProperties = {};\r\n props.diffuseColor = getColorProperty(materialNode, template, \"DiffuseColor\") ?? getColorProperty(materialNode, template, \"Diffuse\");\r\n props.diffuseFactor = getNumberProperty(materialNode, template, \"DiffuseFactor\");\r\n props.ambientColor = getColorProperty(materialNode, template, \"AmbientColor\") ?? getColorProperty(materialNode, template, \"Ambient\");\r\n props.ambientFactor = getNumberProperty(materialNode, template, \"AmbientFactor\");\r\n props.specularColor = getColorProperty(materialNode, template, \"SpecularColor\") ?? getColorProperty(materialNode, template, \"Specular\");\r\n props.specularFactor = getNumberProperty(materialNode, template, \"SpecularFactor\");\r\n props.shininess = getNumberProperty(materialNode, template, \"Shininess\") ?? getNumberProperty(materialNode, template, \"ShininessExponent\");\r\n props.emissiveColor = getColorProperty(materialNode, template, \"EmissiveColor\") ?? getColorProperty(materialNode, template, \"Emissive\");\r\n props.emissiveFactor = getNumberProperty(materialNode, template, \"EmissiveFactor\");\r\n props.opacity = getNumberProperty(materialNode, template, \"Opacity\");\r\n props.transparencyFactor = getNumberProperty(materialNode, template, \"TransparencyFactor\");\r\n\r\n return props;\r\n}\r\n\r\nfunction extractTextures(materialId: number, objectMap: FBXObjectMap, template?: FBXPropertyTemplate): FBXTextureRef[] {\r\n const textures: FBXTextureRef[] = [];\r\n const textureChildren = getChildren(objectMap, materialId, \"Texture\");\r\n\r\n for (const { id, node, propertyName } of textureChildren) {\r\n const fileNameNode = findChildByName(node, \"FileName\");\r\n const relFileNameNode = findChildByName(node, \"RelativeFilename\");\r\n\r\n const fileName = fileNameNode ? (getPropertyValue<string>(fileNameNode, 0) ?? \"\") : \"\";\r\n const relativeFileName = relFileNameNode ? (getPropertyValue<string>(relFileNameNode, 0) ?? \"\") : \"\";\r\n\r\n // Extract UV transform properties\r\n let uvTranslation: [number, number] | undefined;\r\n let uvScaling: [number, number] | undefined;\r\n const uvRotation = getNumberProperty(node, template, \"UVRotation\") ?? getNumberProperty(node, template, \"Rotation\");\r\n let uvSetName: string | undefined;\r\n uvTranslation = getTextureVector2(node, template, \"UVTranslation\") ?? getTextureVector2(node, template, \"Translation\");\r\n uvScaling = getTextureVector2(node, template, \"UVScaling\") ?? getTextureVector2(node, template, \"Scaling\");\r\n const uvSet = resolvePropertyValue<string>(node, template, \"UVSet\");\r\n if (uvSet && uvSet.length > 0) {\r\n uvSetName = uvSet;\r\n }\r\n uvTranslation ??= getNumberPairChild(node, \"ModelUVTranslation\");\r\n uvScaling ??= getNumberPairChild(node, \"ModelUVScaling\");\r\n\r\n // Check for embedded texture data in connected Video node\r\n let embeddedData: Uint8Array | null = null;\r\n const videoChildren = getChildren(objectMap, id, \"Video\");\r\n for (const { node: videoNode } of videoChildren) {\r\n const contentNode = findChildByName(videoNode, \"Content\");\r\n if (contentNode && contentNode.properties.length > 0) {\r\n const content = contentNode.properties[0].value;\r\n if (content instanceof Uint8Array && content.length > 0) {\r\n embeddedData = content;\r\n } else if (content instanceof ArrayBuffer && (content as ArrayBuffer).byteLength > 0) {\r\n embeddedData = new Uint8Array(content as ArrayBuffer);\r\n }\r\n }\r\n }\r\n\r\n textures.push({\r\n propertyName: propertyName ?? \"DiffuseColor\",\r\n fileName,\r\n relativeFileName,\r\n id,\r\n embeddedData,\r\n uvTranslation,\r\n uvScaling,\r\n uvRotation,\r\n uvSetName,\r\n });\r\n }\r\n\r\n return textures;\r\n}\r\n\r\n// ── Helpers ────────────────────────────────────────────────────────────────────\r\n\r\nfunction getMaterialTemplate(materialNode: FBXNode, templates: FBXPropertyTemplateMap | undefined): FBXPropertyTemplate | undefined {\r\n if (!templates) {\r\n return undefined;\r\n }\r\n\r\n const shadingModel = findChildByName(materialNode, \"ShadingModel\");\r\n const shadingType = shadingModel ? getPropertyValue<string>(shadingModel, 0) : undefined;\r\n if (shadingType?.toLowerCase() === \"phong\") {\r\n return getPropertyTemplate(templates, \"Material\", \"FbxSurfacePhong\") ?? getPropertyTemplate(templates, \"Material\");\r\n }\r\n if (shadingType?.toLowerCase() === \"lambert\") {\r\n return getPropertyTemplate(templates, \"Material\", \"FbxSurfaceLambert\") ?? getPropertyTemplate(templates, \"Material\");\r\n }\r\n\r\n return getPropertyTemplate(templates, \"Material\");\r\n}\r\n\r\nfunction getColorProperty(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string): [number, number, number] | undefined {\r\n const values = resolvePropertyValues(node, template, propertyName);\r\n if (!values || values.length < 3) {\r\n return undefined;\r\n }\r\n const r = toNumber(values[0]);\r\n const g = toNumber(values[1]);\r\n const b = toNumber(values[2]);\r\n if (r === undefined || g === undefined || b === undefined) {\r\n return undefined;\r\n }\r\n return [r, g, b];\r\n}\r\n\r\nfunction getNumberProperty(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string): number | undefined {\r\n return toNumber(resolvePropertyValue(node, template, propertyName));\r\n}\r\n\r\nfunction getTextureVector2(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string): [number, number] | undefined {\r\n const values = resolvePropertyValues(node, template, propertyName);\r\n if (!values) {\r\n return undefined;\r\n }\r\n const u = toNumber(values[0]);\r\n const v = toNumber(values[1]);\r\n return u !== undefined && v !== undefined ? [u, v] : undefined;\r\n}\r\n\r\nfunction toNumber(value: unknown): number | undefined {\r\n if (typeof value === \"number\") {\r\n return value;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction getNumberPairChild(node: FBXNode, childName: string): [number, number] | undefined {\r\n const child = findChildByName(node, childName);\r\n if (!child) {\r\n return undefined;\r\n }\r\n const u = toNumber(child.properties[0]?.value);\r\n const v = toNumber(child.properties[1]?.value);\r\n return u !== undefined && v !== undefined ? [u, v] : undefined;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"materials.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/materials.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\nimport { type FBXNode, type FBXPropertyValue, findChildByName, getPropertyValue, cleanFBXName } from \"../types/fbxTypes\";\n\nimport { type FBXObjectMap, getChildren } from \"./connections\";\n\nimport {\n extractUserProperties,\n getPropertyEntries,\n getPropertyTemplate,\n resolvePropertyValue,\n resolvePropertyValues,\n type FBXPropertyTemplate,\n type FBXPropertyTemplateMap,\n type FBXUserPropertyValue,\n} from \"./propertyTemplates\";\nimport { resolveMaterialModel, type FBXMaterialModel, type FBXMaterialSource } from \"./materialModel\";\n\n/** Parsed material data */\nexport interface FBXMaterialData {\n id: number;\n name: string;\n type: \"Lambert\" | \"Phong\";\n properties: FBXMaterialProperties;\n textures: FBXTextureRef[];\n /** Unified classic + PBR parameter model resolved from whichever shader flavour the file uses */\n model: FBXMaterialModel<FBXTextureRef>;\n /** User-defined properties */\n userProperties?: Record<string, FBXUserPropertyValue>;\n}\n\nexport interface FBXMaterialProperties {\n diffuseColor?: [number, number, number];\n diffuseFactor?: number;\n ambientColor?: [number, number, number];\n ambientFactor?: number;\n specularColor?: [number, number, number];\n specularFactor?: number;\n shininess?: number;\n emissiveColor?: [number, number, number];\n emissiveFactor?: number;\n opacity?: number;\n transparencyFactor?: number;\n}\n\nexport interface FBXTextureRef {\n /** Which material property this texture is connected to */\n propertyName: string;\n /** Absolute file path from the FBX */\n fileName: string;\n /** Relative file path from the FBX */\n relativeFileName: string;\n /** Texture node ID */\n id: number;\n /** Embedded texture data (from Video node Content), if available */\n embeddedData: Uint8Array | null;\n /** UV translation [u, v] */\n uvTranslation?: [number, number];\n /** UV scaling [u, v] */\n uvScaling?: [number, number];\n /** UV rotation in degrees */\n uvRotation?: number;\n /** Which UV set index this texture uses */\n uvSetIndex?: number;\n /** Which named UV set this texture uses */\n uvSetName?: string;\n /** WrapModeU: 0 = repeat, 1 = clamp */\n wrapU?: number;\n /** WrapModeV: 0 = repeat, 1 = clamp */\n wrapV?: number;\n /** Set when the texture came from a LayeredTexture (only the first layer is used) */\n layeredTextureId?: number;\n}\n\n/**\n * Extract material data from an FBX Material node.\n */\nexport function extractMaterial(materialNode: FBXNode, materialId: number, objectMap: FBXObjectMap, templates?: FBXPropertyTemplateMap): FBXMaterialData {\n const name = cleanFBXName(getPropertyValue<string>(materialNode, 1) ?? \"Material\");\n const template = getMaterialTemplate(materialNode, templates);\n\n // Determine Lambert vs Phong from ShadingModel property\n const shadingModel = findChildByName(materialNode, \"ShadingModel\");\n const shadingType = shadingModel\n ? (getPropertyValue<string>(shadingModel, 0) ?? \"Lambert\")\n : (resolvePropertyValue<string>(materialNode, template, \"ShadingModel\") ?? \"Lambert\");\n const type: \"Lambert\" | \"Phong\" = shadingType.toLowerCase() === \"phong\" ? \"Phong\" : \"Lambert\";\n\n // Extract properties from Properties70\n const properties = extractMaterialProperties(materialNode, template);\n\n // Find connected textures\n const textureTemplate = templates ? (getPropertyTemplate(templates, \"Texture\", \"FbxFileTexture\") ?? getPropertyTemplate(templates, \"Texture\")) : undefined;\n const textures = extractTextures(materialId, objectMap, textureTemplate);\n\n // Resolve the unified material model (classic + PBR parameters) from all properties, textures and shader bindings.\n const props = new Map<string, { type: string; values: FBXPropertyValue[] }>();\n for (const tp of template?.properties.values() ?? []) {\n props.set(tp.name, { type: tp.propertyType, values: tp.values });\n }\n for (const entry of getPropertyEntries(materialNode)) {\n props.set(entry.name, { type: entry.type, values: entry.values });\n }\n const texturesByProp = new Map<string, FBXTextureRef>();\n for (const tex of textures) {\n if (!texturesByProp.has(tex.propertyName)) {\n texturesByProp.set(tex.propertyName, tex);\n }\n }\n const source: FBXMaterialSource<FBXTextureRef> = { shadingModelName: shadingType, props, texturesByProp, shader: extractShaderInfo(materialId, objectMap) };\n const model = resolveMaterialModel(source);\n\n return { id: materialId, name, type, properties, textures, model, userProperties: extractUserProperties(materialNode) };\n}\n\n/**\n * Shader implementation connected to a material (Arnold, OSL / Standard Surface, Stingray PBS): the RenderAPI names\n * the flavour and the binding table maps shader semantics to material property names.\n */\nfunction extractShaderInfo(materialId: number, objectMap: FBXObjectMap): { renderApi: string; bindings: Map<string, string[]> } | undefined {\n // The material is connected as a child of its Implementation (Material -> Implementation), so look at parents.\n const implementations = objectMap.connections\n .filter((conn) => conn.type === \"OO\" && conn.childId === materialId && objectMap.objects.get(conn.parentId)?.name === \"Implementation\")\n .map((conn) => ({ id: conn.parentId, node: objectMap.objects.get(conn.parentId)! }));\n if (implementations.length === 0) {\n return undefined;\n }\n const impl = implementations[0];\n const renderApi = getPropertyEntries(impl.node).find((e) => e.name === \"RenderAPI\")?.values[0];\n const bindings = new Map<string, string[]>();\n const add = (shaderProp: string, materialProp: string) => {\n const list = bindings.get(shaderProp);\n if (list) {\n list.push(materialProp);\n } else {\n bindings.set(shaderProp, [materialProp]);\n }\n };\n for (const table of getChildren(objectMap, impl.id, \"BindingTable\")) {\n for (const entry of table.node.children) {\n if (entry.name !== \"Entry\") {\n continue;\n }\n const src = getPropertyValue<string>(entry, 0);\n const srcType = getPropertyValue<string>(entry, 1);\n const dst = getPropertyValue<string>(entry, 2);\n const dstType = getPropertyValue<string>(entry, 3);\n if (typeof src !== \"string\" || typeof dst !== \"string\") {\n continue;\n }\n if (srcType === \"FbxPropertyEntry\" && dstType === \"FbxSemanticEntry\") {\n add(dst, src);\n } else if (srcType === \"FbxSemanticEntry\" && dstType === \"FbxPropertyEntry\") {\n add(src, dst);\n }\n }\n }\n return { renderApi: typeof renderApi === \"string\" ? renderApi : \"\", bindings };\n}\n\nfunction extractMaterialProperties(materialNode: FBXNode, template?: FBXPropertyTemplate): FBXMaterialProperties {\n const props: FBXMaterialProperties = {};\n props.diffuseColor = getColorProperty(materialNode, template, \"DiffuseColor\") ?? getColorProperty(materialNode, template, \"Diffuse\");\n props.diffuseFactor = getNumberProperty(materialNode, template, \"DiffuseFactor\");\n props.ambientColor = getColorProperty(materialNode, template, \"AmbientColor\") ?? getColorProperty(materialNode, template, \"Ambient\");\n props.ambientFactor = getNumberProperty(materialNode, template, \"AmbientFactor\");\n props.specularColor = getColorProperty(materialNode, template, \"SpecularColor\") ?? getColorProperty(materialNode, template, \"Specular\");\n props.specularFactor = getNumberProperty(materialNode, template, \"SpecularFactor\");\n props.shininess = getNumberProperty(materialNode, template, \"Shininess\") ?? getNumberProperty(materialNode, template, \"ShininessExponent\");\n props.emissiveColor = getColorProperty(materialNode, template, \"EmissiveColor\") ?? getColorProperty(materialNode, template, \"Emissive\");\n props.emissiveFactor = getNumberProperty(materialNode, template, \"EmissiveFactor\");\n props.opacity = getNumberProperty(materialNode, template, \"Opacity\");\n props.transparencyFactor = getNumberProperty(materialNode, template, \"TransparencyFactor\");\n\n return props;\n}\n\nfunction extractTextures(materialId: number, objectMap: FBXObjectMap, template?: FBXPropertyTemplate): FBXTextureRef[] {\n const textures: FBXTextureRef[] = [];\n const textureChildren = getChildren(objectMap, materialId, \"Texture\");\n\n for (const { id, node, propertyName } of textureChildren) {\n textures.push(extractTextureRef(id, node, propertyName, objectMap, template));\n }\n\n // LayeredTexture: several textures blended into one slot. Babylon has no layer blending, so the first layer\n // stands in for the stack; the layer count is recorded on the ref for diagnostics.\n for (const { id: layeredId, propertyName } of getChildren(objectMap, materialId, \"LayeredTexture\")) {\n const layers = getChildren(objectMap, layeredId, \"Texture\");\n if (layers.length === 0) {\n continue;\n }\n const ref = extractTextureRef(layers[0].id, layers[0].node, propertyName, objectMap, template);\n ref.layeredTextureId = layeredId;\n textures.push(ref);\n }\n\n return textures;\n}\n\nexport function extractTextureRef(id: number, node: FBXNode, propertyName: string | undefined, objectMap: FBXObjectMap, template?: FBXPropertyTemplate): FBXTextureRef {\n {\n const fileNameNode = findChildByName(node, \"FileName\");\n const relFileNameNode = findChildByName(node, \"RelativeFilename\");\n\n const fileName = fileNameNode ? (getPropertyValue<string>(fileNameNode, 0) ?? \"\") : \"\";\n const relativeFileName = relFileNameNode ? (getPropertyValue<string>(relFileNameNode, 0) ?? \"\") : \"\";\n\n // Extract UV transform properties\n let uvTranslation: [number, number] | undefined;\n let uvScaling: [number, number] | undefined;\n const uvRotation = getNumberProperty(node, template, \"UVRotation\") ?? getNumberProperty(node, template, \"Rotation\");\n let uvSetName: string | undefined;\n uvTranslation = getTextureVector2(node, template, \"UVTranslation\") ?? getTextureVector2(node, template, \"Translation\");\n uvScaling = getTextureVector2(node, template, \"UVScaling\") ?? getTextureVector2(node, template, \"Scaling\");\n const uvSet = resolvePropertyValue<string>(node, template, \"UVSet\");\n if (uvSet && uvSet.length > 0) {\n uvSetName = uvSet;\n }\n uvTranslation ??= getNumberPairChild(node, \"ModelUVTranslation\");\n uvScaling ??= getNumberPairChild(node, \"ModelUVScaling\");\n const wrapU = getNumberProperty(node, template, \"WrapModeU\");\n const wrapV = getNumberProperty(node, template, \"WrapModeV\");\n\n // Check for embedded texture data in connected Video node\n let embeddedData: Uint8Array | null = null;\n const videoChildren = getChildren(objectMap, id, \"Video\");\n for (const { node: videoNode } of videoChildren) {\n const contentNode = findChildByName(videoNode, \"Content\");\n if (contentNode && contentNode.properties.length > 0) {\n const content = contentNode.properties[0].value;\n if (content instanceof Uint8Array && content.length > 0) {\n embeddedData = content;\n } else if (content instanceof ArrayBuffer && (content as ArrayBuffer).byteLength > 0) {\n embeddedData = new Uint8Array(content as ArrayBuffer);\n }\n }\n }\n\n return {\n propertyName: propertyName ?? \"DiffuseColor\",\n fileName,\n relativeFileName,\n id,\n embeddedData,\n uvTranslation,\n uvScaling,\n uvRotation,\n uvSetName,\n wrapU,\n wrapV,\n };\n }\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────────\n\nfunction getMaterialTemplate(materialNode: FBXNode, templates: FBXPropertyTemplateMap | undefined): FBXPropertyTemplate | undefined {\n if (!templates) {\n return undefined;\n }\n\n const shadingModel = findChildByName(materialNode, \"ShadingModel\");\n const shadingType = shadingModel ? getPropertyValue<string>(shadingModel, 0) : undefined;\n if (shadingType?.toLowerCase() === \"phong\") {\n return getPropertyTemplate(templates, \"Material\", \"FbxSurfacePhong\") ?? getPropertyTemplate(templates, \"Material\");\n }\n if (shadingType?.toLowerCase() === \"lambert\") {\n return getPropertyTemplate(templates, \"Material\", \"FbxSurfaceLambert\") ?? getPropertyTemplate(templates, \"Material\");\n }\n\n return getPropertyTemplate(templates, \"Material\");\n}\n\nfunction getColorProperty(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string): [number, number, number] | undefined {\n const values = resolvePropertyValues(node, template, propertyName);\n if (!values || values.length < 3) {\n return undefined;\n }\n const r = toNumber(values[0]);\n const g = toNumber(values[1]);\n const b = toNumber(values[2]);\n if (r === undefined || g === undefined || b === undefined) {\n return undefined;\n }\n return [r, g, b];\n}\n\nfunction getNumberProperty(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string): number | undefined {\n return toNumber(resolvePropertyValue(node, template, propertyName));\n}\n\nfunction getTextureVector2(node: FBXNode, template: FBXPropertyTemplate | undefined, propertyName: string): [number, number] | undefined {\n const values = resolvePropertyValues(node, template, propertyName);\n if (!values) {\n return undefined;\n }\n const u = toNumber(values[0]);\n const v = toNumber(values[1]);\n return u !== undefined && v !== undefined ? [u, v] : undefined;\n}\n\nfunction toNumber(value: unknown): number | undefined {\n if (typeof value === \"number\") {\n return value;\n }\n return undefined;\n}\n\nfunction getNumberPairChild(node: FBXNode, childName: string): [number, number] | undefined {\n const child = findChildByName(node, childName);\n if (!child) {\n return undefined;\n }\n const u = toNumber(child.properties[0]?.value);\n const v = toNumber(child.properties[1]?.value);\n return u !== undefined && v !== undefined ? [u, v] : undefined;\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type FBXNode } from "../types/fbxTypes.js";
|
|
2
|
+
import { type FBXPropertyTemplate } from "./propertyTemplates.js";
|
|
3
|
+
/** Transform properties resolved from an FBX Model, with template defaults applied. */
|
|
4
|
+
export interface FBXNodeTransformData {
|
|
5
|
+
translation: [number, number, number];
|
|
6
|
+
rotation: [number, number, number];
|
|
7
|
+
scale: [number, number, number];
|
|
8
|
+
preRotation: [number, number, number];
|
|
9
|
+
postRotation: [number, number, number];
|
|
10
|
+
rotationPivot: [number, number, number];
|
|
11
|
+
scalingPivot: [number, number, number];
|
|
12
|
+
rotationOffset: [number, number, number];
|
|
13
|
+
scalingOffset: [number, number, number];
|
|
14
|
+
geometricTranslation: [number, number, number];
|
|
15
|
+
geometricRotation: [number, number, number];
|
|
16
|
+
geometricScaling: [number, number, number];
|
|
17
|
+
/** Rotation order: 0=XYZ, 1=XZY, 2=YZX, 3=YXZ, 4=ZXY, 5=ZYX, 6=SphericXYZ */
|
|
18
|
+
rotationOrder: number;
|
|
19
|
+
/** FBX transform inheritance mode. 0=RrSs, 1=RSrs, 2=Rrs */
|
|
20
|
+
inheritType: number;
|
|
21
|
+
/** Whether the rotation space (rotation order, pre/post rotation) is active for this node */
|
|
22
|
+
rotationActive: boolean;
|
|
23
|
+
diagnostics: string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Resolves the transform properties of a Model node the way the FBX SDK evaluates them.
|
|
27
|
+
*
|
|
28
|
+
* `RotationActive` gates the whole rotation space: when it is false (the FbxNode template default), the SDK
|
|
29
|
+
* composes `Lcl Rotation` in plain XYZ order and ignores `RotationOrder`, `PreRotation` and `PostRotation`.
|
|
30
|
+
* `RotationSpaceForLimitOnly` restricts the rotation space to limits, which has the same effect for us.
|
|
31
|
+
*/
|
|
32
|
+
export declare function extractNodeTransform(modelNode: FBXNode, template?: FBXPropertyTemplate): FBXNodeTransformData;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { resolveNumberProperty, resolveVector3Property } from "./propertyTemplates.js";
|
|
2
|
+
/**
|
|
3
|
+
* Resolves the transform properties of a Model node the way the FBX SDK evaluates them.
|
|
4
|
+
*
|
|
5
|
+
* `RotationActive` gates the whole rotation space: when it is false (the FbxNode template default), the SDK
|
|
6
|
+
* composes `Lcl Rotation` in plain XYZ order and ignores `RotationOrder`, `PreRotation` and `PostRotation`.
|
|
7
|
+
* `RotationSpaceForLimitOnly` restricts the rotation space to limits, which has the same effect for us.
|
|
8
|
+
*/
|
|
9
|
+
export function extractNodeTransform(modelNode, template) {
|
|
10
|
+
const translation = resolveVector3Property(modelNode, template, "Lcl Translation", [0, 0, 0]);
|
|
11
|
+
const rotation = resolveVector3Property(modelNode, template, "Lcl Rotation", [0, 0, 0]);
|
|
12
|
+
const scale = resolveVector3Property(modelNode, template, "Lcl Scaling", [1, 1, 1]);
|
|
13
|
+
let preRotation = resolveVector3Property(modelNode, template, "PreRotation", [0, 0, 0]);
|
|
14
|
+
let postRotation = resolveVector3Property(modelNode, template, "PostRotation", [0, 0, 0]);
|
|
15
|
+
const rotationPivot = resolveVector3Property(modelNode, template, "RotationPivot", [0, 0, 0]);
|
|
16
|
+
const scalingPivot = resolveVector3Property(modelNode, template, "ScalingPivot", [0, 0, 0]);
|
|
17
|
+
const rotationOffset = resolveVector3Property(modelNode, template, "RotationOffset", [0, 0, 0]);
|
|
18
|
+
const scalingOffset = resolveVector3Property(modelNode, template, "ScalingOffset", [0, 0, 0]);
|
|
19
|
+
const geometricTranslation = resolveVector3Property(modelNode, template, "GeometricTranslation", [0, 0, 0]);
|
|
20
|
+
const geometricRotation = resolveVector3Property(modelNode, template, "GeometricRotation", [0, 0, 0]);
|
|
21
|
+
const geometricScaling = resolveVector3Property(modelNode, template, "GeometricScaling", [1, 1, 1]);
|
|
22
|
+
let rotationOrder = resolveNumberProperty(modelNode, template, "RotationOrder", 0);
|
|
23
|
+
const inheritType = resolveNumberProperty(modelNode, template, "InheritType", 1);
|
|
24
|
+
// The SDK default when the property is absent everywhere is "active"; the FbxNode template usually sets 0.
|
|
25
|
+
const rotationActiveValue = resolveNumberProperty(modelNode, template, "RotationActive", 1);
|
|
26
|
+
const rotationSpaceForLimitOnly = resolveNumberProperty(modelNode, template, "RotationSpaceForLimitOnly", 0);
|
|
27
|
+
const rotationActive = rotationActiveValue !== 0 && rotationSpaceForLimitOnly === 0;
|
|
28
|
+
if (!rotationActive) {
|
|
29
|
+
rotationOrder = 0;
|
|
30
|
+
preRotation = [0, 0, 0];
|
|
31
|
+
postRotation = [0, 0, 0];
|
|
32
|
+
}
|
|
33
|
+
// Inherit modes 0 (RrSs), 1 (RSrs) and 2 (Rrs) are all evaluated by the loader; anything else is unknown.
|
|
34
|
+
const diagnostics = inheritType === 0 || inheritType === 1 || inheritType === 2 ? [] : [`InheritType ${inheritType} is unknown; treated as RSrs.`];
|
|
35
|
+
return {
|
|
36
|
+
translation,
|
|
37
|
+
rotation,
|
|
38
|
+
scale,
|
|
39
|
+
preRotation,
|
|
40
|
+
postRotation,
|
|
41
|
+
rotationPivot,
|
|
42
|
+
scalingPivot,
|
|
43
|
+
rotationOffset,
|
|
44
|
+
scalingOffset,
|
|
45
|
+
geometricTranslation,
|
|
46
|
+
geometricRotation,
|
|
47
|
+
geometricScaling,
|
|
48
|
+
rotationOrder,
|
|
49
|
+
inheritType,
|
|
50
|
+
rotationActive,
|
|
51
|
+
diagnostics,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=nodeTransform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeTransform.js","sourceRoot":"","sources":["../../../../../dev/loaders/src/FBX/interpreter/nodeTransform.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAA4B,MAAM,qBAAqB,CAAC;AAyB9G;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAkB,EAAE,QAA8B;IACnF,MAAM,WAAW,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,QAAQ,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,KAAK,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpF,IAAI,WAAW,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACxF,IAAI,YAAY,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1F,MAAM,aAAa,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,YAAY,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,cAAc,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,aAAa,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,oBAAoB,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,sBAAsB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5G,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtG,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACpG,IAAI,aAAa,GAAG,qBAAqB,CAAC,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;IACnF,MAAM,WAAW,GAAG,qBAAqB,CAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;IAEjF,2GAA2G;IAC3G,MAAM,mBAAmB,GAAG,qBAAqB,CAAC,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAC5F,MAAM,yBAAyB,GAAG,qBAAqB,CAAC,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE,CAAC,CAAC,CAAC;IAC7G,MAAM,cAAc,GAAG,mBAAmB,KAAK,CAAC,IAAI,yBAAyB,KAAK,CAAC,CAAC;IACpF,IAAI,CAAC,cAAc,EAAE,CAAC;QAClB,aAAa,GAAG,CAAC,CAAC;QAClB,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,CAAC;IAED,0GAA0G;IAC1G,MAAM,WAAW,GAAG,WAAW,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe,WAAW,+BAA+B,CAAC,CAAC;IAEnJ,OAAO;QACH,WAAW;QACX,QAAQ;QACR,KAAK;QACL,WAAW;QACX,YAAY;QACZ,aAAa;QACb,YAAY;QACZ,cAAc;QACd,aAAa;QACb,oBAAoB;QACpB,iBAAiB;QACjB,gBAAgB;QAChB,aAAa;QACb,WAAW;QACX,cAAc;QACd,WAAW;KACd,CAAC;AACN,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention, jsdoc/require-param, jsdoc/require-returns */\nimport { type FBXNode } from \"../types/fbxTypes\";\nimport { resolveNumberProperty, resolveVector3Property, type FBXPropertyTemplate } from \"./propertyTemplates\";\n\n/** Transform properties resolved from an FBX Model, with template defaults applied. */\nexport interface FBXNodeTransformData {\n translation: [number, number, number];\n rotation: [number, number, number];\n scale: [number, number, number];\n preRotation: [number, number, number];\n postRotation: [number, number, number];\n rotationPivot: [number, number, number];\n scalingPivot: [number, number, number];\n rotationOffset: [number, number, number];\n scalingOffset: [number, number, number];\n geometricTranslation: [number, number, number];\n geometricRotation: [number, number, number];\n geometricScaling: [number, number, number];\n /** Rotation order: 0=XYZ, 1=XZY, 2=YZX, 3=YXZ, 4=ZXY, 5=ZYX, 6=SphericXYZ */\n rotationOrder: number;\n /** FBX transform inheritance mode. 0=RrSs, 1=RSrs, 2=Rrs */\n inheritType: number;\n /** Whether the rotation space (rotation order, pre/post rotation) is active for this node */\n rotationActive: boolean;\n diagnostics: string[];\n}\n\n/**\n * Resolves the transform properties of a Model node the way the FBX SDK evaluates them.\n *\n * `RotationActive` gates the whole rotation space: when it is false (the FbxNode template default), the SDK\n * composes `Lcl Rotation` in plain XYZ order and ignores `RotationOrder`, `PreRotation` and `PostRotation`.\n * `RotationSpaceForLimitOnly` restricts the rotation space to limits, which has the same effect for us.\n */\nexport function extractNodeTransform(modelNode: FBXNode, template?: FBXPropertyTemplate): FBXNodeTransformData {\n const translation = resolveVector3Property(modelNode, template, \"Lcl Translation\", [0, 0, 0]);\n const rotation = resolveVector3Property(modelNode, template, \"Lcl Rotation\", [0, 0, 0]);\n const scale = resolveVector3Property(modelNode, template, \"Lcl Scaling\", [1, 1, 1]);\n let preRotation = resolveVector3Property(modelNode, template, \"PreRotation\", [0, 0, 0]);\n let postRotation = resolveVector3Property(modelNode, template, \"PostRotation\", [0, 0, 0]);\n const rotationPivot = resolveVector3Property(modelNode, template, \"RotationPivot\", [0, 0, 0]);\n const scalingPivot = resolveVector3Property(modelNode, template, \"ScalingPivot\", [0, 0, 0]);\n const rotationOffset = resolveVector3Property(modelNode, template, \"RotationOffset\", [0, 0, 0]);\n const scalingOffset = resolveVector3Property(modelNode, template, \"ScalingOffset\", [0, 0, 0]);\n const geometricTranslation = resolveVector3Property(modelNode, template, \"GeometricTranslation\", [0, 0, 0]);\n const geometricRotation = resolveVector3Property(modelNode, template, \"GeometricRotation\", [0, 0, 0]);\n const geometricScaling = resolveVector3Property(modelNode, template, \"GeometricScaling\", [1, 1, 1]);\n let rotationOrder = resolveNumberProperty(modelNode, template, \"RotationOrder\", 0);\n const inheritType = resolveNumberProperty(modelNode, template, \"InheritType\", 1);\n\n // The SDK default when the property is absent everywhere is \"active\"; the FbxNode template usually sets 0.\n const rotationActiveValue = resolveNumberProperty(modelNode, template, \"RotationActive\", 1);\n const rotationSpaceForLimitOnly = resolveNumberProperty(modelNode, template, \"RotationSpaceForLimitOnly\", 0);\n const rotationActive = rotationActiveValue !== 0 && rotationSpaceForLimitOnly === 0;\n if (!rotationActive) {\n rotationOrder = 0;\n preRotation = [0, 0, 0];\n postRotation = [0, 0, 0];\n }\n\n // Inherit modes 0 (RrSs), 1 (RSrs) and 2 (Rrs) are all evaluated by the loader; anything else is unknown.\n const diagnostics = inheritType === 0 || inheritType === 1 || inheritType === 2 ? [] : [`InheritType ${inheritType} is unknown; treated as RSrs.`];\n\n return {\n translation,\n rotation,\n scale,\n preRotation,\n postRotation,\n rotationPivot,\n scalingPivot,\n rotationOffset,\n scalingOffset,\n geometricTranslation,\n geometricRotation,\n geometricScaling,\n rotationOrder,\n inheritType,\n rotationActive,\n diagnostics,\n };\n}\n"]}
|