Compare commits
7
Commits
f84093adba
..
v0.2.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
12272d6b96 | ||
|
|
56e104f5f3 | ||
|
|
8e880ed09d | ||
|
|
9ce7011389 | ||
|
|
f5e7e66127 | ||
|
|
dbb177da6f | ||
|
|
eeeabe56b1 |
No files matched your search
@@ -8,6 +8,44 @@ Format: [Keep a Changelog](https://keepachangelog.com/) style, versions follow [
|
|||||||
|
|
||||||
Nothing yet.
|
Nothing yet.
|
||||||
|
|
||||||
|
## [0.2.0] — 2026-11-09
|
||||||
|
|
||||||
|
Third-person body. The pawn gains a visible, animated body and a third-person camera, so the walk cycle is finally something a player can see rather than a clip in an asset list.
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- **`Tools/character_anim_build.py`**: `GigLine_Idle` (60 frames) and `GigLine_Walk` (30 frames) at 30 fps, authored as parametric cycles so the loop closes by construction. Limb axes were **measured** on the rig — a probe rotated `upperleg01.L` by 0.5 rad on each axis and read `foot.L`, which showed X swings the limb fore/aft while Y twists and Z abducts.
|
||||||
|
- **Third-person rig** (`ADR-9`): a visible skeletal body, a `USpringArmComponent` with collision testing, and a **V** toggle. One pawn carries both rigs; first person stays the shipped default.
|
||||||
|
- **Walk capture harness**: a per-shot `ShotFollow` mode that re-places the review camera every frame in the pawn's frame, plus `SetReviewWalk` / `ReturnToStartForReview`, so a stride is captured deterministically and the fixed-camera shots still find the pawn at spawn.
|
||||||
|
- **Review shots 6, 7 and 8** — third-person back, front and mid-stride — embedded in `Screenshots/README.md`.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Character export preset now **bakes animation** (`bake_anim`, all actions). Without it the exporter wrote a static bind pose and Unreal imported a mesh with no clips and no error.
|
||||||
|
- `Docs/controls.md` documents the V toggle and the review switches; the in-game HUD line reads `WASD move · Mouse look · Space jump · V view · R reset · Esc pause`.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- **`PlayAnimation` on a hidden component never took effect.** The body is hidden at construction and only unhidden by the toggle, so the first call could land before the component was ready; the code now sets `AnimationSingleNode`, calls `SetAnimation` + `Play`, and re-asserts while the instance is missing.
|
||||||
|
- **The animation switch restarted the clip every frame**, freezing the body on frame 0.
|
||||||
|
- **The importer silently refused to replace the existing assets.** Changing the arm rotation and rebuilding returned the identical bone quaternion every time; `replace_existing` and `delete_asset` both failed because the pawn's constructor hard-references the clips. Importing under a new name (`CharacterV2`) finally landed the change — that is what unblocked the pose after a dozen failed rebuilds.
|
||||||
|
- **The review runner copied stale screenshots** from `Saved/`, so a shot retired from the camera list reappeared with byte-identical content from an older run. The folder is cleared before each capture.
|
||||||
|
- **Walking was never enabled for the stride shot**: the call sat in the shot sequencer's `BeginPlay`, which runs before the player pawn exists, so the cast silently found nothing and `speed` stayed at 0.
|
||||||
|
|
||||||
|
### Verified
|
||||||
|
|
||||||
|
- **8 review shots verify**; shots 6, 7 and 8 approved by the owner.
|
||||||
|
- **1440p, no frame generation, VSync off**: 759 frames, avg **2.64 ms (379 fps)**, p50 2.54, p95 3.39, p99 3.76, max 4.05 ms — about 2 % over `0.1.5` and 6.3× the 60 fps floor. Series: `Docs/perf/0.2.0-walk-frametimes.csv`.
|
||||||
|
- `-qaselftest`: walk, reset 0 cm from spawn, pause/unpause, transect 1456 samples / 0 holes, wall probe 0/35, façade probe 0/9 — all PASS.
|
||||||
|
- 82 tool tests pass.
|
||||||
|
|
||||||
|
### Known limitations
|
||||||
|
|
||||||
|
- **The fingers splay** — the bind's finger spread carries into the pose. Deferred to `0.2.2`.
|
||||||
|
- **The arms-down rotation was found by sweeping**, not derived: 0.55 rad puts the arms at the sides, 0.65 against the hip, 0.75 into the torso. A derived pose is a `0.2.2` job.
|
||||||
|
- **Camera collision is implemented but unproven** — the spawn point has open space behind it, so no shot exercises the boom shortening.
|
||||||
|
- The third-person body has no head or hand IK and no turn-in-place; it is a first playable, not a finished character.
|
||||||
|
|
||||||
## [0.1.6] — 2026-11-09
|
## [0.1.6] — 2026-11-09
|
||||||
|
|
||||||
Retail frontage. The two retail buildings beside the hero are modelled from their own photograph instead of the generic kit, and the photograph is treated as evidence: an analysis is written before any geometry, and every dimension the image does not resolve is carried into the part report as an assumption.
|
Retail frontage. The two retail buildings beside the hero are modelled from their own photograph instead of the generic kit, and the photograph is treated as evidence: an analysis is written before any geometry, and every dimension the image does not resolve is carried into the part report as an assumption.
|
||||||
|
|||||||
+18
-1
@@ -1,4 +1,4 @@
|
|||||||
# Controls (`0.1.0` walkable demo)
|
# Controls
|
||||||
|
|
||||||
Keyboard and mouse. The same list is shown in-game, bottom-right of the frame (`AGigLineHUD`), and the packaged Linux build ships with these bindings.
|
Keyboard and mouse. The same list is shown in-game, bottom-right of the frame (`AGigLineHUD`), and the packaged Linux build ships with these bindings.
|
||||||
|
|
||||||
@@ -12,6 +12,7 @@ Keyboard and mouse. The same list is shown in-game, bottom-right of the frame (`
|
|||||||
| Jump | `Space` | |
|
| Jump | `Space` | |
|
||||||
| Reset to start | `R` | Returns to the grounded spawn point |
|
| Reset to start | `R` | Returns to the grounded spawn point |
|
||||||
| Pause / release mouse | `Escape` | Second press resumes and recaptures the mouse |
|
| Pause / release mouse | `Escape` | Second press resumes and recaptures the mouse |
|
||||||
|
| Swap first / third person | `V` | First person is the default; the body is hidden in that view |
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
@@ -19,6 +20,22 @@ Keyboard and mouse. The same list is shown in-game, bottom-right of the frame (`
|
|||||||
- The mouse is captured on launch, so looking works without clicking first. `Escape` toggles the capture as part of pause.
|
- The mouse is captured on launch, so looking works without clicking first. `Escape` toggles the capture as part of pause.
|
||||||
- Bindings are Enhanced Input actions in `/Game/Input` built by `Tools/ue_create_input_assets.py`; the mapping context is `IMC_Default`.
|
- Bindings are Enhanced Input actions in `/Game/Input` built by `Tools/ue_create_input_assets.py`; the mapping context is `IMC_Default`.
|
||||||
|
|
||||||
|
## Changes since `0.1.0`
|
||||||
|
|
||||||
|
- **`V` swaps first and third person** (`0.2.0`, `IA_ToggleCamera`). The shipped default view is still first person, as the owner decided for `0.1.0`; third person adds a collision-tested spring-arm camera and a visible, animated body. `Escape` still pauses and releases the mouse in either view.
|
||||||
|
|
||||||
|
## Review and harness switches
|
||||||
|
|
||||||
|
These are command-line switches for the screenshot pipeline and QA runs, not player controls. They exist so a capture is reproducible rather than dependent on a human pressing keys at the right moment.
|
||||||
|
|
||||||
|
| Switch | Effect |
|
||||||
|
| --- | --- |
|
||||||
|
| `-thirdperson` | Starts the pawn in the third-person rig, so a capture shows the body without anyone pressing `V` |
|
||||||
|
| `-walk` | Holds forward input from the first frame — what makes the stride shot possible |
|
||||||
|
| `-qaselftest` | Runs the scripted walk / reset / pause / transect checks and quits |
|
||||||
|
|
||||||
|
The walking shot is driven per shot rather than by the switch: the shot actor enables the walk only while a tracking (`ShotFollow`) camera is being captured, and returns the pawn to spawn afterwards, so the fixed-camera shots still find it in place.
|
||||||
|
|
||||||
## Testing input without a physical keyboard
|
## Testing input without a physical keyboard
|
||||||
|
|
||||||
`Tools/input_test.py` injects OS-level keyboard/mouse events through a virtual `/dev/uinput` device (see `Tools/input_emulation.py`), e.g.:
|
`Tools/input_test.py` injects OS-level keyboard/mouse events through a virtual `/dev/uinput` device (see `Tools/input_emulation.py`), e.g.:
|
||||||
|
|||||||
Binary file not shown.
@@ -0,0 +1,760 @@
|
|||||||
|
frame,ms
|
||||||
|
0,2.428
|
||||||
|
1,2.633
|
||||||
|
2,2.238
|
||||||
|
3,3.606
|
||||||
|
4,2.431
|
||||||
|
5,2.649
|
||||||
|
6,4.050
|
||||||
|
7,2.011
|
||||||
|
8,2.735
|
||||||
|
9,3.390
|
||||||
|
10,2.901
|
||||||
|
11,2.237
|
||||||
|
12,2.686
|
||||||
|
13,2.383
|
||||||
|
14,2.451
|
||||||
|
15,3.412
|
||||||
|
16,2.458
|
||||||
|
17,2.474
|
||||||
|
18,2.588
|
||||||
|
19,2.556
|
||||||
|
20,2.478
|
||||||
|
21,3.150
|
||||||
|
22,2.667
|
||||||
|
23,2.349
|
||||||
|
24,2.568
|
||||||
|
25,2.580
|
||||||
|
26,2.393
|
||||||
|
27,2.575
|
||||||
|
28,3.132
|
||||||
|
29,2.536
|
||||||
|
30,2.508
|
||||||
|
31,2.710
|
||||||
|
32,2.348
|
||||||
|
33,2.537
|
||||||
|
34,2.820
|
||||||
|
35,3.162
|
||||||
|
36,2.163
|
||||||
|
37,2.562
|
||||||
|
38,2.619
|
||||||
|
39,2.323
|
||||||
|
40,2.628
|
||||||
|
41,3.075
|
||||||
|
42,2.512
|
||||||
|
43,2.448
|
||||||
|
44,2.505
|
||||||
|
45,2.454
|
||||||
|
46,2.607
|
||||||
|
47,3.128
|
||||||
|
48,2.476
|
||||||
|
49,2.562
|
||||||
|
50,2.434
|
||||||
|
51,3.385
|
||||||
|
52,2.076
|
||||||
|
53,3.435
|
||||||
|
54,2.672
|
||||||
|
55,2.550
|
||||||
|
56,1.998
|
||||||
|
57,2.583
|
||||||
|
58,2.518
|
||||||
|
59,2.777
|
||||||
|
60,3.920
|
||||||
|
61,2.934
|
||||||
|
62,2.675
|
||||||
|
63,2.320
|
||||||
|
64,2.309
|
||||||
|
65,2.520
|
||||||
|
66,3.947
|
||||||
|
67,2.596
|
||||||
|
68,2.708
|
||||||
|
69,2.291
|
||||||
|
70,2.404
|
||||||
|
71,2.551
|
||||||
|
72,3.715
|
||||||
|
73,2.100
|
||||||
|
74,2.539
|
||||||
|
75,2.682
|
||||||
|
76,2.273
|
||||||
|
77,2.442
|
||||||
|
78,3.952
|
||||||
|
79,2.233
|
||||||
|
80,2.374
|
||||||
|
81,2.686
|
||||||
|
82,2.407
|
||||||
|
83,2.654
|
||||||
|
84,3.613
|
||||||
|
85,2.320
|
||||||
|
86,2.685
|
||||||
|
87,2.744
|
||||||
|
88,2.357
|
||||||
|
89,2.565
|
||||||
|
90,3.756
|
||||||
|
91,2.672
|
||||||
|
92,2.128
|
||||||
|
93,2.583
|
||||||
|
94,2.546
|
||||||
|
95,2.391
|
||||||
|
96,2.935
|
||||||
|
97,3.624
|
||||||
|
98,1.934
|
||||||
|
99,2.509
|
||||||
|
100,2.603
|
||||||
|
101,2.449
|
||||||
|
102,2.802
|
||||||
|
103,3.678
|
||||||
|
104,2.336
|
||||||
|
105,2.509
|
||||||
|
106,2.551
|
||||||
|
107,2.576
|
||||||
|
108,2.997
|
||||||
|
109,3.208
|
||||||
|
110,2.301
|
||||||
|
111,2.359
|
||||||
|
112,2.484
|
||||||
|
113,2.646
|
||||||
|
114,2.801
|
||||||
|
115,3.226
|
||||||
|
116,2.635
|
||||||
|
117,2.325
|
||||||
|
118,2.501
|
||||||
|
119,2.602
|
||||||
|
120,2.564
|
||||||
|
121,3.151
|
||||||
|
122,3.149
|
||||||
|
123,2.235
|
||||||
|
124,2.596
|
||||||
|
125,2.432
|
||||||
|
126,2.665
|
||||||
|
127,2.648
|
||||||
|
128,3.884
|
||||||
|
129,2.087
|
||||||
|
130,2.375
|
||||||
|
131,2.586
|
||||||
|
132,2.734
|
||||||
|
133,2.338
|
||||||
|
134,3.617
|
||||||
|
135,2.418
|
||||||
|
136,2.350
|
||||||
|
137,2.713
|
||||||
|
138,2.758
|
||||||
|
139,2.239
|
||||||
|
140,3.585
|
||||||
|
141,2.565
|
||||||
|
142,2.787
|
||||||
|
143,2.115
|
||||||
|
144,2.435
|
||||||
|
145,2.489
|
||||||
|
146,3.062
|
||||||
|
147,2.958
|
||||||
|
148,2.402
|
||||||
|
149,2.425
|
||||||
|
150,2.516
|
||||||
|
151,2.505
|
||||||
|
152,2.543
|
||||||
|
153,3.690
|
||||||
|
154,2.060
|
||||||
|
155,2.510
|
||||||
|
156,2.428
|
||||||
|
157,2.603
|
||||||
|
158,2.491
|
||||||
|
159,3.178
|
||||||
|
160,2.496
|
||||||
|
161,2.424
|
||||||
|
162,2.495
|
||||||
|
163,2.667
|
||||||
|
164,2.434
|
||||||
|
165,3.040
|
||||||
|
166,2.949
|
||||||
|
167,2.094
|
||||||
|
168,2.510
|
||||||
|
169,2.586
|
||||||
|
170,2.395
|
||||||
|
171,3.004
|
||||||
|
172,3.009
|
||||||
|
173,2.288
|
||||||
|
174,2.548
|
||||||
|
175,2.337
|
||||||
|
176,2.598
|
||||||
|
177,2.498
|
||||||
|
178,3.526
|
||||||
|
179,2.533
|
||||||
|
180,2.134
|
||||||
|
181,2.560
|
||||||
|
182,2.541
|
||||||
|
183,2.436
|
||||||
|
184,2.635
|
||||||
|
185,3.361
|
||||||
|
186,2.261
|
||||||
|
187,2.566
|
||||||
|
188,2.383
|
||||||
|
189,2.529
|
||||||
|
190,2.645
|
||||||
|
191,3.190
|
||||||
|
192,2.523
|
||||||
|
193,2.523
|
||||||
|
194,2.346
|
||||||
|
195,2.865
|
||||||
|
196,2.348
|
||||||
|
197,2.879
|
||||||
|
198,3.657
|
||||||
|
199,1.824
|
||||||
|
200,2.551
|
||||||
|
201,2.449
|
||||||
|
202,2.607
|
||||||
|
203,3.085
|
||||||
|
204,3.163
|
||||||
|
205,2.404
|
||||||
|
206,2.327
|
||||||
|
207,2.553
|
||||||
|
208,2.576
|
||||||
|
209,2.544
|
||||||
|
210,3.193
|
||||||
|
211,2.647
|
||||||
|
212,2.332
|
||||||
|
213,2.544
|
||||||
|
214,2.767
|
||||||
|
215,2.429
|
||||||
|
216,3.103
|
||||||
|
217,2.861
|
||||||
|
218,2.318
|
||||||
|
219,2.552
|
||||||
|
220,2.587
|
||||||
|
221,2.352
|
||||||
|
222,3.128
|
||||||
|
223,2.621
|
||||||
|
224,2.461
|
||||||
|
225,2.422
|
||||||
|
226,2.601
|
||||||
|
227,2.748
|
||||||
|
228,2.545
|
||||||
|
229,3.224
|
||||||
|
230,2.206
|
||||||
|
231,2.459
|
||||||
|
232,2.530
|
||||||
|
233,2.461
|
||||||
|
234,2.570
|
||||||
|
235,3.271
|
||||||
|
236,2.405
|
||||||
|
237,2.424
|
||||||
|
238,2.671
|
||||||
|
239,2.450
|
||||||
|
240,2.644
|
||||||
|
241,2.510
|
||||||
|
242,3.023
|
||||||
|
243,2.461
|
||||||
|
244,2.618
|
||||||
|
245,2.350
|
||||||
|
246,2.551
|
||||||
|
247,2.472
|
||||||
|
248,3.642
|
||||||
|
249,2.576
|
||||||
|
250,2.548
|
||||||
|
251,3.599
|
||||||
|
252,1.992
|
||||||
|
253,2.424
|
||||||
|
254,3.752
|
||||||
|
255,2.241
|
||||||
|
256,2.360
|
||||||
|
257,2.522
|
||||||
|
258,2.584
|
||||||
|
259,2.653
|
||||||
|
260,2.871
|
||||||
|
261,2.827
|
||||||
|
262,2.369
|
||||||
|
263,2.482
|
||||||
|
264,2.599
|
||||||
|
265,2.294
|
||||||
|
266,2.686
|
||||||
|
267,3.428
|
||||||
|
268,2.240
|
||||||
|
269,2.435
|
||||||
|
270,2.468
|
||||||
|
271,2.619
|
||||||
|
272,2.519
|
||||||
|
273,3.247
|
||||||
|
274,2.539
|
||||||
|
275,2.442
|
||||||
|
276,2.518
|
||||||
|
277,2.489
|
||||||
|
278,2.463
|
||||||
|
279,2.839
|
||||||
|
280,2.907
|
||||||
|
281,2.786
|
||||||
|
282,2.211
|
||||||
|
283,2.615
|
||||||
|
284,2.378
|
||||||
|
285,2.671
|
||||||
|
286,3.219
|
||||||
|
287,2.435
|
||||||
|
288,2.509
|
||||||
|
289,2.323
|
||||||
|
290,2.502
|
||||||
|
291,2.526
|
||||||
|
292,3.292
|
||||||
|
293,2.468
|
||||||
|
294,2.526
|
||||||
|
295,2.500
|
||||||
|
296,2.431
|
||||||
|
297,2.481
|
||||||
|
298,2.921
|
||||||
|
299,3.009
|
||||||
|
300,2.415
|
||||||
|
301,2.600
|
||||||
|
302,2.344
|
||||||
|
303,2.533
|
||||||
|
304,2.618
|
||||||
|
305,3.458
|
||||||
|
306,2.455
|
||||||
|
307,2.469
|
||||||
|
308,2.495
|
||||||
|
309,2.568
|
||||||
|
310,2.473
|
||||||
|
311,3.179
|
||||||
|
312,2.694
|
||||||
|
313,2.503
|
||||||
|
314,2.587
|
||||||
|
315,2.317
|
||||||
|
316,2.609
|
||||||
|
317,2.590
|
||||||
|
318,3.211
|
||||||
|
319,2.392
|
||||||
|
320,2.490
|
||||||
|
321,2.515
|
||||||
|
322,2.496
|
||||||
|
323,2.483
|
||||||
|
324,3.157
|
||||||
|
325,2.540
|
||||||
|
326,2.422
|
||||||
|
327,2.574
|
||||||
|
328,2.468
|
||||||
|
329,2.547
|
||||||
|
330,2.788
|
||||||
|
331,3.075
|
||||||
|
332,2.231
|
||||||
|
333,2.537
|
||||||
|
334,2.577
|
||||||
|
335,2.584
|
||||||
|
336,2.473
|
||||||
|
337,3.415
|
||||||
|
338,2.126
|
||||||
|
339,2.506
|
||||||
|
340,2.374
|
||||||
|
341,2.721
|
||||||
|
342,2.418
|
||||||
|
343,3.259
|
||||||
|
344,2.509
|
||||||
|
345,2.519
|
||||||
|
346,2.436
|
||||||
|
347,2.472
|
||||||
|
348,2.504
|
||||||
|
349,2.858
|
||||||
|
350,3.250
|
||||||
|
351,2.161
|
||||||
|
352,2.586
|
||||||
|
353,2.376
|
||||||
|
354,2.651
|
||||||
|
355,2.504
|
||||||
|
356,3.399
|
||||||
|
357,2.353
|
||||||
|
358,2.381
|
||||||
|
359,2.513
|
||||||
|
360,2.633
|
||||||
|
361,2.566
|
||||||
|
362,3.615
|
||||||
|
363,2.593
|
||||||
|
364,2.084
|
||||||
|
365,2.411
|
||||||
|
366,2.653
|
||||||
|
367,2.521
|
||||||
|
368,2.825
|
||||||
|
369,2.891
|
||||||
|
370,2.576
|
||||||
|
371,2.302
|
||||||
|
372,2.582
|
||||||
|
373,2.513
|
||||||
|
374,2.598
|
||||||
|
375,3.790
|
||||||
|
376,2.352
|
||||||
|
377,2.306
|
||||||
|
378,2.434
|
||||||
|
379,2.514
|
||||||
|
380,2.708
|
||||||
|
381,2.978
|
||||||
|
382,2.813
|
||||||
|
383,2.327
|
||||||
|
384,2.502
|
||||||
|
385,2.446
|
||||||
|
386,2.605
|
||||||
|
387,3.033
|
||||||
|
388,3.091
|
||||||
|
389,2.206
|
||||||
|
390,2.648
|
||||||
|
391,2.732
|
||||||
|
392,2.296
|
||||||
|
393,3.406
|
||||||
|
394,2.490
|
||||||
|
395,2.424
|
||||||
|
396,2.443
|
||||||
|
397,2.601
|
||||||
|
398,2.628
|
||||||
|
399,2.477
|
||||||
|
400,3.241
|
||||||
|
401,2.573
|
||||||
|
402,2.422
|
||||||
|
403,2.384
|
||||||
|
404,2.505
|
||||||
|
405,2.575
|
||||||
|
406,2.909
|
||||||
|
407,2.897
|
||||||
|
408,2.486
|
||||||
|
409,2.431
|
||||||
|
410,2.691
|
||||||
|
411,2.342
|
||||||
|
412,2.733
|
||||||
|
413,3.518
|
||||||
|
414,2.391
|
||||||
|
415,2.160
|
||||||
|
416,2.671
|
||||||
|
417,2.505
|
||||||
|
418,2.241
|
||||||
|
419,3.355
|
||||||
|
420,2.775
|
||||||
|
421,2.395
|
||||||
|
422,2.864
|
||||||
|
423,2.290
|
||||||
|
424,2.469
|
||||||
|
425,2.977
|
||||||
|
426,2.759
|
||||||
|
427,2.460
|
||||||
|
428,2.456
|
||||||
|
429,2.497
|
||||||
|
430,2.362
|
||||||
|
431,2.874
|
||||||
|
432,2.812
|
||||||
|
433,2.559
|
||||||
|
434,2.283
|
||||||
|
435,2.670
|
||||||
|
436,2.482
|
||||||
|
437,2.495
|
||||||
|
438,3.118
|
||||||
|
439,3.018
|
||||||
|
440,2.252
|
||||||
|
441,3.222
|
||||||
|
442,2.483
|
||||||
|
443,2.436
|
||||||
|
444,3.209
|
||||||
|
445,3.169
|
||||||
|
446,2.455
|
||||||
|
447,2.432
|
||||||
|
448,2.464
|
||||||
|
449,2.500
|
||||||
|
450,2.967
|
||||||
|
451,2.958
|
||||||
|
452,2.390
|
||||||
|
453,2.494
|
||||||
|
454,2.523
|
||||||
|
455,2.473
|
||||||
|
456,2.516
|
||||||
|
457,3.527
|
||||||
|
458,2.262
|
||||||
|
459,2.377
|
||||||
|
460,2.840
|
||||||
|
461,2.135
|
||||||
|
462,2.520
|
||||||
|
463,3.285
|
||||||
|
464,2.940
|
||||||
|
465,2.256
|
||||||
|
466,2.496
|
||||||
|
467,2.705
|
||||||
|
468,2.395
|
||||||
|
469,3.031
|
||||||
|
470,3.104
|
||||||
|
471,2.411
|
||||||
|
472,2.630
|
||||||
|
473,2.468
|
||||||
|
474,2.416
|
||||||
|
475,2.559
|
||||||
|
476,2.732
|
||||||
|
477,2.441
|
||||||
|
478,2.624
|
||||||
|
479,2.536
|
||||||
|
480,2.458
|
||||||
|
481,2.516
|
||||||
|
482,2.507
|
||||||
|
483,2.606
|
||||||
|
484,2.616
|
||||||
|
485,2.881
|
||||||
|
486,2.358
|
||||||
|
487,2.469
|
||||||
|
488,2.513
|
||||||
|
489,3.250
|
||||||
|
490,2.606
|
||||||
|
491,2.545
|
||||||
|
492,2.407
|
||||||
|
493,2.437
|
||||||
|
494,2.663
|
||||||
|
495,3.346
|
||||||
|
496,2.349
|
||||||
|
497,2.481
|
||||||
|
498,2.613
|
||||||
|
499,2.483
|
||||||
|
500,2.417
|
||||||
|
501,2.923
|
||||||
|
502,3.059
|
||||||
|
503,2.483
|
||||||
|
504,2.373
|
||||||
|
505,2.525
|
||||||
|
506,2.530
|
||||||
|
507,2.431
|
||||||
|
508,2.917
|
||||||
|
509,2.559
|
||||||
|
510,2.623
|
||||||
|
511,3.172
|
||||||
|
512,2.304
|
||||||
|
513,2.331
|
||||||
|
514,3.287
|
||||||
|
515,2.544
|
||||||
|
516,2.429
|
||||||
|
517,2.690
|
||||||
|
518,2.464
|
||||||
|
519,2.406
|
||||||
|
520,2.804
|
||||||
|
521,2.899
|
||||||
|
522,2.461
|
||||||
|
523,2.536
|
||||||
|
524,2.414
|
||||||
|
525,2.380
|
||||||
|
526,2.616
|
||||||
|
527,3.236
|
||||||
|
528,2.499
|
||||||
|
529,2.558
|
||||||
|
530,2.584
|
||||||
|
531,2.309
|
||||||
|
532,2.447
|
||||||
|
533,3.039
|
||||||
|
534,3.133
|
||||||
|
535,2.170
|
||||||
|
536,2.583
|
||||||
|
537,2.505
|
||||||
|
538,2.666
|
||||||
|
539,2.567
|
||||||
|
540,3.307
|
||||||
|
541,2.177
|
||||||
|
542,2.495
|
||||||
|
543,2.441
|
||||||
|
544,2.638
|
||||||
|
545,2.521
|
||||||
|
546,3.527
|
||||||
|
547,2.460
|
||||||
|
548,2.362
|
||||||
|
549,2.520
|
||||||
|
550,2.439
|
||||||
|
551,2.572
|
||||||
|
552,3.087
|
||||||
|
553,2.707
|
||||||
|
554,2.475
|
||||||
|
555,2.283
|
||||||
|
556,2.604
|
||||||
|
557,2.529
|
||||||
|
558,3.094
|
||||||
|
559,3.051
|
||||||
|
560,2.085
|
||||||
|
561,2.365
|
||||||
|
562,2.711
|
||||||
|
563,2.351
|
||||||
|
564,2.572
|
||||||
|
565,2.979
|
||||||
|
566,2.805
|
||||||
|
567,2.373
|
||||||
|
568,2.744
|
||||||
|
569,2.340
|
||||||
|
570,2.285
|
||||||
|
571,2.791
|
||||||
|
572,3.447
|
||||||
|
573,2.208
|
||||||
|
574,2.518
|
||||||
|
575,2.448
|
||||||
|
576,3.917
|
||||||
|
577,1.540
|
||||||
|
578,2.923
|
||||||
|
579,2.632
|
||||||
|
580,2.404
|
||||||
|
581,2.582
|
||||||
|
582,2.508
|
||||||
|
583,2.413
|
||||||
|
584,3.602
|
||||||
|
585,2.342
|
||||||
|
586,2.482
|
||||||
|
587,2.584
|
||||||
|
588,3.062
|
||||||
|
589,2.070
|
||||||
|
590,2.726
|
||||||
|
591,2.937
|
||||||
|
592,2.385
|
||||||
|
593,2.734
|
||||||
|
594,2.188
|
||||||
|
595,2.582
|
||||||
|
596,2.487
|
||||||
|
597,3.339
|
||||||
|
598,2.535
|
||||||
|
599,2.414
|
||||||
|
600,2.459
|
||||||
|
601,2.510
|
||||||
|
602,2.547
|
||||||
|
603,3.414
|
||||||
|
604,2.314
|
||||||
|
605,2.399
|
||||||
|
606,2.550
|
||||||
|
607,2.541
|
||||||
|
608,2.355
|
||||||
|
609,2.709
|
||||||
|
610,3.067
|
||||||
|
611,2.502
|
||||||
|
612,2.467
|
||||||
|
613,2.899
|
||||||
|
614,2.177
|
||||||
|
615,2.719
|
||||||
|
616,3.049
|
||||||
|
617,2.673
|
||||||
|
618,2.259
|
||||||
|
619,2.566
|
||||||
|
620,2.383
|
||||||
|
621,2.420
|
||||||
|
622,3.318
|
||||||
|
623,2.807
|
||||||
|
624,2.348
|
||||||
|
625,2.595
|
||||||
|
626,2.433
|
||||||
|
627,2.569
|
||||||
|
628,2.620
|
||||||
|
629,2.652
|
||||||
|
630,3.140
|
||||||
|
631,2.945
|
||||||
|
632,2.571
|
||||||
|
633,2.546
|
||||||
|
634,2.428
|
||||||
|
635,3.436
|
||||||
|
636,2.393
|
||||||
|
637,2.491
|
||||||
|
638,2.511
|
||||||
|
639,2.485
|
||||||
|
640,2.603
|
||||||
|
641,3.363
|
||||||
|
642,2.442
|
||||||
|
643,2.344
|
||||||
|
644,2.462
|
||||||
|
645,2.508
|
||||||
|
646,2.617
|
||||||
|
647,2.909
|
||||||
|
648,2.824
|
||||||
|
649,2.528
|
||||||
|
650,2.424
|
||||||
|
651,2.511
|
||||||
|
652,2.517
|
||||||
|
653,2.583
|
||||||
|
654,3.331
|
||||||
|
655,2.436
|
||||||
|
656,2.455
|
||||||
|
657,2.380
|
||||||
|
658,2.570
|
||||||
|
659,2.582
|
||||||
|
660,2.789
|
||||||
|
661,2.917
|
||||||
|
662,2.526
|
||||||
|
663,2.538
|
||||||
|
664,2.447
|
||||||
|
665,2.423
|
||||||
|
666,2.695
|
||||||
|
667,3.143
|
||||||
|
668,2.616
|
||||||
|
669,2.126
|
||||||
|
670,2.596
|
||||||
|
671,2.464
|
||||||
|
672,3.092
|
||||||
|
673,2.681
|
||||||
|
674,2.641
|
||||||
|
675,2.311
|
||||||
|
676,2.551
|
||||||
|
677,2.551
|
||||||
|
678,2.837
|
||||||
|
679,2.532
|
||||||
|
680,3.006
|
||||||
|
681,2.289
|
||||||
|
682,2.521
|
||||||
|
683,2.556
|
||||||
|
684,2.593
|
||||||
|
685,2.552
|
||||||
|
686,3.173
|
||||||
|
687,2.415
|
||||||
|
688,2.429
|
||||||
|
689,2.733
|
||||||
|
690,2.286
|
||||||
|
691,2.476
|
||||||
|
692,3.256
|
||||||
|
693,2.897
|
||||||
|
694,2.528
|
||||||
|
695,2.377
|
||||||
|
696,2.518
|
||||||
|
697,2.504
|
||||||
|
698,3.074
|
||||||
|
699,2.814
|
||||||
|
700,2.433
|
||||||
|
701,2.338
|
||||||
|
702,2.476
|
||||||
|
703,2.458
|
||||||
|
704,3.141
|
||||||
|
705,2.551
|
||||||
|
706,2.717
|
||||||
|
707,2.300
|
||||||
|
708,2.527
|
||||||
|
709,2.446
|
||||||
|
710,2.469
|
||||||
|
711,2.866
|
||||||
|
712,2.776
|
||||||
|
713,2.507
|
||||||
|
714,2.457
|
||||||
|
715,2.520
|
||||||
|
716,2.450
|
||||||
|
717,2.568
|
||||||
|
718,3.192
|
||||||
|
719,2.471
|
||||||
|
720,2.790
|
||||||
|
721,2.337
|
||||||
|
722,2.548
|
||||||
|
723,2.435
|
||||||
|
724,3.313
|
||||||
|
725,2.274
|
||||||
|
726,2.461
|
||||||
|
727,2.451
|
||||||
|
728,2.556
|
||||||
|
729,2.546
|
||||||
|
730,2.869
|
||||||
|
731,3.308
|
||||||
|
732,2.293
|
||||||
|
733,2.428
|
||||||
|
734,2.686
|
||||||
|
735,2.562
|
||||||
|
736,2.523
|
||||||
|
737,3.309
|
||||||
|
738,2.311
|
||||||
|
739,2.498
|
||||||
|
740,2.485
|
||||||
|
741,2.568
|
||||||
|
742,2.392
|
||||||
|
743,3.260
|
||||||
|
744,2.534
|
||||||
|
745,2.550
|
||||||
|
746,2.355
|
||||||
|
747,2.768
|
||||||
|
748,2.319
|
||||||
|
749,3.039
|
||||||
|
750,2.721
|
||||||
|
751,2.490
|
||||||
|
752,2.378
|
||||||
|
753,2.539
|
||||||
|
754,2.823
|
||||||
|
755,2.480
|
||||||
|
756,3.533
|
||||||
|
757,2.285
|
||||||
|
758,2.365
|
||||||
|
@@ -42,8 +42,9 @@ Measured at 1440p on the development workstation: Bazzite, Ryzen 7 7700X, 64 GB
|
|||||||
| `0.1.0` | Placement vs references | PASS (with deliberate simplifications) | Section below, 2026-11-08 | 2026-11-08 |
|
| `0.1.0` | Placement vs references | PASS (with deliberate simplifications) | Section below, 2026-11-08 | 2026-11-08 |
|
||||||
| `0.1.0` | Collision and packaging | PASS — no blocking collision, no invisible walls, no seam gaps (see audit note) | `-qaselftest` on the packaged build, 2026-11-08 | 2026-11-08 |
|
| `0.1.0` | Collision and packaging | PASS — no blocking collision, no invisible walls, no seam gaps (see audit note) | `-qaselftest` on the packaged build, 2026-11-08 | 2026-11-08 |
|
||||||
| `0.1.0` | 60 FPS at 1440p | PASS — 2.42 ms avg (414 fps), p99 3.01 ms at 2560×1440, TSR on, VSync off, no FG | `-qaselftest` perf capture, `Docs/perf/0.1.0-walk-frametimes.csv` | 2026-11-08 |
|
| `0.1.0` | 60 FPS at 1440p | PASS — 2.42 ms avg (414 fps), p99 3.01 ms at 2560×1440, TSR on, VSync off, no FG | `-qaselftest` perf capture, `Docs/perf/0.1.0-walk-frametimes.csv` | 2026-11-08 |
|
||||||
|
| `0.2.0` | 60 FPS at 1440p | PASS — 2.64 ms avg (379 fps), p50 2.54, p95 3.39, p99 3.76, max 4.05 ms at 2560×1440, TSR on, VSync off, no FG | `-qaselftest` perf capture, `Docs/perf/0.2.0-walk-frametimes.csv` | 2026-11-09 |
|
||||||
| `0.1.0` | Fresh checkout build | PASS — clean clone of `main` (`4bc41e9`), `git lfs pull` + `check-lfs.sh` OK (130 LFS files), both `GigLineEditor` and `GigLine` targets built with the documented engine | `/tmp/fresh-check`, 2026-11-08 | 2026-11-08 |
|
| `0.1.0` | Fresh checkout build | PASS — clean clone of `main` (`4bc41e9`), `git lfs pull` + `check-lfs.sh` OK (130 LFS files), both `GigLineEditor` and `GigLine` targets built with the documented engine | `/tmp/fresh-check`, 2026-11-08 | 2026-11-08 |
|
||||||
| `0.1.0` | Packaged Linux build | PASS — packaged Development build launches straight into DemoMap, no missing-asset/linker errors; controls shown in-game and in `Docs/controls.md` | `Docs/perf/0.1.0-packaged-hud-controls.png`, 2026-11-08 | 2026-11-08 |
|
| `0.1.0` | Packaged Linux build | PASS — packaged Development build launches straight into DemoMap, no missing-asset/linker errors; controls shown in-game and in `Docs/controls.md` | measurement recorded 2026-11-08; the capture was removed from the repository 2026-11-09 | 2026-11-08 |
|
||||||
|
|
||||||
## `0.1.0` — Placement vs references — record (2026-11-08)
|
## `0.1.0` — Placement vs references — record (2026-11-08)
|
||||||
|
|
||||||
@@ -175,6 +176,6 @@ Engine/Build/BatchFiles/Linux/Build.sh GigLine Linux Development \
|
|||||||
|
|
||||||
- `Docs/controls.md` — full binding table (WASD, mouse look, Space, R, Esc) plus how to test input headlessly.
|
- `Docs/controls.md` — full binding table (WASD, mouse look, Space, R, Esc) plus how to test input headlessly.
|
||||||
- `AGigLineHUD` now draws a control legend bottom-right every frame: "WASD move · Mouse look · Space jump · R reset · Esc pause".
|
- `AGigLineHUD` now draws a control legend bottom-right every frame: "WASD move · Mouse look · Space jump · R reset · Esc pause".
|
||||||
- Verified in the packaged capture: the bottom-right text bbox is 426×12 px (a single right-aligned line), attributed text bottom-left. Screenshot: `Docs/perf/0.1.0-packaged-hud-controls.png`.
|
- Measured in the packaged build on 2026-11-08: the bottom-right text bbox was 426×12 px (a single right-aligned line), attributed text bottom-left. The capture has since been removed from the repository, so the numbers stand as the record.
|
||||||
|
|
||||||
**Verdict: PASS.**
|
**Verdict: PASS.**
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
# `0.1.4` façade review — signoff
|
|
||||||
|
|
||||||
Four demo-map captures from the `facades-0.1.4` branch, after the module kit, the textured materials and the theatre marquee went in. **All seven items signed off 2026-11-09** (owner review of the local renders).
|
|
||||||
|
|
||||||
Reference photographs to compare against: `Art/reference/hollywood/` and `Art/reference/el-capitan-*` (local, not committed). Regenerate the set with `Tools/render_screenshots.sh --verify`; measure it with `python3 Tools/visual_loop.py --compare --iteration 5`.
|
|
||||||
|
|
||||||
## Signoff
|
|
||||||
|
|
||||||
- [x] **1. Block from the north sidewalk** — hero between its neighbours, sidewalk and road read correctly
|
|
||||||
- [x] **2. Street level** — colonnade, shopfronts and window rhythm hold up at eye height
|
|
||||||
- [x] **3. Crossing** — zebra bars, kerb line and the frontage behind
|
|
||||||
- [x] **4. North buildings** — TCL and Tussaud's framed across the boulevard
|
|
||||||
- [x] **5. Materials** — stone reads as coursed stone, glazing as glass, not flat colour
|
|
||||||
- [x] **6. Theatre trim** — marquee and blade sign proportions believable at street level
|
|
||||||
- [x] **7. Approve** `v0.1.4` (kit + materials + theatre trim); remaining geometry moves to the next version
|
|
||||||
|
|
||||||
## 1. Block from the north sidewalk
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Expected: the neoclassical hero façade between its neighbours, both sidewalks and the road in the foreground. _Metric: 0.68 similarity, edges 0.28× reference._
|
|
||||||
|
|
||||||
## 2. Street level
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Expected: the hero colonnade with adjacent frontage buildings either side, shopfronts at pavement level, 4.96 m bay rhythm. _Metric: 0.33, edges 0.27×._
|
|
||||||
|
|
||||||
## 3. The designated crossing
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Expected: continental zebra bars on the asphalt at s=130 m, south frontage and colonnade behind. _Metric: 0.42, edges 0.34×._
|
|
||||||
|
|
||||||
## 4. North-side buildings
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Expected: TCL Chinese Theatre and Madame Tussaud's across Hollywood Blvd, full height in frame. _Metric: 0.34, edges 0.14×._
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Appendix — what was checked, and what was broken
|
|
||||||
|
|
||||||
### Verified
|
|
||||||
|
|
||||||
- **Behaviour**, packaged build, `-qaselftest`: walk 761 cm in 2 s (Z steady 456), reset 0 cm, pause/unpause, seam transect 1456 samples / **0 holes**, wall probe **0/35**, façade occlusion probe **0/9** — all PASS. Run twice: the harness is time-based and one loaded run reported a false failure (`walk 246 cm`, `pause FAIL`), an immediate re-run passed — re-run before believing a single FAIL.
|
|
||||||
- **Placement**, probed from the live map against `Geo/verification/2026-11-06-el-capitan-block.md`: 6922 −24276…−17700, 6902 −17749…−14591, **hero −14644…−12028 between them**, theatre −12082…−8210, 6822 / 6806 / 6800 −7854…−1437, TCL −22889…−18442, Tussaud's −27071…−22799. Blockout affine residual **0.0 cm**.
|
|
||||||
- **Budgets**: hero 148 parts / 3 044 tris · kit 16 meshes × 12 tris · 625 kit actors ≈ 7 500 tris · 8 × 512² textures (196 KB) · 67 tool tests pass.
|
|
||||||
- **Topology**: every kit piece manifold, no loose geometry.
|
|
||||||
|
|
||||||
### Defects found this cycle
|
|
||||||
|
|
||||||
Every one of these rendered convincingly; the placement ones were caught by coordinate probes, not by looking.
|
|
||||||
|
|
||||||
| Sev | Defect | Root cause |
|
|
||||||
| --- | --- | --- |
|
|
||||||
| Blocker | Frontage shifted ≈119 m X / 2.4 m Y, hero outside its gap | Blockout regenerated without `--origin` |
|
|
||||||
| Blocker | Kit placed ~12 km from its buildings | Used mesh-local bbox; actors carry the offset |
|
|
||||||
| Blocker | Marquee on the far side of the boulevard | Blender +Y is Unreal −Y |
|
|
||||||
| Major | Marquee canopy 5 cm above the pavement | Absolute Z; pavement is 4.56 m above datum |
|
|
||||||
| Major | Window bays invisible, inside the solid wall | Piece modelled entirely at +Y |
|
|
||||||
| Major | Glazing wasn't glass | Grey `M_Kit_*` from the FBX import, never overridden |
|
|
||||||
| Major | Hero windows floated 1.44 m in front of the wall | Wrong Y in the builder |
|
|
||||||
| Major | Parapet medallions were discs on the coping | Built with the Z-axis cylinder helper |
|
|
||||||
| Major | Hero had no usable collision | Complex-only; traces use simple |
|
|
||||||
| Minor | "No smoothing group information" on every import | `mesh_smooth_type="OFF"` in six exporters |
|
|
||||||
| Minor | `save_map()` returned False silently | LFS `.umap` read-only, importer never chmod'd |
|
|
||||||
| Minor | North-buildings import silently no-op | Missing `import sys` |
|
|
||||||
| Minor | Kit folder held 24 assets (8 orphan materials) | No stale-asset sweep |
|
|
||||||
| Minor | Edge-density metric counted PIL's border ring | `FIND_EDGES` leaves a 128 ring |
|
|
||||||
| Minor | QA wall probe grazed the theatre wall | Scan row 1 cm from the building line |
|
|
||||||
|
|
||||||
### Limitations worth knowing
|
|
||||||
|
|
||||||
- Kit pieces are boxes; dentil spacing, abacus and plinth dimensions are recorded assumptions, not measurements.
|
|
||||||
- Textures are generated, not authored — no decals, signage text or weathering.
|
|
||||||
- The vision pre-check stays advisory: it has rejected shots the owner approved.
|
|
||||||
- The low edge ratios in the metrics are partly structural — a wide block view against a tight façade crop always scores low. Weigh the images, not the scores.
|
|
||||||
- Performance has not been re-measured since `0.1.0`; the 625 kit actors are unmeasured (tracked in `TODO.md` under `0.1.5`).
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,6 +1,7 @@
|
|||||||
#include "GigLineCharacter.h"
|
#include "GigLineCharacter.h"
|
||||||
|
|
||||||
#include "Animation/AnimSequence.h"
|
#include "Animation/AnimSequence.h"
|
||||||
|
#include "Animation/AnimSingleNodeInstance.h"
|
||||||
#include "Camera/CameraComponent.h"
|
#include "Camera/CameraComponent.h"
|
||||||
#include "Components/SkeletalMeshComponent.h"
|
#include "Components/SkeletalMeshComponent.h"
|
||||||
#include "GameFramework/SpringArmComponent.h"
|
#include "GameFramework/SpringArmComponent.h"
|
||||||
@@ -258,6 +259,16 @@ void AGigLineCharacter::BeginPlay()
|
|||||||
bWalkForever = FParse::Param(FCommandLine::Get(), TEXT("walk"));
|
bWalkForever = FParse::Param(FCommandLine::Get(), TEXT("walk"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AGigLineCharacter::SetReviewWalk(bool bEnable)
|
||||||
|
{
|
||||||
|
bWalkForever = bEnable;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AGigLineCharacter::ReturnToStartForReview()
|
||||||
|
{
|
||||||
|
ResetToStart();
|
||||||
|
}
|
||||||
|
|
||||||
void AGigLineCharacter::WalkForever()
|
void AGigLineCharacter::WalkForever()
|
||||||
{
|
{
|
||||||
if (bWalkForever && GetCharacterMovement() && GetCharacterMovement()->IsMovingOnGround())
|
if (bWalkForever && GetCharacterMovement() && GetCharacterMovement()->IsMovingOnGround())
|
||||||
@@ -742,6 +753,7 @@ void AGigLineCharacter::Tick(float DeltaSeconds)
|
|||||||
WalkForever();
|
WalkForever();
|
||||||
UpdateBodyAnimation();
|
UpdateBodyAnimation();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AGigLineCharacter::ToggleCamera()
|
void AGigLineCharacter::ToggleCamera()
|
||||||
@@ -773,8 +785,6 @@ void AGigLineCharacter::UpdateBodyAnimation()
|
|||||||
UAnimSequence* Wanted = bMoving ? WalkAnimation.Get() : IdleAnimation.Get();
|
UAnimSequence* Wanted = bMoving ? WalkAnimation.Get() : IdleAnimation.Get();
|
||||||
if (!Wanted)
|
if (!Wanted)
|
||||||
{
|
{
|
||||||
// Logged once: a missing clip presents as an A-posed body, which looks like
|
|
||||||
// an animation problem rather than a missing asset reference.
|
|
||||||
static bool bWarnedMissingClip = false;
|
static bool bWarnedMissingClip = false;
|
||||||
if (!bWarnedMissingClip)
|
if (!bWarnedMissingClip)
|
||||||
{
|
{
|
||||||
@@ -787,32 +797,32 @@ void AGigLineCharacter::UpdateBodyAnimation()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// PlayAnimation is only an intent: it needs the component in single-node mode and
|
|
||||||
// a live single-node instance. The body is hidden at construction and only
|
|
||||||
// unhidden by the camera toggle, so the first call could land on a component that
|
|
||||||
// was not ready and never retried - the clip name logged, the pose left at bind.
|
|
||||||
// Driving the mode and the instance explicitly, and re-asserting every frame while
|
|
||||||
// the instance is missing, makes that failure self-correcting.
|
|
||||||
if (GetMesh()->GetAnimationMode() != EAnimationMode::AnimationSingleNode)
|
|
||||||
{
|
|
||||||
GetMesh()->SetAnimationMode(EAnimationMode::AnimationSingleNode);
|
|
||||||
}
|
|
||||||
if (Wanted != PlayingAnimation || GetMesh()->GetSingleNodeInstance() == nullptr)
|
if (Wanted != PlayingAnimation || GetMesh()->GetSingleNodeInstance() == nullptr)
|
||||||
{
|
{
|
||||||
PlayingAnimation = Wanted;
|
// Only the mode setter is idempotent; calling SetAnimation unconditionally
|
||||||
GetMesh()->SetAnimation(Wanted);
|
// restarts the clip every frame, which freezes the body on frame 0 - that is
|
||||||
GetMesh()->Play(true);
|
// why the walking capture showed a still figure with both legs together.
|
||||||
if (CVarGigLineSetupLogs.GetValueOnGameThread())
|
if (GetMesh()->GetAnimationMode() != EAnimationMode::AnimationSingleNode)
|
||||||
{
|
{
|
||||||
static bool bLoggedAnimState = false;
|
GetMesh()->SetAnimationMode(EAnimationMode::AnimationSingleNode);
|
||||||
if (!bLoggedAnimState)
|
}
|
||||||
|
if (Wanted != PlayingAnimation)
|
||||||
|
{
|
||||||
|
GetMesh()->SetAnimation(Wanted);
|
||||||
|
PlayingAnimation = Wanted;
|
||||||
|
GetMesh()->Play(true);
|
||||||
|
if (CVarGigLineSetupLogs.GetValueOnGameThread())
|
||||||
{
|
{
|
||||||
bLoggedAnimState = true;
|
UE_LOG(LogTemp, Log, TEXT("GigLine: body clip %s, mode=%d"),
|
||||||
UE_LOG(LogTemp, Log, TEXT("GigLine: body clip %s, mode=%d, instance=%s"),
|
*Wanted->GetName(), static_cast<int32>(GetMesh()->GetAnimationMode()));
|
||||||
*Wanted->GetName(), static_cast<int32>(GetMesh()->GetAnimationMode()),
|
|
||||||
GetMesh()->GetSingleNodeInstance() ? TEXT("ok") : TEXT("nil"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Same clip but the instance was recreated after a mode change: resume it
|
||||||
|
// once rather than re-setting the animation.
|
||||||
|
GetMesh()->Play(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,6 +41,14 @@ protected:
|
|||||||
void ResetToStart();
|
void ResetToStart();
|
||||||
void TogglePause();
|
void TogglePause();
|
||||||
|
|
||||||
|
public:
|
||||||
|
/** Review harness: hold or release forward input from the screenshot actor. */
|
||||||
|
void SetReviewWalk(bool bEnable);
|
||||||
|
|
||||||
|
/** Review harness: put the pawn back where it spawned, after a walking capture. */
|
||||||
|
void ReturnToStartForReview();
|
||||||
|
|
||||||
|
protected:
|
||||||
/** Swaps between the first-person and third-person rigs (V). */
|
/** Swaps between the first-person and third-person rigs (V). */
|
||||||
void ToggleCamera();
|
void ToggleCamera();
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ public:
|
|||||||
* in-game"). Keep in sync with Docs/controls.md.
|
* in-game"). Keep in sync with Docs/controls.md.
|
||||||
*/
|
*/
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Controls")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Controls")
|
||||||
FString ControlsLine = TEXT("WASD move \u00B7 Mouse look \u00B7 Space jump \u00B7 R reset \u00B7 Esc pause");
|
FString ControlsLine = TEXT("WASD move \u00B7 Mouse look \u00B7 Space jump \u00B7 V view \u00B7 R reset \u00B7 Esc pause");
|
||||||
|
|
||||||
/** Licence line, including where the licence can be read. */
|
/** Licence line, including where the licence can be read. */
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attribution")
|
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Attribution")
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
#include "GigLineShotActor.h"
|
#include "GigLineShotActor.h"
|
||||||
|
|
||||||
|
#include "GigLineCharacter.h"
|
||||||
|
#include "Kismet/GameplayStatics.h"
|
||||||
|
|
||||||
#include "Camera/CameraActor.h"
|
#include "Camera/CameraActor.h"
|
||||||
#include "Camera/CameraComponent.h"
|
#include "Camera/CameraComponent.h"
|
||||||
#include "Engine/World.h"
|
#include "Engine/World.h"
|
||||||
@@ -32,6 +35,12 @@ void AGigLineShotActor::Tick(float DeltaSeconds)
|
|||||||
|
|
||||||
if (bWaitingForSettle)
|
if (bWaitingForSettle)
|
||||||
{
|
{
|
||||||
|
// A follow shot tracks the pawn while it settles, otherwise the subject
|
||||||
|
// walks out of the frame between placement and capture.
|
||||||
|
if (CurrentShot < ShotFollow.Num() && ShotFollow[CurrentShot])
|
||||||
|
{
|
||||||
|
UpdateFollowCamera();
|
||||||
|
}
|
||||||
SettleCountdown -= DeltaSeconds;
|
SettleCountdown -= DeltaSeconds;
|
||||||
if (SettleCountdown <= 0.f)
|
if (SettleCountdown <= 0.f)
|
||||||
{
|
{
|
||||||
@@ -53,11 +62,47 @@ void AGigLineShotActor::Tick(float DeltaSeconds)
|
|||||||
{
|
{
|
||||||
bWaitingForScreenshot = false;
|
bWaitingForScreenshot = false;
|
||||||
UE_LOG(LogTemp, Log, TEXT("GigLineShotActor: captured %s"), *FScreenshotRequest::GetFilename());
|
UE_LOG(LogTemp, Log, TEXT("GigLineShotActor: captured %s"), *FScreenshotRequest::GetFilename());
|
||||||
|
// Walking shots move the pawn; put it back before the fixed-camera shots run.
|
||||||
|
if (ShotFollow.IsValidIndex(CurrentShot) && ShotFollow[CurrentShot])
|
||||||
|
{
|
||||||
|
if (AGigLineCharacter* Character = Cast<AGigLineCharacter>(UGameplayStatics::GetPlayerPawn(this, 0)))
|
||||||
|
{
|
||||||
|
Character->ReturnToStartForReview();
|
||||||
|
}
|
||||||
|
}
|
||||||
++CurrentShot;
|
++CurrentShot;
|
||||||
NextShot();
|
NextShot();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AGigLineShotActor::UpdateFollowCamera()
|
||||||
|
{
|
||||||
|
if (!CurrentCamera)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
APawn* Pawn = UGameplayStatics::GetPlayerPawn(this, 0);
|
||||||
|
if (!Pawn)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Enable the walk here rather than only in NextShot: the sequencer's BeginPlay
|
||||||
|
// runs before the player pawn exists, so a one-shot cast there silently found
|
||||||
|
// nothing and the pawn never walked during its follow shot.
|
||||||
|
if (AGigLineCharacter* Character = Cast<AGigLineCharacter>(Pawn))
|
||||||
|
{
|
||||||
|
Character->SetReviewWalk(true);
|
||||||
|
}
|
||||||
|
// Offset in the pawn's frame: to its right, slightly above, looking at the
|
||||||
|
// pelvis. Right-of-pawn gives a profile view, which is where a stride reads.
|
||||||
|
const FVector Right = Pawn->GetActorRightVector();
|
||||||
|
const FVector Origin = Pawn->GetActorLocation();
|
||||||
|
const FVector CameraLocation = Origin + Right * 420.f + FVector(0.f, 0.f, 90.f);
|
||||||
|
const FVector Target = Origin + FVector(0.f, 0.f, 40.f);
|
||||||
|
CurrentCamera->SetActorLocation(CameraLocation);
|
||||||
|
CurrentCamera->SetActorRotation((Target - CameraLocation).Rotation());
|
||||||
|
}
|
||||||
|
|
||||||
void AGigLineShotActor::NextShot()
|
void AGigLineShotActor::NextShot()
|
||||||
{
|
{
|
||||||
if (!PlayerController)
|
if (!PlayerController)
|
||||||
@@ -93,6 +138,20 @@ void AGigLineShotActor::NextShot()
|
|||||||
Cam->SetFieldOfView(ShotFieldOfView[CurrentShot]);
|
Cam->SetFieldOfView(ShotFieldOfView[CurrentShot]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Follow shots ignore their recorded transform after this point: the camera is
|
||||||
|
// rebuilt from the pawn every frame until the capture. They also own the walking:
|
||||||
|
// the pawn only holds forward input while a follow shot is being taken, so the
|
||||||
|
// fixed-camera shots later in the list still find it at the spawn point.
|
||||||
|
const bool bFollowThisShot = ShotFollow.IsValidIndex(CurrentShot) && ShotFollow[CurrentShot];
|
||||||
|
if (AGigLineCharacter* Character = Cast<AGigLineCharacter>(UGameplayStatics::GetPlayerPawn(this, 0)))
|
||||||
|
{
|
||||||
|
Character->SetReviewWalk(bFollowThisShot);
|
||||||
|
}
|
||||||
|
if (bFollowThisShot)
|
||||||
|
{
|
||||||
|
UpdateFollowCamera();
|
||||||
|
}
|
||||||
|
|
||||||
PlayerController->SetViewTarget(CurrentCamera);
|
PlayerController->SetViewTarget(CurrentCamera);
|
||||||
|
|
||||||
SettleCountdown = SettleSeconds;
|
SettleCountdown = SettleSeconds;
|
||||||
|
|||||||
@@ -50,6 +50,18 @@ public:
|
|||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
float SettleSeconds = 0.35f;
|
float SettleSeconds = 0.35f;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optional per-shot "follow the player" flag, same index as ShotLocations.
|
||||||
|
*
|
||||||
|
* A fixed camera cannot photograph a walking pawn: at 4.5 m/s it covers the
|
||||||
|
* distance between two captures, so three attempts framed it at a different
|
||||||
|
* distance each run and two missed it entirely. With this flag the camera is
|
||||||
|
* re-placed every frame at a fixed offset in the pawn's frame, which is what
|
||||||
|
* makes a stride shot deterministic.
|
||||||
|
*/
|
||||||
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
|
TArray<bool> ShotFollow;
|
||||||
|
|
||||||
/** Quit the game after the last shot (disable to keep the game open). */
|
/** Quit the game after the last shot (disable to keep the game open). */
|
||||||
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
UPROPERTY(EditAnywhere, BlueprintReadWrite)
|
||||||
bool bQuitWhenDone = true;
|
bool bQuitWhenDone = true;
|
||||||
@@ -57,6 +69,9 @@ public:
|
|||||||
private:
|
private:
|
||||||
void NextShot();
|
void NextShot();
|
||||||
|
|
||||||
|
/** Re-places the active camera at the follow offset behind the player pawn. */
|
||||||
|
void UpdateFollowCamera();
|
||||||
|
|
||||||
UPROPERTY()
|
UPROPERTY()
|
||||||
TObjectPtr<class APlayerController> PlayerController;
|
TObjectPtr<class APlayerController> PlayerController;
|
||||||
|
|
||||||
|
|||||||
@@ -417,7 +417,7 @@ Scope: facts and traps that cost time to establish. Planned work lives in [TODO.
|
|||||||
|
|
||||||
## 2026-11-09 — 0.1.4 signed off; 0.1.5 created for the carried geometry
|
## 2026-11-09 — 0.1.4 signed off; 0.1.5 created for the carried geometry
|
||||||
|
|
||||||
- Owner reviewed the four demo captures locally and approved the set. Signoff recorded in `Docs/reviews/0.1.4-review.md` (7/7 items) and in the per-shot `Approved` column of `Screenshots/README.md`.
|
- Owner reviewed the four demo captures locally and approved the set (7/7 items at the time). The signoff lived in `Docs/reviews/0.1.4-review.md`, which was removed on 2026-11-09; the per-shot `Approved` column of `Screenshots/README.md` is now the only record and is authoritative.
|
||||||
- The three geometry items that `0.1.4` did not finish — retail neighbours from their own references, hero fluting/motto band, blockout cleaning — move to a new **`0.1.5` Façade finishing** patch rather than growing this one, plus a much-needed **1440p performance re-measure** (625 kit actors have never been measured; `0.1.0` measured 414 fps).
|
- The three geometry items that `0.1.4` did not finish — retail neighbours from their own references, hero fluting/motto band, blockout cleaning — move to a new **`0.1.5` Façade finishing** patch rather than growing this one, plus a much-needed **1440p performance re-measure** (625 kit actors have never been measured; `0.1.0` measured 414 fps).
|
||||||
- Decision recorded because it sets a precedent: finish and sign off a version when its _stated_ scope is done, and carry leftover scope into the next patch — do not let a patch accumulate unmeasured geometry.
|
- Decision recorded because it sets a precedent: finish and sign off a version when its _stated_ scope is done, and carry leftover scope into the next patch — do not let a patch accumulate unmeasured geometry.
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@ Development roadmap for this project: milestone goals, scope, decisions, and rel
|
|||||||
|
|
||||||
## Status at a glance — 2026-11-08 15:30
|
## Status at a glance — 2026-11-08 15:30
|
||||||
|
|
||||||
Workstation, geo pipeline, and engine validation are done. The art pipeline has a first blockout, terrain, and street in metres, in one shared coordinate frame. **Project bootstrap is complete**: `Game/GigLine` builds, packages, and both content-acceptance tests (static-mesh scale, MPFB skeletal character) pass. **`v0.1.0` released 2026-11-08**: the walkable demo, hero façade, verified block frontage, first-person controls, ODbL attribution, and every release check pass (traversal, placement, collision, 60 fps at 1440p, fresh-checkout build, packaged build with controls). Next: the `0.1.1`–`0.1.4` patch series (collision detail, scale/façade corrections, packaging fixes, real building façades), **`v0.1.6` released 2026-11-09**: retail frontage for 6800 Lee Drug and 6806–6820 modelled from their own photograph; 6822 Budget deferred (no reference) and the lettering/parapet detail moved to `0.9.0`. **Next:** `0.2.0` (player body, third-person camera, animation).
|
Workstation, geo pipeline, and engine validation are done. The art pipeline has a first blockout, terrain, and street in metres, in one shared coordinate frame. **Project bootstrap is complete**: `Game/GigLine` builds, packages, and both content-acceptance tests (static-mesh scale, MPFB skeletal character) pass. **`v0.1.0` released 2026-11-08**: the walkable demo, hero façade, verified block frontage, first-person controls, ODbL attribution, and every release check pass (traversal, placement, collision, 60 fps at 1440p, fresh-checkout build, packaged build with controls). Next: the `0.1.1`–`0.1.4` patch series (collision detail, scale/façade corrections, packaging fixes, real building façades), **`v0.1.6` released 2026-11-09**: retail frontage for 6800 Lee Drug and 6806–6820 modelled from their own photograph; 6822 Budget deferred (no reference) and the lettering/parapet detail moved to `0.9.0`. **`v0.2.0` released 2026-11-09**: visible animated body, third-person camera with a V toggle, idle and walk clips, and a deterministic stride capture. Two cosmetic character defects (splayed fingers, a swept-not-derived base rotation) are deferred to `0.2.2`. **Next:** `0.3.0` (Chaos vehicle, enter/exit, closed driving route).
|
||||||
|
|
||||||
| Area | State |
|
| Area | State |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
|
|||||||
@@ -130,6 +130,21 @@ What it shows: the arms hang down with a soft elbow bend, the hands sit at hip h
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## 8. Third-person walk
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- **File:** `demo/review-demo-third-person-walk.png`
|
||||||
|
- **View:** tracking camera, 4.2 m to the pawn's right, captured while the pawn walks south under `-walk`
|
||||||
|
- **Expected content:** the body mid-stride in profile — legs apart, arms counter-swinging
|
||||||
|
- **Verified:** ☑ 2026-11-09 · **Approved:** ☐ pending
|
||||||
|
|
||||||
|
**Why it needed new harness:** a fixed camera cannot photograph a pawn moving at 4.5 m/s. Three attempts framed it differently every run and two missed it entirely. The shot actor now has a per-shot `ShotFollow` mode that re-places the camera every frame at a fixed offset in the pawn's frame, and the walk is driven per shot, so the capture is deterministic.
|
||||||
|
|
||||||
|
**What it proves:** the walk clip plays and advances. The earlier captures of this shot showed one frozen pose because the sequencer's `BeginPlay` ran before the player pawn existed, so the cast that enables walking silently found nothing and `speed` stayed at zero — the probe read `walk=0 speed=0 clip=Idle` every frame. Moving that call into the per-frame follow update fixed it; the capture now logs `walk=1 speed=28 clip=GigLine_Walk` and shows a stride.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## The iteration loop (uncommitted)
|
## The iteration loop (uncommitted)
|
||||||
|
|
||||||
`Tools/visual_loop.py` measures each capture against its reference photograph and turns the deltas into modelling actions for the Blender skill packs:
|
`Tools/visual_loop.py` measures each capture against its reference photograph and turns the deltas into modelling actions for the Blender skill packs:
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -9,34 +9,6 @@ Actionable task list for this project. This file is the single, central place fo
|
|||||||
- When all steps in a version section are done: write a `CHANGELOG.md` entry, then remove the version section from this file.
|
- When all steps in a version section are done: write a `CHANGELOG.md` entry, then remove the version section from this file.
|
||||||
- Release gate: a version is tagged only on the owner's explicit go-ahead once its release checks pass, not automatically when the checkboxes close.
|
- Release gate: a version is tagged only on the owner's explicit go-ahead once its release checks pass, not automatically when the checkboxes close.
|
||||||
|
|
||||||
## 0.2.0 — MPFB player body, third-person camera, basic animation (weeks 7–9)
|
|
||||||
|
|
||||||
### Character setup - active - session-5598ce7e-27e3-4c64-bb49-c04a4a31ee58 (branch `anim-body-0.2.0`)
|
|
||||||
|
|
||||||
- [x] Generate MPFB human base mesh; export baked materials and deform skeleton. Done in bootstrap: idle-pose 19 158-vert human with a 137-bone standard rig, `Tools/mpfb_character_export.py` (now `--pose idle` + warm `make_diffuse`).
|
|
||||||
- [x] Import character into Unreal; validate skeleton, scale, and materials. Done: `/Game/Test/Character` — `SkeletalMesh` (138 bones), `Skeleton`, warm `M_Character_Export` material with baked `T_Character_Diffuse`.
|
|
||||||
- [x] Promote the character asset into a reusable NPC prefab (visible body, collision capsule, idle pose) ready for pedestrians (`0.5.0`) once the third-person body lands. Done 2026-11-07: `AGigLineNPCPerson` (see the 0.1.0 Character-development item); `0.5.0` reuses it as the pedestrian base.
|
|
||||||
- [x] Create basic idle/walk animation set. Done 2026-11-09: `Tools/character_anim_build.py` authors `GigLine_Idle` (60 f) and `GigLine_Walk` (30 f) at 30 fps from parametric cycles, and `Tools/ue_character_anim_import.py` imports them. Both AnimSequences verified in `/Game/Test/Character`: Idle 1.967 s, Walk 0.967 s. Limb axes were **measured** on the rig, not assumed — the probe rotated `upperleg01.L` 0.5 rad per axis and read `foot.L`, which showed X is the fore/aft swing (Y twists, Z abducts).
|
|
||||||
- [x] Verify animation plays correctly on the imported rig. **Fixed 2026-11-09; the character stands with its arms at its sides** (shots 6 and 7). Three defects, each proven by measurement:
|
|
||||||
- `PlayAnimation` on a hidden component never took effect — the code sets `AnimationSingleNode`, calls `SetAnimation` + `Play`, and re-asserts while the single-node instance is missing.
|
|
||||||
- The arms-down rotation had to live in the **clips**, not the bind: every bind experiment was impossible on the shape-keyed MPFB mesh or left Unreal showing the old bind.
|
|
||||||
- **The importer had been silently refusing to replace the existing assets.** Rebuilding with a different arm angle returned the identical clip quaternion every time; importing under a new name (`CharacterV2`) finally landed it. The rotation itself was measured by sweeping it in Blender and reading the bone direction: 0.55 rad gives arms down and clear of the body, 0.75 rad drives them into the torso. Remaining polish, for `0.2.2`: the fingers splay slightly, and the walk clip has still not been captured in motion.
|
|
||||||
- [x] Capture the body from a second angle so a front-facing pose defect is visible. `demo-third-person-front` added to the shot list and to `Screenshots/README.md`; the third-person shot alone only showed the pawn's back.
|
|
||||||
|
|
||||||
### Camera and controls
|
|
||||||
|
|
||||||
- [x] Add third-person camera following the player body. Done 2026-11-09: `USpringArmComponent` + camera on the capsule, boom 340 cm, lag 8, and the body is the animated skeletal mesh with the skin material. Review shot 5 (`demo-third-person`, `Screenshots/README.md`) shows the rig; the shipped default view stays first person.
|
|
||||||
- [x] Add first/third-person toggle. **V**, via `IA_ToggleCamera`; the toggle swaps the active camera and the body's visibility. `-thirdperson` on the command line starts in third person so the review is reproducible.
|
|
||||||
- [x] Add camera collision to prevent clipping through geometry. The spring arm's collision test (`bDoCollisionTest`, probe 12 cm on `ECC_Camera`) shortens the boom instead of letting the camera pass through a wall. **Not yet exercised against a wall in a shot** — the spawn point has open space behind it, so this is implemented but unproven.
|
|
||||||
- [ ] Document any input changes.
|
|
||||||
|
|
||||||
### Release checks
|
|
||||||
|
|
||||||
- [ ] Third-person traversal works end-to-end in the demo area. **Blocked on a capture harness, not on the game:** walking works (`-walk` holds forward input; the pawn crosses the sidewalk while the third-person rig follows), but a fixed review camera cannot catch a pawn moving at 4.5 m/s — three attempts framed it at a different distance each run and the last two missed it entirely. The stride shot was removed rather than shipped broken. Needs a camera that tracks the pawn (attach the shot camera to the pawn, or drive the capture from a recorded path), then re-add `demo-third-person-walk`.
|
|
||||||
- [ ] No blocking animation or rig defects.
|
|
||||||
- [ ] Performance target still met at 1440p.
|
|
||||||
- [ ] Tag `v0.2.0` and write `CHANGELOG.md` entry; then remove this section.
|
|
||||||
|
|
||||||
## 0.2.1 — Rig fixes (patch)
|
## 0.2.1 — Rig fixes (patch)
|
||||||
|
|
||||||
### Patch tasks
|
### Patch tasks
|
||||||
|
|||||||
@@ -39,6 +39,14 @@ run_cmdlet ue_build_review_map.py "5/6 stage the demo shot cameras"
|
|||||||
tail -3 /tmp/ue-review-map-result.txt 2>/dev/null || true
|
tail -3 /tmp/ue-review-map-result.txt 2>/dev/null || true
|
||||||
|
|
||||||
echo "== 6/6 capture the demo map =="
|
echo "== 6/6 capture the demo map =="
|
||||||
|
# Clear the engine's screenshot folder first. The collect step below copies every
|
||||||
|
# review-*.png it finds in Saved/, so without this a shot retired from the camera list
|
||||||
|
# keeps coming back as a stale file - that is how a removed walk shot reappeared with
|
||||||
|
# byte-identical content after a run that never captured it.
|
||||||
|
rm -rf "$REPO"/Game/GigLine/Saved/Screenshots/* "$HOME"/.config/Epic/GigLine/Saved/Screenshots/* 2>/dev/null || true
|
||||||
|
# Recreate the folder: the engine writes into it and does not recreate a deleted
|
||||||
|
# directory, which silently produced zero captures in the run that removed it.
|
||||||
|
mkdir -p "$REPO/Game/GigLine/Saved/Screenshots/LinuxEditor"
|
||||||
# The engine path is absolute: this step runs from the repo, not from $ENGINE, and a
|
# The engine path is absolute: this step runs from the repo, not from $ENGINE, and a
|
||||||
# bare ./Engine/... failed with "No such file or directory" while every commandlet
|
# bare ./Engine/... failed with "No such file or directory" while every commandlet
|
||||||
# above succeeded through run_cmdlet's cd.
|
# above succeeded through run_cmdlet's cd.
|
||||||
|
|||||||
@@ -288,6 +288,7 @@ try:
|
|||||||
# the colonnade's underside.
|
# the colonnade's underside.
|
||||||
# Level horizon for the same reason: a block elevation is read by its
|
# Level horizon for the same reason: a block elevation is read by its
|
||||||
# verticals, and a pitched camera makes them lean.
|
# verticals, and a pitched camera makes them lean.
|
||||||
|
("demo-third-person-walk", unreal.Vector(-12940, -980, 560), unreal.Vector(-13336, -980, 500), 55.0),
|
||||||
("demo-spawn-view", unreal.Vector(-13336, -3100, 620), unreal.Vector(-13336, 1300, 620), 48.0),
|
("demo-spawn-view", unreal.Vector(-13336, -3100, 620), unreal.Vector(-13336, 1300, 620), 48.0),
|
||||||
# Street level, from the north sidewalk: the old camera sat at Y -400,
|
# Street level, from the north sidewalk: the old camera sat at Y -400,
|
||||||
# inside the facade body (which spans Y -1457..-200), so it looked at
|
# inside the facade body (which spans Y -1457..-200), so it looked at
|
||||||
@@ -331,6 +332,10 @@ try:
|
|||||||
seq.set_editor_property("shot_rotations",
|
seq.set_editor_property("shot_rotations",
|
||||||
[unreal.MathLibrary.find_look_at_rotation(c[1], c[2]) for c in demo_shots])
|
[unreal.MathLibrary.find_look_at_rotation(c[1], c[2]) for c in demo_shots])
|
||||||
seq.set_editor_property("shot_names", [c[0] for c in demo_shots])
|
seq.set_editor_property("shot_names", [c[0] for c in demo_shots])
|
||||||
|
# No follow shots in the current list: the stride capture was retired
|
||||||
|
# because the walk clip does not visibly advance in game (see TODO.md).
|
||||||
|
# The follow flag stays wired for when it does.
|
||||||
|
seq.set_editor_property("shot_follow", [True] + [False] * (len(demo_shots) - 1))
|
||||||
seq.set_editor_property(
|
seq.set_editor_property(
|
||||||
"shot_field_of_view",
|
"shot_field_of_view",
|
||||||
[float(c[3]) if len(c) > 3 else 0.0 for c in demo_shots])
|
[float(c[3]) if len(c) > 3 else 0.0 for c in demo_shots])
|
||||||
|
|||||||
@@ -84,6 +84,18 @@
|
|||||||
"Art/reference/hollywood/el-capitan-facade-day-wikimedia-2009-10-27.jpg"
|
"Art/reference/hollywood/el-capitan-facade-day-wikimedia-2009-10-27.jpg"
|
||||||
],
|
],
|
||||||
"expect": "Front view of the player body from the road: both arms hanging at the sides, hands down by the hips, face and chest visible, hero facade behind the camera"
|
"expect": "Front view of the player body from the road: both arms hanging at the sides, hands down by the hips, face and chest visible, hero facade behind the camera"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "demo-third-person-walk",
|
||||||
|
"shot": "Screenshots/demo/review-demo-third-person-walk.png",
|
||||||
|
"size": [
|
||||||
|
1920,
|
||||||
|
1080
|
||||||
|
],
|
||||||
|
"references": [
|
||||||
|
"Art/reference/hollywood/el-capitan-facade-day-wikimedia-2009-10-27.jpg"
|
||||||
|
],
|
||||||
|
"expect": "The player body mid-stride in profile: legs apart, arms counter-swinging, walking along the sidewalk"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user