@combos-fun/plugin-renderer-3d-material 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.
- package/dist/plugin-renderer-3d-material.cjs.js +2 -1
- package/dist/plugin-renderer-3d-material.cjs.js.map +1 -1
- package/dist/plugin-renderer-3d-material.cjs.prod.js +1 -1
- package/dist/plugin-renderer-3d-material.esm.js +2 -1
- package/dist/plugin-renderer-3d-material.esm.js.map +1 -1
- package/package.json +4 -4
|
@@ -378,7 +378,8 @@ let Material3DSystem = class Material3DSystem extends pluginRenderer3d.Renderer3
|
|
|
378
378
|
shader = await loadShaderSource(component.resource);
|
|
379
379
|
}
|
|
380
380
|
if (component.map) {
|
|
381
|
-
mapOverride = await pluginRenderer3d.textureFromNamedImage(component.map);
|
|
381
|
+
mapOverride = await pluginRenderer3d.textureFromNamedImage(component.map, this.threeContext.renderer);
|
|
382
|
+
this.threeContext.configureTexture(mapOverride);
|
|
382
383
|
}
|
|
383
384
|
}
|
|
384
385
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-renderer-3d-material.cjs.js","sources":["../lib/component.ts","../lib/meshes.ts","../lib/createMaterial.ts","../lib/shaderSource.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport { Field } from '@combos-fun/inspector-decorator';\n\nexport type Material3DKind = 'standard' | 'basic' | 'lambert' | 'toon' | 'physical' | 'shader';\n\nexport type Material3DUniformValue = number | boolean | number[];\n\nexport interface Material3DParams {\n type?: Material3DKind | string;\n resource?: string;\n node?: string;\n uniforms?: Record<string, Material3DUniformValue>;\n color?: number;\n opacity?: number;\n roughness?: number;\n metalness?: number;\n emissive?: number;\n wireframe?: boolean;\n doubleSide?: boolean;\n map?: string;\n}\n\nexport default class Material3D extends Component<Material3DParams> {\n static componentName: string = 'Material3D';\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'type',\n description: 'Three material kind.',\n editor: 'enum',\n enumOptions: ['standard', 'basic', 'lambert', 'toon', 'physical', 'shader'],\n })\n type: string = 'standard';\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'resource',\n description: 'SHADER resource name when type is shader.',\n editor: 'text',\n })\n resource: string = '';\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'node',\n description: 'Object3D.name to target. Empty = all meshes on this GO.',\n editor: 'text',\n })\n node: string = '';\n\n uniforms: Record<string, Material3DUniformValue> = {};\n\n @Field({\n type: 'number',\n group: 'Material3D',\n label: 'color',\n description: 'Tint (hex). Multiplies map.',\n editor: 'number-stepper',\n })\n color: number = 0xffffff;\n\n @Field({\n type: 'number',\n step: 0.01,\n min: 0,\n max: 1,\n group: 'Material3D',\n label: 'opacity',\n editor: 'number-slider',\n })\n opacity: number = 1;\n\n @Field({\n type: 'number',\n step: 0.05,\n min: 0,\n max: 1,\n group: 'Material3D',\n label: 'roughness',\n editor: 'number-slider',\n })\n roughness: number = 1;\n\n @Field({\n type: 'number',\n step: 0.05,\n min: 0,\n max: 1,\n group: 'Material3D',\n label: 'metalness',\n editor: 'number-slider',\n })\n metalness: number = 0;\n\n @Field({\n type: 'number',\n group: 'Material3D',\n label: 'emissive',\n editor: 'number-stepper',\n })\n emissive: number = 0;\n\n @Field({\n type: 'boolean',\n group: 'Material3D',\n label: 'wireframe',\n editor: 'toggle',\n })\n wireframe: boolean = false;\n\n @Field({\n type: 'boolean',\n group: 'Material3D',\n label: 'doubleSide',\n editor: 'toggle',\n })\n doubleSide: boolean = false;\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'map',\n description: 'IMAGE resource name. Empty keeps the mesh map.',\n editor: 'text',\n })\n map: string = '';\n\n init(obj?: Material3DParams) {\n if (!obj) return;\n Object.assign(this, obj);\n if (obj.uniforms) this.uniforms = obj.uniforms;\n }\n}\n","import type { Mesh, Object3D } from 'three';\n\nconst TRANSFORM3D_ROOT = 'combosTransform3D';\n\nfunction isTransform3DRoot(object: Object3D): boolean {\n return !!object.userData?.[TRANSFORM3D_ROOT];\n}\n\nfunction isMesh(object: Object3D): object is Mesh {\n return !!(object as Mesh).isMesh;\n}\n\nfunction isInstanced(object: Object3D): boolean {\n return !!(object as Mesh & { isInstancedMesh?: boolean }).isInstancedMesh;\n}\n\nfunction matchesNode(object: Object3D, node: string): boolean {\n if (!node) return true;\n let current: Object3D | null = object;\n while (current) {\n if (current.name === node) return true;\n current = current.parent;\n }\n return false;\n}\n\nexport function collectTargetMeshes(\n root: Object3D | undefined,\n node = '',\n skipNestedRoots = false,\n): Mesh[] {\n if (!root) return [];\n const out: Mesh[] = [];\n const walk = (object: Object3D) => {\n if (skipNestedRoots && object !== root && isTransform3DRoot(object)) return;\n if (isMesh(object) && !isInstanced(object) && matchesNode(object, node)) {\n out.push(object);\n }\n for (const child of object.children) {\n walk(child);\n }\n };\n walk(root);\n return out;\n}\n","import {\n DoubleSide,\n FrontSide,\n MeshBasicMaterial,\n MeshLambertMaterial,\n MeshPhysicalMaterial,\n MeshStandardMaterial,\n MeshToonMaterial,\n ShaderMaterial,\n} from 'three';\nimport type { Material, Texture } from 'three';\nimport type Material3D from './component';\nimport type { Material3DUniformValue } from './component';\n\nconst MAP_KEYS = [\n 'map',\n 'normalMap',\n 'roughnessMap',\n 'metalnessMap',\n 'emissiveMap',\n 'aoMap',\n 'alphaMap',\n] as const;\n\nexport function firstMaterial(material: Material | Material[]): Material {\n return Array.isArray(material) ? material[0] : material;\n}\n\nfunction copyMaps(target: Material, source: Material | undefined, skipMap: boolean) {\n if (!source) return;\n for (const key of MAP_KEYS) {\n if (skipMap && key === 'map') continue;\n if (key in target && key in source) {\n (target as Material & Record<string, unknown>)[key] =\n (source as Material & Record<string, unknown>)[key];\n }\n }\n}\n\nexport function threeUniformValue(value: Material3DUniformValue): number | number[] {\n if (typeof value === 'boolean') return value ? 1 : 0;\n return value;\n}\n\nexport function createMaterial(\n component: Material3D,\n template: Material | undefined,\n shader: { vertex: string; fragment: string } | null,\n mapOverride: Texture | null,\n): Material {\n const skipMap = !!mapOverride;\n const hasMap = !!(mapOverride || (template && 'map' in template && (template as MeshStandardMaterial).map));\n const common = {\n color: component.color,\n opacity: component.opacity,\n transparent: component.opacity < 1 || hasMap || !!(template as MeshStandardMaterial | undefined)?.transparent,\n wireframe: component.wireframe,\n side: component.doubleSide ? DoubleSide : FrontSide,\n map: mapOverride,\n };\n\n if (component.type === 'shader') {\n if (!shader) {\n throw new Error('Material3D shader type requires a SHADER resource');\n }\n const uniforms: Record<string, { value: number | number[] }> = {};\n for (const [key, value] of Object.entries(component.uniforms || {})) {\n uniforms[key] = { value: threeUniformValue(value) };\n }\n return new ShaderMaterial({\n vertexShader: shader.vertex,\n fragmentShader: shader.fragment,\n uniforms,\n transparent: common.transparent,\n opacity: common.opacity,\n wireframe: common.wireframe,\n side: common.side,\n });\n }\n\n let material: Material;\n switch (component.type) {\n case 'basic':\n material = new MeshBasicMaterial(common);\n break;\n case 'lambert':\n material = new MeshLambertMaterial({ ...common, emissive: component.emissive });\n break;\n case 'toon':\n material = new MeshToonMaterial(common);\n break;\n case 'physical':\n material = new MeshPhysicalMaterial({\n ...common,\n roughness: component.roughness,\n metalness: component.metalness,\n emissive: component.emissive,\n });\n break;\n case 'standard':\n default:\n material = new MeshStandardMaterial({\n ...common,\n roughness: component.roughness,\n metalness: component.metalness,\n emissive: component.emissive,\n });\n break;\n }\n\n copyMaps(material, template, skipMap);\n if (mapOverride) {\n (material as MeshStandardMaterial).map = mapOverride;\n }\n return material;\n}\n\nexport function writeShaderUniforms(\n material: Material,\n uniforms: Record<string, Material3DUniformValue> | undefined,\n time: number,\n) {\n const shader = material as ShaderMaterial;\n if (!shader.isShaderMaterial || !shader.uniforms) return;\n for (const [key, value] of Object.entries(uniforms || {})) {\n const next = (key === 'time' || key === 'uTime') ? time : threeUniformValue(value);\n if (shader.uniforms[key]) {\n shader.uniforms[key].value = next;\n } else {\n shader.uniforms[key] = { value: next };\n }\n }\n}\n","import { resource } from '@combos-fun/engine';\n\nexport const DEFAULT_THREE_VERTEX = `varying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\n\nexport async function loadShaderSource(name: string): Promise<{ vertex: string; fragment: string }> {\n const trimmed = String(name ?? '').trim();\n if (!trimmed) {\n throw new Error('SHADER resource name is required when Material3D.type is shader');\n }\n const res = await resource.getResource(trimmed);\n if (!res?.name) {\n throw new Error(`Unknown resource \"${trimmed}\"; register RESOURCE_TYPE.SHADER first`);\n }\n const vertex = typeof res.data?.vertex === 'string'\n ? res.data.vertex\n : typeof res.instance?.vertex === 'string' ? res.instance.vertex : '';\n const fragment = typeof res.data?.fragment === 'string'\n ? res.data.fragment\n : typeof res.instance?.fragment === 'string' ? res.instance.fragment : '';\n if (!fragment) {\n throw new Error(`SHADER \"${trimmed}\" missing fragment`);\n }\n return { vertex: vertex || DEFAULT_THREE_VERTEX, fragment };\n}\n","import { decorators, ComponentChanged, OBSERVER_TYPE, GameObject, UpdateParams } from '@combos-fun/engine';\nimport {\n Renderer3D,\n Renderer3DSystem,\n textureFromNamedImage,\n} from '@combos-fun/plugin-renderer-3d';\nimport type { Material, Mesh, Object3D, Texture } from 'three';\nimport Material3D from './component';\nimport { collectTargetMeshes } from './meshes';\nimport { createMaterial, firstMaterial, writeShaderUniforms } from './createMaterial';\nimport { loadShaderSource } from './shaderSource';\n\ninterface AppliedMesh {\n mesh: Mesh;\n originals: Material | Material[];\n created: Material;\n}\n\ninterface MaterialEntry {\n applied: AppliedMesh[];\n ownedTextures: Texture[];\n signature: string;\n time: number;\n}\n\n@decorators.componentObserver({\n Material3D: [\n 'type', 'resource', 'node', 'color', 'opacity', 'roughness', 'metalness',\n 'emissive', 'wireframe', 'doubleSide', 'map',\n { prop: ['uniforms'], deep: true },\n ],\n})\nexport default class Material3DSystem extends Renderer3D {\n static systemName = 'Material3DSystem';\n name: string = 'Material3DSystem';\n private entries: Map<number, MaterialEntry> = new Map();\n private deltaSeconds = 1 / 60;\n\n init() {\n const renderer3DSystem = this.game.getSystem(Renderer3DSystem) as Renderer3DSystem;\n renderer3DSystem.rendererManager.register(this);\n }\n\n override update(e?: UpdateParams) {\n this.deltaSeconds = (e?.deltaTime ?? 16.67) / 1000;\n super.update(e);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Material3D') return;\n if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.restore(changed.gameObject.id);\n return;\n }\n if (changed.type === OBSERVER_TYPE.CHANGE && changed.prop?.prop?.[0] === 'uniforms') {\n this.writeUniforms(changed.gameObject.id, changed.component as Material3D);\n return;\n }\n const entry = this.entries.get(changed.gameObject.id);\n if (entry) entry.signature = '';\n this.apply(changed.gameObject, changed.component as Material3D);\n }\n\n rendererUpdate(gameObject: GameObject) {\n const component = gameObject.getComponent(Material3D) as Material3D;\n if (!component) return;\n const entry = this.entries.get(gameObject.id);\n const root = this.visualRoot(gameObject.id);\n const meshes = collectTargetMeshes(root, component.node, !this.threeContext.models.get(gameObject.id));\n const signature = this.signature(root, meshes);\n if (!entry || entry.signature !== signature) {\n this.apply(gameObject, component);\n return;\n }\n entry.time += this.deltaSeconds;\n this.writeUniforms(gameObject.id, component);\n }\n\n private visualRoot(id: number): Object3D | undefined {\n return this.threeContext.models.get(id) || this.threeContext.object3DFor(id);\n }\n\n private signature(root: Object3D | undefined, meshes: Mesh[]): string {\n if (!root || !meshes.length) return '';\n return `${root.uuid}|${meshes.map((mesh) => mesh.uuid).join(',')}`;\n }\n\n private async apply(gameObject: GameObject, component: Material3D) {\n const root = this.visualRoot(gameObject.id);\n const skipNested = !this.threeContext.models.get(gameObject.id);\n const meshes = collectTargetMeshes(root, component.node, skipNested);\n if (!meshes.length) return;\n const asyncId = this.increaseAsyncId(gameObject.id);\n\n let shader: { vertex: string; fragment: string } | null = null;\n let mapOverride: Texture | null = null;\n try {\n if (component.type === 'shader') {\n shader = await loadShaderSource(component.resource);\n }\n if (component.map) {\n mapOverride = await textureFromNamedImage(component.map);\n }\n } catch (err) {\n mapOverride?.dispose();\n throw err;\n }\n if (!this.validateAsyncId(gameObject.id, asyncId)) {\n mapOverride?.dispose();\n return;\n }\n\n this.restore(gameObject.id);\n const applied: AppliedMesh[] = [];\n const ownedTextures = mapOverride ? [mapOverride] : [];\n for (const mesh of meshes) {\n const originals = mesh.material;\n const created = createMaterial(\n component,\n firstMaterial(originals),\n shader,\n mapOverride,\n );\n mesh.material = created;\n applied.push({ mesh, originals, created });\n }\n this.entries.set(gameObject.id, {\n applied,\n ownedTextures,\n signature: this.signature(root, meshes),\n time: 0,\n });\n this.writeUniforms(gameObject.id, component);\n }\n\n private writeUniforms(id: number, component: Material3D) {\n const entry = this.entries.get(id);\n if (!entry) return;\n for (const item of entry.applied) {\n writeShaderUniforms(item.created, component.uniforms, entry.time);\n }\n }\n\n private restore(id: number, putBack = true) {\n this.increaseAsyncId(id);\n const entry = this.entries.get(id);\n if (!entry) return;\n for (const item of entry.applied) {\n if (putBack && item.mesh) {\n item.mesh.material = item.originals;\n }\n if (item.created && item.created !== item.originals) {\n item.created.dispose();\n }\n }\n for (const texture of entry.ownedTextures) {\n texture.dispose();\n }\n this.entries.delete(id);\n }\n\n onDestroy() {\n for (const id of [...this.entries.keys()]) {\n this.restore(id);\n }\n }\n}\n"],"names":["Component","__decorate","Field","DoubleSide","FrontSide","ShaderMaterial","MeshBasicMaterial","MeshLambertMaterial","MeshToonMaterial","MeshPhysicalMaterial","MeshStandardMaterial","resource","Renderer3D","Renderer3DSystem","OBSERVER_TYPE","textureFromNamedImage","decorators"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin-renderer-3d-material.cjs.js","sources":["../lib/component.ts","../lib/meshes.ts","../lib/createMaterial.ts","../lib/shaderSource.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport { Field } from '@combos-fun/inspector-decorator';\n\nexport type Material3DKind = 'standard' | 'basic' | 'lambert' | 'toon' | 'physical' | 'shader';\n\nexport type Material3DUniformValue = number | boolean | number[];\n\nexport interface Material3DParams {\n type?: Material3DKind | string;\n resource?: string;\n node?: string;\n uniforms?: Record<string, Material3DUniformValue>;\n color?: number;\n opacity?: number;\n roughness?: number;\n metalness?: number;\n emissive?: number;\n wireframe?: boolean;\n doubleSide?: boolean;\n map?: string;\n}\n\nexport default class Material3D extends Component<Material3DParams> {\n static componentName: string = 'Material3D';\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'type',\n description: 'Three material kind.',\n editor: 'enum',\n enumOptions: ['standard', 'basic', 'lambert', 'toon', 'physical', 'shader'],\n })\n type: string = 'standard';\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'resource',\n description: 'SHADER resource name when type is shader.',\n editor: 'text',\n })\n resource: string = '';\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'node',\n description: 'Object3D.name to target. Empty = all meshes on this GO.',\n editor: 'text',\n })\n node: string = '';\n\n uniforms: Record<string, Material3DUniformValue> = {};\n\n @Field({\n type: 'number',\n group: 'Material3D',\n label: 'color',\n description: 'Tint (hex). Multiplies map.',\n editor: 'number-stepper',\n })\n color: number = 0xffffff;\n\n @Field({\n type: 'number',\n step: 0.01,\n min: 0,\n max: 1,\n group: 'Material3D',\n label: 'opacity',\n editor: 'number-slider',\n })\n opacity: number = 1;\n\n @Field({\n type: 'number',\n step: 0.05,\n min: 0,\n max: 1,\n group: 'Material3D',\n label: 'roughness',\n editor: 'number-slider',\n })\n roughness: number = 1;\n\n @Field({\n type: 'number',\n step: 0.05,\n min: 0,\n max: 1,\n group: 'Material3D',\n label: 'metalness',\n editor: 'number-slider',\n })\n metalness: number = 0;\n\n @Field({\n type: 'number',\n group: 'Material3D',\n label: 'emissive',\n editor: 'number-stepper',\n })\n emissive: number = 0;\n\n @Field({\n type: 'boolean',\n group: 'Material3D',\n label: 'wireframe',\n editor: 'toggle',\n })\n wireframe: boolean = false;\n\n @Field({\n type: 'boolean',\n group: 'Material3D',\n label: 'doubleSide',\n editor: 'toggle',\n })\n doubleSide: boolean = false;\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'map',\n description: 'IMAGE resource name. Empty keeps the mesh map.',\n editor: 'text',\n })\n map: string = '';\n\n init(obj?: Material3DParams) {\n if (!obj) return;\n Object.assign(this, obj);\n if (obj.uniforms) this.uniforms = obj.uniforms;\n }\n}\n","import type { Mesh, Object3D } from 'three';\n\nconst TRANSFORM3D_ROOT = 'combosTransform3D';\n\nfunction isTransform3DRoot(object: Object3D): boolean {\n return !!object.userData?.[TRANSFORM3D_ROOT];\n}\n\nfunction isMesh(object: Object3D): object is Mesh {\n return !!(object as Mesh).isMesh;\n}\n\nfunction isInstanced(object: Object3D): boolean {\n return !!(object as Mesh & { isInstancedMesh?: boolean }).isInstancedMesh;\n}\n\nfunction matchesNode(object: Object3D, node: string): boolean {\n if (!node) return true;\n let current: Object3D | null = object;\n while (current) {\n if (current.name === node) return true;\n current = current.parent;\n }\n return false;\n}\n\nexport function collectTargetMeshes(\n root: Object3D | undefined,\n node = '',\n skipNestedRoots = false,\n): Mesh[] {\n if (!root) return [];\n const out: Mesh[] = [];\n const walk = (object: Object3D) => {\n if (skipNestedRoots && object !== root && isTransform3DRoot(object)) return;\n if (isMesh(object) && !isInstanced(object) && matchesNode(object, node)) {\n out.push(object);\n }\n for (const child of object.children) {\n walk(child);\n }\n };\n walk(root);\n return out;\n}\n","import {\n DoubleSide,\n FrontSide,\n MeshBasicMaterial,\n MeshLambertMaterial,\n MeshPhysicalMaterial,\n MeshStandardMaterial,\n MeshToonMaterial,\n ShaderMaterial,\n} from 'three';\nimport type { Material, Texture } from 'three';\nimport type Material3D from './component';\nimport type { Material3DUniformValue } from './component';\n\nconst MAP_KEYS = [\n 'map',\n 'normalMap',\n 'roughnessMap',\n 'metalnessMap',\n 'emissiveMap',\n 'aoMap',\n 'alphaMap',\n] as const;\n\nexport function firstMaterial(material: Material | Material[]): Material {\n return Array.isArray(material) ? material[0] : material;\n}\n\nfunction copyMaps(target: Material, source: Material | undefined, skipMap: boolean) {\n if (!source) return;\n for (const key of MAP_KEYS) {\n if (skipMap && key === 'map') continue;\n if (key in target && key in source) {\n (target as Material & Record<string, unknown>)[key] =\n (source as Material & Record<string, unknown>)[key];\n }\n }\n}\n\nexport function threeUniformValue(value: Material3DUniformValue): number | number[] {\n if (typeof value === 'boolean') return value ? 1 : 0;\n return value;\n}\n\nexport function createMaterial(\n component: Material3D,\n template: Material | undefined,\n shader: { vertex: string; fragment: string } | null,\n mapOverride: Texture | null,\n): Material {\n const skipMap = !!mapOverride;\n const hasMap = !!(mapOverride || (template && 'map' in template && (template as MeshStandardMaterial).map));\n const common = {\n color: component.color,\n opacity: component.opacity,\n transparent: component.opacity < 1 || hasMap || !!(template as MeshStandardMaterial | undefined)?.transparent,\n wireframe: component.wireframe,\n side: component.doubleSide ? DoubleSide : FrontSide,\n map: mapOverride,\n };\n\n if (component.type === 'shader') {\n if (!shader) {\n throw new Error('Material3D shader type requires a SHADER resource');\n }\n const uniforms: Record<string, { value: number | number[] }> = {};\n for (const [key, value] of Object.entries(component.uniforms || {})) {\n uniforms[key] = { value: threeUniformValue(value) };\n }\n return new ShaderMaterial({\n vertexShader: shader.vertex,\n fragmentShader: shader.fragment,\n uniforms,\n transparent: common.transparent,\n opacity: common.opacity,\n wireframe: common.wireframe,\n side: common.side,\n });\n }\n\n let material: Material;\n switch (component.type) {\n case 'basic':\n material = new MeshBasicMaterial(common);\n break;\n case 'lambert':\n material = new MeshLambertMaterial({ ...common, emissive: component.emissive });\n break;\n case 'toon':\n material = new MeshToonMaterial(common);\n break;\n case 'physical':\n material = new MeshPhysicalMaterial({\n ...common,\n roughness: component.roughness,\n metalness: component.metalness,\n emissive: component.emissive,\n });\n break;\n case 'standard':\n default:\n material = new MeshStandardMaterial({\n ...common,\n roughness: component.roughness,\n metalness: component.metalness,\n emissive: component.emissive,\n });\n break;\n }\n\n copyMaps(material, template, skipMap);\n if (mapOverride) {\n (material as MeshStandardMaterial).map = mapOverride;\n }\n return material;\n}\n\nexport function writeShaderUniforms(\n material: Material,\n uniforms: Record<string, Material3DUniformValue> | undefined,\n time: number,\n) {\n const shader = material as ShaderMaterial;\n if (!shader.isShaderMaterial || !shader.uniforms) return;\n for (const [key, value] of Object.entries(uniforms || {})) {\n const next = (key === 'time' || key === 'uTime') ? time : threeUniformValue(value);\n if (shader.uniforms[key]) {\n shader.uniforms[key].value = next;\n } else {\n shader.uniforms[key] = { value: next };\n }\n }\n}\n","import { resource } from '@combos-fun/engine';\n\nexport const DEFAULT_THREE_VERTEX = `varying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\n\nexport async function loadShaderSource(name: string): Promise<{ vertex: string; fragment: string }> {\n const trimmed = String(name ?? '').trim();\n if (!trimmed) {\n throw new Error('SHADER resource name is required when Material3D.type is shader');\n }\n const res = await resource.getResource(trimmed);\n if (!res?.name) {\n throw new Error(`Unknown resource \"${trimmed}\"; register RESOURCE_TYPE.SHADER first`);\n }\n const vertex = typeof res.data?.vertex === 'string'\n ? res.data.vertex\n : typeof res.instance?.vertex === 'string' ? res.instance.vertex : '';\n const fragment = typeof res.data?.fragment === 'string'\n ? res.data.fragment\n : typeof res.instance?.fragment === 'string' ? res.instance.fragment : '';\n if (!fragment) {\n throw new Error(`SHADER \"${trimmed}\" missing fragment`);\n }\n return { vertex: vertex || DEFAULT_THREE_VERTEX, fragment };\n}\n","import { decorators, ComponentChanged, OBSERVER_TYPE, GameObject, UpdateParams } from '@combos-fun/engine';\nimport {\n Renderer3D,\n Renderer3DSystem,\n textureFromNamedImage,\n} from '@combos-fun/plugin-renderer-3d';\nimport type { Material, Mesh, Object3D, Texture } from 'three';\nimport Material3D from './component';\nimport { collectTargetMeshes } from './meshes';\nimport { createMaterial, firstMaterial, writeShaderUniforms } from './createMaterial';\nimport { loadShaderSource } from './shaderSource';\n\ninterface AppliedMesh {\n mesh: Mesh;\n originals: Material | Material[];\n created: Material;\n}\n\ninterface MaterialEntry {\n applied: AppliedMesh[];\n ownedTextures: Texture[];\n signature: string;\n time: number;\n}\n\n@decorators.componentObserver({\n Material3D: [\n 'type', 'resource', 'node', 'color', 'opacity', 'roughness', 'metalness',\n 'emissive', 'wireframe', 'doubleSide', 'map',\n { prop: ['uniforms'], deep: true },\n ],\n})\nexport default class Material3DSystem extends Renderer3D {\n static systemName = 'Material3DSystem';\n name: string = 'Material3DSystem';\n private entries: Map<number, MaterialEntry> = new Map();\n private deltaSeconds = 1 / 60;\n\n init() {\n const renderer3DSystem = this.game.getSystem(Renderer3DSystem) as Renderer3DSystem;\n renderer3DSystem.rendererManager.register(this);\n }\n\n override update(e?: UpdateParams) {\n this.deltaSeconds = (e?.deltaTime ?? 16.67) / 1000;\n super.update(e);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Material3D') return;\n if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.restore(changed.gameObject.id);\n return;\n }\n if (changed.type === OBSERVER_TYPE.CHANGE && changed.prop?.prop?.[0] === 'uniforms') {\n this.writeUniforms(changed.gameObject.id, changed.component as Material3D);\n return;\n }\n const entry = this.entries.get(changed.gameObject.id);\n if (entry) entry.signature = '';\n this.apply(changed.gameObject, changed.component as Material3D);\n }\n\n rendererUpdate(gameObject: GameObject) {\n const component = gameObject.getComponent(Material3D) as Material3D;\n if (!component) return;\n const entry = this.entries.get(gameObject.id);\n const root = this.visualRoot(gameObject.id);\n const meshes = collectTargetMeshes(root, component.node, !this.threeContext.models.get(gameObject.id));\n const signature = this.signature(root, meshes);\n if (!entry || entry.signature !== signature) {\n this.apply(gameObject, component);\n return;\n }\n entry.time += this.deltaSeconds;\n this.writeUniforms(gameObject.id, component);\n }\n\n private visualRoot(id: number): Object3D | undefined {\n return this.threeContext.models.get(id) || this.threeContext.object3DFor(id);\n }\n\n private signature(root: Object3D | undefined, meshes: Mesh[]): string {\n if (!root || !meshes.length) return '';\n return `${root.uuid}|${meshes.map((mesh) => mesh.uuid).join(',')}`;\n }\n\n private async apply(gameObject: GameObject, component: Material3D) {\n const root = this.visualRoot(gameObject.id);\n const skipNested = !this.threeContext.models.get(gameObject.id);\n const meshes = collectTargetMeshes(root, component.node, skipNested);\n if (!meshes.length) return;\n const asyncId = this.increaseAsyncId(gameObject.id);\n\n let shader: { vertex: string; fragment: string } | null = null;\n let mapOverride: Texture | null = null;\n try {\n if (component.type === 'shader') {\n shader = await loadShaderSource(component.resource);\n }\n if (component.map) {\n mapOverride = await textureFromNamedImage(component.map, this.threeContext.renderer);\n this.threeContext.configureTexture(mapOverride);\n }\n } catch (err) {\n mapOverride?.dispose();\n throw err;\n }\n if (!this.validateAsyncId(gameObject.id, asyncId)) {\n mapOverride?.dispose();\n return;\n }\n\n this.restore(gameObject.id);\n const applied: AppliedMesh[] = [];\n const ownedTextures = mapOverride ? [mapOverride] : [];\n for (const mesh of meshes) {\n const originals = mesh.material;\n const created = createMaterial(\n component,\n firstMaterial(originals),\n shader,\n mapOverride,\n );\n mesh.material = created;\n applied.push({ mesh, originals, created });\n }\n this.entries.set(gameObject.id, {\n applied,\n ownedTextures,\n signature: this.signature(root, meshes),\n time: 0,\n });\n this.writeUniforms(gameObject.id, component);\n }\n\n private writeUniforms(id: number, component: Material3D) {\n const entry = this.entries.get(id);\n if (!entry) return;\n for (const item of entry.applied) {\n writeShaderUniforms(item.created, component.uniforms, entry.time);\n }\n }\n\n private restore(id: number, putBack = true) {\n this.increaseAsyncId(id);\n const entry = this.entries.get(id);\n if (!entry) return;\n for (const item of entry.applied) {\n if (putBack && item.mesh) {\n item.mesh.material = item.originals;\n }\n if (item.created && item.created !== item.originals) {\n item.created.dispose();\n }\n }\n for (const texture of entry.ownedTextures) {\n texture.dispose();\n }\n this.entries.delete(id);\n }\n\n onDestroy() {\n for (const id of [...this.entries.keys()]) {\n this.restore(id);\n }\n }\n}\n"],"names":["Component","__decorate","Field","DoubleSide","FrontSide","ShaderMaterial","MeshBasicMaterial","MeshLambertMaterial","MeshToonMaterial","MeshPhysicalMaterial","MeshStandardMaterial","resource","Renderer3D","Renderer3DSystem","OBSERVER_TYPE","textureFromNamedImage","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"),i=require("@combos-fun/plugin-renderer-3d"),s=require("three");class o extends t.Component{constructor(){super(...arguments),this.type="standard",this.resource="",this.node="",this.uniforms={},this.color=16777215,this.opacity=1,this.roughness=1,this.metalness=0,this.emissive=0,this.wireframe=!1,this.doubleSide=!1,this.map=""}static{this.componentName="Material3D"}init(e){e&&(Object.assign(this,e),e.uniforms&&(this.uniforms=e.uniforms))}}e.__decorate([r.Field({type:"string",group:"Material3D",label:"type",description:"Three material kind.",editor:"enum",enumOptions:["standard","basic","lambert","toon","physical","shader"]})],o.prototype,"type",void 0),e.__decorate([r.Field({type:"string",group:"Material3D",label:"resource",description:"SHADER resource name when type is shader.",editor:"text"})],o.prototype,"resource",void 0),e.__decorate([r.Field({type:"string",group:"Material3D",label:"node",description:"Object3D.name to target. Empty = all meshes on this GO.",editor:"text"})],o.prototype,"node",void 0),e.__decorate([r.Field({type:"number",group:"Material3D",label:"color",description:"Tint (hex). Multiplies map.",editor:"number-stepper"})],o.prototype,"color",void 0),e.__decorate([r.Field({type:"number",step:.01,min:0,max:1,group:"Material3D",label:"opacity",editor:"number-slider"})],o.prototype,"opacity",void 0),e.__decorate([r.Field({type:"number",step:.05,min:0,max:1,group:"Material3D",label:"roughness",editor:"number-slider"})],o.prototype,"roughness",void 0),e.__decorate([r.Field({type:"number",step:.05,min:0,max:1,group:"Material3D",label:"metalness",editor:"number-slider"})],o.prototype,"metalness",void 0),e.__decorate([r.Field({type:"number",group:"Material3D",label:"emissive",editor:"number-stepper"})],o.prototype,"emissive",void 0),e.__decorate([r.Field({type:"boolean",group:"Material3D",label:"wireframe",editor:"toggle"})],o.prototype,"wireframe",void 0),e.__decorate([r.Field({type:"boolean",group:"Material3D",label:"doubleSide",editor:"toggle"})],o.prototype,"doubleSide",void 0),e.__decorate([r.Field({type:"string",group:"Material3D",label:"map",description:"IMAGE resource name. Empty keeps the mesh map.",editor:"text"})],o.prototype,"map",void 0);function n(e,t="",r=!1){if(!e)return[];const i=[],s=o=>{if(!r||o===e||!function(e){return!!e.userData?.combosTransform3D}(o)){(function(e){return!!e.isMesh})(o)&&!function(e){return!!e.isInstancedMesh}(o)&&function(e,t){if(!t)return!0;let r=e;for(;r;){if(r.name===t)return!0;r=r.parent}return!1}(o,t)&&i.push(o);for(const e of o.children)s(e)}};return s(e),i}const a=["map","normalMap","roughnessMap","metalnessMap","emissiveMap","aoMap","alphaMap"];function d(e){return Array.isArray(e)?e[0]:e}function p(e){return"boolean"==typeof e?e?1:0:e}function c(e,t,r,i){const o=!!i,n=!!(i||t&&"map"in t&&t.map),d={color:e.color,opacity:e.opacity,transparent:e.opacity<1||n||!!t?.transparent,wireframe:e.wireframe,side:e.doubleSide?s.DoubleSide:s.FrontSide,map:i};if("shader"===e.type){if(!r)throw new Error("Material3D shader type requires a SHADER resource");const t={};for(const[r,i]of Object.entries(e.uniforms||{}))t[r]={value:p(i)};return new s.ShaderMaterial({vertexShader:r.vertex,fragmentShader:r.fragment,uniforms:t,transparent:d.transparent,opacity:d.opacity,wireframe:d.wireframe,side:d.side})}let c;switch(e.type){case"basic":c=new s.MeshBasicMaterial(d);break;case"lambert":c=new s.MeshLambertMaterial({...d,emissive:e.emissive});break;case"toon":c=new s.MeshToonMaterial(d);break;case"physical":c=new s.MeshPhysicalMaterial({...d,roughness:e.roughness,metalness:e.metalness,emissive:e.emissive});break;default:c=new s.MeshStandardMaterial({...d,roughness:e.roughness,metalness:e.metalness,emissive:e.emissive})}return function(e,t,r){if(t)for(const i of a)r&&"map"===i||i in e&&i in t&&(e[i]=t[i])}(c,t,o),i&&(c.map=i),c}function m(e,t,r){const i=e;if(i.isShaderMaterial&&i.uniforms)for(const[e,s]of Object.entries(t||{})){const t="time"===e||"uTime"===e?r:p(s);i.uniforms[e]?i.uniforms[e].value=t:i.uniforms[e]={value:t}}}let l=class extends i.Renderer3D{constructor(){super(...arguments),this.name="Material3DSystem",this.entries=new Map,this.deltaSeconds=1/60}static{this.systemName="Material3DSystem"}init(){this.game.getSystem(i.Renderer3DSystem).rendererManager.register(this)}update(e){this.deltaSeconds=(e?.deltaTime??16.67)/1e3,super.update(e)}componentChanged(e){if("Material3D"!==e.componentName)return;if(e.type===t.OBSERVER_TYPE.REMOVE)return void this.restore(e.gameObject.id);if(e.type===t.OBSERVER_TYPE.CHANGE&&"uniforms"===e.prop?.prop?.[0])return void this.writeUniforms(e.gameObject.id,e.component);const r=this.entries.get(e.gameObject.id);r&&(r.signature=""),this.apply(e.gameObject,e.component)}rendererUpdate(e){const t=e.getComponent(o);if(!t)return;const r=this.entries.get(e.id),i=this.visualRoot(e.id),s=n(i,t.node,!this.threeContext.models.get(e.id)),a=this.signature(i,s);r&&r.signature===a?(r.time+=this.deltaSeconds,this.writeUniforms(e.id,t)):this.apply(e,t)}visualRoot(e){return this.threeContext.models.get(e)||this.threeContext.object3DFor(e)}signature(e,t){return e&&t.length?`${e.uuid}|${t.map(e=>e.uuid).join(",")}`:""}async apply(e,r){const s=this.visualRoot(e.id),o=!this.threeContext.models.get(e.id),a=n(s,r.node,o);if(!a.length)return;const p=this.increaseAsyncId(e.id);let m=null,l=null;try{"shader"===r.type&&(m=await async function(e){const r=String(e??"").trim();if(!r)throw new Error("SHADER resource name is required when Material3D.type is shader");const i=await t.resource.getResource(r);if(!i?.name)throw new Error(`Unknown resource "${r}"; register RESOURCE_TYPE.SHADER first`);const s="string"==typeof i.data?.vertex?i.data.vertex:"string"==typeof i.instance?.vertex?i.instance.vertex:"",o="string"==typeof i.data?.fragment?i.data.fragment:"string"==typeof i.instance?.fragment?i.instance.fragment:"";if(!o)throw new Error(`SHADER "${r}" missing fragment`);return{vertex:s||"varying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n",fragment:o}}(r.resource)),r.map&&(l=await i.textureFromNamedImage(r.map))}catch(e){throw l?.dispose(),e}if(!this.validateAsyncId(e.id,p))return void l?.dispose();this.restore(e.id);const u=[],h=l?[l]:[];for(const e of a){const t=e.material,i=c(r,d(t),m,l);e.material=i,u.push({mesh:e,originals:t,created:i})}this.entries.set(e.id,{applied:u,ownedTextures:h,signature:this.signature(s,a),time:0}),this.writeUniforms(e.id,r)}writeUniforms(e,t){const r=this.entries.get(e);if(r)for(const e of r.applied)m(e.created,t.uniforms,r.time)}restore(e,t=!0){this.increaseAsyncId(e);const r=this.entries.get(e);if(r){for(const e of r.applied)t&&e.mesh&&(e.mesh.material=e.originals),e.created&&e.created!==e.originals&&e.created.dispose();for(const e of r.ownedTextures)e.dispose();this.entries.delete(e)}}onDestroy(){for(const e of[...this.entries.keys()])this.restore(e)}};l=e.__decorate([t.decorators.componentObserver({Material3D:["type","resource","node","color","opacity","roughness","metalness","emissive","wireframe","doubleSide","map",{prop:["uniforms"],deep:!0}]})],l);var u=l;exports.Material3D=o,exports.Material3DSystem=u,exports.collectTargetMeshes=n;
|
|
1
|
+
"use strict";var e=require("tslib"),t=require("@combos-fun/engine"),r=require("@combos-fun/inspector-decorator"),i=require("@combos-fun/plugin-renderer-3d"),s=require("three");class o extends t.Component{constructor(){super(...arguments),this.type="standard",this.resource="",this.node="",this.uniforms={},this.color=16777215,this.opacity=1,this.roughness=1,this.metalness=0,this.emissive=0,this.wireframe=!1,this.doubleSide=!1,this.map=""}static{this.componentName="Material3D"}init(e){e&&(Object.assign(this,e),e.uniforms&&(this.uniforms=e.uniforms))}}e.__decorate([r.Field({type:"string",group:"Material3D",label:"type",description:"Three material kind.",editor:"enum",enumOptions:["standard","basic","lambert","toon","physical","shader"]})],o.prototype,"type",void 0),e.__decorate([r.Field({type:"string",group:"Material3D",label:"resource",description:"SHADER resource name when type is shader.",editor:"text"})],o.prototype,"resource",void 0),e.__decorate([r.Field({type:"string",group:"Material3D",label:"node",description:"Object3D.name to target. Empty = all meshes on this GO.",editor:"text"})],o.prototype,"node",void 0),e.__decorate([r.Field({type:"number",group:"Material3D",label:"color",description:"Tint (hex). Multiplies map.",editor:"number-stepper"})],o.prototype,"color",void 0),e.__decorate([r.Field({type:"number",step:.01,min:0,max:1,group:"Material3D",label:"opacity",editor:"number-slider"})],o.prototype,"opacity",void 0),e.__decorate([r.Field({type:"number",step:.05,min:0,max:1,group:"Material3D",label:"roughness",editor:"number-slider"})],o.prototype,"roughness",void 0),e.__decorate([r.Field({type:"number",step:.05,min:0,max:1,group:"Material3D",label:"metalness",editor:"number-slider"})],o.prototype,"metalness",void 0),e.__decorate([r.Field({type:"number",group:"Material3D",label:"emissive",editor:"number-stepper"})],o.prototype,"emissive",void 0),e.__decorate([r.Field({type:"boolean",group:"Material3D",label:"wireframe",editor:"toggle"})],o.prototype,"wireframe",void 0),e.__decorate([r.Field({type:"boolean",group:"Material3D",label:"doubleSide",editor:"toggle"})],o.prototype,"doubleSide",void 0),e.__decorate([r.Field({type:"string",group:"Material3D",label:"map",description:"IMAGE resource name. Empty keeps the mesh map.",editor:"text"})],o.prototype,"map",void 0);function n(e,t="",r=!1){if(!e)return[];const i=[],s=o=>{if(!r||o===e||!function(e){return!!e.userData?.combosTransform3D}(o)){(function(e){return!!e.isMesh})(o)&&!function(e){return!!e.isInstancedMesh}(o)&&function(e,t){if(!t)return!0;let r=e;for(;r;){if(r.name===t)return!0;r=r.parent}return!1}(o,t)&&i.push(o);for(const e of o.children)s(e)}};return s(e),i}const a=["map","normalMap","roughnessMap","metalnessMap","emissiveMap","aoMap","alphaMap"];function d(e){return Array.isArray(e)?e[0]:e}function p(e){return"boolean"==typeof e?e?1:0:e}function c(e,t,r,i){const o=!!i,n=!!(i||t&&"map"in t&&t.map),d={color:e.color,opacity:e.opacity,transparent:e.opacity<1||n||!!t?.transparent,wireframe:e.wireframe,side:e.doubleSide?s.DoubleSide:s.FrontSide,map:i};if("shader"===e.type){if(!r)throw new Error("Material3D shader type requires a SHADER resource");const t={};for(const[r,i]of Object.entries(e.uniforms||{}))t[r]={value:p(i)};return new s.ShaderMaterial({vertexShader:r.vertex,fragmentShader:r.fragment,uniforms:t,transparent:d.transparent,opacity:d.opacity,wireframe:d.wireframe,side:d.side})}let c;switch(e.type){case"basic":c=new s.MeshBasicMaterial(d);break;case"lambert":c=new s.MeshLambertMaterial({...d,emissive:e.emissive});break;case"toon":c=new s.MeshToonMaterial(d);break;case"physical":c=new s.MeshPhysicalMaterial({...d,roughness:e.roughness,metalness:e.metalness,emissive:e.emissive});break;default:c=new s.MeshStandardMaterial({...d,roughness:e.roughness,metalness:e.metalness,emissive:e.emissive})}return function(e,t,r){if(t)for(const i of a)r&&"map"===i||i in e&&i in t&&(e[i]=t[i])}(c,t,o),i&&(c.map=i),c}function m(e,t,r){const i=e;if(i.isShaderMaterial&&i.uniforms)for(const[e,s]of Object.entries(t||{})){const t="time"===e||"uTime"===e?r:p(s);i.uniforms[e]?i.uniforms[e].value=t:i.uniforms[e]={value:t}}}let l=class extends i.Renderer3D{constructor(){super(...arguments),this.name="Material3DSystem",this.entries=new Map,this.deltaSeconds=1/60}static{this.systemName="Material3DSystem"}init(){this.game.getSystem(i.Renderer3DSystem).rendererManager.register(this)}update(e){this.deltaSeconds=(e?.deltaTime??16.67)/1e3,super.update(e)}componentChanged(e){if("Material3D"!==e.componentName)return;if(e.type===t.OBSERVER_TYPE.REMOVE)return void this.restore(e.gameObject.id);if(e.type===t.OBSERVER_TYPE.CHANGE&&"uniforms"===e.prop?.prop?.[0])return void this.writeUniforms(e.gameObject.id,e.component);const r=this.entries.get(e.gameObject.id);r&&(r.signature=""),this.apply(e.gameObject,e.component)}rendererUpdate(e){const t=e.getComponent(o);if(!t)return;const r=this.entries.get(e.id),i=this.visualRoot(e.id),s=n(i,t.node,!this.threeContext.models.get(e.id)),a=this.signature(i,s);r&&r.signature===a?(r.time+=this.deltaSeconds,this.writeUniforms(e.id,t)):this.apply(e,t)}visualRoot(e){return this.threeContext.models.get(e)||this.threeContext.object3DFor(e)}signature(e,t){return e&&t.length?`${e.uuid}|${t.map(e=>e.uuid).join(",")}`:""}async apply(e,r){const s=this.visualRoot(e.id),o=!this.threeContext.models.get(e.id),a=n(s,r.node,o);if(!a.length)return;const p=this.increaseAsyncId(e.id);let m=null,l=null;try{"shader"===r.type&&(m=await async function(e){const r=String(e??"").trim();if(!r)throw new Error("SHADER resource name is required when Material3D.type is shader");const i=await t.resource.getResource(r);if(!i?.name)throw new Error(`Unknown resource "${r}"; register RESOURCE_TYPE.SHADER first`);const s="string"==typeof i.data?.vertex?i.data.vertex:"string"==typeof i.instance?.vertex?i.instance.vertex:"",o="string"==typeof i.data?.fragment?i.data.fragment:"string"==typeof i.instance?.fragment?i.instance.fragment:"";if(!o)throw new Error(`SHADER "${r}" missing fragment`);return{vertex:s||"varying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n",fragment:o}}(r.resource)),r.map&&(l=await i.textureFromNamedImage(r.map,this.threeContext.renderer),this.threeContext.configureTexture(l))}catch(e){throw l?.dispose(),e}if(!this.validateAsyncId(e.id,p))return void l?.dispose();this.restore(e.id);const u=[],h=l?[l]:[];for(const e of a){const t=e.material,i=c(r,d(t),m,l);e.material=i,u.push({mesh:e,originals:t,created:i})}this.entries.set(e.id,{applied:u,ownedTextures:h,signature:this.signature(s,a),time:0}),this.writeUniforms(e.id,r)}writeUniforms(e,t){const r=this.entries.get(e);if(r)for(const e of r.applied)m(e.created,t.uniforms,r.time)}restore(e,t=!0){this.increaseAsyncId(e);const r=this.entries.get(e);if(r){for(const e of r.applied)t&&e.mesh&&(e.mesh.material=e.originals),e.created&&e.created!==e.originals&&e.created.dispose();for(const e of r.ownedTextures)e.dispose();this.entries.delete(e)}}onDestroy(){for(const e of[...this.entries.keys()])this.restore(e)}};l=e.__decorate([t.decorators.componentObserver({Material3D:["type","resource","node","color","opacity","roughness","metalness","emissive","wireframe","doubleSide","map",{prop:["uniforms"],deep:!0}]})],l);var u=l;exports.Material3D=o,exports.Material3DSystem=u,exports.collectTargetMeshes=n;
|
|
@@ -376,7 +376,8 @@ let Material3DSystem = class Material3DSystem extends Renderer3D {
|
|
|
376
376
|
shader = await loadShaderSource(component.resource);
|
|
377
377
|
}
|
|
378
378
|
if (component.map) {
|
|
379
|
-
mapOverride = await textureFromNamedImage(component.map);
|
|
379
|
+
mapOverride = await textureFromNamedImage(component.map, this.threeContext.renderer);
|
|
380
|
+
this.threeContext.configureTexture(mapOverride);
|
|
380
381
|
}
|
|
381
382
|
}
|
|
382
383
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-renderer-3d-material.esm.js","sources":["../lib/component.ts","../lib/meshes.ts","../lib/createMaterial.ts","../lib/shaderSource.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport { Field } from '@combos-fun/inspector-decorator';\n\nexport type Material3DKind = 'standard' | 'basic' | 'lambert' | 'toon' | 'physical' | 'shader';\n\nexport type Material3DUniformValue = number | boolean | number[];\n\nexport interface Material3DParams {\n type?: Material3DKind | string;\n resource?: string;\n node?: string;\n uniforms?: Record<string, Material3DUniformValue>;\n color?: number;\n opacity?: number;\n roughness?: number;\n metalness?: number;\n emissive?: number;\n wireframe?: boolean;\n doubleSide?: boolean;\n map?: string;\n}\n\nexport default class Material3D extends Component<Material3DParams> {\n static componentName: string = 'Material3D';\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'type',\n description: 'Three material kind.',\n editor: 'enum',\n enumOptions: ['standard', 'basic', 'lambert', 'toon', 'physical', 'shader'],\n })\n type: string = 'standard';\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'resource',\n description: 'SHADER resource name when type is shader.',\n editor: 'text',\n })\n resource: string = '';\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'node',\n description: 'Object3D.name to target. Empty = all meshes on this GO.',\n editor: 'text',\n })\n node: string = '';\n\n uniforms: Record<string, Material3DUniformValue> = {};\n\n @Field({\n type: 'number',\n group: 'Material3D',\n label: 'color',\n description: 'Tint (hex). Multiplies map.',\n editor: 'number-stepper',\n })\n color: number = 0xffffff;\n\n @Field({\n type: 'number',\n step: 0.01,\n min: 0,\n max: 1,\n group: 'Material3D',\n label: 'opacity',\n editor: 'number-slider',\n })\n opacity: number = 1;\n\n @Field({\n type: 'number',\n step: 0.05,\n min: 0,\n max: 1,\n group: 'Material3D',\n label: 'roughness',\n editor: 'number-slider',\n })\n roughness: number = 1;\n\n @Field({\n type: 'number',\n step: 0.05,\n min: 0,\n max: 1,\n group: 'Material3D',\n label: 'metalness',\n editor: 'number-slider',\n })\n metalness: number = 0;\n\n @Field({\n type: 'number',\n group: 'Material3D',\n label: 'emissive',\n editor: 'number-stepper',\n })\n emissive: number = 0;\n\n @Field({\n type: 'boolean',\n group: 'Material3D',\n label: 'wireframe',\n editor: 'toggle',\n })\n wireframe: boolean = false;\n\n @Field({\n type: 'boolean',\n group: 'Material3D',\n label: 'doubleSide',\n editor: 'toggle',\n })\n doubleSide: boolean = false;\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'map',\n description: 'IMAGE resource name. Empty keeps the mesh map.',\n editor: 'text',\n })\n map: string = '';\n\n init(obj?: Material3DParams) {\n if (!obj) return;\n Object.assign(this, obj);\n if (obj.uniforms) this.uniforms = obj.uniforms;\n }\n}\n","import type { Mesh, Object3D } from 'three';\n\nconst TRANSFORM3D_ROOT = 'combosTransform3D';\n\nfunction isTransform3DRoot(object: Object3D): boolean {\n return !!object.userData?.[TRANSFORM3D_ROOT];\n}\n\nfunction isMesh(object: Object3D): object is Mesh {\n return !!(object as Mesh).isMesh;\n}\n\nfunction isInstanced(object: Object3D): boolean {\n return !!(object as Mesh & { isInstancedMesh?: boolean }).isInstancedMesh;\n}\n\nfunction matchesNode(object: Object3D, node: string): boolean {\n if (!node) return true;\n let current: Object3D | null = object;\n while (current) {\n if (current.name === node) return true;\n current = current.parent;\n }\n return false;\n}\n\nexport function collectTargetMeshes(\n root: Object3D | undefined,\n node = '',\n skipNestedRoots = false,\n): Mesh[] {\n if (!root) return [];\n const out: Mesh[] = [];\n const walk = (object: Object3D) => {\n if (skipNestedRoots && object !== root && isTransform3DRoot(object)) return;\n if (isMesh(object) && !isInstanced(object) && matchesNode(object, node)) {\n out.push(object);\n }\n for (const child of object.children) {\n walk(child);\n }\n };\n walk(root);\n return out;\n}\n","import {\n DoubleSide,\n FrontSide,\n MeshBasicMaterial,\n MeshLambertMaterial,\n MeshPhysicalMaterial,\n MeshStandardMaterial,\n MeshToonMaterial,\n ShaderMaterial,\n} from 'three';\nimport type { Material, Texture } from 'three';\nimport type Material3D from './component';\nimport type { Material3DUniformValue } from './component';\n\nconst MAP_KEYS = [\n 'map',\n 'normalMap',\n 'roughnessMap',\n 'metalnessMap',\n 'emissiveMap',\n 'aoMap',\n 'alphaMap',\n] as const;\n\nexport function firstMaterial(material: Material | Material[]): Material {\n return Array.isArray(material) ? material[0] : material;\n}\n\nfunction copyMaps(target: Material, source: Material | undefined, skipMap: boolean) {\n if (!source) return;\n for (const key of MAP_KEYS) {\n if (skipMap && key === 'map') continue;\n if (key in target && key in source) {\n (target as Material & Record<string, unknown>)[key] =\n (source as Material & Record<string, unknown>)[key];\n }\n }\n}\n\nexport function threeUniformValue(value: Material3DUniformValue): number | number[] {\n if (typeof value === 'boolean') return value ? 1 : 0;\n return value;\n}\n\nexport function createMaterial(\n component: Material3D,\n template: Material | undefined,\n shader: { vertex: string; fragment: string } | null,\n mapOverride: Texture | null,\n): Material {\n const skipMap = !!mapOverride;\n const hasMap = !!(mapOverride || (template && 'map' in template && (template as MeshStandardMaterial).map));\n const common = {\n color: component.color,\n opacity: component.opacity,\n transparent: component.opacity < 1 || hasMap || !!(template as MeshStandardMaterial | undefined)?.transparent,\n wireframe: component.wireframe,\n side: component.doubleSide ? DoubleSide : FrontSide,\n map: mapOverride,\n };\n\n if (component.type === 'shader') {\n if (!shader) {\n throw new Error('Material3D shader type requires a SHADER resource');\n }\n const uniforms: Record<string, { value: number | number[] }> = {};\n for (const [key, value] of Object.entries(component.uniforms || {})) {\n uniforms[key] = { value: threeUniformValue(value) };\n }\n return new ShaderMaterial({\n vertexShader: shader.vertex,\n fragmentShader: shader.fragment,\n uniforms,\n transparent: common.transparent,\n opacity: common.opacity,\n wireframe: common.wireframe,\n side: common.side,\n });\n }\n\n let material: Material;\n switch (component.type) {\n case 'basic':\n material = new MeshBasicMaterial(common);\n break;\n case 'lambert':\n material = new MeshLambertMaterial({ ...common, emissive: component.emissive });\n break;\n case 'toon':\n material = new MeshToonMaterial(common);\n break;\n case 'physical':\n material = new MeshPhysicalMaterial({\n ...common,\n roughness: component.roughness,\n metalness: component.metalness,\n emissive: component.emissive,\n });\n break;\n case 'standard':\n default:\n material = new MeshStandardMaterial({\n ...common,\n roughness: component.roughness,\n metalness: component.metalness,\n emissive: component.emissive,\n });\n break;\n }\n\n copyMaps(material, template, skipMap);\n if (mapOverride) {\n (material as MeshStandardMaterial).map = mapOverride;\n }\n return material;\n}\n\nexport function writeShaderUniforms(\n material: Material,\n uniforms: Record<string, Material3DUniformValue> | undefined,\n time: number,\n) {\n const shader = material as ShaderMaterial;\n if (!shader.isShaderMaterial || !shader.uniforms) return;\n for (const [key, value] of Object.entries(uniforms || {})) {\n const next = (key === 'time' || key === 'uTime') ? time : threeUniformValue(value);\n if (shader.uniforms[key]) {\n shader.uniforms[key].value = next;\n } else {\n shader.uniforms[key] = { value: next };\n }\n }\n}\n","import { resource } from '@combos-fun/engine';\n\nexport const DEFAULT_THREE_VERTEX = `varying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\n\nexport async function loadShaderSource(name: string): Promise<{ vertex: string; fragment: string }> {\n const trimmed = String(name ?? '').trim();\n if (!trimmed) {\n throw new Error('SHADER resource name is required when Material3D.type is shader');\n }\n const res = await resource.getResource(trimmed);\n if (!res?.name) {\n throw new Error(`Unknown resource \"${trimmed}\"; register RESOURCE_TYPE.SHADER first`);\n }\n const vertex = typeof res.data?.vertex === 'string'\n ? res.data.vertex\n : typeof res.instance?.vertex === 'string' ? res.instance.vertex : '';\n const fragment = typeof res.data?.fragment === 'string'\n ? res.data.fragment\n : typeof res.instance?.fragment === 'string' ? res.instance.fragment : '';\n if (!fragment) {\n throw new Error(`SHADER \"${trimmed}\" missing fragment`);\n }\n return { vertex: vertex || DEFAULT_THREE_VERTEX, fragment };\n}\n","import { decorators, ComponentChanged, OBSERVER_TYPE, GameObject, UpdateParams } from '@combos-fun/engine';\nimport {\n Renderer3D,\n Renderer3DSystem,\n textureFromNamedImage,\n} from '@combos-fun/plugin-renderer-3d';\nimport type { Material, Mesh, Object3D, Texture } from 'three';\nimport Material3D from './component';\nimport { collectTargetMeshes } from './meshes';\nimport { createMaterial, firstMaterial, writeShaderUniforms } from './createMaterial';\nimport { loadShaderSource } from './shaderSource';\n\ninterface AppliedMesh {\n mesh: Mesh;\n originals: Material | Material[];\n created: Material;\n}\n\ninterface MaterialEntry {\n applied: AppliedMesh[];\n ownedTextures: Texture[];\n signature: string;\n time: number;\n}\n\n@decorators.componentObserver({\n Material3D: [\n 'type', 'resource', 'node', 'color', 'opacity', 'roughness', 'metalness',\n 'emissive', 'wireframe', 'doubleSide', 'map',\n { prop: ['uniforms'], deep: true },\n ],\n})\nexport default class Material3DSystem extends Renderer3D {\n static systemName = 'Material3DSystem';\n name: string = 'Material3DSystem';\n private entries: Map<number, MaterialEntry> = new Map();\n private deltaSeconds = 1 / 60;\n\n init() {\n const renderer3DSystem = this.game.getSystem(Renderer3DSystem) as Renderer3DSystem;\n renderer3DSystem.rendererManager.register(this);\n }\n\n override update(e?: UpdateParams) {\n this.deltaSeconds = (e?.deltaTime ?? 16.67) / 1000;\n super.update(e);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Material3D') return;\n if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.restore(changed.gameObject.id);\n return;\n }\n if (changed.type === OBSERVER_TYPE.CHANGE && changed.prop?.prop?.[0] === 'uniforms') {\n this.writeUniforms(changed.gameObject.id, changed.component as Material3D);\n return;\n }\n const entry = this.entries.get(changed.gameObject.id);\n if (entry) entry.signature = '';\n this.apply(changed.gameObject, changed.component as Material3D);\n }\n\n rendererUpdate(gameObject: GameObject) {\n const component = gameObject.getComponent(Material3D) as Material3D;\n if (!component) return;\n const entry = this.entries.get(gameObject.id);\n const root = this.visualRoot(gameObject.id);\n const meshes = collectTargetMeshes(root, component.node, !this.threeContext.models.get(gameObject.id));\n const signature = this.signature(root, meshes);\n if (!entry || entry.signature !== signature) {\n this.apply(gameObject, component);\n return;\n }\n entry.time += this.deltaSeconds;\n this.writeUniforms(gameObject.id, component);\n }\n\n private visualRoot(id: number): Object3D | undefined {\n return this.threeContext.models.get(id) || this.threeContext.object3DFor(id);\n }\n\n private signature(root: Object3D | undefined, meshes: Mesh[]): string {\n if (!root || !meshes.length) return '';\n return `${root.uuid}|${meshes.map((mesh) => mesh.uuid).join(',')}`;\n }\n\n private async apply(gameObject: GameObject, component: Material3D) {\n const root = this.visualRoot(gameObject.id);\n const skipNested = !this.threeContext.models.get(gameObject.id);\n const meshes = collectTargetMeshes(root, component.node, skipNested);\n if (!meshes.length) return;\n const asyncId = this.increaseAsyncId(gameObject.id);\n\n let shader: { vertex: string; fragment: string } | null = null;\n let mapOverride: Texture | null = null;\n try {\n if (component.type === 'shader') {\n shader = await loadShaderSource(component.resource);\n }\n if (component.map) {\n mapOverride = await textureFromNamedImage(component.map);\n }\n } catch (err) {\n mapOverride?.dispose();\n throw err;\n }\n if (!this.validateAsyncId(gameObject.id, asyncId)) {\n mapOverride?.dispose();\n return;\n }\n\n this.restore(gameObject.id);\n const applied: AppliedMesh[] = [];\n const ownedTextures = mapOverride ? [mapOverride] : [];\n for (const mesh of meshes) {\n const originals = mesh.material;\n const created = createMaterial(\n component,\n firstMaterial(originals),\n shader,\n mapOverride,\n );\n mesh.material = created;\n applied.push({ mesh, originals, created });\n }\n this.entries.set(gameObject.id, {\n applied,\n ownedTextures,\n signature: this.signature(root, meshes),\n time: 0,\n });\n this.writeUniforms(gameObject.id, component);\n }\n\n private writeUniforms(id: number, component: Material3D) {\n const entry = this.entries.get(id);\n if (!entry) return;\n for (const item of entry.applied) {\n writeShaderUniforms(item.created, component.uniforms, entry.time);\n }\n }\n\n private restore(id: number, putBack = true) {\n this.increaseAsyncId(id);\n const entry = this.entries.get(id);\n if (!entry) return;\n for (const item of entry.applied) {\n if (putBack && item.mesh) {\n item.mesh.material = item.originals;\n }\n if (item.created && item.created !== item.originals) {\n item.created.dispose();\n }\n }\n for (const texture of entry.ownedTextures) {\n texture.dispose();\n }\n this.entries.delete(id);\n }\n\n onDestroy() {\n for (const id of [...this.entries.keys()]) {\n this.restore(id);\n }\n }\n}\n"],"names":[],"mappings":";;;;;;AAsBc,MAAO,UAAW,SAAQ,SAA2B,CAAA;AAAnE,IAAA,WAAA,GAAA;;QAWE,IAAA,CAAA,IAAI,GAAW,UAAU;QASzB,IAAA,CAAA,QAAQ,GAAW,EAAE;QASrB,IAAA,CAAA,IAAI,GAAW,EAAE;QAEjB,IAAA,CAAA,QAAQ,GAA2C,EAAE;QASrD,IAAA,CAAA,KAAK,GAAW,QAAQ;QAWxB,IAAA,CAAA,OAAO,GAAW,CAAC;QAWnB,IAAA,CAAA,SAAS,GAAW,CAAC;QAWrB,IAAA,CAAA,SAAS,GAAW,CAAC;QAQrB,IAAA,CAAA,QAAQ,GAAW,CAAC;QAQpB,IAAA,CAAA,SAAS,GAAY,KAAK;QAQ1B,IAAA,CAAA,UAAU,GAAY,KAAK;QAS3B,IAAA,CAAA,GAAG,GAAW,EAAE;IAOlB;aAhHS,IAAA,CAAA,aAAa,GAAW,YAAX,CAAwB;AA2G5C,IAAA,IAAI,CAAC,GAAsB,EAAA;AACzB,QAAA,IAAI,CAAC,GAAG;YAAE;AACV,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC;QACxB,IAAI,GAAG,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ;IAChD;;AArGA,UAAA,CAAA;AARC,IAAA,KAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,WAAW,EAAE,sBAAsB;AACnC,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,WAAW,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC;KAC5E;AACyB,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,MAAA,EAAA,MAAA,CAAA;AAS1B,UAAA,CAAA;AAPC,IAAA,KAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,WAAW,EAAE,2CAA2C;AACxD,QAAA,MAAM,EAAE,MAAM;KACf;AACqB,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,UAAA,EAAA,MAAA,CAAA;AAStB,UAAA,CAAA;AAPC,IAAA,KAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,KAAK,EAAE,MAAM;AACb,QAAA,WAAW,EAAE,yDAAyD;AACtE,QAAA,MAAM,EAAE,MAAM;KACf;AACiB,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,MAAA,EAAA,MAAA,CAAA;AAWlB,UAAA,CAAA;AAPC,IAAA,KAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,WAAW,EAAE,6BAA6B;AAC1C,QAAA,MAAM,EAAE,gBAAgB;KACzB;AACwB,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,OAAA,EAAA,MAAA,CAAA;AAWzB,UAAA,CAAA;AATC,IAAA,KAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,GAAG,EAAE,CAAC;AACN,QAAA,GAAG,EAAE,CAAC;AACN,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,MAAM,EAAE,eAAe;KACxB;AACmB,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,SAAA,EAAA,MAAA,CAAA;AAWpB,UAAA,CAAA;AATC,IAAA,KAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,GAAG,EAAE,CAAC;AACN,QAAA,GAAG,EAAE,CAAC;AACN,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,MAAM,EAAE,eAAe;KACxB;AACqB,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,WAAA,EAAA,MAAA,CAAA;AAWtB,UAAA,CAAA;AATC,IAAA,KAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,GAAG,EAAE,CAAC;AACN,QAAA,GAAG,EAAE,CAAC;AACN,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,MAAM,EAAE,eAAe;KACxB;AACqB,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,WAAA,EAAA,MAAA,CAAA;AAQtB,UAAA,CAAA;AANC,IAAA,KAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,MAAM,EAAE,gBAAgB;KACzB;AACoB,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,UAAA,EAAA,MAAA,CAAA;AAQrB,UAAA,CAAA;AANC,IAAA,KAAK,CAAC;AACL,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,KAAK,EAAE,WAAW;AAClB,QAAA,MAAM,EAAE,QAAQ;KACjB;AAC0B,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,WAAA,EAAA,MAAA,CAAA;AAQ3B,UAAA,CAAA;AANC,IAAA,KAAK,CAAC;AACL,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,MAAM,EAAE,QAAQ;KACjB;AAC2B,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,YAAA,EAAA,MAAA,CAAA;AAS5B,UAAA,CAAA;AAPC,IAAA,KAAK,CAAC;AACL,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,KAAK,EAAE,KAAK;AACZ,QAAA,WAAW,EAAE,gDAAgD;AAC7D,QAAA,MAAM,EAAE,MAAM;KACf;AACgB,CAAA,EAAA,UAAA,CAAA,SAAA,EAAA,KAAA,EAAA,MAAA,CAAA;;AC9HnB,MAAM,gBAAgB,GAAG,mBAAmB;AAE5C,SAAS,iBAAiB,CAAC,MAAgB,EAAA;IACzC,OAAO,CAAC,CAAC,MAAM,CAAC,QAAQ,GAAG,gBAAgB,CAAC;AAC9C;AAEA,SAAS,MAAM,CAAC,MAAgB,EAAA;AAC9B,IAAA,OAAO,CAAC,CAAE,MAAe,CAAC,MAAM;AAClC;AAEA,SAAS,WAAW,CAAC,MAAgB,EAAA;AACnC,IAAA,OAAO,CAAC,CAAE,MAA+C,CAAC,eAAe;AAC3E;AAEA,SAAS,WAAW,CAAC,MAAgB,EAAE,IAAY,EAAA;AACjD,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;IACtB,IAAI,OAAO,GAAoB,MAAM;IACrC,OAAO,OAAO,EAAE;AACd,QAAA,IAAI,OAAO,CAAC,IAAI,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;AACtC,QAAA,OAAO,GAAG,OAAO,CAAC,MAAM;IAC1B;AACA,IAAA,OAAO,KAAK;AACd;AAEM,SAAU,mBAAmB,CACjC,IAA0B,EAC1B,IAAI,GAAG,EAAE,EACT,eAAe,GAAG,KAAK,EAAA;AAEvB,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,EAAE;IACpB,MAAM,GAAG,GAAW,EAAE;AACtB,IAAA,MAAM,IAAI,GAAG,CAAC,MAAgB,KAAI;QAChC,IAAI,eAAe,IAAI,MAAM,KAAK,IAAI,IAAI,iBAAiB,CAAC,MAAM,CAAC;YAAE;AACrE,QAAA,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE;AACvE,YAAA,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QAClB;AACA,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,EAAE;YACnC,IAAI,CAAC,KAAK,CAAC;QACb;AACF,IAAA,CAAC;IACD,IAAI,CAAC,IAAI,CAAC;AACV,IAAA,OAAO,GAAG;AACZ;;AC9BA,MAAM,QAAQ,GAAG;IACf,KAAK;IACL,WAAW;IACX,cAAc;IACd,cAAc;IACd,aAAa;IACb,OAAO;IACP,UAAU;CACF;AAEJ,SAAU,aAAa,CAAC,QAA+B,EAAA;AAC3D,IAAA,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ;AACzD;AAEA,SAAS,QAAQ,CAAC,MAAgB,EAAE,MAA4B,EAAE,OAAgB,EAAA;AAChF,IAAA,IAAI,CAAC,MAAM;QAAE;AACb,IAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;AAC1B,QAAA,IAAI,OAAO,IAAI,GAAG,KAAK,KAAK;YAAE;QAC9B,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,EAAE;YACjC,MAA6C,CAAC,GAAG,CAAC;gBAChD,MAA6C,CAAC,GAAG,CAAC;QACvD;IACF;AACF;AAEM,SAAU,iBAAiB,CAAC,KAA6B,EAAA;IAC7D,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,GAAG,CAAC,GAAG,CAAC;AACpD,IAAA,OAAO,KAAK;AACd;AAEM,SAAU,cAAc,CAC5B,SAAqB,EACrB,QAA8B,EAC9B,MAAmD,EACnD,WAA2B,EAAA;AAE3B,IAAA,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW;AAC7B,IAAA,MAAM,MAAM,GAAG,CAAC,EAAE,WAAW,KAAK,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAK,QAAiC,CAAC,GAAG,CAAC,CAAC;AAC3G,IAAA,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,OAAO,EAAE,SAAS,CAAC,OAAO;AAC1B,QAAA,WAAW,EAAE,SAAS,CAAC,OAAO,GAAG,CAAC,IAAI,MAAM,IAAI,CAAC,CAAE,QAA6C,EAAE,WAAW;QAC7G,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,IAAI,EAAE,SAAS,CAAC,UAAU,GAAG,UAAU,GAAG,SAAS;AACnD,QAAA,GAAG,EAAE,WAAW;KACjB;AAED,IAAA,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE;QAC/B,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;QACtE;QACA,MAAM,QAAQ,GAAiD,EAAE;AACjE,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE;AACnE,YAAA,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,EAAE;QACrD;QACA,OAAO,IAAI,cAAc,CAAC;YACxB,YAAY,EAAE,MAAM,CAAC,MAAM;YAC3B,cAAc,EAAE,MAAM,CAAC,QAAQ;YAC/B,QAAQ;YACR,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;AAClB,SAAA,CAAC;IACJ;AAEA,IAAA,IAAI,QAAkB;AACtB,IAAA,QAAQ,SAAS,CAAC,IAAI;AACpB,QAAA,KAAK,OAAO;AACV,YAAA,QAAQ,GAAG,IAAI,iBAAiB,CAAC,MAAM,CAAC;YACxC;AACF,QAAA,KAAK,SAAS;AACZ,YAAA,QAAQ,GAAG,IAAI,mBAAmB,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC;YAC/E;AACF,QAAA,KAAK,MAAM;AACT,YAAA,QAAQ,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC;YACvC;AACF,QAAA,KAAK,UAAU;YACb,QAAQ,GAAG,IAAI,oBAAoB,CAAC;AAClC,gBAAA,GAAG,MAAM;gBACT,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,QAAQ,EAAE,SAAS,CAAC,QAAQ;AAC7B,aAAA,CAAC;YACF;AACF,QAAA,KAAK,UAAU;AACf,QAAA;YACE,QAAQ,GAAG,IAAI,oBAAoB,CAAC;AAClC,gBAAA,GAAG,MAAM;gBACT,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,SAAS,EAAE,SAAS,CAAC,SAAS;gBAC9B,QAAQ,EAAE,SAAS,CAAC,QAAQ;AAC7B,aAAA,CAAC;YACF;;AAGJ,IAAA,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;IACrC,IAAI,WAAW,EAAE;AACd,QAAA,QAAiC,CAAC,GAAG,GAAG,WAAW;IACtD;AACA,IAAA,OAAO,QAAQ;AACjB;SAEgB,mBAAmB,CACjC,QAAkB,EAClB,QAA4D,EAC5D,IAAY,EAAA;IAEZ,MAAM,MAAM,GAAG,QAA0B;IACzC,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE;AAClD,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE;QACzD,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,IAAI,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC;AAClF,QAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACxB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,IAAI;QACnC;aAAO;YACL,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE;QACxC;IACF;AACF;;AClIO,MAAM,oBAAoB,GAAG,CAAA;;;;;CAKnC;AAEM,eAAe,gBAAgB,CAAC,IAAY,EAAA;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;IACzC,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC;IACpF;IACA,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAC;AAC/C,IAAA,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE;AACd,QAAA,MAAM,IAAI,KAAK,CAAC,qBAAqB,OAAO,CAAA,sCAAA,CAAwC,CAAC;IACvF;IACA,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK;AACzC,UAAE,GAAG,CAAC,IAAI,CAAC;UACT,OAAO,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE;IACvE,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK;AAC7C,UAAE,GAAG,CAAC,IAAI,CAAC;UACT,OAAO,GAAG,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,GAAG,EAAE;IAC3E,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,MAAM,IAAI,KAAK,CAAC,WAAW,OAAO,CAAA,kBAAA,CAAoB,CAAC;IACzD;IACA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,oBAAoB,EAAE,QAAQ,EAAE;AAC7D;;ACIe,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,UAAU,CAAA;AAAzC,IAAA,WAAA,GAAA;;QAEb,IAAA,CAAA,IAAI,GAAW,kBAAkB;AACzB,QAAA,IAAA,CAAA,OAAO,GAA+B,IAAI,GAAG,EAAE;AAC/C,QAAA,IAAA,CAAA,YAAY,GAAG,CAAC,GAAG,EAAE;IAkI/B;aArIS,IAAA,CAAA,UAAU,GAAG,kBAAH,CAAsB;IAKvC,IAAI,GAAA;QACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAqB;AAClF,QAAA,gBAAgB,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC;IACjD;AAES,IAAA,MAAM,CAAC,CAAgB,EAAA;AAC9B,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,EAAE,SAAS,IAAI,KAAK,IAAI,IAAI;AAClD,QAAA,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACjB;AAEA,IAAA,gBAAgB,CAAC,OAAyB,EAAA;AACxC,QAAA,IAAI,OAAO,CAAC,aAAa,KAAK,YAAY;YAAE;QAC5C,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC,MAAM,EAAE;YACzC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACnC;QACF;QACA,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,KAAK,UAAU,EAAE;AACnF,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,SAAuB,CAAC;YAC1E;QACF;AACA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;AACrD,QAAA,IAAI,KAAK;AAAE,YAAA,KAAK,CAAC,SAAS,GAAG,EAAE;QAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,SAAuB,CAAC;IACjE;AAEA,IAAA,cAAc,CAAC,UAAsB,EAAA;QACnC,MAAM,SAAS,GAAG,UAAU,CAAC,YAAY,CAAC,UAAU,CAAe;AACnE,QAAA,IAAI,CAAC,SAAS;YAAE;AAChB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACtG,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;QAC9C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE;AAC3C,YAAA,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC;YACjC;QACF;AACA,QAAA,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY;QAC/B,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC;IAC9C;AAEQ,IAAA,UAAU,CAAC,EAAU,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;IAC9E;IAEQ,SAAS,CAAC,IAA0B,EAAE,MAAc,EAAA;AAC1D,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QACtC,OAAO,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,CAAA,EAAI,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAE;IACpE;AAEQ,IAAA,MAAM,KAAK,CAAC,UAAsB,EAAE,SAAqB,EAAA;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;AAC3C,QAAA,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;AAC/D,QAAA,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,CAAC;QAEnD,IAAI,MAAM,GAAgD,IAAI;QAC9D,IAAI,WAAW,GAAmB,IAAI;AACtC,QAAA,IAAI;AACF,YAAA,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC/B,MAAM,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC;YACrD;AACA,YAAA,IAAI,SAAS,CAAC,GAAG,EAAE;gBACjB,WAAW,GAAG,MAAM,qBAAqB,CAAC,SAAS,CAAC,GAAG,CAAC;YAC1D;QACF;QAAE,OAAO,GAAG,EAAE;YACZ,WAAW,EAAE,OAAO,EAAE;AACtB,YAAA,MAAM,GAAG;QACX;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE;YACjD,WAAW,EAAE,OAAO,EAAE;YACtB;QACF;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAkB,EAAE;AACjC,QAAA,MAAM,aAAa,GAAG,WAAW,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE;AACtD,QAAA,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE;AACzB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ;AAC/B,YAAA,MAAM,OAAO,GAAG,cAAc,CAC5B,SAAS,EACT,aAAa,CAAC,SAAS,CAAC,EACxB,MAAM,EACN,WAAW,CACZ;AACD,YAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;YACvB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;QAC5C;QACA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE;YAC9B,OAAO;YACP,aAAa;YACb,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC;AACvC,YAAA,IAAI,EAAE,CAAC;AACR,SAAA,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC;IAC9C;IAEQ,aAAa,CAAC,EAAU,EAAE,SAAqB,EAAA;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE;AAChC,YAAA,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC;QACnE;IACF;AAEQ,IAAA,OAAO,CAAC,EAAU,EAAE,OAAO,GAAG,IAAI,EAAA;AACxC,QAAA,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AAClC,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE;AAChC,YAAA,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE;gBACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS;YACrC;AACA,YAAA,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,SAAS,EAAE;AACnD,gBAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACxB;QACF;AACA,QAAA,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,aAAa,EAAE;YACzC,OAAO,CAAC,OAAO,EAAE;QACnB;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;IACzB;IAEA,SAAS,GAAA;AACP,QAAA,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE;AACzC,YAAA,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAClB;IACF;;AArImB,gBAAgB,GAAA,UAAA,CAAA;IAPpC,UAAU,CAAC,iBAAiB,CAAC;AAC5B,QAAA,UAAU,EAAE;YACV,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW;AACxE,YAAA,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK;YAC5C,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;AACnC,SAAA;KACF;AACoB,CAAA,EAAA,gBAAgB,CAsIpC;+BAtIoB,gBAAgB;;;;"}
|
|
1
|
+
{"version":3,"file":"plugin-renderer-3d-material.esm.js","sources":["../lib/component.ts","../lib/meshes.ts","../lib/createMaterial.ts","../lib/shaderSource.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport { Field } from '@combos-fun/inspector-decorator';\n\nexport type Material3DKind = 'standard' | 'basic' | 'lambert' | 'toon' | 'physical' | 'shader';\n\nexport type Material3DUniformValue = number | boolean | number[];\n\nexport interface Material3DParams {\n type?: Material3DKind | string;\n resource?: string;\n node?: string;\n uniforms?: Record<string, Material3DUniformValue>;\n color?: number;\n opacity?: number;\n roughness?: number;\n metalness?: number;\n emissive?: number;\n wireframe?: boolean;\n doubleSide?: boolean;\n map?: string;\n}\n\nexport default class Material3D extends Component<Material3DParams> {\n static componentName: string = 'Material3D';\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'type',\n description: 'Three material kind.',\n editor: 'enum',\n enumOptions: ['standard', 'basic', 'lambert', 'toon', 'physical', 'shader'],\n })\n type: string = 'standard';\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'resource',\n description: 'SHADER resource name when type is shader.',\n editor: 'text',\n })\n resource: string = '';\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'node',\n description: 'Object3D.name to target. Empty = all meshes on this GO.',\n editor: 'text',\n })\n node: string = '';\n\n uniforms: Record<string, Material3DUniformValue> = {};\n\n @Field({\n type: 'number',\n group: 'Material3D',\n label: 'color',\n description: 'Tint (hex). Multiplies map.',\n editor: 'number-stepper',\n })\n color: number = 0xffffff;\n\n @Field({\n type: 'number',\n step: 0.01,\n min: 0,\n max: 1,\n group: 'Material3D',\n label: 'opacity',\n editor: 'number-slider',\n })\n opacity: number = 1;\n\n @Field({\n type: 'number',\n step: 0.05,\n min: 0,\n max: 1,\n group: 'Material3D',\n label: 'roughness',\n editor: 'number-slider',\n })\n roughness: number = 1;\n\n @Field({\n type: 'number',\n step: 0.05,\n min: 0,\n max: 1,\n group: 'Material3D',\n label: 'metalness',\n editor: 'number-slider',\n })\n metalness: number = 0;\n\n @Field({\n type: 'number',\n group: 'Material3D',\n label: 'emissive',\n editor: 'number-stepper',\n })\n emissive: number = 0;\n\n @Field({\n type: 'boolean',\n group: 'Material3D',\n label: 'wireframe',\n editor: 'toggle',\n })\n wireframe: boolean = false;\n\n @Field({\n type: 'boolean',\n group: 'Material3D',\n label: 'doubleSide',\n editor: 'toggle',\n })\n doubleSide: boolean = false;\n\n @Field({\n type: 'string',\n group: 'Material3D',\n label: 'map',\n description: 'IMAGE resource name. Empty keeps the mesh map.',\n editor: 'text',\n })\n map: string = '';\n\n init(obj?: Material3DParams) {\n if (!obj) return;\n Object.assign(this, obj);\n if (obj.uniforms) this.uniforms = obj.uniforms;\n }\n}\n","import type { Mesh, Object3D } from 'three';\n\nconst TRANSFORM3D_ROOT = 'combosTransform3D';\n\nfunction isTransform3DRoot(object: Object3D): boolean {\n return !!object.userData?.[TRANSFORM3D_ROOT];\n}\n\nfunction isMesh(object: Object3D): object is Mesh {\n return !!(object as Mesh).isMesh;\n}\n\nfunction isInstanced(object: Object3D): boolean {\n return !!(object as Mesh & { isInstancedMesh?: boolean }).isInstancedMesh;\n}\n\nfunction matchesNode(object: Object3D, node: string): boolean {\n if (!node) return true;\n let current: Object3D | null = object;\n while (current) {\n if (current.name === node) return true;\n current = current.parent;\n }\n return false;\n}\n\nexport function collectTargetMeshes(\n root: Object3D | undefined,\n node = '',\n skipNestedRoots = false,\n): Mesh[] {\n if (!root) return [];\n const out: Mesh[] = [];\n const walk = (object: Object3D) => {\n if (skipNestedRoots && object !== root && isTransform3DRoot(object)) return;\n if (isMesh(object) && !isInstanced(object) && matchesNode(object, node)) {\n out.push(object);\n }\n for (const child of object.children) {\n walk(child);\n }\n };\n walk(root);\n return out;\n}\n","import {\n DoubleSide,\n FrontSide,\n MeshBasicMaterial,\n MeshLambertMaterial,\n MeshPhysicalMaterial,\n MeshStandardMaterial,\n MeshToonMaterial,\n ShaderMaterial,\n} from 'three';\nimport type { Material, Texture } from 'three';\nimport type Material3D from './component';\nimport type { Material3DUniformValue } from './component';\n\nconst MAP_KEYS = [\n 'map',\n 'normalMap',\n 'roughnessMap',\n 'metalnessMap',\n 'emissiveMap',\n 'aoMap',\n 'alphaMap',\n] as const;\n\nexport function firstMaterial(material: Material | Material[]): Material {\n return Array.isArray(material) ? material[0] : material;\n}\n\nfunction copyMaps(target: Material, source: Material | undefined, skipMap: boolean) {\n if (!source) return;\n for (const key of MAP_KEYS) {\n if (skipMap && key === 'map') continue;\n if (key in target && key in source) {\n (target as Material & Record<string, unknown>)[key] =\n (source as Material & Record<string, unknown>)[key];\n }\n }\n}\n\nexport function threeUniformValue(value: Material3DUniformValue): number | number[] {\n if (typeof value === 'boolean') return value ? 1 : 0;\n return value;\n}\n\nexport function createMaterial(\n component: Material3D,\n template: Material | undefined,\n shader: { vertex: string; fragment: string } | null,\n mapOverride: Texture | null,\n): Material {\n const skipMap = !!mapOverride;\n const hasMap = !!(mapOverride || (template && 'map' in template && (template as MeshStandardMaterial).map));\n const common = {\n color: component.color,\n opacity: component.opacity,\n transparent: component.opacity < 1 || hasMap || !!(template as MeshStandardMaterial | undefined)?.transparent,\n wireframe: component.wireframe,\n side: component.doubleSide ? DoubleSide : FrontSide,\n map: mapOverride,\n };\n\n if (component.type === 'shader') {\n if (!shader) {\n throw new Error('Material3D shader type requires a SHADER resource');\n }\n const uniforms: Record<string, { value: number | number[] }> = {};\n for (const [key, value] of Object.entries(component.uniforms || {})) {\n uniforms[key] = { value: threeUniformValue(value) };\n }\n return new ShaderMaterial({\n vertexShader: shader.vertex,\n fragmentShader: shader.fragment,\n uniforms,\n transparent: common.transparent,\n opacity: common.opacity,\n wireframe: common.wireframe,\n side: common.side,\n });\n }\n\n let material: Material;\n switch (component.type) {\n case 'basic':\n material = new MeshBasicMaterial(common);\n break;\n case 'lambert':\n material = new MeshLambertMaterial({ ...common, emissive: component.emissive });\n break;\n case 'toon':\n material = new MeshToonMaterial(common);\n break;\n case 'physical':\n material = new MeshPhysicalMaterial({\n ...common,\n roughness: component.roughness,\n metalness: component.metalness,\n emissive: component.emissive,\n });\n break;\n case 'standard':\n default:\n material = new MeshStandardMaterial({\n ...common,\n roughness: component.roughness,\n metalness: component.metalness,\n emissive: component.emissive,\n });\n break;\n }\n\n copyMaps(material, template, skipMap);\n if (mapOverride) {\n (material as MeshStandardMaterial).map = mapOverride;\n }\n return material;\n}\n\nexport function writeShaderUniforms(\n material: Material,\n uniforms: Record<string, Material3DUniformValue> | undefined,\n time: number,\n) {\n const shader = material as ShaderMaterial;\n if (!shader.isShaderMaterial || !shader.uniforms) return;\n for (const [key, value] of Object.entries(uniforms || {})) {\n const next = (key === 'time' || key === 'uTime') ? time : threeUniformValue(value);\n if (shader.uniforms[key]) {\n shader.uniforms[key].value = next;\n } else {\n shader.uniforms[key] = { value: next };\n }\n }\n}\n","import { resource } from '@combos-fun/engine';\n\nexport const DEFAULT_THREE_VERTEX = `varying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n`;\n\nexport async function loadShaderSource(name: string): Promise<{ vertex: string; fragment: string }> {\n const trimmed = String(name ?? '').trim();\n if (!trimmed) {\n throw new Error('SHADER resource name is required when Material3D.type is shader');\n }\n const res = await resource.getResource(trimmed);\n if (!res?.name) {\n throw new Error(`Unknown resource \"${trimmed}\"; register RESOURCE_TYPE.SHADER first`);\n }\n const vertex = typeof res.data?.vertex === 'string'\n ? res.data.vertex\n : typeof res.instance?.vertex === 'string' ? res.instance.vertex : '';\n const fragment = typeof res.data?.fragment === 'string'\n ? res.data.fragment\n : typeof res.instance?.fragment === 'string' ? res.instance.fragment : '';\n if (!fragment) {\n throw new Error(`SHADER \"${trimmed}\" missing fragment`);\n }\n return { vertex: vertex || DEFAULT_THREE_VERTEX, fragment };\n}\n","import { decorators, ComponentChanged, OBSERVER_TYPE, GameObject, UpdateParams } from '@combos-fun/engine';\nimport {\n Renderer3D,\n Renderer3DSystem,\n textureFromNamedImage,\n} from '@combos-fun/plugin-renderer-3d';\nimport type { Material, Mesh, Object3D, Texture } from 'three';\nimport Material3D from './component';\nimport { collectTargetMeshes } from './meshes';\nimport { createMaterial, firstMaterial, writeShaderUniforms } from './createMaterial';\nimport { loadShaderSource } from './shaderSource';\n\ninterface AppliedMesh {\n mesh: Mesh;\n originals: Material | Material[];\n created: Material;\n}\n\ninterface MaterialEntry {\n applied: AppliedMesh[];\n ownedTextures: Texture[];\n signature: string;\n time: number;\n}\n\n@decorators.componentObserver({\n Material3D: [\n 'type', 'resource', 'node', 'color', 'opacity', 'roughness', 'metalness',\n 'emissive', 'wireframe', 'doubleSide', 'map',\n { prop: ['uniforms'], deep: true },\n ],\n})\nexport default class Material3DSystem extends Renderer3D {\n static systemName = 'Material3DSystem';\n name: string = 'Material3DSystem';\n private entries: Map<number, MaterialEntry> = new Map();\n private deltaSeconds = 1 / 60;\n\n init() {\n const renderer3DSystem = this.game.getSystem(Renderer3DSystem) as Renderer3DSystem;\n renderer3DSystem.rendererManager.register(this);\n }\n\n override update(e?: UpdateParams) {\n this.deltaSeconds = (e?.deltaTime ?? 16.67) / 1000;\n super.update(e);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Material3D') return;\n if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.restore(changed.gameObject.id);\n return;\n }\n if (changed.type === OBSERVER_TYPE.CHANGE && changed.prop?.prop?.[0] === 'uniforms') {\n this.writeUniforms(changed.gameObject.id, changed.component as Material3D);\n return;\n }\n const entry = this.entries.get(changed.gameObject.id);\n if (entry) entry.signature = '';\n this.apply(changed.gameObject, changed.component as Material3D);\n }\n\n rendererUpdate(gameObject: GameObject) {\n const component = gameObject.getComponent(Material3D) as Material3D;\n if (!component) return;\n const entry = this.entries.get(gameObject.id);\n const root = this.visualRoot(gameObject.id);\n const meshes = collectTargetMeshes(root, component.node, !this.threeContext.models.get(gameObject.id));\n const signature = this.signature(root, meshes);\n if (!entry || entry.signature !== signature) {\n this.apply(gameObject, component);\n return;\n }\n entry.time += this.deltaSeconds;\n this.writeUniforms(gameObject.id, component);\n }\n\n private visualRoot(id: number): Object3D | undefined {\n return this.threeContext.models.get(id) || this.threeContext.object3DFor(id);\n }\n\n private signature(root: Object3D | undefined, meshes: Mesh[]): string {\n if (!root || !meshes.length) return '';\n return `${root.uuid}|${meshes.map((mesh) => mesh.uuid).join(',')}`;\n }\n\n private async apply(gameObject: GameObject, component: Material3D) {\n const root = this.visualRoot(gameObject.id);\n const skipNested = !this.threeContext.models.get(gameObject.id);\n const meshes = collectTargetMeshes(root, component.node, skipNested);\n if (!meshes.length) return;\n const asyncId = this.increaseAsyncId(gameObject.id);\n\n let shader: { vertex: string; fragment: string } | null = null;\n let mapOverride: Texture | null = null;\n try {\n if (component.type === 'shader') {\n shader = await loadShaderSource(component.resource);\n }\n if (component.map) {\n mapOverride = await textureFromNamedImage(component.map, this.threeContext.renderer);\n this.threeContext.configureTexture(mapOverride);\n }\n } catch (err) {\n mapOverride?.dispose();\n throw err;\n }\n if (!this.validateAsyncId(gameObject.id, asyncId)) {\n mapOverride?.dispose();\n return;\n }\n\n this.restore(gameObject.id);\n const applied: AppliedMesh[] = [];\n const ownedTextures = mapOverride ? [mapOverride] : [];\n for (const mesh of meshes) {\n const originals = mesh.material;\n const created = createMaterial(\n component,\n firstMaterial(originals),\n shader,\n mapOverride,\n );\n mesh.material = created;\n applied.push({ mesh, originals, created });\n }\n this.entries.set(gameObject.id, {\n applied,\n ownedTextures,\n signature: this.signature(root, meshes),\n time: 0,\n });\n this.writeUniforms(gameObject.id, component);\n }\n\n private writeUniforms(id: number, component: Material3D) {\n const entry = this.entries.get(id);\n if (!entry) return;\n for (const item of entry.applied) {\n writeShaderUniforms(item.created, component.uniforms, entry.time);\n }\n }\n\n private restore(id: number, putBack = true) {\n this.increaseAsyncId(id);\n const entry = this.entries.get(id);\n if (!entry) return;\n for (const item of entry.applied) {\n if (putBack && item.mesh) {\n item.mesh.material = item.originals;\n }\n if (item.created && item.created !== item.originals) {\n item.created.dispose();\n }\n }\n for (const texture of entry.ownedTextures) {\n texture.dispose();\n }\n this.entries.delete(id);\n }\n\n onDestroy() {\n for (const id of [...this.entries.keys()]) {\n this.restore(id);\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@combos-fun/plugin-renderer-3d-material",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.14-beta.1",
|
|
4
4
|
"description": "Per-object 3D materials and custom shaders",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"module": "dist/plugin-renderer-3d-material.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/inspector-decorator": "0.1.
|
|
32
|
-
"@combos-fun/plugin-renderer-3d": "0.1.
|
|
30
|
+
"@combos-fun/engine": "0.1.14-beta.1",
|
|
31
|
+
"@combos-fun/inspector-decorator": "0.1.14-beta.1",
|
|
32
|
+
"@combos-fun/plugin-renderer-3d": "0.1.14-beta.1"
|
|
33
33
|
},
|
|
34
34
|
"keywords": [
|
|
35
35
|
"combos-fun",
|