diff --git a/.gitignore b/.gitignore index c8d2226..d2ec808 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ node_modules tsconfig.tsbuildinfo *.tgz +.env diff --git a/package-lock.json b/package-lock.json index 884b949..3ad2554 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,16 +13,16 @@ "packages/examples" ], "devDependencies": { - "@types/node": "~18.18.8", - "@typescript-eslint/eslint-plugin": "~6.9.1", + "@types/node": "~18.18.14", + "@typescript-eslint/eslint-plugin": "~6.13.2", "editorconfig": "~2.0.0", - "eslint": "~8.52.0", + "eslint": "~8.55.0", "shelljs": "~0.8.5", "shx": "~0.3.4", - "typedoc": "~0.25.3", - "typedoc-plugin-markdown": "~3.17.0", - "typescript": "~5.2.2", - "vite": "~4.5.0", + "typedoc": "~0.25.4", + "typedoc-plugin-markdown": "~3.17.1", + "typescript": "~5.3.2", + "vite": "~5.0.5", "vitest": "~0.34.6" } }, @@ -45,7 +45,7 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", + "version": "0.19.8", "cpu": [ "x64" ], @@ -82,7 +82,7 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.2", + "version": "2.1.4", "dev": true, "license": "MIT", "dependencies": { @@ -124,7 +124,7 @@ } }, "node_modules/@eslint/js": { - "version": "8.52.0", + "version": "8.55.0", "dev": true, "license": "MIT", "engines": { @@ -235,7 +235,7 @@ "license": "MIT" }, "node_modules/@react-three/fiber": { - "version": "8.15.9", + "version": "8.15.12", "license": "MIT", "dependencies": { "@babel/runtime": "^7.17.8", @@ -281,6 +281,18 @@ } } }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.6.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "dev": true, @@ -300,12 +312,13 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.14", - "dev": true, - "license": "MIT" + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true }, "node_modules/@types/node": { - "version": "18.18.8", + "version": "18.18.14", "dev": true, "license": "MIT", "dependencies": { @@ -317,8 +330,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.2.34", - "license": "MIT", + "version": "18.2.42", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.42.tgz", + "integrity": "sha512-c1zEr96MjakLYus/wPnuWDo1/zErfdU9rNsIGmE+NV71nx88FG9Ttgo5dqorXTu/LImX2f63WBP986gJkMPNbA==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -326,7 +340,7 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.14", + "version": "18.2.17", "dev": true, "license": "MIT", "dependencies": { @@ -345,9 +359,10 @@ "license": "MIT" }, "node_modules/@types/semver": { - "version": "7.5.4", - "dev": true, - "license": "MIT" + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true }, "node_modules/@types/stats.js": { "version": "0.17.2", @@ -355,7 +370,7 @@ "license": "MIT" }, "node_modules/@types/three": { - "version": "0.158.1", + "version": "0.159.0", "dev": true, "license": "MIT", "dependencies": { @@ -370,15 +385,16 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.9.1", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.13.2.tgz", + "integrity": "sha512-3+9OGAWHhk4O1LlcwLBONbdXsAhLjyCFogJY/cWy2lxdVJ2JrcTF2pTGMaLl2AE7U1l31n8Py4a8bx5DLf/0dQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/type-utils": "6.9.1", - "@typescript-eslint/utils": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/type-utils": "6.13.2", + "@typescript-eslint/utils": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -403,6 +419,53 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz", + "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz", + "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz", + "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser": { "version": "6.9.1", "dev": true, @@ -435,6 +498,7 @@ "version": "6.9.1", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/types": "6.9.1", "@typescript-eslint/visitor-keys": "6.9.1" @@ -448,12 +512,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.9.1", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.13.2.tgz", + "integrity": "sha512-Qr6ssS1GFongzH2qfnWKkAQmMUyZSyOr0W54nZNU1MDfo+U4Mv3XveeLZzadc/yq8iYhQZHYT+eoXJqnACM1tw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/utils": "6.9.1", + "@typescript-eslint/typescript-estree": "6.13.2", + "@typescript-eslint/utils": "6.13.2", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -473,10 +538,68 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz", + "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz", + "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz", + "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/types": { "version": "6.9.1", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^16.0.0 || >=18.0.0" }, @@ -489,6 +612,7 @@ "version": "6.9.1", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/types": "6.9.1", "@typescript-eslint/visitor-keys": "6.9.1", @@ -512,16 +636,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.9.1", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.13.2.tgz", + "integrity": "sha512-b9Ptq4eAZUym4idijCRzl61oPCwwREcfDI8xGk751Vhzig5fFZR9CyzDz4Sp/nxSLBYxUPyh4QdIDqWykFhNmQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", + "@typescript-eslint/scope-manager": "6.13.2", + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/typescript-estree": "6.13.2", "semver": "^7.5.4" }, "engines": { @@ -535,10 +660,85 @@ "eslint": "^7.0.0 || ^8.0.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.13.2.tgz", + "integrity": "sha512-CXQA0xo7z6x13FeDYCgBkjWzNqzBn8RXaE3QVQVIUm74fWJLkJkaHmHdKStrxQllGh6Q4eUGyNpMe0b1hMkXFA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.13.2.tgz", + "integrity": "sha512-7sxbQ+EMRubQc3wTfTsycgYpSujyVbI1xw+3UMRUcrhSy+pN09y/lWzeKDbvhoqcRbHdc+APLs/PWYi/cisLPg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.13.2.tgz", + "integrity": "sha512-SuD8YLQv6WHnOEtKv8D6HZUzOub855cfPnPMKvdM/Bh1plv1f7Q/0iFUDLKKlxHcEstQnaUU4QZskgQq74t+3w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.2", + "@typescript-eslint/visitor-keys": "6.13.2", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.13.2.tgz", + "integrity": "sha512-OGznFs0eAQXJsp+xSd6k/O1UbFi/K/L7WjqeRoFE7vadjAF9y0uppXhYNQNEqygjou782maGClOoZwPqF0Drlw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.13.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.9.1", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/types": "6.9.1", "eslint-visitor-keys": "^3.4.1" @@ -1040,7 +1240,7 @@ } }, "node_modules/esbuild": { - "version": "0.18.20", + "version": "0.19.8", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1051,28 +1251,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "@esbuild/android-arm": "0.19.8", + "@esbuild/android-arm64": "0.19.8", + "@esbuild/android-x64": "0.19.8", + "@esbuild/darwin-arm64": "0.19.8", + "@esbuild/darwin-x64": "0.19.8", + "@esbuild/freebsd-arm64": "0.19.8", + "@esbuild/freebsd-x64": "0.19.8", + "@esbuild/linux-arm": "0.19.8", + "@esbuild/linux-arm64": "0.19.8", + "@esbuild/linux-ia32": "0.19.8", + "@esbuild/linux-loong64": "0.19.8", + "@esbuild/linux-mips64el": "0.19.8", + "@esbuild/linux-ppc64": "0.19.8", + "@esbuild/linux-riscv64": "0.19.8", + "@esbuild/linux-s390x": "0.19.8", + "@esbuild/linux-x64": "0.19.8", + "@esbuild/netbsd-x64": "0.19.8", + "@esbuild/openbsd-x64": "0.19.8", + "@esbuild/sunos-x64": "0.19.8", + "@esbuild/win32-arm64": "0.19.8", + "@esbuild/win32-ia32": "0.19.8", + "@esbuild/win32-x64": "0.19.8" } }, "node_modules/escape-string-regexp": { @@ -1087,14 +1287,14 @@ } }, "node_modules/eslint": { - "version": "8.52.0", + "version": "8.55.0", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -1378,6 +1578,20 @@ "dev": true, "license": "ISC" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "dev": true, @@ -1843,7 +2057,7 @@ } }, "node_modules/lil-gui": { - "version": "0.19.0", + "version": "0.19.1", "license": "MIT" }, "node_modules/local-pkg": { @@ -2023,7 +2237,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.6", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -2031,7 +2247,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2230,7 +2445,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", "dev": true, "funding": [ { @@ -2246,9 +2463,8 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -2454,17 +2670,29 @@ } }, "node_modules/rollup": { - "version": "3.29.4", + "version": "4.6.1", "dev": true, "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.6.1", + "@rollup/rollup-android-arm64": "4.6.1", + "@rollup/rollup-darwin-arm64": "4.6.1", + "@rollup/rollup-darwin-x64": "4.6.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.6.1", + "@rollup/rollup-linux-arm64-gnu": "4.6.1", + "@rollup/rollup-linux-arm64-musl": "4.6.1", + "@rollup/rollup-linux-x64-gnu": "4.6.1", + "@rollup/rollup-linux-x64-musl": "4.6.1", + "@rollup/rollup-win32-arm64-msvc": "4.6.1", + "@rollup/rollup-win32-ia32-msvc": "4.6.1", + "@rollup/rollup-win32-x64-msvc": "4.6.1", "fsevents": "~2.3.2" } }, @@ -2637,8 +2865,9 @@ }, "node_modules/source-map-js": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -2721,7 +2950,7 @@ "license": "MIT" }, "node_modules/three": { - "version": "0.158.0", + "version": "0.159.0", "license": "MIT" }, "node_modules/tinybench": { @@ -2798,7 +3027,7 @@ } }, "node_modules/typedoc": { - "version": "0.25.3", + "version": "0.25.4", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2814,11 +3043,11 @@ "node": ">= 16" }, "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x" + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x" } }, "node_modules/typedoc-plugin-markdown": { - "version": "3.17.0", + "version": "3.17.1", "dev": true, "license": "MIT", "dependencies": { @@ -2843,7 +3072,7 @@ } }, "node_modules/typescript": { - "version": "5.2.2", + "version": "5.3.2", "dev": true, "license": "Apache-2.0", "bin": { @@ -2900,28 +3129,29 @@ "license": "MIT" }, "node_modules/vite": { - "version": "4.5.0", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.5.tgz", + "integrity": "sha512-OekeWqR9Ls56f3zd4CaxzbbS11gqYkEiBtnWFFgYR2WV8oPJRRKq0mpskYy/XaoCL3L7VINDhqqOMNDiYdGvGg==", "dev": true, - "license": "MIT", "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" + "esbuild": "^0.19.3", + "postcss": "^8.4.32", + "rollup": "^4.2.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", @@ -3112,17 +3342,17 @@ "license": "ISC" }, "node_modules/wtd-core": { - "version": "2.4.0-next.4", - "resolved": "https://registry.npmjs.org/wtd-core/-/wtd-core-2.4.0-next.4.tgz", - "integrity": "sha512-vsc3afHdGwOH+UTrwWhxhPbFYLFAHSTwr+EXDHXZMOm12WwLo+gAuMHa0ORJpNSn2NkhR1HPA/LBIIgN78JGdA==" + "version": "3.0.0-next.5", + "resolved": "https://registry.npmjs.org/wtd-core/-/wtd-core-3.0.0-next.5.tgz", + "integrity": "sha512-Toaur/J5k3Cqpz5NgZjzRBcSjAPdASwY8YNe2zYW8X7ikKlDXNcVGkpsk9PrMZSK66ROw7KlpbGr8iE8H8DfvQ==" }, "node_modules/wtd-three-ext": { - "version": "2.4.0-next.4", - "resolved": "https://registry.npmjs.org/wtd-three-ext/-/wtd-three-ext-2.4.0-next.4.tgz", - "integrity": "sha512-P3vv2IkYncsv0/D3rIaj+tkGVGkNDj75w/8SIuLZwJjHJuFfxaiQGIFsmfV1QFaWxGsbpTtLIMkN6FODBWOwAg==", + "version": "3.0.0-next.5", + "resolved": "https://registry.npmjs.org/wtd-three-ext/-/wtd-three-ext-3.0.0-next.5.tgz", + "integrity": "sha512-D3IJ8jRZTli75PtQ6ck1nAXH3jxBrPQG5ujwtDEtyUCZdTABcR3CN/W7e/aqLCJZQWpOSJr1QzopuxMf7ZZklw==", "dependencies": { - "three": "~0.158.0", - "wtd-core": "~2.4.0-next.4" + "three": "~0.159.0", + "wtd-core": "~3.0.0-next.5" }, "peerDependencies": { "three": ">= 0.137.5 < 1" @@ -3167,30 +3397,31 @@ "name": "objloader2-examples", "version": "0.0.0", "dependencies": { - "@react-three/fiber": "~8.15.9", - "lil-gui": "~0.19.0", + "@react-three/fiber": "~8.15.12", + "lil-gui": "~0.19.1", "react": "~18.2.0", "react-dom": "~18.2.0", - "three": "~0.158.0", - "wwobjloader2": "~6.2.0-next.4" + "three": "~0.159.0", + "wtd-core": "~3.0.0-next.5", + "wwobjloader2": "~6.2.0-next.5" }, "devDependencies": { - "@types/react": "~18.2.34", - "@types/react-dom": "~18.2.14", - "@types/three": "~0.158.1", + "@types/react": "~18.2.42", + "@types/react-dom": "~18.2.17", + "@types/three": "~0.159.0", "http-server": "~14.1.1" } }, "packages/objloader2": { "name": "wwobjloader2", - "version": "6.2.0-next.4", + "version": "6.2.0-next.5", "dependencies": { - "three": "~0.158.0", - "wtd-core": "~2.4.0-next.4", - "wtd-three-ext": "~2.4.0-next.4" + "three": "~0.159.0", + "wtd-core": "~3.0.0-next.5", + "wtd-three-ext": "~3.0.0-next.5" }, "devDependencies": { - "@types/three": "~0.158.1" + "@types/three": "~0.159.0" }, "peerDependencies": { "three": ">= 0.137.5 < 1" diff --git a/package.json b/package.json index 44be623..e034f21 100644 --- a/package.json +++ b/package.json @@ -39,16 +39,16 @@ "keywords": [], "homepage": "https://github.com/kaisalmen/WWOBJLoader#README", "devDependencies": { - "@typescript-eslint/eslint-plugin": "~6.9.1", - "@types/node": "~18.18.8", + "@typescript-eslint/eslint-plugin": "~6.13.2", + "@types/node": "~18.18.14", "editorconfig": "~2.0.0", - "eslint": "~8.52.0", + "eslint": "~8.55.0", "shelljs": "~0.8.5", "shx": "~0.3.4", - "typedoc": "~0.25.3", - "typedoc-plugin-markdown": "~3.17.0", - "typescript": "~5.2.2", - "vite": "~4.5.0", + "typedoc": "~0.25.4", + "typedoc-plugin-markdown": "~3.17.1", + "typescript": "~5.3.2", + "vite": "~5.0.5", "vitest": "~0.34.6" }, "volta": { diff --git a/packages/examples/obj2_basic.html b/packages/examples/obj2_basic.html index a7682c4..997ba84 100644 --- a/packages/examples/obj2_basic.html +++ b/packages/examples/obj2_basic.html @@ -21,11 +21,12 @@ const modelUrl = new URL('./models/obj/main/female02/female02.obj', window.location.href).href; const materialUrl = new URL('./models/obj/main/female02/female02.mtl', window.location.href).href; const canvas = document.getElementById('example'); - const exampleApp = new OBJLoader2BasicExample(canvas, { + const exampleApp = new OBJLoader2BasicExample(canvas, { width: canvas?.offsetWidth ?? 0, height: canvas?.offsetHeight ?? 0, pixelRatio: window.devicePixelRatio - }, modelUrl, materialUrl); + }, false) + exampleApp.setUrls(modelUrl, materialUrl); executeExample(exampleApp); diff --git a/packages/examples/package.json b/packages/examples/package.json index 586787e..150a448 100644 --- a/packages/examples/package.json +++ b/packages/examples/package.json @@ -8,15 +8,15 @@ "compile": "tsc", "copy:prepare": "shx mkdir -p ./libs/worker", "copy:three": "shx cp -f ../../node_modules/three/build/three.module.js ./libs/three.module.js", - "copy:three:trackball": "shx cp -f ../../node_modules/three/examples/jsm/controls/ArcballControls.js ./libs/ArcballControls.js", + "copy:three:trackball": "shx cp -f ../../node_modules/three/examples/jsm/controls/TrackballControls.js ./libs/TrackballControls.js", "copy:three:mtlloader": "shx cp -f ../../node_modules/three/examples/jsm/loaders/MTLLoader.js ./libs/MTLLoader.js", "copy:three:vertexnormalshelper": "shx cp -f ../../node_modules/three/examples/jsm/helpers/VertexNormalsHelper.js ./libs/VertexNormalsHelper.js", "copy:lil-gui": "shx cp -f ../../node_modules/lil-gui/dist/lil-gui.esm.js ./libs/lil-gui.esm.js", - "copy:wtd-core": "shx mkdir -p ./libs/wtd-core && shx cp -f ../../node_modules/wtd-core/dist/* ./libs/wtd-core", + "copy:wtd-core": "shx mkdir -p ./libs/wtd-core/offscreen && shx cp -f ../../node_modules/wtd-core/dist/*.js ./libs/wtd-core && shx cp -f ../../node_modules/wtd-core/dist/offscreen/*.js ./libs/wtd-core/offscreen", "copy:objloader2": "shx cp -f ../objloader2/lib/objloader2.js ./libs/objloader2.js", "copy:objloader2:worker": "shx cp -f ../objloader2/lib/worker/OBJLoader2WorkerModule.js ./libs/worker/OBJLoader2WorkerModule.js && shx cp -f ../objloader2/lib/worker/OBJLoader2WorkerClassic.js ./libs/worker/OBJLoader2WorkerClassic.js", "build:worker:BasicExampleOffscreenWorker": "npx shx rm -f ./src/worker/generated/BasicExampleOffscreenWorker*.js && npx vite -c build/vite.config.BasicExampleOffscreenWorker.ts build", - "build": "npm run clean && npm run compile && npm run copy:prepare && npm run copy:three && npm run copy:three:trackball && npm run copy:three:mtlloader && npm run copy:three:vertexnormalshelper && npm run copy:lil-gui && npm run copy:wtd-core && npm run copy:objloader2 && npm run copy:objloader2:worker && npm run build:worker:BasicExampleOffscreenWorker", + "build": "npm run clean && npm run compile && npm run copy:prepare && npm run build:worker:BasicExampleOffscreenWorker && npm run copy:three && npm run copy:three:trackball && npm run copy:three:mtlloader && npm run copy:three:vertexnormalshelper && npm run copy:lil-gui && npm run copy:wtd-core && npm run copy:objloader2 && npm run copy:objloader2:worker", "serve": "tsc && vite preview", "verify": "http-server --port 20001 ./" }, @@ -25,17 +25,18 @@ "npm": "9.8.1" }, "dependencies": { - "@react-three/fiber": "~8.15.9", - "wwobjloader2": "~6.2.0-next.4", - "lil-gui": "~0.19.0", + "@react-three/fiber": "~8.15.12", + "wtd-core": "~3.0.0-next.5", + "wwobjloader2": "~6.2.0-next.5", + "lil-gui": "~0.19.1", "react": "~18.2.0", "react-dom": "~18.2.0", - "three": "~0.158.0" + "three": "~0.159.0" }, "devDependencies": { - "@types/react": "~18.2.34", - "@types/react-dom": "~18.2.14", - "@types/three": "~0.158.1", + "@types/react": "~18.2.42", + "@types/react-dom": "~18.2.17", + "@types/three": "~0.159.0", "http-server": "~14.1.1" } } diff --git a/packages/examples/src/examples/ExampleCommons.ts b/packages/examples/src/examples/ExampleCommons.ts index 34ed0c8..1d913fa 100644 --- a/packages/examples/src/examples/ExampleCommons.ts +++ b/packages/examples/src/examples/ExampleCommons.ts @@ -1,5 +1,6 @@ import { AmbientLight, DirectionalLight, GridHelper, PerspectiveCamera, Scene, WebGLRenderer } from 'three'; -import { ArcballControls } from 'three/examples/jsm/controls/ArcballControls.js'; +import { TrackballControls } from 'three/examples/jsm/controls/TrackballControls.js'; +import { OffscreenPayload } from 'wtd-core'; export type CameraDefaults = { posCamera: THREE.Vector3; @@ -62,11 +63,11 @@ export type ThreeDefaultSetup = { camera: THREE.PerspectiveCamera; cameraTarget: THREE.Vector3; cameraDefaults: CameraDefaults; - controls?: ArcballControls; + controls?: TrackballControls; } export const createThreeDefaultSetup = (canvas: HTMLCanvasElement | null, cameraDefaults: CameraDefaults, - canvasDimensions: CanvasDimensions): ThreeDefaultSetup => { + canvasDimensions: CanvasDimensions, forceControls?: boolean): ThreeDefaultSetup => { if (canvas === null) { throw Error('Bad element HTML given as canvas.'); } @@ -90,8 +91,8 @@ export const createThreeDefaultSetup = (canvas: HTMLCanvasElement | null, camera setup.cameraDefaults.near, setup.cameraDefaults.far); resetCamera(setup); - if (!isWorker()) { - setup.controls = new ArcballControls(setup.camera, setup.renderer.domElement); + if (!isWorker() || forceControls) { + setup.controls = new TrackballControls(setup.camera, setup.renderer.domElement); } const ambientLight = new AmbientLight(0x404040); @@ -112,6 +113,16 @@ export const createThreeDefaultSetup = (canvas: HTMLCanvasElement | null, camera return setup; }; +export const setCanvasDimensions = (offscreenPayload: OffscreenPayload) => { + const data = offscreenPayload.message; + const canvasDimensions = { + width: data.width ?? 0, + height: data.height ?? 0, + pixelRatio: data.pixelRatio ?? 0 + }; + return canvasDimensions; +}; + export const recalcAspectRatio = (canvasDimensions: CanvasDimensions) => { return (canvasDimensions.height === 0) ? 1 : canvasDimensions.width / canvasDimensions.height; }; diff --git a/packages/examples/src/examples/OBJLoader2BasicExample.ts b/packages/examples/src/examples/OBJLoader2BasicExample.ts index e903ac7..2ec1801 100644 --- a/packages/examples/src/examples/OBJLoader2BasicExample.ts +++ b/packages/examples/src/examples/OBJLoader2BasicExample.ts @@ -6,10 +6,10 @@ import { CanvasDimensions, createThreeDefaultSetup, ExampleDefinition, renderDef export class OBJLoader2BasicExample implements ExampleDefinition { private setup: ThreeDefaultSetup; - private modelUrl: string; + private modelUrl?: string; private materialUrl?: string; - constructor(canvas: HTMLCanvasElement | null, canvasDimensions: CanvasDimensions, modelUrl: string, materialUrl?: string) { + constructor(canvas: HTMLCanvasElement | null, canvasDimensions: CanvasDimensions, forceControls: boolean) { const cameraDefaults = { posCamera: new Vector3(0.0, 175.0, 500.0), posCameraTarget: new Vector3(0, 0, 0), @@ -17,9 +17,12 @@ export class OBJLoader2BasicExample implements ExampleDefinition { far: 10000, fov: 45 }; + this.setup = createThreeDefaultSetup(canvas, cameraDefaults, canvasDimensions, forceControls); + } + + setUrls(modelUrl: string, materialUrl?: string) { this.modelUrl = modelUrl; this.materialUrl = materialUrl; - this.setup = createThreeDefaultSetup(canvas, cameraDefaults, canvasDimensions); } getSetup() { @@ -49,7 +52,7 @@ export class OBJLoader2BasicExample implements ExampleDefinition { objLoader2.setModelName(modelName); objLoader2.setLogging(true, true); objLoader2.setMaterials(MtlObjBridge.addMaterialsFromMtlLoader(mtlParseResult)); - objLoader2.load(this.modelUrl, callbackOnLoad); + objLoader2.load(this.modelUrl!, callbackOnLoad); }; const mtlLoader = new MTLLoader(); mtlLoader.load(this.materialUrl, onLoadMtl); diff --git a/packages/examples/src/examples/OBJLoader2BasicExampleOffscreen.ts b/packages/examples/src/examples/OBJLoader2BasicExampleOffscreen.ts index 2c9637e..bacc1fb 100644 --- a/packages/examples/src/examples/OBJLoader2BasicExampleOffscreen.ts +++ b/packages/examples/src/examples/OBJLoader2BasicExampleOffscreen.ts @@ -2,7 +2,10 @@ import { DataPayload, WorkerTask, WorkerTaskMessage, - WorkerTaskMessageType + buildDefaultEventHandlingInstructions, + initOffscreenCanvas, + registerCanvas, + registerResizeHandler } from 'wtd-core'; export class OBJLoader2BasicExampleOffscreen { @@ -13,53 +16,42 @@ export class OBJLoader2BasicExampleOffscreen { // register the module worker const dev = import.meta.env?.DEV === true; const url = new URL(dev ? '../worker/BasicExampleOffscreenWorker.ts' : '../worker/generated/BasicExampleOffscreenWorker-es.js', import.meta.url); - const workerTask = new WorkerTask(taskName, 1, { - module: true, - blob: false, - url - }, true); + const worker = new Worker(url.href, { + type: 'module' + }); + const workerTask = new WorkerTask({ + taskName, + workerId: 1, + workerConfig: { + $type: 'WorkerConfigDirect', + worker + }, + verbose: true + }); try { const canvas = document.getElementById('example') as HTMLCanvasElement; - const offscreen = canvas.transferControlToOffscreen(); - const resize = () => { - const intermediateMessage = new WorkerTaskMessage(); - const dataPayload = new DataPayload(); - dataPayload.message.params = { - $type: 'resize', - width: canvas.offsetWidth, - height: canvas.offsetHeight, - pixelRatio: window.devicePixelRatio - }; - intermediateMessage.addPayload(dataPayload); - workerTask.sentMessage(intermediateMessage); - }; - window.addEventListener('resize', () => resize(), false); + // only create worker, but do not init + workerTask.createWorker(); + + // delegate events from main to offscreen + const handlingInstructions = buildDefaultEventHandlingInstructions(); + await registerCanvas(workerTask, canvas, handlingInstructions); + registerResizeHandler(workerTask, canvas); - const initMessage = new WorkerTaskMessage({ name: taskName }); - const resultInit = await workerTask.initWorker({ message: initMessage }); - console.log(`initTaskType then: ${resultInit}`); + // provide the canvas to the worker + await initOffscreenCanvas(workerTask, canvas); // once the init Promise returns enqueue the execution - const execMessage = new WorkerTaskMessage({ name: taskName }); const dataPayload = new DataPayload(); dataPayload.message.params = { - drawingSurface: offscreen, - width: canvas.clientWidth, - height: canvas.clientHeight, - pixelRatio: window.devicePixelRatio, modelUrl: new URL('./models/obj/main/female02/female02_vertex_colors.obj', window.location.href).href }; - execMessage.addPayload(dataPayload); - const resultExec = await workerTask.executeWorker({ - message: execMessage, - transferables: [offscreen], - onComplete: (m: WorkerTaskMessageType) => { - console.log('Received final command: ' + m.cmd); - } + await workerTask.executeWorker({ + message: WorkerTaskMessage.fromPayload(dataPayload), }); - console.log(`enqueueWorkerExecutionPlan finished: ${resultExec}`); + console.log('enqueueWorkerExecutionPlan finished successfully.'); } catch (e: unknown) { console.error(e); } diff --git a/packages/examples/src/examples/OBJLoader2ParallelsBasicExample.ts b/packages/examples/src/examples/OBJLoader2ParallelsBasicExample.ts index be58916..4f9852a 100644 --- a/packages/examples/src/examples/OBJLoader2ParallelsBasicExample.ts +++ b/packages/examples/src/examples/OBJLoader2ParallelsBasicExample.ts @@ -34,7 +34,6 @@ export class OBJLoader2ParalleleBasicExample implements ExampleDefinition { reportProgress({ detail: { text: 'Loading: ' + modelName } }); const objLoader2Parallel = new OBJLoader2Parallel() - .setWorkerUrl(false, new URL('./libs/worker/OBJLoader2WorkerClassic.js', window.location.href)) .setModelName(modelName) .setLogging(true, true) .setUseIndices(true); diff --git a/packages/examples/src/worker/BasicExampleOffscreenWorker.ts b/packages/examples/src/worker/BasicExampleOffscreenWorker.ts index c7d5fad..6358dad 100644 --- a/packages/examples/src/worker/BasicExampleOffscreenWorker.ts +++ b/packages/examples/src/worker/BasicExampleOffscreenWorker.ts @@ -1,58 +1,78 @@ import { comRouting, DataPayload, - WorkerTaskCommandResponse, + getOffscreenCanvas, + OffscreenPayload, + OffscreenWorker, + OffscreenWorkerCommandResponse, WorkerTaskMessage, - WorkerTaskMessageType, WorkerTaskWorker } from 'wtd-core'; import { OBJLoader2BasicExample } from '../examples/OBJLoader2BasicExample.js'; -import { executeExample, resizeDisplayGL } from '../examples/ExampleCommons.js'; +import { executeExample, resizeDisplayGL, setCanvasDimensions } from '../examples/ExampleCommons.js'; +import { ElementProxyReceiver, proxyStart } from 'wtd-three-ext'; -export class HelloWorlThreedWorker implements WorkerTaskWorker { +export class HelloWorlThreeWorker implements WorkerTaskWorker, OffscreenWorker { private objLoader2BasicExample?: OBJLoader2BasicExample; + private offScreenCanvas?: OffscreenCanvas; + private eventProxy?: ElementProxyReceiver; - init(message: WorkerTaskMessageType) { - console.log(`HelloWorldWorker#init: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + proxyStart(message: WorkerTaskMessage) { + console.log(`Received start command: ${message.cmd}`); + this.eventProxy = new ElementProxyReceiver(); + proxyStart(this.eventProxy); - const initComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.INIT_COMPLETE); - self.postMessage(initComplete); + const proxyStartComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: OffscreenWorkerCommandResponse.PROXY_START_COMPLETE + }); + self.postMessage(proxyStartComplete); } - intermediate(message: WorkerTaskMessageType): void { - console.log(`HelloWorldWorker#intermediateMessage: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + proxyEvent(message: WorkerTaskMessage) { + const payload = message.payloads?.[0]; + const offscreenPayload = (payload as OffscreenPayload); + const event = offscreenPayload.message.event; + if (event) { + this.eventProxy?.handleEvent(event); + } + } - const dataPayload = message.payloads[0] as DataPayload; - if (dataPayload.message.params?.$type === 'resize' && this.objLoader2BasicExample) { - const canvasDimensions = this.objLoader2BasicExample.getSetup().canvasDimensions; - canvasDimensions.width = dataPayload.message.params?.width as number; - canvasDimensions.height = dataPayload.message.params?.height as number; - canvasDimensions.pixelRatio = dataPayload.message.params?.pixelRatio as number; + resize(message: WorkerTaskMessage) { + const offscreenPayload = message.payloads?.[0] as OffscreenPayload; + + if (this.objLoader2BasicExample) { + this.objLoader2BasicExample.getSetup().canvasDimensions = setCanvasDimensions(offscreenPayload); resizeDisplayGL(this.objLoader2BasicExample.getSetup()); } - if (dataPayload.message.params?.$type === 'terminate') { - const execComplete = WorkerTaskMessage.createFromExisting(message, WorkerTaskCommandResponse.EXECUTE_COMPLETE); - const transferables = WorkerTaskMessage.pack(execComplete.payloads, false); - self.postMessage(execComplete, transferables); - } } - execute(message: WorkerTaskMessageType) { - console.log(`HelloWorldWorker#execute: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + initOffscreenCanvas(message: WorkerTaskMessage): void { + const offscreenPayload = message.payloads?.[0] as OffscreenPayload; + this.offScreenCanvas = getOffscreenCanvas(offscreenPayload); + + this.eventProxy!.merge(this.offScreenCanvas!); + + const canvasDimensions = setCanvasDimensions(offscreenPayload); + this.objLoader2BasicExample = new OBJLoader2BasicExample(this.eventProxy! as unknown as HTMLCanvasElement, + canvasDimensions, true); + + const initOffscreenCanvasComplete = WorkerTaskMessage.createFromExisting(message, { + overrideCmd: OffscreenWorkerCommandResponse.INIT_OFFSCREEN_CANVAS_COMPLETE + }); + self.postMessage(initOffscreenCanvasComplete); + } + + execute(message: WorkerTaskMessage) { + console.log(`HelloWorldWorker#execute: name: ${message.name} id: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); const dataPayload = message.payloads[0] as DataPayload; - const canvasDimensions = { - width: dataPayload.message.params?.width as number, - height: dataPayload.message.params?.height as number, - pixelRatio: dataPayload.message.params?.pixelRatio as number - }; - this.objLoader2BasicExample = new OBJLoader2BasicExample(dataPayload.message.params?.drawingSurface as HTMLCanvasElement, - canvasDimensions, dataPayload.message.params?.modelUrl as string); - executeExample(this.objLoader2BasicExample); + this.objLoader2BasicExample!.setUrls(dataPayload.message.params?.modelUrl as string); + + executeExample(this.objLoader2BasicExample!); } } -const worker = new HelloWorlThreedWorker(); +const worker = new HelloWorlThreeWorker(); self.onmessage = message => comRouting(worker, message); diff --git a/packages/examples/verify_assetpipeline.html b/packages/examples/verify_assetpipeline.html index 30643a3..b045b92 100644 --- a/packages/examples/verify_assetpipeline.html +++ b/packages/examples/verify_assetpipeline.html @@ -18,7 +18,7 @@ { "imports": { "three": "./libs/three.module.js", - "three/examples/jsm/controls/ArcballControls.js": "./libs/ArcballControls.js", + "three/examples/jsm/controls/TrackballControls.js": "./libs/TrackballControls.js", "three/examples/jsm/loaders/MTLLoader.js": "./libs/MTLLoader.js", "wtd-core": "./libs/wtd-core/DataPayload.js", "wwobjloader2": "./libs/objLoader2.js" diff --git a/packages/examples/verify_assetpipeline_obj_stage.html b/packages/examples/verify_assetpipeline_obj_stage.html index d0c355c..b224bf2 100644 --- a/packages/examples/verify_assetpipeline_obj_stage.html +++ b/packages/examples/verify_assetpipeline_obj_stage.html @@ -35,7 +35,7 @@ { "imports": { "three": "./libs/three.module.js", - "three/examples/jsm/controls/ArcballControls.js": "./libs/ArcballControls.js", + "three/examples/jsm/controls/TrackballControls.js": "./libs/TrackballControls.js", "three/examples/jsm/loaders/MTLLoader.js": "./libs/MTLLoader.js", "lil-gui": "./libs/lil-gui.esm.js", "wtd-core": "./libs/wtd-core/DataPayload.js", diff --git a/packages/examples/verify_obj2_basic.html b/packages/examples/verify_obj2_basic.html index d48d8ea..3c69244 100644 --- a/packages/examples/verify_obj2_basic.html +++ b/packages/examples/verify_obj2_basic.html @@ -18,7 +18,7 @@ { "imports": { "three": "./libs/three.module.js", - "three/examples/jsm/controls/ArcballControls.js": "./libs/ArcballControls.js", + "three/examples/jsm/controls/TrackballControls.js": "./libs/TrackballControls.js", "three/examples/jsm/loaders/MTLLoader.js": "./libs/MTLLoader.js", "wwobjloader2": "./libs/objLoader2.js" } diff --git a/packages/examples/verify_obj2_basic_offscreen.html b/packages/examples/verify_obj2_basic_offscreen.html index 0f5dbcb..1ebf18c 100644 --- a/packages/examples/verify_obj2_basic_offscreen.html +++ b/packages/examples/verify_obj2_basic_offscreen.html @@ -18,7 +18,7 @@ { "imports": { "three": "./libs/three.module.js", - "three/examples/jsm/controls/ArcballControls.js": "./libs/ArcballControls.js", + "three/examples/jsm/controls/TrackballControls.js": "./libs/TrackballControls.js", "three/examples/jsm/loaders/MTLLoader.js": "./libs/MTLLoader.js", "wtd-core": "./libs/wtd-core/index.js", "wwobjloader2": "./libs/objLoader2.js" diff --git a/packages/examples/verify_obj2_options.html b/packages/examples/verify_obj2_options.html index b6260d5..74a3d39 100644 --- a/packages/examples/verify_obj2_options.html +++ b/packages/examples/verify_obj2_options.html @@ -21,7 +21,7 @@ { "imports": { "three": "./libs/three.module.js", - "three/examples/jsm/controls/ArcballControls.js": "./libs/ArcballControls.js", + "three/examples/jsm/controls/TrackballControls.js": "./libs/TrackballControls.js", "three/examples/jsm/helpers/VertexNormalsHelper.js": "./libs/VertexNormalsHelper.js", "three/examples/jsm/loaders/MTLLoader.js": "./libs/MTLLoader.js", "lil-gui": "./libs/lil-gui.esm.js", diff --git a/packages/examples/verify_obj2parallel_basic.html b/packages/examples/verify_obj2parallel_basic.html index 5f798c5..a8e2584 100644 --- a/packages/examples/verify_obj2parallel_basic.html +++ b/packages/examples/verify_obj2parallel_basic.html @@ -18,7 +18,7 @@ { "imports": { "three": "./libs/three.module.js", - "three/examples/jsm/controls/ArcballControls.js": "./libs/ArcballControls.js", + "three/examples/jsm/controls/TrackballControls.js": "./libs/TrackballControls.js", "wwobjloader2": "./libs/objLoader2.js" } } diff --git a/packages/objloader2/package.json b/packages/objloader2/package.json index 6f009f5..3d78cf8 100644 --- a/packages/objloader2/package.json +++ b/packages/objloader2/package.json @@ -1,6 +1,6 @@ { "name": "wwobjloader2", - "version": "6.2.0-next.4", + "version": "6.2.0-next.5", "type": "module", "main": "./dist/index.js", "module": "./dist/index.js", @@ -69,15 +69,15 @@ "npm": "9.8.1" }, "dependencies": { - "three": "~0.158.0", - "wtd-core": "~2.4.0-next.4", - "wtd-three-ext": "~2.4.0-next.4" + "three": "~0.159.0", + "wtd-core": "~3.0.0-next.5", + "wtd-three-ext": "~3.0.0-next.5" }, "peerDependencies": { "three": ">= 0.137.5 < 1" }, "devDependencies": { - "@types/three": "~0.158.1" + "@types/three": "~0.159.0" }, "repository": { "type": "git", diff --git a/packages/objloader2/src/OBJLoader2.ts b/packages/objloader2/src/OBJLoader2.ts index ad3a765..5380a2e 100644 --- a/packages/objloader2/src/OBJLoader2.ts +++ b/packages/objloader2/src/OBJLoader2.ts @@ -226,7 +226,7 @@ export class OBJLoader2 extends Loader { * @param {FileLoaderOnErrorType} [onError] A function to be called if an error occurs during loading. The function receives the error as an argument. * @param {OnMeshAlterType} [onMeshAlter] Called after every single mesh is made available by the parser */ - load(url: string, onLoad: CallbackOnLoadType, onProgress?: FileLoaderOnProgressType, onError?: FileLoaderOnErrorType, onMeshAlter?: CallbackOnMeshAlterType) { + load(url: string | undefined, onLoad: CallbackOnLoadType, onProgress?: FileLoaderOnProgressType, onError?: FileLoaderOnErrorType, onMeshAlter?: CallbackOnMeshAlterType) { if (!(onLoad instanceof Function)) { const badOnLoadError = new Error('onLoad is not a function! Aborting...'); this._onError(badOnLoadError); @@ -245,14 +245,14 @@ export class OBJLoader2 extends Loader { }; } - if (!url) { + if (url === undefined) { onError(new ErrorEvent('An invalid url was provided. Unable to continue!')); } let urlFull = ''; try { - urlFull = new URL(url).href; + urlFull = new URL(url!).href; } catch (error) { - urlFull = new URL(url, window.location.href).href; + urlFull = new URL(url!, window.location.href).href; } let filename = urlFull; const urlParts = urlFull.split('/'); @@ -365,16 +365,16 @@ export class OBJLoader2 extends Loader { if (this.parser.isLoggingEnabled()) { let printedConfig = 'OBJLoader2 callback configuration:'; if (this.callbacks.onProgress !== null) { - printedConfig += '\n\tcallbacks.onProgress: ' + this.callbacks.onProgress?.name ?? 'undefined'; + printedConfig += `\n\tcallbacks.onProgress: ${this.callbacks.onProgress?.name ?? undefined}`; } if (this.callbacks.onError !== null) { - printedConfig += '\n\tcallbacks.onError: ' + this.callbacks.onError?.name ?? 'undefined'; + printedConfig += `\n\tcallbacks.onError: ${this.callbacks.onError?.name ?? undefined}`; } if (this.callbacks.onMeshAlter !== null) { - printedConfig += '\n\tcallbacks.onMeshAlter: ' + this.callbacks.onMeshAlter?.name ?? 'undefined'; + printedConfig += `\n\tcallbacks.onMeshAlter: ${this.callbacks.onMeshAlter?.name ?? undefined}`; } if (this.callbacks.onLoad !== null) { - printedConfig += '\n\tcallbacks.onLoad: ' + this.callbacks.onLoad?.name ?? 'undefined'; + printedConfig += `\n\tcallbacks.onLoad: ${this.callbacks.onLoad?.name ?? undefined}`; } console.info(printedConfig); } diff --git a/packages/objloader2/src/OBJLoader2Parallel.ts b/packages/objloader2/src/OBJLoader2Parallel.ts index c226568..0db9112 100644 --- a/packages/objloader2/src/OBJLoader2Parallel.ts +++ b/packages/objloader2/src/OBJLoader2Parallel.ts @@ -6,8 +6,7 @@ import { DataPayload, WorkerTask, WorkerTaskCommandResponse, - WorkerTaskMessage, - WorkerTaskMessageType + WorkerTaskMessage } from 'wtd-core'; import { CallbackOnLoadType, CallbackOnMeshAlterType, FileLoaderOnErrorType, FileLoaderOnProgressType, OBJLoader2 } from './OBJLoader2.js'; import { PreparedMeshType } from './OBJLoader2Parser.js'; @@ -113,24 +112,27 @@ export class OBJLoader2Parallel extends OBJLoader2 { } private async initWorkerParse(objToParse: ArrayBuffer) { - this.initWorkerTask(); - - await this.initWorker() - .then(() => { - if (this.parser.isDebugLoggingEnabled()) { - console.log('OBJLoader2Parallel init was performed'); - } - this.executeWorker(objToParse); - - }).catch((e: Error) => console.error(e)); - } + this.workerTask = new WorkerTask({ + taskName: OBJLoader2Parallel.TASK_NAME, + workerId: 1, + workerConfig: { + $type: 'WorkerConfigParams', + workerType: this.moduleWorker ? 'module' : 'classic', + blob: false, + url: this.workerUrl + }, + verbose: this.parser.isDebugLoggingEnabled() + }); - private initWorkerTask() { - this.workerTask = new WorkerTask(OBJLoader2Parallel.TASK_NAME, 1, { - module: this.moduleWorker, - blob: false, - url: this.workerUrl - }, this.parser.isDebugLoggingEnabled()); + try { + await this.initWorker(); + if (this.parser.isDebugLoggingEnabled()) { + console.log('OBJLoader2Parallel init was performed'); + } + this.executeWorker(objToParse); + } catch (e) { + console.error(e); + } } /** @@ -140,7 +142,6 @@ export class OBJLoader2Parallel extends OBJLoader2 { * @private */ private initWorker() { - const initMessage = new WorkerTaskMessage({}); const dataPayload = new DataPayload(); dataPayload.message.params = { logging: { @@ -149,14 +150,12 @@ export class OBJLoader2Parallel extends OBJLoader2 { } }; - initMessage.addPayload(dataPayload); - return this.workerTask!.initWorker({ message: initMessage }); + this.workerTask!.createWorker(); + return this.workerTask!.initWorker({ message: WorkerTaskMessage.fromPayload(dataPayload) }); } private async executeWorker(objToParse: ArrayBuffer) { - const execMessage = new WorkerTaskMessage({ - id: Math.floor(Math.random() * Math.floor(65536)) - }); + const execMessage = WorkerTaskMessage.createEmpty(); const dataPayload = new DataPayload(); dataPayload.message.params = { modelName: this.modelName, @@ -200,7 +199,7 @@ export class OBJLoader2Parallel extends OBJLoader2 { * @param {Mesh} mesh * @param {object} materialMetaInfo */ - private onWorkerMessage(message: WorkerTaskMessageType) { + private onWorkerMessage(message: WorkerTaskMessage) { const wtm = WorkerTaskMessage.unpack(message, false); if (wtm.cmd === WorkerTaskCommandResponse.INTERMEDIATE_CONFIRM) { diff --git a/packages/objloader2/src/worker/OBJLoader2Worker.ts b/packages/objloader2/src/worker/OBJLoader2Worker.ts index 4cb7303..4643f01 100644 --- a/packages/objloader2/src/worker/OBJLoader2Worker.ts +++ b/packages/objloader2/src/worker/OBJLoader2Worker.ts @@ -5,7 +5,6 @@ import { DataPayload, WorkerTaskCommandResponse, WorkerTaskMessage, - WorkerTaskMessageType, WorkerTaskWorker } from 'wtd-core'; import { @@ -27,14 +26,9 @@ class OBJLoader2Worker implements WorkerTaskWorker { materialNames: new Set() }; - initParser(id: number) { + initParser(wtm: WorkerTaskMessage) { const parser = new OBJLoader2Parser(); parser._onAssetAvailable = preparedMesh => { - const intermediateMessage = new WorkerTaskMessage({ - id, - progress: preparedMesh.progress - }); - const dataPayload = new DataPayload(); if (!dataPayload.message.params) { dataPayload.message.params = {}; @@ -55,16 +49,21 @@ class OBJLoader2Worker implements WorkerTaskWorker { if (preparedMesh.indexUA !== null) { dataPayload.message.buffers?.set('indexUA', preparedMesh.indexUA); } - intermediateMessage.cmd = WorkerTaskCommandResponse.INTERMEDIATE_CONFIRM; + + const intermediateMessage = WorkerTaskMessage.createFromExisting(wtm, { + overrideCmd: WorkerTaskCommandResponse.INTERMEDIATE_CONFIRM, + }); intermediateMessage.addPayload(dataPayload); + intermediateMessage.progress = preparedMesh.progress; const transferables = WorkerTaskMessage.pack(intermediateMessage.payloads, false); self.postMessage(intermediateMessage, transferables); }; parser._onLoad = () => { - const execMessage = new WorkerTaskMessage({ id }); - execMessage.cmd = WorkerTaskCommandResponse.EXECUTE_COMPLETE; + const execMessage = WorkerTaskMessage.createFromExisting(wtm, { + overrideCmd: WorkerTaskCommandResponse.EXECUTE_COMPLETE + }); // no packing required as no Transferables here self.postMessage(execMessage); }; @@ -78,21 +77,23 @@ class OBJLoader2Worker implements WorkerTaskWorker { return parser; } - init(message: WorkerTaskMessageType) { + init(message: WorkerTaskMessage) { const wtm = this.processMessage(message); if (this.localData.debugLogging) { - console.log(`OBJLoader2Worker#init: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + console.log(`OBJLoader2Worker#init: name: ${message.name} id: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); } - const initComplete = WorkerTaskMessage.createFromExisting(wtm, WorkerTaskCommandResponse.INIT_COMPLETE); + const initComplete = WorkerTaskMessage.createFromExisting(wtm, { + overrideCmd: WorkerTaskCommandResponse.INIT_COMPLETE + }); self.postMessage(initComplete); } - execute(message: WorkerTaskMessageType) { + execute(message: WorkerTaskMessage) { this.processMessage(message); - const parser = this.initParser(message.id ?? 0); + const parser = this.initParser(message); // apply previously stored parameters (init or execute) applyProperties(parser, this.localData.params, false); @@ -101,7 +102,7 @@ class OBJLoader2Worker implements WorkerTaskWorker { } if (parser.isDebugLoggingEnabled()) { - console.log(`OBJLoader2Worker#execute: name: ${message.name} id: ${message.id} cmd: ${message.cmd} workerId: ${message.workerId}`); + console.log(`OBJLoader2Worker#execute: name: ${message.name} id: ${message.uuid} cmd: ${message.cmd} workerId: ${message.workerId}`); } if (this.localData.buffer) { @@ -112,7 +113,7 @@ class OBJLoader2Worker implements WorkerTaskWorker { } } - private processMessage(message: WorkerTaskMessageType) { + private processMessage(message: WorkerTaskMessage) { const wtm = WorkerTaskMessage.unpack(message, false); const dataPayload = wtm.payloads[0] as DataPayload; diff --git a/scripts/UpdateVersions.mjs b/scripts/UpdateVersions.mjs index 992abe5..17bd2fa 100644 --- a/scripts/UpdateVersions.mjs +++ b/scripts/UpdateVersions.mjs @@ -2,10 +2,10 @@ import shell from 'shelljs'; const versionPattern = '.*[0-9]\\.[0-9]\\.[0-9].*'; -const version_wtd_core_real = '~2.4.0-next.4'; +const version_wtd_core_real = '~3.0.0-next.5'; const version_wtd_core_dev = '../../../wtd/packages/wtd-core'; -const version_wtd_three_ext_real = '~2.4.0-next.4'; +const version_wtd_three_ext_real = '~3.0.0-next.5'; const version_wtd_three_ext_dev = '../../../wtd/packages/wtd-three-ext'; const what = process.argv[2]; diff --git a/vite.config.ts b/vite.config.ts index 384f10d..d36b365 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -12,7 +12,7 @@ export default defineConfig(({ command }) => { rollupOptions: { external: [ 'three', - 'three/examples/jsm/controls/ArcballControls', + 'three/examples/jsm/controls/TrackballControls', 'three/examples/jsm/helpers/VertexNormalsHelper', 'three/examples/jsm/loaders/MTLLoader' ],