From d58e3f6c5b62956de847ef6408ea6ab11784660a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aurimas=20Bla=C5=BEulionis?= <0x60@pm.me> Date: Mon, 25 Dec 2023 22:50:53 +0200 Subject: [PATCH] Add blog with 0.2 article --- main.py | 1 + mdrend.py | 23 +- src/blog/index.md | 3 + src/blog/memflow-0.2.0.md | 280 ++++++++++ src/quick_start.md | 22 +- src/static/js/asciirend/asciirend.js | 640 ++++++++++++++++++++++ src/static/js/asciirend/asciirend_bg.wasm | Bin 0 -> 193097 bytes src/static/js/draw.js | 239 ++++++++ templates/main.html | 2 +- 9 files changed, 1187 insertions(+), 23 deletions(-) create mode 100644 src/blog/index.md create mode 100644 src/blog/memflow-0.2.0.md create mode 100644 src/static/js/asciirend/asciirend.js create mode 100644 src/static/js/asciirend/asciirend_bg.wasm create mode 100644 src/static/js/draw.js diff --git a/main.py b/main.py index d7d6f91..b71584e 100644 --- a/main.py +++ b/main.py @@ -16,6 +16,7 @@ template_vars = { 'navbar': [ ('/', 'Home'), + ('blog/', 'Blog'), ('about/', 'About'), ('quick_start/', 'Quick start guide'), ('docs/', 'Documentation'), diff --git a/mdrend.py b/mdrend.py index f21dc64..448b411 100644 --- a/mdrend.py +++ b/mdrend.py @@ -58,16 +58,18 @@ def ascii_render(self, code): scene = '{' + d[1] color = int(props['color']) if 'color' in props else 0 - w = int(props['w']) if 'w' in props else 64 + w = int(props['w']) if 'w' in props else 72 h = int(props['h']) if 'h' in props else 32 aspect = float(w / (2 * h)) + + # These parameters are not actually used in latest asciirend ortho = bool(props['ortho']) if 'ortho' in props else True fov = float(props['fov']) if 'fov' in props else 1.0 znear = float(props['znear']) if 'znear' in props else 0.1 zfar = float(props['zfar']) if 'zfar' in props else 100.0 self.scene_props[div_id] = { - 'scene': scene, + 'scene': scene.replace('\n', ''), 'w': w, 'h': h, 'aspect': aspect, @@ -77,9 +79,11 @@ def ascii_render(self, code): 'zfar': zfar, 'dynamic_w': bool(props['dynamic_w']) if 'dynamic_w' in props else False, 'dynamic_h': bool(props['dynamic_h']) if 'dynamic_h' in props else False, + 'show_usage': bool(props['show_usage']) if 'show_usage' in props else True, + 'disable_zoom': bool(props['disable_zoom']) if 'disable_zoom' in props else False, } - rendered = ar.ascii_render(scene, color, w, h, aspect, ortho, fov, znear, zfar) + rendered = ar.ascii_render(scene, color, w, h, aspect, ortho, fov, znear, zfar, 0.0) return f'
{rendered}
'; def gh_users_render(self, code): @@ -102,8 +106,6 @@ def gh_users_render(self, code):
""" - print(line) - return output def block_code(self, code, lang=None): @@ -119,8 +121,6 @@ def block_code(self, code, lang=None): except ClassNotFound: lexer = get_lexer_by_name("html", stripall=True) - print(str(lexer)) - formatter = HtmlFormatter() return highlight(code, lexer, formatter) @@ -159,19 +159,20 @@ def shortdown(value): md_rend = md.create_markdown(renderer=renderer, plugins=['strikethrough']) return md_rend(trimmed) -def markdown(value): +def markdown(value, backlink): + print(backlink) renderer = CustomizedRenderer() md_rend = md.create_markdown(renderer=renderer, plugins=['task_lists', 'table', 'footnotes', 'strikethrough'], escape=False) rendered = md_rend(value) if renderer.scene_cnt > 0: - javascript = """ + javascript = f""" """ diff --git a/src/blog/index.md b/src/blog/index.md new file mode 100644 index 0000000..094a19b --- /dev/null +++ b/src/blog/index.md @@ -0,0 +1,3 @@ +# Blog + +## [Announcing memflow 0.2.0](memflow-0.2.0/) diff --git a/src/blog/memflow-0.2.0.md b/src/blog/memflow-0.2.0.md new file mode 100644 index 0000000..4ea0876 --- /dev/null +++ b/src/blog/memflow-0.2.0.md @@ -0,0 +1,280 @@ +# Announcing memflow 0.2.0 + +Today, we are proud to release the first stable version of memflow 0.2! 3 years in the making, this +is certainly a monumental release. In this post, we will go through the key changes to the fastest +and most flexible physical memory introspection and forensics framework to date. + +## Key changes + +### 0. [memflowup](https://github.com/memflow/memflowup) + +Not a library change, but the ecosystem change! We now have a rust-written memflowup utility that +makes it much easier to manage your memflow installation. Key features: + +- Download binary builds (optional). +- Split between stable and dev versions. +- Custom install scripts, for more complicated plugins + - Used by [`memflow-kvm`](https://github.com/memflow/memflow-kvm) for DKMS install. + - Entry point for these is `install.rhai` script at the root of the package's repo. + +You can get started with memflowup by running the following: + +``` +> curl --proto '=https' --tlsv1.2 -sSf https://sh.memflow.io | sh +``` + +### 1. OS layers and modularity + +With the advent of 0.2 series, we now abstracted most of `memflow-win32` functionality behind +shared set of traits. These traits allow the user to interact with the operating system in unified +manner. In addition, we now made OS a plugin, just as Connectors were in 0.1! And finally, we do +indeed have multiple OS backends available, right now: + +- [`memflow-win32`](https://github.com/memflow/memflow-win32), for Windows analysis, given physical + memory access. +- [`memflow-native`](https://github.com/memflow/memflow-native), for syscall based interaction with + the running operating system. +- WIP: `memflow-linux` + - Don't expect much anytime soon, because the challenge of cross-version, zero-knowledge linux + support is a tricky one. + +With this, OS-independent code that works with `memflow-win32`, should also work on local OS. Here's +an example of such code: + +```rust +use memflow::prelude::v1::*; + +// We don't care what type of process we get, so long as it's a process +fn module_address(process: &mut impl Process, module: &str) -> Result
{ + let module = process.module_by_name(module)?; + Ok(module.base) +} +``` + +In addition, modularization of operating systems allows for greater portability of connectors. For +instance, we have now split `memflow-qemu-procfs` into +[`memflow-qemu`](https://github.com/memflow/memflow-qemu), which (optionally) accepts an OS layer. +This way, you can not only analyze QEMU VMs running on your computer, but you can also open them up +in a nested way on a machine that is already being analyzed through DMA. As seen in this chart: + +```asciirend +dynamic_w = true +dynamic_h = false +fov = 4.5 +ortho = true +disable_zoom = true +# Scene: +{ + "camera_props": { + "proj_mode": "Orthographic", + "fov": 1.0, + "near": 0.01, + "far": 100.0 + }, + "camera_controller":{"fov_y":1.0,"focus_point":[0.0,0.0,0.0],"rot":[-0.19996414, -0.08282786, 0.37361234, 0.90197986],"dist":2.0,"in_motion":"None","scroll_sensitivity":0.02,"orbit_sensitivity":1.0,"last_down":false,"pressed":false}, + "objects":[ + { + "transform":[ + 1.0,0.0,0.0,0.0, + 0.0,1.0,0.0,0.0, + 0.0,0.0,1.0,0.0, + 0.0,0.0,0.0,1.0 + ], + "material":0, + "ty":{ + "Primitive":{ + "Line":{ + "start":[-0.75,0.0,1.5,1.0], + "end":[-0.25,0.0,0.5,1.0] + } + } + } + }, + { + "transform":[ + 1.0,0.0,0.0,0.0, + 0.0,1.0,0.0,0.0, + 0.0,0.0,1.0,0.0, + 0.0,0.0,0.0,1.0 + ], + "material":0, + "ty":{ + "Primitive":{ + "Line":{ + "start":[-0.25,0.0,0.5,1.0], + "end":[0.25,0.0,-0.5,1.0] + } + } + } + }, + { + "transform":[ + 1.0,0.0,0.0,0.0, + 0.0,1.0,0.0,0.0, + 0.0,0.0,1.0,0.0, + 0.0,0.0,0.0,1.0 + ], + "material":0, + "ty":{ + "Primitive":{ + "Line":{ + "start":[0.25,0.0,-0.5,1.0], + "end":[0.75,0.0,-1.5,1.0] + } + } + } + }, + { + "transform":[ + 1.0,0.0,0.0,0.0, + 0.0,1.0,0.0,0.0, + 0.0,0.0,1.0,0.0, + -0.75,0.0,1.5,1.0 + ],"material":1,"ty":{"Cube":{"size":[1.0,1.0,0.5]}},"text":"memflow-kvm" + }, + { + "transform":[ + 1.0,0.0,0.0,0.0, + 0.0,1.0,0.0,0.0, + 0.0,0.0,1.0,0.0, + -0.25,0.0,0.5,1.0 + ],"material":1,"ty":{"Cube":{"size":[1.0,1.0,0.5]}},"text":"memflow-win32" + }, + { + "transform":[ + 1.0,0.0,0.0,0.0, + 0.0,1.0,0.0,0.0, + 0.0,0.0,1.0,0.0, + 0.25,0.0,-0.5,1.0 + ],"material":1,"ty":{"Cube":{"size":[1.0,1.0,0.5]}},"text":"memflow-qemu" + }, + { + "transform":[ + 1.0,0.0,0.0,0.0, + 0.0,1.0,0.0,0.0, + 0.0,0.0,1.0,0.0, + 0.75,0.0,-1.5,1.0 + ],"material":1,"ty":{"Cube":{"size":[1.0,1.0,0.5]}},"text":"memflow-win32" + } + ], + "bg":{"color":[0.0,0.0,0.0]}, + "dithering":{"count_frames":false,"frame_cnt":4181} +} +``` + +### 2. Stable ABI + +In 0.1, the Connectors were turned into plugins through use of Rust trait objects. This was an okay +solution at the time, however, we knew that it was not a safe one - changes in Rust versions could +change the layout of those trait objects, leading to crashes or other misbehavior, in case of +mismatch of plugin's `rustc` version and the one of the user's code. While the layout has remained +stable most of the time, the tides started to shift a few years ago, as more effort was put into +trait objects on the compiler front. + +For 0.2, we knew we could not keep the status quo, so, we built `cglue`. The crate allows for +simple and flexible ABI safe code generation, suited for the needs of `memflow`. Throughout the +(very long) beta period, we received 0 crash reports stemming from ABI instability, while 0.1 had +such cases. Therefore, we can conclude that it was a good investment that already made memflow more +stable. + +In `0.2.0-betaX` series, you may have encountered "invalid ABI" errors, well, fear not, because in +stable series, we commit to not breaking the ABI across entirety of `0.2` series, so this problem +should be a thing of the past for most users. + +### 3. Memory constrained vtop + +memflow 0.2 introduces the most scalable virtual address translation backend, period. The backend +is able to walk entire page tree in milliseconds, targeting any modern memory architecture (x86 and +ARM support out-of-the box, sufficient building blocks for RISC-V). In addition, compared to 0.1, +the new backend uses fixed-size buffers, meaning RAM usage will no longer blow up on large +translation ranges. + +### 4. 64-bit and 128-bit address spaces, on all architectures + +We now support analyzing 64-bit operating systems on 32-bit machines. In addition, if there was a +theoretical 128-bit architecture, we would support that as well. However, it's more of a PoC and we +do not expect this to be needed in the foreseeable future. + +The support can be toggled through `64_bit_mem` (default) and `128_bit_mem` features. Do note that +these feature toggles do change memflow's ABI and it should not be possible to mix the plugin +features. + +### 5. Shared `MemoryView` + +In 0.1, we have had a split between physical and virtual memory. The reason for the split is +caching - we wish minimize latency by caching read-only memory in high-latency scenarios. +However, to tell the cache what mode the memory is in (readable/writeable/executable), you must add +metadata with each request. Meanwhile, this metadata may only be filled in by the virtual address +translation backend. + +If user submits an I/O operation - they can't possibly know whether the request is going to a +read-only, or a writeable page, therefore they just submit `UNKNOWN` page flags. This is +complicated, therefore, we have lowered the gap between virtual and physical memory access through +use of `MemoryView` trait. This trait not only removes the need for the user to explicitly submit +the page flags, but also brings all I/O helpers that existed in virtual memory contexts. To use +`MemoryView` on physical memory, just use the `phys_view` function: + +```rust +use memflow::prelude::v1::*; + +fn main() -> Result<()> { + let inventory = Inventory::scan(); + let mut conn = inventory.create_connector("dummy", None, None)?; + + // Create a physical memory view + let mut view = conn.phys_view(); + + // Read from phys addr 0 + let value: u64 = view.read(0.into())?; + + Ok(()) +} +``` + +### 6. C and C++ are now first-class citizen + +The FFI is now automatically generated using `cbindgen` and `cglue-bindgen`. It may initially seem +like a downgrade, however, this way we can ensure entirety of memflow's plugin-focused API surface +can be both accessed, and implemented by foreign languages, such as C and C++. + +The key to using the new FFI, is reading Rust documentation and examples, and then finding the +function equivalents in the headers. There are a few quirks here and there, but after understanding +them, using the FFI should not be hard. For inspiration, see the following: + +- [C examples](https://github.com/memflow/memflow/tree/0.2.0/memflow-ffi/examples/c) +- [C++ examples](https://github.com/memflow/memflow/tree/0.2.0/memflow-ffi/examples/cpp) +- [CMake template](https://github.com/memflow/memflow-cmake-example) + +## Side projects + +`memflow` is as useful as the projects utilizing it. To get started with the new version faster, +you may want to have a look at some of them. Here's the list of first-party releases: + +- [`reflow`](https://github.com/memflow/reflow) - execute code on top of virtual memory. +- [`scanflow`](https://github.com/memflow/scanflow) - basic CheatEngine features in a command line + interface. +- [`cloudflow`](https://github.com/memflow/cloudflow) (WIP) - flexible filesystem based way to + interact with memflow. +- [`memflow-py`](https://github.com/memflow/memflow-py) - python bindings for memflow (courtesy of + emesare). + +## Reflection + +0.2 took way longer than we originally anticipated. This is mostly due to changing living +conditions and the fact that both ko1N and I are only working on the project in hobbyist capacity. +In addition, we pushed for perfection from documentation and implementation front - a feat +infeasible at the current point. We do believe memflow is the framework that is going to bring the +most empowerement to users, however, there are still ways to go. + +## Next up - Async Metamorphosis + +Next, we will work towards integrating [`mfio`](https://github.com/memflow/mfio) into memflow, +which will enable higher scalability and simplicity. The key change is going to be transition from +synchronous to asynchronous API. There are still a lot of open questions regarding this, such as +FFI handling, how much the individual pieces of memflow's code will have to change, and how +multithreading needs to be handled. However, we are confident those questions are not impossible +to solve. Once the metamorphosis is done, we can consider the structure of memflow done. What comes +afterwards, is rapid feature development. It will definitely be an exciting time to be alive. So +let's just get there, shall we? + +\- h33p diff --git a/src/quick_start.md b/src/quick_start.md index e1117b7..fcfa705 100644 --- a/src/quick_start.md +++ b/src/quick_start.md @@ -31,9 +31,9 @@ After setting up cargo properly you can install memflowup via our install script Alternatively you can install memflowup via cargo: ``` -> cargo install memflowup --force --version "=0.1.0-beta11" +> cargo install memflowup --force ... -Installed package `memflowup v0.1.0-beta11` (executable `memflowup.exe`) +Installed package `memflowup v0.1.0` (executable `memflowup.exe`) ``` #### Note @@ -41,7 +41,7 @@ memflowup should __not__ be installed or ran as root or via sudo. By default rus ### 2. Installing plugins -When running `memflowup` for the first time it is recommended to use the interactive mode and install memflow from the 0.2.0-beta branch (development). +When running `memflowup` for the first time it is recommended to use the interactive mode and install memflow from the stable branch. Installing packages system-wide will place all plugins in `/usr/local/lib/memflow`.\ Installing packages per user will place all plugins in `$HOME/.local/lib/memflow`. @@ -99,11 +99,11 @@ In case you installed the plugins like in the example above you can simply use t ### 3. Verify your installation and run an example To test if everything is working properly the easiest method is to simply -use one of the [examples](https://github.com/memflow/memflow/tree/0.2.0-beta11/memflow/examples) provided in memflow. +use one of the [examples](https://github.com/memflow/memflow/tree/stable/memflow/examples) provided in memflow. To run the examples simply check out the memflow repo with the appropiate version: ``` -> git clone --depth 1 --branch 0.2.0-beta11 https://github.com/memflow/memflow +> git clone --depth 1 --branch stable https://github.com/memflow/memflow > cd memflow ``` @@ -147,14 +147,14 @@ info: cleaning up downloads & tmp directories After setting up cargo properly you can install memflowup via cargo: ``` -> cargo install memflowup --force --version "=0.1.0-beta11" +> cargo install memflowup --force ... -Installed package `memflowup v0.1.0-beta11` (executable `memflowup.exe`) +Installed package `memflowup v0.1.0` (executable `memflowup.exe`) ``` ### 2. Installing plugins -When running `memflowup` for the first time it is recommended to use the interactive mode and install memflow from the 0.2.0-beta branch (development). +When running `memflowup` for the first time it is recommended to use the interactive mode and install memflow from the stable branch. Installing packages system-wide will place all plugins in `%ProgramFiles%\memflow\`.\ Installing packages per user will place all plugins in `%UserProfile%\Documents\memflow\`. @@ -210,11 +210,11 @@ In case you installed the plugins like in the example above you can simply use t ### 3. Verify your installation and run an example To test if everything is working properly the easiest method is to simply -use one of the [examples](https://github.com/memflow/memflow/tree/0.2.0-beta11/memflow/examples) provided in memflow. +use one of the [examples](https://github.com/memflow/memflow/tree/stable/memflow/examples) provided in memflow. To run the examples simply check out the memflow repo with the appropiate version: ``` -> git clone --depth 1 --branch 0.2.0-beta11 https://github.com/memflow/memflow +> git clone --depth 1 --branch stable https://github.com/memflow/memflow > cd memflow ``` @@ -242,4 +242,4 @@ If everything went well you should see a list of all open processes: 1484 x86_64 x86_64 services.exe () (Alive) ... -``` \ No newline at end of file +``` diff --git a/src/static/js/asciirend/asciirend.js b/src/static/js/asciirend/asciirend.js new file mode 100644 index 0000000..02e16ae --- /dev/null +++ b/src/static/js/asciirend/asciirend.js @@ -0,0 +1,640 @@ +let wasm; + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8Memory0 = null; + +function getUint8Memory0() { + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} +/** +* @returns {number} +*/ +export function new_scene() { + const ret = wasm.new_scene(); + return ret >>> 0; +} + +/** +* @param {number} scene +*/ +export function remove_scene(scene) { + wasm.remove_scene(scene); +} + +let cachedInt32Memory0 = null; + +function getInt32Memory0() { + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} +/** +* @param {number} scene +* @returns {string} +*/ +export function scene_to_json(scene) { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.scene_to_json(retptr, scene); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} +/** +* @param {string} scene +* @returns {number} +*/ +export function scene_from_json(scene) { + const ptr0 = passStringToWasm0(scene, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.scene_from_json(ptr0, len0); + return ret >>> 0; +} + +/** +* @param {number} x +* @param {number} y +* @param {number} z +* @returns {Vec3} +*/ +export function vec3(x, y, z) { + const ret = wasm.vec3(x, y, z); + return Vec3.__wrap(ret); +} + +/** +* @param {TermColorMode} colors +* @returns {ColorConvParams} +*/ +export function color_conv(colors) { + const ret = wasm.color_conv(colors); + return ColorConvParams.__wrap(ret); +} + +function _assertClass(instance, klass) { + if (!(instance instanceof klass)) { + throw new Error(`expected instance of ${klass.name}`); + } + return instance.ptr; +} +/** +* @param {number} scene +* @param {number} obj +* @param {Vec3} pos +* @param {Vec3} rot +* @param {Vec3} scale +*/ +export function set_obj_transform(scene, obj, pos, rot, scale) { + _assertClass(pos, Vec3); + var ptr0 = pos.__destroy_into_raw(); + _assertClass(rot, Vec3); + var ptr1 = rot.__destroy_into_raw(); + _assertClass(scale, Vec3); + var ptr2 = scale.__destroy_into_raw(); + wasm.set_obj_transform(scene, obj, ptr0, ptr1, ptr2); +} + +function isLikeNone(x) { + return x === undefined || x === null; +} +/** +* @param {number} scene +* @param {StandardMaterial} material +* @param {Vec3} size +* @param {string | undefined} [text] +* @returns {number | undefined} +*/ +export function add_cube(scene, material, size, text) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + _assertClass(size, Vec3); + var ptr0 = size.__destroy_into_raw(); + var ptr1 = isLikeNone(text) ? 0 : passStringToWasm0(text, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + wasm.add_cube(retptr, scene, material, ptr0, ptr1, len1); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + return r0 === 0 ? undefined : r1 >>> 0; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {number} scene +* @param {StandardMaterial} material +* @param {Vec3} start +* @param {Vec3} end +* @param {string | undefined} [text] +* @returns {number | undefined} +*/ +export function add_line(scene, material, start, end, text) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + _assertClass(start, Vec3); + var ptr0 = start.__destroy_into_raw(); + _assertClass(end, Vec3); + var ptr1 = end.__destroy_into_raw(); + var ptr2 = isLikeNone(text) ? 0 : passStringToWasm0(text, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len2 = WASM_VECTOR_LEN; + wasm.add_line(retptr, scene, material, ptr0, ptr1, ptr2, len2); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + return r0 === 0 ? undefined : r1 >>> 0; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {number} scene +* @param {number} object +* @param {string | undefined} [text] +*/ +export function set_text(scene, object, text) { + var ptr0 = isLikeNone(text) ? 0 : passStringToWasm0(text, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + wasm.set_text(scene, object, ptr0, len0); +} + +/** +* @param {number} scene +* @param {number} obj +* @param {Vec3} start +* @param {Vec3} end +*/ +export function set_line_points(scene, obj, start, end) { + _assertClass(start, Vec3); + var ptr0 = start.__destroy_into_raw(); + _assertClass(end, Vec3); + var ptr1 = end.__destroy_into_raw(); + wasm.set_line_points(scene, obj, ptr0, ptr1); +} + +let cachedUint32Memory0 = null; + +function getUint32Memory0() { + if (cachedUint32Memory0 === null || cachedUint32Memory0.byteLength === 0) { + cachedUint32Memory0 = new Uint32Array(wasm.memory.buffer); + } + return cachedUint32Memory0; +} + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { return heap[idx]; } + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +function getArrayJsValueFromWasm0(ptr, len) { + ptr = ptr >>> 0; + const mem = getUint32Memory0(); + const slice = mem.subarray(ptr / 4, ptr / 4 + len); + const result = []; + for (let i = 0; i < slice.length; i++) { + result.push(takeObject(slice[i])); + } + return result; +} +/** +* Renders a scene into RgbPixel slice. +* @param {number} scene +* @param {ColorConvParams} color_conv +* @param {number} w +* @param {number} h +* @param {number} elapsed +* @returns {(RgbPixel)[]} +*/ +export function render(scene, color_conv, w, h, elapsed) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + _assertClass(color_conv, ColorConvParams); + wasm.render(retptr, scene, color_conv.__wbg_ptr, w, h, elapsed); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var v1 = getArrayJsValueFromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 4, 4); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } +} + +/** +* @param {number} scene +* @param {number} aspect_ratio +*/ +export function set_camera_aspect(scene, aspect_ratio) { + wasm.set_camera_aspect(scene, aspect_ratio); +} + +/** +* @param {number} scene +* @param {number} w +* @param {number} h +*/ +export function new_frame(scene, w, h) { + wasm.new_frame(scene, w, h); +} + +/** +* @param {number} scene +* @param {boolean} focused +*/ +export function event_focus(scene, focused) { + wasm.event_focus(scene, focused); +} + +/** +* @param {number} scene +* @param {number} x +* @param {number} y +*/ +export function event_mouse_pos(scene, x, y) { + wasm.event_mouse_pos(scene, x, y); +} + +/** +* @param {number} scene +*/ +export function event_mouse_pos_clear(scene) { + wasm.event_mouse_pos_clear(scene); +} + +/** +* @param {number} scene +* @param {boolean} down +* @param {boolean} primary +*/ +export function event_mouse_button_state(scene, down, primary) { + wasm.event_mouse_button_state(scene, down, primary); +} + +/** +* @param {number} scene +* @param {number} x +* @param {number} y +*/ +export function event_scroll(scene, x, y) { + wasm.event_scroll(scene, x, y); +} + +/** +* @param {number} scene +* @param {Vec3} col +*/ +export function set_bg_color(scene, col) { + _assertClass(col, Vec3); + var ptr0 = col.__destroy_into_raw(); + wasm.set_bg_color(scene, ptr0); +} + +/** +* @param {number} scene +* @param {boolean} count_frames +*/ +export function set_dither_count_frames(scene, count_frames) { + wasm.set_dither_count_frames(scene, count_frames); +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} +/** +*/ +export const TermColorMode = Object.freeze({ SingleCol:0,"0":"SingleCol",Col16:1,"1":"Col16",Col256:2,"2":"Col256",Rgb:3,"3":"Rgb", }); +/** +*/ +export const ProjectionMode = Object.freeze({ Perspective:0,"0":"Perspective",Orthographic:1,"1":"Orthographic", }); +/** +*/ +export const StandardMaterial = Object.freeze({ Unlit:0,"0":"Unlit",Diffuse:1,"1":"Diffuse",UiText:2,"2":"UiText", }); +/** +*/ +export class ColorConvParams { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(ColorConvParams.prototype); + obj.__wbg_ptr = ptr; + + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_colorconvparams_free(ptr); + } + /** + * @returns {TermColorMode} + */ + get colors() { + const ret = wasm.__wbg_get_colorconvparams_colors(this.__wbg_ptr); + return ret; + } + /** + * @param {TermColorMode} arg0 + */ + set colors(arg0) { + wasm.__wbg_set_colorconvparams_colors(this.__wbg_ptr, arg0); + } +} +/** +*/ +export class RgbPixel { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(RgbPixel.prototype); + obj.__wbg_ptr = ptr; + + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_rgbpixel_free(ptr); + } + /** + * @returns {number} + */ + get r() { + const ret = wasm.__wbg_get_rgbpixel_r(this.__wbg_ptr); + return ret; + } + /** + * @param {number} arg0 + */ + set r(arg0) { + wasm.__wbg_set_rgbpixel_r(this.__wbg_ptr, arg0); + } + /** + * @returns {number} + */ + get g() { + const ret = wasm.__wbg_get_rgbpixel_g(this.__wbg_ptr); + return ret; + } + /** + * @param {number} arg0 + */ + set g(arg0) { + wasm.__wbg_set_rgbpixel_g(this.__wbg_ptr, arg0); + } + /** + * @returns {number} + */ + get b() { + const ret = wasm.__wbg_get_rgbpixel_b(this.__wbg_ptr); + return ret; + } + /** + * @param {number} arg0 + */ + set b(arg0) { + wasm.__wbg_set_rgbpixel_b(this.__wbg_ptr, arg0); + } + /** + * @returns {number} + */ + get c() { + const ret = wasm.__wbg_get_rgbpixel_c(this.__wbg_ptr); + return ret; + } + /** + * @param {number} arg0 + */ + set c(arg0) { + wasm.__wbg_set_rgbpixel_c(this.__wbg_ptr, arg0); + } +} +/** +*/ +export class Vec3 { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(Vec3.prototype); + obj.__wbg_ptr = ptr; + + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_vec3_free(ptr); + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbg_rgbpixel_new = function(arg0) { + const ret = RgbPixel.__wrap(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + + return imports; +} + +function __wbg_init_memory(imports, maybe_memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedInt32Memory0 = null; + cachedUint32Memory0 = null; + cachedUint8Memory0 = null; + + + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(input) { + if (wasm !== undefined) return wasm; + + if (typeof input === 'undefined') { + input = new URL('asciirend_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { + input = fetch(input); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await input, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync } +export default __wbg_init; diff --git a/src/static/js/asciirend/asciirend_bg.wasm b/src/static/js/asciirend/asciirend_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..e4e5272f94bfdd282cf6b4353b86d630b09c27c4 GIT binary patch literal 193097 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

#o=-c4YGX`!ecTwv^ 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à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 mouseButton(e, true); + dom.onmouseup = (e) => mouseButton(e, false); + dom.onmouseout = (e) => focusExit(); + dom.onmouseover = (e) => focusEnter(); + + dom.addEventListener("touchmove", touchMove); + dom.addEventListener("touchstart", (e) => { + mouseButton(e, true); + focusEnter(); + }); + dom.addEventListener("touchend", (e) => { + mouseButton(e, false); + focusExit(); + prevDist = null; + }); + + function nf() { + set_camera_aspect(scene, (w / 2) / h); + new_frame(scene, w, h); + } + + nf() + + const v = setInterval(function() { + w = fw !== null ? fw : Math.floor(dom.clientWidth / cw); + h = fh !== null ? fh : Math.floor(dom.clientHeight / ch); + + const elapsed = performance.now() - startTime; + performance.mark("asciirend-start-frame"); + + const render_res = render(scene, conv, w, h, elapsed / 1000); + performance.mark("asciirend-rendered-frame"); + + let lines = '

';
+
+    for (let y = 0; y < h; y++) {
+      // Can't really do color, because we'd end up with far too many dom elements.
+      // Instead, just render grayscale.
+      const bytes = render_res.slice(y * w, y * w + w).map(v => v.c);
+      const line = String.fromCharCode(...bytes);
+      lines += line;
+      lines += "
"; + } + performance.mark("asciirend-converted-frame"); + + const elapsed2 = performance.now() - startTime; + + dom.innerHTML = lines + "
"; + + for (let i = 0; i < render_res.length; i++) { + // Make sure you free the pixels, or else you'll find a nasty surprise! + render_res[i].free(); + } + + performance.mark("asciirend-drawn-frame"); + //console.log(elapsed, elapsed2 - elapsed, performance.measure("frame-time", "asciirend-start-frame", "asciirend-converted-frame"), render_res.length); + + nf() + }, 4); +} diff --git a/templates/main.html b/templates/main.html index dc08237..a05858f 100644 --- a/templates/main.html +++ b/templates/main.html @@ -28,7 +28,7 @@
- {{ content | markdown }} + {{ content | markdown(backlink) }}