diff --git a/.VSCodeCounter/2026-06-28_22-27-28/details.md b/.VSCodeCounter/2026-06-28_22-27-28/details.md new file mode 100644 index 0000000..5ee02b9 --- /dev/null +++ b/.VSCodeCounter/2026-06-28_22-27-28/details.md @@ -0,0 +1,90 @@ +# Details + +Date : 2026-06-28 22:27:28 + +Directory d:\\rust-ws\\eskin-player + +Total : 75 files, 8653 codes, 180 comments, 1313 blanks, all 10146 lines + +[Summary](results.md) / Details / [Diff Summary](diff.md) / [Diff Details](diff-details.md) + +## Files +| filename | language | code | comment | blank | total | +| :--- | :--- | ---: | ---: | ---: | ---: | +| [.openclaw/settings.json](/.openclaw/settings.json) | JSON with Comments | 35 | 0 | 0 | 35 | +| [.scale/assets.json](/.scale/assets.json) | JSON | 4 | 0 | 1 | 5 | +| [.scale/engineering-standards-baseline.json](/.scale/engineering-standards-baseline.json) | JSON | 6 | 0 | 1 | 7 | +| [.scale/engineering-standards.json](/.scale/engineering-standards.json) | JSON | 67 | 0 | 1 | 68 | +| [.scale/frameworks.json](/.scale/frameworks.json) | JSON | 23 | 0 | 1 | 24 | +| [.scale/governance.lock.json](/.scale/governance.lock.json) | JSON | 200 | 0 | 1 | 201 | +| [.scale/output-policy.json](/.scale/output-policy.json) | JSON | 72 | 0 | 1 | 73 | +| [.scale/product-smoke.json](/.scale/product-smoke.json) | JSON | 33 | 0 | 1 | 34 | +| [.scale/quality-contract.json](/.scale/quality-contract.json) | JSON | 70 | 0 | 1 | 71 | +| [.scale/resource-policy.json](/.scale/resource-policy.json) | JSON | 39 | 0 | 1 | 40 | +| [.scale/skills-registry.json](/.scale/skills-registry.json) | JSON | 82 | 0 | 1 | 83 | +| [.scale/skills.json](/.scale/skills.json) | JSON | 630 | 0 | 1 | 631 | +| [.scale/tools.json](/.scale/tools.json) | JSON | 118 | 0 | 1 | 119 | +| [.scale/verification.json](/.scale/verification.json) | JSON | 35 | 0 | 1 | 36 | +| [.scale/workflow.json](/.scale/workflow.json) | JSON | 51 | 0 | 1 | 52 | +| [AGENTS.md](/AGENTS.md) | Markdown | 21 | 0 | 6 | 27 | +| [README.md](/README.md) | Markdown | 33 | 0 | 10 | 43 | +| [TOOLS.md](/TOOLS.md) | Markdown | 56 | 0 | 6 | 62 | +| [build.rs](/build.rs) | Rust | 24 | 0 | 10 | 34 | +| [docs/workflow/QUALITY\_CONTRACT.md](/docs/workflow/QUALITY_CONTRACT.md) | Markdown | 28 | 0 | 8 | 36 | +| [docs/workflow/README.md](/docs/workflow/README.md) | Markdown | 143 | 0 | 45 | 188 | +| [docs/workflow/templates/api-contract.md](/docs/workflow/templates/api-contract.md) | Markdown | 15 | 0 | 15 | 30 | +| [docs/workflow/templates/architecture-review.md](/docs/workflow/templates/architecture-review.md) | Markdown | 15 | 0 | 9 | 24 | +| [docs/workflow/templates/db-change-plan.md](/docs/workflow/templates/db-change-plan.md) | Markdown | 11 | 0 | 10 | 21 | +| [docs/workflow/templates/docs-impact.md](/docs/workflow/templates/docs-impact.md) | Markdown | 9 | 0 | 9 | 18 | +| [docs/workflow/templates/e2e-plan.md](/docs/workflow/templates/e2e-plan.md) | Markdown | 11 | 0 | 10 | 21 | +| [docs/workflow/templates/explore.md](/docs/workflow/templates/explore.md) | Markdown | 11 | 0 | 10 | 21 | +| [docs/workflow/templates/github-actions-scale-preflight.yml](/docs/workflow/templates/github-actions-scale-preflight.yml) | YAML | 27 | 0 | 6 | 33 | +| [docs/workflow/templates/mini-prd.md](/docs/workflow/templates/mini-prd.md) | Markdown | 23 | 0 | 20 | 43 | +| [docs/workflow/templates/plan.md](/docs/workflow/templates/plan.md) | Markdown | 17 | 0 | 12 | 29 | +| [docs/workflow/templates/pre-push-scale-preflight.sh](/docs/workflow/templates/pre-push-scale-preflight.sh) | Shell Script | 6 | 1 | 2 | 9 | +| [docs/workflow/templates/product-smoke.md](/docs/workflow/templates/product-smoke.md) | Markdown | 44 | 0 | 18 | 62 | +| [docs/workflow/templates/reality-check.md](/docs/workflow/templates/reality-check.md) | Markdown | 13 | 0 | 13 | 26 | +| [docs/workflow/templates/resource-cleanup.md](/docs/workflow/templates/resource-cleanup.md) | Markdown | 10 | 0 | 5 | 15 | +| [docs/workflow/templates/resource-impact.md](/docs/workflow/templates/resource-impact.md) | Markdown | 15 | 0 | 11 | 26 | +| [docs/workflow/templates/review.md](/docs/workflow/templates/review.md) | Markdown | 9 | 0 | 8 | 17 | +| [docs/workflow/templates/runtime.md](/docs/workflow/templates/runtime.md) | Markdown | 15 | 0 | 7 | 22 | +| [docs/workflow/templates/security-review.md](/docs/workflow/templates/security-review.md) | Markdown | 15 | 0 | 12 | 27 | +| [docs/workflow/templates/skill-evidence.md](/docs/workflow/templates/skill-evidence.md) | Markdown | 21 | 0 | 13 | 34 | +| [docs/workflow/templates/skill-plan.md](/docs/workflow/templates/skill-plan.md) | Markdown | 25 | 0 | 15 | 40 | +| [docs/workflow/templates/standards-impact.md](/docs/workflow/templates/standards-impact.md) | Markdown | 20 | 0 | 9 | 29 | +| [docs/workflow/templates/summary.md](/docs/workflow/templates/summary.md) | Markdown | 11 | 0 | 9 | 20 | +| [docs/workflow/templates/ui-spec.md](/docs/workflow/templates/ui-spec.md) | Markdown | 17 | 0 | 13 | 30 | +| [docs/workflow/templates/verification.md](/docs/workflow/templates/verification.md) | Markdown | 11 | 0 | 8 | 19 | +| [docs/workflow/templates/visual-review.md](/docs/workflow/templates/visual-review.md) | Markdown | 11 | 0 | 10 | 21 | +| [docs/worklog/metrics.md](/docs/worklog/metrics.md) | Markdown | 15 | 2 | 12 | 29 | +| [render.md](/render.md) | Markdown | 631 | 0 | 236 | 867 | +| [scripts/gates/all.sh](/scripts/gates/all.sh) | Shell Script | 43 | 2 | 10 | 55 | +| [scripts/qa/product-smoke.ps1](/scripts/qa/product-smoke.ps1) | PowerShell | 94 | 1 | 13 | 108 | +| [scripts/qa/product-smoke.sh](/scripts/qa/product-smoke.sh) | Shell Script | 86 | 1 | 12 | 99 | +| [scripts/tests/run.sh](/scripts/tests/run.sh) | Shell Script | 6 | 2 | 1 | 9 | +| [scripts/validate-config.sh](/scripts/validate-config.sh) | Shell Script | 53 | 2 | 11 | 66 | +| [scripts/workflow/verify.sh](/scripts/workflow/verify.sh) | Shell Script | 17 | 6 | 7 | 30 | +| [src/app.rs](/src/app.rs) | Rust | 330 | 12 | 39 | 381 | +| [src/connection.rs](/src/connection.rs) | Rust | 153 | 11 | 26 | 190 | +| [src/main.rs](/src/main.rs) | Rust | 30 | 0 | 4 | 34 | +| [src/matrix.rs](/src/matrix.rs) | Rust | 101 | 0 | 10 | 111 | +| [src/model.rs](/src/model.rs) | Rust | 170 | 7 | 19 | 196 | +| [src/recording.rs](/src/recording.rs) | Rust | 324 | 52 | 69 | 445 | +| [src/render.rs](/src/render.rs) | Rust | 855 | 8 | 61 | 924 | +| [src/resources.rs](/src/resources.rs) | Rust | 937 | 0 | 71 | 1,008 | +| [src/serial\_core/codec.rs](/src/serial_core/codec.rs) | Rust | 6 | 0 | 2 | 8 | +| [src/serial\_core/codecs/mod.rs](/src/serial_core/codecs/mod.rs) | Rust | 1 | 0 | 1 | 2 | +| [src/serial\_core/codecs/tactile\_a.rs](/src/serial_core/codecs/tactile_a.rs) | Rust | 163 | 1 | 21 | 185 | +| [src/serial\_core/error.rs](/src/serial_core/error.rs) | Rust | 45 | 0 | 7 | 52 | +| [src/serial\_core/frame.rs](/src/serial_core/frame.rs) | Rust | 32 | 0 | 5 | 37 | +| [src/serial\_core/mod.rs](/src/serial_core/mod.rs) | Rust | 6 | 0 | 1 | 7 | +| [src/serial\_core/serial.rs](/src/serial_core/serial.rs) | Rust | 78 | 7 | 12 | 97 | +| [src/serial\_core/utils.rs](/src/serial_core/utils.rs) | Rust | 8 | 0 | 3 | 11 | +| [src/style.rs](/src/style.rs) | Rust | 283 | 0 | 37 | 320 | +| [src/texture.rs](/src/texture.rs) | Rust | 231 | 0 | 21 | 252 | +| [src/theme.rs](/src/theme.rs) | Rust | 149 | 1 | 19 | 169 | +| [src/ui.rs](/src/ui.rs) | Rust | 1,088 | 57 | 123 | 1,268 | +| [src/utils.rs](/src/utils.rs) | Rust | 10 | 0 | 2 | 12 | +| [static/wgsl/shader.wgsl](/static/wgsl/shader.wgsl) | WGSL | 556 | 7 | 105 | 668 | + +[Summary](results.md) / Details / [Diff Summary](diff.md) / [Diff Details](diff-details.md) \ No newline at end of file diff --git a/.VSCodeCounter/2026-06-28_22-27-28/diff-details.md b/.VSCodeCounter/2026-06-28_22-27-28/diff-details.md new file mode 100644 index 0000000..6fb1494 --- /dev/null +++ b/.VSCodeCounter/2026-06-28_22-27-28/diff-details.md @@ -0,0 +1,15 @@ +# Diff Details + +Date : 2026-06-28 22:27:28 + +Directory d:\\rust-ws\\eskin-player + +Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines + +[Summary](results.md) / [Details](details.md) / [Diff Summary](diff.md) / Diff Details + +## Files +| filename | language | code | comment | blank | total | +| :--- | :--- | ---: | ---: | ---: | ---: | + +[Summary](results.md) / [Details](details.md) / [Diff Summary](diff.md) / Diff Details \ No newline at end of file diff --git a/.VSCodeCounter/2026-06-28_22-27-28/diff.csv b/.VSCodeCounter/2026-06-28_22-27-28/diff.csv new file mode 100644 index 0000000..b7d8d75 --- /dev/null +++ b/.VSCodeCounter/2026-06-28_22-27-28/diff.csv @@ -0,0 +1,2 @@ +"filename", "language", "", "comment", "blank", "total" +"Total", "-", , 0, 0, 0 \ No newline at end of file diff --git a/.VSCodeCounter/2026-06-28_22-27-28/diff.md b/.VSCodeCounter/2026-06-28_22-27-28/diff.md new file mode 100644 index 0000000..ce3fcea --- /dev/null +++ b/.VSCodeCounter/2026-06-28_22-27-28/diff.md @@ -0,0 +1,19 @@ +# Diff Summary + +Date : 2026-06-28 22:27:28 + +Directory d:\\rust-ws\\eskin-player + +Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines + +[Summary](results.md) / [Details](details.md) / Diff Summary / [Diff Details](diff-details.md) + +## Languages +| language | files | code | comment | blank | total | +| :--- | ---: | ---: | ---: | ---: | ---: | + +## Directories +| path | files | code | comment | blank | total | +| :--- | ---: | ---: | ---: | ---: | ---: | + +[Summary](results.md) / [Details](details.md) / Diff Summary / [Diff Details](diff-details.md) \ No newline at end of file diff --git a/.VSCodeCounter/2026-06-28_22-27-28/diff.txt b/.VSCodeCounter/2026-06-28_22-27-28/diff.txt new file mode 100644 index 0000000..a46a2ba --- /dev/null +++ b/.VSCodeCounter/2026-06-28_22-27-28/diff.txt @@ -0,0 +1,22 @@ +Date : 2026-06-28 22:27:28 +Directory : d:\rust-ws\eskin-player +Total : 0 files, 0 codes, 0 comments, 0 blanks, all 0 lines + +Languages ++----------+------------+------------+------------+------------+------------+ +| language | files | code | comment | blank | total | ++----------+------------+------------+------------+------------+------------+ ++----------+------------+------------+------------+------------+------------+ + +Directories ++------+------------+------------+------------+------------+------------+ +| path | files | code | comment | blank | total | ++------+------------+------------+------------+------------+------------+ ++------+------------+------------+------------+------------+------------+ + +Files ++----------+----------+------------+------------+------------+------------+ +| filename | language | code | comment | blank | total | ++----------+----------+------------+------------+------------+------------+ +| Total | | 0 | 0 | 0 | 0 | ++----------+----------+------------+------------+------------+------------+ \ No newline at end of file diff --git a/.VSCodeCounter/2026-06-28_22-27-28/results.csv b/.VSCodeCounter/2026-06-28_22-27-28/results.csv new file mode 100644 index 0000000..cfaedd7 --- /dev/null +++ b/.VSCodeCounter/2026-06-28_22-27-28/results.csv @@ -0,0 +1,77 @@ +"filename", "language", "Rust", "Markdown", "JSON", "JSON with Comments", "Shell Script", "WGSL", "PowerShell", "YAML", "comment", "blank", "total" +"d:\rust-ws\eskin-player\.openclaw\settings.json", "JSON with Comments", 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 35 +"d:\rust-ws\eskin-player\.scale\assets.json", "JSON", 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 5 +"d:\rust-ws\eskin-player\.scale\engineering-standards-baseline.json", "JSON", 0, 0, 6, 0, 0, 0, 0, 0, 0, 1, 7 +"d:\rust-ws\eskin-player\.scale\engineering-standards.json", "JSON", 0, 0, 67, 0, 0, 0, 0, 0, 0, 1, 68 +"d:\rust-ws\eskin-player\.scale\frameworks.json", "JSON", 0, 0, 23, 0, 0, 0, 0, 0, 0, 1, 24 +"d:\rust-ws\eskin-player\.scale\governance.lock.json", "JSON", 0, 0, 200, 0, 0, 0, 0, 0, 0, 1, 201 +"d:\rust-ws\eskin-player\.scale\output-policy.json", "JSON", 0, 0, 72, 0, 0, 0, 0, 0, 0, 1, 73 +"d:\rust-ws\eskin-player\.scale\product-smoke.json", "JSON", 0, 0, 33, 0, 0, 0, 0, 0, 0, 1, 34 +"d:\rust-ws\eskin-player\.scale\quality-contract.json", "JSON", 0, 0, 70, 0, 0, 0, 0, 0, 0, 1, 71 +"d:\rust-ws\eskin-player\.scale\resource-policy.json", "JSON", 0, 0, 39, 0, 0, 0, 0, 0, 0, 1, 40 +"d:\rust-ws\eskin-player\.scale\skills-registry.json", "JSON", 0, 0, 82, 0, 0, 0, 0, 0, 0, 1, 83 +"d:\rust-ws\eskin-player\.scale\skills.json", "JSON", 0, 0, 630, 0, 0, 0, 0, 0, 0, 1, 631 +"d:\rust-ws\eskin-player\.scale\tools.json", "JSON", 0, 0, 118, 0, 0, 0, 0, 0, 0, 1, 119 +"d:\rust-ws\eskin-player\.scale\verification.json", "JSON", 0, 0, 35, 0, 0, 0, 0, 0, 0, 1, 36 +"d:\rust-ws\eskin-player\.scale\workflow.json", "JSON", 0, 0, 51, 0, 0, 0, 0, 0, 0, 1, 52 +"d:\rust-ws\eskin-player\AGENTS.md", "Markdown", 0, 21, 0, 0, 0, 0, 0, 0, 0, 6, 27 +"d:\rust-ws\eskin-player\README.md", "Markdown", 0, 33, 0, 0, 0, 0, 0, 0, 0, 10, 43 +"d:\rust-ws\eskin-player\TOOLS.md", "Markdown", 0, 56, 0, 0, 0, 0, 0, 0, 0, 6, 62 +"d:\rust-ws\eskin-player\build.rs", "Rust", 24, 0, 0, 0, 0, 0, 0, 0, 0, 10, 34 +"d:\rust-ws\eskin-player\docs\workflow\QUALITY_CONTRACT.md", "Markdown", 0, 28, 0, 0, 0, 0, 0, 0, 0, 8, 36 +"d:\rust-ws\eskin-player\docs\workflow\README.md", "Markdown", 0, 143, 0, 0, 0, 0, 0, 0, 0, 45, 188 +"d:\rust-ws\eskin-player\docs\workflow\templates\api-contract.md", "Markdown", 0, 15, 0, 0, 0, 0, 0, 0, 0, 15, 30 +"d:\rust-ws\eskin-player\docs\workflow\templates\architecture-review.md", "Markdown", 0, 15, 0, 0, 0, 0, 0, 0, 0, 9, 24 +"d:\rust-ws\eskin-player\docs\workflow\templates\db-change-plan.md", "Markdown", 0, 11, 0, 0, 0, 0, 0, 0, 0, 10, 21 +"d:\rust-ws\eskin-player\docs\workflow\templates\docs-impact.md", "Markdown", 0, 9, 0, 0, 0, 0, 0, 0, 0, 9, 18 +"d:\rust-ws\eskin-player\docs\workflow\templates\e2e-plan.md", "Markdown", 0, 11, 0, 0, 0, 0, 0, 0, 0, 10, 21 +"d:\rust-ws\eskin-player\docs\workflow\templates\explore.md", "Markdown", 0, 11, 0, 0, 0, 0, 0, 0, 0, 10, 21 +"d:\rust-ws\eskin-player\docs\workflow\templates\github-actions-scale-preflight.yml", "YAML", 0, 0, 0, 0, 0, 0, 0, 27, 0, 6, 33 +"d:\rust-ws\eskin-player\docs\workflow\templates\mini-prd.md", "Markdown", 0, 23, 0, 0, 0, 0, 0, 0, 0, 20, 43 +"d:\rust-ws\eskin-player\docs\workflow\templates\plan.md", "Markdown", 0, 17, 0, 0, 0, 0, 0, 0, 0, 12, 29 +"d:\rust-ws\eskin-player\docs\workflow\templates\pre-push-scale-preflight.sh", "Shell Script", 0, 0, 0, 0, 6, 0, 0, 0, 1, 2, 9 +"d:\rust-ws\eskin-player\docs\workflow\templates\product-smoke.md", "Markdown", 0, 44, 0, 0, 0, 0, 0, 0, 0, 18, 62 +"d:\rust-ws\eskin-player\docs\workflow\templates\reality-check.md", "Markdown", 0, 13, 0, 0, 0, 0, 0, 0, 0, 13, 26 +"d:\rust-ws\eskin-player\docs\workflow\templates\resource-cleanup.md", "Markdown", 0, 10, 0, 0, 0, 0, 0, 0, 0, 5, 15 +"d:\rust-ws\eskin-player\docs\workflow\templates\resource-impact.md", "Markdown", 0, 15, 0, 0, 0, 0, 0, 0, 0, 11, 26 +"d:\rust-ws\eskin-player\docs\workflow\templates\review.md", "Markdown", 0, 9, 0, 0, 0, 0, 0, 0, 0, 8, 17 +"d:\rust-ws\eskin-player\docs\workflow\templates\runtime.md", "Markdown", 0, 15, 0, 0, 0, 0, 0, 0, 0, 7, 22 +"d:\rust-ws\eskin-player\docs\workflow\templates\security-review.md", "Markdown", 0, 15, 0, 0, 0, 0, 0, 0, 0, 12, 27 +"d:\rust-ws\eskin-player\docs\workflow\templates\skill-evidence.md", "Markdown", 0, 21, 0, 0, 0, 0, 0, 0, 0, 13, 34 +"d:\rust-ws\eskin-player\docs\workflow\templates\skill-plan.md", "Markdown", 0, 25, 0, 0, 0, 0, 0, 0, 0, 15, 40 +"d:\rust-ws\eskin-player\docs\workflow\templates\standards-impact.md", "Markdown", 0, 20, 0, 0, 0, 0, 0, 0, 0, 9, 29 +"d:\rust-ws\eskin-player\docs\workflow\templates\summary.md", "Markdown", 0, 11, 0, 0, 0, 0, 0, 0, 0, 9, 20 +"d:\rust-ws\eskin-player\docs\workflow\templates\ui-spec.md", "Markdown", 0, 17, 0, 0, 0, 0, 0, 0, 0, 13, 30 +"d:\rust-ws\eskin-player\docs\workflow\templates\verification.md", "Markdown", 0, 11, 0, 0, 0, 0, 0, 0, 0, 8, 19 +"d:\rust-ws\eskin-player\docs\workflow\templates\visual-review.md", "Markdown", 0, 11, 0, 0, 0, 0, 0, 0, 0, 10, 21 +"d:\rust-ws\eskin-player\docs\worklog\metrics.md", "Markdown", 0, 15, 0, 0, 0, 0, 0, 0, 2, 12, 29 +"d:\rust-ws\eskin-player\render.md", "Markdown", 0, 631, 0, 0, 0, 0, 0, 0, 0, 236, 867 +"d:\rust-ws\eskin-player\scripts\gates\all.sh", "Shell Script", 0, 0, 0, 0, 43, 0, 0, 0, 2, 10, 55 +"d:\rust-ws\eskin-player\scripts\qa\product-smoke.ps1", "PowerShell", 0, 0, 0, 0, 0, 0, 94, 0, 1, 13, 108 +"d:\rust-ws\eskin-player\scripts\qa\product-smoke.sh", "Shell Script", 0, 0, 0, 0, 86, 0, 0, 0, 1, 12, 99 +"d:\rust-ws\eskin-player\scripts\tests\run.sh", "Shell Script", 0, 0, 0, 0, 6, 0, 0, 0, 2, 1, 9 +"d:\rust-ws\eskin-player\scripts\validate-config.sh", "Shell Script", 0, 0, 0, 0, 53, 0, 0, 0, 2, 11, 66 +"d:\rust-ws\eskin-player\scripts\workflow\verify.sh", "Shell Script", 0, 0, 0, 0, 17, 0, 0, 0, 6, 7, 30 +"d:\rust-ws\eskin-player\src\app.rs", "Rust", 330, 0, 0, 0, 0, 0, 0, 0, 12, 39, 381 +"d:\rust-ws\eskin-player\src\connection.rs", "Rust", 153, 0, 0, 0, 0, 0, 0, 0, 11, 26, 190 +"d:\rust-ws\eskin-player\src\main.rs", "Rust", 30, 0, 0, 0, 0, 0, 0, 0, 0, 4, 34 +"d:\rust-ws\eskin-player\src\matrix.rs", "Rust", 101, 0, 0, 0, 0, 0, 0, 0, 0, 10, 111 +"d:\rust-ws\eskin-player\src\model.rs", "Rust", 170, 0, 0, 0, 0, 0, 0, 0, 7, 19, 196 +"d:\rust-ws\eskin-player\src\recording.rs", "Rust", 324, 0, 0, 0, 0, 0, 0, 0, 52, 69, 445 +"d:\rust-ws\eskin-player\src\render.rs", "Rust", 855, 0, 0, 0, 0, 0, 0, 0, 8, 61, 924 +"d:\rust-ws\eskin-player\src\resources.rs", "Rust", 937, 0, 0, 0, 0, 0, 0, 0, 0, 71, 1008 +"d:\rust-ws\eskin-player\src\serial_core\codec.rs", "Rust", 6, 0, 0, 0, 0, 0, 0, 0, 0, 2, 8 +"d:\rust-ws\eskin-player\src\serial_core\codecs\mod.rs", "Rust", 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2 +"d:\rust-ws\eskin-player\src\serial_core\codecs\tactile_a.rs", "Rust", 163, 0, 0, 0, 0, 0, 0, 0, 1, 21, 185 +"d:\rust-ws\eskin-player\src\serial_core\error.rs", "Rust", 45, 0, 0, 0, 0, 0, 0, 0, 0, 7, 52 +"d:\rust-ws\eskin-player\src\serial_core\frame.rs", "Rust", 32, 0, 0, 0, 0, 0, 0, 0, 0, 5, 37 +"d:\rust-ws\eskin-player\src\serial_core\mod.rs", "Rust", 6, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7 +"d:\rust-ws\eskin-player\src\serial_core\serial.rs", "Rust", 78, 0, 0, 0, 0, 0, 0, 0, 7, 12, 97 +"d:\rust-ws\eskin-player\src\serial_core\utils.rs", "Rust", 8, 0, 0, 0, 0, 0, 0, 0, 0, 3, 11 +"d:\rust-ws\eskin-player\src\style.rs", "Rust", 283, 0, 0, 0, 0, 0, 0, 0, 0, 37, 320 +"d:\rust-ws\eskin-player\src\texture.rs", "Rust", 231, 0, 0, 0, 0, 0, 0, 0, 0, 21, 252 +"d:\rust-ws\eskin-player\src\theme.rs", "Rust", 149, 0, 0, 0, 0, 0, 0, 0, 1, 19, 169 +"d:\rust-ws\eskin-player\src\ui.rs", "Rust", 1088, 0, 0, 0, 0, 0, 0, 0, 57, 123, 1268 +"d:\rust-ws\eskin-player\src\utils.rs", "Rust", 10, 0, 0, 0, 0, 0, 0, 0, 0, 2, 12 +"d:\rust-ws\eskin-player\static\wgsl\shader.wgsl", "WGSL", 0, 0, 0, 0, 0, 556, 0, 0, 7, 105, 668 +"Total", "-", 5024, 1276, 1430, 35, 211, 556, 94, 27, 180, 1313, 10146 \ No newline at end of file diff --git a/.VSCodeCounter/2026-06-28_22-27-28/results.json b/.VSCodeCounter/2026-06-28_22-27-28/results.json new file mode 100644 index 0000000..691c1ba --- /dev/null +++ b/.VSCodeCounter/2026-06-28_22-27-28/results.json @@ -0,0 +1 @@ +{"file:///d%3A/rust-ws/eskin-player/build.rs":{"language":"Rust","code":24,"comment":0,"blank":10},"file:///d%3A/rust-ws/eskin-player/TOOLS.md":{"language":"Markdown","code":56,"comment":0,"blank":6},"file:///d%3A/rust-ws/eskin-player/AGENTS.md":{"language":"Markdown","code":21,"comment":0,"blank":6},"file:///d%3A/rust-ws/eskin-player/render.md":{"language":"Markdown","code":631,"comment":0,"blank":236},"file:///d%3A/rust-ws/eskin-player/README.md":{"language":"Markdown","code":33,"comment":0,"blank":10},"file:///d%3A/rust-ws/eskin-player/.scale/assets.json":{"language":"JSON","code":4,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/.openclaw/settings.json":{"language":"JSON with Comments","code":35,"comment":0,"blank":0},"file:///d%3A/rust-ws/eskin-player/.scale/engineering-standards.json":{"language":"JSON","code":67,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/.scale/engineering-standards-baseline.json":{"language":"JSON","code":6,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/.scale/workflow.json":{"language":"JSON","code":51,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/.scale/tools.json":{"language":"JSON","code":118,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/.scale/verification.json":{"language":"JSON","code":35,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/.scale/frameworks.json":{"language":"JSON","code":23,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/.scale/skills.json":{"language":"JSON","code":630,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/.scale/skills-registry.json":{"language":"JSON","code":82,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/.scale/resource-policy.json":{"language":"JSON","code":39,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/.scale/quality-contract.json":{"language":"JSON","code":70,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/scripts/workflow/verify.sh":{"language":"Shell Script","code":17,"comment":6,"blank":7},"file:///d%3A/rust-ws/eskin-player/scripts/validate-config.sh":{"language":"Shell Script","code":53,"comment":2,"blank":11},"file:///d%3A/rust-ws/eskin-player/static/wgsl/shader.wgsl":{"language":"WGSL","code":556,"comment":7,"blank":105},"file:///d%3A/rust-ws/eskin-player/scripts/tests/run.sh":{"language":"Shell Script","code":6,"comment":2,"blank":1},"file:///d%3A/rust-ws/eskin-player/scripts/qa/product-smoke.sh":{"language":"Shell Script","code":86,"comment":1,"blank":12},"file:///d%3A/rust-ws/eskin-player/scripts/qa/product-smoke.ps1":{"language":"PowerShell","code":94,"comment":1,"blank":13},"file:///d%3A/rust-ws/eskin-player/src/utils.rs":{"language":"Rust","code":10,"comment":0,"blank":2},"file:///d%3A/rust-ws/eskin-player/src/ui.rs":{"language":"Rust","code":1088,"comment":57,"blank":123},"file:///d%3A/rust-ws/eskin-player/src/theme.rs":{"language":"Rust","code":149,"comment":1,"blank":19},"file:///d%3A/rust-ws/eskin-player/src/texture.rs":{"language":"Rust","code":231,"comment":0,"blank":21},"file:///d%3A/rust-ws/eskin-player/src/style.rs":{"language":"Rust","code":283,"comment":0,"blank":37},"file:///d%3A/rust-ws/eskin-player/scripts/gates/all.sh":{"language":"Shell Script","code":43,"comment":2,"blank":10},"file:///d%3A/rust-ws/eskin-player/src/recording.rs":{"language":"Rust","code":324,"comment":52,"blank":69},"file:///d%3A/rust-ws/eskin-player/src/model.rs":{"language":"Rust","code":170,"comment":7,"blank":19},"file:///d%3A/rust-ws/eskin-player/src/matrix.rs":{"language":"Rust","code":101,"comment":0,"blank":10},"file:///d%3A/rust-ws/eskin-player/src/main.rs":{"language":"Rust","code":30,"comment":0,"blank":4},"file:///d%3A/rust-ws/eskin-player/src/connection.rs":{"language":"Rust","code":153,"comment":11,"blank":26},"file:///d%3A/rust-ws/eskin-player/src/app.rs":{"language":"Rust","code":330,"comment":12,"blank":39},"file:///d%3A/rust-ws/eskin-player/src/serial_core/error.rs":{"language":"Rust","code":45,"comment":0,"blank":7},"file:///d%3A/rust-ws/eskin-player/src/serial_core/utils.rs":{"language":"Rust","code":8,"comment":0,"blank":3},"file:///d%3A/rust-ws/eskin-player/src/serial_core/serial.rs":{"language":"Rust","code":78,"comment":7,"blank":12},"file:///d%3A/rust-ws/eskin-player/src/serial_core/mod.rs":{"language":"Rust","code":6,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/src/serial_core/frame.rs":{"language":"Rust","code":32,"comment":0,"blank":5},"file:///d%3A/rust-ws/eskin-player/docs/worklog/metrics.md":{"language":"Markdown","code":15,"comment":2,"blank":12},"file:///d%3A/rust-ws/eskin-player/src/serial_core/codecs/tactile_a.rs":{"language":"Rust","code":163,"comment":1,"blank":21},"file:///d%3A/rust-ws/eskin-player/src/serial_core/codecs/mod.rs":{"language":"Rust","code":1,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/src/serial_core/codec.rs":{"language":"Rust","code":6,"comment":0,"blank":2},"file:///d%3A/rust-ws/eskin-player/src/resources.rs":{"language":"Rust","code":937,"comment":0,"blank":71},"file:///d%3A/rust-ws/eskin-player/src/render.rs":{"language":"Rust","code":855,"comment":8,"blank":61},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/visual-review.md":{"language":"Markdown","code":11,"comment":0,"blank":10},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/verification.md":{"language":"Markdown","code":11,"comment":0,"blank":8},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/ui-spec.md":{"language":"Markdown","code":17,"comment":0,"blank":13},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/summary.md":{"language":"Markdown","code":11,"comment":0,"blank":9},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/standards-impact.md":{"language":"Markdown","code":20,"comment":0,"blank":9},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/skill-plan.md":{"language":"Markdown","code":25,"comment":0,"blank":15},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/skill-evidence.md":{"language":"Markdown","code":21,"comment":0,"blank":13},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/security-review.md":{"language":"Markdown","code":15,"comment":0,"blank":12},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/runtime.md":{"language":"Markdown","code":15,"comment":0,"blank":7},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/review.md":{"language":"Markdown","code":9,"comment":0,"blank":8},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/resource-impact.md":{"language":"Markdown","code":15,"comment":0,"blank":11},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/resource-cleanup.md":{"language":"Markdown","code":10,"comment":0,"blank":5},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/reality-check.md":{"language":"Markdown","code":13,"comment":0,"blank":13},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/product-smoke.md":{"language":"Markdown","code":44,"comment":0,"blank":18},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/pre-push-scale-preflight.sh":{"language":"Shell Script","code":6,"comment":1,"blank":2},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/plan.md":{"language":"Markdown","code":17,"comment":0,"blank":12},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/mini-prd.md":{"language":"Markdown","code":23,"comment":0,"blank":20},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/github-actions-scale-preflight.yml":{"language":"YAML","code":27,"comment":0,"blank":6},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/explore.md":{"language":"Markdown","code":11,"comment":0,"blank":10},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/e2e-plan.md":{"language":"Markdown","code":11,"comment":0,"blank":10},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/docs-impact.md":{"language":"Markdown","code":9,"comment":0,"blank":9},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/db-change-plan.md":{"language":"Markdown","code":11,"comment":0,"blank":10},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/architecture-review.md":{"language":"Markdown","code":15,"comment":0,"blank":9},"file:///d%3A/rust-ws/eskin-player/docs/workflow/templates/api-contract.md":{"language":"Markdown","code":15,"comment":0,"blank":15},"file:///d%3A/rust-ws/eskin-player/docs/workflow/README.md":{"language":"Markdown","code":143,"comment":0,"blank":45},"file:///d%3A/rust-ws/eskin-player/docs/workflow/QUALITY_CONTRACT.md":{"language":"Markdown","code":28,"comment":0,"blank":8},"file:///d%3A/rust-ws/eskin-player/.scale/product-smoke.json":{"language":"JSON","code":33,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/.scale/output-policy.json":{"language":"JSON","code":72,"comment":0,"blank":1},"file:///d%3A/rust-ws/eskin-player/.scale/governance.lock.json":{"language":"JSON","code":200,"comment":0,"blank":1}} \ No newline at end of file diff --git a/.VSCodeCounter/2026-06-28_22-27-28/results.md b/.VSCodeCounter/2026-06-28_22-27-28/results.md new file mode 100644 index 0000000..0b5dc82 --- /dev/null +++ b/.VSCodeCounter/2026-06-28_22-27-28/results.md @@ -0,0 +1,49 @@ +# Summary + +Date : 2026-06-28 22:27:28 + +Directory d:\\rust-ws\\eskin-player + +Total : 75 files, 8653 codes, 180 comments, 1313 blanks, all 10146 lines + +Summary / [Details](details.md) / [Diff Summary](diff.md) / [Diff Details](diff-details.md) + +## Languages +| language | files | code | comment | blank | total | +| :--- | ---: | ---: | ---: | ---: | ---: | +| Rust | 22 | 5,024 | 156 | 563 | 5,743 | +| JSON | 14 | 1,430 | 0 | 14 | 1,444 | +| Markdown | 29 | 1,276 | 2 | 569 | 1,847 | +| WGSL | 1 | 556 | 7 | 105 | 668 | +| Shell Script | 6 | 211 | 14 | 43 | 268 | +| PowerShell | 1 | 94 | 1 | 13 | 108 | +| JSON with Comments | 1 | 35 | 0 | 0 | 35 | +| YAML | 1 | 27 | 0 | 6 | 33 | + +## Directories +| path | files | code | comment | blank | total | +| :--- | ---: | ---: | ---: | ---: | ---: | +| . | 75 | 8,653 | 180 | 1,313 | 10,146 | +| . (Files) | 5 | 765 | 0 | 268 | 1,033 | +| .openclaw | 1 | 35 | 0 | 0 | 35 | +| .scale | 14 | 1,430 | 0 | 14 | 1,444 | +| docs | 27 | 568 | 3 | 319 | 890 | +| docs\\workflow | 26 | 553 | 1 | 307 | 861 | +| docs\\workflow (Files) | 2 | 171 | 0 | 53 | 224 | +| docs\\workflow\\templates | 24 | 382 | 1 | 254 | 637 | +| docs\\worklog | 1 | 15 | 2 | 12 | 29 | +| scripts | 6 | 299 | 14 | 54 | 367 | +| scripts (Files) | 1 | 53 | 2 | 11 | 66 | +| scripts\\gates | 1 | 43 | 2 | 10 | 55 | +| scripts\\qa | 2 | 180 | 2 | 25 | 207 | +| scripts\\tests | 1 | 6 | 2 | 1 | 9 | +| scripts\\workflow | 1 | 17 | 6 | 7 | 30 | +| src | 21 | 5,000 | 156 | 553 | 5,709 | +| src (Files) | 13 | 4,661 | 148 | 501 | 5,310 | +| src\\serial_core | 8 | 339 | 8 | 52 | 399 | +| src\\serial_core (Files) | 6 | 175 | 7 | 30 | 212 | +| src\\serial_core\\codecs | 2 | 164 | 1 | 22 | 187 | +| static | 1 | 556 | 7 | 105 | 668 | +| static\\wgsl | 1 | 556 | 7 | 105 | 668 | + +Summary / [Details](details.md) / [Diff Summary](diff.md) / [Diff Details](diff-details.md) \ No newline at end of file diff --git a/.VSCodeCounter/2026-06-28_22-27-28/results.txt b/.VSCodeCounter/2026-06-28_22-27-28/results.txt new file mode 100644 index 0000000..31a7c07 --- /dev/null +++ b/.VSCodeCounter/2026-06-28_22-27-28/results.txt @@ -0,0 +1,127 @@ +Date : 2026-06-28 22:27:28 +Directory : d:\rust-ws\eskin-player +Total : 75 files, 8653 codes, 180 comments, 1313 blanks, all 10146 lines + +Languages ++--------------------+------------+------------+------------+------------+------------+ +| language | files | code | comment | blank | total | ++--------------------+------------+------------+------------+------------+------------+ +| Rust | 22 | 5,024 | 156 | 563 | 5,743 | +| JSON | 14 | 1,430 | 0 | 14 | 1,444 | +| Markdown | 29 | 1,276 | 2 | 569 | 1,847 | +| WGSL | 1 | 556 | 7 | 105 | 668 | +| Shell Script | 6 | 211 | 14 | 43 | 268 | +| PowerShell | 1 | 94 | 1 | 13 | 108 | +| JSON with Comments | 1 | 35 | 0 | 0 | 35 | +| YAML | 1 | 27 | 0 | 6 | 33 | ++--------------------+------------+------------+------------+------------+------------+ + +Directories ++------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+ +| path | files | code | comment | blank | total | ++------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+ +| . | 75 | 8,653 | 180 | 1,313 | 10,146 | +| . (Files) | 5 | 765 | 0 | 268 | 1,033 | +| .openclaw | 1 | 35 | 0 | 0 | 35 | +| .scale | 14 | 1,430 | 0 | 14 | 1,444 | +| docs | 27 | 568 | 3 | 319 | 890 | +| docs\workflow | 26 | 553 | 1 | 307 | 861 | +| docs\workflow (Files) | 2 | 171 | 0 | 53 | 224 | +| docs\workflow\templates | 24 | 382 | 1 | 254 | 637 | +| docs\worklog | 1 | 15 | 2 | 12 | 29 | +| scripts | 6 | 299 | 14 | 54 | 367 | +| scripts (Files) | 1 | 53 | 2 | 11 | 66 | +| scripts\gates | 1 | 43 | 2 | 10 | 55 | +| scripts\qa | 2 | 180 | 2 | 25 | 207 | +| scripts\tests | 1 | 6 | 2 | 1 | 9 | +| scripts\workflow | 1 | 17 | 6 | 7 | 30 | +| src | 21 | 5,000 | 156 | 553 | 5,709 | +| src (Files) | 13 | 4,661 | 148 | 501 | 5,310 | +| src\serial_core | 8 | 339 | 8 | 52 | 399 | +| src\serial_core (Files) | 6 | 175 | 7 | 30 | 212 | +| src\serial_core\codecs | 2 | 164 | 1 | 22 | 187 | +| static | 1 | 556 | 7 | 105 | 668 | +| static\wgsl | 1 | 556 | 7 | 105 | 668 | ++------------------------------------------------------------------------------------+------------+------------+------------+------------+------------+ + +Files ++------------------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+ +| filename | language | code | comment | blank | total | ++------------------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+ +| d:\rust-ws\eskin-player\.openclaw\settings.json | JSON with Comments | 35 | 0 | 0 | 35 | +| d:\rust-ws\eskin-player\.scale\assets.json | JSON | 4 | 0 | 1 | 5 | +| d:\rust-ws\eskin-player\.scale\engineering-standards-baseline.json | JSON | 6 | 0 | 1 | 7 | +| d:\rust-ws\eskin-player\.scale\engineering-standards.json | JSON | 67 | 0 | 1 | 68 | +| d:\rust-ws\eskin-player\.scale\frameworks.json | JSON | 23 | 0 | 1 | 24 | +| d:\rust-ws\eskin-player\.scale\governance.lock.json | JSON | 200 | 0 | 1 | 201 | +| d:\rust-ws\eskin-player\.scale\output-policy.json | JSON | 72 | 0 | 1 | 73 | +| d:\rust-ws\eskin-player\.scale\product-smoke.json | JSON | 33 | 0 | 1 | 34 | +| d:\rust-ws\eskin-player\.scale\quality-contract.json | JSON | 70 | 0 | 1 | 71 | +| d:\rust-ws\eskin-player\.scale\resource-policy.json | JSON | 39 | 0 | 1 | 40 | +| d:\rust-ws\eskin-player\.scale\skills-registry.json | JSON | 82 | 0 | 1 | 83 | +| d:\rust-ws\eskin-player\.scale\skills.json | JSON | 630 | 0 | 1 | 631 | +| d:\rust-ws\eskin-player\.scale\tools.json | JSON | 118 | 0 | 1 | 119 | +| d:\rust-ws\eskin-player\.scale\verification.json | JSON | 35 | 0 | 1 | 36 | +| d:\rust-ws\eskin-player\.scale\workflow.json | JSON | 51 | 0 | 1 | 52 | +| d:\rust-ws\eskin-player\AGENTS.md | Markdown | 21 | 0 | 6 | 27 | +| d:\rust-ws\eskin-player\README.md | Markdown | 33 | 0 | 10 | 43 | +| d:\rust-ws\eskin-player\TOOLS.md | Markdown | 56 | 0 | 6 | 62 | +| d:\rust-ws\eskin-player\build.rs | Rust | 24 | 0 | 10 | 34 | +| d:\rust-ws\eskin-player\docs\workflow\QUALITY_CONTRACT.md | Markdown | 28 | 0 | 8 | 36 | +| d:\rust-ws\eskin-player\docs\workflow\README.md | Markdown | 143 | 0 | 45 | 188 | +| d:\rust-ws\eskin-player\docs\workflow\templates\api-contract.md | Markdown | 15 | 0 | 15 | 30 | +| d:\rust-ws\eskin-player\docs\workflow\templates\architecture-review.md | Markdown | 15 | 0 | 9 | 24 | +| d:\rust-ws\eskin-player\docs\workflow\templates\db-change-plan.md | Markdown | 11 | 0 | 10 | 21 | +| d:\rust-ws\eskin-player\docs\workflow\templates\docs-impact.md | Markdown | 9 | 0 | 9 | 18 | +| d:\rust-ws\eskin-player\docs\workflow\templates\e2e-plan.md | Markdown | 11 | 0 | 10 | 21 | +| d:\rust-ws\eskin-player\docs\workflow\templates\explore.md | Markdown | 11 | 0 | 10 | 21 | +| d:\rust-ws\eskin-player\docs\workflow\templates\github-actions-scale-preflight.yml | YAML | 27 | 0 | 6 | 33 | +| d:\rust-ws\eskin-player\docs\workflow\templates\mini-prd.md | Markdown | 23 | 0 | 20 | 43 | +| d:\rust-ws\eskin-player\docs\workflow\templates\plan.md | Markdown | 17 | 0 | 12 | 29 | +| d:\rust-ws\eskin-player\docs\workflow\templates\pre-push-scale-preflight.sh | Shell Script | 6 | 1 | 2 | 9 | +| d:\rust-ws\eskin-player\docs\workflow\templates\product-smoke.md | Markdown | 44 | 0 | 18 | 62 | +| d:\rust-ws\eskin-player\docs\workflow\templates\reality-check.md | Markdown | 13 | 0 | 13 | 26 | +| d:\rust-ws\eskin-player\docs\workflow\templates\resource-cleanup.md | Markdown | 10 | 0 | 5 | 15 | +| d:\rust-ws\eskin-player\docs\workflow\templates\resource-impact.md | Markdown | 15 | 0 | 11 | 26 | +| d:\rust-ws\eskin-player\docs\workflow\templates\review.md | Markdown | 9 | 0 | 8 | 17 | +| d:\rust-ws\eskin-player\docs\workflow\templates\runtime.md | Markdown | 15 | 0 | 7 | 22 | +| d:\rust-ws\eskin-player\docs\workflow\templates\security-review.md | Markdown | 15 | 0 | 12 | 27 | +| d:\rust-ws\eskin-player\docs\workflow\templates\skill-evidence.md | Markdown | 21 | 0 | 13 | 34 | +| d:\rust-ws\eskin-player\docs\workflow\templates\skill-plan.md | Markdown | 25 | 0 | 15 | 40 | +| d:\rust-ws\eskin-player\docs\workflow\templates\standards-impact.md | Markdown | 20 | 0 | 9 | 29 | +| d:\rust-ws\eskin-player\docs\workflow\templates\summary.md | Markdown | 11 | 0 | 9 | 20 | +| d:\rust-ws\eskin-player\docs\workflow\templates\ui-spec.md | Markdown | 17 | 0 | 13 | 30 | +| d:\rust-ws\eskin-player\docs\workflow\templates\verification.md | Markdown | 11 | 0 | 8 | 19 | +| d:\rust-ws\eskin-player\docs\workflow\templates\visual-review.md | Markdown | 11 | 0 | 10 | 21 | +| d:\rust-ws\eskin-player\docs\worklog\metrics.md | Markdown | 15 | 2 | 12 | 29 | +| d:\rust-ws\eskin-player\render.md | Markdown | 631 | 0 | 236 | 867 | +| d:\rust-ws\eskin-player\scripts\gates\all.sh | Shell Script | 43 | 2 | 10 | 55 | +| d:\rust-ws\eskin-player\scripts\qa\product-smoke.ps1 | PowerShell | 94 | 1 | 13 | 108 | +| d:\rust-ws\eskin-player\scripts\qa\product-smoke.sh | Shell Script | 86 | 1 | 12 | 99 | +| d:\rust-ws\eskin-player\scripts\tests\run.sh | Shell Script | 6 | 2 | 1 | 9 | +| d:\rust-ws\eskin-player\scripts\validate-config.sh | Shell Script | 53 | 2 | 11 | 66 | +| d:\rust-ws\eskin-player\scripts\workflow\verify.sh | Shell Script | 17 | 6 | 7 | 30 | +| d:\rust-ws\eskin-player\src\app.rs | Rust | 330 | 12 | 39 | 381 | +| d:\rust-ws\eskin-player\src\connection.rs | Rust | 153 | 11 | 26 | 190 | +| d:\rust-ws\eskin-player\src\main.rs | Rust | 30 | 0 | 4 | 34 | +| d:\rust-ws\eskin-player\src\matrix.rs | Rust | 101 | 0 | 10 | 111 | +| d:\rust-ws\eskin-player\src\model.rs | Rust | 170 | 7 | 19 | 196 | +| d:\rust-ws\eskin-player\src\recording.rs | Rust | 324 | 52 | 69 | 445 | +| d:\rust-ws\eskin-player\src\render.rs | Rust | 855 | 8 | 61 | 924 | +| d:\rust-ws\eskin-player\src\resources.rs | Rust | 937 | 0 | 71 | 1,008 | +| d:\rust-ws\eskin-player\src\serial_core\codec.rs | Rust | 6 | 0 | 2 | 8 | +| d:\rust-ws\eskin-player\src\serial_core\codecs\mod.rs | Rust | 1 | 0 | 1 | 2 | +| d:\rust-ws\eskin-player\src\serial_core\codecs\tactile_a.rs | Rust | 163 | 1 | 21 | 185 | +| d:\rust-ws\eskin-player\src\serial_core\error.rs | Rust | 45 | 0 | 7 | 52 | +| d:\rust-ws\eskin-player\src\serial_core\frame.rs | Rust | 32 | 0 | 5 | 37 | +| d:\rust-ws\eskin-player\src\serial_core\mod.rs | Rust | 6 | 0 | 1 | 7 | +| d:\rust-ws\eskin-player\src\serial_core\serial.rs | Rust | 78 | 7 | 12 | 97 | +| d:\rust-ws\eskin-player\src\serial_core\utils.rs | Rust | 8 | 0 | 3 | 11 | +| d:\rust-ws\eskin-player\src\style.rs | Rust | 283 | 0 | 37 | 320 | +| d:\rust-ws\eskin-player\src\texture.rs | Rust | 231 | 0 | 21 | 252 | +| d:\rust-ws\eskin-player\src\theme.rs | Rust | 149 | 1 | 19 | 169 | +| d:\rust-ws\eskin-player\src\ui.rs | Rust | 1,088 | 57 | 123 | 1,268 | +| d:\rust-ws\eskin-player\src\utils.rs | Rust | 10 | 0 | 2 | 12 | +| d:\rust-ws\eskin-player\static\wgsl\shader.wgsl | WGSL | 556 | 7 | 105 | 668 | +| Total | | 8,653 | 180 | 1,313 | 10,146 | ++------------------------------------------------------------------------------------+--------------------+------------+------------+------------+------------+ \ No newline at end of file diff --git a/res/cube-diffuse.jpg b/res/cube-diffuse.jpg deleted file mode 100644 index c89b31d..0000000 Binary files a/res/cube-diffuse.jpg and /dev/null differ diff --git a/res/cube-normal.png b/res/cube-normal.png deleted file mode 100644 index 5bbac0a..0000000 Binary files a/res/cube-normal.png and /dev/null differ diff --git a/res/hand.mtl b/res/hand.mtl deleted file mode 100644 index 43b9208..0000000 --- a/res/hand.mtl +++ /dev/null @@ -1,347 +0,0 @@ -# Blender 5.1.2 MTL File: '未命名.blend' -# www.blender.org - -newmtl mat_0 -Kd 0.439636 0.439636 0.439636 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_1 -Kd 0.450786 0.545725 0.745404 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_10 -Kd 0.473532 0.623934 0.545725 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_11 -Kd 0.033105 0.033105 0.033105 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_12 -Kd 0.022170 0.017642 0.015993 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_13 -Kd 0.000000 0.000000 0.000000 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_14 -Kd 0.313971 0.401978 0.428669 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_15 -Kd 1.000000 0.318547 0.000000 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_16 -Kd 0.033105 0.132868 0.033105 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_17 -Kd 0.623934 0.679542 0.806922 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_18 -Kd 0.052861 0.038204 0.031891 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_19 -Kd 1.000000 0.679542 0.644453 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_2 -Kd 1.000000 0.278894 0.278894 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_20 -Kd 1.000000 0.318547 0.033105 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_21 -Kd 1.000000 0.396755 1.000000 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_22 -Kd 0.930111 0.428669 0.230740 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_3 -Kd 0.291771 0.258167 0.127438 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_4 -Kd 0.318547 0.318547 0.318547 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_5 -Kd 0.564712 0.391552 0.266356 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_6 -Kd 0.000000 0.318547 0.000000 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_7 -Kd 1.000000 1.000000 0.000000 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_8 -Kd 0.887891 0.887891 0.887891 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 - -newmtl mat_9 -Kd 0.527115 0.768151 0.737881 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.500000 -d 1.000000 -illum 3 -Pr 1.000000 -Pm 1.000000 -Ps 0.000000 -Pc 0.000000 -Pcr 0.030000 -aniso 0.000000 -anisor 0.000000 diff --git a/src/render.rs b/src/render.rs index 3acc802..370fd07 100644 --- a/src/render.rs +++ b/src/render.rs @@ -40,6 +40,43 @@ pub struct HandGatewayMode { pub range: Range, } +const HAND_TIP_MATRICES: [HandTipMatrix; 5] = [ + HandTipMatrix { + center_px: [260.0, 490.0], + size_px: [70.0, 120.0], + angle_rad: -0.45, + }, + HandTipMatrix { + center_px: [360.0, 255.0], + size_px: [70.0, 120.0], + angle_rad: -0.05, + }, + HandTipMatrix { + center_px: [485.0, 225.0], + size_px: [70.0, 120.0], + angle_rad: 0.0, + }, + HandTipMatrix { + center_px: [595.0, 260.0], + size_px: [70.0, 120.0], + angle_rad: 0.12, + }, + HandTipMatrix { + center_px: [705.0, 385.0], + size_px: [70.0, 120.0], + angle_rad: 0.28, + }, +]; + +// Each entry pins one miniature matrix to a fingertip in hand.png. +// Coordinates are authored in source-image pixels so they are easy to tune by eye. +// size_px keeps the same 7:12 aspect as the Finger-mode 7 columns x 12 rows matrix. +struct HandTipMatrix { + center_px: [f32; 2], + size_px: [f32; 2], + angle_rad: f32, +} + impl egui_wgpu::CallbackTrait for WgpuBackgroundCallback { fn prepare( &self, @@ -78,12 +115,15 @@ pub struct BackgroundRenderResources { hand_image_pipeline: wgpu::RenderPipeline, glyph_pipeline: wgpu::RenderPipeline, dot_pipeline: wgpu::RenderPipeline, + hand_dot_pipeline: wgpu::RenderPipeline, hand_image_bind_group: wgpu::BindGroup, hand_image_texture: texture::Texture, glyph_vertex_buffer: wgpu::Buffer, glyph_instance_buffer: wgpu::Buffer, glyph_instances: Vec, + hand_dot_instance_buffer: wgpu::Buffer, + hand_dot_instances: Vec, render_options: RenderOptions, } @@ -405,6 +445,8 @@ impl BackgroundRenderResources { let glyph_pipeline = create_glyph_pipeline(device, target_format, &shader, &pipeline_layout); let dot_pipeline = create_dot_pipeline(device, target_format, &shader, &pipeline_layout); + let hand_dot_pipeline = + create_hand_dot_pipeline(device, target_format, &shader, &pipeline_layout); let _model_pipelines = create_model_pipelines(device, target_format, &shader, &model_pipeline_layout); @@ -432,6 +474,19 @@ impl BackgroundRenderResources { contents: bytemuck::cast_slice(&glyph_instances), usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST, }); + let hand_dot_instances = build_hand_dot_instances( + rows, + cols, + hand_image_texture.width as f32, + hand_image_texture.height as f32, + &[[0.0, 0.0]; PRESSURE_CELL_COUNT], + ); + let hand_dot_instance_buffer = + device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Hand Fingertip Dot Matrix Instance Buffer"), + contents: bytemuck::cast_slice(&hand_dot_instances), + usage: wgpu::BufferUsages::VERTEX | wgpu::BufferUsages::COPY_DST, + }); Self { layout, @@ -445,11 +500,14 @@ impl BackgroundRenderResources { hand_image_pipeline, glyph_pipeline, dot_pipeline, + hand_dot_pipeline, hand_image_bind_group, hand_image_texture, glyph_vertex_buffer, glyph_instance_buffer, glyph_instances, + hand_dot_instance_buffer, + hand_dot_instances, render_options, } } @@ -485,6 +543,21 @@ impl BackgroundRenderResources { 0, bytemuck::cast_slice(&self.glyph_instances), ); + + // Hand mode uses five UV-anchored fingertip matrices over hand.png. + // Rebuild their instance positions here so pressure colors update every frame. + self.hand_dot_instances = build_hand_dot_instances( + self.rows, + self.cols, + self.hand_image_texture.width as f32, + self.hand_image_texture.height as f32, + pressure, + ); + queue.write_buffer( + &self.hand_dot_instance_buffer, + 0, + bytemuck::cast_slice(&self.hand_dot_instances), + ); } fn paint(&self, render_pass: &mut wgpu::RenderPass<'_>, active_mode: &ActiveMode) { @@ -493,13 +566,14 @@ impl BackgroundRenderResources { render_pass.set_pipeline(&self.background_pipeline); render_pass.draw(0..3, 0..1); - render_pass.set_pipeline(&self.hand_image_pipeline); - render_pass.set_bind_group(1, &self.hand_image_bind_group, &[]); - render_pass.draw(0..6, 0..1); - match active_mode { ActiveMode::Finger(mode) => self.paint_finger(render_pass, mode), - ActiveMode::Hand(mode) => self.paint_hand(render_pass, mode), + ActiveMode::Hand(mode) => { + render_pass.set_pipeline(&self.hand_image_pipeline); + render_pass.set_bind_group(1, &self.hand_image_bind_group, &[]); + render_pass.draw(0..6, 0..1); + self.paint_hand(render_pass, mode); + } } } @@ -520,7 +594,12 @@ impl BackgroundRenderResources { fn paint_hand(&self, render_pass: &mut wgpu::RenderPass<'_>, mode: &HandGatewayMode) { let _range = mode.range.clone(); - let _ = render_pass; + + // Draw the five fingertip dot matrices after hand.png, so they sit on top of the texture. + render_pass.set_pipeline(&self.hand_dot_pipeline); + render_pass.set_vertex_buffer(0, self.glyph_vertex_buffer.slice(..)); + render_pass.set_vertex_buffer(1, self.hand_dot_instance_buffer.slice(..)); + render_pass.draw(0..6, 0..self.hand_dot_instances.len() as u32); } fn visible_instance_count(&self, rows: u32, cols: u32) -> u32 { @@ -788,6 +867,80 @@ fn create_dot_pipeline( }) } +fn create_hand_dot_pipeline( + device: &wgpu::Device, + target_format: &wgpu::TextureFormat, + shader: &wgpu::ShaderModule, + layout: &wgpu::PipelineLayout, +) -> wgpu::RenderPipeline { + device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: Some("Hand Fingertip Dot Matrix Pipeline"), + layout: Some(layout), + vertex: wgpu::VertexState { + module: shader, + entry_point: Some("vs_hand_dot"), + compilation_options: Default::default(), + buffers: &[GlyphVertex::desc(), GlyphInstance::desc()], + }, + fragment: Some(wgpu::FragmentState { + module: shader, + entry_point: Some("fs_hand_dot"), + compilation_options: Default::default(), + targets: &[Some(wgpu::ColorTargetState { + format: *target_format, + blend: Some(wgpu::BlendState::ALPHA_BLENDING), + write_mask: wgpu::ColorWrites::ALL, + })], + }), + primitive: wgpu::PrimitiveState::default(), + depth_stencil: None, + multisample: wgpu::MultisampleState::default(), + multiview_mask: None, + cache: None, + }) +} + +fn build_hand_dot_instances( + rows: u32, + cols: u32, + image_width: f32, + image_height: f32, + pressure: &PressureFrame, +) -> Vec { + let mut instances = Vec::with_capacity(HAND_TIP_MATRICES.len() * rows as usize * cols as usize); + + for tip in HAND_TIP_MATRICES { + let cos = tip.angle_rad.cos(); + let sin = tip.angle_rad.sin(); + + for row in 0..rows { + for col in 0..cols { + let index = (row * cols + col) as usize; + let [normalized, display_value] = + pressure.get(index).copied().unwrap_or([0.0, 0.0]); + + // Lay out a rows x cols matrix in fingertip-local pixel space. + let local_x = (col as f32 - cols as f32 / 2.0 + 0.5) / cols as f32 * tip.size_px[0]; + let local_y = (row as f32 - rows as f32 / 2.0 + 0.5) / rows as f32 * tip.size_px[1]; + + // Rotate the local matrix so it follows the direction of the finger. + let x = tip.center_px[0] + local_x * cos - local_y * sin; + let y = tip.center_px[1] + local_x * sin + local_y * cos; + + let uv_x = x / image_width.max(1.0); + let uv_y = y / image_height.max(1.0); + + instances.push(GlyphInstance { + world_position: [uv_x, uv_y, 0.0, 1.0], + style: [normalized, display_value, 0.0, 0.0], + }); + } + } + } + + instances +} + fn build_glyph_instances( rows: u32, cols: u32, diff --git a/static/wgsl/shader.wgsl b/static/wgsl/shader.wgsl index 996df0f..e392e45 100644 --- a/static/wgsl/shader.wgsl +++ b/static/wgsl/shader.wgsl @@ -336,7 +336,6 @@ fn fs_glyph(in: GlyphVertexOutput) -> @location(0) vec4f { return output_color(color, alpha); } - // dot struct DotVertexInput { @location(0) local: vec2f, @@ -358,12 +357,71 @@ fn circle_alpha(local: vec2f, radius: f32, softness: f32) -> f32 { return 1.0 - smoothstep(radius, radius + softness, dist); } +// Convert a point authored in hand.png UV space into clip space. +// This mirrors fs_hand_image's aspect-fit math, so fingertip dots stay attached +// to the same image pixels when the app window changes shape. +fn hand_image_uv_to_clip(image_uv: vec2f) -> vec2f { + let viewport_aspect = u.viewport.x / max(u.viewport.y, 1.0); + let image_aspect = u.image.x / max(u.image.y, 1.0); + + var screen_uv = image_uv; + + if (viewport_aspect > image_aspect) { + let image_width = image_aspect / viewport_aspect; + screen_uv.x = image_uv.x * image_width + (1.0 - image_width) * 0.5; + } else { + let image_height = viewport_aspect / image_aspect; + screen_uv.y = image_uv.y * image_height + (1.0 - image_height) * 0.5; + } + + return vec2f(screen_uv.x * 2.0 - 1.0, 1.0 - screen_uv.y * 2.0); +} + +@vertex +fn vs_hand_dot(vertex: DotVertexInput, instance: DotInstanceInput) -> DotVertexOutput { + let intensity = saturate(instance.style.x); + + let shaped = smoothstep(0.0, 1.0, intensity); + + // Hand instances store hand.png UV in world_position.xy instead of 3D world space. + let center = hand_image_uv_to_clip(instance.world_position.xy); + // Hand fingertip matrices are much smaller than the full Finger view. + // Keep each bead below the local cell spacing so the 12x7 matrix remains visibly separated. + let pixel_size = u.glyph.x * mix(0.38, 0.56, shaped); + let ndc_offset = vertex.local * vec2f(pixel_size / u.viewport.x, pixel_size / u.viewport.y) * 2.0; + + var out: DotVertexOutput; + out.clip_position = vec4f(center + ndc_offset, 0.0, 1.0); + out.local = vertex.local; + out.intensity = intensity; + return out; +} + +@fragment +fn fs_hand_dot(in: DotVertexOutput) -> @location(0) vec4f { + let intensity = saturate(in.intensity); + + // Use a compact round bead instead of the larger Finger-mode glow marker. + let core = circle_alpha(in.local, 0.56, 0.08); + let halo = circle_alpha(in.local, 0.78, 0.14) * 0.16; + + // Keep the fingertip matrix visually close to JE-Skin's cyan model dots, + // while still letting pressure brighten the bead a little. + let cyan = vec3f(0.34, 0.86, 1.0); + let hot = sample_range_color(intensity); + let color = mix(cyan, hot, 0.22) * mix(0.88, 1.18, intensity); + + return output_color(color, max(core, halo)); +} + @vertex fn vs_dot(vertex: DotVertexInput, instance: DotInstanceInput) -> DotVertexOutput { let center = u.view_proj * vec4f(instance.world_position.xyz, 1.0); let intensity = saturate(instance.style.x); - let shaped = pow(intensity, 0.9); - let pixel_size = u.glyph.x * mix(0.72, 1.85, shaped); + let shaped = smoothstep(0.0, 1.0, intensity); + + let pixel_size = u.glyph.x * mix(1.07, 2.23, shaped); + let ndc_offset = vertex.local * vec2f(pixel_size / u.viewport.x, pixel_size / u.viewport.y) * 2.0; var out: DotVertexOutput; out.clip_position = vec4f(center.xy + ndc_offset * center.w, center.z, center.w); @@ -379,7 +437,7 @@ fn fs_dot(in: DotVertexOutput) -> @location(0) vec4f { let core = circle_alpha(in.local, 0.42, 0.055); - let glow = circle_alpha(in.local, 0.78, 0.18) * intensity * 0.45; + let glow = circle_alpha(in.local, 0.92, 0.20) * intensity * 0.32; let highlight_pos = in.local - vec2f(-0.18, 0.20);