From 397c8495435775e1f5415910c0283ddadfc9b254 Mon Sep 17 00:00:00 2001 From: Kizarm Date: Sat, 16 Dec 2023 16:27:51 +0100 Subject: [PATCH] add pages --- .gitignore | 6 +++ bin/index.html | 27 ++++++++++ bin/oscilator.html | 131 +++++++++++++++++++++++++++++++++++++++++++++ bin/oscilator.js | 116 +++++++++++++++++++++++++++++++++++++++ bin/oscilator.wasm | Bin 0 -> 9142 bytes bin/well.html | 131 +++++++++++++++++++++++++++++++++++++++++++++ bin/well.js | 116 +++++++++++++++++++++++++++++++++++++++ bin/well.wasm | Bin 0 -> 8943 bytes 8 files changed, 527 insertions(+) create mode 100644 .gitignore create mode 100644 bin/index.html create mode 100644 bin/oscilator.html create mode 100644 bin/oscilator.js create mode 100755 bin/oscilator.wasm create mode 100644 bin/well.html create mode 100644 bin/well.js create mode 100755 bin/well.wasm diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3efaf1a --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# kdevelop +.kde* +*.kdev4 +# other +*.o +lib/libWASM.a diff --git a/bin/index.html b/bin/index.html new file mode 100644 index 0000000..351a1d8 --- /dev/null +++ b/bin/index.html @@ -0,0 +1,27 @@ + + + + + + Quantum + + +
+

Kvantový vývoj.

+

Harmonický oscilátor. +

+

Kvantová jáma. +

+

Obojí je jen přepis apletu ze serveru Aldebaran, to už na novějších prohlížečích nefunguje, + je to jednoduše přepsáno jako bare-bone webassembly modul. Původně to bylo napsáno pro emscripten, + ale nakonec je to zoptimalizováno jen pro clang, nakonec není to nic složitého a těch pár knihovních + funkcí je dopsáno ručně, byť ne moc efektivně. A je to tak 10x menší (ne, že by na tom moc záleželo). +

+

Není to nijak učesané, nejsou ani ošetřeny všechny závislosti a tím méně chyby. Celkem to však + funguje, je např. vidět, že čistý bázový stav nemá časový vývoj. Samozřejmě chybí i jakékoli + komentáře, ale dělal jsem to abych se něco nového naučil, ne abych to prodal.´ +

+
+ diff --git a/bin/oscilator.html b/bin/oscilator.html new file mode 100644 index 0000000..611efce --- /dev/null +++ b/bin/oscilator.html @@ -0,0 +1,131 @@ + + + + + + Oscilator + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
Váhy:
12345678910
 
+
Rychlost 
+

