@combos-fun/plugin-renderer-3d-model 0.1.13 → 0.1.14-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -8,7 +8,6 @@ var SkeletonUtils_js = require('three/addons/utils/SkeletonUtils.js');
|
|
|
8
8
|
var three = require('three');
|
|
9
9
|
var GLTFLoader_js = require('three/addons/loaders/GLTFLoader.js');
|
|
10
10
|
var DRACOLoader_js = require('three/addons/loaders/DRACOLoader.js');
|
|
11
|
-
var KTX2Loader_js = require('three/addons/loaders/KTX2Loader.js');
|
|
12
11
|
var FBXLoader_js = require('three/addons/loaders/FBXLoader.js');
|
|
13
12
|
var OBJLoader_js = require('three/addons/loaders/OBJLoader.js');
|
|
14
13
|
var MTLLoader_js = require('three/addons/loaders/MTLLoader.js');
|
|
@@ -168,12 +167,8 @@ tslib.__decorate([
|
|
|
168
167
|
})
|
|
169
168
|
], Model3D.prototype, "scaleZ", void 0);
|
|
170
169
|
|
|
171
|
-
const THREE_ADDON_CDN = 'https://unpkg.com/three@0.172.0/examples/jsm/libs';
|
|
172
170
|
const DRACO_DECODER_PATH = 'https://www.gstatic.com/draco/versioned/decoders/1.5.7/';
|
|
173
|
-
const BASIS_TRANSCODER_PATH = `${THREE_ADDON_CDN}/basis/`;
|
|
174
171
|
let sharedDraco = null;
|
|
175
|
-
let sharedKtx2 = null;
|
|
176
|
-
let ktx2DetectedFor = null;
|
|
177
172
|
function dirOf(url) {
|
|
178
173
|
const clean = String(url || '').split('?')[0].split('#')[0];
|
|
179
174
|
const slash = clean.lastIndexOf('/');
|
|
@@ -230,15 +225,7 @@ function ensureGltfExtras(loader, renderer) {
|
|
|
230
225
|
sharedDraco.setDecoderPath(DRACO_DECODER_PATH);
|
|
231
226
|
}
|
|
232
227
|
loader.setDRACOLoader(sharedDraco);
|
|
233
|
-
|
|
234
|
-
sharedKtx2 = new KTX2Loader_js.KTX2Loader();
|
|
235
|
-
sharedKtx2.setTranscoderPath(BASIS_TRANSCODER_PATH);
|
|
236
|
-
}
|
|
237
|
-
if (renderer && ktx2DetectedFor !== renderer) {
|
|
238
|
-
sharedKtx2.detectSupport(renderer);
|
|
239
|
-
ktx2DetectedFor = renderer;
|
|
240
|
-
}
|
|
241
|
-
loader.setKTX2Loader(sharedKtx2);
|
|
228
|
+
loader.setKTX2Loader(pluginRenderer3d.ensureKtx2Loader(renderer));
|
|
242
229
|
loader.setMeshoptDecoder(meshopt_decoder_module_js.MeshoptDecoder);
|
|
243
230
|
}
|
|
244
231
|
function parseGltf(data, path, renderer) {
|
|
@@ -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 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
|
+
{"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 { ensureKtx2Loader } from '@combos-fun/plugin-renderer-3d';\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 { 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 DRACO_DECODER_PATH = 'https://www.gstatic.com/draco/versioned/decoders/1.5.7/';\n\nlet sharedDraco: DRACOLoader | 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 loader.setKTX2Loader(ensureKtx2Loader(renderer));\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","ensureKtx2Loader","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/
|
|
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/FBXLoader.js"),c=require("three/addons/loaders/OBJLoader.js"),p=require("three/addons/loaders/MTLLoader.js"),l=require("three/addons/loaders/STLLoader.js"),u=require("three/addons/loaders/ColladaLoader.js"),m=require("three/addons/loaders/PLYLoader.js"),h=require("three/addons/libs/meshopt_decoder.module.js");class y 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"})],y.prototype,"resource",void 0),e.__decorate([r.Field({type:"boolean",group:"Model3D",label:"autoPlay",description:"Start playing automatically when loaded.",editor:"toggle"})],y.prototype,"autoPlay",void 0),e.__decorate([r.Field({type:"number",group:"Model3D",label:"animationIndex",description:"Animation clip index.",editor:"number-stepper"})],y.prototype,"animationIndex",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"speed",description:"Playback speed.",editor:"number-stepper"})],y.prototype,"speed",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"positionX",description:"Local X position.",editor:"number-stepper"})],y.prototype,"positionX",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"positionY",description:"Local Y position.",editor:"number-stepper"})],y.prototype,"positionY",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"positionZ",description:"Local Z position.",editor:"number-stepper"})],y.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"})],y.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"})],y.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"})],y.prototype,"rotationZ",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"scaleX",description:"Scale on X.",editor:"number-stepper"})],y.prototype,"scaleX",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"scaleY",description:"Scale on Y.",editor:"number-stepper"})],y.prototype,"scaleY",void 0),e.__decorate([r.Field({type:"number",step:.1,group:"Model3D",label:"scaleZ",description:"Scale on Z.",editor:"number-stepper"})],y.prototype,"scaleZ",void 0);let f=null;function g(e){const t=String(e||"").split("?")[0].split("#")[0],r=t.lastIndexOf("/");return r>=0?t.slice(0,r+1):""}function b(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 E(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 w(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 M(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 D(e,t,r){const n=new i.GLTFLoader;!function(e,t){f||(f=new a.DRACOLoader,f.setDecoderPath("https://www.gstatic.com/draco/versioned/decoders/1.5.7/")),e.setDRACOLoader(f),e.setKTX2Loader(o.ensureKtx2Loader(t)),e.setMeshoptDecoder(h.MeshoptDecoder)}(n,r);const s="object"!=typeof e||!e||e instanceof ArrayBuffer||ArrayBuffer.isView(e)?e instanceof ArrayBuffer||ArrayBuffer.isView(e)?E(e):b(e):JSON.stringify(e);return new Promise((e,r)=>{n.parse(s,t,t=>{e(w(t.scene,t.animations||[]))},e=>{r(e instanceof Error?e:new Error(String(e)))})})}async function L(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:g(t?.url||"")}}(e);switch(o){case"glb":case"gltf":return D(r,n,t);case"fbx":return async function(e,t){const r=(new d.FBXLoader).parse(E(e),t);return w(r,r.animations||[])}(r,n);case"obj":return async function(e,t,r){const o=new c.OBJLoader,n=e.data?.mtl;if(null!=n){const t=new p.MTLLoader,s=g(e.src?.mtl?.url||"")||r,i=t.parse(b(n),s);i.preload(),o.setMaterials(i)}return w(o.parse(b(t)))}(e,r,n);case"stl":return M((new l.STLLoader).parse(E(r)));case"ply":return M((new m.PLYLoader).parse(E(r)));case"dae":case"collada":return async function(e,t){const r=(new u.ColladaLoader).parse(b(e),t);return w(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 O(e){let t=null;return{parse:async r=>(t||(t=await L(e,r)),t),dispose(){t=null}}}t.resource.registerInstance(t.RESOURCE_TYPE.MODEL,e=>O(e)),t.resource.registerInstance(t.RESOURCE_TYPE.GLB,e=>O(e)),t.resource.registerDestroy(t.RESOURCE_TYPE.MODEL,({instance:e})=>{e?.dispose?.()}),t.resource.registerDestroy(t.RESOURCE_TYPE.GLB,({instance:e})=>{e?.dispose?.()});let _=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(y);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)}};_=e.__decorate([t.decorators.componentObserver({Model3D:["resource","positionX","positionY","positionZ","rotationX","rotationY","rotationZ","scaleX","scaleY","scaleZ","speed","animationIndex"]})],_);var x=_;exports.Model3D=y,exports.Model3DSystem=x;
|
|
@@ -1,12 +1,11 @@
|
|
|
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, VisualPoseBridge, Transform3D, requireNamedResource } from '@combos-fun/plugin-renderer-3d';
|
|
4
|
+
import { ensureKtx2Loader, 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';
|
|
8
8
|
import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';
|
|
9
|
-
import { KTX2Loader } from 'three/addons/loaders/KTX2Loader.js';
|
|
10
9
|
import { FBXLoader } from 'three/addons/loaders/FBXLoader.js';
|
|
11
10
|
import { OBJLoader } from 'three/addons/loaders/OBJLoader.js';
|
|
12
11
|
import { MTLLoader } from 'three/addons/loaders/MTLLoader.js';
|
|
@@ -166,12 +165,8 @@ __decorate([
|
|
|
166
165
|
})
|
|
167
166
|
], Model3D.prototype, "scaleZ", void 0);
|
|
168
167
|
|
|
169
|
-
const THREE_ADDON_CDN = 'https://unpkg.com/three@0.172.0/examples/jsm/libs';
|
|
170
168
|
const DRACO_DECODER_PATH = 'https://www.gstatic.com/draco/versioned/decoders/1.5.7/';
|
|
171
|
-
const BASIS_TRANSCODER_PATH = `${THREE_ADDON_CDN}/basis/`;
|
|
172
169
|
let sharedDraco = null;
|
|
173
|
-
let sharedKtx2 = null;
|
|
174
|
-
let ktx2DetectedFor = null;
|
|
175
170
|
function dirOf(url) {
|
|
176
171
|
const clean = String(url || '').split('?')[0].split('#')[0];
|
|
177
172
|
const slash = clean.lastIndexOf('/');
|
|
@@ -228,15 +223,7 @@ function ensureGltfExtras(loader, renderer) {
|
|
|
228
223
|
sharedDraco.setDecoderPath(DRACO_DECODER_PATH);
|
|
229
224
|
}
|
|
230
225
|
loader.setDRACOLoader(sharedDraco);
|
|
231
|
-
|
|
232
|
-
sharedKtx2 = new KTX2Loader();
|
|
233
|
-
sharedKtx2.setTranscoderPath(BASIS_TRANSCODER_PATH);
|
|
234
|
-
}
|
|
235
|
-
if (renderer && ktx2DetectedFor !== renderer) {
|
|
236
|
-
sharedKtx2.detectSupport(renderer);
|
|
237
|
-
ktx2DetectedFor = renderer;
|
|
238
|
-
}
|
|
239
|
-
loader.setKTX2Loader(sharedKtx2);
|
|
226
|
+
loader.setKTX2Loader(ensureKtx2Loader(renderer));
|
|
240
227
|
loader.setMeshoptDecoder(MeshoptDecoder);
|
|
241
228
|
}
|
|
242
229
|
function parseGltf(data, path, renderer) {
|
|
@@ -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 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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"}
|
|
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 { ensureKtx2Loader } from '@combos-fun/plugin-renderer-3d';\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 { 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 DRACO_DECODER_PATH = 'https://www.gstatic.com/draco/versioned/decoders/1.5.7/';\n\nlet sharedDraco: DRACOLoader | 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 loader.setKTX2Loader(ensureKtx2Loader(renderer));\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.1.
|
|
3
|
+
"version": "0.1.14-beta.1",
|
|
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.1.
|
|
31
|
-
"@combos-fun/
|
|
32
|
-
"@combos-fun/
|
|
30
|
+
"@combos-fun/engine": "0.1.14-beta.1",
|
|
31
|
+
"@combos-fun/plugin-renderer-3d": "0.1.14-beta.1",
|
|
32
|
+
"@combos-fun/inspector-decorator": "0.1.14-beta.1"
|
|
33
33
|
},
|
|
34
34
|
"keywords": [
|
|
35
35
|
"combos-fun",
|