@combos-fun/plugin-renderer-3d-model 0.0.42 → 0.0.45

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/agent-skill.md CHANGED
@@ -66,6 +66,14 @@ CDN / http URLs belong in `src`, not on `Model3D.resource`. Sidecar files (gltf
66
66
  - Each GameObject gets a cloned scene (`SkeletonUtils.clone`) so two heroes can share one resource.
67
67
  - The `AnimationMixer` is owned by `ThreeContext`; switching `animationIndex` calls `mixer.stopAllAction()` then plays the new clip.
68
68
 
69
+ ### Physics
70
+
71
+ A sibling `Physics3D` on the same GameObject defaults to `collider: 'aabb'` when `type` / `parts` are omitted (bounding box after load, including `scale*`). Use `collider: 'hull'` for convex props, `collider: 'trimesh'` only on **static** scenery (`mass` is forced to 0). Animation does not rebuild the collider. See `@combos-fun/plugin-cannon`.
72
+
73
+ `GameObject.addChild` parents the loaded group under the ancestor `Transform3D` root (or nearest 3D visual). Child `position*` are local.
74
+
75
+ When `Renderer3DSystem({ shadows: true })`, every mesh in the cloned model gets `castShadow` and `receiveShadow`.
76
+
69
77
  ## Common pitfalls
70
78
 
71
79
  | Symptom | Fix |
@@ -329,6 +329,7 @@ let Model3DSystem = class Model3DSystem extends pluginRenderer3d.Renderer3D {
329
329
  constructor() {
330
330
  super(...arguments);
331
331
  this.name = 'Model3DSystem';
332
+ this.poseBridges = new Map();
332
333
  }
333
334
  static { this.systemName = 'Model3DSystem'; }
334
335
  init() {
@@ -347,6 +348,7 @@ let Model3DSystem = class Model3DSystem extends pluginRenderer3d.Renderer3D {
347
348
  }
348
349
  else if (changed.type === engine.OBSERVER_TYPE.REMOVE) {
349
350
  this.increaseAsyncId(changed.gameObject.id);
351
+ this.poseBridges.delete(changed.gameObject.id);
350
352
  this.threeContext.removeModel(changed.gameObject.id);
351
353
  }
352
354
  }
@@ -357,6 +359,18 @@ let Model3DSystem = class Model3DSystem extends pluginRenderer3d.Renderer3D {
357
359
  const model = this.threeContext.models.get(gameObject.id);
358
360
  if (!model)
359
361
  return;
362
+ let bridge = this.poseBridges.get(gameObject.id);
363
+ if (!bridge) {
364
+ bridge = new pluginRenderer3d.VisualPoseBridge();
365
+ this.poseBridges.set(gameObject.id, bridge);
366
+ }
367
+ const transform = gameObject.getComponent(pluginRenderer3d.Transform3D);
368
+ if (!bridge.sync(component, transform)) {
369
+ model.position.set(0, 0, 0);
370
+ model.rotation.set(0, 0, 0);
371
+ model.scale.set(1, 1, 1);
372
+ return;
373
+ }
360
374
  model.position.set(component.positionX, component.positionY, component.positionZ);
361
375
  model.rotation.set(component.rotationX, component.rotationY, component.rotationZ);
362
376
  model.scale.set(component.scaleX, component.scaleY, component.scaleZ);
@@ -365,7 +379,7 @@ let Model3DSystem = class Model3DSystem extends pluginRenderer3d.Renderer3D {
365
379
  if (!component.resource)
366
380
  return;
367
381
  const asyncId = this.increaseAsyncId(gameObject.id);
368
- await this.attachNamedModel(gameObject.id, component.resource);
382
+ await this.attachNamedModel(gameObject, component.resource);
369
383
  if (!this.validateAsyncId(gameObject.id, asyncId))
370
384
  return;
371
385
  if (component.autoPlay) {
@@ -376,11 +390,12 @@ let Model3DSystem = class Model3DSystem extends pluginRenderer3d.Renderer3D {
376
390
  const component = changed.component;
377
391
  const changedProp = changed.prop?.prop?.[0];
378
392
  if (changedProp === 'resource') {
393
+ this.poseBridges.delete(changed.gameObject.id);
379
394
  this.threeContext.removeModel(changed.gameObject.id);
380
395
  if (!component.resource)
381
396
  return;
382
397
  const asyncId = this.increaseAsyncId(changed.gameObject.id);
383
- await this.attachNamedModel(changed.gameObject.id, component.resource);
398
+ await this.attachNamedModel(changed.gameObject, component.resource);
384
399
  if (!this.validateAsyncId(changed.gameObject.id, asyncId))
385
400
  return;
386
401
  if (component.autoPlay) {
@@ -391,7 +406,7 @@ let Model3DSystem = class Model3DSystem extends pluginRenderer3d.Renderer3D {
391
406
  this.threeContext.playAnimation(changed.gameObject.id, component.animationIndex, component.speed);
392
407
  }
393
408
  }
394
- async attachNamedModel(id, name) {
409
+ async attachNamedModel(gameObject, name) {
395
410
  const res = await pluginRenderer3d.requireNamedResource(name);
396
411
  const instance = res.instance;
397
412
  if (!instance || typeof instance.parse !== 'function') {
@@ -399,7 +414,7 @@ let Model3DSystem = class Model3DSystem extends pluginRenderer3d.Renderer3D {
399
414
  }
400
415
  const parsed = await instance.parse(this.threeContext.renderer);
401
416
  const clone = SkeletonUtils_js.clone(parsed.scene);
402
- this.threeContext.attachParsedModel(id, clone, parsed.animations);
417
+ this.threeContext.attachParsedModel(gameObject.id, clone, parsed.animations, gameObject);
403
418
  }
404
419
  };
405
420
  Model3DSystem = tslib.__decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-renderer-3d-model.cjs.js","sources":["../lib/component.ts","../lib/parseModel.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport { Field } from '@combos-fun/inspector-decorator';\n\nexport interface Model3DParams {\n resource?: string;\n autoPlay?: boolean;\n animationIndex?: number;\n speed?: number;\n positionX?: number;\n positionY?: number;\n positionZ?: number;\n rotationX?: number;\n rotationY?: number;\n rotationZ?: number;\n scaleX?: number;\n scaleY?: number;\n scaleZ?: number;\n}\n\nexport default class Model3D extends Component<Model3DParams> {\n static componentName: string = 'Model3D';\n\n @Field({\n\n type: 'string',\n\n group: 'Model3D',\n\n label: 'resource',\n\n description: 'Engine resource name registered with RESOURCE_TYPE.MODEL.',\n\n editor: 'text',\n\n })\n\n resource: string = '';\n @Field({\n type: 'boolean',\n group: 'Model3D',\n label: 'autoPlay',\n description: 'Start playing automatically when loaded.',\n editor: 'toggle',\n })\n autoPlay: boolean = true;\n @Field({\n type: 'number',\n group: 'Model3D',\n label: 'animationIndex',\n description: 'Animation clip index.',\n editor: 'number-stepper',\n })\n animationIndex: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'speed',\n description: 'Playback speed.',\n editor: 'number-stepper',\n })\n speed: number = 1;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'positionX',\n description: 'Local X position.',\n editor: 'number-stepper',\n })\n positionX: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'positionY',\n description: 'Local Y position.',\n editor: 'number-stepper',\n })\n positionY: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'positionZ',\n description: 'Local Z position.',\n editor: 'number-stepper',\n })\n positionZ: number = 0;\n @Field({\n type: 'number',\n step: 0.01,\n group: 'Model3D',\n label: 'rotationX',\n description: 'Rotation around X in radians.',\n editor: 'number-stepper',\n })\n rotationX: number = 0;\n @Field({\n type: 'number',\n step: 0.01,\n group: 'Model3D',\n label: 'rotationY',\n description: 'Rotation around Y in radians.',\n editor: 'number-stepper',\n })\n rotationY: number = 0;\n @Field({\n type: 'number',\n step: 0.01,\n group: 'Model3D',\n label: 'rotationZ',\n description: 'Rotation around Z in radians.',\n editor: 'number-stepper',\n })\n rotationZ: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'scaleX',\n description: 'Scale on X.',\n editor: 'number-stepper',\n })\n scaleX: number = 1;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'scaleY',\n description: 'Scale on Y.',\n editor: 'number-stepper',\n })\n scaleY: number = 1;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'scaleZ',\n description: 'Scale on Z.',\n editor: 'number-stepper',\n })\n scaleZ: number = 1;\n\n init(obj?: Model3DParams) {\n if (obj) Object.assign(this, obj);\n }\n}\n","import { resource, RESOURCE_TYPE } from '@combos-fun/engine';\nimport type { ResourceStruct } from '@combos-fun/engine';\nimport {\n AnimationClip,\n BufferGeometry,\n Group,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n} from 'three';\nimport type { WebGLRenderer } from 'three';\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\nimport { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';\nimport { KTX2Loader } from 'three/addons/loaders/KTX2Loader.js';\nimport { FBXLoader } from 'three/addons/loaders/FBXLoader.js';\nimport { OBJLoader } from 'three/addons/loaders/OBJLoader.js';\nimport { MTLLoader } from 'three/addons/loaders/MTLLoader.js';\nimport { STLLoader } from 'three/addons/loaders/STLLoader.js';\nimport { ColladaLoader } from 'three/addons/loaders/ColladaLoader.js';\nimport { PLYLoader } from 'three/addons/loaders/PLYLoader.js';\nimport { MeshoptDecoder } from 'three/addons/libs/meshopt_decoder.module.js';\n\nexport interface ParsedModel {\n scene: Group;\n animations: AnimationClip[];\n}\n\nexport interface ModelResourceInstance {\n parse(renderer?: WebGLRenderer): Promise<ParsedModel>;\n dispose(): void;\n}\n\nconst THREE_ADDON_CDN = 'https://unpkg.com/three@0.172.0/examples/jsm/libs';\nconst DRACO_DECODER_PATH = 'https://www.gstatic.com/draco/versioned/decoders/1.5.7/';\nconst BASIS_TRANSCODER_PATH = `${THREE_ADDON_CDN}/basis/`;\n\nlet sharedDraco: DRACOLoader | null = null;\nlet sharedKtx2: KTX2Loader | null = null;\nlet ktx2DetectedFor: WebGLRenderer | null = null;\n\nfunction dirOf(url: string): string {\n const clean = String(url || '').split('?')[0].split('#')[0];\n const slash = clean.lastIndexOf('/');\n return slash >= 0 ? clean.slice(0, slash + 1) : '';\n}\n\nfunction asText(data: unknown): string {\n if (typeof data === 'string') return data;\n if (data instanceof ArrayBuffer) return new TextDecoder().decode(data);\n if (ArrayBuffer.isView(data)) {\n return new TextDecoder().decode(data as ArrayBufferView);\n }\n if (data && typeof data === 'object') return JSON.stringify(data);\n throw new Error('expected text payload for this model format');\n}\n\nfunction asBuffer(data: unknown): ArrayBuffer {\n if (data instanceof ArrayBuffer) return data;\n if (ArrayBuffer.isView(data)) {\n const view = data as ArrayBufferView;\n return view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength);\n }\n throw new Error('expected binary payload for this model format');\n}\n\nfunction wrapGroup(object: Object3D, animations: AnimationClip[] = []): ParsedModel {\n if (object instanceof Group) {\n return { scene: object, animations };\n }\n const scene = new Group();\n scene.add(object);\n return { scene, animations };\n}\n\nfunction geometryToModel(geometry: BufferGeometry): ParsedModel {\n geometry.computeVertexNormals?.();\n const mesh = new Mesh(\n geometry,\n new MeshStandardMaterial({ color: 0x888888, metalness: 0.1, roughness: 0.8 }),\n );\n const scene = new Group();\n scene.add(mesh);\n return { scene, animations: [] };\n}\n\nfunction modelPayload(res: ResourceStruct): { data: unknown; type: string; path: string } {\n const slot = res.src?.model || res.src?.glb || res.src?.gltf;\n const data = res.data?.model ?? res.data?.glb ?? res.data?.gltf;\n if (data == null) {\n throw new Error(\n `Resource \"${res.name}\" has no model data; use RESOURCE_TYPE.MODEL with src.model.url`,\n );\n }\n const type = String(slot?.type || 'glb').toLowerCase();\n return { data, type, path: dirOf(slot?.url || '') };\n}\n\nfunction ensureGltfExtras(loader: GLTFLoader, renderer?: WebGLRenderer) {\n if (!sharedDraco) {\n sharedDraco = new DRACOLoader();\n sharedDraco.setDecoderPath(DRACO_DECODER_PATH);\n }\n loader.setDRACOLoader(sharedDraco);\n\n if (!sharedKtx2) {\n sharedKtx2 = new KTX2Loader();\n sharedKtx2.setTranscoderPath(BASIS_TRANSCODER_PATH);\n }\n if (renderer && ktx2DetectedFor !== renderer) {\n sharedKtx2.detectSupport(renderer);\n ktx2DetectedFor = renderer;\n }\n loader.setKTX2Loader(sharedKtx2);\n loader.setMeshoptDecoder(MeshoptDecoder);\n}\n\nfunction parseGltf(\n data: unknown,\n path: string,\n renderer?: WebGLRenderer,\n): Promise<ParsedModel> {\n const loader = new GLTFLoader();\n ensureGltfExtras(loader, renderer);\n const payload =\n typeof data === 'object' && data && !(data instanceof ArrayBuffer) && !ArrayBuffer.isView(data)\n ? JSON.stringify(data)\n : data instanceof ArrayBuffer || ArrayBuffer.isView(data)\n ? asBuffer(data)\n : asText(data);\n\n return new Promise((resolve, reject) => {\n loader.parse(\n payload as ArrayBuffer | string,\n path,\n (gltf) => {\n resolve(wrapGroup(gltf.scene, gltf.animations || []));\n },\n (err) => {\n reject(err instanceof Error ? err : new Error(String(err)));\n },\n );\n });\n}\n\nasync function parseFbx(data: unknown, path: string): Promise<ParsedModel> {\n const loader = new FBXLoader();\n const object = loader.parse(asBuffer(data), path);\n const animations = (object.animations || []) as AnimationClip[];\n return wrapGroup(object, animations);\n}\n\nasync function parseObj(res: ResourceStruct, data: unknown, path: string): Promise<ParsedModel> {\n const objLoader = new OBJLoader();\n const mtlText = res.data?.mtl;\n if (mtlText != null) {\n const mtlLoader = new MTLLoader();\n const mtlPath = dirOf(res.src?.mtl?.url || '') || path;\n const materials = mtlLoader.parse(asText(mtlText), mtlPath);\n materials.preload();\n objLoader.setMaterials(materials);\n }\n return wrapGroup(objLoader.parse(asText(data)));\n}\n\nasync function parseCollada(data: unknown, path: string): Promise<ParsedModel> {\n const loader = new ColladaLoader();\n const result = loader.parse(asText(data), path);\n return wrapGroup(result.scene, result.animations || []);\n}\n\nexport async function parseModelResource(\n res: ResourceStruct,\n renderer?: WebGLRenderer,\n): Promise<ParsedModel> {\n const { data, type, path } = modelPayload(res);\n switch (type) {\n case 'glb':\n case 'gltf':\n return parseGltf(data, path, renderer);\n case 'fbx':\n return parseFbx(data, path);\n case 'obj':\n return parseObj(res, data, path);\n case 'stl':\n return geometryToModel(new STLLoader().parse(asBuffer(data)));\n case 'ply':\n return geometryToModel(new PLYLoader().parse(asBuffer(data)));\n case 'dae':\n case 'collada':\n return parseCollada(data, path);\n default:\n throw new Error(\n `Unsupported 3D model type \"${type}\" for resource \"${res.name}\". ` +\n 'Use glb, gltf, fbx, obj, stl, dae, or ply.',\n );\n }\n}\n\nfunction createModelInstance(res: ResourceStruct): ModelResourceInstance {\n let cached: ParsedModel | null = null;\n return {\n async parse(renderer?: WebGLRenderer) {\n if (!cached) {\n cached = await parseModelResource(res, renderer);\n }\n return cached;\n },\n dispose() {\n cached = null;\n },\n };\n}\n\nresource.registerInstance(RESOURCE_TYPE.MODEL, (res) => createModelInstance(res));\nresource.registerInstance(RESOURCE_TYPE.GLB, (res) => createModelInstance(res));\nresource.registerDestroy(RESOURCE_TYPE.MODEL, ({ instance }) => {\n instance?.dispose?.();\n});\nresource.registerDestroy(RESOURCE_TYPE.GLB, ({ instance }) => {\n instance?.dispose?.();\n});\n","import { decorators, ComponentChanged, OBSERVER_TYPE, GameObject } from '@combos-fun/engine';\nimport {\n Renderer3D,\n Renderer3DSystem,\n requireNamedResource,\n} from '@combos-fun/plugin-renderer-3d';\nimport { Group } from 'three';\nimport { clone as cloneSkinned } from 'three/addons/utils/SkeletonUtils.js';\nimport Model3D from './component';\nimport './parseModel';\nimport type { ModelResourceInstance } from './parseModel';\n\n@decorators.componentObserver({\n Model3D: [\n 'resource',\n 'positionX', 'positionY', 'positionZ',\n 'rotationX', 'rotationY', 'rotationZ',\n 'scaleX', 'scaleY', 'scaleZ',\n 'speed', 'animationIndex',\n ],\n})\nexport default class Model3DSystem extends Renderer3D {\n static systemName = 'Model3DSystem';\n name: string = 'Model3DSystem';\n\n init() {\n const renderer3DSystem = this.game.getSystem(Renderer3DSystem) as Renderer3DSystem;\n renderer3DSystem.rendererManager.register(this);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Model3D') return;\n\n const component = changed.component as Model3D;\n\n if (changed.type === OBSERVER_TYPE.ADD) {\n this.handleAdd(changed.gameObject, component);\n } else if (changed.type === OBSERVER_TYPE.CHANGE) {\n this.handleChange(changed);\n } else if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.increaseAsyncId(changed.gameObject.id);\n this.threeContext.removeModel(changed.gameObject.id);\n }\n }\n\n rendererUpdate(gameObject: GameObject) {\n const component = gameObject.getComponent(Model3D) as Model3D;\n if (!component) return;\n\n const model = this.threeContext.models.get(gameObject.id);\n if (!model) return;\n\n model.position.set(component.positionX, component.positionY, component.positionZ);\n model.rotation.set(component.rotationX, component.rotationY, component.rotationZ);\n model.scale.set(component.scaleX, component.scaleY, component.scaleZ);\n }\n\n private async handleAdd(gameObject: GameObject, component: Model3D) {\n if (!component.resource) return;\n\n const asyncId = this.increaseAsyncId(gameObject.id);\n await this.attachNamedModel(gameObject.id, component.resource);\n if (!this.validateAsyncId(gameObject.id, asyncId)) return;\n\n if (component.autoPlay) {\n this.threeContext.playAnimation(\n gameObject.id,\n component.animationIndex,\n component.speed,\n );\n }\n }\n\n private async handleChange(changed: ComponentChanged) {\n const component = changed.component as Model3D;\n const changedProp = changed.prop?.prop?.[0];\n\n if (changedProp === 'resource') {\n this.threeContext.removeModel(changed.gameObject.id);\n if (!component.resource) return;\n\n const asyncId = this.increaseAsyncId(changed.gameObject.id);\n await this.attachNamedModel(changed.gameObject.id, component.resource);\n if (!this.validateAsyncId(changed.gameObject.id, asyncId)) return;\n\n if (component.autoPlay) {\n this.threeContext.playAnimation(\n changed.gameObject.id,\n component.animationIndex,\n component.speed,\n );\n }\n }\n\n if (changedProp === 'speed' || changedProp === 'animationIndex') {\n this.threeContext.playAnimation(\n changed.gameObject.id,\n component.animationIndex,\n component.speed,\n );\n }\n }\n\n private async attachNamedModel(id: number, name: string) {\n const res = await requireNamedResource(name);\n const instance = res.instance as ModelResourceInstance | undefined;\n if (!instance || typeof instance.parse !== 'function') {\n throw new Error(\n `Resource \"${name}\" is not a MODEL instance; register RESOURCE_TYPE.MODEL and import Model3DSystem`,\n );\n }\n const parsed = await instance.parse(this.threeContext.renderer);\n const clone = cloneSkinned(parsed.scene) as Group;\n this.threeContext.attachParsedModel(id, clone, parsed.animations);\n }\n}\n"],"names":["Component","__decorate","Field","Group","Mesh","MeshStandardMaterial","DRACOLoader","KTX2Loader","MeshoptDecoder","GLTFLoader","FBXLoader","OBJLoader","MTLLoader","ColladaLoader","STLLoader","PLYLoader","resource","RESOURCE_TYPE","Renderer3D","Renderer3DSystem","OBSERVER_TYPE","requireNamedResource","cloneSkinned","decorators"],"mappings":"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"}
1
+ {"version":3,"file":"plugin-renderer-3d-model.cjs.js","sources":["../lib/component.ts","../lib/parseModel.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport { Field } from '@combos-fun/inspector-decorator';\n\nexport interface Model3DParams {\n resource?: string;\n autoPlay?: boolean;\n animationIndex?: number;\n speed?: number;\n positionX?: number;\n positionY?: number;\n positionZ?: number;\n rotationX?: number;\n rotationY?: number;\n rotationZ?: number;\n scaleX?: number;\n scaleY?: number;\n scaleZ?: number;\n}\n\nexport default class Model3D extends Component<Model3DParams> {\n static componentName: string = 'Model3D';\n\n @Field({\n\n type: 'string',\n\n group: 'Model3D',\n\n label: 'resource',\n\n description: 'Engine resource name registered with RESOURCE_TYPE.MODEL.',\n\n editor: 'text',\n\n })\n\n resource: string = '';\n @Field({\n type: 'boolean',\n group: 'Model3D',\n label: 'autoPlay',\n description: 'Start playing automatically when loaded.',\n editor: 'toggle',\n })\n autoPlay: boolean = true;\n @Field({\n type: 'number',\n group: 'Model3D',\n label: 'animationIndex',\n description: 'Animation clip index.',\n editor: 'number-stepper',\n })\n animationIndex: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'speed',\n description: 'Playback speed.',\n editor: 'number-stepper',\n })\n speed: number = 1;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'positionX',\n description: 'Local X position.',\n editor: 'number-stepper',\n })\n positionX: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'positionY',\n description: 'Local Y position.',\n editor: 'number-stepper',\n })\n positionY: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'positionZ',\n description: 'Local Z position.',\n editor: 'number-stepper',\n })\n positionZ: number = 0;\n @Field({\n type: 'number',\n step: 0.01,\n group: 'Model3D',\n label: 'rotationX',\n description: 'Rotation around X in radians.',\n editor: 'number-stepper',\n })\n rotationX: number = 0;\n @Field({\n type: 'number',\n step: 0.01,\n group: 'Model3D',\n label: 'rotationY',\n description: 'Rotation around Y in radians.',\n editor: 'number-stepper',\n })\n rotationY: number = 0;\n @Field({\n type: 'number',\n step: 0.01,\n group: 'Model3D',\n label: 'rotationZ',\n description: 'Rotation around Z in radians.',\n editor: 'number-stepper',\n })\n rotationZ: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'scaleX',\n description: 'Scale on X.',\n editor: 'number-stepper',\n })\n scaleX: number = 1;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'scaleY',\n description: 'Scale on Y.',\n editor: 'number-stepper',\n })\n scaleY: number = 1;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'scaleZ',\n description: 'Scale on Z.',\n editor: 'number-stepper',\n })\n scaleZ: number = 1;\n\n init(obj?: Model3DParams) {\n if (obj) Object.assign(this, obj);\n }\n}\n","import { resource, RESOURCE_TYPE } from '@combos-fun/engine';\nimport type { ResourceStruct } from '@combos-fun/engine';\nimport {\n AnimationClip,\n BufferGeometry,\n Group,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n} from 'three';\nimport type { WebGLRenderer } from 'three';\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\nimport { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';\nimport { KTX2Loader } from 'three/addons/loaders/KTX2Loader.js';\nimport { FBXLoader } from 'three/addons/loaders/FBXLoader.js';\nimport { OBJLoader } from 'three/addons/loaders/OBJLoader.js';\nimport { MTLLoader } from 'three/addons/loaders/MTLLoader.js';\nimport { STLLoader } from 'three/addons/loaders/STLLoader.js';\nimport { ColladaLoader } from 'three/addons/loaders/ColladaLoader.js';\nimport { PLYLoader } from 'three/addons/loaders/PLYLoader.js';\nimport { MeshoptDecoder } from 'three/addons/libs/meshopt_decoder.module.js';\n\nexport interface ParsedModel {\n scene: Group;\n animations: AnimationClip[];\n}\n\nexport interface ModelResourceInstance {\n parse(renderer?: WebGLRenderer): Promise<ParsedModel>;\n dispose(): void;\n}\n\nconst THREE_ADDON_CDN = 'https://unpkg.com/three@0.172.0/examples/jsm/libs';\nconst DRACO_DECODER_PATH = 'https://www.gstatic.com/draco/versioned/decoders/1.5.7/';\nconst BASIS_TRANSCODER_PATH = `${THREE_ADDON_CDN}/basis/`;\n\nlet sharedDraco: DRACOLoader | null = null;\nlet sharedKtx2: KTX2Loader | null = null;\nlet ktx2DetectedFor: WebGLRenderer | null = null;\n\nfunction dirOf(url: string): string {\n const clean = String(url || '').split('?')[0].split('#')[0];\n const slash = clean.lastIndexOf('/');\n return slash >= 0 ? clean.slice(0, slash + 1) : '';\n}\n\nfunction asText(data: unknown): string {\n if (typeof data === 'string') return data;\n if (data instanceof ArrayBuffer) return new TextDecoder().decode(data);\n if (ArrayBuffer.isView(data)) {\n return new TextDecoder().decode(data as ArrayBufferView);\n }\n if (data && typeof data === 'object') return JSON.stringify(data);\n throw new Error('expected text payload for this model format');\n}\n\nfunction asBuffer(data: unknown): ArrayBuffer {\n if (data instanceof ArrayBuffer) return data;\n if (ArrayBuffer.isView(data)) {\n const view = data as ArrayBufferView;\n return view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength);\n }\n throw new Error('expected binary payload for this model format');\n}\n\nfunction wrapGroup(object: Object3D, animations: AnimationClip[] = []): ParsedModel {\n if (object instanceof Group) {\n return { scene: object, animations };\n }\n const scene = new Group();\n scene.add(object);\n return { scene, animations };\n}\n\nfunction geometryToModel(geometry: BufferGeometry): ParsedModel {\n geometry.computeVertexNormals?.();\n const mesh = new Mesh(\n geometry,\n new MeshStandardMaterial({ color: 0x888888, metalness: 0.1, roughness: 0.8 }),\n );\n const scene = new Group();\n scene.add(mesh);\n return { scene, animations: [] };\n}\n\nfunction modelPayload(res: ResourceStruct): { data: unknown; type: string; path: string } {\n const slot = res.src?.model || res.src?.glb || res.src?.gltf;\n const data = res.data?.model ?? res.data?.glb ?? res.data?.gltf;\n if (data == null) {\n throw new Error(\n `Resource \"${res.name}\" has no model data; use RESOURCE_TYPE.MODEL with src.model.url`,\n );\n }\n const type = String(slot?.type || 'glb').toLowerCase();\n return { data, type, path: dirOf(slot?.url || '') };\n}\n\nfunction ensureGltfExtras(loader: GLTFLoader, renderer?: WebGLRenderer) {\n if (!sharedDraco) {\n sharedDraco = new DRACOLoader();\n sharedDraco.setDecoderPath(DRACO_DECODER_PATH);\n }\n loader.setDRACOLoader(sharedDraco);\n\n if (!sharedKtx2) {\n sharedKtx2 = new KTX2Loader();\n sharedKtx2.setTranscoderPath(BASIS_TRANSCODER_PATH);\n }\n if (renderer && ktx2DetectedFor !== renderer) {\n sharedKtx2.detectSupport(renderer);\n ktx2DetectedFor = renderer;\n }\n loader.setKTX2Loader(sharedKtx2);\n loader.setMeshoptDecoder(MeshoptDecoder);\n}\n\nfunction parseGltf(\n data: unknown,\n path: string,\n renderer?: WebGLRenderer,\n): Promise<ParsedModel> {\n const loader = new GLTFLoader();\n ensureGltfExtras(loader, renderer);\n const payload =\n typeof data === 'object' && data && !(data instanceof ArrayBuffer) && !ArrayBuffer.isView(data)\n ? JSON.stringify(data)\n : data instanceof ArrayBuffer || ArrayBuffer.isView(data)\n ? asBuffer(data)\n : asText(data);\n\n return new Promise((resolve, reject) => {\n loader.parse(\n payload as ArrayBuffer | string,\n path,\n (gltf) => {\n resolve(wrapGroup(gltf.scene, gltf.animations || []));\n },\n (err) => {\n reject(err instanceof Error ? err : new Error(String(err)));\n },\n );\n });\n}\n\nasync function parseFbx(data: unknown, path: string): Promise<ParsedModel> {\n const loader = new FBXLoader();\n const object = loader.parse(asBuffer(data), path);\n const animations = (object.animations || []) as AnimationClip[];\n return wrapGroup(object, animations);\n}\n\nasync function parseObj(res: ResourceStruct, data: unknown, path: string): Promise<ParsedModel> {\n const objLoader = new OBJLoader();\n const mtlText = res.data?.mtl;\n if (mtlText != null) {\n const mtlLoader = new MTLLoader();\n const mtlPath = dirOf(res.src?.mtl?.url || '') || path;\n const materials = mtlLoader.parse(asText(mtlText), mtlPath);\n materials.preload();\n objLoader.setMaterials(materials);\n }\n return wrapGroup(objLoader.parse(asText(data)));\n}\n\nasync function parseCollada(data: unknown, path: string): Promise<ParsedModel> {\n const loader = new ColladaLoader();\n const result = loader.parse(asText(data), path);\n return wrapGroup(result.scene, result.animations || []);\n}\n\nexport async function parseModelResource(\n res: ResourceStruct,\n renderer?: WebGLRenderer,\n): Promise<ParsedModel> {\n const { data, type, path } = modelPayload(res);\n switch (type) {\n case 'glb':\n case 'gltf':\n return parseGltf(data, path, renderer);\n case 'fbx':\n return parseFbx(data, path);\n case 'obj':\n return parseObj(res, data, path);\n case 'stl':\n return geometryToModel(new STLLoader().parse(asBuffer(data)));\n case 'ply':\n return geometryToModel(new PLYLoader().parse(asBuffer(data)));\n case 'dae':\n case 'collada':\n return parseCollada(data, path);\n default:\n throw new Error(\n `Unsupported 3D model type \"${type}\" for resource \"${res.name}\". ` +\n 'Use glb, gltf, fbx, obj, stl, dae, or ply.',\n );\n }\n}\n\nfunction createModelInstance(res: ResourceStruct): ModelResourceInstance {\n let cached: ParsedModel | null = null;\n return {\n async parse(renderer?: WebGLRenderer) {\n if (!cached) {\n cached = await parseModelResource(res, renderer);\n }\n return cached;\n },\n dispose() {\n cached = null;\n },\n };\n}\n\nresource.registerInstance(RESOURCE_TYPE.MODEL, (res) => createModelInstance(res));\nresource.registerInstance(RESOURCE_TYPE.GLB, (res) => createModelInstance(res));\nresource.registerDestroy(RESOURCE_TYPE.MODEL, ({ instance }) => {\n instance?.dispose?.();\n});\nresource.registerDestroy(RESOURCE_TYPE.GLB, ({ instance }) => {\n instance?.dispose?.();\n});\n","import { decorators, ComponentChanged, OBSERVER_TYPE, GameObject } from '@combos-fun/engine';\nimport {\n Renderer3D,\n Renderer3DSystem,\n requireNamedResource,\n Transform3D,\n VisualPoseBridge,\n} from '@combos-fun/plugin-renderer-3d';\nimport { Group } from 'three';\nimport { clone as cloneSkinned } from 'three/addons/utils/SkeletonUtils.js';\nimport Model3D from './component';\nimport './parseModel';\nimport type { ModelResourceInstance } from './parseModel';\n\n@decorators.componentObserver({\n Model3D: [\n 'resource',\n 'positionX', 'positionY', 'positionZ',\n 'rotationX', 'rotationY', 'rotationZ',\n 'scaleX', 'scaleY', 'scaleZ',\n 'speed', 'animationIndex',\n ],\n})\nexport default class Model3DSystem extends Renderer3D {\n static systemName = 'Model3DSystem';\n name: string = 'Model3DSystem';\n\n private poseBridges = new Map<number, VisualPoseBridge>();\n\n init() {\n const renderer3DSystem = this.game.getSystem(Renderer3DSystem) as Renderer3DSystem;\n renderer3DSystem.rendererManager.register(this);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Model3D') return;\n\n const component = changed.component as Model3D;\n\n if (changed.type === OBSERVER_TYPE.ADD) {\n this.handleAdd(changed.gameObject, component);\n } else if (changed.type === OBSERVER_TYPE.CHANGE) {\n this.handleChange(changed);\n } else if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.increaseAsyncId(changed.gameObject.id);\n this.poseBridges.delete(changed.gameObject.id);\n this.threeContext.removeModel(changed.gameObject.id);\n }\n }\n\n rendererUpdate(gameObject: GameObject) {\n const component = gameObject.getComponent(Model3D) as Model3D;\n if (!component) return;\n\n const model = this.threeContext.models.get(gameObject.id);\n if (!model) return;\n\n let bridge = this.poseBridges.get(gameObject.id);\n if (!bridge) {\n bridge = new VisualPoseBridge();\n this.poseBridges.set(gameObject.id, bridge);\n }\n const transform = gameObject.getComponent(Transform3D) as Transform3D | undefined;\n if (!bridge.sync(component, transform)) {\n model.position.set(0, 0, 0);\n model.rotation.set(0, 0, 0);\n model.scale.set(1, 1, 1);\n return;\n }\n\n model.position.set(component.positionX, component.positionY, component.positionZ);\n model.rotation.set(component.rotationX, component.rotationY, component.rotationZ);\n model.scale.set(component.scaleX, component.scaleY, component.scaleZ);\n }\n\n private async handleAdd(gameObject: GameObject, component: Model3D) {\n if (!component.resource) return;\n\n const asyncId = this.increaseAsyncId(gameObject.id);\n await this.attachNamedModel(gameObject, component.resource);\n if (!this.validateAsyncId(gameObject.id, asyncId)) return;\n\n if (component.autoPlay) {\n this.threeContext.playAnimation(\n gameObject.id,\n component.animationIndex,\n component.speed,\n );\n }\n }\n\n private async handleChange(changed: ComponentChanged) {\n const component = changed.component as Model3D;\n const changedProp = changed.prop?.prop?.[0];\n\n if (changedProp === 'resource') {\n this.poseBridges.delete(changed.gameObject.id);\n this.threeContext.removeModel(changed.gameObject.id);\n if (!component.resource) return;\n\n const asyncId = this.increaseAsyncId(changed.gameObject.id);\n await this.attachNamedModel(changed.gameObject, component.resource);\n if (!this.validateAsyncId(changed.gameObject.id, asyncId)) return;\n\n if (component.autoPlay) {\n this.threeContext.playAnimation(\n changed.gameObject.id,\n component.animationIndex,\n component.speed,\n );\n }\n }\n\n if (changedProp === 'speed' || changedProp === 'animationIndex') {\n this.threeContext.playAnimation(\n changed.gameObject.id,\n component.animationIndex,\n component.speed,\n );\n }\n }\n\n private async attachNamedModel(gameObject: GameObject, name: string) {\n const res = await requireNamedResource(name);\n const instance = res.instance as ModelResourceInstance | undefined;\n if (!instance || typeof instance.parse !== 'function') {\n throw new Error(\n `Resource \"${name}\" is not a MODEL instance; register RESOURCE_TYPE.MODEL and import Model3DSystem`,\n );\n }\n const parsed = await instance.parse(this.threeContext.renderer);\n const clone = cloneSkinned(parsed.scene) as Group;\n this.threeContext.attachParsedModel(gameObject.id, clone, parsed.animations, gameObject);\n }\n}\n"],"names":["Component","__decorate","Field","Group","Mesh","MeshStandardMaterial","DRACOLoader","KTX2Loader","MeshoptDecoder","GLTFLoader","FBXLoader","OBJLoader","MTLLoader","ColladaLoader","STLLoader","PLYLoader","resource","RESOURCE_TYPE","Renderer3D","Renderer3DSystem","OBSERVER_TYPE","VisualPoseBridge","Transform3D","requireNamedResource","cloneSkinned","decorators"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBc,MAAO,OAAQ,SAAQA,gBAAwB,CAAA;AAA7D,IAAA,WAAA,GAAA;;QAiBE,IAAA,CAAA,QAAQ,GAAW,EAAE;QAQrB,IAAA,CAAA,QAAQ,GAAY,IAAI;QAQxB,IAAA,CAAA,cAAc,GAAW,CAAC;QAS1B,IAAA,CAAA,KAAK,GAAW,CAAC;QASjB,IAAA,CAAA,SAAS,GAAW,CAAC;QASrB,IAAA,CAAA,SAAS,GAAW,CAAC;QASrB,IAAA,CAAA,SAAS,GAAW,CAAC;QASrB,IAAA,CAAA,SAAS,GAAW,CAAC;QASrB,IAAA,CAAA,SAAS,GAAW,CAAC;QASrB,IAAA,CAAA,SAAS,GAAW,CAAC;QASrB,IAAA,CAAA,MAAM,GAAW,CAAC;QASlB,IAAA,CAAA,MAAM,GAAW,CAAC;QASlB,IAAA,CAAA,MAAM,GAAW,CAAC;IAKpB;aA/HS,IAAA,CAAA,aAAa,GAAW,SAAX,CAAqB;AA4HzC,IAAA,IAAI,CAAC,GAAmB,EAAA;AACtB,QAAA,IAAI,GAAG;AAAE,YAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC;IACnC;;AA9GAC,gBAAA,CAAA;AAdC,IAAAC,wBAAK,CAAC;AAEL,QAAA,IAAI,EAAE,QAAQ;AAEd,QAAA,KAAK,EAAE,SAAS;AAEhB,QAAA,KAAK,EAAE,UAAU;AAEjB,QAAA,WAAW,EAAE,2DAA2D;AAExE,QAAA,MAAM,EAAE,MAAM;KAEf;AAEqB,CAAA,EAAA,OAAA,CAAA,SAAA,EAAA,UAAA,EAAA,MAAA,CAAA;AAQtBD,gBAAA,CAAA;AAPC,IAAAC,wBAAK,CAAC;AACL,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,WAAW,EAAE,0CAA0C;AACvD,QAAA,MAAM,EAAE,QAAQ;KACjB;AACwB,CAAA,EAAA,OAAA,CAAA,SAAA,EAAA,UAAA,EAAA,MAAA,CAAA;AAQzBD,gBAAA,CAAA;AAPC,IAAAC,wBAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,gBAAgB;AACvB,QAAA,WAAW,EAAE,uBAAuB;AACpC,QAAA,MAAM,EAAE,gBAAgB;KACzB;AAC0B,CAAA,EAAA,OAAA,CAAA,SAAA,EAAA,gBAAA,EAAA,MAAA,CAAA;AAS3BD,gBAAA,CAAA;AARC,IAAAC,wBAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,WAAW,EAAE,iBAAiB;AAC9B,QAAA,MAAM,EAAE,gBAAgB;KACzB;AACiB,CAAA,EAAA,OAAA,CAAA,SAAA,EAAA,OAAA,EAAA,MAAA,CAAA;AASlBD,gBAAA,CAAA;AARC,IAAAC,wBAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,WAAW,EAAE,mBAAmB;AAChC,QAAA,MAAM,EAAE,gBAAgB;KACzB;AACqB,CAAA,EAAA,OAAA,CAAA,SAAA,EAAA,WAAA,EAAA,MAAA,CAAA;AAStBD,gBAAA,CAAA;AARC,IAAAC,wBAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,WAAW,EAAE,mBAAmB;AAChC,QAAA,MAAM,EAAE,gBAAgB;KACzB;AACqB,CAAA,EAAA,OAAA,CAAA,SAAA,EAAA,WAAA,EAAA,MAAA,CAAA;AAStBD,gBAAA,CAAA;AARC,IAAAC,wBAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,WAAW,EAAE,mBAAmB;AAChC,QAAA,MAAM,EAAE,gBAAgB;KACzB;AACqB,CAAA,EAAA,OAAA,CAAA,SAAA,EAAA,WAAA,EAAA,MAAA,CAAA;AAStBD,gBAAA,CAAA;AARC,IAAAC,wBAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,WAAW,EAAE,+BAA+B;AAC5C,QAAA,MAAM,EAAE,gBAAgB;KACzB;AACqB,CAAA,EAAA,OAAA,CAAA,SAAA,EAAA,WAAA,EAAA,MAAA,CAAA;AAStBD,gBAAA,CAAA;AARC,IAAAC,wBAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,WAAW,EAAE,+BAA+B;AAC5C,QAAA,MAAM,EAAE,gBAAgB;KACzB;AACqB,CAAA,EAAA,OAAA,CAAA,SAAA,EAAA,WAAA,EAAA,MAAA,CAAA;AAStBD,gBAAA,CAAA;AARC,IAAAC,wBAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,WAAW,EAAE,+BAA+B;AAC5C,QAAA,MAAM,EAAE,gBAAgB;KACzB;AACqB,CAAA,EAAA,OAAA,CAAA,SAAA,EAAA,WAAA,EAAA,MAAA,CAAA;AAStBD,gBAAA,CAAA;AARC,IAAAC,wBAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,WAAW,EAAE,aAAa;AAC1B,QAAA,MAAM,EAAE,gBAAgB;KACzB;AACkB,CAAA,EAAA,OAAA,CAAA,SAAA,EAAA,QAAA,EAAA,MAAA,CAAA;AASnBD,gBAAA,CAAA;AARC,IAAAC,wBAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,WAAW,EAAE,aAAa;AAC1B,QAAA,MAAM,EAAE,gBAAgB;KACzB;AACkB,CAAA,EAAA,OAAA,CAAA,SAAA,EAAA,QAAA,EAAA,MAAA,CAAA;AASnBD,gBAAA,CAAA;AARC,IAAAC,wBAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,IAAI,EAAE,GAAG;AACT,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,WAAW,EAAE,aAAa;AAC1B,QAAA,MAAM,EAAE,gBAAgB;KACzB;AACkB,CAAA,EAAA,OAAA,CAAA,SAAA,EAAA,QAAA,EAAA,MAAA,CAAA;;AC9GrB,MAAM,eAAe,GAAG,mDAAmD;AAC3E,MAAM,kBAAkB,GAAG,yDAAyD;AACpF,MAAM,qBAAqB,GAAG,CAAA,EAAG,eAAe,SAAS;AAEzD,IAAI,WAAW,GAAuB,IAAI;AAC1C,IAAI,UAAU,GAAsB,IAAI;AACxC,IAAI,eAAe,GAAyB,IAAI;AAEhD,SAAS,KAAK,CAAC,GAAW,EAAA;IACxB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;IACpC,OAAO,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE;AACpD;AAEA,SAAS,MAAM,CAAC,IAAa,EAAA;IAC3B,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,IAAI;IACzC,IAAI,IAAI,YAAY,WAAW;QAAE,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;AACtE,IAAA,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC5B,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAuB,CAAC;IAC1D;AACA,IAAA,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AACjE,IAAA,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC;AAChE;AAEA,SAAS,QAAQ,CAAC,IAAa,EAAA;IAC7B,IAAI,IAAI,YAAY,WAAW;AAAE,QAAA,OAAO,IAAI;AAC5C,IAAA,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QAC5B,MAAM,IAAI,GAAG,IAAuB;AACpC,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IAC9E;AACA,IAAA,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC;AAClE;AAEA,SAAS,SAAS,CAAC,MAAgB,EAAE,aAA8B,EAAE,EAAA;AACnE,IAAA,IAAI,MAAM,YAAYC,WAAK,EAAE;AAC3B,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE;IACtC;AACA,IAAA,MAAM,KAAK,GAAG,IAAIA,WAAK,EAAE;AACzB,IAAA,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;AACjB,IAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE;AAC9B;AAEA,SAAS,eAAe,CAAC,QAAwB,EAAA;AAC/C,IAAA,QAAQ,CAAC,oBAAoB,IAAI;IACjC,MAAM,IAAI,GAAG,IAAIC,UAAI,CACnB,QAAQ,EACR,IAAIC,0BAAoB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAC9E;AACD,IAAA,MAAM,KAAK,GAAG,IAAIF,WAAK,EAAE;AACzB,IAAA,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACf,IAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE;AAClC;AAEA,SAAS,YAAY,CAAC,GAAmB,EAAA;AACvC,IAAA,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,IAAI,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI;AAC5D,IAAA,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI;AAC/D,IAAA,IAAI,IAAI,IAAI,IAAI,EAAE;QAChB,MAAM,IAAI,KAAK,CACb,CAAA,UAAA,EAAa,GAAG,CAAC,IAAI,CAAA,+DAAA,CAAiE,CACvF;IACH;AACA,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE;AACtD,IAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE;AACrD;AAEA,SAAS,gBAAgB,CAAC,MAAkB,EAAE,QAAwB,EAAA;IACpE,IAAI,CAAC,WAAW,EAAE;AAChB,QAAA,WAAW,GAAG,IAAIG,0BAAW,EAAE;AAC/B,QAAA,WAAW,CAAC,cAAc,CAAC,kBAAkB,CAAC;IAChD;AACA,IAAA,MAAM,CAAC,cAAc,CAAC,WAAW,CAAC;IAElC,IAAI,CAAC,UAAU,EAAE;AACf,QAAA,UAAU,GAAG,IAAIC,wBAAU,EAAE;AAC7B,QAAA,UAAU,CAAC,iBAAiB,CAAC,qBAAqB,CAAC;IACrD;AACA,IAAA,IAAI,QAAQ,IAAI,eAAe,KAAK,QAAQ,EAAE;AAC5C,QAAA,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC;QAClC,eAAe,GAAG,QAAQ;IAC5B;AACA,IAAA,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC;AAChC,IAAA,MAAM,CAAC,iBAAiB,CAACC,wCAAc,CAAC;AAC1C;AAEA,SAAS,SAAS,CAChB,IAAa,EACb,IAAY,EACZ,QAAwB,EAAA;AAExB,IAAA,MAAM,MAAM,GAAG,IAAIC,wBAAU,EAAE;AAC/B,IAAA,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC;IAClC,MAAM,OAAO,GACX,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,IAAI,EAAE,IAAI,YAAY,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI;AAC5F,UAAE,IAAI,CAAC,SAAS,CAAC,IAAI;UACnB,IAAI,YAAY,WAAW,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI;AACtD,cAAE,QAAQ,CAAC,IAAI;AACf,cAAE,MAAM,CAAC,IAAI,CAAC;IAEpB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;QACrC,MAAM,CAAC,KAAK,CACV,OAA+B,EAC/B,IAAI,EACJ,CAAC,IAAI,KAAI;AACP,YAAA,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;AACvD,QAAA,CAAC,EACD,CAAC,GAAG,KAAI;YACN,MAAM,CAAC,GAAG,YAAY,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7D,QAAA,CAAC,CACF;AACH,IAAA,CAAC,CAAC;AACJ;AAEA,eAAe,QAAQ,CAAC,IAAa,EAAE,IAAY,EAAA;AACjD,IAAA,MAAM,MAAM,GAAG,IAAIC,sBAAS,EAAE;AAC9B,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;IACjD,MAAM,UAAU,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,CAAoB;AAC/D,IAAA,OAAO,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC;AACtC;AAEA,eAAe,QAAQ,CAAC,GAAmB,EAAE,IAAa,EAAE,IAAY,EAAA;AACtE,IAAA,MAAM,SAAS,GAAG,IAAIC,sBAAS,EAAE;AACjC,IAAA,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG;AAC7B,IAAA,IAAI,OAAO,IAAI,IAAI,EAAE;AACnB,QAAA,MAAM,SAAS,GAAG,IAAIC,sBAAS,EAAE;AACjC,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,IAAI;AACtD,QAAA,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAC3D,SAAS,CAAC,OAAO,EAAE;AACnB,QAAA,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC;IACnC;AACA,IAAA,OAAO,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD;AAEA,eAAe,YAAY,CAAC,IAAa,EAAE,IAAY,EAAA;AACrD,IAAA,MAAM,MAAM,GAAG,IAAIC,8BAAa,EAAE;AAClC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;AAC/C,IAAA,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC;AACzD;AAEO,eAAe,kBAAkB,CACtC,GAAmB,EACnB,QAAwB,EAAA;AAExB,IAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC;IAC9C,QAAQ,IAAI;AACV,QAAA,KAAK,KAAK;AACV,QAAA,KAAK,MAAM;YACT,OAAO,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC;AACxC,QAAA,KAAK,KAAK;AACR,YAAA,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;AAC7B,QAAA,KAAK,KAAK;YACR,OAAO,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;AAClC,QAAA,KAAK,KAAK;AACR,YAAA,OAAO,eAAe,CAAC,IAAIC,sBAAS,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,QAAA,KAAK,KAAK;AACR,YAAA,OAAO,eAAe,CAAC,IAAIC,sBAAS,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,QAAA,KAAK,KAAK;AACV,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;AACjC,QAAA;YACE,MAAM,IAAI,KAAK,CACb,CAAA,2BAAA,EAA8B,IAAI,CAAA,gBAAA,EAAmB,GAAG,CAAC,IAAI,CAAA,GAAA,CAAK;AAChE,gBAAA,4CAA4C,CAC/C;;AAEP;AAEA,SAAS,mBAAmB,CAAC,GAAmB,EAAA;IAC9C,IAAI,MAAM,GAAuB,IAAI;IACrC,OAAO;QACL,MAAM,KAAK,CAAC,QAAwB,EAAA;YAClC,IAAI,CAAC,MAAM,EAAE;gBACX,MAAM,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC;YAClD;AACA,YAAA,OAAO,MAAM;QACf,CAAC;QACD,OAAO,GAAA;YACL,MAAM,GAAG,IAAI;QACf,CAAC;KACF;AACH;AAEAC,eAAQ,CAAC,gBAAgB,CAACC,oBAAa,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,mBAAmB,CAAC,GAAG,CAAC,CAAC;AACjFD,eAAQ,CAAC,gBAAgB,CAACC,oBAAa,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAC/ED,eAAQ,CAAC,eAAe,CAACC,oBAAa,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAI;AAC7D,IAAA,QAAQ,EAAE,OAAO,IAAI;AACvB,CAAC,CAAC;AACFD,eAAQ,CAAC,eAAe,CAACC,oBAAa,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAI;AAC3D,IAAA,QAAQ,EAAE,OAAO,IAAI;AACvB,CAAC,CAAC;;ACrMa,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQC,2BAAU,CAAA;AAAtC,IAAA,WAAA,GAAA;;QAEb,IAAA,CAAA,IAAI,GAAW,eAAe;AAEtB,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,EAA4B;IA2G3D;aA9GS,IAAA,CAAA,UAAU,GAAG,eAAH,CAAmB;IAKpC,IAAI,GAAA;QACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAACC,iCAAgB,CAAqB;AAClF,QAAA,gBAAgB,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC;IACjD;AAEA,IAAA,gBAAgB,CAAC,OAAyB,EAAA;AACxC,QAAA,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS;YAAE;AAEzC,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAoB;QAE9C,IAAI,OAAO,CAAC,IAAI,KAAKC,oBAAa,CAAC,GAAG,EAAE;YACtC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC;QAC/C;aAAO,IAAI,OAAO,CAAC,IAAI,KAAKA,oBAAa,CAAC,MAAM,EAAE;AAChD,YAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;QAC5B;aAAO,IAAI,OAAO,CAAC,IAAI,KAAKA,oBAAa,CAAC,MAAM,EAAE;YAChD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD;IACF;AAEA,IAAA,cAAc,CAAC,UAAsB,EAAA;QACnC,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,OAAO,CAAY;AAC7D,QAAA,IAAI,CAAC,SAAS;YAAE;AAEhB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,GAAG,IAAIC,iCAAgB,EAAE;YAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC;QAC7C;QACA,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,CAACC,4BAAW,CAA4B;QACjF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE;YACtC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3B,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACxB;QACF;AAEA,QAAA,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC;AACjF,QAAA,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC;AACjF,QAAA,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;IACvE;AAEQ,IAAA,MAAM,SAAS,CAAC,UAAsB,EAAE,SAAkB,EAAA;QAChE,IAAI,CAAC,SAAS,CAAC,QAAQ;YAAE;QAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,CAAC;QAC3D,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC;YAAE;AAEnD,QAAA,IAAI,SAAS,CAAC,QAAQ,EAAE;AACtB,YAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAC7B,UAAU,CAAC,EAAE,EACb,SAAS,CAAC,cAAc,EACxB,SAAS,CAAC,KAAK,CAChB;QACH;IACF;IAEQ,MAAM,YAAY,CAAC,OAAyB,EAAA;AAClD,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAoB;QAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC;AAE3C,QAAA,IAAI,WAAW,KAAK,UAAU,EAAE;YAC9B,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,SAAS,CAAC,QAAQ;gBAAE;AAEzB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;AAC3D,YAAA,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,QAAQ,CAAC;AACnE,YAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC;gBAAE;AAE3D,YAAA,IAAI,SAAS,CAAC,QAAQ,EAAE;AACtB,gBAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAC7B,OAAO,CAAC,UAAU,CAAC,EAAE,EACrB,SAAS,CAAC,cAAc,EACxB,SAAS,CAAC,KAAK,CAChB;YACH;QACF;QAEA,IAAI,WAAW,KAAK,OAAO,IAAI,WAAW,KAAK,gBAAgB,EAAE;AAC/D,YAAA,IAAI,CAAC,YAAY,CAAC,aAAa,CAC7B,OAAO,CAAC,UAAU,CAAC,EAAE,EACrB,SAAS,CAAC,cAAc,EACxB,SAAS,CAAC,KAAK,CAChB;QACH;IACF;AAEQ,IAAA,MAAM,gBAAgB,CAAC,UAAsB,EAAE,IAAY,EAAA;AACjE,QAAA,MAAM,GAAG,GAAG,MAAMC,qCAAoB,CAAC,IAAI,CAAC;AAC5C,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,QAA6C;QAClE,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,UAAU,EAAE;AACrD,YAAA,MAAM,IAAI,KAAK,CACb,aAAa,IAAI,CAAA,gFAAA,CAAkF,CACpG;QACH;AACA,QAAA,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;QAC/D,MAAM,KAAK,GAAGC,sBAAY,CAAC,MAAM,CAAC,KAAK,CAAU;AACjD,QAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC;IAC1F;;AA9GmB,aAAa,GAAAvB,gBAAA,CAAA;IATjCwB,iBAAU,CAAC,iBAAiB,CAAC;AAC5B,QAAA,OAAO,EAAE;YACP,UAAU;YACV,WAAW,EAAE,WAAW,EAAE,WAAW;YACrC,WAAW,EAAE,WAAW,EAAE,WAAW;YACrC,QAAQ,EAAE,QAAQ,EAAE,QAAQ;AAC5B,YAAA,OAAO,EAAE,gBAAgB;AAC1B,SAAA;KACF;AACoB,CAAA,EAAA,aAAa,CA+GjC;4BA/GoB,aAAa;;;;;"}
@@ -1 +1 @@
1
- "use strict";var e=require("tslib"),t=require("@combos-fun/engine"),r=require("@combos-fun/inspector-decorator"),o=require("@combos-fun/plugin-renderer-3d"),n=require("three/addons/utils/SkeletonUtils.js"),s=require("three"),i=require("three/addons/loaders/GLTFLoader.js"),a=require("three/addons/loaders/DRACOLoader.js"),d=require("three/addons/loaders/KTX2Loader.js"),c=require("three/addons/loaders/FBXLoader.js"),p=require("three/addons/loaders/OBJLoader.js"),l=require("three/addons/loaders/MTLLoader.js"),u=require("three/addons/loaders/STLLoader.js"),m=require("three/addons/loaders/ColladaLoader.js"),h=require("three/addons/loaders/PLYLoader.js"),y=require("three/addons/libs/meshopt_decoder.module.js");class f extends t.Component{constructor(){super(...arguments),this.resource="",this.autoPlay=!0,this.animationIndex=0,this.speed=1,this.positionX=0,this.positionY=0,this.positionZ=0,this.rotationX=0,this.rotationY=0,this.rotationZ=0,this.scaleX=1,this.scaleY=1,this.scaleZ=1}static{this.componentName="Model3D"}init(e){e&&Object.assign(this,e)}}e.__decorate([r.Field({type:"string",group:"Model3D",label:"resource",description:"Engine resource name registered with RESOURCE_TYPE.MODEL.",editor:"text"})],f.prototype,"resource",void 0),e.__decorate([r.Field({type:"boolean",group:"Model3D",label:"autoPlay",description:"Start playing automatically when loaded.",editor:"toggle"})],f.prototype,"autoPlay",void 0),e.__decorate([r.Field({type:"number",group:"Model3D",label:"animationIndex",description:"Animation clip index.",editor:"number-stepper"})],f.prototype,"animationIndex",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"speed",description:"Playback speed.",editor:"number-stepper"})],f.prototype,"speed",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"positionX",description:"Local X position.",editor:"number-stepper"})],f.prototype,"positionX",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"positionY",description:"Local Y position.",editor:"number-stepper"})],f.prototype,"positionY",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"positionZ",description:"Local Z position.",editor:"number-stepper"})],f.prototype,"positionZ",void 0),e.__decorate([r.Field({type:"number",step:.01,group:"Model3D",label:"rotationX",description:"Rotation around X in radians.",editor:"number-stepper"})],f.prototype,"rotationX",void 0),e.__decorate([r.Field({type:"number",step:.01,group:"Model3D",label:"rotationY",description:"Rotation around Y in radians.",editor:"number-stepper"})],f.prototype,"rotationY",void 0),e.__decorate([r.Field({type:"number",step:.01,group:"Model3D",label:"rotationZ",description:"Rotation around Z in radians.",editor:"number-stepper"})],f.prototype,"rotationZ",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"scaleX",description:"Scale on X.",editor:"number-stepper"})],f.prototype,"scaleX",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"scaleY",description:"Scale on Y.",editor:"number-stepper"})],f.prototype,"scaleY",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"scaleZ",description:"Scale on Z.",editor:"number-stepper"})],f.prototype,"scaleZ",void 0);let b=null,g=null,E=null;function w(e){const t=String(e||"").split("?")[0].split("#")[0],r=t.lastIndexOf("/");return r>=0?t.slice(0,r+1):""}function M(e){if("string"==typeof e)return e;if(e instanceof ArrayBuffer)return(new TextDecoder).decode(e);if(ArrayBuffer.isView(e))return(new TextDecoder).decode(e);if(e&&"object"==typeof e)return JSON.stringify(e);throw new Error("expected text payload for this model format")}function D(e){if(e instanceof ArrayBuffer)return e;if(ArrayBuffer.isView(e)){const t=e;return t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)}throw new Error("expected binary payload for this model format")}function L(e,t=[]){if(e instanceof s.Group)return{scene:e,animations:t};const r=new s.Group;return r.add(e),{scene:r,animations:t}}function _(e){e.computeVertexNormals?.();const t=new s.Mesh(e,new s.MeshStandardMaterial({color:8947848,metalness:.1,roughness:.8})),r=new s.Group;return r.add(t),{scene:r,animations:[]}}function O(e,t,r){const o=new i.GLTFLoader;!function(e,t){b||(b=new a.DRACOLoader,b.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.5.7/")),e.setDRACOLoader(b),g||(g=new d.KTX2Loader,g.setTranscoderPath("https://unpkg.com/three@0.172.0/examples/jsm/libs/basis/")),t&&E!==t&&(g.detectSupport(t),E=t),e.setKTX2Loader(g),e.setMeshoptDecoder(y.MeshoptDecoder)}(o,r);const n="object"!=typeof e||!e||e instanceof ArrayBuffer||ArrayBuffer.isView(e)?e instanceof ArrayBuffer||ArrayBuffer.isView(e)?D(e):M(e):JSON.stringify(e);return new Promise((e,r)=>{o.parse(n,t,t=>{e(L(t.scene,t.animations||[]))},e=>{r(e instanceof Error?e:new Error(String(e)))})})}async function x(e,t){const{data:r,type:o,path:n}=function(e){const t=e.src?.model||e.src?.glb||e.src?.gltf,r=e.data?.model??e.data?.glb??e.data?.gltf;if(null==r)throw new Error(`Resource "${e.name}" has no model data; use RESOURCE_TYPE.MODEL with src.model.url`);return{data:r,type:String(t?.type||"glb").toLowerCase(),path:w(t?.url||"")}}(e);switch(o){case"glb":case"gltf":return O(r,n,t);case"fbx":return async function(e,t){const r=(new c.FBXLoader).parse(D(e),t);return L(r,r.animations||[])}(r,n);case"obj":return async function(e,t,r){const o=new p.OBJLoader,n=e.data?.mtl;if(null!=n){const t=new l.MTLLoader,s=w(e.src?.mtl?.url||"")||r,i=t.parse(M(n),s);i.preload(),o.setMaterials(i)}return L(o.parse(M(t)))}(e,r,n);case"stl":return _((new u.STLLoader).parse(D(r)));case"ply":return _((new h.PLYLoader).parse(D(r)));case"dae":case"collada":return async function(e,t){const r=(new m.ColladaLoader).parse(M(e),t);return L(r.scene,r.animations||[])}(r,n);default:throw new Error(`Unsupported 3D model type "${o}" for resource "${e.name}". Use glb, gltf, fbx, obj, stl, dae, or ply.`)}}function R(e){let t=null;return{parse:async r=>(t||(t=await x(e,r)),t),dispose(){t=null}}}t.resource.registerInstance(t.RESOURCE_TYPE.MODEL,e=>R(e)),t.resource.registerInstance(t.RESOURCE_TYPE.GLB,e=>R(e)),t.resource.registerDestroy(t.RESOURCE_TYPE.MODEL,({instance:e})=>{e?.dispose?.()}),t.resource.registerDestroy(t.RESOURCE_TYPE.GLB,({instance:e})=>{e?.dispose?.()});let S=class extends o.Renderer3D{constructor(){super(...arguments),this.name="Model3DSystem"}static{this.systemName="Model3DSystem"}init(){this.game.getSystem(o.Renderer3DSystem).rendererManager.register(this)}componentChanged(e){if("Model3D"!==e.componentName)return;const r=e.component;e.type===t.OBSERVER_TYPE.ADD?this.handleAdd(e.gameObject,r):e.type===t.OBSERVER_TYPE.CHANGE?this.handleChange(e):e.type===t.OBSERVER_TYPE.REMOVE&&(this.increaseAsyncId(e.gameObject.id),this.threeContext.removeModel(e.gameObject.id))}rendererUpdate(e){const t=e.getComponent(f);if(!t)return;const r=this.threeContext.models.get(e.id);r&&(r.position.set(t.positionX,t.positionY,t.positionZ),r.rotation.set(t.rotationX,t.rotationY,t.rotationZ),r.scale.set(t.scaleX,t.scaleY,t.scaleZ))}async handleAdd(e,t){if(!t.resource)return;const r=this.increaseAsyncId(e.id);await this.attachNamedModel(e.id,t.resource),this.validateAsyncId(e.id,r)&&t.autoPlay&&this.threeContext.playAnimation(e.id,t.animationIndex,t.speed)}async handleChange(e){const t=e.component,r=e.prop?.prop?.[0];if("resource"===r){if(this.threeContext.removeModel(e.gameObject.id),!t.resource)return;const r=this.increaseAsyncId(e.gameObject.id);if(await this.attachNamedModel(e.gameObject.id,t.resource),!this.validateAsyncId(e.gameObject.id,r))return;t.autoPlay&&this.threeContext.playAnimation(e.gameObject.id,t.animationIndex,t.speed)}"speed"!==r&&"animationIndex"!==r||this.threeContext.playAnimation(e.gameObject.id,t.animationIndex,t.speed)}async attachNamedModel(e,t){const r=(await o.requireNamedResource(t)).instance;if(!r||"function"!=typeof r.parse)throw new Error(`Resource "${t}" is not a MODEL instance; register RESOURCE_TYPE.MODEL and import Model3DSystem`);const s=await r.parse(this.threeContext.renderer),i=n.clone(s.scene);this.threeContext.attachParsedModel(e,i,s.animations)}};S=e.__decorate([t.decorators.componentObserver({Model3D:["resource","positionX","positionY","positionZ","rotationX","rotationY","rotationZ","scaleX","scaleY","scaleZ","speed","animationIndex"]})],S);var Y=S;exports.Model3D=f,exports.Model3DSystem=Y;
1
+ "use strict";var e=require("tslib"),t=require("@combos-fun/engine"),r=require("@combos-fun/inspector-decorator"),o=require("@combos-fun/plugin-renderer-3d"),n=require("three/addons/utils/SkeletonUtils.js"),s=require("three"),i=require("three/addons/loaders/GLTFLoader.js"),a=require("three/addons/loaders/DRACOLoader.js"),d=require("three/addons/loaders/KTX2Loader.js"),c=require("three/addons/loaders/FBXLoader.js"),p=require("three/addons/loaders/OBJLoader.js"),l=require("three/addons/loaders/MTLLoader.js"),u=require("three/addons/loaders/STLLoader.js"),m=require("three/addons/loaders/ColladaLoader.js"),h=require("three/addons/loaders/PLYLoader.js"),y=require("three/addons/libs/meshopt_decoder.module.js");class f extends t.Component{constructor(){super(...arguments),this.resource="",this.autoPlay=!0,this.animationIndex=0,this.speed=1,this.positionX=0,this.positionY=0,this.positionZ=0,this.rotationX=0,this.rotationY=0,this.rotationZ=0,this.scaleX=1,this.scaleY=1,this.scaleZ=1}static{this.componentName="Model3D"}init(e){e&&Object.assign(this,e)}}e.__decorate([r.Field({type:"string",group:"Model3D",label:"resource",description:"Engine resource name registered with RESOURCE_TYPE.MODEL.",editor:"text"})],f.prototype,"resource",void 0),e.__decorate([r.Field({type:"boolean",group:"Model3D",label:"autoPlay",description:"Start playing automatically when loaded.",editor:"toggle"})],f.prototype,"autoPlay",void 0),e.__decorate([r.Field({type:"number",group:"Model3D",label:"animationIndex",description:"Animation clip index.",editor:"number-stepper"})],f.prototype,"animationIndex",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"speed",description:"Playback speed.",editor:"number-stepper"})],f.prototype,"speed",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"positionX",description:"Local X position.",editor:"number-stepper"})],f.prototype,"positionX",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"positionY",description:"Local Y position.",editor:"number-stepper"})],f.prototype,"positionY",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"positionZ",description:"Local Z position.",editor:"number-stepper"})],f.prototype,"positionZ",void 0),e.__decorate([r.Field({type:"number",step:.01,group:"Model3D",label:"rotationX",description:"Rotation around X in radians.",editor:"number-stepper"})],f.prototype,"rotationX",void 0),e.__decorate([r.Field({type:"number",step:.01,group:"Model3D",label:"rotationY",description:"Rotation around Y in radians.",editor:"number-stepper"})],f.prototype,"rotationY",void 0),e.__decorate([r.Field({type:"number",step:.01,group:"Model3D",label:"rotationZ",description:"Rotation around Z in radians.",editor:"number-stepper"})],f.prototype,"rotationZ",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"scaleX",description:"Scale on X.",editor:"number-stepper"})],f.prototype,"scaleX",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"scaleY",description:"Scale on Y.",editor:"number-stepper"})],f.prototype,"scaleY",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"scaleZ",description:"Scale on Z.",editor:"number-stepper"})],f.prototype,"scaleZ",void 0);let g=null,b=null,E=null;function w(e){const t=String(e||"").split("?")[0].split("#")[0],r=t.lastIndexOf("/");return r>=0?t.slice(0,r+1):""}function M(e){if("string"==typeof e)return e;if(e instanceof ArrayBuffer)return(new TextDecoder).decode(e);if(ArrayBuffer.isView(e))return(new TextDecoder).decode(e);if(e&&"object"==typeof e)return JSON.stringify(e);throw new Error("expected text payload for this model format")}function D(e){if(e instanceof ArrayBuffer)return e;if(ArrayBuffer.isView(e)){const t=e;return t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)}throw new Error("expected binary payload for this model format")}function L(e,t=[]){if(e instanceof s.Group)return{scene:e,animations:t};const r=new s.Group;return r.add(e),{scene:r,animations:t}}function O(e){e.computeVertexNormals?.();const t=new s.Mesh(e,new s.MeshStandardMaterial({color:8947848,metalness:.1,roughness:.8})),r=new s.Group;return r.add(t),{scene:r,animations:[]}}function _(e,t,r){const o=new i.GLTFLoader;!function(e,t){g||(g=new a.DRACOLoader,g.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.5.7/")),e.setDRACOLoader(g),b||(b=new d.KTX2Loader,b.setTranscoderPath("https://unpkg.com/three@0.172.0/examples/jsm/libs/basis/")),t&&E!==t&&(b.detectSupport(t),E=t),e.setKTX2Loader(b),e.setMeshoptDecoder(y.MeshoptDecoder)}(o,r);const n="object"!=typeof e||!e||e instanceof ArrayBuffer||ArrayBuffer.isView(e)?e instanceof ArrayBuffer||ArrayBuffer.isView(e)?D(e):M(e):JSON.stringify(e);return new Promise((e,r)=>{o.parse(n,t,t=>{e(L(t.scene,t.animations||[]))},e=>{r(e instanceof Error?e:new Error(String(e)))})})}async function x(e,t){const{data:r,type:o,path:n}=function(e){const t=e.src?.model||e.src?.glb||e.src?.gltf,r=e.data?.model??e.data?.glb??e.data?.gltf;if(null==r)throw new Error(`Resource "${e.name}" has no model data; use RESOURCE_TYPE.MODEL with src.model.url`);return{data:r,type:String(t?.type||"glb").toLowerCase(),path:w(t?.url||"")}}(e);switch(o){case"glb":case"gltf":return _(r,n,t);case"fbx":return async function(e,t){const r=(new c.FBXLoader).parse(D(e),t);return L(r,r.animations||[])}(r,n);case"obj":return async function(e,t,r){const o=new p.OBJLoader,n=e.data?.mtl;if(null!=n){const t=new l.MTLLoader,s=w(e.src?.mtl?.url||"")||r,i=t.parse(M(n),s);i.preload(),o.setMaterials(i)}return L(o.parse(M(t)))}(e,r,n);case"stl":return O((new u.STLLoader).parse(D(r)));case"ply":return O((new h.PLYLoader).parse(D(r)));case"dae":case"collada":return async function(e,t){const r=(new m.ColladaLoader).parse(M(e),t);return L(r.scene,r.animations||[])}(r,n);default:throw new Error(`Unsupported 3D model type "${o}" for resource "${e.name}". Use glb, gltf, fbx, obj, stl, dae, or ply.`)}}function R(e){let t=null;return{parse:async r=>(t||(t=await x(e,r)),t),dispose(){t=null}}}t.resource.registerInstance(t.RESOURCE_TYPE.MODEL,e=>R(e)),t.resource.registerInstance(t.RESOURCE_TYPE.GLB,e=>R(e)),t.resource.registerDestroy(t.RESOURCE_TYPE.MODEL,({instance:e})=>{e?.dispose?.()}),t.resource.registerDestroy(t.RESOURCE_TYPE.GLB,({instance:e})=>{e?.dispose?.()});let S=class extends o.Renderer3D{constructor(){super(...arguments),this.name="Model3DSystem",this.poseBridges=new Map}static{this.systemName="Model3DSystem"}init(){this.game.getSystem(o.Renderer3DSystem).rendererManager.register(this)}componentChanged(e){if("Model3D"!==e.componentName)return;const r=e.component;e.type===t.OBSERVER_TYPE.ADD?this.handleAdd(e.gameObject,r):e.type===t.OBSERVER_TYPE.CHANGE?this.handleChange(e):e.type===t.OBSERVER_TYPE.REMOVE&&(this.increaseAsyncId(e.gameObject.id),this.poseBridges.delete(e.gameObject.id),this.threeContext.removeModel(e.gameObject.id))}rendererUpdate(e){const t=e.getComponent(f);if(!t)return;const r=this.threeContext.models.get(e.id);if(!r)return;let n=this.poseBridges.get(e.id);n||(n=new o.VisualPoseBridge,this.poseBridges.set(e.id,n));const s=e.getComponent(o.Transform3D);if(!n.sync(t,s))return r.position.set(0,0,0),r.rotation.set(0,0,0),void r.scale.set(1,1,1);r.position.set(t.positionX,t.positionY,t.positionZ),r.rotation.set(t.rotationX,t.rotationY,t.rotationZ),r.scale.set(t.scaleX,t.scaleY,t.scaleZ)}async handleAdd(e,t){if(!t.resource)return;const r=this.increaseAsyncId(e.id);await this.attachNamedModel(e,t.resource),this.validateAsyncId(e.id,r)&&t.autoPlay&&this.threeContext.playAnimation(e.id,t.animationIndex,t.speed)}async handleChange(e){const t=e.component,r=e.prop?.prop?.[0];if("resource"===r){if(this.poseBridges.delete(e.gameObject.id),this.threeContext.removeModel(e.gameObject.id),!t.resource)return;const r=this.increaseAsyncId(e.gameObject.id);if(await this.attachNamedModel(e.gameObject,t.resource),!this.validateAsyncId(e.gameObject.id,r))return;t.autoPlay&&this.threeContext.playAnimation(e.gameObject.id,t.animationIndex,t.speed)}"speed"!==r&&"animationIndex"!==r||this.threeContext.playAnimation(e.gameObject.id,t.animationIndex,t.speed)}async attachNamedModel(e,t){const r=(await o.requireNamedResource(t)).instance;if(!r||"function"!=typeof r.parse)throw new Error(`Resource "${t}" is not a MODEL instance; register RESOURCE_TYPE.MODEL and import Model3DSystem`);const s=await r.parse(this.threeContext.renderer),i=n.clone(s.scene);this.threeContext.attachParsedModel(e.id,i,s.animations,e)}};S=e.__decorate([t.decorators.componentObserver({Model3D:["resource","positionX","positionY","positionZ","rotationX","rotationY","rotationZ","scaleX","scaleY","scaleZ","speed","animationIndex"]})],S);var Y=S;exports.Model3D=f,exports.Model3DSystem=Y;
@@ -47,6 +47,7 @@ interface ModelResourceInstance {
47
47
  declare class Model3DSystem extends Renderer3D {
48
48
  static systemName: string;
49
49
  name: string;
50
+ private poseBridges;
50
51
  init(): void;
51
52
  componentChanged(changed: ComponentChanged): void;
52
53
  rendererUpdate(gameObject: GameObject): void;
@@ -1,7 +1,7 @@
1
1
  import { __decorate } from 'tslib';
2
2
  import { Component, resource, RESOURCE_TYPE, OBSERVER_TYPE, decorators } from '@combos-fun/engine';
3
3
  import { Field } from '@combos-fun/inspector-decorator';
4
- import { Renderer3D, Renderer3DSystem, requireNamedResource } from '@combos-fun/plugin-renderer-3d';
4
+ import { Renderer3D, Renderer3DSystem, VisualPoseBridge, Transform3D, requireNamedResource } from '@combos-fun/plugin-renderer-3d';
5
5
  import { clone } from 'three/addons/utils/SkeletonUtils.js';
6
6
  import { Mesh, MeshStandardMaterial, Group } from 'three';
7
7
  import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';
@@ -327,6 +327,7 @@ let Model3DSystem = class Model3DSystem extends Renderer3D {
327
327
  constructor() {
328
328
  super(...arguments);
329
329
  this.name = 'Model3DSystem';
330
+ this.poseBridges = new Map();
330
331
  }
331
332
  static { this.systemName = 'Model3DSystem'; }
332
333
  init() {
@@ -345,6 +346,7 @@ let Model3DSystem = class Model3DSystem extends Renderer3D {
345
346
  }
346
347
  else if (changed.type === OBSERVER_TYPE.REMOVE) {
347
348
  this.increaseAsyncId(changed.gameObject.id);
349
+ this.poseBridges.delete(changed.gameObject.id);
348
350
  this.threeContext.removeModel(changed.gameObject.id);
349
351
  }
350
352
  }
@@ -355,6 +357,18 @@ let Model3DSystem = class Model3DSystem extends Renderer3D {
355
357
  const model = this.threeContext.models.get(gameObject.id);
356
358
  if (!model)
357
359
  return;
360
+ let bridge = this.poseBridges.get(gameObject.id);
361
+ if (!bridge) {
362
+ bridge = new VisualPoseBridge();
363
+ this.poseBridges.set(gameObject.id, bridge);
364
+ }
365
+ const transform = gameObject.getComponent(Transform3D);
366
+ if (!bridge.sync(component, transform)) {
367
+ model.position.set(0, 0, 0);
368
+ model.rotation.set(0, 0, 0);
369
+ model.scale.set(1, 1, 1);
370
+ return;
371
+ }
358
372
  model.position.set(component.positionX, component.positionY, component.positionZ);
359
373
  model.rotation.set(component.rotationX, component.rotationY, component.rotationZ);
360
374
  model.scale.set(component.scaleX, component.scaleY, component.scaleZ);
@@ -363,7 +377,7 @@ let Model3DSystem = class Model3DSystem extends Renderer3D {
363
377
  if (!component.resource)
364
378
  return;
365
379
  const asyncId = this.increaseAsyncId(gameObject.id);
366
- await this.attachNamedModel(gameObject.id, component.resource);
380
+ await this.attachNamedModel(gameObject, component.resource);
367
381
  if (!this.validateAsyncId(gameObject.id, asyncId))
368
382
  return;
369
383
  if (component.autoPlay) {
@@ -374,11 +388,12 @@ let Model3DSystem = class Model3DSystem extends Renderer3D {
374
388
  const component = changed.component;
375
389
  const changedProp = changed.prop?.prop?.[0];
376
390
  if (changedProp === 'resource') {
391
+ this.poseBridges.delete(changed.gameObject.id);
377
392
  this.threeContext.removeModel(changed.gameObject.id);
378
393
  if (!component.resource)
379
394
  return;
380
395
  const asyncId = this.increaseAsyncId(changed.gameObject.id);
381
- await this.attachNamedModel(changed.gameObject.id, component.resource);
396
+ await this.attachNamedModel(changed.gameObject, component.resource);
382
397
  if (!this.validateAsyncId(changed.gameObject.id, asyncId))
383
398
  return;
384
399
  if (component.autoPlay) {
@@ -389,7 +404,7 @@ let Model3DSystem = class Model3DSystem extends Renderer3D {
389
404
  this.threeContext.playAnimation(changed.gameObject.id, component.animationIndex, component.speed);
390
405
  }
391
406
  }
392
- async attachNamedModel(id, name) {
407
+ async attachNamedModel(gameObject, name) {
393
408
  const res = await requireNamedResource(name);
394
409
  const instance = res.instance;
395
410
  if (!instance || typeof instance.parse !== 'function') {
@@ -397,7 +412,7 @@ let Model3DSystem = class Model3DSystem extends Renderer3D {
397
412
  }
398
413
  const parsed = await instance.parse(this.threeContext.renderer);
399
414
  const clone$1 = clone(parsed.scene);
400
- this.threeContext.attachParsedModel(id, clone$1, parsed.animations);
415
+ this.threeContext.attachParsedModel(gameObject.id, clone$1, parsed.animations, gameObject);
401
416
  }
402
417
  };
403
418
  Model3DSystem = __decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-renderer-3d-model.esm.js","sources":["../lib/component.ts","../lib/parseModel.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport { Field } from '@combos-fun/inspector-decorator';\n\nexport interface Model3DParams {\n resource?: string;\n autoPlay?: boolean;\n animationIndex?: number;\n speed?: number;\n positionX?: number;\n positionY?: number;\n positionZ?: number;\n rotationX?: number;\n rotationY?: number;\n rotationZ?: number;\n scaleX?: number;\n scaleY?: number;\n scaleZ?: number;\n}\n\nexport default class Model3D extends Component<Model3DParams> {\n static componentName: string = 'Model3D';\n\n @Field({\n\n type: 'string',\n\n group: 'Model3D',\n\n label: 'resource',\n\n description: 'Engine resource name registered with RESOURCE_TYPE.MODEL.',\n\n editor: 'text',\n\n })\n\n resource: string = '';\n @Field({\n type: 'boolean',\n group: 'Model3D',\n label: 'autoPlay',\n description: 'Start playing automatically when loaded.',\n editor: 'toggle',\n })\n autoPlay: boolean = true;\n @Field({\n type: 'number',\n group: 'Model3D',\n label: 'animationIndex',\n description: 'Animation clip index.',\n editor: 'number-stepper',\n })\n animationIndex: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'speed',\n description: 'Playback speed.',\n editor: 'number-stepper',\n })\n speed: number = 1;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'positionX',\n description: 'Local X position.',\n editor: 'number-stepper',\n })\n positionX: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'positionY',\n description: 'Local Y position.',\n editor: 'number-stepper',\n })\n positionY: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'positionZ',\n description: 'Local Z position.',\n editor: 'number-stepper',\n })\n positionZ: number = 0;\n @Field({\n type: 'number',\n step: 0.01,\n group: 'Model3D',\n label: 'rotationX',\n description: 'Rotation around X in radians.',\n editor: 'number-stepper',\n })\n rotationX: number = 0;\n @Field({\n type: 'number',\n step: 0.01,\n group: 'Model3D',\n label: 'rotationY',\n description: 'Rotation around Y in radians.',\n editor: 'number-stepper',\n })\n rotationY: number = 0;\n @Field({\n type: 'number',\n step: 0.01,\n group: 'Model3D',\n label: 'rotationZ',\n description: 'Rotation around Z in radians.',\n editor: 'number-stepper',\n })\n rotationZ: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'scaleX',\n description: 'Scale on X.',\n editor: 'number-stepper',\n })\n scaleX: number = 1;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'scaleY',\n description: 'Scale on Y.',\n editor: 'number-stepper',\n })\n scaleY: number = 1;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'scaleZ',\n description: 'Scale on Z.',\n editor: 'number-stepper',\n })\n scaleZ: number = 1;\n\n init(obj?: Model3DParams) {\n if (obj) Object.assign(this, obj);\n }\n}\n","import { resource, RESOURCE_TYPE } from '@combos-fun/engine';\nimport type { ResourceStruct } from '@combos-fun/engine';\nimport {\n AnimationClip,\n BufferGeometry,\n Group,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n} from 'three';\nimport type { WebGLRenderer } from 'three';\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\nimport { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';\nimport { KTX2Loader } from 'three/addons/loaders/KTX2Loader.js';\nimport { FBXLoader } from 'three/addons/loaders/FBXLoader.js';\nimport { OBJLoader } from 'three/addons/loaders/OBJLoader.js';\nimport { MTLLoader } from 'three/addons/loaders/MTLLoader.js';\nimport { STLLoader } from 'three/addons/loaders/STLLoader.js';\nimport { ColladaLoader } from 'three/addons/loaders/ColladaLoader.js';\nimport { PLYLoader } from 'three/addons/loaders/PLYLoader.js';\nimport { MeshoptDecoder } from 'three/addons/libs/meshopt_decoder.module.js';\n\nexport interface ParsedModel {\n scene: Group;\n animations: AnimationClip[];\n}\n\nexport interface ModelResourceInstance {\n parse(renderer?: WebGLRenderer): Promise<ParsedModel>;\n dispose(): void;\n}\n\nconst THREE_ADDON_CDN = 'https://unpkg.com/three@0.172.0/examples/jsm/libs';\nconst DRACO_DECODER_PATH = 'https://www.gstatic.com/draco/versioned/decoders/1.5.7/';\nconst BASIS_TRANSCODER_PATH = `${THREE_ADDON_CDN}/basis/`;\n\nlet sharedDraco: DRACOLoader | null = null;\nlet sharedKtx2: KTX2Loader | null = null;\nlet ktx2DetectedFor: WebGLRenderer | null = null;\n\nfunction dirOf(url: string): string {\n const clean = String(url || '').split('?')[0].split('#')[0];\n const slash = clean.lastIndexOf('/');\n return slash >= 0 ? clean.slice(0, slash + 1) : '';\n}\n\nfunction asText(data: unknown): string {\n if (typeof data === 'string') return data;\n if (data instanceof ArrayBuffer) return new TextDecoder().decode(data);\n if (ArrayBuffer.isView(data)) {\n return new TextDecoder().decode(data as ArrayBufferView);\n }\n if (data && typeof data === 'object') return JSON.stringify(data);\n throw new Error('expected text payload for this model format');\n}\n\nfunction asBuffer(data: unknown): ArrayBuffer {\n if (data instanceof ArrayBuffer) return data;\n if (ArrayBuffer.isView(data)) {\n const view = data as ArrayBufferView;\n return view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength);\n }\n throw new Error('expected binary payload for this model format');\n}\n\nfunction wrapGroup(object: Object3D, animations: AnimationClip[] = []): ParsedModel {\n if (object instanceof Group) {\n return { scene: object, animations };\n }\n const scene = new Group();\n scene.add(object);\n return { scene, animations };\n}\n\nfunction geometryToModel(geometry: BufferGeometry): ParsedModel {\n geometry.computeVertexNormals?.();\n const mesh = new Mesh(\n geometry,\n new MeshStandardMaterial({ color: 0x888888, metalness: 0.1, roughness: 0.8 }),\n );\n const scene = new Group();\n scene.add(mesh);\n return { scene, animations: [] };\n}\n\nfunction modelPayload(res: ResourceStruct): { data: unknown; type: string; path: string } {\n const slot = res.src?.model || res.src?.glb || res.src?.gltf;\n const data = res.data?.model ?? res.data?.glb ?? res.data?.gltf;\n if (data == null) {\n throw new Error(\n `Resource \"${res.name}\" has no model data; use RESOURCE_TYPE.MODEL with src.model.url`,\n );\n }\n const type = String(slot?.type || 'glb').toLowerCase();\n return { data, type, path: dirOf(slot?.url || '') };\n}\n\nfunction ensureGltfExtras(loader: GLTFLoader, renderer?: WebGLRenderer) {\n if (!sharedDraco) {\n sharedDraco = new DRACOLoader();\n sharedDraco.setDecoderPath(DRACO_DECODER_PATH);\n }\n loader.setDRACOLoader(sharedDraco);\n\n if (!sharedKtx2) {\n sharedKtx2 = new KTX2Loader();\n sharedKtx2.setTranscoderPath(BASIS_TRANSCODER_PATH);\n }\n if (renderer && ktx2DetectedFor !== renderer) {\n sharedKtx2.detectSupport(renderer);\n ktx2DetectedFor = renderer;\n }\n loader.setKTX2Loader(sharedKtx2);\n loader.setMeshoptDecoder(MeshoptDecoder);\n}\n\nfunction parseGltf(\n data: unknown,\n path: string,\n renderer?: WebGLRenderer,\n): Promise<ParsedModel> {\n const loader = new GLTFLoader();\n ensureGltfExtras(loader, renderer);\n const payload =\n typeof data === 'object' && data && !(data instanceof ArrayBuffer) && !ArrayBuffer.isView(data)\n ? JSON.stringify(data)\n : data instanceof ArrayBuffer || ArrayBuffer.isView(data)\n ? asBuffer(data)\n : asText(data);\n\n return new Promise((resolve, reject) => {\n loader.parse(\n payload as ArrayBuffer | string,\n path,\n (gltf) => {\n resolve(wrapGroup(gltf.scene, gltf.animations || []));\n },\n (err) => {\n reject(err instanceof Error ? err : new Error(String(err)));\n },\n );\n });\n}\n\nasync function parseFbx(data: unknown, path: string): Promise<ParsedModel> {\n const loader = new FBXLoader();\n const object = loader.parse(asBuffer(data), path);\n const animations = (object.animations || []) as AnimationClip[];\n return wrapGroup(object, animations);\n}\n\nasync function parseObj(res: ResourceStruct, data: unknown, path: string): Promise<ParsedModel> {\n const objLoader = new OBJLoader();\n const mtlText = res.data?.mtl;\n if (mtlText != null) {\n const mtlLoader = new MTLLoader();\n const mtlPath = dirOf(res.src?.mtl?.url || '') || path;\n const materials = mtlLoader.parse(asText(mtlText), mtlPath);\n materials.preload();\n objLoader.setMaterials(materials);\n }\n return wrapGroup(objLoader.parse(asText(data)));\n}\n\nasync function parseCollada(data: unknown, path: string): Promise<ParsedModel> {\n const loader = new ColladaLoader();\n const result = loader.parse(asText(data), path);\n return wrapGroup(result.scene, result.animations || []);\n}\n\nexport async function parseModelResource(\n res: ResourceStruct,\n renderer?: WebGLRenderer,\n): Promise<ParsedModel> {\n const { data, type, path } = modelPayload(res);\n switch (type) {\n case 'glb':\n case 'gltf':\n return parseGltf(data, path, renderer);\n case 'fbx':\n return parseFbx(data, path);\n case 'obj':\n return parseObj(res, data, path);\n case 'stl':\n return geometryToModel(new STLLoader().parse(asBuffer(data)));\n case 'ply':\n return geometryToModel(new PLYLoader().parse(asBuffer(data)));\n case 'dae':\n case 'collada':\n return parseCollada(data, path);\n default:\n throw new Error(\n `Unsupported 3D model type \"${type}\" for resource \"${res.name}\". ` +\n 'Use glb, gltf, fbx, obj, stl, dae, or ply.',\n );\n }\n}\n\nfunction createModelInstance(res: ResourceStruct): ModelResourceInstance {\n let cached: ParsedModel | null = null;\n return {\n async parse(renderer?: WebGLRenderer) {\n if (!cached) {\n cached = await parseModelResource(res, renderer);\n }\n return cached;\n },\n dispose() {\n cached = null;\n },\n };\n}\n\nresource.registerInstance(RESOURCE_TYPE.MODEL, (res) => createModelInstance(res));\nresource.registerInstance(RESOURCE_TYPE.GLB, (res) => createModelInstance(res));\nresource.registerDestroy(RESOURCE_TYPE.MODEL, ({ instance }) => {\n instance?.dispose?.();\n});\nresource.registerDestroy(RESOURCE_TYPE.GLB, ({ instance }) => {\n instance?.dispose?.();\n});\n","import { decorators, ComponentChanged, OBSERVER_TYPE, GameObject } from '@combos-fun/engine';\nimport {\n Renderer3D,\n Renderer3DSystem,\n requireNamedResource,\n} from '@combos-fun/plugin-renderer-3d';\nimport { Group } from 'three';\nimport { clone as cloneSkinned } from 'three/addons/utils/SkeletonUtils.js';\nimport Model3D from './component';\nimport './parseModel';\nimport type { ModelResourceInstance } from './parseModel';\n\n@decorators.componentObserver({\n Model3D: [\n 'resource',\n 'positionX', 'positionY', 'positionZ',\n 'rotationX', 'rotationY', 'rotationZ',\n 'scaleX', 'scaleY', 'scaleZ',\n 'speed', 'animationIndex',\n ],\n})\nexport default class Model3DSystem extends Renderer3D {\n static systemName = 'Model3DSystem';\n name: string = 'Model3DSystem';\n\n init() {\n const renderer3DSystem = this.game.getSystem(Renderer3DSystem) as Renderer3DSystem;\n renderer3DSystem.rendererManager.register(this);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Model3D') return;\n\n const component = changed.component as Model3D;\n\n if (changed.type === OBSERVER_TYPE.ADD) {\n this.handleAdd(changed.gameObject, component);\n } else if (changed.type === OBSERVER_TYPE.CHANGE) {\n this.handleChange(changed);\n } else if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.increaseAsyncId(changed.gameObject.id);\n this.threeContext.removeModel(changed.gameObject.id);\n }\n }\n\n rendererUpdate(gameObject: GameObject) {\n const component = gameObject.getComponent(Model3D) as Model3D;\n if (!component) return;\n\n const model = this.threeContext.models.get(gameObject.id);\n if (!model) return;\n\n model.position.set(component.positionX, component.positionY, component.positionZ);\n model.rotation.set(component.rotationX, component.rotationY, component.rotationZ);\n model.scale.set(component.scaleX, component.scaleY, component.scaleZ);\n }\n\n private async handleAdd(gameObject: GameObject, component: Model3D) {\n if (!component.resource) return;\n\n const asyncId = this.increaseAsyncId(gameObject.id);\n await this.attachNamedModel(gameObject.id, component.resource);\n if (!this.validateAsyncId(gameObject.id, asyncId)) return;\n\n if (component.autoPlay) {\n this.threeContext.playAnimation(\n gameObject.id,\n component.animationIndex,\n component.speed,\n );\n }\n }\n\n private async handleChange(changed: ComponentChanged) {\n const component = changed.component as Model3D;\n const changedProp = changed.prop?.prop?.[0];\n\n if (changedProp === 'resource') {\n this.threeContext.removeModel(changed.gameObject.id);\n if (!component.resource) return;\n\n const asyncId = this.increaseAsyncId(changed.gameObject.id);\n await this.attachNamedModel(changed.gameObject.id, component.resource);\n if (!this.validateAsyncId(changed.gameObject.id, asyncId)) return;\n\n if (component.autoPlay) {\n this.threeContext.playAnimation(\n changed.gameObject.id,\n component.animationIndex,\n component.speed,\n );\n }\n }\n\n if (changedProp === 'speed' || changedProp === 'animationIndex') {\n this.threeContext.playAnimation(\n changed.gameObject.id,\n component.animationIndex,\n component.speed,\n );\n }\n }\n\n private async attachNamedModel(id: number, name: string) {\n const res = await requireNamedResource(name);\n const instance = res.instance as ModelResourceInstance | undefined;\n if (!instance || typeof instance.parse !== 'function') {\n throw new Error(\n `Resource \"${name}\" is not a MODEL instance; register RESOURCE_TYPE.MODEL and import Model3DSystem`,\n );\n }\n const parsed = await instance.parse(this.threeContext.renderer);\n const clone = cloneSkinned(parsed.scene) as Group;\n this.threeContext.attachParsedModel(id, clone, parsed.animations);\n }\n}\n"],"names":["clone","cloneSkinned"],"mappings":"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"}
1
+ {"version":3,"file":"plugin-renderer-3d-model.esm.js","sources":["../lib/component.ts","../lib/parseModel.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport { Field } from '@combos-fun/inspector-decorator';\n\nexport interface Model3DParams {\n resource?: string;\n autoPlay?: boolean;\n animationIndex?: number;\n speed?: number;\n positionX?: number;\n positionY?: number;\n positionZ?: number;\n rotationX?: number;\n rotationY?: number;\n rotationZ?: number;\n scaleX?: number;\n scaleY?: number;\n scaleZ?: number;\n}\n\nexport default class Model3D extends Component<Model3DParams> {\n static componentName: string = 'Model3D';\n\n @Field({\n\n type: 'string',\n\n group: 'Model3D',\n\n label: 'resource',\n\n description: 'Engine resource name registered with RESOURCE_TYPE.MODEL.',\n\n editor: 'text',\n\n })\n\n resource: string = '';\n @Field({\n type: 'boolean',\n group: 'Model3D',\n label: 'autoPlay',\n description: 'Start playing automatically when loaded.',\n editor: 'toggle',\n })\n autoPlay: boolean = true;\n @Field({\n type: 'number',\n group: 'Model3D',\n label: 'animationIndex',\n description: 'Animation clip index.',\n editor: 'number-stepper',\n })\n animationIndex: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'speed',\n description: 'Playback speed.',\n editor: 'number-stepper',\n })\n speed: number = 1;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'positionX',\n description: 'Local X position.',\n editor: 'number-stepper',\n })\n positionX: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'positionY',\n description: 'Local Y position.',\n editor: 'number-stepper',\n })\n positionY: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'positionZ',\n description: 'Local Z position.',\n editor: 'number-stepper',\n })\n positionZ: number = 0;\n @Field({\n type: 'number',\n step: 0.01,\n group: 'Model3D',\n label: 'rotationX',\n description: 'Rotation around X in radians.',\n editor: 'number-stepper',\n })\n rotationX: number = 0;\n @Field({\n type: 'number',\n step: 0.01,\n group: 'Model3D',\n label: 'rotationY',\n description: 'Rotation around Y in radians.',\n editor: 'number-stepper',\n })\n rotationY: number = 0;\n @Field({\n type: 'number',\n step: 0.01,\n group: 'Model3D',\n label: 'rotationZ',\n description: 'Rotation around Z in radians.',\n editor: 'number-stepper',\n })\n rotationZ: number = 0;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'scaleX',\n description: 'Scale on X.',\n editor: 'number-stepper',\n })\n scaleX: number = 1;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'scaleY',\n description: 'Scale on Y.',\n editor: 'number-stepper',\n })\n scaleY: number = 1;\n @Field({\n type: 'number',\n step: 0.1,\n group: 'Model3D',\n label: 'scaleZ',\n description: 'Scale on Z.',\n editor: 'number-stepper',\n })\n scaleZ: number = 1;\n\n init(obj?: Model3DParams) {\n if (obj) Object.assign(this, obj);\n }\n}\n","import { resource, RESOURCE_TYPE } from '@combos-fun/engine';\nimport type { ResourceStruct } from '@combos-fun/engine';\nimport {\n AnimationClip,\n BufferGeometry,\n Group,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n} from 'three';\nimport type { WebGLRenderer } from 'three';\nimport { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\nimport { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';\nimport { KTX2Loader } from 'three/addons/loaders/KTX2Loader.js';\nimport { FBXLoader } from 'three/addons/loaders/FBXLoader.js';\nimport { OBJLoader } from 'three/addons/loaders/OBJLoader.js';\nimport { MTLLoader } from 'three/addons/loaders/MTLLoader.js';\nimport { STLLoader } from 'three/addons/loaders/STLLoader.js';\nimport { ColladaLoader } from 'three/addons/loaders/ColladaLoader.js';\nimport { PLYLoader } from 'three/addons/loaders/PLYLoader.js';\nimport { MeshoptDecoder } from 'three/addons/libs/meshopt_decoder.module.js';\n\nexport interface ParsedModel {\n scene: Group;\n animations: AnimationClip[];\n}\n\nexport interface ModelResourceInstance {\n parse(renderer?: WebGLRenderer): Promise<ParsedModel>;\n dispose(): void;\n}\n\nconst THREE_ADDON_CDN = 'https://unpkg.com/three@0.172.0/examples/jsm/libs';\nconst DRACO_DECODER_PATH = 'https://www.gstatic.com/draco/versioned/decoders/1.5.7/';\nconst BASIS_TRANSCODER_PATH = `${THREE_ADDON_CDN}/basis/`;\n\nlet sharedDraco: DRACOLoader | null = null;\nlet sharedKtx2: KTX2Loader | null = null;\nlet ktx2DetectedFor: WebGLRenderer | null = null;\n\nfunction dirOf(url: string): string {\n const clean = String(url || '').split('?')[0].split('#')[0];\n const slash = clean.lastIndexOf('/');\n return slash >= 0 ? clean.slice(0, slash + 1) : '';\n}\n\nfunction asText(data: unknown): string {\n if (typeof data === 'string') return data;\n if (data instanceof ArrayBuffer) return new TextDecoder().decode(data);\n if (ArrayBuffer.isView(data)) {\n return new TextDecoder().decode(data as ArrayBufferView);\n }\n if (data && typeof data === 'object') return JSON.stringify(data);\n throw new Error('expected text payload for this model format');\n}\n\nfunction asBuffer(data: unknown): ArrayBuffer {\n if (data instanceof ArrayBuffer) return data;\n if (ArrayBuffer.isView(data)) {\n const view = data as ArrayBufferView;\n return view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength);\n }\n throw new Error('expected binary payload for this model format');\n}\n\nfunction wrapGroup(object: Object3D, animations: AnimationClip[] = []): ParsedModel {\n if (object instanceof Group) {\n return { scene: object, animations };\n }\n const scene = new Group();\n scene.add(object);\n return { scene, animations };\n}\n\nfunction geometryToModel(geometry: BufferGeometry): ParsedModel {\n geometry.computeVertexNormals?.();\n const mesh = new Mesh(\n geometry,\n new MeshStandardMaterial({ color: 0x888888, metalness: 0.1, roughness: 0.8 }),\n );\n const scene = new Group();\n scene.add(mesh);\n return { scene, animations: [] };\n}\n\nfunction modelPayload(res: ResourceStruct): { data: unknown; type: string; path: string } {\n const slot = res.src?.model || res.src?.glb || res.src?.gltf;\n const data = res.data?.model ?? res.data?.glb ?? res.data?.gltf;\n if (data == null) {\n throw new Error(\n `Resource \"${res.name}\" has no model data; use RESOURCE_TYPE.MODEL with src.model.url`,\n );\n }\n const type = String(slot?.type || 'glb').toLowerCase();\n return { data, type, path: dirOf(slot?.url || '') };\n}\n\nfunction ensureGltfExtras(loader: GLTFLoader, renderer?: WebGLRenderer) {\n if (!sharedDraco) {\n sharedDraco = new DRACOLoader();\n sharedDraco.setDecoderPath(DRACO_DECODER_PATH);\n }\n loader.setDRACOLoader(sharedDraco);\n\n if (!sharedKtx2) {\n sharedKtx2 = new KTX2Loader();\n sharedKtx2.setTranscoderPath(BASIS_TRANSCODER_PATH);\n }\n if (renderer && ktx2DetectedFor !== renderer) {\n sharedKtx2.detectSupport(renderer);\n ktx2DetectedFor = renderer;\n }\n loader.setKTX2Loader(sharedKtx2);\n loader.setMeshoptDecoder(MeshoptDecoder);\n}\n\nfunction parseGltf(\n data: unknown,\n path: string,\n renderer?: WebGLRenderer,\n): Promise<ParsedModel> {\n const loader = new GLTFLoader();\n ensureGltfExtras(loader, renderer);\n const payload =\n typeof data === 'object' && data && !(data instanceof ArrayBuffer) && !ArrayBuffer.isView(data)\n ? JSON.stringify(data)\n : data instanceof ArrayBuffer || ArrayBuffer.isView(data)\n ? asBuffer(data)\n : asText(data);\n\n return new Promise((resolve, reject) => {\n loader.parse(\n payload as ArrayBuffer | string,\n path,\n (gltf) => {\n resolve(wrapGroup(gltf.scene, gltf.animations || []));\n },\n (err) => {\n reject(err instanceof Error ? err : new Error(String(err)));\n },\n );\n });\n}\n\nasync function parseFbx(data: unknown, path: string): Promise<ParsedModel> {\n const loader = new FBXLoader();\n const object = loader.parse(asBuffer(data), path);\n const animations = (object.animations || []) as AnimationClip[];\n return wrapGroup(object, animations);\n}\n\nasync function parseObj(res: ResourceStruct, data: unknown, path: string): Promise<ParsedModel> {\n const objLoader = new OBJLoader();\n const mtlText = res.data?.mtl;\n if (mtlText != null) {\n const mtlLoader = new MTLLoader();\n const mtlPath = dirOf(res.src?.mtl?.url || '') || path;\n const materials = mtlLoader.parse(asText(mtlText), mtlPath);\n materials.preload();\n objLoader.setMaterials(materials);\n }\n return wrapGroup(objLoader.parse(asText(data)));\n}\n\nasync function parseCollada(data: unknown, path: string): Promise<ParsedModel> {\n const loader = new ColladaLoader();\n const result = loader.parse(asText(data), path);\n return wrapGroup(result.scene, result.animations || []);\n}\n\nexport async function parseModelResource(\n res: ResourceStruct,\n renderer?: WebGLRenderer,\n): Promise<ParsedModel> {\n const { data, type, path } = modelPayload(res);\n switch (type) {\n case 'glb':\n case 'gltf':\n return parseGltf(data, path, renderer);\n case 'fbx':\n return parseFbx(data, path);\n case 'obj':\n return parseObj(res, data, path);\n case 'stl':\n return geometryToModel(new STLLoader().parse(asBuffer(data)));\n case 'ply':\n return geometryToModel(new PLYLoader().parse(asBuffer(data)));\n case 'dae':\n case 'collada':\n return parseCollada(data, path);\n default:\n throw new Error(\n `Unsupported 3D model type \"${type}\" for resource \"${res.name}\". ` +\n 'Use glb, gltf, fbx, obj, stl, dae, or ply.',\n );\n }\n}\n\nfunction createModelInstance(res: ResourceStruct): ModelResourceInstance {\n let cached: ParsedModel | null = null;\n return {\n async parse(renderer?: WebGLRenderer) {\n if (!cached) {\n cached = await parseModelResource(res, renderer);\n }\n return cached;\n },\n dispose() {\n cached = null;\n },\n };\n}\n\nresource.registerInstance(RESOURCE_TYPE.MODEL, (res) => createModelInstance(res));\nresource.registerInstance(RESOURCE_TYPE.GLB, (res) => createModelInstance(res));\nresource.registerDestroy(RESOURCE_TYPE.MODEL, ({ instance }) => {\n instance?.dispose?.();\n});\nresource.registerDestroy(RESOURCE_TYPE.GLB, ({ instance }) => {\n instance?.dispose?.();\n});\n","import { decorators, ComponentChanged, OBSERVER_TYPE, GameObject } from '@combos-fun/engine';\nimport {\n Renderer3D,\n Renderer3DSystem,\n requireNamedResource,\n Transform3D,\n VisualPoseBridge,\n} from '@combos-fun/plugin-renderer-3d';\nimport { Group } from 'three';\nimport { clone as cloneSkinned } from 'three/addons/utils/SkeletonUtils.js';\nimport Model3D from './component';\nimport './parseModel';\nimport type { ModelResourceInstance } from './parseModel';\n\n@decorators.componentObserver({\n Model3D: [\n 'resource',\n 'positionX', 'positionY', 'positionZ',\n 'rotationX', 'rotationY', 'rotationZ',\n 'scaleX', 'scaleY', 'scaleZ',\n 'speed', 'animationIndex',\n ],\n})\nexport default class Model3DSystem extends Renderer3D {\n static systemName = 'Model3DSystem';\n name: string = 'Model3DSystem';\n\n private poseBridges = new Map<number, VisualPoseBridge>();\n\n init() {\n const renderer3DSystem = this.game.getSystem(Renderer3DSystem) as Renderer3DSystem;\n renderer3DSystem.rendererManager.register(this);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Model3D') return;\n\n const component = changed.component as Model3D;\n\n if (changed.type === OBSERVER_TYPE.ADD) {\n this.handleAdd(changed.gameObject, component);\n } else if (changed.type === OBSERVER_TYPE.CHANGE) {\n this.handleChange(changed);\n } else if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.increaseAsyncId(changed.gameObject.id);\n this.poseBridges.delete(changed.gameObject.id);\n this.threeContext.removeModel(changed.gameObject.id);\n }\n }\n\n rendererUpdate(gameObject: GameObject) {\n const component = gameObject.getComponent(Model3D) as Model3D;\n if (!component) return;\n\n const model = this.threeContext.models.get(gameObject.id);\n if (!model) return;\n\n let bridge = this.poseBridges.get(gameObject.id);\n if (!bridge) {\n bridge = new VisualPoseBridge();\n this.poseBridges.set(gameObject.id, bridge);\n }\n const transform = gameObject.getComponent(Transform3D) as Transform3D | undefined;\n if (!bridge.sync(component, transform)) {\n model.position.set(0, 0, 0);\n model.rotation.set(0, 0, 0);\n model.scale.set(1, 1, 1);\n return;\n }\n\n model.position.set(component.positionX, component.positionY, component.positionZ);\n model.rotation.set(component.rotationX, component.rotationY, component.rotationZ);\n model.scale.set(component.scaleX, component.scaleY, component.scaleZ);\n }\n\n private async handleAdd(gameObject: GameObject, component: Model3D) {\n if (!component.resource) return;\n\n const asyncId = this.increaseAsyncId(gameObject.id);\n await this.attachNamedModel(gameObject, component.resource);\n if (!this.validateAsyncId(gameObject.id, asyncId)) return;\n\n if (component.autoPlay) {\n this.threeContext.playAnimation(\n gameObject.id,\n component.animationIndex,\n component.speed,\n );\n }\n }\n\n private async handleChange(changed: ComponentChanged) {\n const component = changed.component as Model3D;\n const changedProp = changed.prop?.prop?.[0];\n\n if (changedProp === 'resource') {\n this.poseBridges.delete(changed.gameObject.id);\n this.threeContext.removeModel(changed.gameObject.id);\n if (!component.resource) return;\n\n const asyncId = this.increaseAsyncId(changed.gameObject.id);\n await this.attachNamedModel(changed.gameObject, component.resource);\n if (!this.validateAsyncId(changed.gameObject.id, asyncId)) return;\n\n if (component.autoPlay) {\n this.threeContext.playAnimation(\n changed.gameObject.id,\n component.animationIndex,\n component.speed,\n );\n }\n }\n\n if (changedProp === 'speed' || changedProp === 'animationIndex') {\n this.threeContext.playAnimation(\n changed.gameObject.id,\n component.animationIndex,\n component.speed,\n );\n }\n }\n\n private async attachNamedModel(gameObject: GameObject, name: string) {\n const res = await requireNamedResource(name);\n const instance = res.instance as ModelResourceInstance | undefined;\n if (!instance || typeof instance.parse !== 'function') {\n throw new Error(\n `Resource \"${name}\" is not a MODEL instance; register RESOURCE_TYPE.MODEL and import Model3DSystem`,\n );\n }\n const parsed = await instance.parse(this.threeContext.renderer);\n const clone = cloneSkinned(parsed.scene) as Group;\n this.threeContext.attachParsedModel(gameObject.id, clone, parsed.animations, gameObject);\n }\n}\n"],"names":["clone","cloneSkinned"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@combos-fun/plugin-renderer-3d-model",
3
- "version": "0.0.42",
3
+ "version": "0.0.45",
4
4
  "description": "Named 3D model loader (glTF/GLB, FBX, OBJ, STL, Collada, PLY) and animator",
5
5
  "main": "index.js",
6
6
  "module": "dist/plugin-renderer-3d-model.esm.js",
@@ -27,9 +27,9 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "three": "^0.172.0",
30
- "@combos-fun/engine": "0.0.42",
31
- "@combos-fun/inspector-decorator": "0.0.42",
32
- "@combos-fun/plugin-renderer-3d": "0.0.42"
30
+ "@combos-fun/plugin-renderer-3d": "0.0.45",
31
+ "@combos-fun/inspector-decorator": "0.0.45",
32
+ "@combos-fun/engine": "0.0.45"
33
33
  },
34
34
  "keywords": [
35
35
  "combos-fun",