ngOnInit(): void { // retrieve the WebGL2 context: log.DEBUG("Retriving webGL2 context..."); let ctx = this.view.nativeElement.getContext('webgl2'); RenderContext.setCurrent(ctx); log.DEBUG("Assigned Render context!"); // Create a resource loader here: let loader = new ResourceLoader(this.http); // let scene = new Test2Scene(); // let scene = new Test2Scene(this.view.nativeElement); // let scene = new Test3Scene(this.view.nativeElement); // let scene = new Test4Scene(this.view.nativeElement); // let scene = new Test5Scene(this.view.nativeElement, loader); // let scene = new Test6Scene(this.view.nativeElement, loader); let scene = new Test7Scene(this.view.nativeElement, loader); }
// <reference lib="webworker" /> // import * as log from '../core/Log'; import { sprintf } from "sprintf-js"; import { Mat4 } from "../math/Mat4"; // import { BaseObject } from "../core/BaseObject"; // class MyClass extends BaseObject // { // public constructor() { // super(); // } // }; // function multMat(n: number, a: Mat4, b: Mat4): Mat4 // { // for(let i=0;i<n;i++) { // Mat4.multiply(a,b,a); // } // return a; // } // We send a message back to the main thread addEventListener("message", (event) => { // self.console.log("Received data: "+JSON.stringify(event)) // let a = new Mat4(); // a.rotateX(45.0); // // Get the limit from the event data // let a = new Mat4(); // a.fromArray(event.data.mat1); // let b = new Mat4(); // b.fromArray(event.data.mat2); // let obj = new MyClass(); // log.DEBUG("Hello!"); // let msg = sprintf("Hello %s", obj.name); let msg = sprintf("Hello %s", "manu"); // let n = event.data.count; // let res = multMat(n,a,b); // Send the primes back to the main thread // postMessage({ result: res }); // postMessage({ result: a.getElements() }); postMessage({ result: [42] }); // postMessage({ result: [msg.length] }); });
protected async init() { // Test the webworker: let promise = new Promise(function (resolve: ((val: number[]) => void), reject) { console.log("Creating Mat4Mult...") // const worker = new Worker(new URL('./Mat4Mult.worker', import.meta.url)); const worker = new Worker(new URL('src/nvland/workers/Mat4Mult.worker', import.meta.url)); // const worker = new Worker('Mat4Mult.worker.ts', {type: "module"}) worker.onmessage = (event) => { resolve(event.data.result); }; let a = Mat4.makeRotateX(43.0); let b = Mat4.makeRotateY(12.0); console.log("Mat1: " + a.toString()); console.log("Mat2: " + b.toString()); // worker.onmessage = ({ data }) => { // console.log(`page got message: ${JSON.stringify(data)}`); // }; // worker.postMessage({ mat1: a.getElements(), mat2: b.getElements(), count: 100 }); // worker.postMessage('hello'); }); let res = await promise; this.DEBUG("Received result data: " + JSON.stringify(res)); }
… But right now it seems I only get a black screen out of this 😖 not good… Arrff, no: stupid me, it's working, but I have to uncomment the worker.postMessage() statement of course lol.
$ landjs_test > nerv-land-js@0.0.0 test > ng test --no-watch --code-coverage \ Generating browser application bundles (phase: building)...04 02 2022 13:38:22.538:INFO [karma-server]: Karma v6.3.9 server started at http://loca lhost:9876/ 04 02 2022 13:38:22.540:INFO [launcher]: Launching browsers ChromeHeadless with concurrency unlimited 04 02 2022 13:38:22.549:INFO [launcher]: Starting browser ChromeHeadless √ Browser application bundle generation complete. 04 02 2022 13:38:34.874:INFO [Chrome Headless 97.0.4692.99 (Windows 10)]: Connected on socket fO2t8ywxepFNO-UmAAAB with id 68198556 Chrome Headless 97.0.4692.99 (Windows 10): Executed 0 of 0 SUCCESS (0.005 secs / 0 secs) TOTAL: 0 SUCCESS =============================== Coverage summary =============================== Statements : Unknown% ( 0/0 ) Branches : Unknown% ( 0/0 ) Functions : Unknown% ( 0/0 ) Lines : Unknown% ( 0/0 ) ================================================================================
… which is surprising, because I actually renamed the file Mat4Mult.spec.ts to Mat4Mult.bad.ts before running those tests! 😳 So, what now ?
"test": { "builder": "@angular-builders/custom-webpack:karma", "options": { "main": "src/test.ts", "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.spec.json", "karmaConfig": "karma.conf.js", "inlineStyleLanguage": "scss", "assets": [ "src/favicon.ico", "src/assets" ], "styles": [ "src/styles.scss" ], "customWebpackConfig": { "path": "./webpack.partial.js" }, "scripts": [], "webWorkerTsConfig": "tsconfig.worker.json" } }
{ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./out-tsc/worker", "lib": [ "es2018", "webworker" ], "types": [] }, "include": [ "src/**/*.worker.ts" ] }
… and in there our reference to the .worker.ts files. ⇒ looking for more infos on that “webWorkerTsConfig” config entry.
"exclude": ["* */*.worker.ts"]
in the other tsconfig files ? ⇒ nope, this doesn't seem to help 😭“webWorkerTsConfig”: “tsconfig.lightworker.json”
./src/nvland/workers/Mat4Mult.worker.ts - Error: Module build failed (from ./node_modules/@ngtools/webpack/src/ivy/index.js): Error: D:\Projects\NervLandJS\src\nvland\workers\Mat4Mult.worker.ts is missing from the TypeScript compilation. Please make sure it is in your tscon fig via the 'files' or 'include' property. at D:\Projects\NervLandJS\node_modules\@ngtools\webpack\src\ivy\loader.js:59:26
landjs_npm install --save worker-loader
declare module "worker-loader!*" { class WebpackWorker extends Worker { constructor(); } export default WebpackWorker; }
const ctx: Worker = self as any; onmessage = async (event) => { setTimeout(() => { ctx.postMessage(`[WORKER_TS] Waited ${event.data}ms`); }, event.data) }
import MatWorker from "worker-loader?inline=no-fallback!src/nvland/workers/Mat4Mult.worker.ts"; // Later in the code: const worker = new MatWorker() worker.onmessage = (event:any) => { resolve(event.data.result); }; let a = Mat4.makeRotateX(43.0); let b = Mat4.makeRotateY(12.0); console.log("Mat1: " + a.toString()); console.log("Mat2: " + b.toString()); worker.postMessage({ mat1: a.getElements(), mat2: b.getElements(), count: 100 });
/
Error: src/scenes/test7_terrainNode.ts:21:23 - error TS2691: An import path cannot end with a '.ts' extension. Consider importing 'worker-loader?inl ine=no-fallback!src/nvland/workers/Mat4Mult.worker.js' instead. 21 import MatWorker from "worker-loader?inline=no-fallback!src/nvland/workers/Mat4Mult.worker.ts"; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ** Angular Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ ** × Failed to compile.
landjs_npm install --save worker-loader
declare module "worker-loader!*" { class WebpackWorker extends Worker { constructor(); } export default WebpackWorker; }
module.exports = { module: { rules: [ { enforce: 'pre', test: /\.worker\.ts$/, loader: "worker-loader", }, { test: /\.glsl$/, exclude: /node_modules/, loader: 'raw-loader' } ] } };
√ Compiled successfully. √ Browser application bundle generation complete. Initial Chunk Files | Names | Size main.js | main | 306.21 kB runtime.js | runtime | 6.75 kB 3 unchanged chunks Build at: 2022-02-04T21:27:27.836Z - Hash: 6e2c2425dc9e35b3e572 - Time: 968ms × Failed to compile.
$ landjs_npm install comlink
// And building the app we should support loading webworkers: (window as any).createWorker = function() : any { return new Worker(new URL('nvland/workers/Mat4Mult.worker', import.meta.url)) }
⇒ So, the solution we have here is not the cleanest, but I feel happy I have something working at least! So let's call it a day now. Tomorrow I should try to get back to the Elevation Producer