Repository navigation
Expand file tree
/
Copy pathlaige-api.json
More file actions
1312 lines (1312 loc) · 466 KB
/
Copy pathlaige-api.json
File metadata and controls
1312 lines (1312 loc) · 466 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{
"version": 1,
"generatedBy": "laige-api",
"headers": [
"src/laige-core/include/laige/alloc_watch.h",
"src/laige-core/include/laige/budget_harness.h",
"src/laige-core/include/laige/core/version.h",
"src/laige-core/include/laige/errors.h",
"src/laige-core/include/laige/fpx16_16.h",
"src/laige-core/include/laige/json.h",
"src/laige-core/include/laige/logging.h",
"src/laige-core/include/laige/pools.h",
"src/laige-core/include/laige/prng.h",
"src/laige-core/include/laige/result.h",
"src/laige-core/include/laige/sim_math.h",
"src/laige-render/include/laige/render/camera.h",
"src/laige-render/include/laige/render/depth_sort.h",
"src/laige-render/include/laige/render/frame_pipeline.h",
"src/laige-render/include/laige/render/gl_context.h",
"src/laige-render/include/laige/render/iso_camera.h",
"src/laige-render/include/laige/render/iso_depth_key.h",
"src/laige-render/include/laige/render/iso_depth_table.h",
"src/laige-render/include/laige/render/iso_picking.h",
"src/laige-render/include/laige/render/matrices.h",
"src/laige-render/include/laige/render/projection.h",
"src/laige-render/include/laige/render/sprite_batcher.h",
"src/laige-render/include/laige/render/sprite_frames.h",
"src/laige-render/include/laige/render/sprite_renderer.h",
"src/laige-render/include/laige/render/tilemap.h",
"src/laige-sim/include/laige/sim/archetype.h",
"src/laige-sim/include/laige/sim/component.h",
"src/laige-sim/include/laige/sim/config.h",
"src/laige-sim/include/laige/sim/determinism.h",
"src/laige-sim/include/laige/sim/engine.h",
"src/laige-sim/include/laige/sim/entity.h",
"src/laige-sim/include/laige/sim/frame_budget.h",
"src/laige-sim/include/laige/sim/game_loop.h",
"src/laige-sim/include/laige/sim/presentation.h",
"src/laige-sim/include/laige/sim/profiler.h",
"src/laige-sim/include/laige/sim/query.h",
"src/laige-sim/include/laige/sim/replay.h",
"src/laige-sim/include/laige/sim/replay_diff.h",
"src/laige-sim/include/laige/sim/system.h"
],
"symbols": [
{"name": "laige::AllocWatchReading", "kind": "struct", "header": "src/laige-core/include/laige/alloc_watch.h", "line": 148, "signature": "struct AllocWatchReading", "summary": "One armed-window reading (see the header preamble): the heap- allocation count since the last arm() and the call site of the first offending allocation (nullptr while none).", "budget": null, "experimental": false},
{"name": "laige::AllocWatchReading::allocs", "kind": "variable", "header": "src/laige-core/include/laige/alloc_watch.h", "line": 149, "signature": "std::uint64_t allocs{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::AllocWatchReading::firstSite", "kind": "variable", "header": "src/laige-core/include/laige/alloc_watch.h", "line": 150, "signature": "const void* firstSite{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::allocWatchArm", "kind": "function", "header": "src/laige-core/include/laige/alloc_watch.h", "line": 157, "signature": "void allocWatchArm() noexcept", "summary": "Start a fresh watch window: reset the window's allocation count and clear the first-site capture (see the header preamble for the window model, the cost, and the threading contract). O(1), no allocation.", "budget": null, "experimental": false},
{"name": "laige::allocWatchRead", "kind": "function", "header": "src/laige-core/include/laige/alloc_watch.h", "line": 161, "signature": "[[nodiscard]] AllocWatchReading allocWatchRead() noexcept", "summary": "Read the current armed window (see AllocWatchReading). O(1), no allocation.", "budget": null, "experimental": false},
{"name": "laige::allocWatchLive", "kind": "function", "header": "src/laige-core/include/laige/alloc_watch.h", "line": 167, "signature": "[[nodiscard]] bool allocWatchLive() noexcept", "summary": "True when the counting backend is compiled into this build (every non-sanitizer tree); false in the sanitizer trees, where the runtimes own operator new/delete and the watch is a no-op (the header's scope section).", "budget": null, "experimental": false},
{"name": "laige::allocWatchArm", "kind": "function", "header": "src/laige-core/include/laige/alloc_watch.h", "line": 195, "signature": "inline void allocWatchArm() noexcept", "summary": "The no-op fallback (the sanitizer trees): the counting backend is not compiled in, so an armed window never sees anything. The functions are inline no-ops — the engine's per-tick check and the test-side probes (tests/**/logging_alloc_counter.h) compile unchanged and read zero.", "budget": null, "experimental": false},
{"name": "laige::allocWatchRead", "kind": "function", "header": "src/laige-core/include/laige/alloc_watch.h", "line": 196, "signature": "inline AllocWatchReading allocWatchRead() noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::allocWatchLive", "kind": "function", "header": "src/laige-core/include/laige/alloc_watch.h", "line": 199, "signature": "inline bool allocWatchLive() noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::HistogramStats", "kind": "struct", "header": "src/laige-core/include/laige/budget_harness.h", "line": 155, "signature": "struct HistogramStats", "summary": "Summary statistics over the samples currently stored in a Histogram (rolling window). When n == 0 the six statistics are NaN (check n; budgetCheck turns an empty histogram into a loud NO_SAMPLES failure).", "budget": null, "experimental": false},
{"name": "laige::HistogramStats::n", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 156, "signature": "std::uint64_t n", "summary": null, "budget": null, "experimental": false},
{"name": "laige::HistogramStats::min", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 157, "signature": "double min", "summary": null, "budget": null, "experimental": false},
{"name": "laige::HistogramStats::mean", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 158, "signature": "double mean", "summary": null, "budget": null, "experimental": false},
{"name": "laige::HistogramStats::p50", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 159, "signature": "double p50", "summary": null, "budget": null, "experimental": false},
{"name": "laige::HistogramStats::p95", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 160, "signature": "double p95", "summary": null, "budget": null, "experimental": false},
{"name": "laige::HistogramStats::p99", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 161, "signature": "double p99", "summary": null, "budget": null, "experimental": false},
{"name": "laige::HistogramStats::max", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 162, "signature": "double max", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Histogram", "kind": "class", "header": "src/laige-core/include/laige/budget_harness.h", "line": 168, "signature": "class Histogram", "summary": "A fixed-capacity, allocation-free sample store (rolling window). See the header preamble for the full contract (window semantics, nearest-rank percentile definition, performance, threading).", "budget": null, "experimental": false},
{"name": "laige::Histogram::Options", "kind": "struct", "header": "src/laige-core/include/laige/budget_harness.h", "line": 170, "signature": "struct Options", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Histogram::Options::capacity", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 174, "signature": "std::size_t capacity = 0", "summary": "Capacity: the maximum number of samples kept. 0 is legal: every record() is dropped and stats() is always empty (useful as a churn-only counter, and as the loud-failure state for budgetCheck).", "budget": null, "experimental": false},
{"name": "laige::Histogram::Histogram", "kind": "constructor", "header": "src/laige-core/include/laige/budget_harness.h", "line": 179, "signature": "explicit Histogram(Options options) noexcept : capacity_(options.capacity), window_(options.capacity), scratch_(options.capacity), cursor_(0), count_(0), total_(0)", "summary": "Setup path: performs the two backing allocations (window + scratch sort buffer). O(capacity) time and space.", "budget": null, "experimental": false},
{"name": "laige::Histogram::Histogram", "kind": "constructor", "header": "src/laige-core/include/laige/budget_harness.h", "line": 188, "signature": "Histogram(const Histogram&) = default", "summary": "Value semantics: copy is O(capacity) (deep, cold path), move O(1).", "budget": null, "experimental": false},
{"name": "laige::Histogram::Histogram", "kind": "constructor", "header": "src/laige-core/include/laige/budget_harness.h", "line": 189, "signature": "Histogram(Histogram&&) = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Histogram::operator=", "kind": "method", "header": "src/laige-core/include/laige/budget_harness.h", "line": 190, "signature": "Histogram& operator=(const Histogram&) = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Histogram::operator=", "kind": "method", "header": "src/laige-core/include/laige/budget_harness.h", "line": 191, "signature": "Histogram& operator=(Histogram&&) = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Histogram::record", "kind": "method", "header": "src/laige-core/include/laige/budget_harness.h", "line": 197, "signature": "void record(double value) noexcept", "summary": "Record one sample (unit: whatever the caller measures — typically milliseconds from a TimeIt). O(1), no allocation, no lock, noexcept. When the window is full the oldest sample is dropped; totalRecorded() keeps counting, so truncation is observable.", "budget": null, "experimental": false},
{"name": "laige::Histogram::reset", "kind": "method", "header": "src/laige-core/include/laige/budget_harness.h", "line": 207, "signature": "void reset() noexcept", "summary": "Drop every stored sample (count -> 0). totalRecorded() survives (since-construction churn; per-frame profilers diff it). Idempotent.", "budget": null, "experimental": false},
{"name": "laige::Histogram::count", "kind": "method", "header": "src/laige-core/include/laige/budget_harness.h", "line": 213, "signature": "[[nodiscard]] std::uint64_t count() const noexcept", "summary": "Samples currently stored in the window (<= capacity).", "budget": null, "experimental": false},
{"name": "laige::Histogram::totalRecorded", "kind": "method", "header": "src/laige-core/include/laige/budget_harness.h", "line": 216, "signature": "[[nodiscard]] std::uint64_t totalRecorded() const noexcept", "summary": "Samples recorded since construction, including dropped ones (churn).", "budget": null, "experimental": false},
{"name": "laige::Histogram::stats", "kind": "method", "header": "src/laige-core/include/laige/budget_harness.h", "line": 222, "signature": "[[nodiscard]] HistogramStats stats() const", "summary": "Exact statistics over the stored window (nearest-rank percentiles — see the preamble). Cold path: O(n log n) time, no allocation (sorts the pre-allocated scratch buffer; logically const — scratch_ is a reusable work buffer, not state).", "budget": null, "experimental": false},
{"name": "laige::TimeIt", "kind": "class", "header": "src/laige-core/include/laige/budget_harness.h", "line": 282, "signature": "class TimeIt", "summary": "A scope timer over std::chrono::steady_clock (monotonic — see the preamble). Milliseconds as a double. No allocation, no lock.", "budget": null, "experimental": false},
{"name": "laige::TimeIt::TimeIt", "kind": "constructor", "header": "src/laige-core/include/laige/budget_harness.h", "line": 285, "signature": "TimeIt() noexcept : start_(std::chrono::steady_clock::now())", "summary": "Starts the scope now.", "budget": null, "experimental": false},
{"name": "laige::TimeIt::reset", "kind": "method", "header": "src/laige-core/include/laige/budget_harness.h", "line": 288, "signature": "void reset() noexcept", "summary": "Restarts the scope (owner thread only).", "budget": null, "experimental": false},
{"name": "laige::TimeIt::elapsedMs", "kind": "method", "header": "src/laige-core/include/laige/budget_harness.h", "line": 291, "signature": "[[nodiscard]] double elapsedMs() const noexcept", "summary": "Elapsed time in milliseconds since construction/reset.", "budget": null, "experimental": false},
{"name": "laige::BudgetMetric", "kind": "enum", "header": "src/laige-core/include/laige/budget_harness.h", "line": 307, "signature": "enum class BudgetMetric : std::uint8_t", "summary": "The statistic of a Histogram that a budget entry checks.", "budget": null, "experimental": false},
{"name": "laige::BudgetMetric::Mean", "kind": "enumerator", "header": "src/laige-core/include/laige/budget_harness.h", "line": 307, "signature": "Mean", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetMetric::Min", "kind": "enumerator", "header": "src/laige-core/include/laige/budget_harness.h", "line": 307, "signature": "Min", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetMetric::Max", "kind": "enumerator", "header": "src/laige-core/include/laige/budget_harness.h", "line": 307, "signature": "Max", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetMetric::P50", "kind": "enumerator", "header": "src/laige-core/include/laige/budget_harness.h", "line": 307, "signature": "P50", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetMetric::P95", "kind": "enumerator", "header": "src/laige-core/include/laige/budget_harness.h", "line": 307, "signature": "P95", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetMetric::P99", "kind": "enumerator", "header": "src/laige-core/include/laige/budget_harness.h", "line": 307, "signature": "P99", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetEntry", "kind": "struct", "header": "src/laige-core/include/laige/budget_harness.h", "line": 311, "signature": "struct BudgetEntry", "summary": "One named budget from budgets.json (PRD 8.1 row -> entry). See the preamble for the target/measured/unit/metric contract.", "budget": null, "experimental": false},
{"name": "laige::BudgetEntry::name", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 312, "signature": "std::string name", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetEntry::metric", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 313, "signature": "BudgetMetric metric", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetEntry::unit", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 314, "signature": "std::string unit", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetEntry::target", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 315, "signature": "double target", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetEntry::measured", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 316, "signature": "double measured", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetEntry::workload", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 317, "signature": "std::string workload", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetTable", "kind": "class", "header": "src/laige-core/include/laige/budget_harness.h", "line": 323, "signature": "class BudgetTable", "summary": "The parsed budgets.json (schema v1). Immutable after loading; safe to read from any thread. Small by design (one row per PRD 8.1 budget): find() is a linear scan on the cold path (no hash map, PERF-006).", "budget": null, "experimental": false},
{"name": "laige::BudgetTable::BudgetTable", "kind": "constructor", "header": "src/laige-core/include/laige/budget_harness.h", "line": 325, "signature": "BudgetTable() = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetTable::size", "kind": "method", "header": "src/laige-core/include/laige/budget_harness.h", "line": 327, "signature": "[[nodiscard]] std::size_t size() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetTable::entries", "kind": "method", "header": "src/laige-core/include/laige/budget_harness.h", "line": 330, "signature": "[[nodiscard]] const std::vector<BudgetEntry>& entries() const noexcept", "summary": "The entries in file order.", "budget": null, "experimental": false},
{"name": "laige::BudgetTable::find", "kind": "method", "header": "src/laige-core/include/laige/budget_harness.h", "line": 335, "signature": "[[nodiscard]] const BudgetEntry* find(std::string_view name) const noexcept", "summary": "The entry with the given name, or nullptr when absent.", "budget": null, "experimental": false},
{"name": "laige::BudgetReportContext", "kind": "struct", "header": "src/laige-core/include/laige/budget_harness.h", "line": 350, "signature": "struct BudgetReportContext", "summary": "Caller-supplied context for the AGENTS 12 report fields the harness cannot know (machine/build facts). The caller (benchmark runner / operator) fills these; budgetCheck formats them verbatim into the report (diagnostic text, not engine state). Defaults to all-empty.", "budget": null, "experimental": false},
{"name": "laige::BudgetReportContext::workload", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 351, "signature": "const char* workload = \"\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetReportContext::build", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 352, "signature": "const char* build = \"\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetReportContext::machine", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 353, "signature": "const char* machine = \"\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetReportContext::warmup", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 354, "signature": "std::uint32_t warmup = 0", "summary": null, "budget": null, "experimental": false},
{"name": "laige::formatStatsLine", "kind": "function", "header": "src/laige-core/include/laige/budget_harness.h", "line": 363, "signature": "[[nodiscard]] std::string formatStatsLine(const HistogramStats& s)", "summary": "The stable one-line text form of a HistogramStats value: `stats: n=<n> min=<v> mean=<v> p50=<v> p95=<v> p99=<v> max=<v>` (6 significant digits, locale-free; \"nan\" for an empty histogram). The report lines of budgetCheck and the laige-bench tool both use this, so the stats text has one source (LOG-001 stable fields). Cold path: allocates one string.", "budget": null, "experimental": false},
{"name": "laige::BudgetCheckResult", "kind": "struct", "header": "src/laige-core/include/laige/budget_harness.h", "line": 367, "signature": "struct BudgetCheckResult", "summary": "The outcome of a budget check plus the formatted AGENTS 12 report (stable multi-line text; format in docs/api/budget_harness.md).", "budget": null, "experimental": false},
{"name": "laige::BudgetCheckResult::passed", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 368, "signature": "bool passed", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetCheckResult::measured", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 369, "signature": "double measured", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetCheckResult::target", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 371, "signature": "double target", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetCheckResult::before", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 372, "signature": "double before", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetCheckResult::report", "kind": "variable", "header": "src/laige-core/include/laige/budget_harness.h", "line": 373, "signature": "std::string report", "summary": null, "budget": null, "experimental": false},
{"name": "laige::loadBudgets", "kind": "function", "header": "src/laige-core/include/laige/budget_harness.h", "line": 386, "signature": "[[nodiscard]] Result<BudgetTable, ErrorCode> loadBudgets(std::string_view path)", "summary": "Loads and validates budgets.json (schema v1) from `path`.", "budget": null, "experimental": false},
{"name": "laige::budgetCheck", "kind": "function", "header": "src/laige-core/include/laige/budget_harness.h", "line": 395, "signature": "[[nodiscard]] BudgetCheckResult budgetCheck(const BudgetEntry& entry, const Histogram& histogram, const BudgetReportContext& context = {})", "summary": "Checks `entry` against `histogram` (semantics in the preamble: NO_SAMPLES / target>0 at-most / target==0 hard zero). before/after are entry.measured / the current measurement (the AGENTS 12 before/after pair). Cold path: O(n log n) (the stats pass) plus report string building (allocates — reporting is never a hot path). Thread-safe on const inputs; the histogram must not be mutated concurrently (CONC-001 single-owner rule).", "budget": null, "experimental": false},
{"name": "laige::core::kMajor", "kind": "variable", "header": "src/laige-core/include/laige/core/version.h", "line": 15, "signature": "inline constexpr int kMajor = 0", "summary": "Semver components of the laige-core module (0 = not yet released).", "budget": null, "experimental": false},
{"name": "laige::core::kMinor", "kind": "variable", "header": "src/laige-core/include/laige/core/version.h", "line": 16, "signature": "inline constexpr int kMinor = 0", "summary": null, "budget": null, "experimental": false},
{"name": "laige::core::kPatch", "kind": "variable", "header": "src/laige-core/include/laige/core/version.h", "line": 17, "signature": "inline constexpr int kPatch = 0", "summary": null, "budget": null, "experimental": false},
{"name": "laige::core::versionString", "kind": "function", "header": "src/laige-core/include/laige/core/version.h", "line": 24, "signature": "[[nodiscard]] const char* versionString()", "summary": "\"MAJOR.MINOR.PATCH\", rendered once on first call.", "budget": null, "experimental": false},
{"name": "laige::ErrorCode", "kind": "enum", "header": "src/laige-core/include/laige/errors.h", "line": 31, "signature": "enum class ErrorCode : std::uint32_t", "summary": "Stable error codes. The enumerator values are part of the stability contract (PRD §9.4): never renumber, never reuse.", "budget": null, "experimental": false},
{"name": "laige::ErrorCode::Unknown", "kind": "enumerator", "header": "src/laige-core/include/laige/errors.h", "line": 32, "signature": "Unknown = 1", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ErrorCode::InvalidArgument", "kind": "enumerator", "header": "src/laige-core/include/laige/errors.h", "line": 33, "signature": "InvalidArgument = 2", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ErrorCode::MalformedInput", "kind": "enumerator", "header": "src/laige-core/include/laige/errors.h", "line": 34, "signature": "MalformedInput = 3", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ErrorCode::BudgetExhausted", "kind": "enumerator", "header": "src/laige-core/include/laige/errors.h", "line": 35, "signature": "BudgetExhausted = 4", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ErrorCode::IoError", "kind": "enumerator", "header": "src/laige-core/include/laige/errors.h", "line": 36, "signature": "IoError = 5", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ErrorCode::GlUnavailable", "kind": "enumerator", "header": "src/laige-core/include/laige/errors.h", "line": 40, "signature": "GlUnavailable = 6", "summary": "M2-GL-01 (laige-render): a usable OpenGL context could not be created — no windowing backend (GLFW/EGL), context creation failed, the GL library could not be loaded, or the offscreen FBO failed.", "budget": null, "experimental": false},
{"name": "laige::ErrorCode::GlVersionUnsupported", "kind": "enumerator", "header": "src/laige-core/include/laige/errors.h", "line": 44, "signature": "GlVersionUnsupported = 7", "summary": "M2-GL-01 (laige-render): a GL context was created but does not meet the engine's OpenGL 3.3 core requirement (PRD §6) — an older version or the compatibility profile. There is no fallback.", "budget": null, "experimental": false},
{"name": "laige::ErrorEntry", "kind": "struct", "header": "src/laige-core/include/laige/errors.h", "line": 52, "signature": "struct ErrorEntry", "summary": "One registry entry per stable code. `text` is the pre-rendered NFR-13.3 line; it MUST be exactly \"codeId | whatFailed | why | fix | docAnchor\". The result_status suite cross-checks `text` against the other fields and re-parses it, so drift or a broken grammar fails the test run loudly (CORE-006: docs, tests, and code ship together).", "budget": null, "experimental": false},
{"name": "laige::ErrorEntry::code", "kind": "variable", "header": "src/laige-core/include/laige/errors.h", "line": 53, "signature": "ErrorCode code", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ErrorEntry::codeId", "kind": "variable", "header": "src/laige-core/include/laige/errors.h", "line": 54, "signature": "const char* codeId", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ErrorEntry::whatFailed", "kind": "variable", "header": "src/laige-core/include/laige/errors.h", "line": 55, "signature": "const char* whatFailed", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ErrorEntry::why", "kind": "variable", "header": "src/laige-core/include/laige/errors.h", "line": 56, "signature": "const char* why", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ErrorEntry::fix", "kind": "variable", "header": "src/laige-core/include/laige/errors.h", "line": 57, "signature": "const char* fix", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ErrorEntry::docAnchor", "kind": "variable", "header": "src/laige-core/include/laige/errors.h", "line": 58, "signature": "const char* docAnchor", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ErrorEntry::text", "kind": "variable", "header": "src/laige-core/include/laige/errors.h", "line": 59, "signature": "const char* text", "summary": null, "budget": null, "experimental": false},
{"name": "laige::errorInfo", "kind": "function", "header": "src/laige-core/include/laige/errors.h", "line": 65, "signature": "[[nodiscard]] const ErrorEntry& errorInfo(ErrorCode code)", "summary": "The registry entry for `code`. Unregistered values — including 0, the no-error sentinel — map to the `unknown` entry. Complexity O(1); no allocation; thread-safe.", "budget": null, "experimental": false},
{"name": "laige::errorName", "kind": "function", "header": "src/laige-core/include/laige/errors.h", "line": 69, "signature": "[[nodiscard]] const char* errorName(ErrorCode code)", "summary": "The stable identifier (grammar field 1) for `code`. Complexity O(1); no allocation; thread-safe.", "budget": null, "experimental": false},
{"name": "laige::errorText", "kind": "function", "header": "src/laige-core/include/laige/errors.h", "line": 75, "signature": "[[nodiscard]] const char* errorText(ErrorCode code)", "summary": "The pre-rendered NFR-13.3 line for `code`: \"{codeId} | {whatFailed} | {why} | {fix} | {docAnchor}\". Complexity O(1); no allocation; thread-safe; safe to hand to the logging facade (LOG-002).", "budget": null, "experimental": false},
{"name": "laige::fpx16_16", "kind": "class", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 97, "signature": "class fpx16_16", "summary": null, "budget": null, "experimental": false},
{"name": "laige::fpx16_16::raw", "kind": "variable", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 101, "signature": "std::int32_t raw{}", "summary": "Q16.16 raw units: value = raw / 2^16. Public for inspection and serialization; treat as opaque outside the helpers below.", "budget": null, "experimental": false},
{"name": "laige::fpx16_16::kMinRaw", "kind": "variable", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 105, "signature": "static constexpr std::int32_t kMinRaw = std::numeric_limits<std::int32_t>::min()", "summary": "-2^16 = -32768.0 and +2^16 - 2^-16 = +32767.99998474.", "budget": null, "experimental": false},
{"name": "laige::fpx16_16::kMaxRaw", "kind": "variable", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 107, "signature": "static constexpr std::int32_t kMaxRaw = std::numeric_limits<std::int32_t>::max()", "summary": null, "budget": null, "experimental": false},
{"name": "laige::fpx16_16::min", "kind": "method", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 110, "signature": "static constexpr fpx16_16 min() noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::fpx16_16::max", "kind": "method", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 111, "signature": "static constexpr fpx16_16 max() noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::fpx16_16::one", "kind": "method", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 112, "signature": "static constexpr fpx16_16 one() noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::fpx16_16::operator<=>", "kind": "method", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 115, "signature": "constexpr auto operator<=>(const fpx16_16&) const noexcept = default", "summary": "Total order (no NaN: every pair of Q16.16 values is comparable).", "budget": null, "experimental": false},
{"name": "laige::fpx16_16::add", "kind": "method", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 121, "signature": "static constexpr fpx16_16 add(fpx16_16 a, fpx16_16 b) noexcept", "summary": "a + b, saturating. The exact sum |a.raw + b.raw| ≤ 2^32 fits int64_t (no overflow — CPP-004).", "budget": null, "experimental": false},
{"name": "laige::fpx16_16::sub", "kind": "method", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 126, "signature": "static constexpr fpx16_16 sub(fpx16_16 a, fpx16_16 b) noexcept", "summary": "a - b, saturating. The exact difference fits int64_t.", "budget": null, "experimental": false},
{"name": "laige::fpx16_16::mul", "kind": "method", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 132, "signature": "static constexpr fpx16_16 mul(fpx16_16 a, fpx16_16 b) noexcept", "summary": "a * b, round-to-nearest ties-to-even, saturating. The exact product |a.raw * b.raw| ≤ 2^62 fits int64_t.", "budget": null, "experimental": false},
{"name": "laige::fpx16_16::div", "kind": "method", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 138, "signature": "static fpx16_16 div(fpx16_16 a, fpx16_16 b) noexcept", "summary": "a / b, round-to-nearest ties-to-even, saturating. Division by zero is defined (never traps): x/0 → ±max() (sign of x), 0/0 → +0.", "budget": null, "experimental": false},
{"name": "laige::fpx16_16::negate", "kind": "method", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 158, "signature": "static constexpr fpx16_16 negate(fpx16_16 a) noexcept", "summary": "-a, saturating: negate(min()) == max() because -(-2^16) is not representable. Equivalent to SimMath::sub(Scalar{}, a).", "budget": null, "experimental": false},
{"name": "laige::fpx16_16::sqrt", "kind": "method", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 165, "signature": "static fpx16_16 sqrt(fpx16_16 a) noexcept", "summary": "sqrt(a), round-to-nearest (no exact ties exist — see the header preamble), saturating. sqrt of a negative value is defined as +0 (the fixed-point analogue of the IEEE domain error, with no NaN).", "budget": null, "experimental": false},
{"name": "laige::fpx16_16::fromInt32", "kind": "method", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 182, "signature": "static constexpr fpx16_16 fromInt32(std::int32_t v) noexcept", "summary": "int32_t → Q16.16, exact for |v| ≤ 32768 (v = -32768 maps exactly to min()); saturates outside the Q16.16 range (defined — no UB for any input, CPP-004).", "budget": null, "experimental": false},
{"name": "laige::fpx16_16::toInt32", "kind": "method", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 191, "signature": "static constexpr std::int32_t toInt32(fpx16_16 x) noexcept", "summary": "Q16.16 → int32_t, round-to-nearest ties-to-even. The result lies in [-32768, 32768] and always fits int32_t.", "budget": null, "experimental": false},
{"name": "laige::fpx16_16::toFloat", "kind": "method", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 197, "signature": "static float toFloat(fpx16_16 x) noexcept", "summary": "Q16.16 → float: one rounding (raw → nearest binary32), then the exact power-of-two scale 2^-16 (exact exponent adjustment).", "budget": null, "experimental": false},
{"name": "laige::fpx16_16::fromFloat", "kind": "method", "header": "src/laige-core/include/laige/fpx16_16.h", "line": 203, "signature": "static fpx16_16 fromFloat(float v) noexcept", "summary": "float → Q16.16: NaN → +0 (defined); ±inf and |v| ≥ 32768 saturate; otherwise one rounding of the exact scale v * 2^16, ties-to-even.", "budget": null, "experimental": false},
{"name": "laige::JsonKind", "kind": "enum", "header": "src/laige-core/include/laige/json.h", "line": 150, "signature": "enum class JsonKind : std::uint8_t", "summary": "The six JSON value kinds (RFC 8259).", "budget": null, "experimental": false},
{"name": "laige::JsonKind::Null", "kind": "enumerator", "header": "src/laige-core/include/laige/json.h", "line": 151, "signature": "Null", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonKind::Bool", "kind": "enumerator", "header": "src/laige-core/include/laige/json.h", "line": 152, "signature": "Bool", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonKind::Number", "kind": "enumerator", "header": "src/laige-core/include/laige/json.h", "line": 153, "signature": "Number", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonKind::String", "kind": "enumerator", "header": "src/laige-core/include/laige/json.h", "line": 154, "signature": "String", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonKind::Array", "kind": "enumerator", "header": "src/laige-core/include/laige/json.h", "line": 155, "signature": "Array", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonKind::Object", "kind": "enumerator", "header": "src/laige-core/include/laige/json.h", "line": 156, "signature": "Object", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonOptions", "kind": "struct", "header": "src/laige-core/include/laige/json.h", "line": 163, "signature": "struct JsonOptions", "summary": "Parse bounds (ADR 0003). The defaults are the documented ones; engine code may tighten (or, in principle, loosen) them per parse call. maxDepth <= 0 rejects every container; maxDocumentBytes is a bound on the raw input bytes.", "budget": null, "experimental": false},
{"name": "laige::JsonOptions::maxDocumentBytes", "kind": "variable", "header": "src/laige-core/include/laige/json.h", "line": 164, "signature": "std::size_t maxDocumentBytes = static_cast<std::size_t>(1u) << 20", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonOptions::maxDepth", "kind": "variable", "header": "src/laige-core/include/laige/json.h", "line": 165, "signature": "int maxDepth = 32", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue", "kind": "class", "header": "src/laige-core/include/laige/json.h", "line": 171, "signature": "class JsonValue", "summary": "A parsed (or hand-built) JSON document. See the preamble for the full contract: grammar, bounds, number semantics, ownership, threading, equality, performance, and error behavior.", "budget": null, "experimental": false},
{"name": "laige::JsonValue::JsonValue", "kind": "constructor", "header": "src/laige-core/include/laige/json.h", "line": 174, "signature": "JsonValue() noexcept = default", "summary": "The Null value.", "budget": null, "experimental": false},
{"name": "laige::JsonValue::JsonValue", "kind": "constructor", "header": "src/laige-core/include/laige/json.h", "line": 181, "signature": "JsonValue(const JsonValue& other) noexcept", "summary": "Value semantics (preamble): copy is deep (O(size), allocates); move is O(1) and leaves the moved-from value Null. Copy assignment and move assignment release this value's old payload first, so the \"owns exactly the payload its kind names\" invariant holds across assignment, not just across kind-changing mutation.", "budget": null, "experimental": false},
{"name": "laige::JsonValue::operator=", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 182, "signature": "JsonValue& operator=(const JsonValue& other) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::JsonValue", "kind": "constructor", "header": "src/laige-core/include/laige/json.h", "line": 183, "signature": "JsonValue(JsonValue&& other) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::operator=", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 184, "signature": "JsonValue& operator=(JsonValue&& other) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::fromBool", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 188, "signature": "[[nodiscard]] static JsonValue fromBool(bool value) noexcept", "summary": "Factories (the engine builds with -fno-exceptions: a failed allocation terminates the process, it never throws).", "budget": null, "experimental": false},
{"name": "laige::JsonValue::fromNumber", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 189, "signature": "[[nodiscard]] static JsonValue fromNumber(double value) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::fromString", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 190, "signature": "[[nodiscard]] static JsonValue fromString(std::string_view value) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::makeArray", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 191, "signature": "[[nodiscard]] static JsonValue makeArray() noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::makeObject", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 192, "signature": "[[nodiscard]] static JsonValue makeObject() noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::kind", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 195, "signature": "[[nodiscard]] JsonKind kind() const noexcept", "summary": "Kind queries.", "budget": null, "experimental": false},
{"name": "laige::JsonValue::isNull", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 196, "signature": "[[nodiscard]] bool isNull() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::isBool", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 197, "signature": "[[nodiscard]] bool isBool() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::isNumber", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 198, "signature": "[[nodiscard]] bool isNumber() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::isString", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 199, "signature": "[[nodiscard]] bool isString() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::isArray", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 200, "signature": "[[nodiscard]] bool isArray() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::isObject", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 201, "signature": "[[nodiscard]] bool isObject() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::asBool", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 205, "signature": "[[nodiscard]] bool asBool() const noexcept", "summary": "Kind accessors. Precondition: the matching kind (debug assert; documented undefined behavior in release).", "budget": null, "experimental": false},
{"name": "laige::JsonValue::asNumber", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 206, "signature": "[[nodiscard]] double asNumber() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::asString", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 207, "signature": "[[nodiscard]] std::string_view asString() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::asArray", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 208, "signature": "[[nodiscard]] const std::vector<JsonValue>& asArray() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::asObject", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 209, "signature": "[[nodiscard]] const std::vector<std::pair<std::string, JsonValue>>& asObject() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::findMember", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 214, "signature": "[[nodiscard]] const JsonValue* findMember(std::string_view name) const noexcept", "summary": "Null-safe object lookups (total on any value): nullptr / false when this is not an object or the member is absent.", "budget": null, "experimental": false},
{"name": "laige::JsonValue::hasMember", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 215, "signature": "[[nodiscard]] bool hasMember(std::string_view name) const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::setNull", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 222, "signature": "void setNull() noexcept", "summary": "Mutations. The setX() forms make this the given kind/value, releasing the old payload first. append()/setMember() require the matching container kind (debug assert; documented undefined behavior in release). setMember() replaces an existing member in place (position preserved) or appends it.", "budget": null, "experimental": false},
{"name": "laige::JsonValue::setBool", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 223, "signature": "void setBool(bool value) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::setNumber", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 224, "signature": "void setNumber(double value) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::setString", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 225, "signature": "void setString(std::string_view value) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::append", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 226, "signature": "void append(JsonValue element)", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::setMember", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 227, "signature": "void setMember(std::string_view name, JsonValue value)", "summary": null, "budget": null, "experimental": false},
{"name": "laige::JsonValue::operator==", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 231, "signature": "[[nodiscard]] bool operator==(const JsonValue& other) const noexcept", "summary": "Deep structural equality (see the preamble: objects order-insensitive, arrays order-sensitive, NaN != NaN).", "budget": null, "experimental": false},
{"name": "laige::JsonValue::operator!=", "kind": "method", "header": "src/laige-core/include/laige/json.h", "line": 232, "signature": "[[nodiscard]] bool operator!=(const JsonValue& other) const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::parseJson", "kind": "function", "header": "src/laige-core/include/laige/json.h", "line": 255, "signature": "[[nodiscard]] Result<JsonValue> parseJson(std::string_view input, JsonOptions options = {})", "summary": "Parses exactly one JSON document from `input` (the whole view must be consumed; trailing non-whitespace is MalformedInput). Bounded by `options` (defaults: 1 MiB, depth 32 — see the preamble). Every failure is ErrorCode::MalformedInput; a failed parse produces no value.", "budget": null, "experimental": false},
{"name": "laige::serializeJson", "kind": "function", "header": "src/laige-core/include/laige/json.h", "line": 267, "signature": "[[nodiscard]] std::string serializeJson(const JsonValue& value)", "summary": "Serializes `value` to canonical compact JSON (no insignificant whitespace): strings ASCII-safe (\\uXXXX for control characters and every codepoint above 0x7F; the two-character escapes for the six printable ones), numbers shortest-round-trip decimal (see the preamble), objects and arrays in stored order. Precondition: no Number holding NaN or +/-inf anywhere in the value (debug assert; documented undefined behavior in release). Cold path: allocates one output string plus recursive calls per nesting level.", "budget": null, "experimental": false},
{"name": "laige::log::Severity", "kind": "enum", "header": "src/laige-core/include/laige/logging.h", "line": 95, "signature": "enum class Severity : std::uint8_t", "summary": "Event severity. Contract per level (AGENTS.md §14): Trace very high-volume diagnostic detail; disabled by default Debug developer-facing state Info low-volume lifecycle / significant state transitions Warn degraded behavior the engine recovered from Error an operation or subsystem failed Fatal continued execution is unsafe: the facade records the event, flushes, and terminates the process (std::abort) — controlled termination after preserving diagnostics", "budget": null, "experimental": false},
{"name": "laige::log::Severity::Trace", "kind": "enumerator", "header": "src/laige-core/include/laige/logging.h", "line": 96, "signature": "Trace = 0", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Severity::Debug", "kind": "enumerator", "header": "src/laige-core/include/laige/logging.h", "line": 97, "signature": "Debug = 1", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Severity::Info", "kind": "enumerator", "header": "src/laige-core/include/laige/logging.h", "line": 98, "signature": "Info = 2", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Severity::Warn", "kind": "enumerator", "header": "src/laige-core/include/laige/logging.h", "line": 99, "signature": "Warn = 3", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Severity::Error", "kind": "enumerator", "header": "src/laige-core/include/laige/logging.h", "line": 100, "signature": "Error = 4", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Severity::Fatal", "kind": "enumerator", "header": "src/laige-core/include/laige/logging.h", "line": 101, "signature": "Fatal = 5", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Level", "kind": "enum", "header": "src/laige-core/include/laige/logging.h", "line": 108, "signature": "enum class Level : std::uint8_t", "summary": "Minimum-severity filter, used either logger-wide (global minimum) or for one subsystem (per-subsystem scope, FR-12.2). An event is recorded only when severity >= the applicable level. Off disables everything (the cheap switch for release/server profiles).", "budget": null, "experimental": false},
{"name": "laige::log::Level::Trace", "kind": "enumerator", "header": "src/laige-core/include/laige/logging.h", "line": 109, "signature": "Trace = 0", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Level::Debug", "kind": "enumerator", "header": "src/laige-core/include/laige/logging.h", "line": 110, "signature": "Debug = 1", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Level::Info", "kind": "enumerator", "header": "src/laige-core/include/laige/logging.h", "line": 111, "signature": "Info = 2", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Level::Warn", "kind": "enumerator", "header": "src/laige-core/include/laige/logging.h", "line": 112, "signature": "Warn = 3", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Level::Error", "kind": "enumerator", "header": "src/laige-core/include/laige/logging.h", "line": 113, "signature": "Error = 4", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Level::Fatal", "kind": "enumerator", "header": "src/laige-core/include/laige/logging.h", "line": 114, "signature": "Fatal = 5", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Level::Off", "kind": "enumerator", "header": "src/laige-core/include/laige/logging.h", "line": 115, "signature": "Off = 6", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::severityName", "kind": "function", "header": "src/laige-core/include/laige/logging.h", "line": 120, "signature": "[[nodiscard]] inline const char* severityName(Severity severity) noexcept", "summary": "The stable lowercase token for a severity, as rendered in log lines. O(1), no allocation, thread-safe.", "budget": null, "experimental": false},
{"name": "laige::log::kRateLimitedEvent", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 134, "signature": "inline constexpr const char* kRateLimitedEvent = \"rate_limited\"", "summary": "The stable event name of the rate-limit summary (LOG-001: machine searchable). A summary reports suppressed repeats of another event.", "budget": null, "experimental": false},
{"name": "laige::log::Field", "kind": "struct", "header": "src/laige-core/include/laige/logging.h", "line": 147, "signature": "struct Field", "summary": "One structured key/value pair of a log event.", "budget": null, "experimental": false},
{"name": "laige::log::Field::name", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 148, "signature": "std::string_view name", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Field::value", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 149, "signature": "std::string value", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::field", "kind": "function", "header": "src/laige-core/include/laige/logging.h", "line": 206, "signature": "template <typename T> Field field(std::string_view name, const T& value)", "summary": "Build a log field from a scalar value (see Field).", "budget": null, "experimental": false},
{"name": "laige::log::LogRecord", "kind": "struct", "header": "src/laige-core/include/laige/logging.h", "line": 233, "signature": "struct LogRecord", "summary": "One recorded log event — what a Sink receives.", "budget": null, "experimental": false},
{"name": "laige::log::LogRecord::timestamp", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 238, "signature": "std::chrono::system_clock::time_point timestamp", "summary": "One documented clock (AGENTS §14): std::chrono::system_clock, rendered by the sinks in UTC as \"YYYY-MM-DDTHH:MM:SS.ffffffZ\" (RFC 3339). Diagnostics only — never part of authoritative state (ARCH-009).", "budget": null, "experimental": false},
{"name": "laige::log::LogRecord::severity", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 239, "signature": "Severity severity", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::LogRecord::subsystem", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 240, "signature": "std::string_view subsystem", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::LogRecord::event", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 241, "signature": "std::string_view event", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::LogRecord::message", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 242, "signature": "std::string_view message", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::LogRecord::fields", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 243, "signature": "std::span<const Field> fields", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::LogRecord::threadId", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 246, "signature": "std::uint32_t threadId", "summary": "Emitting-thread identity (std::hash of std::thread::id; the \"thread or job identity\" field of AGENTS §14).", "budget": null, "experimental": false},
{"name": "laige::log::Sink", "kind": "class", "header": "src/laige-core/include/laige/logging.h", "line": 261, "signature": "class Sink", "summary": "A replaceable logging backend (FR-12.2: sink-swappable).", "budget": null, "experimental": false},
{"name": "laige::log::Sink::~Sink", "kind": "destructor", "header": "src/laige-core/include/laige/logging.h", "line": 263, "signature": "virtual ~Sink() = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Sink::emit", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 264, "signature": "virtual void emit(const LogRecord& record) = 0", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Sink::flush", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 265, "signature": "virtual void flush() = 0", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::ConsoleSink", "kind": "class", "header": "src/laige-core/include/laige/logging.h", "line": 275, "signature": "class ConsoleSink : public Sink", "summary": "Sink writing one line per event to a std::FILE stream (default: stderr). The sink does NOT own the stream — it never fopens or fcloses it (a ConsoleSink(stderr) must outlive the process and the process must keep stderr usable for crash diagnostics).", "budget": null, "experimental": false},
{"name": "laige::log::ConsoleSink::ConsoleSink", "kind": "constructor", "header": "src/laige-core/include/laige/logging.h", "line": 277, "signature": "explicit ConsoleSink(std::FILE* stream) : stream_(stream)", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::ConsoleSink::~ConsoleSink", "kind": "destructor", "header": "src/laige-core/include/laige/logging.h", "line": 278, "signature": "~ConsoleSink() override", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::ConsoleSink::emit", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 280, "signature": "void emit(const LogRecord& record) override", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::ConsoleSink::flush", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 281, "signature": "void flush() override", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::ConsoleSink::failedWrites", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 284, "signature": "[[nodiscard]] std::uint64_t failedWrites() const noexcept", "summary": "Records whose line could not be written (0 = healthy).", "budget": null, "experimental": false},
{"name": "laige::log::FileSink", "kind": "class", "header": "src/laige-core/include/laige/logging.h", "line": 300, "signature": "class FileSink : public Sink", "summary": "Sink appending one line per event to a file.", "budget": null, "experimental": false},
{"name": "laige::log::FileSink::create", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 309, "signature": "[[nodiscard]] static laige::Result<std::unique_ptr<FileSink>> create(std::string path)", "summary": "Opens `path` in binary append mode (platform-stable on-disk format: LF-terminated lines, no Windows text-mode CRLF translation) with plain-`fopen` sharing semantics: the file may be opened read-only concurrently — even by the same process — on every platform, including Windows (where the secure `fopen_s` would deny even that). Never throws (NFR-8.10): a failed open is a Status carrying ErrorCode::IoError.", "budget": null, "experimental": false},
{"name": "laige::log::FileSink::~FileSink", "kind": "destructor", "header": "src/laige-core/include/laige/logging.h", "line": 312, "signature": "~FileSink() override", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::FileSink::emit", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 314, "signature": "void emit(const LogRecord& record) override", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::FileSink::flush", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 315, "signature": "void flush() override", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::FileSink::failedWrites", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 318, "signature": "[[nodiscard]] std::uint64_t failedWrites() const noexcept", "summary": "Records whose line could not be written (0 = healthy).", "budget": null, "experimental": false},
{"name": "laige::log::FileSink::path", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 321, "signature": "[[nodiscard]] std::string_view path() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::LoggerOptions", "kind": "struct", "header": "src/laige-core/include/laige/logging.h", "line": 346, "signature": "struct LoggerOptions", "summary": "Init-phase configuration for Logger::init().", "budget": null, "experimental": false},
{"name": "laige::log::LoggerOptions::sink", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 349, "signature": "std::unique_ptr<Sink> sink = nullptr", "summary": "The sink to use; null → a ConsoleSink on stderr. The logger takes ownership (unique_ptr).", "budget": null, "experimental": false},
{"name": "laige::log::LoggerOptions::globalMinimum", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 352, "signature": "Level globalMinimum = Level::Debug", "summary": "Global minimum severity, checked before the per-subsystem level — one atomic load, the cheap first gate.", "budget": null, "experimental": false},
{"name": "laige::log::LoggerOptions::defaultSubsystemLevel", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 355, "signature": "Level defaultSubsystemLevel = Level::Debug", "summary": "Level applied to subsystems not registered via setSubsystemLevel(). Trace is disabled by default (AGENTS §14).", "budget": null, "experimental": false},
{"name": "laige::log::LoggerOptions::rateLimiting", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 358, "signature": "bool rateLimiting = true", "summary": "LOG-004: repeated failures are rate-limited per (subsystem, event, severity) for Warn/Error/Fatal.", "budget": null, "experimental": false},
{"name": "laige::log::LoggerOptions::rateWindow", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 363, "signature": "std::chrono::milliseconds rateWindow = std::chrono::milliseconds(1000)", "summary": "Rate window: at most one event per key per window reaches the sink; the rest are counted and reported in a `rate_limited` summary event when the next event for the key lands after the window (and at shutdown for pending counts).", "budget": null, "experimental": false},
{"name": "laige::log::LoggerOptions::ClockFn", "kind": "alias", "header": "src/laige-core/include/laige/logging.h", "line": 367, "signature": "using ClockFn = std::chrono::system_clock::time_point (*)()", "summary": "Clock for timestamps and rate decisions; null → std::chrono::system_clock::now(). Called only for enabled events (never on the disabled path); injectable for tests.", "budget": null, "experimental": false},
{"name": "laige::log::LoggerOptions::clock", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 368, "signature": "ClockFn clock = nullptr", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Logger", "kind": "class", "header": "src/laige-core/include/laige/logging.h", "line": 375, "signature": "class Logger", "summary": "The one logging facade (AGENTS §14): a process-lifetime Meyers singleton. See the header top for ownership, threading, and performance contracts; the full API contract is in docs/api/logging.md.", "budget": null, "experimental": false},
{"name": "laige::log::Logger::instance", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 377, "signature": "[[nodiscard]] static Logger& instance()", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Logger::init", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 387, "signature": "[[nodiscard]] laige::Status init(LoggerOptions options)", "summary": "Init-phase configuration (MUST NOT run concurrently with logging from other threads). Replaces the current sink (flushed first) and resets subsystem levels, rate state, and the retired flag; a previously installed crash handler is re-registered by a later installCrashHandling() call. Always succeeds: a sink that can fail is created via FileSink::create() before init (hand its sink over with Result::takeValue()). Takes options by value and consumes the sink ownership — call with an rvalue.", "budget": null, "experimental": false},
{"name": "laige::log::Logger::setSubsystemLevel", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 391, "signature": "void setSubsystemLevel(std::string_view subsystem, Level level)", "summary": "Per-subsystem level filter (FR-12.2 per-subsystem scopes). Init-phase API. The subsystem name is copied into the facade.", "budget": null, "experimental": false},
{"name": "laige::log::Logger::subsystemLevel", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 395, "signature": "[[nodiscard]] Level subsystemLevel(std::string_view subsystem) const", "summary": "The effective level for `subsystem` (its registered level, or defaultSubsystemLevel_ when unregistered). Init-phase API.", "budget": null, "experimental": false},
{"name": "laige::log::Logger::setGlobalMinimum", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 397, "signature": "void setGlobalMinimum(Level level)", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Logger::globalMinimum", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 398, "signature": "[[nodiscard]] Level globalMinimum() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Logger::enabled", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 404, "signature": "[[nodiscard]] bool enabled(Severity severity, std::string_view subsystem) const", "summary": "Cheap gate behind LAIGE_LOG_*: true only when an event of `severity` from `subsystem` will be recorded. Cost: one atomic load, plus (only if that passes) one mutex section over a small linear scan — no allocation, no formatting (LOG-003).", "budget": null, "experimental": false},
{"name": "laige::log::Logger::emit", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 412, "signature": "template <typename... Fields> void emit(Severity severity, std::string_view subsystem, std::string_view event, std::string_view message, Fields&&... fields)", "summary": "Record an enabled event. Fields are moved into the record; the subsystem/event/message string_views must outlive the call. Direct calls evaluate their arguments eagerly — prefer the LAIGE_LOG_* macros (lazy). Fatal events flush and then terminate the process (AGENTS §14 controlled termination).", "budget": null, "experimental": false},
{"name": "laige::log::Logger::flush", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 421, "signature": "void flush()", "summary": "Flush the sink (LOG-007).", "budget": null, "experimental": false},
{"name": "laige::log::Logger::shutdown", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 426, "signature": "void shutdown()", "summary": "Controlled shutdown (CONC-006, idempotent): drain pending rate-limit summaries, flush the sink, and retire the facade — log calls after shutdown are discarded (no sink calls).", "budget": null, "experimental": false},
{"name": "laige::log::Logger::installCrashHandling", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 435, "signature": "[[nodiscard]] laige::Status installCrashHandling()", "summary": "Install crash handlers (LOG-007): SIGSEGV/SIGABRT/SIGBUS/SIGFPE/ SIGILL on POSIX (sigaction, one-shot SA_RESETHAND), a vectored SEH filter on Windows. The handler writes a raw notice to stderr (write(2): no stdio lock, no allocation), flushes the sink (try_lock, allocation-free), and lets the default crash handling continue (core dump / debugger / abort). Init-phase API; idempotent.", "budget": null, "experimental": false},
{"name": "laige::log::Logger::sink", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 438, "signature": "[[nodiscard]] const Sink* sink() const noexcept", "summary": "The current sink (diagnostics, DBG-008); never null.", "budget": null, "experimental": false},
{"name": "laige::log::Logger::crashFlush", "kind": "method", "header": "src/laige-core/include/laige/logging.h", "line": 442, "signature": "void crashFlush() const", "summary": "Flush from a crash handler: no facade lock (the signal may have interrupted a dispatch holding it), no allocation (LOG-007).", "budget": null, "experimental": false},
{"name": "laige::log::Logger::SubsystemEntry::name", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 448, "signature": "std::string name", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Logger::SubsystemEntry::level", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 449, "signature": "Level level", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Logger::RateEntry::subsystem", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 457, "signature": "std::string subsystem", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Logger::RateEntry::event", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 458, "signature": "std::string event", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Logger::RateEntry::severity", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 459, "signature": "Severity severity", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Logger::RateEntry::everEmitted", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 460, "signature": "bool everEmitted = false", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Logger::RateEntry::lastEmit", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 461, "signature": "std::chrono::system_clock::time_point lastEmit{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::log::Logger::RateEntry::suppressed", "kind": "variable", "header": "src/laige-core/include/laige/logging.h", "line": 462, "signature": "std::uint64_t suppressed = 0", "summary": null, "budget": null, "experimental": false},
{"name": "LAIGE_LOG", "kind": "macro", "header": "src/laige-core/include/laige/logging.h", "line": 537, "signature": "#define LAIGE_LOG(severity, subsystem, event, message, ...)", "summary": "The public logging macros (AGENTS §14 example shape)", "budget": null, "experimental": false},
{"name": "LAIGE_LOG_TRACE", "kind": "macro", "header": "src/laige-core/include/laige/logging.h", "line": 541, "signature": "#define LAIGE_LOG_TRACE(subsystem, event, message, ...)", "summary": null, "budget": null, "experimental": false},
{"name": "LAIGE_LOG_DEBUG", "kind": "macro", "header": "src/laige-core/include/laige/logging.h", "line": 544, "signature": "#define LAIGE_LOG_DEBUG(subsystem, event, message, ...)", "summary": null, "budget": null, "experimental": false},
{"name": "LAIGE_LOG_INFO", "kind": "macro", "header": "src/laige-core/include/laige/logging.h", "line": 547, "signature": "#define LAIGE_LOG_INFO(subsystem, event, message, ...)", "summary": null, "budget": null, "experimental": false},
{"name": "LAIGE_LOG_WARN", "kind": "macro", "header": "src/laige-core/include/laige/logging.h", "line": 550, "signature": "#define LAIGE_LOG_WARN(subsystem, event, message, ...)", "summary": null, "budget": null, "experimental": false},
{"name": "LAIGE_LOG_ERROR", "kind": "macro", "header": "src/laige-core/include/laige/logging.h", "line": 553, "signature": "#define LAIGE_LOG_ERROR(subsystem, event, message, ...)", "summary": null, "budget": null, "experimental": false},
{"name": "LAIGE_LOG_FATAL", "kind": "macro", "header": "src/laige-core/include/laige/logging.h", "line": 556, "signature": "#define LAIGE_LOG_FATAL(subsystem, event, message, ...)", "summary": null, "budget": null, "experimental": false},
{"name": "laige::PoolStats", "kind": "struct", "header": "src/laige-core/include/laige/pools.h", "line": 109, "signature": "struct PoolStats", "summary": "One pool's accounting snapshot (PRD §10.4, FR-11.4, G-R4). A plain value the M1 profiler aggregates; there is no registration (CORE-004).", "budget": null, "experimental": false},
{"name": "laige::PoolStats::capacity", "kind": "variable", "header": "src/laige-core/include/laige/pools.h", "line": 110, "signature": "std::uint32_t capacity{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::PoolStats::inUse", "kind": "variable", "header": "src/laige-core/include/laige/pools.h", "line": 111, "signature": "std::uint32_t inUse{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::PoolStats::peakInUse", "kind": "variable", "header": "src/laige-core/include/laige/pools.h", "line": 112, "signature": "std::uint32_t peakInUse{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::PoolStats::totalCreated", "kind": "variable", "header": "src/laige-core/include/laige/pools.h", "line": 113, "signature": "std::uint64_t totalCreated{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::PoolStats::bytesCapacity", "kind": "variable", "header": "src/laige-core/include/laige/pools.h", "line": 114, "signature": "std::size_t bytesCapacity{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::PoolStats::bytesInUse", "kind": "variable", "header": "src/laige-core/include/laige/pools.h", "line": 115, "signature": "std::size_t bytesInUse{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::PoolHandle", "kind": "struct", "header": "src/laige-core/include/laige/pools.h", "line": 128, "signature": "struct PoolHandle", "summary": "A stable handle into a Pool<T> (CPP-007): a 32-bit slot index plus a 32-bit generation. A handle is valid while the slot is live and its current generation equals the handle's. A generation bump on free invalidates every stale handle to that slot; a generation wrap after 2^32 frees of one slot is defined unsigned wraparound and is effectively unreachable (documented, not assertable — see Pool::isValid). A default handle {0, 0} is never valid.", "budget": null, "experimental": false},
{"name": "laige::PoolHandle::index", "kind": "variable", "header": "src/laige-core/include/laige/pools.h", "line": 129, "signature": "std::uint32_t index{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::PoolHandle::generation", "kind": "variable", "header": "src/laige-core/include/laige/pools.h", "line": 130, "signature": "std::uint32_t generation{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::operator==", "kind": "function", "header": "src/laige-core/include/laige/pools.h", "line": 133, "signature": "inline bool operator==(PoolHandle a, PoolHandle b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::operator!=", "kind": "function", "header": "src/laige-core/include/laige/pools.h", "line": 136, "signature": "inline bool operator!=(PoolHandle a, PoolHandle b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ElementSlot", "kind": "struct", "header": "src/laige-core/include/laige/pools.h", "line": 146, "signature": "template <typename T> struct ElementSlot", "summary": "Raw aligned storage for one element: a byte array with exactly the size of T (1 byte for an empty T) and its alignment, so placement new below is always well-formed (CPP-004). A plain struct — not std::aligned_storage, which is deprecated since C++23 and whose layout has changed across implementations — so ElementSlot is well-formed on every P0 toolchain.", "budget": null, "experimental": false},
{"name": "laige::ArenaPool", "kind": "class", "header": "src/laige-core/include/laige/pools.h", "line": 155, "signature": "template <typename T> class ArenaPool", "summary": "ArenaPool<T> — arena-scoped, budgeted, reset-per-frame storage", "budget": null, "experimental": false},
{"name": "laige::ArenaPool::Options", "kind": "struct", "header": "src/laige-core/include/laige/pools.h", "line": 160, "signature": "struct Options", "summary": "The element budget, fixed at construction (S-6). A budget of 0 is legal: every create() fails with BudgetExhausted.", "budget": null, "experimental": false},
{"name": "laige::ArenaPool::Options::capacity", "kind": "variable", "header": "src/laige-core/include/laige/pools.h", "line": 161, "signature": "std::uint32_t capacity{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ArenaPool::ArenaPool", "kind": "constructor", "header": "src/laige-core/include/laige/pools.h", "line": 165, "signature": "explicit ArenaPool(Options options) noexcept : capacity_(options.capacity), block_(capacity_ > 0 ? std::make_unique<ElementSlot<T>[]>(capacity_) : nullptr), inUse_(0), peakInUse_(0), totalCreated_(0)", "summary": "One backing allocation for the whole arena (setup path, PERF-002).", "budget": null, "experimental": false},
{"name": "laige::ArenaPool::ArenaPool", "kind": "constructor", "header": "src/laige-core/include/laige/pools.h", "line": 172, "signature": "ArenaPool(const ArenaPool&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ArenaPool::operator=", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 173, "signature": "ArenaPool& operator=(const ArenaPool&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ArenaPool::~ArenaPool", "kind": "destructor", "header": "src/laige-core/include/laige/pools.h", "line": 176, "signature": "~ArenaPool() noexcept", "summary": "Destroys every live element (no leak; ASan-verifiable). O(inUse).", "budget": null, "experimental": false},
{"name": "laige::ArenaPool::ArenaPool", "kind": "constructor", "header": "src/laige-core/include/laige/pools.h", "line": 180, "signature": "ArenaPool(ArenaPool&& other) noexcept : capacity_(other.capacity_), block_(std::move(other.block_)), inUse_(other.inUse_), peakInUse_(other.peakInUse_), totalCreated_(other.totalCreated_)", "summary": "Move is an O(1) pointer swap; the source becomes an empty arena (capacity 0, every create() fails).", "budget": null, "experimental": false},
{"name": "laige::ArenaPool::operator=", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 192, "signature": "ArenaPool& operator=(ArenaPool&& other) noexcept", "summary": "Move assignment: destroy the elements this currently owns, take over other's storage, and leave other a valid empty pool — the same net effect as a move construction. O(1).", "budget": null, "experimental": false},
{"name": "laige::ArenaPool::create", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 212, "signature": "template <typename... Args> [[nodiscard]] Result<std::uint32_t, ErrorCode> create(Args&&... args)", "summary": "Create one element in the next free slot (bump). O(1), no allocation; the element's constructor runs here (the op's only real work). Returns the slot index (valid until the next reset()). Beyond the budget: ErrorCode::BudgetExhausted (the arena never grows silently, S-2).", "budget": null, "experimental": false},
{"name": "laige::ArenaPool::reset", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 228, "signature": "void reset() noexcept", "summary": "The per-frame release: destroy every live element and rewind the cursor. O(inUse), no allocation. peakInUse/totalCreated survive the reset (they are since-construction counters; a per-frame profiler diffs them). Idempotent.", "budget": null, "experimental": false},
{"name": "laige::ArenaPool::at", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 239, "signature": "[[nodiscard]] T& at(std::uint32_t slot)", "summary": "Element access. at() asserts the slot is live (debug: a loud crash with a message; release: undefined behavior — the engine Result convention). get() is the null-safe read: nullptr for a slot >= inUse (after reset, or never created).", "budget": null, "experimental": false},
{"name": "laige::ArenaPool::get", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 244, "signature": "[[nodiscard]] T* get(std::uint32_t slot) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ArenaPool::isValid", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 251, "signature": "[[nodiscard]] bool isValid(std::uint32_t slot) const noexcept", "summary": "True while the slot is live (i.e. until the next reset()).", "budget": null, "experimental": false},
{"name": "laige::ArenaPool::capacity", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 255, "signature": "[[nodiscard]] std::uint32_t capacity() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ArenaPool::inUse", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 256, "signature": "[[nodiscard]] std::uint32_t inUse() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ArenaPool::stats", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 260, "signature": "[[nodiscard]] PoolStats stats() const noexcept", "summary": "Accounting snapshot (PRD §10.4). bytesCapacity is the whole backing block; bytesInUse is the element footprint of the live prefix.", "budget": null, "experimental": false},
{"name": "laige::Pool", "kind": "class", "header": "src/laige-core/include/laige/pools.h", "line": 280, "signature": "template <typename T> class Pool", "summary": "Pool<T> — stable-handle, generation-checked, bounded pool", "budget": null, "experimental": false},
{"name": "laige::Pool::Options", "kind": "struct", "header": "src/laige-core/include/laige/pools.h", "line": 285, "signature": "struct Options", "summary": "The element budget, fixed at construction (S-6). A budget of 0 is legal: every create() fails with BudgetExhausted.", "budget": null, "experimental": false},
{"name": "laige::Pool::Options::capacity", "kind": "variable", "header": "src/laige-core/include/laige/pools.h", "line": 286, "signature": "std::uint32_t capacity{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Pool::Pool", "kind": "constructor", "header": "src/laige-core/include/laige/pools.h", "line": 292, "signature": "explicit Pool(Options options) noexcept : capacity_(options.capacity), block_(capacity_ > 0 ? std::make_unique<ElementSlot<T>[]>(capacity_) : nullptr), generations_(capacity_ > 0 ? std::make_unique<std::uint32_t[]>(capacity_) : nullptr), freeStack_(capacity_ > 0 ? std::make_unique<std::uint32_t[]>(capacity_) : nullptr), alive_(capacity_ > 0 ? std::make_unique<std::uint8_t[]>(capacity_) : nullptr), freeCount_(0), inUse_(0), peakInUse_(0), totalCreated_(0)", "summary": "Backing allocations for the whole pool (setup path, PERF-002): the element store, the per-slot generation table, the LIFO free-list stack (pre-filled 0..capacity-1), and the per-slot alive flag.", "budget": null, "experimental": false},
{"name": "laige::Pool::Pool", "kind": "constructor", "header": "src/laige-core/include/laige/pools.h", "line": 310, "signature": "Pool(const Pool&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Pool::operator=", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 311, "signature": "Pool& operator=(const Pool&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Pool::~Pool", "kind": "destructor", "header": "src/laige-core/include/laige/pools.h", "line": 314, "signature": "~Pool() noexcept", "summary": "Destroys every live element (no leak; ASan-verifiable). O(capacity).", "budget": null, "experimental": false},
{"name": "laige::Pool::Pool", "kind": "constructor", "header": "src/laige-core/include/laige/pools.h", "line": 318, "signature": "Pool(Pool&& other) noexcept : capacity_(other.capacity_), block_(std::move(other.block_)), generations_(std::move(other.generations_)), freeStack_(std::move(other.freeStack_)), alive_(std::move(other.alive_)), freeCount_(other.freeCount_), inUse_(other.inUse_), peakInUse_(other.peakInUse_), totalCreated_(other.totalCreated_)", "summary": "Move is an O(1) pointer swap; the source becomes an empty pool (capacity 0: every create() fails, every handle invalid).", "budget": null, "experimental": false},
{"name": "laige::Pool::operator=", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 334, "signature": "Pool& operator=(Pool&& other) noexcept", "summary": "Move assignment: destroy the elements this currently owns, take over other's storage, and leave other a valid empty pool — the same net effect as a move construction. O(1).", "budget": null, "experimental": false},
{"name": "laige::Pool::create", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 357, "signature": "template <typename... Args> [[nodiscard]] Result<PoolHandle, ErrorCode> create(Args&&... args)", "summary": "Create one element in the next free slot (LIFO recycle). O(1), no allocation; the element's constructor runs here. Beyond the budget: ErrorCode::BudgetExhausted (the pool never grows silently, S-2).", "budget": null, "experimental": false},
{"name": "laige::Pool::destroy", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 374, "signature": "[[nodiscard]] Status destroy(PoolHandle handle) noexcept", "summary": "Destroy one live element and return its slot to the free list. O(1), no allocation. The slot's generation is bumped, so every stale handle to it now fails isValid() (CPP-007). Invalid or stale handle: ErrorCode::InvalidArgument (a caller bug — S-9).", "budget": null, "experimental": false},
{"name": "laige::Pool::at", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 388, "signature": "[[nodiscard]] T& at(PoolHandle handle)", "summary": "Element access. at() asserts the handle is live (debug: a loud crash with a message; release: undefined behavior — the engine Result convention). get() is the null-safe read: nullptr when the handle is stale, cleared, or from another pool.", "budget": null, "experimental": false},
{"name": "laige::Pool::get", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 394, "signature": "[[nodiscard]] T* get(PoolHandle handle) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Pool::isValid", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 406, "signature": "[[nodiscard]] bool isValid(PoolHandle handle) const noexcept", "summary": "Generation-checked liveness (CPP-007): the slot exists, is live, and its current generation matches the handle's. A handle for a freed slot mismatches on the generation bump and can never pass again — except after 2^32 frees of that one slot (defined unsigned wrap; effectively unreachable, documented here as the one case the generation scheme does not rule out).", "budget": null, "experimental": false},
{"name": "laige::Pool::clear", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 416, "signature": "void clear() noexcept", "summary": "Destroy every live element; every handle becomes stale; the capacity is unchanged and the pool is immediately reusable. O(capacity), no allocation. (Reset-per-frame workloads should use ArenaPool<T> instead — its reset() is O(inUse) and has no free-list bookkeeping.)", "budget": null, "experimental": false},
{"name": "laige::Pool::capacity", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 428, "signature": "[[nodiscard]] std::uint32_t capacity() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Pool::inUse", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 429, "signature": "[[nodiscard]] std::uint32_t inUse() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Pool::stats", "kind": "method", "header": "src/laige-core/include/laige/pools.h", "line": 434, "signature": "[[nodiscard]] PoolStats stats() const noexcept", "summary": "Accounting snapshot (PRD §10.4). bytesCapacity is the whole backing store (element slots + per-slot generation/alive/free-list bookkeeping); bytesInUse is the element footprint of live elements.", "budget": null, "experimental": false},
{"name": "laige::Prng", "kind": "class", "header": "src/laige-core/include/laige/prng.h", "line": 126, "signature": "class Prng", "summary": "Prng — deterministic xorshift128+ with seeded, per-substream derivation (M0-CORE-06; contract preamble above; full API doc: docs/api/prng.md)", "budget": null, "experimental": false},
{"name": "laige::Prng::kSplitmix64Increment", "kind": "variable", "header": "src/laige-core/include/laige/prng.h", "line": 130, "signature": "static constexpr std::uint64_t kSplitmix64Increment = 0x9E3779B97F4A7C15ull", "summary": "splitmix64 increment (Marsaglia's golden-ratio odd constant): the step between successive splitmix64 inputs and between substream seeds.", "budget": null, "experimental": false},
{"name": "laige::Prng::kMixMultiplierA", "kind": "variable", "header": "src/laige-core/include/laige/prng.h", "line": 133, "signature": "static constexpr std::uint64_t kMixMultiplierA = 0xBF58476D1CE4E5B9ull", "summary": "splitmix64 mixing multipliers (Stafford 2018).", "budget": null, "experimental": false},
{"name": "laige::Prng::kMixMultiplierB", "kind": "variable", "header": "src/laige-core/include/laige/prng.h", "line": 134, "signature": "static constexpr std::uint64_t kMixMultiplierB = 0x94D049BB133111EBull", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Prng::kFloat01Unit", "kind": "variable", "header": "src/laige-core/include/laige/prng.h", "line": 137, "signature": "static constexpr float kFloat01Unit = 0x1.0p-24f", "summary": "next_float01() resolution: one value is 2^-24 (24 mantissa bits).", "budget": null, "experimental": false},
{"name": "laige::Prng::Prng", "kind": "constructor", "header": "src/laige-core/include/laige/prng.h", "line": 141, "signature": "explicit Prng(std::uint64_t seed) : seed_(seed), s0_(0), s1_(0)", "summary": "Construct the master stream for `seed`. The state is nonzero for every seed (splitmix64 is a bijection; see the preamble).", "budget": null, "experimental": false},
{"name": "laige::Prng::next_u64", "kind": "method", "header": "src/laige-core/include/laige/prng.h", "line": 147, "signature": "std::uint64_t next_u64()", "summary": "One stream draw: the xorshift128+ output; advances the state.", "budget": null, "experimental": false},
{"name": "laige::Prng::next_range", "kind": "method", "header": "src/laige-core/include/laige/prng.h", "line": 152, "signature": "std::uint32_t next_range(std::uint32_t min, std::uint32_t max)", "summary": "Uniform value in [min, max) (max - min must be in [1, 2^32 - 1]). Unbiased (Lemire reduction with rejection); expected < 2 draws. `min >= max` is a debug assert (documented UB in release).", "budget": null, "experimental": false},
{"name": "laige::Prng::next_float01", "kind": "method", "header": "src/laige-core/include/laige/prng.h", "line": 156, "signature": "float next_float01()", "summary": "Uniform value in [0, 1) at 24-bit resolution: exactly k * 2^-24 for an integer k in [0, 2^24). Never 1.0; 0.0 with probability 2^-24.", "budget": null, "experimental": false},
{"name": "laige::Prng::seed", "kind": "method", "header": "src/laige-core/include/laige/prng.h", "line": 160, "signature": "std::uint64_t seed() const", "summary": "The seed this stream was constructed from (save/replay identity, PRD §10.3; M1-DET-03 hashes this together with the substream id).", "budget": null, "experimental": false},
{"name": "laige::Prng::statePart1", "kind": "method", "header": "src/laige-core/include/laige/prng.h", "line": 166, "signature": "std::uint64_t statePart1() const", "summary": "The stream's state word 1 (the save/replay identity's part1; PRD §10.3 — a saved stream is (seed, part1, part2)). Read-only; O(1), no side effects. M1-DET-03: World::stateHash folds these into the deterministic state hash with the substream id.", "budget": null, "experimental": false},
{"name": "laige::Prng::statePart2", "kind": "method", "header": "src/laige-core/include/laige/prng.h", "line": 170, "signature": "std::uint64_t statePart2() const", "summary": "The stream's state word 2 (the save/replay identity's part2). Read-only; O(1), no side effects. See statePart1().", "budget": null, "experimental": false},
{"name": "laige::Prng::substream", "kind": "method", "header": "src/laige-core/include/laige/prng.h", "line": 174, "signature": "Prng substream(std::uint32_t id) const", "summary": "A substream of this stream's seed: deriveSubstream(seed(), id). Independent stream position; id 0 == the master stream.", "budget": null, "experimental": false},
{"name": "laige::Prng::deriveSubstream", "kind": "method", "header": "src/laige-core/include/laige/prng.h", "line": 179, "signature": "static Prng deriveSubstream(std::uint64_t seed, std::uint32_t id)", "summary": "Substream derivation (documented hash, see the preamble): Prng(seed + id * kSplitmix64Increment). Composes: deriveSubstream(deriveSubstream(seed, i), j) == deriveSubstream(seed, i+j).", "budget": null, "experimental": false},
{"name": "laige::Prng::seedState", "kind": "method", "header": "src/laige-core/include/laige/prng.h", "line": 184, "signature": "static void seedState(std::uint64_t seed, std::uint64_t& part1, std::uint64_t& part2)", "summary": "Seed-to-state mapping (documented in the preamble). Exposed for determinism verification and M1 save/replay: a saved stream is (seed, part1, part2) and restores by seedState + stepState calls.", "budget": null, "experimental": false},
{"name": "laige::Prng::stepState", "kind": "method", "header": "src/laige-core/include/laige/prng.h", "line": 190, "signature": "static void stepState(std::uint64_t& part1, std::uint64_t& part2)", "summary": "One transition step on a raw state (see the preamble). Exposed for determinism verification (the PrngPeriod suite reconstructs the state map over GF(2) from this) and M1 save/replay.", "budget": null, "experimental": false},
{"name": "laige::splitMix64", "kind": "function", "header": "src/laige-core/include/laige/prng.h", "line": 202, "signature": "inline std::uint64_t splitMix64(std::uint64_t z)", "summary": "splitmix64 (Stafford 2018) — seeding-only; a bijection of u64.", "budget": null, "experimental": false},
{"name": "laige::Result", "kind": "class", "header": "src/laige-core/include/laige/result.h", "line": 43, "signature": "template <typename T, typename E = ErrorCode> class Result", "summary": "A result carrying either a success value of type T or a failure of type E (default: laige::ErrorCode).", "budget": null, "experimental": false},
{"name": "laige::Result::Result", "kind": "constructor", "header": "src/laige-core/include/laige/result.h", "line": 51, "signature": "Result() = delete", "summary": "An empty Result has no defined state and is therefore unrepresentable (API-008).", "budget": null, "experimental": false},
{"name": "laige::Result::Result", "kind": "constructor", "header": "src/laige-core/include/laige/result.h", "line": 53, "signature": "Result(const Result&) = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Result::Result", "kind": "constructor", "header": "src/laige-core/include/laige/result.h", "line": 54, "signature": "Result(Result&&) = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Result::operator=", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 55, "signature": "Result& operator=(const Result&) = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Result::operator=", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 56, "signature": "Result& operator=(Result&&) = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Result::Result", "kind": "constructor", "header": "src/laige-core/include/laige/result.h", "line": 59, "signature": "[[nodiscard]] Result(T value) requires(!std::is_convertible_v<E, T>) : value_(std::move(value)), error_(E{})", "summary": "Success carrying `value` (copied or moved in).", "budget": null, "experimental": false},
{"name": "laige::Result::Result", "kind": "constructor", "header": "src/laige-core/include/laige/result.h", "line": 69, "signature": "[[nodiscard]] Result(const E& error) requires(!std::is_convertible_v<T, E>) : value_(), error_(error)", "summary": "Failure carrying `error` (copied from a const reference; error codes are small scalars). The signature stays distinct from the value constructor even when T and E are the same type, which keeps the class well-formed on all conforming compilers (MSVC rejects two member declarations with identical parameter lists).", "budget": null, "experimental": false},
{"name": "laige::Result::success", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 76, "signature": "[[nodiscard]] static Result success(T value)", "summary": "Unambiguous factory forms (always available, including when T and E are mutually convertible).", "budget": null, "experimental": false},
{"name": "laige::Result::failure", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 81, "signature": "[[nodiscard]] static Result failure(E error)", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Result::ok", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 88, "signature": "[[nodiscard]] bool ok() const noexcept", "summary": "True when the result carries a success value.", "budget": null, "experimental": false},
{"name": "laige::Result::isError", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 89, "signature": "[[nodiscard]] bool isError() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Result::value", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 93, "signature": "[[nodiscard]] const T& value() const noexcept", "summary": "The success value. Precondition: ok(). Debug builds assert; in release builds an unchecked call is undefined behavior.", "budget": null, "experimental": false},
{"name": "laige::Result::error", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 100, "signature": "[[nodiscard]] const E& error() const noexcept", "summary": "The failure value. Precondition: isError(). Debug builds assert; in release builds an unchecked call is undefined behavior.", "budget": null, "experimental": false},
{"name": "laige::Result::takeValue", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 109, "signature": "[[nodiscard]] T takeValue() &&", "summary": "Move the success value out of an rvalue result (ownership transfer, e.g. handing a freshly created resource to a container). Precondition: ok() and an rvalue result. Debug builds assert; in release builds an unchecked call is undefined behavior.", "budget": null, "experimental": false},
{"name": "laige::Result::valueIfOk", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 116, "signature": "[[nodiscard]] const T* valueIfOk() const noexcept", "summary": "Null-safe accessors (no precondition): nullptr when the result does not carry the requested state.", "budget": null, "experimental": false},
{"name": "laige::Result::errorIfError", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 119, "signature": "[[nodiscard]] const E* errorIfError() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Status", "kind": "class", "header": "src/laige-core/include/laige/result.h", "line": 140, "signature": "class Status", "summary": "A Result without a success value: an operation outcome only.", "budget": null, "experimental": false},
{"name": "laige::Status::Status", "kind": "constructor", "header": "src/laige-core/include/laige/result.h", "line": 142, "signature": "Status() noexcept = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Status::Status", "kind": "constructor", "header": "src/laige-core/include/laige/result.h", "line": 143, "signature": "Status(ErrorCode code) noexcept : ok_(false), code_(code)", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Status::failure", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 145, "signature": "[[nodiscard]] static Status failure(ErrorCode code) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Status::ok", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 149, "signature": "[[nodiscard]] bool ok() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Status::isError", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 150, "signature": "[[nodiscard]] bool isError() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::Status::error", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 154, "signature": "[[nodiscard]] ErrorCode error() const noexcept", "summary": "The failure code. Precondition: isError(). Debug builds assert; in release builds an unchecked call is undefined behavior.", "budget": null, "experimental": false},
{"name": "laige::Status::errorText", "kind": "method", "header": "src/laige-core/include/laige/result.h", "line": 161, "signature": "[[nodiscard]] const char* errorText() const noexcept", "summary": "The pre-rendered NFR-13.3 line for the failure code. Precondition: isError().", "budget": null, "experimental": false},
{"name": "laige::sim::Fp32Pinned", "kind": "struct", "header": "src/laige-core/include/laige/sim_math.h", "line": 161, "signature": "struct Fp32Pinned", "summary": "IEEE-754 binary32 with pinned semantics (ADR 0002). See the header preamble for the pinned flag set and the full NaN/Inf policy.", "budget": null, "experimental": false},
{"name": "laige::sim::Fp32Pinned::Scalar", "kind": "alias", "header": "src/laige-core/include/laige/sim_math.h", "line": 162, "signature": "using Scalar = float", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::Fp32Pinned::add", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 167, "signature": "static Scalar add(Scalar a, Scalar b) noexcept", "summary": "a + b: one IEEE binary32 addition, round-to-nearest-even. The build's -ffp-contract=off guarantees this does not fuse with an adjacent multiply (e.g. inside lerp()).", "budget": null, "experimental": false},
{"name": "laige::sim::Fp32Pinned::sub", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 168, "signature": "static Scalar sub(Scalar a, Scalar b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::Fp32Pinned::mul", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 169, "signature": "static Scalar mul(Scalar a, Scalar b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::Fp32Pinned::div", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 172, "signature": "static Scalar div(Scalar a, Scalar b) noexcept", "summary": "IEEE binary32 division: x/0 = ±inf (no trap on P0 targets), 0/0 = NaN.", "budget": null, "experimental": false},
{"name": "laige::sim::Fp32Pinned::sqrt", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 175, "signature": "static Scalar sqrt(Scalar a) noexcept", "summary": "Correctly-rounded binary32 square root (SSE2 vsqrtss / NEON vsqrt). sqrt of a negative value is NaN (IEEE); no trap.", "budget": null, "experimental": false},
{"name": "laige::sim::Fp32Pinned::isNaN", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 185, "signature": "static bool isNaN(Scalar x) noexcept", "summary": "IEEE classification (the raw `==`/`!=` below are the deliberate bit-level comparisons the pinned NaN/Inf policy requires — the -Wfloat-equal heuristic is scoped away, CORE-010: no global suppression).", "budget": null, "experimental": false},
{"name": "laige::sim::Fp32Pinned::isInf", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 186, "signature": "static bool isInf(Scalar x) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::Fpx16_16", "kind": "struct", "header": "src/laige-core/include/laige/sim_math.h", "line": 201, "signature": "struct Fpx16_16", "summary": "Q16.16 fixed-point (ADR 0002). Bit-exact across all builds, platforms, ISAs, and compilers by the C++20 language standard — no pinned flags required. The DEFAULT backend; required for lockstep and authoritative MMO. The full policy (saturating overflow, round-to-nearest ties-to-even, divide-by-zero, conversions, no NaN/Inf) is documented in laige/fpx16_16.h.", "budget": null, "experimental": false},
{"name": "laige::sim::Fpx16_16::Scalar", "kind": "alias", "header": "src/laige-core/include/laige/sim_math.h", "line": 202, "signature": "using Scalar = fpx16_16", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::Fpx16_16::add", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 204, "signature": "static Scalar add(Scalar a, Scalar b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::Fpx16_16::sub", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 205, "signature": "static Scalar sub(Scalar a, Scalar b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::Fpx16_16::mul", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 207, "signature": "static Scalar mul(Scalar a, Scalar b) noexcept", "summary": "Rounded (ties-to-even) and saturating — see fpx16_16.h.", "budget": null, "experimental": false},
{"name": "laige::sim::Fpx16_16::div", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 209, "signature": "static Scalar div(Scalar a, Scalar b) noexcept", "summary": "Divide by zero is defined (x/0 → ±max, 0/0 → +0) — never traps.", "budget": null, "experimental": false},
{"name": "laige::sim::Fpx16_16::sqrt", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 211, "signature": "static Scalar sqrt(Scalar a) noexcept", "summary": "sqrt of a negative value is defined as +0 (no NaN exists).", "budget": null, "experimental": false},
{"name": "laige::sim::Fpx16_16::isNaN", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 214, "signature": "static bool isNaN(Scalar) noexcept", "summary": "Q16.16 has no NaN and no infinity: total order, always finite.", "budget": null, "experimental": false},
{"name": "laige::sim::Fpx16_16::isInf", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 215, "signature": "static bool isInf(Scalar) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath", "kind": "struct", "header": "src/laige-core/include/laige/sim_math.h", "line": 223, "signature": "template <typename Backend> struct SimMath", "summary": "The SimMath op surface (ADR 0002): one interface, one template instantiation per backend", "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::Scalar", "kind": "alias", "header": "src/laige-core/include/laige/sim_math.h", "line": 225, "signature": "using Scalar = typename Backend::Scalar", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::Vec2", "kind": "struct", "header": "src/laige-core/include/laige/sim_math.h", "line": 231, "signature": "struct Vec2", "summary": "2D world/vector: positions, velocities, deltas. Default-initialized to the zero vector (the additive identity; all components +0). The coordinate system (axes, handedness, units) is defined in docs/concepts/coordinates.md (M0-DOC-02).", "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::Vec2::x", "kind": "variable", "header": "src/laige-core/include/laige/sim_math.h", "line": 232, "signature": "Scalar x{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::Vec2::y", "kind": "variable", "header": "src/laige-core/include/laige/sim_math.h", "line": 233, "signature": "Scalar y{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::Vec3", "kind": "struct", "header": "src/laige-core/include/laige/sim_math.h", "line": 237, "signature": "struct Vec3", "summary": "2.5D world space: (x, y) is the ground plane, z is depth/height.", "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::Vec3::x", "kind": "variable", "header": "src/laige-core/include/laige/sim_math.h", "line": 238, "signature": "Scalar x{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::Vec3::y", "kind": "variable", "header": "src/laige-core/include/laige/sim_math.h", "line": 239, "signature": "Scalar y{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::Vec3::z", "kind": "variable", "header": "src/laige-core/include/laige/sim_math.h", "line": 240, "signature": "Scalar z{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::create", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 246, "signature": "[[nodiscard]] static SimMath create() noexcept", "summary": "Factory (ADR 0002): backend selection is compile-time dispatch, factory-selected once per engine/zone init. The returned handle is stateless — holding one for a sim session costs nothing.", "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::add", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 252, "signature": "[[nodiscard]] static Scalar add(Scalar a, Scalar b) noexcept", "summary": "Arithmetic (IEEE per the backend's policy; NaN/Inf per the header preamble; division by zero does not trap)", "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::sub", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 255, "signature": "[[nodiscard]] static Scalar sub(Scalar a, Scalar b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::mul", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 258, "signature": "[[nodiscard]] static Scalar mul(Scalar a, Scalar b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::div", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 261, "signature": "[[nodiscard]] static Scalar div(Scalar a, Scalar b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::add", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 266, "signature": "[[nodiscard]] static Vec2 add(Vec2 a, Vec2 b) noexcept", "summary": "Component-wise vector arithmetic (same IEEE policy per component).", "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::sub", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 269, "signature": "[[nodiscard]] static Vec2 sub(Vec2 a, Vec2 b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::mul", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 272, "signature": "[[nodiscard]] static Vec2 mul(Vec2 a, Vec2 b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::mul", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 275, "signature": "[[nodiscard]] static Vec2 mul(Vec2 a, Scalar s) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::mul", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 278, "signature": "[[nodiscard]] static Vec2 mul(Scalar s, Vec2 a) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::length", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 293, "signature": "[[nodiscard]] static Scalar length(Vec2 v) noexcept", "summary": "length is exactly sqrt(x*x + y*y): two muls, one add, one correctly-rounded sqrt, in that order. fp32_pinned: the pinned -ffp-contract=off keeps x*x + y*y from FMA-contraction, which would round once and change the result. fpx16_16: the squarings and the sum are saturating Q16.16 ops, so length is accurate while x*x + y*y stays inside the Q16.16 range (|v| ≲ 181.02 per component; beyond that the result saturates — defined, deterministic, documented in fpx16_16.h and docs/api/sim_math.md).", "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::length", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 297, "signature": "[[nodiscard]] static Scalar length(Vec3 v) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::normalize", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 309, "signature": "[[nodiscard]] static Vec2 normalize(Vec2 v) noexcept", "summary": "Unit vector: v / length(v), component-wise division in the backend's format. The zero vector is defined to normalize to the zero vector (SimMath never injects NaN from a zero-length input; the fixed-point backend has no NaN at all). NaN/inf components propagate per the backend's policy (fp32_pinned: IEEE — an infinite vector can normalize to NaN components).", "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::normalize", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 314, "signature": "[[nodiscard]] static Vec3 normalize(Vec3 v) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::lerp", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 326, "signature": "[[nodiscard]] static Scalar lerp(Scalar a, Scalar b, Scalar t) noexcept", "summary": "lerp is exactly a + (b - a) * t (see the header preamble for the rounding contract and the non-interchangeability with a*(1-t)+b*t). t outside [0,1] extrapolates by the same expression (defined).", "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::lerp", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 329, "signature": "[[nodiscard]] static Vec2 lerp(Vec2 a, Vec2 b, Scalar t) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::clamp", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 337, "signature": "[[nodiscard]] static Scalar clamp(Scalar x, Scalar lo, Scalar hi) noexcept", "summary": "Bounding: requires `lo` and `hi` finite and `lo <= hi` (debug builds assert; release builds treat a violation as undefined behavior — the engine's Result/Status convention). NaN x → NaN; ±inf x → the corresponding bound.", "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::clamp", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 344, "signature": "[[nodiscard]] static Vec2 clamp(Vec2 v, Vec2 lo, Vec2 hi) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::eq", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 362, "signature": "static bool eq(Scalar a, Scalar b) noexcept", "summary": "NaN policy: less/lessEqual/greater/greaterEqual/equals are false when either operand is NaN; notEquals is true. The eq/ne primitives below are the only place in the engine where a raw floating-point equality comparison appears — deliberate bit-level comparisons that implement the documented policy — so the -Wfloat-equal heuristic (a -Wall member, which does not understand the pinned NaN/Inf contract) is scoped away there (CORE-010: no global suppression).", "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::ne", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 363, "signature": "static bool ne(Scalar a, Scalar b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::less", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 368, "signature": "static bool less(Scalar a, Scalar b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::lessEqual", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 369, "signature": "static bool lessEqual(Scalar a, Scalar b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::greater", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 370, "signature": "static bool greater(Scalar a, Scalar b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::greaterEqual", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 371, "signature": "static bool greaterEqual(Scalar a, Scalar b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::equals", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 372, "signature": "static bool equals(Scalar a, Scalar b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::notEquals", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 373, "signature": "static bool notEquals(Scalar a, Scalar b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::isOrdered", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 378, "signature": "static bool isOrdered(Scalar a, Scalar b) noexcept", "summary": "True iff neither operand is NaN (IEEE 754-2008 `totalOrder` predicate, i.e. the negation of `isunordered` — not the negation of the arithmetic != operator). Always true for fixed-point backends (total order).", "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::isNaN", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 384, "signature": "static bool isNaN(Scalar x) noexcept", "summary": "Value classification, delegated to the backend: IEEE for floating-point backends; fixed-point backends have no NaN/Inf (isNaN/isInf always false, isFinite always true).", "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::isInf", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 385, "signature": "static bool isInf(Scalar x) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::isFinite", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 386, "signature": "static bool isFinite(Scalar x) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::equals", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 389, "signature": "static bool equals(Vec2 a, Vec2 b) noexcept", "summary": "Vector equality (component-wise; treats ±0 as equal, per IEEE).", "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::notEquals", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 392, "signature": "static bool notEquals(Vec2 a, Vec2 b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::equals", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 393, "signature": "static bool equals(Vec3 a, Vec3 b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMath::notEquals", "kind": "method", "header": "src/laige-core/include/laige/sim_math.h", "line": 396, "signature": "static bool notEquals(Vec3 a, Vec3 b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::sim::SimMathFpx16", "kind": "alias", "header": "src/laige-core/include/laige/sim_math.h", "line": 405, "signature": "using SimMathFpx16 = SimMath<Fpx16_16>", "summary": "The `fpx16_16` SimMath (this step; `determinism.math` config id \"fixed_point_16_16\"). The DEFAULT backend (ADR 0002); required for lockstep (AC-10.3) and authoritative MMO. The `determinism.math` config plumbing lands with the config step (FR-1.5); until then, deterministic/lockstep engine code targets SimMathFpx16 and opt-in IEEE-float zones target SimMathFp32.", "budget": null, "experimental": false},
{"name": "laige::sim::SimMathFp32", "kind": "alias", "header": "src/laige-core/include/laige/sim_math.h", "line": 410, "signature": "using SimMathFp32 = SimMath<Fp32Pinned>", "summary": "The `fp32_pinned` SimMath (M0-CORE-03; `determinism.math` config id \"float_pinned_32\"). Opt-in for single-player / non-lockstep zones that want IEEE float semantics (ADR 0002).", "budget": null, "experimental": false},
{"name": "laige::render::kCameraDegreesToRadians", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 181, "signature": "inline constexpr float kCameraDegreesToRadians = 3.14159265358979323846f / 180.0f", "summary": "Radians per degree (the fovY default and the perspective validation; the engine takes radians everywhere — matrices.h).", "budget": null, "experimental": false},
{"name": "laige::render::kLookAtNearParallel", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 185, "signature": "inline constexpr float kLookAtNearParallel = 1e-5f", "summary": "The sine below which `up` is treated as parallel to the view direction (the lookAt precondition's numerical margin — CORE-005).", "budget": null, "experimental": false},
{"name": "laige::render::CameraProjection", "kind": "enum", "header": "src/laige-render/include/laige/render/camera.h", "line": 188, "signature": "enum class CameraProjection", "summary": "The camera's projection kind (API-008: a named type, not a boolean).", "budget": null, "experimental": false},
{"name": "laige::render::CameraProjection::Ortho", "kind": "enumerator", "header": "src/laige-render/include/laige/render/camera.h", "line": 191, "signature": "Ortho", "summary": "Orthographic: the view's half-extents are halfWidth/halfHeight in world units (zoom divides them).", "budget": null, "experimental": false},
{"name": "laige::render::CameraProjection::Perspective", "kind": "enumerator", "header": "src/laige-render/include/laige/render/camera.h", "line": 194, "signature": "Perspective", "summary": "Perspective: the vertical field of view fovY (radians); zoom divides the extent (the header preamble's zoom semantics).", "budget": null, "experimental": false},
{"name": "laige::render::CameraBounds", "kind": "struct", "header": "src/laige-render/include/laige/render/camera.h", "line": 200, "signature": "struct CameraBounds", "summary": "The rectangular camera-position constraint: a closed rectangle in the ground plane (x, y world units; the camera's z is unconstrained). min <= max per component (validated in Camera::create).", "budget": null, "experimental": false},
{"name": "laige::render::CameraBounds::min", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 201, "signature": "Vec2 min{0.0f, 0.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::CameraBounds::max", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 202, "signature": "Vec2 max{0.0f, 0.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions", "kind": "struct", "header": "src/laige-render/include/laige/render/camera.h", "line": 208, "signature": "struct CameraOptions", "summary": "The camera's scene-level configuration (API-006: an option structure, not positional booleans). Validated by Camera::create — see the header preamble for the full contract.", "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::position", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 211, "signature": "Vec3 position{0.0f, 0.0f, 0.0f}", "summary": "The camera's initial position (world units). Clamped into the rectangle at creation when the bounds are enabled.", "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::target", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 214, "signature": "Vec3 target{0.0f, 0.0f, -1.0f}", "summary": "The initial look-at point (the screen center of the view). Must keep the look-at margin vs `position` and `up` (the preamble).", "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::up", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 217, "signature": "Vec3 up{0.0f, 1.0f, 0.0f}", "summary": "The camera up vector (normalized internally by lookAt). Must not be near-parallel to (target - position).", "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::projection", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 219, "signature": "CameraProjection projection{CameraProjection::Ortho}", "summary": "The projection kind (Ortho — the 2.5D engine's default view).", "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::aspect", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 221, "signature": "float aspect{16.0f / 9.0f}", "summary": "Screen aspect (width / height), > 0 (used by Perspective only).", "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::halfWidth", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 223, "signature": "float halfWidth{10.0f}", "summary": "Ortho only: the view's half-extents in world units at zoom 1.", "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::halfHeight", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 224, "signature": "float halfHeight{5.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::fovY", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 227, "signature": "float fovY{60.0f * kCameraDegreesToRadians}", "summary": "Perspective only: the vertical field of view (radians); 0 < fovY < pi.", "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::zNear", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 231, "signature": "float zNear{1.0f}", "summary": "The depth slab (both kinds): the near plane sits at camera z = -zNear, the far plane at camera z = -zFar (matrices.h); zNear < zFar, and zNear may be <= 0 for orthographic slabs.", "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::zFar", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 232, "signature": "float zFar{100.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::zoom", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 235, "signature": "float zoom{1.0f}", "summary": "Zoom: the initial magnification (clamped into [zoomMin, zoomMax] at creation); the clamp bounds are per scene config (FR-2.4).", "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::zoomMin", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 236, "signature": "float zoomMin{0.1f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::zoomMax", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 237, "signature": "float zoomMax{16.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::boundsEnabled", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 239, "signature": "bool boundsEnabled{false}", "summary": "The rectangular bounds constraint (the header preamble).", "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::bounds", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 240, "signature": "CameraBounds bounds{CameraBounds{ Vec2{-1000.0f, -1000.0f}, Vec2{1000.0f, 1000.0f}}}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::followLerp", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 244, "signature": "float followLerp{0.2f}", "summary": "Smooth follow: the per-update lerp factor in (0, 1] (the preamble 's follow step).", "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::shakeDecay", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 247, "signature": "float shakeDecay{0.5f}", "summary": "Shake: the per-update decay factor in [0, 1) (0 kills the shake in one update) and the per-component offset bound in world units.", "budget": null, "experimental": false},
{"name": "laige::render::CameraOptions::maxShakeOffset", "kind": "variable", "header": "src/laige-render/include/laige/render/camera.h", "line": 248, "signature": "float maxShakeOffset{0.25f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::Camera", "kind": "class", "header": "src/laige-render/include/laige/render/camera.h", "line": 253, "signature": "class Camera", "summary": "The 3D camera core (FR-2.4). A presentation-only value object (ARCH-009) — the header preamble is the full contract.", "budget": null, "experimental": false},
{"name": "laige::render::Camera::Camera", "kind": "constructor", "header": "src/laige-render/include/laige/render/camera.h", "line": 258, "signature": "Camera() noexcept = default", "summary": "The stopped state (the failed-create / moved-from-nothing form): valid() is false, the matrix builders return the identity matrix, the mutators return InvalidArgument with no log.", "budget": null, "experimental": false},
{"name": "laige::render::Camera::Camera", "kind": "constructor", "header": "src/laige-render/include/laige/render/camera.h", "line": 261, "signature": "Camera(const Camera&) = default", "summary": "Value semantics: plain copies (no resources to own — unlike GlContext/RenderThread).", "budget": null, "experimental": false},
{"name": "laige::render::Camera::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 262, "signature": "Camera& operator=(const Camera&) = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::Camera::create", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 269, "signature": "[[nodiscard]] static laige::Result<Camera, laige::ErrorCode> create(CameraOptions options) noexcept", "summary": "Validates the options (the header preamble's failure section) and clamps the initial position into the rectangle when the bounds are enabled. One rate-limited camera/options_invalid warn per failed create (first failing option wins).", "budget": "O(1); no allocation.", "experimental": false},
{"name": "laige::render::Camera::valid", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 273, "signature": "[[nodiscard]] bool valid() const noexcept", "summary": "True when the camera holds a validated configuration.", "budget": null, "experimental": false},
{"name": "laige::render::Camera::position", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 276, "signature": "[[nodiscard]] Vec3 position() const noexcept", "summary": "The camera state (world units).", "budget": null, "experimental": false},
{"name": "laige::render::Camera::target", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 277, "signature": "[[nodiscard]] Vec3 target() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::Camera::up", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 278, "signature": "[[nodiscard]] Vec3 up() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::Camera::shakeOffset", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 280, "signature": "[[nodiscard]] Vec3 shakeOffset() const noexcept", "summary": "The current bounded shake offset (zero when none).", "budget": null, "experimental": false},
{"name": "laige::render::Camera::effectivePosition", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 283, "signature": "[[nodiscard]] Vec3 effectivePosition() const noexcept", "summary": "The effective render position: position + shakeOffset (the eye the view matrix is built from).", "budget": null, "experimental": false},
{"name": "laige::render::Camera::zoom", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 287, "signature": "[[nodiscard]] float zoom() const noexcept", "summary": "The current zoom (always in [zoomMin, zoomMax]).", "budget": null, "experimental": false},
{"name": "laige::render::Camera::following", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 289, "signature": "[[nodiscard]] bool following() const noexcept", "summary": "True while a follow target is set (stopFollowing clears it).", "budget": null, "experimental": false},
{"name": "laige::render::Camera::projectionKind", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 290, "signature": "[[nodiscard]] CameraProjection projectionKind() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::Camera::zoomMin", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 296, "signature": "[[nodiscard]] float zoomMin() const noexcept", "summary": "The zoom clamp bounds (the preamble's zoom contract: zoom() is always in [zoomMin, zoomMax]). M2-CAM-02's grid-snap zoom levels are anchored at zoomMin.", "budget": null, "experimental": false},
{"name": "laige::render::Camera::zoomMax", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 297, "signature": "[[nodiscard]] float zoomMax() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::Camera::boundsEnabled", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 301, "signature": "[[nodiscard]] bool boundsEnabled() const noexcept", "summary": "The rectangular-bounds state (the preamble's bounds contract): whether the rectangle is enabled and the rectangle itself (closed, min <= max per component). The camera's z is unconstrained.", "budget": null, "experimental": false},
{"name": "laige::render::Camera::bounds", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 302, "signature": "[[nodiscard]] CameraBounds bounds() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::Camera::maxShakeOffset", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 305, "signature": "[[nodiscard]] float maxShakeOffset() const noexcept", "summary": "The shake offset bound (world units per component) — the look-at margin's bound term (the preamble's margin contract).", "budget": null, "experimental": false},
{"name": "laige::render::Camera::setPosition", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 317, "signature": "[[nodiscard]] laige::Status setPosition(Vec3 position) noexcept", "summary": "Sets the camera position. (x, y) are CLAMPED into the rectangle when the bounds are enabled — the documented constraint, never an error. Rejects (InvalidArgument + warn) non-finite input and input that violates the look-at margin (|target - p| > maxShakeOffset, up not near-parallel). State is unchanged on rejection.", "budget": "O(1); no allocation.", "experimental": false},
{"name": "laige::render::Camera::setTarget", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 319, "signature": "[[nodiscard]] laige::Status setTarget(Vec3 target) noexcept", "summary": "Sets the look-at point (the mirror of setPosition).", "budget": null, "experimental": false},
{"name": "laige::render::Camera::setFollowTarget", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 324, "signature": "[[nodiscard]] laige::Status setFollowTarget(Vec3 target) noexcept", "summary": "Sets the follow target and enables the smooth follow (the preamble's follow step; update() applies it from the next call). Rejects non-finite input (InvalidArgument + warn).", "budget": null, "experimental": false},
{"name": "laige::render::Camera::stopFollowing", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 326, "signature": "void stopFollowing() noexcept", "summary": "Disables the follow (the camera stops sliding on the next update).", "budget": null, "experimental": false},
{"name": "laige::render::Camera::setZoom", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 331, "signature": "[[nodiscard]] laige::Status setZoom(float zoom) noexcept", "summary": "Sets the zoom: CLAMPED into [zoomMin, zoomMax], exact at the bounds (below min yields exactly min, above max exactly max) — clamping is documented behavior, not an error. Rejects non-finite input.", "budget": null, "experimental": false},
{"name": "laige::render::Camera::applyShake", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 337, "signature": "[[nodiscard]] laige::Status applyShake(Vec3 impulse) noexcept", "summary": "Adds a bounded shake impulse: the offset becomes clamp(offset + impulse, -maxShakeOffset, +maxShakeOffset) per component (the header preamble's shake section). Rejects non- finite input.", "budget": null, "experimental": false},
{"name": "laige::render::Camera::update", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 342, "signature": "void update() noexcept", "summary": "The per-frame update (the preamble's 3-step order: follow step, bounds clamp, shake decay). No-op on a stopped camera.", "budget": "O(1) float ops; no allocation; no logging.", "experimental": false},
{"name": "laige::render::Camera::view", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 351, "signature": "[[nodiscard]] Mat4 view() const noexcept", "summary": "The view matrix (world -> camera space): lookAt(effectivePosition, target, up) — the shake moves the eye. The identity matrix on a stopped camera.", "budget": null, "experimental": false},
{"name": "laige::render::Camera::projection", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 354, "signature": "[[nodiscard]] Mat4 projection() const noexcept", "summary": "The projection matrix (camera -> NDC) with the current zoom applied (the preamble's zoom semantics). The identity on a stopped camera.", "budget": null, "experimental": false},
{"name": "laige::render::Camera::viewProjection", "kind": "method", "header": "src/laige-render/include/laige/render/camera.h", "line": 358, "signature": "[[nodiscard]] Mat4 viewProjection() const noexcept", "summary": "The combined world -> NDC matrix (projection * view) — the frame's render matrix (M2-SPRITE-02 consumes it). The identity on a stopped camera.", "budget": null, "experimental": false},
{"name": "laige::render::kDepthSortDigitBits", "kind": "variable", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 180, "signature": "inline constexpr std::int32_t kDepthSortDigitBits = 8", "summary": "The radix digit width in bits: 8 -> 256 buckets per pass (the fixed-cost sweet spot, the preamble's algorithm section).", "budget": null, "experimental": false},
{"name": "laige::render::kDepthSortPasses", "kind": "variable", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 182, "signature": "inline constexpr std::int32_t kDepthSortPasses = 32 / kDepthSortDigitBits", "summary": "The number of LSD passes over a 32-bit key (exactly 32 / 8).", "budget": null, "experimental": false},
{"name": "laige::render::kDepthSortBuckets", "kind": "variable", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 184, "signature": "inline constexpr std::uint32_t kDepthSortBuckets = 1u << kDepthSortDigitBits", "summary": "The bucket count per pass (2^digit bits).", "budget": null, "experimental": false},
{"name": "laige::render::kDepthSortMaxCapacity", "kind": "variable", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 189, "signature": "inline constexpr std::uint32_t kDepthSortMaxCapacity = 0xFFFFFFFFu", "summary": "The most capacity a sorter may own: the input position must fit the 32-bit index field (the sortedIndices span is uint32 — n positions must fit).", "budget": null, "experimental": false},
{"name": "laige::render::kDepthSortBytesPerSlot", "kind": "variable", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 192, "signature": "inline constexpr std::size_t kDepthSortBytesPerSlot = 16", "summary": "Bytes of storage per capacity slot: the four uint32 buffers (current keys, auxiliary keys, current indices, auxiliary indices).", "budget": null, "experimental": false},
{"name": "laige::render::DepthSort", "kind": "class", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 214, "signature": "class DepthSort", "summary": "One sorter per sprite pass: the frame's 32-bit depth keys, sorted stably into back-to-front order (the model, the tie-break, the algorithm, the determinism, the ownership, and the performance contracts: the header preamble).", "budget": null, "experimental": false},
{"name": "laige::render::DepthSort::DepthSort", "kind": "constructor", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 220, "signature": "DepthSort() noexcept = default", "summary": "The default state: the EMPTY sorter (capacity 0, no storage). An empty key list sorts fine (n = 0); any non-empty sort is BudgetExhausted (n > capacity) — the stopped-state pattern of the module's value objects (IsoCamera), total and never UB.", "budget": null, "experimental": false},
{"name": "laige::render::DepthSort::create", "kind": "method", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 228, "signature": "[[nodiscard]] static Result<DepthSort> create(std::size_t capacity) noexcept", "summary": "The set-up path: one flat allocation of 4 * capacity * 4 bytes (kDepthSortBytesPerSlot per slot) + the fixed 1 KB counter table (a class member — no heap). O(capacity) time and space.", "budget": null, "experimental": false},
{"name": "laige::render::DepthSort::sort", "kind": "method", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 238, "signature": "[[nodiscard]] Status sort(std::span<const std::uint32_t> keys) noexcept", "summary": "The per-frame path: stably sorts the frame's n keys (0 <= n <= capacity) into the internal storage. O(4n + 4*256); zero allocation; no logging; no GL. Deterministic (the preamble).", "budget": null, "experimental": false},
{"name": "laige::render::DepthSort::sortedCount", "kind": "method", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 249, "signature": "[[nodiscard]] std::size_t sortedCount() const noexcept", "summary": "The frame's sorted order after sort() (O(1) accessors; the spans alias the internal storage and are invalidated by the next sort() — read them within the frame):", "budget": null, "experimental": false},
{"name": "laige::render::DepthSort::sortedKeys", "kind": "method", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 250, "signature": "[[nodiscard]] std::span<const std::uint32_t> sortedKeys() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::DepthSort::sortedIndices", "kind": "method", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 253, "signature": "[[nodiscard]] std::span<const std::uint32_t> sortedIndices() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::DepthSort::capacity", "kind": "method", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 258, "signature": "[[nodiscard]] std::size_t capacity() const noexcept", "summary": "The sorter's capacity (the create() argument).", "budget": null, "experimental": false},
{"name": "laige::render::DepthSort::DepthSort", "kind": "constructor", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 260, "signature": "DepthSort(const DepthSort&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::DepthSort::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 261, "signature": "DepthSort& operator=(const DepthSort&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::DepthSort::DepthSort", "kind": "constructor", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 267, "signature": "DepthSort(DepthSort&& other) noexcept", "summary": "Explicit move (the raw buffer pointers make the defaulted move unsafe for the moved-from object — it would dangle into the destination, the IsoDepthKeyTable pattern): the owner moves with the storage; the source becomes empty (buffers null, count 0, capacity 0 — CORE-009).", "budget": null, "experimental": false},
{"name": "laige::render::DepthSort::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/depth_sort.h", "line": 268, "signature": "DepthSort& operator=(DepthSort&& other) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::FrameDescriptor", "kind": "struct", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 261, "signature": "struct FrameDescriptor", "summary": "One presentation frame's handed-off data (PRD §10.2: the frame descriptor of the lock-free handoff). A 32-byte POD — one plain copy per publish (PERF-005: no pointer graph, no allocation).", "budget": null, "experimental": false},
{"name": "laige::render::FrameDescriptor::frameIndex", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 264, "signature": "std::uint64_t frameIndex{}", "summary": "The producer's 1-based frame counter (see the header ownership section).", "budget": null, "experimental": false},
{"name": "laige::render::FrameDescriptor::simTick", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 267, "signature": "std::uint64_t simTick{}", "summary": "The last completed sim tick at publish time (0 before the first tick — the GameLoop's currentTick() value).", "budget": null, "experimental": false},
{"name": "laige::render::FrameDescriptor::renderTimeNs", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 271, "signature": "std::int64_t renderTimeNs{}", "summary": "The frame's presentation time (ns on the engine's monotonic steady time base) — the presentation/interpolation render_time (M1-LOOP-02).", "budget": null, "experimental": false},
{"name": "laige::render::FrameDescriptor::frameData", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 274, "signature": "void* frameData{}", "summary": "Opaque per-frame payload (NON-owning; the producer owns it and it must outlive the frame's render — the header ownership section).", "budget": null, "experimental": false},
{"name": "laige::render::StageFn", "kind": "alias", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 281, "signature": "using StageFn = void (*)(void* context, const FrameDescriptor& frame) noexcept", "summary": "A frame pipeline stage callback: the cull/batch stage (before submit) or the submit stage. Runs ON the render thread, once per rendered frame, with the frame's descriptor. MUST be bounded and non-blocking (API-005). nullptr = the stage is skipped (a no-op).", "budget": null, "experimental": false},
{"name": "laige::render::RenderThreadOptions", "kind": "struct", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 286, "signature": "struct RenderThreadOptions", "summary": "The render thread's configuration (API-006: an option structure, not positional booleans).", "budget": null, "experimental": false},
{"name": "laige::render::RenderThreadOptions::batchStage", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 288, "signature": "StageFn batchStage{nullptr}", "summary": "The cull/batch stage (runs before submitStage); nullptr = no-op.", "budget": null, "experimental": false},
{"name": "laige::render::RenderThreadOptions::submitStage", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 290, "signature": "StageFn submitStage{nullptr}", "summary": "The submit stage (the frame's draw work); nullptr = no-op.", "budget": null, "experimental": false},
{"name": "laige::render::RenderThreadOptions::stageContext", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 293, "signature": "void* stageContext{nullptr}", "summary": "The stage callbacks' user context (non-owning; the owner's responsibility — e.g. the batcher's state).", "budget": null, "experimental": false},
{"name": "laige::render::RenderThreadOptions::StartFn", "kind": "alias", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 298, "signature": "using StartFn = void (*)(void* context) noexcept", "summary": "The render-thread start hook: runs ONCE on the render thread before the first frame (the GlContext::makeCurrent takeover — release-then-bind per docs/api/gl_context.md); nullptr = none. Bounded, non-blocking (API-005).", "budget": null, "experimental": false},
{"name": "laige::render::RenderThreadOptions::onStart", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 299, "signature": "StartFn onStart{nullptr}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::RenderThreadOptions::onStartContext", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 301, "signature": "void* onStartContext{nullptr}", "summary": "onStart's context (non-owning); nullptr when onStart is null.", "budget": null, "experimental": false},
{"name": "laige::render::RenderThreadOptions::StopFn", "kind": "alias", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 308, "signature": "using StopFn = void (*)(void* context) noexcept", "summary": "The render-thread stop hook: runs ONCE on the render thread AFTER the last frame and before the thread exits — the mirror of onStart (the GlContext::release hand-back: the P0 EGL stack cannot rebind a context last held by a DEAD thread, so the thread that last held it must release it while still alive — docs/api/gl_context.md); nullptr = none. Bounded, non-blocking (API-005).", "budget": null, "experimental": false},
{"name": "laige::render::RenderThreadOptions::onStop", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 309, "signature": "StopFn onStop{nullptr}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::RenderThreadOptions::onStopContext", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 311, "signature": "void* onStopContext{nullptr}", "summary": "onStop's context (non-owning); nullptr when onStop is null.", "budget": null, "experimental": false},
{"name": "laige::render::RenderThreadStats", "kind": "struct", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 316, "signature": "struct RenderThreadStats", "summary": "The since-construction counters (the cold snapshot; the authoritative source of the Profiler's frame-drop field, M2-SPRITE-04).", "budget": null, "experimental": false},
{"name": "laige::render::RenderThreadStats::framesSubmitted", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 318, "signature": "std::uint64_t framesSubmitted{}", "summary": "Every publish (including dropped frames).", "budget": null, "experimental": false},
{"name": "laige::render::RenderThreadStats::framesRendered", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 322, "signature": "std::uint64_t framesRendered{}", "summary": "Frames whose pipeline stages have completed (a frame is counted when its submit stage returns; after waitIdle or shutdown, every published frame is accounted — rendered, dropped, or outstanding).", "budget": null, "experimental": false},
{"name": "laige::render::RenderThreadStats::framesDropped", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 326, "signature": "std::uint64_t framesDropped{}", "summary": "Older frames dropped by the backpressure (PERF-008) — the exact count: framesSubmitted - framesRendered - outstanding (the header preamble's invariant).", "budget": null, "experimental": false},
{"name": "laige::render::RenderThread", "kind": "class", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 333, "signature": "class RenderThread", "summary": "The render thread + the single-slot lock-free frame handoff (PRD §10.2; the synchronization argument is in the header preamble). The constructor spawns the consumer thread after all state members are initialized; shutdown() joins it. Move-only.", "budget": null, "experimental": false},
{"name": "laige::render::RenderThread::RenderThread", "kind": "constructor", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 341, "signature": "explicit RenderThread(RenderThreadOptions options) noexcept", "summary": "Spawns the consumer thread (in the body, after every state member is initialized — the ownership section's order argument) and runs Options::onStart on it (the GL takeover hook). A thread-spawn failure terminates the process (exceptions disabled — a documented platform boundary, CORE-008). One Info lifecycle event (render_thread/thread_started).", "budget": null, "experimental": false},
{"name": "laige::render::RenderThread::~RenderThread", "kind": "destructor", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 342, "signature": "~RenderThread()", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::RenderThread::RenderThread", "kind": "constructor", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 346, "signature": "RenderThread(RenderThread&&) noexcept", "summary": "The move stops the source (joins a live thread) and the moved-to object is STOPPED (the GlContext precedent) — construct in place.", "budget": null, "experimental": false},
{"name": "laige::render::RenderThread::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 347, "signature": "RenderThread& operator=(RenderThread&&) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::RenderThread::RenderThread", "kind": "constructor", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 348, "signature": "RenderThread(const RenderThread&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::RenderThread::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 349, "signature": "RenderThread& operator=(const RenderThread&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::RenderThread::running", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 352, "signature": "[[nodiscard]] bool running() const noexcept", "summary": "True while the thread is running (false once stopped/moved-from).", "budget": null, "experimental": false},
{"name": "laige::render::RenderThread::submitFrame", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 361, "signature": "[[nodiscard]] laige::Status submitFrame(const FrameDescriptor& frame) noexcept", "summary": "The owner-thread (main/sim) publish of one frame — the HOT PATH: O(1) atomics + one 32-byte copy, no allocation, no lock, no log on the healthy path. Single-slot backpressure: a pending frame (the consumer more than one frame behind) is DROPPED in place — one rate-limited render_thread/frame_dropped warn. Stopped → InvalidArgument (no log — the stopped-state precedent).", "budget": "O(1); no allocation; one release store.", "experimental": false},
{"name": "laige::render::RenderThread::waitIdle", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 368, "signature": "void waitIdle() noexcept", "summary": "The owner-thread barrier: blocks until every published frame is fully processed (no pending frame, no in-flight pipeline). Bounded by the single slot (at most one frame's pipeline work) plus the stage callbacks' bound (API-005). No-op on a stopped object.", "budget": "O(1) yield-spin; one bounded wait per frame.", "experimental": false},
{"name": "laige::render::RenderThread::shutdown", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 375, "signature": "void shutdown() noexcept", "summary": "Ordered idempotent shutdown (CONC-006): stop request + thread join + stopped mark; a second call is a no-op; safe on a stopped object. It does NOT flush a pending frame — call waitIdle() first when the last frame must render. One Info lifecycle event (render_thread/thread_stopped) per actual stop.", "budget": null, "experimental": false},
{"name": "laige::render::RenderThread::stats", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 382, "signature": "[[nodiscard]] RenderThreadStats stats() const noexcept", "summary": "The since-construction counters (cold: a few relaxed atomic reads). Invariant (exact at every instant): framesSubmitted = framesRendered + framesDropped + outstanding, where outstanding = pending slot (≤ 1) + in-flight frame (≤ 1) — the header preamble's accounting section.", "budget": null, "experimental": false},
{"name": "laige::render::kMinFrameRateHz", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 417, "signature": "inline constexpr std::uint32_t kMinFrameRateHz = 1", "summary": "The documented frame-rate range (CORE-005; API-006): 1–1000 Hz.", "budget": null, "experimental": false},
{"name": "laige::render::kDefaultFrameRateHz", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 418, "signature": "inline constexpr std::uint32_t kDefaultFrameRateHz = 60", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::kMaxFrameRateHz", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 419, "signature": "inline constexpr std::uint32_t kMaxFrameRateHz = 1000", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::FrameClockOptions", "kind": "struct", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 422, "signature": "struct FrameClockOptions", "summary": "The frame clock's configuration (API-006).", "budget": null, "experimental": false},
{"name": "laige::render::FrameClockOptions::frameRateHz", "kind": "variable", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 427, "signature": "std::uint32_t frameRateHz{kDefaultFrameRateHz}", "summary": "The pace of the frame deadline grid (Hz), in [kMinFrameRateHz, kMaxFrameRateHz]. Windowed: the display's refresh rate (GlContext::refreshRateHz, 0 → the target rate); headless: the target pace.", "budget": null, "experimental": false},
{"name": "laige::render::FrameClock", "kind": "class", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 434, "signature": "class FrameClock", "summary": "The vsync-paced frame clock (the frame deadline grid + the render_time provider — the header preamble's clock section). Move-only; a stopped (default/moved-from) clock is a no-op (every operation returns 0).", "budget": null, "experimental": false},
{"name": "laige::render::FrameClock::FrameClock", "kind": "constructor", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 437, "signature": "FrameClock() noexcept", "summary": "The stopped state (the failed-create and moved-from form).", "budget": null, "experimental": false},
{"name": "laige::render::FrameClock::~FrameClock", "kind": "destructor", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 438, "signature": "~FrameClock() = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::FrameClock::FrameClock", "kind": "constructor", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 439, "signature": "FrameClock(FrameClock&&) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::FrameClock::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 440, "signature": "FrameClock& operator=(FrameClock&&) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::FrameClock::FrameClock", "kind": "constructor", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 441, "signature": "FrameClock(const FrameClock&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::FrameClock::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 442, "signature": "FrameClock& operator=(const FrameClock&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::FrameClock::create", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 448, "signature": "[[nodiscard]] static laige::Result<FrameClock, laige::ErrorCode> create(FrameClockOptions options) noexcept", "summary": "Validates the frame rate (outside [kMinFrameRateHz, kMaxFrameRateHz] → InvalidArgument + one rate-limited render_thread/frame_rate_invalid warn) and records the reference (one steady_clock read — setup path).", "budget": null, "experimental": false},
{"name": "laige::render::FrameClock::valid", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 451, "signature": "[[nodiscard]] bool valid() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::FrameClock::frameRateHz", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 452, "signature": "[[nodiscard]] std::uint32_t frameRateHz() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::FrameClock::periodNs", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 453, "signature": "[[nodiscard]] std::uint64_t periodNs() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::FrameClock::referenceNs", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 455, "signature": "[[nodiscard]] std::int64_t referenceNs() const noexcept", "summary": "The grid origin (the steady_clock reading of create()).", "budget": null, "experimental": false},
{"name": "laige::render::FrameClock::nowNs", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 458, "signature": "[[nodiscard]] std::int64_t nowNs() const noexcept", "summary": "The clock's time base (the engine's monotonic steady ns — the M1 clock epoch). O(1).", "budget": null, "experimental": false},
{"name": "laige::render::FrameClock::deadlineNs", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 462, "signature": "[[nodiscard]] std::int64_t deadlineNs(std::uint64_t frameIndex) const noexcept", "summary": "Frame N's presentation deadline (N 1-based; exact integer; clamped to INT64_MAX beyond the 2^63 ns frame-time bound — the GameLoop clock bound). O(1).", "budget": null, "experimental": false},
{"name": "laige::render::FrameClock::waitFrame", "kind": "method", "header": "src/laige-render/include/laige/render/frame_pipeline.h", "line": 469, "signature": "[[nodiscard]] std::int64_t waitFrame(std::uint64_t frameIndex) noexcept", "summary": "Paces the owner thread: blocks until frame N's deadline (one bounded sleep), then returns the frame's ACTUAL presentation time (the render_time for the presentation/interpolation path — on time the deadline, late the real clock reading; ARCH-009 wall-clock fact).", "budget": "O(1) + one bounded sleep_until.", "experimental": false},
{"name": "laige::render::GlVersion", "kind": "struct", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 69, "signature": "struct GlVersion", "summary": "A GL version (the major.minor of GL_VERSION).", "budget": null, "experimental": false},
{"name": "laige::render::GlVersion::major", "kind": "variable", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 70, "signature": "std::int32_t major", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::GlVersion::minor", "kind": "variable", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 71, "signature": "std::int32_t minor", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::GlCapabilities", "kind": "struct", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 77, "signature": "struct GlCapabilities", "summary": "Capability snapshot queried once, right after context creation (the PRD §6 \"capability query\"). Read-only after creation (published state — consumers read it, never take locks; DBG-005).", "budget": null, "experimental": false},
{"name": "laige::render::GlCapabilities::version", "kind": "variable", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 78, "signature": "GlVersion version", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::GlCapabilities::coreProfile", "kind": "variable", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 79, "signature": "bool coreProfile", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::GlCapabilities::maxTextureSize", "kind": "variable", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 80, "signature": "std::int32_t maxTextureSize", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::GlCapabilities::vendor", "kind": "variable", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 82, "signature": "char vendor[128]", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::GlCapabilities::renderer", "kind": "variable", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 83, "signature": "char renderer[128]", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::kGlMajor", "kind": "variable", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 89, "signature": "constexpr std::int32_t kGlMajor = 3", "summary": "The engine's minimum: OpenGL 3.3 core (PRD §6). Named constants — the gate below and the context-creation hints both use them, so the requirement lives in one place (CORE-005).", "budget": null, "experimental": false},
{"name": "laige::render::kGlMinor", "kind": "variable", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 90, "signature": "constexpr std::int32_t kGlMinor = 3", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::kMaxContextDimension", "kind": "variable", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 96, "signature": "constexpr std::int32_t kMaxContextDimension = 16384", "summary": "Documented dimension bound for created render targets (API-008): 16384x16384x4 bytes = 1 GiB of RGBA8 offscreen storage — a driver's maxTextureSize (queried after creation) is the real ceiling, and no P0 desktop configuration drives a per-context target above this.", "budget": null, "experimental": false},
{"name": "laige::render::checkGlVersion", "kind": "function", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 103, "signature": "[[nodiscard]] Status checkGlVersion(std::int32_t major, std::int32_t minor, bool coreProfile)", "summary": "Pure gate: ok iff (major, minor, coreProfile) satisfies the engine's OpenGL 3.3 core requirement (kGlMajor.kGlMinor, core profile). createWindowed/createHeadless apply it to the driver-reported values; it is public so the requirement is unit-testable without a GL context (the M2-GL-01 \"missing GL 3.3 -> clean error\" test).", "budget": null, "experimental": false},
{"name": "laige::render::GlContext", "kind": "class", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 109, "signature": "class GlContext", "summary": "One OpenGL 3.3 core context plus its render target (the window frame buffer, or the offscreen FBO). See the file preamble for the full contract; docs/api/gl_context.md is the normative API document.", "budget": null, "experimental": false},
{"name": "laige::render::GlContext::GlContext", "kind": "constructor", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 114, "signature": "GlContext() noexcept", "summary": "A default-constructed context is stopped — every operation fails (no window, no context). The valid() check is the public query. (Defined in the .cpp: the pimpl member needs Impl complete.)", "budget": null, "experimental": false},
{"name": "laige::render::GlContext::GlContext", "kind": "constructor", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 115, "signature": "GlContext(const GlContext&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::GlContext::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 116, "signature": "GlContext& operator=(const GlContext&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::GlContext::GlContext", "kind": "constructor", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 117, "signature": "GlContext(GlContext&&) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::GlContext::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 118, "signature": "GlContext& operator=(GlContext&&) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::GlContext::~GlContext", "kind": "destructor", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 119, "signature": "~GlContext()", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::GlContext::createWindowed", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 131, "signature": "[[nodiscard]] static Result<GlContext> createWindowed( std::int32_t width, std::int32_t height, const char* title)", "summary": "A GLFW window of width x height pixels with the given title, plus a 3.3 core context on it (PRD §11 windowing). title must be a non-empty NUL-terminated string (ErrorCode::InvalidArgument otherwise). Width/height must be within [1, kMaxContextDimension].", "budget": null, "experimental": false},
{"name": "laige::render::GlContext::createHeadless", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 142, "signature": "[[nodiscard]] static Result<GlContext> createHeadless( std::int32_t width, std::int32_t height)", "summary": "A display-less offscreen context of width x height pixels: on Linux an EGL surfaceless context, on Windows/macOS a never-shown GLFW window (docs/api/gl_context.md). The render target is an offscreen FBO (RGBA8, width x height) owned by the context.", "budget": null, "experimental": false},
{"name": "laige::render::GlContext::valid", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 146, "signature": "[[nodiscard]] bool valid() const noexcept", "summary": "False when stopped (default-constructed or moved-from).", "budget": null, "experimental": false},
{"name": "laige::render::GlContext::version", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 150, "signature": "[[nodiscard]] const GlVersion& version() const noexcept", "summary": "The version the driver realized (the gate is >= 3.3 core). Precondition: valid().", "budget": null, "experimental": false},
{"name": "laige::render::GlContext::capabilities", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 153, "signature": "[[nodiscard]] const GlCapabilities& capabilities() const noexcept", "summary": "The creation-time capability snapshot. Precondition: valid().", "budget": null, "experimental": false},
{"name": "laige::render::GlContext::width", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 157, "signature": "[[nodiscard]] std::int32_t width() const noexcept", "summary": "The render-target size (the window, or the FBO). Precondition: valid().", "budget": null, "experimental": false},
{"name": "laige::render::GlContext::height", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 158, "signature": "[[nodiscard]] std::int32_t height() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::GlContext::frameBuffer", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 166, "signature": "[[nodiscard]] std::uint32_t frameBuffer() const noexcept", "summary": "The render-target frame buffer: the offscreen FBO on headless contexts, 0 (the default frame buffer — the window) on windowed ones. The per-frame draw path binds it once per frame (the class's clear()/readPixel() bind it per call); a frame-pass (M2-SPRITE-02) binds it at the frame's start. No GL call (a creation-time handle); O(1). 0 when stopped.", "budget": null, "experimental": false},
{"name": "laige::render::GlContext::makeCurrent", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 174, "signature": "[[nodiscard]] Status makeCurrent() const", "summary": "Bind this context to the calling thread (one thread current at a time, CONC-001). The M2-GL-02 render thread calls this on takeover AFTER the old owner has called release() (the P0 EGL stack rejects a takeover while the context is still current on another live thread); re-calling on the current thread is a no-op success. Precondition: valid(). Failure: GlUnavailable.", "budget": null, "experimental": false},
{"name": "laige::render::GlContext::release", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 183, "signature": "[[nodiscard]] Status release() const", "summary": "Unbind this context from the calling thread (the context stays valid and is no longer current on ANY thread). The first step of a cross-thread handoff — release here, makeCurrent on the new thread (the class preamble's handoff protocol). A no-op success when the calling thread holds no context. Not a hot path (a handoff/setup call, never per-frame). Precondition: valid(). Failure: GlUnavailable.", "budget": null, "experimental": false},
{"name": "laige::render::GlContext::clear", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 192, "signature": "[[nodiscard]] Status clear(float r, float g, float b, float a) const", "summary": "Clear the render target (the FBO on headless contexts, the window frame buffer on windowed contexts) to an RGBA color; the float components are clamped to [0, 1] before conversion to RGBA8. The minimal frame primitive — the sprite draw path lands in M2-SPRITE-02. O(1), no allocation. Precondition: valid(); the context must be current on the calling thread (InvalidArgument otherwise — a precondition violation, not an engine failure).", "budget": null, "experimental": false},
{"name": "laige::render::GlContext::readPixel", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 198, "signature": "[[nodiscard]] Status readPixel(std::int32_t x, std::int32_t y, std::uint8_t rgba[4]) const", "summary": "Read one RGBA8 pixel from the render target; (0, 0) is bottom-left (the GL convention). O(1), no allocation. Precondition: valid(); the context must be current on the calling thread; (x, y) within [0, width) x [0, height) (InvalidArgument otherwise).", "budget": null, "experimental": false},
{"name": "laige::render::GlContext::refreshRateHz", "kind": "method", "header": "src/laige-render/include/laige/render/gl_context.h", "line": 208, "signature": "[[nodiscard]] std::uint32_t refreshRateHz() const noexcept", "summary": "The windowed context's display refresh rate (Hz); 0 when unavailable (a headless context — the FBO is the render target and nothing is ever presented — or a monitor/video-mode query failure). No GL call (a GLFW window query): the context need not be current on the calling thread. The M2-GL-02 frame clock uses this as the vsync pace (docs/api/frame_pipeline.md); 0 → the caller's target rate stands in. Precondition: valid(); O(1), no allocation.", "budget": null, "experimental": false},
{"name": "laige::render::kIsoSnapSqrtTwo", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 246, "signature": "inline constexpr float kIsoSnapSqrtTwo = 1.4142135623730951f", "summary": "The sqrt(2) factor of the grid-snap margin bound (g*sqrt(2)/2: the snap's worst-case Euclidean movement, g/2 per ground axis) and of the zoom-level midpoint (level*sqrt(2), the geometric mean of two adjacent dyadic levels). The float literal closest to sqrt(2).", "budget": null, "experimental": false},
{"name": "laige::render::kIsoSnapMarginPerCell", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 249, "signature": "inline constexpr float kIsoSnapMarginPerCell = kIsoSnapSqrtTwo * 0.5f", "summary": "The snap margin per grid cell (CORE-005): the worst-case distance the snap moves the position, in world units per unit of gridSize.", "budget": null, "experimental": false},
{"name": "laige::render::kIsoSnapMinGridSize", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 253, "signature": "inline constexpr float kIsoSnapMinGridSize = 1e-6f", "summary": "The minimum grid size (world units): below it the snap of a position at the documented world-domain edge (32767 units) can exceed the float-integer representable range of the snap arithmetic (CORE-005).", "budget": null, "experimental": false},
{"name": "laige::render::IsoPresetKind", "kind": "enum", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 257, "signature": "enum class IsoPresetKind", "summary": "The isometric preset selector (ADR 0005; the single config value of FR-2.4 / FR-2.5). The engine default is Dimetric2To1 (ADR 0005).", "budget": null, "experimental": false},
{"name": "laige::render::IsoPresetKind::Dimetric2To1", "kind": "enumerator", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 258, "signature": "Dimetric2To1", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoPresetKind::TrueIso3060", "kind": "enumerator", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 259, "signature": "TrueIso3060", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoPresetKind::CustomShear", "kind": "enumerator", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 260, "signature": "CustomShear", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoPreset", "kind": "struct", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 267, "signature": "struct IsoPreset", "summary": "The single preset config value (API-006: one struct, no positional booleans). For Dimetric2To1 / TrueIso3060 only `scale` is read (the axes come from the M2-GL-03 builders at creation); for CustomShear only `axes` is read.", "budget": null, "experimental": false},
{"name": "laige::render::IsoPreset::kind", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 268, "signature": "IsoPresetKind kind{IsoPresetKind::Dimetric2To1}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoPreset::scale", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 269, "signature": "float scale{1.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoPreset::axes", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 270, "signature": "IsoAxes axes{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::GridSnapOptions", "kind": "struct", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 275, "signature": "struct GridSnapOptions", "summary": "The grid-snap camera mode (FR-2.4). Off by default — the plain M2-CAM-01 camera behavior (free position, clamped continuous zoom).", "budget": null, "experimental": false},
{"name": "laige::render::GridSnapOptions::enabled", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 276, "signature": "bool enabled{false}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::GridSnapOptions::gridSize", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 278, "signature": "float gridSize{1.0f}", "summary": "World units per grid cell (finite, > 0, >= kIsoSnapMinGridSize).", "budget": null, "experimental": false},
{"name": "laige::render::IsoCameraOptions", "kind": "struct", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 284, "signature": "struct IsoCameraOptions", "summary": "The scene-level isometric camera configuration (API-006): the M2-CAM-01 camera options + the preset + the snap mode. A plain value — no ownership, nothing to release.", "budget": null, "experimental": false},
{"name": "laige::render::IsoCameraOptions::camera", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 285, "signature": "CameraOptions camera{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoCameraOptions::preset", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 286, "signature": "IsoPreset preset{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoCameraOptions::snap", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 287, "signature": "GridSnapOptions snap{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera", "kind": "class", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 293, "signature": "class IsoCamera", "summary": "The isometric camera (FR-2.4): the M2-CAM-01 Camera (position, follow, bounds, shake, zoom) + the preset matrix build + the grid- snap mode. The header preamble is the full contract.", "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera::IsoCamera", "kind": "constructor", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 298, "signature": "IsoCamera() noexcept = default", "summary": "The stopped state (the failed-create / default form): valid() false, matrix() the identity, the mutators InvalidArgument with no log, update() a no-op.", "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera::IsoCamera", "kind": "constructor", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 300, "signature": "IsoCamera(const IsoCamera&) = default", "summary": "Value semantics: plain copies (no resources to own).", "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 301, "signature": "IsoCamera& operator=(const IsoCamera&) = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera::create", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 309, "signature": "[[nodiscard]] static laige::Result<IsoCamera, laige::ErrorCode> create(IsoCameraOptions options) noexcept", "summary": "Validates the options (the header preamble's failure section) and snaps the initial position into the grid when the snap is enabled. One rate-limited iso_camera/options_invalid warn per failed create (first failure wins; the camera's own failures use the M2-CAM-01 `camera/options_invalid` event).", "budget": "O(1); no allocation (one warn string on failure).", "experimental": false},
{"name": "laige::render::IsoCamera::valid", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 313, "signature": "[[nodiscard]] bool valid() const noexcept", "summary": "True when the camera holds a validated configuration.", "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera::camera", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 318, "signature": "[[nodiscard]] const Camera& camera() const noexcept", "summary": "The owned M2-CAM-01 camera (const — all mutation goes through the snap-aware IsoCamera mutators below): position/target/up, follow, shake, zoom, bounds.", "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera::preset", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 320, "signature": "[[nodiscard]] const IsoPreset& preset() const noexcept", "summary": "The selected preset (the config value as validated at creation).", "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera::gridSnapEnabled", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 322, "signature": "[[nodiscard]] bool gridSnapEnabled() const noexcept", "summary": "The grid-snap state (false: the plain M2-CAM-01 behavior).", "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera::gridSize", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 323, "signature": "[[nodiscard]] float gridSize() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera::matrix", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 334, "signature": "[[nodiscard]] Mat4 matrix() const noexcept", "summary": "The combined world -> NDC affine matrix of the camera's current state (the header preamble's matrix section) — the frame's render matrix (M2-SPRITE-02 consumes it). The identity on a stopped camera. Build it once per frame change, never per sprite.", "budget": "O(1); no allocation.", "experimental": false},
{"name": "laige::render::IsoCamera::setPosition", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 347, "signature": "[[nodiscard]] laige::Status setPosition(Vec3 position) noexcept", "summary": "Sets the camera position. (x, y) are clamped into the bounds rectangle (when enabled), then snapped to the grid (when the snap is enabled) — the candidate is validated against the (inflated, snap mode) look-at margin before it is committed: state is unchanged on rejection (InvalidArgument + warn, the header preamble's failure section). z is never snapped.", "budget": "O(1); no allocation.", "experimental": false},
{"name": "laige::render::IsoCamera::setTarget", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 351, "signature": "[[nodiscard]] laige::Status setTarget(Vec3 target) noexcept", "summary": "Sets the look-at point (free — the grid locks the camera position, not the look-at point). Validated against the (inflated, snap mode) look-at margin; state unchanged on rejection.", "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera::setFollowTarget", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 357, "signature": "[[nodiscard]] laige::Status setFollowTarget(Vec3 target) noexcept", "summary": "Sets the follow target and enables the smooth follow (the M2-CAM-01 follow step; update() applies it — in snap mode the follow runs in grid steps: the position is snapped after every follow step). Rejects non-finite input (InvalidArgument + warn).", "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera::stopFollowing", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 359, "signature": "void stopFollowing() noexcept", "summary": "Disables the follow (the camera stops sliding on the next update).", "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera::setZoom", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 367, "signature": "[[nodiscard]] laige::Status setZoom(float zoom) noexcept", "summary": "Sets the zoom. Snap mode: snapped to the documented dyadic ladder (the header preamble's zoom section — the result is always an exact member of L; below/above the bounds clamp to the bounds). No snap mode: the M2-CAM-01 clamp into [zoomMin, zoomMax]. Rejects non-finite input (InvalidArgument + warn).", "budget": "O(1) — the ladder walk is O(log2(zoomMax/zoomMin)).", "experimental": false},
{"name": "laige::render::IsoCamera::applyShake", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 372, "signature": "[[nodiscard]] laige::Status applyShake(Vec3 impulse) noexcept", "summary": "Adds a bounded shake impulse (the M2-CAM-01 contract). The shake moves the view center (the matrix's translation); its z component does not enter the iso matrix (the header preamble).", "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera::update", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 380, "signature": "void update() noexcept", "summary": "The per-frame update: the M2-CAM-01 update (follow step, bounds clamp, shake decay) + the grid snap of the position (snap mode only — the continuous choice, the header preamble). No-op on a stopped camera. No logging on the healthy paths. allocation.", "budget": "O(1) float ops (+ two snap divisions in snap mode); no", "experimental": false},
{"name": "laige::render::IsoCamera::snapCoord", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 389, "signature": "[[nodiscard]] static float snapCoord(float v, float gridSize) noexcept", "summary": "The nearest grid multiple of v (the header preamble's position snap): float-only, nearest, ties away from zero, deterministic per build. Precondition: gridSize finite, > 0. @budget O(1).", "budget": null, "experimental": false},
{"name": "laige::render::IsoCamera::snapZoomLevel", "kind": "method", "header": "src/laige-render/include/laige/render/iso_camera.h", "line": 396, "signature": "[[nodiscard]] static float snapZoomLevel(float z, float zoomMin, float zoomMax) noexcept", "summary": "The snapped zoom level of z for the [zoomMin, zoomMax] dyadic ladder (the header preamble's zoom section): clamps into the bounds, nearest level in log2 space, exact float tie to the higher zoom; the result is always an exact member of L. Preconditions: 0 < zoomMin <= zoomMax, finite. @budget O(log2(zoomMax/zoomMin)).", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthQuantScale", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 207, "signature": "inline constexpr std::int32_t kIsoDepthQuantScale = 16", "summary": "Quantization scale: 16 key units per world unit of v = x + y - z. The tie window of equal keys is 1/16 world units (the \"documented precision\" of the key order, docs/concepts/coordinates.md).", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthFineBits", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 210, "signature": "inline constexpr std::int32_t kIsoDepthFineBits = 22", "summary": "Bits of the quantized-depth field (biased) in the 32-bit key.", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthLayerBits", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 212, "signature": "inline constexpr std::int32_t kIsoDepthLayerBits = 32 - kIsoDepthFineBits", "summary": "Bits of the layer field (biased): 32 - fine bits (exactly 32).", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthFineBias", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 218, "signature": "inline constexpr std::uint32_t kIsoDepthFineBias = 1u << (kIsoDepthFineBits - 1)", "summary": "Field biases (the bias makes each field unsigned within the key: a 22-bit field holding -2^21..+2^21-1 is biased by 2^21; a 10-bit field holding -512..+511 by 512 — CORE-005: the bit widths above are the only \"magic\" numbers — every other constant derives from them).", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthLayerBias", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 220, "signature": "inline constexpr std::uint32_t kIsoDepthLayerBias = 1u << (kIsoDepthLayerBits - 1)", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthFineMask", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 224, "signature": "inline constexpr std::uint32_t kIsoDepthFineMask = (1u << kIsoDepthFineBits) - 1u", "summary": "The quantized-depth field's unsigned mask (bits 0..21).", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthMaxWorldUnits", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 231, "signature": "inline constexpr std::int32_t kIsoDepthMaxWorldUnits = 32767", "summary": "Documented domain (the \"world units\" of PRD §4; 1 unit = 1 tile in the tile map — M2-TILE-01). kIsoDepthMaxWorldUnits is the Q16.16 fixed-point coordinate bound (fpx16_16.h: +/-32767.996), so the domain is the same on both SimMath backends (ADR 0002).", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthMaxWorldSum", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 236, "signature": "inline constexpr std::int32_t kIsoDepthMaxWorldSum = 2 * kIsoDepthMaxWorldUnits", "summary": "The fp32_pinned quantizer's saturation bound: |x + y| <= 2 * the per-coordinate bound. (The fpx16_16 backend's saturating add is tighter — its storage bound is +/- (2^16 - 2^-16); see the \"Exactness zone\" note above for the cross-backend statement.)", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthMaxStepHeight", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 238, "signature": "inline constexpr std::int32_t kIsoDepthMaxStepHeight = 2047", "summary": "Step heights (tile elevations) in world units.", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthLayerMax", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 241, "signature": "inline constexpr std::int32_t kIsoDepthLayerMax = static_cast<std::int32_t>(kIsoDepthLayerBias) - 1", "summary": "Render layers (the parallax step documents the values; background layers are negative, foreground positive — M2-PAR-01).", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthGroundLayer", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 247, "signature": "inline constexpr std::int32_t kIsoDepthGroundLayer = 0", "summary": "The default ground layer (k = 0: no layer offset — the plain isometric scene of the reference scene M2-SCENE-01 and the template M2-SAMPLE-01).", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyParts", "kind": "struct", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 254, "signature": "struct IsoDepthKeyParts", "summary": "The unpacked key (the exact inverse of isoDepthKey(); the debug/ diagnostics view of a key — DBG-007/008)", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyParts::layer", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 256, "signature": "std::int32_t layer{}", "summary": "The (unbiased) layer field: -512..+511.", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyParts::quantizedDepth", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 259, "signature": "std::int32_t quantizedDepth{}", "summary": "The quantized depth d = round((x + y) * scale) - z * scale, in 1/16-world-unit key units: -2^21..+2^21-1.", "budget": null, "experimental": false},
{"name": "laige::render::isoDepthKeyParts", "kind": "function", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 264, "signature": "[[nodiscard]] inline IsoDepthKeyParts isoDepthKeyParts(std::uint32_t key) noexcept", "summary": "The exact inverse of isoDepthKey(): key -> (layer, quantized depth). O(1); no allocation.", "budget": null, "experimental": false},
{"name": "laige::render::isoDepthOrderLess", "kind": "function", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 284, "signature": "[[nodiscard]] inline bool isoDepthOrderLess(std::uint32_t keyA, std::uint32_t entityA, std::uint32_t keyB, std::uint32_t entityB) noexcept", "summary": "The lexicographic (key, entity id) comparison — the total order the render pipeline sorts by. The key carries (layer, quantized depth); the entity id is the final stable tie-break (the stable sort of M2-SORT-01 + the batcher's deterministic entity-id insertion order, FR-1.2). Strict weak ordering (never true for (a, a)); O(1).", "budget": "O(1); two integer comparisons.", "experimental": false},
{"name": "laige::render::isoDepthKey", "kind": "function", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 384, "signature": "template <typename Backend> [[nodiscard]] inline std::uint32_t isoDepthKey( typename sim::SimMath<Backend>::Vec2 pos, std::int32_t stepHeight, std::int32_t layer) noexcept", "summary": "The deterministic 32-bit sortable depth key of an isometric object (the formula, bit layout, domain, and shear contract: the header preamble; the canonical narrative: docs/concepts/coordinates.md).", "budget": "O(1): one backend add + one rounding + a few integer ops; no", "experimental": false},
{"name": "laige::render::isoShearSupported", "kind": "function", "header": "src/laige-render/include/laige/render/iso_depth_key.h", "line": 423, "signature": "[[nodiscard]] inline bool isoShearSupported(IsoAxes axes) noexcept", "summary": "True iff `axes` is a depth-key-supported isometric shear: all components finite, the ground map invertible (det != 0), and -dx.y == -dy.y == zUnit > 0 (EXACT float equality — both ground axes project downward with the same slope A and the height unit equals A, so NDC_y = -A*(x + y - z): the header preamble's shear contract). Both built-in presets pass (2:1 dimetric, true 30°/60°); a custom shear must pass to use isometric depth sorting (M2-CAM-02 validates scene shears against this). O(1); no allocation.", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthTableChunkTiles", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 226, "signature": "inline constexpr std::int32_t kIsoDepthTableChunkTiles = 16", "summary": "The default chunk side in tiles: a square chunk holds chunkTiles^2 cells. A power of two (chunk coordinates are shift/mask — division-free — on the cold paths); 16 x 16 = 256 tiles is the standard tilemap chunk size (M2-TILE-01).", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthTableDefaultMaxChunks", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 232, "signature": "inline constexpr std::int32_t kIsoDepthTableDefaultMaxChunks = 1024", "summary": "The default growth cap: the most chunks a table may ever own (initial grid + streamed extensions). 1024 chunks x 256 cells x 12 B (CellRecord) ~ 3 MiB worst case — bounded and documented (CORE-006, API-006).", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthTableUpdateRadius", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 239, "signature": "inline constexpr std::int32_t kIsoDepthTableUpdateRadius = 0", "summary": "The documented update neighborhood radius (the \"Incremental update contract\" preamble): 0 for the M2-ISO-01 key formula — a cell's key is a function of the cell's own (x, y, height, layer) and the table stores each cell's own height, so a height edit affects exactly the edited cell.", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthTableMinTileCoord", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 246, "signature": "inline constexpr std::int32_t kIsoDepthTableMinTileCoord = -32767", "summary": "Tile-coordinate bounds such that every tile center (gx + 0.5, gy + 0.5) lies in the depth key domain |x|, |y| <= kIsoDepthMaxWorldUnits (32767): gx + 0.5 <= 32767 => gx <= 32766; gx + 0.5 >= -32767 => gx >= -32767. The +0.5 center offset makes the bound one smaller on the positive side.", "budget": null, "experimental": false},
{"name": "laige::render::kIsoDepthTableMaxTileCoord", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 247, "signature": "inline constexpr std::int32_t kIsoDepthTableMaxTileCoord = 32766", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable", "kind": "class", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 313, "signature": "template <typename Backend> class IsoDepthKeyTable", "summary": "One table per scene region / tile layer: the precomputed tile-grid -> depth-key map with incremental updates (the model, the update contract, the domain, the ownership/threading/determinism, and the performance contract: the header preamble).", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::Options", "kind": "struct", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 323, "signature": "struct Options", "summary": "The construction options. create() validates (first failure wins, InvalidArgument — the documented order: grid extents, chunkTiles, maxChunks >= 1, layer domain, tile domain, grid-vs-cap).", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::Options::originTileX", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 328, "signature": "std::int32_t originTileX = 0", "summary": "The requested tile grid (scene region): the tiles [originTileX, originTileX + widthTiles) x [originTileY, originTileY + heightTiles). The covered region is the chunk-aligned superset of it (preamble).", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::Options::originTileY", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 329, "signature": "std::int32_t originTileY = 0", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::Options::widthTiles", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 330, "signature": "std::int32_t widthTiles = 0", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::Options::heightTiles", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 331, "signature": "std::int32_t heightTiles = 0", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::Options::chunkTiles", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 333, "signature": "std::int32_t chunkTiles = kIsoDepthTableChunkTiles", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::Options::maxChunks", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 337, "signature": "std::int32_t maxChunks = kIsoDepthTableDefaultMaxChunks", "summary": "The growth cap: the most chunks the table may ever own (initial grid + streamed extensions); required >= the initial grid's chunk count.", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::Options::layer", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 341, "signature": "std::int32_t layer = kIsoDepthGroundLayer", "summary": "The render layer stamped into every cell key (the ground layer by default; a parallax tile LAYER gets its own table with its layer value — M2-PAR-01).", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::create", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 350, "signature": "[[nodiscard]] static Result<IsoDepthKeyTable> create(const Options& options) noexcept", "summary": "Creates the table: validates the options, pre-sizes the flat storage of the covered region (one allocation), and initializes every cell to flat ground (height 0 — keys from qBase alone). Setup path (allocating; not for the per-frame path). One Info event (render/iso_depth_table_created) + one Debug event per chunk (render/iso_depth_table_chunk_created).", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::rebuild", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 362, "signature": "[[nodiscard]] Status rebuild(std::span<const std::int32_t> heights) noexcept", "summary": "The from-scratch path (scene load): stores the whole height grid and recomputes EVERY key through the full M2-ISO-01 function (independent of the stored qBase). `heights` is the covered rectangle (coveredCellCount() cells), row-major, tileX fastest. Setup path; O(covered cells) backend work; no allocation.", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::setTile", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 381, "signature": "[[nodiscard]] Status setTile(std::int32_t tileX, std::int32_t tileY, std::int32_t height) noexcept", "summary": "The incremental update path (FR-2.2): stores the new tile height and recomputes the keys of the affected cells only — the edited cell plus its documented neighborhood (radius 0 for the current key formula — the preamble). O(1); zero allocation; no logging on success; no GL. A sim-phase call (the ownership preamble).", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::ensureChunk", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 392, "signature": "[[nodiscard]] Status ensureChunk(std::int32_t tileX, std::int32_t tileY) noexcept", "summary": "The growth path (setup; streamed regions — SCALE-001): extends the covered region to include the chunk containing the tile (the region stays a chunk-aligned rectangle). Bounded by Options::maxChunks (exceeding it: BudgetExhausted + one rate- limited Warn event, render/iso_depth_table_growth_cap) and logged (one Debug event per created chunk). No-op success when the tile is already covered. Fails (InvalidArgument) when the chunk's extreme tile centers would leave the key domain.", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::keyAt", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 399, "signature": "[[nodiscard]] std::uint32_t keyAt(std::int32_t tileX, std::int32_t tileY) const noexcept", "summary": "The render read path (O(1), no allocation; a render-phase call): the current depth key of the cell. Precondition: covers() — a read outside the covered region is undefined behavior (a program bug; the preamble's misuse warnings).", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::tileHeightAt", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 404, "signature": "[[nodiscard]] std::int32_t tileHeightAt(std::int32_t tileX, std::int32_t tileY) const noexcept", "summary": "The last tile height set on the cell (diagnostics view — DBG-008). Same precondition and cost as keyAt.", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::covers", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 408, "signature": "[[nodiscard]] bool covers(std::int32_t tileX, std::int32_t tileY) const noexcept", "summary": "True when the cell lies in the covered region (O(1)).", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::layer", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 412, "signature": "[[nodiscard]] std::int32_t layer() const noexcept", "summary": "Introspection (O(1)).", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::chunkTiles", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 413, "signature": "[[nodiscard]] std::int32_t chunkTiles() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::originTileX", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 417, "signature": "[[nodiscard]] std::int32_t originTileX() const noexcept", "summary": "The requested grid (the Options' values).", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::originTileY", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 420, "signature": "[[nodiscard]] std::int32_t originTileY() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::widthTiles", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 423, "signature": "[[nodiscard]] std::int32_t widthTiles() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::heightTiles", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 426, "signature": "[[nodiscard]] std::int32_t heightTiles() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::coveredTileMinX", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 431, "signature": "[[nodiscard]] std::int32_t coveredTileMinX() const noexcept", "summary": "The covered (chunk-aligned) tile rectangle: [minX, maxX) x [minY, maxY).", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::coveredTileMinY", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 434, "signature": "[[nodiscard]] std::int32_t coveredTileMinY() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::coveredTileMaxX", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 437, "signature": "[[nodiscard]] std::int32_t coveredTileMaxX() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::coveredTileMaxY", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 440, "signature": "[[nodiscard]] std::int32_t coveredTileMaxY() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::chunkCount", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 443, "signature": "[[nodiscard]] std::size_t chunkCount() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::maxChunks", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 448, "signature": "[[nodiscard]] std::size_t maxChunks() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::coveredCellCount", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 451, "signature": "[[nodiscard]] std::size_t coveredCellCount() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::IsoDepthKeyTable", "kind": "constructor", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 456, "signature": "IsoDepthKeyTable(const IsoDepthKeyTable&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 457, "signature": "IsoDepthKeyTable& operator=(const IsoDepthKeyTable&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::IsoDepthKeyTable", "kind": "constructor", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 462, "signature": "IsoDepthKeyTable(IsoDepthKeyTable&& other) noexcept", "summary": "Explicit move (the raw cellBase_ member makes the defaulted move unsafe for the moved-from object — it would dangle into the destination): the owner moves with the storage; the source becomes empty (cells_ null, cellBase_ null — CORE-009).", "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 465, "signature": "IsoDepthKeyTable& operator=(IsoDepthKeyTable&& other) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::CellRecord::key", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 489, "signature": "std::uint32_t key{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::CellRecord::qBase", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 490, "signature": "std::int32_t qBase{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoDepthKeyTable::CellRecord::height", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_depth_table.h", "line": 491, "signature": "std::int32_t height{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::kIsoPickUlp", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_picking.h", "line": 192, "signature": "inline constexpr float kIsoPickUlp = 5.9604644775390625e-8f", "summary": "The float rounding unit (2^-24): the per-op relative error bound of one IEEE-754 binary32 op (CORE-005; the precision formula below).", "budget": null, "experimental": false},
{"name": "laige::render::kIsoPickOpFactor", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_picking.h", "line": 196, "signature": "inline constexpr float kIsoPickOpFactor = 16.0f", "summary": "The rounding-op count of the picking inverse's fixed sequence (10 rounding ops: the 2x2 solve + the two cell divisions) plus margin (CORE-005; the precision formula below).", "budget": null, "experimental": false},
{"name": "laige::render::kIsoPickMaxCondition", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_picking.h", "line": 201, "signature": "inline constexpr float kIsoPickMaxCondition = 64.0f", "summary": "The precision contract's condition-number bound (the header preamble): the built-in presets are kappa = 4.5 (2:1) / ~2.73 (30/60); a custom shear with kappa <= 64 keeps the documented boundary zone, and beyond it the zone scales linearly in kappa.", "budget": null, "experimental": false},
{"name": "laige::render::kIsoPickDomainBoundaryEps", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_picking.h", "line": 205, "signature": "inline constexpr float kIsoPickDomainBoundaryEps = kIsoPickOpFactor * kIsoPickUlp * kIsoPickMaxCondition * (2.0f * static_cast<float>(kIsoDepthMaxWorldUnits))", "summary": "The domain-worst boundary ambiguity zone (the header preamble): kIsoPickOpFactor * kIsoPickUlp * kIsoPickMaxCondition * (2 * kIsoDepthMaxWorldUnits) world units (~4.000061).", "budget": null, "experimental": false},
{"name": "laige::render::kIsoPickMinCellSize", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_picking.h", "line": 211, "signature": "inline constexpr float kIsoPickMinCellSize = 1e-4f", "summary": "The minimum grid cell size (world units): below it the saturated cell index 32767/g can leave int32 (CORE-005: 32767/1e-4 = 3.3e8 < 2^31 - 1 with 6.5x margin).", "budget": null, "experimental": false},
{"name": "laige::render::IsoGridConfig", "kind": "struct", "header": "src/laige-render/include/laige/render/iso_picking.h", "line": 217, "signature": "struct IsoGridConfig", "summary": "The pick grid (FR-2.11's grid_config): the cell size in world units (finite, > 0, >= kIsoPickMinCellSize — a config precondition, the header preamble). 1.0 world unit per cell is the tile map's grid (M2-TILE-01).", "budget": null, "experimental": false},
{"name": "laige::render::IsoGridConfig::cellSize", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_picking.h", "line": 218, "signature": "float cellSize{1.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoGridPick", "kind": "struct", "header": "src/laige-render/include/laige/render/iso_picking.h", "line": 225, "signature": "struct IsoGridPick", "summary": "The pick result (the safe API — S-5/G-R11): the grid cell (the floor convention, the header preamble) + the computed ground-plane point (world units; the diagnostics / proximity-query view of the pick). A plain value — no ownership, nothing to release.", "budget": null, "experimental": false},
{"name": "laige::render::IsoGridPick::cellX", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_picking.h", "line": 226, "signature": "std::int32_t cellX{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoGridPick::cellY", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_picking.h", "line": 227, "signature": "std::int32_t cellY{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoGridPick::ground", "kind": "variable", "header": "src/laige-render/include/laige/render/iso_picking.h", "line": 228, "signature": "Vec2 ground{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::screenToGrid", "kind": "function", "header": "src/laige-render/include/laige/render/iso_picking.h", "line": 280, "signature": "[[nodiscard]] inline IsoGridPick screenToGrid(Vec2 screen, const IsoCamera& camera, const IsoGridConfig& grid) noexcept", "summary": "The safe isometric pick (FR-2.11; the header preamble is the full contract): the NDC screen point -> the ground plane (z = 0) -> the grid cell. O(1) (the 2x2 solve + two divisions + the camera's O(1) matrix build); total for every input (the header preamble's saturation section); no allocation, no logging, no GL.", "budget": "O(1); no allocation.", "experimental": false},
{"name": "laige::render::screenToGrid", "kind": "function", "header": "src/laige-render/include/laige/render/iso_picking.h", "line": 298, "signature": "[[nodiscard]] inline IsoGridPick screenToGrid(Vec2 screen, const ProjectionView& view, const IsoGridConfig& grid) noexcept", "summary": "The ProjectionView overload (the M2-PROJ-01 base this step lands on — the header preamble): the same inverse over a hand-stored iso matrix (advanced use: e.g. a custom shear through the raw isoMatrix builder, M2-CAM-02). Precondition: view.mode == ProjectionMode::Iso (the per-mode structure assumption — the matrices.h house convention: debug assert, release undefined).", "budget": "O(1); no allocation.", "experimental": false},
{"name": "laige::render::Vec2", "kind": "alias", "header": "src/laige-render/include/laige/render/matrices.h", "line": 130, "signature": "using Vec2 = glm::vec2", "summary": "The GLM value types of the rendering-side math API (PRD §11). GLM is pinned in deps.lock (ADR 0008) and exposed through this header only — the include-graph lint (R3) forbids every other module from including it, so the sim modules' SimMath (PRD §10.3) stays the sim-side math.", "budget": null, "experimental": false},
{"name": "laige::render::Vec3", "kind": "alias", "header": "src/laige-render/include/laige/render/matrices.h", "line": 131, "signature": "using Vec3 = glm::vec3", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::Mat4", "kind": "alias", "header": "src/laige-render/include/laige/render/matrices.h", "line": 132, "signature": "using Mat4 = glm::mat4", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoAxes", "kind": "struct", "header": "src/laige-render/include/laige/render/matrices.h", "line": 139, "signature": "struct IsoAxes", "summary": "The custom-shear isometric preset (ADR 0005: \"the two axis screen-deltas\"): the NDC (y up) delta of one world +x ground step (dx), one world +y ground step (dy), and one world +z (height) step (zUnit). isoMatrix() builds the matrix; the preset is invertible for picking (M2-ISO-03) iff det(dx.x*dy.y - dx.y*dy.x) != 0.", "budget": null, "experimental": false},
{"name": "laige::render::IsoAxes::dx", "kind": "variable", "header": "src/laige-render/include/laige/render/matrices.h", "line": 140, "signature": "Vec2 dx{0.0f, 0.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoAxes::dy", "kind": "variable", "header": "src/laige-render/include/laige/render/matrices.h", "line": 141, "signature": "Vec2 dy{0.0f, 0.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::IsoAxes::zUnit", "kind": "variable", "header": "src/laige-render/include/laige/render/matrices.h", "line": 142, "signature": "float zUnit{0.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::ortho", "kind": "function", "header": "src/laige-render/include/laige/render/matrices.h", "line": 164, "signature": "[[nodiscard]] Mat4 ortho(float left, float right, float bottom, float top, float zNear, float zFar) noexcept", "summary": "Orthographic projection (camera space -> NDC).", "budget": "O(1); no allocation; a dozen flops.", "experimental": false},
{"name": "laige::render::perspective", "kind": "function", "header": "src/laige-render/include/laige/render/matrices.h", "line": 187, "signature": "[[nodiscard]] Mat4 perspective(float fovY, float aspect, float zNear, float zFar) noexcept", "summary": "Perspective projection (camera space -> NDC), vertical field of view.", "budget": "O(1); no allocation; a dozen flops + one tan.", "experimental": false},
{"name": "laige::render::lookAt", "kind": "function", "header": "src/laige-render/include/laige/render/matrices.h", "line": 204, "signature": "[[nodiscard]] Mat4 lookAt(Vec3 eye, Vec3 center, Vec3 up) noexcept", "summary": "View matrix (world -> camera space) of a camera at `eye` looking at `center` with world up vector `up` (the classic look-at).", "budget": "O(1); no allocation; two normalizations + one cross.", "experimental": false},
{"name": "laige::render::planeOrtho", "kind": "function", "header": "src/laige-render/include/laige/render/matrices.h", "line": 228, "signature": "[[nodiscard]] Mat4 planeOrtho(Vec3 center, Vec3 right, Vec3 up, float halfWidth, float halfHeight, float zNear, float zFar) noexcept", "summary": "2D-plane camera: the COMBINED view+projection matrix of an orthographic camera looking straight at the plane spanned by `right` and `up` through `center` (the top_down and side_view projection modes, M2-PROJ-01).", "budget": "O(1); no allocation; one mat4 multiply.", "experimental": false},
{"name": "laige::render::isoMatrix", "kind": "function", "header": "src/laige-render/include/laige/render/matrices.h", "line": 252, "signature": "[[nodiscard]] Mat4 isoMatrix(IsoAxes axes) noexcept", "summary": "The general affine oblique isometric matrix (world -> NDC) — the \"custom shear\" preset (ADR 0005). See the header preamble for the screen-space form:", "budget": "O(1); no allocation.", "experimental": false},
{"name": "laige::render::isoDimetric2To1", "kind": "function", "header": "src/laige-render/include/laige/render/matrices.h", "line": 265, "signature": "[[nodiscard]] Mat4 isoDimetric2To1(float scale) noexcept", "summary": "The 2:1 dimetric preset (ADR 0005 — the engine default): affine, 45° azimuth, the two ground axes equally foreshortened, the vertical squashed to 1/2. Per-unit ground step screen delta (±2, 1)·scale (NDC, y up); one world tile maps to a 4*scale-wide by 2*scale-tall rhombus; one world height unit maps to `scale` screen units (half the tile height).", "budget": "O(1); no allocation.", "experimental": false},
{"name": "laige::render::isoTrueIso3060", "kind": "function", "header": "src/laige-render/include/laige/render/matrices.h", "line": 278, "signature": "[[nodiscard]] Mat4 isoTrueIso3060(float scale) noexcept", "summary": "The true 30°/60° isometric preset: a true orthographic axonometric projection at 45° azimuth and elevation arcsin(1/√3) ≈ 35.264° — all three axes equally foreshortened, the ground axes at 30° to screen horizontal (hence \"30°/60°\": the tile's edges sit at 30° and 60° to horizontal), the tile a √3:1 rhombus.", "budget": "O(1); no allocation; one sqrt.", "experimental": false},
{"name": "laige::render::ProjectionMode", "kind": "enum", "header": "src/laige-render/include/laige/render/projection.h", "line": 200, "signature": "enum class ProjectionMode", "summary": "The per-scene/view projection mode (FR-2.5). iso is the engine default (ADR 0005, PRD v0.2) — the default member of ProjectionView.", "budget": null, "experimental": false},
{"name": "laige::render::ProjectionMode::Iso", "kind": "enumerator", "header": "src/laige-render/include/laige/render/projection.h", "line": 201, "signature": "Iso", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::ProjectionMode::SideView", "kind": "enumerator", "header": "src/laige-render/include/laige/render/projection.h", "line": 202, "signature": "SideView", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::ProjectionMode::TopDown", "kind": "enumerator", "header": "src/laige-render/include/laige/render/projection.h", "line": 203, "signature": "TopDown", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::ProjectionMode::FreeCinematic", "kind": "enumerator", "header": "src/laige-render/include/laige/render/projection.h", "line": 204, "signature": "FreeCinematic", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::Plane", "kind": "struct", "header": "src/laige-render/include/laige/render/projection.h", "line": 210, "signature": "struct Plane", "summary": "A plane in world space, normal·p = d (screenToWorld's intersection target). `normal` is any nonzero vector — need not be normalized: the intersection is scale-invariant.", "budget": null, "experimental": false},
{"name": "laige::render::Plane::normal", "kind": "variable", "header": "src/laige-render/include/laige/render/projection.h", "line": 211, "signature": "Vec3 normal{0.0f, 0.0f, 1.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::Plane::d", "kind": "variable", "header": "src/laige-render/include/laige/render/projection.h", "line": 212, "signature": "float d{0.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::WorldRay", "kind": "struct", "header": "src/laige-render/include/laige/render/projection.h", "line": 219, "signature": "struct WorldRay", "summary": "The world-space preimage ray of a screen point: the point origin + t·direction (t ≥ 0; the affine modes use the full line through origin along ±direction — the header preamble). `direction` is normalized (unit length).", "budget": null, "experimental": false},
{"name": "laige::render::WorldRay::origin", "kind": "variable", "header": "src/laige-render/include/laige/render/projection.h", "line": 220, "signature": "Vec3 origin{0.0f, 0.0f, 0.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::WorldRay::direction", "kind": "variable", "header": "src/laige-render/include/laige/render/projection.h", "line": 221, "signature": "Vec3 direction{0.0f, 0.0f, 0.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::kProjectionRoundTripTolerance", "kind": "variable", "header": "src/laige-render/include/laige/render/projection.h", "line": 227, "signature": "inline constexpr float kProjectionRoundTripTolerance = 1e-3f", "summary": "The documented round-trip precision (the header preamble): the bound on |screenToWorld(worldToScreen(p)) - p| in world units for |p| <= 32 (a single-pass float round trip; the tests pin it per mode).", "budget": null, "experimental": false},
{"name": "laige::render::kProjectionParallelEps", "kind": "variable", "header": "src/laige-render/include/laige/render/projection.h", "line": 235, "signature": "inline constexpr float kProjectionParallelEps = 1e-6f", "summary": "The |dot(direction, normal)| threshold below which screenToWorld treats the plane as parallel to the ray: it covers float rounding of an exactly-parallel dot (a cancellation of unit-vector products can round to ~1e-7) and rejects the numerically ill-conditioned planes more parallel than that (the intersection point is then far beyond the representable scene extent).", "budget": null, "experimental": false},
{"name": "laige::render::ProjectionView", "kind": "struct", "header": "src/laige-render/include/laige/render/projection.h", "line": 244, "signature": "struct ProjectionView", "summary": "The per-scene/view projection state (FR-2.5, FR-2.11): the mode selects the preimage geometry and the matrix — the output of the mode's documented builder (the header preamble) — is the world->NDC map. A plain value object (the CameraOptions pattern): the game sets the fields, rebuilds the matrix when the view changes, and passes the view (or its matrix) to the pickers and the batcher. No state is hidden, nothing to own or release; copy is a plain value copy.", "budget": null, "experimental": false},
{"name": "laige::render::ProjectionView::mode", "kind": "variable", "header": "src/laige-render/include/laige/render/projection.h", "line": 246, "signature": "ProjectionMode mode{ProjectionMode::Iso}", "summary": "The projection mode (default: Iso — the engine default, ADR 0005).", "budget": null, "experimental": false},
{"name": "laige::render::ProjectionView::matrix", "kind": "variable", "header": "src/laige-render/include/laige/render/projection.h", "line": 249, "signature": "Mat4 matrix{Mat4(1.0f)}", "summary": "The world->NDC matrix: the output of the mode's documented builder (the header preamble; the default identity is the empty state).", "budget": null, "experimental": false},
{"name": "laige::render::ProjectionView::planeCenter", "kind": "variable", "header": "src/laige-render/include/laige/render/projection.h", "line": 255, "signature": "Vec3 planeCenter{0.0f, 0.0f, 0.0f}", "summary": "side_view / top_down only: the plane camera's center (the SAME value passed to planeOrtho) — the reference plane through it perpendicular to the view direction is where the ray origin sits. Ignored by Iso (the reference is the ground plane z = 0) and by FreeCinematic (the reference is the NDC near plane).", "budget": null, "experimental": false},
{"name": "laige::render::ProjectionView::worldToScreen", "kind": "method", "header": "src/laige-render/include/laige/render/projection.h", "line": 261, "signature": "[[nodiscard]] Vec3 worldToScreen(Vec2 p2d, float depth) const noexcept", "summary": "The NDC of the 2.5D world point (the ground plane (p2d.x, p2d.y) + elevation depth). Pure (no mutation); no allocation, no logging. free_cinematic; w = 1 exactly for the affine modes).", "budget": "O(1): one 4x4 matrix multiply (+ one divide for", "experimental": false},
{"name": "laige::render::ProjectionView::screenToWorldRay", "kind": "method", "header": "src/laige-render/include/laige/render/projection.h", "line": 267, "signature": "[[nodiscard]] WorldRay screenToWorldRay(Vec2 ndc) const noexcept", "summary": "The world preimage ray of the NDC screen point (the header preamble's per-mode geometry). Pure; no allocation, no logging. two divides (free_cinematic).", "budget": "O(1): a 2x2 solve (the affine modes) or one 4x4 inverse +", "experimental": false},
{"name": "laige::render::ProjectionView::screenToWorld", "kind": "method", "header": "src/laige-render/include/laige/render/projection.h", "line": 274, "signature": "[[nodiscard]] laige::Result<Vec3, laige::ErrorCode> screenToWorld(Vec2 ndc, Plane plane) const noexcept", "summary": "The preimage line/ray ∩ the plane (the header preamble): the world point on success; InvalidArgument when the plane is parallel to the ray or (free_cinematic) the intersection is behind the camera. Pure; no allocation, no logging.", "budget": "O(1): one screenToWorldRay + two dot products + one divide.", "experimental": false},
{"name": "laige::render::kSpriteBatcherMaxCapacity", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 245, "signature": "inline constexpr std::uint32_t kSpriteBatcherMaxCapacity = 0xFFFFFFFFu", "summary": "The most sprites a batcher may budget: the frame declaration slot is a 32-bit index (the pool slot, the key scratch, the instance array), so the budget domain is the index width (the DepthSort precedent).", "budget": null, "experimental": false},
{"name": "laige::render::BlendMode", "kind": "enum", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 255, "signature": "enum class BlendMode : std::uint8_t", "summary": "The blend state a sprite is drawn with (the group key's third field). The enumerator values are stable (PRD §9.4: additive only); the submit stage (M2-SPRITE-02) maps each value to its GL blend state.", "budget": null, "experimental": false},
{"name": "laige::render::BlendMode::Alpha", "kind": "enumerator", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 258, "signature": "Alpha = 0", "summary": "Standard alpha blend (src·srcAlpha + dst·(1 − srcAlpha)): the default for textured sprites.", "budget": null, "experimental": false},
{"name": "laige::render::BlendMode::Additive", "kind": "enumerator", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 260, "signature": "Additive = 1", "summary": "Additive (src + dst): particles, light, glow (M2-PART-01).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteUvRect", "kind": "struct", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 271, "signature": "struct SpriteUvRect", "summary": "The sprite's UV sub-rect inside its atlas, normalized [0, 1]² (u1 > u0, v1 > v0 — the caller's invariant; spriteFrameUv, laige/render/sprite_frames.h, computes these from the atlas sheet frame layout — M2-SPRITE-03).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteUvRect::u0", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 272, "signature": "float u0{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteUvRect::v0", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 273, "signature": "float v0{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteUvRect::u1", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 274, "signature": "float u1{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteUvRect::v1", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 275, "signature": "float v1{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteTint", "kind": "struct", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 279, "signature": "struct SpriteTint", "summary": "The sprite's multiplicative RGBA tint (1, 1, 1, 1 = untinted).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteTint::r", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 280, "signature": "float r{1.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteTint::g", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 281, "signature": "float g{1.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteTint::b", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 282, "signature": "float b{1.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteTint::a", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 283, "signature": "float a{1.0f}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteItem", "kind": "struct", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 294, "signature": "struct SpriteItem", "summary": "The value the game DECLARES for one sprite (S-5: declaration, not draw). A plain value — no ownership, nothing to release (the pool owns the storage). All fields are presentation state (ARCH-009): the caller fills them from its per-frame snapshot.", "budget": null, "experimental": false},
{"name": "laige::render::SpriteItem::pos", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 298, "signature": "Vec2 pos{0.0f, 0.0f}", "summary": "The world ground-plane position, world units (the presentation snapshot's interpolated position, M1-LOOP-02 — NEVER screen space, PRD §4).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteItem::depthKey", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 302, "signature": "std::uint32_t depthKey{}", "summary": "The M2-ISO-01 depth key (`isoDepthKey<Backend>(pos, stepHeight, layer)`): the back-to-front order value. G-R11: engine-owned — compute it with isoDepthKey, never from screen space.", "budget": null, "experimental": false},
{"name": "laige::render::SpriteItem::depthOverride", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 306, "signature": "bool depthOverride{}", "summary": "The G-R11 escape-hatch flag: true when the caller set depthKey by hand (not via isoDepthKey). Counted per frame + warned at build (\"prefer tile height\"). The batcher sorts the key either way.", "budget": null, "experimental": false},
{"name": "laige::render::SpriteItem::uv", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 308, "signature": "SpriteUvRect uv{}", "summary": "The UV sub-rect in the atlas (SpriteUvRect above).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteItem::frameIndex", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 317, "signature": "std::uint32_t frameIndex{}", "summary": "The animation frame index this item was declared with (M2-SPRITE-03 — data-driven: the caller sets it; M3 animation will drive the frame advance). The engine does not interpret it: the caller also sets `uv` to this frame's UV sub-rect (see spriteFrameUv, laige/render/sprite_frames.h) — `uv` is what the renderer draws, the index is the declaration's frame record (presentation state, ARCH-009). The batcher carries it through untouched.", "budget": null, "experimental": false},
{"name": "laige::render::SpriteItem::rotation", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 320, "signature": "float rotation{}", "summary": "The rotation in radians (0 = unrotated; the submit stage applies it in screen space, M2-SPRITE-02).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteItem::scale", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 322, "signature": "Vec2 scale{1.0f, 1.0f}", "summary": "The world-unit scale (x, y) — non-uniform free (1, 1 = unscaled).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteItem::tint", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 324, "signature": "SpriteTint tint{}", "summary": "The multiplicative RGBA tint (SpriteTint above).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteItem::atlasId", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 327, "signature": "std::uint32_t atlasId{}", "summary": "The atlas/texture reference (a stable asset handle — the asset system lands with M3-ASSET-01; for now the game assigns it).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteItem::materialId", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 330, "signature": "std::uint32_t materialId{}", "summary": "The material reference (0 = the default material; the material system is future work — the group key carries it per FR-2.1).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteItem::blend", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 332, "signature": "BlendMode blend{}", "summary": "The blend state (the group key's third field).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteBatch", "kind": "struct", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 343, "signature": "struct SpriteBatch", "summary": "One (atlas, material, blend) group of the frame's sorted sprites: the state the submit stage sets ONCE (texture bind + material + blend — RENDER-001) and the group's instances in back-to-front order (one instanced draw call per group, FR-2.1).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteBatch::atlasId", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 344, "signature": "std::uint32_t atlasId{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteBatch::materialId", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 345, "signature": "std::uint32_t materialId{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteBatch::blend", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 346, "signature": "BlendMode blend{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteBatch::instances", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 352, "signature": "std::span<const std::uint32_t> instances{}", "summary": "The group's instances, back-to-front: the frame's global depth order (M2-SORT-01) RESTRICTED to this group. Each element is the frame-scoped pool slot of the sprite (read the item with the batcher's at(slot) / get(slot)). Invalidated by the next beginFrame()/build() — read within the frame.", "budget": null, "experimental": false},
{"name": "laige::render::SpriteBatcher", "kind": "class", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 383, "signature": "class SpriteBatcher", "summary": "The frame declaration window + batch builder (the preamble: the frame protocol, the batch model, the overflow policy, the G-R11 accounting, the storage, the ownership, and the performance contracts).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteBatcher::Options", "kind": "struct", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 389, "signature": "struct Options", "summary": "The frame budget (the declared scene sprite budget, S-6, API-006): the most sprites one frame may declare. Size it to the scene's worst-case visible count at scene set-up; the batcher never grows beyond it (the overflow policy: drop oldest + warn, the preamble).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteBatcher::Options::maxSprites", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 390, "signature": "std::uint32_t maxSprites{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteBatcher::SpriteBatcher", "kind": "constructor", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 397, "signature": "SpriteBatcher() noexcept : items_(ArenaPool<SpriteItem>::Options{0})", "summary": "The default state: the EMPTY batcher (capacity 0, no storage). beginFrame()/build() work (the output is empty); add() fails with BudgetExhausted — the stopped-state pattern of the module's value objects (DepthSort), total and never UB.", "budget": null, "experimental": false},
{"name": "laige::render::SpriteBatcher::create", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 405, "signature": "[[nodiscard]] static Result<SpriteBatcher> create(Options options) noexcept", "summary": "The set-up path (scene load): one allocation per storage structure (the preamble's layout — ~136 B/capacity slot). Fails (InvalidArgument, no allocation) when maxSprites is 0 or exceeds kSpriteBatcherMaxCapacity (the slot-width domain).", "budget": "O(maxSprites); 8 allocations, setup only.", "experimental": false},
{"name": "laige::render::SpriteBatcher::beginFrame", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 414, "signature": "void beginFrame() noexcept", "summary": "The frame protocol, part 1 (the preamble): close the previous window and open a new one — the previous frame's declared items are released (the pool's reset). Idempotent; a no-op on the stopped batcher.", "budget": "O(previous frame count); no allocation.", "experimental": false},
{"name": "laige::render::SpriteBatcher::add", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 436, "signature": "[[nodiscard]] Result<std::uint32_t> add(SpriteItem item) noexcept", "summary": "The frame protocol, part 2 (the preamble): declare ONE sprite for the current frame (the window is open: after create()/beginFrame(), until build()). The frame's DECLARATION ORDER is the insertion order: declare in the engine's deterministic entity-id iteration order (FR-1.2) — that is what makes the (key, entity id) total order reproducible (RENDER-003).", "budget": "O(1); no allocation on the success path (the pool create", "experimental": false},
{"name": "laige::render::SpriteBatcher::build", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 452, "signature": "[[nodiscard]] Status build() noexcept", "summary": "The frame protocol, part 3 (the preamble): the batch stage. Sorts the frame's depth keys (M2-SORT-01), groups into (atlas, material, blend) batches (deterministic group order: ascending (atlas, material, blend) — RENDER-003), scatters each group's instances in global back-to-front order, and publishes batches(). Closes the declaration window.", "budget": "O(4n + 4·256 + n·log G + G·(log G + G)), G = the frame's", "experimental": false},
{"name": "laige::render::SpriteBatcher::batchCount", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 457, "signature": "[[nodiscard]] std::size_t batchCount() const noexcept", "summary": "The frame's output (read within the frame; invalidated by the next beginFrame()/build()).", "budget": "O(1).", "experimental": false},
{"name": "laige::render::SpriteBatcher::batches", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 459, "signature": "[[nodiscard]] std::span<const SpriteBatch> batches() const noexcept", "summary": null, "budget": "O(1); the span aliases the batcher's batch array.", "experimental": false},
{"name": "laige::render::SpriteBatcher::frameCount", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 464, "signature": "[[nodiscard]] std::size_t frameCount() const noexcept", "summary": "The frame's declared count, after the overflow drops.", "budget": "O(1).", "experimental": false},
{"name": "laige::render::SpriteBatcher::frameBuilt", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 472, "signature": "[[nodiscard]] bool frameBuilt() const noexcept", "summary": "True only between build() and the next beginFrame(): the submit stage's (M2-SPRITE-02) precondition — an unbuilt window (including one with declared items) must never be drawn as an empty frame (CORE-008). False before the first build and after every beginFrame(); true on a built empty frame (build() on the stopped state works and builds the empty frame).", "budget": "O(1).", "experimental": false},
{"name": "laige::render::SpriteBatcher::overrideCount", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 476, "signature": "[[nodiscard]] std::uint32_t overrideCount() const noexcept", "summary": "G-R11: the current frame's manual depth-override declaration count (reset by beginFrame).", "budget": "O(1).", "experimental": false},
{"name": "laige::render::SpriteBatcher::overrideTotal", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 482, "signature": "[[nodiscard]] std::uint64_t overrideTotal() const noexcept", "summary": "G-R11: the since-construction override total (the profiler's cumulative guardrail feed, PRD §9.3).", "budget": "O(1).", "experimental": false},
{"name": "laige::render::SpriteBatcher::droppedTotal", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 488, "signature": "[[nodiscard]] std::uint64_t droppedTotal() const noexcept", "summary": "The since-construction dropped-oldest total (the overflow policy's accounting, the preamble).", "budget": "O(1).", "experimental": false},
{"name": "laige::render::SpriteBatcher::capacity", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 493, "signature": "[[nodiscard]] std::uint32_t capacity() const noexcept", "summary": "The frame budget (the create() argument; 0 in the stopped state).", "budget": "O(1).", "experimental": false},
{"name": "laige::render::SpriteBatcher::itemPoolStats", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 496, "signature": "[[nodiscard]] PoolStats itemPoolStats() const noexcept", "summary": "The sprite pool's accounting snapshot (PRD §10.4, DBG-008).", "budget": "O(1); no allocation.", "experimental": false},
{"name": "laige::render::SpriteBatcher::get", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 502, "signature": "[[nodiscard]] const SpriteItem* get(std::uint32_t slot) noexcept", "summary": "The item declared at the frame-scoped slot (the null-safe read — nullptr when the slot is not in the current frame window).", "budget": "O(1); no allocation.", "experimental": false},
{"name": "laige::render::SpriteBatcher::at", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 507, "signature": "[[nodiscard]] const SpriteItem& at(std::uint32_t slot)", "summary": "The item declared at the frame-scoped slot (debug: asserts the slot is live — the S-9 fail-loudly contract; release: undefined on a stale slot, the engine Result convention).", "budget": "O(1); no allocation.", "experimental": false},
{"name": "laige::render::SpriteBatcher::SpriteBatcher", "kind": "constructor", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 509, "signature": "SpriteBatcher(const SpriteBatcher&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteBatcher::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 510, "signature": "SpriteBatcher& operator=(const SpriteBatcher&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteBatcher::SpriteBatcher", "kind": "constructor", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 514, "signature": "SpriteBatcher(SpriteBatcher&&) noexcept = default", "summary": "Move: the members' moves (the pool and the sorter leave the source stopped; the flat buffers transfer). The source becomes the stopped state (CORE-009).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteBatcher::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_batcher.h", "line": 515, "signature": "SpriteBatcher& operator=(SpriteBatcher&&) noexcept = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::kSpriteFrameMaxAtlasTexels", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_frames.h", "line": 133, "signature": "inline constexpr std::uint32_t kSpriteFrameMaxAtlasTexels = 1u << 24", "summary": "The float-exact atlas domain (the header's Exactness section): atlas dimensions are [1, kSpriteFrameMaxAtlasTexels]. 2^24 = 16 777 216 — every texel coordinate < 2^24 is exactly float-representable, and two distinct k/W values never round to the same float (the u1 > u0, v1 > v0 invariant, exact). Far beyond the practical driver maxTextureSize (16K–32K).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteFrameLayout", "kind": "struct", "header": "src/laige-render/include/laige/render/sprite_frames.h", "line": 145, "signature": "struct SpriteFrameLayout", "summary": "The layout of the frames in one atlas sheet (the header's sheet model). All fields are texels (not world units, not normalized UV — the layout is asset-side data, the import pipeline's output for now, the asset system's from M3). A plain value: no ownership, nothing to release; validated at use time by spriteFrameUv (the failure section).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteFrameLayout::frameWidth", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_frames.h", "line": 147, "signature": "std::uint32_t frameWidth{}", "summary": "The frame width in texels (>= 1).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteFrameLayout::frameHeight", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_frames.h", "line": 149, "signature": "std::uint32_t frameHeight{}", "summary": "The frame height in texels (>= 1).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteFrameLayout::columns", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_frames.h", "line": 151, "signature": "std::uint32_t columns{}", "summary": "The frame columns per row (>= 1).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteFrameLayout::rows", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_frames.h", "line": 153, "signature": "std::uint32_t rows{}", "summary": "The frame rows (>= 1).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteFrameLayout::frameSpacing", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_frames.h", "line": 155, "signature": "std::uint32_t frameSpacing{}", "summary": "The gap between adjacent frames, texels (0 = packed).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteFrameLayout::sheetBorder", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_frames.h", "line": 158, "signature": "std::uint32_t sheetBorder{}", "summary": "The margin between the sheet edge and the first/last frame on every side, texels (0 = flush to the edge).", "budget": null, "experimental": false},
{"name": "laige::render::spriteFrameUv", "kind": "function", "header": "src/laige-render/include/laige/render/sprite_frames.h", "line": 174, "signature": "[[nodiscard]] inline Result<SpriteUvRect> spriteFrameUv( std::uint32_t frameIndex, const SpriteFrameLayout& layout, std::uint32_t atlasWidth, std::uint32_t atlasHeight) noexcept", "summary": "The UV sub-rect of `frameIndex` in the `atlasWidth × atlasHeight` atlas, under `layout` (the header: the sheet model, the exactness domain, the failure contract). The frame index is 0-based row-major (frame 0 = top-left); an out-of-range index fails `InvalidArgument` — the engine NEVER wraps silently (CORE-008).", "budget": "O(1): a handful of integer checks + 4 float divisions; zero", "experimental": false},
{"name": "laige::render::SpriteDrawStats", "kind": "struct", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 193, "signature": "struct SpriteDrawStats", "summary": "The per-frame counters of one successful submit (RENDER-001 — the state changes and draw submissions made observable; the M2-SPRITE-04 profiler feed). Read-only published state. `primitives` is 0 unless the opt-in primitive query (Options::primitiveQuery) is enabled: GL 3.3 core has no draw-call query primitive, so the dispatch count is the engine's own bookkeeping (drawCalls — what the profiler ships), and the GL-side cross-check is the PRIMITIVES_GENERATED count of the pass (2 per instance of the 4-vertex strip). The M2-SPRITE-04 fields: `programChanges` (the glUseProgram calls in the pass — 1 for every non-empty successful submit: the pass sets its own program and restores 0 at the end), `uploadBytes` (the frame's instance-upload volume, n * 52 B — the upload's RENDER-004 observable work), `renderTargetBytes` (the render-target size drawn, width * height * 4 — the render-target use), and `drawCallCapExceeded` (the G-R2 frame-graph flag: the frame's draw calls exceeded Options::maxDrawCalls — the frame was still drawn, the cap is observation, never an execution gate).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawStats::drawCalls", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 194, "signature": "std::uint32_t drawCalls{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawStats::textureBinds", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 195, "signature": "std::uint32_t textureBinds{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawStats::blendChanges", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 196, "signature": "std::uint32_t blendChanges{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawStats::programChanges", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 197, "signature": "std::uint32_t programChanges{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawStats::instances", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 198, "signature": "std::uint32_t instances{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawStats::primitives", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 199, "signature": "std::uint32_t primitives{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawStats::uploadBytes", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 200, "signature": "std::uint64_t uploadBytes{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawStats::renderTargetBytes", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 201, "signature": "std::uint64_t renderTargetBytes{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawStats::drawCallCapExceeded", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 202, "signature": "bool drawCallCapExceeded{false}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawTotals", "kind": "struct", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 209, "signature": "struct SpriteDrawTotals", "summary": "The since-construction totals (the frames counter counts successful submits only). The M2-SPRITE-04 profiler reads these on the owner thread (DBG-005). `capExceededFrames` counts the successful submits whose draw calls exceeded the cap (the G-R2 frame-graph total).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawTotals::frames", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 210, "signature": "std::uint64_t frames{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawTotals::drawCalls", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 211, "signature": "std::uint64_t drawCalls{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawTotals::textureBinds", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 212, "signature": "std::uint64_t textureBinds{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawTotals::blendChanges", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 213, "signature": "std::uint64_t blendChanges{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawTotals::programChanges", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 214, "signature": "std::uint64_t programChanges{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawTotals::instances", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 215, "signature": "std::uint64_t instances{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawTotals::primitives", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 216, "signature": "std::uint64_t primitives{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawTotals::uploadBytes", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 217, "signature": "std::uint64_t uploadBytes{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawTotals::renderTargetBytes", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 218, "signature": "std::uint64_t renderTargetBytes{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteDrawTotals::capExceededFrames", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 219, "signature": "std::uint64_t capExceededFrames{0}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer", "kind": "class", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 225, "signature": "class SpriteRenderer", "summary": "The submit stage of the frame pipeline (M2-SPRITE-02): one instanced draw call per (atlas, material, blend) group per frame (FR-2.1) + the minimal GLSL 3.30 sprite shader (the header preamble).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::kSpriteRendererMaxInstances", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 229, "signature": "static constexpr std::uint32_t kSpriteRendererMaxInstances = 0xFFFFFFFFu", "summary": "The frame-slot index width (the batcher's slot domain, the instance buffer's index domain).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::kSpriteRendererMaxAtlases", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 232, "signature": "static constexpr std::uint32_t kSpriteRendererMaxAtlases = 4096u", "summary": "The atlas registry cap (the Options comment: 32 KB at 4096 slots).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::kSpriteRendererDefaultDrawCalls", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 237, "signature": "static constexpr std::uint32_t kSpriteRendererDefaultDrawCalls = 64u", "summary": "The documented default per-pass draw-call cap (G-R2, PRD §9.3): 2x the PRD §8.1 worst-case reference-scene budget of 30 draw calls — the 50k-sprite exit scene passes with 2x headroom, and a scene that blows the cap by more than 2x is visible at a glance.", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::Options", "kind": "struct", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 241, "signature": "struct Options", "summary": "The submit stage's configuration (API-006): all fields are validated at create (the first failure wins, one Warn).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::Options::maxInstances", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 248, "signature": "std::uint32_t maxInstances{0}", "summary": "The per-frame instance budget: the instance buffer is sized to this at create (52 B per instance). Must be >= the batcher's maxSprites. Domain [1, kSpriteRendererMaxInstances]; the practical ceiling is the driver's GL buffer size — an allocation that large fails create GlUnavailable (the clean failure, CORE-008).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::Options::maxAtlases", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 255, "signature": "std::uint32_t maxAtlases{0}", "summary": "The atlas-id domain: atlas ids are [0, maxAtlases) — the atlas registry is a flat table (16 B per slot with the M2-SPRITE-04 width/height bookkeeping). Domain [1, kSpriteRendererMaxAtlases]: 4096 slots = 64 KB — far beyond the PRD's 50k-sprite scene (<= 30 draw calls = tens of atlases at most).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::Options::maxDrawCalls", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 267, "signature": "std::uint32_t maxDrawCalls{kSpriteRendererDefaultDrawCalls}", "summary": "The per-pass draw-call cap (G-R2, PRD §9.3): the maximum instanced draw calls (== the frame's group count) ONE submit may make. A frame ABOVE the cap is still drawn (observation, never an execution gate — the G-R5 precedent): one rate-limited Warn (`sprite_renderer/draw_call_cap`) fires, the frame carries the `drawCallCapExceeded` flag (the frame-graph flag M2-PROF-01 reports), and the total `capExceededFrames` counts it. Domain [1, kSpriteRendererMaxInstances] (a frame's draw calls can never exceed its instance count — each group has >= 1 instance); the documented default is kSpriteRendererDefaultDrawCalls (64).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::Options::primitiveQuery", "kind": "variable", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 274, "signature": "bool primitiveQuery{false}", "summary": "The opt-in GL PRIMITIVES_GENERATED query around every submit (the GL-side dispatch cross-check + the M2-SPRITE-04 primitive feed). OFF by default: zero GL work, zero cost (the hot path, PERF-002). ON: one query object per submit + a glFinish — a CPU/GPU sync, a DIAGNOSTIC mode for the offscreen test/CI path and the profiler, never the shipping frame loop (RENDER-005).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::SpriteRenderer", "kind": "constructor", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 283, "signature": "SpriteRenderer() noexcept", "summary": "The stopped state (the failed create / moved-from): valid() is false, every operation fails InvalidArgument, the counters read zero. No logging. Defined in the .cpp (the defaulted form would instantiate the unique_ptr destructor against the incomplete Impl — the GlContext precedent).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::~SpriteRenderer", "kind": "destructor", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 284, "signature": "~SpriteRenderer()", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::SpriteRenderer", "kind": "constructor", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 287, "signature": "SpriteRenderer(SpriteRenderer&&) noexcept", "summary": "Defined in the .cpp, where Impl is complete (the unique_ptr move operations need the complete pointee — the GlContext precedent).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 288, "signature": "SpriteRenderer& operator=(SpriteRenderer&&) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::SpriteRenderer", "kind": "constructor", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 289, "signature": "SpriteRenderer(const SpriteRenderer&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 290, "signature": "SpriteRenderer& operator=(const SpriteRenderer&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::create", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 303, "signature": "[[nodiscard]] static laige::Result<SpriteRenderer, laige::ErrorCode> create(const GlContext& ctx, Options options) noexcept", "summary": "One-time setup (the engine's renderer construction, before the frame pipeline starts — never inside a frame, PERF-002): validates the options (first failure wins, one Warn options_invalid), requires a valid context (makeCurrent, idempotent), then compiles the sprite shader, creates the quad VBO, the per-frame instance buffer (maxInstances * 52 B), the VAO, and the atlas registry. Any GL failure returns GlUnavailable with one structured Error event (no partial renderer: the failure is the stopped state). allocations (52 * maxInstances B instance buffer), no loop.", "budget": "one-time: two shader compiles, one link, three GPU", "experimental": false},
{"name": "laige::render::SpriteRenderer::valid", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 307, "signature": "[[nodiscard]] bool valid() const noexcept", "summary": "True when the create succeeded (the stopped state is false).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::maxInstances", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 311, "signature": "[[nodiscard]] std::uint32_t maxInstances() const noexcept", "summary": "The validated configuration (the stopped state reads zero). O(1), no allocation.", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::maxAtlases", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 312, "signature": "[[nodiscard]] std::uint32_t maxAtlases() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::maxDrawCalls", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 313, "signature": "[[nodiscard]] std::uint32_t maxDrawCalls() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::bindAtlas", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 331, "signature": "[[nodiscard]] laige::Status bindAtlas(std::uint32_t atlasId, std::uint32_t width, std::uint32_t height, std::span<const std::uint8_t> rgba)", "summary": "Bind one atlas texture from CPU RGBA8 bytes — the SETUP/asset path (one call per atlas per scene load; the asset system re-uploads them later, M3 — RENDER-004: no unexpected GPU work in the frame hot path). The context must be current on the calling thread (makeCurrent, idempotent). The atlas id is the batcher's SpriteItem.atlasId domain: [0, maxAtlases). width/height are [1, the context's maxTextureSize]; rgba must be exactly width * height * 4 bytes. The texture is uploaded GL_RGBA8, GL_NEAREST, GL_CLAMP_TO_EDGE, no mipmaps (the sub-rects are pixel-exact — the M2-GOLD-01 contract). Re-binding an id REPLACES the texture (the old one is deleted — the last bind wins). Validation failures return InvalidArgument (no GL work, no logging — the precondition contract, the GlContext::readPixel precedent); a GL failure returns GlUnavailable + one Error. upload); no loop, no allocation beyond the texture object.", "budget": "one-time per atlas: one glTexImage2D (width*height*4 B", "experimental": false},
{"name": "laige::render::SpriteRenderer::submit", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 374, "signature": "[[nodiscard]] laige::Status submit(SpriteBatcher& batcher, const Mat4& worldToNdc)", "summary": "The submit stage: draw the batcher's BUILT frame (the frame protocol, the header preamble). Preconditions (checked in order, the first failure wins — a failed submit leaves the frame counters ZERO and the since-construction totals UNCHANGED and draws nothing; the pass re-establishes its own GL state at the start of every successful submit, so a failure leaves no stale sprite-pass state for the next frame): 1. the renderer valid (stopped -> InvalidArgument, no logging); 2. the context valid + current (makeCurrent — idempotent; a cross-thread live takeover -> GlUnavailable, the P0 EGL contract); 3. the batcher built for the current frame (batcher.frameBuilt() — an open window is InvalidArgument: declared items are never silently dropped, CORE-008); 4. the frame's instance count <= maxInstances (else BudgetExhausted + one rate-limited Warn instance_capacity — the budget, PERF-008); 5. every group's atlas in the registry and bound (else InvalidArgument — the stateless pre-state validation, one failure per frame). After the preconditions, BEFORE any GL state: the G-R2 per-pass draw-call cap (PRD §9.3) — the frame's group count above maxDrawCalls fires one rate-limited Warn (`sprite_renderer/draw_call_cap`) and sets the frame's `drawCallCapExceeded` flag (the frame-graph flag); the frame is STILL drawn — the cap is observation, never an execution gate (the G-R5 precedent). The M2-SPRITE-04 counters (programChanges, uploadBytes, renderTargetBytes) are recorded on the frame before/during the GL work; a FAILED submit zeroes them (a failed frame reports nothing — the frameStats() contract). The frame's world -> NDC matrix (the IsoCamera / M2-PROJ-01 combined matrix — RENDER-006) is the per-frame uniform. The batcher reference is non-const only because the batcher's pool accessors are (the M2-SPRITE-01 house quirk); submit mutates nothing on the batcher. n * 52 B, G draw calls, zero allocation — the header Performance section.", "budget": "O(G * 5 + n) CPU (G groups, n instances), one upload of", "experimental": false},
{"name": "laige::render::SpriteRenderer::frameStats", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 379, "signature": "[[nodiscard]] SpriteDrawStats frameStats() const noexcept", "summary": "The per-frame counters of the last SUCCESSFUL submit (a failed submit reads zero — it zeroes them). O(1).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::totals", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 382, "signature": "[[nodiscard]] SpriteDrawTotals totals() const noexcept", "summary": "The since-construction totals (successful submits only). O(1).", "budget": null, "experimental": false},
{"name": "laige::render::SpriteRenderer::textureMemoryBytes", "kind": "method", "header": "src/laige-render/include/laige/render/sprite_renderer.h", "line": 391, "signature": "[[nodiscard]] std::uint64_t textureMemoryBytes() const noexcept", "summary": "The VRAM estimate of the atlas registry (M2-SPRITE-04, the RENDER-001 texture-memory feed): the sum of width * height * 4 bytes over the BOUND atlases (GL_RGBA8 — the upload's byte count). Updated at bindAtlas (a re-bind replaces: the old texture's bytes are subtracted, the new ones added); reads 0 in the stopped state. A GAUGE (not a per-frame counter) — it changes only on the set-up/asset path, never per frame. O(1).", "budget": null, "experimental": false},
{"name": "laige::render::TileData", "kind": "struct", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 185, "signature": "struct TileData", "summary": "One tile's data (the value the game writes on load/edit and reads back; plain value — no GL, no allocation).", "budget": null, "experimental": false},
{"name": "laige::render::TileData::textureId", "kind": "variable", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 187, "signature": "std::uint32_t textureId{}", "summary": "The texture/atlas reference (the game assigns it — M3-ASSET-01).", "budget": null, "experimental": false},
{"name": "laige::render::TileData::height", "kind": "variable", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 190, "signature": "std::int32_t height{}", "summary": "The tile's step height in world units (the standing surface's elevation — the auto-depth source, the M2-ISO-01 `z` input).", "budget": null, "experimental": false},
{"name": "laige::render::TileData::animationId", "kind": "variable", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 193, "signature": "std::uint32_t animationId{}", "summary": "The animation-table reference (DATA ONLY in M2 — M2-TILE-02 cycles frames from it; the batch path never touches it).", "budget": null, "experimental": false},
{"name": "laige::render::TileMap", "kind": "class", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 204, "signature": "template <typename Backend> class TileMap", "summary": "The tile grid + its depth table (M2-ISO-02) + the batch path.", "budget": null, "experimental": false},
{"name": "laige::render::TileMap::Options", "kind": "alias", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 220, "signature": "using Options = IsoDepthKeyTable<Backend>::Options", "summary": "The create options — the table's options themselves (one type, passed through to the table's create — the validation is the table's, first failure wins, InvalidArgument): `originTileX/Y` (default 0), `widthTiles`/`heightTiles` (required >= 1), `chunkTiles` (default `kIsoDepthTableChunkTiles` = 16, a power of two >= 1), `maxChunks` (default `kIsoDepthTableDefaultMaxChunks` = 1024), `layer` (default `kIsoDepthGroundLayer` = 0 — a parallax tile LAYER gets its own tilemap with its layer value, M2-PAR-01).", "budget": null, "experimental": false},
{"name": "laige::render::TileMap::DeclareOptions", "kind": "struct", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 224, "signature": "struct DeclareOptions", "summary": "The per-frame declare options (the fixed-frame quad model, above): the group-key fields for every tile sprite + the fixed UV frame.", "budget": null, "experimental": false},
{"name": "laige::render::TileMap::DeclareOptions::materialId", "kind": "variable", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 226, "signature": "std::uint32_t materialId{0}", "summary": "The material reference (0 = the default material).", "budget": null, "experimental": false},
{"name": "laige::render::TileMap::DeclareOptions::blend", "kind": "variable", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 229, "signature": "BlendMode blend{BlendMode::Alpha}", "summary": "The blend state of every tile sprite (the group key's third field).", "budget": null, "experimental": false},
{"name": "laige::render::TileMap::DeclareOptions::uv", "kind": "variable", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 232, "signature": "SpriteUvRect uv{0.0f, 0.0f, 1.0f, 1.0f}", "summary": "The fixed frame: every tile quad's UV sub-rect (default (0, 0, 1, 1) = the full tile texture).", "budget": null, "experimental": false},
{"name": "laige::render::TileMap::create", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 241, "signature": "[[nodiscard]] static Result<TileMap> create(const Options& options) noexcept", "summary": "Creates the tilemap (setup path — the only allocations besides rebuild's setup temporary): validates the options (the table's create — first failure wins, InvalidArgument), pre-sizes the table's initial grid chunks, and pre-sizes the per-tile data array (8 B/tile, the requested grid). Flat/empty init: every tile is {textureId 0, height 0, animationId 0} — no tile is set.", "budget": null, "experimental": false},
{"name": "laige::render::TileMap::setTile", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 256, "signature": "[[nodiscard]] Status setTile(std::int32_t tileX, std::int32_t tileY, std::uint32_t textureId, std::int32_t height, std::uint32_t animationId) noexcept", "summary": "The per-tile edit (sim phase). Stores the tile's textureId and animationId and routes the height into the table's setTile — the AUTO-DEPTH wiring: the table stores the height and recomputes exactly that cell's key (the M2-ISO-02 incremental update, radius 0; the other cells' keys are untouched). O(1), zero allocation.", "budget": null, "experimental": false},
{"name": "laige::render::TileMap::rebuild", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 276, "signature": "[[nodiscard]] Status rebuild(std::span<const TileData> tiles) noexcept", "summary": "Scene load (setup path — the only place besides create that allocates: one temporary covered-height span for the table's from-scratch rebuild). Stores the whole tile grid: the per-tile data and the heights through the table's rebuild (every key through the full M2-ISO-01 function). `tiles` covers the REQUESTED grid — `widthTiles() * heightTiles()` entries, row-major, tileX fastest.", "budget": null, "experimental": false},
{"name": "laige::render::TileMap::declareTo", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 294, "signature": "[[nodiscard]] Status declareTo(SpriteBatcher& batcher, const DeclareOptions& options) noexcept", "summary": "The render path (the frame pipeline's cull/batch stage): declares this tilemap's static tile quads into the batcher's current frame window — one SpriteItem per tile of the REQUESTED grid, in the grid's row-major order (tileY outer, tileX fastest — the preamble's quad model: the tile's center, the table's key (auto-depth), the tile's texture, the fixed frame). O(tileCount), zero allocation, no GL, no logging — the adds are O(1) batcher operations.", "budget": null, "experimental": false},
{"name": "laige::render::TileMap::tileAt", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 299, "signature": "[[nodiscard]] TileData tileAt(std::int32_t tileX, std::int32_t tileY) const noexcept", "summary": "The read path (render phase, O(1), zero allocation, no GL):", "budget": null, "experimental": false},
{"name": "laige::render::TileMap::depthKeyAt", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 301, "signature": "[[nodiscard]] std::uint32_t depthKeyAt(std::int32_t tileX, std::int32_t tileY) const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::TileMap::tileHeightAt", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 303, "signature": "[[nodiscard]] std::int32_t tileHeightAt(std::int32_t tileX, std::int32_t tileY) const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::TileMap::covers", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 309, "signature": "[[nodiscard]] bool covers(std::int32_t tileX, std::int32_t tileY) const noexcept", "summary": "Whether the tile lies in the REQUESTED grid (the batch path and the tileAt/depthKeyAt/tileHeightAt preconditions). The table's covered region may extend past the requested grid (its chunk- aligned superset) — those cells are table cells, not tiles.", "budget": null, "experimental": false},
{"name": "laige::render::TileMap::originTileX", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 313, "signature": "std::int32_t originTileX() const noexcept", "summary": "Introspection (O(1); the table-backed values forward the table):", "budget": null, "experimental": false},
{"name": "laige::render::TileMap::originTileY", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 314, "signature": "std::int32_t originTileY() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::TileMap::widthTiles", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 315, "signature": "std::int32_t widthTiles() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::TileMap::heightTiles", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 316, "signature": "std::int32_t heightTiles() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::TileMap::layer", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 317, "signature": "std::int32_t layer() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::TileMap::chunkTiles", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 318, "signature": "std::int32_t chunkTiles() const noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::TileMap::tileCount", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 320, "signature": "std::size_t tileCount() const noexcept", "summary": "The requested grid's tile count (widthTiles * heightTiles).", "budget": null, "experimental": false},
{"name": "laige::render::TileMap::TileMap", "kind": "constructor", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 325, "signature": "TileMap(const TileMap&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::TileMap::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 326, "signature": "TileMap& operator=(const TileMap&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::TileMap::TileMap", "kind": "constructor", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 327, "signature": "TileMap(TileMap&&) noexcept = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::TileMap::operator=", "kind": "method", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 328, "signature": "TileMap& operator=(TileMap&&) noexcept = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::TileMap::~TileMap", "kind": "destructor", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 329, "signature": "~TileMap() = default", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::TileMap::TileSlot::textureId", "kind": "variable", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 340, "signature": "std::uint32_t textureId{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::render::TileMap::TileSlot::animationId", "kind": "variable", "header": "src/laige-render/include/laige/render/tilemap.h", "line": 341, "signature": "std::uint32_t animationId{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kMaxArchetypes", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 184, "signature": "inline constexpr std::uint32_t kMaxArchetypes = 256", "summary": "The engine-level cap on distinct component sets (archetypes) per world (CORE-005: a named engine constant, the kMaxComponentTypes precedent — a game's component-set vocabulary is orders of magnitude smaller than its entity count; raising it is an ADR, not a knob).", "budget": null, "experimental": false},
{"name": "laige::kMaxArchetypeComponents", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 189, "signature": "inline constexpr std::uint32_t kMaxArchetypeComponents = 32", "summary": "The engine-level cap on components per entity (per archetype) (CORE-005). A 33rd distinct component on one entity fails addComponent with BudgetExhausted.", "budget": null, "experimental": false},
{"name": "laige::kInitialArchetypeRows", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 194, "signature": "inline constexpr std::uint32_t kInitialArchetypeRows = 16", "summary": "Rows reserved when an archetype is created (or the world's entity capacity, when smaller). Growth doubles from here (see the header preamble, \"Reserve policy\").", "budget": null, "experimental": false},
{"name": "laige::kArchetypeColumnAlignment", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 200, "signature": "inline constexpr std::uint32_t kArchetypeColumnAlignment = 32", "summary": "Column blocks are aligned to this many bytes: the P0 targets' maximum fundamental alignment (x86-64/arm64), so every trivially copyable component type's alignof fits (registerComponent static- asserts alignof(T) <= kArchetypeColumnAlignment).", "budget": null, "experimental": false},
{"name": "laige::kArchetypeColumnPad", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 202, "signature": "inline constexpr std::size_t kArchetypeColumnPad = kArchetypeColumnAlignment - 1", "summary": "Over-allocation that keeps the aligned base inside the raw block.", "budget": null, "experimental": false},
{"name": "laige::kInvalidColumnIndex", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 207, "signature": "inline constexpr std::uint32_t kInvalidColumnIndex = 0xFFFFFFFFu", "summary": "The \"column absent\" sentinel for columnIndexOf results (API-008: call sites never spell raw 0xFFFFFFFF).", "budget": null, "experimental": false},
{"name": "laige::kInvalidRowIndex", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 212, "signature": "inline constexpr std::uint32_t kInvalidRowIndex = 0xFFFFFFFFu", "summary": "The \"row absent\" sentinel for attachSlot failure results. Rows are 0-based and row 0 is a valid row, so 0 cannot be the failure value (API-008: call sites never spell raw 0xFFFFFFFF).", "budget": null, "experimental": false},
{"name": "laige::ArchetypeStats", "kind": "struct", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 239, "signature": "struct ArchetypeStats", "summary": "One archetype's storage accounting snapshot (PRD §10.4, FR-11.4, G-R4 feed; mirrors the M0-CORE-05 PoolStats shape). A plain value the M1 profiler (M1-PROF-01) and the churn/overflow checks pull:", "budget": null, "experimental": false},
{"name": "laige::ArchetypeStats::archetypeCount", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 240, "signature": "std::uint32_t archetypeCount{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ArchetypeStats::rowsLive", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 241, "signature": "std::uint32_t rowsLive{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ArchetypeStats::rowsReserved", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 242, "signature": "std::uint32_t rowsReserved{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ArchetypeStats::bytesReserved", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 243, "signature": "std::uint64_t bytesReserved{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ArchetypeStats::totalAdds", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 244, "signature": "std::uint64_t totalAdds{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ArchetypeStats::totalRemoves", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 245, "signature": "std::uint64_t totalRemoves{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ArchetypeStats::totalArchetypeGrowth", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 246, "signature": "std::uint64_t totalArchetypeGrowth{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ArchetypeStats::totalReservations", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 247, "signature": "std::uint64_t totalReservations{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ArchetypeStats::totalRowShifts", "kind": "variable", "header": "src/laige-sim/include/laige/sim/archetype.h", "line": 248, "signature": "std::uint64_t totalRowShifts{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ComponentTypeId", "kind": "struct", "header": "src/laige-sim/include/laige/sim/component.h", "line": 119, "signature": "struct ComponentTypeId", "summary": "The stable per-world component type id (FR-1.2). See the header preamble for the assignment and determinism contracts.", "budget": null, "experimental": false},
{"name": "laige::ComponentTypeId::value", "kind": "variable", "header": "src/laige-sim/include/laige/sim/component.h", "line": 120, "signature": "std::uint32_t value{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kInvalidComponentTypeId", "kind": "variable", "header": "src/laige-sim/include/laige/sim/component.h", "line": 125, "signature": "inline constexpr ComponentTypeId kInvalidComponentTypeId{0}", "summary": "The never-assigned id (API-008: the invalid state is representable and checkable; call sites never spell raw 0s).", "budget": null, "experimental": false},
{"name": "laige::operator==", "kind": "function", "header": "src/laige-sim/include/laige/sim/component.h", "line": 127, "signature": "inline bool operator==(ComponentTypeId a, ComponentTypeId b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::operator!=", "kind": "function", "header": "src/laige-sim/include/laige/sim/component.h", "line": 130, "signature": "inline bool operator!=(ComponentTypeId a, ComponentTypeId b) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::operator<", "kind": "function", "header": "src/laige-sim/include/laige/sim/component.h", "line": 135, "signature": "inline bool operator<(ComponentTypeId a, ComponentTypeId b) noexcept", "summary": "Ordering is registration order (M1-ECS-03's per-archetype component sets and M1-ECS-05's deterministic iteration order by this).", "budget": null, "experimental": false},
{"name": "laige::ComponentInfo", "kind": "struct", "header": "src/laige-sim/include/laige/sim/component.h", "line": 142, "signature": "struct ComponentInfo", "summary": "The size/alignment recorded for a registered component type. The M1-ECS-03 SoA layout reads these: one column is a contiguous T[] of `size` bytes aligned to `alignment`.", "budget": null, "experimental": false},
{"name": "laige::ComponentInfo::size", "kind": "variable", "header": "src/laige-sim/include/laige/sim/component.h", "line": 143, "signature": "std::uint32_t size{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ComponentInfo::alignment", "kind": "variable", "header": "src/laige-sim/include/laige/sim/component.h", "line": 144, "signature": "std::uint32_t alignment{}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kMaxComponentTypes", "kind": "variable", "header": "src/laige-sim/include/laige/sim/component.h", "line": 149, "signature": "inline constexpr std::uint32_t kMaxComponentTypes = 256", "summary": "The engine-level cap on component types per world (CORE-005). See the preamble for the rationale and the ADR path to raise it.", "budget": null, "experimental": false},
{"name": "LAIGE_COMPONENT", "kind": "macro", "header": "src/laige-sim/include/laige/sim/component.h", "line": 196, "signature": "#define LAIGE_COMPONENT(Type)", "summary": "Mark T as a Laige component (FR-1.2; S-8 data-carrier case).", "budget": null, "experimental": false},
{"name": "laige::kSupportedConfigVersion", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 230, "signature": "inline constexpr std::uint32_t kSupportedConfigVersion = 1", "summary": "The only config-document version this build accepts (ARCH-007: readers reject or migrate unsupported data explicitly — the rejection table in the header preamble).", "budget": null, "experimental": false},
{"name": "laige::kDefaultSimulationSeed", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 234, "signature": "inline constexpr std::uint64_t kDefaultSimulationSeed = 0", "summary": "The default master simulation seed (M1-DET-01: the PRNG substreams derive from it; it is part of the replay identity, ADR 0002).", "budget": null, "experimental": false},
{"name": "laige::kDefaultSystemTimeBudgetMs", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 241, "signature": "inline constexpr double kDefaultSystemTimeBudgetMs = 1.5", "summary": "The per-system default time budget in milliseconds (G-R5). 1.5 ms is half of the 3.0 ms sim_tick_avg budget (budgets.json, PRD §8.1): at 60 Hz, a scene whose systems all take their defaults still fits the tick budget with margin. Declared value in M1 (no scheduler consumer yet — the per-system default lands with M1-PROF-02's budget report).", "budget": null, "experimental": false},
{"name": "laige::kDefaultDrawCallsPerFrame", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 247, "signature": "inline constexpr std::uint32_t kDefaultDrawCallsPerFrame = 30", "summary": "The declared per-frame draw-call budget. 30 is the PRD §8.1 budget for the worst-case busy scene (50k visible sprites, 3 parallax layers, UI — budgets.json `sprites_50k_draw_calls`). Declared value in M1; the M2 batcher consumes it.", "budget": null, "experimental": false},
{"name": "laige::kDefaultParticlesPerFrame", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 253, "signature": "inline constexpr std::uint32_t kDefaultParticlesPerFrame = 4096", "summary": "The declared per-frame particle budget (FR-2.7: budgeted, pooled). No measured M1 consumer; 4096 is a power-of-two default sized for a 60 fps pool (the M2 particle system validates it against the platform).", "budget": null, "experimental": false},
{"name": "laige::kDefaultCameraFovDegrees", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 259, "signature": "inline constexpr double kDefaultCameraFovDegrees = 45.0", "summary": "The default perspective field of view in degrees (FR-2.4/FR-2.5). 45 degrees is the 2.5D default for the perspective projection modes; the isometric ortho presets (the PRD primary) use `zoom` instead. Declared value in M1; the M2 camera work consumes it.", "budget": null, "experimental": false},
{"name": "laige::kDefaultCameraZoom", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 262, "signature": "inline constexpr double kDefaultCameraZoom = 1.0", "summary": "The default camera zoom (world-to-screen scale factor).", "budget": null, "experimental": false},
{"name": "laige::kDefaultCameraFollowLerpPerSec", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 268, "signature": "inline constexpr double kDefaultCameraFollowLerpPerSec = 8.0", "summary": "The default smooth-follow rate in 1/s (FR-2.4 \"smooth follow\"): the per-frame follow factor is 1 - exp(-8*dt), about a 125 ms time constant at 60 Hz. Declared value in M1; the M2 camera work consumes it.", "budget": null, "experimental": false},
{"name": "laige::BudgetsConfig", "kind": "struct", "header": "src/laige-sim/include/laige/sim/config.h", "line": 274, "signature": "struct BudgetsConfig", "summary": "The declared budget block (M1-CFG-01; FR-1.5 \"budgets\").", "budget": null, "experimental": false},
{"name": "laige::BudgetsConfig::systemTimeDefaultMs", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 276, "signature": "double systemTimeDefaultMs{kDefaultSystemTimeBudgetMs}", "summary": "The per-system default time budget in milliseconds (G-R5).", "budget": null, "experimental": false},
{"name": "laige::BudgetsConfig::drawCallsPerFrame", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 278, "signature": "std::uint32_t drawCallsPerFrame{kDefaultDrawCallsPerFrame}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::BudgetsConfig::particlesPerFrame", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 281, "signature": "std::uint32_t particlesPerFrame{kDefaultParticlesPerFrame}", "summary": "The declared per-frame particle budget (the M2 particle system's budget).", "budget": null, "experimental": false},
{"name": "laige::CameraConfig", "kind": "struct", "header": "src/laige-sim/include/laige/sim/config.h", "line": 286, "signature": "struct CameraConfig", "summary": "The camera defaults (M1-CFG-01; FR-1.5 \"camera defaults\"). Stored now, consumed in M2 (the camera work) — see the header preamble.", "budget": null, "experimental": false},
{"name": "laige::CameraConfig::fovDegrees", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 288, "signature": "double fovDegrees{kDefaultCameraFovDegrees}", "summary": "The perspective field of view in degrees (0 < fov <= 180).", "budget": null, "experimental": false},
{"name": "laige::CameraConfig::zoom", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 290, "signature": "double zoom{kDefaultCameraZoom}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::CameraConfig::followLerpPerSec", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 292, "signature": "double followLerpPerSec{kDefaultCameraFollowLerpPerSec}", "summary": null, "budget": null, "experimental": false},
{"name": "laige::EngineConfig", "kind": "struct", "header": "src/laige-sim/include/laige/sim/config.h", "line": 305, "signature": "struct EngineConfig", "summary": "The typed game configuration the engine consumes (M1-CFG-01, the final schema; the five M1-HEAD-01 members keep their order — existing aggregate initializers compile unchanged).", "budget": null, "experimental": false},
{"name": "laige::EngineConfig::tickRateHz", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 308, "signature": "std::uint32_t tickRateHz{kDefaultTickRateHz}", "summary": "The simulation tick rate in Hz (kMinTickRateHz..kMaxTickRateHz — 20..120; the GameLoop re-validates the same range, game_loop.h).", "budget": null, "experimental": false},
{"name": "laige::EngineConfig::entityCapacity", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 311, "signature": "std::uint32_t entityCapacity{0}", "summary": "The scene's entity budget in entities (0..Entity::kMaxEntities — the G-R3 scene budget; 0 is the empty scene).", "budget": null, "experimental": false},
{"name": "laige::EngineConfig::churnPerFrameBudget", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 314, "signature": "std::uint32_t churnPerFrameBudget{kDefaultChurnPerFrameBudget}", "summary": "The per-frame component-churn budget (the G-R4 guardrail; 0 disables it).", "budget": null, "experimental": false},
{"name": "laige::EngineConfig::seed", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 319, "signature": "std::uint64_t seed{kDefaultSimulationSeed}", "summary": "The master simulation seed (the PRNG substreams derive from it, M1-DET-01; part of the replay identity, ADR 0002). The programmatic surface accepts the full 64 bits (the JSON surface is bounded to 2^53 by the ADR 0003 number policy — see the parse table).", "budget": null, "experimental": false},
{"name": "laige::EngineConfig::determinism", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 321, "signature": "DeterminismConfig determinism{}", "summary": "The determinism block (M1-DET-01; ADR 0002).", "budget": null, "experimental": false},
{"name": "laige::EngineConfig::budgets", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 323, "signature": "BudgetsConfig budgets{}", "summary": "The declared budget block (FR-1.5).", "budget": null, "experimental": false},
{"name": "laige::EngineConfig::camera", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 325, "signature": "CameraConfig camera{}", "summary": "The camera defaults (FR-1.5; consumed in M2).", "budget": null, "experimental": false},
{"name": "laige::EngineConfig::assetRoots", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 329, "signature": "std::vector<std::string> assetRoots", "summary": "The asset root paths (FR-1.5; the asset pipeline — M2 — resolves them). Existence is NOT checked at config load (a root may be created later; the pipeline owns the check).", "budget": null, "experimental": false},
{"name": "laige::kConfigSubsystem", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 336, "signature": "inline constexpr const char* kConfigSubsystem = \"config\"", "summary": "The NFR-13.3 5-field rejection messages (build-stable; the doc anchor is docs/api/config.md — the schema's API document). engine.cpp's Engine::create tick-rate re-validation shares kConfigTickRateInvalidMessage (one text for one rejection, LOG-002).", "budget": null, "experimental": false},
{"name": "laige::kConfigNotAnObjectMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 337, "signature": "inline constexpr const char* kConfigNotAnObjectMessage = \"not_an_object | the config document is not a JSON object | the \" \"game config must be a top-level object | wrap the config in a \" \"top-level object ({} plus \\\"version\\\": 1 for all defaults) | \" \"docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigVersionMissingMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 342, "signature": "inline constexpr const char* kConfigVersionMissingMessage = \"version_missing | the config document has no version key | the \" \"document predates the versioned schema (the M1-HEAD-01 provisional \" \"surface) or the key was removed | add \\\"version\\\": 1 to the config \" \"(docs/api/config.md) | docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigVersionInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 347, "signature": "inline constexpr const char* kConfigVersionInvalidMessage = \"version_invalid | the config version key is not an exact \" \"non-negative integer | version must be a JSON number holding an \" \"exact integer | set version to 1 | docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigVersionUnsupportedMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 351, "signature": "inline constexpr const char* kConfigVersionUnsupportedMessage = \"version_unsupported | the config document version is not \" \"supported by this build | this build accepts version 1 only \" \"(ARCH-007) | rebuild with the engine version matching the \" \"document, or downgrade the document to version 1 | \" \"docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigTickRateInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 357, "signature": "inline constexpr const char* kConfigTickRateInvalidMessage = \"tick_rate_invalid | the configured tick_rate_hz is invalid | the \" \"value must be an exact integer in the 20-120 Hz range | set \" \"tick_rate_hz to a value in 20-120 (the default is 60) | \" \"docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigEntityBudgetInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 362, "signature": "inline constexpr const char* kConfigEntityBudgetInvalidMessage = \"entity_budget_invalid | the configured entity_budget is invalid | \" \"the value must be an exact integer in 0-65536 (the 16-bit entity \" \"id space) | set entity_budget to a value in 0-65536 (the scene's \" \"declared budget, G-R3) | docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigChurnBudgetInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 367, "signature": "inline constexpr const char* kConfigChurnBudgetInvalidMessage = \"churn_budget_invalid | the configured churn_per_frame_budget is \" \"invalid | the value must be a non-negative exact integer | set \" \"churn_per_frame_budget to a non-negative integer (the default is \" \"256; 0 disables the G-R4 guardrail) | docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigSeedInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 372, "signature": "inline constexpr const char* kConfigSeedInvalidMessage = \"seed_invalid | the configured seed is invalid | the value must be \" \"an exact integer in 0-2^53 (the ADR 0003 JSON bound: doubles are \" \"exact to 2^53; the programmatic EngineConfig.seed accepts the \" \"full 64 bits) | set seed to an integer in 0-2^53 (the default is \" \"0) | docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigDeterminismInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 378, "signature": "inline constexpr const char* kConfigDeterminismInvalidMessage = \"determinism_invalid | the configured determinism block is invalid \" \"| the block must be a JSON object ({} for all defaults); the \" \"nested keys enabled (bool) and math (string) have their own \" \"checks | wrap the determinism block in an object | \" \"docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigDeterminismEnabledInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 384, "signature": "inline constexpr const char* kConfigDeterminismEnabledInvalidMessage = \"determinism_enabled_invalid | the configured determinism.enabled \" \"is invalid | the value must be a JSON boolean (the default is \" \"true — deterministic by default, S-7) | set determinism.enabled to \" \"true or false | docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigDeterminismMathInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 389, "signature": "inline constexpr const char* kConfigDeterminismMathInvalidMessage = \"determinism_math_invalid | the configured determinism.math is \" \"invalid | the value must be the string \\\"fixed_point_16_16\\\" \" \"(default) or \\\"float_pinned_32\\\" (the ADR 0002 backend ids) | set \" \"determinism.math to one of the two backend ids | \" \"docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigBudgetsInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 395, "signature": "inline constexpr const char* kConfigBudgetsInvalidMessage = \"budgets_invalid | the configured budgets block is invalid | the \" \"block must be a JSON object ({} for all defaults); the nested \" \"keys have their own checks | wrap the budgets block in an object \" \"| docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigSystemTimeBudgetInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 400, "signature": "inline constexpr const char* kConfigSystemTimeBudgetInvalidMessage = \"system_time_budget_invalid | the configured budgets.\" \"system_time_default_ms is invalid | the value must be a finite \" \"number > 0 (milliseconds; the per-system default time budget, \" \"G-R5) | set system_time_default_ms to a positive finite value \" \"(the default is 1.5) | docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigDrawCallsBudgetInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 406, "signature": "inline constexpr const char* kConfigDrawCallsBudgetInvalidMessage = \"draw_calls_budget_invalid | the configured budgets.\" \"draw_calls_per_frame is invalid | the value must be a non-\" \"negative exact integer (the declared per-frame draw-call budget; \" \"the M2 batcher consumes it) | set draw_calls_per_frame to a non-\" \"negative integer (the default is 30) | docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigParticlesBudgetInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 412, "signature": "inline constexpr const char* kConfigParticlesBudgetInvalidMessage = \"particles_budget_invalid | the configured budgets.\" \"particles_per_frame is invalid | the value must be a non-\" \"negative exact integer (the declared per-frame particle budget; \" \"the M2 particle system consumes it) | set particles_per_frame to \" \"a non-negative integer (the default is 4096) | \" \"docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigCameraInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 419, "signature": "inline constexpr const char* kConfigCameraInvalidMessage = \"camera_invalid | the configured camera block is invalid | the \" \"block must be a JSON object ({} for all defaults); the nested \" \"keys have their own checks | wrap the camera block in an object | \" \"docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigCameraFovInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 424, "signature": "inline constexpr const char* kConfigCameraFovInvalidMessage = \"camera_fov_invalid | the configured camera.fov_degrees is invalid \" \"| the value must be a finite number in (0, 180] degrees | set \" \"fov_degrees to a finite value in (0, 180] (the default is 45) | \" \"docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigCameraZoomInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 429, "signature": "inline constexpr const char* kConfigCameraZoomInvalidMessage = \"camera_zoom_invalid | the configured camera.zoom is invalid | the \" \"value must be a finite number > 0 | set zoom to a finite value > 0 \" \"(the default is 1) | docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigCameraFollowLerpInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 433, "signature": "inline constexpr const char* kConfigCameraFollowLerpInvalidMessage = \"camera_follow_lerp_invalid | the configured camera.\" \"follow_lerp_per_sec is invalid | the value must be a finite \" \"number >= 0 (the smooth-follow rate in 1/s, FR-2.4) | set \" \"follow_lerp_per_sec to a finite value >= 0 (the default is 8) | \" \"docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigAssetRootsInvalidMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 439, "signature": "inline constexpr const char* kConfigAssetRootsInvalidMessage = \"asset_roots_invalid | the configured asset_roots value is invalid \" \"| asset_roots must be a JSON array of non-empty strings | set \" \"asset_roots to an array of path strings ([] for none) | \" \"docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigUnknownKeyMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 444, "signature": "inline constexpr const char* kConfigUnknownKeyMessage = \"unknown_key | the config key is not part of the version 1 config \" \"schema | the key is not (yet) consumed by this build | remove the \" \"key, or wait for a later schema version (forward-compat) | \" \"docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigFileReadFailedMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 449, "signature": "inline constexpr const char* kConfigFileReadFailedMessage = \"file_read_failed | the config file could not be read | the path \" \"does not exist, is not readable, or is over the 1 MiB bound (ADR \" \"0003) | check the path, permissions, and file size | \" \"docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigHotReloadRejectedMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 457, "signature": "inline constexpr const char* kConfigHotReloadRejectedMessage = \"hot_reload_rejected | the config hot reload was refused: a \" \"simulation-affecting key changed | sim-affecting keys (tick rate, \" \"budgets, seed, determinism) change the simulation and require a \" \"restart (FR-1.5) | restart the engine with the new config; only \" \"non-simulation keys are hot-reloadable | docs/api/config.md\"", "summary": "The hot-reload messages (debug builds except the _disabled one, which is release-only — the guards keep both trees warning-free).", "budget": null, "experimental": false},
{"name": "laige::kConfigHotReloadAppliedMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 463, "signature": "inline constexpr const char* kConfigHotReloadAppliedMessage = \"hot_reload_applied | the config file changed and its \" \"non-simulation keys were reloaded | the file's camera defaults, \" \"presentation budgets, and asset roots now apply to the live \" \"config | none (informational) | docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigHotReloadReadFailedMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 468, "signature": "inline constexpr const char* kConfigHotReloadReadFailedMessage = \"hot_reload_read_failed | the config file could not be re-read \" \"during a hot-reload poll | the file was locked, deleted, or is \" \"over the 1 MiB bound (a transient editor state) | the previous \" \"config stays in effect; retry on the next poll | \" \"docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::kConfigHotReloadDisabledMessage", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 476, "signature": "inline constexpr const char* kConfigHotReloadDisabledMessage = \"hot_reload_disabled | config hot reload is a debug-build feature \" \"| this binary was built without debug support (NDEBUG defined — \" \"release build) | rebuild with CMAKE_BUILD_TYPE=Debug, or restart \" \"the engine with the new config | docs/api/config.md\"", "summary": null, "budget": null, "experimental": false},
{"name": "laige::parseEngineConfig", "kind": "function", "header": "src/laige-sim/include/laige/sim/config.h", "line": 498, "signature": "[[nodiscard]] Result<EngineConfig, ErrorCode> parseEngineConfig(const JsonValue& doc) noexcept", "summary": "Parses a version 1 config document into the typed config (the schema + rejection table in the header preamble; the full key table in docs/api/config.md).", "budget": null, "experimental": false},
{"name": "laige::loadGameConfig", "kind": "function", "header": "src/laige-sim/include/laige/sim/config.h", "line": 511, "signature": "[[nodiscard]] Result<EngineConfig, ErrorCode> loadGameConfig(std::string_view path) noexcept", "summary": "Reads the config file at `path`, parses it, and validates it against the version 1 schema. The read is bounded (kMaxConfigDocumentBytes = 1 MiB; an oversized file is MalformedInput, not a truncated parse).", "budget": null, "experimental": false},
{"name": "laige::EngineConfigOverride", "kind": "struct", "header": "src/laige-sim/include/laige/sim/config.h", "line": 522, "signature": "struct EngineConfigOverride", "summary": "A programmatic override of a SUBSET of an EngineConfig (FR-1.5 \"runtime config overrides\"). A std::nullopt field is kept from the base config; a set field replaces it and is validated in its documented domain (a set field outside the domain is InvalidArgument — the same config/<key>_invalid events as the JSON path). First set field that fails wins (the declaration order below).", "budget": null, "experimental": false},
{"name": "laige::EngineConfigOverride::tickRateHz", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 527, "signature": "std::optional<std::uint32_t> tickRateHz", "summary": "The simulation-affecting fields (the same domains as the JSON schema): 20..120 Hz; 0..65536 entities; >= 0; full 64-bit seed (no 2^53 JSON bound on the programmatic surface); the two backend enums.", "budget": null, "experimental": false},
{"name": "laige::EngineConfigOverride::entityCapacity", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 528, "signature": "std::optional<std::uint32_t> entityCapacity", "summary": null, "budget": null, "experimental": false},
{"name": "laige::EngineConfigOverride::churnPerFrameBudget", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 529, "signature": "std::optional<std::uint32_t> churnPerFrameBudget", "summary": null, "budget": null, "experimental": false},
{"name": "laige::EngineConfigOverride::seed", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 530, "signature": "std::optional<std::uint64_t> seed", "summary": null, "budget": null, "experimental": false},
{"name": "laige::EngineConfigOverride::determinismEnabled", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 531, "signature": "std::optional<bool> determinismEnabled", "summary": null, "budget": null, "experimental": false},
{"name": "laige::EngineConfigOverride::determinismMath", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 532, "signature": "std::optional<SimMathBackend> determinismMath", "summary": null, "budget": null, "experimental": false},
{"name": "laige::EngineConfigOverride::systemTimeDefaultMs", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 535, "signature": "std::optional<double> systemTimeDefaultMs", "summary": "The declared presentation fields: finite > 0 ms; >= 0; finite (0, 180] degrees; finite > 0; finite >= 0; non-empty strings.", "budget": null, "experimental": false},
{"name": "laige::EngineConfigOverride::drawCallsPerFrame", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 536, "signature": "std::optional<std::uint32_t> drawCallsPerFrame", "summary": null, "budget": null, "experimental": false},
{"name": "laige::EngineConfigOverride::particlesPerFrame", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 537, "signature": "std::optional<std::uint32_t> particlesPerFrame", "summary": null, "budget": null, "experimental": false},
{"name": "laige::EngineConfigOverride::fovDegrees", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 538, "signature": "std::optional<double> fovDegrees", "summary": null, "budget": null, "experimental": false},
{"name": "laige::EngineConfigOverride::zoom", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 539, "signature": "std::optional<double> zoom", "summary": null, "budget": null, "experimental": false},
{"name": "laige::EngineConfigOverride::followLerpPerSec", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 540, "signature": "std::optional<double> followLerpPerSec", "summary": null, "budget": null, "experimental": false},
{"name": "laige::EngineConfigOverride::assetRoots", "kind": "variable", "header": "src/laige-sim/include/laige/sim/config.h", "line": 541, "signature": "std::optional<std::vector<std::string>> assetRoots", "summary": null, "budget": null, "experimental": false},
{"name": "laige::applyConfigOverride", "kind": "function", "header": "src/laige-sim/include/laige/sim/config.h", "line": 548, "signature": "[[nodiscard]] Result<EngineConfig, ErrorCode> applyConfigOverride( const EngineConfig& base, const EngineConfigOverride& override) noexcept", "summary": "Merges `override` into a copy of `base` (value semantics: the base is untouched) and validates every set field (the header preamble, Loading and overrides). Returns the merged config, or the first rejected set field's error (no config on failure).", "budget": null, "experimental": false},
{"name": "laige::ConfigHotReloader", "kind": "class", "header": "src/laige-sim/include/laige/sim/config.h", "line": 602, "signature": "class ConfigHotReloader", "summary": "The debug-build-only config hot reloader (FR-1.5; the contract in the header preamble, Loading and overrides).", "budget": null, "experimental": false},
{"name": "laige::ConfigHotReloader::create", "kind": "method", "header": "src/laige-sim/include/laige/sim/config.h", "line": 606, "signature": "[[nodiscard]] static Result<ConfigHotReloader, ErrorCode> create( std::string_view path) noexcept", "summary": "Binds to the config file at `path` and takes the baseline. Cold path: one bounded file read + one parse + one schema validation.", "budget": null, "experimental": false},
{"name": "laige::ConfigHotReloader::poll", "kind": "method", "header": "src/laige-sim/include/laige/sim/config.h", "line": 611, "signature": "[[nodiscard]] Status poll(EngineConfig& config) noexcept", "summary": "Polls the file once (see the class contract above). `config` is updated in place only on a successful non-sim reload.", "budget": null, "experimental": false},
{"name": "laige::ConfigHotReloader::ConfigHotReloader", "kind": "constructor", "header": "src/laige-sim/include/laige/sim/config.h", "line": 613, "signature": "ConfigHotReloader(ConfigHotReloader&&) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ConfigHotReloader::operator=", "kind": "method", "header": "src/laige-sim/include/laige/sim/config.h", "line": 614, "signature": "ConfigHotReloader& operator=(ConfigHotReloader&&) noexcept", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ConfigHotReloader::ConfigHotReloader", "kind": "constructor", "header": "src/laige-sim/include/laige/sim/config.h", "line": 615, "signature": "ConfigHotReloader(const ConfigHotReloader&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::ConfigHotReloader::operator=", "kind": "method", "header": "src/laige-sim/include/laige/sim/config.h", "line": 616, "signature": "ConfigHotReloader& operator=(const ConfigHotReloader&) = delete", "summary": null, "budget": null, "experimental": false},
{"name": "laige::SimMathBackend", "kind": "enum", "header": "src/laige-sim/include/laige/sim/determinism.h", "line": 165, "signature": "enum class SimMathBackend : std::uint8_t", "summary": "The SimMath backend a deterministic run uses (ADR 0002; the typed form of the config ids \"fixed_point_16_16\" / \"float_pinned_32\"). Selected once at engine init (Engine::create consumes it — the ADR's \"factory-selected at init\", no per-call dispatch).", "budget": null, "experimental": false},
{"name": "laige::SimMathBackend::FixedPoint16_16", "kind": "enumerator", "header": "src/laige-sim/include/laige/sim/determinism.h", "line": 171, "signature": "FixedPoint16_16", "summary": "The default backend: Q16.16 in int32_t storage, int64_t intermediates (laige/fpx16_16.h). Bit-exact across all builds, platforms, ISAs, and compilers (guaranteed by the C++20 language standard — ADR 0002); required for lockstep (AC-10.3) and authoritative MMO.", "budget": null, "experimental": false},
{"name": "laige::SimMathBackend::FloatPinned32", "kind": "enumerator", "header": "src/laige-sim/include/laige/sim/determinism.h", "line": 177, "signature": "FloatPinned32", "summary": "Opt-in IEEE float semantics: binary32 (`float`) with the pinned flag set (ADR 0002, laige/sim_math.h). Bit-exact across runs of the same build on the same platform/ISA; cross-ISA identity is the detcheck matrix's job (M1-DET-04) — a failing pair is declared unsupported for this backend.", "budget": null, "experimental": false},
{"name": "laige::DeterminismConfig", "kind": "struct", "header": "src/laige-sim/include/laige/sim/determinism.h", "line": 183, "signature": "struct DeterminismConfig", "summary": "The typed determinism block of EngineConfig (M1-DET-01; ADR 0002). A plain value: the engine copies it (config echo, engine.h) — no ownership, no state, trivially copyable.", "budget": null, "experimental": false},
{"name": "laige::DeterminismConfig::enabled", "kind": "variable", "header": "src/laige-sim/include/laige/sim/determinism.h", "line": 186, "signature": "bool enabled{true}", "summary": "Deterministic mode on/off (S-7: deterministic by default). M1 semantics in the header preamble \"Determinism mode semantics\".", "budget": null, "experimental": false},
{"name": "laige::DeterminismConfig::math", "kind": "variable", "header": "src/laige-sim/include/laige/sim/determinism.h", "line": 188, "signature": "SimMathBackend math{SimMathBackend::FixedPoint16_16}", "summary": "The SimMath backend the deterministic run uses (ADR 0002).", "budget": null, "experimental": false},
{"name": "LAIGE_DETERMINISM_SAFE", "kind": "macro", "header": "src/laige-sim/include/laige/sim/determinism.h", "line": 299, "signature": "#define LAIGE_DETERMINISM_SAFE(Type, ...)", "summary": "Mark Type as a determinism-safe storage/component type (G-R8, S-7): declare that Type's members are exactly the listed member types (every member; order is irrelevant — the list is a set of types). The mark specializes the trait with the verified member list:", "budget": null, "experimental": false},
{"name": "laige::Engine", "kind": "class", "header": "src/laige-sim/include/laige/sim/engine.h", "line": 524, "signature": "class Engine", "summary": "The headless engine (M1-HEAD-01): config -> world -> systems -> loop, then the ordered CONC-006 shutdown. See the header preamble for the lifecycle, the run contract, the shutdown order, the config surface, the determinism scope, and the misuse warnings.", "budget": null, "experimental": false},
{"name": "laige::Engine::create", "kind": "method", "header": "src/laige-sim/include/laige/sim/engine.h", "line": 542, "signature": "[[nodiscard]] static Result<Engine, ErrorCode> create(const EngineConfig& config) noexcept", "summary": "Setup phase (the engine's only backing allocations happen in the World's create — the registry tables and, when capacity > 0, the per-slot tables): validate the typed config, create the World (entityCapacity, churnPerFrameBudget, seed, determinism mode), and register the built-in component matching the configured SimMath backend (Position2DFpx16 default, Position2DFp32 for float_pinned_32 — M1-DET-01; the engine's built-ins always come first — ARCH-010). O(1) beyond the World's setup allocations.", "budget": null, "experimental": false},
{"name": "laige::Engine::world", "kind": "method", "header": "src/laige-sim/include/laige/sim/engine.h", "line": 548, "signature": "[[nodiscard]] World* world() noexcept", "summary": "The engine's world (the game setup phase: register components and systems here, BEFORE run_headless). nullptr after shutdown or on a moved-from engine (CPP-008 nullability; the stopped-state precedent). O(1), no side effects.", "budget": null, "experimental": false},
{"name": "laige::Engine::config", "kind": "method", "header": "src/laige-sim/include/laige/sim/engine.h", "line": 552, "signature": "[[nodiscard]] const EngineConfig& config() const noexcept", "summary": "The engine configuration echo (the validated values). O(1), no side effects.", "budget": null, "experimental": false},
{"name": "laige::Engine::run_headless", "kind": "method", "header": "src/laige-sim/include/laige/sim/engine.h", "line": 578, "signature": "[[nodiscard]] Status run_headless(std::uint64_t maxTicks, std::uint32_t frameBudgetTicks = kDefaultMaxCatchUpTicks) noexcept", "summary": "Run the headless engine: compute the schedule, create the loop (with the presentation onTick hook) and the snapshot, drive frames until maxTicks ticks have completed (0 = the server form: run until the process ends), then shut down (always — even on a failed frame; CONC-006). One engine run per engine: a second call (after any outcome) fails with InvalidArgument without logging (the stopped-state precedent).", "budget": "O(maxTicks x per-tick system work), bounded per frame by frameBudgetTicks (PERF-002); setup allocates three one-shot objects (the GameLoop, the PresentationSnapshot, and the snapshot slot table); the frame path allocates nothing.", "experimental": false},
{"name": "laige::Engine::shutdown", "kind": "method", "header": "src/laige-sim/include/laige/sim/engine.h", "line": 586, "signature": "void shutdown() noexcept", "summary": "The ordered, IDEMPOTENT shutdown (the header preamble \"The ordered shutdown\": loop -> world clear -> storage release -> logging flush). Safe before a run, after a run, and after a failed run; the destructor calls it. O(world clear cost); no logging on the success path beyond the facade's own flush.", "budget": null, "experimental": false},
{"name": "laige::Engine::isShutDown", "kind": "method", "header": "src/laige-sim/include/laige/sim/engine.h", "line": 590, "signature": "[[nodiscard]] bool isShutDown() const noexcept", "summary": "True once shutdown() has completed (or on a moved-from engine). O(1), no side effects.", "budget": null, "experimental": false},
{"name": "laige::Engine::stats", "kind": "method", "header": "src/laige-sim/include/laige/sim/engine.h", "line": 596, "signature": "[[nodiscard]] GameLoopStats stats() const noexcept", "summary": "The last run's loop accounting (frames, ticks, droppedTicks, droppedFrames — the GameLoopStats since the run's loop construction; all zeros before the first run). O(1), no allocation, no side effects (the profiler feed, M1-PROF-01).", "budget": null, "experimental": false},
{"name": "laige::Engine::startReplayRecording", "kind": "method", "header": "src/laige-sim/include/laige/sim/engine.h", "line": 631, "signature": "[[nodiscard]] Status startReplayRecording(std::string_view path, std::uint64_t maxBytes) noexcept", "summary": "Start the opt-in replay recording of the upcoming run (M1-DET-02; see the header preamble \"Replay recording\" and docs/api/replay.md for the full contract). DEBUG BUILDS ONLY: a release build rejects the call with InvalidArgument plus the structured replay/record_disabled warn (CORE-008: never silent).", "budget": "cold path: one file open + one 40-byte header write; no per-tick cost while the engine is not recording.", "experimental": false},
{"name": "laige::Engine::replayRecordingActive", "kind": "method", "header": "src/laige-sim/include/laige/sim/engine.h", "line": 636, "signature": "[[nodiscard]] bool replayRecordingActive() const noexcept", "summary": "True while a replay recording is active (started and not yet finalized or abandoned). O(1), no side effects.", "budget": null, "experimental": false},
{"name": "laige::Engine::replayBytesWritten", "kind": "method", "header": "src/laige-sim/include/laige/sim/engine.h", "line": 640, "signature": "[[nodiscard]] std::uint64_t replayBytesWritten() const noexcept", "summary": "The bytes the active recording has written (header + frame bytes; 0 when not recording). O(1), no side effects.", "budget": null, "experimental": false},
{"name": "laige::Engine::profiler", "kind": "method", "header": "src/laige-sim/include/laige/sim/engine.h", "line": 647, "signature": "[[nodiscard]] const Profiler* profiler() const noexcept", "summary": "The engine's always-on profiler (M1-PROF-01; the counters are live while the engine runs). nullptr after shutdown or on a moved-from engine (the world() nullability precedent). Use profileStats() for the run's cached summary. O(1), no side effects.", "budget": null, "experimental": false},