diff --git a/client/client_recv.js b/client/client_recv.js
index 6b6bf68..d74ae9d 100644
--- a/client/client_recv.js
+++ b/client/client_recv.js
@@ -434,7 +434,7 @@ async function handle_message(state, context, d) {
const user_count = des_u32(d);
const total_points = des_u32(d);
- wasm_ensure_by(state, event_count, round_to_pow2(total_points * 2));
+ wasm_ensure_by(state, event_count, round_to_pow2(total_points * 2, 4096));
if (config.debug_print) console.debug(`${event_count} events in init`);
diff --git a/client/index.html b/client/index.html
index e9268ec..2bbdaf0 100644
--- a/client/index.html
+++ b/client/index.html
@@ -39,7 +39,6 @@
-
diff --git a/client/index.js b/client/index.js
index eee568c..0f484b4 100644
--- a/client/index.js
+++ b/client/index.js
@@ -25,8 +25,8 @@ const config = {
stroke_texture_size: 1024, // means no more than 1024^2 = 1M strokes in total (this is a LOT. HMH blackboard has like 80K)
dynamic_stroke_texture_size: 128, // means no more than 128^2 = 16K dynamic strokes at once
benchmark: {
- zoom: 0.03,
- offset: { x: 720, y: 400 },
+ zoom: 0.00001,
+ offset: { x: 425, y: -1195 },
frames: 500,
},
};
@@ -205,7 +205,6 @@ async function main() {
'debug': {
'red': false,
'do_prepass': true,
- 'use_wasm': true,
'limit_from': false,
'limit_to': false,
'render_from': 0,
diff --git a/client/speed.js b/client/speed.js
index 97ab900..f4459a8 100644
--- a/client/speed.js
+++ b/client/speed.js
@@ -99,7 +99,7 @@ function wasm_ensure_by(state, nstrokes, ncoords) {
}
}
-function do_lod_wasm(state, context) {
+function do_lod(state, context) {
state.wasm.exports.free_dynamic();
const clipped_indices = state.wasm.exports.alloc_dynamic(context.clipped_indices.size * 4);
@@ -140,88 +140,3 @@ function do_lod_wasm(state, context) {
return segment_count;
}
-
-function do_lod(state, context) {
- if (state.debug.use_wasm) {
- return do_lod_wasm(state, context);
- }
-
- const zoom = state.canvas.zoom;
- const segments_data = state.segments.data;
-
- let segments_head = 0;
-
- for (let i = 0; i < context.clipped_indices.size; ++i) {
- const stroke_index = context.clipped_indices.data[i];
- const stroke = state.events[stroke_index];
- const point_count = (stroke.coords_to - stroke.coords_from) / 2;
- const coords_from = stroke.coords_from;
-
- if (point_count > state.rdp_traverse_stack.length) {
- //console.size('allocate')
- state.rdp_traverse_stack = new Uint32Array(round_to_pow2(point_count, 4096));
- }
-
- const stack = state.rdp_traverse_stack;
-
- // Basic CSR crap
- state.segments_from.data[i] = segments_head;
-
- if (state.canvas.zoom <= state.line_threshold.data[stroke_index]) {
- segments_data[segments_head++] = 0;
- segments_data[segments_head++] = point_count - 1;
- } else {
- let segment_count = 2;
-
- segments_data[segments_head++] = 0;
-
- let head = 0;
- // Using stack.push() allocates even if the stack is pre-allocated!
-
- stack[head++] = 0;
- stack[head++] = 0;
- stack[head++] = point_count - 1;
-
- while (head > 0) {
- const end = stack[--head];
- const value = start = stack[--head];
- const type = stack[--head];
-
- if (type === 1) {
- segments_data[segments_head++] = value;
- } else {
- const max = rdp_find_max(state, zoom, coords_from, start, end);
- if (max !== -1) {
- segment_count += 1;
-
- stack[head++] = 0;
- stack[head++] = max;
- stack[head++] = end;
-
- stack[head++] = 1;
- stack[head++] = max;
- stack[head++] = -1;
-
- stack[head++] = 0;
- stack[head++] = start;
- stack[head++] = max;
- }
- }
- }
-
- segments_data[segments_head++] = point_count - 1;
-
- if (segment_count === 2 && state.canvas.zoom > state.line_threshold.data[stroke_index]) {
- state.line_threshold.data[stroke_index] = state.canvas.zoom;
- }
- }
- }
-
- state.segments_from.data[context.clipped_indices.size] = segments_head;
- state.segments_from.size = context.clipped_indices.size + 1;
- state.segments.size = segments_head;
-
- write_coordinates(state, context);
-
- return segments_head;
-}
diff --git a/client/wasm/lod.c b/client/wasm/lod.c
index 233359f..19a13e3 100644
--- a/client/wasm/lod.c
+++ b/client/wasm/lod.c
@@ -1,3 +1,5 @@
+#include
+
extern char __heap_base;
static int allocated_static;
@@ -35,8 +37,10 @@ static int
rdp_find_max(float *coordinates, unsigned char *pressures, float zoom, int coords_from,
int segment_start, int segment_end)
{
- float EPS = 1.0 / zoom;
+ float EPS = 0.125 / zoom;
+// __i32x4 a = wasm_i32x4_load16x4(coordinates);
+
int result = -1;
float max_dist = 0.0f;
@@ -64,8 +68,8 @@ rdp_find_max(float *coordinates, unsigned char *pressures, float zoom, int coord
float apx = px - ax;
float apy = py - ay;
- float dist = __builtin_fabsf(apx * dir_nx + apy * dir_ny);
- //+ __builtin_abs(pp - ap) / 255.0f + __builtin_abs(pp - bp) / 255.0f;
+ float dist = __builtin_fabsf(apx * dir_nx + apy * dir_ny)
+ + __builtin_abs(pp - ap) / 255.0f + __builtin_abs(pp - bp) / 255.0f;
if (dist > EPS && dist > max_dist) {
result = i;
diff --git a/client/wasm/lod.wasm b/client/wasm/lod.wasm
index 324b0df..64b42bf 100755
Binary files a/client/wasm/lod.wasm and b/client/wasm/lod.wasm differ
diff --git a/client/webgl_listeners.js b/client/webgl_listeners.js
index a2309c1..6848d4d 100644
--- a/client/webgl_listeners.js
+++ b/client/webgl_listeners.js
@@ -26,7 +26,6 @@ function debug_panel_init(state, context) {
document.getElementById('debug-do-prepass').checked = state.debug.do_prepass;
document.getElementById('debug-limit-from').checked = state.debug.limit_from;
document.getElementById('debug-limit-to').checked = state.debug.limit_to;
- document.getElementById('debug-use-wasm').checked = state.debug.use_wasm;
document.getElementById('debug-red').addEventListener('change', (e) => {
state.debug.red = e.target.checked;
@@ -38,11 +37,6 @@ function debug_panel_init(state, context) {
schedule_draw(state, context);
});
- document.getElementById('debug-use-wasm').addEventListener('change', (e) => {
- state.debug.use_wasm = e.target.checked;
- schedule_draw(state, context);
- });
-
document.getElementById('debug-limit-from').addEventListener('change', (e) => {
state.debug.limit_from = e.target.checked;
schedule_draw(state, context);
diff --git a/server/milton.js b/server/milton.js
index fc24fe1..e437ee1 100644
--- a/server/milton.js
+++ b/server/milton.js
@@ -9,22 +9,27 @@ let first_point_y = null;
function parse_and_insert_stroke(desk_id, line) {
const words = line.split(' ');
const width = parseInt(words.shift());
- const points = new Float32Array(words.map(i => parseFloat(i)));
+ const data = new Float32Array(words.map(i => parseFloat(i)));
+
+ const points = new Float32Array(data.length / 3 * 2);
+ const pressures = new Uint8Array(data.length / 3);
if (first_point_x === null) {
first_point_x = points[0];
first_point_y = points[1];
}
- for (let i = 0; i < points.length; i += 2) {
- points[i + 0] -= first_point_x;
- points[i + 1] -= first_point_y;
+ for (let i = 0; i < data.length; i += 3) {
+ points[i / 3 * 2 + 0] = data[i + 0];
+ points[i / 3 * 2 + 1] = data[i + 1];
+ pressures[i / 3 + 0] = Math.floor(data[i + 2] * 255);
}
const stroke_res = storage.queries.insert_stroke.get({
'$width': width,
'$color': 0,
- '$points': points
+ '$points': points,
+ '$pressures': pressures,
});
storage.queries.insert_event.run({
@@ -62,4 +67,4 @@ async function import_milton_file_to_sqlite(fullpath) {
console.log(`Finished importing desk ${desk_id}`);
}
-import_milton_file_to_sqlite("/code/desk2/server/points.txt");
+import_milton_file_to_sqlite("/home/aolo2/Documents/bin/milton/build/points_pressure.txt");