|
|
|
@ -19,6 +19,10 @@ async function init_wasm(state) {
@@ -19,6 +19,10 @@ async function init_wasm(state) {
|
|
|
|
|
'offset': state.wasm.exports.alloc_static(state.wasm.stroke_bytes), |
|
|
|
|
'used': 0, |
|
|
|
|
}, |
|
|
|
|
'pressures': { |
|
|
|
|
'offset': state.wasm.exports.alloc_static(state.wasm.coords_bytes / 8), |
|
|
|
|
'used': 0 |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const mem = state.wasm.exports.memory.buffer; |
|
|
|
@ -29,7 +33,8 @@ async function init_wasm(state) {
@@ -29,7 +33,8 @@ async function init_wasm(state) {
|
|
|
|
|
mem, state.wasm.buffers['coords_from'].offset); |
|
|
|
|
state.wasm.buffers['line_threshold'].tv = tv_create_on(Float32Array, state.wasm.stroke_bytes / 4, |
|
|
|
|
mem, state.wasm.buffers['line_threshold'].offset); |
|
|
|
|
|
|
|
|
|
state.wasm.buffers['pressures'].tv = tv_create_on(Uint8Array, state.wasm.coords_bytes / 8, |
|
|
|
|
mem, state.wasm.buffers['pressures'].offset); |
|
|
|
|
|
|
|
|
|
tv_add(state.wasm.buffers['coords_from'].tv, 0); |
|
|
|
|
state.wasm.buffers['coords_from'].used = 4; |
|
|
|
@ -40,6 +45,7 @@ function wasm_ensure_by(state, nstrokes, ncoords) {
@@ -40,6 +45,7 @@ function wasm_ensure_by(state, nstrokes, ncoords) {
|
|
|
|
|
|
|
|
|
|
const old_coords_from_offset = buffers['coords_from'].offset; |
|
|
|
|
const old_line_threshold_offset = buffers['line_threshold'].offset; |
|
|
|
|
const old_pressures_offset = buffers['pressures'].offset; |
|
|
|
|
|
|
|
|
|
const old_size_coords = state.wasm.coords_bytes; |
|
|
|
|
const old_size_strokes = state.wasm.stroke_bytes; |
|
|
|
@ -67,23 +73,29 @@ function wasm_ensure_by(state, nstrokes, ncoords) {
@@ -67,23 +73,29 @@ function wasm_ensure_by(state, nstrokes, ncoords) {
|
|
|
|
|
buffers['coordinates'].offset = state.wasm.exports.alloc_static(state.wasm.coords_bytes); |
|
|
|
|
buffers['coords_from'].offset = state.wasm.exports.alloc_static(state.wasm.stroke_bytes); |
|
|
|
|
buffers['line_threshold'].offset = state.wasm.exports.alloc_static(state.wasm.stroke_bytes); |
|
|
|
|
buffers['pressures'].offset = state.wasm.exports.alloc_static(state.wasm.coords_bytes / 8); |
|
|
|
|
|
|
|
|
|
buffers['coordinates'].tv = tv_create_on(Float32Array, state.wasm.coords_bytes / 4, mem, buffers['coordinates'].offset); |
|
|
|
|
buffers['coords_from'].tv = tv_create_on(Uint32Array, state.wasm.stroke_bytes / 4, mem, buffers['coords_from'].offset); |
|
|
|
|
buffers['line_threshold'].tv = tv_create_on(Float32Array, state.wasm.stroke_bytes / 4, mem, buffers['line_threshold'].offset); |
|
|
|
|
buffers['pressures'].tv = tv_create_on(Uint8Array, state.wasm.coords_bytes / 8, mem, buffers['pressures'].offset); |
|
|
|
|
|
|
|
|
|
buffers['coordinates'].tv.size = buffers['coordinates'].used / 4; |
|
|
|
|
buffers['coords_from'].tv.size = buffers['coords_from'].used / 4; |
|
|
|
|
buffers['line_threshold'].tv.size = buffers['line_threshold'].used / 4; |
|
|
|
|
buffers['pressures'].tv.size = buffers['pressures'].used; |
|
|
|
|
|
|
|
|
|
const tmp = new Uint8Array(Math.max(state.wasm.coords_bytes / 8, state.wasm.stroke_bytes)); // TODO: needed?
|
|
|
|
|
|
|
|
|
|
const tmp = new Uint8Array(state.wasm.stroke_bytes); // TODO: needed?
|
|
|
|
|
// Copy from back to front (otherwise we will overwrite)
|
|
|
|
|
tmp.set(new Uint8Array(mem, old_pressures_offset, buffers['pressures'].used)); |
|
|
|
|
memv.set(new Uint8Array(tmp.buffer, 0, buffers['pressures'].used), buffers['pressures'].offset); |
|
|
|
|
|
|
|
|
|
// First we move the line_threshold, only then coords_from (otherwise we will overwrite)
|
|
|
|
|
tmp.set(new Uint8Array(mem, old_line_threshold_offset, old_size_strokes)); |
|
|
|
|
memv.set(tmp, buffers['coordinates'].offset + state.wasm.coords_bytes + state.wasm.stroke_bytes); |
|
|
|
|
memv.set(new Uint8Array(tmp.buffer, 0, old_size_strokes), buffers['line_threshold'].offset); |
|
|
|
|
|
|
|
|
|
tmp.set(new Uint8Array(mem, old_coords_from_offset, old_size_strokes)); |
|
|
|
|
memv.set(tmp, buffers['coordinates'].offset + state.wasm.coords_bytes); |
|
|
|
|
memv.set(new Uint8Array(tmp.buffer, 0, old_size_strokes), buffers['coords_from'].offset); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -102,6 +114,7 @@ function do_lod_wasm(state, context) {
@@ -102,6 +114,7 @@ function do_lod_wasm(state, context) {
|
|
|
|
|
buffers['coords_from'].offset, |
|
|
|
|
buffers['line_threshold'].offset, |
|
|
|
|
buffers['coordinates'].offset, |
|
|
|
|
buffers['pressures'].offset, |
|
|
|
|
buffers['coordinates'].used / 4, |
|
|
|
|
); |
|
|
|
|
|
|
|
|
@ -113,13 +126,18 @@ function do_lod_wasm(state, context) {
@@ -113,13 +126,18 @@ function do_lod_wasm(state, context) {
|
|
|
|
|
result_offset, segment_count * 2); |
|
|
|
|
const wasm_ids = new Uint32Array(state.wasm.exports.memory.buffer, |
|
|
|
|
result_offset + segment_count * 2 * 4, segment_count); |
|
|
|
|
|
|
|
|
|
const wasm_pressures = new Uint8Array(state.wasm.exports.memory.buffer, |
|
|
|
|
result_offset + segment_count * 2 * 4 + segment_count * 4, segment_count); |
|
|
|
|
|
|
|
|
|
context.instance_data_points.data = wasm_points; |
|
|
|
|
context.instance_data_points.size = segment_count * 2; |
|
|
|
|
|
|
|
|
|
context.instance_data_ids.data = wasm_ids; |
|
|
|
|
context.instance_data_ids.size = segment_count; |
|
|
|
|
|
|
|
|
|
context.instance_data_pressures.data = wasm_pressures; |
|
|
|
|
context.instance_data_pressures.size = segment_count; |
|
|
|
|
|
|
|
|
|
return segment_count; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|