+ + + diff --git a/bin/oscilator.js b/bin/oscilator.js new file mode 100644 index 0000000..3960411 --- /dev/null +++ b/bin/oscilator.js @@ -0,0 +1,116 @@ +var gWASM = null; // WASM -> global object +var Animate = 0; +var canvas = document.getElementById('canvas'); +var context = canvas.getContext('2d'); +var bgImage = new Image(); +window.onload = async function() { + const memory = new WebAssembly.Memory({ initial: 128 }); + if (!memory) { + console.log ('!!! WebAssembly not supported'); return; + } + const importObject = { + env: { memory }, + imports: { // importované funkce do wasm + PrintOut : (ptr, len) => { + const view = new Uint8Array (memory.buffer, ptr, len); + const utf8decoder = new TextDecoder(); + console.log (utf8decoder.decode(view)); + }, + memoryGrow : (len) => { + console.log ('Growing the memory by ' + len.toString() + '. 64K blocks'); + importObject.env.memory.grow (len); + }, + }, + }; + const response = await fetch('./oscilator.wasm'); + const bytes = await response.arrayBuffer(); + const module = await WebAssembly.instantiate(bytes, importObject); + gWASM = { + asm : module.instance.exports, + mem : memory, + }; + gWASM.asm.Init(memory.buffer.byteLength); + + window.addEventListener('resize', resizeCanvas, false); + resizeCanvas(); + ClearWeights(); + + const id = document.getElementById ('speed'); + id.value = 1; +} +function SetSpeed () { + const id = document.getElementById ('speed'); + gWASM.asm.setSpeed (parseInt (id.value)); + document.getElementById ('showspeed').innerHTML = 'Rychlost : ' + id.value; +} +function StartStop () { + Animate = gWASM.asm.gEnabled (); + const id = document.getElementById ('animate'); + if (Animate) id.innerHTML = 'Stop'; + else id.innerHTML = 'Vývoj'; +} +function SetWeight (n) { + const sid = 'Weight' + n; + const val = document.getElementById (sid).value; + const m = n + 1; + const out = m.toString() + ' : ' + val.toString() + '%'; + document.getElementById('weightText').innerHTML = out; + gWASM.asm.setWeight (n, parseInt (val)); + drawPass (); +} +function ClearWeights () { + for (i=0; i<10; i++) { + const sid = 'Weight' + i; + document.getElementById (sid).value = 0; + document.getElementById('weightText').innerHTML = 'vynulováno'; + gWASM.asm.setWeight (i,0); + } + gWASM.asm.Reset(); + drawPass(); +} +function resizeCanvas() { + const width = canvas.clientWidth; + const height = canvas.clientHeight; + canvas.width = width; + canvas.height = height; + gWASM.asm.graph (width, height); + drawStuff (); + window.setTimeout (ReplotPass, 50); +} +function drawStuff() { + context.clearRect(0, 0, canvas.widht, canvas.height); + delete bgImage; + bgImage = backup (gWASM.asm.bg_data()); + context.drawImage (bgImage, 0, 0); + const fgImage = backup (gWASM.asm.fg_data()); + context.drawImage (fgImage, 0, 0); +} +function drawPass() { + const fgImage = backup (gWASM.asm.fg_data()); + context.clearRect(0, 0, canvas.widht, canvas.height); + context.drawImage (bgImage, 0, 0); + context.drawImage (fgImage, 0, 0); +} +function ReplotPass () { + if (Animate) { + // console.log ('Pass'); + const fgImage = backup (gWASM.asm.gStep()); + context.clearRect(0, 0, canvas.widht, canvas.height); + context.drawImage (bgImage, 0, 0); + context.drawImage (fgImage, 0, 0); + } + window.setTimeout (ReplotPass, 20); +} +function backup (m_Data) { + const buffer = gWASM.mem.buffer; + const memarr = new Uint32Array (buffer, m_Data, 2); + const canvas = document.getElementById('canvas'); + const width = canvas.width; + const height = canvas.height; + const tmpcvs = new OffscreenCanvas(width, height); + const tmpctx = tmpcvs.getContext('2d'); + const bytes = new ImageData (new Uint8ClampedArray (buffer, memarr[0], memarr[1]), width, height); + tmpctx.putImageData (bytes, 0, 0); + return tmpcvs; // vrati obrazek +} + diff --git a/bin/oscilator.wasm b/bin/oscilator.wasm new file mode 100755 index 0000000000000000000000000000000000000000..44541f33bf72ea416a24be239f0fa0e488c77710 GIT binary patch literal 9142 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 literal 0 HcmV?d00001 diff --git a/bin/well.html b/bin/well.html new file mode 100644 index 0000000..54c41a7 --- /dev/null +++ b/bin/well.html @@ -0,0 +1,131 @@ + + + + + + Quantum_Well + + + +
+ + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + +
Váhy:
12345678910
 
+
Rychlost 
+

