mirror of
https://codeberg.org/demostf/tf-demos-viewer.git
synced 2026-06-03 18:14:11 +02:00
progress
This commit is contained in:
parent
916ff9d1a5
commit
23c0f49a8c
5 changed files with 20 additions and 7 deletions
2
Cargo.lock
generated
2
Cargo.lock
generated
|
|
@ -562,7 +562,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tf-demo-parser"
|
name = "tf-demo-parser"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
source = "git+https://github.com/demostf/parser#307a6cf9535d1a906b0c1c4e2fb88d48a497d509"
|
source = "git+https://github.com/demostf/parser#cb65c0d3ec07ad67587817e7475db5585e1b245f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bitbuffer",
|
"bitbuffer",
|
||||||
"enumflags2",
|
"enumflags2",
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ wasm-opt = false
|
||||||
wasm-bindgen = "0.2.45"
|
wasm-bindgen = "0.2.45"
|
||||||
wee_alloc = { version = "0.4.2", optional = true }
|
wee_alloc = { version = "0.4.2", optional = true }
|
||||||
web-sys = { version = "0.3.22", features = ["console"] }
|
web-sys = { version = "0.3.22", features = ["console"] }
|
||||||
|
js-sys = "0.3.22"
|
||||||
tf-demo-parser = { version = "0.4", git = "https://github.com/demostf/parser" }
|
tf-demo-parser = { version = "0.4", git = "https://github.com/demostf/parser" }
|
||||||
#tf-demo-parser = { version = "0.4", path = "../tf-demo-parser" }
|
#tf-demo-parser = { version = "0.4", path = "../tf-demo-parser" }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
import {FlatState, XY} from '../pkg/index';
|
import {FlatState, XY} from '../pkg/index';
|
||||||
|
|
||||||
export async function parseDemo(bytes: Uint8Array): Promise<ParsedDemo> {
|
export async function parseDemo(bytes: Uint8Array, progressCallback : (progress: number) => void): Promise<ParsedDemo> {
|
||||||
let m = await import("../pkg/index.js");
|
let m = await import("../pkg/index.js");
|
||||||
const state = m.parse_demo(bytes);
|
const state = m.parse_demo(bytes, progressCallback);
|
||||||
|
|
||||||
let playerCount = state.player_count;
|
let playerCount = state.player_count;
|
||||||
let buildingCount = state.building_count;
|
let buildingCount = state.building_count;
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ window.addEventListener('DOMContentLoaded', () => {
|
||||||
let bytes = new Uint8Array(reader.result as ArrayBuffer);
|
let bytes = new Uint8Array(reader.result as ArrayBuffer);
|
||||||
|
|
||||||
console.time('demo_parse');
|
console.time('demo_parse');
|
||||||
let parsed = await parseDemo(bytes);
|
let parsed = await parseDemo(bytes, () => {});
|
||||||
console.timeEnd('demo_parse');
|
console.timeEnd('demo_parse');
|
||||||
console.log(parsed.getPlayer(150, 2));
|
console.log(parsed.getPlayer(150, 2));
|
||||||
};
|
};
|
||||||
|
|
|
||||||
18
src/lib.rs
18
src/lib.rs
|
|
@ -1,6 +1,7 @@
|
||||||
#![macro_use]
|
#![macro_use]
|
||||||
|
|
||||||
use crate::state::ParsedDemo;
|
use crate::state::ParsedDemo;
|
||||||
|
use js_sys::Function;
|
||||||
use tf_demo_parser::demo::header::Header;
|
use tf_demo_parser::demo::header::Header;
|
||||||
use tf_demo_parser::demo::parser::analyser::UserInfo;
|
use tf_demo_parser::demo::parser::analyser::UserInfo;
|
||||||
use tf_demo_parser::demo::parser::gamestateanalyser::{GameStateAnalyser, World};
|
use tf_demo_parser::demo::parser::gamestateanalyser::{GameStateAnalyser, World};
|
||||||
|
|
@ -103,8 +104,9 @@ impl FlatState {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
pub fn parse_demo(buffer: Box<[u8]>) -> Result<FlatState, JsValue> {
|
pub fn parse_demo(buffer: Box<[u8]>, progress: &Function) -> Result<FlatState, JsValue> {
|
||||||
let (parsed, world) = parse_demo_inner(&buffer).map_err(|e| JsValue::from(e.to_string()))?;
|
let (parsed, world) =
|
||||||
|
parse_demo_inner(&buffer, progress).map_err(|e| JsValue::from(e.to_string()))?;
|
||||||
|
|
||||||
let world = world.ok_or_else(|| JsValue::from_str("No world defined in demo"))?;
|
let world = world.ok_or_else(|| JsValue::from_str("No world defined in demo"))?;
|
||||||
|
|
||||||
|
|
@ -166,11 +168,16 @@ pub fn get_player_steam_id(state: &FlatState, player_id: usize) -> String {
|
||||||
state.player_info[player_id].steam_id.clone()
|
state.player_info[player_id].steam_id.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_demo_inner(buffer: &[u8]) -> Result<(ParsedDemo, Option<World>), ParseError> {
|
pub fn parse_demo_inner(
|
||||||
|
buffer: &[u8],
|
||||||
|
progress: &Function,
|
||||||
|
) -> Result<(ParsedDemo, Option<World>), ParseError> {
|
||||||
let demo = Demo::new(buffer);
|
let demo = Demo::new(buffer);
|
||||||
|
|
||||||
let parser = DemoParser::new_with_analyser(demo.get_stream(), GameStateAnalyser::default());
|
let parser = DemoParser::new_with_analyser(demo.get_stream(), GameStateAnalyser::default());
|
||||||
let (header, mut ticker) = parser.ticker()?;
|
let (header, mut ticker) = parser.ticker()?;
|
||||||
|
let total_ticks = header.ticks;
|
||||||
|
let mut last_progress = 0.0;
|
||||||
|
|
||||||
let mut parsed_demo = ParsedDemo::new(header);
|
let mut parsed_demo = ParsedDemo::new(header);
|
||||||
|
|
||||||
|
|
@ -181,6 +188,11 @@ pub fn parse_demo_inner(buffer: &[u8]) -> Result<(ParsedDemo, Option<World>), Pa
|
||||||
parsed_demo.push_state(ticker.state());
|
parsed_demo.push_state(ticker.state());
|
||||||
}
|
}
|
||||||
skip = !skip;
|
skip = !skip;
|
||||||
|
let new_progress = ((ticker.state().tick as f32 / total_ticks as f32) * 100.0).floor();
|
||||||
|
if new_progress > last_progress {
|
||||||
|
last_progress = new_progress;
|
||||||
|
let _ = progress.call1(&JsValue::null(), &last_progress.into());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let state = ticker.into_state();
|
let state = ticker.into_state();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue