feat: first working version with parameters

This commit is contained in:
2024-04-15 18:46:34 +02:00
parent e29cb11b81
commit 0254bc1ae5
45 changed files with 389 additions and 351 deletions

View File

@@ -1,18 +1,18 @@
<script lang="ts">
import { T } from "@threlte/core";
import { type OrthographicCamera } from "three";
import { T } from '@threlte/core';
import { type OrthographicCamera } from 'three';
export let camera: OrthographicCamera | undefined = undefined;
export let camera: OrthographicCamera | undefined = undefined;
export let position: [number, number, number] = [0, 0, 4];
export let position: [number, number, number];
</script>
<T.OrthographicCamera
bind:ref={camera}
position.x={0}
position.y={10}
position.z={0}
rotation.x={-Math.PI / 2}
zoom={position[2]}
makeDefault
bind:ref={camera}
position.x={position[0]}
position.y={10}
position.z={position[1]}
rotation.x={-Math.PI / 2}
zoom={position[2]}
makeDefault
/>

View File

@@ -393,7 +393,7 @@ export class GraphManager extends EventEmitter<{ "save": Graph, "result": any }>
const state = this.serialize();
this.history.save(state);
this.emit("save", state);
logger.log("saving graph");
logger.log("saving graphs", state);
}
getParentsOfNode(node: Node) {

View File

@@ -47,10 +47,6 @@
edges: [number, number, number, string][];
} = null;
$: if (cameraPosition && loaded) {
localStorage.setItem('cameraPosition', JSON.stringify(cameraPosition));
}
let width = globalThis?.innerWidth ?? 100;
let height = globalThis?.innerHeight ?? 100;
@@ -61,12 +57,14 @@
cameraPosition[1] - height / cameraPosition[2] / 2,
cameraPosition[1] + height / cameraPosition[2] / 2
];
function setCameraTransform(x: number, y: number, z: number) {
if (!camera) return;
camera.position.x = x;
camera.position.z = y;
camera.zoom = z;
function setCameraTransform(x = cameraPosition[0], y = cameraPosition[1], z = cameraPosition[2]) {
if (camera) {
camera.position.x = x;
camera.position.z = y;
camera.zoom = z;
}
cameraPosition = [x, y, z];
localStorage.setItem('cameraPosition', JSON.stringify(cameraPosition));
}
export let debug = {};
@@ -534,7 +532,7 @@
});
}
if (event.key === 'a' && event.ctrlKey) {
if (event.key === 'a' && event.ctrlKey && bodyIsFocused) {
$selectedNodes = new Set($nodes.keys());
}
@@ -697,7 +695,6 @@
setCameraTransform(cPosition[0], cPosition[1], cPosition[2]);
}
}
loaded = true;
});
</script>

View File

@@ -8,7 +8,7 @@ export async function getNodeWrapper(id: `${string}/${string}/${string}`) {
let wrapperCode = await wrapperReponse.text();
wrapperCode = wrapperCode.replace("wasm = val;", `if(wasm) return;
wasm = val;`);
const wasmWrapper = await import(/*@vite-ignore*/`data:text/javascript;base64,${btoa(wrapperCode)}`);
const wasmWrapper = await import(/*@vite-ignore*/`data:text/javascript;base64,${btoa(wrapperCode)}?id=${id}`);
return wasmWrapper;
}

View File

@@ -1,7 +0,0 @@
mod encoding;
mod helpers;
mod nodes;
mod tree;
pub use encoding::*;
pub use helpers::*;
pub use tree::*;

View File