+ + + diff --git a/bin/well.js b/bin/well.js new file mode 100644 index 0000000..be48ea0 --- /dev/null +++ b/bin/well.js @@ -0,0 +1,116 @@ +var gWASM = null; // WASM -> global object +var Animate = 0; +var canvas = document.getElementById('canvas'); +var context = canvas.getContext('2d'); +var bgImage = new Image(); +window.onload = async function() { + const memory = new WebAssembly.Memory({ initial: 128 }); + if (!memory) { + console.log ('!!! WebAssembly not supported'); return; + } + const importObject = { + env: { memory }, + imports: { // importované funkce do wasm + PrintOut : (ptr, len) => { + const view = new Uint8Array (memory.buffer, ptr, len); + const utf8decoder = new TextDecoder(); + console.log (utf8decoder.decode(view)); + }, + memoryGrow : (len) => { + console.log ('Growing the memory by ' + len.toString() + '. 64K blocks'); + importObject.env.memory.grow (len); + }, + }, + }; + const response = await fetch('./well.wasm'); + const bytes = await response.arrayBuffer(); + const module = await WebAssembly.instantiate(bytes, importObject); + gWASM = { + asm : module.instance.exports, + mem : memory, + }; + gWASM.asm.Init(memory.buffer.byteLength); + + window.addEventListener('resize', resizeCanvas, false); + resizeCanvas(); + ClearWeights(); + + const id = document.getElementById ('speed'); + id.value = 1; +} +function SetSpeed () { + const id = document.getElementById ('speed'); + gWASM.asm.setSpeed (parseInt (id.value)); + document.getElementById ('showspeed').innerHTML = 'Rychlost : ' + id.value; +} +function StartStop () { + Animate = gWASM.asm.gEnabled (); + const id = document.getElementById ('animate'); + if (Animate) id.innerHTML = 'Stop'; + else id.innerHTML = 'Vývoj'; +} +function SetWeight (n) { + const sid = 'Weight' + n; + const val = document.getElementById (sid).value; + const m = n + 1; + const out = m.toString() + ' : ' + val.toString() + '%'; + document.getElementById('weightText').innerHTML = out; + gWASM.asm.setWeight (n, parseInt (val)); + drawPass (); +} +function ClearWeights () { + for (i=0; i<10; i++) { + const sid = 'Weight' + i; + document.getElementById (sid).value = 0; + document.getElementById('weightText').innerHTML = 'vynulováno'; + gWASM.asm.setWeight (i,0); + } + gWASM.asm.Reset(); + drawPass(); +} +function resizeCanvas() { + const width = canvas.clientWidth; + const height = canvas.clientHeight; + canvas.width = width; + canvas.height = height; + gWASM.asm.graph (width, height); + drawStuff (); + window.setTimeout (ReplotPass, 50); +} +function drawStuff() { + context.clearRect(0, 0, canvas.widht, canvas.height); + delete bgImage; + bgImage = backup (gWASM.asm.bg_data()); + context.drawImage (bgImage, 0, 0); + const fgImage = backup (gWASM.asm.fg_data()); + context.drawImage (fgImage, 0, 0); +} +function drawPass() { + const fgImage = backup (gWASM.asm.fg_data()); + context.clearRect(0, 0, canvas.widht, canvas.height); + context.drawImage (bgImage, 0, 0); + context.drawImage (fgImage, 0, 0); +} +function ReplotPass () { + if (Animate) { + // console.log ('Pass'); + const fgImage = backup (gWASM.asm.gStep()); + context.clearRect(0, 0, canvas.widht, canvas.height); + context.drawImage (bgImage, 0, 0); + context.drawImage (fgImage, 0, 0); + } + window.setTimeout (ReplotPass, 20); +} +function backup (m_Data) { + const buffer = gWASM.mem.buffer; + const memarr = new Uint32Array (buffer, m_Data, 2); + const canvas = document.getElementById('canvas'); + const width = canvas.width; + const height = canvas.height; + const tmpcvs = new OffscreenCanvas(width, height); + const tmpctx = tmpcvs.getContext('2d'); + const bytes = new ImageData (new Uint8ClampedArray (buffer, memarr[0], memarr[1]), width, height); + tmpctx.putImageData (bytes, 0, 0); + return tmpcvs; // vrati obrazek +} + diff --git a/bin/well.wasm b/bin/well.wasm new file mode 100755 index 0000000000000000000000000000000000000000..86622ad964652fe4f0dda7f13c59847a55817fc1 GIT binary patch literal 8943 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