Spaces:
Running
Running
Commit History
-
Match page: cap timeline to round's official end-tick Running
Some POVs ship trailing post-round spectator footage — e.g. round 14 of match 2392266 has player 2 at 96s while every other POV is 61.15s and the round officially ends at freeze_end+61.15s. The timeline was using max(playerDurations), so the slider stretched to 96s and everyone sat through 35s of dead air after the round ended. Now we take min(longestPlayerDuration, (round_end - freeze_end)/64), defaulting to the longest-player value when round meta is missing.8053cd4 -
Player grid: gate skull on availability, not on round-final survival
The skull icon was shown whenever the POV's chunks-preview row had survived_chunk=false — i.e. for any player who died at any point in the round. But that summary doesn't move with playback time, so at the start of a round non-survivors got a skull while still being alive on video and with their button still enabled. Now the skull only fires once the player has actually died by the current virtualTime (mirroring grid-tile which already did this). Survivors still get the shield.9d3dfa1 -
Trust ticks.parquet `t` and `event_seconds`
Upstream fixed the time bases: ticks `t` is monotonic video time and `event_seconds` is already on the POV video timeline. So: - world.ts uses `r.t` directly; drop the tick-derived recompute and the TICK_RATE constant. - map-results.ts drops the ×2 multiplier for `event_seconds`. - Recipes drop `event_seconds * 2.0` and the pov_rounds join that was only there for path lookups we don't need.1632a07
-
Home: POV tab + DuckDB advanced filter
- New POV tab listing one row per (round, player). SQL filter results drop into the same table so the user goes from query to clip. - DuckDB-wasm singleton, hf:// → https URL rewrite, 1000-row cap. - CodeMirror SQL editor with light/dark theme via a Compartment; Cmd/Ctrl+Enter runs the query. - Six preset recipes adapted from the dataset card (AWP 1v1, smoke kill, noscope/wallbang, knife, 5-kill burst, long-distance). - Kill/duel-derived seek times land 2.5s before the event so the lead-up is visible; tick `t` and explicit start_t stay exact. - Match page reads ?t= on first land (one-shot, stripped on internal nav) so deep links from the filter open at the right moment.5a67aa1 -
Minimap: time frames from tick column (t column is non-monotonic across pauses)
16c253d -
Video: drive virtualTime emission off rAF for smooth minimap
dd360a4 -
Minimap: fix ticks.parquet column names (x/y/z/yaw/armor_value/team_num)
6c84e50 -
Minimap: read ticks.parquet instead of world.preview.jsonl
437403c -
Home: drop /target counters; thank Hugging Face and RunPod
27b5692 -
Point viewer at opencs2_dataset layout
Verified signature10d4db6
-
Home: thank the SentientX team in an Acknowledgments section
3fa4fdc -
Hub API: read compacted web-index parquets
Home page: 454 reqs (1 tree + 226 manifest + 227 rounds shards) → 2 reqs (index/web/maps.parquet + index/web/rounds.parquet). Match page: 10 per-player chunks-preview shards → 1 per-(match,map) chunks-preview.parquet. Drops the now-unused listTree helper and PLAYER_COUNT constant.3f5bd49 -
Eval: 2-round policy + sync-start gate + no auto-advance
- Sample 2 rounds per (match, map) instead of 4: one endpoint (round 1 or last, picked deterministically) plus one PRNG-chosen middle round. - Eval mode no longer auto-advances when the round ends — reviewers drive navigation explicitly via the eval bar's Prev/Next. - New sync-start gate in eval mode: the round starts paused and only auto-plays once every POV tile has emitted `loadeddata` (first frame decoded), so the comparison view never starts mid-buffer with some panes blank. A small "Loading N / 10 POVs…" indicator overlays the grid while we wait; touching play or leaving eval mode releases the gate immediately. preloadAllPlayers is force-on in eval mode so the HTTP-level prefetch runs alongside the MSE attach.7f23fd2
-
Match table: add Uploaded column, sort by it by default
Surface the per-row uploaded_at timestamp so freshly ingested matches float to the top by default. The match-row roll-up takes the latest upload across the series' maps; rounds use their own per-round uploaded_at; the legacy Date (match_date) column stays so users can still browse by when matches were originally played.e66c992
-
Video player: cycle-through playback speed control (0.5/1/1.5/2)
Adds a single button next to mute that cycles through the four rates; state lifted to the match page so it persists across rounds, player swaps, and single/grid mode toggles. The browser resets playbackRate to 1 on each MSE source swap, so both video-player and grid-tile re-apply it on chunk change.ec62d48
-
lint: sort tailwind classes
4c73fd1 -
Add one-line explainer of match/maps/rounds/chunks above the table
0df0832 -
Match table: prepend match_id column, truncate event; add stats section
- New MatchIdCell + matchIdColumn helper, prepended to all 3 column sets (rounds / maps / matches). Match id rendered as monospace tabular-nums. - eventColumn helper with meta.cellClass = max-w-[16rem] so long event names truncate; EventCell wrapper also gets max-w-[16rem]. - match-table.svelte: thread column meta.cellClass / meta.headClass through Table.Cell + Table.Head so per-column widths actually apply. - New StatsSection between the table and BibTeX: * Maps distribution: horizontal bars per CS2 map (count + share %), colored using mapColorClasses for visual tie-in with badges. * Rounds-per-map histogram: 4-round buckets. Restructure layout — bars are direct children of h-32 flex items-end so % heights resolve against a definite parent height; labels render in a separate row below to avoid collapsing to zero in flex-col wrappers.0f00bbc -
Fix eval-flag-dialog infinite effect loop on open
The `storeBump++` inside the effect read + wrote the same state, making it a tracked dependency that re-fired the effect — exceeding Svelte's update depth and freezing the page so the dialog Close button couldn't fire. Wrap the body in untrack() so only `open` is observed.8e5c0f0 -
Evaluation: 4-round policy, validations store, prev/next, copy/clear, build flag
- Bump policy from 3 → 4 rounds per (match, map): first, last, 2 PRNG-picked middle rounds (deterministic on match_id+map). Fully reviewing all 4 without flagging implies the (match, map) is good. - New localStorage store opencs2:eval:validations:v1: clicking Next validates the current candidate. firstUnreviewed/nextUnreviewed skip already-flagged or already-validated candidates so a returning reviewer resumes where they left off (header eval entry jumps to first unreviewed). - Eval bar adds Previous (←) for backtracking and a "N reviewed" counter. - Flag dialog gets a "Local review data" footer with live flag/validation counts, a Copy button (full JSON to clipboard via exportReviews), and a Trash button to clear both stores. Note field already free-text. - New "Don't flag" entry: "Recording ends right at death" — POVs cut on the exact death tick (intentional, to avoid camera glitches). - Build flag PUBLIC_DISABLE_EVAL=1 hides the entire eval surface (header toggle, e…6d55c38 -
Add evaluation mode: queue, flag bar, info dialog
- src/lib/eval.ts: deterministic eval queue (per match-map: round 1, last, + 1 PRNG-picked middle), flag reasons, localStorage flag store - src/lib/components/eval-bar.svelte: amber strip below the header with position N/total, Flag dropdown (6 reasons w/ descriptions), Info button, Next, Exit - src/lib/components/eval-info-dialog.svelte: explains the policy and what to flag (missing audio, AV misalignment, POV desync, uninteresting, missing video, other) - header.svelte: ListChecks toggle button — start eval (jump to candidate 0) or exit; reads matches from page.data so any match page can launch eval - match page: render <EvalBar /> when ?eval=1; route effect now also reacts to URL round/player/view changes (so eval Next on the same map reloads the new round); ?eval=1&i=N stays preserved by syncUrl()'s URL clone Flags persist in localStorage (opencs2:eval:flags:v1) — export manually for now, no backend round-tripping yet.e355be5 -
Add multi-view SfM benchmark to motivation cards (home + README)
Ground-truth camera intrinsics and metric depth across 10 synced viewpoints make the dataset a clean reference for SfM/MVS/pose estimation. Switch the motivation grid from 5x1 to 3x2 to fit 6 cards.637582a -
Redirect /match/<id> to the first map of that series
Adds src/routes/match/[matchId]/+page.{ts,svelte}: load() looks up the match in listMatches, picks the lowest map_index, and 307-redirects to /match/<id>/<first_map>?round=1&player=0&view=grid (matching the home page link helpers). 404 if the matchId doesn't exist.83fef08 -
Don't let dead players cap the grid-mode buffer indicator
Strict-intersecting all 10 tiles' buffered ranges meant a player who died at t=30 capped the unified bar at 30 even when every other tile was buffered to the round end. Pad each player's buffer with [dur, roundEnd] before intersecting — there's no stream there for them to buffer, so they should drop out as a constraint past their own death.0ce2f31
-
Drop HRTF claim from audio description (it's stereo, not HRTF)
Audio is per-player stereo mixed from each agent's position and orientation, not true HRTF — adjust README + home page accordingly.6b77a69 -
Fix navigation state bugs (round/player URL, map switch, table state on back)
Bug 1: Map dropdown changed the URL but kept the previous map's video, player positions, etc. Same component instance was reused across `[mapName]` route changes, so $state and onMount didn't re-fire. Replace onMount with an $effect that watches a routeKey derived from data.match.{match_id,map_name}; when it changes, re-read URL params and reset round/player/view + reload previews. Bug 2: Home links omitted defaults so the destination URL wasn't self-contained. matchUrl() now always emits ?round=&player=&view= so reloads, shares, and back-nav stay deterministic. Bug 3: Tab choice + search/sort/pagination/filter were all internal MatchTable state and got lost on back-nav. Lift the state to the home page (one slot per tab) via $bindable props on MatchTable, and use SvelteKit's snapshot API (capture/restore) on +page to persist {view, tables} across history navigation.c92e42a -
Drop 🎯 emoji from match-page header link
79f37ad -
Match Browser + footer width with the rest of the page (max-w-5xl)
c5a06ba -
Add OpenCS2 favicon set (32/192/512 PNG, transparent corners)
- Process favicon.png: corner-floodfill the pure-black bg to alpha (interior dark navy preserved), trim, render at 32/192/512 with Lanczos, oxipng -o max - Total assets: 1.7K + 25K + 179K (vs 1MB original) - Layout head: rel=icon for 32/192/512 + apple-touch-icon at 192 - Drop the old emoji-based favicon.svg (and src/lib/assets/)aaa744c -
Add OpenCS2 banner header below abstract + social preview images
- static/header.{webp,avif}: tracked via Git LFS for HF Space (avif 140KB, webp 184KB; from 2MB PNG) - Home page: keep eyebrow + h1 + author + buttons + abstract intact; banner image rendered just after the abstract via <picture> - Layout: og:image + twitter:image absolute URLs with width/height/alt - .gitattributes: add *.webp and *.avif to LFS rulesb8e6237 -
Update URLs after rename: HF Space + GitHub repo → opencs2
- spaceUrl: counter-strike-2-dataset-viewer → opencs2-dataset-viewer - githubUrl: counter-strike-2-dataset → opencs2-dataset - BibTeX url updated in README and home page - Drop static/robots.txt (unused) Dataset URL (cs2_dataset_render) stays unchanged.c470fa4 -
Rename project: Counter Strike 2 Dataset → OpenCS2 Dataset
Display-name only; URLs (HF Space, GitHub repo, dataset id) stay the same. References to the GAME ('Counter Strike 2', 'CS2') are unchanged. BibTeX key updated to blanchon2026opencs2.f2a1626 -
Apply Tailwind v4 shorthand fixes; narrow eslint disables to real FPs
Auto-fixes from eslint-plugin-better-tailwindcss (enforce-canonical-classes re-enabled — these are real Tailwind v4 shorthands, not stylistic preferences): - h-full w-full → size-full - h-5 w-5 → size-5 - px-2 py-2 → p-2 - text-{sm,xs} leading-relaxed → text-{sm,xs}/relaxed - -translate-x-1/2 -translate-y-1/2 → -translate-1/2 - data-[disabled]:foo → data-disabled:foo - break-words → wrap-break-word Only no-unknown-classes stays disabled — it can't see classes defined in Svelte <style> blocks (.vs-beam, .vp-freeze, ...).0a96402 -
Add eslint with eslint-plugin-better-tailwindcss
- Replace prettier-plugin-tailwindcss with eslint-plugin-better-tailwindcss (the two disagreed on ordering — keep one source of truth for class order) - ESLint flat config with svelte-eslint-parser + @typescript-eslint/parser, scoped to non-shadcn source. Tailwind v4 entrypoint = src/routes/layout.css - Disable no-unknown-classes (custom Svelte <style> classes like vs-beam) and enforce-canonical-classes (h-full w-full ≠ size-full when parent is asymmetric) - Auto-fix sorts every Tailwind class list and removes a few duplicates - New scripts: bun run lint (prettier + eslint check), bun run lint:fix8899818 -
Add 'What's recorded' section: video specs, inputs, world state, g-buffers
- Home page: 4-card panel describing video (1280x720 @ 32fps near-lossless), inputs, per-tick world state, and the upcoming g-buffers - README: matching bullet list with full schema details6ecbce1 -
Nerfies-style home, paper-style match header, prettier setup, dataset README
- Redesign home page: centered title, author + links, abstract, motivation cards, BibTeX - Slim down match-page header to a minimal back-link + theme toggle - Replace ternary class injections with data-attributes (score, match-info, view mode) - Drop unused shadcn surface (accordion, alert-dialog, breadcrumb, ...) and pnpm artifacts - Expand README with usage, schema, dev/build, viewer internals, BibTeX - Improve <svelte:head> meta tags and robots.txt - Add Prettier with svelte + tailwindcss plugins; format the entire codebase95e3d2a -
Add hyparquet-compressors so ZSTD parquets actually parse
The dataset's parquets are ZSTD-compressed and hyparquet's core only ships support for the trivially-decodable codecs. Pulled in `hyparquet-compressors` (brotli/snappy/lz4/zstd/...) and pass its `compressors` map into `parquetReadObjects`. Adds ~100KB gzip — still vastly under the 6.3MB parquet-wasm blob it replaced.fe2e832 -
Replace parquet-wasm + apache-arrow with hyparquet
The dataset's index parquets are tiny (~1–2 KB each) yet we were forcing every cold visitor to download a 6.3 MB WASM blob plus an Apache Arrow runtime to parse them. Swapped to hyparquet (pure-JS, ~30 KB, no init step) and stripped both heavy deps. parquet.ts now wraps the fetched ArrayBuffer as a synchronous AsyncBuffer; date columns surface as Date from hyparquet so we just normalize them to ISO strings here. First-paint payload before/after: - parquet_wasm_bg.wasm: 6,300 KB -> 0 (file no longer emitted) - apache-arrow chunk: ~140 KB -> 0 - hyparquet replacement: ~30 KB6e64fba -
Cut first-paint payload: per-icon phosphor imports + WebP radars + non-sticky header
- Switch every `import { X } from 'phosphor-svelte'` barrel to `import XIcon from 'phosphor-svelte/lib/XIcon'`. The barrel form was eagerly bundling all ~9000 icons into a single 8.5MB chunk (1.07MB gzipped); largest chunk now drops to 612KB / 156KB gzip - Convert all 17 radar PNGs to WebP @ q90 (visually indistinguishable, 2.4MB → 584KB total) and update `radarUrl()` accordingly. Modern browser support for WebP is universal so the .png fallback is unnecessary - Drop the sticky page header; round-list aside on the match page now sticks to top-2 (h: 100vh - 1rem) instead of the old 72px header offset15d8696 -
Rich data table on home page, interactive bigger minimap, tactical-reveal player swap
- Replace home-page card grid with a TanStack data table (Rounds default / Maps / Matches via Tabs); global search, map filter, sort, pagination, column-visibility, deep-link to specific round - Minimap: bigger badges + wider/fainter vision cones, halo on the active POV, click-to-switch with hover/focus ring (works in single + grid) - Player swap tactical reveal: diagonal beam sweep, corner reticle brackets, edge vignette, HUD chip slide-in (bottom-left), and a clip-path wipe on the freeze-frame so the old POV transitions out instead of snapping - Don't echo currentTime=0 from the freshly-mounted <video> back to the parent — kept the minimap and timeline from flashing to round-start during a swap; also don't drop bufferedRanges91677d6 -
Use real HF logo, show progress vs 2540-map target, default to grid view, scroll rounds list
c3540d6 -
Dedupe sharded manifest/rounds rows on overlap
Re-rendered batches occasionally produce a second shard whose rows collide on (match_id, map_name[, round]) — Svelte's each_key_duplicate fired on the homepage grid. Keep the freshest uploaded_at per key.a79c533
-
Count footage across all 10 player POVs
6090044 -
Initial CS2 render dataset viewer
31d3580