@zephyr3d/scene 0.9.4 → 0.9.5

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.
Files changed (102) hide show
  1. package/dist/animation/animationmask.js +224 -0
  2. package/dist/animation/animationmask.js.map +1 -0
  3. package/dist/animation/animationset.js +268 -67
  4. package/dist/animation/animationset.js.map +1 -1
  5. package/dist/animation/animationtrack.js.map +1 -1
  6. package/dist/animation/eulerrotationtrack.js +3 -0
  7. package/dist/animation/eulerrotationtrack.js.map +1 -1
  8. package/dist/animation/fixed_geometry_cache_track.js +7 -0
  9. package/dist/animation/fixed_geometry_cache_track.js.map +1 -1
  10. package/dist/animation/ik_modifier.js.map +1 -1
  11. package/dist/animation/joint_dynamics/collision.js +6 -4
  12. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  13. package/dist/animation/joint_dynamics/controller.js +390 -43
  14. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  15. package/dist/animation/joint_dynamics/joint_dynamics_system.js +62 -3
  16. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  17. package/dist/animation/joint_dynamics/solver.js +4 -3
  18. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  19. package/dist/animation/joint_dynamics/types.js.map +1 -1
  20. package/dist/animation/joint_dynamics_modifier.js +2 -0
  21. package/dist/animation/joint_dynamics_modifier.js.map +1 -1
  22. package/dist/animation/morphtarget.js +3 -72
  23. package/dist/animation/morphtarget.js.map +1 -1
  24. package/dist/animation/morphtrack.js +3 -0
  25. package/dist/animation/morphtrack.js.map +1 -1
  26. package/dist/animation/pca_geometry_cache_track.js +3 -0
  27. package/dist/animation/pca_geometry_cache_track.js.map +1 -1
  28. package/dist/animation/proptrack.js +3 -0
  29. package/dist/animation/proptrack.js.map +1 -1
  30. package/dist/animation/rotationtrack.js +3 -0
  31. package/dist/animation/rotationtrack.js.map +1 -1
  32. package/dist/animation/scaletrack.js +3 -0
  33. package/dist/animation/scaletrack.js.map +1 -1
  34. package/dist/animation/skeleton.js +254 -79
  35. package/dist/animation/skeleton.js.map +1 -1
  36. package/dist/animation/skeleton_modifier.js.map +1 -1
  37. package/dist/animation/spring_modifier.js.map +1 -1
  38. package/dist/animation/translationtrack.js +3 -0
  39. package/dist/animation/translationtrack.js.map +1 -1
  40. package/dist/app/engine.js +171 -107
  41. package/dist/app/engine.js.map +1 -1
  42. package/dist/app/scriptregistry.js +251 -80
  43. package/dist/app/scriptregistry.js.map +1 -1
  44. package/dist/asset/assetmanager.js +344 -365
  45. package/dist/asset/assetmanager.js.map +1 -1
  46. package/dist/asset/loaders/gltf/gltf_loader.js +17 -14
  47. package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
  48. package/dist/asset/loaders/loader.js +1 -6
  49. package/dist/asset/loaders/loader.js.map +1 -1
  50. package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -1
  51. package/dist/asset/model.js +1000 -131
  52. package/dist/asset/model.js.map +1 -1
  53. package/dist/avatar/wardrobe.js +474 -0
  54. package/dist/avatar/wardrobe.js.map +1 -0
  55. package/dist/index.d.ts +1125 -199
  56. package/dist/index.js +3 -2
  57. package/dist/index.js.map +1 -1
  58. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +6 -3
  59. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  60. package/dist/material/mixins/pbr/common.js +72 -15
  61. package/dist/material/mixins/pbr/common.js.map +1 -1
  62. package/dist/material/msdf_text_sprite.js +4 -4
  63. package/dist/material/msdf_text_sprite.js.map +1 -1
  64. package/dist/material/pbrblueprint.js +102 -102
  65. package/dist/material/pbrblueprint.js.map +1 -1
  66. package/dist/render/envlight.js +54 -1
  67. package/dist/render/envlight.js.map +1 -1
  68. package/dist/render/sky.js +9 -0
  69. package/dist/render/sky.js.map +1 -1
  70. package/dist/scene/batchgroup.js +11 -13
  71. package/dist/scene/batchgroup.js.map +1 -1
  72. package/dist/scene/environment.js +15 -2
  73. package/dist/scene/environment.js.map +1 -1
  74. package/dist/scene/mesh.js +79 -16
  75. package/dist/scene/mesh.js.map +1 -1
  76. package/dist/scene/scene.js +1 -0
  77. package/dist/scene/scene.js.map +1 -1
  78. package/dist/scene/scene_node.js +203 -2
  79. package/dist/scene/scene_node.js.map +1 -1
  80. package/dist/text/font/font_asset.js.map +1 -1
  81. package/dist/text/msdf/generator.js.map +1 -1
  82. package/dist/text/msdf/shape.js +4 -1
  83. package/dist/text/msdf/shape.js.map +1 -1
  84. package/dist/text/runtime/msdf_text_atlas_manager.js +4 -1
  85. package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -1
  86. package/dist/utility/blueprint/material/inputs.js +1157 -1154
  87. package/dist/utility/blueprint/material/inputs.js.map +1 -1
  88. package/dist/utility/bounding_volume.js.map +1 -1
  89. package/dist/utility/pmrem.js +34 -8
  90. package/dist/utility/pmrem.js.map +1 -1
  91. package/dist/utility/serialization/manager.js +22 -9
  92. package/dist/utility/serialization/manager.js.map +1 -1
  93. package/dist/utility/serialization/scene/animation.js +700 -7
  94. package/dist/utility/serialization/scene/animation.js.map +1 -1
  95. package/dist/utility/serialization/scene/mesh.js +64 -4
  96. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  97. package/dist/utility/serialization/scene/node.js +187 -8
  98. package/dist/utility/serialization/scene/node.js.map +1 -1
  99. package/dist/utility/serialization/types.js.map +1 -1
  100. package/dist/utility/textures/sheenlut.js +138 -0
  101. package/dist/utility/textures/sheenlut.js.map +1 -0
  102. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"mesh.js","sources":["../../../../src/utility/serialization/scene/mesh.ts"],"sourcesContent":["import { base64ToUint8Array, uint8ArrayToBase64, Vector3 } from '@zephyr3d/base';\r\nimport { getEngine } from '../../../app/api';\r\nimport type { MeshMaterial } from '../../../material/meshmaterial';\r\nimport { GraphNode, Mesh, type SceneNode } from '../../../scene';\r\nimport { defineProps, type SerializableClass } from '../types';\r\nimport { BoundingBox } from '../../bounding_volume';\r\nimport { meshInstanceClsMap } from './common';\r\nimport { JSONData } from '../json';\r\n\r\n/** @internal */\r\nexport function getMeshClass(): SerializableClass {\r\n return {\r\n ctor: Mesh,\r\n name: 'Mesh',\r\n parent: GraphNode,\r\n noTitle: true,\r\n createFunc(ctx: SceneNode) {\r\n const node = new Mesh(ctx.scene!);\r\n node.parent = ctx;\r\n return { obj: node };\r\n },\r\n getProps() {\r\n return defineProps([\r\n {\r\n name: 'CastShadow',\r\n description: 'If true, the mesh can cast shadows',\r\n type: 'bool',\r\n default: false,\r\n get(this: Mesh, value) {\r\n value.bool[0] = this.castShadow;\r\n },\r\n set(this: Mesh, value) {\r\n this.castShadow = value.bool[0];\r\n }\r\n },\r\n {\r\n name: 'SkinnedBoundingInfo',\r\n description: 'Serialized skinned bounding data for the mesh',\r\n type: 'string',\r\n isHidden() {\r\n return true;\r\n },\r\n get(this: Mesh, value) {\r\n if (this.skinnedBoundingInfo) {\r\n const arr = new Float32Array(24 + 24 + 6 * 3);\r\n arr.set(this.skinnedBoundingInfo.boundingVertexBlendIndices, 0);\r\n arr.set(this.skinnedBoundingInfo.boundingVertexJointWeights, 24);\r\n for (let i = 0; i < 6; i++) {\r\n arr.set(this.skinnedBoundingInfo.boundingVertices[i], 24 + 24 + i * 3);\r\n }\r\n value.str[0] = uint8ArrayToBase64(new Uint8Array(arr.buffer));\r\n } else {\r\n value.str[0] = '';\r\n }\r\n },\r\n set(this: Mesh, value) {\r\n if (value.str[0]) {\r\n const buf = new Float32Array(base64ToUint8Array(value.str[0]).buffer);\r\n const boundingVertexBlendIndices = buf.subarray(0, 24);\r\n const boundingVertexJointWeights = buf.subarray(24, 48);\r\n const boundingVertices: Vector3[] = [];\r\n for (let i = 0; i < 6; i++) {\r\n boundingVertices.push(new Vector3(buf.subarray(48 + i * 3, 48 + (i + 1) * 3)));\r\n }\r\n this.setSkinnedBoundingInfo({\r\n boundingVertexBlendIndices,\r\n boundingVertexJointWeights,\r\n boundingVertices,\r\n boundingBox: new BoundingBox()\r\n });\r\n } else {\r\n this.setSkinnedBoundingInfo(null);\r\n }\r\n }\r\n },\r\n {\r\n name: 'Skeleton',\r\n description: 'Persistent ID of the skeleton bound to this mesh',\r\n type: 'string',\r\n isHidden() {\r\n return false;\r\n },\r\n get(this: Mesh, value) {\r\n value.str[0] = this.skeletonName;\r\n },\r\n set(this: Mesh, value) {\r\n this.skeletonName = value.str[0];\r\n }\r\n },\r\n {\r\n name: 'MorphData',\r\n description: 'Serialized morph-target vertex data',\r\n type: 'string',\r\n isHidden() {\r\n return true;\r\n },\r\n async get(this: Mesh, value) {\r\n const morphData = this.getMorphData();\r\n if (morphData) {\r\n const buffer = new ArrayBuffer(4 + 4 + 4 * 4 * morphData.width * morphData.height);\r\n const dataView = new DataView(buffer);\r\n dataView.setUint32(0, morphData.width, true);\r\n dataView.setUint32(4, morphData.height, true);\r\n new Float32Array(buffer, 8, 4 * morphData.width * morphData.height).set(morphData.data);\r\n value.str[0] = uint8ArrayToBase64(new Uint8Array(buffer));\r\n } else {\r\n value.str[0] = '';\r\n }\r\n },\r\n set(this: Mesh, value) {\r\n if (value.str[0]) {\r\n const data = base64ToUint8Array(value.str[0]);\r\n const dataView = new DataView(data.buffer);\r\n const width = dataView.getUint32(0, true);\r\n const height = dataView.getUint32(4, true);\r\n const pixels = new Float32Array(data.buffer, 8, 4 * width * height);\r\n this.setMorphData({ width, height, data: pixels });\r\n } else {\r\n this.setMorphData(null);\r\n }\r\n }\r\n },\r\n {\r\n name: 'MorphTargets',\r\n description: 'Named morph-target weights for this mesh',\r\n type: 'object',\r\n options: { objectTypes: [JSONData] },\r\n isPersistent() {\r\n return false;\r\n },\r\n isHidden(this: Mesh) {\r\n return !this.getMorphInfo();\r\n },\r\n get(this: Mesh, value) {\r\n const morphInfo = this.getMorphInfo()!;\r\n const numTargets = morphInfo.data[3];\r\n const data: Record<string, number> = {};\r\n for (let i = 0; i < numTargets; i++) {\r\n const name = Object.keys(morphInfo.names).find((key) => morphInfo.names![key] === i);\r\n if (name) {\r\n Object.defineProperty(data, name, {\r\n enumerable: true,\r\n configurable: true,\r\n get: () => this.getMorphWeight(name),\r\n set: (v) => this.setMorphWeight(name, v)\r\n });\r\n }\r\n }\r\n value.object[0] = new JSONData(null, data);\r\n }\r\n },\r\n {\r\n name: 'MorphInfo',\r\n description: 'Serialized morph-target layout and metadata',\r\n type: 'string',\r\n isHidden() {\r\n return true;\r\n },\r\n get(this: Mesh, value) {\r\n const morphInfo = this.getMorphInfo();\r\n if (morphInfo) {\r\n const data = new Uint8Array(\r\n morphInfo.data.buffer,\r\n morphInfo.data.byteOffset,\r\n morphInfo.data.byteLength\r\n );\r\n value.str[0] = JSON.stringify({ data: uint8ArrayToBase64(data), names: morphInfo.names });\r\n } else {\r\n value.str[0] = '';\r\n }\r\n },\r\n set(this: Mesh, value) {\r\n if (value.str[0]) {\r\n try {\r\n const info = JSON.parse(value.str[0]);\r\n const data = new Float32Array(base64ToUint8Array(info.data).buffer);\r\n const names = info.names;\r\n this.setMorphInfo({ data, names });\r\n } catch {\r\n const data = new Float32Array(base64ToUint8Array(value.str[0]).buffer);\r\n const names: Record<string, number> = {};\r\n for (let i = 0; i < data[3]; i++) {\r\n names[`Target${i}`] = i;\r\n }\r\n this.setMorphInfo({ data, names });\r\n }\r\n } else {\r\n this.setMorphInfo(null);\r\n }\r\n }\r\n },\r\n {\r\n name: 'MorphBoundingBox',\r\n description: 'Serialized bounding box for morphed geometry',\r\n type: 'string',\r\n isHidden() {\r\n return true;\r\n },\r\n get(this: Mesh, value) {\r\n value.str[0] = '';\r\n if (this.getMorphData()) {\r\n const box = this.getAnimatedBoundingBox();\r\n if (box) {\r\n const data = new Float32Array([...box.minPoint, ...box.maxPoint]);\r\n value.str[0] = uint8ArrayToBase64(new Uint8Array(data.buffer));\r\n }\r\n }\r\n },\r\n set(this: Mesh, value) {\r\n if (value.str[0]) {\r\n const data = new Float32Array(base64ToUint8Array(value.str[0]).buffer);\r\n const bbox = new BoundingBox();\r\n bbox.minPoint.setXYZ(data[0], data[1], data[2]);\r\n bbox.maxPoint.setXYZ(data[3], data[4], data[5]);\r\n this.setAnimatedBoundingBox(bbox);\r\n } else {\r\n this.setAnimatedBoundingBox(null);\r\n }\r\n }\r\n },\r\n {\r\n name: 'Primitive',\r\n description: 'Primitive object of this mesh',\r\n type: 'object',\r\n options: {\r\n mimeTypes: ['application/vnd.zephyr3d.mesh+json']\r\n },\r\n get(this: Mesh, value) {\r\n value.str[0] = this.primitive\r\n ? (getEngine().resourceManager.getAssetId(this.primitive) ?? '')\r\n : '';\r\n },\r\n async set(this: Mesh, value) {\r\n if (value?.str[0]) {\r\n const primitive = await getEngine().resourceManager.fetchPrimitive(value.str[0]);\r\n if (primitive) {\r\n this.primitive = primitive;\r\n } else {\r\n console.error(`Primitive not found: ${value.str[0]}`);\r\n }\r\n }\r\n }\r\n },\r\n {\r\n name: 'Material',\r\n description: 'Material object of this mesh',\r\n type: 'object',\r\n options: {\r\n mimeTypes: ['application/vnd.zephyr3d.material+json']\r\n },\r\n get(this: Mesh, value) {\r\n const m = this.material?.coreMaterial;\r\n value.str[0] = getEngine().resourceManager.getAssetId(m) ?? '';\r\n },\r\n async set(this: Mesh, value) {\r\n if (value?.str[0]) {\r\n const material = await getEngine().resourceManager.fetchMaterial<MeshMaterial>(value.str[0]);\r\n if (material) {\r\n this.material = material;\r\n } else {\r\n console.error(`Material not found: ${value.str[0]}`);\r\n }\r\n }\r\n }\r\n },\r\n {\r\n name: 'Geometry Instance',\r\n description: 'If true, geometry instancing is enabled for this mesh',\r\n type: 'bool',\r\n get(this: Mesh, value) {\r\n value.bool[0] = !!this.material?.$isInstance;\r\n },\r\n set(this: Mesh, value) {\r\n this.material = value.bool[0]\r\n ? (this.material?.createInstance() ?? null)\r\n : (this.material?.coreMaterial ?? null);\r\n }\r\n },\r\n {\r\n name: 'MaterialInstanceUniforms',\r\n description: 'Per-instance material uniform properties',\r\n type: 'object',\r\n phase: 1,\r\n options: {\r\n objectTypes: []\r\n },\r\n isHidden(this: Mesh) {\r\n return !!this.material && !this.material?.$isInstance;\r\n },\r\n isNullable() {\r\n return true;\r\n },\r\n get(this: Mesh, value) {\r\n const C = this.material?.$isInstance\r\n ? meshInstanceClsMap.get(this.material.coreMaterial.constructor as typeof MeshMaterial)\r\n : null;\r\n value.object[0] = C ? new C.C(this.material!) : null;\r\n },\r\n set(this: Mesh, value) {\r\n if (value.object[0]) {\r\n this.material = (value.object[0] as any)?.material;\r\n }\r\n }\r\n }\r\n ]);\r\n }\r\n };\r\n}\r\n"],"names":["getMeshClass","ctor","Mesh","name","parent","GraphNode","noTitle","createFunc","ctx","node","scene","obj","getProps","defineProps","description","type","default","get","value","bool","castShadow","set","isHidden","skinnedBoundingInfo","arr","Float32Array","boundingVertexBlendIndices","boundingVertexJointWeights","i","boundingVertices","str","uint8ArrayToBase64","Uint8Array","buffer","buf","base64ToUint8Array","subarray","push","Vector3","setSkinnedBoundingInfo","boundingBox","BoundingBox","skeletonName","morphData","getMorphData","ArrayBuffer","width","height","dataView","DataView","setUint32","data","getUint32","pixels","setMorphData","options","objectTypes","JSONData","isPersistent","getMorphInfo","morphInfo","numTargets","Object","keys","names","find","key","defineProperty","enumerable","configurable","getMorphWeight","v","setMorphWeight","object","byteOffset","byteLength","JSON","stringify","info","parse","setMorphInfo","box","getAnimatedBoundingBox","minPoint","maxPoint","bbox","setXYZ","setAnimatedBoundingBox","mimeTypes","primitive","getEngine","resourceManager","getAssetId","fetchPrimitive","console","error","m","material","coreMaterial","fetchMaterial","$isInstance","createInstance","phase","isNullable","C","meshInstanceClsMap"],"mappings":"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"}
1
+ {"version":3,"file":"mesh.js","sources":["../../../../src/utility/serialization/scene/mesh.ts"],"sourcesContent":["import { base64ToUint8Array, uint8ArrayToBase64, Vector3 } from '@zephyr3d/base';\r\nimport { getEngine } from '../../../app/api';\r\nimport type { MeshMaterial } from '../../../material/meshmaterial';\r\nimport { GraphNode, Mesh, type SceneNode } from '../../../scene';\r\nimport { defineProps, type SerializableClass } from '../types';\r\nimport { BoundingBox } from '../../bounding_volume';\r\nimport { meshInstanceClsMap } from './common';\r\nimport { JSONData } from '../json';\r\n\r\nfunction serializeBoundingBox(box: BoundingBox): number[] {\r\n return [...box.minPoint, ...box.maxPoint];\r\n}\r\n\r\nfunction deserializeBoundingBox(data: unknown): BoundingBox | null {\r\n if (!Array.isArray(data) || data.length < 6 || !data.every((v) => typeof v === 'number')) {\r\n return null;\r\n }\r\n return new BoundingBox(new Vector3(data.slice(0, 3)), new Vector3(data.slice(3, 6)));\r\n}\r\n\r\n/** @internal */\r\nexport function getMeshClass(): SerializableClass {\r\n return {\r\n ctor: Mesh,\r\n name: 'Mesh',\r\n parent: GraphNode,\r\n noTitle: true,\r\n createFunc(ctx: SceneNode) {\r\n const node = new Mesh(ctx.scene!);\r\n node.parent = ctx;\r\n return { obj: node };\r\n },\r\n getProps() {\r\n return defineProps([\r\n {\r\n name: 'CastShadow',\r\n description: 'If true, the mesh can cast shadows',\r\n type: 'bool',\r\n default: false,\r\n get(this: Mesh, value) {\r\n value.bool[0] = this.castShadow;\r\n },\r\n set(this: Mesh, value) {\r\n this.castShadow = value.bool[0];\r\n }\r\n },\r\n {\r\n name: 'SkinnedBoundingInfo',\r\n description: 'Serialized skinned bounding data for the mesh',\r\n type: 'string',\r\n isHidden() {\r\n return true;\r\n },\r\n get(this: Mesh, value) {\r\n if (this.skinnedBoundingInfo) {\r\n const arr = new Float32Array(24 + 24 + 6 * 3);\r\n arr.set(this.skinnedBoundingInfo.boundingVertexBlendIndices, 0);\r\n arr.set(this.skinnedBoundingInfo.boundingVertexJointWeights, 24);\r\n for (let i = 0; i < 6; i++) {\r\n arr.set(this.skinnedBoundingInfo.boundingVertices[i], 24 + 24 + i * 3);\r\n }\r\n value.str[0] = uint8ArrayToBase64(new Uint8Array(arr.buffer));\r\n } else {\r\n value.str[0] = '';\r\n }\r\n },\r\n set(this: Mesh, value) {\r\n if (value.str[0]) {\r\n const buf = new Float32Array(base64ToUint8Array(value.str[0]).buffer);\r\n const boundingVertexBlendIndices = buf.subarray(0, 24);\r\n const boundingVertexJointWeights = buf.subarray(24, 48);\r\n const boundingVertices: Vector3[] = [];\r\n for (let i = 0; i < 6; i++) {\r\n boundingVertices.push(new Vector3(buf.subarray(48 + i * 3, 48 + (i + 1) * 3)));\r\n }\r\n this.setSkinnedBoundingInfo({\r\n boundingVertexBlendIndices,\r\n boundingVertexJointWeights,\r\n boundingVertices,\r\n boundingBox: new BoundingBox()\r\n });\r\n } else {\r\n this.setSkinnedBoundingInfo(null);\r\n }\r\n }\r\n },\r\n {\r\n name: 'SkinBinding',\r\n description: 'Persistent ID of the skin binding bound to this mesh',\r\n type: 'string',\r\n isHidden() {\r\n return false;\r\n },\r\n get(this: Mesh, value) {\r\n value.str[0] = this.skinBindingName;\r\n },\r\n set(this: Mesh, value) {\r\n this.skinBindingName = value.str[0];\r\n }\r\n },\r\n {\r\n name: 'Skeleton',\r\n description: 'Legacy persistent ID of the skin binding bound to this mesh',\r\n type: 'string',\r\n isHidden() {\r\n return true;\r\n },\r\n get(this: Mesh, value) {\r\n value.str[0] = '';\r\n },\r\n set(this: Mesh, value) {\r\n if (value.str[0]) {\r\n this.skeletonName = value.str[0];\r\n }\r\n }\r\n },\r\n {\r\n name: 'MorphData',\r\n description: 'Serialized morph-target vertex data',\r\n type: 'string',\r\n isHidden() {\r\n return true;\r\n },\r\n async get(this: Mesh, value) {\r\n const morphData = this.getMorphData();\r\n if (morphData) {\r\n const buffer = new ArrayBuffer(4 + 4 + 4 * 4 * morphData.width * morphData.height);\r\n const dataView = new DataView(buffer);\r\n dataView.setUint32(0, morphData.width, true);\r\n dataView.setUint32(4, morphData.height, true);\r\n new Float32Array(buffer, 8, 4 * morphData.width * morphData.height).set(morphData.data);\r\n value.str[0] = uint8ArrayToBase64(new Uint8Array(buffer));\r\n } else {\r\n value.str[0] = '';\r\n }\r\n },\r\n set(this: Mesh, value) {\r\n if (value.str[0]) {\r\n const data = base64ToUint8Array(value.str[0]);\r\n const dataView = new DataView(data.buffer);\r\n const width = dataView.getUint32(0, true);\r\n const height = dataView.getUint32(4, true);\r\n const pixels = new Float32Array(data.buffer, 8, 4 * width * height);\r\n this.setMorphData({ width, height, data: pixels });\r\n } else {\r\n this.setMorphData(null);\r\n }\r\n }\r\n },\r\n {\r\n name: 'MorphTargets',\r\n description: 'Named morph-target weights for this mesh',\r\n type: 'object',\r\n options: { objectTypes: [JSONData] },\r\n isPersistent() {\r\n return false;\r\n },\r\n isHidden(this: Mesh) {\r\n return !this.getMorphInfo();\r\n },\r\n get(this: Mesh, value) {\r\n const morphInfo = this.getMorphInfo()!;\r\n const numTargets = morphInfo.data[3];\r\n const data: Record<string, number> = {};\r\n for (let i = 0; i < numTargets; i++) {\r\n const name = Object.keys(morphInfo.names).find((key) => morphInfo.names![key] === i);\r\n if (name) {\r\n Object.defineProperty(data, name, {\r\n enumerable: true,\r\n configurable: true,\r\n get: () => this.getMorphWeight(name),\r\n set: (v) => this.setMorphWeight(name, v)\r\n });\r\n }\r\n }\r\n value.object[0] = new JSONData(null, data);\r\n }\r\n },\r\n {\r\n name: 'MorphInfo',\r\n description: 'Serialized morph-target layout and metadata',\r\n type: 'string',\r\n isHidden() {\r\n return true;\r\n },\r\n get(this: Mesh, value) {\r\n const morphInfo = this.getMorphInfo();\r\n if (morphInfo) {\r\n const data = new Uint8Array(\r\n morphInfo.data.buffer,\r\n morphInfo.data.byteOffset,\r\n morphInfo.data.byteLength\r\n );\r\n value.str[0] = JSON.stringify({ data: uint8ArrayToBase64(data), names: morphInfo.names });\r\n } else {\r\n value.str[0] = '';\r\n }\r\n },\r\n set(this: Mesh, value) {\r\n if (value.str[0]) {\r\n try {\r\n const info = JSON.parse(value.str[0]);\r\n const data = new Float32Array(base64ToUint8Array(info.data).buffer);\r\n const names = info.names;\r\n this.setMorphInfo({ data, names });\r\n } catch {\r\n const data = new Float32Array(base64ToUint8Array(value.str[0]).buffer);\r\n const names: Record<string, number> = {};\r\n for (let i = 0; i < data[3]; i++) {\r\n names[`Target${i}`] = i;\r\n }\r\n this.setMorphInfo({ data, names });\r\n }\r\n } else {\r\n this.setMorphInfo(null);\r\n }\r\n }\r\n },\r\n {\r\n name: 'MorphBoundingBox',\r\n description: 'Serialized bounding box for morphed geometry',\r\n type: 'string',\r\n isHidden() {\r\n return true;\r\n },\r\n get(this: Mesh, value) {\r\n value.str[0] = '';\r\n if (this.getMorphData()) {\r\n const box = this.getAnimatedBoundingBox();\r\n if (box) {\r\n const data = new Float32Array([...box.minPoint, ...box.maxPoint]);\r\n value.str[0] = uint8ArrayToBase64(new Uint8Array(data.buffer));\r\n }\r\n }\r\n },\r\n set(this: Mesh, value) {\r\n if (value.str[0]) {\r\n const data = new Float32Array(base64ToUint8Array(value.str[0]).buffer);\r\n const bbox = new BoundingBox();\r\n bbox.minPoint.setXYZ(data[0], data[1], data[2]);\r\n bbox.maxPoint.setXYZ(data[3], data[4], data[5]);\r\n this.setAnimatedBoundingBox(bbox);\r\n } else {\r\n this.setAnimatedBoundingBox(null);\r\n }\r\n }\r\n },\r\n {\r\n name: 'MorphBoundingInfo',\r\n description: 'Serialized morph-target bounding data',\r\n type: 'string',\r\n isHidden() {\r\n return true;\r\n },\r\n get(this: Mesh, value) {\r\n const info = this.getMorphBoundingInfo();\r\n value.str[0] = info\r\n ? JSON.stringify({\r\n originBox: serializeBoundingBox(info.originBox),\r\n targetBoxes: info.targetBoxes.map((box) => serializeBoundingBox(box))\r\n })\r\n : '';\r\n },\r\n set(this: Mesh, value) {\r\n if (!value.str[0]) {\r\n this.setMorphBoundingInfo(null);\r\n return;\r\n }\r\n try {\r\n const data = JSON.parse(value.str[0]);\r\n const originBox = deserializeBoundingBox(data.originBox);\r\n const targetBoxes = Array.isArray(data.targetBoxes)\r\n ? data.targetBoxes\r\n .map((item: unknown) => deserializeBoundingBox(item))\r\n .filter((box: BoundingBox | null): box is BoundingBox => !!box)\r\n : [];\r\n this.setMorphBoundingInfo(\r\n originBox && targetBoxes.length > 0 ? { originBox, targetBoxes } : null\r\n );\r\n } catch {\r\n this.setMorphBoundingInfo(null);\r\n }\r\n }\r\n },\r\n {\r\n name: 'Primitive',\r\n description: 'Primitive object of this mesh',\r\n type: 'object',\r\n options: {\r\n mimeTypes: ['application/vnd.zephyr3d.mesh+json']\r\n },\r\n get(this: Mesh, value) {\r\n value.str[0] = this.primitive\r\n ? (getEngine().resourceManager.getAssetId(this.primitive) ?? '')\r\n : '';\r\n },\r\n async set(this: Mesh, value) {\r\n if (value?.str[0]) {\r\n const primitive = await getEngine().resourceManager.fetchPrimitive(value.str[0]);\r\n if (primitive) {\r\n this.primitive = primitive;\r\n } else {\r\n console.error(`Primitive not found: ${value.str[0]}`);\r\n }\r\n }\r\n }\r\n },\r\n {\r\n name: 'Material',\r\n description: 'Material object of this mesh',\r\n type: 'object',\r\n options: {\r\n mimeTypes: ['application/vnd.zephyr3d.material+json']\r\n },\r\n get(this: Mesh, value) {\r\n const m = this.material?.coreMaterial;\r\n value.str[0] = getEngine().resourceManager.getAssetId(m) ?? '';\r\n },\r\n async set(this: Mesh, value) {\r\n if (value?.str[0]) {\r\n const material = await getEngine().resourceManager.fetchMaterial<MeshMaterial>(value.str[0]);\r\n if (material) {\r\n this.material = material;\r\n } else {\r\n console.error(`Material not found: ${value.str[0]}`);\r\n }\r\n }\r\n }\r\n },\r\n {\r\n name: 'Geometry Instance',\r\n description: 'If true, geometry instancing is enabled for this mesh',\r\n type: 'bool',\r\n get(this: Mesh, value) {\r\n value.bool[0] = !!this.material?.$isInstance;\r\n },\r\n set(this: Mesh, value) {\r\n this.material = value.bool[0]\r\n ? (this.material?.createInstance() ?? null)\r\n : (this.material?.coreMaterial ?? null);\r\n }\r\n },\r\n {\r\n name: 'MaterialInstanceUniforms',\r\n description: 'Per-instance material uniform properties',\r\n type: 'object',\r\n phase: 1,\r\n options: {\r\n objectTypes: []\r\n },\r\n isHidden(this: Mesh) {\r\n return !!this.material && !this.material?.$isInstance;\r\n },\r\n isNullable() {\r\n return true;\r\n },\r\n get(this: Mesh, value) {\r\n const C = this.material?.$isInstance\r\n ? meshInstanceClsMap.get(this.material.coreMaterial.constructor as typeof MeshMaterial)\r\n : null;\r\n value.object[0] = C ? new C.C(this.material!) : null;\r\n },\r\n set(this: Mesh, value) {\r\n if (value.object[0]) {\r\n this.material = (value.object[0] as any)?.material;\r\n }\r\n }\r\n }\r\n ]);\r\n }\r\n };\r\n}\r\n"],"names":["serializeBoundingBox","box","minPoint","maxPoint","deserializeBoundingBox","data","Array","isArray","length","every","v","BoundingBox","Vector3","slice","getMeshClass","ctor","Mesh","name","parent","GraphNode","noTitle","createFunc","ctx","node","scene","obj","getProps","defineProps","description","type","default","get","value","bool","castShadow","set","isHidden","skinnedBoundingInfo","arr","Float32Array","boundingVertexBlendIndices","boundingVertexJointWeights","i","boundingVertices","str","uint8ArrayToBase64","Uint8Array","buffer","buf","base64ToUint8Array","subarray","push","setSkinnedBoundingInfo","boundingBox","skinBindingName","skeletonName","morphData","getMorphData","ArrayBuffer","width","height","dataView","DataView","setUint32","getUint32","pixels","setMorphData","options","objectTypes","JSONData","isPersistent","getMorphInfo","morphInfo","numTargets","Object","keys","names","find","key","defineProperty","enumerable","configurable","getMorphWeight","setMorphWeight","object","byteOffset","byteLength","JSON","stringify","info","parse","setMorphInfo","getAnimatedBoundingBox","bbox","setXYZ","setAnimatedBoundingBox","getMorphBoundingInfo","originBox","targetBoxes","map","setMorphBoundingInfo","item","filter","mimeTypes","primitive","getEngine","resourceManager","getAssetId","fetchPrimitive","console","error","m","material","coreMaterial","fetchMaterial","$isInstance","createInstance","phase","isNullable","C","meshInstanceClsMap"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { SceneNode } from '../../../scene/scene_node.js';
2
2
  import { Scene } from '../../../scene/scene.js';
3
3
  import { defineProps } from '../types.js';
4
- import { applyPatch, DRef, diff, ASSERT, radian2degree, degree2radian } from '@zephyr3d/base';
4
+ import { applyPatch, DRef, guessMimeType, diff, ASSERT, radian2degree, degree2radian } from '@zephyr3d/base';
5
5
  import '../../../values.js';
6
6
  import '../../../render/render_queue.js';
7
7
  import '../../../render/primitive.js';
@@ -47,8 +47,10 @@ import { restoreGeometryCacheMeshBinding } from '../../../animation/geometry_cac
47
47
  import '../../../animation/joint_dynamics/collision.js';
48
48
  import '../../../animation/joint_dynamics/solver.js';
49
49
  import '../../../animation/joint_dynamics/joint_dynamics_system.js';
50
- import { JSONData, JSONArray } from '../json.js';
50
+ import { JointDynamicsModifier } from '../../../animation/joint_dynamics_modifier.js';
51
+ import { JSONArray, JSONData } from '../json.js';
51
52
  import { parseZABCBlob, attachZABCAnimationsToSceneNode } from '../../../asset/loaders/zabc/zabc_loader.js';
53
+ import { setJointDynamicsModifierSkeleton, getJointDynamicsModifierSkeleton } from './animation.js';
52
54
 
53
55
  const geometryCacheBindings = new WeakMap();
54
56
  function normalizeSerializedSceneNodeData(data) {
@@ -131,7 +133,7 @@ async function clearGeometryCacheBinding(node) {
131
133
  }
132
134
  if (init?.assetId) {
133
135
  const fetchedModel = await manager.fetchModel(init.assetId, scene);
134
- const sceneNode = fetchedModel?.group ?? null;
136
+ const sceneNode = fetchedModel ?? null;
135
137
  if (sceneNode) {
136
138
  const originalAssetId = manager.getAssetId(sceneNode);
137
139
  try {
@@ -158,10 +160,10 @@ async function clearGeometryCacheBinding(node) {
158
160
  };
159
161
  },
160
162
  async getInitParams (obj, flags) {
161
- const prefabId = obj.prefabId;
163
+ let prefabId = obj.prefabId;
162
164
  const assetId = manager.getAssetId(obj);
163
165
  let patch = undefined;
164
- if (prefabId) {
166
+ if (prefabId && guessMimeType(prefabId) === 'application/vnd.zephyr3d.prefab+json') {
165
167
  try {
166
168
  obj.prefabId = '';
167
169
  const prefabData = (await manager.loadPrefabContent(prefabId)).data;
@@ -172,9 +174,11 @@ async function clearGeometryCacheBinding(node) {
172
174
  obj.prefabId = prefabId;
173
175
  }
174
176
  flags.saveProps = false;
177
+ } else {
178
+ prefabId = '';
175
179
  }
176
180
  if (!prefabId && assetId) {
177
- const baseNode = (await manager.fetchModel(assetId, obj.scene))?.group ?? null;
181
+ const baseNode = await manager.fetchModel(assetId, obj.scene) ?? null;
178
182
  if (baseNode) {
179
183
  const originalObjectAssetId = manager.getAssetId(obj);
180
184
  const originalBaseAssetId = manager.getAssetId(baseNode);
@@ -207,6 +211,7 @@ async function clearGeometryCacheBinding(node) {
207
211
  name: 'Id',
208
212
  description: 'Unique persistent id for the node',
209
213
  type: 'string',
214
+ readonly: true,
210
215
  get (value) {
211
216
  value.str[0] = this.persistentId;
212
217
  },
@@ -218,6 +223,7 @@ async function clearGeometryCacheBinding(node) {
218
223
  name: 'PrefabId',
219
224
  description: 'Persistent ID of the prefab source for this node',
220
225
  type: 'string',
226
+ readonly: true,
221
227
  isHidden () {
222
228
  return true;
223
229
  },
@@ -391,6 +397,9 @@ async function clearGeometryCacheBinding(node) {
391
397
  isHidden () {
392
398
  return true;
393
399
  },
400
+ isPersistent () {
401
+ return !this._prefabId || guessMimeType(this._prefabId) === 'application/vnd.zephyr3d.prefab+json';
402
+ },
394
403
  get (value) {
395
404
  value.object = [];
396
405
  for (const child of this.children){
@@ -416,6 +425,33 @@ async function clearGeometryCacheBinding(node) {
416
425
  }
417
426
  }
418
427
  },
428
+ {
429
+ name: 'MorphTargetGroups',
430
+ description: 'Serialized model-level morph target groups for this node',
431
+ type: 'object',
432
+ phase: 10,
433
+ options: {
434
+ objectTypes: [
435
+ JSONArray
436
+ ]
437
+ },
438
+ isHidden () {
439
+ return true;
440
+ },
441
+ isPersistent () {
442
+ return !this._prefabId || guessMimeType(this._prefabId) === 'application/vnd.zephyr3d.prefab+json';
443
+ },
444
+ get (value) {
445
+ const groups = this.getSerializedMorphTargetGroups();
446
+ value.object[0] = groups.length > 0 ? new JSONArray(null, groups) : null;
447
+ },
448
+ set (value) {
449
+ const data = value?.object[0];
450
+ if (data) {
451
+ this.setSerializedMorphTargetGroups(data instanceof JSONArray ? data.data : data);
452
+ }
453
+ }
454
+ },
419
455
  {
420
456
  name: 'GeometryCache',
421
457
  description: 'Alembic geometry cache asset used by this node',
@@ -510,6 +546,9 @@ async function clearGeometryCacheBinding(node) {
510
546
  AnimationClip
511
547
  ]
512
548
  },
549
+ isPersistent () {
550
+ return !this._prefabId || guessMimeType(this._prefabId) === 'application/vnd.zephyr3d.prefab+json';
551
+ },
513
552
  get (value) {
514
553
  const animationSet = this.animationSet;
515
554
  value.object = animationSet.getAnimationNames().map((name)=>animationSet.getAnimationClip(name));
@@ -550,13 +589,47 @@ async function clearGeometryCacheBinding(node) {
550
589
  }
551
590
  },
552
591
  {
553
- name: 'Skeletons',
554
- description: 'Skeleton references used by the node animations',
592
+ name: 'Rigs',
593
+ description: 'Shared skeleton rigs used by the node animations',
555
594
  type: 'object_array',
556
595
  phase: 1,
557
596
  isHidden () {
558
597
  return true;
559
598
  },
599
+ isPersistent () {
600
+ return !this._prefabId || guessMimeType(this._prefabId) === 'application/vnd.zephyr3d.prefab+json';
601
+ },
602
+ get (value) {
603
+ const animationSet = this.animationSet;
604
+ const rigs = new Set(animationSet.rigs.map((v)=>v.get()));
605
+ for (const binding of animationSet.skeletons){
606
+ const rig = binding.get()?.rig;
607
+ if (rig) {
608
+ rigs.add(rig);
609
+ }
610
+ }
611
+ value.object = [
612
+ ...rigs
613
+ ];
614
+ },
615
+ set (value) {
616
+ const animationSet = this.animationSet;
617
+ animationSet.rigs.forEach((v)=>v.dispose());
618
+ animationSet.rigs.splice(0, animationSet.rigs.length);
619
+ animationSet.rigs.push(...value.object.map((v)=>new DRef(v)));
620
+ }
621
+ },
622
+ {
623
+ name: 'Skeletons',
624
+ description: 'Skin bindings used by the node animations',
625
+ type: 'object_array',
626
+ phase: 2,
627
+ isHidden () {
628
+ return true;
629
+ },
630
+ isPersistent () {
631
+ return !this._prefabId || guessMimeType(this._prefabId) === 'application/vnd.zephyr3d.prefab+json';
632
+ },
560
633
  get (value) {
561
634
  const animationSet = this.animationSet;
562
635
  value.object = animationSet.skeletons.map((v)=>v.get());
@@ -566,6 +639,112 @@ async function clearGeometryCacheBinding(node) {
566
639
  animationSet.skeletons.forEach((v)=>v.dispose());
567
640
  animationSet.skeletons.splice(0, animationSet.skeletons.length);
568
641
  animationSet.skeletons.push(...value.object.map((v)=>new DRef(v)));
642
+ for (const binding of animationSet.skeletons){
643
+ const rig = binding.get()?.rig;
644
+ if (rig && !animationSet.rigs.some((ref)=>ref.get() === rig)) {
645
+ animationSet.rigs.push(new DRef(rig));
646
+ }
647
+ }
648
+ }
649
+ },
650
+ {
651
+ name: 'JointDynamics',
652
+ description: 'Joint dynamics systems which affect this object or children',
653
+ type: 'object_array',
654
+ phase: 3,
655
+ readonly: true,
656
+ options: {
657
+ objectTypes: [
658
+ JointDynamicsModifier
659
+ ]
660
+ },
661
+ isPersistent () {
662
+ return !this._prefabId || guessMimeType(this._prefabId) === 'application/vnd.zephyr3d.prefab+json';
663
+ },
664
+ getDefaultValue () {
665
+ const animationSet = this.animationSet;
666
+ const jdm = [];
667
+ const rigs = new Set(animationSet.rigs.map((v)=>v.get()));
668
+ for (const binding of animationSet.skeletons){
669
+ const rig = binding.get()?.rig;
670
+ if (rig) {
671
+ rigs.add(rig);
672
+ }
673
+ }
674
+ for (const sk of rigs){
675
+ for (const mod of sk.modifiers){
676
+ if (mod instanceof JointDynamicsModifier) {
677
+ setJointDynamicsModifierSkeleton(mod, sk);
678
+ jdm.push(mod);
679
+ }
680
+ }
681
+ }
682
+ return jdm;
683
+ },
684
+ get (value) {
685
+ const animationSet = this.animationSet;
686
+ const jdm = [];
687
+ const rigs = new Set(animationSet.rigs.map((v)=>v.get()));
688
+ for (const binding of animationSet.skeletons){
689
+ const rig = binding.get()?.rig;
690
+ if (rig) {
691
+ rigs.add(rig);
692
+ }
693
+ }
694
+ for (const sk of rigs){
695
+ for (const mod of sk.modifiers){
696
+ if (mod instanceof JointDynamicsModifier) {
697
+ setJointDynamicsModifierSkeleton(mod, sk);
698
+ jdm.push(mod);
699
+ }
700
+ }
701
+ }
702
+ value.object = jdm;
703
+ },
704
+ set (value) {
705
+ const animationSet = this.animationSet;
706
+ for (const sk of animationSet.rigs){
707
+ const modifiers = sk.get().modifiers;
708
+ for(let i = modifiers.length - 1; i >= 0; i--){
709
+ if (modifiers[i] instanceof JointDynamicsModifier) {
710
+ modifiers.splice(i, 1);
711
+ }
712
+ }
713
+ }
714
+ for (const mod of value.object){
715
+ if (!(mod instanceof JointDynamicsModifier)) {
716
+ continue;
717
+ }
718
+ const skeleton = getJointDynamicsModifierSkeleton(mod);
719
+ if (skeleton && animationSet.rigs.some((sk)=>sk.get() === skeleton)) {
720
+ skeleton.modifiers.push(mod);
721
+ setJointDynamicsModifierSkeleton(mod, skeleton);
722
+ continue;
723
+ }
724
+ for (const sk of animationSet.rigs){
725
+ if (mod.jointDynamicsSystem.chainConfig.chains.every((chain)=>sk.get().joints.includes(chain.start))) {
726
+ sk.get().modifiers.push(mod);
727
+ setJointDynamicsModifierSkeleton(mod, sk.get());
728
+ break;
729
+ }
730
+ }
731
+ }
732
+ },
733
+ delete (index) {
734
+ const animationSet = this.animationSet;
735
+ let n = 0;
736
+ for (const sk of animationSet.rigs){
737
+ for (const mod of sk.get().modifiers){
738
+ if (mod instanceof JointDynamicsModifier) {
739
+ if (n === index) {
740
+ const index = sk.get().modifiers.indexOf(mod);
741
+ sk.get().modifiers.splice(index, 1);
742
+ return;
743
+ }
744
+ n++;
745
+ }
746
+ }
747
+ }
569
748
  }
570
749
  },
571
750
  {