@@ -34,7 +34,7 @@ export type NodeType = {
meta?: {
title?: string;
},
execute?: (...args: (string | number | boolean)[]) => unknown;
execute?: (args: number[]) => unknown;
}
export type Socket = {

View File

@@ -1,9 +1,13 @@
[package]
name = "plantarium"
name = "utils"
version = "0.1.0"
edition = "2021"
[features]
default = ["console_error_panic_hook"]
[dependencies]
wasm-bindgen = "0.2.92"
serde = { version = "1.0", features = ["derive"] }
serde_json = { version = "1.0", default-features = false, features = ["alloc"] }
console_error_panic_hook = { version = "0.1.7", optional = true }

View File

@@ -1,8 +1,8 @@
{
"name": "@node/registry-client",
"name": "@nodes/utils",
"version": "1.0.0",
"description": "",
"main": "index.ts",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},

18
packages/utils/src/lib.rs Normal file
View File

@@ -0,0 +1,18 @@
mod encoding;
mod helpers;
mod nodes;
mod tree;
pub use encoding::*;
pub use helpers::*;
pub use tree::*;
pub fn set_panic_hook() {
// When the `console_error_panic_hook` feature is enabled, we can call the
// `set_panic_hook` function at least once during initialization, and then
// we will get better error messages if our code ever panics.
//
// For more details see
// https://github.com/rustwasm/console_error_panic_hook#readme
#[cfg(feature = "console_error_panic_hook")]
console_error_panic_hook::set_once();
}

View File

@@ -2,14 +2,14 @@ pub fn get_args(args: &[i32]) -> Vec<&[i32]> {
let mut idx: usize = 0;
let mut depth = -1;
let mut arg_start_index = 2;
let mut next_bracket_index = 0;
let mut last_bracket_index = 0;
let mut out_args: Vec<&[i32]> = Vec::new();
let length = args.len();
let mut arg_start_index = 2;
while idx < length {
let is_bracket = idx == next_bracket_index;
let value = args[idx];
@@ -21,7 +21,6 @@ pub fn get_args(args: &[i32]) -> Vec<&[i32]> {
break;
}
last_bracket_index = next_bracket_index;
next_bracket_index = 1 + idx + args[idx + 1] as usize;
if value == 0 {
@@ -31,30 +30,28 @@ pub fn get_args(args: &[i32]) -> Vec<&[i32]> {
}
if depth == 0 {
if value == 1 {
out_args.push(&args[arg_start_index..idx]);
arg_start_index = idx + 2;
}
// skip over the bracket encoding
idx += 2;
} else {
// skip to the next bracket if we are at depth > 0
idx = next_bracket_index - 1;
idx = next_bracket_index;
}
continue;
}
out_args.push(&args[arg_start_index..=idx]);
arg_start_index = idx + 1;
// this is at the end of args where normally multiple ] are encoded
if depth < 0 {
break;
}
// remove starting bracket from single numbers
if idx - arg_start_index < 3 && last_bracket_index == arg_start_index {
arg_start_index += 2;
}
out_args.push(&args[arg_start_index..=idx]);
idx += 1;
arg_start_index = idx;
}
out_args
@@ -69,7 +66,7 @@ pub fn evaluate_node(input_args: &[i32]) -> (i32, i32) {
}
}
pub fn evaluate_args(input_args: &[i32]) -> (i32, i32) {
pub fn evaluate_args(input_args: &[i32]) -> Vec<i32> {
let args = get_args(input_args);
let mut resolved: Vec<i32> = Vec::new();
@@ -77,20 +74,25 @@ pub fn evaluate_args(input_args: &[i32]) -> (i32, i32) {
for arg in args {
if arg.len() == 1 {
resolved.push(arg[0]);
} else if arg.len() == 4 && arg[0] == 0 && arg[1] == 3 {
resolved.push(arg[2]);
resolved.push(arg[3]);
} else {
let res = evaluate_args(arg);
resolved.push(res.0);
resolved.push(res.1);
resolved.push(res[0]);
resolved.push(res[1]);
}
}
println!("resolved: {:?}", resolved);
if resolved.len() > 1 {
evaluate_node(&resolved)
let res = evaluate_node(&resolved);
vec![res.0, res.1]
} else {
(resolved[0], resolved[1])
resolved
}
}
#[cfg(test)]
mod tests {
@@ -106,13 +108,13 @@ mod tests {
// the numbers are f32 floats encoded as two i32's
let result = evaluate_args(&input);
let decoded = decode_float(result.0, result.1);
let decoded = decode_float(result[0], result[1]);
assert_eq!(decoded, 6.0);
}
#[test]
fn test_example_input_a() {
fn test_get_args_input_a() {
let input_a = vec![0, 4, 1, 2, 3, 0, 7, 1, 2, 4, 2, 4, 1, 1, 1, 1];
// -> [1, 2, 3, [1, 2, 4, 2, 4]]
@@ -126,7 +128,7 @@ mod tests {
}
#[test]
fn test_example_input_b() {
fn test_get_args_input_b() {
let input_b = vec![0, 3, 7, 1, 0, 4, 4, 2, 4, 1, 2, 2, 0, 3, 2, 3, 1, 1, 1, 1];
// -> [1,[4,2,4], 2, [2,3]]
@@ -139,4 +141,29 @@ mod tests {
assert_eq!(args[3], [2]);
assert_eq!(args[4], [0, 3, 2, 3]);
}
#[test]
fn test_get_args_nested_inputs() {
let input = vec![
0, 3, 0, 2, 0, 3, 0, 0, 0, 3, 7549747, 127, 1, 1, 0, 3, 0, 128, 1, 1, 1, 1, 0, 3, 0,
128, 1, 1, 1, 1,
];
// each math node has 4 numbers
// 0 -> type of node (0 -> math node)
// 1 -> op_type for math operation (0 -> add, 1 -> sub, 2 -> mul, 3 -> div)
// 2 -> first number
// 3 -> second number
let args = get_args(&input);
assert_eq!(args.len(), 4);
assert_eq!(args[0], [0]);
assert_eq!(args[1], [2]);
assert_eq!(args[3], [0, 3, 0, 128]);
let nested_args = get_args(args[2]);
assert_eq!(nested_args.len(), 4);
}
}