@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 +8 -0
- package/dist/plugin-renderer-3d-model.cjs.js +19 -4
- package/dist/plugin-renderer-3d-model.cjs.js.map +1 -1
- package/dist/plugin-renderer-3d-model.cjs.prod.js +1 -1
- package/dist/plugin-renderer-3d-model.d.ts +1 -0
- package/dist/plugin-renderer-3d-model.esm.js +20 -5
- package/dist/plugin-renderer-3d-model.esm.js.map +1 -1
- package/package.json +4 -4
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
|
|
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
|
|
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(
|
|
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":"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"}
|
|
@@ -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
|
|
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
|
|
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
|
|
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(
|
|
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.
|
|
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/
|
|
31
|
-
"@combos-fun/inspector-decorator": "0.0.
|
|
32
|
-
"@combos-fun/
|
|
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",
|