| @@ -1,18 +1,18 @@ | |||
| { | |||
| "name": "threepipe", | |||
| "version": "0.0.9", | |||
| "version": "0.0.9-dev.1", | |||
| "lockfileVersion": 2, | |||
| "requires": true, | |||
| "packages": { | |||
| "": { | |||
| "name": "threepipe", | |||
| "version": "0.0.9", | |||
| "version": "0.0.9-dev.1", | |||
| "license": "Apache-2.0", | |||
| "dependencies": { | |||
| "@types/three": "https://github.com/repalash/three-ts-types/releases/download/v0.152.1011/package.tgz", | |||
| "@types/webxr": "^0.5.1", | |||
| "@types/wicg-file-system-access": "^2020.9.5", | |||
| "ts-browser-helpers": "^0.7.0" | |||
| "ts-browser-helpers": "^0.8.0" | |||
| }, | |||
| "devDependencies": { | |||
| "@rollup/plugin-commonjs": "^25.0.0", | |||
| @@ -9542,9 +9542,9 @@ | |||
| } | |||
| }, | |||
| "node_modules/ts-browser-helpers": { | |||
| "version": "0.7.0", | |||
| "resolved": "https://registry.npmjs.org/ts-browser-helpers/-/ts-browser-helpers-0.7.0.tgz", | |||
| "integrity": "sha512-QCqBNN4PUfe6OkmdWbpBLg9MFqQds3eMwFnIStHxDPdeqTUiAeuMwCK5UpWXTqdTWY/8OvDBQEAbnzeYRl4kCA==", | |||
| "version": "0.8.0", | |||
| "resolved": "https://registry.npmjs.org/ts-browser-helpers/-/ts-browser-helpers-0.8.0.tgz", | |||
| "integrity": "sha512-r7k6udt+tS/FZLwTUbzSgHdHQ56R/MD1oS2rFcEk8O4jKUTzuDVqlUoLX1EjJQYEBGMBI8TEyySTkuomxewZEw==", | |||
| "dependencies": { | |||
| "@types/wicg-file-system-access": "^2020.9.5" | |||
| } | |||
| @@ -17222,9 +17222,9 @@ | |||
| "dev": true | |||
| }, | |||
| "ts-browser-helpers": { | |||
| "version": "0.7.0", | |||
| "resolved": "https://registry.npmjs.org/ts-browser-helpers/-/ts-browser-helpers-0.7.0.tgz", | |||
| "integrity": "sha512-QCqBNN4PUfe6OkmdWbpBLg9MFqQds3eMwFnIStHxDPdeqTUiAeuMwCK5UpWXTqdTWY/8OvDBQEAbnzeYRl4kCA==", | |||
| "version": "0.8.0", | |||
| "resolved": "https://registry.npmjs.org/ts-browser-helpers/-/ts-browser-helpers-0.8.0.tgz", | |||
| "integrity": "sha512-r7k6udt+tS/FZLwTUbzSgHdHQ56R/MD1oS2rFcEk8O4jKUTzuDVqlUoLX1EjJQYEBGMBI8TEyySTkuomxewZEw==", | |||
| "requires": { | |||
| "@types/wicg-file-system-access": "^2020.9.5" | |||
| } | |||
| @@ -103,12 +103,12 @@ | |||
| "@types/three": "https://github.com/repalash/three-ts-types/releases/download/v0.152.1011/package.tgz", | |||
| "@types/webxr": "^0.5.1", | |||
| "@types/wicg-file-system-access": "^2020.9.5", | |||
| "ts-browser-helpers": "^0.7.0" | |||
| "ts-browser-helpers": "^0.8.0" | |||
| }, | |||
| "//": { | |||
| "dependencies": { | |||
| "uiconfig.js": "^0.0.6", | |||
| "ts-browser-helpers": "^0.7.0", | |||
| "ts-browser-helpers": "^0.8.0", | |||
| "three": "https://github.com/repalash/three.js-modded/releases/download/v0.152.2012/package.tgz", | |||
| "three-f": "https://github.com/repalash/three.js-modded/archive/refs/tags/v0.152.2012.tar.gz", | |||
| "@types/three": "https://github.com/repalash/three-ts-types/releases/download/v0.152.1011/package.tgz", | |||
| @@ -1,12 +1,12 @@ | |||
| { | |||
| "name": "@threepipe/plugin-tweakpane-editor", | |||
| "version": "0.1.0", | |||
| "version": "0.1.1", | |||
| "lockfileVersion": 2, | |||
| "requires": true, | |||
| "packages": { | |||
| "": { | |||
| "name": "@threepipe/plugin-tweakpane-editor", | |||
| "version": "0.1.0", | |||
| "version": "0.1.1", | |||
| "license": "Apache-2.0", | |||
| "dependencies": { | |||
| "@threepipe/plugin-tweakpane": "file:./../tweakpane/src/", | |||
| @@ -1,12 +1,12 @@ | |||
| { | |||
| "name": "@threepipe/plugin-tweakpane", | |||
| "version": "0.1.0", | |||
| "version": "0.1.1", | |||
| "lockfileVersion": 2, | |||
| "requires": true, | |||
| "packages": { | |||
| "": { | |||
| "name": "@threepipe/plugin-tweakpane", | |||
| "version": "0.1.0", | |||
| "version": "0.1.1", | |||
| "license": "Apache-2.0", | |||
| "dependencies": { | |||
| "threepipe": "file:./../../src/" | |||
| @@ -1,5 +1,5 @@ | |||
| import {IMaterial, IMaterialUserData} from '../core' | |||
| import {getOrCall} from 'ts-browser-helpers' | |||
| import {getOrCall, objectMap} from 'ts-browser-helpers' | |||
| import {shaderReplaceString} from '../utils/shader-helpers' | |||
| import {Object3D, Shader, WebGLRenderer} from 'three' | |||
| import {MaterialExtension} from './MaterialExtension' | |||
| @@ -27,7 +27,7 @@ export class MaterialExtender { | |||
| } | |||
| // Add extra uniforms | |||
| if (materialExtension.extraUniforms) { | |||
| shader.uniforms = Object.assign(shader.uniforms, materialExtension.extraUniforms) | |||
| shader.uniforms = Object.assign(shader.uniforms, objectMap(materialExtension.extraUniforms, (v)=>getOrCall(v, shader) || {value: null})) | |||
| } | |||
| // Add extra defines and set needsUpdate to true if needed | |||
| if (materialExtension.extraDefines) | |||
| @@ -50,7 +50,7 @@ export class MaterialExtender { | |||
| static CacheKeyForExtension(material: IMaterial, materialExtension: MaterialExtension): string { | |||
| let r = '' | |||
| if (materialExtension.computeCacheKey) r += getOrCall(materialExtension.computeCacheKey, material) | |||
| if (materialExtension.extraDefines) r += Object.values(materialExtension.extraDefines).join('') | |||
| if (materialExtension.extraDefines) r += Object.values(materialExtension.extraDefines).map(v=>getOrCall(v) ?? '').join('') | |||
| return r | |||
| } | |||
| @@ -96,14 +96,16 @@ export class MaterialExtender { | |||
| } | |||
| } | |||
| function updateMaterialDefines(defines: any, material: IMaterial) { | |||
| function updateMaterialDefines(defines: MaterialExtension['extraDefines'], material: IMaterial) { | |||
| if (!defines) return | |||
| if (!material.defines) { | |||
| console.warn('Material does not have defines', material) // todo: check when material.defines is undefined | |||
| material.defines = {} | |||
| } | |||
| let flag = false | |||
| const entries = Object.entries(defines) | |||
| for (const [key, val] of entries) { | |||
| for (const [key, valF] of entries) { | |||
| const val = getOrCall(valF) | |||
| if (val === undefined) { | |||
| if (material.defines[key] !== undefined) { | |||
| delete material.defines[key] | |||
| @@ -1,6 +1,7 @@ | |||
| import {IUniform, Object3D, Shader, WebGLRenderer} from 'three' | |||
| import {IMaterial} from '../core' | |||
| import {UiObjectConfig} from 'uiconfig.js' | |||
| import {ValOrFunc} from 'ts-browser-helpers' | |||
| /** | |||
| * Material extension interface | |||
| @@ -10,12 +11,12 @@ export interface MaterialExtension{ | |||
| /** | |||
| * Extra uniforms to copy to material | |||
| */ | |||
| extraUniforms?: {[uniform: string]: IUniform}; | |||
| extraUniforms?: {[uniform: string]: ValOrFunc<IUniform>}; | |||
| /** | |||
| * Extra defines to copy to material | |||
| */ | |||
| extraDefines?: Record<string, number|string>; | |||
| extraDefines?: Record<string, ValOrFunc<number|string|undefined>>; | |||
| /** | |||
| * Custom callback to extend/modify/replace shader code and other shader properties | |||
| @@ -998,6 +998,10 @@ export class ThreeViewer extends EventDispatcher<IViewerEvent, IViewerEventTypes | |||
| }) | |||
| } | |||
| /** | |||
| * Export the scene to a file (default: glb with viewer config) and return a blob | |||
| * @param options | |||
| */ | |||
| async exportScene(options?: ExportFileOptions): Promise<BlobExt | undefined> { | |||
| return this.assetManager.exporter.exportObject(this._scene.modelRoot, options) | |||
| } | |||