mirror of
https://codeberg.org/demostf/tf-demos-viewer.git
synced 2026-06-03 10:04:12 +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]]
|
||||
name = "tf-demo-parser"
|
||||
version = "0.4.0"
|
||||
source = "git+https://github.com/demostf/parser#307a6cf9535d1a906b0c1c4e2fb88d48a497d509"
|
||||
source = "git+https://github.com/demostf/parser#cb65c0d3ec07ad67587817e7475db5585e1b245f"
|
||||
dependencies = [
|
||||
"bitbuffer",
|
||||
"enumflags2",
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ wasm-opt = false
|
|||
wasm-bindgen = "0.2.45"
|
||||
wee_alloc = { version = "0.4.2", optional = true }
|
||||
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", path = "../tf-demo-parser" }
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
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");
|
||||
const state = m.parse_demo(bytes);
|
||||
const state = m.parse_demo(bytes, progressCallback);
|
||||
|
||||
let playerCount = state.player_count;
|
||||
let buildingCount = state.building_count;
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ window.addEventListener('DOMContentLoaded', () => {
|
|||
let bytes = new Uint8Array(reader.result as ArrayBuffer);
|
||||
|
||||
console.time('demo_parse');
|
||||
let parsed = await parseDemo(bytes);
|
||||
let parsed = await parseDemo(bytes, () => {});
|
||||
console.timeEnd('demo_parse');
|
||||
console.log(parsed.getPlayer(150, 2));
|
||||
};
|
||||
|
|
|
|||
18
src/lib.rs
18
src/lib.rs
|
|
@ -1,6 +1,7 @@
|
|||
#![macro_use]
|
||||
|
||||
use crate::state::ParsedDemo;
|
||||
use js_sys::Function;
|
||||
use tf_demo_parser::demo::header::Header;
|
||||
use tf_demo_parser::demo::parser::analyser::UserInfo;
|
||||
use tf_demo_parser::demo::parser::gamestateanalyser::{GameStateAnalyser, World};
|
||||
|
|
@ -103,8 +104,9 @@ impl FlatState {
|
|||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub fn parse_demo(buffer: Box<[u8]>) -> Result<FlatState, JsValue> {
|
||||
let (parsed, world) = parse_demo_inner(&buffer).map_err(|e| JsValue::from(e.to_string()))?;
|
||||
pub fn parse_demo(buffer: Box<[u8]>, progress: &Function) -> Result<FlatState, JsValue> {
|
||||
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"))?;
|
||||
|
||||
|
|
@ -166,11 +168,16 @@ pub fn get_player_steam_id(state: &FlatState, player_id: usize) -> String {
|
|||
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 parser = DemoParser::new_with_analyser(demo.get_stream(), GameStateAnalyser::default());
|
||||
let (header, mut ticker) = parser.ticker()?;
|
||||
let total_ticks = header.ticks;
|
||||
let mut last_progress = 0.0;
|
||||
|
||||
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());
|
||||
}
|
||||
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();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue