diff --git a/.gitattributes b/.gitattributes index 2c52ad31b..43351f803 100644 --- a/.gitattributes +++ b/.gitattributes @@ -34,6 +34,7 @@ docs/site/readiness.json text eol=lf # Fuzz corpus manifests hash seed bytes exactly. Keep JSON seeds LF-stable so # Windows autocrlf cannot invalidate the cross-platform content digest. FuzzerTests/corpora/json-utils/*.json text eol=lf +FuzzerTests/corpora/material-editor-files/** -text FuzzerTests/corpora/crash-manifest/*.json text eol=lf # .sparkscene seeds deliberately carry CRLF, lone CR, NUL and non-UTF-8 bytes; # store them verbatim so neither normalization nor autocrlf rewrites a seed. diff --git a/.github/badges/files.json b/.github/badges/files.json index 845095a2c..757f7d899 100644 --- a/.github/badges/files.json +++ b/.github/badges/files.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "label": "source files", - "message": "3,235", + "message": "3,252", "color": "green", "cacheSeconds": 300 } diff --git a/.github/badges/loc-breakdown.json b/.github/badges/loc-breakdown.json index 13106f404..ed48371a1 100644 --- a/.github/badges/loc-breakdown.json +++ b/.github/badges/loc-breakdown.json @@ -1,12 +1,12 @@ { "schemaVersion": 1, - "total": 933347, - "files": 3235, - "engine": 346913, - "editor": 106228, - "game": 163669, + "total": 936157, + "files": 3252, + "engine": 347396, + "editor": 106742, + "game": 164092, "services": 12922, - "pipeline": 3188, - "tests": 276437, - "tools": 23990 + "pipeline": 3231, + "tests": 277774, + "tools": 24000 } diff --git a/.github/badges/loc.json b/.github/badges/loc.json index 94a7484c8..6371b4fdd 100644 --- a/.github/badges/loc.json +++ b/.github/badges/loc.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "label": "C++ lines of code", - "message": "933,347", + "message": "936,157", "color": "blue", "logo": "cplusplus", "cacheSeconds": 300 diff --git a/.github/badges/tests.json b/.github/badges/tests.json index c434f58b2..34affaaf5 100644 --- a/.github/badges/tests.json +++ b/.github/badges/tests.json @@ -1,7 +1,7 @@ { "schemaVersion": 1, "label": "test definitions", - "message": "8,530", + "message": "8,563", "color": "brightgreen", "cacheSeconds": 300 } diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index ec50b02cb..2c8b52230 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -40,7 +40,7 @@ SparkConsole/ ← External debug console app (named pipe communication) Shaders/HLSL/ ← DirectX shaders (PBR, post-processing, compute) Shaders/GLSL/ ← OpenGL shaders (experimental) -Tests/ ← 8,530 test definitions across 738 files, CTest integration +Tests/ ← 8,563 test definitions across 741 files, CTest integration Templates/ ← Game module templates Assets/ ← Demo scenes, models, scripts ``` diff --git a/.github/prompts/build-test.prompt.md b/.github/prompts/build-test.prompt.md index 0792309f1..3d39c51f0 100644 --- a/.github/prompts/build-test.prompt.md +++ b/.github/prompts/build-test.prompt.md @@ -72,7 +72,7 @@ Workflow triggers and required/advisory matrix rows are defined in `.github/work ## Testing -8,530 test definitions across 738 files in `Tests/` with internal framework + CTest. +8,563 test definitions across 741 files in `Tests/` with internal framework + CTest. ```powershell # Registered CTest cases; an empty selection is an error. diff --git a/.github/prompts/copilot-instructions.md b/.github/prompts/copilot-instructions.md index c0cbbc57b..b032b96d6 100644 --- a/.github/prompts/copilot-instructions.md +++ b/.github/prompts/copilot-instructions.md @@ -40,7 +40,7 @@ SparkConsole/ ← External debug console app (named pipe communication) Shaders/HLSL/ ← DirectX shaders (PBR, post-processing, compute) Shaders/GLSL/ ← OpenGL shaders (experimental) -Tests/ ← 8,530 test definitions across 738 files, CTest integration +Tests/ ← 8,563 test definitions across 741 files, CTest integration Templates/ ← Game module templates Assets/ ← Demo scenes, models, scripts ``` diff --git a/.github/scripts/compare_windows_shipping_repro.py b/.github/scripts/compare_windows_shipping_repro.py new file mode 100644 index 000000000..c957d91cb --- /dev/null +++ b/.github/scripts/compare_windows_shipping_repro.py @@ -0,0 +1,409 @@ +#!/usr/bin/env python3 +"""Retain bounded COFF diagnostics alongside the unchanged BLD-100 comparison. + +The acceptance report and exit status come from compare_build_outputs. The +separate diagnostics inspect one differing ordinary archive member per library; +they never authorize additional normalization or infer a cause from a hash. + +Schema /2 adds differingRegions[].details: normalized-region byte offsets and +hex values, decoded COFF header fields, bounded printable string windows, and +C13 record headers/locations. Missing bytes have an empty hex value. Every +sample cap records omissions; unsupported record payloads remain unqualified. +The diagnosticOnly flag and original acceptanceEquivalent result apply to all +decoded fields, including an inspection-unavailable subrecord or output fallback. +""" + +from __future__ import annotations + +import argparse +import bisect +import hashlib +import json +import os +import struct +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parents[2] / "tools")) +import compare_build_outputs as comparator # noqa: E402 + +MAX_LIBRARIES = 64 +MAX_MEMBER_BYTES = 16 * 1024 * 1024 +MAX_CHANGED_REGIONS = 32 +MAX_DIAGNOSTIC_BYTES = 1024 * 1024 +MAX_BYTE_SAMPLES = 16 +MAX_SAMPLE_BYTES = 16 +MAX_STRING_SAMPLES = 8 +MAX_STRING_BYTES = 192 +MAX_CODEVIEW_RECORDS = 65536 +DIAGNOSTIC_SCHEMA = "spark.windows-shipping-repro-diagnostics/2" +DIAGNOSTIC_ERRORS = (OSError, ValueError, struct.error, comparator.InputError, comparator.FormatError) + + +def _hash(data: bytes) -> str: + return hashlib.sha256(data).hexdigest() + + +def _error_text(error: Exception) -> str: + # Keep optional diagnostics bounded without recording native absolute paths + # from filesystem exceptions. + return (error.strerror if isinstance(error, OSError) and error.strerror else str(error))[:512] + + +def _member(path: Path, index: int, expected: dict, build_root: bytes) -> tuple[bytes, bytes] | None: + """Read only the selected member, checking its manifest-bound digest.""" + if path.is_symlink() or not path.is_file(): + raise comparator.InputError("diagnostic library is not a regular file") + with path.open("rb") as handle: + handle.seek(0, os.SEEK_END) + file_size = handle.tell() + if comparator._read(handle, 0, 8, file_size) != comparator.AR_MAGIC: + raise comparator.InputError("diagnostic library is not an archive") + offset = 8 + for ordinal in range(index + 1): + header = comparator._read(handle, offset, 60, file_size) + if header[58:60] != b"`\n": + raise comparator.InputError("invalid diagnostic archive member header") + try: + size = int(header[48:58].decode("ascii").strip()) + except ValueError as error: + raise comparator.InputError("invalid diagnostic archive member size") from error + if size < 0 or size > file_size - offset - 60: + raise comparator.InputError("diagnostic archive member exceeds its file") + if ordinal == index: + if size != expected["size"]: + raise comparator.InputError("diagnostic member size differs from its manifest") + if size > MAX_MEMBER_BYTES: + return None + data = comparator._read(handle, offset + 60, size, file_size) + normalized, _ = comparator._replace_build_root(data, build_root) + if _hash(header + normalized) != expected["sha256"]: + raise comparator.InputError("diagnostic member digest differs from its manifest") + return header, data + offset += 60 + size + (size & 1) + raise comparator.InputError("diagnostic archive member is missing") + + +def _regions(data: bytes) -> list[tuple[str, bytes]]: + """Partition COFF bytes into sections, headers and all remaining bytes.""" + bigobj = data[:4] == b"\x00\x00\xff\xff" + if bigobj and len(data) >= 6 and struct.unpack_from(" len(data): + raise comparator.InputError("invalid diagnostic COFF section table") + regions = [("", data[:header_size]), + ("", data[header_size:table_end])] + covered = [(0, table_end)] + for index in range(count): + section = header_size + index * 40 + size, offset = struct.unpack_from(" len(data) or size > len(data) - offset: + raise comparator.InputError("diagnostic COFF section exceeds its member") + regions.append((f"{name} (#{index})", data[offset:offset + size])) + covered.append((offset, offset + size)) + covered.sort() + if any(start < previous_end for (start, _), (_, previous_end) in zip(covered[1:], covered)): + raise comparator.InputError("overlapping diagnostic COFF sections") + outside = bytearray() + cursor = 0 + for start, end in covered: + outside.extend(data[cursor:start]) + cursor = end + outside.extend(data[cursor:]) + # Includes relocations, symbols, string tables and any padding: no byte is + # discarded merely because it is outside a section's raw-data range. + regions.append(("", bytes(outside))) + return regions + + +def _describe_region(name: str, raw: bytes, normalized: bytes, root: bytes) -> dict: + return {"name": name, "size": len(raw), "rawSha256": _hash(raw), + "normalizedSha256": _hash(normalized), "buildRootOccurrences": raw.count(root)} + + +def _byte_differences(first: bytes, second: bytes) -> dict: + """Retain bounded differing byte runs; offsets refer to normalized regions.""" + samples = [] + count = 0 + offset = 0 + maximum = max(len(first), len(second)) + while offset < maximum: + if first[offset:offset + 1] == second[offset:offset + 1]: + offset += 1 + continue + start = offset + while (offset < maximum and offset - start < MAX_SAMPLE_BYTES + and first[offset:offset + 1] != second[offset:offset + 1]): + count += 1 + offset += 1 + if len(samples) < MAX_BYTE_SAMPLES: + samples.append({"offset": start, "firstHex": first[start:offset].hex(), + "secondHex": second[start:offset].hex()}) + retained = sum(max(len(item["firstHex"]), len(item["secondHex"])) // 2 for item in samples) + return {"offsetBasis": "normalized-region", "differingByteCount": count, + "samples": samples, "omittedDifferingBytes": count - retained} + + +def _header_fields(data: bytes) -> dict: + if len(data) == 56 and data[:4] == b"\x00\x00\xff\xff": + names = ("signature1", "signature2", "version", "machine", "timeDateStamp", "classIdHex", + "sizeOfData", "flags", "metaDataSize", "metaDataOffset", "numberOfSections", + "pointerToSymbolTable", "numberOfSymbols") + values = list(struct.unpack(" dict: + """Show printable spans touching sampled changes, never entire sections.""" + windows = [] + seen = set() + for sample in samples: + offset = sample["offset"] + if offset >= len(data) or not 32 <= data[offset] <= 126: + continue + start = offset + end = offset + 1 + # Bound scanning too: a malicious all-printable section cannot force + # repeated scans of its full length around each changed byte. + while start and offset - start < MAX_STRING_BYTES and 32 <= data[start - 1] <= 126: + start -= 1 + while end < len(data) and end - offset <= MAX_STRING_BYTES and 32 <= data[end] <= 126: + end += 1 + window_start = max(start, offset - MAX_STRING_BYTES // 2) + window_end = min(end, window_start + MAX_STRING_BYTES) + window_start = max(start, window_end - MAX_STRING_BYTES) + key = (window_start, window_end) + if key in seen: + continue + seen.add(key) + windows.append({"offset": window_start, "text": data[window_start:window_end].decode("ascii"), + "truncatedBefore": window_start > 0 and 32 <= data[window_start - 1] <= 126, + "truncatedAfter": window_end < len(data) and 32 <= data[window_end] <= 126}) + return {"windows": windows[:MAX_STRING_SAMPLES], + "omittedWindows": max(0, len(windows) - MAX_STRING_SAMPLES)} + + +def _codeview_records(data: bytes, section: str, samples: list[dict]) -> dict: + """Locate sampled changes in bounded C13 containers, without interpreting unknown leaves.""" + if len(data) < 4 or struct.unpack_from("= MAX_CODEVIEW_RECORDS: + raise comparator.InputError("diagnostic CodeView record limit exceeded") + if section == ".debug$T": + if len(data) - cursor < 4: + raise comparator.InputError("truncated diagnostic CodeView type record") + length, kind = struct.unpack_from(" len(data) - cursor: + raise comparator.InputError("invalid diagnostic CodeView type record length") + record = {"offset": cursor, "size": size, "typeIndex": 0x1000 + count, + "kindHex": f"0x{kind:04x}", + "kindName": {0x1603: "LF_BUILDINFO", 0x1605: "LF_STRING_ID"}.get(kind, "unrecognized")} + else: + if len(data) - cursor < 8: + raise comparator.InputError("truncated diagnostic CodeView subsection") + kind, length = struct.unpack_from(" len(data) - cursor: + raise comparator.InputError("invalid diagnostic CodeView subsection length") + record = {"offset": cursor, "size": size, "kindHex": f"0x{kind:08x}", + "kindName": {0xF1: "symbols", 0xF2: "lines", 0xF3: "string-table", + 0xF4: "file-checksums", 0xF5: "frame-data"}.get(kind, "unrecognized")} + position = bisect.bisect_left(offsets, cursor) + if position < len(offsets) and offsets[position] < cursor + size: + record["scope"] = "record-header-and-location" + record["status"] = ("inspection-unavailable" if record["kindName"] == "unrecognized" else "inspected") + if record["status"] == "inspection-unavailable": + record["error"] = "unsupported diagnostic CodeView record kind" + records.append(record) + cursor += size + if section == ".debug$S": + cursor = (cursor + 3) & ~3 + if cursor > len(data): + raise comparator.InputError("truncated diagnostic CodeView subsection alignment") + count += 1 + return {"status": "inspected", "recordCount": count, + "sampledChangeRecords": records[:MAX_BYTE_SAMPLES], + "omittedSampledChangeRecords": max(0, len(records) - MAX_BYTE_SAMPLES)} + + +def _region_details(name: str, first: bytes, second: bytes) -> dict: + section = name.split(" (#", 1)[0] + if section not in {"", ".chks64", ".drectve", ".debug$S", ".debug$T"}: + return {"status": "inspection-unavailable", "error": "byte decoding is unsupported for this region"} + result = {"status": "inspected", "byteDifferences": _byte_differences(first, second)} + samples = result["byteDifferences"]["samples"] + if section == "": + fields = [_header_fields(data) for data in (first, second)] + result["headers"] = {"first": fields[0], "second": fields[1]} + result["fieldDifferences"] = [{"field": key, "first": fields[0].get(key), "second": fields[1].get(key)} + for key in sorted(fields[0].keys() | fields[1].keys()) + if fields[0].get(key) != fields[1].get(key)] + elif section != ".chks64": + result["stringWindows"] = {"first": _string_windows(first, samples), + "second": _string_windows(second, samples)} + if section.startswith(".debug$"): + result["codeView"] = {} + for side, data in (("first", first), ("second", second)): + try: + result["codeView"][side] = _codeview_records(data, section, samples) + except DIAGNOSTIC_ERRORS as error: + result["codeView"][side] = {"status": "inspection-unavailable", "error": _error_text(error)} + return result + + +def _diagnose_member(first: tuple[bytes, bytes], second: tuple[bytes, bytes], + first_root: bytes, second_root: bytes) -> dict: + descriptions = [] + normalized_parts = [] + for (header, data), root in ((first, first_root), (second, second_root)): + normalized, _ = comparator._replace_build_root(data, root) + raw_regions, normalized_regions = _regions(data), _regions(normalized) + normalized_parts.append([header, *[part for _, part in normalized_regions]]) + descriptions.append([ + _describe_region("", header, header, root), + *[_describe_region(name, raw, adjusted, root) + for (name, raw), (_, adjusted) in zip(raw_regions, normalized_regions)], + ]) + left, right = descriptions + changed = [] + for index in range(max(len(left), len(right))): + a = left[index] if index < len(left) else None + b = right[index] if index < len(right) else None + if a is None or b is None or any(a[key] != b[key] for key in ("name", "size", "normalizedSha256")): + item = {"first": a, "second": b} + if len(changed) < MAX_CHANGED_REGIONS: + try: + item["details"] = (_region_details(a["name"], normalized_parts[0][index], + normalized_parts[1][index]) + if a is not None and b is not None and a["name"] == b["name"] + else {"status": "inspection-unavailable", "error": "region layout differs"}) + except DIAGNOSTIC_ERRORS as error: + item["details"] = {"status": "inspection-unavailable", "error": _error_text(error)} + changed.append(item) + return {"status": "inspected", "differingRegionCount": len(changed), + "differingRegions": changed[:MAX_CHANGED_REGIONS], + "omittedDifferingRegions": max(0, len(changed) - MAX_CHANGED_REGIONS)} + + +def diagnostics(first_manifest: dict, second_manifest: dict, first_root: Path, second_root: Path, + first_build_root: str, second_build_root: str, report: dict) -> dict: + entries = [{entry["path"]: entry for entry in manifest["entries"]} + for manifest in (first_manifest, second_manifest)] + libraries = [] + eligible = [item for item in report["differing"] + if item["path"].lower().endswith(".lib") + and all(side[item["path"]]["kind"] == "ar" for side in entries)] + for difference in eligible[:MAX_LIBRARIES]: + path = difference["path"] + a, b = (side[path] for side in entries) + selected = next(((index, left, right) for index, (left, right) in enumerate(zip(a["sections"], b["sections"])) + if left["name"] == right["name"] and left["name"] not in ("", "") + and left != right), None) + item = {"path": path, "status": "no-aligned-differing-member"} + if selected is not None: + index, left, right = selected + item.update({"member": left["name"], "memberIndex": index}) + try: + members = [] + for root, member, build_root in ((first_root, left, first_build_root), + (second_root, right, second_build_root)): + file = root / path + if not file.resolve().is_relative_to(root.resolve()): + raise comparator.InputError("diagnostic library escapes its install root") + members.append(_member(file, index, member, os.fsencode(build_root))) + if any(member is None for member in members): + item["status"] = "member-exceeds-diagnostic-byte-limit" + else: + item.update(_diagnose_member(members[0], members[1], os.fsencode(first_build_root), + os.fsencode(second_build_root))) + except DIAGNOSTIC_ERRORS as error: + item.update({"status": "inspection-unavailable", "error": _error_text(error)}) + libraries.append(item) + return {"schema": DIAGNOSTIC_SCHEMA, "diagnosticOnly": True, + "acceptanceEquivalent": report["equivalent"], "libraries": libraries, + "omittedLibraries": max(0, len(eligible) - MAX_LIBRARIES), + "limits": {"libraries": MAX_LIBRARIES, "memberBytes": MAX_MEMBER_BYTES, + "changedRegionsPerMember": MAX_CHANGED_REGIONS, "outputBytes": MAX_DIAGNOSTIC_BYTES, + "byteSamplesPerRegion": MAX_BYTE_SAMPLES, "bytesPerSample": MAX_SAMPLE_BYTES, + "stringSamplesPerSide": MAX_STRING_SAMPLES, "bytesPerString": MAX_STRING_BYTES, + "codeViewRecordsPerRegion": MAX_CODEVIEW_RECORDS}} + + +def main(arguments: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__) + for name in ("first-manifest", "second-manifest", "first-root", "second-root", "report", "diagnostics"): + parser.add_argument(f"--{name}", required=True, type=Path) + for name in ("first-build-root", "second-build-root"): + parser.add_argument(f"--{name}", required=True) + args = parser.parse_args(arguments) + try: + if not args.first_build_root or not args.second_build_root: + raise comparator.InputError("diagnostic build roots must not be empty") + first = comparator.load_manifest(args.first_manifest) + second = comparator.load_manifest(args.second_manifest) + report = comparator.compare_manifests(first, second) + args.report.parent.mkdir(parents=True, exist_ok=True) + args.report.write_text(json.dumps(report, indent=2, sort_keys=True) + "\n", encoding="utf-8") + comparator.print_report(report, str(args.first_manifest), str(args.second_manifest)) + except DIAGNOSTIC_ERRORS as error: + print(f"Windows Shipping reproducibility comparison: {_error_text(error)}", file=sys.stderr) + return 2 + + # The manifests and comparison above are authoritative. Unsupported members, + # unavailable native files or a diagnostic write failure cannot replace a + # valid equivalent/differing comparison with an input-error result. + try: + detail = diagnostics(first, second, args.first_root, args.second_root, + args.first_build_root, args.second_build_root, report) + except DIAGNOSTIC_ERRORS as error: + detail = {"schema": DIAGNOSTIC_SCHEMA, "diagnosticOnly": True, + "acceptanceEquivalent": report["equivalent"], "status": "inspection-unavailable", + "error": _error_text(error)} + try: + payload = (json.dumps(detail, indent=2, sort_keys=True) + "\n").encode("utf-8") + if len(payload) > MAX_DIAGNOSTIC_BYTES: + detail = {"schema": DIAGNOSTIC_SCHEMA, "diagnosticOnly": True, + "acceptanceEquivalent": report["equivalent"], "status": "inspection-unavailable", + "error": "diagnostic output exceeds its byte limit"} + payload = (json.dumps(detail, indent=2, sort_keys=True) + "\n").encode("utf-8") + if len(payload) > MAX_DIAGNOSTIC_BYTES: + raise comparator.InputError("diagnostic byte limit cannot retain an unavailable result") + args.diagnostics.parent.mkdir(parents=True, exist_ok=True) + args.diagnostics.write_bytes(payload) + except DIAGNOSTIC_ERRORS as error: + print(f"Windows Shipping reproducibility diagnostics unavailable: {_error_text(error)}", file=sys.stderr) + return 0 if report["equivalent"] else 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/.github/scripts/new-msi-failure-transform.ps1 b/.github/scripts/new-msi-failure-transform.ps1 index 374b11c41..7728a503b 100644 --- a/.github/scripts/new-msi-failure-transform.ps1 +++ b/.github/scripts/new-msi-failure-transform.ps1 @@ -41,6 +41,10 @@ Require (-not $cmd.Contains("'")) 'System cmd.exe path cannot be embedded in MSI $work = Join-Path ([IO.Path]::GetDirectoryName($output)) ('.spark-qual-fail-' + [Guid]::NewGuid().ToString('N') + '.msi') Copy-Item -LiteralPath $source -Destination $work +# Artifact downloads can mark the verified MSI read-only. Copy-Item preserves +# that attribute, but the temporary database must be writable in transact mode. +# Change only the disposable copy; the input package remains untouched. +(Get-Item -LiteralPath $work -ErrorAction Stop).IsReadOnly = $false $installer = $null $original = $null $modified = $null diff --git a/.github/scripts/qualify-editor-fps.py b/.github/scripts/qualify-editor-fps.py index 04562df3a..74034f282 100644 --- a/.github/scripts/qualify-editor-fps.py +++ b/.github/scripts/qualify-editor-fps.py @@ -155,6 +155,20 @@ def discovery(document, require_command=False, source=None, build=None, source_s '-DSPARK_ENGINE_EXECUTABLE_NAME=SparkEngine.exe', '-DSPARK_EXPECTED_SOURCE_SHA='+source_sha, '-DSPARK_PYTHON_EXECUTABLE='+sys.executable.replace('\\', '/'), '-P', (source/'cmake/RunEditorFPSInstalledLineage.cmake').as_posix()] + if sys.platform == 'win32' and len(normalized) == len(expected): + # PATHEXT lookup can report .EXE while CMake reports .exe. Accept + # only case aliases of the same physical tool, never changed flags. + for index, prefix in ((0, ''), (7, '-DSPARK_PYTHON_EXECUTABLE=')): + if not normalized[index].startswith(prefix): + continue + actual_path = normalized[index][len(prefix):] + expected_path = expected[index][len(prefix):] + if actual_path != expected_path and actual_path.casefold() == expected_path.casefold(): + try: + if os.path.samefile(actual_path, expected_path): + normalized[index] = expected[index] + except OSError: + pass if normalized != expected: raise ValueError('Dedicated CTest exact command binding changed') return props diff --git a/.github/scripts/qualify-installed-native.py b/.github/scripts/qualify-installed-native.py index 5e842140e..48a372509 100644 --- a/.github/scripts/qualify-installed-native.py +++ b/.github/scripts/qualify-installed-native.py @@ -3,7 +3,9 @@ import hashlib import importlib.util import json +import math import os +import re from pathlib import Path import shutil import subprocess @@ -11,6 +13,7 @@ import tempfile import time import zipfile +import xml.etree.ElementTree as ET SOURCE = "d90b86e42fd586a56d53f077bbca6a457200d9bd" TARGETS = "SparkEngine SparkGameFPS SparkEditor SparkConsole SparkShaderCompiler SparkCrashReporter SparkCooker SparkWorker SparkAutomation SparkLauncher SparkBuild SparkInstaller SparkMismatchedModuleFixture SparkPreviousSdkModuleFixture".split() @@ -102,20 +105,553 @@ def bind_graph(path, expected): raise ValueError("Closure graph host identity mismatch") -def compact(root): +def weather_source_identity(identity, git): + if git("rev-parse", "HEAD") != identity["source_sha"] or git("status", "--porcelain", "--untracked-files=no"): + raise ValueError("Weather source is not clean exact recorded source") + for key, env in (("workflow_sha", "GITHUB_SHA"), ("run_id", "GITHUB_RUN_ID"), ("run_attempt", "GITHUB_RUN_ATTEMPT")): + if identity.get(key) != os.environ.get(env): + raise ValueError("Weather workflow/run identity changed") + + +def proof_json(path): + def unique(pairs): + result = {} + for key, value in pairs: + if key in result: + raise ValueError("Duplicate proof key") + result[key] = value + return result + with path.open("rb") as stream: + raw = stream.read(131073) + if len(raw) > 131072 or b"\0" in raw: + raise ValueError("Invalid bounded proof JSON") + return json.loads(raw.decode("utf-8"), object_pairs_hook=unique, + parse_constant=lambda value: (_ for _ in ()).throw(ValueError(value))) + + +def weather_proof(root, identity): + receipt = proof_json(root / "sdk/weather-identity.json") + expected = {key: identity[key] for key in ("source_sha", "workflow_sha", "run_id", "run_attempt", "host_sha256")} + expected.update(module="SparkGeneratedGame", headless="unavailable", windowed="accepted", lifecycle="passed") + if any(receipt.get(key) != value for key, value in expected.items()) or type(receipt.get("sdk_version")) is not int or receipt["sdk_version"] != 10: + raise ValueError("Weather receipt identity/result mismatch") + if type(receipt.get("boundary_scanned")) is not int or receipt["boundary_scanned"] < 2 or type(receipt.get("boundary_violations")) is not int or receipt["boundary_violations"] != 0: + raise ValueError("Weather SDK boundary result missing or failed") + for key in ("consumer_sha256", "host_sha256", "module_sha256", "sidecar_sha256"): + if not isinstance(receipt.get(key), str) or not re.fullmatch(r"[0-9a-f]{64}", receipt[key]): + raise ValueError("Invalid weather image digest") + names = ("runtime-stdout.log", "runtime-stderr.log", "runtime-weather-stdout.log", "runtime-weather-stderr.log") + if not isinstance(receipt.get("streams"), dict) or set(receipt["streams"]) != set(names): + raise ValueError("Incomplete weather streams") + texts = [] + for name in names: + with (root / "sdk" / name).open("rb") as stream: + raw = stream.read(131073) + if len(raw) > 131072 or b"\0" in raw or hashlib.sha256(raw).hexdigest() != receipt["streams"][name]: + raise ValueError("Weather stream digest/bounds mismatch") + texts.append(raw.decode("utf-8")) + for available, pair in ((0, texts[:2]), (1, texts[2:])): + records = [line for text in pair for line in text.splitlines() if "SPARK_SDK_WEATHER" in line] + expected_record = (f"SPARK_SDK_WEATHER module=SparkGeneratedGame available={available} accepted={available} " + f"invalid_rejected={available} clear_accepted={available} callback=OnLoad") + if records != [expected_record]: + raise ValueError("Weather stream result mismatch") + return receipt + + +FOCUSED = ( + ("host", "TestSdkWeatherService.cpp", "SdkWeatherService_", 4), + ("fps", "TestFPSWeatherPort.cpp", "FPSWeather", 8), + ("state", "TestPrototypeModuleKitReal.cpp", "PrototypeModuleKit_StateRulesRegisterThroughSdkContext", 1), + ("lifecycle", "TestModuleLifecycleReal.cpp", "ModuleLifecycleRecord_", 6), + ("reflected", "TestSceneManagerReflectedReal.cpp", "SceneManager_ReflectedGameplay", 10), +) +FOCUSED_SECONDS = 60 +FOCUSED_RESERVE = len(FOCUSED) * FOCUSED_SECONDS + + +def complete_text(path): + with path.open("rb") as stream: + data = stream.read(131073) + if len(data) > 131072 or b"\0" in data: + raise ValueError("Focused proof exceeds bounds or contains NUL: " + str(path)) + return data.decode("utf-8").replace("\r\n", "\n") + + +def focused_names(source, filename, prefix, count): + text = (source / "Tests" / filename).read_text(encoding="utf-8") + names = [name for name in re.findall(r"^TEST\(([A-Za-z_][A-Za-z_0-9]*)\)", text, re.M) if name.startswith(prefix)] + if len(names) != count or len(set(names)) != count: + raise ValueError("Focused source test census changed: " + filename) + return names + + +def validate_focused(directory, label, names): + streams = {kind: complete_text(directory / f"{label}-{kind}.{extension}") + for kind, extension in (("stdout", "log"), ("stderr", "log"), ("output", "log"), ("junit", "xml"))} + xml = streams["junit"] + if " now + 240 * 60: + raise ValueError("Invalid qualification shared clock") + reserve = 30 if phase == "pack" else 330 + ceiling = 270 if phase == "pack" else PHASE_SECONDS[phase] + deadline = min(now + ceiling, end - reserve) + remaining(deadline, ceiling) # Never release a child after the shared budget expires. + return deadline + + +INPUT_SECONDS = 90 +INPUT_RESERVE = 150 # Owner90 plus asset/identity/proof checks; within closure ceiling. +INPUT_SOURCES = ( + "Tests/PackageSmoke/RunFPSInputDispatch.py", "Tests/PackageSmoke/fps_owned_save_decode.py", + "Tests/TestFPSOwnedSaveDecode.cpp", "Tests/CMakeLists.txt", + "tools/asset-integrity/verify_asset_integrity.py", "tools/asset-integrity/package_closure.py", + "tools/asset-integrity/asset_references.py", "tools/asset-integrity/package-profiles.json", + "tools/asset-integrity/provenance.json", "Assets/assets.integrity.json", + "SparkEngine/Source/Input/InputManager.h", "SparkEngine/Source/Input/InputManager.cpp", + "GameModules/SparkGameFPS/Source/Game/Game.h", "GameModules/SparkGameFPS/Source/Game/Game.cpp", + "GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp", +) + + +def input_plain(path): + for part in (path, *path.parents): + if part.is_symlink() or (hasattr(part, "is_junction") and part.is_junction()): + raise ValueError("Linked input evidence/source path") + return path + + +def input_source_identity(identity, source, capture=False, git=None): + if git is not None and set(git("ls-files", "--error-unmatch", *INPUT_SOURCES).splitlines()) != set(INPUT_SOURCES): + raise ValueError("Input helper/source is not tracked in pinned product") + current = {name: digest(input_plain(source / name)) for name in INPUT_SOURCES} + if capture: + identity["input_sources"] = current + elif current != identity.get("input_sources"): + raise ValueError("Input source/helper identity changed") + + +def input_module(name, path): + spec = importlib.util.spec_from_file_location(name, input_plain(path)) + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + spec.loader.exec_module(module) + return module + + +def input_text(path): + input_plain(path) + with path.open("rb") as stream: + raw = stream.read(131073) + if len(raw) > 131072 or b"\0" in raw: + raise ValueError("Input proof exceeds complete text cap") + return raw.decode("utf-8") + + +def input_images(identity, root, source): + prefix = root / "sdk/prefix/bin" + binary = source / "build/windows-shipping/bin/MinSizeRel" + result = {} + for name in ("SparkEngine.exe", "SparkGameFPS.dll", "SparkGameFPS.dll.sparkabi", "SparkTests.exe"): + built = binary / name + if digest(input_plain(built)) != identity["images"].get(str(built)): + raise ValueError("Input binary differs from qualified build: " + name) + target = built if name == "SparkTests.exe" else prefix / name + if digest(input_plain(target)) != identity["images"][str(built)]: + raise ValueError("Input installed image differs from qualified build: " + name) + result[str(target)] = identity["images"][str(built)] + return result + + +def input_package(root, deadline): + prefix = input_plain(root / "sdk/prefix") + for parent in (prefix, prefix / "bin"): + if any((parent / name).exists() for name in ("Startup.sparkscene", "Saves")): + raise ValueError("Installed input closure contains startup override or inherited saves") + result = {} + for path in sorted(prefix.rglob("*")): + remaining(deadline, 1) + input_plain(path) + if path.is_file(): + if len(result) >= 10000: + raise ValueError("Installed input closure inventory exceeds bound") + result[path.relative_to(prefix).as_posix()] = digest(path) + if not all(name in result for name in ("bin/SparkEngine.exe", "bin/SparkGameFPS.dll", + "bin/SparkGameFPS.dll.sparkabi", + "bin/Assets/Models/pistol.obj", "bin/Assets/Models/rifle.obj")): + raise ValueError("Installed input closure lacks required actual FPS content") + # Bind the complete installed tree without uploading its binary contents. + raw = json.dumps(result, sort_keys=True, separators=(",", ":")).encode() + manifest = prefix / "bin/Assets/assets.integrity.json" + assets = proof_json(manifest) + return {"files": len(result), "sha256": hashlib.sha256(raw).hexdigest(), + "asset_manifest_sha256": digest(manifest), "asset_entries": len(assets["entries"])} + + +def input_sequence(driver, replay, saved, missing=False): + frames = replay.frames + if not frames or any(frames[0][key] != 0 for key in ("mask", "pressed", "released", "operation")): + raise ValueError("Input trace lacks released initial frame") + edges = [(i, f) for i, f in enumerate(frames) if f["pressed"] or f["released"]] + expected = [(2, 2, 0), (0, 0, 2)] if missing else [ + (4, 4, 0), (0, 0, 4), (1, 1, 0), (0, 0, 1), (8, 8, 0), (0, 0, 8), + (2, 2, 0), (0, 0, 2), (2, 2, 0), (0, 0, 2)] + if [(f["mask"], f["pressed"], f["released"]) for _, f in edges] != expected: + raise ValueError("Incomplete or unexpected input edge sequence") + mask = 0 + for frame in frames: + if frame["pressed"]: + if mask or frame["released"]: + raise ValueError("Overlapping input keys") + mask = frame["pressed"] + elif frame["released"]: + if frame["released"] != mask: + raise ValueError("Release without held key") + mask = 0 + if frame["mask"] != mask: + raise ValueError("Unobserved input transition") + if missing: + return + if edges[0][1]["profile"]["fps.profile.class"] != driver.SCOUT or saved["fps.profile.class"] != driver.SCOUT: + raise ValueError("F5 did not select saved Scout") + if (edges[4][1]["profile"]["fps.profile.class"] != driver.VANGUARD + or driver.VANGUARD == saved["fps.profile.class"]): + raise ValueError("F9 did not mutate live class") + for edge_index, action, serial in ((2, 1, 1), (6, 2, 2), (8, 2, 3)): + index, first = edges[edge_index] + release_index, release = edges[edge_index + 1] + if first["action"] != action or first["operation"] != serial or first["result"] != 1: + raise ValueError("Wrong input dispatch result") + if release_index < index + 3: + raise ValueError("Missing two completed held frames") + previous = first + for frame in frames[index + 1:index + 3]: + if (frame["input"] != previous["input"] + 1 or frame["update"] != previous["update"] + 1 + or frame["mask"] != first["mask"] or frame["action"] != 0 or frame["operation"] != serial): + raise ValueError("Nonconsecutive or repeated held dispatch") + previous = frame + if action == 2: + operation = replay.operations[serial - 1] + if operation["profile"] != saved or operation["transfer"] != saved: + raise ValueError("Immediate restored profile mismatch") + for frame in frames[index:index + 3] + [release]: + driver.restored_frame(frame, saved, first["update"]) + + +def input_proof(root, identity, source): + input_source_identity(identity, source) + driver = input_module("_qualified_input_replay", source / INPUT_SOURCES[0]) + decoder = input_module("_qualified_input_decode", source / INPUT_SOURCES[1]) + base = input_plain(root / "input") + report = proof_json(base / "receipt.json") + negative = proof_json(base / "missing-slot/receipt.json") + images = input_images(identity, root, source) + expected_images = {name: value for name, value in images.items() if not name.endswith(".sparkabi")} + if (report.get("passed") is not True or report.get("fullShippingQualification") is not False + or report.get("source") != identity["source_sha"] or report.get("identities") != expected_images + or report.get("decoderHelperSha256") != identity["input_sources"][INPUT_SOURCES[1]] + or report.get("missingSlot") != negative or negative.get("passed") is not True + or negative.get("case") != "missing-slot"): + raise ValueError("Input receipt/image/source binding mismatch") + elapsed = report.get("elapsedSeconds") + if type(elapsed) not in (int, float) or not math.isfinite(elapsed) or not 0 <= elapsed <= INPUT_SECONDS: + raise ValueError("Input owner time invalid") + members = [base / "receipt.json", base / "game.log", base / "missing-slot/receipt.json", + base / "missing-slot/game.log"] + for directory, missing in ((base, False), (base / "missing-slot", True)): + replay = driver.Replay(directory / "local/SparkEngine/Saves", missing_only=missing) + lines = input_text(directory / "game.log").splitlines(keepends=True) + for line in lines: + replay.feed(line.replace("\r\n", "\n")) + driver.check_lifecycle(lines) + scene_rows = [line for line in lines if "FPS scene identity:" in line] + if len(scene_rows) != 1: + raise ValueError("Missing/ambiguous authored FPS scene") + scene = re.search(r'FPS scene identity: authored scene "FPS Arena" \(([1-9][0-9]*) nodes\) from (.+?)\s*$', scene_rows[0]) + expected_scene = root / "sdk/prefix/bin/Assets/Scenes/level1.scene" + if scene is None or Path(scene[2]).resolve() != expected_scene.resolve(): + raise ValueError("Input ran fallback or wrong authored scene") + if not replay.ended or [r["action"] for r in replay.operations] != ([2] if missing else [1, 2, 2]): + raise ValueError("Input complete trace/action mismatch") + input_sequence(driver, replay, report.get("savedProfile"), missing) + if missing: + if replay.operations[0] != negative.get("operation"): + raise ValueError("Negative operation differs from actual trace") + elif replay.operations[0]["transfer"] != report.get("savedProfile"): + raise ValueError("Saved profile differs from actual dispatch") + work = Path(report.get("decoderWork", "")) + if (not work.is_absolute() or work.parent != base or not work.name.startswith("save-decode-") + or list(base.glob("save-decode-*")) != [work]): + raise ValueError("Ambiguous/unowned decoder evidence") + input_plain(work) + decoded = proof_json(work / "content-receipt.json") + if decoded != report.get("decoded") or decoded.get("canonicalProfile") != report.get("savedProfile"): + raise ValueError("Decoded profile receipt mismatch") + binary = source / "build/windows-shipping/bin/MinSizeRel/SparkTests.exe" + if (decoded.get("decoderExecutable", {}).get("sha256") != images[str(binary)] + or decoded.get("input", {}).get("sha256") != report.get("slotSha256")): + raise ValueError("Decoder/save identity mismatch") + stdout, stderr = input_text(work / "stdout.log"), input_text(work / "stderr.log") + parsed = decoder.parse_receipt(stdout, stderr, decoded["input"]) + decoder.framework(work / "framework.xml") + if parsed["canonicalProfile"] != decoded["canonicalProfile"]: + raise ValueError("Native decoded content mismatch") + junit = work / "framework.xml" + if decoded.get("frameworkJUnit") != {"sha256": digest(junit), "bytes": junit.stat().st_size}: + raise ValueError("Decoder JUnit binding mismatch") + members += [work / name for name in ("stdout.log", "stderr.log", "framework.xml", "content-receipt.json")] + return {str(path.relative_to(root).as_posix()): {"sha256": digest(path), "bytes": len(input_text(path).encode("utf-8"))} + for path in members} + + +def run_input_phase(root, identity, source, deadline, run): + if remaining(deadline, INPUT_RESERVE) < INPUT_RESERVE: + raise TimeoutError("Closure has no complete input owner/verification reserve") + abi = proof_json(root / "abi-binding.json") + if abi.get("passed") is not True or abi.get("source_sha") != identity["source_sha"]: + raise ValueError("Input requires successful same-source installed ABI phase") + input_source_identity(identity, source) + images = input_images(identity, root, source) + run("input-assets", [sys.executable, "-B", source / "tools/asset-integrity/verify_asset_integrity.py", + "verify", root / "sdk/prefix/bin/Assets/assets.integrity.json", "--root", root / "sdk/prefix/bin/Assets", + "--profile", "stable-v1", "--source-manifest", source / "Assets/assets.integrity.json", + "--require-provenance"], 30) + package = input_package(root, deadline) + if remaining(deadline, INPUT_SECONDS + 10) < INPUT_SECONDS + 10: + raise TimeoutError("Input identity verification consumed owner allowance") + run("input-dispatch", [sys.executable, source / INPUT_SOURCES[0], "--source", source, + "--source-sha", identity["source_sha"], "--host", root / "sdk/prefix/bin/SparkEngine.exe", + "--module", root / "sdk/prefix/bin/SparkGameFPS.dll", + "--decoder", source / "build/windows-shipping/bin/MinSizeRel/SparkTests.exe", + "--decoder-helper", source / INPUT_SOURCES[1], "--decoder-helper-sha256", + identity["input_sources"][INPUT_SOURCES[1]], "--out", root / "input"], INPUT_SECONDS) + members = input_proof(root, identity, source) + assets_log = root / "input-assets.log" + members["input-assets.log"] = {"bytes": len(input_text(assets_log).encode("utf-8")), "sha256": digest(assets_log)} + if input_package(root, deadline) != package: + raise ValueError("Installed closure changed during input verification") + remaining(deadline, 1) + binding = {key: identity[key] for key in ("source_sha", "workflow_sha", "run_id", "run_attempt", "helper_sha256")} + binding.update(passed=True, images=images, input_sources=identity["input_sources"], package=package, members=members) + save(root / "input-binding.json", binding) + + +def lineage_adapter(): + return input_module('_installed_lineage_adapter', Path(__file__).with_name('qualify_installed_lineage.py')) + + +def compact(root, weather_consumer=False, source_sha=None, deadline=None, input_dispatch=False, source=None, editor_lineage=False): + def check_budget(): + if deadline is not None: + remaining(deadline, 270) + check_budget() + identity = proof_json(root / "identity.json") if (root / "identity.json").exists() else {} + if identity and identity.get('editor_lineage', False) is not editor_lineage: + raise ValueError('Lineage mode changed at collection') + lineage_files = [] + if editor_lineage: + if source is None: + raise ValueError('Lineage collection requires product source') + if (root/'lineage/binding.json').exists(): + if (root/'lineage/failure.json').exists() or (root/'build-failure.json').exists(): + raise ValueError('Contradictory lineage success/failure') + lineage_files = lineage_adapter().proof(sys.modules[__name__], root, source, identity) + if identity.get('lineage_binding_sha256') != digest(root/'lineage/binding.json'): + raise ValueError('Lineage result not bound to build identity') + elif not (root/'build-failure.json').exists(): + raise ValueError('Missing complete installed lineage result') + enabled = identity.get("weather_consumer", False) + if type(enabled) is not bool or (identity and enabled is not weather_consumer) or (weather_consumer and not identity and not (root / "build-failure.json").exists()): + raise ValueError("Weather mode identity missing or inconsistent") + if identity and source_sha is not None and identity.get("source_sha") != source_sha: + raise ValueError("Collector source pin mismatch") + if enabled and "focused" in identity: + focused_proof(root, identity) + elif enabled and not (root / "build-failure.json").exists(): + raise ValueError("Weather build lacks focused native proof") + # Failed SDK attempts retain available diagnostics, never a success receipt. + if enabled and not (root / "sdk-binding.json").exists() and not any((root / name).exists() for name in ("build-failure.json", "sdk-failure.json")): + raise ValueError("Weather SDK phase has no success binding or failure record") + if enabled and (root / "sdk-binding.json").exists(): + binding = proof_json(root / "sdk-binding.json") + if binding.get("passed") is not True or (root / "sdk-failure.json").exists(): + raise ValueError("Contradictory weather phase result") + receipt = weather_proof(root, identity) + if binding.get("weather_identity_sha256") != digest(root / "sdk/weather-identity.json") or binding.get("source_sha") != identity.get("source_sha") or binding.get("host_sha256") != receipt["host_sha256"]: + raise ValueError("Weather phase binding mismatch") + input_members = {} + if identity and identity.get("input_dispatch", False) is not input_dispatch: + raise ValueError("Input mode changed at collection") + if input_dispatch: + preidentity_failure = not identity and (root / "build-failure.json").is_file() + if (not enabled and not preidentity_failure) or source is None: + raise ValueError("Input collection requires pinned weather source") + if (root / "input-binding.json").exists(): + binding = proof_json(root / "input-binding.json") + for key in ("source_sha", "workflow_sha", "run_id", "run_attempt", "helper_sha256"): + if binding.get(key) != identity.get(key): + raise ValueError("Stale input binding: " + key) + if binding.get("passed") is not True or any((root / name).exists() for name in + ("build-failure.json", "sdk-failure.json", "abi-failure.json", "closure-failure.json")): + raise ValueError("Contradictory input success/failure") + input_members = input_proof(root, identity, source) + assets_log = root / "input-assets.log" + input_members["input-assets.log"] = {"bytes": len(input_text(assets_log).encode("utf-8")), "sha256": digest(assets_log)} + if binding.get("members") != input_members or binding.get("images") != input_images(identity, root, source): + raise ValueError("Input proof changed since closure") + if binding.get("input_sources") != identity.get("input_sources"): + raise ValueError("Input source binding changed") + closure = proof_json(root / "closure-binding.json") + if closure.get("input_binding_sha256") != digest(root / "input-binding.json"): + raise ValueError("Closure lacks exact input result binding") + elif not any((root / name).exists() for name in + ("build-failure.json", "sdk-failure.json", "abi-failure.json", "closure-failure.json")): + raise ValueError("Input mode lacks required complete result") # Explicit evidence allowlist: never traverse a prefix, build tree or user data. files = list(root.glob("*.json")) + list(root.glob("*.log")) + files += lineage_files + if editor_lineage: + files += [p for p in (root/'lineage').glob('*.json') if p.name != 'binding.json'] + files += list((root/'lineage').glob('*.log')) + files += list((root/'lineage/diagnostics').rglob('*.log')) + files += list((root/'lineage/failure-proof').glob('*.xml')) + files += list((root / "focused").glob("*.json")) + list((root / "focused").glob("*.log")) + list((root / "focused").glob("*.xml")) files += list((root / "sdk").glob("runtime-*.log")) + files += list((root / "sdk").glob("weather-identity.json")) files += list((root / "abi").glob("*/report.json")) files += list((root / "abi").glob("*/*/*.log")) files += list((root / "closure").glob("*/*.json")) files += list((root / "closure").glob("*/*.log")) + if input_dispatch: + files += [root / name for name in input_members] + if not input_members: + # Partial failure retains only bounded named text; binary saves are excluded. + for relative in ("input/game.log", "input/receipt.json", "input/missing-slot/game.log", + "input/missing-slot/receipt.json"): + if (root / relative).is_file(): + files.append(root / relative) + for work in (root / "input").glob("save-decode-*"): + for name in ("stdout.log", "stderr.log", "framework.xml", "content-receipt.json"): + if (work / name).is_file(): + files.append(work / name) payloads = {} inventory = [] for path in sorted(set(files)): + check_budget() name = path.relative_to(root).as_posix() parts = path.relative_to(root).parts - runtime_proof = (name in ("sdk/runtime-stdout.log", "sdk/runtime-stderr.log") or + input_plain(path) + runtime_proof = (path in lineage_files or parts[:2] == ('lineage','failure-proof') or parts[0] in ("focused", "input") or name == "input-assets.log" or name in ("sdk/runtime-stdout.log", "sdk/runtime-stderr.log", + "sdk/runtime-weather-stdout.log", "sdk/runtime-weather-stderr.log") or (len(parts) == 4 and parts[0] == "abi" and parts[2] in ("newer", "previous") and parts[3] in ("stdout.log", "stderr.log"))) size = path.stat().st_size @@ -135,26 +671,35 @@ def compact(root): payloads[name] = data inventory.append({"path": name, "bytes": size, "sha256": digest(path), "tail_only": len(data) != size}) + check_budget() payloads["inventory.json"] = json.dumps(inventory, indent=2).encode() if sum(map(len, payloads.values())) > 900000: raise ValueError("Text evidence exceeds 900000-byte budget") archive = root / "diagnostics-size-check.zip" with zipfile.ZipFile(archive, "w", zipfile.ZIP_DEFLATED) as out: for name, data in payloads.items(): + check_budget() out.writestr(name, data) if archive.stat().st_size > 1000000: archive.unlink() raise ValueError("Diagnostics exceeds archive budget") + check_budget() frozen = root / "diagnostics-text" frozen.mkdir(exist_ok=False) for name, data in payloads.items(): + check_budget() target = frozen / name target.parent.mkdir(parents=True, exist_ok=True) target.write_bytes(data) + check_budget() -def run_phase(phase, source, root): - deadline = time.monotonic() + PHASE_SECONDS[phase] +def run_phase(phase, source, root, weather_consumer=False, source_sha=SOURCE, input_dispatch=False, editor_lineage=False): + if editor_lineage and not weather_consumer: + raise ValueError('Installed lineage requires weather qualification mode') + if input_dispatch and not weather_consumer: + raise ValueError("Input dispatch requires weather mode") + deadline = weather_deadline(root, phase) if weather_consumer else time.monotonic() + PHASE_SECONDS[phase] build = source / "build/windows-shipping" binary = build / "bin/MinSizeRel" installed = root / "sdk/prefix/bin/SparkEngine.exe" @@ -179,42 +724,98 @@ def cmake_script(name, extra): *extra, "-P", source / "Tests/PackageSmoke" / name] if phase == "build": - if git("rev-parse", "HEAD") != SOURCE or git("status", "--porcelain", "--untracked-files=no"): + if git("rev-parse", "HEAD") != source_sha or git("status", "--porcelain", "--untracked-files=no"): raise ValueError("Source checkout is not clean exact pinned source") submodules = git("submodule", "status", "--recursive") if any(line.startswith(("-", "+", "U")) for line in submodules.splitlines()): raise ValueError("Uninitialized or mismatched submodule") - identity = {"source_sha": SOURCE, "source_tree": git("rev-parse", "HEAD^{tree}"), + identity = {"source_sha": source_sha, "source_tree": git("rev-parse", "HEAD^{tree}"), "workflow_sha": os.environ["GITHUB_SHA"], "helper_sha256": digest(__file__), "submodules": submodules, "run_id": os.environ["GITHUB_RUN_ID"], "run_attempt": os.environ["GITHUB_RUN_ATTEMPT"], - "configuration": "MinSizeRel", "scope": "hosted diagnostic, not Windows 11 certification", + "configuration": "MinSizeRel", "weather_consumer": weather_consumer, "input_dispatch": input_dispatch, "editor_lineage": editor_lineage, "scope": "hosted diagnostic, not Windows 11 certification", "tools": {tool: shutil.which(tool) for tool in ("cl", "ninja", "cmake", "python")}} if not all(identity["tools"].values()): raise ValueError("Required preinstalled tool missing") + if input_dispatch: + input_source_identity(identity, source, capture=True, git=git) + if editor_lineage: + identity['lineage_adapter_sha256'] = digest(Path(__file__).with_name('qualify_installed_lineage.py')) + identity['lineage_validator_sha256'] = digest(Path(__file__).with_name('qualify-editor-fps.py')) save(identity_path, identity) for tool in ("cmake", "ninja", sys.executable): run("version-" + Path(tool).stem, [tool, "--version"], 15) - run("configure", ["cmake", "--preset", "windows-shipping", "-DBUILD_TESTS=ON"], 900) - run("build", ["cmake", "--build", build, "--config", "MinSizeRel", "--parallel", "1", "--target", *TARGETS], 10800) + configure = ["cmake", "--preset", "windows-shipping", "-DBUILD_TESTS=ON"] + if editor_lineage: + configure.append('-DPython3_EXECUTABLE='+sys.executable) + run("configure", configure, 900) + if editor_lineage: + run('lineage-prebuild', ['ctest','--test-dir',build,'-C','MinSizeRel','-R','^EditorFPSLineage_InstalledRuntime$','--show-only=json-v1'],30) + configured = proof_json(root/'lineage-prebuild.log') + lineage_adapter().validators().discovery(configured, True, source, build, source_sha) + save(root/'lineage-prebuild.json', configured) + targets = [*TARGETS, "SparkTests"] if weather_consumer else TARGETS + build_seconds = remaining(deadline, 10800) + if weather_consumer: + build_seconds -= FOCUSED_RESERVE + if editor_lineage: + build_seconds -= lineage_adapter().RESERVE + if build_seconds <= 0: + raise TimeoutError("No build allowance remains after focused native reserve") + run("build", ["cmake", "--build", build, "--config", "MinSizeRel", "--parallel", "1", "--target", *targets], build_seconds) + if weather_consumer: + weather_source_identity(identity, git) + identity["focused"] = focused_native(source, root, binary / "SparkTests.exe", identity, deadline) identity["images"] = {str(binary / name): digest(binary / name) for name in ("SparkEngine.exe", "SparkGameFPS.dll", "SparkGameFPS.dll.sparkabi", "SparkMismatchedModuleFixture.dll", "SparkMismatchedModuleFixture.dll.sparkabi", "SparkPreviousSdkModuleFixture.dll", "SparkPreviousSdkModuleFixture.dll.sparkabi")} + if weather_consumer: + identity["images"][str(binary / "SparkTests.exe")] = identity["focused"]["test_image_sha256"] + if editor_lineage: + for name in ('SparkCooker.exe', 'SparkCrashReporter.exe'): + identity['images'][str(binary/name)] = digest(binary/name) identity["host_sha256"] = digest(built) save(identity_path, identity) + if editor_lineage: + identity['lineage_binding_sha256'] = lineage_adapter().run(sys.modules[__name__],root,source,identity,deadline) + weather_source_identity(identity, git) + for path, recorded in identity['images'].items(): + if digest(path) != recorded: + raise ValueError('Build image changed during installed lineage') + save(identity_path, identity) return - identity = json.loads(identity_path.read_text()) + identity = proof_json(identity_path) + if identity.get('editor_lineage', False) is not editor_lineage: + raise ValueError('Lineage mode changed across phases') + if editor_lineage and identity.get('lineage_adapter_sha256') != digest(Path(__file__).with_name('qualify_installed_lineage.py')): + raise ValueError('Lineage adapter changed across phases') + if editor_lineage and identity.get('lineage_validator_sha256') != digest(Path(__file__).with_name('qualify-editor-fps.py')): + raise ValueError('Lineage validator changed across phases') + if identity.get("source_sha") != source_sha or identity.get("weather_consumer", False) is not weather_consumer: + raise ValueError("Weather mode changed across phases") + if weather_consumer: + weather_source_identity(identity, git) + if identity.get("input_dispatch", False) is not input_dispatch: + raise ValueError("Input mode changed across phases") + if input_dispatch: + input_source_identity(identity, source, git=git) expected = identity["host_sha256"] for path, recorded in identity["images"].items(): if digest(path) != recorded: raise ValueError("Build input changed since identity capture: " + path) same_host(expected, built) if phase == "sdk": + weather_args = [] + if weather_consumer: + weather_args = ["-DSPARK_SDK_WEATHER_CONSUMER=ON", f"-DSPARK_WEATHER_SOURCE_SHA={source_sha}", + f"-DSPARK_WEATHER_WORKFLOW_SHA={identity['workflow_sha']}", + f"-DSPARK_WEATHER_RUN_ID={identity['run_id']}", + f"-DSPARK_WEATHER_RUN_ATTEMPT={identity['run_attempt']}"] run("sdk", cmake_script("RunInstalledSDKTemplate.cmake", [f"-DSPARK_TEST_ROOT={root / 'sdk'}", "-DSPARK_CONSUMER_GENERATOR=Ninja Multi-Config", f"-DSPARK_CONSUMER_MAKE_PROGRAM={shutil.which('ninja')}", f"-DSPARK_CONSUMER_COMPILER={shutil.which('cl')}", - f"-DSPARK_REFERENCE_SIDECAR={binary / 'SparkGameFPS.dll.sparkabi'}"]), 1780) + f"-DSPARK_REFERENCE_SIDECAR={binary / 'SparkGameFPS.dll.sparkabi'}", *weather_args]), 1780) same_host(expected, built, installed) elif phase == "abi": same_host(expected, built, installed) @@ -229,7 +830,7 @@ def cmake_script(name, extra): run("abi", [sys.executable, source / "Tests/PackageSmoke/run_installed_module_abi_rejection.py", "--installed-root", root / "sdk/prefix", "--newer", binary / "SparkMismatchedModuleFixture.dll", "--previous", binary / "SparkPreviousSdkModuleFixture.dll", "--evidence-root", root / "abi", - "--source-sha", SOURCE, "--configuration", "MinSizeRel"], 250) + "--source-sha", source_sha, "--configuration", "MinSizeRel"], 250) same_host(expected, built, installed) reports = list((root / "abi").glob("*/report.json")) if len(reports) != 1: @@ -238,19 +839,32 @@ def cmake_script(name, extra): if report["passed"] is not True or report["inputs"].get(str(installed.resolve())) != expected: raise ValueError("ABI report does not bind passing run to expected host") elif phase == "closure": - run("closure", cmake_script("VerifyWindowsPackageClosure.cmake", [f"-DSPARK_TEST_ROOT={root / 'closure'}"]), 880) + closure_seconds = remaining(deadline, 880) + if input_dispatch: + closure_seconds -= INPUT_RESERVE + if closure_seconds <= 0: + raise TimeoutError("No closure allowance after input reserve") + run("closure", cmake_script("VerifyWindowsPackageClosure.cmake", [f"-DSPARK_TEST_ROOT={root / 'closure'}"]), closure_seconds) graphs = list((root / "closure").glob("*/*.import-graph.json")) if len(graphs) != 2: raise ValueError("Expected both closure graphs") for graph in graphs: bind_graph(graph, expected) same_host(expected, built, installed) + if input_dispatch: + run_input_phase(root, identity, source, deadline, run) else: raise ValueError("Unknown phase") for path, recorded in identity["images"].items(): if digest(path) != recorded: raise ValueError("Build input changed during qualification: " + path) - save(root / (phase + "-binding.json"), {"passed": True, "host_sha256": expected, "source_sha": SOURCE}) + binding = {"passed": True, "host_sha256": expected, "source_sha": source_sha} + if phase == "sdk" and weather_consumer: + weather_proof(root, identity) + binding["weather_identity_sha256"] = digest(root / "sdk/weather-identity.json") + if phase == "closure" and input_dispatch: + binding["input_binding_sha256"] = digest(root / "input-binding.json") + save(root / (phase + "-binding.json"), binding) def main(): @@ -258,7 +872,20 @@ def main(): parser.add_argument("phase", choices=("build", "sdk", "abi", "closure", "pack")) parser.add_argument("--source", type=Path, required=True) parser.add_argument("--root", type=Path, required=True) + parser.add_argument("--weather-consumer", action="store_true") + parser.add_argument("--input-dispatch", action="store_true") + parser.add_argument("--editor-lineage", action="store_true") + parser.add_argument("--source-sha") args = parser.parse_args() + if args.editor_lineage and (not args.weather_consumer or args.source_sha is None): + parser.error('--editor-lineage requires explicit source and weather mode') + if args.input_dispatch and (not args.weather_consumer or args.source_sha is None): + parser.error("Input dispatch requires weather mode and explicit --source-sha") + if args.weather_consumer and args.source_sha is None: + parser.error("Weather mode requires explicit --source-sha") + source_sha = SOURCE if args.source_sha is None else args.source_sha + if not re.fullmatch(r"[0-9a-f]{40}", source_sha): + parser.error("Expected exact lowercase 40-hex source SHA") root = args.root.resolve() source = args.source.resolve() runner_temp = Path(os.environ["RUNNER_TEMP"]).resolve(strict=True) @@ -269,9 +896,20 @@ def main(): root.mkdir(parents=True, exist_ok=True) try: if args.phase == "pack": - compact(root) + pack_deadline = weather_deadline(root, "pack") if args.weather_consumer else None + if args.weather_consumer and (root / "identity.json").exists(): + def pack_git(*git_args): + with tempfile.TemporaryFile() as output: + owned_run(["git", "-C", str(source), *git_args], cwd=source, stdout=output, + stderr=subprocess.STDOUT, timeout=remaining(pack_deadline, 30), check=True) + output.seek(0) + return output.read().decode("utf-8").strip() + weather_source_identity(proof_json(root / "identity.json"), pack_git) + if args.input_dispatch: + input_source_identity(proof_json(root / "identity.json"), source, git=pack_git) + compact(root, args.weather_consumer, source_sha, pack_deadline, args.input_dispatch, source, args.editor_lineage) else: - run_phase(args.phase, source, root) + run_phase(args.phase, source, root, args.weather_consumer, source_sha, args.input_dispatch, args.editor_lineage) except Exception as error: save(root / (args.phase + "-failure.json"), {"error": str(error), "phase": args.phase}) raise diff --git a/.github/scripts/qualify_installed_lineage.py b/.github/scripts/qualify_installed_lineage.py new file mode 100644 index 000000000..ec86b5d60 --- /dev/null +++ b/.github/scripts/qualify_installed_lineage.py @@ -0,0 +1,188 @@ +"""Same-build installed lineage, using the existing product validators unchanged.""" +import importlib.util +import math +from pathlib import Path +import shutil +import subprocess +import sys + +RESERVE = 970 +CAP = 131072 +CASES = ('positive', 'malformed', 'missing-asset', 'missing-module') +CASE_FILES = ('runtime.log', 'exit-code.txt', 'reopened.sparkscene', + 'CrateProject/Scenes/Default.sparkscene', 'CrateProject/Cooked/Scenes/Default.sparkscene', + 'CrateProject/CrateProject.sparkproject', 'CrateProject/Cooked/CrateProject.sparkproject', + 'CrateProject/Cooked/Assets/spark-cook-manifest.json', 'Package/Startup.sparkscene', + 'Package/Scenes/Startup.sparkscene', 'Package/spark.modules.json', 'Package/Assets/spark-cook-manifest.json') +INSTALLED_FILES = ('lineage-validation.json', 'lineage-junit.xml', 'lineage-output.log') +KEYS = ('source_sha', 'workflow_sha', 'run_id', 'run_attempt', 'helper_sha256', 'configuration') +SOURCES = ('Tests/TestEditorCookPackageReal.cpp', 'cmake/RunEditorFPSInstalledLineage.cmake', + 'cmake/ValidateEditorFPSLineageRuntime.cmake', 'cmake/RunSparkModuleProfileLifecycle.cmake', + 'Tests/PackageSmoke/ValidateEditorFPSLineage.py') + + +def load(path, name): + spec = importlib.util.spec_from_file_location(name, path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def validators(): + return load(Path(__file__).with_name('qualify-editor-fps.py'), '_same_build_editor_contract') + + +def names(source): + import re + text = (source/'Tests/TestEditorCookPackageReal.cpp').read_text() + result = re.findall(r'\bTEST\s*\(\s*(EditorFPSLineage_\w+)\s*\)', text) + if len(result) != 4 or len(set(result)) != 4: + raise ValueError('Lineage source membership changed') + return result + + +def members(root): + base = root/'lineage' + return [base/'discovery.json', base/'ctest.xml', + base/'commands.json', + *[base/'installed'/name for name in INSTALLED_FILES], + *[base/'installed/evidence'/case/name for case in CASES for name in CASE_FILES]] + + +def checked_text(H, path): + H.input_plain(path) + if not 0 < path.stat().st_size <= CAP: + raise ValueError('Missing, empty or oversized complete lineage proof: '+str(path)) + with path.open('rb') as stream: + data = stream.read(CAP+1) + if not 016384:text=text[-16384:].decode('utf-8',errors='ignore').encode('utf-8') + target.write_bytes(text) + diagnostics.append({'path':target.relative_to(root).as_posix(),'originalBytes':path.stat().st_size,'originalSha256':H.digest(path),'retainedBytes':target.stat().st_size,'retainedSha256':H.digest(target),'tail_only':path.stat().st_size!=target.stat().st_size or raw!=text,'diagnostic_reencoded':raw!=text}) + H.save(base/'diagnostics.json',diagnostics) + if (base/'failure.json').exists(): + for path,name in ((base/'ctest.xml','ctest.xml'),(staged/'lineage-junit.xml','framework.xml')): + if path.is_file(): + data=checked_text(H,path);target=base/'failure-proof'/name + target.parent.mkdir(exist_ok=True);target.write_bytes(data) diff --git a/.github/scripts/run-non-elevated-windows.py b/.github/scripts/run-non-elevated-windows.py index 9857494ae..09dd1aae1 100644 --- a/.github/scripts/run-non-elevated-windows.py +++ b/.github/scripts/run-non-elevated-windows.py @@ -190,6 +190,13 @@ def _reap_child(handle, terminate=None, wait=None): _require(wait(handle, 5000) == WAIT_OBJECT_0, "child did not terminate during cleanup") +def _windows_command_line(argv): + """Keep MSI's empty ALLUSERS value explicit instead of consuming the next token.""" + is_msi = str(argv[0]).replace("\\", "/").rsplit("/", 1)[-1].casefold() == "msiexec.exe" + return " ".join('ALLUSERS=""' if is_msi and str(value) == "ALLUSERS=" + else subprocess.list2cmdline([str(value)]) for value in argv) + + def run(argv, log, timeout, env=None, cwd=None): """Run argv with a verified same-user medium token and return its exit code.""" if os.name != "nt": @@ -210,7 +217,8 @@ def run(argv, log, timeout, env=None, cwd=None): # An already-safe caller still gets token validation and normal process # semantics; an elevated caller must use the restricted token path. if _token_is_medium_non_elevated(source): - completed = subprocess.run(argv, stdout=output, stderr=subprocess.STDOUT, timeout=timeout, env=env, cwd=cwd) + completed = subprocess.run(_windows_command_line(argv), stdout=output, stderr=subprocess.STDOUT, + timeout=timeout, env=env, cwd=cwd) return completed.returncode if not _token_is_elevated(source) and _token_integrity_rid(source) < MEDIUM_INTEGRITY_RID: raise PermissionError("current token is below medium integrity; refusing to raise it") @@ -233,7 +241,7 @@ def run(argv, log, timeout, env=None, cwd=None): input_handle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT), "SetHandleInformation(stdin) failed") startup.hStdInput = input_handle - command = ctypes.create_unicode_buffer(subprocess.list2cmdline([str(value) for value in argv])) + command = ctypes.create_unicode_buffer(_windows_command_line(argv)) environment = os.environ if env is None else env environment_block = ctypes.create_unicode_buffer( "\0".join(f"{key}={value}" for key, value in sorted(environment.items(), key=lambda item: item[0].upper())) diff --git a/.github/scripts/test-run-non-elevated-windows.py b/.github/scripts/test-run-non-elevated-windows.py index 77d769c7b..47fef0524 100644 --- a/.github/scripts/test-run-non-elevated-windows.py +++ b/.github/scripts/test-run-non-elevated-windows.py @@ -53,7 +53,20 @@ def test_all_child_failure_paths_reap(self) -> None: def test_safe_caller_uses_normal_subprocess_without_msvcrt_import_at_module_load(self) -> None: source = MODULE_PATH.read_text(encoding="utf-8") self.assertNotIn("import msvcrt\n", source.split("def run", 1)[0]) - self.assertIn("subprocess.run(argv", source) + self.assertIn("subprocess.run(_windows_command_line(argv)", source) + + def test_msi_empty_scope_property_cannot_consume_the_next_property(self) -> None: + command = MODULE._windows_command_line([ + r"C:\Windows\System32\msiexec.exe", "/i", r"D:\owned package\engine.msi", + "ALLUSERS=", "MSIINSTALLPERUSER=1", "INSTALL_ROOT=D:\\owned root", + ]) + self.assertIn('ALLUSERS="" MSIINSTALLPERUSER=1', command) + self.assertIn('"D:\\owned package\\engine.msi"', command) + self.assertIn('"INSTALL_ROOT=D:\\owned root"', command) + + def test_non_msi_arguments_keep_standard_windows_encoding(self) -> None: + argv = ["probe.exe", "ALLUSERS=", "argument with spaces", 'quoted "value"'] + self.assertEqual(MODULE._windows_command_line(argv), subprocess.list2cmdline(argv)) def test_mandatory_label_size_matches_documented_formula(self) -> None: sid_length = 28 diff --git a/.github/scripts/test-workflow-failure-propagation.py b/.github/scripts/test-workflow-failure-propagation.py index cbd2d4600..0ee7094b1 100644 --- a/.github/scripts/test-workflow-failure-propagation.py +++ b/.github/scripts/test-workflow-failure-propagation.py @@ -589,6 +589,42 @@ def normalized_run_lines(run: object) -> list[str] | None: return [" ".join(line.split()) for line in run.replace("\\\n", " ").splitlines() if line.strip()] +def asan_configure_errors(document: dict) -> list[str]: + """Keep Debug optimization explicit without losing sanitizer instrumentation.""" + + steps = document.get("jobs", {}).get("build-linux-asan", {}).get("steps", []) + configure = [step for step in steps if step.get("name") == "Configure CMake (ASan + UBSan + LSan)"] + if len(configure) != 1: + return ["ASan must have exactly one configure step"] + commands = normalized_run_lines(configure[0].get("run")) or [] + cmake = [command for command in commands if command.startswith("cmake ")] + if len(cmake) != 1: + return ["ASan must have exactly one CMake configure command"] + try: + argv = shlex.split(cmake[0]) + except ValueError as error: + return [f"ASan configure arguments are invalid: {error}"] + definitions: dict[str, list[str]] = {} + for argument in argv: + match = re.fullmatch(r"-D([^:=]+)(?::[^=]+)?=(.*)", argument) + if match: + definitions.setdefault(match[1], []).append(match[2]) + instrumentation = "-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer" + expected = { + "CMAKE_BUILD_TYPE": "Debug", + "BUILD_TESTS": "ON", + "SPARK_LIFECYCLE_TEST_HOOKS": "ON", + "CMAKE_CXX_FLAGS_DEBUG": "-g -Og", + "CMAKE_C_FLAGS_DEBUG": "-g -Og", + "CMAKE_CXX_FLAGS": instrumentation, + "CMAKE_C_FLAGS": instrumentation, + "CMAKE_EXE_LINKER_FLAGS": "-fsanitize=address,undefined -no-pie", + "CMAKE_SHARED_LINKER_FLAGS": "-fsanitize=address,undefined", + } + return [f"ASan configure must define {name}={value!r} exactly once" + for name, value in expected.items() if definitions.get(name) != [value]] + + PROFILE_GATES_JOB = "profile-required-gates" PROFILE_GATES_CHECKOUT_STEP = "Checkout exact candidate source" PROFILE_GATES_REQUIRED_CI_STEP = "Verify candidate commit passed Required CI Gate" @@ -1242,13 +1278,21 @@ def sde_cpu_floor_contract_errors(workflow: str) -> list[str]: url = f"https://downloadmirror.intel.com/924984/sde-external-10.13.1-2026-07-28-{platform}.tar.xz" if url not in install_script or sha256 not in install_script: errors.append(f"{job_name} SDE URL or archive hash changed") - extraction = "tar.exe" if platform == "win" else "tar -xf" + extraction = "python .github/scripts/extract_sde_archive.py" if platform == "win" else "tar -xf" if ( hash_command not in install_script or extraction not in install_script or install_script.index(hash_command) > install_script.index(extraction) ): errors.append(f"{job_name} does not verify SDE before extraction") + if platform == "win": + extraction_index = install_script.find(extraction) + if ( + extraction_index < 0 + or "if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }" not in install_script[extraction_index:] + or "Get-ChildItem -LiteralPath $unpacked" not in install_script[extraction_index:] + ): + errors.append(f"{job_name} does not propagate streaming SDE extraction failure") if "-DSPARK_SDE_EXECUTABLE=" not in configure_script: errors.append(f"{job_name} does not register the SDE CTest") if ( @@ -1893,6 +1937,7 @@ def experimental_mingw_lane_errors(document: dict) -> list[str]: REPRODUCIBILITY_JOB = "reproducibility-windows" REPRODUCIBILITY_TOOL = "tools/compare_build_outputs.py" +REPRODUCIBILITY_DIAGNOSTICS = ".github/scripts/compare_windows_shipping_repro.py" def reproducibility_windows_errors(document: dict) -> list[str]: @@ -1935,25 +1980,56 @@ def reproducibility_windows_errors(document: dict) -> list[str]: errors.append(f"{REPRODUCIBILITY_JOB} checkouts must include submodules recursively") stages: list[str] = [] - for tree in paths: - builds = [step for step in steps if step.get("working-directory") == tree] + for tree, label in zip(paths, ("first", "second")): + builds = [step for step in steps if step.get("name") == f"Build and stage Shipping in the {label} tree"] if len(builds) != 1: errors.append(f"{REPRODUCIBILITY_JOB} must build the {tree!r} tree in exactly one step") continue + if "working-directory" in builds[0]: + errors.append(f"{REPRODUCIBILITY_JOB} {tree!r} build must start at the workspace root") run = str(builds[0].get("run", "")) required = ( "set -euo pipefail", + "physical_parent=$PWD", + f'source_tree="$physical_parent/{tree}"', + 'canonical_tree="$physical_parent/reproducibility-source"', + 'test ! -e "$canonical_tree"', + 'mv "$source_tree" "$canonical_tree"', + 'restore_tree() { cd "$physical_parent" && mv "$canonical_tree" "$source_tree"; }', + "trap restore_tree EXIT", + 'cd "$canonical_tree"', "cmake --preset windows-shipping", "cmake --build --preset windows-shipping --config MinSizeRel", + "\nrestore_tree\n", + "trap - EXIT", ) for fragment in required: if run.count(fragment) != 1: errors.append(f"{REPRODUCIBILITY_JOB} {tree!r} build is missing {fragment!r}") - install = re.search(r"(?m)^cmake --install build/windows-shipping --config MinSizeRel --prefix (\S+)$", run) + if all(fragment in run for fragment in ( + 'mv "$source_tree" "$canonical_tree"', "trap restore_tree EXIT", + 'cd "$canonical_tree"', "cmake --preset windows-shipping", "\nrestore_tree\n", "trap - EXIT", + )) and not ( + run.index('mv "$source_tree" "$canonical_tree"') + < run.index("trap restore_tree EXIT") + < run.index('cd "$canonical_tree"') + < run.index("cmake --preset windows-shipping") + < run.index("\nrestore_tree\n") + < run.index("trap - EXIT") + ): + errors.append(f"{REPRODUCIBILITY_JOB} {tree!r} build does not restore the canonical path in order") + install = re.search( + r'(?m)^cmake --install build/windows-shipping --config MinSizeRel --prefix ' + r'(?:(?:"\$physical_parent/([^"\r\n]+)")|(\S+))$', + run, + ) if install is None: errors.append(f"{REPRODUCIBILITY_JOB} {tree!r} build does not install the Shipping tree") else: - stages.append(os.path.normpath(os.path.join(tree, install.group(1))).replace("\\", "/")) + if install.group(1) is not None: + stages.append(install.group(1)) + else: + stages.append(os.path.normpath(os.path.join(tree, install.group(2))).replace("\\", "/")) if len(stages) == 2 and len(set(stages)) != 2: errors.append(f"{REPRODUCIBILITY_JOB} stages both trees to the same prefix") @@ -1967,10 +2043,10 @@ def reproducibility_windows_errors(document: dict) -> list[str]: manifests = re.findall(rf"{re.escape(REPRODUCIBILITY_TOOL)} manifest (\S+) --output (\S+)", run) if len(stages) == 2 and sorted(root for root, _ in manifests) != sorted(stages): errors.append(f"{REPRODUCIBILITY_JOB} does not write a manifest of each staged tree") - compare = re.search( - rf"{re.escape(REPRODUCIBILITY_TOOL)} compare\s*\\?\s*(\S+) (\S+)", run - ) - if compare is None or sorted(compare.groups()) != sorted(output for _, output in manifests): + compare = re.search(rf"(?m)^python \S*{re.escape(REPRODUCIBILITY_DIAGNOSTICS)}\s", run) + comparison_manifests = re.findall(r"--(first|second)-manifest (\S+)", run) + if (compare is None or sorted(side for side, _ in comparison_manifests) != ["first", "second"] + or sorted(path for _, path in comparison_manifests) != sorted(output for _, output in manifests)): errors.append(f"{REPRODUCIBILITY_JOB} does not compare the two manifests") if re.search(r"\|\|\s*(true|:)\b|\bset \+e\b", run): errors.append(f"{REPRODUCIBILITY_JOB} compare step suppresses a failure") @@ -2484,6 +2560,13 @@ def test_both_required_sde_process_gates_propagate_failures(self) -> None: "hash drift": job.replace(install_step, install_step.replace(archive_hash, "0" * 64), 1), "disabled test": job.replace(test_step, test_step.replace("matrix.config == 'Release'", "false"), 1), } + if job_name == "build-windows-vs2022": + for label, original, changed in ( + ("extractor failure ignored", "if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }", ""), + ("nonstreaming extractor", "python .github/scripts/extract_sde_archive.py", "tar.exe"), + ("ambiguous executable search", "Get-ChildItem -LiteralPath $unpacked", "Get-ChildItem -LiteralPath $dest"), + ): + mutations[label] = job.replace(install_step, install_step.replace(original, changed, 1), 1) for label, changed_job in mutations.items(): with self.subTest(job=job_name, mutation=label): self.assertNotEqual(changed_job, job) @@ -3927,6 +4010,31 @@ def change(jobs: dict) -> None: edit_run("Build and stage Shipping in the first tree", "set -euo pipefail", "set -uo pipefail"), "'set -euo pipefail'", ), + ( + edit_run("Build and stage Shipping in the first tree", 'mv "$source_tree" "$canonical_tree"', + 'cp -r "$source_tree" "$canonical_tree"'), + "'mv \"$source_tree\"", + ), + ( + edit_run("Build and stage Shipping in the second tree", 'cd "$canonical_tree"', + 'cd "$source_tree"'), + "'cd \"$canonical_tree\"'", + ), + ( + edit_run("Build and stage Shipping in the first tree", "trap restore_tree EXIT", "true"), + "'trap restore_tree EXIT'", + ), + ( + edit_run("Build and stage Shipping in the first tree", + 'restore_tree() { cd "$physical_parent" && mv "$canonical_tree" "$source_tree"; }', + 'restore_tree() { true; }'), + "'restore_tree()", + ), + ( + edit_run("Build and stage Shipping in the second tree", + '\nrestore_tree\n', '\ntrue\n'), + "'\\nrestore_tree\\n'", + ), ( edit_run("Build and stage Shipping in the second tree", "reproducibility-stage-b", "reproducibility-stage-a"), @@ -3947,8 +4055,17 @@ def change(jobs: dict) -> None: "manifest of each staged tree", ), ( - edit_run("Compare the two Shipping builds", "reproducibility/manifest-a.json reproducibility/manifest-b", - "reproducibility/manifest-a.json reproducibility/manifest-a"), + edit_run("Compare the two Shipping builds", "--second-manifest reproducibility/manifest-b.json", + "--second-manifest reproducibility/manifest-a.json"), + "does not compare the two manifests", + ), + ( + edit_run("Compare the two Shipping builds", REPRODUCIBILITY_DIAGNOSTICS, + ".github/scripts/unrelated.py"), + "does not compare the two manifests", + ), + ( + edit_run("Compare the two Shipping builds", "--second-manifest", "--first-manifest"), "does not compare the two manifests", ), ( @@ -4335,6 +4452,34 @@ def test_required_sanitizers_use_warning_errors_and_exact_provenance(self) -> No self.assertIn('--run-attempt "${{ github.run_attempt }}"', block) self.assertIn('--job "${{ github.job }}"', block) + def test_asan_debug_optimization_preserves_instrumentation(self) -> None: + document = parse_workflow_yaml(self.build) + self.assertEqual(asan_configure_errors(document), []) + for step in document["jobs"]["build-linux-asan"]["steps"]: + if step.get("name") == "Configure CMake (ASan + UBSan + LSan)": + step["run"] = step["run"].replace("-DCMAKE_CXX_FLAGS_DEBUG=", "-DCMAKE_CXX_FLAGS_DEBUG:STRING=") + self.assertEqual(asan_configure_errors(document), []) + + def test_asan_configure_rejects_missing_or_overridden_checks(self) -> None: + mutations = ( + ('-DCMAKE_CXX_FLAGS_DEBUG="-g -Og"', ''), + ('-DCMAKE_C_FLAGS_DEBUG="-g -Og"', '-DCMAKE_C_FLAGS_DEBUG="-g -Og -DNDEBUG"'), + ('-DCMAKE_BUILD_TYPE=Debug', '-DCMAKE_BUILD_TYPE=Release'), + ('-DSPARK_LIFECYCLE_TEST_HOOKS=ON', '-DSPARK_LIFECYCLE_TEST_HOOKS=OFF'), + ('-fno-sanitize-recover=undefined', ''), + ('-fno-omit-frame-pointer', ''), + ('-DCMAKE_CXX_FLAGS_DEBUG="-g -Og"', + '-DCMAKE_CXX_FLAGS_DEBUG="-g -Og" -DCMAKE_CXX_FLAGS_DEBUG="-g"'), + ) + for old, new in mutations: + with self.subTest(mutation=old): + document = parse_workflow_yaml(self.build) + for step in document["jobs"]["build-linux-asan"]["steps"]: + if step.get("name") == "Configure CMake (ASan + UBSan + LSan)": + self.assertIn(old, step["run"]) + step["run"] = step["run"].replace(old, new) + self.assertTrue(asan_configure_errors(document)) + def test_exact_commit_aggregation_requires_asan_and_tsan(self) -> None: aggregate = self.build[self.build.index("aggregate-test-stats:") :] aggregate = aggregate[: aggregate.index("report-ci-errors:")] diff --git a/.github/scripts/test_qualify_editor_fps.py b/.github/scripts/test_qualify_editor_fps.py index 37f774d4c..034a27fdf 100644 --- a/.github/scripts/test_qualify_editor_fps.py +++ b/.github/scripts/test_qualify_editor_fps.py @@ -250,6 +250,18 @@ def test_discovery_rejects_wrong_config_or_policy(self): class ConfigureOptionGuardContracts(unittest.TestCase): + @staticmethod + def pinned_discovery(source): + build = source/'build/windows-shipping' + row = selected() + row['tests'][0]['command'] = [Q.shutil.which('cmake'), + '-DSPARK_ENGINE_BUILD_DIR='+build.as_posix(), '-DSPARK_SOURCE_ROOT='+source.as_posix(), + '-DSPARK_CONFIG=MinSizeRel', '-DSPARK_TESTS_EXECUTABLE='+(build/'bin/MinSizeRel/SparkTests.exe').as_posix(), + '-DSPARK_ENGINE_EXECUTABLE_NAME=SparkEngine.exe', '-DSPARK_EXPECTED_SOURCE_SHA='+PINS['source_sha'], + '-DSPARK_PYTHON_EXECUTABLE='+Q.sys.executable.replace('\\', '/'), + '-P', (source/'cmake/RunEditorFPSInstalledLineage.cmake').as_posix()] + return row, build + def test_real_guard_accepts_helper_options_and_rejects_old_sha_cache_option(self): guard = Path(__file__).resolve().parents[2]/'cmake/SparkOptionGuard.cmake' self.assertTrue(guard.is_file(), 'Missing real product option guard') @@ -285,18 +297,59 @@ def configure(extra, name): def test_source_sha_still_required_in_exact_ctest_command(self): with tempfile.TemporaryDirectory(prefix='editor-fps-source-pin-') as temporary: source = Path(temporary)/'source' - build = source/'build/windows-shipping' - row = selected() - row['tests'][0]['command'] = [Q.shutil.which('cmake'), - '-DSPARK_ENGINE_BUILD_DIR='+build.as_posix(), '-DSPARK_SOURCE_ROOT='+source.as_posix(), - '-DSPARK_CONFIG=MinSizeRel', '-DSPARK_TESTS_EXECUTABLE='+(build/'bin/MinSizeRel/SparkTests.exe').as_posix(), - '-DSPARK_ENGINE_EXECUTABLE_NAME=SparkEngine.exe', '-DSPARK_EXPECTED_SOURCE_SHA='+PINS['source_sha'], - '-DSPARK_PYTHON_EXECUTABLE='+Q.sys.executable.replace('\\', '/'), - '-P', (source/'cmake/RunEditorFPSInstalledLineage.cmake').as_posix()] + row, build = self.pinned_discovery(source) Q.discovery(row, True, source, build, PINS['source_sha']) row['tests'][0]['command'][6] = '-DSPARK_EXPECTED_SOURCE_SHA='+'c'*40 with self.assertRaisesRegex(ValueError, 'exact command binding'): Q.discovery(row, True, source, build, PINS['source_sha']) + def test_windows_case_aliases_require_same_physical_tools(self): + source = Path('C:/owned/source') + with patch.object(Q.sys, 'platform', 'win32'), \ + patch.object(Q.shutil, 'which', return_value='C:/Tools/cmake.EXE'), \ + patch.object(Q.sys, 'executable', 'C:/Tools/python.EXE'): + row, build = self.pinned_discovery(source) + row['tests'][0]['command'][0] = 'C:/Tools/cmake.exe' + row['tests'][0]['command'][7] = '-DSPARK_PYTHON_EXECUTABLE=C:/Tools/python.exe' + with patch.object(Q.os.path, 'samefile', return_value=True) as same: + Q.discovery(row, True, source, build, PINS['source_sha']) + self.assertEqual(same.call_count, 2) + for result in (False, OSError('missing tool')): + with self.subTest(result=result), \ + patch.object(Q.os.path, 'samefile', side_effect=result if isinstance(result, OSError) else None, + return_value=result), \ + self.assertRaisesRegex(ValueError, 'exact command binding'): + Q.discovery(row, True, source, build, PINS['source_sha']) + + def test_windows_case_aliases_do_not_relax_command_fields(self): + source = Path('C:/owned/source') + with patch.object(Q.sys, 'platform', 'win32'), \ + patch.object(Q.shutil, 'which', return_value='C:/Tools/cmake.EXE'), \ + patch.object(Q.sys, 'executable', 'C:/Tools/python.EXE'), \ + patch.object(Q.os.path, 'samefile', return_value=True): + original, build = self.pinned_discovery(source) + for index, value in ((0, 'C:/Other/cmake.exe'), (3, '-DSPARK_CONFIG=Release'), + (6, '-DSPARK_EXPECTED_SOURCE_SHA='+'c'*40), + (7, '-Dspark_python_executable=C:/Tools/python.exe'), + (9, 'C:/Other/RunEditorFPSInstalledLineage.cmake')): + row = json.loads(json.dumps(original)) + row['tests'][0]['command'][index] = value + with self.subTest(index=index), self.assertRaisesRegex(ValueError, 'exact command binding'): + Q.discovery(row, True, source, build, PINS['source_sha']) + original['tests'][0]['command'].append('-DUNEXPECTED=1') + with self.assertRaisesRegex(ValueError, 'exact command binding'): + Q.discovery(original, True, source, build, PINS['source_sha']) + + def test_unix_command_binding_remains_case_sensitive(self): + source = Path('/owned/source') + with patch.object(Q.sys, 'platform', 'linux'), \ + patch.object(Q.shutil, 'which', return_value='/tools/cmake'), \ + patch.object(Q.os.path, 'samefile', return_value=True) as same: + row, build = self.pinned_discovery(source) + row['tests'][0]['command'][0] = '/tools/CMAKE' + with self.assertRaisesRegex(ValueError, 'exact command binding'): + Q.discovery(row, True, source, build, PINS['source_sha']) + same.assert_not_called() + if __name__ == '__main__': unittest.main() diff --git a/.github/scripts/test_qualify_input_dispatch.py b/.github/scripts/test_qualify_input_dispatch.py new file mode 100644 index 000000000..42946cabf --- /dev/null +++ b/.github/scripts/test_qualify_input_dispatch.py @@ -0,0 +1,205 @@ +from pathlib import Path +import importlib.util, tempfile, unittest, json, hashlib +from unittest import mock +HERE=Path(__file__).resolve().parent +spec=importlib.util.spec_from_file_location('input_qualification',HERE/'qualify-installed-native.py') +m=importlib.util.module_from_spec(spec);spec.loader.exec_module(m) + +class InputQualificationTests(unittest.TestCase): + def setUp(self): + self.tmp=tempfile.TemporaryDirectory(prefix='input-qualification-') + self.addCleanup(self.tmp.cleanup) + self.root=Path(self.tmp.name);self.source=self.root/'source';self.evidence=self.root/'evidence' + self.source.mkdir();self.evidence.mkdir() + self.identity={'source_sha':'a'*40,'workflow_sha':'b'*40,'run_id':'1','run_attempt':'1','helper_sha256':'c'*64} + def write(self,path,data=b'x'): + path.parent.mkdir(parents=True,exist_ok=True);path.write_bytes(data);return path + def sources(self): + for name in m.INPUT_SOURCES:self.write(self.source/name) + m.input_source_identity(self.identity,self.source,capture=True) + def test_source_changes_are_rejected(self): + self.sources();m.input_source_identity(self.identity,self.source) + self.write(self.source/m.INPUT_SOURCES[1],b'changed') + with self.assertRaisesRegex(ValueError,'identity changed'):m.input_source_identity(self.identity,self.source) + def test_untracked_input_source_rejected(self): + self.sources() + with self.assertRaisesRegex(ValueError,'not tracked'): + m.input_source_identity(self.identity,self.source,git=lambda *args:'\n'.join(m.INPUT_SOURCES[:-1])) + def test_missing_source_rejected(self): + self.sources();(self.source/m.INPUT_SOURCES[0]).unlink() + with self.assertRaises(FileNotFoundError):m.input_source_identity(self.identity,self.source) + def test_complete_text_cap_and_binary_rejected(self): + p=self.write(self.root/'proof.log',b'a'*131072);self.assertEqual(len(m.input_text(p)),131072) + for raw in (b'a'*131073,b'a\0b',b'\xff'): + p.write_bytes(raw) + with self.assertRaises((ValueError,UnicodeError)):m.input_text(p) + def test_installed_images_bound_to_built_images(self): + binary=self.source/'build/windows-shipping/bin/MinSizeRel';installed=self.evidence/'sdk/prefix/bin' + self.identity['images']={} + for name in ('SparkEngine.exe','SparkGameFPS.dll','SparkGameFPS.dll.sparkabi','SparkTests.exe'): + p=self.write(binary/name,name.encode());self.identity['images'][str(p)]=m.digest(p) + if name!='SparkTests.exe':self.write(installed/name,name.encode()) + self.assertEqual(len(m.input_images(self.identity,self.evidence,self.source)),4) + self.write(installed/'SparkGameFPS.dll',b'substitution') + with self.assertRaisesRegex(ValueError,'differs'):m.input_images(self.identity,self.evidence,self.source) + def test_package_requires_real_fps_assets_and_detects_mutation(self): + prefix=self.evidence/'sdk/prefix' + for name in ('bin/SparkEngine.exe','bin/SparkGameFPS.dll','bin/SparkGameFPS.dll.sparkabi','bin/Assets/Models/pistol.obj','bin/Assets/Models/rifle.obj'): + self.write(prefix/name) + self.write(prefix/'bin/Assets/assets.integrity.json',b'{"entries":[]}') + with mock.patch.object(m,'remaining',return_value=1): + before=m.input_package(self.evidence,1) + self.write(prefix/'bin/Assets/Models/rifle.obj',b'changed') + self.assertNotEqual(before,m.input_package(self.evidence,1)) + (prefix/'bin/Assets/Models/pistol.obj').unlink() + with self.assertRaisesRegex(ValueError,'content'):m.input_package(self.evidence,1) + def test_input_requires_weather_mode(self): + with self.assertRaisesRegex(ValueError,'weather'):m.run_phase('closure',self.source,self.evidence,input_dispatch=True) + def test_no_input_launch_without_full_reserve(self): + run=mock.Mock() + with mock.patch.object(m,'remaining',return_value=119): + with self.assertRaises(TimeoutError):m.run_input_phase(self.evidence,self.identity,self.source,1,run) + run.assert_not_called() + def test_no_input_launch_without_successful_same_source_abi(self): + run=mock.Mock();self.write(self.evidence/'abi-binding.json',json.dumps({'passed':True,'source_sha':'wrong'}).encode()) + with mock.patch.object(m,'remaining',return_value=150): + with self.assertRaisesRegex(ValueError,'ABI'):m.run_input_phase(self.evidence,self.identity,self.source,1,run) + run.assert_not_called() + def test_exact_owned_caller_and_binding(self): + self.sources();self.write(self.evidence/'abi-binding.json',json.dumps({'passed':True,'source_sha':'a'*40}).encode()) + self.write(self.evidence/'input-assets.log',b'verified assets\n') + run=mock.Mock();members={'input/game.log':{'bytes':3,'sha256':'d'*64}} + with mock.patch.object(m,'remaining',return_value=150), mock.patch.object(m,'input_images',return_value={'host':'sha'}), mock.patch.object(m,'input_package',return_value={'files':5,'sha256':'e'*64}), mock.patch.object(m,'input_proof',return_value=members): + m.run_input_phase(self.evidence,self.identity,self.source,1,run) + label,argv,timeout=run.call_args.args + self.assertEqual((label,timeout),('input-dispatch',90)) + self.assertEqual(argv[argv.index('--decoder-helper-sha256')+1],self.identity['input_sources'][m.INPUT_SOURCES[1]]) + self.assertEqual(argv[argv.index('--decoder')+1],self.source/'build/windows-shipping/bin/MinSizeRel/SparkTests.exe') + binding=m.proof_json(self.evidence/'input-binding.json') + self.assertEqual(binding['members']['input/game.log'],members['input/game.log']);self.assertEqual(binding['run_attempt'],'1') + def test_native_failure_cannot_publish_binding(self): + self.sources();self.write(self.evidence/'abi-binding.json',json.dumps({'passed':True,'source_sha':'a'*40}).encode()) + self.write(self.evidence/'input-assets.log',b'verified assets\n') + with mock.patch.object(m,'remaining',return_value=150),mock.patch.object(m,'input_images',return_value={}),mock.patch.object(m,'input_package',return_value={}),mock.patch.object(m,'input_proof') as proof: + with self.assertRaises(RuntimeError):m.run_input_phase(self.evidence,self.identity,self.source,1,mock.Mock(side_effect=RuntimeError('owned child failed'))) + proof.assert_not_called() + self.assertFalse((self.evidence/'input-binding.json').exists()) + def test_package_mutation_cannot_publish_binding(self): + self.sources();self.write(self.evidence/'abi-binding.json',json.dumps({'passed':True,'source_sha':'a'*40}).encode()) + self.write(self.evidence/'input-assets.log',b'verified assets\n') + with mock.patch.object(m,'remaining',return_value=150),mock.patch.object(m,'input_images',return_value={}),mock.patch.object(m,'input_package',side_effect=[{'sha':'old'},{'sha':'new'}]),mock.patch.object(m,'input_proof',return_value={}): + with self.assertRaisesRegex(ValueError,'closure changed'):m.run_input_phase(self.evidence,self.identity,self.source,1,mock.Mock()) + self.assertFalse((self.evidence/'input-binding.json').exists()) + + def proof_fixture(self): + self.sources() + for name in m.INPUT_SOURCES[:2]: + self.write(self.source/name,(HERE.parents[1]/name).read_bytes()) + m.input_source_identity(self.identity,self.source,capture=True) + binary=self.source/'build/windows-shipping/bin/MinSizeRel';installed=self.evidence/'sdk/prefix/bin' + self.identity['images']={} + for name in ('SparkEngine.exe','SparkGameFPS.dll','SparkGameFPS.dll.sparkabi','SparkTests.exe'): + path=self.write(binary/name,name.encode());self.identity['images'][str(path)]=m.digest(path) + if name!='SparkTests.exe':self.write(installed/name,name.encode()) + driver=m.input_module('_test_real_driver',self.source/m.INPUT_SOURCES[0]) + decoder=m.input_module('_test_real_decoder',self.source/m.INPUT_SOURCES[1]) + profile={'fps.profile.class':'0','fps.profile.health':'100.000000','fps.profile.playTime':'0.000000'} + encoded=''.join(k+'='+v+'\n' for k,v in sorted(profile.items())).encode().hex() + base=self.evidence/'input';negative=base/'missing-slot' + def trace(directory,missing=False): + replay=driver.Replay(directory/'local/SparkEngine/Saves',missing_only=missing);rows=[] + masks=[0,2,0] if missing else [0,4,0,1,1,1,0,8,0,2,2,2,0,2,2,2,0] + previous=serial=0;live=dict(profile) + for index,mask in enumerate(masks,1): + pressed=mask & ~previous;released=previous & ~mask + action=(1 if pressed==1 else 2 if pressed==2 else 0) + encode=lambda p:''.join(k+'='+v+'\n' for k,v in sorted(p.items())).encode().hex() + fields=dict(v=1,phase='before',input=index,update=index,mask=mask,pressed=pressed,released=released,paused=0,action=0,result=-1,reason=0,operation=serial,faults=0,profile=encode(live),transfer='-',saves=str(directory/'local/SparkEngine/Saves').encode().hex()) + phases=['before']+(['operation'] if action else [])+['dispatch','complete'] + for phase in phases: + fields['phase']=phase + if phase=='operation': + serial+=1 + if not missing:live=dict(profile) + fields.update(action=action,result=0 if missing else 1,reason=int(missing),operation=serial,transfer='-' if missing else encoded,profile=encode(live)) + if phase=='dispatch': + if pressed==4:live['fps.profile.class']=driver.SCOUT + if pressed==8:live['fps.profile.class']=driver.VANGUARD + fields['profile']=encode(live) + row='SPARK_FPS_INPUT '+' '.join(k+'='+str(fields[k]) for k in driver.TRACE_FIELDS)+'\n' + replay.feed(row);rows.append(row) + previous=mask + rows.append(f'SPARK_FPS_INPUT_END v=1 records={replay.records} bytes={replay.byte_count} failed=0\n') + rows.append('FPS scene identity: authored scene "FPS Arena" (2 nodes) from '+str(self.evidence/'sdk/prefix/bin/Assets/Scenes/level1.scene')+'\n') + rows.append('SPARK_D3D11_DEVICE driver=warp certification=software-only\n') + rows.append('SPARK_MODULE_LIFECYCLE module=SparkGameFPS create=1 load=1 update=1 fixed=1 render=1 unload=1 destroy=1 faults=0\n') + self.write(directory/'game.log',''.join(rows).encode());return replay + trace(base);neg=trace(negative,True) + neg_report={'passed':True,'case':'missing-slot','operation':neg.operations[0]} + self.write(negative/'receipt.json',json.dumps(neg_report).encode()) + work=base/'save-decode-fixture' + attrs='tests="1" failures="0" errors="0" skipped="0" flaky="0" empty="0"' + xml=f'' + junit=self.write(work/'framework.xml',xml.encode()) + native={'inputSha256':'d'*64,'inputBytes':12,'canonicalProfile':profile} + self.write(work/'stdout.log',(decoder.PREFIX+json.dumps(native)+'\n').encode());self.write(work/'stderr.log',b'') + decoded={'scope':'copied-primary-content-only','input':{'sha256':'d'*64,'bytes':12},'decoderExecutable':{'sha256':m.digest(binary/'SparkTests.exe'),'bytes':14},'canonicalProfile':profile,'frameworkJUnit':{'sha256':m.digest(junit),'bytes':junit.stat().st_size}} + self.write(work/'content-receipt.json',json.dumps(decoded).encode()) + report={'passed':True,'fullShippingQualification':False,'source':'a'*40,'identities':{k:v for k,v in m.input_images(self.identity,self.evidence,self.source).items() if not k.endswith('.sparkabi')},'decoderHelperSha256':self.identity['input_sources'][m.INPUT_SOURCES[1]],'missingSlot':neg_report,'elapsedSeconds':4.0,'savedProfile':profile,'decoderWork':str(work),'decoded':decoded,'slotSha256':'d'*64} + self.write(base/'receipt.json',json.dumps(report).encode());return base,work + def test_real_replayers_accept_complete_fixture_and_exclude_binary_saves(self): + base,work=self.proof_fixture();self.write(base/'saved-primary.spark_save',b'never executable') + members=m.input_proof(self.evidence,self.identity,self.source) + self.assertEqual(len(members),8);self.assertTrue(all(not p.endswith('.spark_save') for p in members)) + def test_real_replayers_reject_fault_and_missing_terminal(self): + base,work=self.proof_fixture();p=base/'game.log';original=p.read_bytes() + for changed in (original.replace(b'faults=0',b'faults=1',1),b'\n'.join(x for x in original.split(b'\n') if not x.startswith(b'SPARK_FPS_INPUT_END'))): + p.write_bytes(changed) + with self.assertRaises(ValueError):m.input_proof(self.evidence,self.identity,self.source) + p.write_bytes(original) + def test_reject_decoder_path_escape_and_image_substitution(self): + base,work=self.proof_fixture();p=base/'receipt.json';report=json.loads(p.read_text()) + report['decoderWork']=str(self.root/'outside');p.write_text(json.dumps(report)) + with self.assertRaisesRegex(ValueError,'unowned'):m.input_proof(self.evidence,self.identity,self.source) + report['decoderWork']=str(work);report['identities']['wrong']='a'*64;p.write_text(json.dumps(report)) + with self.assertRaisesRegex(ValueError,'binding'):m.input_proof(self.evidence,self.identity,self.source) + def test_reject_decoder_junit_and_content_substitution(self): + base,work=self.proof_fixture();p=work/'framework.xml';p.write_text(p.read_text().replace('failures="0"','failures="1"')) + with self.assertRaises(ValueError):m.input_proof(self.evidence,self.identity,self.source) + + def mutate_complete_trace(self,path,mutate): + rows=path.read_text().splitlines(keepends=True) + rows=mutate(rows) + trace=[x for x in rows if x.startswith('SPARK_FPS_INPUT ')] + terminal=f'SPARK_FPS_INPUT_END v=1 records={len(trace)} bytes={sum(len(x.encode()) for x in trace)} failed=0\n' + path.write_text(''.join(terminal if x.startswith('SPARK_FPS_INPUT_END ') else x for x in rows),encoding='utf-8',newline='\n') + def test_reject_incomplete_full_sequence_with_valid_terminal_counts(self): + base,work=self.proof_fixture();path=base/'game.log';original=path.read_bytes() + # Missing F9 mutation, held-save frame, and release before repress respectively. + for update in (8,5,13): + path.write_bytes(original) + self.mutate_complete_trace(path,lambda rows:[x for x in rows if f' update={update} ' not in x]) + with self.subTest(update=update),self.assertRaises(ValueError):m.input_proof(self.evidence,self.identity,self.source) + def test_reject_later_nonclass_state_change(self): + base,work=self.proof_fixture();path=base/'game.log' + def change(rows): + result=[] + for row in rows: + if ' update=11 ' in row: + start=row.index('profile=')+8;end=row.index(' ',start) + values=bytes.fromhex(row[start:end]).decode().replace('fps.profile.health=100.000000','fps.profile.health=1.000000').encode().hex() + row=row[:start]+values+row[end:] + result.append(row) + return result + self.mutate_complete_trace(path,change) + with self.assertRaises(ValueError):m.input_proof(self.evidence,self.identity,self.source) + def test_reject_fallback_arena(self): + base,work=self.proof_fixture();path=base/'game.log';path.write_text(path.read_text().replace('authored scene "FPS Arena"','procedural fallback arena')) + with self.assertRaisesRegex(ValueError,'fallback'):m.input_proof(self.evidence,self.identity,self.source) + def test_preidentity_build_failure_still_collects_diagnostics(self): + self.write(self.evidence/'build-failure.json',b'{"phase":"build","error":"wrong source"}') + m.compact(self.evidence,weather_consumer=True,source_sha='a'*40,input_dispatch=True,source=self.source) + self.assertTrue((self.evidence/'diagnostics-text/build-failure.json').is_file()) + self.assertFalse((self.evidence/'diagnostics-text/input-binding.json').exists()) + +if __name__=='__main__':unittest.main() diff --git a/.github/scripts/test_qualify_installed_lineage.py b/.github/scripts/test_qualify_installed_lineage.py new file mode 100644 index 000000000..0415d12ef --- /dev/null +++ b/.github/scripts/test_qualify_installed_lineage.py @@ -0,0 +1,176 @@ +"""Compiler-free checks of real lineage proof parsing and owned orchestration.""" +import importlib.util +import json +import os +from pathlib import Path +import shutil +import subprocess +import sys +import tempfile +import unittest +from unittest.mock import patch + +HERE=Path(__file__).resolve().parent +def load(name,file): + spec=importlib.util.spec_from_file_location(name,HERE/file) + module=importlib.util.module_from_spec(spec);sys.modules[name]=module;spec.loader.exec_module(module);return module +H=load('lineage_test_host','qualify-installed-native.py') +L=load('lineage_test_adapter','qualify_installed_lineage.py') +E=L.validators() + + +class LineageContracts(unittest.TestCase): + def setUp(self): + self.tmp=tempfile.TemporaryDirectory();self.addCleanup(self.tmp.cleanup) + self.root=Path(self.tmp.name)/'evidence';self.root.mkdir() + self.source=Path(self.tmp.name)/'source';self.source.mkdir() + self.build=self.source/'build/windows-shipping' + self.identity=dict(source_sha='a'*40,workflow_sha='b'*40,run_id='1',run_attempt='1',helper_sha256=H.digest(H.__file__),configuration='MinSizeRel',editor_lineage=True,weather_consumer=True, + lineage_adapter_sha256=H.digest(L.__file__),lineage_validator_sha256=H.digest(HERE/'qualify-editor-fps.py')) + self.case_names=['EditorFPSLineage_'+s for s in ('AuthoredSceneLoadedByInstalledFPS','MalformedStartupFailsClosed','MissingCookedAssetFailsClosed','MissingRealModuleFailsClosed')] + for name in L.SOURCES: + path=self.source/name;path.parent.mkdir(parents=True,exist_ok=True);path.write_text('source fixture') + (self.source/L.SOURCES[0]).write_text('\n'.join('TEST('+n+') {}' for n in self.case_names)) + self.identity['images']={} + for name in ('SparkEngine.exe','SparkGameFPS.dll','SparkGameFPS.dll.sparkabi','SparkTests.exe','SparkCooker.exe','SparkCrashReporter.exe'): + path=self.build/'bin/MinSizeRel'/name;path.parent.mkdir(parents=True,exist_ok=True);path.write_bytes(name.encode());self.identity['images'][str(path)]=H.digest(path) + argv=[str(shutil.which('cmake')),'-DSPARK_ENGINE_BUILD_DIR='+self.build.as_posix(),'-DSPARK_SOURCE_ROOT='+self.source.as_posix(),'-DSPARK_CONFIG=MinSizeRel','-DSPARK_TESTS_EXECUTABLE='+(self.build/'bin/MinSizeRel/SparkTests.exe').as_posix(),'-DSPARK_ENGINE_EXECUTABLE_NAME=SparkEngine.exe','-DSPARK_EXPECTED_SOURCE_SHA='+'a'*40,'-DSPARK_PYTHON_EXECUTABLE='+sys.executable.replace('\\','/'),'-P',(self.source/'cmake/RunEditorFPSInstalledLineage.cmake').as_posix()] + self.discovery={'tests':[{'name':E.CTEST,'config':'MinSizeRel','command':argv,'properties':[{'name':'TIMEOUT','value':900},{'name':'RUN_SERIAL','value':True}]}]} + H.save(self.root/'lineage-prebuild.json',self.discovery) + + def fixture(self): + for path in L.members(self.root): + path.parent.mkdir(parents=True,exist_ok=True);path.write_text('complete text\n') + base=self.root/'lineage' + H.save(base/'discovery.json',self.discovery) + (base/'ctest.xml').write_text('') + xml=''+''.join('' for n in self.case_names)+'' + (base/'installed/lineage-junit.xml').write_text(xml) + report={'sourceSha':'a'*40,'configuration':'MinSizeRel','cases':dict.fromkeys(L.CASES,{}),'frameworkJUnit':{'sha256':H.digest(base/'installed/lineage-junit.xml')}} + for field,name in [('installedHost','SparkEngine.exe'),('installedModule','SparkGameFPS.dll'),('installedSidecar','SparkGameFPS.dll.sparkabi')]: + report[field]={'sha256':self.identity['images'][str(self.build/'bin/MinSizeRel'/name)]} + H.save(base/'installed/lineage-validation.json',report) + H.save(base/'commands.json',[{'argv':a,'cwd':str(self.source),'timeout':cap,'elapsed':1,'exitCode':0} for a,cap in zip(L.commands_for(self.root,self.source,E),(30,910))]) + self.rebind() + + def rebind(self): + binding={key:self.identity[key] for key in L.KEYS} + binding.update(passed=True,validator_sha256=self.identity['lineage_validator_sha256'],test_image_sha256=self.identity['images'][str(self.build/'bin/MinSizeRel/SparkTests.exe')],source_files={name:H.digest(self.source/name) for name in L.SOURCES},members={p.relative_to(self.root).as_posix():{'sha256':H.digest(p),'bytes':p.stat().st_size} for p in L.members(self.root)}) + H.save(self.root/'lineage/binding.json',binding) + self.identity['lineage_binding_sha256']=H.digest(self.root/'lineage/binding.json') + + def test_complete_proof_and_exact_members(self): + self.fixture();self.assertEqual(len(L.proof(H,self.root,self.source,self.identity)),55) + + def test_missing_and_truncated_full_proof_rejected(self): + self.fixture();p=self.root/'lineage/installed/evidence/positive/runtime.log' + p.unlink() + with self.assertRaises((ValueError,OSError)):L.proof(H,self.root,self.source,self.identity) + p.write_text('... Output removed since truncated');self.rebind() + with self.assertRaises(ValueError):L.proof(H,self.root,self.source,self.identity) + + def test_skip_failure_and_missing_framework_case_rejected(self): + self.fixture();p=self.root/'lineage/installed/lineage-junit.xml';original=p.read_text() + for changed in (original.replace('/>','>',1),original.replace('/>','>',1),original.replace(self.case_names[0],'UnrelatedCase')): + p.write_text(changed);self.rebind() + with self.assertRaises(ValueError):L.proof(H,self.root,self.source,self.identity) + + def test_command_environment_and_boolean_exit_rejected(self): + self.fixture();p=self.root/'lineage/commands.json';original=H.proof_json(p) + for change in ('env','config','boolean','zero'): + rows=json.loads(json.dumps(original)) + if change=='env':rows[1]['argv'].remove('--unset=SPARK_FPS_INPUT_TRACE') + if change=='config':rows[1]['argv'][rows[1]['argv'].index('MinSizeRel')]='Release' + if change=='boolean':rows[1]['exitCode']=False + if change=='zero':rows[1]['timeout']=0 + H.save(p,rows);self.rebind() + with self.assertRaises(ValueError):L.proof(H,self.root,self.source,self.identity) + + def test_source_run_image_and_validator_binding_rejected(self): + self.fixture() + for key in ('run_attempt','source_sha','lineage_validator_sha256','lineage_adapter_sha256'): + changed=dict(self.identity);changed[key]='changed' + with self.assertRaises(ValueError):L.proof(H,self.root,self.source,changed) + report_path=self.root/'lineage/installed/lineage-validation.json';report=H.proof_json(report_path);report['installedHost']['sha256']='f'*64;H.save(report_path,report);self.rebind() + with self.assertRaises(ValueError):L.proof(H,self.root,self.source,self.identity) + + def test_ordinary_lineage_rejects_diagnostic_controls(self): + self.fixture();p=self.root/'lineage/installed/evidence/positive/runtime.log' + for token in ('SPARK_FPS_INPUT','[shadow-probe]','Arena autopilot on'): + p.write_text(token);self.rebind() + with self.assertRaises(ValueError):L.proof(H,self.root,self.source,self.identity) + + def test_reserve_exhaustion_launches_no_child(self): + with patch.object(H.time,'monotonic',return_value=100),patch.object(H,'owned_run') as child: + with self.assertRaises(TimeoutError):L.run(H,self.root,self.source,self.identity,1069) + child.assert_not_called() + + def test_sole_build_reserves_300_plus_970_without_new_budget(self): + clock=[1000.0];builds=[] + cmake=shutil.which('cmake') + H.save(self.root/'clock.json',{'deadline':15400}) + for name in ('SparkMismatchedModuleFixture.dll','SparkMismatchedModuleFixture.dll.sparkabi','SparkPreviousSdkModuleFixture.dll','SparkPreviousSdkModuleFixture.dll.sparkabi'): + (self.build/'bin/MinSizeRel'/name).write_bytes(name.encode()) + def child(command,**kw): + if command[0]=='git': + text='a'*40 if command[3:]==['rev-parse','HEAD'] else 'b'*40 if command[3:]==['rev-parse','HEAD^{tree}'] else '' + kw['stdout'].write((text+'\n').encode());kw['stdout'].flush() + if '--show-only=json-v1' in command:kw['stdout'].write(json.dumps(self.discovery).encode()) + if '--preset' in command: + self.assertIn('-DPython3_EXECUTABLE='+sys.executable,command) + clock[0]+=900 + if '--build' in command: + builds.append(command);self.assertEqual(kw['timeout'],8900) + clock[0]+=kw['timeout'] + return subprocess.CompletedProcess(command,0) + def focused(*args): + clock[0]+=300 + return {'test_image_sha256':H.digest(self.build/'bin/MinSizeRel/SparkTests.exe')} + def lineage(host,root,source,identity,deadline): + self.assertEqual(deadline-clock[0],970) + return 'c'*64 + with patch.object(H.time,'monotonic',side_effect=lambda:clock[0]),patch.object(H,'owned_run',side_effect=child),patch.object(H,'focused_native',side_effect=focused),patch.object(H,'lineage_adapter',return_value=L),patch.object(L,'run',side_effect=lineage),patch.object(H.shutil,'which',side_effect=lambda tool:cmake if tool=='cmake' else sys.executable),patch.dict(os.environ,{'GITHUB_SHA':'b'*40,'GITHUB_RUN_ID':'1','GITHUB_RUN_ATTEMPT':'1'}): + H.run_phase('build',self.source,self.root,True,'a'*40,False,True) + self.assertEqual(len(builds),1) + + def test_changed_prebuild_command_launches_no_build(self): + H.save(self.root/'clock.json',{'deadline':15400}) + self.discovery['tests'][0]['command'][6]='-DSPARK_EXPECTED_SOURCE_SHA='+'c'*40 + launched=[] + cmake=shutil.which('cmake') + def child(command,**kw): + launched.append(command) + if command[0]=='git': + text='a'*40 if command[3:]==['rev-parse','HEAD'] else 'b'*40 if command[3:]==['rev-parse','HEAD^{tree}'] else '' + kw['stdout'].write((text+'\n').encode()) + if '--show-only=json-v1' in command: + kw['stdout'].write(json.dumps(self.discovery).encode()) + return subprocess.CompletedProcess(command,0) + with patch.object(H.time,'monotonic',return_value=1000),patch.object(H,'owned_run',side_effect=child),patch.object(H,'lineage_adapter',return_value=L),patch.object(H.shutil,'which',side_effect=lambda tool:cmake if tool=='cmake' else sys.executable),patch.dict(os.environ,{'GITHUB_SHA':'b'*40,'GITHUB_RUN_ID':'1','GITHUB_RUN_ATTEMPT':'1'}): + with self.assertRaisesRegex(ValueError,'exact command binding'): + H.run_phase('build',self.source,self.root,True,'a'*40,False,True) + self.assertFalse(any('--build' in command for command in launched)) + + def test_oversized_complete_proof_rejected(self): + path=self.root/'large.log';path.write_bytes(b'x'*(L.CAP+1)) + with self.assertRaises(ValueError):L.checked_text(H,path) + + def test_failed_ctest_preserves_complete_failure_xml(self): + def child(command,**kwargs): + if '--show-only=json-v1' in command: + kwargs['stdout'].write(json.dumps(self.discovery).encode());return subprocess.CompletedProcess(command,0) + path=self.root/'lineage/ctest.xml';path.write_text('') + raise subprocess.CalledProcessError(1,command) + with patch.object(H.time,'monotonic',return_value=100),patch.object(H,'owned_run',side_effect=child): + with self.assertRaises(subprocess.CalledProcessError):L.run(H,self.root,self.source,self.identity,1070) + self.assertEqual((self.root/'lineage/failure-proof/ctest.xml').read_bytes(),(self.root/'lineage/ctest.xml').read_bytes()) + self.assertFalse((self.root/'lineage/binding.json').exists()) + + def test_compact_retains_failure_not_success_and_preserves_caps(self): + H.save(self.root/'build-failure.json',{'phase':'build','error':'test'}) + p=self.root/'lineage/failure-proof/ctest.xml';p.parent.mkdir(parents=True);p.write_text('') + H.compact(self.root,True,'a'*40,input_dispatch=False,source=self.source,editor_lineage=True) + self.assertEqual((self.root/'diagnostics-text/lineage/failure-proof/ctest.xml').read_bytes(),b'') + + +if __name__=='__main__':unittest.main(verbosity=2) diff --git a/.github/scripts/test_qualify_weather_focused.py b/.github/scripts/test_qualify_weather_focused.py new file mode 100644 index 000000000..c85529f01 --- /dev/null +++ b/.github/scripts/test_qualify_weather_focused.py @@ -0,0 +1,211 @@ +"""Compiler-free focused-native orchestration and proof regression fixtures.""" +import hashlib +import importlib.util +import json +import os +from pathlib import Path +import subprocess +import tempfile +import time +import unittest +from unittest.mock import patch + +HERE=Path(__file__).resolve().parent +spec=importlib.util.spec_from_file_location('focused_helper',Path(os.environ.get('SPARK_FOCUSED_HELPER',str(HERE/'qualify-installed-native.py')))) +H=importlib.util.module_from_spec(spec);spec.loader.exec_module(H) + + +def evidence(directory,label,names): + plain=''.join(f'[ OK ] {name} (1ms, 2 assertions)\r\n' for name in names) + plain+=f'Tests: {len(names)} passed, 0 failed, {len(names)} total\r\nAssertions: {2*len(names)} passed, 0 failed\r\n' + attr=f'tests="{len(names)}" failures="0" skipped="0" flaky="0" empty="0" time="0.01"' + xml=f''+''.join(f'' for name in names)+'' + for kind,raw in [('stdout.log',plain),('stderr.log',''),('output.log',plain),('junit.xml',xml)]: + (directory/f'{label}-{kind}').write_bytes(raw.encode()) + +class FocusedContracts(unittest.TestCase): + def fixture(self,root): + source=root/'source';(source/'Tests').mkdir(parents=True) + for label,filename,prefix,count in H.FOCUSED: + (source/'Tests'/filename).write_text('\n'.join(f'TEST({prefix}{i})\n{{}}' for i in range(count))) + image=source/'SparkTests.exe';image.write_bytes(b'fake image; never executable') + identity=dict(source_sha='a'*40,workflow_sha='b'*40,run_id='1',run_attempt='1',weather_consumer=True) + return source,image,identity + + def mock_run(self,source,mutation=None): + calls=[] + def run(argv,**kwargs): + calls.append((argv,kwargs['timeout'])) + self.assertEqual(kwargs['cwd'],source) + self.assertTrue(kwargs['check']) + output=Path(argv[argv.index('--output-file')+1]);label=output.name.split('-')[0] + prefix=next(x.split('=',1)[1] for x in argv if x.startswith('SPARK_TEST_NAME_PREFIX=')) + filename=next(x.split('=',1)[1] for x in argv if x.startswith('SPARK_TEST_FILE=')) + count=int(next(x.split('=',1)[1] for x in argv if x.startswith('SPARK_TEST_EXPECT_COUNT='))) + names=H.focused_names(source,filename,prefix,count) + evidence(output.parent,label,names) + if mutation=='timeout':raise subprocess.TimeoutExpired(argv,kwargs['timeout']) + if mutation=='image':(source/'SparkTests.exe').write_bytes(b'changed') + if mutation=='exit':return subprocess.CompletedProcess(argv,2) + return subprocess.CompletedProcess(argv,0) + return calls,run + + def test_source_census_requires_exact_unique_names(self): + with tempfile.TemporaryDirectory() as tmp: + root=Path(tmp);source,_,_=self.fixture(root) + label,file,prefix,count=H.FOCUSED[0] + self.assertEqual(len(H.focused_names(source,file,prefix,count)),4) + (source/'Tests'/file).write_text('TEST('+prefix+'same)\n'*count) + with self.assertRaises(ValueError):H.focused_names(source,file,prefix,count) + + def test_owned_five_calls_counts_isolation_and_image_receipt(self): + with tempfile.TemporaryDirectory() as tmp: + root=Path(tmp);source,image,identity=self.fixture(root) + calls,run=self.mock_run(source) + with patch.object(H,'owned_run',side_effect=run): + bound=H.focused_native(source,root,image,identity,time.monotonic()+300) + self.assertEqual(len(calls),5) + for argv,timeout in calls: + self.assertEqual(timeout,60) + for flag in ('--warn-is-error','--empty-is-error','--unset=SPARK_TEST_LIMIT','--unset=SPARK_TEST_EXCLUDE','--unset=SPARK_TEST_NAME'): + self.assertIn(flag,argv) + self.assertTrue(any(x.startswith('LOCALAPPDATA=') for x in argv)) + identity['focused']=bound + identity['images']={str(image):H.digest(image)} + H.focused_proof(root,identity) + report=json.loads((root/'focused/report.json').read_text()) + self.assertEqual(sum(len(row['names']) for row in report['families']),29) + self.assertEqual(bound['test_image_sha256'],H.digest(image)) + + def test_timeout_nonzero_and_image_mutation_never_publish_pass(self): + for mutation in ('timeout','exit','image'): + with self.subTest(mutation=mutation),tempfile.TemporaryDirectory() as tmp: + root=Path(tmp);source,image,identity=self.fixture(root);calls,run=self.mock_run(source,mutation) + with patch.object(H,'owned_run',side_effect=run),self.assertRaises((ValueError,subprocess.TimeoutExpired)): + H.focused_native(source,root,image,identity,time.monotonic()+300) + self.assertEqual(len(calls),1) + self.assertFalse((root/'focused/report.json').exists()) + self.assertTrue((root/'focused/host-stdout.log').exists()) + + def test_junit_rejects_faults_counts_missing_names_nonfinite_and_truncation(self): + mutations=[('failures="0"','failures="1"'),('skipped="0"','skipped="1"'),('empty="0"','empty="1"'),('flaky="0"','flaky="1"'),('time="0.01"','time="NaN"'),('time="0.01"','time="61"'),('name="Case1"','name="Case0"'),('/>','>')] + for old,new in mutations: + with self.subTest(mutation=new),tempfile.TemporaryDirectory() as tmp: + root=Path(tmp);evidence(root,'case',['Case0','Case1']) + path=root/'case-junit.xml';path.write_text(path.read_text().replace(old,new)) + with self.assertRaises((ValueError,H.ET.ParseError)):H.validate_focused(root,'case',['Case0','Case1']) + + def test_plain_stdout_stderr_faults_and_assertion_mismatch_rejected(self): + for kind,content in [('stdout.log','[ CRASH ] bad'),('stderr.log','[ FAILED ] bad'),('output.log','bytes of output removed')]: + with tempfile.TemporaryDirectory() as tmp: + root=Path(tmp);evidence(root,'case',['Case0']) + with (root/f'case-{kind}').open('a') as stream:stream.write(content) + with self.assertRaises(ValueError):H.validate_focused(root,'case',['Case0']) + with tempfile.TemporaryDirectory() as tmp: + root=Path(tmp);evidence(root,'case',['Case0']) + path=root/'case-output.log';path.write_text(path.read_text().replace('Assertions: 2','Assertions: 3')) + with self.assertRaises(ValueError):H.validate_focused(root,'case',['Case0']) + + def test_all_focused_files_are_complete_capped_proof_on_failure(self): + for size,good in ((20000,True),(131073,False)): + with tempfile.TemporaryDirectory() as tmp: + root=Path(tmp);(root/'focused').mkdir();(root/'focused/host-stdout.log').write_bytes(b'a'*size) + if good: + H.compact(root) + self.assertEqual((root/'diagnostics-text/focused/host-stdout.log').stat().st_size,size) + else: + with self.assertRaises(ValueError):H.compact(root) + + def test_tampered_report_or_files_and_missing_proof_rejected(self): + for mutation in ('report','file','missing'): + with tempfile.TemporaryDirectory() as tmp: + root=Path(tmp);source,image,identity=self.fixture(root);_,run=self.mock_run(source) + with patch.object(H,'owned_run',side_effect=run):identity['focused']=H.focused_native(source,root,image,identity,time.monotonic()+300) + identity['images']={str(image):H.digest(image)} + path=root/'focused'/('report.json' if mutation=='report' else 'fps-output.log') + if mutation=='missing':path.unlink() + else:path.write_text('tampered') + with self.assertRaises((ValueError,FileNotFoundError)):H.focused_proof(root,identity) + + def test_shared_clock_preserves_pack_cleanup_and_phase_ceiling(self): + with tempfile.TemporaryDirectory() as tmp: + root=Path(tmp) + now=time.monotonic();H.save(root/'clock.json',dict(deadline=now+1000)) + phase=H.weather_deadline(root,'build') + self.assertAlmostEqual(phase,now+670,places=3) + pack=H.weather_deadline(root,'pack') + self.assertLessEqual(pack,time.monotonic()+270) + self.assertGreater(pack,now+269) + H.save(root/'clock.json',dict(deadline=now+100)) + self.assertAlmostEqual(H.weather_deadline(root,'pack'),now+70,places=3) + H.save(root/'clock.json',dict(deadline=now+14400)) + self.assertLessEqual(H.weather_deadline(root,'sdk')-time.monotonic(),H.PHASE_SECONDS['sdk']) + + def test_actual_expired_clock_launches_no_child(self): + with tempfile.TemporaryDirectory() as tmp: + root=Path(tmp) + for offset in (-1,329): + H.save(root/'clock.json',dict(deadline=time.monotonic()+offset)) + with patch.object(H,'owned_run') as child,self.assertRaises(TimeoutError): + H.run_phase('build',root/'source',root,True,'a'*40) + child.assert_not_called() + H.save(root/'clock.json',dict(deadline=time.monotonic()+29)) + with self.assertRaises(TimeoutError):H.weather_deadline(root,'pack') + with self.assertRaises(TimeoutError):H.compact(root,deadline=time.monotonic()-1) + self.assertFalse((root/'diagnostics-text').exists()) + + def test_clock_rejects_invalid_nonfinite_future_and_missing(self): + with tempfile.TemporaryDirectory() as tmp: + root=Path(tmp) + with self.assertRaises(FileNotFoundError):H.weather_deadline(root,'pack') + for value in (True,'later',float('inf'),float('nan'),-1,time.monotonic()+14401): + H.save(root/'clock.json',dict(deadline=value)) + with self.assertRaises(ValueError):H.weather_deadline(root,'sdk') + + def test_weather_boundary_receipt_requires_real_integer_counts(self): + for scanned,violations,good in ((2,0,True),(5,0,True),(None,0,False),(True,0,False),(1,0,False),(2,1,False),(2,False,False)): + with self.subTest(scanned=scanned,violations=violations),tempfile.TemporaryDirectory() as tmp: + root=Path(tmp);(root/'sdk').mkdir() + identity=dict(source_sha='a'*40,workflow_sha='b'*40,run_id='1',run_attempt='1',host_sha256='c'*64) + receipt=dict(identity,module='SparkGeneratedGame',sdk_version=10,headless='unavailable',windowed='accepted',lifecycle='passed',consumer_sha256='d'*64,module_sha256='e'*64,sidecar_sha256='f'*64,boundary_scanned=scanned,boundary_violations=violations,streams={}) + for weather,available in (('',0),('-weather',1)): + for kind in ('stdout','stderr'): + name=f'runtime{weather}-{kind}.log';path=root/'sdk'/name + path.write_text(f'SPARK_SDK_WEATHER module=SparkGeneratedGame available={available} accepted={available} invalid_rejected={available} clear_accepted={available} callback=OnLoad\n' if kind=='stdout' else '') + receipt['streams'][name]=H.digest(path) + H.save(root/'sdk/weather-identity.json',receipt) + if good:H.weather_proof(root,identity) + else: + with self.assertRaises(ValueError):H.weather_proof(root,identity) + + def test_combined_collector_requires_both_real_focused_and_consumer_proofs(self): + for missing in (None,'focused','consumer'): + with self.subTest(missing=missing),tempfile.TemporaryDirectory() as tmp: + root=Path(tmp);source,image,identity=self.fixture(root);_,run=self.mock_run(source) + with patch.object(H,'owned_run',side_effect=run): + identity['focused']=H.focused_native(source,root,image,identity,time.monotonic()+300) + identity['images']={str(image):H.digest(image)} + identity['host_sha256']='c'*64 + H.save(root/'identity.json',identity) + sdk=root/'sdk';sdk.mkdir() + receipt={key:identity[key] for key in ('source_sha','workflow_sha','run_id','run_attempt','host_sha256')} + receipt.update(module='SparkGeneratedGame',sdk_version=10,headless='unavailable',windowed='accepted',lifecycle='passed',consumer_sha256='d'*64,module_sha256='e'*64,sidecar_sha256='f'*64,boundary_scanned=2,boundary_violations=0,streams={}) + for weather,available in (('',0),('-weather',1)): + for kind in ('stdout','stderr'): + name=f'runtime{weather}-{kind}.log';path=sdk/name + path.write_text(f'SPARK_SDK_WEATHER module=SparkGeneratedGame available={available} accepted={available} invalid_rejected={available} clear_accepted={available} callback=OnLoad\n' if kind=='stdout' else '') + receipt['streams'][name]=H.digest(path) + H.save(sdk/'weather-identity.json',receipt) + H.save(root/'sdk-binding.json',dict(passed=True,source_sha=identity['source_sha'],host_sha256=identity['host_sha256'],weather_identity_sha256=H.digest(sdk/'weather-identity.json'))) + if missing=='focused':(root/'focused/report.json').unlink() + if missing=='consumer':(sdk/'weather-identity.json').unlink() + if missing: + with self.assertRaises((ValueError,FileNotFoundError)):H.compact(root,True,identity['source_sha']) + self.assertFalse((root/'diagnostics-text').exists()) + else: + # Neither proof validator is mocked: this is the actual collector. + H.compact(root,True,identity['source_sha']) + self.assertTrue((root/'diagnostics-text/focused/report.json').is_file()) + self.assertTrue((root/'diagnostics-text/sdk/weather-identity.json').is_file()) + +if __name__=='__main__':unittest.main() diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ac578a9c5..e4c4b7c55 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -98,7 +98,7 @@ jobs: run: cmake --build build/fuzz-policy --target check-fuzz-policy - name: Build production fuzz smoke target - run: cmake --build build/fuzz-policy --target SparkFuzzJsonUtils SparkFuzzCrashManifest SparkFuzzNeuralWeights SparkFuzzTextureStex SparkFuzzSceneManifest SparkFuzzArchive SparkFuzzShaderBlob SparkFuzzShaderServiceProtocol SparkFuzzConfigParser SparkFuzzTelemetrySpool SparkFuzzSaveSystem SparkFuzzEditorPrefab SparkFuzzReflectedScene SparkFuzzSceneManagerText SparkFuzzFbx SparkFuzzGltf SparkFuzzSoundWav SparkFuzzExr SparkFuzzTextureLinux SparkFuzzObjStatic SparkFuzzTFLanBeacon SparkFuzzMMOChatWire SparkFuzzMMOClientState SparkFuzzMMOEntityEvents SparkFuzzZipListing SparkFuzzExecScript SparkFuzzSparkBuildConfig SparkFuzzVisualScriptGraph SparkFuzzNavMesh SparkFuzzSparkTerrain SparkFuzzAssetServiceProtocol SparkFuzzDaemonFrame SparkFuzzDaemonWire SparkFuzzBinaryReader SparkFuzzEditorCollaboration SparkFuzzDataTable SparkFuzzDialogue SparkFuzzLocalization SparkFuzzFpsSnapshot SparkFuzzSessionGateProtocol SparkFuzzInstallState SparkFuzzModManifest SparkFuzzReplay SparkFuzzAnimationBinary SparkFuzzOrchestrationJournal SparkFuzzAsyncDatabase SparkFuzzMMOCharacterRecord SparkFuzzGatewayAreaControlState SparkFuzzRTSPersistence SparkFuzzOrchestratorIdentity SparkFuzzMaterialLoader SparkFuzzEngineSettings SparkFuzzVirtualFileSystem SparkFuzzEntityArchetype SparkFuzzModuleSidecar SparkFuzzPluginMetadata SparkFuzzReflectionBinary SparkFuzzShaderDiskCache SparkFuzzEditorSceneJson SparkFuzzEditorSceneLoad SparkFuzzEditorProjectFile SparkFuzzEditorRecovery SparkFuzzEditorSceneImport SparkFuzzEditorThemeImport SparkFuzzEditorWindowLayout SparkFuzzEditorLayout SparkFuzzRuntimePrefab SparkFuzzAssetMigration SparkFuzzAchievement SparkFuzzEventResponse SparkFuzzUILayout SparkFuzzAssetCooker SparkFuzzLauncherTemplate SparkFuzzLauncherModuleManifest + run: cmake --build build/fuzz-policy --target SparkFuzzJsonUtils SparkFuzzCrashManifest SparkFuzzNeuralWeights SparkFuzzTextureStex SparkFuzzSceneManifest SparkFuzzArchive SparkFuzzShaderBlob SparkFuzzShaderServiceProtocol SparkFuzzConfigParser SparkFuzzTelemetrySpool SparkFuzzSaveSystem SparkFuzzEditorPrefab SparkFuzzReflectedScene SparkFuzzSceneManagerText SparkFuzzFbx SparkFuzzGltf SparkFuzzSoundWav SparkFuzzExr SparkFuzzTextureLinux SparkFuzzObjStatic SparkFuzzTFLanBeacon SparkFuzzMMOChatWire SparkFuzzMMOClientState SparkFuzzMMOEntityEvents SparkFuzzZipListing SparkFuzzExecScript SparkFuzzSparkBuildConfig SparkFuzzVisualScriptGraph SparkFuzzNavMesh SparkFuzzSparkTerrain SparkFuzzAssetServiceProtocol SparkFuzzDaemonFrame SparkFuzzDaemonWire SparkFuzzBinaryReader SparkFuzzEditorCollaboration SparkFuzzDataTable SparkFuzzDialogue SparkFuzzLocalization SparkFuzzFpsSnapshot SparkFuzzSessionGateProtocol SparkFuzzInstallState SparkFuzzModManifest SparkFuzzReplay SparkFuzzAnimationBinary SparkFuzzOrchestrationJournal SparkFuzzAsyncDatabase SparkFuzzMMOCharacterRecord SparkFuzzGatewayAreaControlState SparkFuzzRTSPersistence SparkFuzzOrchestratorIdentity SparkFuzzMaterialLoader SparkFuzzMaterialEditorFiles SparkFuzzEngineSettings SparkFuzzVirtualFileSystem SparkFuzzEntityArchetype SparkFuzzModuleSidecar SparkFuzzPluginMetadata SparkFuzzReflectionBinary SparkFuzzShaderDiskCache SparkFuzzEditorSceneJson SparkFuzzEditorSceneLoad SparkFuzzEditorProjectFile SparkFuzzEditorRecovery SparkFuzzEditorSceneImport SparkFuzzEditorThemeImport SparkFuzzEditorWindowLayout SparkFuzzEditorLayout SparkFuzzRuntimePrefab SparkFuzzAssetMigration SparkFuzzAchievement SparkFuzzEventResponse SparkFuzzUILayout SparkFuzzAssetCooker SparkFuzzLauncherTemplate SparkFuzzLauncherModuleManifest - name: Run adversarial policy tests # -C is required by multi-config generators and ignored by single-config @@ -323,7 +323,9 @@ jobs: run: python3 -B -m unittest Tests.Tools.test_shipping_symbol_manifest -v - name: Test the build-output reproducibility comparator (BLD-100) - run: python3 -B -m unittest Tests.Tools.test_compare_build_outputs -v + run: | + python3 -B -m unittest Tests.Tools.test_compare_build_outputs -v + python3 -B Tests/Tools/test_compare_windows_shipping_repro.py - name: Generate and compare the deterministic build-matrix inventory id: build-matrix-inventory @@ -499,6 +501,7 @@ jobs: # test_ops100_crash_security.py, test_ops100_telemetry_spool.py, # test_ops100_adversarial.py, test_crash_capture_security.py, # test_sdk_component_completeness.py (compiler-free CMake install fixtures), + # test_sdl_component_archives.py (native CMake/CPack component archives), # and test_ops100_symbolication.py (which # compiles a small ELF with the runner's cc/objcopy/addr2line); # unittest runs their native test classes without requiring an @@ -509,6 +512,7 @@ jobs: test_ops100_crash_security \ test_crash_capture_security \ test_sdk_component_completeness \ + test_sdl_component_archives \ test_ops100_telemetry_spool \ test_ops100_adversarial \ test_ops100_symbolication \ @@ -698,7 +702,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y build-essential gcc-14 g++-14 cmake ccache libgl-dev libvulkan-dev glslang-tools libsdl2-dev libfreetype-dev mesa-vulkan-drivers + sudo apt-get install -y build-essential gcc-14 g++-14 cmake ccache libgl-dev libvulkan-dev glslang-tools libsdl2-dev libfreetype-dev mesa-vulkan-drivers vulkan-validationlayers - name: Setup ccache uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 @@ -736,6 +740,8 @@ jobs: -DCMAKE_CXX_COMPILER=g++-14 \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ + -DCMAKE_CXX_FLAGS_DEBUG="-g -Og" \ + -DCMAKE_C_FLAGS_DEBUG="-g -Og" \ -DCMAKE_CXX_FLAGS="-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer" \ -DCMAKE_C_FLAGS="-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer" \ -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address,undefined -no-pie" \ @@ -856,7 +862,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update - sudo apt-get install -y build-essential gcc-14 g++-14 cmake ccache libgl-dev libvulkan-dev glslang-tools libsdl2-dev libfreetype-dev mesa-vulkan-drivers + sudo apt-get install -y build-essential gcc-14 g++-14 cmake ccache libgl-dev libvulkan-dev glslang-tools libsdl2-dev libfreetype-dev mesa-vulkan-drivers vulkan-validationlayers - name: Setup ccache uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 @@ -1723,6 +1729,7 @@ jobs: build/SparkTests-load-junit.xml \ build/SparkTests-load.log \ build/SparkTests-load-output.log \ + build/SparkTests-d3d11-device-loss-junit.xml \ build/ctest-junit.xml \ build/*-process-smoke.log \ build/*-process-smoke.json \ @@ -1780,10 +1787,12 @@ jobs: $actualSha256 = (Get-FileHash -Algorithm SHA256 -Path $archive).Hash.ToLowerInvariant() if ($actualSha256 -ne $expectedSha256) { throw "Intel SDE archive hash mismatch: $actualSha256" } Write-Host "Intel SDE: digest verified; extracting archive" - & (Join-Path $env:SystemRoot 'System32\tar.exe') -xf $archive -C $dest + $unpacked = Join-Path $dest 'unpacked' + $metadata = Join-Path $dest 'sde-extraction.json' + python .github/scripts/extract_sde_archive.py --archive $archive --destination $unpacked --metadata $metadata if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } Write-Host "Intel SDE: extraction completed; locating executable" - $executables = @(Get-ChildItem -LiteralPath $dest -Recurse -File -Filter 'sde.exe') + $executables = @(Get-ChildItem -LiteralPath $unpacked -Recurse -File -Filter 'sde.exe') if ($executables.Count -ne 1) { throw "Expected one sde.exe, found $($executables.Count)" } Add-Content -Path $env:GITHUB_ENV -Value "SPARK_SDE_EXECUTABLE=$($executables[0].FullName.Replace('\', '/'))" -Encoding utf8 @@ -1970,16 +1979,17 @@ jobs: test -s build/SparkTests-output.log test -s build/ctest-junit.xml test -s build/test-registration-count.json - # Both ctest lanes are summarized: SparkEngineTests excludes the - # load/stress family and SparkEngineLoadTests runs it, so summarizing - # only the first would shrink the population the floors measure without - # lowering the floors. --registration-count compares the executed total + # All three granular ctest lanes are summarized: the main suite excludes + # load/stress and D3D11 device-loss families, which retain their own + # lanes. --registration-count compares the executed total # against the TEST macros this build actually compiled, which is the one # comparison a hand-written --min-tests literal cannot make. test -s build/SparkTests-load-junit.xml + test -s build/SparkTests-d3d11-device-loss-junit.xml python .github/scripts/summarize-test-results.py \ build/SparkTests-junit.xml \ build/SparkTests-load-junit.xml \ + build/SparkTests-d3d11-device-loss-junit.xml \ --min-tests 6800 \ --registration-count build/test-registration-count.json \ --title "SparkTests — Windows VS2022 Release" \ @@ -2030,6 +2040,7 @@ jobs: build/SparkTests-load-junit.xml build/SparkTests-load.log build/SparkTests-load-output.log + build/SparkTests-d3d11-device-loss-junit.xml build/ctest-junit.xml build/test-registration-count.json build/*-process-smoke.log @@ -2139,6 +2150,25 @@ jobs: with: submodules: recursive + - name: Pin CMake and CPack for per-user Shipping MSI + shell: pwsh + run: | + $ErrorActionPreference = 'Stop' + $archive = Join-Path $env:RUNNER_TEMP 'cmake-4.4.1-windows-x86_64.zip' + $root = Join-Path $env:RUNNER_TEMP 'spark-cmake-4.4.1' + $cmakeSha256 = '091919e1cde162b69d2d5e0f3b1f5670c973e72133f78126fbb18042947d6f19' + if (Test-Path -LiteralPath $root) { throw 'Pinned CMake directory must be fresh' } + Invoke-WebRequest -Uri 'https://github.com/Kitware/CMake/releases/download/v4.4.1/cmake-4.4.1-windows-x86_64.zip' -OutFile $archive + $cmakeActual = (Get-FileHash -Algorithm SHA256 -Path $archive).Hash + if ($cmakeActual -ne $cmakeSha256) { throw 'Pinned CMake archive checksum mismatch' } + Expand-Archive -LiteralPath $archive -DestinationPath $root + $bin = Join-Path $root 'cmake-4.4.1-windows-x86_64/bin' + $bin | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + & (Join-Path $bin 'cmake.exe') --version + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + & (Join-Path $bin 'cpack.exe') --version + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + - name: Setup MSVC uses: microsoft/setup-msbuild@30375c66a4eea26614e0d39710365f22f8b0af57 # v3 @@ -2500,8 +2530,8 @@ jobs: echo "Build-matrix evidence recorded for ${{ github.sha }}; the Build Matrix Verifier attests it from the Working checkout." # BLD-100: two clean windows-shipping builds of this commit, from two - # checkouts at different paths (so different source and build directories), - # must install equivalent outputs. tools/compare_build_outputs.py records + # independent checkouts staged sequentially at the same compiler-visible + # path, must install equivalent outputs. tools/compare_build_outputs.py records # size, SHA-256, COFF timestamp, RSDS GUID/age/PDB name and per-section # hashes of every installed EXE, DLL and static library, and fails on any # missing, extra or differing output. Nothing is cached between the builds. @@ -2534,22 +2564,43 @@ jobs: - name: Build and stage Shipping in the first tree shell: bash - working-directory: tree-a run: | set -euo pipefail - cmake --preset windows-shipping 2>&1 | tee ../reproducibility-a-configure.log + # MSVC records the object-output path in CodeView and BigObj metadata. + # Move each separate checkout to one real path for its build, then + # restore it so checkout cleanup and the comparator see both trees. + physical_parent=$PWD + source_tree="$physical_parent/tree-a" + canonical_tree="$physical_parent/reproducibility-source" + test ! -e "$canonical_tree" + mv "$source_tree" "$canonical_tree" + restore_tree() { cd "$physical_parent" && mv "$canonical_tree" "$source_tree"; } + trap restore_tree EXIT + cd "$canonical_tree" + cmake --preset windows-shipping 2>&1 | tee "$physical_parent/reproducibility-a-configure.log" # --parallel 1 for the same MSBuild /m x cl /MP reason as build-windows-shipping. - cmake --build --preset windows-shipping --config MinSizeRel --parallel 1 2>&1 | tee ../reproducibility-a-build.log - cmake --install build/windows-shipping --config MinSizeRel --prefix ../reproducibility-stage-a + cmake --build --preset windows-shipping --config MinSizeRel --parallel 1 2>&1 | tee "$physical_parent/reproducibility-a-build.log" + cmake --install build/windows-shipping --config MinSizeRel --prefix "$physical_parent/reproducibility-stage-a" + restore_tree + trap - EXIT - name: Build and stage Shipping in the second tree shell: bash - working-directory: tree-b run: | set -euo pipefail - cmake --preset windows-shipping 2>&1 | tee ../reproducibility-b-configure.log - cmake --build --preset windows-shipping --config MinSizeRel --parallel 1 2>&1 | tee ../reproducibility-b-build.log - cmake --install build/windows-shipping --config MinSizeRel --prefix ../reproducibility-stage-b + physical_parent=$PWD + source_tree="$physical_parent/tree-b" + canonical_tree="$physical_parent/reproducibility-source" + test ! -e "$canonical_tree" + mv "$source_tree" "$canonical_tree" + restore_tree() { cd "$physical_parent" && mv "$canonical_tree" "$source_tree"; } + trap restore_tree EXIT + cd "$canonical_tree" + cmake --preset windows-shipping 2>&1 | tee "$physical_parent/reproducibility-b-configure.log" + cmake --build --preset windows-shipping --config MinSizeRel --parallel 1 2>&1 | tee "$physical_parent/reproducibility-b-build.log" + cmake --install build/windows-shipping --config MinSizeRel --prefix "$physical_parent/reproducibility-stage-b" + restore_tree + trap - EXIT - name: Compare the two Shipping builds shell: bash @@ -2564,9 +2615,13 @@ jobs: root_b=$(cygpath -w "$build_b") python tree-a/tools/compare_build_outputs.py manifest reproducibility-stage-a --output reproducibility/manifest-a.json --build-root "$root_a" python tree-a/tools/compare_build_outputs.py manifest reproducibility-stage-b --output reproducibility/manifest-b.json --build-root "$root_b" - python tree-a/tools/compare_build_outputs.py compare \ - reproducibility/manifest-a.json reproducibility/manifest-b.json \ - --report reproducibility/report.json + python tree-a/.github/scripts/compare_windows_shipping_repro.py \ + --first-manifest reproducibility/manifest-a.json \ + --second-manifest reproducibility/manifest-b.json \ + --first-root reproducibility-stage-a --second-root reproducibility-stage-b \ + --first-build-root "$root_a" --second-build-root "$root_b" \ + --report reproducibility/report.json \ + --diagnostics reproducibility/coff-diagnostics.json - name: Upload reproducibility evidence if: always() @@ -2669,6 +2724,7 @@ jobs: build/SparkTests-load-junit.xml \ build/SparkTests-load.log \ build/SparkTests-load-output.log \ + build/SparkTests-d3d11-device-loss-junit.xml \ build/ctest-junit.xml \ build/*-process-smoke.log \ build/*-process-smoke.json \ @@ -2802,6 +2858,7 @@ jobs: "d3d12SDKLayers.dll $((Get-Item -LiteralPath $layers).VersionInfo.FileVersion)" - name: Run Tests + id: vs2026-release-tests if: matrix.config == 'Release' run: >- ctest --test-dir build -C ${{ matrix.config }} @@ -2817,10 +2874,12 @@ jobs: test -s build/SparkTests-output.log test -s build/ctest-junit.xml test -s build/SparkTests-load-junit.xml + test -s build/SparkTests-d3d11-device-loss-junit.xml test -s build/test-registration-count.json python .github/scripts/summarize-test-results.py \ build/SparkTests-junit.xml \ build/SparkTests-load-junit.xml \ + build/SparkTests-d3d11-device-loss-junit.xml \ --min-tests 6800 \ --registration-count build/test-registration-count.json \ --title "SparkTests — Windows VS2026 Release" \ @@ -2838,6 +2897,7 @@ jobs: build/SparkTests-load-junit.xml build/SparkTests-load.log build/SparkTests-load-output.log + build/SparkTests-d3d11-device-loss-junit.xml build/ctest-junit.xml build/*-process-smoke.log build/*-process-smoke.json @@ -2846,6 +2906,25 @@ jobs: retention-days: ${{ env.ARTIFACT_RETENTION_DAYS }} if-no-files-found: error + # VS 18 ships an independent MSVC toolset. When its fail-closed ISA scan + # rejects unreviewed CRT/STL ranges, retain one broad and one small image + # with their build PDBs so the guard-dominance review can be performed + # without weakening the x86-64-v2 floor or guessing from truncated logs. + - name: Upload bounded VS2026 CPU-floor review inputs + if: always() && matrix.config == 'Release' && steps.vs2026-release-tests.outcome == 'failure' + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: vs2026-cpu-floor-review-${{ github.sha }}-${{ github.run_attempt }} + path: | + build/bin/Release/SparkEngine.exe + build/bin/Release/SparkEngine.pdb + build/bin/Release/SparkConsole.exe + build/bin/Release/SparkConsole.pdb + build/CMakeCache.txt + build/ctest-junit.xml + retention-days: ${{ env.ERROR_RETENTION_DAYS }} + if-no-files-found: error + - name: Upload Build Artifacts if: matrix.config == 'Release' uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 diff --git a/.github/workflows/editor-fps-lineage-qualification.yml b/.github/workflows/editor-fps-lineage-qualification.yml index 6ed4e5330..798f02a59 100644 --- a/.github/workflows/editor-fps-lineage-qualification.yml +++ b/.github/workflows/editor-fps-lineage-qualification.yml @@ -150,8 +150,8 @@ jobs: timeout-minutes: 5 - name: graphics timeout-minutes: 10 - run: python harness/.github/scripts/qualify-full-windows.py graphics --source product --root "$env:QUAL_ROOT" - --source-sha 56afb9d3c6f0cd73fea1db9933fe80ab44af070e + run: |- + python harness/.github/scripts/qualify-full-windows.py graphics --source product --root "$env:QUAL_ROOT" --source-sha 56afb9d3c6f0cd73fea1db9933fe80ab44af070e - name: configure timeout-minutes: 15 run: | diff --git a/.github/workflows/full-windows-qualification.yml b/.github/workflows/full-windows-qualification.yml index 8645f4540..bee92bdd4 100644 --- a/.github/workflows/full-windows-qualification.yml +++ b/.github/workflows/full-windows-qualification.yml @@ -129,28 +129,28 @@ jobs: timeout-minutes: 5 - name: sde timeout-minutes: 5 - run: python harness/.github/scripts/qualify-full-windows.py sde --source product --root "$env:QUAL_ROOT" --source-sha - d90b86e42fd586a56d53f077bbca6a457200d9bd + run: |- + python harness/.github/scripts/qualify-full-windows.py sde --source product --root "$env:QUAL_ROOT" --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd - name: graphics timeout-minutes: 10 - run: python harness/.github/scripts/qualify-full-windows.py graphics --source product --root "$env:QUAL_ROOT" - --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd + run: |- + python harness/.github/scripts/qualify-full-windows.py graphics --source product --root "$env:QUAL_ROOT" --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd - name: configure timeout-minutes: 15 - run: python harness/.github/scripts/qualify-full-windows.py configure --source product --root "$env:QUAL_ROOT" - --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd + run: |- + python harness/.github/scripts/qualify-full-windows.py configure --source product --root "$env:QUAL_ROOT" --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd - name: build timeout-minutes: 120 - run: python harness/.github/scripts/qualify-full-windows.py build --source product --root "$env:QUAL_ROOT" - --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd + run: |- + python harness/.github/scripts/qualify-full-windows.py build --source product --root "$env:QUAL_ROOT" --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd - name: test timeout-minutes: 80 - run: python harness/.github/scripts/qualify-full-windows.py test --source product --root "$env:QUAL_ROOT" - --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd + run: |- + python harness/.github/scripts/qualify-full-windows.py test --source product --root "$env:QUAL_ROOT" --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd - name: pack timeout-minutes: 10 - run: python harness/.github/scripts/qualify-full-windows.py pack --source product --root "$env:QUAL_ROOT" - --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd + run: |- + python harness/.github/scripts/qualify-full-windows.py pack --source product --root "$env:QUAL_ROOT" --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd if: ${{ always() && env.QUAL_ROOT != '' }} - name: Retain bounded text proof if: ${{ always() && env.QUAL_ROOT != '' }} diff --git a/.github/workflows/installed-weather-qualification.yml b/.github/workflows/installed-weather-qualification.yml new file mode 100644 index 000000000..1b99560c1 --- /dev/null +++ b/.github/workflows/installed-weather-qualification.yml @@ -0,0 +1,198 @@ +name: Installed ABI10 weather qualification +'on': + push: + branches: + - codex/public-weather-sdk-20261003 +permissions: + contents: read +concurrency: + group: installed-weather-20261003 + cancel-in-progress: false +jobs: + source-contracts: + runs-on: ubuntu-24.04 + timeout-minutes: 20 + steps: + - name: Checkout exact source + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 + with: + ref: ${{ github.sha }} + persist-credentials: false + fetch-depth: 1 + - name: Verify source and existing Python environment + env: + EXPECTED_SOURCE: ${{ github.sha }} + run: | + set -euo pipefail + test "$(git rev-parse HEAD)" = "$EXPECTED_SOURCE" + git show -s --format='%H %T' HEAD + python3 -c 'import sys, yaml; print(sys.version, "PyYAML", yaml.__version__)' + - name: Verify Primary capture and mutation contracts + run: | + set -euo pipefail + python3 -B Tests/Tools/test_rhi210_capture.py + python3 -B Tests/Tools/test_verify_approved_primary.py + python3 -B Tests/Tools/test_diagnostic_sccache_keys.py + python3 -B Tests/Tools/test_installed_module_abi_rejection.py + python3 -B Tests/Tools/test_installed_native_runner.py + python3 -B Tests/Tools/test_sdk_template_configuration.py + - name: Run cleanup and diagnostic contracts + run: | + set -euo pipefail + python3 -B Tests/Tools/test_compare_build_outputs.py TwoTreeCleanupTests + python3 -B -m unittest discover -s Tests/Tools -p 'test_build_matrix_*diagnostics.py' + python3 -B Tests/Tools/test_build_matrix_report_upload.py + - name: Verify supply chain and workflow contracts + run: | + set -euo pipefail + python3 -B Tests/Tools/test_supply_chain_license_policy.py + python3 -B .github/scripts/test-workflow-failure-propagation.py + python3 -B .github/scripts/test_workflow_privilege_boundaries.py + - name: Verify exact documentation and inventory + run: | + set -euo pipefail + bash docs/update-all-docs.sh check + python3 -B Tools/buildmatrix/inventory.py --check docs/readiness/build-matrix-inventory.json + test -z "$(git status --porcelain)" + - name: Verify reconciled production contracts + run: | + set -euo pipefail + python3 -B Tests/Tools/test_clang_tidy_budget.py + python3 -B Tests/Tools/test_ops100_crash_security.py CrashSecurityTests.test_runtime_limit_constants_remain_source_anchored + bash tools/check-test-registration.sh + - name: Verify extraction and arena acceptance contracts + run: | + set -euo pipefail + python3 -B Tests/Tools/test_extract_sde_archive.py + cmake -DSPARK_FPS_ARENA_LOOP_PARSER_SELF_TEST=ON -P Tests/PackageSmoke/RunInstalledFPSArenaLoop.cmake + - name: Full Windows qualification contracts + run: python3 -B Tests/Tools/test_full_windows_qualification.py + - name: Reviewed ISA mapper and permanent native-byte fixture contracts + run: | + set -euo pipefail + python3 -B -m unittest Tests.Tools.test_isa_code_map Tests.Tools.test_isa_code_map_release_fixture Tests.Tools.test_check_isa_baseline.ClassifierTests + - name: Existing ISA diagnostic evidence contracts + run: | + set -euo pipefail + python3 -B Tests/Tools/test_isa_failure_diagnostics.py + python3 -B Tests/Tools/test_isa_diagnostic_runner.py + - name: Verify editor FPS evidence and bounded qualification contracts + run: | + set -euo pipefail + python3 -B Tests/PackageSmoke/test_editor_fps_lineage.py + python3 -B .github/scripts/test_qualify_editor_fps.py + python3 -B Tests/Tools/test_module_private_dependencies.py + - name: Verify ABI10 weather and focused proof contracts + run: | + set -euo pipefail + python3 -B SparkSDK/Tools/sdk_abi_surface.py check + python3 -B -m unittest -v Tests.Tools.test_sdk240_abi_surface Tests.Tools.test_sdk_component_completeness Tests.Tools.test_installed_module_abi_rejection Tests.Tools.test_module_private_dependencies Tests.Tools.test_sdk_weather_consumer Tests.Tools.test_fps_input_dispatch + python3 -B Tests/PackageSmoke/test_fps_owned_save_decode.py + python3 -B .github/scripts/test_qualify_weather_focused.py + python3 -B .github/scripts/test_qualify_input_dispatch.py + python3 -B .github/scripts/test_qualify_installed_lineage.py + installed-native: + needs: source-contracts + runs-on: windows-2022 + timeout-minutes: 240 + env: + PYTHONUTF8: '1' + defaults: + run: + shell: pwsh + steps: + - name: Initialize owned evidence and monotonic job budget + run: | + $ErrorActionPreference = 'Stop' + $q = Join-Path $env:RUNNER_TEMP "spark-weather-$env:GITHUB_RUN_ID-$env:GITHUB_RUN_ATTEMPT" + if (Test-Path -LiteralPath $q) { throw 'Evidence root exists' } + New-Item -ItemType Directory -Path $q | Out-Null + "QUAL_ROOT=$q" | Out-File $env:GITHUB_ENV -Encoding utf8 -Append + python -c "import json,time,pathlib; pathlib.Path(r'$q/clock.json').write_text(json.dumps({'deadline':time.monotonic()+240*60}))" + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + - name: Checkout workflow helper + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 + with: + ref: ${{ github.sha }} + path: harness + persist-credentials: false + sparse-checkout: .github/scripts + - name: Checkout exact ABI10 weather product + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 + with: + ref: 7a072946a56dd5c89cdf9fde5592584f7c163cee + path: product + submodules: recursive + persist-credentials: false + - name: Require installed VS 2022 v143 environment and record host + run: | + $ErrorActionPreference = 'Stop' + $q = $env:QUAL_ROOT + if (-not (Test-Path -LiteralPath "$q/clock.json")) { throw "Missing initialized evidence clock" } + $vswhere = Join-Path ${env:ProgramFiles(x86)} 'Microsoft Visual Studio/Installer/vswhere.exe' + $vs = & $vswhere -latest -products * -version '[17.0,18.0)' -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath + if ($LASTEXITCODE -ne 0 -or -not $vs) { throw 'Preinstalled VS 2022 v143 unavailable' } + $before = @{} + Get-ChildItem env: | ForEach-Object { $before[$_.Name] = $_.Value } + Import-Module (Join-Path $vs 'Common7/Tools/Microsoft.VisualStudio.DevShell.dll') + Enter-VsDevShell -VsInstallPath $vs -SkipAutomaticLocation -DevCmdArguments '-arch=x64 -host_arch=x64' + if ($env:VCToolsVersion -notmatch '^14\.[34][0-9]\.') { throw 'Expected v143 toolset' } + foreach ($entry in Get-ChildItem env:) { + if ($entry.Name.StartsWith('=') -or $entry.Value -match "[`r`n]") { continue } + if ($before[$entry.Name] -ne $entry.Value) { + "$($entry.Name)=$($entry.Value)" | Out-File $env:GITHUB_ENV -Append -Encoding utf8 + } + } + $tools = @{} + foreach ($name in @('cl.exe', 'cmake.exe', 'ninja.exe', 'python.exe', 'rc.exe')) { + $file = (Get-Command $name -ErrorAction Stop).Source + $tools[$name] = @{ path=$file; version=(Get-Item -LiteralPath $file).VersionInfo.FileVersion; sha256=(Get-FileHash -LiteralPath $file -Algorithm SHA256).Hash.ToLowerInvariant() } + } + $os = Get-CimInstance Win32_OperatingSystem + @{ vs=$vs; vcToolsVersion=$env:VCToolsVersion; windowsSdkVersion=$env:WindowsSDKVersion; tools=$tools; os=$os.Caption; osVersion=$os.Version; osBuild=$os.BuildNumber; totalMemoryKiB=$os.TotalVisibleMemorySize; freeMemoryKiB=$os.FreePhysicalMemory; runnerImage=$env:ImageVersion; workflowSha=$env:GITHUB_SHA } | ConvertTo-Json -Depth 6 | Set-Content -LiteralPath "$q/host.json" -Encoding utf8 + cmake --version + if ($LASTEXITCODE -ne 0) { throw 'CMake unavailable' } + ninja --version + if ($LASTEXITCODE -ne 0) { throw 'Ninja unavailable' } + python --version + if ($LASTEXITCODE -ne 0) { throw 'Python unavailable' } + timeout-minutes: 5 + - name: graphics + timeout-minutes: 10 + run: |- + python harness/.github/scripts/qualify-full-windows.py graphics --source product --root "$env:QUAL_ROOT" --source-sha 7a072946a56dd5c89cdf9fde5592584f7c163cee + - name: Build MinSizeRel product and run focused native families + timeout-minutes: 185 + run: | + python harness/.github/scripts/qualify-installed-native.py build --source product --root "$env:QUAL_ROOT" --source-sha 7a072946a56dd5c89cdf9fde5592584f7c163cee --weather-consumer --input-dispatch --editor-lineage + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + - name: Installed SDK weather acceptance on same host + timeout-minutes: 30 + run: | + python harness/.github/scripts/qualify-installed-native.py sdk --source product --root "$env:QUAL_ROOT" --source-sha 7a072946a56dd5c89cdf9fde5592584f7c163cee --weather-consumer --input-dispatch --editor-lineage + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + - name: Same installed host SDK9 and SDK11 rejection + timeout-minutes: 5 + run: | + python harness/.github/scripts/qualify-installed-native.py abi --source product --root "$env:QUAL_ROOT" --source-sha 7a072946a56dd5c89cdf9fde5592584f7c163cee --weather-consumer --input-dispatch --editor-lineage + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + - name: Package closure and same-host graph binding + timeout-minutes: 15 + run: | + python harness/.github/scripts/qualify-installed-native.py closure --source product --root "$env:QUAL_ROOT" --source-sha 7a072946a56dd5c89cdf9fde5592584f7c163cee --weather-consumer --input-dispatch --editor-lineage + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + - name: Retain complete bounded weather evidence + timeout-minutes: 5 + run: | + python harness/.github/scripts/qualify-installed-native.py pack --source product --root "$env:QUAL_ROOT" --source-sha 7a072946a56dd5c89cdf9fde5592584f7c163cee --weather-consumer --input-dispatch --editor-lineage + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } + if: ${{ always() && env.QUAL_ROOT != '' }} + - name: Retain installed weather qualification text + if: ${{ always() && env.QUAL_ROOT != '' }} + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a + with: + name: installed-weather-text + path: ${{ env.QUAL_ROOT }}/diagnostics-text + if-no-files-found: error + retention-days: 1 + compression-level: 6 diff --git a/.github/workflows/publish-wiki.yml b/.github/workflows/publish-wiki.yml index 23ef31370..c56aac58d 100644 --- a/.github/workflows/publish-wiki.yml +++ b/.github/workflows/publish-wiki.yml @@ -90,12 +90,16 @@ jobs: fetch-depth: 0 persist-credentials: false - # The GOV-400 font-notice test reads the embedding source in the ImGui - # submodule and fails closed when it is absent; only that one is needed. - - name: Initialise the font-embedding submodule - run: git submodule update --init --depth 1 ThirdParty/UI/imgui + # The font-notice and real crypto-build tests require the pinned ImGui + # and libsodium sources and fail closed when either is absent. + - name: Initialise the font-embedding and crypto submodules + run: git submodule update --init --depth 1 ThirdParty/UI/imgui ThirdParty/Security/libsodium - name: Generate exact-commit API documentation + # Shard 0's complete determinism test regenerates API documentation in + # each invocation itself. Avoid a third redundant generation while + # retaining both sequential health checks and the 10-minute budget. + if: matrix.shard != 0 env: SPARKENGINE_DOC_SOURCE_SHA: ${{ github.sha }} run: | diff --git a/.github/workflows/readiness-corrected-release-qualification.yml b/.github/workflows/readiness-corrected-release-qualification.yml index 452373ef1..0423783f5 100644 --- a/.github/workflows/readiness-corrected-release-qualification.yml +++ b/.github/workflows/readiness-corrected-release-qualification.yml @@ -160,16 +160,16 @@ jobs: timeout-minutes: 5 - name: sde timeout-minutes: 5 - run: python harness/.github/scripts/qualify-full-windows.py sde --source product --root "$env:QUAL_ROOT" --source-sha - 46789281a0078ed9bb9ba17dede3ac07f4d82bb8 + run: |- + python harness/.github/scripts/qualify-full-windows.py sde --source product --root "$env:QUAL_ROOT" --source-sha 46789281a0078ed9bb9ba17dede3ac07f4d82bb8 - name: graphics timeout-minutes: 10 - run: python harness/.github/scripts/qualify-full-windows.py graphics --source product --root "$env:QUAL_ROOT" - --source-sha 46789281a0078ed9bb9ba17dede3ac07f4d82bb8 + run: |- + python harness/.github/scripts/qualify-full-windows.py graphics --source product --root "$env:QUAL_ROOT" --source-sha 46789281a0078ed9bb9ba17dede3ac07f4d82bb8 - name: configure timeout-minutes: 15 - run: python harness/.github/scripts/qualify-full-windows.py configure --source product --root "$env:QUAL_ROOT" - --source-sha 46789281a0078ed9bb9ba17dede3ac07f4d82bb8 + run: |- + python harness/.github/scripts/qualify-full-windows.py configure --source product --root "$env:QUAL_ROOT" --source-sha 46789281a0078ed9bb9ba17dede3ac07f4d82bb8 - name: Retain bounded successful CTest output timeout-minutes: 1 run: | @@ -193,8 +193,8 @@ jobs: if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } - name: build timeout-minutes: 120 - run: python harness/.github/scripts/qualify-full-windows.py build --source product --root "$env:QUAL_ROOT" - --source-sha 46789281a0078ed9bb9ba17dede3ac07f4d82bb8 + run: |- + python harness/.github/scripts/qualify-full-windows.py build --source product --root "$env:QUAL_ROOT" --source-sha 46789281a0078ed9bb9ba17dede3ac07f4d82bb8 - name: test timeout-minutes: 80 run: | @@ -203,8 +203,8 @@ jobs: if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } - name: pack timeout-minutes: 10 - run: python harness/.github/scripts/qualify-full-windows.py pack --source product --root "$env:QUAL_ROOT" - --source-sha 46789281a0078ed9bb9ba17dede3ac07f4d82bb8 + run: |- + python harness/.github/scripts/qualify-full-windows.py pack --source product --root "$env:QUAL_ROOT" --source-sha 46789281a0078ed9bb9ba17dede3ac07f4d82bb8 if: ${{ always() && env.QUAL_ROOT != '' }} - name: Retain bounded text proof if: ${{ always() && env.QUAL_ROOT != '' }} diff --git a/.github/workflows/readiness-isa-correction.yml b/.github/workflows/readiness-isa-correction.yml index 9a9237356..5a950fc3b 100644 --- a/.github/workflows/readiness-isa-correction.yml +++ b/.github/workflows/readiness-isa-correction.yml @@ -22,89 +22,59 @@ jobs: - name: Verify source and existing Python environment env: EXPECTED_SOURCE: ${{ github.sha }} - run: 'set -euo pipefail - + run: | + set -euo pipefail test "$(git rev-parse HEAD)" = "$EXPECTED_SOURCE" - - git show -s --format=''%H %T'' HEAD - - python3 -c ''import sys, yaml; print(sys.version, "PyYAML", yaml.__version__)'' - - ' + git show -s --format='%H %T' HEAD + python3 -c 'import sys, yaml; print(sys.version, "PyYAML", yaml.__version__)' - name: Verify Primary capture and mutation contracts - run: 'set -euo pipefail - + run: | + set -euo pipefail python3 -B Tests/Tools/test_rhi210_capture.py - python3 -B Tests/Tools/test_verify_approved_primary.py - python3 -B Tests/Tools/test_diagnostic_sccache_keys.py - python3 -B Tests/Tools/test_installed_module_abi_rejection.py - python3 -B Tests/Tools/test_installed_native_runner.py - python3 -B Tests/Tools/test_sdk_template_configuration.py - - ' - name: Run cleanup and diagnostic contracts - run: 'set -euo pipefail - + run: | + set -euo pipefail python3 -B Tests/Tools/test_compare_build_outputs.py TwoTreeCleanupTests - - python3 -B -m unittest discover -s Tests/Tools -p ''test_build_matrix_*diagnostics.py'' - + python3 -B -m unittest discover -s Tests/Tools -p 'test_build_matrix_*diagnostics.py' python3 -B Tests/Tools/test_build_matrix_report_upload.py - - ' - name: Verify supply chain and workflow contracts - run: 'set -euo pipefail - + run: | + set -euo pipefail python3 -B Tests/Tools/test_supply_chain_license_policy.py - python3 -B .github/scripts/test-workflow-failure-propagation.py - python3 -B .github/scripts/test_workflow_privilege_boundaries.py - - ' - name: Verify exact documentation and inventory - run: 'set -euo pipefail - + run: | + set -euo pipefail bash docs/update-all-docs.sh check - python3 -B Tools/buildmatrix/inventory.py --check docs/readiness/build-matrix-inventory.json - test -z "$(git status --porcelain)" - - ' - name: Verify reconciled production contracts - run: 'set -euo pipefail - + run: | + set -euo pipefail python3 -B Tests/Tools/test_clang_tidy_budget.py - python3 -B Tests/Tools/test_ops100_crash_security.py CrashSecurityTests.test_runtime_limit_constants_remain_source_anchored - bash tools/check-test-registration.sh - - ' - name: Verify extraction and arena acceptance contracts - run: 'set -euo pipefail - + run: | + set -euo pipefail python3 -B Tests/Tools/test_extract_sde_archive.py - cmake -DSPARK_FPS_ARENA_LOOP_PARSER_SELF_TEST=ON -P Tests/PackageSmoke/RunInstalledFPSArenaLoop.cmake - - ' - name: Full Windows qualification contracts run: python3 -B Tests/Tools/test_full_windows_qualification.py - name: ISA diagnostic contracts - run: 'python3 -B Tests/Tools/test_isa_failure_diagnostics.py - - python3 -B Tests/Tools/test_isa_diagnostic_runner.py' + run: |- + python3 -B Tests/Tools/test_isa_failure_diagnostics.py + python3 -B Tests/Tools/test_isa_diagnostic_runner.py - name: Retained ISA bytes and strict mapper contracts - run: 'set -euo pipefail - - python3 -B -m unittest Tests.Tools.test_isa_code_map Tests.Tools.test_isa_code_map_release_fixture Tests.Tools.test_check_isa_baseline.ClassifierTests' + run: |- + set -euo pipefail + python3 -B -m unittest Tests.Tools.test_isa_code_map Tests.Tools.test_isa_code_map_release_fixture Tests.Tools.test_check_isa_baseline.ClassifierTests windows: runs-on: windows-2022 timeout-minutes: 240 @@ -115,30 +85,23 @@ jobs: shell: pwsh steps: - name: Initialize owned evidence and monotonic job budget - run: '$ErrorActionPreference = ''Stop'' - + run: | + $ErrorActionPreference = 'Stop' $q = Join-Path $env:RUNNER_TEMP "spark-isa-ab-$env:GITHUB_RUN_ID-$env:GITHUB_RUN_ATTEMPT" - - if (Test-Path -LiteralPath $q) { throw ''Evidence root exists'' } - + if (Test-Path -LiteralPath $q) { throw 'Evidence root exists' } New-Item -ItemType Directory -Path $q | Out-Null - "QUAL_ROOT=$q" | Out-File $env:GITHUB_ENV -Encoding utf8 -Append - - python -c "import json,time,pathlib; pathlib.Path(r''$q/clock.json'').write_text(json.dumps({''deadline'':time.monotonic()+240*60}))" - + python -c "import json,time,pathlib; pathlib.Path(r'$q/clock.json').write_text(json.dumps({'deadline':time.monotonic()+240*60}))" if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } - - ' - name: Checkout workflow helper uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with: ref: ${{ github.sha }} path: harness persist-credentials: false - sparse-checkout: '.github/scripts - - tools' + sparse-checkout: |- + .github/scripts + tools - name: Checkout exact combined product uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with: @@ -147,9 +110,37 @@ jobs: submodules: recursive persist-credentials: false - name: Require installed VS 2022 v143 environment and record host - run: "$ErrorActionPreference = 'Stop'\n$q = $env:QUAL_ROOT\nif (-not (Test-Path -LiteralPath \"$q/clock.json\")) { throw \"Missing initialized evidence clock\" }\n$vswhere = Join-Path ${env:ProgramFiles(x86)} 'Microsoft Visual Studio/Installer/vswhere.exe'\n$vs = & $vswhere -latest -products * -version '[17.0,18.0)' -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath\nif ($LASTEXITCODE -ne 0 -or -not $vs) { throw 'Preinstalled VS 2022 v143 unavailable' }\n$before = @{}\nGet-ChildItem env: | ForEach-Object { $before[$_.Name] = $_.Value }\nImport-Module (Join-Path $vs 'Common7/Tools/Microsoft.VisualStudio.DevShell.dll')\nEnter-VsDevShell -VsInstallPath $vs -SkipAutomaticLocation -DevCmdArguments '-arch=x64 -host_arch=x64'\nif ($env:VCToolsVersion -notmatch '^14\\.[34][0-9]\\.') { throw 'Expected v143 toolset' }\nforeach ($entry in Get-ChildItem env:) {\n if ($entry.Name.StartsWith('=') -or $entry.Value -match \"[`r`n]\") { continue }\n if ($before[$entry.Name]\ - \ -ne $entry.Value) {\n \"$($entry.Name)=$($entry.Value)\" | Out-File $env:GITHUB_ENV -Append -Encoding utf8\n }\n}\n$tools = @{}\nforeach ($name in @('cl.exe', 'cmake.exe', 'ninja.exe', 'python.exe', 'rc.exe')) {\n $file = (Get-Command $name -ErrorAction Stop).Source\n $tools[$name] = @{ path=$file; version=(Get-Item -LiteralPath $file).VersionInfo.FileVersion; sha256=(Get-FileHash -LiteralPath $file -Algorithm SHA256).Hash.ToLowerInvariant() }\n}\n$os = Get-CimInstance Win32_OperatingSystem\n@{ vs=$vs; vcToolsVersion=$env:VCToolsVersion; windowsSdkVersion=$env:WindowsSDKVersion; tools=$tools; os=$os.Caption; osVersion=$os.Version; osBuild=$os.BuildNumber; totalMemoryKiB=$os.TotalVisibleMemorySize; freeMemoryKiB=$os.FreePhysicalMemory; runnerImage=$env:ImageVersion; workflowSha=$env:GITHUB_SHA } | ConvertTo-Json -Depth 6 | Set-Content -LiteralPath \"$q/host.json\" -Encoding utf8\ncmake --version\nif ($LASTEXITCODE -ne 0) { throw 'CMake unavailable' }\nninja --version\nif ($LASTEXITCODE\ - \ -ne 0) { throw 'Ninja unavailable' }\npython --version\nif ($LASTEXITCODE -ne 0) { throw 'Python unavailable' }\n" + run: | + $ErrorActionPreference = 'Stop' + $q = $env:QUAL_ROOT + if (-not (Test-Path -LiteralPath "$q/clock.json")) { throw "Missing initialized evidence clock" } + $vswhere = Join-Path ${env:ProgramFiles(x86)} 'Microsoft Visual Studio/Installer/vswhere.exe' + $vs = & $vswhere -latest -products * -version '[17.0,18.0)' -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath + if ($LASTEXITCODE -ne 0 -or -not $vs) { throw 'Preinstalled VS 2022 v143 unavailable' } + $before = @{} + Get-ChildItem env: | ForEach-Object { $before[$_.Name] = $_.Value } + Import-Module (Join-Path $vs 'Common7/Tools/Microsoft.VisualStudio.DevShell.dll') + Enter-VsDevShell -VsInstallPath $vs -SkipAutomaticLocation -DevCmdArguments '-arch=x64 -host_arch=x64' + if ($env:VCToolsVersion -notmatch '^14\.[34][0-9]\.') { throw 'Expected v143 toolset' } + foreach ($entry in Get-ChildItem env:) { + if ($entry.Name.StartsWith('=') -or $entry.Value -match "[`r`n]") { continue } + if ($before[$entry.Name] -ne $entry.Value) { + "$($entry.Name)=$($entry.Value)" | Out-File $env:GITHUB_ENV -Append -Encoding utf8 + } + } + $tools = @{} + foreach ($name in @('cl.exe', 'cmake.exe', 'ninja.exe', 'python.exe', 'rc.exe')) { + $file = (Get-Command $name -ErrorAction Stop).Source + $tools[$name] = @{ path=$file; version=(Get-Item -LiteralPath $file).VersionInfo.FileVersion; sha256=(Get-FileHash -LiteralPath $file -Algorithm SHA256).Hash.ToLowerInvariant() } + } + $os = Get-CimInstance Win32_OperatingSystem + @{ vs=$vs; vcToolsVersion=$env:VCToolsVersion; windowsSdkVersion=$env:WindowsSDKVersion; tools=$tools; os=$os.Caption; osVersion=$os.Version; osBuild=$os.BuildNumber; totalMemoryKiB=$os.TotalVisibleMemorySize; freeMemoryKiB=$os.FreePhysicalMemory; runnerImage=$env:ImageVersion; workflowSha=$env:GITHUB_SHA } | ConvertTo-Json -Depth 6 | Set-Content -LiteralPath "$q/host.json" -Encoding utf8 + cmake --version + if ($LASTEXITCODE -ne 0) { throw 'CMake unavailable' } + ninja --version + if ($LASTEXITCODE -ne 0) { throw 'Ninja unavailable' } + python --version + if ($LASTEXITCODE -ne 0) { throw 'Python unavailable' } timeout-minutes: 5 - name: sde timeout-minutes: 5 diff --git a/.github/workflows/readiness-isa-diagnostic.yml b/.github/workflows/readiness-isa-diagnostic.yml index 833c26d60..fd6b9b93f 100644 --- a/.github/workflows/readiness-isa-diagnostic.yml +++ b/.github/workflows/readiness-isa-diagnostic.yml @@ -22,85 +22,55 @@ jobs: - name: Verify source and existing Python environment env: EXPECTED_SOURCE: ${{ github.sha }} - run: 'set -euo pipefail - + run: | + set -euo pipefail test "$(git rev-parse HEAD)" = "$EXPECTED_SOURCE" - - git show -s --format=''%H %T'' HEAD - - python3 -c ''import sys, yaml; print(sys.version, "PyYAML", yaml.__version__)'' - - ' + git show -s --format='%H %T' HEAD + python3 -c 'import sys, yaml; print(sys.version, "PyYAML", yaml.__version__)' - name: Verify Primary capture and mutation contracts - run: 'set -euo pipefail - + run: | + set -euo pipefail python3 -B Tests/Tools/test_rhi210_capture.py - python3 -B Tests/Tools/test_verify_approved_primary.py - python3 -B Tests/Tools/test_diagnostic_sccache_keys.py - python3 -B Tests/Tools/test_installed_module_abi_rejection.py - python3 -B Tests/Tools/test_installed_native_runner.py - python3 -B Tests/Tools/test_sdk_template_configuration.py - - ' - name: Run cleanup and diagnostic contracts - run: 'set -euo pipefail - + run: | + set -euo pipefail python3 -B Tests/Tools/test_compare_build_outputs.py TwoTreeCleanupTests - - python3 -B -m unittest discover -s Tests/Tools -p ''test_build_matrix_*diagnostics.py'' - + python3 -B -m unittest discover -s Tests/Tools -p 'test_build_matrix_*diagnostics.py' python3 -B Tests/Tools/test_build_matrix_report_upload.py - - ' - name: Verify supply chain and workflow contracts - run: 'set -euo pipefail - + run: | + set -euo pipefail python3 -B Tests/Tools/test_supply_chain_license_policy.py - python3 -B .github/scripts/test-workflow-failure-propagation.py - python3 -B .github/scripts/test_workflow_privilege_boundaries.py - - ' - name: Verify exact documentation and inventory - run: 'set -euo pipefail - + run: | + set -euo pipefail bash docs/update-all-docs.sh check - python3 -B Tools/buildmatrix/inventory.py --check docs/readiness/build-matrix-inventory.json - test -z "$(git status --porcelain)" - - ' - name: Verify reconciled production contracts - run: 'set -euo pipefail - + run: | + set -euo pipefail python3 -B Tests/Tools/test_clang_tidy_budget.py - python3 -B Tests/Tools/test_ops100_crash_security.py CrashSecurityTests.test_runtime_limit_constants_remain_source_anchored - bash tools/check-test-registration.sh - - ' - name: Verify extraction and arena acceptance contracts - run: 'set -euo pipefail - + run: | + set -euo pipefail python3 -B Tests/Tools/test_extract_sde_archive.py - cmake -DSPARK_FPS_ARENA_LOOP_PARSER_SELF_TEST=ON -P Tests/PackageSmoke/RunInstalledFPSArenaLoop.cmake - - ' - name: Full Windows qualification contracts run: python3 -B Tests/Tools/test_full_windows_qualification.py - name: ISA diagnostic contracts - run: 'python3 -B Tests/Tools/test_isa_failure_diagnostics.py - - python3 -B Tests/Tools/test_isa_diagnostic_runner.py' + run: |- + python3 -B Tests/Tools/test_isa_failure_diagnostics.py + python3 -B Tests/Tools/test_isa_diagnostic_runner.py windows: runs-on: windows-2022 timeout-minutes: 240 @@ -111,21 +81,14 @@ jobs: shell: pwsh steps: - name: Initialize owned evidence and monotonic job budget - run: '$ErrorActionPreference = ''Stop'' - + run: | + $ErrorActionPreference = 'Stop' $q = Join-Path $env:RUNNER_TEMP "spark-isa-$env:GITHUB_RUN_ID-$env:GITHUB_RUN_ATTEMPT" - - if (Test-Path -LiteralPath $q) { throw ''Evidence root exists'' } - + if (Test-Path -LiteralPath $q) { throw 'Evidence root exists' } New-Item -ItemType Directory -Path $q | Out-Null - "QUAL_ROOT=$q" | Out-File $env:GITHUB_ENV -Encoding utf8 -Append - - python -c "import json,time,pathlib; pathlib.Path(r''$q/clock.json'').write_text(json.dumps({''deadline'':time.monotonic()+240*60}))" - + python -c "import json,time,pathlib; pathlib.Path(r'$q/clock.json').write_text(json.dumps({'deadline':time.monotonic()+240*60}))" if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } - - ' - name: Checkout workflow helper uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 with: @@ -141,9 +104,37 @@ jobs: submodules: recursive persist-credentials: false - name: Require installed VS 2022 v143 environment and record host - run: "$ErrorActionPreference = 'Stop'\n$q = $env:QUAL_ROOT\nif (-not (Test-Path -LiteralPath \"$q/clock.json\")) { throw \"Missing initialized evidence clock\" }\n$vswhere = Join-Path ${env:ProgramFiles(x86)} 'Microsoft Visual Studio/Installer/vswhere.exe'\n$vs = & $vswhere -latest -products * -version '[17.0,18.0)' -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath\nif ($LASTEXITCODE -ne 0 -or -not $vs) { throw 'Preinstalled VS 2022 v143 unavailable' }\n$before = @{}\nGet-ChildItem env: | ForEach-Object { $before[$_.Name] = $_.Value }\nImport-Module (Join-Path $vs 'Common7/Tools/Microsoft.VisualStudio.DevShell.dll')\nEnter-VsDevShell -VsInstallPath $vs -SkipAutomaticLocation -DevCmdArguments '-arch=x64 -host_arch=x64'\nif ($env:VCToolsVersion -notmatch '^14\\.[34][0-9]\\.') { throw 'Expected v143 toolset' }\nforeach ($entry in Get-ChildItem env:) {\n if ($entry.Name.StartsWith('=') -or $entry.Value -match \"[`r`n]\") { continue }\n if ($before[$entry.Name]\ - \ -ne $entry.Value) {\n \"$($entry.Name)=$($entry.Value)\" | Out-File $env:GITHUB_ENV -Append -Encoding utf8\n }\n}\n$tools = @{}\nforeach ($name in @('cl.exe', 'cmake.exe', 'ninja.exe', 'python.exe', 'rc.exe')) {\n $file = (Get-Command $name -ErrorAction Stop).Source\n $tools[$name] = @{ path=$file; version=(Get-Item -LiteralPath $file).VersionInfo.FileVersion; sha256=(Get-FileHash -LiteralPath $file -Algorithm SHA256).Hash.ToLowerInvariant() }\n}\n$os = Get-CimInstance Win32_OperatingSystem\n@{ vs=$vs; vcToolsVersion=$env:VCToolsVersion; windowsSdkVersion=$env:WindowsSDKVersion; tools=$tools; os=$os.Caption; osVersion=$os.Version; osBuild=$os.BuildNumber; totalMemoryKiB=$os.TotalVisibleMemorySize; freeMemoryKiB=$os.FreePhysicalMemory; runnerImage=$env:ImageVersion; workflowSha=$env:GITHUB_SHA } | ConvertTo-Json -Depth 6 | Set-Content -LiteralPath \"$q/host.json\" -Encoding utf8\ncmake --version\nif ($LASTEXITCODE -ne 0) { throw 'CMake unavailable' }\nninja --version\nif ($LASTEXITCODE\ - \ -ne 0) { throw 'Ninja unavailable' }\npython --version\nif ($LASTEXITCODE -ne 0) { throw 'Python unavailable' }\n" + run: | + $ErrorActionPreference = 'Stop' + $q = $env:QUAL_ROOT + if (-not (Test-Path -LiteralPath "$q/clock.json")) { throw "Missing initialized evidence clock" } + $vswhere = Join-Path ${env:ProgramFiles(x86)} 'Microsoft Visual Studio/Installer/vswhere.exe' + $vs = & $vswhere -latest -products * -version '[17.0,18.0)' -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath + if ($LASTEXITCODE -ne 0 -or -not $vs) { throw 'Preinstalled VS 2022 v143 unavailable' } + $before = @{} + Get-ChildItem env: | ForEach-Object { $before[$_.Name] = $_.Value } + Import-Module (Join-Path $vs 'Common7/Tools/Microsoft.VisualStudio.DevShell.dll') + Enter-VsDevShell -VsInstallPath $vs -SkipAutomaticLocation -DevCmdArguments '-arch=x64 -host_arch=x64' + if ($env:VCToolsVersion -notmatch '^14\.[34][0-9]\.') { throw 'Expected v143 toolset' } + foreach ($entry in Get-ChildItem env:) { + if ($entry.Name.StartsWith('=') -or $entry.Value -match "[`r`n]") { continue } + if ($before[$entry.Name] -ne $entry.Value) { + "$($entry.Name)=$($entry.Value)" | Out-File $env:GITHUB_ENV -Append -Encoding utf8 + } + } + $tools = @{} + foreach ($name in @('cl.exe', 'cmake.exe', 'ninja.exe', 'python.exe', 'rc.exe')) { + $file = (Get-Command $name -ErrorAction Stop).Source + $tools[$name] = @{ path=$file; version=(Get-Item -LiteralPath $file).VersionInfo.FileVersion; sha256=(Get-FileHash -LiteralPath $file -Algorithm SHA256).Hash.ToLowerInvariant() } + } + $os = Get-CimInstance Win32_OperatingSystem + @{ vs=$vs; vcToolsVersion=$env:VCToolsVersion; windowsSdkVersion=$env:WindowsSDKVersion; tools=$tools; os=$os.Caption; osVersion=$os.Version; osBuild=$os.BuildNumber; totalMemoryKiB=$os.TotalVisibleMemorySize; freeMemoryKiB=$os.FreePhysicalMemory; runnerImage=$env:ImageVersion; workflowSha=$env:GITHUB_SHA } | ConvertTo-Json -Depth 6 | Set-Content -LiteralPath "$q/host.json" -Encoding utf8 + cmake --version + if ($LASTEXITCODE -ne 0) { throw 'CMake unavailable' } + ninja --version + if ($LASTEXITCODE -ne 0) { throw 'Ninja unavailable' } + python --version + if ($LASTEXITCODE -ne 0) { throw 'Python unavailable' } timeout-minutes: 5 - name: sde timeout-minutes: 5 diff --git a/.github/workflows/readiness-release-qualification.yml b/.github/workflows/readiness-release-qualification.yml index 5b8f694f0..8af1d6f7a 100644 --- a/.github/workflows/readiness-release-qualification.yml +++ b/.github/workflows/readiness-release-qualification.yml @@ -134,28 +134,28 @@ jobs: timeout-minutes: 5 - name: sde timeout-minutes: 5 - run: python harness/.github/scripts/qualify-full-windows.py sde --source product --root "$env:QUAL_ROOT" --source-sha - d90b86e42fd586a56d53f077bbca6a457200d9bd + run: |- + python harness/.github/scripts/qualify-full-windows.py sde --source product --root "$env:QUAL_ROOT" --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd - name: graphics timeout-minutes: 10 - run: python harness/.github/scripts/qualify-full-windows.py graphics --source product --root "$env:QUAL_ROOT" - --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd + run: |- + python harness/.github/scripts/qualify-full-windows.py graphics --source product --root "$env:QUAL_ROOT" --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd - name: configure timeout-minutes: 15 - run: python harness/.github/scripts/qualify-full-windows.py configure --source product --root "$env:QUAL_ROOT" - --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd + run: |- + python harness/.github/scripts/qualify-full-windows.py configure --source product --root "$env:QUAL_ROOT" --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd - name: build timeout-minutes: 120 - run: python harness/.github/scripts/qualify-full-windows.py build --source product --root "$env:QUAL_ROOT" - --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd + run: |- + python harness/.github/scripts/qualify-full-windows.py build --source product --root "$env:QUAL_ROOT" --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd - name: test timeout-minutes: 80 - run: python harness/.github/scripts/qualify-full-windows.py test --source product --root "$env:QUAL_ROOT" - --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd + run: |- + python harness/.github/scripts/qualify-full-windows.py test --source product --root "$env:QUAL_ROOT" --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd - name: pack timeout-minutes: 10 - run: python harness/.github/scripts/qualify-full-windows.py pack --source product --root "$env:QUAL_ROOT" - --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd + run: |- + python harness/.github/scripts/qualify-full-windows.py pack --source product --root "$env:QUAL_ROOT" --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd if: ${{ always() && env.QUAL_ROOT != '' }} - name: Retain bounded text proof if: ${{ always() && env.QUAL_ROOT != '' }} diff --git a/.github/workflows/sde-extraction-preflight.yml b/.github/workflows/sde-extraction-preflight.yml index ddfe4c3c2..512eff7de 100644 --- a/.github/workflows/sde-extraction-preflight.yml +++ b/.github/workflows/sde-extraction-preflight.yml @@ -107,8 +107,8 @@ jobs: @{ sourceSha=$actual.Trim(); workflowSha=$env:GITHUB_SHA; runId=$env:GITHUB_RUN_ID; runAttempt=$env:GITHUB_RUN_ATTEMPT; os=$os.Caption; osVersion=$os.Version; pythonPath=$python; pythonSha256=(Get-FileHash -LiteralPath $python -Algorithm SHA256).Hash.ToLowerInvariant(); scope='SDE setup only; no engine compilation or CPU-floor test' } | ConvertTo-Json -Depth 4 | Set-Content -LiteralPath "$env:QUAL_ROOT/host.json" -Encoding utf8 - name: sde timeout-minutes: 5 - run: python harness/.github/scripts/qualify-full-windows.py sde --source product --root "$env:QUAL_ROOT" --source-sha - d90b86e42fd586a56d53f077bbca6a457200d9bd + run: |- + python harness/.github/scripts/qualify-full-windows.py sde --source product --root "$env:QUAL_ROOT" --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd - name: Require extracted executable and metadata timeout-minutes: 1 run: | @@ -127,8 +127,8 @@ jobs: @{ passed=$true; sourceSha='d90b86e42fd586a56d53f077bbca6a457200d9bd'; workflowSha=$env:GITHUB_SHA; runId=$env:GITHUB_RUN_ID; runAttempt=$env:GITHUB_RUN_ATTEMPT; sdePath=$exe.FullName; sdeBytes=$exe.Length; sdeSha256=$imageHash; verifiedArchiveSha256='74e626ede09b0baa5011fc9e51b58627ea92c3fc0bae5fd7db34b490f335f651'; scope='setup only' } | ConvertTo-Json | Set-Content -LiteralPath "$env:QUAL_ROOT/sde-probe-result.json" -Encoding utf8 - name: pack timeout-minutes: 10 - run: python harness/.github/scripts/qualify-full-windows.py pack --source product --root "$env:QUAL_ROOT" - --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd + run: |- + python harness/.github/scripts/qualify-full-windows.py pack --source product --root "$env:QUAL_ROOT" --source-sha d90b86e42fd586a56d53f077bbca6a457200d9bd if: ${{ always() && env.QUAL_ROOT != '' }} - name: Retain bounded text proof if: ${{ always() && env.QUAL_ROOT != '' }} diff --git a/CHANGELOG.md b/CHANGELOG.md index d04e625df..d982b523c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `Spark/PersistedSchema.h` (public SDK): `ModulePersistedSchema` lets each game module declare the schema version of its save custom state, with the same read-N-and-N-1 rule; SparkGameFPS declares and uses it for its local profile. - `tools/release_notes.py` (REL-190) renders the stable release body from the `stable-v1` profile in `docs/site/readiness.json`, this file's single `## [X.Y.Z]` section (a `### Migration` subsection becomes the notes' Migrations section), the frozen `SHA256SUMS`, and fixed checksum, signature, SBOM and provenance verification instructions. It fails closed on a missing or duplicated version section, an empty or inconsistent `SHA256SUMS`, or a missing SBOM or signature control asset; nightly releases keep their short body. No stable release has been published with it. +### Fixed +- First material saves create missing asset directories, use native filesystem paths for UTF-8 filenames on Windows, and retain the unsaved state when writing or closing the file fails. +- Per-user MSI qualification explicitly quotes the empty `ALLUSERS` property so Windows Installer cannot consume the next property as its value. WiX packaging requires CMake 4.3, which implements per-user installation, while token and ownership checks remain enforced. +- The external console prints a pipe-mode command prompt on startup and after Enter, rather than appending another prompt every 100 milliseconds while idle. Prompts stay off the engine command channel. +- Cross-platform release qualification now uses the ECS entity type consistently in AI, removes a test-only `World` ODR conflict, reports completed OpenGL editor frames, wires Hierarchy and Inspector document selection outside the Windows graphics path, and gives Windows GUI smoke children explicit inherited capture handles. +- Generic Shift/Ctrl/Alt queries now include either physical side while retaining side-specific state and frame edges. The Win32 host resolves modifier sides from event metadata and forwards system-key messages, including Alt. +- Windows package reconciliation recognizes runtime notices through the existing package coverage rules and requires redistribution terms and coverage of every shipped runtime DLL. +- The MSVC libsodium CPU floor now uses the compiler target architecture when Windows omits the system processor, keeping above-floor variants disabled without weakening the native runtime assertions. +- Newly opened editor panels use their declared initial size, so Play Control and other wrapped-text panels do not collapse into unreadable strips; saved layouts remain authoritative. + ### Removed - `EngineContext::InitializeAll`/`ShutdownAll` and the R1.2 dependency registry that only they used (`RegisterSubsystem`, `DependsOn`, `SubsystemEntry`, `GetInitOrder`, `GetSubsystemCount`, `HasLifecycleFailure`, `EngineSetup::RegisterCoreSubsystems`), per owner decision OD-01: `EngineRuntime` is the single owner of subsystem lifecycle and `LifecycleCompositionRoot` orders it. The two `IEngineContext` virtuals went with them, so `SPARK_SDK_VERSION` is 5 and `EngineContextVirtualCount` is 88; game modules must be rebuilt against the v5 SDK (v4 modules are refused by the exact-match ABI check). The `engine_subsystems` console command no longer prints a registered-entry count, and the `LifecyclePartialInit` CTest (which drove only the removed registry) is gone; `LifecycleCompositionRootFailure` covers partial-init rollback. diff --git a/CLAUDE.md b/CLAUDE.md index c236582cf..1d6d0c257 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -163,7 +163,7 @@ SparkConsole/src/ — Standalone console application SparkShaderCompiler/src/ — Shader compilation tool SparkSDK/ — Public SDK/interface headers FuzzerTests/ — libFuzzer harnesses, corpora, fuzz policy (separate from Tests/) -Tests/ — 8530 test definitions across 738 files, CTest +Tests/ — 8563 test definitions across 741 files, CTest ``` NullRHIDevice automatically activates when no GPU backend is available — engine continues in headless mode. GLAD (OpenGL loader) and SDL2 are bundled in `ThirdParty/`. SDL2 requires `libgl-dev` before CMake configure on Linux. diff --git a/CMakeLists.txt b/CMakeLists.txt index 15866b16e..0c9e4ffc2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2998,11 +2998,16 @@ include(CMakePackageConfigHelpers) # Export it once, split by artifact kind, rather than layering duplicate install # rules over SDL's upstream no-component installation. if(TARGET SDL2 AND EXISTS "${SDL2_SUBMODULE_DIR}/include") + if(UNIX) + # The SDK's regular developer-name copy must match the runtime image + # byte for byte, including the installed shared-library search path. + set_property(TARGET SDL2 PROPERTY BUILD_WITH_INSTALL_RPATH ON) + endif() install(TARGETS SDL2 EXPORT SparkSDL2Targets RUNTIME DESTINATION bin COMPONENT ${SPARK_INSTALL_COMPONENT_RUNTIME} LIBRARY DESTINATION lib COMPONENT ${SPARK_INSTALL_COMPONENT_RUNTIME} - NAMELINK_COMPONENT ${SPARK_INSTALL_COMPONENT_SDK} + NAMELINK_SKIP ARCHIVE DESTINATION lib COMPONENT ${SPARK_INSTALL_COMPONENT_SDK} FRAMEWORK DESTINATION lib COMPONENT ${SPARK_INSTALL_COMPONENT_RUNTIME} INCLUDES DESTINATION include include/SDL2 @@ -3035,6 +3040,30 @@ if(TARGET SDL2 AND EXISTS "${SDL2_SUBMODULE_DIR}/include") endif() ]] COMPONENT ${SPARK_INSTALL_COMPONENT_RUNTIME}) + + # CPack stages components separately. Its SDK staging root cannot + # dereference a namelink whose concrete library belongs to runtime. + # Install the same built image under only its developer name instead. + # Remove a legacy in-prefix namelink before copying, refusing escapes. + install(CODE " + set(_spark_sdl2_libdir \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/lib\") + set(_spark_sdl2_sdk_entry \"\${_spark_sdl2_libdir}/$\") + if(IS_SYMLINK \"\${_spark_sdl2_sdk_entry}\") + file(REAL_PATH \"\${_spark_sdl2_libdir}\" _spark_sdl2_real_libdir) + file(REAL_PATH \"\${_spark_sdl2_sdk_entry}\" _spark_sdl2_resolved) + file(RELATIVE_PATH _spark_sdl2_relative + \"\${_spark_sdl2_real_libdir}\" \"\${_spark_sdl2_resolved}\") + if(_spark_sdl2_relative MATCHES \"^\\\\.\\\\.(/|$)\") + message(FATAL_ERROR + \"SDL2 install link escapes its library directory: \${_spark_sdl2_sdk_entry}\") + endif() + file(REMOVE \"\${_spark_sdl2_sdk_entry}\") + endif() + " COMPONENT ${SPARK_INSTALL_COMPONENT_SDK}) + install(FILES "$" + DESTINATION lib + RENAME "$" + COMPONENT ${SPARK_INSTALL_COMPONENT_SDK}) endif() install(EXPORT SparkSDL2Targets FILE SDL2Targets.cmake diff --git a/FuzzerTests/CMakeLists.txt b/FuzzerTests/CMakeLists.txt index 6063eb3e6..a00de15ae 100644 --- a/FuzzerTests/CMakeLists.txt +++ b/FuzzerTests/CMakeLists.txt @@ -2906,6 +2906,55 @@ set_tests_properties(FuzzMaterialLoaderSmoke PROPERTIES WORKING_DIRECTORY "${SPARK_FUZZ_PROJECT_ROOT}" ) +# The editor .spkmat format uses its UI-free production decoder and shared PBR schema. +add_executable(SparkFuzzMaterialEditorFiles + FuzzMaterialEditorFiles.cpp + FuzzMaterialEditorFilesProduction.cpp + "${SPARK_FUZZ_PROJECT_ROOT}/SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp" + "${SPARK_FUZZ_PROJECT_ROOT}/SparkEditor/Source/Panels/MaterialEditorDefaults.cpp" +) +set_source_files_properties( + FuzzMaterialEditorFilesProduction.cpp + "${SPARK_FUZZ_PROJECT_ROOT}/SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp" + "${SPARK_FUZZ_PROJECT_ROOT}/SparkEditor/Source/Panels/MaterialEditorDefaults.cpp" + PROPERTIES COMPILE_OPTIONS "-stdlib=libc++" +) +target_include_directories(SparkFuzzMaterialEditorFiles PRIVATE + "${SPARK_FUZZ_PROJECT_ROOT}/SparkEditor/Source" +) +target_compile_features(SparkFuzzMaterialEditorFiles PRIVATE cxx_std_23) +target_compile_definitions(SparkFuzzMaterialEditorFiles PRIVATE SPARK_SHIPPING=1) +target_compile_options(SparkFuzzMaterialEditorFiles PRIVATE + -fsanitize=fuzzer,address,undefined + -fno-sanitize-recover=undefined + -fno-omit-frame-pointer + -O1 + -ffunction-sections + -fdata-sections +) +target_link_options(SparkFuzzMaterialEditorFiles PRIVATE + -fsanitize=fuzzer,address,undefined + -fno-sanitize-recover=undefined + -fno-omit-frame-pointer + -Wl,--gc-sections +) +target_link_libraries(SparkFuzzMaterialEditorFiles PRIVATE Threads::Threads c++ c++abi) + +add_test( + NAME FuzzMaterialEditorFilesSmoke + COMMAND $ + -max_len=65536 + -timeout=1 + -rss_limit_mb=256 + -runs=8 + "${SPARK_FUZZ_PROJECT_ROOT}/FuzzerTests/corpora/material-editor-files" +) +set_tests_properties(FuzzMaterialEditorFilesSmoke PROPERTIES + LABELS "fuzz;fuzz-smoke;security" + TIMEOUT 10 + WORKING_DIRECTORY "${SPARK_FUZZ_PROJECT_ROOT}" +) + # EngineSettings::Load runs on settings.ini and its settings.local.ini override at # every engine start. ConfigParser.cpp is the INI reader it stages through; the # settings_* console commands live in EngineSettingsConsole.cpp, which is not linked, diff --git a/FuzzerTests/FuzzMaterialEditorFiles.cpp b/FuzzerTests/FuzzMaterialEditorFiles.cpp new file mode 100644 index 000000000..fc1510921 --- /dev/null +++ b/FuzzerTests/FuzzMaterialEditorFiles.cpp @@ -0,0 +1,19 @@ +/** @file FuzzMaterialEditorFiles.cpp + * @brief LibFuzzer entry for the editor's production .spkmat decoder. + */ +#include "FuzzMaterialEditorFilesProduction.h" +constexpr uint32_t SPARK_FUZZ_MAX_DEPTH = 1; +constexpr std::size_t SPARK_FUZZ_MAX_INPUT_BYTES = 65536; +static_assert(SPARK_FUZZ_MAX_DEPTH == 1); +extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) +{ + if (size > SPARK_FUZZ_MAX_INPUT_BYTES) + { + return 0; + } + if (data == nullptr && size != 0) + { + return 0; + } + return SparkFuzzParseMaterialEditorFiles(data, size); +} diff --git a/FuzzerTests/FuzzMaterialEditorFilesProduction.cpp b/FuzzerTests/FuzzMaterialEditorFilesProduction.cpp new file mode 100644 index 000000000..c98899c25 --- /dev/null +++ b/FuzzerTests/FuzzMaterialEditorFilesProduction.cpp @@ -0,0 +1,98 @@ +/** @file FuzzMaterialEditorFilesProduction.cpp + * @brief Exercise the shipped .spkmat decoder and shared authoring defaults. + */ +#include "FuzzMaterialEditorFilesProduction.h" +#include "Panels/MaterialEditorMaterialParser.h" +#include "Panels/MaterialEditorPanel.h" +#include +#include +#include +#include + +namespace +{ + void Require(bool condition) + { + if (!condition) + { + std::abort(); + } + } + + bool SameDefinition(const SparkEditor::MaterialDefinition& a, const SparkEditor::MaterialDefinition& b) + { + if (a.name != b.name || a.shaderPath != b.shaderPath || a.filePath != b.filePath || + a.parameters.size() != b.parameters.size() || a.textureSlots.size() != b.textureSlots.size()) + { + return false; + } + for (size_t index = 0; index < a.parameters.size(); ++index) + { + const auto& x = a.parameters[index]; + const auto& y = b.parameters[index]; + if (x.name != y.name || x.type != y.type || x.intValue != y.intValue || x.boolValue != y.boolValue || + x.texturePath != y.texturePath || std::memcmp(x.floatValues, y.floatValues, sizeof(x.floatValues)) != 0) + { + return false; + } + } + for (size_t index = 0; index < a.textureSlots.size(); ++index) + { + const auto& x = a.textureSlots[index]; + const auto& y = b.textureSlots[index]; + if (x.name != y.name || x.bindSlot != y.bindSlot || x.texturePath != y.texturePath || + x.isAssigned != y.isAssigned || x.tilingU != y.tilingU || x.tilingV != y.tilingV || + x.offsetU != y.offsetU || x.offsetV != y.offsetV) + { + return false; + } + } + const auto& x = a.renderState; + const auto& y = b.renderState; + return x.blendMode == y.blendMode && x.cullMode == y.cullMode && x.depthWrite == y.depthWrite && + x.depthTest == y.depthTest && x.castShadows == y.castShadows && x.receiveShadows == y.receiveShadows && + x.alphaClipThreshold == y.alphaClipThreshold && x.renderQueue == y.renderQueue; + } +} // namespace + +extern "C" int SparkFuzzParseMaterialEditorFiles(const uint8_t* data, std::size_t size) +{ + if (size > 65536 || (data == nullptr && size != 0)) + { + return 0; + } + const std::string_view input(data ? reinterpret_cast(data) : "", size); + SparkEditor::MaterialDefinition first, second; + first.name = second.name = "retained"; + first.shaderPath = second.shaderPath = "Shaders/Retained.hlsl"; + first.filePath = second.filePath = "retained.spkmat"; + const auto original = first; + const bool accepted = SparkEditor::ParseMaterialText(input, first); + Require(SparkEditor::ParseMaterialText(input, second) == accepted); + Require(SameDefinition(first, second)); + if (!accepted) + { + Require(SameDefinition(first, original)); + return 0; + } + Require(!first.name.empty() && !first.shaderPath.empty() && first.filePath == original.filePath); + Require(!first.isModified && !first.isBuiltIn); + Require(static_cast(first.renderState.blendMode) >= 0 && static_cast(first.renderState.blendMode) <= 4); + Require(static_cast(first.renderState.cullMode) >= 0 && static_cast(first.renderState.cullMode) <= 2); + Require(std::isfinite(first.renderState.alphaClipThreshold)); + for (const auto& parameter : first.parameters) + { + for (float value : parameter.floatValues) + { + Require(std::isfinite(value)); + } + } + for (const auto& slot : first.textureSlots) + { + Require(slot.bindSlot >= 0 && slot.isAssigned == !slot.texturePath.empty()); + Require(std::isfinite(slot.tilingU) && std::isfinite(slot.tilingV) && std::isfinite(slot.offsetU) && + std::isfinite(slot.offsetV)); + } + Require(first.FindTextureSlot("Ambient Occlusion") != nullptr); + return 0; +} diff --git a/FuzzerTests/FuzzMaterialEditorFilesProduction.h b/FuzzerTests/FuzzMaterialEditorFilesProduction.h new file mode 100644 index 000000000..af4d584b5 --- /dev/null +++ b/FuzzerTests/FuzzMaterialEditorFilesProduction.h @@ -0,0 +1,4 @@ +#pragma once +#include +#include +extern "C" int SparkFuzzParseMaterialEditorFiles(const uint8_t* data, std::size_t size); diff --git a/FuzzerTests/Replay/CMakeLists.txt b/FuzzerTests/Replay/CMakeLists.txt index 35a3414b3..093ab31ac 100644 --- a/FuzzerTests/Replay/CMakeLists.txt +++ b/FuzzerTests/Replay/CMakeLists.txt @@ -44,6 +44,19 @@ add_executable(SparkFuzzReplayArchive FuzzReplayMain.cpp "${_spark_fuzz_dir}/FuzzArchive.cpp" "${_spark_fuzz_dir}/FuzzArchiveProduction.cpp") spark_fuzz_replay_test(SparkFuzzReplayArchive sparkpak-reader LIBRARIES SparkEngineLib) +# The editor material parser is UI-free but lives outside SparkEngineLib. Compile +# the shipped parser and shared PBR schema directly so every committed .spkmat +# seed also runs in normal MSVC/GCC/Clang builds. +add_executable(SparkFuzzReplayMaterialEditorFiles FuzzReplayMain.cpp + "${_spark_fuzz_dir}/FuzzMaterialEditorFiles.cpp" + "${_spark_fuzz_dir}/FuzzMaterialEditorFilesProduction.cpp" + "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp" + "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Panels/MaterialEditorDefaults.cpp") +target_include_directories(SparkFuzzReplayMaterialEditorFiles PRIVATE + "${CMAKE_SOURCE_DIR}/SparkEditor/Source") +target_compile_definitions(SparkFuzzReplayMaterialEditorFiles PRIVATE SPARK_SHIPPING=1) +spark_fuzz_replay_test(SparkFuzzReplayMaterialEditorFiles material-editor-files) + # The crash reporter is its own executable, so its manifest parser is compiled # in exactly as SparkCrashReporterManifestTests compiles it. set(_spark_crash_reporter_src "${CMAKE_SOURCE_DIR}/SparkCrashReporter/src") diff --git a/FuzzerTests/corpora/material-editor-files/all-types.spkmat b/FuzzerTests/corpora/material-editor-files/all-types.spkmat new file mode 100644 index 000000000..b33643738 --- /dev/null +++ b/FuzzerTests/corpora/material-editor-files/all-types.spkmat @@ -0,0 +1,17 @@ +name: Typed +shader: Shaders/Typed.hlsl +param scalar float 0.25 +param uv float2 2 3 +param direction float3 1 2 3 +param vector float4 1 2 3 4 +param tint color 0.1 0.2 0.3 1 +param integer int 17 +param switch bool true +param image texture2d Textures/base color.png +param cube texturecube Textures/sky cube.dds +param transform matrix4x4 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 +texture_slot Ambient Occlusion 4 Textures/ao map.png 2 3 0.1 0.2 +blend_mode 1 +cull_mode 2 +alpha_clip 0.25 +render_queue 2700 diff --git a/FuzzerTests/corpora/material-editor-files/default-pbr.spkmat b/FuzzerTests/corpora/material-editor-files/default-pbr.spkmat new file mode 100644 index 000000000..1b6c553f2 --- /dev/null +++ b/FuzzerTests/corpora/material-editor-files/default-pbr.spkmat @@ -0,0 +1,35 @@ +# SparkEngine Material +name: PR616_FinalMaterial +shader: Shaders/PR616_QA.hlsl + +# Parameters +param albedoColor color 0.8 0.8 0.8 1 +param metallic float 0 +param roughness float 0.248 +param opacity float 1 +param normalStrength float 1 +param emissionColor color 0 0 0 1 +param emissionIntensity float 0 +param aoStrength float 1 +param detailTiling float2 1 1 +param useDetailMap bool false + +# Texture Slots +texture_slot Albedo 0 none 1 1 0 0 +texture_slot Normal 1 none 1 1 0 0 +texture_slot Metallic 2 none 1 1 0 0 +texture_slot Roughness 3 none 1 1 0 0 +texture_slot Ambient Occlusion 4 none 1 1 0 0 +texture_slot Emission 5 none 1 1 0 0 +texture_slot Height 6 none 1 1 0 0 +texture_slot Detail 7 none 1 1 0 0 + +# Render State +blend_mode 0 +cull_mode 0 +depth_write true +depth_test true +cast_shadows true +receive_shadows true +alpha_clip 0.5 +render_queue 2000 diff --git a/FuzzerTests/corpora/material-editor-files/duplicate-slot.spkmat b/FuzzerTests/corpora/material-editor-files/duplicate-slot.spkmat new file mode 100644 index 000000000..02bee9e09 --- /dev/null +++ b/FuzzerTests/corpora/material-editor-files/duplicate-slot.spkmat @@ -0,0 +1,4 @@ +name: Invalid +shader: Shaders/QA.hlsl +texture_slot Ambient Occlusion 4 none 1 1 0 0 +texture_slot Ambient Occlusion 4 none 1 1 0 0 diff --git a/FuzzerTests/corpora/material-editor-files/embedded-nul.spkmat b/FuzzerTests/corpora/material-editor-files/embedded-nul.spkmat new file mode 100644 index 000000000..64f0d6d2b Binary files /dev/null and b/FuzzerTests/corpora/material-editor-files/embedded-nul.spkmat differ diff --git a/FuzzerTests/corpora/material-editor-files/invalid-bind.spkmat b/FuzzerTests/corpora/material-editor-files/invalid-bind.spkmat new file mode 100644 index 000000000..eb051185a --- /dev/null +++ b/FuzzerTests/corpora/material-editor-files/invalid-bind.spkmat @@ -0,0 +1,3 @@ +name: Invalid +shader: Shaders/QA.hlsl +texture_slot Ambient Occlusion -1 none 1 1 0 0 diff --git a/FuzzerTests/corpora/material-editor-files/invalid-enum.spkmat b/FuzzerTests/corpora/material-editor-files/invalid-enum.spkmat new file mode 100644 index 000000000..cd69a0529 --- /dev/null +++ b/FuzzerTests/corpora/material-editor-files/invalid-enum.spkmat @@ -0,0 +1,3 @@ +name: Invalid +shader: Shaders/QA.hlsl +blend_mode 99 diff --git a/FuzzerTests/corpora/material-editor-files/missing-fields.spkmat b/FuzzerTests/corpora/material-editor-files/missing-fields.spkmat new file mode 100644 index 000000000..7fb60f71d --- /dev/null +++ b/FuzzerTests/corpora/material-editor-files/missing-fields.spkmat @@ -0,0 +1 @@ +param roughness float 0.25 diff --git a/FuzzerTests/corpora/material-editor-files/nonfinite.spkmat b/FuzzerTests/corpora/material-editor-files/nonfinite.spkmat new file mode 100644 index 000000000..968a21c09 --- /dev/null +++ b/FuzzerTests/corpora/material-editor-files/nonfinite.spkmat @@ -0,0 +1,3 @@ +name: Invalid +shader: Shaders/QA.hlsl +param roughness float nan diff --git a/FuzzerTests/policy/test_fuzz_policy.py b/FuzzerTests/policy/test_fuzz_policy.py index d21fcc3fb..daf44b169 100644 --- a/FuzzerTests/policy/test_fuzz_policy.py +++ b/FuzzerTests/policy/test_fuzz_policy.py @@ -150,6 +150,7 @@ def _shallow_history_allowed() -> bool: "SparkFuzzRTSPersistence", "SparkFuzzOrchestratorIdentity", "SparkFuzzMaterialLoader", + "SparkFuzzMaterialEditorFiles", "SparkFuzzEngineSettings", "SparkFuzzVirtualFileSystem", "SparkFuzzEntityArchetype", diff --git a/GameModules/SparkGameFPS/README.md b/GameModules/SparkGameFPS/README.md index 3f9ac584c..8e0ab3a9e 100644 --- a/GameModules/SparkGameFPS/README.md +++ b/GameModules/SparkGameFPS/README.md @@ -68,7 +68,8 @@ the working directory does not select a different startup scene. The host's `-sc preview mode is separate and does not run the FPS module. The current adapter supports root entities with unique nonempty names, each containing -a Transform and either an OBJ MeshRenderer or the single main perspective Camera. +a Transform and exactly one OBJ MeshRenderer, the single main perspective Camera, +or a supported SpawnPointComponent. At least one mesh and one main camera remain required. Meshes must use the default material and default rendering flags, with OBJ references inside the packaged project. Transforms, camera FOV and supported clipping values are preserved. Hierarchy, other components, explicit materials, unsupported settings and @@ -76,6 +77,16 @@ missing or invalid meshes are rejected rather than silently replaced. See [the reflected startup contract](../../wiki/subsystems/Scene-Management.md#reflected-startup-scenes-in-fps) for the exact camera limits and loading behavior. +Player spawn points support `spawnTag="default"`, `enabled=true`, `teamID=0`, +`spawnRadius=0`, `respawnDelay=0`, and `maxConcurrent=-1`. Their priority, position +and facing are preserved; they require root transforms, unit scale, supported pitch +[-89,89], and at most 32 points. F11 match start and player respawn use the existing +highest-priority selector, keeping its first-stored tie behavior. The component +delay is a point-reuse cooldown; it does not replace the player's death-to-respawn +timer. Other spawn settings, including `wave_spawn`, reject the scene. In particular, +the component's default radius 1 and cooldown 5 need explicit authoring changes. +This support does not establish a playable arena, collision fidelity or a completed match. + Only an absent `Startup.sparkscene` permits the legacy `Assets/Scenes/level1.scene` startup. A present unreadable, malformed or unsupported scene fails module initialization; neither a `.bak` scene nor a placeholder mesh substitutes for it. The separate headless diff --git a/GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.cpp b/GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.cpp index ec142cf7c..bd994675f 100644 --- a/GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.cpp +++ b/GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.cpp @@ -1,6 +1,6 @@ #include "Core/EngineWeatherAdapter.h" -#include "Graphics/WeatherSystem.h" +#include namespace SparkGameFPS { @@ -9,27 +9,28 @@ namespace SparkGameFPS if (!m_weather) return false; - Spark::WeatherType enginePreset = Spark::WeatherType::Clear; + Spark::WeatherPreset enginePreset = Spark::WeatherPreset::Clear; switch (preset) { case WeatherPreset::Clear: - enginePreset = Spark::WeatherType::Clear; + enginePreset = Spark::WeatherPreset::Clear; break; case WeatherPreset::Rain: - enginePreset = Spark::WeatherType::Rain; + enginePreset = Spark::WeatherPreset::Rain; break; case WeatherPreset::Snow: - enginePreset = Spark::WeatherType::Snow; + enginePreset = Spark::WeatherPreset::Snow; break; case WeatherPreset::Fog: - enginePreset = Spark::WeatherType::Fog; + enginePreset = Spark::WeatherPreset::Fog; break; case WeatherPreset::Storm: - enginePreset = Spark::WeatherType::Storm; + enginePreset = Spark::WeatherPreset::Storm; break; + default: + return false; } - m_weather->SetWeather(enginePreset, intensity, transitionSeconds); - return true; + return m_weather->SetWeather(enginePreset, intensity, transitionSeconds); } } // namespace SparkGameFPS diff --git a/GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.h b/GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.h index 5aa66cf3f..258fdf885 100644 --- a/GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.h +++ b/GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.h @@ -4,22 +4,22 @@ namespace Spark { - class WeatherSystem; + class IWeatherService; } namespace SparkGameFPS { - /// Non-owning Core/Main adapter from the engine weather implementation to + /// Non-owning Core/Main adapter from the public SDK weather service to /// the module-owned weather vocabulary. class EngineWeatherAdapter final : public IFPSWeatherPort { public: - explicit EngineWeatherAdapter(Spark::WeatherSystem* weather) : m_weather(weather) {} + explicit EngineWeatherAdapter(Spark::IWeatherService* weather) : m_weather(weather) {} - /// [game thread] Forwards the module vocabulary to the engine weather system. + /// [game thread] Forwards the module vocabulary to the public SDK weather service. bool SetWeather(WeatherPreset preset, float intensity, float transitionSeconds) override; private: - Spark::WeatherSystem* m_weather{nullptr}; + Spark::IWeatherService* m_weather{nullptr}; }; } // namespace SparkGameFPS diff --git a/GameModules/SparkGameFPS/Source/Core/Main.cpp b/GameModules/SparkGameFPS/Source/Core/Main.cpp index b4c764a90..38911ab3c 100644 --- a/GameModules/SparkGameFPS/Source/Core/Main.cpp +++ b/GameModules/SparkGameFPS/Source/Core/Main.cpp @@ -34,7 +34,7 @@ #include "Engine/SaveSystem/SaveSystem.h" #include "Engine/Cinematic/Sequencer.h" #include "Engine/Replay/ReplaySystem.h" -#include "Utils/InvalidStateDetector.h" +#include #include #include @@ -279,59 +279,64 @@ bool SparkGameModule::InitializeFromContext() } // Register game-specific console commands - m_weatherAdapter = std::make_unique(m_context->GetWeather()); + m_weatherAdapter = std::make_unique(m_context->GetWeatherService()); g_game->SetWeatherPort(m_weatherAdapter.get()); RegisterGameConsoleCommands(); - // Register FPS-specific state validation rules on the HOST's detector. - // SparkEngineLib is linked statically into this DLL, so - // InvalidStateDetector::GetInstance() here is a module-local copy the host - // never ticks: rules registered on it would never run and the module would - // report validation it does not have. - Spark::InvalidStateDetector* hostDetector = m_context ? m_context->GetInvalidStateDetector() : nullptr; - if (!hostDetector) + // The host service retains rules registered before its detector starts. + // This optional capability must never fall back to a DLL-local singleton. + Spark::IStateValidation* stateDetector = m_context ? m_context->GetStateValidation() : nullptr; + if (!stateDetector) { - FPS_LOG_WARN("SparkGameFPS: host exposes no InvalidStateDetector; FPS state rules are not registered"); + FPS_LOG_WARN("SparkGameFPS: host exposes no IStateValidation; FPS state rules are not registered"); m_initialized = true; Spark::ModuleLog::Info(m_context, "SparkGameFPS module initialized"); return true; } - Spark::InvalidStateDetector& stateDetector = *hostDetector; // The FPS actors are GameObjects with their own health, not ECS entities, so // these rules inspect the module's own state. Rules are removed in Shutdown() // before g_game is destroyed, so reading the global here stays safe. - stateDetector.AddRule({"FPS.DeadPlayerMoving", "FPS", Spark::StateViolationSeverity::Error, true, - [](World&, std::vector& out) - { - const Player* player = g_game ? g_game->GetPlayer() : nullptr; - if (!player) - return; - const DirectX::XMFLOAT3 velocity = player->GetVelocity(); - if (Spark::FPSStateRules::DeadActorIsMoving(player->GetHealth(), velocity.x, velocity.z)) - { - out.push_back({"FPS.DeadPlayerMoving", 0u, "Dead player still moving horizontally", - Spark::StateViolationSeverity::Error}); - } - }}); - - stateDetector.AddRule( - {"FPS.DeadEnemyActive", "FPS", Spark::StateViolationSeverity::Error, true, - [](World&, std::vector& out) - { - if (!g_game) - return; - uint32_t index = 0; - for (const Enemy* enemy : g_game->GetEnemies()) - { - const uint32_t id = index++; - if (enemy && Spark::FPSStateRules::DeadActorStillActive(enemy->GetHealth(), enemy->IsActive())) - { - out.push_back({"FPS.DeadEnemyActive", id, "Dead enemy was never deactivated", - Spark::StateViolationSeverity::Error}); - } - } - }}); + const bool playerRuleRegistered = stateDetector->AddRule( + "FPS.DeadPlayerMoving", "FPS", Spark::StateViolationSeverity::Error, + [](World&, std::vector& out) + { + const Player* player = g_game ? g_game->GetPlayer() : nullptr; + if (!player) + return; + const DirectX::XMFLOAT3 velocity = player->GetVelocity(); + if (Spark::FPSStateRules::DeadActorIsMoving(player->GetHealth(), velocity.x, velocity.z)) + { + out.push_back({"FPS.DeadPlayerMoving", 0u, "Dead player still moving horizontally", + Spark::StateViolationSeverity::Error}); + } + }); + + const bool enemyRuleRegistered = stateDetector->AddRule( + "FPS.DeadEnemyActive", "FPS", Spark::StateViolationSeverity::Error, + [](World&, std::vector& out) + { + if (!g_game) + return; + uint32_t index = 0; + for (const Enemy* enemy : g_game->GetEnemies()) + { + const uint32_t id = index++; + if (enemy && Spark::FPSStateRules::DeadActorStillActive(enemy->GetHealth(), enemy->IsActive())) + { + out.push_back({"FPS.DeadEnemyActive", id, "Dead enemy was never deactivated", + Spark::StateViolationSeverity::Error}); + } + } + }); + + // Validation is optional; report refusal without discarding an accepted sibling rule. + // Shutdown removes this module's FPS category whether one or both calls succeeded. + if (!playerRuleRegistered || !enemyRuleRegistered) + { + FPS_LOG_WARN("SparkGameFPS: host refused FPS state rules (player={}, enemy={})", playerRuleRegistered, + enemyRuleRegistered); + } m_initialized = true; Spark::ModuleLog::Info(m_context, "SparkGameFPS module initialized"); @@ -353,12 +358,10 @@ void SparkGameModule::Shutdown() } } m_registeredConsoleCommands.clear(); - // Same instance the rules were added to; the module-local singleton would - // silently remove nothing and leave the host holding rules that reference - // g_game after it is deleted below. - if (Spark::InvalidStateDetector* hostDetector = m_context ? m_context->GetInvalidStateDetector() : nullptr) + // Release module-owned callbacks before deleting the actors they inspect. + if (Spark::IStateValidation* rules = m_context ? m_context->GetStateValidation() : nullptr) { - hostDetector->RemoveRulesByCategory("FPS"); + rules->RemoveRulesByCategory("FPS"); } if (g_game) diff --git a/GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp b/GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp index 37e3b99a0..16370d18f 100644 --- a/GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp +++ b/GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp @@ -25,13 +25,17 @@ namespace Spark wchar_t buffer[MAX_PATH] = {}; const DWORD length = ::GetModuleFileNameW(nullptr, buffer, static_cast(MAX_PATH)); if (length == 0 || length >= static_cast(MAX_PATH)) + { return {}; + } return std::filesystem::path(buffer, buffer + length).parent_path(); #else std::error_code error; const std::filesystem::path exePath = std::filesystem::read_symlink("/proc/self/exe", error); if (error) + { return {}; + } return exePath.parent_path(); #endif // _WIN32 } @@ -43,10 +47,14 @@ namespace Spark for (const auto& base : searchBases) { if (base.empty()) + { continue; + } const std::filesystem::path candidate = base / "Assets"; if (std::filesystem::is_directory(candidate / "Models", error)) + { return candidate; + } } return {}; } @@ -81,10 +89,14 @@ namespace Spark std::string startupError; ResolveStartupScene(startup, present, startupError); if (present) + { return startup.parent_path() / "Assets"; + } std::filesystem::path found = FindAssetRoot(DefaultSearchBases()); if (!found.empty()) + { return found; + } std::error_code error; const std::filesystem::path workingDir = std::filesystem::current_path(error); @@ -121,7 +133,9 @@ namespace Spark const auto status = std::filesystem::symlink_status(resolved, ec); if (status.type() == std::filesystem::file_type::not_found && (!ec || ec == std::errc::no_such_file_or_directory)) + { return true; + } present = true; if (ec || !std::filesystem::is_regular_file(status) || std::filesystem::is_symlink(status)) { @@ -198,9 +212,13 @@ namespace Spark constexpr std::string_view kAssetsScenes = "Assets/Scenes/"; constexpr std::string_view kScenes = "Scenes/"; if (normalized.starts_with(kAssetsScenes)) + { normalized.erase(0, kAssetsScenes.size()); + } else if (normalized.starts_with(kScenes)) + { normalized.erase(0, kScenes.size()); + } const std::u8string relativeU8(reinterpret_cast(normalized.data()), normalized.size()); const std::filesystem::path relative = std::filesystem::u8path(relativeU8); diff --git a/GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h b/GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h index ac03b2a6f..8e04158f0 100644 --- a/GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h +++ b/GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h @@ -21,7 +21,9 @@ namespace SparkGameFPS bool Initialize() { - if (!OnGameThread() || m_initialized) + if (!OnGameThread()) + return false; + if (m_initialized) return m_active; m_initialized = true; @@ -45,7 +47,7 @@ namespace SparkGameFPS m_initialized = false; } - bool IsActive() const { return m_active; } + bool IsActive() const { return OnGameThread() && m_active; } private: bool OnGameThread() const { return std::this_thread::get_id() == m_gameThread; } diff --git a/GameModules/SparkGameFPS/Source/Game/Game.cpp b/GameModules/SparkGameFPS/Source/Game/Game.cpp index 4584d3b1e..8be8a10a3 100644 --- a/GameModules/SparkGameFPS/Source/Game/Game.cpp +++ b/GameModules/SparkGameFPS/Source/Game/Game.cpp @@ -52,7 +52,9 @@ bool Game::ParseAuthoredFiniteFloat(const std::string& text, float& value) // Keep the old from_chars contract without relying on the floating-point // overload, which is unavailable on some libc++ toolchains. if (text.empty() || text.front() == '+' || std::isspace(static_cast(text.front()))) + { return false; + } std::istringstream stream(text); stream.imbue(std::locale::classic()); stream >> std::noskipws >> value; @@ -125,7 +127,9 @@ HRESULT Game::Initialize(GraphicsEngine* graphics, InputManager* input) // filesystem root. Keep the UTF-8 conversion explicit for installed paths // containing non-ASCII characters. if (sceneLoaded) + { BindSceneMaterialRoots(); + } /* Camera ------------------------------------------------*/ m_camera = std::make_unique(); @@ -144,7 +148,9 @@ HRESULT Game::Initialize(GraphicsEngine* graphics, InputManager* input) { const SceneNode* node = m_sceneManager->GetNode(i); if (!node || node->type != "Camera") + { continue; + } const auto projection = node->properties.find("projection"); if (projection != node->properties.end() && projection->second != "perspective") { @@ -152,7 +158,9 @@ HRESULT Game::Initialize(GraphicsEngine* graphics, InputManager* input) continue; } if (!authoredCamera) + { authoredCamera = node; + } const auto main = node->properties.find("isMain"); if (main != node->properties.end() && (main->second == "true" || main->second == "1")) { @@ -169,7 +177,9 @@ HRESULT Game::Initialize(GraphicsEngine* graphics, InputManager* input) float authoredFov = 0.0f; if (fovProperty != authoredCamera->properties.end() && ParseAuthoredFiniteFloat(fovProperty->second, authoredFov) && authoredFov >= 10.0f && authoredFov <= 170.0f) + { m_camera->Console_SetFOV(authoredFov); + } m_camera->Console_SetRotation(authoredCamera->rotation.x, authoredCamera->rotation.y, authoredCamera->rotation.z); @@ -258,13 +268,17 @@ HRESULT Game::Initialize(GraphicsEngine* graphics, InputManager* input) if (m_renderingEnabled) { if (!packagedStartup) + { CreateCombatArena(); + } // Wire up graphics engine on all ModelObjects so they don't need the global for (auto& obj : m_gameObjects) { if (auto* mo = dynamic_cast(obj.get())) + { mo->SetGraphicsEngine(m_graphics); + } } BindSceneMaterialRoots(); } @@ -275,7 +289,9 @@ HRESULT Game::Initialize(GraphicsEngine* graphics, InputManager* input) m_vehicleSystem = std::make_unique(); m_vehicleSystem->Initialize(); if (m_projectilePool) + { m_vehicleSystem->SetProjectilePool(m_projectilePool.get()); + } FPS_CONSOLE("Vehicle system initialized (9 vehicle types, weapons armed)", "SUCCESS"); /* Gravity System -----------------------------------*/ @@ -381,7 +397,9 @@ void Game::LogSceneIdentity(bool sceneLoaded, const std::wstring& scenePath) con void Game::BindSceneMaterialRoots() { if (!m_sceneManager) + { return; + } const std::filesystem::path projectRoot = Spark::FPSAssets::Root().parent_path(); const std::u8string projectRootU8 = projectRoot.u8string(); @@ -392,12 +410,16 @@ void Game::BindSceneMaterialRoots() for (auto& object : m_sceneManager->GetObjects()) { if (object && object->SetMaterialProjectRoot(projectRootUtf8)) + { ++materialRootsBound; + } } for (auto& object : m_gameObjects) { if (object && object->SetMaterialProjectRoot(projectRootUtf8)) + { ++materialRootsBound; + } } } FPS_CONSOLE("Scene and procedural material roots bound for " + std::to_string(materialRootsBound) + @@ -408,28 +430,38 @@ void Game::BindSceneMaterialRoots() void Game::InvalidateSceneBasicMaterials() { if (!m_graphics || !m_sceneManager) + { return; + } const std::filesystem::path projectRoot = Spark::FPSAssets::Root().parent_path(); const std::u8string projectRootU8 = projectRoot.u8string(); const std::string projectRootUtf8(reinterpret_cast(projectRootU8.data()), projectRootU8.size()); if (projectRootUtf8.empty()) + { return; + } std::unordered_set materialPaths; for (const auto& object : m_sceneManager->GetObjects()) { if (object && !object->GetMaterialPath().empty()) + { materialPaths.insert(object->GetMaterialPath()); + } } for (const auto& object : m_gameObjects) { if (object && !object->GetMaterialPath().empty()) + { materialPaths.insert(object->GetMaterialPath()); + } } for (const auto& materialPath : materialPaths) + { m_graphics->InvalidateBasicMaterial(materialPath, projectRootUtf8); + } } /*------------------------------------------------------------- @@ -437,8 +469,11 @@ void Game::InvalidateSceneBasicMaterials() --------------------------------------------------------------*/ void Game::Shutdown() { + EndInputObservation(); if (m_isShutDown) + { return; + } m_isShutDown = true; FPS_CONSOLE("Game::Shutdown called.", "INFO"); @@ -492,10 +527,14 @@ void Game::Shutdown() void Game::SetPhysicsSystem(PhysicsSystem* ps) { if (m_projectilePool) + { m_projectilePool->SetPhysicsSystem(ps); + } // Player may own a separate projectile pool if (m_player && m_player->GetProjectilePool()) + { m_player->GetProjectilePool()->SetPhysicsSystem(ps); + } } /*------------------------------------------------------------- @@ -510,23 +549,31 @@ void Game::SetEventBus(Spark::EventBus* bus) // The respawn system publishes PlayerRespawnEvent, so it needs the same bus. if (m_respawnSystem) + { m_respawnSystem->SetEventBus(bus); + } if (!bus) + { return; + } // Entity killed → update gamemode scoring, quest progress, and HUD kill feed m_eventSubscriptions.emplace_back(bus->Subscribe( [this](const Spark::EntityKilledEvent& e) { if (m_gameMode) + { m_gameMode->RecordKill("Player1", "Enemy"); + } if (m_progression) { int xp = Spark::ProgressionSystem::XP_PER_KILL; if (m_lootSystem && m_lootSystem->HasBuff(Spark::PowerUpType::DoubleXP)) + { xp *= 2; + } m_progression->AwardXP(xp, "kill"); } @@ -584,7 +631,9 @@ void Game::SetEventBus(Spark::EventBus* bus) { const Spark::RespawnPoint& spawn = m_respawnSystem->GetLastRespawnPoint(); if (spawn.position.x == e.spawnX && spawn.position.y == e.spawnY && spawn.position.z == e.spawnZ) + { m_camera->Console_SetRotation(spawn.rotation.x, spawn.rotation.y, spawn.rotation.z); + } } } if (m_player) @@ -616,6 +665,7 @@ void Game::SetEventBus(Spark::EventBus* bus) --------------------------------------------------------------*/ void Game::Update(float dt) { + BeginInputObservation(); if (m_isPaused) { return; @@ -642,20 +692,31 @@ void Game::Update(float dt) dt = 0.0f; } + bool inputUpdateCompleted = false; SPARK_CATCH_ALL("Game", { HandleInput(dt); + RecordInputObservation("dispatch"); UpdateArenaAutopilot(dt); UpdateCamera(dt); UpdateGameObjects(dt); + inputUpdateCompleted = true; }); + if (m_inputObservationEnabled && !inputUpdateCompleted) + { + m_inputObservationFailed = true; + } SPARK_GUARDED_UPDATE("Game:ClassSystem", "Game", { if (m_classSystem) + { m_classSystem->Update(dt); + } }); SPARK_GUARDED_UPDATE("Game:Player", "Game", { if (m_player) + { m_player->Update(dt); + } }); SPARK_GUARDED_UPDATE("Game:Projectiles", "Game", { if (m_projectilePool) @@ -669,27 +730,41 @@ void Game::Update(float dt) // deterministic and is not advanced twice by variable + fixed ticks. SPARK_GUARDED_UPDATE("Game:Interaction", "Game", { if (m_interactionSystem) + { m_interactionSystem->Update(dt, m_player.get()); + } if (m_damageZoneSystem) + { m_damageZoneSystem->Update(dt, m_player.get()); + } if (m_respawnSystem) + { m_respawnSystem->Update(dt); + } }); // Gameplay systems SPARK_GUARDED_UPDATE("Game:WaveSpawner", "Game", { if (m_waveSpawner) + { m_waveSpawner->Update(dt, GetAliveEnemyCount(), this); + } if (m_lootSystem) + { m_lootSystem->Update(dt, m_player.get()); + } }); // Integrated systems SPARK_GUARDED_UPDATE("Game:GameMode", "Game", { if (m_gameMode) + { m_gameMode->Update(dt); + } if (m_hudSystem) + { m_hudSystem->Update(dt); + } Spark::QuestOps::UpdateTimers(m_playerQuests, m_questRegistry, dt); }); @@ -740,7 +815,9 @@ void Game::Update(float dt) // Update networking - process incoming messages, send outgoing state SPARK_GUARDED_UPDATE("Game:Networking", "Game", { if (m_networkInitialized) + { UpdateMultiplayer(dt); + } }); #endif @@ -749,9 +826,13 @@ void Game::Update(float dt) if (m_graphics) { if (auto textureSystem = m_graphics->GetTextureSystem()) + { textureSystem->Update(dt); + } if (auto assetPipeline = m_graphics->GetAssetPipeline()) + { assetPipeline->Update(dt); + } } }); @@ -760,9 +841,12 @@ void Game::Update(float dt) if (m_engineContext) { if (auto* physics = m_engineContext->GetPhysics()) + { physics->Update(dt); + } } }); + RecordInputObservation("complete"); } /*------------------------------------------------------------- @@ -777,7 +861,9 @@ void Game::Render() return; } if (!m_renderingEnabled) + { return; // Device-less host: nothing to draw, and BeginFrame would fail. + } // **CRITICAL: This is the ONLY place BeginFrame/EndFrame should be called** bool frameStarted = false; @@ -874,7 +960,9 @@ void Game::UpdateCamera(float dt) // No logging for per-frame operations FPS_ASSERT(dt >= 0.0f); if (m_camera) + { m_camera->Update(dt); + } } /*-------------------------------------------------------------*/ @@ -883,8 +971,12 @@ void Game::UpdateGameObjects(float dt) // No logging for per-frame operations FPS_ASSERT(dt >= 0.0f); for (auto& obj : m_gameObjects) + { if (obj && obj->IsActive()) + { obj->Update(dt); + } + } } /*------------------------------------------------------------- @@ -930,35 +1022,70 @@ void Game::HandleInput(float) { std::string message; const bool succeeded = savePressed ? QuickSaveProfile(message) : QuickLoadProfile(message); + if (m_inputObservationEnabled) + { + ++m_inputObservationOperation; + m_inputObservationAction = savePressed ? 1 : 2; + m_inputObservationResult = succeeded ? 1 : 0; + RecordInputObservation("operation"); + } if (succeeded) + { FPS_LOG_INFO("{}", message); + } else + { FPS_LOG_WARN("{}", message); + } + } + + if (m_inputObservationEnabled && savePressed && loadPressed) + { + m_inputObservationAction = 3; + RecordInputObservation("operation"); } // Class switching with F5-F10 keys if (m_input->WasKeyPressed(VK_F5)) + { SetPlayerClass(PlayerClass::SCOUT); + } if (m_input->WasKeyPressed(VK_F6)) + { SetPlayerClass(PlayerClass::MEDIC); + } if (m_input->WasKeyPressed(VK_F7)) + { SetPlayerClass(PlayerClass::ENGINEER); + } if (m_input->WasKeyPressed(VK_F8)) + { SetPlayerClass(PlayerClass::RECON); + } if (m_input->WasKeyPressed(VK_F9)) + { SetPlayerClass(PlayerClass::VANGUARD); + } if (m_input->WasKeyPressed(VK_F10)) + { SetPlayerClass(PlayerClass::TITAN); + } // F11 starts or restarts the complete survival loop used by UI and console. if (m_input->WasKeyPressed(VK_F11)) + { StartWaves(); + } // Cycle classes with [ and ] if (m_input->WasKeyPressed(VK_OEM_4)) + { CyclePrevClass(); // [ key + } if (m_input->WasKeyPressed(VK_OEM_6)) + { CycleNextClass(); // ] key + } // Vehicle enter/exit with V key if (m_input->WasKeyPressed('V')) diff --git a/GameModules/SparkGameFPS/Source/Game/Game.h b/GameModules/SparkGameFPS/Source/Game/Game.h index affa0eff7..6cb5ba9be 100644 --- a/GameModules/SparkGameFPS/Source/Game/Game.h +++ b/GameModules/SparkGameFPS/Source/Game/Game.h @@ -645,6 +645,30 @@ class SPARK_GAME_API Game */ void HandleInput(float dt); + // Default-off, read-only observations of actual production input dispatch. + void BeginInputObservation() noexcept; + void RecordInputObservation(const char* phase) noexcept; + void EndInputObservation() noexcept; + bool m_inputObservationChecked = false; + bool m_inputObservationEnabled = false; + bool m_inputObservationFailed = false; + bool m_inputObservationWanted = false; + bool m_inputObservationTransferred = false; + unsigned long long m_inputObservationUpdate = 0; + unsigned long long m_inputObservationOperation = 0; + unsigned int m_inputObservationRecords = 0; + size_t m_inputObservationBytes = 0; + unsigned int m_inputObservationMask = 0; + unsigned int m_inputObservationPreviousMask = ~0u; + unsigned int m_inputObservationStableFrames = 0; + unsigned int m_inputObservationPressed = 0; + unsigned int m_inputObservationReleased = 0; + int m_inputObservationAction = 0; // none/save/load/conflict = 0/1/2/3 + int m_inputObservationResult = -1; + int m_inputObservationReason = 0; // none/missing quicksave = 0/1 + Spark::FPSLocalProfile m_inputObservationTransfer; + + /// @brief Step the arena autopilot when enabled and fire when it is on target. void UpdateArenaAutopilot(float dt); diff --git a/GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp b/GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp index 4dda01e36..0172701df 100644 --- a/GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp +++ b/GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp @@ -425,6 +425,14 @@ void Game::RefreshAuthoredSceneRuntimeState() m_camera->SetPosition(authoredCamera ? authoredCamera->position : DirectX::XMFLOAT3{0.0f, 2.0f, -20.0f}); if (authoredCamera) { + const auto fovProperty = authoredCamera->properties.find("fov"); + float authoredFov = 0.0f; + if (fovProperty != authoredCamera->properties.end() && + ParseAuthoredFiniteFloat(fovProperty->second, authoredFov) && authoredFov >= 10.0f && + authoredFov <= 170.0f) + { + m_camera->Console_SetFOV(authoredFov); + } m_camera->Console_SetRotation(authoredCamera->rotation.x, authoredCamera->rotation.y, authoredCamera->rotation.z); const auto nearProperty = authoredCamera->properties.find("nearPlane"); diff --git a/GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp b/GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp index a3828b0a1..c1946e59e 100644 --- a/GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp +++ b/GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp @@ -14,6 +14,14 @@ #include #endif #include +#include +#include +#include +#include +#include +#include +#include "Input/InputManager.h" +#include "Core/FaultIsolation.h" #ifdef SPARK_PLATFORM_WINDOWS #include "Core/Platform.h" #endif @@ -345,13 +353,17 @@ void Game::ApplyLocalProfile(const Spark::FPSLocalProfile& profile) m_player->SetActive(profile.health > 0.0f); } if (m_hudSystem) + { m_hudSystem->SetCurrentClass(static_cast(profile.playerClass)); + } // The scoreboard lives outside the ECS, so a loaded save has to put it back // explicitly. Capturing kills/deaths/score and then not restoring them is what made // a quickload silently reset the match score. if (m_gameMode) + { m_gameMode->RestorePlayerScore("Player1", profile.kills, profile.deaths, profile.score); + } // A profile captured while dead restores an inactive player. Player::Update() // early-returns while dead and only a PlayerRespawnEvent revives it, so the respawn @@ -393,6 +405,11 @@ bool Game::QuickSaveProfile(std::string& outMessage) } const Spark::FPSLocalProfile profile = CaptureLocalProfile(); + if (m_inputObservationEnabled) + { + m_inputObservationTransfer = profile; + m_inputObservationTransferred = true; + } metadata.playerKills = profile.kills; metadata.playerDeaths = profile.deaths; @@ -426,6 +443,10 @@ bool Game::QuickLoadProfile(std::string& outMessage) } if (!saveSystem->SaveExists(kQuickSaveSlot)) { + if (m_inputObservationEnabled) + { + m_inputObservationReason = 1; + } outMessage = std::string("No quicksave found in slot '") + kQuickSaveSlot + "'"; return false; } @@ -446,6 +467,11 @@ bool Game::QuickLoadProfile(std::string& outMessage) return false; } + if (m_inputObservationEnabled) + { + m_inputObservationTransfer = profile; + m_inputObservationTransferred = true; + } ApplyLocalProfile(profile); // Report the level the session is actually at: ApplyLocalProfile re-derives it from @@ -456,3 +482,150 @@ bool Game::QuickLoadProfile(std::string& outMessage) std::to_string(profile.progressionXP) + " XP)"; return true; } + +namespace +{ + std::string ObservationHex(const std::string& value) + { + constexpr char digits[] = "0123456789abcdef"; + std::string result; + for (unsigned char c : value) + { + result += digits[c >> 4]; + result += digits[c & 15]; + } + return result.empty() ? "-" : result; + } + + std::string ObservationProfile(const Spark::FPSLocalProfile& profile) + { + if (!std::isfinite(profile.health) || !std::isfinite(profile.armor) || !std::isfinite(profile.playTimeSeconds)) + { + throw std::runtime_error("nonfinite profile observation"); + } + std::unordered_map fields; + profile.WriteTo(fields); // Same production profile serializer used by QuickSaveProfile. + std::map ordered(fields.begin(), fields.end()); + std::string serialized; + for (const auto& [key, value] : ordered) + { + serialized.append(key); + serialized.push_back('='); + serialized.append(value); + serialized.push_back('\n'); + } + return ObservationHex(serialized); + } +} // namespace + +void Game::BeginInputObservation() noexcept +{ + if (!m_inputObservationChecked) + { + m_inputObservationChecked = true; +#ifdef SPARK_PLATFORM_WINDOWS + wchar_t setting[2]{}; + m_inputObservationEnabled = + GetEnvironmentVariableW(L"SPARK_FPS_INPUT_TRACE", setting, 2) == 1 && setting[0] == L'1'; +#endif + } + if (!m_inputObservationEnabled || m_inputObservationFailed || !m_input) + { + return; + } + ++m_inputObservationUpdate; + m_inputObservationMask = m_inputObservationPressed = m_inputObservationReleased = 0; + constexpr int keys[] = {VK_F2, VK_F3, VK_F5, VK_F9}; + for (unsigned int i = 0; i < 4; ++i) + { + m_inputObservationMask |= static_cast(m_input->IsFrameKeyDown(keys[i])) << i; + m_inputObservationPressed |= static_cast(m_input->WasKeyPressed(keys[i])) << i; + m_inputObservationReleased |= static_cast(m_input->WasKeyReleased(keys[i])) << i; + } + if (m_inputObservationMask != m_inputObservationPreviousMask) + { + m_inputObservationStableFrames = 0; + } + m_inputObservationPreviousMask = m_inputObservationMask; + m_inputObservationWanted = + m_inputObservationStableFrames < 3 || m_inputObservationPressed != 0 || m_inputObservationReleased != 0; + if (m_inputObservationStableFrames < 3) + { + ++m_inputObservationStableFrames; + } + m_inputObservationAction = 0; + m_inputObservationResult = -1; + m_inputObservationReason = 0; + m_inputObservationTransferred = false; + RecordInputObservation("before"); +} + +void Game::RecordInputObservation(const char* phase) noexcept +{ + if (!m_inputObservationEnabled || m_inputObservationFailed || !m_inputObservationWanted || !m_input) + { + return; + } + try + { + auto* save = m_engineContext ? m_engineContext->GetSaveSystem() : nullptr; + unsigned long long faults = 0; + for (const auto& [name, record] : Spark::SubsystemFaultIsolator::GetInstance().GetRecordsSnapshot()) + { + faults += record.faultCount; + } + std::ostringstream line; + line << "SPARK_FPS_INPUT v=1 phase=" << phase << " input=" << m_input->GetInputFrameSequence() + << " update=" << m_inputObservationUpdate << " mask=" << m_inputObservationMask + << " pressed=" << m_inputObservationPressed << " released=" << m_inputObservationReleased + << " paused=" << static_cast(m_isPaused) << " action=" << m_inputObservationAction + << " result=" << m_inputObservationResult << " reason=" << m_inputObservationReason + << " operation=" << m_inputObservationOperation << " faults=" << faults + << " profile=" << ObservationProfile(CaptureLocalProfile()) + << " transfer=" << (m_inputObservationTransferred ? ObservationProfile(m_inputObservationTransfer) : "-") + << " saves=" + << ((m_inputObservationUpdate == 1 || std::string_view(phase) == "operation") + ? ObservationHex(save ? save->GetSaveDirectory() : "") + : "-") + << '\n'; + const std::string text = line.str(); + if (text.size() > 8192 || m_inputObservationRecords >= 256 || m_inputObservationBytes + text.size() > 98304) + { + m_inputObservationFailed = true; + return; + } + ++m_inputObservationRecords; + m_inputObservationBytes += text.size(); + if (std::fwrite(text.data(), 1, text.size(), stdout) != text.size() || std::fflush(stdout) != 0) + { + m_inputObservationFailed = true; + } + } + catch (...) + { + m_inputObservationFailed = true; // Observations must never alter gameplay control flow. + } +} + +void Game::EndInputObservation() noexcept +{ + if (!m_inputObservationEnabled) + { + return; + } + try + { + for (const auto& [name, record] : Spark::SubsystemFaultIsolator::GetInstance().GetRecordsSnapshot()) + { + m_inputObservationFailed = m_inputObservationFailed || record.faultCount != 0; + } + } + catch (...) + { + m_inputObservationFailed = true; + } + std::printf("SPARK_FPS_INPUT_END v=1 records=%u bytes=%zu failed=%d\n", m_inputObservationRecords, + m_inputObservationBytes, static_cast(m_inputObservationFailed)); + std::fflush(stdout); + m_inputObservationEnabled = false; +} diff --git a/GameModules/SparkGameFPS/module.json b/GameModules/SparkGameFPS/module.json index df71627e2..82bf9a395 100644 --- a/GameModules/SparkGameFPS/module.json +++ b/GameModules/SparkGameFPS/module.json @@ -80,7 +80,7 @@ }, { "prefix": "FPSWeatherPort_", - "count": 4 + "count": 6 }, { "prefix": "FPSWeatherIntegration_", diff --git a/GameModules/SparkGameMMOFPS/Source/Net/TFRepProtocol.h b/GameModules/SparkGameMMOFPS/Source/Net/TFRepProtocol.h index ccacf6636..8552080af 100644 --- a/GameModules/SparkGameMMOFPS/Source/Net/TFRepProtocol.h +++ b/GameModules/SparkGameMMOFPS/Source/Net/TFRepProtocol.h @@ -132,7 +132,7 @@ namespace Terrafront /// One pawn state record inside a RepUpdate message. Wire layout of the /// message is TF_RepUpdateHeader followed by exactly entityCount of these. /// Only pawns whose quantized state changed since the last broadcast are - /// included (server-side dirty check), so idle pawns cost zero bandwidth. + /// included by the dirty check, with a bounded full-state refresh for idle pawns. struct TF_RepPawnUpdate { uint32_t entityId; diff --git a/GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp b/GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp index 1f21a5f0d..e9d492885 100644 --- a/GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp +++ b/GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp @@ -15,7 +15,7 @@ #include "Utils/LogMacros.h" #ifdef ENABLE_NETWORKING -#include "Net/TFServerSim.h" // ServerTime() for TF_RepUpdateHeader.serverTime +#include "Net/TFServerSim.h" // ServerTime() for TF_RepUpdateHeader.serverTime #include "Engine/Networking/NetworkManager.h" #endif @@ -24,310 +24,319 @@ #include #include -namespace Terrafront { +namespace Terrafront +{ -namespace { + namespace + { -constexpr float kRateWindowSec = 1.0f; // stats sampling window + constexpr float kRateWindowSec = 1.0f; // stats sampling window -uint16_t QuantHP(float v) -{ - return static_cast(std::lround(std::clamp(v, 0.0f, 65535.0f))); -} + uint16_t QuantHP(float v) + { + return static_cast(std::lround(std::clamp(v, 0.0f, 65535.0f))); + } -} // namespace + } // namespace -TFReplication::TFReplication() = default; -TFReplication::~TFReplication() { if (m_initialized) Shutdown(); } + TFReplication::TFReplication() = default; + TFReplication::~TFReplication() + { + if (m_initialized) + Shutdown(); + } -bool TFReplication::Initialize(TFGameContext& ctx, TFEventBus& events) -{ - m_ctx = &ctx; - m_events = &events; + bool TFReplication::Initialize(TFGameContext& ctx, TFEventBus& events) + { + m_ctx = &ctx; + m_events = &events; - events.Subscribe([this](const EvPlayerSpawned& ev) { OnPlayerSpawned(ev); }); - events.Subscribe([this](const EvPlayerKilled& ev) { OnPlayerKilled(ev); }); + events.Subscribe([this](const EvPlayerSpawned& ev) { OnPlayerSpawned(ev); }); + events.Subscribe([this](const EvPlayerKilled& ev) { OnPlayerKilled(ev); }); - m_initialized = true; - SPARK_LOG_INFO(Spark::LogCategory::Game, "[TF] TFReplication initialized"); - return true; -} + m_initialized = true; + SPARK_LOG_INFO(Spark::LogCategory::Game, "[TF] TFReplication initialized"); + return true; + } -void TFReplication::Update(float deltaTime) -{ - if (!m_initialized) - return; + void TFReplication::Update(float deltaTime) + { + if (!m_initialized) + return; - m_clock += deltaTime; + m_clock += deltaTime; - m_rateWindow += deltaTime; - if (m_rateWindow >= kRateWindowSec) - { - m_msgsPerSec = static_cast(m_ctrMsgs) / m_rateWindow; - m_recordsPerSec = static_cast(m_ctrRecords) / m_rateWindow; - m_bytesPerSec = static_cast(m_ctrBytes) / m_rateWindow; - m_ctrMsgs = 0; - m_ctrRecords = 0; - m_ctrBytes = 0; - m_rateWindow = 0.0f; + m_rateWindow += deltaTime; + if (m_rateWindow >= kRateWindowSec) + { + m_msgsPerSec = static_cast(m_ctrMsgs) / m_rateWindow; + m_recordsPerSec = static_cast(m_ctrRecords) / m_rateWindow; + m_bytesPerSec = static_cast(m_ctrBytes) / m_rateWindow; + m_ctrMsgs = 0; + m_ctrRecords = 0; + m_ctrBytes = 0; + m_rateWindow = 0.0f; + } } -} -void TFReplication::FixedUpdate(float fixedDeltaTime) -{ - if (!m_initialized || !m_ctx) - return; + void TFReplication::FixedUpdate(float fixedDeltaTime) + { + if (!m_initialized || !m_ctx) + return; #ifdef ENABLE_NETWORKING - // --- server side: welcome late joiners + 20 Hz state broadcast --------- - if (ServerActive()) - { - ServerPollNewClients(); + // --- server side: welcome late joiners + 20 Hz state broadcast --------- + if (ServerActive()) + { + ServerPollNewClients(); + + m_updateAccum += fixedDeltaTime; + if (m_updateAccum >= 1.0f / kReplicationHz) + { + m_updateAccum = 0.0f; + ServerBroadcastUpdates(); + } + } + else if (!m_knownClients.empty() || !m_lastSent.Empty()) + { + // server went down — drop broadcast bookkeeping + m_knownClients.clear(); + m_lastSent.Clear(); + } - m_updateAccum += fixedDeltaTime; - if (m_updateAccum >= 1.0f / kReplicationHz) + // --- client side: lazy handler registration mirroring TFServerSim ------ + if (ClientActive()) { - m_updateAccum = 0.0f; - ServerBroadcastUpdates(); + if (!m_clientHandlers) + ClientEnsureHandlers(); } - } - else if (!m_knownClients.empty() || !m_lastSent.empty()) - { - // server went down — drop broadcast bookkeeping - m_knownClients.clear(); - m_lastSent.clear(); + else if (m_clientHandlers) + { + ClientReleaseHandlers(); + m_pawns.clear(); + m_hasMoveState = false; + m_freshMoveState = false; + } +#else + (void)fixedDeltaTime; +#endif } - // --- client side: lazy handler registration mirroring TFServerSim ------ - if (ClientActive()) - { - if (!m_clientHandlers) - ClientEnsureHandlers(); - } - else if (m_clientHandlers) + void TFReplication::Shutdown() { - ClientReleaseHandlers(); + if (!m_initialized) + return; +#ifdef ENABLE_NETWORKING + if (m_clientHandlers) + ClientReleaseHandlers(); +#endif + m_knownClients.clear(); + m_lastSent.Clear(); m_pawns.clear(); m_hasMoveState = false; m_freshMoveState = false; + m_initialized = false; } -#else - (void)fixedDeltaTime; -#endif -} -void TFReplication::Shutdown() -{ - if (!m_initialized) - return; -#ifdef ENABLE_NETWORKING - if (m_clientHandlers) - ClientReleaseHandlers(); -#endif - m_knownClients.clear(); - m_lastSent.clear(); - m_pawns.clear(); - m_hasMoveState = false; - m_freshMoveState = false; - m_initialized = false; -} - -// --------------------------------------------------------------------------- -// Event handlers (server broadcast triggers) -// --------------------------------------------------------------------------- - -TFReplication::SentState TFReplication::QuantizePawn(const PawnInfo& p) -{ - SentState s; - s.pos = QuantPos::From(p.pos); - s.aim = QuantAim::From(p.yaw, p.pitch); - s.health = QuantHP(p.health); - s.shield = QuantHP(p.shield); - s.alive = p.alive ? 1 : 0; - return s; -} - -void TFReplication::OnPlayerSpawned(const EvPlayerSpawned& ev) -{ -#ifdef ENABLE_NETWORKING - if (!ServerActive() || !m_ctx->players) - return; - PawnInfo p{}; - if (!m_ctx->players->GetPawnByEntity(ev.pawn, p)) + // --------------------------------------------------------------------------- + // Event handlers (server broadcast triggers) + // --------------------------------------------------------------------------- + + TFReplication::SentState TFReplication::QuantizePawn(const PawnInfo& p) { - // registry not filled yet — replicate identity from the event alone - p.entity = ev.pawn; - p.owner = ev.player; - p.faction = ev.faction; - p.cls = ev.cls; - p.alive = true; + SentState s; + s.pos = QuantPos::From(p.pos); + s.aim = QuantAim::From(p.yaw, p.pitch); + s.health = QuantHP(p.health); + s.shield = QuantHP(p.shield); + s.alive = p.alive ? 1 : 0; + return s; } - const TF_RepPawnCreate c = MakeCreate(p); - SendRep(kInvalidPlayer, kTFRepMsg_Create, &c, sizeof(c), true); - m_lastSent[p.entity] = QuantizePawn(p); + + void TFReplication::OnPlayerSpawned(const EvPlayerSpawned& ev) + { +#ifdef ENABLE_NETWORKING + if (!ServerActive() || !m_ctx->players) + return; + PawnInfo p{}; + if (!m_ctx->players->GetPawnByEntity(ev.pawn, p)) + { + // registry not filled yet — replicate identity from the event alone + p.entity = ev.pawn; + p.owner = ev.player; + p.faction = ev.faction; + p.cls = ev.cls; + p.alive = true; + } + const TF_RepPawnCreate c = MakeCreate(p); + SendRep(kInvalidPlayer, kTFRepMsg_Create, &c, sizeof(c), true); + m_lastSent.Remember(p.entity, QuantizePawn(p), m_clock); #else - (void)ev; + (void)ev; #endif -} + } -void TFReplication::OnPlayerKilled(const EvPlayerKilled& ev) -{ + void TFReplication::OnPlayerKilled(const EvPlayerKilled& ev) + { #ifdef ENABLE_NETWORKING - if (!ServerActive() || !m_ctx->players) - return; - PawnInfo p{}; - if (m_ctx->players->GetPawnByPlayer(ev.victim, p) && p.entity != 0) - ServerBroadcastDestroy(p.entity); + if (!ServerActive() || !m_ctx->players) + return; + PawnInfo p{}; + if (m_ctx->players->GetPawnByPlayer(ev.victim, p) && p.entity != 0) + ServerBroadcastDestroy(p.entity); #else - (void)ev; + (void)ev; #endif -} + } #ifdef ENABLE_NETWORKING -// --------------------------------------------------------------------------- -// Server side -// --------------------------------------------------------------------------- + // --------------------------------------------------------------------------- + // Server side + // --------------------------------------------------------------------------- -bool TFReplication::ServerActive() const -{ - auto& nm = Spark::Net::NetworkManager::GetInstance(); - return nm.IsInitialized() && - nm.GetRole() == Spark::Net::NetworkRole::Server && - m_ctx->IsAuthority(); -} + bool TFReplication::ServerActive() const + { + auto& nm = Spark::Net::NetworkManager::GetInstance(); + return nm.IsInitialized() && nm.GetRole() == Spark::Net::NetworkRole::Server && m_ctx->IsAuthority(); + } -TF_RepPawnCreate TFReplication::MakeCreate(const PawnInfo& p) -{ - TF_RepPawnCreate c{}; - c.entityId = p.entity; - c.ownerPlayer = p.owner; - c.faction = static_cast(p.faction); - c.classId = static_cast(p.cls); - c.alive = p.alive ? 1 : 0; - c.posX = p.pos[0]; c.posY = p.pos[1]; c.posZ = p.pos[2]; - c.yaw = p.yaw; c.pitch = p.pitch; - c.health = p.health; c.shield = p.shield; - return c; -} - -void TFReplication::ServerPollNewClients() -{ - // NetworkManager exposes no join callback registry (SetTimeoutHandler is a - // single slot owned elsewhere), so mirror TFServerSim: diff GetClients(). - auto& nm = Spark::Net::NetworkManager::GetInstance(); - const auto& clients = nm.GetClients(); + TF_RepPawnCreate TFReplication::MakeCreate(const PawnInfo& p) + { + TF_RepPawnCreate c{}; + c.entityId = p.entity; + c.ownerPlayer = p.owner; + c.faction = static_cast(p.faction); + c.classId = static_cast(p.cls); + c.alive = p.alive ? 1 : 0; + c.posX = p.pos[0]; + c.posY = p.pos[1]; + c.posZ = p.pos[2]; + c.yaw = p.yaw; + c.pitch = p.pitch; + c.health = p.health; + c.shield = p.shield; + return c; + } - for (const auto& [id, info] : clients) + void TFReplication::ServerPollNewClients() { - if (info.state != Spark::Net::ConnectionState::Connected || m_knownClients.contains(id)) - continue; - const PlayerId joined = id; // plain local (structured bindings + lambda capture) - m_knownClients.insert(joined); - - // Late joiner: send the full current pawn set as reliable Creates. - uint32_t sent = 0; - if (m_ctx->players) + // NetworkManager exposes no join callback registry (SetTimeoutHandler is a + // single slot owned elsewhere), so mirror TFServerSim: diff GetClients(). + auto& nm = Spark::Net::NetworkManager::GetInstance(); + const auto& clients = nm.GetClients(); + + for (const auto& [id, info] : clients) { - m_ctx->players->ForEachAlivePawn([this, joined, &sent](const PawnInfo& p) { - const TF_RepPawnCreate c = MakeCreate(p); - SendRep(joined, kTFRepMsg_Create, &c, sizeof(c), true); - ++sent; - }); + if (info.state != Spark::Net::ConnectionState::Connected || m_knownClients.contains(id)) + continue; + const PlayerId joined = id; // plain local (structured bindings + lambda capture) + m_knownClients.insert(joined); + + // Late joiner: send the full current pawn set as reliable Creates. + uint32_t sent = 0; + if (m_ctx->players) + { + m_ctx->players->ForEachAlivePawn( + [this, joined, &sent](const PawnInfo& p) + { + const TF_RepPawnCreate c = MakeCreate(p); + SendRep(joined, kTFRepMsg_Create, &c, sizeof(c), true); + ++sent; + }); + } + SPARK_LOG_INFO(Spark::LogCategory::Game, "[TF] rep: client %u joined — %u pawn creates sent", joined, sent); + } + + for (auto it = m_knownClients.begin(); it != m_knownClients.end();) + { + if (!clients.contains(*it)) + it = m_knownClients.erase(it); + else + ++it; } - SPARK_LOG_INFO(Spark::LogCategory::Game, - "[TF] rep: client %u joined — %u pawn creates sent", joined, sent); } - for (auto it = m_knownClients.begin(); it != m_knownClients.end();) + void TFReplication::ServerBroadcastUpdates() { - if (!clients.contains(*it)) - it = m_knownClients.erase(it); - else - ++it; - } -} + if (!m_ctx->players) + return; + + std::vector records; + std::unordered_set alive; + + m_ctx->players->ForEachAlivePawn( + [this, &records, &alive](const PawnInfo& p) + { + alive.insert(p.entity); + + const SentState now = QuantizePawn(p); + if (!m_lastSent.ShouldSend(p.entity, now, m_clock)) + { + ++m_skippedUnchanged; + return; // unchanged between bounded full-state refreshes + } + + TF_RepPawnUpdate rec{}; + rec.entityId = p.entity; + rec.pos = now.pos; + rec.aim = now.aim; + rec.health = now.health; + rec.shield = now.shield; + rec.alive = now.alive; + records.push_back(rec); + }); -void TFReplication::ServerBroadcastUpdates() -{ - if (!m_ctx->players) - return; + // Sweep: entities we replicated before that silently left the alive set + // (despawn without a kill event, e.g. cleanup paths) get a Destroy. + std::vector stale; + for (const auto& kv : m_lastSent.Entries()) + { + if (!alive.contains(kv.first)) + { + stale.push_back(kv.first); + } + } + for (EntityId entity : stale) + ServerBroadcastDestroy(entity); - std::vector records; - std::unordered_set alive; + if (records.empty()) + return; - m_ctx->players->ForEachAlivePawn([this, &records, &alive](const PawnInfo& p) { - alive.insert(p.entity); + TF_RepUpdateHeader hdr{}; + hdr.serverTime = m_ctx->serverSim ? static_cast(m_ctx->serverSim->ServerTime()) : 0.0f; + hdr.entityCount = static_cast(records.size()); - const SentState now = QuantizePawn(p); - auto it = m_lastSent.find(p.entity); - if (it != m_lastSent.end() && it->second == now) - { - ++m_skippedUnchanged; - return; // quantized state unchanged — costs zero bandwidth - } - m_lastSent[p.entity] = now; - - TF_RepPawnUpdate rec{}; - rec.entityId = p.entity; - rec.pos = now.pos; - rec.aim = now.aim; - rec.health = now.health; - rec.shield = now.shield; - rec.alive = now.alive; - records.push_back(rec); - }); - - // Sweep: entities we replicated before that silently left the alive set - // (despawn without a kill event, e.g. cleanup paths) get a Destroy. - std::vector stale; - for (const auto& kv : m_lastSent) - if (!alive.contains(kv.first)) - stale.push_back(kv.first); - for (EntityId entity : stale) - ServerBroadcastDestroy(entity); - - if (records.empty()) - return; - - TF_RepUpdateHeader hdr{}; - hdr.serverTime = m_ctx->serverSim - ? static_cast(m_ctx->serverSim->ServerTime()) : 0.0f; - hdr.entityCount = static_cast(records.size()); - - std::vector payload(sizeof(hdr) + records.size() * sizeof(TF_RepPawnUpdate)); - std::memcpy(payload.data(), &hdr, sizeof(hdr)); - std::memcpy(payload.data() + sizeof(hdr), records.data(), - records.size() * sizeof(TF_RepPawnUpdate)); - - SendRep(kInvalidPlayer, kTFRepMsg_Update, payload.data(), payload.size(), false); - m_ctrRecords += static_cast(records.size()); -} - -void TFReplication::ServerBroadcastDestroy(EntityId entity) -{ - TF_RepDestroy d{entity}; - SendRep(kInvalidPlayer, kTFRepMsg_Destroy, &d, sizeof(d), true); - m_lastSent.erase(entity); -} + std::vector payload(sizeof(hdr) + records.size() * sizeof(TF_RepPawnUpdate)); + std::memcpy(payload.data(), &hdr, sizeof(hdr)); + std::memcpy(payload.data() + sizeof(hdr), records.data(), records.size() * sizeof(TF_RepPawnUpdate)); -void TFReplication::SendRep(PlayerId target, uint16_t msgId, const void* payload, - size_t size, bool reliable) -{ - auto& nm = Spark::Net::NetworkManager::GetInstance(); - Spark::Net::NetworkMessage msg; - msg.type = static_cast(msgId); - msg.channel = reliable ? Spark::Net::ChannelType::Reliable - : Spark::Net::ChannelType::Unreliable; - msg.payload.resize(size); - std::memcpy(msg.payload.data(), payload, size); - if (target == kInvalidPlayer) - nm.SendToAll(msg); - else - nm.SendToClient(target, msg); - ++m_ctrMsgs; - m_ctrBytes += size; -} + SendRep(kInvalidPlayer, kTFRepMsg_Update, payload.data(), payload.size(), false); + m_ctrRecords += static_cast(records.size()); + } + + void TFReplication::ServerBroadcastDestroy(EntityId entity) + { + TF_RepDestroy d{entity}; + SendRep(kInvalidPlayer, kTFRepMsg_Destroy, &d, sizeof(d), true); + m_lastSent.Erase(entity); + } + + void TFReplication::SendRep(PlayerId target, uint16_t msgId, const void* payload, size_t size, bool reliable) + { + auto& nm = Spark::Net::NetworkManager::GetInstance(); + Spark::Net::NetworkMessage msg; + msg.type = static_cast(msgId); + msg.channel = reliable ? Spark::Net::ChannelType::Reliable : Spark::Net::ChannelType::Unreliable; + msg.payload.resize(size); + std::memcpy(msg.payload.data(), payload, size); + if (target == kInvalidPlayer) + nm.SendToAll(msg); + else + nm.SendToClient(target, msg); + ++m_ctrMsgs; + m_ctrBytes += size; + } #endif // ENABLE_NETWORKING diff --git a/GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h b/GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h index 4f90401f0..8a4845bfe 100644 --- a/GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h +++ b/GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h @@ -16,7 +16,7 @@ * NetworkManager has no join callback slot) -> full pawn set as Creates * - 20 Hz: one kTFRepMsg_Update batch (TF_RepUpdateHeader + N * TF_RepPawnUpdate) to all clients; per-pawn dirty check against the - * last-sent quantized state so unchanged pawns are skipped + * last-sent quantized state; quiet pawns refresh once per second for loss recovery * Client (NetworkManager role == Client): * - handlers for Create/Update/Destroy/MoveState maintain the RemotePawn * store and the owner-only latest TF_MoveState (shared W1B contract @@ -27,116 +27,120 @@ #include "Core/TFTypes.h" #include "Core/TFEvents.h" #include "Net/TFRepProtocol.h" +#include "Net/TFReplicationRefresh.h" #include #include #include -namespace Terrafront { - -struct PawnInfo; // TFPlayerSystem.h - -/// Client-side view of a replicated pawn (shared W1B contract — consumed by -/// TFClientNet and TFPlayerSystem; layout/fields frozen for W1). -struct RemotePawn { - EntityId entity; - PlayerId owner; - FactionId faction; - ClassId cls; - bool alive; - float pos[3]; - float vel[3]; ///< estimated from successive updates (0 until 2nd) - float yaw, pitch; ///< radians - float health, shield; - double recvTime; ///< client clock when the last update arrived -}; - -class TFReplication { - public: - TFReplication(); - ~TFReplication(); - - bool Initialize(TFGameContext& ctx, TFEventBus& events); - void Update(float deltaTime); - void FixedUpdate(float fixedDeltaTime); - void Shutdown(); - void RenderDebugUI(); - - // --- shared W1B contract (client-side store) --------------------------- - bool GetRemotePawn(EntityId entity, RemotePawn& out) const; - void ForEachRemotePawn(const std::function& fn) const; - - /// Owner-only authoritative move state (kTFRepMsg_MoveState). Returns the - /// newest received state and clears the 'fresh' flag. - bool GetLatestMoveState(TF_MoveState& out) const; - bool HasFreshMoveState() const { return m_freshMoveState; } - - /// Debug panel toggle (hidden by default; wired from tf_* console commands). - void ToggleDebugUI() { m_showDebug = !m_showDebug; } - - private: - /// Last state broadcast for a pawn entity (server-side dirty check). - struct SentState { - QuantPos pos; - QuantAim aim; - uint16_t health = 0; - uint16_t shield = 0; - uint8_t alive = 0; - bool operator==(const SentState&) const = default; +namespace Terrafront +{ + + struct PawnInfo; // TFPlayerSystem.h + + /// Client-side view of a replicated pawn (shared W1B contract — consumed by + /// TFClientNet and TFPlayerSystem; layout/fields frozen for W1). + struct RemotePawn + { + EntityId entity; + PlayerId owner; + FactionId faction; + ClassId cls; + bool alive; + float pos[3]; + float vel[3]; ///< estimated from successive updates (0 until 2nd) + float yaw, pitch; ///< radians + float health, shield; + double recvTime; ///< client clock when the last update arrived }; - static SentState QuantizePawn(const PawnInfo& p); - - void OnPlayerSpawned(const EvPlayerSpawned& ev); - void OnPlayerKilled(const EvPlayerKilled& ev); + class TFReplication + { + public: + TFReplication(); + ~TFReplication(); + + bool Initialize(TFGameContext& ctx, TFEventBus& events); + void Update(float deltaTime); + void FixedUpdate(float fixedDeltaTime); + void Shutdown(); + void RenderDebugUI(); + + // --- shared W1B contract (client-side store) --------------------------- + bool GetRemotePawn(EntityId entity, RemotePawn& out) const; + void ForEachRemotePawn(const std::function& fn) const; + + /// Owner-only authoritative move state (kTFRepMsg_MoveState). Returns the + /// newest received state and clears the 'fresh' flag. + bool GetLatestMoveState(TF_MoveState& out) const; + bool HasFreshMoveState() const { return m_freshMoveState; } + + /// Debug panel toggle (hidden by default; wired from tf_* console commands). + void ToggleDebugUI() { m_showDebug = !m_showDebug; } + + private: + /// Last state broadcast for a pawn entity (server-side dirty check). + struct SentState + { + QuantPos pos; + QuantAim aim; + uint16_t health = 0; + uint16_t shield = 0; + uint8_t alive = 0; + bool operator==(const SentState&) const = default; + }; + + static SentState QuantizePawn(const PawnInfo& p); + + void OnPlayerSpawned(const EvPlayerSpawned& ev); + void OnPlayerKilled(const EvPlayerKilled& ev); #ifdef ENABLE_NETWORKING - // --- server side (TFReplication.cpp) ------------------------------------ - bool ServerActive() const; - static TF_RepPawnCreate MakeCreate(const PawnInfo& p); - void ServerPollNewClients(); - void ServerBroadcastUpdates(); - void ServerBroadcastDestroy(EntityId entity); - /// target == kInvalidPlayer broadcasts to all clients. - void SendRep(PlayerId target, uint16_t msgId, const void* payload, - size_t size, bool reliable); - - // --- client side (TFReplicationClient.cpp) ------------------------------ - bool ClientActive() const; - void ClientEnsureHandlers(); - void ClientReleaseHandlers(); - void OnRepCreate(const void* data, size_t size); - void OnRepUpdate(const void* data, size_t size); - void OnRepDestroy(const void* data, size_t size); - void OnRepMoveState(const void* data, size_t size); + // --- server side (TFReplication.cpp) ------------------------------------ + bool ServerActive() const; + static TF_RepPawnCreate MakeCreate(const PawnInfo& p); + void ServerPollNewClients(); + void ServerBroadcastUpdates(); + void ServerBroadcastDestroy(EntityId entity); + /// target == kInvalidPlayer broadcasts to all clients. + void SendRep(PlayerId target, uint16_t msgId, const void* payload, size_t size, bool reliable); + + // --- client side (TFReplicationClient.cpp) ------------------------------ + bool ClientActive() const; + void ClientEnsureHandlers(); + void ClientReleaseHandlers(); + void OnRepCreate(const void* data, size_t size); + void OnRepUpdate(const void* data, size_t size); + void OnRepDestroy(const void* data, size_t size); + void OnRepMoveState(const void* data, size_t size); #endif - TFGameContext* m_ctx{nullptr}; - TFEventBus* m_events{nullptr}; - bool m_initialized{false}; - - // server state - std::unordered_set m_knownClients; - std::unordered_map m_lastSent; - float m_updateAccum{0.0f}; - - // client state - std::unordered_map m_pawns; - TF_MoveState m_moveState{}; - bool m_hasMoveState{false}; - mutable bool m_freshMoveState{false}; - bool m_clientHandlers{false}; - double m_clock{0.0}; ///< monotonic client clock (Update) - - // stats (whichever direction this role drives) - uint32_t m_ctrMsgs{0}, m_ctrRecords{0}; - uint64_t m_ctrBytes{0}; - float m_msgsPerSec{0.0f}, m_recordsPerSec{0.0f}, m_bytesPerSec{0.0f}; - float m_rateWindow{0.0f}; - uint32_t m_skippedUnchanged{0}; - uint32_t m_unknownEntityUpdates{0}; - uint32_t m_badPackets{0}; - bool m_showDebug{false}; -}; + TFGameContext* m_ctx{nullptr}; + TFEventBus* m_events{nullptr}; + bool m_initialized{false}; + + // server state + std::unordered_set m_knownClients; + TFReplicationStateCache m_lastSent; + float m_updateAccum{0.0f}; + + // client state + std::unordered_map m_pawns; + TF_MoveState m_moveState{}; + bool m_hasMoveState{false}; + mutable bool m_freshMoveState{false}; + bool m_clientHandlers{false}; + double m_clock{0.0}; ///< monotonic module clock (Update) + + // stats (whichever direction this role drives) + uint32_t m_ctrMsgs{0}, m_ctrRecords{0}; + uint64_t m_ctrBytes{0}; + float m_msgsPerSec{0.0f}, m_recordsPerSec{0.0f}, m_bytesPerSec{0.0f}; + float m_rateWindow{0.0f}; + uint32_t m_skippedUnchanged{0}; + uint32_t m_unknownEntityUpdates{0}; + uint32_t m_badPackets{0}; + bool m_showDebug{false}; + }; } // namespace Terrafront diff --git a/GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp b/GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp index 8a447b91f..e4dbb9536 100644 --- a/GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp +++ b/GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp @@ -243,7 +243,7 @@ namespace Terrafront { ImGui::Separator(); ImGui::Text("clients : %zu", m_knownClients.size()); - ImGui::Text("pawns cached : %zu unchanged skips: %u", m_lastSent.size(), m_skippedUnchanged); + ImGui::Text("pawns cached : %zu unchanged skips: %u", m_lastSent.Size(), m_skippedUnchanged); } else { diff --git a/GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h b/GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h new file mode 100644 index 000000000..bf76f498e --- /dev/null +++ b/GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h @@ -0,0 +1,54 @@ +/** @file TFReplicationRefresh.h @brief Bounded dirty-state cache with periodic loss recovery. */ +#pragma once + +#include "Core/TFTypes.h" + +#include +#include + +namespace Terrafront +{ + /** + * Unreliable delivery cannot confirm that a quiet entity's last update arrived. + * Refresh its full state after twenty replication ticks (one second), while + * sending changes immediately. State and refresh time share the same bounded + * entity lifetime; there is no separate per-peer refresh state. + */ + template class TFReplicationStateCache + { + public: + static constexpr unsigned int kRefreshTicks = 20; + static constexpr double kRefreshSeconds = kRefreshTicks / static_cast(kReplicationHz); + + bool ShouldSend(EntityId entity, const State& state, double clock) + { + const auto previous = m_entries.find(entity); + if (previous != m_entries.end() && previous->second.state == state && clock >= previous->second.sentAt && + clock - previous->second.sentAt < kRefreshSeconds) + { + return false; + } + Remember(entity, state, clock); + return true; + } + + void Remember(EntityId entity, const State& state, double clock) + { + m_entries.insert_or_assign(entity, Entry{state, clock}); + } + + void Erase(EntityId entity) { m_entries.erase(entity); } + void Clear() { m_entries.clear(); } + bool Empty() const { return m_entries.empty(); } + std::size_t Size() const { return m_entries.size(); } + const auto& Entries() const { return m_entries; } + + private: + struct Entry + { + State state; + double sentAt; + }; + std::unordered_map m_entries; + }; +} // namespace Terrafront diff --git a/GameModules/SparkGameVisualScript/module.json b/GameModules/SparkGameVisualScript/module.json index efbaf6034..86fc63afc 100644 --- a/GameModules/SparkGameVisualScript/module.json +++ b/GameModules/SparkGameVisualScript/module.json @@ -55,7 +55,7 @@ }, { "prefix": "VisualScriptGraphs_", - "count": 14, + "count": 15, "requires": [ "angelscript" ] diff --git a/GameModules/module-content-inventory.json b/GameModules/module-content-inventory.json index 4fcdba1f8..1fef84d41 100644 --- a/GameModules/module-content-inventory.json +++ b/GameModules/module-content-inventory.json @@ -135,16 +135,14 @@ "Graphics/PostProcessingPipeline.h", "Graphics/Shader.h", "Graphics/TextureSystem.h", - "Graphics/WeatherSystem.h", "Input/InputManager.h", "Physics/CollisionSystem.h", "Physics/PhysicsSystem.h", "SceneManager/SceneManager.h", "Utils/EventBus.h", - "Utils/InvalidStateDetector.h", "Utils/SparkError.h" ], - "privateEngineHeaderCount": 38, + "privateEngineHeaderCount": 36, "copiedInfrastructureFiles": [ "GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp" ], @@ -211,7 +209,7 @@ "directory": "GameModules/SparkGameMMOFPS", "cmakeLists": true, "sourceDirectory": "GameModules/SparkGameMMOFPS/Source", - "sourceFileCount": 327, + "sourceFileCount": 328, "moduleLocalContentState": "unclassified", "releaseClassification": "unclassified", "cmakeDeclarationParseError": false, diff --git a/README.md b/README.md index e323df0cb..54c820f29 100644 --- a/README.md +++ b/README.md @@ -226,7 +226,7 @@ Nine in-tree template projects load as `.dll`/`.so` modules at runtime. All nine ## Quality Assurance -**Tests:** 8,530 test definitions across 738 files covering core utilities, ECS, physics, AI, animation, networking, gameplay, graphics, editor, and the other engine subsystems. +**Tests:** 8,563 test definitions across 741 files covering core utilities, ECS, physics, AI, animation, networking, gameplay, graphics, editor, and the other engine subsystems. ```bash ctest --test-dir build -C Release --output-on-failure --no-tests=error @@ -394,7 +394,7 @@ SparkEngine/ ├── SparkEditor/Source/ 64 *Panel.h classes, collaboration ├── SparkConsole/src/ Standalone debug console ├── GameModules/ 11 in-tree module directories -├── Tests/ 8,530 test definitions, 738 files +├── Tests/ 8,563 test definitions, 741 files ├── wiki/ 206 Markdown pages excluding _Sidebar.md (inventory only) └── docs/ API reference, guides ``` diff --git a/SparkAssetPipelineCore/tests/AssetCookerTests.cpp b/SparkAssetPipelineCore/tests/AssetCookerTests.cpp index ad29d6817..efa7526b7 100644 --- a/SparkAssetPipelineCore/tests/AssetCookerTests.cpp +++ b/SparkAssetPipelineCore/tests/AssetCookerTests.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -10,6 +11,7 @@ #include #include #include +#include #include #if defined(_WIN32) @@ -217,6 +219,7 @@ int main(int argc, char** argv) bool swapRefused = true; bool parentSwapRefused = true; bool nonUtf8Refused = true; + bool nonUtf8FixtureUnavailable = false; std::string swapError; std::string parentSwapError; std::string nonUtf8Error; @@ -269,11 +272,50 @@ int main(int argc, char** argv) const auto badNameSource = root / "bad-name-source"; const auto badNameOutput = root / "bad-name-output"; std::filesystem::create_directories(badNameSource); - std::ofstream(badNameSource / std::string("bad-\xFF\xFE.bin"), std::ios::binary) << "bytes"; - const auto badName = Spark::AssetPipeline::CookAssets({badNameSource, badNameOutput, {}, false}); - nonUtf8Error = badName.error; - nonUtf8Refused = !badName.Succeeded() && badName.error.find("UTF-8") != std::string::npos && - !std::filesystem::exists(badNameOutput); + const auto controlPath = badNameSource / "valid-name.bin"; + bool controlWritten = false; + { + std::ofstream control(controlPath, std::ios::binary); + control << "bytes"; + control.flush(); + controlWritten = control.good(); + } + controlWritten = controlWritten && ReadFile(controlPath) == "bytes" && std::filesystem::remove(controlPath); + const std::string invalidName = "bad-\xFF\xFE.bin"; + errno = 0; + std::ofstream invalidFile(badNameSource / invalidName, std::ios::binary); + const int creationError = errno; + nonUtf8Error = "fixture creation errno=" + std::to_string(creationError) + ": " + + std::generic_category().message(creationError); + nonUtf8Refused = false; + if (invalidFile.is_open()) + { + invalidFile << "bytes"; + invalidFile.flush(); + const bool written = invalidFile.good(); + invalidFile.close(); + const auto entry = std::filesystem::directory_iterator(badNameSource); + if (controlWritten && written && entry != std::filesystem::directory_iterator{} && + entry->path().filename().native() == invalidName) + { + const auto badName = Spark::AssetPipeline::CookAssets({badNameSource, badNameOutput, {}, false}); + nonUtf8Error = badName.error; + nonUtf8Refused = !badName.Succeeded() && badName.error.find("UTF-8") != std::string::npos && + !std::filesystem::exists(badNameOutput); + } + } +#if defined(__APPLE__) + else if (controlWritten && (creationError == EILSEQ || creationError == EINVAL) && + std::filesystem::is_empty(badNameSource)) + { + // APFS can refuse invalid UTF-8 before the cooker can read the entry. + // Report that limitation rather than claiming the cooker rejected it. + nonUtf8FixtureUnavailable = true; + std::cout << "Asset cooker invalid-UTF-8 filesystem case not exercised: filename creation refused\n"; + } +#else + (void)creationError; +#endif #endif const auto concurrentSourceA = root / "concurrent-source-a"; @@ -370,14 +412,15 @@ int main(int argc, char** argv) (!throughHardLinkedManifest.Succeeded() && internalManifestBytes == "preserve-internal")) && !wrongDigestAccepted && directBytes == "old bytes" && unicodePassed && controlFilenamePassed && aliasedOutputPassed && concurrentPassed && escapeRejected && insideAccepted && containmentPassed && - swapRefused && parentSwapRefused && nonUtf8Refused && + swapRefused && parentSwapRefused && (nonUtf8Refused || nonUtf8FixtureUnavailable) && std::filesystem::is_regular_file(output / "nested" / "asset.txt"); if (!passed) { std::cerr << "Asset cooker deterministic/incremental contract failed\n" << "swapRefused=" << swapRefused << " error='" << swapError << "' parentSwapRefused=" << parentSwapRefused << " error='" << parentSwapError - << "' nonUtf8Refused=" << nonUtf8Refused << " error='" << nonUtf8Error << "'\n" + << "' nonUtf8Refused=" << nonUtf8Refused << " fixtureUnavailable=" << nonUtf8FixtureUnavailable + << " error='" << nonUtf8Error << "'\n" << "first=" << first.Succeeded() << " error='" << first.error << "' updated=" << first.updatedCount << " unchanged=" << first.unchangedCount << "\n" << "second=" << second.Succeeded() << " error='" << second.error diff --git a/SparkBuild/tests/ProcessRunnerTests.cpp b/SparkBuild/tests/ProcessRunnerTests.cpp index 0a82ff314..42eb6284d 100644 --- a/SparkBuild/tests/ProcessRunnerTests.cpp +++ b/SparkBuild/tests/ProcessRunnerTests.cpp @@ -380,12 +380,10 @@ namespace BuildRunnerCommand(executable, descendantPidFile), {}, [](const std::string&) {}, [&](int exitCode, bool success) { - { - std::lock_guard lock(completionMutex); - ++completionCount; - completionExitCode = exitCode; - completionSuccess = success; - } + std::lock_guard lock(completionMutex); + ++completionCount; + completionExitCode = exitCode; + completionSuccess = success; completionCondition.notify_all(); }); check(launched, "ProcessRunner rejected the async launch"); @@ -438,22 +436,19 @@ namespace SparkBuild::CompletionCallback completion; completion = [&](int exitCode, bool success) { - bool startAgain = false; - { - std::lock_guard lock(completionMutex); - ++completionCount; - allSuccessful = allSuccessful && success && exitCode == 0; - startAgain = completionCount == 1; - } + // A fast replacement can finish before its launcher's callback. + // Publish both callbacks' state and notification before teardown + // can acquire the mutex and destroy their captured objects. + std::lock_guard lock(completionMutex); + ++completionCount; + allSuccessful = allSuccessful && success && exitCode == 0; + const bool startAgain = completionCount == 1; if (startAgain) { const bool accepted = runner.RunAsync(command, {}, [](const std::string&) {}, completion); - { - std::lock_guard lock(completionMutex); - rerunAttempted = true; - rerunAccepted = accepted; - } + rerunAttempted = true; + rerunAccepted = accepted; } completionCondition.notify_all(); }; @@ -502,12 +497,10 @@ namespace BuildSuccessCommand(executable), {}, [](const std::string&) {}, [&](int exitCode, bool success) { + std::lock_guard lock(completionMutex); successful = success && exitCode == 0; runner.reset(); - { - std::lock_guard lock(completionMutex); - destroyed = true; - } + destroyed = true; completionCondition.notify_all(); }); if (!accepted) @@ -687,11 +680,9 @@ namespace command, plantDirectory.string(), [](const std::string&) {}, [&](int exitCode, bool success) { - { - std::lock_guard lock(completionMutex); - completed = true; - succeeded = success && exitCode == 0; - } + std::lock_guard lock(completionMutex); + completed = true; + succeeded = success && exitCode == 0; completionCondition.notify_all(); }); check(launched, "RunAsync rejected the planted-tool launch"); diff --git a/SparkConsole/src/ConsoleApp.cpp b/SparkConsole/src/ConsoleApp.cpp index da7466d23..1ca7b4947 100644 --- a/SparkConsole/src/ConsoleApp.cpp +++ b/SparkConsole/src/ConsoleApp.cpp @@ -215,13 +215,11 @@ bool ConsoleApp::DetectPipeMode() return pipeMode; } -void ConsoleApp::PollPipeModeInput(std::string& input, int& noInputCounter, bool& pipeMode, - std::atomic& keyboardThreadRunning) +void ConsoleApp::PrintPipePrompt() { + std::lock_guard lock(m_outputMutex); #ifdef SPARK_PLATFORM_WINDOWS HANDLE hConsoleOut = DisplayHandle(); - CONSOLE_SCREEN_BUFFER_INFO csbi; - GetConsoleScreenBufferInfo(hConsoleOut, &csbi); SetConsoleTextAttribute(hConsoleOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY); WriteConsoleW(hConsoleOut, L"> ", 2, NULL, NULL); @@ -230,7 +228,11 @@ void ConsoleApp::PollPipeModeInput(std::string& input, int& noInputCounter, bool // stderr: a prompt on stdout would prefix the next forwarded command with "> ". std::cerr << ANSI_GREEN_BOLD << "> " << ANSI_RESET << std::flush; #endif +} +void ConsoleApp::PollPipeModeInput(std::string& input, int& noInputCounter, bool& pipeMode, + std::atomic& keyboardThreadRunning) +{ // Just sleep and let the keyboard thread and ReadEngineInput thread do their work std::this_thread::sleep_for(std::chrono::milliseconds(100)); @@ -337,6 +339,7 @@ void ConsoleApp::PipeKeyboardThreadFunc(std::string& input, std::atomic& k #else std::cerr << std::endl; #endif + PrintPipePrompt(); } else if (ch == '\b' || ch == 127) { @@ -367,6 +370,7 @@ void ConsoleApp::Run() if (pipeMode) { + PrintPipePrompt(); keyboardThreadRunning = true; keyboardThread = std::thread(&ConsoleApp::PipeKeyboardThreadFunc, this, std::ref(input), std::ref(keyboardThreadRunning)); diff --git a/SparkConsole/src/ConsoleApp.h b/SparkConsole/src/ConsoleApp.h index 8bda2e0cd..304b59270 100644 --- a/SparkConsole/src/ConsoleApp.h +++ b/SparkConsole/src/ConsoleApp.h @@ -73,8 +73,9 @@ class ConsoleApp void ReadEngineInput(); ///< Background thread: reads log messages from engine pipe. // --- Run() helpers --- - void PrintBanner(); ///< Clear screen and print the startup banner. - bool DetectPipeMode(); ///< Detect if stdin is a pipe; print connection status. Returns true if pipe mode. + void PrintBanner(); ///< Clear screen and print the startup banner. + bool DetectPipeMode(); ///< Detect if stdin is a pipe; print connection status. Returns true if pipe mode. + void PrintPipePrompt(); ///< Human-facing prompt when ready for another command, never during idle polling. void PipeKeyboardThreadFunc(std::string& input, std::atomic& keyboardThreadRunning); ///< Keyboard input loop for pipe mode. void PollPipeModeInput(std::string& input, int& noInputCounter, bool& pipeMode, diff --git a/SparkEditor/Source/Core/EditorApplication.h b/SparkEditor/Source/Core/EditorApplication.h index d7d6c33d8..7f853f71f 100644 --- a/SparkEditor/Source/Core/EditorApplication.h +++ b/SparkEditor/Source/Core/EditorApplication.h @@ -85,16 +85,16 @@ namespace SparkEditor void RequestExit(); PerformanceMetrics GetPerformanceMetrics() const; - /** @brief Number of main-loop frames whose swap-chain Present returned S_OK. */ + /** @brief Number of completed frame presentation calls (D3D11 success or OpenGL swap completion). */ uint64_t GetRenderedFrameCount() const { return m_renderedFrameCount; } - /** @brief Number of main-loop Present calls that did not return S_OK. */ + /** @brief Number of frame presentation failures reported by the active graphics backend. */ uint64_t GetPresentFailureCount() const { return m_presentFailureCount; } std::string GetGraphicsBackend() const { #ifdef _WIN32 return "d3d11"; #else - return "unknown"; + return "opengl"; #endif } EditorPluginManager& GetPluginManager() { return m_pluginManager; } diff --git a/SparkEditor/Source/Core/EditorApplicationLinux.cpp b/SparkEditor/Source/Core/EditorApplicationLinux.cpp index 3f74bcfb9..2d7347852 100644 --- a/SparkEditor/Source/Core/EditorApplicationLinux.cpp +++ b/SparkEditor/Source/Core/EditorApplicationLinux.cpp @@ -259,6 +259,7 @@ namespace SparkEditor ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); SDL_GL_SwapWindow(m_window); + ++m_renderedFrameCount; } void EditorApplication::OnWindowResize(int width, int height) diff --git a/SparkEditor/Source/Core/EditorPanel.cpp b/SparkEditor/Source/Core/EditorPanel.cpp index 019a10016..72b09163d 100644 --- a/SparkEditor/Source/Core/EditorPanel.cpp +++ b/SparkEditor/Source/Core/EditorPanel.cpp @@ -45,6 +45,7 @@ namespace SparkEditor } bool visible = m_isVisible; + ImGui::SetNextWindowSize(ImVec2(m_width, m_height), ImGuiCond_FirstUseEver); bool result = ImGui::Begin(displayTitle.c_str(), m_isClosable ? &visible : nullptr, flags); if (visible != m_isVisible) @@ -83,4 +84,4 @@ namespace SparkEditor } } -} // namespace SparkEditor \ No newline at end of file +} // namespace SparkEditor diff --git a/SparkEditor/Source/Core/EditorThemeDocument.cpp b/SparkEditor/Source/Core/EditorThemeDocument.cpp index 94f3e66b6..3c69d002c 100644 --- a/SparkEditor/Source/Core/EditorThemeDocument.cpp +++ b/SparkEditor/Source/Core/EditorThemeDocument.cpp @@ -114,9 +114,9 @@ namespace SparkEditor { std::ostringstream file; file << "{\n"; - file << " \"name\": \"" << theme.name << "\",\n"; - file << " \"description\": \"" << theme.description << "\",\n"; - file << " \"author\": \"" << theme.author << "\",\n"; + file << R"( "name": ")" << theme.name << "\",\n"; + file << R"( "description": ")" << theme.description << "\",\n"; + file << R"( "author": ")" << theme.author << "\",\n"; file << " \"colors\": {\n"; for (size_t index = 0; index < kThemeColors.size(); ++index) { diff --git a/SparkEditor/Source/Core/EditorUI.cpp b/SparkEditor/Source/Core/EditorUI.cpp index 57c045d9e..8490074eb 100644 --- a/SparkEditor/Source/Core/EditorUI.cpp +++ b/SparkEditor/Source/Core/EditorUI.cpp @@ -414,6 +414,26 @@ namespace SparkEditor return; } + // Material activation keeps the browser independent of panel ownership. + auto browserIt = m_panels.find("AssetBrowser"); + auto materialIt = m_panels.find("MaterialEditor"); + if (browserIt != m_panels.end() && materialIt != m_panels.end()) + { + auto browser = std::dynamic_pointer_cast(browserIt->second); + auto material = std::dynamic_pointer_cast(materialIt->second); + if (browser && material) + { + browser->SetOnMaterialOpened( + [weakMaterial = std::weak_ptr(material)](const std::string& path) + { + if (auto panel = weakMaterial.lock()) + { + panel->OpenMaterial(path); + } + }); + } + } + m_projectManager->SetOnProjectOpened( [this](const ProjectInfo& project) { @@ -2343,6 +2363,18 @@ namespace SparkEditor } } + // Inspector reads the current World and selection through EditorUI. + // Keep this document wiring platform-neutral: it does not depend on a + // graphics device and must also work in the Linux/OpenGL editor. + auto inspectorIt = m_panels.find("Inspector"); + if (inspectorIt != m_panels.end()) + { + if (auto* inspector = dynamic_cast(inspectorIt->second.get())) + { + inspector->SetEditorUI(this); + } + } + auto gameViewIt = m_panels.find("GameView"); if (gameViewIt != m_panels.end()) { @@ -2626,39 +2658,9 @@ namespace SparkEditor assetBrowser->SetGraphics(m_graphics.get()); } - // Wire the Hierarchy panel's selection sink (one-time; the panel - // object persists across future World swaps, so this doesn't need - // to be repeated by RewirePanelsToWorld()). List/create/delete/select - // real ECS entities instead of the legacy (dormant) SceneFile tree. - auto hierarchyIt = m_panels.find("Hierarchy"); - if (hierarchyIt != m_panels.end()) - { - auto* hierarchy = dynamic_cast(hierarchyIt->second.get()); - if (hierarchy) - { - hierarchy->SetSelectionSink(this); - } - } - - // Seed both panels' cached ::World* (this call also handles the - // SceneView/Hierarchy SetWorld() previously done inline here) and - // any subsequent OpenScene() reuses the same path. + // Wire document-backed panels. Any subsequent OpenScene() reuses the + // same path. RewirePanelsToWorld(); - - // Wire the Inspector panel to EditorUI (Unit C3) so it can read the - // live World + selected entity each frame and render/edit the - // entity's real engine components via reflection, instead of the - // legacy (dormant) SceneFile-backed inspector. - auto inspectorIt = m_panels.find("Inspector"); - if (inspectorIt != m_panels.end()) - { - auto* inspector = dynamic_cast(inspectorIt->second.get()); - if (inspector) - { - inspector->SetEditorUI(this); - console.LogSuccess("EditorUI wired to Inspector panel (World-backed ECS inspector)"); - } - } } #endif void EditorUI::HandleKeyboardShortcuts() diff --git a/SparkEditor/Source/Core/EditorUI.h b/SparkEditor/Source/Core/EditorUI.h index 9f3f13993..d663b599b 100644 --- a/SparkEditor/Source/Core/EditorUI.h +++ b/SparkEditor/Source/Core/EditorUI.h @@ -468,12 +468,10 @@ namespace SparkEditor void ClearMatchingRecoveryAfterSuccessfulSave(); void RenderRecoveryModal(); - /// @brief Re-point the panels that cache a raw ::World* (SceneView, - /// Hierarchy) at the current document World and clear selection. Must be - /// called any time that World is (re)assigned — both the initial seed - /// wiring in SetGraphicsDevice() and OpenScene() share this path so - /// the caching panels never dangle a pointer to a freed World. - /// InspectorPanel needs no re-wire — it reads GetWorld() live. + /// @brief Wire document-backed panels to the current World and EditorUI. + /// Re-points cached World pointers, clears stale selection, and gives + /// selection consumers their platform-neutral EditorUI owner. Must be + /// called any time the World is (re)assigned. void RewirePanelsToWorld(); void RenderMainMenuBar(); void RenderFileMenu(); diff --git a/SparkEditor/Source/Core/ProjectDocument.cpp b/SparkEditor/Source/Core/ProjectDocument.cpp index b6d9479df..b990431dd 100644 --- a/SparkEditor/Source/Core/ProjectDocument.cpp +++ b/SparkEditor/Source/Core/ProjectDocument.cpp @@ -279,7 +279,8 @@ namespace SparkEditor } if (c == '\\') { - if (++i >= json.size() || !DecodeJsonEscape(json, i, value)) + ++i; + if (i >= json.size() || !DecodeJsonEscape(json, i, value)) { return {}; } @@ -483,16 +484,16 @@ namespace SparkEditor std::ostringstream file; file << "{\n"; file << " \"projectFileVersion\": " << ProjectManager::kProjectFileVersion << ",\n"; - file << " \"name\": \"" << EscapeProjectJsonString(fields.name) << "\",\n"; - file << " \"version\": \"" << EscapeProjectJsonString(fields.version) << "\",\n"; - file << " \"description\": \"" << EscapeProjectJsonString(fields.description) << "\",\n"; - file << " \"engineVersion\": \"" << EscapeProjectJsonString(fields.engineVersion) << "\",\n"; + file << R"( "name": ")" << EscapeProjectJsonString(fields.name) << "\",\n"; + file << R"( "version": ")" << EscapeProjectJsonString(fields.version) << "\",\n"; + file << R"( "description": ")" << EscapeProjectJsonString(fields.description) << "\",\n"; + file << R"( "engineVersion": ")" << EscapeProjectJsonString(fields.engineVersion) << "\",\n"; if (!fields.templateId.empty()) { - file << " \"template\": \"" << EscapeProjectJsonString(fields.templateId) << "\",\n"; + file << R"( "template": ")" << EscapeProjectJsonString(fields.templateId) << "\",\n"; } - file << " \"defaultScene\": \"" << EscapeProjectJsonString(fields.defaultScene) << "\",\n"; - file << " \"lastOpenedScene\": \"" << EscapeProjectJsonString(fields.lastOpenedScene) << "\",\n"; + file << R"( "defaultScene": ")" << EscapeProjectJsonString(fields.defaultScene) << "\",\n"; + file << R"( "lastOpenedScene": ")" << EscapeProjectJsonString(fields.lastOpenedScene) << "\",\n"; file << " \"createdTime\": " << fields.createdTime << ",\n"; file << " \"lastModified\": " << fields.lastModified << ",\n"; @@ -562,9 +563,9 @@ namespace SparkEditor { const auto& rp = projects[i]; file << " {\n"; - file << " \"name\": \"" << EscapeProjectJsonString(rp.name) << "\",\n"; - file << " \"path\": \"" << EscapeProjectJsonString(rp.path) << "\",\n"; - file << " \"engineVersion\": \"" << EscapeProjectJsonString(rp.engineVersion) << "\",\n"; + file << R"( "name": ")" << EscapeProjectJsonString(rp.name) << "\",\n"; + file << R"( "path": ")" << EscapeProjectJsonString(rp.path) << "\",\n"; + file << R"( "engineVersion": ")" << EscapeProjectJsonString(rp.engineVersion) << "\",\n"; file << " \"lastOpened\": " << rp.lastOpened << "\n"; file << " }"; if (i + 1 < count) diff --git a/SparkEditor/Source/Panels/AssetBrowserGrid.cpp b/SparkEditor/Source/Panels/AssetBrowserGrid.cpp new file mode 100644 index 000000000..113a9be4f --- /dev/null +++ b/SparkEditor/Source/Panels/AssetBrowserGrid.cpp @@ -0,0 +1,376 @@ +/** + * @file AssetBrowserGrid.cpp + * @brief Asset browser toolbar, thumbnails, drag payloads, and details. + */ +#include "AssetBrowserPanel.h" +#include "AssetBrowserPathUtils.h" +#include "../AssetPipeline/EditorAssetDrag.h" +#include "../Core/EditorIcons.h" +#include "../Core/EditorFonts.h" +#include "Utils/LogMacros.h" +#include +#include +#include +namespace SparkEditor +{ + using AssetBrowserDetail::PathFromUtf8; + using AssetBrowserDetail::PathToUtf8; + // Helper to get icon for file extension + static const char* GetFileTypeIcon(const std::string& ext) + { + if (ext == ".fbx" || ext == ".obj" || ext == ".gltf" || ext == ".glb") + return ICON_FA_CUBE; + if (ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".tga" || ext == ".bmp" || ext == ".dds") + return ICON_FA_IMAGE; + if (ext == ".wav" || ext == ".mp3" || ext == ".ogg") + return ICON_FA_VOLUME_UP; + if (ext == ".cpp" || ext == ".h" || ext == ".hpp" || ext == ".lua") + return ICON_FA_CODE; + if (ext == ".hlsl" || ext == ".glsl" || ext == ".shader") + return ICON_FA_PAINT_BRUSH; + if (ext == ".mat" || ext == ".material" || ext == ".spkmat") + return ICON_FA_CIRCLE; + if (ext == ".scene" || ext == ".map") + return ICON_FA_MAP; + if (ext == ".prefab") + return ICON_FA_SHAPES; + if (ext == ".ttf" || ext == ".otf") + return ICON_FA_FONT; + if (ext == ".json" || ext == ".xml" || ext == ".ini" || ext == ".cfg") + return ICON_FA_COG; + return ICON_FA_FILE; + } + + static ImU32 GetFileTypeColor(const std::string& ext) + { + if (ext == ".fbx" || ext == ".obj" || ext == ".gltf" || ext == ".glb") + return IM_COL32(100, 200, 255, 255); + if (ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".tga") + return IM_COL32(200, 150, 255, 255); + if (ext == ".wav" || ext == ".mp3" || ext == ".ogg") + return IM_COL32(255, 200, 100, 255); + if (ext == ".cpp" || ext == ".h" || ext == ".hpp" || ext == ".lua") + return IM_COL32(100, 255, 150, 255); + if (ext == ".hlsl" || ext == ".glsl" || ext == ".shader") + return IM_COL32(255, 150, 150, 255); + return IM_COL32(180, 180, 180, 255); + } + + void AssetBrowserPanel::Render() + { + if (!IsVisible()) + return; + + if (BeginPanel()) + { + // Toolbar with icons + ImGui::BeginDisabled(!HasValidProjectRoot()); + if (ImGui::Button(ICON_FA_DOWNLOAD " Import")) + { + ImGui::OpenPopup("ImportAssetPath"); + } + ImGui::EndDisabled(); + if (!HasValidProjectRoot() && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) + ImGui::SetTooltip("Open a project before importing assets"); + + // Simple path input popup for importing an asset + if (ImGui::BeginPopup("ImportAssetPath")) + { + static char importPathBuf[512] = ""; + ImGui::Text("Enter file path to import:"); + ImGui::SetNextItemWidth(400); + bool enterPressed = ImGui::InputText("##ImportPath", importPathBuf, sizeof(importPathBuf), + ImGuiInputTextFlags_EnterReturnsTrue); + ImGui::SameLine(); + if (ImGui::Button("OK") || enterPressed) + { + if (importPathBuf[0] != '\0') + { + if (ImportAsset(std::string(importPathBuf))) + { + importPathBuf[0] = '\0'; + ImGui::CloseCurrentPopup(); + } + } + else + { + SetOperationResult(false, "Enter a source file path"); + } + } + ImGui::SameLine(); + if (ImGui::Button("Cancel")) + { + importPathBuf[0] = '\0'; + ImGui::CloseCurrentPopup(); + } + if (!m_lastOperationMessage.empty()) + { + const ImVec4 color = + m_lastOperationSucceeded ? ImVec4(0.45f, 0.85f, 0.5f, 1.0f) : ImVec4(1.0f, 0.45f, 0.45f, 1.0f); + ImGui::TextColored(color, "%s", m_lastOperationMessage.c_str()); + } + ImGui::EndPopup(); + } + ImGui::SameLine(); + if (ImGui::Button(ICON_FA_SYNC_ALT " Refresh")) + { + RefreshAssets(); + } + ImGui::SameLine(); + ImGui::SetNextItemWidth(100); + ImGui::SliderFloat("##Size", &m_thumbnailSize, 32.0f, 128.0f, "%.0f px"); + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("Thumbnail Size"); + + // Breadcrumb navigation + ImGui::SameLine(); + ImGui::Text("|"); + ImGui::SameLine(); + + // Build breadcrumb path + std::filesystem::path currentPath = PathFromUtf8(m_currentFolder); + std::filesystem::path rootPath = PathFromUtf8(m_projectPath); + std::vector breadcrumbs; + std::filesystem::path tempPath = currentPath; + while (tempPath != rootPath && tempPath.has_parent_path() && tempPath != tempPath.parent_path()) + { + breadcrumbs.push_back(tempPath); + tempPath = tempPath.parent_path(); + } + breadcrumbs.push_back(rootPath); + std::reverse(breadcrumbs.begin(), breadcrumbs.end()); + + for (size_t i = 0; i < breadcrumbs.size(); ++i) + { + if (i > 0) + { + ImGui::SameLine(0, 2); + ImGui::TextColored(ImVec4(0.5f, 0.5f, 0.5f, 1.0f), ICON_FA_CHEVRON_RIGHT); + ImGui::SameLine(0, 2); + } + std::string label = (i == 0) ? ICON_FA_HOME " Assets" : PathToUtf8(breadcrumbs[i].filename()); + if (ImGui::SmallButton(label.c_str())) + { + NavigateToFolder(PathToUtf8(breadcrumbs[i])); + } + } + + if (!m_lastOperationMessage.empty()) + { + ImGui::SameLine(); + const ImVec4 color = + m_lastOperationSucceeded ? ImVec4(0.45f, 0.85f, 0.5f, 1.0f) : ImVec4(1.0f, 0.45f, 0.45f, 1.0f); + ImGui::TextColored(color, "%s", m_lastOperationMessage.c_str()); + } + + ImGui::Separator(); + + // Split view + if (ImGui::BeginTable("AssetBrowserTable", 2, ImGuiTableFlags_Resizable)) + { + ImGui::TableSetupColumn("Folders", ImGuiTableColumnFlags_WidthFixed, 200.0f); + ImGui::TableSetupColumn("Assets", ImGuiTableColumnFlags_WidthStretch); + + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + RenderFolderTree(); + + ImGui::TableSetColumnIndex(1); + RenderAssetGrid(); + + ImGui::EndTable(); + } + + ImGui::Separator(); + RenderAssetDetails(); + } + EndPanel(); + } + + void AssetBrowserPanel::RenderAssetGrid() + { + ImGui::BeginChild("AssetGrid"); + + // Asset grid + float panelWidth = ImGui::GetContentRegionAvail().x; + float cellWidth = m_thumbnailSize + 14.0f; + int columns = std::max(1, (int)(panelWidth / cellWidth)); + std::string requestedFolder; + + if (ImGui::BeginTable("AssetGridTable", columns)) + { + int itemIndex = 0; + for (const auto& folder : m_folders) + { + if (itemIndex % columns == 0) + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(itemIndex % columns); + + const std::filesystem::path folderPath = PathFromUtf8(folder); + const std::string folderName = PathToUtf8(folderPath.filename()); + const ImVec2 pos = ImGui::GetCursorScreenPos(); + const ImVec2 size(m_thumbnailSize, m_thumbnailSize); + ImDrawList* drawList = ImGui::GetWindowDrawList(); + drawList->AddRectFilled(pos, ImVec2(pos.x + size.x, pos.y + size.y), IM_COL32(40, 43, 50, 255), 4.0f); + drawList->AddRect(pos, ImVec2(pos.x + size.x, pos.y + size.y), IM_COL32(70, 75, 86, 255), 4.0f); + + const char* icon = ICON_FA_FOLDER; + const ImVec2 iconSize = ImGui::CalcTextSize(icon); + drawList->AddText( + ImVec2(pos.x + (size.x - iconSize.x) * 0.5f, pos.y + (size.y - iconSize.y) * 0.5f - 4.0f), + IM_COL32(235, 190, 85, 255), icon); + + ImGui::SetCursorScreenPos(pos); + ImGui::InvisibleButton(("##folder_" + folder).c_str(), size); + if (ImGui::IsItemClicked()) + requestedFolder = folder; + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("Open folder: %s", folderName.c_str()); + + ImGui::SetCursorScreenPos(ImVec2(pos.x, pos.y + size.y + 2.0f)); + ImGui::TextWrapped("%s", folderName.c_str()); + ++itemIndex; + } + + for (const auto& asset : m_assets) + { + if (itemIndex % columns == 0) + { + ImGui::TableNextRow(); + } + ImGui::TableSetColumnIndex(itemIndex % columns); + + std::filesystem::path assetPath = PathFromUtf8(asset); + std::string ext = PathToUtf8(assetPath.extension()); + std::transform(ext.begin(), ext.end(), ext.begin(), + [](unsigned char c) { return static_cast(std::tolower(c)); }); + std::string filename = PathToUtf8(assetPath.filename()); + const char* fileIcon = GetFileTypeIcon(ext); + ImU32 iconColor = GetFileTypeColor(ext); + + // Thumbnail + ImDrawList* drawList = ImGui::GetWindowDrawList(); + ImVec2 pos = ImGui::GetCursorScreenPos(); + ImVec2 size(m_thumbnailSize, m_thumbnailSize); + + bool isSelected = (asset == m_selectedAsset); + ImU32 bgColor = isSelected ? IM_COL32(45, 140, 240, 60) : IM_COL32(40, 43, 50, 255); + ImU32 borderColor = isSelected ? IM_COL32(45, 140, 240, 255) : IM_COL32(55, 58, 66, 255); + + drawList->AddRectFilled(pos, ImVec2(pos.x + size.x, pos.y + size.y), bgColor, 4.0f); + drawList->AddRect(pos, ImVec2(pos.x + size.x, pos.y + size.y), borderColor, 4.0f); + + // Large icon centered in thumbnail + ImVec2 iconTextSize = ImGui::CalcTextSize(fileIcon); + ImVec2 iconRenderPos(pos.x + (size.x - iconTextSize.x) * 0.5f, + pos.y + (size.y - iconTextSize.y) * 0.5f - 4.0f); + drawList->AddText(iconRenderPos, iconColor, fileIcon); + + // Click handling + ImGui::SetCursorScreenPos(pos); + ImGui::InvisibleButton(asset.c_str(), size); + if (ImGui::IsItemClicked()) + { + SPARK_LOG_DEBUG(Spark::LogCategory::Editor, "Asset selected: %s", filename.c_str()); + m_selectedAsset = asset; + } + if (ext == ".spkmat" && ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) + { + OpenAsset(asset); + } + + if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_SourceAllowNullID)) + { + const std::string reference = IsContainedByProject(assetPath) + ? MakeAssetDragReference(assetPath, PathFromUtf8(m_projectPath)) + : std::string{}; + if (!reference.empty()) + { + ImGui::SetDragDropPayload(kAssetDragPayloadType, reference.c_str(), reference.size() + 1); + ImGui::Text("%s", filename.c_str()); + ImGui::TextDisabled("%s", reference.c_str()); + } + ImGui::EndDragDropSource(); + } + + // Hover tooltip + if (ImGui::IsItemHovered()) + { + ImGui::BeginTooltip(); + ImGui::Text("%s %s", fileIcon, filename.c_str()); + ImGui::TextColored(ImVec4(0.5f, 0.5f, 0.5f, 1.0f), "Type: %s", + ext.empty() ? "Unknown" : ext.c_str()); + try + { + if (std::filesystem::exists(assetPath)) + { + auto fsize = std::filesystem::file_size(assetPath); + if (fsize > 1024 * 1024) + ImGui::Text("Size: %.1f MB", fsize / (1024.0f * 1024.0f)); + else if (fsize > 1024) + ImGui::Text("Size: %.1f KB", fsize / 1024.0f); + else + ImGui::Text("Size: %lld bytes", (long long)fsize); + } + } + catch (...) + { + } + ImGui::EndTooltip(); + } + + // Filename below thumbnail (truncated) + ImGui::SetCursorScreenPos(ImVec2(pos.x, pos.y + size.y + 2.0f)); + int maxChars = (int)(m_thumbnailSize / 7.0f); + if ((int)filename.length() > maxChars) + { + filename = filename.substr(0, maxChars - 3) + "..."; + } + ImGui::TextWrapped("%s", filename.c_str()); + + itemIndex++; + } + ImGui::EndTable(); + } + + if (!requestedFolder.empty()) + NavigateToFolder(requestedFolder); + + ImGui::EndChild(); + } + + void AssetBrowserPanel::RenderAssetDetails() + { + ImGui::BeginChild("AssetDetails", ImVec2(0, 100)); + + if (!m_selectedAsset.empty()) + { + ImGui::Text("Selected: %s", PathToUtf8(PathFromUtf8(m_selectedAsset).filename()).c_str()); + ImGui::Text("Path: %s", m_selectedAsset.c_str()); + + try + { + const std::filesystem::path selectedPath = PathFromUtf8(m_selectedAsset); + if (std::filesystem::exists(selectedPath)) + { + auto fileSize = std::filesystem::file_size(selectedPath); + ImGui::Text("Size: %ju bytes", static_cast(fileSize)); + + (void)std::filesystem::last_write_time(selectedPath); + ImGui::Text("Modified: [File timestamp]"); + } + } + catch (const std::exception&) + { + ImGui::TextColored(ImVec4(1, 0.5f, 0.5f, 1), "Error reading file info"); + } + } + else + { + ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "No asset selected"); + } + + ImGui::EndChild(); + } + +} // namespace SparkEditor diff --git a/SparkEditor/Source/Panels/AssetBrowserPanel.cpp b/SparkEditor/Source/Panels/AssetBrowserPanel.cpp index 955e25c85..947001a7e 100644 --- a/SparkEditor/Source/Panels/AssetBrowserPanel.cpp +++ b/SparkEditor/Source/Panels/AssetBrowserPanel.cpp @@ -6,6 +6,7 @@ */ #include "AssetBrowserPanel.h" +#include "AssetBrowserPathUtils.h" #include "../AssetPipeline/EditorAssetDrag.h" #include "Graphics/GraphicsEngine.h" @@ -27,32 +28,8 @@ namespace SparkEditor namespace { namespace fs = std::filesystem; - - std::string PathToUtf8(const fs::path& path) noexcept - { - try - { - const auto utf8 = path.generic_u8string(); - return {reinterpret_cast(utf8.data()), utf8.size()}; - } - catch (...) - { - return {}; - } - } - - fs::path PathFromUtf8(std::string_view value) noexcept - { - try - { - const auto* begin = reinterpret_cast(value.data()); - return fs::path(std::u8string(begin, begin + value.size())); - } - catch (...) - { - return {}; - } - } + using AssetBrowserDetail::PathFromUtf8; + using AssetBrowserDetail::PathToUtf8; std::string CanonicalDirectoryString(const fs::path& path, std::error_code& ec) { @@ -120,186 +97,36 @@ namespace SparkEditor // Update asset browser logic } - // Helper to get icon for file extension - static const char* GetFileTypeIcon(const std::string& ext) + void AssetBrowserPanel::Shutdown() { - if (ext == ".fbx" || ext == ".obj" || ext == ".gltf" || ext == ".glb") - return ICON_FA_CUBE; - if (ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".tga" || ext == ".bmp" || ext == ".dds") - return ICON_FA_IMAGE; - if (ext == ".wav" || ext == ".mp3" || ext == ".ogg") - return ICON_FA_VOLUME_UP; - if (ext == ".cpp" || ext == ".h" || ext == ".hpp" || ext == ".lua") - return ICON_FA_CODE; - if (ext == ".hlsl" || ext == ".glsl" || ext == ".shader") - return ICON_FA_PAINT_BRUSH; - if (ext == ".mat" || ext == ".material") - return ICON_FA_CIRCLE; - if (ext == ".scene" || ext == ".map") - return ICON_FA_MAP; - if (ext == ".prefab") - return ICON_FA_SHAPES; - if (ext == ".ttf" || ext == ".otf") - return ICON_FA_FONT; - if (ext == ".json" || ext == ".xml" || ext == ".ini" || ext == ".cfg") - return ICON_FA_COG; - return ICON_FA_FILE; + std::cout << "Shutting down Asset Browser panel\n"; } - static ImU32 GetFileTypeColor(const std::string& ext) + bool AssetBrowserPanel::HandleEvent(const std::string& eventType, void* eventData) { - if (ext == ".fbx" || ext == ".obj" || ext == ".gltf" || ext == ".glb") - return IM_COL32(100, 200, 255, 255); - if (ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".tga") - return IM_COL32(200, 150, 255, 255); - if (ext == ".wav" || ext == ".mp3" || ext == ".ogg") - return IM_COL32(255, 200, 100, 255); - if (ext == ".cpp" || ext == ".h" || ext == ".hpp" || ext == ".lua") - return IM_COL32(100, 255, 150, 255); - if (ext == ".hlsl" || ext == ".glsl" || ext == ".shader") - return IM_COL32(255, 150, 150, 255); - return IM_COL32(180, 180, 180, 255); + return false; } - void AssetBrowserPanel::Render() + bool AssetBrowserPanel::OpenAsset(const std::string& filePath) { - if (!IsVisible()) - return; - - if (BeginPanel()) + std::error_code error; + const auto path = std::filesystem::weakly_canonical(PathFromUtf8(filePath), error); + if (error || !IsContainedByProject(path) || !std::filesystem::is_regular_file(path, error) || error) { - // Toolbar with icons - ImGui::BeginDisabled(!HasValidProjectRoot()); - if (ImGui::Button(ICON_FA_DOWNLOAD " Import")) - { - ImGui::OpenPopup("ImportAssetPath"); - } - ImGui::EndDisabled(); - if (!HasValidProjectRoot() && ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled)) - ImGui::SetTooltip("Open a project before importing assets"); - - // Simple path input popup for importing an asset - if (ImGui::BeginPopup("ImportAssetPath")) - { - static char importPathBuf[512] = ""; - ImGui::Text("Enter file path to import:"); - ImGui::SetNextItemWidth(400); - bool enterPressed = ImGui::InputText("##ImportPath", importPathBuf, sizeof(importPathBuf), - ImGuiInputTextFlags_EnterReturnsTrue); - ImGui::SameLine(); - if (ImGui::Button("OK") || enterPressed) - { - if (importPathBuf[0] != '\0') - { - if (ImportAsset(std::string(importPathBuf))) - { - importPathBuf[0] = '\0'; - ImGui::CloseCurrentPopup(); - } - } - else - { - SetOperationResult(false, "Enter a source file path"); - } - } - ImGui::SameLine(); - if (ImGui::Button("Cancel")) - { - importPathBuf[0] = '\0'; - ImGui::CloseCurrentPopup(); - } - if (!m_lastOperationMessage.empty()) - { - const ImVec4 color = - m_lastOperationSucceeded ? ImVec4(0.45f, 0.85f, 0.5f, 1.0f) : ImVec4(1.0f, 0.45f, 0.45f, 1.0f); - ImGui::TextColored(color, "%s", m_lastOperationMessage.c_str()); - } - ImGui::EndPopup(); - } - ImGui::SameLine(); - if (ImGui::Button(ICON_FA_SYNC_ALT " Refresh")) - { - RefreshAssets(); - } - ImGui::SameLine(); - ImGui::SetNextItemWidth(100); - ImGui::SliderFloat("##Size", &m_thumbnailSize, 32.0f, 128.0f, "%.0f px"); - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("Thumbnail Size"); - - // Breadcrumb navigation - ImGui::SameLine(); - ImGui::Text("|"); - ImGui::SameLine(); - - // Build breadcrumb path - std::filesystem::path currentPath = PathFromUtf8(m_currentFolder); - std::filesystem::path rootPath = PathFromUtf8(m_projectPath); - std::vector breadcrumbs; - std::filesystem::path tempPath = currentPath; - while (tempPath != rootPath && tempPath.has_parent_path() && tempPath != tempPath.parent_path()) - { - breadcrumbs.push_back(tempPath); - tempPath = tempPath.parent_path(); - } - breadcrumbs.push_back(rootPath); - std::reverse(breadcrumbs.begin(), breadcrumbs.end()); - - for (size_t i = 0; i < breadcrumbs.size(); ++i) - { - if (i > 0) - { - ImGui::SameLine(0, 2); - ImGui::TextColored(ImVec4(0.5f, 0.5f, 0.5f, 1.0f), ICON_FA_CHEVRON_RIGHT); - ImGui::SameLine(0, 2); - } - std::string label = (i == 0) ? ICON_FA_HOME " Assets" : PathToUtf8(breadcrumbs[i].filename()); - if (ImGui::SmallButton(label.c_str())) - { - NavigateToFolder(PathToUtf8(breadcrumbs[i])); - } - } - - if (!m_lastOperationMessage.empty()) - { - ImGui::SameLine(); - const ImVec4 color = - m_lastOperationSucceeded ? ImVec4(0.45f, 0.85f, 0.5f, 1.0f) : ImVec4(1.0f, 0.45f, 0.45f, 1.0f); - ImGui::TextColored(color, "%s", m_lastOperationMessage.c_str()); - } - - ImGui::Separator(); - - // Split view - if (ImGui::BeginTable("AssetBrowserTable", 2, ImGuiTableFlags_Resizable)) - { - ImGui::TableSetupColumn("Folders", ImGuiTableColumnFlags_WidthFixed, 200.0f); - ImGui::TableSetupColumn("Assets", ImGuiTableColumnFlags_WidthStretch); - - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(0); - RenderFolderTree(); - - ImGui::TableSetColumnIndex(1); - RenderAssetGrid(); - - ImGui::EndTable(); - } - - ImGui::Separator(); - RenderAssetDetails(); + SetOperationResult(false, "Cannot open an asset outside the active project or a missing file"); + return false; } - EndPanel(); - } - - void AssetBrowserPanel::Shutdown() - { - std::cout << "Shutting down Asset Browser panel\n"; - } - - bool AssetBrowserPanel::HandleEvent(const std::string& eventType, void* eventData) - { - return false; + std::string extension = PathToUtf8(path.extension()); + std::transform(extension.begin(), extension.end(), extension.begin(), + [](unsigned char character) { return static_cast(std::tolower(character)); }); + if (extension != ".spkmat" || !m_onMaterialOpened) + { + SetOperationResult(false, "No material editor is available for this asset"); + return false; + } + m_onMaterialOpened(PathToUtf8(path)); + SetOperationResult(true, "Material open requested"); + return true; } void AssetBrowserPanel::SetProjectPath(const std::string& projectPath) @@ -407,188 +234,6 @@ namespace SparkEditor } } - void AssetBrowserPanel::RenderAssetGrid() - { - ImGui::BeginChild("AssetGrid"); - - // Asset grid - float panelWidth = ImGui::GetContentRegionAvail().x; - float cellWidth = m_thumbnailSize + 14.0f; - int columns = std::max(1, (int)(panelWidth / cellWidth)); - std::string requestedFolder; - - if (ImGui::BeginTable("AssetGridTable", columns)) - { - int itemIndex = 0; - for (const auto& folder : m_folders) - { - if (itemIndex % columns == 0) - ImGui::TableNextRow(); - ImGui::TableSetColumnIndex(itemIndex % columns); - - const std::filesystem::path folderPath = PathFromUtf8(folder); - const std::string folderName = PathToUtf8(folderPath.filename()); - const ImVec2 pos = ImGui::GetCursorScreenPos(); - const ImVec2 size(m_thumbnailSize, m_thumbnailSize); - ImDrawList* drawList = ImGui::GetWindowDrawList(); - drawList->AddRectFilled(pos, ImVec2(pos.x + size.x, pos.y + size.y), IM_COL32(40, 43, 50, 255), 4.0f); - drawList->AddRect(pos, ImVec2(pos.x + size.x, pos.y + size.y), IM_COL32(70, 75, 86, 255), 4.0f); - - const char* icon = ICON_FA_FOLDER; - const ImVec2 iconSize = ImGui::CalcTextSize(icon); - drawList->AddText( - ImVec2(pos.x + (size.x - iconSize.x) * 0.5f, pos.y + (size.y - iconSize.y) * 0.5f - 4.0f), - IM_COL32(235, 190, 85, 255), icon); - - ImGui::SetCursorScreenPos(pos); - ImGui::InvisibleButton(("##folder_" + folder).c_str(), size); - if (ImGui::IsItemClicked()) - requestedFolder = folder; - if (ImGui::IsItemHovered()) - ImGui::SetTooltip("Open folder: %s", folderName.c_str()); - - ImGui::SetCursorScreenPos(ImVec2(pos.x, pos.y + size.y + 2.0f)); - ImGui::TextWrapped("%s", folderName.c_str()); - ++itemIndex; - } - - for (const auto& asset : m_assets) - { - if (itemIndex % columns == 0) - { - ImGui::TableNextRow(); - } - ImGui::TableSetColumnIndex(itemIndex % columns); - - std::filesystem::path assetPath = PathFromUtf8(asset); - std::string ext = PathToUtf8(assetPath.extension()); - std::transform(ext.begin(), ext.end(), ext.begin(), - [](unsigned char c) { return static_cast(std::tolower(c)); }); - std::string filename = PathToUtf8(assetPath.filename()); - const char* fileIcon = GetFileTypeIcon(ext); - ImU32 iconColor = GetFileTypeColor(ext); - - // Thumbnail - ImDrawList* drawList = ImGui::GetWindowDrawList(); - ImVec2 pos = ImGui::GetCursorScreenPos(); - ImVec2 size(m_thumbnailSize, m_thumbnailSize); - - bool isSelected = (asset == m_selectedAsset); - ImU32 bgColor = isSelected ? IM_COL32(45, 140, 240, 60) : IM_COL32(40, 43, 50, 255); - ImU32 borderColor = isSelected ? IM_COL32(45, 140, 240, 255) : IM_COL32(55, 58, 66, 255); - - drawList->AddRectFilled(pos, ImVec2(pos.x + size.x, pos.y + size.y), bgColor, 4.0f); - drawList->AddRect(pos, ImVec2(pos.x + size.x, pos.y + size.y), borderColor, 4.0f); - - // Large icon centered in thumbnail - ImVec2 iconTextSize = ImGui::CalcTextSize(fileIcon); - ImVec2 iconRenderPos(pos.x + (size.x - iconTextSize.x) * 0.5f, - pos.y + (size.y - iconTextSize.y) * 0.5f - 4.0f); - drawList->AddText(iconRenderPos, iconColor, fileIcon); - - // Click handling - ImGui::SetCursorScreenPos(pos); - ImGui::InvisibleButton(asset.c_str(), size); - if (ImGui::IsItemClicked()) - { - SPARK_LOG_DEBUG(Spark::LogCategory::Editor, "Asset selected: %s", filename.c_str()); - m_selectedAsset = asset; - } - - if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_SourceAllowNullID)) - { - const std::string reference = IsContainedByProject(assetPath) - ? MakeAssetDragReference(assetPath, PathFromUtf8(m_projectPath)) - : std::string{}; - if (!reference.empty()) - { - ImGui::SetDragDropPayload(kAssetDragPayloadType, reference.c_str(), reference.size() + 1); - ImGui::Text("%s", filename.c_str()); - ImGui::TextDisabled("%s", reference.c_str()); - } - ImGui::EndDragDropSource(); - } - - // Hover tooltip - if (ImGui::IsItemHovered()) - { - ImGui::BeginTooltip(); - ImGui::Text("%s %s", fileIcon, filename.c_str()); - ImGui::TextColored(ImVec4(0.5f, 0.5f, 0.5f, 1.0f), "Type: %s", - ext.empty() ? "Unknown" : ext.c_str()); - try - { - if (std::filesystem::exists(assetPath)) - { - auto fsize = std::filesystem::file_size(assetPath); - if (fsize > 1024 * 1024) - ImGui::Text("Size: %.1f MB", fsize / (1024.0f * 1024.0f)); - else if (fsize > 1024) - ImGui::Text("Size: %.1f KB", fsize / 1024.0f); - else - ImGui::Text("Size: %lld bytes", (long long)fsize); - } - } - catch (...) - { - } - ImGui::EndTooltip(); - } - - // Filename below thumbnail (truncated) - ImGui::SetCursorScreenPos(ImVec2(pos.x, pos.y + size.y + 2.0f)); - int maxChars = (int)(m_thumbnailSize / 7.0f); - if ((int)filename.length() > maxChars) - { - filename = filename.substr(0, maxChars - 3) + "..."; - } - ImGui::TextWrapped("%s", filename.c_str()); - - itemIndex++; - } - ImGui::EndTable(); - } - - if (!requestedFolder.empty()) - NavigateToFolder(requestedFolder); - - ImGui::EndChild(); - } - - void AssetBrowserPanel::RenderAssetDetails() - { - ImGui::BeginChild("AssetDetails", ImVec2(0, 100)); - - if (!m_selectedAsset.empty()) - { - ImGui::Text("Selected: %s", PathToUtf8(PathFromUtf8(m_selectedAsset).filename()).c_str()); - ImGui::Text("Path: %s", m_selectedAsset.c_str()); - - try - { - const std::filesystem::path selectedPath = PathFromUtf8(m_selectedAsset); - if (std::filesystem::exists(selectedPath)) - { - auto fileSize = std::filesystem::file_size(selectedPath); - ImGui::Text("Size: %ju bytes", static_cast(fileSize)); - - (void)std::filesystem::last_write_time(selectedPath); - ImGui::Text("Modified: [File timestamp]"); - } - } - catch (const std::exception&) - { - ImGui::TextColored(ImVec4(1, 0.5f, 0.5f, 1), "Error reading file info"); - } - } - else - { - ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "No asset selected"); - } - - ImGui::EndChild(); - } - void AssetBrowserPanel::RefreshAssets() { m_assets.clear(); diff --git a/SparkEditor/Source/Panels/AssetBrowserPanel.h b/SparkEditor/Source/Panels/AssetBrowserPanel.h index 9ae122690..f24a4c71e 100644 --- a/SparkEditor/Source/Panels/AssetBrowserPanel.h +++ b/SparkEditor/Source/Panels/AssetBrowserPanel.h @@ -12,6 +12,7 @@ #include #include #include +#include class GraphicsEngine; @@ -92,6 +93,15 @@ namespace SparkEditor */ bool ImportAsset(const std::string& filePath); + /// @brief Request the editor for a .spkmat file inside the active asset root. + bool OpenAsset(const std::string& filePath); + + /// @brief Connect material activation to the persistent material editor panel. + void SetOnMaterialOpened(std::function callback) + { + m_onMaterialOpened = std::move(callback); + } + /// @brief Wire live basic-path cache invalidation after an import. void SetGraphics(GraphicsEngine* graphics) { m_graphics = graphics; } @@ -122,6 +132,7 @@ namespace SparkEditor bool m_lastOperationSucceeded = false; float m_thumbnailSize = 64.0f; GraphicsEngine* m_graphics = nullptr; ///< Non-owning; owned by EditorUI. + std::function m_onMaterialOpened; }; } // namespace SparkEditor diff --git a/SparkEditor/Source/Panels/AssetBrowserPathUtils.h b/SparkEditor/Source/Panels/AssetBrowserPathUtils.h new file mode 100644 index 000000000..4a2e69a19 --- /dev/null +++ b/SparkEditor/Source/Panels/AssetBrowserPathUtils.h @@ -0,0 +1,37 @@ +/** @file AssetBrowserPathUtils.h + * @brief Internal UTF-8 path conversions shared by the asset browser's file and UI paths. + */ +#pragma once +#include +#include +#include +namespace SparkEditor::AssetBrowserDetail +{ + namespace fs = std::filesystem; + inline std::string PathToUtf8(const fs::path& path) noexcept + { + try + { + const auto utf8 = path.generic_u8string(); + return {reinterpret_cast(utf8.data()), utf8.size()}; + } + catch (...) + { + return {}; + } + } + + inline fs::path PathFromUtf8(std::string_view value) noexcept + { + try + { + const auto* begin = reinterpret_cast(value.data()); + return fs::path(std::u8string(begin, begin + value.size())); + } + catch (...) + { + return {}; + } + } + +} // namespace SparkEditor::AssetBrowserDetail diff --git a/SparkEditor/Source/Panels/MaterialEditorDefaults.cpp b/SparkEditor/Source/Panels/MaterialEditorDefaults.cpp new file mode 100644 index 000000000..c06ae844c --- /dev/null +++ b/SparkEditor/Source/Panels/MaterialEditorDefaults.cpp @@ -0,0 +1,208 @@ +/** + * @file MaterialEditorDefaults.cpp + * @brief Shared standard PBR schema used by authoring, decoding, and fuzzing. + */ +#include "MaterialEditorMaterialParser.h" +#include "MaterialEditorPanel.h" +namespace SparkEditor +{ + void InitializeStandardPBRParameters(MaterialDefinition& material) + { + // ---- Surface group ---- + { + ShaderParameter albedoColor; + albedoColor.name = "albedoColor"; + albedoColor.displayName = "Albedo Color"; + albedoColor.type = ShaderParamType::Color; + albedoColor.group = "Surface"; + albedoColor.floatValues[0] = 0.8f; + albedoColor.floatValues[1] = 0.8f; + albedoColor.floatValues[2] = 0.8f; + albedoColor.floatValues[3] = 1.0f; + albedoColor.tooltip = "Base color of the surface (linear space)"; + material.parameters.push_back(albedoColor); + } + { + ShaderParameter metallic; + metallic.name = "metallic"; + metallic.displayName = "Metallic"; + metallic.type = ShaderParamType::Float; + metallic.group = "Surface"; + metallic.floatValues[0] = 0.0f; + metallic.minValue = 0.0f; + metallic.maxValue = 1.0f; + metallic.step = 0.01f; + metallic.tooltip = "0 = dielectric, 1 = metallic"; + material.parameters.push_back(metallic); + } + { + ShaderParameter roughness; + roughness.name = "roughness"; + roughness.displayName = "Roughness"; + roughness.type = ShaderParamType::Float; + roughness.group = "Surface"; + roughness.floatValues[0] = 0.5f; + roughness.minValue = 0.0f; + roughness.maxValue = 1.0f; + roughness.step = 0.01f; + roughness.tooltip = "0 = mirror-smooth, 1 = fully rough"; + material.parameters.push_back(roughness); + } + { + ShaderParameter opacity; + opacity.name = "opacity"; + opacity.displayName = "Opacity"; + opacity.type = ShaderParamType::Float; + opacity.group = "Surface"; + opacity.floatValues[0] = 1.0f; + opacity.minValue = 0.0f; + opacity.maxValue = 1.0f; + opacity.step = 0.01f; + opacity.tooltip = "Overall opacity of the material"; + material.parameters.push_back(opacity); + } + + // ---- Normal group ---- + { + ShaderParameter normalStrength; + normalStrength.name = "normalStrength"; + normalStrength.displayName = "Normal Strength"; + normalStrength.type = ShaderParamType::Float; + normalStrength.group = "Normal"; + normalStrength.floatValues[0] = 1.0f; + normalStrength.minValue = 0.0f; + normalStrength.maxValue = 2.0f; + normalStrength.step = 0.01f; + normalStrength.tooltip = "Intensity of the normal map effect"; + material.parameters.push_back(normalStrength); + } + + // ---- Emission group ---- + { + ShaderParameter emissionColor; + emissionColor.name = "emissionColor"; + emissionColor.displayName = "Emission Color"; + emissionColor.type = ShaderParamType::Color; + emissionColor.group = "Emission"; + emissionColor.floatValues[0] = 0.0f; + emissionColor.floatValues[1] = 0.0f; + emissionColor.floatValues[2] = 0.0f; + emissionColor.floatValues[3] = 1.0f; + emissionColor.isHDR = true; + emissionColor.tooltip = "Emissive color (HDR values allowed)"; + material.parameters.push_back(emissionColor); + } + { + ShaderParameter emissionIntensity; + emissionIntensity.name = "emissionIntensity"; + emissionIntensity.displayName = "Emission Intensity"; + emissionIntensity.type = ShaderParamType::Float; + emissionIntensity.group = "Emission"; + emissionIntensity.floatValues[0] = 0.0f; + emissionIntensity.minValue = 0.0f; + emissionIntensity.maxValue = 20.0f; + emissionIntensity.step = 0.1f; + emissionIntensity.tooltip = "Brightness multiplier for emission"; + material.parameters.push_back(emissionIntensity); + } + + // ---- Ambient Occlusion group ---- + { + ShaderParameter aoStrength; + aoStrength.name = "aoStrength"; + aoStrength.displayName = "AO Strength"; + aoStrength.type = ShaderParamType::Float; + aoStrength.group = "Ambient Occlusion"; + aoStrength.floatValues[0] = 1.0f; + aoStrength.minValue = 0.0f; + aoStrength.maxValue = 1.0f; + aoStrength.step = 0.01f; + aoStrength.tooltip = "Strength of the ambient occlusion effect"; + material.parameters.push_back(aoStrength); + } + + // ---- Detail group ---- + { + ShaderParameter detailTiling; + detailTiling.name = "detailTiling"; + detailTiling.displayName = "Detail Tiling"; + detailTiling.type = ShaderParamType::Float2; + detailTiling.group = "Detail"; + detailTiling.floatValues[0] = 1.0f; + detailTiling.floatValues[1] = 1.0f; + detailTiling.minValue = 0.01f; + detailTiling.maxValue = 50.0f; + detailTiling.tooltip = "UV tiling for detail textures"; + material.parameters.push_back(detailTiling); + } + { + ShaderParameter useDetailMap; + useDetailMap.name = "useDetailMap"; + useDetailMap.displayName = "Use Detail Map"; + useDetailMap.type = ShaderParamType::Bool; + useDetailMap.group = "Detail"; + useDetailMap.boolValue = false; + useDetailMap.tooltip = "Enable detail texture overlay"; + material.parameters.push_back(useDetailMap); + } + + // ---- Texture Slots ---- + { + TextureSlot albedo; + albedo.name = "Albedo"; + albedo.bindSlot = 0; + albedo.filter = TextureSlot::FilterMode::Trilinear; + material.textureSlots.push_back(albedo); + } + { + TextureSlot normal; + normal.name = "Normal"; + normal.bindSlot = 1; + normal.filter = TextureSlot::FilterMode::Trilinear; + material.textureSlots.push_back(normal); + } + { + TextureSlot metallic; + metallic.name = "Metallic"; + metallic.bindSlot = 2; + metallic.filter = TextureSlot::FilterMode::Bilinear; + material.textureSlots.push_back(metallic); + } + { + TextureSlot roughness; + roughness.name = "Roughness"; + roughness.bindSlot = 3; + roughness.filter = TextureSlot::FilterMode::Bilinear; + material.textureSlots.push_back(roughness); + } + { + TextureSlot ao; + ao.name = "Ambient Occlusion"; + ao.bindSlot = 4; + ao.filter = TextureSlot::FilterMode::Bilinear; + material.textureSlots.push_back(ao); + } + { + TextureSlot emission; + emission.name = "Emission"; + emission.bindSlot = 5; + emission.filter = TextureSlot::FilterMode::Bilinear; + material.textureSlots.push_back(emission); + } + { + TextureSlot height; + height.name = "Height"; + height.bindSlot = 6; + height.filter = TextureSlot::FilterMode::Bilinear; + material.textureSlots.push_back(height); + } + { + TextureSlot detail; + detail.name = "Detail"; + detail.bindSlot = 7; + detail.filter = TextureSlot::FilterMode::Trilinear; + material.textureSlots.push_back(detail); + } + } + +} // namespace SparkEditor diff --git a/SparkEditor/Source/Panels/MaterialEditorFiles.cpp b/SparkEditor/Source/Panels/MaterialEditorFiles.cpp new file mode 100644 index 000000000..398b5757e --- /dev/null +++ b/SparkEditor/Source/Panels/MaterialEditorFiles.cpp @@ -0,0 +1,226 @@ +/** + * @file MaterialEditorFiles.cpp + * @brief Read and write the material editor's .spkmat assets. + */ +#include "MaterialEditorPanel.h" +#include "MaterialEditorMaterialParser.h" +#include "Utils/FileUtils.h" +#include "Utils/LogMacros.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace SparkEditor +{ + void MaterialEditorPanel::OpenMaterial(const std::string& materialPath) + { + for (int index = 0; index < static_cast(m_materials.size()); ++index) + { + if (m_materials[index].filePath == materialPath) + { + m_selectedMaterialIndex = index; + SetVisible(true); + return; + } + } + const auto path = Spark::FileUtils::PathFromUtf8(materialPath); + std::error_code error; + constexpr uintmax_t maximumBytes = kMaxMaterialTextBytes; + const auto size = std::filesystem::file_size(path, error); + if (error || size > maximumBytes) + { + SPARK_LOG_ERROR(Spark::LogCategory::Editor, "Material Editor: cannot read material '%s'", + materialPath.c_str()); + return; + } + std::ifstream file(path, std::ios::binary); + std::string contents(static_cast(size), '\0'); + if (!file.is_open() || !file.read(contents.data(), static_cast(contents.size())) || + file.peek() != std::char_traits::eof() || contents.find('\0') != std::string::npos) + { + SPARK_LOG_ERROR(Spark::LogCategory::Editor, "Material Editor: cannot read material '%s'", + materialPath.c_str()); + return; + } + MaterialDefinition material; + material.filePath = materialPath; + if (!ParseMaterialText(contents, material)) + { + SPARK_LOG_ERROR(Spark::LogCategory::Editor, "Material Editor: invalid material '%s'", materialPath.c_str()); + return; + } + m_materials.push_back(std::move(material)); + m_selectedMaterialIndex = static_cast(m_materials.size()) - 1; + SetVisible(true); + NotifyStateChange(); + } + + void MaterialEditorPanel::CreateMaterial(const std::string& name, const std::string& shaderPath) + { + MaterialDefinition material; + material.name = name; + material.shaderPath = shaderPath; + material.filePath = "Assets/Materials/" + name + ".spkmat"; + material.isModified = true; + material.isBuiltIn = false; + + PopulateDefaultPBRParameters(material); + + m_materials.push_back(std::move(material)); + m_selectedMaterialIndex = static_cast(m_materials.size()) - 1; + SetModified(true); + + SPARK_LOG_INFO(Spark::LogCategory::Editor, "Material Editor: created material '%s' (shader='%s')", name.c_str(), + shaderPath.c_str()); + } + + bool MaterialEditorPanel::SaveMaterial() + { + MaterialDefinition* selected = GetSelectedMaterial(); + if (selected == nullptr) + { + SPARK_LOG_WARN(Spark::LogCategory::Editor, "Material Editor: no material selected to save"); + return false; + } + + if (selected->isBuiltIn) + { + SPARK_LOG_WARN(Spark::LogCategory::Editor, "Material Editor: cannot save built-in material '%s'", + selected->name.c_str()); + return false; + } + + const auto materialPath = Spark::FileUtils::PathFromUtf8(selected->filePath); + if (materialPath.empty()) + { + SPARK_LOG_ERROR(Spark::LogCategory::Editor, "Material Editor: cannot save to an empty file path"); + return false; + } + std::error_code directoryError; + if (!materialPath.parent_path().empty()) + { + std::filesystem::create_directories(materialPath.parent_path(), directoryError); + } + if (directoryError) + { + SPARK_LOG_ERROR(Spark::LogCategory::Editor, "Material Editor: cannot create parent directory for '%s': %s", + selected->filePath.c_str(), directoryError.message().c_str()); + return false; + } + + // Serialize the existing .spkmat format through its native path on Windows. + std::ofstream file(materialPath); + if (!file.is_open()) + { + SPARK_LOG_ERROR(Spark::LogCategory::Editor, "Material Editor: failed to open file '%s' for writing", + selected->filePath.c_str()); + return false; + } + + file << "# SparkEngine Material\n"; + file << "name: " << selected->name << "\n"; + file << "shader: " << selected->shaderPath << "\n"; + file << "\n"; + + // Write parameters + file << "# Parameters\n"; + for (const auto& param : selected->parameters) + { + file << "param " << param.name << " "; + switch (param.type) + { + case ShaderParamType::Float: + file << "float " << param.floatValues[0] << "\n"; + break; + case ShaderParamType::Float2: + file << "float2 " << param.floatValues[0] << " " << param.floatValues[1] << "\n"; + break; + case ShaderParamType::Float3: + file << "float3 " << param.floatValues[0] << " " << param.floatValues[1] << " " << param.floatValues[2] + << "\n"; + break; + case ShaderParamType::Float4: + file << "float4 " << param.floatValues[0] << " " << param.floatValues[1] << " " << param.floatValues[2] + << " " << param.floatValues[3] << "\n"; + break; + case ShaderParamType::Color: + file << "color " << param.floatValues[0] << " " << param.floatValues[1] << " " << param.floatValues[2] + << " " << param.floatValues[3] << "\n"; + break; + case ShaderParamType::Int: + file << "int " << param.intValue << "\n"; + break; + case ShaderParamType::Bool: + file << "bool " << (param.boolValue ? "true" : "false") << "\n"; + break; + case ShaderParamType::Texture2D: + file << "texture2d " << (param.texturePath.empty() ? "none" : param.texturePath) << "\n"; + break; + case ShaderParamType::TextureCube: + file << "texturecube " << (param.texturePath.empty() ? "none" : param.texturePath) << "\n"; + break; + case ShaderParamType::Matrix4x4: + file << "matrix4x4"; + for (float value : param.floatValues) + { + file << " " << value; + } + file << "\n"; + break; + } + } + file << "\n"; + + // Write texture slots + file << "# Texture Slots\n"; + for (const auto& slot : selected->textureSlots) + { + file << "texture_slot " << slot.name << " " << slot.bindSlot << " " + << (slot.texturePath.empty() ? "none" : slot.texturePath) << " " << slot.tilingU << " " << slot.tilingV + << " " << slot.offsetU << " " << slot.offsetV << "\n"; + } + file << "\n"; + + // Write render state + file << "# Render State\n"; + file << "blend_mode " << static_cast(selected->renderState.blendMode) << "\n"; + file << "cull_mode " << static_cast(selected->renderState.cullMode) << "\n"; + file << "depth_write " << (selected->renderState.depthWrite ? "true" : "false") << "\n"; + file << "depth_test " << (selected->renderState.depthTest ? "true" : "false") << "\n"; + file << "cast_shadows " << (selected->renderState.castShadows ? "true" : "false") << "\n"; + file << "receive_shadows " << (selected->renderState.receiveShadows ? "true" : "false") << "\n"; + file << "alpha_clip " << selected->renderState.alphaClipThreshold << "\n"; + file << "render_queue " << selected->renderState.renderQueue << "\n"; + + file.flush(); + if (!file.good()) + { + SPARK_LOG_ERROR(Spark::LogCategory::Editor, "Material Editor: failed to write material '%s'", + selected->filePath.c_str()); + return false; + } + file.close(); + if (file.fail()) + { + SPARK_LOG_ERROR(Spark::LogCategory::Editor, "Material Editor: failed to close material '%s'", + selected->filePath.c_str()); + return false; + } + + selected->isModified = false; + SetModified(false); + NotifyStateChange(); + + std::cout << "Material Editor: saved material '" << selected->name << "' to '" << selected->filePath << "'\n"; + return true; + } + +} // namespace SparkEditor diff --git a/SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp b/SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp new file mode 100644 index 000000000..e93081eee --- /dev/null +++ b/SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp @@ -0,0 +1,352 @@ +/** + * @file MaterialEditorMaterialParser.cpp + * @brief UI-free, bounded decoder for the editor's legacy .spkmat format. + */ +#include "MaterialEditorMaterialParser.h" +#include "MaterialEditorPanel.h" +#include +#include +#include +#include +#include +#include +#include +namespace SparkEditor +{ + namespace + { + void Trim(std::string& text) + { + const auto first = text.find_first_not_of(" \t\r\n"); + if (first == std::string::npos) + { + text.clear(); + } + else + { + text = text.substr(first, text.find_last_not_of(" \t\r\n") - first + 1); + } + } + + template bool ReadValues(std::istringstream& input, Values&... values) + { + if (!(input >> ... >> values)) + { + return false; + } + input >> std::ws; + return input.eof(); + } + + bool ReadBool(std::istringstream& input, bool& value) + { + std::string token; + if (!ReadValues(input, token) || (token != "true" && token != "false")) + { + return false; + } + value = token == "true"; + return true; + } + + bool ReadParameter(std::istringstream& input, MaterialDefinition& material, std::set& seen) + { + std::string name, type; + if (!(input >> name >> type) || !seen.insert(name).second) + { + return false; + } + static constexpr std::array, 10> types = { + {{"float", ShaderParamType::Float}, + {"float2", ShaderParamType::Float2}, + {"float3", ShaderParamType::Float3}, + {"float4", ShaderParamType::Float4}, + {"int", ShaderParamType::Int}, + {"bool", ShaderParamType::Bool}, + {"texture2d", ShaderParamType::Texture2D}, + {"texturecube", ShaderParamType::TextureCube}, + {"color", ShaderParamType::Color}, + {"matrix4x4", ShaderParamType::Matrix4x4}}}; + const auto found = + std::find_if(types.begin(), types.end(), [&](const auto& entry) { return entry.first == type; }); + if (found == types.end()) + { + return false; + } + ShaderParameter* existing = material.FindParameter(name); + ShaderParameter parameter = existing ? *existing : ShaderParameter{}; + parameter.name = name; + if (parameter.displayName.empty()) + { + parameter.displayName = name; + } + if (parameter.group.empty()) + { + parameter.group = "Parameters"; + } + parameter.type = found->second; + if (parameter.type == ShaderParamType::Int) + { + if (!ReadValues(input, parameter.intValue)) + { + return false; + } + } + else if (parameter.type == ShaderParamType::Bool) + { + if (!ReadBool(input, parameter.boolValue)) + { + return false; + } + } + else if (parameter.type == ShaderParamType::Texture2D || parameter.type == ShaderParamType::TextureCube) + { + std::getline(input, parameter.texturePath); + Trim(parameter.texturePath); + if (parameter.texturePath.empty()) + { + return false; + } + if (parameter.texturePath == "none") + { + parameter.texturePath.clear(); + } + } + else + { + const size_t count = parameter.type == ShaderParamType::Float ? 1 + : parameter.type == ShaderParamType::Float2 ? 2 + : parameter.type == ShaderParamType::Float3 ? 3 + : parameter.type == ShaderParamType::Matrix4x4 ? 16 + : 4; + for (size_t index = 0; index < count; ++index) + { + if (!(input >> parameter.floatValues[index]) || !std::isfinite(parameter.floatValues[index])) + { + return false; + } + } + input >> std::ws; + if (!input.eof()) + { + return false; + } + } + if (existing) + { + *existing = std::move(parameter); + } + else + { + material.parameters.push_back(std::move(parameter)); + } + return true; + } + + bool ReadTextureSlot(std::istringstream& input, MaterialDefinition& material, std::set& seen) + { + std::string name, tail; + std::string record; + std::getline(input, record); + Trim(record); + // The legacy writer emits default names such as "Ambient Occlusion" + // without quotes. Prefer the longest known name before its binding. + for (const auto& candidate : material.textureSlots) + { + const size_t length = candidate.name.size(); + if (length > name.size() && record.size() > length && record.starts_with(candidate.name) && + (record[length] == ' ' || record[length] == '\t')) + { + name = candidate.name; + } + } + if (!name.empty()) + { + record.erase(0, name.size()); + } + input.clear(); + input.str(record); + if (name.empty() && !(input >> name)) + { + return false; + } + int binding = 0; + if (!(input >> binding) || binding < 0 || !seen.insert(name).second) + { + return false; + } + TextureSlot* existing = material.FindTextureSlot(name); + TextureSlot slot = existing ? *existing : TextureSlot{}; + slot.name = name; + slot.bindSlot = binding; + std::getline(input, tail); + Trim(tail); + std::array coordinates{}; + for (size_t remaining = coordinates.size(); remaining > 0; --remaining) + { + const auto separator = tail.find_last_of(" \t"); + if (separator == std::string::npos) + { + return false; + } + std::istringstream value(tail.substr(separator + 1)); + value.imbue(std::locale::classic()); + if (!ReadValues(value, coordinates[remaining - 1]) || !std::isfinite(coordinates[remaining - 1])) + { + return false; + } + tail.resize(separator); + Trim(tail); + } + if (tail.empty()) + { + return false; + } + slot.texturePath = tail == "none" ? "" : tail; + slot.isAssigned = !slot.texturePath.empty(); + slot.tilingU = coordinates[0]; + slot.tilingV = coordinates[1]; + slot.offsetU = coordinates[2]; + slot.offsetV = coordinates[3]; + if (existing) + { + *existing = std::move(slot); + } + else + { + material.textureSlots.push_back(std::move(slot)); + } + return true; + } + + bool ReadMaterial(std::istream& file, MaterialDefinition& material) + { + bool hasName = false, hasShader = false; + std::set parameters, textures, fields; + std::string line; + while (std::getline(file, line)) + { + Trim(line); + if (line.empty() || line.front() == '#') + { + continue; + } + std::istringstream input(line); + input.imbue(std::locale::classic()); + std::string key; + input >> key; + if (key == "param") + { + if (!ReadParameter(input, material, parameters)) + { + return false; + } + continue; + } + if (key == "texture_slot") + { + if (!ReadTextureSlot(input, material, textures)) + { + return false; + } + continue; + } + if (!fields.insert(key).second) + { + return false; + } + if (key == "name:" || key == "shader:") + { + auto& text = key == "name:" ? material.name : material.shaderPath; + std::getline(input, text); + Trim(text); + if (text.empty()) + { + return false; + } + (key == "name:" ? hasName : hasShader) = true; + } + else if (key == "blend_mode" || key == "cull_mode") + { + int value = 0; + if (!ReadValues(input, value) || value < 0 || value > (key == "blend_mode" ? 4 : 2)) + { + return false; + } + if (key == "blend_mode") + { + material.renderState.blendMode = static_cast(value); + } + else + { + material.renderState.cullMode = static_cast(value); + } + } + else if (key == "depth_write" || key == "depth_test" || key == "cast_shadows" || + key == "receive_shadows") + { + bool value = false; + if (!ReadBool(input, value)) + { + return false; + } + if (key == "depth_write") + { + material.renderState.depthWrite = value; + } + else if (key == "depth_test") + { + material.renderState.depthTest = value; + } + else if (key == "cast_shadows") + { + material.renderState.castShadows = value; + } + else + { + material.renderState.receiveShadows = value; + } + } + else if (key == "alpha_clip") + { + if (!ReadValues(input, material.renderState.alphaClipThreshold) || + !std::isfinite(material.renderState.alphaClipThreshold)) + { + return false; + } + } + else if (key == "render_queue") + { + if (!ReadValues(input, material.renderState.renderQueue)) + { + return false; + } + } + else + { + return false; + } + } + return file.eof() && hasName && hasShader; + } + } // namespace + + bool ParseMaterialText(std::string_view text, MaterialDefinition& material) + { + if (text.size() > kMaxMaterialTextBytes || text.find('\0') != std::string_view::npos) + { + return false; + } + MaterialDefinition parsed; + parsed.filePath = material.filePath; + InitializeStandardPBRParameters(parsed); + std::istringstream input{std::string(text)}; + input.imbue(std::locale::classic()); + if (!ReadMaterial(input, parsed)) + { + return false; + } + material = std::move(parsed); + return true; + } +} // namespace SparkEditor diff --git a/SparkEditor/Source/Panels/MaterialEditorMaterialParser.h b/SparkEditor/Source/Panels/MaterialEditorMaterialParser.h new file mode 100644 index 000000000..5d20ca317 --- /dev/null +++ b/SparkEditor/Source/Panels/MaterialEditorMaterialParser.h @@ -0,0 +1,16 @@ +/** + * @file MaterialEditorMaterialParser.h + * @brief Shared material schema and production text-parser entry for editor files and fuzzing. + */ +#pragma once +#include +#include +namespace SparkEditor +{ + struct MaterialDefinition; + inline constexpr std::size_t kMaxMaterialTextBytes = std::size_t{16} * 1024u * 1024u; + /// @brief Append the editor's standard PBR parameters and texture slots. + void InitializeStandardPBRParameters(MaterialDefinition& material); + /// @brief Parse into a temporary definition; rejection preserves output, acceptance preserves filePath. + bool ParseMaterialText(std::string_view text, MaterialDefinition& material); +} // namespace SparkEditor diff --git a/SparkEditor/Source/Panels/MaterialEditorPanel.cpp b/SparkEditor/Source/Panels/MaterialEditorPanel.cpp index 8cbe9923a..7b0fe03af 100644 --- a/SparkEditor/Source/Panels/MaterialEditorPanel.cpp +++ b/SparkEditor/Source/Panels/MaterialEditorPanel.cpp @@ -5,9 +5,10 @@ * @date 2025 * * Contains: constructor, Initialize, Update, Render, Shutdown, HandleEvent, - * OpenMaterial, CreateMaterial, SaveMaterial, HasUnsavedChanges, + * HasUnsavedChanges, * GetSelectedMaterial, RenderToolbar, RenderMaterialList. * + * File loading/saving lives in MaterialEditorFiles.cpp. * Parameter/texture editing lives in MaterialEditorParameters.cpp. * Preview, render state, and default materials live in MaterialEditorPreview.cpp. */ @@ -33,7 +34,10 @@ namespace SparkEditor // Construction / Lifecycle // ======================================================================== - MaterialEditorPanel::MaterialEditorPanel() : EditorPanel("Material Editor", "material_editor_panel") {} + MaterialEditorPanel::MaterialEditorPanel() : EditorPanel("Material Editor", "material_editor_panel") + { + SetSize(900.0f, 650.0f); + } bool MaterialEditorPanel::Initialize() { @@ -253,180 +257,6 @@ namespace SparkEditor // Public API // ======================================================================== - void MaterialEditorPanel::OpenMaterial(const std::string& materialPath) - { - // Check if the material is already loaded - for (int i = 0; i < static_cast(m_materials.size()); ++i) - { - if (m_materials[i].filePath == materialPath) - { - m_selectedMaterialIndex = i; - SetVisible(true); - std::cout << "Material Editor: selected existing material '" << m_materials[i].name << "'\n"; - return; - } - } - - // Create material definition from the file path (file parsing deferred to runtime) - MaterialDefinition material; - material.filePath = materialPath; - - // Extract name from path (e.g., "Assets/Materials/Brick.spkmat" -> "Brick") - std::string nameFromPath = materialPath; - auto lastSlash = nameFromPath.find_last_of("/\\"); - if (lastSlash != std::string::npos) - { - nameFromPath = nameFromPath.substr(lastSlash + 1); - } - auto dotPos = nameFromPath.find_last_of('.'); - if (dotPos != std::string::npos) - { - nameFromPath = nameFromPath.substr(0, dotPos); - } - material.name = nameFromPath; - material.shaderPath = "Shaders/StandardPBR.hlsl"; - material.isModified = false; - material.isBuiltIn = false; - - PopulateDefaultPBRParameters(material); - - m_materials.push_back(std::move(material)); - m_selectedMaterialIndex = static_cast(m_materials.size()) - 1; - SetVisible(true); - - SPARK_LOG_INFO(Spark::LogCategory::Editor, "Material Editor: loaded material '%s' from '%s'", - m_materials.back().name.c_str(), materialPath.c_str()); - } - - void MaterialEditorPanel::CreateMaterial(const std::string& name, const std::string& shaderPath) - { - MaterialDefinition material; - material.name = name; - material.shaderPath = shaderPath; - material.filePath = "Assets/Materials/" + name + ".spkmat"; - material.isModified = true; - material.isBuiltIn = false; - - PopulateDefaultPBRParameters(material); - - m_materials.push_back(std::move(material)); - m_selectedMaterialIndex = static_cast(m_materials.size()) - 1; - SetModified(true); - - SPARK_LOG_INFO(Spark::LogCategory::Editor, "Material Editor: created material '%s' (shader='%s')", name.c_str(), - shaderPath.c_str()); - } - - bool MaterialEditorPanel::SaveMaterial() - { - MaterialDefinition* selected = GetSelectedMaterial(); - if (selected == nullptr) - { - SPARK_LOG_WARN(Spark::LogCategory::Editor, "Material Editor: no material selected to save"); - return false; - } - - if (selected->isBuiltIn) - { - SPARK_LOG_WARN(Spark::LogCategory::Editor, "Material Editor: cannot save built-in material '%s'", - selected->name.c_str()); - return false; - } - - // Serialize material to .spkmat file (simplified text format) - std::ofstream file(selected->filePath); - if (!file.is_open()) - { - SPARK_LOG_ERROR(Spark::LogCategory::Editor, "Material Editor: failed to open file '%s' for writing", - selected->filePath.c_str()); - return false; - } - - file << "# SparkEngine Material\n"; - file << "name: " << selected->name << "\n"; - file << "shader: " << selected->shaderPath << "\n"; - file << "\n"; - - // Write parameters - file << "# Parameters\n"; - for (const auto& param : selected->parameters) - { - file << "param " << param.name << " "; - switch (param.type) - { - case ShaderParamType::Float: - file << "float " << param.floatValues[0] << "\n"; - break; - case ShaderParamType::Float2: - file << "float2 " << param.floatValues[0] << " " << param.floatValues[1] << "\n"; - break; - case ShaderParamType::Float3: - file << "float3 " << param.floatValues[0] << " " << param.floatValues[1] << " " << param.floatValues[2] - << "\n"; - break; - case ShaderParamType::Float4: - file << "float4 " << param.floatValues[0] << " " << param.floatValues[1] << " " << param.floatValues[2] - << " " << param.floatValues[3] << "\n"; - break; - case ShaderParamType::Color: - file << "color " << param.floatValues[0] << " " << param.floatValues[1] << " " << param.floatValues[2] - << " " << param.floatValues[3] << "\n"; - break; - case ShaderParamType::Int: - file << "int " << param.intValue << "\n"; - break; - case ShaderParamType::Bool: - file << "bool " << (param.boolValue ? "true" : "false") << "\n"; - break; - case ShaderParamType::Texture2D: - file << "texture2d " << (param.texturePath.empty() ? "none" : param.texturePath) << "\n"; - break; - case ShaderParamType::TextureCube: - file << "texturecube " << (param.texturePath.empty() ? "none" : param.texturePath) << "\n"; - break; - case ShaderParamType::Matrix4x4: - file << "matrix4x4"; - for (int i = 0; i < 16; ++i) - { - file << " " << param.floatValues[i]; - } - file << "\n"; - break; - } - } - file << "\n"; - - // Write texture slots - file << "# Texture Slots\n"; - for (const auto& slot : selected->textureSlots) - { - file << "texture_slot " << slot.name << " " << slot.bindSlot << " " - << (slot.texturePath.empty() ? "none" : slot.texturePath) << " " << slot.tilingU << " " << slot.tilingV - << " " << slot.offsetU << " " << slot.offsetV << "\n"; - } - file << "\n"; - - // Write render state - file << "# Render State\n"; - file << "blend_mode " << static_cast(selected->renderState.blendMode) << "\n"; - file << "cull_mode " << static_cast(selected->renderState.cullMode) << "\n"; - file << "depth_write " << (selected->renderState.depthWrite ? "true" : "false") << "\n"; - file << "depth_test " << (selected->renderState.depthTest ? "true" : "false") << "\n"; - file << "cast_shadows " << (selected->renderState.castShadows ? "true" : "false") << "\n"; - file << "receive_shadows " << (selected->renderState.receiveShadows ? "true" : "false") << "\n"; - file << "alpha_clip " << selected->renderState.alphaClipThreshold << "\n"; - file << "render_queue " << selected->renderState.renderQueue << "\n"; - - file.close(); - - selected->isModified = false; - SetModified(false); - NotifyStateChange(); - - std::cout << "Material Editor: saved material '" << selected->name << "' to '" << selected->filePath << "'\n"; - return true; - } - bool MaterialEditorPanel::HasUnsavedChanges() const { for (const auto& mat : m_materials) diff --git a/SparkEditor/Source/Panels/MaterialEditorPreview.cpp b/SparkEditor/Source/Panels/MaterialEditorPreview.cpp index 3ed20672d..fe842c06c 100644 --- a/SparkEditor/Source/Panels/MaterialEditorPreview.cpp +++ b/SparkEditor/Source/Panels/MaterialEditorPreview.cpp @@ -9,6 +9,7 @@ */ #include "MaterialEditorPanel.h" +#include "MaterialEditorMaterialParser.h" #include "../Core/EditorIcons.h" #include "Utils/LogMacros.h" #include @@ -587,201 +588,7 @@ namespace SparkEditor void MaterialEditorPanel::PopulateDefaultPBRParameters(MaterialDefinition& material) { - // ---- Surface group ---- - { - ShaderParameter albedoColor; - albedoColor.name = "albedoColor"; - albedoColor.displayName = "Albedo Color"; - albedoColor.type = ShaderParamType::Color; - albedoColor.group = "Surface"; - albedoColor.floatValues[0] = 0.8f; - albedoColor.floatValues[1] = 0.8f; - albedoColor.floatValues[2] = 0.8f; - albedoColor.floatValues[3] = 1.0f; - albedoColor.tooltip = "Base color of the surface (linear space)"; - material.parameters.push_back(albedoColor); - } - { - ShaderParameter metallic; - metallic.name = "metallic"; - metallic.displayName = "Metallic"; - metallic.type = ShaderParamType::Float; - metallic.group = "Surface"; - metallic.floatValues[0] = 0.0f; - metallic.minValue = 0.0f; - metallic.maxValue = 1.0f; - metallic.step = 0.01f; - metallic.tooltip = "0 = dielectric, 1 = metallic"; - material.parameters.push_back(metallic); - } - { - ShaderParameter roughness; - roughness.name = "roughness"; - roughness.displayName = "Roughness"; - roughness.type = ShaderParamType::Float; - roughness.group = "Surface"; - roughness.floatValues[0] = 0.5f; - roughness.minValue = 0.0f; - roughness.maxValue = 1.0f; - roughness.step = 0.01f; - roughness.tooltip = "0 = mirror-smooth, 1 = fully rough"; - material.parameters.push_back(roughness); - } - { - ShaderParameter opacity; - opacity.name = "opacity"; - opacity.displayName = "Opacity"; - opacity.type = ShaderParamType::Float; - opacity.group = "Surface"; - opacity.floatValues[0] = 1.0f; - opacity.minValue = 0.0f; - opacity.maxValue = 1.0f; - opacity.step = 0.01f; - opacity.tooltip = "Overall opacity of the material"; - material.parameters.push_back(opacity); - } - - // ---- Normal group ---- - { - ShaderParameter normalStrength; - normalStrength.name = "normalStrength"; - normalStrength.displayName = "Normal Strength"; - normalStrength.type = ShaderParamType::Float; - normalStrength.group = "Normal"; - normalStrength.floatValues[0] = 1.0f; - normalStrength.minValue = 0.0f; - normalStrength.maxValue = 2.0f; - normalStrength.step = 0.01f; - normalStrength.tooltip = "Intensity of the normal map effect"; - material.parameters.push_back(normalStrength); - } - - // ---- Emission group ---- - { - ShaderParameter emissionColor; - emissionColor.name = "emissionColor"; - emissionColor.displayName = "Emission Color"; - emissionColor.type = ShaderParamType::Color; - emissionColor.group = "Emission"; - emissionColor.floatValues[0] = 0.0f; - emissionColor.floatValues[1] = 0.0f; - emissionColor.floatValues[2] = 0.0f; - emissionColor.floatValues[3] = 1.0f; - emissionColor.isHDR = true; - emissionColor.tooltip = "Emissive color (HDR values allowed)"; - material.parameters.push_back(emissionColor); - } - { - ShaderParameter emissionIntensity; - emissionIntensity.name = "emissionIntensity"; - emissionIntensity.displayName = "Emission Intensity"; - emissionIntensity.type = ShaderParamType::Float; - emissionIntensity.group = "Emission"; - emissionIntensity.floatValues[0] = 0.0f; - emissionIntensity.minValue = 0.0f; - emissionIntensity.maxValue = 20.0f; - emissionIntensity.step = 0.1f; - emissionIntensity.tooltip = "Brightness multiplier for emission"; - material.parameters.push_back(emissionIntensity); - } - - // ---- Ambient Occlusion group ---- - { - ShaderParameter aoStrength; - aoStrength.name = "aoStrength"; - aoStrength.displayName = "AO Strength"; - aoStrength.type = ShaderParamType::Float; - aoStrength.group = "Ambient Occlusion"; - aoStrength.floatValues[0] = 1.0f; - aoStrength.minValue = 0.0f; - aoStrength.maxValue = 1.0f; - aoStrength.step = 0.01f; - aoStrength.tooltip = "Strength of the ambient occlusion effect"; - material.parameters.push_back(aoStrength); - } - - // ---- Detail group ---- - { - ShaderParameter detailTiling; - detailTiling.name = "detailTiling"; - detailTiling.displayName = "Detail Tiling"; - detailTiling.type = ShaderParamType::Float2; - detailTiling.group = "Detail"; - detailTiling.floatValues[0] = 1.0f; - detailTiling.floatValues[1] = 1.0f; - detailTiling.minValue = 0.01f; - detailTiling.maxValue = 50.0f; - detailTiling.tooltip = "UV tiling for detail textures"; - material.parameters.push_back(detailTiling); - } - { - ShaderParameter useDetailMap; - useDetailMap.name = "useDetailMap"; - useDetailMap.displayName = "Use Detail Map"; - useDetailMap.type = ShaderParamType::Bool; - useDetailMap.group = "Detail"; - useDetailMap.boolValue = false; - useDetailMap.tooltip = "Enable detail texture overlay"; - material.parameters.push_back(useDetailMap); - } - - // ---- Texture Slots ---- - { - TextureSlot albedo; - albedo.name = "Albedo"; - albedo.bindSlot = 0; - albedo.filter = TextureSlot::FilterMode::Trilinear; - material.textureSlots.push_back(albedo); - } - { - TextureSlot normal; - normal.name = "Normal"; - normal.bindSlot = 1; - normal.filter = TextureSlot::FilterMode::Trilinear; - material.textureSlots.push_back(normal); - } - { - TextureSlot metallic; - metallic.name = "Metallic"; - metallic.bindSlot = 2; - metallic.filter = TextureSlot::FilterMode::Bilinear; - material.textureSlots.push_back(metallic); - } - { - TextureSlot roughness; - roughness.name = "Roughness"; - roughness.bindSlot = 3; - roughness.filter = TextureSlot::FilterMode::Bilinear; - material.textureSlots.push_back(roughness); - } - { - TextureSlot ao; - ao.name = "Ambient Occlusion"; - ao.bindSlot = 4; - ao.filter = TextureSlot::FilterMode::Bilinear; - material.textureSlots.push_back(ao); - } - { - TextureSlot emission; - emission.name = "Emission"; - emission.bindSlot = 5; - emission.filter = TextureSlot::FilterMode::Bilinear; - material.textureSlots.push_back(emission); - } - { - TextureSlot height; - height.name = "Height"; - height.bindSlot = 6; - height.filter = TextureSlot::FilterMode::Bilinear; - material.textureSlots.push_back(height); - } - { - TextureSlot detail; - detail.name = "Detail"; - detail.bindSlot = 7; - detail.filter = TextureSlot::FilterMode::Trilinear; - material.textureSlots.push_back(detail); - } + InitializeStandardPBRParameters(material); } } // namespace SparkEditor diff --git a/SparkEditor/Source/Panels/PlayControlLaunch.cpp b/SparkEditor/Source/Panels/PlayControlLaunch.cpp index ec9b3d7b7..d195643cc 100644 --- a/SparkEditor/Source/Panels/PlayControlLaunch.cpp +++ b/SparkEditor/Source/Panels/PlayControlLaunch.cpp @@ -282,6 +282,8 @@ namespace SparkEditor inst.exitCode = exitCode; CloseEditorProcessHandles(inst.processHandle, nullptr); inst.processHandle = nullptr; + m_statusMessage = "PID " + std::to_string(inst.pid) + " (" + inst.label + ") exited with code " + + std::to_string(exitCode); SPARK_LOG_INFO(Spark::LogCategory::Editor, "PlayControlPanel: PID %lu (%s) exited with code %lu", inst.pid, inst.label.c_str(), exitCode); } diff --git a/SparkEngine/Source/Core/EngineContext.h b/SparkEngine/Source/Core/EngineContext.h index c1857880c..7fd8171ee 100644 --- a/SparkEngine/Source/Core/EngineContext.h +++ b/SparkEngine/Source/Core/EngineContext.h @@ -22,6 +22,7 @@ #include "Core/EngineSdkConsole.h" #include "Core/EngineSdkLogger.h" #include "Core/EngineSdkStateValidation.h" +#include "Core/EngineSdkWeather.h" #include #include @@ -290,6 +291,8 @@ class EngineContext : public Spark::IEngineContext /// The SDK rule registry game modules use instead of the private Utils/InvalidStateDetector.h. Spark::IStateValidation* GetStateValidation() override { return &m_sdkStateValidation; } + Spark::IWeatherService* GetWeatherService() override { return GetWeather() ? &m_sdkWeather : nullptr; } + // ========================================================================= // Named setters — delegate to generic registry (R1.1) // ========================================================================= @@ -432,4 +435,6 @@ class EngineContext : public Spark::IEngineContext EngineSdkConsole m_sdkConsole; // Stateless: forwards to the host InvalidStateDetector singleton. EngineSdkStateValidation m_sdkStateValidation; + // Resolves the registry on each command; never retains a subsystem pointer. + EngineSdkWeather m_sdkWeather{*this}; }; diff --git a/SparkEngine/Source/Core/EngineSdkWeather.cpp b/SparkEngine/Source/Core/EngineSdkWeather.cpp new file mode 100644 index 000000000..2a120626f --- /dev/null +++ b/SparkEngine/Source/Core/EngineSdkWeather.cpp @@ -0,0 +1,46 @@ +#include "EngineSdkWeather.h" + +#include "EngineContext.h" +#include "Graphics/WeatherSystem.h" + +#include + +bool EngineSdkWeather::SetWeather(Spark::WeatherPreset preset, float intensity, float transitionSeconds) +{ + if (!std::isfinite(intensity) || !std::isfinite(transitionSeconds)) + { + return false; + } + + Spark::WeatherType type; + switch (preset) + { + case Spark::WeatherPreset::Clear: + type = Spark::WeatherType::Clear; + break; + case Spark::WeatherPreset::Rain: + type = Spark::WeatherType::Rain; + break; + case Spark::WeatherPreset::Snow: + type = Spark::WeatherType::Snow; + break; + case Spark::WeatherPreset::Fog: + type = Spark::WeatherType::Fog; + break; + case Spark::WeatherPreset::Storm: + type = Spark::WeatherType::Storm; + break; + default: + return false; + } + + // The registry is the single source of truth. A retained service cannot keep + // a subsystem alive or accidentally call a previously unregistered instance. + auto* weather = m_context.GetWeather(); + if (!weather) + { + return false; + } + weather->SetWeather(type, intensity, transitionSeconds); + return true; +} diff --git a/SparkEngine/Source/Core/EngineSdkWeather.h b/SparkEngine/Source/Core/EngineSdkWeather.h new file mode 100644 index 000000000..bb4150a6e --- /dev/null +++ b/SparkEngine/Source/Core/EngineSdkWeather.h @@ -0,0 +1,18 @@ +/** @file EngineSdkWeather.h + * @brief Context-owned implementation of the public weather command service. + */ +#pragma once + +#include + +class EngineContext; + +class EngineSdkWeather final : public Spark::IWeatherService +{ + public: + explicit EngineSdkWeather(EngineContext& context) : m_context(context) {} + bool SetWeather(Spark::WeatherPreset preset, float intensity, float transitionSeconds) override; + + private: + EngineContext& m_context; +}; diff --git a/SparkEngine/Source/Core/SparkEngineLinuxInit.cpp b/SparkEngine/Source/Core/SparkEngineLinuxInit.cpp index 31cc2ee04..301e5bdbb 100644 --- a/SparkEngine/Source/Core/SparkEngineLinuxInit.cpp +++ b/SparkEngine/Source/Core/SparkEngineLinuxInit.cpp @@ -97,7 +97,7 @@ static bool LoadGameModulesLinux(ModuleManager& manager, int argc, char* argv[]) std::error_code error; if (!std::filesystem::is_regular_file(std::filesystem::u8path(*module), error) || error) { - console.LogError("Explicit game module not found: " + *module); + SPARK_LOG_ERROR(Spark::LogCategory::Core, "Explicit game module not found: %s", module->c_str()); return false; } return manager.LoadModule(*module); diff --git a/SparkEngine/Source/Core/SparkEngineLinuxSDL2Events.cpp b/SparkEngine/Source/Core/SparkEngineLinuxSDL2Events.cpp index 919cb994a..90e23cb09 100644 --- a/SparkEngine/Source/Core/SparkEngineLinuxSDL2Events.cpp +++ b/SparkEngine/Source/Core/SparkEngineLinuxSDL2Events.cpp @@ -69,6 +69,8 @@ static int TranslateSDLKeyToVK(SDL_Keycode sym) return VK_LEFT; case SDLK_RIGHT: return VK_RIGHT; + // Keep side identity for side-specific consumers. InputManager folds both + // sides into the generic Shift/Ctrl/Alt queries. case SDLK_LSHIFT: return VK_LSHIFT; case SDLK_RSHIFT: diff --git a/SparkEngine/Source/Core/SparkEngineWindows.cpp b/SparkEngine/Source/Core/SparkEngineWindows.cpp index a203f5d48..d4ed8e064 100644 --- a/SparkEngine/Source/Core/SparkEngineWindows.cpp +++ b/SparkEngine/Source/Core/SparkEngineWindows.cpp @@ -535,16 +535,12 @@ int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE, _In_ LPWSTR if (requireGame) { const ModuleManager::LifecycleEvidence evidence = ModuleManager::GetLastTeardownLifecycleEvidence(); - // Task 1 records the module's exact ModuleInfo name. The stable-v1 - // wire contract instead identifies the shipped DLL target so it stays - // independent of display-name wording. - if (const auto* record = evidence.FindModule("Spark Arena - Engine Showcase")) + // Reuse the target-name formatter and unambiguous Game-kind selection + // shared with the other host. This covers installed SDK consumers while + // preserving the shipped FPS record and all successful-callback counts. + if (const auto* record = evidence.FindGameModule()) { - WriteCommandOutput(std::format("SPARK_MODULE_LIFECYCLE module=SparkGameFPS create={} load={} update={} " - "fixed={} render={} unload={} destroy={} faults={}\n", - record->createModule, record->onLoad, record->onUpdate, - record->onFixedUpdate, record->onRender, record->onUnload, - record->destroyModule, record->faults)); + WriteCommandOutput(ModuleManager::FormatLifecycleRecord(*record) + "\n"); } } diff --git a/SparkEngine/Source/Core/SparkEngineWindowsModules.cpp b/SparkEngine/Source/Core/SparkEngineWindowsModules.cpp index c04694db0..f944f1686 100644 --- a/SparkEngine/Source/Core/SparkEngineWindowsModules.cpp +++ b/SparkEngine/Source/Core/SparkEngineWindowsModules.cpp @@ -19,6 +19,7 @@ #include "ModuleHotReload.h" #include "ModuleManager.h" #include "Utils/SparkConsole.h" +#include "Utils/LogMacros.h" #ifdef SPARK_HAS_IMGUI #include // bare-launch project selector panel #endif @@ -91,7 +92,7 @@ bool LoadGameModules(ModuleManager& manager, LPWSTR cmdLine) std::error_code moduleError; if (!std::filesystem::is_regular_file(requestedModule, moduleError) || moduleError) { - console.LogError("Explicit game module not found: " + *cmdLineModule); + SPARK_LOG_ERROR(Spark::LogCategory::Core, "Explicit game module not found: %s", cmdLineModule->c_str()); return false; } return manager.LoadModule(*cmdLineModule); diff --git a/SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp b/SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp index 0a4556d7e..dea39ad58 100644 --- a/SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp +++ b/SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp @@ -411,6 +411,29 @@ BOOL InitInstance(HINSTANCE hInst, int nCmdShow) // =================================================================================== // Window procedure // =================================================================================== +static WPARAM NormalizeWin32ModifierVirtualKey(WPARAM virtualKey, LPARAM lParam) +{ + if (virtualKey != VK_SHIFT && virtualKey != VK_CONTROL && virtualKey != VK_MENU) + return virtualKey; + + UINT scanCode = (static_cast(lParam) >> 16u) & 0xFFu; + if ((static_cast(lParam) & 0x01000000u) != 0) + scanCode |= 0xE000u; + + const UINT mappedKey = MapVirtualKeyW(scanCode, MAPVK_VSC_TO_VK_EX); + switch (virtualKey) + { + case VK_SHIFT: + return (mappedKey == VK_LSHIFT || mappedKey == VK_RSHIFT) ? mappedKey : virtualKey; + case VK_CONTROL: + return (mappedKey == VK_LCONTROL || mappedKey == VK_RCONTROL) ? mappedKey : virtualKey; + case VK_MENU: + return (mappedKey == VK_LMENU || mappedKey == VK_RMENU) ? mappedKey : virtualKey; + default: + return virtualKey; + } +} + LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { // Game-mode ImGui overlay gets first look at input so HUD menus @@ -421,13 +444,19 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) switch (msg) { case WM_KEYDOWN: + case WM_SYSKEYDOWN: case WM_KEYUP: + case WM_SYSKEYUP: if (GetEngineRuntime().input) { // While gameplay owns the mouse (FPS look mode) it keeps the // keyboard too; otherwise a focused ImGui text field eats keys. if (GetEngineRuntime().input->IsMouseCaptured() || !Spark::GameImGui::WantsKeyboard()) - GetEngineRuntime().input->HandleMessage(msg, wParam, lParam); + { + const UINT keyMessage = (msg == WM_KEYDOWN || msg == WM_SYSKEYDOWN) ? WM_KEYDOWN : WM_KEYUP; + GetEngineRuntime().input->HandleMessage(keyMessage, NormalizeWin32ModifierVirtualKey(wParam, lParam), + lParam); + } } break; diff --git a/SparkEngine/Source/Engine/AI/AISystem.cpp b/SparkEngine/Source/Engine/AI/AISystem.cpp index da993bd28..c441fe63b 100644 --- a/SparkEngine/Source/Engine/AI/AISystem.cpp +++ b/SparkEngine/Source/Engine/AI/AISystem.cpp @@ -257,7 +257,7 @@ namespace Spark::AI m_behaviorTemplates.clear(); } - void AISystem::UpdatePerception(World& world, EntityID selfEntity, AIComponent& ai, const Transform& transform, + void AISystem::UpdatePerception(World& world, ::EntityID selfEntity, AIComponent& ai, const Transform& transform, float deltaTime) { // Compute agent forward direction from yaw rotation @@ -267,7 +267,7 @@ namespace Spark::AI // (typically the player and other opposing faction entities) bool targetVisible = false; float closestThreatDistSq = ai.config.detectionRange * ai.config.detectionRange; - EntityID closestThreat = entt::null; + ::EntityID closestThreat = entt::null; XMFLOAT3 closestThreatPos{0, 0, 0}; auto potentialTargets = world.GetEntitiesWith(); @@ -483,7 +483,8 @@ namespace Spark::AI } } - void AISystem::UpdateMovement(World& world, EntityID entity, AIComponent& ai, Transform& transform, float deltaTime) + void AISystem::UpdateMovement(World& world, ::EntityID entity, AIComponent& ai, Transform& transform, + float deltaTime) { // Dead or idle agents don't move — clear physics velocity if present if (ai.state == AIComponent::State::Dead || ai.state == AIComponent::State::Idle) @@ -682,7 +683,7 @@ namespace Spark::AI return ss.str(); } - std::string AISystem::Console_GetAgentInfo(World& world, EntityID entity) const + std::string AISystem::Console_GetAgentInfo(World& world, ::EntityID entity) const { auto* ai = world.GetComponent(entity); if (!ai) diff --git a/SparkEngine/Source/Engine/AI/AISystem.h b/SparkEngine/Source/Engine/AI/AISystem.h index 020737fff..a501f9615 100644 --- a/SparkEngine/Source/Engine/AI/AISystem.h +++ b/SparkEngine/Source/Engine/AI/AISystem.h @@ -145,12 +145,12 @@ namespace Spark::AI * @brief EntityID of the current primary threat/target. * * Set by the perception system when the player or another threat is detected. - * `static_cast(-1)` indicates no active target. Behavior tree + * `entt::null` indicates no active target. Behavior tree * conditions read this to decide between attack, patrol, and idle branches. - * (Spark::AI::EntityID is a `uint32_t` alias from MovementSystem.h, distinct - * from `entt::entity`.) + * This is explicitly the ECS entity type; several AI support headers define + * a separate uint32_t EntityID alias for compact work queues. */ - EntityID targetEntity = static_cast(-1); + ::EntityID targetEntity = entt::null; /** * @brief Last confirmed world-space position of the primary target. @@ -352,7 +352,7 @@ namespace Spark::AI * @param entity EntityID of the agent to inspect. * @return Multi-line formatted string with agent debug information. */ - std::string Console_GetAgentInfo(World& world, EntityID entity) const; + std::string Console_GetAgentInfo(World& world, ::EntityID entity) const; private: /** @@ -368,7 +368,7 @@ namespace Spark::AI * @param transform The agent's current world transform (determines origin for raycasts). * @param deltaTime Frame time for advancing timers. */ - void UpdatePerception(World& world, EntityID selfEntity, AIComponent& ai, const Transform& transform, + void UpdatePerception(World& world, ::EntityID selfEntity, AIComponent& ai, const Transform& transform, float deltaTime); /** @@ -391,7 +391,7 @@ namespace Spark::AI * no RigidBodyComponent is present. * @param deltaTime Frame time for speed-independent movement. */ - void UpdateMovement(World& world, EntityID entity, AIComponent& ai, Transform& transform, float deltaTime); + void UpdateMovement(World& world, ::EntityID entity, AIComponent& ai, Transform& transform, float deltaTime); /** * @brief Tick the agent's behavior tree and update high-level state. diff --git a/SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp b/SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp index 2aea15f93..6a96e2093 100644 --- a/SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp +++ b/SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp @@ -36,27 +36,41 @@ namespace Spark::Scripting::Detail std::vector& errors, EmitBudget& budget) : m_debugMode(debugMode), m_errors(errors), m_budget(budget) { + m_nodes.reserve(graph.nodes.size()); + m_topology.reserve(graph.nodes.size()); + m_activePath.reserve(graph.nodes.size()); for (const auto& node : graph.nodes) { - m_nodes.emplace(node.id, &node); // first definition wins + m_nodes.emplace(node.id, IndexedNode{&node}); // first definition wins } for (const auto& conn : graph.connections) { m_outgoing[conn.fromNode].push_back(&conn); m_incoming[conn.toNode].push_back(&conn); } + for (const auto& node : graph.nodes) + { + const auto& incoming = Incoming(node.id); + const bool hasDataInputs = std::any_of(incoming.begin(), incoming.end(), [&](const ScriptConnection* conn) + { return !IsExecConnection(*conn); }); + m_topology.emplace(&node, NodeTopology{ExecOutputPins(node), hasDataInputs}); + } } const ScriptNode* VisualScriptEmitter::FindNode(uint32_t id) const { const auto it = m_nodes.find(id); - return it != m_nodes.end() ? it->second : nullptr; + return it != m_nodes.end() ? it->second.node : nullptr; } /// Execution outputs of a node, in pin order. Without pin metadata the /// pins that carry execution wires are used. std::vector VisualScriptEmitter::ExecOutputPins(const ScriptNode& node) const { + if (const auto cached = m_topology.find(&node); cached != m_topology.end()) + { + return cached->second.execPins; + } std::vector pins; if (!node.outputs.empty()) { @@ -182,6 +196,11 @@ namespace Spark::Scripting::Detail } const auto dependencies = PureDependencies(node); + if (node.type == ScriptNodeType::Sequence) + { + EmitControlFlow(node, {}, indent, code); + return; + } const std::string inner = indent + std::string(kIndent); if (node.type == ScriptNodeType::Branch || node.type == ScriptNodeType::ForLoop) @@ -226,12 +245,6 @@ namespace Spark::Scripting::Detail return; } - if (node.type == ScriptNodeType::Sequence) - { - EmitControlFlow(node, {}, indent, code); - return; - } - const bool selfPure = IsPureNode(node); if (dependencies.empty() && !selfPure) { @@ -335,6 +348,10 @@ namespace Spark::Scripting::Detail /// Pure producers feeding @p node (transitively), producers first. std::vector VisualScriptEmitter::PureDependencies(const ScriptNode& node) { + if (const auto cached = m_topology.find(&node); cached != m_topology.end() && !cached->second.hasDataInputs) + { + return {}; + } std::vector order; std::unordered_set done; std::unordered_set visiting{node.id}; @@ -392,6 +409,20 @@ namespace Spark::Scripting::Detail void VisualScriptEmitter::EmitControlFlow(const ScriptNode& node, const std::vector& inputs, const std::string& indent, std::string& code) { + if (node.type == ScriptNodeType::Sequence) + { + // Borrow immutable pin order instead of allocating it for every shared-chain visit. + // The fallback retains the internal EmitStep API's behavior for an unlisted node. + const auto cached = m_topology.find(&node); + std::vector uncachedPins; + const auto& pins = + cached != m_topology.end() ? cached->second.execPins : (uncachedPins = ExecOutputPins(node)); + for (uint32_t pin : pins) + { + EmitPinChains(node, pin, indent, code); + } + return; + } const std::string inner = indent + std::string(kIndent); switch (node.type) { @@ -423,12 +454,6 @@ namespace Spark::Scripting::Detail code += indent + "}\n"; break; } - case ScriptNodeType::Sequence: - for (uint32_t pin : ExecOutputPins(node)) - { - EmitPinChains(node, pin, indent, code); - } - break; default: break; } @@ -452,26 +477,28 @@ namespace Spark::Scripting::Detail // Balanced on every return path: the loop below only breaks, never returns. ++m_chainDepth; - std::vector entered; + const size_t pathStart = m_activePath.size(); uint32_t current = startNode; while (!StepLimitReached()) { - const auto* node = FindNode(current); - if (!node) + const auto found = m_nodes.find(current); + if (found == m_nodes.end()) { m_errors.push_back("Execution wire targets missing node " + std::to_string(current)); break; } + const auto* node = found->second.node; if (IsEventNode(node->type)) { break; } - if (!m_onPath.insert(current).second) + if (found->second.onPath) { m_errors.push_back("Execution cycle through node " + std::to_string(current)); break; } - entered.push_back(current); + found->second.onPath = true; + m_activePath.push_back(current); EmitStep(*node, indent, code); @@ -482,7 +509,7 @@ namespace Spark::Scripting::Detail } std::vector next; - for (uint32_t pin : ExecOutputPins(*node)) + for (uint32_t pin : m_topology.at(node).execPins) { if (node->type == ScriptNodeType::ForLoop && pin == 0) { @@ -511,9 +538,10 @@ namespace Spark::Scripting::Detail current = next.front(); } - for (uint32_t id : entered) + while (m_activePath.size() > pathStart) { - m_onPath.erase(id); + m_nodes.at(m_activePath.back()).onPath = false; + m_activePath.pop_back(); } --m_chainDepth; } diff --git a/SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h b/SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h index 0f00a307e..f805e475a 100644 --- a/SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h +++ b/SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h @@ -146,12 +146,25 @@ namespace Spark::Scripting::Detail bool m_debugMode; std::vector& m_errors; - std::unordered_map m_nodes; + struct IndexedNode + { + const ScriptNode* node; + bool onPath = false; + }; + struct NodeTopology + { + std::vector execPins; + bool hasDataInputs = false; + }; + std::unordered_map m_nodes; + /// Immutable per-node metadata; exact pointers preserve duplicate-ID pin semantics. + std::unordered_map m_topology; std::unordered_map> m_outgoing; std::unordered_map> m_incoming; EmitBudget& m_budget; - std::unordered_set m_onPath; ///< Nodes on the chain being emitted (cycle guard) - size_t m_chainDepth = 0; ///< Execution chains currently being emitted (nesting depth) + /// One reusable active path, with a suffix owned by each nested chain. + std::vector m_activePath; + size_t m_chainDepth = 0; ///< Execution chains currently being emitted (nesting depth) }; } // namespace Spark::Scripting::Detail diff --git a/SparkEngine/Source/Engine/UI/UISystem.h b/SparkEngine/Source/Engine/UI/UISystem.h index a5ef53c4d..c9f958278 100644 --- a/SparkEngine/Source/Engine/UI/UISystem.h +++ b/SparkEngine/Source/Engine/UI/UISystem.h @@ -124,7 +124,7 @@ namespace Spark::UI class UIWidget { public: - UIWidget(const std::string& name); + UIWidget(std::string name); virtual ~UIWidget() = default; /** @brief Get the widget name. */ @@ -193,7 +193,7 @@ namespace Spark::UI class UILabel : public UIWidget { public: - UILabel(const std::string& name, const std::string& text); + UILabel(const std::string& name, std::string text); void SetText(const std::string& text) { m_text = text; } const std::string& GetText() const { return m_text; } @@ -219,7 +219,7 @@ namespace Spark::UI class UIButton : public UIWidget { public: - UIButton(const std::string& name, const std::string& label); + UIButton(const std::string& name, std::string label); void SetLabel(const std::string& label) { m_label = label; } const std::string& GetLabel() const { return m_label; } @@ -279,7 +279,7 @@ namespace Spark::UI class UIImageWidget : public UIWidget { public: - UIImageWidget(const std::string& name, const std::string& texturePath = ""); + UIImageWidget(const std::string& name, std::string texturePath = ""); void SetTexturePath(const std::string& path) { m_texturePath = path; } const std::string& GetTexturePath() const { return m_texturePath; } diff --git a/SparkEngine/Source/Engine/UI/UIWidgets.cpp b/SparkEngine/Source/Engine/UI/UIWidgets.cpp index ec69a1130..e48100c0a 100644 --- a/SparkEngine/Source/Engine/UI/UIWidgets.cpp +++ b/SparkEngine/Source/Engine/UI/UIWidgets.cpp @@ -10,6 +10,8 @@ #include "UISystem.h" #include +#include +#include namespace Spark::UI { @@ -18,7 +20,7 @@ namespace Spark::UI // UIWidget // ============================================================================= - UIWidget::UIWidget(const std::string& name) : m_name(name) {} + UIWidget::UIWidget(std::string name) : m_name(std::move(name)) {} void UIWidget::Update(float deltaTime) { @@ -41,7 +43,7 @@ namespace Spark::UI // UILabel // ============================================================================= - UILabel::UILabel(const std::string& name, const std::string& text) : UIWidget(name), m_text(text) {} + UILabel::UILabel(const std::string& name, std::string text) : UIWidget(name), m_text(std::move(text)) {} void UILabel::Render() const { @@ -57,7 +59,7 @@ namespace Spark::UI // UIButton // ============================================================================= - UIButton::UIButton(const std::string& name, const std::string& label) : UIWidget(name), m_label(label) {} + UIButton::UIButton(const std::string& name, std::string label) : UIWidget(name), m_label(std::move(label)) {} bool UIButton::HandleClick(float x, float y) { @@ -105,8 +107,8 @@ namespace Spark::UI // UIImageWidget // ============================================================================= - UIImageWidget::UIImageWidget(const std::string& name, const std::string& texturePath) - : UIWidget(name), m_texturePath(texturePath) + UIImageWidget::UIImageWidget(const std::string& name, std::string texturePath) + : UIWidget(name), m_texturePath(std::move(texturePath)) { } @@ -255,9 +257,9 @@ namespace Spark::UI } // Check children in reverse order (top-most first) - for (auto it = m_children.rbegin(); it != m_children.rend(); ++it) + for (const auto& child : std::views::reverse(m_children)) { - if ((*it)->HandleClick(x, y)) + if (child->HandleClick(x, y)) { return true; } diff --git a/SparkEngine/Source/Input/InputManager.cpp b/SparkEngine/Source/Input/InputManager.cpp index 2b5a1e1ed..4888b149f 100644 --- a/SparkEngine/Source/Input/InputManager.cpp +++ b/SparkEngine/Source/Input/InputManager.cpp @@ -195,11 +195,34 @@ std::string InputManager::VirtualKeyToKeyName(int virtualKey) const return (it != map.end()) ? it->second : "Unknown(" + std::to_string(virtualKey) + ")"; } +static bool LookupExactKeyState(const std::unordered_map& states, int key) +{ + auto it = states.find(key); + return it != states.end() && it->second; +} + +static bool LookupKeyState(const std::unordered_map& states, int key) +{ + switch (key) + { + case VK_SHIFT: + return LookupExactKeyState(states, VK_SHIFT) || LookupExactKeyState(states, VK_LSHIFT) || + LookupExactKeyState(states, VK_RSHIFT); + case VK_CONTROL: + return LookupExactKeyState(states, VK_CONTROL) || LookupExactKeyState(states, VK_LCONTROL) || + LookupExactKeyState(states, VK_RCONTROL); + case VK_MENU: + return LookupExactKeyState(states, VK_MENU) || LookupExactKeyState(states, VK_LMENU) || + LookupExactKeyState(states, VK_RMENU); + default: + return LookupExactKeyState(states, key); + } +} + bool InputManager::IsKeyDown(int key) const { SPARK_REQUIRE_MSG(Spark::LogCategory::Input, key >= 0, "IsKeyDown - invalid key code"); - auto it = m_keyStates.find(key); - return it != m_keyStates.end() && it->second; + return LookupKeyState(m_keyStates, key); } bool InputManager::IsKeyUp(int key) const @@ -207,10 +230,9 @@ bool InputManager::IsKeyUp(int key) const return !IsKeyDown(key); } -static bool LookupKeyState(const std::unordered_map& states, int key) +bool InputManager::IsFrameKeyDown(int key) const { - auto it = states.find(key); - return it != states.end() && it->second; + return LookupKeyState(m_frameKeyStates, key); } bool InputManager::WasKeyPressed(int key) const @@ -245,6 +267,7 @@ bool InputManager::WasMouseButtonReleased(int button) const void InputManager::LatchFrameEdges() { + ++m_inputFrameSequence; // Hosts deliver this frame's input messages BEFORE calling Update(), so the // "previous" snapshot must be the one taken by the previous Update(), not a // copy of the live state taken now: that copy already holds this frame's diff --git a/SparkEngine/Source/Input/InputManager.h b/SparkEngine/Source/Input/InputManager.h index 9695932dd..7fb9b0504 100644 --- a/SparkEngine/Source/Input/InputManager.h +++ b/SparkEngine/Source/Input/InputManager.h @@ -56,6 +56,8 @@ class InputManager std::unordered_map m_frameKeyStates; ///< Keyboard states latched by this frame's Update() std::unordered_map m_prevKeyStates; ///< Keyboard states latched by the previous Update() + unsigned long long m_inputFrameSequence = 0; + bool m_mouseButtons[3]; ///< Live mouse button states [Left, Right, Middle] bool m_frameMouseButtons[3]; ///< Mouse button states latched by this frame's Update() bool m_prevMouseButtons[3]; ///< Mouse button states latched by the previous Update() @@ -164,6 +166,11 @@ class InputManager */ bool IsKeyDown(int key) const; + /// Read-only diagnostics for the same snapshot used by edge queries. + bool IsFrameKeyDown(int key) const; + unsigned long long GetInputFrameSequence() const noexcept { return m_inputFrameSequence; } + + /** * @brief Check if a key is currently released * diff --git a/SparkEngine/Source/SceneManager/SceneManager.cpp b/SparkEngine/Source/SceneManager/SceneManager.cpp index 4d4eefcf2..1983aa712 100644 --- a/SparkEngine/Source/SceneManager/SceneManager.cpp +++ b/SparkEngine/Source/SceneManager/SceneManager.cpp @@ -50,7 +50,9 @@ static std::string WideToNarrow(const std::wstring& wide) std::string narrow; narrow.reserve(wide.size()); for (wchar_t wc : wide) + { narrow.push_back(static_cast(wc)); + } return narrow; } @@ -63,7 +65,9 @@ static std::optional NarrowPathIfRoundTrips(const std::wstring& wid try { if (std::filesystem::path(narrow) == std::filesystem::path(wide)) + { return narrow; + } } catch (const std::exception&) { @@ -116,13 +120,17 @@ namespace { #if defined(_WIN32) if (::MoveFileExW(temporary.c_str(), destination.c_str(), MOVEFILE_REPLACE_EXISTING | MOVEFILE_WRITE_THROUGH)) + { return true; + } error = std::error_code(static_cast(::GetLastError()), std::system_category()); return false; #else std::filesystem::rename(temporary, destination, error); if (error) + { return false; + } const auto directory = destination.has_parent_path() ? destination.parent_path() : std::filesystem::path("."); #if defined(O_DIRECTORY) const int directoryFile = ::open(directory.c_str(), O_RDONLY | O_DIRECTORY); @@ -166,7 +174,9 @@ namespace candidate += ".tmp." + std::to_string(threadHash) + "." + std::to_string(serial); std::error_code existsError; if (!std::filesystem::exists(candidate, existsError) && !existsError) + { return candidate; + } } return {}; } @@ -175,12 +185,16 @@ namespace { std::ofstream output(path, std::ios::binary | std::ios::trunc); if (!output.is_open()) + { return false; + } output.write(text.data(), static_cast(text.size())); output.flush(); output.close(); if (output.fail()) + { return false; + } return FlushFileDurably(path, error); } @@ -205,11 +219,15 @@ namespace bool IsConfinedRelativeScenePath(const std::filesystem::path& relative) { if (relative.empty() || relative.has_root_name() || relative.has_root_directory()) + { return false; + } for (const auto& component : relative) { if (component.empty() || component == "." || component == "..") + { return false; + } } const auto extension = relative.extension(); return (extension == ".scene" || extension == ".json") && !relative.stem().empty(); @@ -229,7 +247,9 @@ namespace void operator()(HANDLE handle) const { if (handle && handle != INVALID_HANDLE_VALUE) + { ::CloseHandle(handle); + } } }; using UniqueHandle = std::unique_ptr; @@ -243,11 +263,15 @@ namespace UniqueHandle handle(::CreateFileW(path.c_str(), FILE_LIST_DIRECTORY | FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, flags, nullptr)); if (handle.get() == INVALID_HANDLE_VALUE) + { return UniqueHandle(nullptr); + } BY_HANDLE_FILE_INFORMATION info{}; if (!::GetFileInformationByHandle(handle.get(), &info) || !(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || (!allowReparse && (info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT))) + { return UniqueHandle(nullptr); + } return handle; } @@ -259,7 +283,9 @@ namespace const DWORD length = ::GetFinalPathNameByHandleW(handle, buffer.data(), static_cast(buffer.size()), FILE_NAME_NORMALIZED | VOLUME_NAME_NT); if (length == 0) + { return {}; + } if (length < buffer.size()) { buffer.resize(length); @@ -283,7 +309,9 @@ namespace std::vector pins; pins.push_back(OpenPinnedDirectory(root, /*allowReparse=*/true)); if (!pins.back()) + { return false; + } const std::wstring rootFinal = FinalPath(pins.back().get()); std::filesystem::path directory = root; @@ -293,19 +321,25 @@ namespace directory /= component; pins.push_back(OpenPinnedDirectory(directory, /*allowReparse=*/false)); if (!pins.back()) + { return false; + } } const std::wstring directoryFinal = FinalPath(pins.back().get()); if (rootFinal.empty() || directoryFinal.empty() || (directoryFinal != rootFinal && directoryFinal.rfind(rootFinal + L"\\", 0) != 0)) + { return false; + } // An existing destination must be a plain file, not a link or directory. const std::filesystem::path destination = directory / leaf; const DWORD existing = ::GetFileAttributesW(destination.c_str()); if (existing != INVALID_FILE_ATTRIBUTES && (existing & (FILE_ATTRIBUTE_REPARSE_POINT | FILE_ATTRIBUTE_DIRECTORY))) + { return false; + } static std::atomic sequence{0}; UniqueHandle file(nullptr); @@ -315,12 +349,18 @@ namespace HANDLE created = ::CreateFileW(temporary.c_str(), GENERIC_WRITE | DELETE, 0, nullptr, CREATE_NEW, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OPEN_REPARSE_POINT, nullptr); if (created != INVALID_HANDLE_VALUE) + { file.reset(created); + } else if (::GetLastError() != ERROR_FILE_EXISTS) + { return false; + } } if (!file) + { return false; + } const auto discard = [&file] { @@ -379,7 +419,9 @@ namespace ~FdCloser() { if (fd >= 0) + { ::close(fd); + } } }; @@ -391,7 +433,9 @@ namespace for (const auto& component : relativeDirectory) { if (current < 0) + { return -1; + } const int next = ::openat(current, component.c_str(), O_RDONLY | O_DIRECTORY | O_NOFOLLOW | O_CLOEXEC); ::close(current); current = next; @@ -413,16 +457,22 @@ namespace // reached only through held directory fds with O_NOFOLLOW. FdCloser rootFd{::open(root.c_str(), O_RDONLY | O_DIRECTORY | O_CLOEXEC)}; if (rootFd.fd < 0) + { return false; + } FdCloser directory{OpenDirectoryBelow(rootFd.fd, relative.parent_path())}; if (directory.fd < 0) + { return false; + } // An existing destination must be a plain file, not a link or directory. const std::string leaf = relative.filename().string(); struct stat existing = {}; if (::fstatat(directory.fd, leaf.c_str(), &existing, AT_SYMLINK_NOFOLLOW) == 0 && !S_ISREG(existing.st_mode)) + { return false; + } static std::atomic sequence{0}; std::string temporary; @@ -433,17 +483,23 @@ namespace file.fd = ::openat(directory.fd, temporary.c_str(), O_WRONLY | O_CREAT | O_EXCL | O_NOFOLLOW | O_CLOEXEC, 0666); if (file.fd < 0 && errno != EEXIST) + { return false; + } } if (file.fd < 0) + { return false; + } size_t written = 0; while (written < text.size()) { const ssize_t chunk = ::write(file.fd, text.data() + written, text.size() - written); if (chunk < 0 && errno == EINTR) + { continue; + } if (chunk <= 0) { ::unlinkat(directory.fd, temporary.c_str(), 0); @@ -469,7 +525,9 @@ namespace if (!inPlace || recheck.fd < 0 || !SameInode(recheck.fd, directory.fd)) { if (inPlace) + { ::unlinkat(directory.fd, leaf.c_str(), 0); + } return false; } return true; @@ -552,7 +610,9 @@ bool SceneManager::LoadScene(const std::wstring& filepath) for (int i = 0; i < static_cast(m_sceneNodes.size()); ++i) { if (!m_sceneNodes[i].name.empty()) + { m_nodeNameIndex[m_sceneNodes[i].name] = i; + } } m_objects = std::move(previousObjects); }; @@ -565,11 +625,17 @@ bool SceneManager::LoadScene(const std::wstring& filepath) try { if (ext == L".sparkscene") + { loaded = LoadReflected(filepath); + } else if (ext == L".scene") + { loaded = LoadCustom(filepath); + } else if (ext == L".json") + { loaded = LoadJSON(filepath); + } else { LOG_TO_CONSOLE_IMMEDIATE(L"Scene file extension not recognized: " + filepath, L"WARNING"); @@ -590,9 +656,11 @@ bool SceneManager::LoadScene(const std::wstring& filepath) restorePrevious(); } else + { // The replacement is now committed; release the old graph only after // all parsing and instantiation succeeded. previousObjects.clear(); + } m_suppressSceneEvents = previousEventSuppression; @@ -649,7 +717,9 @@ bool SceneManager::SaveSceneWithinRoot(const std::filesystem::path& root, std::string text; if (!SerializeSceneText(text, destination.wstring())) + { return false; + } bool saved = false; try @@ -672,7 +742,9 @@ bool SceneManager::SaveSceneWithinRoot(const std::filesystem::path& root, if (m_fileCache) { if (const auto narrowPath = NarrowPathIfRoundTrips(destination.wstring())) + { m_fileCache->Invalidate(*narrowPath); + } } m_currentFilePath = destination.wstring(); m_dirty = false; @@ -703,7 +775,9 @@ void SceneManager::LoadSceneAsync(const std::wstring& filepath, SceneLoadCallbac } m_asyncLoading = false; if (callback) + { callback(success, std::string(filepath.begin(), filepath.end())); + } }); } @@ -737,12 +811,16 @@ int SceneManager::AddNode(const SceneNode& node) void SceneManager::RemoveNode(int index) { if (index < 0 || index >= static_cast(m_sceneNodes.size())) + { return; + } // Recursively remove children first auto& node = m_sceneNodes[index]; for (int childIdx : node.childIndices) + { RemoveNode(childIdx); + } // Remove from parent's child list if (node.parentIndex >= 0 && node.parentIndex < static_cast(m_sceneNodes.size())) @@ -766,7 +844,9 @@ void SceneManager::RemoveNode(int index) void SceneManager::SetParent(int childIndex, int parentIndex) { if (childIndex < 0 || childIndex >= static_cast(m_sceneNodes.size())) + { return; + } auto& child = m_sceneNodes[childIndex]; @@ -794,7 +874,9 @@ std::vector SceneManager::GetRootNodes() const for (int i = 0; i < static_cast(m_sceneNodes.size()); ++i) { if (m_sceneNodes[i].parentIndex < 0 && !m_sceneNodes[i].type.empty()) + { roots.push_back(i); + } } return roots; } @@ -802,14 +884,18 @@ std::vector SceneManager::GetRootNodes() const const SceneNode* SceneManager::GetNode(int index) const { if (index < 0 || index >= static_cast(m_sceneNodes.size())) + { return nullptr; + } return &m_sceneNodes[index]; } SceneNode* SceneManager::GetNode(int index) { if (index < 0 || index >= static_cast(m_sceneNodes.size())) + { return nullptr; + } return &m_sceneNodes[index]; } @@ -818,7 +904,9 @@ int SceneManager::FindNode(const std::string& name) const // O(1) lookup via name cache instead of O(n) linear scan auto it = m_nodeNameIndex.find(name); if (it != m_nodeNameIndex.end()) + { return it->second; + } return -1; } @@ -859,7 +947,9 @@ std::vector SceneManager::GetAvailableScenes(const std::wstring& di { std::vector scenes; if (!std::filesystem::exists(directory)) + { return scenes; + } std::error_code ec; for (const auto& entry : std::filesystem::directory_iterator(directory, ec)) @@ -870,7 +960,9 @@ std::vector SceneManager::GetAvailableScenes(const std::wstring& di // UTF-8, never the ANSI code page: path::string() throws on Windows for a // scene name that code page cannot spell, which ended the whole listing. if (auto name = Spark::FileUtils::TryPathToUtf8(entry.path().filename())) + { scenes.push_back(std::move(*name)); + } } } std::sort(scenes.begin(), scenes.end()); @@ -892,7 +984,9 @@ bool SceneManager::LoadJSON(const std::wstring& path) { auto result = m_fileCache->ReadText(*narrowPath); if (result.IsOk()) + { content = result.Value(); + } } } @@ -914,14 +1008,18 @@ bool SceneManager::LoadJSON(const std::wstring& path) SceneMetadata stagedMetadata = m_metadata; std::vector stagedNodes; if (!Spark::ParseVersionedSceneText(content, stagedMetadata, stagedNodes)) + { return false; + } Clear(); m_metadata = std::move(stagedMetadata); m_sceneNodes = std::move(stagedNodes); m_nodeNameIndex.clear(); for (int i = 0; i < static_cast(m_sceneNodes.size()); ++i) + { m_nodeNameIndex[m_sceneNodes[static_cast(i)].name] = i; + } InstantiateNodes(); return true; } @@ -940,7 +1038,9 @@ bool SceneManager::SaveJSON(const std::wstring& path) const { std::string text; if (!SerializeSceneText(text, path)) + { return false; + } const std::filesystem::path destination(path); const std::filesystem::path temporary = MakeUniqueTemporaryPath(destination); @@ -960,7 +1060,9 @@ bool SceneManager::SaveJSON(const std::wstring& path) const if (m_fileCache) { if (const auto narrowPath = NarrowPathIfRoundTrips(path)) + { m_fileCache->Invalidate(*narrowPath); + } } LOG_TO_CONSOLE_IMMEDIATE(L"Scene saved: " + std::to_wstring(m_sceneNodes.size()) + L" nodes", L"SUCCESS"); @@ -1010,17 +1112,29 @@ void SceneManager::InstantiateNodes() // scene terrain plane silently rendered as a 1 m cube. bool isPrimitive = true; if (node.type == "Cube" || node.type == "cube") + { obj = std::make_unique(1.0f); + } else if (node.type == "Plane" || node.type == "plane") + { obj = std::make_unique(1.0f, 1.0f); + } else if (node.type == "Sphere" || node.type == "sphere") + { obj = std::make_unique(0.5f, 16, 16); + } else if (node.type == "Pyramid" || node.type == "pyramid") + { obj = std::make_unique(1.0f); + } else if (node.type == "Ramp" || node.type == "ramp") + { obj = std::make_unique(1.0f, 1.0f); + } else if (node.type == "Wall" || node.type == "wall") + { obj = std::make_unique(1.0f, 1.0f); + } else if (node.type == "model" || node.type == "Model") { // Model type: create a cube as placeholder geometry, then load the actual mesh @@ -1049,7 +1163,9 @@ void SceneManager::InstantiateNodes() if (SUCCEEDED(hr)) { if (!isPrimitive) + { LoadOrPlaceholderMesh(*obj->GetMesh(), m_graphics->GetDevice(), m_graphics->GetContext(), meshPath); + } obj->SetPosition(node.position); // SceneNode rotations are authored in degrees; GameObject // stores radians (XMMatrixRotationRollPitchYaw input). @@ -1097,13 +1213,17 @@ bool SceneManager::LoadCustom(const std::wstring& path) SceneMetadata metadata; std::vector nodes; if (!Spark::ParseIniSceneText(content, metadata, nodes)) + { return false; + } Clear(); m_metadata = std::move(metadata); m_sceneNodes = std::move(nodes); m_nodeNameIndex.clear(); for (int i = 0; i < static_cast(m_sceneNodes.size()); ++i) + { m_nodeNameIndex.emplace(m_sceneNodes[static_cast(i)].name, i); + } InstantiateNodes(); break; } @@ -1119,7 +1239,9 @@ bool SceneManager::LoadCustom(const std::wstring& path) } std::vector rows; if (!Spark::ParseLegacyObjectLines(content, rows)) + { return false; + } std::vector stagedNodes; std::vector> stagedObjects; @@ -1129,17 +1251,29 @@ bool SceneManager::LoadCustom(const std::wstring& path) // primitive constructors require. std::unique_ptr obj; if (row.type == "Cube") + { obj = std::make_unique(row.primary); + } else if (row.type == "Plane") + { obj = std::make_unique(row.primary, row.secondary); + } else if (row.type == "Sphere") + { obj = std::make_unique(row.primary, row.slices, row.stacks); + } else if (row.type == "Pyramid") + { obj = std::make_unique(row.primary); + } else if (row.type == "Ramp") + { obj = std::make_unique(row.primary, row.secondary); + } else + { obj = std::make_unique(row.primary, row.secondary); + } HRESULT hr = obj->Initialize(m_graphics->GetDevice(), m_graphics->GetContext()); if (FAILED(hr)) @@ -1166,7 +1300,9 @@ bool SceneManager::LoadCustom(const std::wstring& path) m_objects = std::move(stagedObjects); m_nodeNameIndex.clear(); for (int i = 0; i < static_cast(m_sceneNodes.size()); ++i) + { m_nodeNameIndex.emplace(m_sceneNodes[static_cast(i)].name, i); + } break; } } @@ -1189,7 +1325,9 @@ std::string SceneManager::Console_ListNodes() const { const auto& node = m_sceneNodes[i]; if (node.type.empty()) + { continue; + } std::string indent(node.parentIndex >= 0 ? 4 : 2, ' '); ss << indent << "[" << i << "] " << node.name << " (" << node.type << ") " << "pos=(" << node.position.x << "," @@ -1202,7 +1340,9 @@ std::string SceneManager::Console_GetNodeInfo(int index) const { const auto* node = GetNode(index); if (!node) + { return "Node not found: " + std::to_string(index); + } std::ostringstream ss; ss << "=== Node [" << index << "] ===\n" @@ -1220,7 +1360,9 @@ bool SceneManager::Console_MoveNode(int index, float x, float y, float z) { auto* node = GetNode(index); if (!node) + { return false; + } node->position = {x, y, z}; m_dirty = true; return true; @@ -1232,12 +1374,16 @@ bool SceneManager::Console_RenameNode(int index, const std::string& newName) "SceneManager::Console_RenameNode — newName must not be empty"); auto* node = GetNode(index); if (!node) + { return false; + } // Reject if another node already has this name (per documentation contract) int existing = FindNode(newName); if (existing >= 0 && existing != index) + { return false; + } node->name = newName; m_dirty = true; diff --git a/SparkEngine/Source/SceneManager/SceneManager.h b/SparkEngine/Source/SceneManager/SceneManager.h index c56bbe732..58438de5d 100644 --- a/SparkEngine/Source/SceneManager/SceneManager.h +++ b/SparkEngine/Source/SceneManager/SceneManager.h @@ -162,9 +162,11 @@ class SceneManager * File format is determined by extension and the versioned file header: * - `.scene` → authored INI or versioned text; older object rows remain readable * - `.json` → versioned text (the historical method name predates this format) - * - `.sparkscene` → strict reflected root mesh/main-camera subset; unsupported + * - `.sparkscene` → strict reflected root mesh/main-camera/neutral player-spawn subset; unsupported * components, hierarchy, materials or asset references reject the load. No backup - * or placeholder fallback is used. SaveScene does not write this reflected format. + * or placeholder fallback is used. Spawn points require default tag, enabled, team 0, radius/cooldown 0, + * unlimited concurrency, unit scale, supported pitch and at most 32 points; priority/facing are preserved. + * SaveScene does not write this reflected format. * * @param filepath Absolute or asset-relative path to the scene file. * @return `true` on success; `false` if the file is missing or malformed. diff --git a/SparkEngine/Source/SceneManager/SceneManagerReflected.cpp b/SparkEngine/Source/SceneManager/SceneManagerReflected.cpp index fdf5cc4af..abcf16fa1 100644 --- a/SparkEngine/Source/SceneManager/SceneManagerReflected.cpp +++ b/SparkEngine/Source/SceneManager/SceneManagerReflected.cpp @@ -10,67 +10,102 @@ #include "Utils/LogMacros.h" #include +#include #include +#include #include bool SceneManager::LoadReflected(const std::wstring& filepath) { const auto reject = [](const char* reason) { - SPARK_LOG_ERROR(Spark::LogCategory::Scene, "Reflected gameplay scene rejected: %s", reason); + if (Spark::Logger::Get().IsInitialized()) + { + SPARK_LOG_ERROR(Spark::LogCategory::Scene, "Reflected gameplay scene rejected: %s", reason); + } + else + { + // Static engine code in a module can have an uninitialized local + // logger. Preserve the bounded failure reason without owning one. + std::fprintf(stderr, "Reflected gameplay scene rejected: %s\n", reason); + std::fflush(stderr); + } return false; }; const std::filesystem::path path(filepath); std::ifstream input(path, std::ios::binary | std::ios::ate); if (!input) + { return reject("primary scene is unreadable"); + } const auto size = input.tellg(); if (size <= 0 || static_cast(size) > Spark::kMaxSceneDocumentBytes) + { return reject("primary scene size is invalid"); + } std::string text(static_cast(size), '\0'); input.seekg(0); input.read(text.data(), static_cast(text.size())); if (!input || input.peek() != std::char_traits::eof()) + { return reject("primary scene changed while reading"); + } // Deliberately read only the primary bytes: LoadWorld's .bak recovery is // useful to an editor, but cannot stand in for a selected packaged scene. World world(World::EntityEventCleanupMode::Suppressed); std::string error; if (!Spark::DeserializeInto(world, text, Spark::SceneDeserializeMode::StrictRecovery, &error)) + { return reject("primary scene is invalid or has unsupported reflected fields"); + } const auto document = nlohmann::json::parse(text); for (const auto& entity : document.at("entities")) { for (const auto& component : entity.at("components")) { const auto type = component.at("type").get(); - if (type != "Transform" && type != "MeshRenderer" && type != "Camera") + if (type != "Transform" && type != "MeshRenderer" && type != "Camera" && type != "SpawnPointComponent") + { return reject("unsupported component"); + } } } auto project = path.parent_path(); if (project.filename() == "Scenes") + { project = project.parent_path(); + } const auto projectU8 = project.u8string(); const std::string projectRoot(projectU8.begin(), projectU8.end()); std::vector nodes; std::vector meshes; std::set names; size_t cameras = 0; + size_t meshCount = 0; + size_t spawnCount = 0; for (auto entity : world.GetEntitiesWith()) { const auto* transform = world.GetComponent(entity); const auto* name = world.GetComponent(entity); const auto* mesh = world.GetComponent(entity); const auto* camera = world.GetComponent(entity); + const auto* spawn = world.GetComponent(entity); if (!name || name->name.empty() || !names.insert(name->name).second) + { return reject("entity names must be nonempty and unique"); + } if (transform->parent != entt::null || !transform->children.empty()) + { return reject("hierarchy is not supported by the gameplay adapter"); - if ((mesh == nullptr) == (camera == nullptr)) - return reject("each entity needs exactly one mesh or camera"); + } + if (static_cast(mesh != nullptr) + static_cast(camera != nullptr) + + static_cast(spawn != nullptr) != + 1) + { + return reject("each entity needs exactly one mesh, camera or supported spawn point"); + } SceneNode node; node.name = name->name; node.position = transform->position; @@ -80,23 +115,30 @@ bool SceneManager::LoadReflected(const std::wstring& filepath) { if (!mesh->materialPath.empty() || !mesh->visible || !mesh->castShadows || !mesh->receiveShadows || mesh->emissive != 0.0f) + { return reject("only default mesh material and rendering flags are supported"); + } const auto resolved = Spark::ResolveProjectAssetPath(projectRoot, mesh->meshPath); std::error_code ec; if (!resolved || resolved->nativePath.extension() != ".obj" || !std::filesystem::is_regular_file(resolved->nativePath, ec) || ec) + { return reject("mesh must be an existing project-confined OBJ"); + } node.type = "model"; node.modelPath = resolved->cacheKey; meshes.push_back(resolved->nativePath); + ++meshCount; } - else + else if (camera) { if (!camera->isMainCamera || ++cameras != 1 || camera->fov < 10.0f || camera->fov > 170.0f || camera->nearPlane < 0.01f || camera->nearPlane > 10.0f || camera->farPlane < 100.0f || camera->farPlane > 10000.0f || camera->nearPlane >= camera->farPlane || node.rotation.x < -89.0f || node.rotation.x > 89.0f || node.scale.x != 1.0f || node.scale.y != 1.0f || node.scale.z != 1.0f) + { return reject("requires one main perspective camera with supported clipping, pitch and unit scale"); + } node.type = "Camera"; node.properties = {{"projection", "perspective"}, {"isMain", "true"}, @@ -105,25 +147,48 @@ bool SceneManager::LoadReflected(const std::wstring& filepath) {"farPlane", std::to_string(camera->farPlane)}}; meshes.emplace_back(); } + else + { + // The FPS consumer selects default-tag points with GetBestSpawnPoint(-1). + // Its 32-point table supports priority and exact position/facing, but + // has no point-reuse timer, radius, team or concurrency accounting. + // In particular respawnDelay here is a reuse cooldown, not the FPS + // player's independently configured death-to-respawn delay. + if (spawn->spawnTag != "default" || !spawn->enabled || spawn->teamID != 0 || spawn->spawnRadius != 0.0f || + spawn->respawnDelay != 0.0f || spawn->maxConcurrent != -1 || node.scale.x != 1.0f || + node.scale.y != 1.0f || node.scale.z != 1.0f || node.rotation.x < -89.0f || node.rotation.x > 89.0f || + ++spawnCount > 32) + { + return reject("spawn requires neutral enabled default-tag exact-point semantics, no reuse " + "cooldown/concurrency limit, unit scale, supported pitch and at most 32 points"); + } + node.type = "SpawnPoint"; + node.properties = {{"tag", spawn->spawnTag}, {"priority", std::to_string(spawn->priority)}}; + meshes.emplace_back(); + } nodes.push_back(std::move(node)); } - if (nodes.size() != world.GetEntityCount() || cameras != 1 || nodes.size() < 2) + if (nodes.size() != world.GetEntityCount() || cameras != 1 || meshCount == 0) + { return reject("requires a main camera and at least one mesh, all with transforms"); + } std::vector> objects; const bool rendering = m_graphics && m_graphics->GetDevice() && m_graphics->GetContext(); for (size_t i = 0; i < nodes.size(); ++i) { - if (!rendering || nodes[i].type == "Camera") + if (!rendering || nodes[i].type != "model") { objects.push_back(nullptr); continue; } auto object = std::make_unique(1.0f); if (FAILED(object->Initialize(m_graphics->GetDevice(), m_graphics->GetContext()))) + { return reject("mesh object initialization failed"); - // Never use LoadOrPlaceholderMesh: a missing or malformed authored OBJ - // must not be replaced by a plausible cube and reported as consumed. + } + // Never use LoadOrPlaceholderMesh: a missing or malformed authored OBJ + // must not be replaced by a plausible cube and reported as consumed. #ifdef _WIN32 const auto meshPath = meshes[i].wstring(); #else @@ -131,10 +196,12 @@ bool SceneManager::LoadReflected(const std::wstring& filepath) const std::wstring meshPath(meshU8.begin(), meshU8.end()); #endif if (!object->GetMesh()->LoadFromFile(meshPath)) + { return reject("authored OBJ could not be loaded"); + } object->SetName(nodes[i].name); object->SetPosition(nodes[i].position); - constexpr float degreesToRadians = 3.14159265358979323846f / 180.0f; + constexpr float degreesToRadians = std::numbers::pi_v / 180.0f; const auto rotation = nodes[i].rotation; object->SetRotation( {rotation.x * degreesToRadians, rotation.y * degreesToRadians, rotation.z * degreesToRadians}); @@ -149,6 +216,8 @@ bool SceneManager::LoadReflected(const std::wstring& filepath) m_objects = std::move(objects); m_nodeNameIndex.clear(); for (size_t i = 0; i < m_sceneNodes.size(); ++i) + { m_nodeNameIndex[m_sceneNodes[i].name] = static_cast(i); + } return true; } diff --git a/SparkEngine/Source/Utils/CrashHandler.cpp b/SparkEngine/Source/Utils/CrashHandler.cpp index 23fa912bc..64cbbf794 100644 --- a/SparkEngine/Source/Utils/CrashHandler.cpp +++ b/SparkEngine/Source/Utils/CrashHandler.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -1927,13 +1928,14 @@ namespace #endif // Read only two frame-chain words from this process. No stack payload // is persisted, and invalid/omitted frame pointers stop at the exact PC. - constexpr std::uintptr_t kMaxStackWalkBytes = 8 * 1024 * 1024; + constexpr std::uintptr_t kMaxStackWalkBytes = std::uintptr_t{8} * 1024 * 1024; while (stack && frame >= stack && frame - stack < kMaxStackWalkBytes && frame % alignof(std::uintptr_t) == 0 && count < kMaxFrames) { std::uintptr_t words[2]{}; iovec local{words, sizeof(words)}; - iovec remote{reinterpret_cast(frame), sizeof(words)}; + // The kernel consumes the captured register's address bits, not a C++ dereference. + iovec remote{std::bit_cast(frame), sizeof(words)}; if (syscall(SYS_process_vm_readv, getpid(), &local, 1UL, &remote, 1UL, 0UL) != static_cast(sizeof(words))) { @@ -2056,6 +2058,10 @@ namespace /// The fatal signal being reported; read by the watchdog. volatile sig_atomic_t g_fatalSignal = 0; +#ifdef SPARK_PLATFORM_LINUX + /// Own nonblocking open-file description; never changes the launcher's stderr flags. + int g_signalStderrHandle = -1; +#endif /// Test seam (CrashSymbolicationProbe --stall-report): block the /// best-effort stage as a crash under a held malloc lock would. @@ -2102,6 +2108,31 @@ namespace SignalSafeWrite(fd, text, SignalSafeLength(text)); } + /// Fatal diagnostics must not wait for an unread pipe, including in the watchdog. + void WriteFatalStderr(const char* text) + { +#ifdef SPARK_PLATFORM_LINUX + const int descriptor = g_signalStderrHandle; +#else + // Reopening /dev/fd on other POSIX hosts may duplicate the shared description. + // Drop optional stderr diagnostics unless its existing mode is nonblocking. + const int flags = fcntl(STDERR_FILENO, F_GETFL, 0); + const int descriptor = flags >= 0 && (flags & O_NONBLOCK) != 0 ? STDERR_FILENO : -1; +#endif + if (!text || descriptor < 0) + { + return; + } + // One attempt only: EINTR, EAGAIN and partial writes may drop a diagnostic. + constexpr size_t kMaxFatalDiagnosticBytes = 1024; + size_t length = 0; + while (length < kMaxFatalDiagnosticBytes && text[length] != '\0') + { + ++length; + } + (void)write(descriptor, text, length); + } + /// Append @p value in @p base (10 or 16, lowercase) without allocating. void SignalSafeWriteNumber(int fd, std::uint64_t value, unsigned base, size_t minDigits = 1) { @@ -2175,7 +2206,7 @@ namespace /// lock the crashed thread holds. Finish the crash without the rest. void OnSignalReportTimeout(int) { - WriteStderr("[SPARK ENGINE] Crash report timed out; terminating without the remaining sections.\n"); + WriteFatalStderr("[SPARK ENGINE] Crash report timed out; terminating without the remaining sections.\n"); const int sig = g_fatalSignal != 0 ? static_cast(g_fatalSignal) : SIGABRT; TerminateWithFatalSignal(sig); } @@ -2183,10 +2214,17 @@ namespace void ArmSignalReportWatchdog(int sig) { g_fatalSignal = sig; + // A closed stderr pipe must not replace the original fatal signal with SIGPIPE. + sigset_t brokenPipe; + sigemptyset(&brokenPipe); + sigaddset(&brokenPipe, SIGPIPE); + sigprocmask(SIG_BLOCK, &brokenPipe, nullptr); struct sigaction timeoutAction; memset(&timeoutAction, 0, sizeof(timeoutAction)); timeoutAction.sa_handler = OnSignalReportTimeout; sigemptyset(&timeoutAction.sa_mask); + // SIGALRM can run on another thread, whose SIGPIPE mask differs. + sigaddset(&timeoutAction.sa_mask, SIGPIPE); timeoutAction.sa_flags = SA_ONSTACK; sigaction(SIGALRM, &timeoutAction, nullptr); @@ -2349,7 +2387,7 @@ namespace const bool logReady = FinishSignalArtifact(fd, !g_signalWriteFailed); if (!logReady || !prepared.ready) { - WriteStderr("[SPARK ENGINE] Incomplete signal log; manifest not published.\n"); + WriteFatalStderr("[SPARK ENGINE] Incomplete signal log; manifest not published.\n"); return; } @@ -2433,11 +2471,11 @@ namespace kRenameNoReplace) != 0) { unlinkat(g_artifactRootHandle, temporaryName, 0); - WriteStderr("[SPARK ENGINE] Signal manifest publication failed.\n"); + WriteFatalStderr("[SPARK ENGINE] Signal manifest publication failed.\n"); } - WriteStderr("Log file (private artifact directory): "); - WriteStderr(g_signalLogName); - WriteStderr("\n"); + WriteFatalStderr("Log file (private artifact directory): "); + WriteFatalStderr(g_signalLogName); + WriteFatalStderr("\n"); } #endif @@ -2490,9 +2528,9 @@ namespace if (logProbe.stream) WriteCrashManifest(reportId, coreProbe.stream ? coreFile : std::string{}, logFile, "", "", crashTitle); - WriteStderr("Log file: "); - WriteStderr(logFile.c_str()); - WriteStderr("\n"); + WriteFatalStderr("Log file: "); + WriteFatalStderr(logFile.c_str()); + WriteFatalStderr("\n"); } #endif @@ -2508,6 +2546,14 @@ namespace g_signalLogPrefix[length] = '\0'; #ifdef SPARK_PLATFORM_LINUX // Install/reinstall is a quiescent lifecycle operation, as for the pinned root. + if (g_signalStderrHandle >= 0) + { + close(g_signalStderrHandle); + g_signalStderrHandle = -1; + } + // A fresh /proc open has its own status flags; dup() would share O_NONBLOCK. + // Append preserves existing regular-file stderr contents and its shared offset. + g_signalStderrHandle = open("/proc/self/fd/2", O_WRONLY | O_NONBLOCK | O_APPEND | O_CLOEXEC); // Snapshot optional sections now; never enumerate threads or use stdio in a signal. g_preparedSignalArtifacts = {}; auto& manifest = g_preparedSignalArtifacts.manifest; @@ -2601,16 +2647,16 @@ static void HandleLinuxCrash(int sig, siginfo_t* info, void* context) sigName = "SIGTRAP (Trace/breakpoint trap)"; break; } - WriteStderr("\n[SPARK ENGINE] CRASH: "); - WriteStderr(sigName); - WriteStderr("\n"); + WriteFatalStderr("\n[SPARK ENGINE] CRASH: "); + WriteFatalStderr(sigName); + WriteFatalStderr("\n"); // One report per process; the sequence is shared with nonfatal reports. const std::uint64_t reportSequence = g_reportSequence.fetch_add(1, std::memory_order_relaxed) + 1; const int fd = OpenSignalReportLog(reportSequence); if (fd < 0) { - WriteStderr("[SPARK ENGINE] Private crash-artifact directory unavailable; report not written.\n"); + WriteFatalStderr("[SPARK ENGINE] Private crash-artifact directory unavailable; report not written.\n"); TerminateWithFatalSignal(sig); } #ifdef SPARK_PLATFORM_LINUX @@ -2628,13 +2674,13 @@ static void HandleLinuxCrash(int sig, siginfo_t* info, void* context) } catch (const std::exception& e) { - WriteStderr("[SPARK ENGINE] Exception: "); - WriteStderr(e.what()); - WriteStderr("\n"); + WriteFatalStderr("[SPARK ENGINE] Exception: "); + WriteFatalStderr(e.what()); + WriteFatalStderr("\n"); } catch (...) { - WriteStderr("[SPARK ENGINE] Unknown exception in crash handler\n"); + WriteFatalStderr("[SPARK ENGINE] Unknown exception in crash handler\n"); } #endif diff --git a/SparkLauncher/src/main.cpp b/SparkLauncher/src/main.cpp index 351a63493..e18799764 100644 --- a/SparkLauncher/src/main.cpp +++ b/SparkLauncher/src/main.cpp @@ -10,7 +10,9 @@ #include "LauncherPaths.h" #include "LauncherProcess.h" +#include #include +#include #include #include #include @@ -51,6 +53,7 @@ namespace #include #include int WINAPI WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPSTR cmdLine, _In_ int) +try { (void)cmdLine; int argumentCount = 0; @@ -102,6 +105,7 @@ int WINAPI WinMain(_In_ HINSTANCE, _In_opt_ HINSTANCE, _In_ LPSTR cmdLine, _In_ LocalFree(arguments); #else int main(int argc, char** argv) +try { for (int i = 1; i < argc; ++i) { @@ -162,3 +166,13 @@ int main(int argc, char** argv) SparkLauncher::Backend_Shutdown(); return 0; } +catch (const std::exception& error) +{ + std::fprintf(stderr, "SparkLauncher failed: %.512s\n", error.what()); + return 1; +} +catch (...) +{ + std::fputs("SparkLauncher failed: unexpected exception\n", stderr); + return 1; +} diff --git a/SparkSDK/ABI/sdk-abi-surface.json b/SparkSDK/ABI/sdk-abi-surface.json index 711286c0c..0870ca351 100644 --- a/SparkSDK/ABI/sdk-abi-surface.json +++ b/SparkSDK/ABI/sdk-abi-surface.json @@ -1,6 +1,6 @@ { "comment": "Generated by SparkSDK/Tools/sdk_abi_surface.py update. Do not edit by hand.", - "sdk_version": 9, + "sdk_version": 10, "surface": { "enums": { "Spark::ModuleKind": { @@ -9,6 +9,16 @@ "Game = 0", "Addon = 1" ] + }, + "Spark::WeatherPreset": { + "underlying": "uint32_t", + "values": [ + "Clear = 0", + "Rain = 1", + "Snow = 2", + "Fog = 3", + "Storm = 4" + ] } }, "interfaces": { @@ -116,7 +126,8 @@ "const ComponentSerializerRegistry* GetComponentSerializers() const", "ILogger* GetLogger()", "IConsole* GetConsole()", - "IStateValidation* GetStateValidation()" + "IStateValidation* GetStateValidation()", + "IWeatherService* GetWeatherService()" ] }, "Spark::IGameplayTagService": { @@ -189,6 +200,14 @@ "void Shutdown()", "bool IsInitialized() const" ] + }, + "Spark::IWeatherService": { + "bases": "", + "header": "IWeatherService.h", + "virtuals": [ + "~IWeatherService()", + "bool SetWeather(WeatherPreset preset, float intensity, float transitionSeconds)" + ] } }, "macros": { @@ -331,5 +350,5 @@ "SparkGetModuleCompatibilityFn": "const SparkModuleCompatibilityDescriptor* (*)()" } }, - "surface_sha256": "332af67d463482836a211994c23435515f5290f19d62a85491700c240211ce65" + "surface_sha256": "7febe9231929daf4c9e94a49d9b34062c636325dd89809ffe29bfae03a439e17" } diff --git a/SparkSDK/API-REFERENCE.md b/SparkSDK/API-REFERENCE.md index d8bade32b..bbc016465 100644 --- a/SparkSDK/API-REFERENCE.md +++ b/SparkSDK/API-REFERENCE.md @@ -28,13 +28,22 @@ check before use. Use the public service interfaces in the SDK for logging, console commands, state validation, networking, and telemetry. The context is borrowed and does not transfer ownership to the module. +## Weather commands (`Spark/IWeatherService.h`) + +`GetWeatherService()` returns a borrowed optional `IWeatherService`. Call +`SetWeather(WeatherPreset, intensity, transitionSeconds)` on the game thread. +Presets are Clear=0, Rain=1, Snow=2, Fog=3 and Storm=4. Invalid presets, +nonfinite arguments or unavailable weather return false without mutation. +Finite negative intensity selects the preset default; other intensities clamp +to [0,1], and transitions have a0.01-second minimum. Success means accepted. + ## Compatibility descriptor (`Spark/ModuleABI.h`) `SparkModuleCompatibilityDescriptor` is a fixed C-layout descriptor read before the C++ factory is called. The host checks the magic, descriptor format, SDK and runtime ABI versions, compiler family and version, C++ language level, runtime library, iterator debug level, and pointer size. The descriptor is -64 bytes for descriptor version 1 and `SPARK_SDK_VERSION` 9. +64 bytes for descriptor version 1 and `SPARK_SDK_VERSION` 10. `Spark::CheckModuleCompatibility()` returns the status. For a diagnostic, `Spark::GetModuleCompatibilityMismatch()` identifies the sidecar field and diff --git a/SparkSDK/Include/Spark/IEngineContext.h b/SparkSDK/Include/Spark/IEngineContext.h index d418cc6ec..025251858 100644 --- a/SparkSDK/Include/Spark/IEngineContext.h +++ b/SparkSDK/Include/Spark/IEngineContext.h @@ -15,6 +15,7 @@ #include #include "Spark/ServiceInterfaces.h" +#include "Spark/IWeatherService.h" #include "Spark/Version.h" // Forward declarations — engine types accessible through the context. @@ -374,6 +375,10 @@ namespace Spark * adds must be removed in its OnUnload (see ). */ virtual IStateValidation* GetStateValidation() { return nullptr; } + + /// Optional host-owned weather commands. Borrowed until context destruction; game thread only. + /// Added in SDK 10. Existing concrete GetWeather() slots retain their original meaning. + virtual IWeatherService* GetWeatherService() { return nullptr; } }; /** @@ -389,9 +394,9 @@ namespace Spark * vtable changed without a SPARK_SDK_VERSION bump re-pinned in * SparkSDK/ABI/sdk-abi-surface.json. */ - inline constexpr uint32_t EngineContextVirtualCount = 91; + inline constexpr uint32_t EngineContextVirtualCount = 92; - static_assert(EngineContextVirtualCount == 91 && SPARK_SDK_VERSION == 9, + static_assert(EngineContextVirtualCount == 92 && SPARK_SDK_VERSION == 10, "IEngineContext's vtable layout changed: bump SPARK_SDK_VERSION and update " "EngineContextVirtualCount together, or an old host will accept a module that " "calls off the end of its vtable."); diff --git a/SparkSDK/Include/Spark/IModule.h b/SparkSDK/Include/Spark/IModule.h index e9ead4268..a9a45da55 100644 --- a/SparkSDK/Include/Spark/IModule.h +++ b/SparkSDK/Include/Spark/IModule.h @@ -76,10 +76,10 @@ namespace Spark }; // ModuleInfo crosses the DLL boundary by value (IModule::GetModuleInfo), so - // its layout is SDK ABI. These pins hold for SPARK_SDK_VERSION 9: changing + // its layout is SDK ABI. These pins hold for SPARK_SDK_VERSION 10: changing // the struct needs a SPARK_SDK_VERSION bump, and every bump re-pins this // block and SparkSDK/ABI/sdk-abi-surface.json (SparkSDK/Tools/sdk_abi_surface.py). - static_assert(SPARK_SDK_VERSION == 9, "SPARK_SDK_VERSION changed: re-pin the ModuleInfo layout below"); + static_assert(SPARK_SDK_VERSION == 10, "SPARK_SDK_VERSION changed: re-pin the ModuleInfo layout below"); static_assert(sizeof(ModuleKind) == 1, "ModuleKind is a uint8_t in the SDK ABI"); static_assert(offsetof(ModuleInfo, name) == 0, "ModuleInfo layout changed without an SDK bump"); static_assert(offsetof(ModuleInfo, version) == sizeof(void*), "ModuleInfo layout changed without an SDK bump"); diff --git a/SparkSDK/Include/Spark/IWeatherService.h b/SparkSDK/Include/Spark/IWeatherService.h new file mode 100644 index 000000000..8b83e2364 --- /dev/null +++ b/SparkSDK/Include/Spark/IWeatherService.h @@ -0,0 +1,40 @@ +/** + * @file IWeatherService.h + * @brief Host-owned weather commands for game modules (SDK 10). + */ +#pragma once + +#include + +namespace Spark +{ + /// Stable command vocabulary; values do not alias the private WeatherType enum. + enum class WeatherPreset : uint32_t + { + Clear = 0, + Rain = 1, + Snow = 2, + Fog = 3, + Storm = 4, + }; + + /** + * Borrowed from IEngineContext; never delete the service. Valid until context + * destruction, including subsystem replacement. Call only on the game thread, + * serialized with host weather updates and subsystem registration/teardown. + */ + class IWeatherService + { + public: + virtual ~IWeatherService() = default; + + /** + * Queue a host weather transition. Returns false without mutation for an + * unknown preset, nonfinite scalar, or unavailable weather subsystem. + * Finite negative intensity selects the preset default; other intensities + * clamp to [0,1]. Transition duration has the host minimum of 0.01 seconds. + * Success means accepted, not that the transition has already completed. + */ + virtual bool SetWeather(WeatherPreset preset, float intensity, float transitionSeconds) = 0; + }; +} // namespace Spark diff --git a/SparkSDK/Include/Spark/ModuleABI.h b/SparkSDK/Include/Spark/ModuleABI.h index 4443ebb48..5c5474dc0 100644 --- a/SparkSDK/Include/Spark/ModuleABI.h +++ b/SparkSDK/Include/Spark/ModuleABI.h @@ -87,9 +87,9 @@ struct SparkModuleCompatibilityDescriptor // The descriptor is read by hosts of other SDK versions (that is how an old host // rejects a new module with a diagnostic instead of a crash), and its fields are // mirrored field-for-field by the .sparkabi sidecar that cmake/SparkGameModule.cmake -// derives from the macros above. Pinned for SPARK_SDK_VERSION 9 / descriptor v1; +// derives from the macros above. Pinned for SPARK_SDK_VERSION 10 / descriptor v1; // an SDK bump re-pins this block with SparkSDK/ABI/sdk-abi-surface.json. -static_assert(SPARK_SDK_VERSION == 9 && SPARK_MODULE_ABI_DESCRIPTOR_VERSION == 1u, +static_assert(SPARK_SDK_VERSION == 10 && SPARK_MODULE_ABI_DESCRIPTOR_VERSION == 1u, "SDK or descriptor version changed: re-pin the compatibility descriptor layout below"); static_assert(sizeof(SparkModuleCompatibilityDescriptor) == SPARK_MODULE_ABI_DESCRIPTOR_SIZE, "Update the sidecar ABI writer when the compatibility descriptor changes"); diff --git a/SparkSDK/Include/Spark/Version.h b/SparkSDK/Include/Spark/Version.h index 074d2b68e..09e51c635 100644 --- a/SparkSDK/Include/Spark/Version.h +++ b/SparkSDK/Include/Spark/Version.h @@ -37,7 +37,11 @@ // rules through the host instead of the private Utils/InvalidStateDetector.h. // StateViolationSeverity, StateViolation and StateCheckFn moved into the SDK // unchanged. -#define SPARK_SDK_VERSION 9 +// v10: Appended IEngineContext::GetWeatherService() (one vtable slot, MOD-310) +// and public IWeatherService/WeatherPreset, so modules issue weather commands +// without including the private WeatherSystem. Rebuild every module against +// v10; SDK compatibility remains exact-match and old GetWeather slots remain. +#define SPARK_SDK_VERSION 10 // Packed engine version for runtime comparisons: 0xMMmmpp #define SPARK_ENGINE_VERSION_PACKED \ diff --git a/SparkSDK/MIGRATION.md b/SparkSDK/MIGRATION.md index 9e1e6411f..632ca3b9c 100644 --- a/SparkSDK/MIGRATION.md +++ b/SparkSDK/MIGRATION.md @@ -5,7 +5,24 @@ The SDK ABI is an exact-match contract. `SPARK_SDK_VERSION` is defined in rebuilt against the installed SDK before loading. There is no N-1 module load or automatic ABI migration. -## Current version: SDK ABI v9 +## Current version: SDK ABI v10 + +Version 10 appends `IEngineContext::GetWeatherService()` and adds the public +`Spark/IWeatherService.h` interface with explicit `WeatherPreset` values. +Rebuild every module against SDK10 and regenerate its sidecar; SDK9 modules +are rejected before loading. Do not edit a sidecar to disguise an old binary. + +Use the borrowed service on the game thread for weather commands. Check for +a null getter and a false command result. The service is host-owned; accepted +commands start a transition rather than reporting its completion. The old +private `GetWeather()` getters remain in their original slots for migration; +new module code should use the public command interface. + +The descriptor stays version1/64 bytes and runtime ABI1. This SDK bump does +not change the separate plugin ABI or enable N-1 module loading. Prior SDK9 +qualification evidence remains attached to its original binaries. + +## Previous version: SDK ABI v9 Version 9 appended `IEngineContext::GetStateValidation()` and the public `IStateValidation` interface. Modules that used the engine's private diff --git a/SparkSDK/README.md b/SparkSDK/README.md index 9170a016b..f96496482 100644 --- a/SparkSDK/README.md +++ b/SparkSDK/README.md @@ -7,10 +7,13 @@ against an installed engine package. ## Consume an installed SDK -Install the `sdk` component from a configured engine build, then point a -standalone project at its CMake package directory: +Install the `sdk` component together with its declared `runtime` dependency +from a configured engine build, then point a standalone project at its CMake +package directory. CPack resolves component dependencies; direct CMake installs +must select each component explicitly: ```powershell +cmake --install --prefix --config Release --component runtime cmake --install --prefix --config Release --component sdk cmake -S -B /build ` -DSparkEngine_DIR="/lib/cmake/SparkEngine" @@ -92,7 +95,7 @@ values are derived from `Spark/Version.h` and `Spark/ModuleABI.h` by ## Package contents -The SDK component is self-contained and includes: +The SDK component includes: - public headers under `include/Spark/`; - exported CMake targets and `spark_add_game_module` under @@ -103,9 +106,14 @@ The SDK component is self-contained and includes: - a buildable `EmptyProject` example under `share/SparkEngine/sdk/examples/EmptyProject/`. +The `runtime` dependency provides the host and shared runtime libraries. In +SDL2 builds, the SDK exports its CMake target while the runtime supplies its +shared library, so installing `sdk` alone cannot provide a usable package. +Install `tools` as well when generating a project with the installed spark-cli. + On Windows and Linux, the `SDKConsumer_InstalledEmptyProjectTemplate` CTest -installs the `sdk` and `tools` components and builds that example from the -installed copy, in the engine's configuration. The test fails if any header, +installs the `runtime`, `sdk`, and `tools` components and builds that example +from the installed copy, in the engine's configuration. The test fails if any header, library or flag path the build resolves points into the engine source or build tree. It also fails if the module's `.sparkabi` sidecar would be rejected by the host's pre-load check. This test is registered only when diff --git a/SparkSDK/Tools/sdk_abi_surface.py b/SparkSDK/Tools/sdk_abi_surface.py index 4b1daaff9..145136ebd 100644 --- a/SparkSDK/Tools/sdk_abi_surface.py +++ b/SparkSDK/Tools/sdk_abi_surface.py @@ -50,7 +50,7 @@ EXCLUDED_HEADERS = {"PluginABI.h"} ABI_STRUCTS = ("Spark::ModuleInfo", "SparkModuleCompatibilityDescriptor") -ABI_ENUMS = ("Spark::ModuleKind",) +ABI_ENUMS = ("Spark::ModuleKind", "Spark::WeatherPreset") ABI_MACROS = ( "SPARK_MODULE_ABI_MAGIC", "SPARK_MODULE_ABI_DESCRIPTOR_SIZE", diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index 453ca2fc6..9217d0a2c 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -69,6 +69,7 @@ add_executable(SparkTests TestPhysicsComponents.cpp TestEventSystem.cpp TestWeatherSystem.cpp + TestSdkWeatherService.cpp TestInventorySystem.cpp TestQuestSystem.cpp TestDayNightCycle.cpp @@ -668,6 +669,9 @@ add_executable(SparkTests TestTFLoadoutWire.cpp # TF-110 tf_observe text form + tf_aim_at angles (header-only) TestTFObservation.cpp + # TFReplication's actual sender cache: dirty sends stay immediate while + # periodic quiet-state refreshes repair a dropped unreliable update. + TestTFReplicationRefresh.cpp # Security review: TERRAFRONT server trust-boundary regressions (header-only # rules + the TFAccountSystem/TFDatabase sources listed below) TestTFServerSecurity.cpp @@ -820,6 +824,44 @@ add_dependencies(SparkTests SparkDebugHookTeardownProbe) target_compile_definitions(SparkTests PRIVATE SPARK_TEST_DEBUG_HOOK_TEARDOWN_PROBE_PATH="$") +# Exercise the exported Game class in the actual FPS DLL, in a fresh process. +# Isolated staged assets keep the module's cached asset root independent of +# SparkTests and prevent the owned reload fixtures from touching source assets. +if(WIN32 AND TARGET SparkGameFPS) + add_executable(SparkFPSCameraReloadTests TestFPSGameCameraReloadReal.cpp) + target_compile_features(SparkFPSCameraReloadTests PRIVATE cxx_std_23) + target_include_directories(SparkFPSCameraReloadTests PRIVATE + "${CMAKE_SOURCE_DIR}/GameModules/SparkGameFPS/Source") + # SPARK_GAME_DLL stays private to SparkGameFPS: this consumer imports Game. + target_link_libraries(SparkFPSCameraReloadTests PRIVATE SparkGameFPS SparkEngineLib) + set_target_properties(SparkFPSCameraReloadTests PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/fps-camera-reload/$") + foreach(_fps_reload_config IN ITEMS Debug Release RelWithDebInfo MinSizeRel) + string(TOUPPER "${_fps_reload_config}" _fps_reload_config_upper) + set_target_properties(SparkFPSCameraReloadTests PROPERTIES + RUNTIME_OUTPUT_DIRECTORY_${_fps_reload_config_upper} + "${CMAKE_CURRENT_BINARY_DIR}/fps-camera-reload/${_fps_reload_config}") + endforeach() + # Implementation-only DLL edits can leave its import library unchanged. + # Refresh every build instead of relying on the probe executable relinking. + add_custom_target(SparkFPSCameraReloadRuntime ALL + COMMAND ${CMAKE_COMMAND} -E copy_if_different + $ "$" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/Assets/Models" + "$/Assets/Models" + COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/Assets/Scenes" + "$/Assets/Scenes" + COMMAND_EXPAND_LISTS VERBATIM) + add_dependencies(SparkFPSCameraReloadRuntime SparkFPSCameraReloadTests SparkGameFPS) + add_dependencies(SparkTests SparkFPSCameraReloadRuntime) + add_test(NAME SparkFPSGameCameraReloadReal + COMMAND SparkFPSCameraReloadTests "$") + set_tests_properties(SparkFPSGameCameraReloadReal PROPERTIES + LABELS "fps;scene;integration;dll" + TIMEOUT 60 + WORKING_DIRECTORY "$") +endif() + # The stable-v1 Windows shipping profile deliberately disables networking. # Keep this public-header include contract independently buildable so a # networking-only type cannot leak into that profile through an unguarded @@ -1197,6 +1239,7 @@ target_sources(SparkTests PRIVATE TestSEC100ChatAuditLogReal.cpp TestSEC100RemoteAdminUnavailableReal.cpp TestSaveSystemRoundTripReal.cpp + TestFPSOwnedSaveDecode.cpp TestSAVE230NewerFormatSlotReal.cpp TestSaveInterruptionReal.cpp TestDocumentInterruptionReal.cpp @@ -1414,6 +1457,13 @@ if(TARGET imgui) "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Core/EditorTheme.cpp" "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Core/EditorNotificationManager.cpp" "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Panels/AssetBrowserPanel.cpp" + "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Panels/AssetBrowserGrid.cpp" + "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Panels/MaterialEditorPanel.cpp" + "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Panels/MaterialEditorFiles.cpp" + "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Panels/MaterialEditorDefaults.cpp" + "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp" + "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Panels/MaterialEditorParameters.cpp" + "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Panels/MaterialEditorPreview.cpp" "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Panels/GameViewPanel.cpp" "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Panels/InspectorVectorControl.cpp" "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Search/CommandPalette.cpp" @@ -1455,6 +1505,12 @@ if(TARGET imgui) "${CMAKE_SOURCE_DIR}/SparkEditor/Source/Profiler/PerformanceProfiler.cpp" ) + add_test(NAME EditorMaterialSave COMMAND $ --warn-is-error --empty-is-error) + set_tests_properties(EditorMaterialSave PROPERTIES + ENVIRONMENT "SPARK_TEST_NAME_PREFIX=EditorSubsystemsReal_MaterialSave_;SPARK_TEST_EXPECT_COUNT=10" + LABELS "editor;editor-integration;unit" + RUN_SERIAL TRUE + TIMEOUT 60) message(STATUS "[Tests] ImGui available — gated editor + 6 game module tests enabled") else() message(STATUS "[Tests] ImGui not available — gated editor & OpenWorld tests disabled") @@ -1823,6 +1879,10 @@ function(spark_exclude_from_main_suite family_prefix) set_property(DIRECTORY APPEND PROPERTY SPARK_MAIN_SUITE_EXCLUDED_FAMILIES "${family_prefix}") endfunction() +if(TARGET imgui) + spark_exclude_from_main_suite(EditorSubsystemsReal_MaterialSave_) +endif() + # TestMain matches SPARK_TEST_EXCLUDE anywhere in a name, while the dedicated # lanes select by name prefix. A test that contains an excluded family prefix # without starting with it would therefore run in neither lane, so configure @@ -3135,12 +3195,17 @@ if(WIN32) LABELS "d3d11-validation;d3d11-debug-layer;d3d11;stable-v1" RUN_SERIAL TRUE TIMEOUT 180) - add_test(NAME D3D11_DeviceLoss COMMAND $ --warn-is-error) + add_test(NAME D3D11_DeviceLoss COMMAND $ --warn-is-error + --junit-xml "${CMAKE_BINARY_DIR}/SparkTests-d3d11-device-loss-junit.xml") set_tests_properties(D3D11_DeviceLoss PROPERTIES ENVIRONMENT "SPARK_TEST_NAME=D3D11_DeviceLoss_;SPARK_TEST_EXPECT_COUNT=4" - LABELS "d3d11-stress;d3d11;stable-v1" + LABELS "d3d11-stress;d3d11;stable-v1;sparktests;unit;integration" RUN_SERIAL TRUE TIMEOUT 120) + # This family already has its own CTest lane. Keep every case and its + # existing timeout, but count it once in the granular JUnit aggregation so + # slower VS2026 Release runs do not time out the monolithic main suite. + spark_exclude_from_main_suite(D3D11_DeviceLoss_) # CreateShader must compile source with no debugName (D3DCompile rejects an empty source # name with the standard include handler), name the source by filePath so relative # includes resolve, and log the HRESULT on failure (TestD3D11DeviceContractsReal.cpp). @@ -3293,7 +3358,7 @@ endif() # after the loaded library. Host evidence only; it promotes no module profile. add_test(NAME ModuleLifecycleRecordHost COMMAND $ --warn-is-error) set_tests_properties(ModuleLifecycleRecordHost PROPERTIES - ENVIRONMENT "SPARK_TEST_NAME=ModuleLifecycleRecord_;SPARK_TEST_EXPECT_COUNT=5" + ENVIRONMENT "SPARK_TEST_NAME=ModuleLifecycleRecord_;SPARK_TEST_EXPECT_COUNT=6" LABELS "lifecycle;module;unit" RUN_SERIAL TRUE TIMEOUT 60) @@ -5723,6 +5788,20 @@ if(NOT CMAKE_CROSSCOMPILING AND MINIZ_FOUND AND TARGET SparkCrashReporter) TIMEOUT 180) endif() +# Check the actual vendored Debug flags and production password-hash cases. +if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT CMAKE_CROSSCOMPILING AND NOT MSVC + AND Python3_Interpreter_FOUND) + add_test(NAME LibsodiumDebugBuildContract + COMMAND ${Python3_EXECUTABLE} -B + ${CMAKE_SOURCE_DIR}/Tests/Tools/test_libsodium_debug_build.py + --cmake ${CMAKE_COMMAND} + --c-compiler ${CMAKE_C_COMPILER} + --cxx-compiler ${CMAKE_CXX_COMPILER}) + set_tests_properties(LibsodiumDebugBuildContract PROPERTIES + LABELS "network-security;build;integration" + TIMEOUT 180) +endif() + # OPS-100: build-id symbolication canary (Linux, local symbol store, no relay). # The probe crashes through the production signal handler; it is compiled with # -g (RelWithDebInfo-style) and an explicit GNU build-id so its split debug @@ -5731,8 +5810,10 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT CMAKE_CROSSCOMPILING AND MINIZ_FOU AND Python3_Interpreter_FOUND AND CMAKE_OBJCOPY AND CMAKE_ADDR2LINE) add_executable(SparkCrashSymbolicationProbe Fixtures/CrashSymbolicationProbe.cpp) target_compile_features(SparkCrashSymbolicationProbe PRIVATE cxx_std_23) + # The signal-safe walker requires frame pointers; -O0 also retains the + # crash site's leaf frame so its return address resolves to main. # -fno-lto: an LTO-compiled unit reports its DWARF file as . - target_compile_options(SparkCrashSymbolicationProbe PRIVATE -g -O2 -fno-lto) + target_compile_options(SparkCrashSymbolicationProbe PRIVATE -g -O0 -fno-omit-frame-pointer -fno-lto) target_link_options(SparkCrashSymbolicationProbe PRIVATE -Wl,--build-id=sha1) # Shipping presets strip every link (-s); the probe must keep its DWARF so # the canary can split it into the symbol store. @@ -6485,6 +6566,10 @@ if(Python3_Interpreter_FOUND) set_tests_properties(runtime-bundle-validation PROPERTIES LABELS "readiness;site-data;unit;node" ENVIRONMENT "PYTHON=${Python3_EXECUTABLE}" + # Bundle generation takes about three minutes. Use its bounded + # runtime as the scheduling cost so it starts before learned + # shorter tests and overlaps work on the second CTest worker. + COST 600 # verifyBundle.test.mjs runs generate.py in the source tree, which # republishes docs/api through a docs/.api.staging-* directory. RESOURCE_LOCK "${SPARK_SITE_DATA_TREE_LOCK}" diff --git a/Tests/PackageSmoke/RunFPSInputDispatch.py b/Tests/PackageSmoke/RunFPSInputDispatch.py new file mode 100644 index 000000000..13412c748 --- /dev/null +++ b/Tests/PackageSmoke/RunFPSInputDispatch.py @@ -0,0 +1,598 @@ +"""Owned-window dispatch. Import never launches a process.""" +import argparse +from collections import deque +import ctypes +import hashlib +import importlib.util +import json +import math +import os +from pathlib import Path +import queue +import re +import stat +import subprocess +import sys +import threading +import time + +TITLE = 'Spark Engine - Spark Arena - Engine Showcase' +CLASS = 'SparkEngineWindowClass' +KEYS = {1: 0x71, 2: 0x72, 4: 0x74, 8: 0x78} +SCOUT, VANGUARD = '0', '4' # SparkSDK/Include/Spark/GameTypes.h:224-231. +TRACE_FIELDS = 'v phase input update mask pressed released paused action result reason operation faults profile transfer saves'.split() +WRAPPER = """import subprocess,sys +if sys.stdin.buffer.readline()!=b'GO\\n': sys.exit(125) +# Windows GUI children require explicit inherited capture handles. +p=subprocess.Popen(sys.argv[1:],stdin=subprocess.DEVNULL, + stdout=sys.stdout.buffer,stderr=sys.stderr.buffer) +print('SPARK_INPUT_CHILD '+str(p.pid),flush=True) +sys.exit(p.wait()) +""" + + +def require(value, message): + if not value: + raise ValueError(message) + + +def digest(path): + with Path(path).open('rb') as stream: + return hashlib.file_digest(stream, 'sha256').hexdigest() + + +def plain(path): + path = Path(path) + require(path.is_absolute() and '..' not in path.parts and str(path).isascii(), 'absolute plain ASCII path') + for item in (path, *path.parents): + info = item.lstat() + require(not stat.S_ISLNK(info.st_mode) and not getattr(info, 'st_file_attributes', 0) & 0x400, + 'link/reparse path') + return path.resolve(strict=True) + + +def copy_primary(slot, destination): + slot = plain(slot) + before = slot.stat() + require(stat.S_ISREG(before.st_mode) and 0 < before.st_size <= 16*1024*1024, 'save copy size/type') + before_hash = digest(slot) + with slot.open('rb') as source, destination.open('xb') as target: + remaining = before.st_size + while remaining: + block = source.read(min(65536, remaining)) + require(block, 'save shortened during copy') + target.write(block) + remaining -= len(block) + require(not source.read(1), 'save grew during copy') + after = slot.stat() + require((before.st_size, before.st_mtime_ns, before.st_ctime_ns) == + (after.st_size, after.st_mtime_ns, after.st_ctime_ns), 'save changed during copy') + require(digest(slot) == digest(destination) == before_hash, 'save copy hash') + return before_hash + + +def restored_frame(frame, saved, load_update): + live = frame['profile'] + require(live.keys() == saved.keys(), 'restored profile schema') + for key in saved: + if key != 'fps.profile.playTime': + require(live[key] == saved[key], 'restored profile changed after dispatch: '+key) + elapsed = float(live['fps.profile.playTime']) - float(saved['fps.profile.playTime']) + updates = frame['update'] - load_update + 1 + # Pinned default timeScale=1, nonnegative dt clamped to0.25 by Game::Update. + require(updates > 0 and math.isfinite(elapsed) and 0 <= elapsed <= updates * .25 + .00001, + 'restored playTime advanced outside completed-frame bound') + + +def profile(hex_text): + require(re.fullmatch('[0-9a-f]+', hex_text) and len(hex_text) <= 8192, 'profile encoding') + data = bytes.fromhex(hex_text).decode('ascii') + rows = data.splitlines() + pairs = [row.split('=', 1) for row in rows] + require(all(len(p) == 2 and p[0].startswith('fps.profile.') for p in pairs), 'profile fields') + result = dict(pairs) + require(len(result) == len(pairs) and rows == sorted(rows), 'duplicate/unsorted profile') + require(all(math.isfinite(float(v)) for v in result.values()), 'nonfinite profile') + require('fps.profile.class' in result and 'fps.profile.playTime' in result, 'missing profile') + return result + + +def parse_trace(line): + require(line.startswith('SPARK_FPS_INPUT '), 'trace prefix') + parts = [p.split('=', 1) for p in line.rstrip('\n').split(' ')[1:]] + require(all(len(p) == 2 for p in parts), 'trace syntax') + record = dict(parts) + require([p[0] for p in parts] == TRACE_FIELDS, 'trace schema/order') + for key in TRACE_FIELDS: + if key not in ('phase', 'profile', 'transfer', 'saves'): + require(re.fullmatch('-?[0-9]+', record[key]), 'trace integer') + record[key] = int(record[key]) + require(record['v'] == 1 and record['paused'] == 0, 'version or paused') + require(record['faults'] == 0, 'guarded subsystem fault') + require(record['phase'] in ('before', 'operation', 'dispatch', 'complete'), 'phase') + for key in ('mask', 'pressed', 'released'): + require(0 <= record[key] <= 15, 'key mask') + require(record['action'] in range(4) and record['result'] in (-1, 0, 1), 'operation status') + record['profile'] = profile(record['profile']) + record['transfer'] = None if record['transfer'] == '-' else profile(record['transfer']) + require(record['saves'] == '-' or re.fullmatch('[0-9a-f]+', record['saves']), 'save directory encoding') + record['saves'] = None if record['saves'] == '-' else bytes.fromhex(record['saves']).decode('utf-8') + return record + + +class Replay: + def __init__(self, saves, missing_only=False): + self.saves = Path(saves).resolve() + self.pending = None + self.last_input = self.last_update = self.operation = 0 + self.records = self.byte_count = 0 + self.operations = [] + self.frames = [] + self.ended = False + self.missing_only = missing_only + self.saves_bound = False + + def feed(self, line): + if line.startswith('SPARK_FPS_INPUT_END '): + match = re.fullmatch(r'SPARK_FPS_INPUT_END v=1 records=(\d+) bytes=(\d+) failed=0\n?', line) + require(match and not self.ended and self.pending is None, 'incomplete terminal') + require((int(match[1]), int(match[2])) == (self.records, self.byte_count), 'terminal counts') + self.ended = True + return None + if 'SPARK_FPS_INPUT' not in line: + return None + require(not self.ended, 'trace after terminal') + record = parse_trace(line) + self.records += 1 + self.byte_count += len(line.encode('utf-8')) + require(self.records <= 256 and self.byte_count <= 98304, 'trace overflow') + if record['saves'] is not None: + require(Path(record['saves']).resolve() == self.saves, 'wrong save directory') + self.saves_bound = True + require(self.saves_bound, 'missing initial save directory binding') + require(record['phase'] != 'operation' or record['saves'] is not None, 'operation missing save binding') + phase = record['phase'] + if phase == 'before': + require(self.pending is None and record['input'] > self.last_input and + record['update'] > self.last_update, 'stale/incomplete frame') + require(record['action'] == 0 and record['result'] == -1 and + record['operation'] == self.operation and record['transfer'] is None and + record['reason'] == 0, 'dirty frame start') + self.pending = {'before': record} + else: + require(self.pending is not None, 'phase without before') + first = self.pending['before'] + for key in ('input', 'update', 'mask', 'pressed', 'released'): + require(record[key] == first[key], 'cross-frame record') + require(phase not in self.pending, 'duplicate phase') + if phase == 'operation': + require('dispatch' not in self.pending, 'late operation') + expected = 1 if first['pressed'] & 3 == 1 else 2 if first['pressed'] & 3 == 2 else 3 + require(record['action'] == expected and expected != 3, 'unexpected/conflicting operation') + require(record['operation'] == self.operation + 1, 'operation serial') + if self.missing_only: + require(expected == 2 and record['result'] == 0 and record['reason'] == 1 and + record['transfer'] is None and record['profile'] == first['profile'], + 'missing-slot did not reject unchanged at actual dispatch') + else: + require(record['result'] == 1 and record['reason'] == 0 and + record['transfer'] is not None, 'failed/unbound operation') + self.operation += 1 + self.operations.append(dict(record, beforeProfile=first['profile'])) + elif phase == 'dispatch': + op = self.pending.get('operation') + require(record['operation'] == self.operation, 'dispatch serial') + require(record['action'] == (op['action'] if op else 0), 'missing operation evidence') + require(record['result'] == (op['result'] if op else -1) and + record['reason'] == (op['reason'] if op else 0) and + record['transfer'] == (op['transfer'] if op else None), 'dispatch result/transfer') + require((first['pressed'] & 3 == 0) == (op is None), 'unobserved persistence edge') + elif phase == 'complete': + require('dispatch' in self.pending, 'missing successful dispatch boundary') + prior = self.pending['dispatch'] + for key in ('action', 'result', 'reason', 'operation', 'transfer'): + require(record[key] == prior[key], 'completion changed operation') + self.frames.append(record) + self.last_input, self.last_update = record['input'], record['update'] + self.pending = None + return record + self.pending[phase] = record + return None + + +class OwnedWindow: + """No global input APIs. Every send revalidates the held process and exact HWND.""" + def __init__(self, pid, executable): + from ctypes import wintypes as w + self.w = w + self.u = ctypes.WinDLL('user32', use_last_error=True) + self.k = ctypes.WinDLL('kernel32', use_last_error=True) + self.k.OpenProcess.argtypes = [w.DWORD, w.BOOL, w.DWORD] + self.k.OpenProcess.restype = w.HANDLE + self.k.QueryFullProcessImageNameW.argtypes = [w.HANDLE, w.DWORD, w.LPWSTR, ctypes.POINTER(w.DWORD)] + self.k.GetProcessTimes.argtypes = [w.HANDLE] + [ctypes.POINTER(w.FILETIME)] * 4 + self.k.GetExitCodeProcess.argtypes = [w.HANDLE, ctypes.POINTER(w.DWORD)] + self.k.CloseHandle.argtypes = [w.HANDLE] + self.u.GetWindowThreadProcessId.argtypes = [w.HWND, ctypes.POINTER(w.DWORD)] + self.u.GetWindowTextW.argtypes = [w.HWND, w.LPWSTR, ctypes.c_int] + self.u.GetClassNameW.argtypes = [w.HWND, w.LPWSTR, ctypes.c_int] + self.u.IsWindow.argtypes = [w.HWND] + self.u.MapVirtualKeyW.argtypes = [w.UINT, w.UINT] + self.u.PostMessageW.argtypes = [w.HWND, w.UINT, w.WPARAM, w.LPARAM] + self.handle = self.k.OpenProcess(0x1000, False, pid) + require(self.handle, 'cannot bind child process') + self.pid, self.path, self.hwnd = pid, Path(executable).resolve(), None + self.start = self.identity() + self.callback_type = ctypes.WINFUNCTYPE(w.BOOL, w.HWND, w.LPARAM) + self.u.EnumWindows.argtypes = [self.callback_type, w.LPARAM] + + def identity(self): + w = self.w + code = w.DWORD() + require(self.k.GetExitCodeProcess(self.handle, ctypes.byref(code)) and code.value == 259, 'child exited') + path, size = ctypes.create_unicode_buffer(32768), w.DWORD(32768) + require(self.k.QueryFullProcessImageNameW(self.handle, 0, path, ctypes.byref(size)), 'child path query') + require(Path(path.value).resolve() == self.path, 'child image mismatch') + times = [w.FILETIME() for _ in range(4)] + require(self.k.GetProcessTimes(self.handle, *(ctypes.byref(t) for t in times)), 'child start query') + return (times[0].dwHighDateTime << 32) | times[0].dwLowDateTime + + def matches(self, hwnd): + pid = self.w.DWORD() + self.u.GetWindowThreadProcessId(hwnd, ctypes.byref(pid)) + if pid.value != self.pid: + return False + title, cls = ctypes.create_unicode_buffer(512), ctypes.create_unicode_buffer(256) + self.u.GetWindowTextW(hwnd, title, len(title)) + self.u.GetClassNameW(hwnd, cls, len(cls)) + return title.value == TITLE and cls.value == CLASS + + def validate(self): + require(self.identity() == self.start, 'process identity changed') + matches = [] + callback = self.callback_type(lambda hwnd, _: (matches.append(hwnd) if self.matches(hwnd) else None) or True) + require(self.u.EnumWindows(callback, 0), 'window enumeration failed') + require(len(matches) == 1, 'ambiguous/missing owned window') + if self.hwnd is None: + self.hwnd = matches[0] + require(matches[0] == self.hwnd and self.u.IsWindow(self.hwnd), 'owned HWND changed') + + def send(self, bit, down): + self.validate() + vk = KEYS[bit] + scan = self.u.MapVirtualKeyW(vk, 0) + require(scan != 0, 'missing key scan code') + flags = 1 | (scan << 16) | (0 if down else (3 << 30)) + require(self.u.PostMessageW(self.hwnd, 0x100 if down else 0x101, vk, flags), 'key message rejected') + + def close_window(self): + self.validate() + require(self.u.PostMessageW(self.hwnd, 0x10, 0, 0), 'WM_CLOSE rejected') + + def close_handle(self): + if self.handle: + self.k.CloseHandle(self.handle) + self.handle = None + + +def load_module(name, path): + spec = importlib.util.spec_from_file_location(name, path) + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + spec.loader.exec_module(module) + return module + + +class Child: + def __init__(self, command, cwd, environment, source, deadline): + require(time.monotonic() < deadline, 'owner deadline before child launch') + self.deadline, self.lines, self.queue = deadline, [], queue.Queue() + self.job = load_module('_fps_owned_job', source / '.github/scripts/qualify-installed-native.py').job_for(source) + self.process = None + assigned = False + try: + self.process = subprocess.Popen([sys.executable, '-c', WRAPPER, *map(str, command)], cwd=cwd, + env=environment, stdin=subprocess.PIPE, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, creationflags=subprocess.CREATE_NO_WINDOW) + assigned = self.job.assign(self.process) + require(assigned, 'job assignment failed; no work released') + self.process.stdin.write(b'GO\n') + self.process.stdin.flush() + self.process.stdin.close() + except BaseException: + self.job.close() + if self.process is not None: + if not assigned: + self.process.kill() # Unassigned wrapper has not received GO. + self.process.wait(timeout=max(.01, min(5, deadline+5-time.monotonic()))) + raise + self.reader = threading.Thread(target=self._read, daemon=True) + self.reader.start() + + def _read(self): + size = 0 + try: + while raw := self.process.stdout.readline(16385): + size += len(raw) + if len(raw) > 16384 or size > 131072 or b'\0' in raw: + raise ValueError('stdout overflow/binary') + line = raw.decode('utf-8').replace('\r\n', '\n') + self.lines.append(line) + self.queue.put(line) + except BaseException as error: + self.queue.put(error) + finally: + self.queue.put(None) + + def next(self): + remaining = self.deadline - time.monotonic() + if remaining <= 0: + raise TimeoutError('owner deadline') + item = self.queue.get(timeout=remaining) + if isinstance(item, BaseException): + raise item + return item + + def close(self): + cleanup_deadline = min(self.deadline + 5, time.monotonic() + 5) + self.job.close() + try: + self.process.wait(timeout=max(0.01, cleanup_deadline - time.monotonic())) + finally: + self.reader.join(timeout=max(0, cleanup_deadline - time.monotonic())) + require(not self.reader.is_alive(), 'capture reader did not finish within owned cleanup') + + +def run_missing_case(command, host, source, parent_env, root, deadline): + root.mkdir(exist_ok=False) + env = parent_env.copy() + for variable, directory in [('LOCALAPPDATA','local'), ('APPDATA','roaming'), ('TEMP','temp'), ('TMP','temp')]: + path = root/directory + path.mkdir(exist_ok=True) + env[variable] = str(path) + saves = root/'local/SparkEngine/Saves' + require(not saves.exists(), 'negative profile root not fresh') + replay = Replay(saves, missing_only=True) + child = Child(command, host.parent, env, source, deadline) + window, held = None, False + deferred, pending = [], deque() + report = {'case':'missing-slot', 'passed':False} + try: + def frame(): + nonlocal window + while True: + line = pending.popleft() if pending else child.next() + require(line is not None, 'negative child ended early') + if line.startswith('SPARK_INPUT_CHILD '): + require(window is None and re.fullmatch(r'SPARK_INPUT_CHILD [0-9]+\n',line), 'negative PID receipt') + window = OwnedWindow(int(line.split()[1]), host) + pending.extend(deferred) + deferred.clear() + continue + if window is None: + deferred.append(line) + continue + result = replay.feed(line) + if result is not None: + window.validate() + return result + initial = frame() + require(initial['mask'] == initial['pressed'] == replay.operation == 0, 'negative initial keys') + require(not list(saves.glob('fps_quicksave*')), 'negative inherited save') + window.send(2, True) + held = True + while True: + current = frame() + if current['input'] > initial['input'] and current['mask'] == 2: + require(current['pressed'] == 2 and current['action'] == 2 and current['result'] == 0 and + current['reason'] == 1 and replay.operation == 1, 'negative consumed F3 receipt') + break + operation = replay.operations[0] + require(not list(saves.glob('fps_quicksave*')), 'negative created save') + window.send(2, False) + held = False + anchor = current['input'] + while True: + current = frame() + if current['input'] > anchor and current['mask'] == 0: + require(current['released'] == 2, 'negative missing release') + break + window.close_window() + while (line := child.next()) is not None: + replay.feed(line) + require(child.process.wait(timeout=max(.1, deadline-time.monotonic())) == 0, 'negative engine exit') + require(replay.ended and replay.operation == 1, 'negative terminal/extra operation') + require(not list(saves.glob('fps_quicksave*')), 'negative save appeared') + check_lifecycle(child.lines) + report.update(passed=True, pid=window.pid, processStart=window.start, hwnd=window.hwnd, + operation=operation, initialProfile=replay.frames[0]['profile']) + finally: + if window: + if held: + try: + window.send(2,False) + except Exception: + pass + window.close_handle() + try: + child.close() + finally: + (root/'game.log').write_text(''.join(child.lines),encoding='utf-8') + (root/'receipt.json').write_text(json.dumps(report,indent=2),encoding='utf-8') + return report + + +def check_lifecycle(lines): + devices = [s.strip() for s in lines if 'SPARK_D3D11_DEVICE' in s] + require(devices == ['SPARK_D3D11_DEVICE driver=warp certification=software-only'], 'WARP identity') + lifecycle = [s.strip() for s in lines if 'SPARK_MODULE_LIFECYCLE' in s] + require(len(lifecycle) == 1, 'lifecycle count') + match = re.fullmatch(r'SPARK_MODULE_LIFECYCLE module=SparkGameFPS create=(\d+) load=(\d+) update=(\d+) fixed=(\d+) render=(\d+) unload=(\d+) destroy=(\d+) faults=0', lifecycle[0]) + require(match and all(int(x) > 0 for x in match.groups()), 'lifecycle incomplete/faulted') + require(all(int(match[i]) == 1 for i in (1,2,6,7)), 'duplicate lifecycle create/load/unload/destroy') + + +def run(args): + require(os.name == 'nt', 'Windows required') + start = time.monotonic() + deadline = start + 85 # Final five seconds reserved for owned cleanup within90s. + source, host, module, decoder = [plain(p) for p in + (args.source, args.host, args.module, args.decoder)] + require(subprocess.check_output(['git', '-C', str(source), 'rev-parse', 'HEAD'], text=True, timeout=5).strip() == args.source_sha, + 'source pin mismatch') + require(not subprocess.check_output(['git', '-C', str(source), 'status', '--porcelain'], timeout=5), 'dirty source') + require(host.name == 'SparkEngine.exe' and module.name == 'SparkGameFPS.dll' and module.parent == host.parent, + 'installed actual FPS paths') + helper_path = plain(args.decoder_helper) + require(digest(helper_path) == args.decoder_helper_sha256, 'decoder helper pin mismatch') + root = Path(args.out) + require(root.is_absolute() and '..' not in root.parts and str(root).isascii(), 'plain output root') + plain(root.parent) + root.mkdir(parents=True, exist_ok=False) + require(not (host.parent / 'Saves').exists(), 'inherited cwd Saves migration source') + env = os.environ.copy() + for variable, name in [('LOCALAPPDATA', 'local'), ('APPDATA', 'roaming'), ('TEMP', 'temp'), ('TMP', 'temp')]: + path = root / name + path.mkdir(exist_ok=True) + env[variable] = str(path) + env.update(SPARK_FPS_INPUT_TRACE='1', SPARK_RHI_BACKEND='d3d11', SPARK_D3D11_DRIVER='warp') + saves = root / 'local/SparkEngine/Saves' + replay = Replay(saves) + identities = {str(p): digest(p) for p in (host, module, decoder)} + command = [host, '-game', module, '-require-game', '-test-seconds', '30', '-threads', '2', + '-window-size', '640x360', '-no-subprocess'] + negative = run_missing_case(command, host, source, env, root/'missing-slot', deadline) + child = Child(command, host.parent, env, source, deadline) + window, held, sends = None, set(), [] + receipt = {'source': args.source_sha, 'identities': identities, 'scope': 'owned-window-local-profile', + 'fullShippingQualification': False, 'missingSlot': negative, 'passed': False} + try: + deferred, pending_lines = [], deque() + def next_frame(): + nonlocal window + while True: + line = pending_lines.popleft() if pending_lines else child.next() + require(line is not None, 'child ended before acceptance') + if line.startswith('SPARK_INPUT_CHILD '): + require(window is None and re.fullmatch(r'SPARK_INPUT_CHILD [0-9]+\n', line), 'child identity record') + window = OwnedWindow(int(line.split()[1]), host) + pending_lines.extend(deferred) + deferred.clear() + continue + if window is None: + deferred.append(line) + continue + frame = replay.feed(line) + if frame is not None: + require(window is not None, 'missing process owner') + window.validate() + return frame + + current = next_frame() + require(current['mask'] == 0 and current['pressed'] == 0 and replay.operation == 0, 'initial input not released') + + def transition(bit, down): + nonlocal current + anchor = current['input'] + window.send(bit, down) + held.add(bit) if down else held.discard(bit) + sends.append({'inputAfter': anchor, 'bit': bit, 'down': down, 'pid': window.pid, 'hwnd': window.hwnd}) + mask = sum(held) + while True: + current = next_frame() + if current['input'] > anchor and current['mask'] == mask: + require(current['pressed' if down else 'released'] & bit, 'missing accepted edge') + return current + + scout = transition(4, True)['profile'] + require(scout['fps.profile.class'] == SCOUT, 'F5 did not select source-defined Scout') + transition(4, False) + saved_frame = transition(1, True) + require(saved_frame['action'] == 1 and saved_frame['result'] == 1, 'save dispatch failed') + saved = saved_frame['transfer'] + require(saved['fps.profile.class'] == scout['fps.profile.class'], 'saved wrong class') + for _ in range(2): + previous = current + current = next_frame() + require(current['input'] == previous['input'] + 1 and + current['update'] == previous['update'] + 1, 'nonconsecutive held save frames') + require(current['mask'] == 1 and current['action'] == 0 and replay.operation == 1, 'held save repeated') + slot = plain(saves / 'fps_quicksave.spark_save') + require(slot.is_file() and not slot.with_suffix(slot.suffix + '.bak').exists(), 'missing/fallback save') + copied = root / 'saved-primary.spark_save' + slot_hash = copy_primary(slot, copied) + transition(1, False) + mutated = transition(8, True)['profile'] + require(mutated['fps.profile.class'] == VANGUARD and mutated['fps.profile.class'] != saved['fps.profile.class'], + 'F9 did not select source-defined Vanguard') + transition(8, False) + for load_number in (2, 3): + loaded = transition(2, True) + require(loaded['action'] == 2 and loaded['result'] == 1 and replay.operation == load_number, 'load dispatch') + op = replay.operations[-1] + require(op['transfer'] == saved and op['profile'] == saved, 'immediate load profile mismatch') + restored_frame(loaded, saved, loaded['update']) + for _ in range(2): + previous = current + current = next_frame() + require(current['input'] == previous['input'] + 1 and + current['update'] == previous['update'] + 1, 'nonconsecutive held load frames') + require(current['mask'] == 2 and current['action'] == 0 and replay.operation == load_number, 'held load repeated') + restored_frame(current, saved, loaded['update']) + restored_frame(transition(2, False), saved, loaded['update']) + window.close_window() + while (line := child.next()) is not None: + replay.feed(line) + require(child.process.wait(timeout=max(0.1, deadline-time.monotonic())) == 0, 'engine exit') + require(replay.ended and [r['action'] for r in replay.operations] == [1, 2, 2], 'terminal/actions') + check_lifecycle(child.lines) + require(digest(slot) == digest(copied) == slot_hash, 'load rewrote save') + receipt.update(pid=window.pid, processStart=window.start, hwnd=window.hwnd, sends=sends, + savedProfile=saved, slotSha256=slot_hash) + finally: + if window: + for bit in tuple(held): + try: + window.send(bit, False) + except Exception: + pass # Never redirect cleanup to another window. + window.close_handle() + try: + child.close() + finally: + (root / 'game.log').write_text(''.join(child.lines), encoding='utf-8') + (root / 'receipt.json').write_text(json.dumps(receipt, indent=2), encoding='utf-8') + + def run_child(command, cwd, environment, timeout): + isolated = env.copy() + isolated.pop('SPARK_FPS_INPUT_TRACE', None) + isolated.update(environment) + isolated.pop('SPARK_FPS_INPUT_TRACE', None) + for key in ('LOCALAPPDATA', 'APPDATA', 'TEMP', 'TMP'): + isolated[key] = env[key] + process = Child(command, cwd, isolated, source, min(deadline, time.monotonic() + timeout)) + try: + while process.next() is not None: + pass + code = process.process.wait(timeout=max(.1, deadline-time.monotonic())) + return subprocess.CompletedProcess(command, code, ''.join(process.lines), '') + finally: + process.close() + + helper = load_module('_fps_save_decoder', helper_path) + decode_work, decoded = helper.decode_owned_primary(input_path=copied, owned_root=root, + tests_executable=decoder, deadline=deadline, run_child=run_child) + require(decoded['canonicalProfile'] == saved, 'decoded saved content differs') + require(all(digest(Path(p)) == h for p, h in identities.items()), 'image identity changed') + require(time.monotonic() <= deadline, 'owner deadline exceeded during final identity checks') + receipt.update(passed=True, decoded=decoded, decoderWork=str(decode_work), + decoderHelperSha256=args.decoder_helper_sha256, elapsedSeconds=time.monotonic()-start) + (root / 'receipt.json').write_text(json.dumps(receipt, indent=2), encoding='utf-8') + return receipt + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + for name in ('source', 'source-sha', 'host', 'module', 'decoder', 'decoder-helper', 'decoder-helper-sha256', 'out'): + parser.add_argument('--' + name, required=True) + print(json.dumps(run(parser.parse_args()), indent=2)) diff --git a/Tests/PackageSmoke/RunInstalledSDKTemplate.cmake b/Tests/PackageSmoke/RunInstalledSDKTemplate.cmake index a56721347..14233af0e 100644 --- a/Tests/PackageSmoke/RunInstalledSDKTemplate.cmake +++ b/Tests/PackageSmoke/RunInstalledSDKTemplate.cmake @@ -51,6 +51,39 @@ cmake_minimum_required(VERSION 3.25) include("${CMAKE_CURRENT_LIST_DIR}/../../cmake/SparkPackageConsumerBoundary.cmake") +# Optional SDK10 weather call coverage uses this same installed consumer/image. +# Windows headless has no weather subsystem; its null observation is separate +# from the positive real-service windowed WARP run. No wrong-thread call is made. +function(_spark_sdk_template_weather_result stdout stderr expected_available out_error) + set(_text "${stdout}\n${stderr}") + string(REPLACE "\r\n" "\n" _text "${_text}") + string(REPLACE "\r" "\n" _text "${_text}") + string(REPLACE ";" "\\;" _text "${_text}") + string(REPLACE "\n" ";" _lines "${_text}") + set(_records) + foreach(_line IN LISTS _lines) + if(_line MATCHES "SPARK_SDK_WEATHER") + list(APPEND _records "${_line}") + endif() + endforeach() + list(LENGTH _records _count) + set(_error "") + set(_expected "SPARK_SDK_WEATHER module=SparkGeneratedGame available=${expected_available} accepted=${expected_available} invalid_rejected=${expected_available} clear_accepted=${expected_available} callback=OnLoad") + if(NOT _count EQUAL 1) + set(_error "expected exactly one weather consumer record") + else() + list(GET _records 0 _record) + if(NOT _record STREQUAL _expected) + set(_error "weather consumer state/result does not match expected host capability") + endif() + endif() + set(${out_error} "${_error}" PARENT_SCOPE) +endfunction() + +if(SPARK_SDK_WEATHER_PARSER_ONLY) + return() +endif() + set(_spark_sdk_template_keys format struct_size magic sdk_version runtime_abi_version compiler_family compiler_abi_version cxx_language_level runtime_library iterator_debug_level pointer_size binary_sha256) @@ -451,6 +484,9 @@ if(NOT _sdk_line_count EQUAL 1 OR NOT _sdk_lines MATCHES "SPARK_SDK_VERSION[ \t] message(FATAL_ERROR "${_version_header} must define SPARK_SDK_VERSION exactly once as a decimal integer") endif() set(_sdk_version "${CMAKE_MATCH_1}") +if(SPARK_SDK_WEATHER_CONSUMER AND (NOT CMAKE_HOST_WIN32 OR NOT _sdk_version STREQUAL "10")) + message(FATAL_ERROR "Optional weather consumer requires native Windows and installed SDK10") +endif() # Generate the game with the installed CLI. It must locate the prefix from its # own install location (SPARK_ENGINE_DIR is unset) and write outside the prefix. @@ -480,6 +516,51 @@ if(NOT _printed_package_dir STREQUAL _package_dir_real) message(FATAL_ERROR "spark-cli new printed SparkEngine_DIR=${CMAKE_MATCH_1}, expected ${_package_dir_real}") endif() +if(SPARK_SDK_WEATHER_CONSUMER) + foreach(_pin IN ITEMS SPARK_WEATHER_SOURCE_SHA SPARK_WEATHER_WORKFLOW_SHA) + string(LENGTH "${${_pin}}" _length) + if(NOT _length EQUAL 40 OR NOT "${${_pin}}" MATCHES "^[0-9a-f]+$") + message(FATAL_ERROR "Weather mode requires exact source/workflow provenance: ${_pin}") + endif() + endforeach() + foreach(_pin IN ITEMS SPARK_WEATHER_RUN_ID SPARK_WEATHER_RUN_ATTEMPT) + if(NOT "${${_pin}}" MATCHES "^[1-9][0-9]*$") + message(FATAL_ERROR "Weather mode requires run provenance: ${_pin}") + endif() + endforeach() +endif() + +if(SPARK_SDK_WEATHER_CONSUMER) + set(_consumer_header "${_source}/Source/GameModule.h") + file(READ "${_consumer_header}" _consumer_text) + string(REGEX MATCHALL "m_context = context" _anchors "${_consumer_text}") + string(FIND "${_consumer_text}" "m_context = context;" _anchor_position) + list(LENGTH _anchors _anchor_count) + if(NOT _anchor_count EQUAL 1 OR _anchor_position LESS 0) + message(FATAL_ERROR "Installed template OnLoad hook changed; refuse ambiguous weather probe injection") + endif() + set(_weather_probe [=[m_context = context; + // Installed-consumer test only: all weather calls use public SDK types. + auto* weather = context ? context->GetWeatherService() : nullptr; + bool accepted = false; + bool invalidRejected = false; + bool clearAccepted = false; + if (weather) + { + accepted = weather->SetWeather(Spark::WeatherPreset::Rain, 0.25f, 0.5f); + invalidRejected = !weather->SetWeather(static_cast(99), 1.0f, 0.5f); + clearAccepted = weather->SetWeather(Spark::WeatherPreset::Clear, -1.0f, 0.01f); + } + std::printf("SPARK_SDK_WEATHER module=SparkGeneratedGame available=%d accepted=%d invalid_rejected=%d clear_accepted=%d callback=OnLoad\n", + weather ? 1 : 0, accepted ? 1 : 0, invalidRejected ? 1 : 0, clearAccepted ? 1 : 0); + std::fflush(stdout); + if (weather && (!accepted || !invalidRejected || !clearAccepted)) + return false;]=]) + string(REPLACE "m_context = context;" "${_weather_probe}" _consumer_text "${_consumer_text}") + file(WRITE "${_consumer_header}" "#include \n#include \n${_consumer_text}") + file(SHA256 "${_consumer_header}" _weather_consumer_sha256) +endif() + set(_configure "${CMAKE_COMMAND}" -S "${_source}" -B "${_build}" -G "${SPARK_CONSUMER_GENERATOR}" @@ -571,6 +652,10 @@ endif() if(NOT EXISTS "${_engine}") message(FATAL_ERROR "Installed SDK runtime host is missing: ${_engine}") endif() +if(SPARK_SDK_WEATHER_CONSUMER) + file(SHA256 "${_engine}" _weather_host_before) + file(SHA256 "${_sidecar}" _weather_sidecar_before) +endif() set(_user_root "${SPARK_TEST_ROOT}/runtime-user") set(_runtime_env "SPARK_RHI_BACKEND=null") if(CMAKE_HOST_WIN32) @@ -611,5 +696,72 @@ if(NOT _runtime_image_sha256 STREQUAL _image_sha256) endif() message(STATUS "SPARK_SDK_TEMPLATE_RUNTIME module=${_module_name} sha256=${_image_sha256} lifecycle=passed") +if(SPARK_SDK_WEATHER_CONSUMER) + _spark_sdk_template_weather_result("${_runtime_stdout}" "${_runtime_stderr}" 0 _weather_error) + if(NOT _weather_error STREQUAL "") + message(FATAL_ERROR "Headless weather unavailability observation failed: ${_weather_error}") + endif() + # The real windowed host registers WeatherSystem before module OnLoad. + # Preserve both original headless streams; WARP evidence has distinct files. + set(_weather_user "${SPARK_TEST_ROOT}/weather-user") + file(MAKE_DIRECTORY "${_weather_user}/local" "${_weather_user}/roaming") + set(SPARK_LIFECYCLE_PARSER_INCLUDE_ONLY ON) + include("${SPARK_SOURCE_ROOT}/cmake/RunSparkModuleProfileLifecycle.cmake") + unset(SPARK_LIFECYCLE_PARSER_INCLUDE_ONLY) + execute_process( + COMMAND "${CMAKE_COMMAND}" -E env --unset=SPARK_ENGINE_DIR + "SPARK_RHI_BACKEND=d3d11" "SPARK_D3D11_DRIVER=warp" + "LOCALAPPDATA=${_weather_user}/local" "APPDATA=${_weather_user}/roaming" + "${_engine}" -game "${_images}" -require-game -test-frames 30 + -threads 2 -no-subprocess -window-size 640x360 + WORKING_DIRECTORY "${_source}" + RESULT_VARIABLE _weather_result OUTPUT_VARIABLE _weather_stdout ERROR_VARIABLE _weather_stderr + TIMEOUT 120 ENCODING UTF-8) + file(WRITE "${SPARK_TEST_ROOT}/runtime-weather-stdout.log" "${_weather_stdout}") + file(WRITE "${SPARK_TEST_ROOT}/runtime-weather-stderr.log" "${_weather_stderr}") + _spark_validate_lifecycle_result("${_weather_result}" "${_weather_stdout}" "${_weather_stderr}" + _weather_ok _weather_reason "${_module_name}") + _spark_sdk_template_weather_result("${_weather_stdout}" "${_weather_stderr}" 1 _weather_error) + if(NOT _weather_ok OR NOT _weather_error STREQUAL "") + message(FATAL_ERROR "Installed public weather call failed: ${_weather_reason}; ${_weather_error}") + endif() + file(SHA256 "${_engine}" _weather_host_after) + file(SHA256 "${_images}" _weather_module_after) + file(SHA256 "${_sidecar}" _weather_sidecar_after) + if(NOT _weather_host_before STREQUAL _weather_host_after OR NOT _image_sha256 STREQUAL _weather_module_after OR + NOT _weather_sidecar_before STREQUAL _weather_sidecar_after) + message(FATAL_ERROR "Installed weather host/module changed during qualification") + endif() + # Complete identity proof is independent of the diagnostic sdk.log tail. + set(_weather_receipt "{}") + foreach(_pair IN ITEMS + "module|${_module_name}" "source_sha|${SPARK_WEATHER_SOURCE_SHA}" + "workflow_sha|${SPARK_WEATHER_WORKFLOW_SHA}" "run_id|${SPARK_WEATHER_RUN_ID}" + "run_attempt|${SPARK_WEATHER_RUN_ATTEMPT}" "consumer_sha256|${_weather_consumer_sha256}" + "host_sha256|${_weather_host_after}" "module_sha256|${_image_sha256}" + "sidecar_sha256|${_weather_sidecar_after}" "headless|unavailable" + "windowed|accepted" "lifecycle|passed") + string(REPLACE "|" ";" _parts "${_pair}") + list(GET _parts 0 _key) + list(GET _parts 1 _value) + string(JSON _weather_receipt SET "${_weather_receipt}" "${_key}" "\"${_value}\"") + endforeach() + string(JSON _weather_receipt SET "${_weather_receipt}" sdk_version 10) + string(JSON _weather_receipt SET "${_weather_receipt}" boundary_scanned ${_scanned}) + string(JSON _weather_receipt SET "${_weather_receipt}" boundary_violations 0) + string(JSON _weather_receipt SET "${_weather_receipt}" streams "{}") + foreach(_stream IN ITEMS runtime-stdout.log runtime-stderr.log runtime-weather-stdout.log runtime-weather-stderr.log) + file(SIZE "${SPARK_TEST_ROOT}/${_stream}" _bytes) + if(_bytes GREATER 131072) + message(FATAL_ERROR "Weather runtime proof exceeds 128KiB: ${_stream}") + endif() + file(SHA256 "${SPARK_TEST_ROOT}/${_stream}" _sha) + string(JSON _weather_receipt SET "${_weather_receipt}" streams "${_stream}" "\"${_sha}\"") + endforeach() + file(WRITE "${SPARK_TEST_ROOT}/weather-identity.json" "${_weather_receipt}\n") + message(STATUS "SPARK_SDK_WEATHER_RUNTIME module=${_module_name} sdk_version=${_sdk_version} consumer_sha256=${_weather_consumer_sha256} host_sha256=${_weather_host_after} module_sha256=${_image_sha256} sidecar_sha256=${_weather_sidecar_after} headless=unavailable windowed=accepted lifecycle=passed") +endif() + + message(STATUS "SPARK_SDK_TEMPLATE module=${_module_name} sdk_version=${_sdk_version} scanned=${_scanned} violations=0") diff --git a/Tests/PackageSmoke/TestSparkSDKComponentCompleteness.cmake b/Tests/PackageSmoke/TestSparkSDKComponentCompleteness.cmake index e4ff79a83..ecf1283fe 100644 --- a/Tests/PackageSmoke/TestSparkSDKComponentCompleteness.cmake +++ b/Tests/PackageSmoke/TestSparkSDKComponentCompleteness.cmake @@ -1,6 +1,6 @@ -# The SDK install component must be self-contained for a consumer that selects -# only the public SDK: headers, exported targets, compatibility helpers, legal -# notices, documentation, and one buildable example must travel together. +# Install the SDK's declared runtime dependency before checking its public +# package: headers, exported targets, compatibility helpers, legal notices, +# documentation, and one buildable example must travel together. foreach(_required IN ITEMS SPARK_ENGINE_BUILD_DIR SPARK_CONFIG SPARK_TEST_ROOT) if(NOT DEFINED ${_required} OR "${${_required}}" STREQUAL "") message(FATAL_ERROR "${_required} is required for the SDK component completeness test") @@ -9,20 +9,22 @@ endforeach() file(REMOVE_RECURSE "${SPARK_TEST_ROOT}") set(_prefix "${SPARK_TEST_ROOT}/prefix") -set(_install_command - "${CMAKE_COMMAND}" --install "${SPARK_ENGINE_BUILD_DIR}" - --config "${SPARK_CONFIG}" --prefix "${_prefix}" --component sdk) -execute_process( - COMMAND ${_install_command} - RESULT_VARIABLE _install_result - OUTPUT_VARIABLE _install_output - ERROR_VARIABLE _install_error - TIMEOUT 600) -if(NOT "${_install_result}" STREQUAL "0") - message(FATAL_ERROR - "Installing the SDK component failed (${_install_result}):\n" - "${_install_output}\n${_install_error}") -endif() +foreach(_component IN ITEMS runtime sdk) + set(_install_command + "${CMAKE_COMMAND}" --install "${SPARK_ENGINE_BUILD_DIR}" + --config "${SPARK_CONFIG}" --prefix "${_prefix}" --component "${_component}") + execute_process( + COMMAND ${_install_command} + RESULT_VARIABLE _install_result + OUTPUT_VARIABLE _install_output + ERROR_VARIABLE _install_error + TIMEOUT 600) + if(NOT "${_install_result}" STREQUAL "0") + message(FATAL_ERROR + "Installing the ${_component} component failed (${_install_result}):\n" + "${_install_output}\n${_install_error}") + endif() +endforeach() set(_required_sdk_files include/Spark/SparkSDK.h @@ -30,6 +32,7 @@ set(_required_sdk_files include/Spark/GeneratedVersion.h include/Spark/IModule.h include/Spark/ModuleABI.h + include/Spark/IWeatherService.h lib/cmake/SparkEngine/SparkEngineConfig.cmake lib/cmake/SparkEngine/SparkEngineConfigVersion.cmake lib/cmake/SparkEngine/SparkEngineTargets.cmake @@ -63,7 +66,7 @@ set(_required_sdk_documentation "README.md|there is no N-1 load or migration path" "API-REFERENCE.md|## Module lifecycle" "API-REFERENCE.md|SparkModuleCompatibilityDescriptor" - "MIGRATION.md|## Current version: SDK ABI v9" + "MIGRATION.md|## Current version: SDK ABI v10" "MIGRATION.md|There is no N-1 module load") set(_missing_sdk_documentation) foreach(_required_documentation IN LISTS _required_sdk_documentation) diff --git a/Tests/PackageSmoke/fps_owned_save_decode.py b/Tests/PackageSmoke/fps_owned_save_decode.py new file mode 100644 index 000000000..6c6baa171 --- /dev/null +++ b/Tests/PackageSmoke/fps_owned_save_decode.py @@ -0,0 +1,151 @@ +"""Content-only decoder caller for the owned F2/F3 driver; never opens user saves. + +The driver supplies run_child, its existing process-owner callback. No implicit +subprocess fallback exists. The callback must terminate/close its owned process +tree before returning and include cleanup in the supplied timeout. +""" +import hashlib +import json +import math +import os +from pathlib import Path +import stat +import tempfile +import time +import xml.etree.ElementTree as ET + +CASE = 'FPSInputDispatch_DecodeOwnedPrimary' +PREFIX = 'SPARK_FPS_SAVE_DECODE ' +INPUT_CAP = 16 * 1024 * 1024 +TEXT_CAP = 128 * 1024 + + +def require(value, reason): + if not value: + raise ValueError(reason) + + +def plain(path): + path = Path(path) + require(path.is_absolute(), 'absolute owned path required') + require('..' not in path.parts and str(path).isascii(), 'plain ASCII path required') + for item in (path, *path.parents): + info = item.lstat() + require(not stat.S_ISLNK(info.st_mode) and not getattr(info, 'st_file_attributes', 0) & 0x400, + 'link/reparse path refused') + return path.resolve(strict=True) + + +def file_identity(path, cap): + path = plain(path) + info = path.stat() + require(stat.S_ISREG(info.st_mode) and 0 < info.st_size <= cap, 'regular bounded file required') + with path.open('rb') as stream: + digest = hashlib.file_digest(stream, 'sha256').hexdigest() + after = path.stat() + require((info.st_size, info.st_mtime_ns, info.st_ctime_ns) == + (after.st_size, after.st_mtime_ns, after.st_ctime_ns), 'file changed while hashing') + return {'sha256': digest, 'bytes': info.st_size} + + +def unique(pairs): + result = {} + for key, value in pairs: + require(key not in result, 'duplicate receipt key') + result[key] = value + return result + + +def parse_receipt(stdout, stderr, expected): + for text in (stdout, stderr): + require(isinstance(text, str) and '\0' not in text and len(text.encode('utf-8')) <= TEXT_CAP, + 'complete decoder output cap/encoding') + lines = [line for text in (stdout, stderr) for line in text.splitlines() + if 'SPARK_FPS_SAVE_DECODE' in line] + require(len(lines) == 1 and lines[0].startswith(PREFIX), 'one standalone decoder receipt required') + raw = lines[0][len(PREFIX):] + require(0 < len(raw.encode('utf-8')) <= 16384, 'decoder JSON cap') + receipt = json.loads(raw, object_pairs_hook=unique, + parse_constant=lambda value: (_ for _ in ()).throw(ValueError(value))) + require(set(receipt) == {'inputSha256', 'inputBytes', 'canonicalProfile'}, 'decoder receipt shape') + require(type(receipt['inputBytes']) is int and receipt['inputBytes'] == expected['bytes'] and + receipt['inputSha256'] == expected['sha256'], 'decoded primary identity mismatch') + profile = receipt['canonicalProfile'] + # This is the production WriteTo map. Its schema validation belongs to the + # native ReadFrom path; do not implement another persisted-profile parser. + require(isinstance(profile, dict) and profile and + all(isinstance(k, str) and isinstance(v, str) and '\n' not in k+v and '\r' not in k+v and + k.startswith('fps.profile.') for k, v in profile.items()), 'canonical profile map') + return receipt + + +def framework(path): + require(plain(path).stat().st_size <= TEXT_CAP, 'framework XML cap') + raw = path.read_bytes() + require(raw and b'\0' not in raw and b'= 0, 'decoder duration') + + +def decode_owned_primary(*, input_path, owned_root, tests_executable, deadline, run_child): + require(callable(run_child), 'owned runner callback required') + root, original, executable = plain(owned_root), plain(input_path), plain(tests_executable) + require(root.is_dir() and original.is_relative_to(root) and original != root, + 'input must be inside explicit owned evidence root') + require(not root.is_relative_to(executable) and original != executable, 'input/executable separation') + for suffix in ('.bak', '.tmp'): + require(not original.with_name(original.name+suffix).exists(), 'copied input backup/staging refused') + before = file_identity(original, INPUT_CAP) + executable_before = file_identity(executable, 1024*1024*1024) + work = Path(tempfile.mkdtemp(prefix='save-decode-', dir=root)) + inputs = work/'input' + inputs.mkdir() + primary = inputs/'fps_quicksave.spark_save' + with original.open('rb') as source, primary.open('xb') as target: + remaining = before['bytes'] + while remaining: + block = source.read(min(65536, remaining)) + require(block, 'short input copy') + target.write(block) + remaining -= len(block) + require(not source.read(1), 'input grew during copy') + require(file_identity(original, INPUT_CAP) == before and file_identity(primary, INPUT_CAP) == before, + 'input copy changed') + timeout = min(20.0, deadline-time.monotonic()) + require(timeout > 0, 'owner deadline exhausted before decoder') + environment = dict(os.environ) + for selector in ('SPARK_TEST_NAME', 'SPARK_TEST_FILE', 'SPARK_TEST_EXCLUDE'): + environment.pop(selector, None) + environment.update(SPARK_FPS_DECODE_DIRECTORY=str(inputs), SPARK_TEST_NAME_PREFIX=CASE, + SPARK_TEST_EXPECT_COUNT='1') + junit = work/'framework.xml' + result = run_child([str(executable), '--warn-is-error', '--empty-is-error', '--junit-xml', str(junit)], + cwd=work, environment=environment, timeout=timeout) + for name, text in (('stdout.log', result.stdout), ('stderr.log', result.stderr)): + require(isinstance(text, str) and '\0' not in text and len(text.encode('utf-8')) <= TEXT_CAP, + 'complete decoder output cap/encoding') + with (work/name).open('x', encoding='utf-8', newline='') as output: + output.write(text) + require(time.monotonic() <= deadline, 'owner deadline exceeded') + require(result.returncode == 0, 'native decoder failed') + receipt = parse_receipt(result.stdout, result.stderr, before) + framework(junit) + require({p.name for p in inputs.iterdir()} == {'fps_quicksave.spark_save'}, 'decoder backup/file substitution') + require(file_identity(original, INPUT_CAP) == before and file_identity(primary, INPUT_CAP) == before and + file_identity(executable, 1024*1024*1024) == executable_before, 'decoder/input identity changed') + report = {'scope': 'copied-primary-content-only', 'input': before, 'decoderExecutable': executable_before, + 'canonicalProfile': receipt['canonicalProfile'], 'frameworkJUnit': file_identity(junit, TEXT_CAP)} + require(time.monotonic() <= deadline, 'owner deadline exceeded during final verification') + with (work/'content-receipt.json').open('x', encoding='utf-8') as output: + output.write(json.dumps(report, sort_keys=True)+'\n') + return work, report diff --git a/Tests/PackageSmoke/test_editor_fps_lineage.py b/Tests/PackageSmoke/test_editor_fps_lineage.py index 0bc8499f6..78b55a670 100644 --- a/Tests/PackageSmoke/test_editor_fps_lineage.py +++ b/Tests/PackageSmoke/test_editor_fps_lineage.py @@ -228,7 +228,8 @@ def test_wrong_runtime_reason_and_state(self): old = path.read_bytes() for mutation in (old.replace(b'position=3,2,5', b'position=0,0,0'), old.replace(b'scene=Startup.sparkscene', b'scene=Scenes/Startup.sparkscene'), - old.replace(b'fov=70', b'fov=nan'), old + old.splitlines()[0] + b'\n', + old.replace(b'fov=70', b'fov=nan'), old.replace(b'fov=70', b'fov=69.99'), + old + old.splitlines()[0] + b'\n', old.replace(b'rendering=1', b'rendering=1 rendering=1'), old.replace(b'STARTUP_MESH index=0', b'STARTUP_MESH index=1'), old + b'Warning: Failed to load pistol model\n'): @@ -237,6 +238,14 @@ def test_wrong_runtime_reason_and_state(self): self.validate() self.write(path, old) + def test_runtime_fov_accepts_float_projection_round_trip(self): + path = self.root/'positive/runtime.log' + original = path.read_bytes() + for fov in (b'69.9999924', b'70.0000076'): + with self.subTest(fov=fov): + self.write(path, original.replace(b'fov=70', b'fov='+fov)) + self.validate() + def test_installed_weapon_asset_binding(self): self.write(self.host.parent/'Assets/Models/pistol.obj', b'wrong installed source') with self.assertRaises(ValueError): diff --git a/Tests/PackageSmoke/test_fps_owned_save_decode.py b/Tests/PackageSmoke/test_fps_owned_save_decode.py new file mode 100644 index 000000000..db8719793 --- /dev/null +++ b/Tests/PackageSmoke/test_fps_owned_save_decode.py @@ -0,0 +1,86 @@ +"""Caller contracts only: native decoder callback is always synthetic.""" +import json +from pathlib import Path +import subprocess +import tempfile +import time +import unittest +from unittest import mock +import fps_owned_save_decode as decoder + + +class DecodeContracts(unittest.TestCase): + def setUp(self): + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.root = Path(self.temp.name).resolve() + self.primary = self.root/'owned-primary.spark_save' + self.primary.write_bytes(b'synthetic container; never native decoded') + self.exe = self.root/'SparkTests.exe' + self.exe.write_bytes(b'synthetic executable; never executed') + self.variant = '' + + def child(self, command, *, cwd, environment, timeout): + self.assertEqual(environment['SPARK_TEST_NAME_PREFIX'], decoder.CASE) + self.assertEqual(environment['SPARK_TEST_EXPECT_COUNT'], '1') + self.assertLessEqual(timeout, 20) + primary = Path(environment['SPARK_FPS_DECODE_DIRECTORY'])/'fps_quicksave.spark_save' + identity = decoder.file_identity(primary, decoder.INPUT_CAP) + receipt = dict(inputSha256=identity['sha256'], inputBytes=identity['bytes'], + canonicalProfile={'fps.profile.version': '1', 'fps.profile.class': '1'}) + if self.variant == 'wrong-hash': + receipt['inputSha256'] = '0'*64 + if self.variant == 'input-mutation': + self.primary.write_bytes(b'changed') + if self.variant == 'backup': + primary.with_name(primary.name+'.bak').write_bytes(b'backup') + totals = 'tests="1" failures="0" skipped="0" flaky="0" empty="0"' + case = '' if self.variant == 'skipped' else '/>') + Path(command[-1]).write_text(''+case+'') + line = decoder.PREFIX+json.dumps(receipt)+'\n' + if self.variant == 'duplicate': + line += line + if self.variant == 'oversize': + line += 'x'*decoder.TEXT_CAP + return subprocess.CompletedProcess(command, 2 if self.variant == 'exit' else 0, line, '') + + def invoke(self, **extra): + return decoder.decode_owned_primary(input_path=self.primary, owned_root=self.root, + tests_executable=self.exe, deadline=time.monotonic()+30, run_child=self.child, **extra) + + def test_complete_content_scope(self): + work, report = self.invoke() + self.assertEqual(report['scope'], 'copied-primary-content-only') + self.assertEqual(report['input'], decoder.file_identity(self.primary, decoder.INPUT_CAP)) + self.assertTrue((work/'content-receipt.json').is_file()) + + def test_bad_native_receipts_never_publish_success(self): + for variant in ('wrong-hash', 'input-mutation', 'backup', 'skipped', 'duplicate', 'oversize', 'exit'): + with self.subTest(variant=variant): + self.primary.write_bytes(b'synthetic container; never native decoded') + self.variant = variant + with self.assertRaises(ValueError): + self.invoke() + self.assertFalse(list(self.root.glob('save-decode-*/content-receipt.json'))) + + def test_outside_input_and_backup_rejected_before_child(self): + owned = self.root/'inner' + owned.mkdir() + with self.assertRaisesRegex(ValueError, 'inside explicit owned'): + decoder.decode_owned_primary(input_path=self.primary, owned_root=owned, + tests_executable=self.exe, deadline=time.monotonic()+30, + run_child=lambda *a, **k: self.fail('child must not run')) + self.primary.with_name(self.primary.name+'.bak').write_bytes(b'old') + with self.assertRaisesRegex(ValueError, 'backup'): + self.invoke() + + def test_final_verification_must_fit_owner_deadline(self): + with mock.patch.object(decoder.time, 'monotonic', side_effect=[0, 0, 99]): + with self.assertRaisesRegex(ValueError, 'during final verification'): + decoder.decode_owned_primary(input_path=self.primary, owned_root=self.root, + tests_executable=self.exe, deadline=50, run_child=self.child) + self.assertFalse(list(self.root.glob('save-decode-*/content-receipt.json'))) + + +if __name__ == '__main__': + unittest.main() diff --git a/Tests/TestAIIntegratedSystem.cpp b/Tests/TestAIIntegratedSystem.cpp index 748e4818f..ecbef36aa 100644 --- a/Tests/TestAIIntegratedSystem.cpp +++ b/Tests/TestAIIntegratedSystem.cpp @@ -17,9 +17,16 @@ #include "TestFramework.h" +#include "Engine/AI/AIBudgetTypes.h" #include "Engine/AI/AIIntegration.h" #include "Engine/ECS/Components.h" +#include + +// AIBudgetTypes intentionally introduces Spark::AI::EntityID before AISystem.h. +// The core AI component must still use the ECS entity type regardless of include order. +static_assert(std::is_same_v); + using namespace Spark::AI; namespace diff --git a/Tests/TestAssetParserHardening.cpp b/Tests/TestAssetParserHardening.cpp index 6318eb273..8854243ee 100644 --- a/Tests/TestAssetParserHardening.cpp +++ b/Tests/TestAssetParserHardening.cpp @@ -34,11 +34,27 @@ #include #include +#if defined(_WIN32) +#include +#else +#include +#endif + namespace { + std::filesystem::path AssetSecRoot() + { +#if defined(_WIN32) + const auto processId = static_cast(::_getpid()); +#else + const auto processId = static_cast(::getpid()); +#endif + return std::filesystem::temp_directory_path() / ("spark_assetsec_tests_" + std::to_string(processId)); + } + std::filesystem::path AssetSecDir() { - const auto dir = std::filesystem::temp_directory_path() / "spark_assetsec_tests"; + const auto dir = AssetSecRoot(); std::error_code ec; std::filesystem::create_directories(dir, ec); return dir; @@ -60,7 +76,7 @@ namespace void RemoveAssetSecDir() { std::error_code ec; - std::filesystem::remove_all(std::filesystem::temp_directory_path() / "spark_assetsec_tests", ec); + std::filesystem::remove_all(AssetSecRoot(), ec); } #ifdef SPARK_PLATFORM_WINDOWS diff --git a/Tests/TestECSystemsReal.cpp b/Tests/TestECSystemsReal.cpp index 04ed5ded0..c268f8f33 100644 --- a/Tests/TestECSystemsReal.cpp +++ b/Tests/TestECSystemsReal.cpp @@ -7,6 +7,7 @@ */ #include "TestFramework.h" +#include "Engine/ECS/Components.h" #include "Engine/ECS/Systems/ECSystemTypes.h" #include @@ -14,17 +15,6 @@ #include #include -// Minimal World definition — ECSystemTypes.h forward-declares it at global -// scope, so the test provides an empty stub here. GCC's -Wodr will warn that -// this differs from the engine's real `class World` under LTO; that's -// expected: the test's stub is never instantiated or passed to code that -// touches World's real members, so link-time behavior is unaffected. We -// cannot pull in the real World here without dragging the full ECS runtime -// (entt headers, components, managers) into a unit-test TU. -class World -{ -}; - // --------------------------------------------------------------------------- // Stub systems for testing SystemManager // --------------------------------------------------------------------------- diff --git a/Tests/TestEditorCookPackageReal.cpp b/Tests/TestEditorCookPackageReal.cpp index 7cead0dc2..2ca6cba78 100644 --- a/Tests/TestEditorCookPackageReal.cpp +++ b/Tests/TestEditorCookPackageReal.cpp @@ -50,7 +50,9 @@ #include "Utils/Process.h" #include +#include #include +#include #include #include #include @@ -194,17 +196,26 @@ namespace HostRun RunPackagedScene() const { HostRun run; - Spark::Process::Builder builder(Utf8(m_realFPS ? m_package / "Crate Game.exe" : - m_package / "ScenePreview" / kScenePreviewHost)); + Spark::Process::Builder builder( + Utf8(m_realFPS ? m_package / "Crate Game.exe" : m_package / "ScenePreview" / kScenePreviewHost)); if (m_realFPS) - builder.Arg("-game").Arg(Utf8(m_package / m_module.filename())).Arg("-require-game") - .Arg("-threads").Arg("2").Arg("-window-size").Arg("640x360"); + builder.Arg("-game") + .Arg(Utf8(m_package / m_module.filename())) + .Arg("-require-game") + .Arg("-threads") + .Arg("2") + .Arg("-window-size") + .Arg("640x360"); else builder.Arg("-headless").Arg("-scene").Arg("Scenes/Startup.sparkscene"); - auto launched = builder.Arg("-test-frames").Arg(std::to_string(m_realFPS ? 30 : kTestFrames)) + auto launched = builder.Arg("-test-frames") + .Arg(std::to_string(m_realFPS ? 30 : kTestFrames)) .Arg("-no-subprocess") .WorkingDirectory(Utf8(m_package)) - .CaptureStdout().MergeStderrIntoStdout().NoWindow().Launch(); + .CaptureStdout() + .MergeStderrIntoStdout() + .NoWindow() + .Launch(); const auto finish = [&](HostRun result) { if (m_realFPS) @@ -490,7 +501,20 @@ TEST(EditorFPSLineage_AuthoredSceneLoadedByInstalledFPS) EXPECT_STR_CONTAINS(run.output, "SPARK_FPS_STARTUP scene=Startup.sparkscene nodes=2 rendering=1\n"); EXPECT_STR_CONTAINS(run.output, "type=model position=3,2,5 rotation=0,0,0 scale=1,1,1\n"); EXPECT_STR_CONTAINS(run.output, "type=Camera position=7,11,-13 rotation=0,0,0 scale=1,1,1\n"); - EXPECT_STR_CONTAINS(run.output, "SPARK_FPS_STARTUP_CAMERA position=7,11,-13 fov=70 "); + EXPECT_EQ(CountOccurrences(run.output, "SPARK_FPS_STARTUP_CAMERA "), static_cast(1)); + const std::string cameraPrefix = "SPARK_FPS_STARTUP_CAMERA position=7,11,-13 fov="; + const auto cameraAt = run.output.find(cameraPrefix); + ASSERT_NE(cameraAt, std::string::npos); + const char* begin = run.output.data() + cameraAt + cameraPrefix.size(); + const char* end = std::find(begin, run.output.data() + run.output.size(), ' '); + ASSERT_NE(end, run.output.data() + run.output.size()); + float fov = 0; + const auto parsed = std::from_chars(begin, end, fov); + EXPECT_TRUE(parsed.ec == std::errc{} && parsed.ptr == end && end != begin); + EXPECT_TRUE(std::isfinite(fov)); + // Match the runtime proof's 1e-6 relative tolerance after the camera's + // float degrees/radians round trip. The authored document stays exact. + EXPECT_NEAR(fov, 70.0f, 7e-5f); EXPECT_STR_CONTAINS(run.output, "SPARK_FPS_STARTUP_PLAYER position=7,11,-13\n"); // The installed wrapper additionally validates the full WARP/FPS lifecycle and // committed authored scene state from the preserved runtime.log. @@ -506,7 +530,8 @@ TEST(EditorFPSLineage_MalformedStartupFailsClosed) const HostRun run = scenario.RunPackagedScene(); EXPECT_TRUE(run.exitCode > 0); EXPECT_EQ(CountOccurrences(run.output, "SPARK_FPS_STARTUP "), static_cast(0)); - EXPECT_STR_CONTAINS(run.output, "Reflected gameplay scene rejected: primary scene is invalid or has unsupported reflected fields"); + EXPECT_STR_CONTAINS( + run.output, "Reflected gameplay scene rejected: primary scene is invalid or has unsupported reflected fields"); EXPECT_STR_CONTAINS(run.output, "FPS packaged startup rejected: selected reflected scene failed to load"); } @@ -529,6 +554,8 @@ TEST(EditorFPSLineage_MissingRealModuleFailsClosed) ASSERT_TRUE(fs::remove(scenario.Package() / "SparkGameFPS.dll")); const HostRun run = scenario.RunPackagedScene(); EXPECT_TRUE(run.exitCode > 0); + EXPECT_EQ(CountOccurrences(run.output, "SPARK_FPS_STARTUP "), static_cast(0)); + EXPECT_STR_CONTAINS(run.output, "Explicit game module not found: " + Utf8(scenario.Package() / "SparkGameFPS.dll")); } #endif // SPARK_EDITOR_FPS_LINEAGE_TESTS diff --git a/Tests/TestEditorCrashHandlerFilterReal.cpp b/Tests/TestEditorCrashHandlerFilterReal.cpp index 1203355b8..e97a90dbf 100644 --- a/Tests/TestEditorCrashHandlerFilterReal.cpp +++ b/Tests/TestEditorCrashHandlerFilterReal.cpp @@ -339,8 +339,10 @@ TEST(EditorCrashHandler_DumpTypeWritesNoStackResidentSecret) Spark::StackTrace::SymbolLockLease symbolLock(true); if (symbolLock.owns_lock()) { - // The raw control only proves the scan can see the canary; like the product writer it - // retries once when DbgHelp races a transiently unreadable page. + // The raw control only proves the scan can see the canary, so it does not need an + // exception stream. Passing the test's plain CONTEXT makes some DbgHelp builds reject + // the control before stack capture. Like the product writer, retry once when DbgHelp + // races a transiently unreadable page. for (int attempt = 0; attempt != 2; ++attempt) { LARGE_INTEGER start{}; @@ -349,7 +351,7 @@ TEST(EditorCrashHandler_DumpTypeWritesNoStackResidentSecret) SetLastError(ERROR_SUCCESS); written = removeStacks ? Spark::CrashDump::WriteWithoutStacks(handle, dumpType, &exception, &error) : MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), handle, - dumpType, &exception, nullptr, nullptr); + dumpType, nullptr, nullptr, nullptr); if (!removeStacks) error = written ? ERROR_SUCCESS : GetLastError(); if (written || removeStacks || !IsPartialCopy(error)) diff --git a/Tests/TestEditorSubsystemsReal.cpp b/Tests/TestEditorSubsystemsReal.cpp index 10d965f69..a2c35d73f 100644 --- a/Tests/TestEditorSubsystemsReal.cpp +++ b/Tests/TestEditorSubsystemsReal.cpp @@ -15,8 +15,11 @@ #include "Prefabs/PrefabManager.h" #include "Profiler/PerformanceProfiler.h" +#include "Panels/MaterialEditorPanel.h" +#include "Panels/AssetBrowserPanel.h" #include "SceneSystem/SceneFile.h" #include "Terrain/TerrainEditor.h" +#include "Utils/FileUtils.h" #include "Core/EngineContext.h" #include "Engine/ECS/Components.h" @@ -65,6 +68,26 @@ namespace std::filesystem::path m_path; }; + class MaterialWorkingDirectoryGuard + { + public: + explicit MaterialWorkingDirectoryGuard(const std::filesystem::path& next) + : m_previous(std::filesystem::current_path()) + { + std::filesystem::current_path(next); + } + ~MaterialWorkingDirectoryGuard() + { + std::error_code error; + std::filesystem::current_path(m_previous, error); + } + MaterialWorkingDirectoryGuard(const MaterialWorkingDirectoryGuard&) = delete; + MaterialWorkingDirectoryGuard& operator=(const MaterialWorkingDirectoryGuard&) = delete; + + private: + std::filesystem::path m_previous; + }; + /// @brief Build a small authored terrain in the editor: heights, a bound texture layer, a detail mesh. void AuthorTerrain(SparkEditor::TerrainEditor& editor, int resolution) { @@ -606,3 +629,221 @@ TEST(EditorSubsystemsReal_ProfilerFrameTimeTracksTheRealDelta) profiler.Shutdown(); } + +TEST(EditorSubsystemsReal_MaterialSave_CreatesMissingParent) +{ + ScratchDir scratch("material_first_save"); + MaterialWorkingDirectoryGuard workingDirectory(scratch.Path()); + SparkEditor::MaterialEditorPanel panel; + panel.CreateMaterial("FirstMaterial", "Shaders/QA.hlsl"); + const auto destination = scratch.Path() / "Assets" / "Materials" / "FirstMaterial.spkmat"; + EXPECT_FALSE(std::filesystem::exists(destination.parent_path())); + ASSERT_TRUE(panel.SaveMaterial()); + EXPECT_TRUE(std::filesystem::is_regular_file(destination)); + EXPECT_TRUE(std::filesystem::file_size(destination) > 0); + EXPECT_FALSE(panel.HasUnsavedChanges()); +} + +TEST(EditorSubsystemsReal_MaterialSave_ParentFileFailureRetainsDirtyState) +{ + ScratchDir scratch("material_parent_file"); + MaterialWorkingDirectoryGuard workingDirectory(scratch.Path()); + const auto blocker = scratch.Path() / "Assets"; + ASSERT_TRUE(Spark::FileUtils::WriteTextFile(blocker.string(), "existing user asset")); + SparkEditor::MaterialEditorPanel panel; + panel.CreateMaterial("FirstMaterial", "Shaders/QA.hlsl"); + EXPECT_FALSE(panel.SaveMaterial()); + EXPECT_TRUE(panel.HasUnsavedChanges()); + EXPECT_EQ(Spark::FileUtils::ReadTextFile(blocker.string()).value_or(""), std::string("existing user asset")); +} + +TEST(EditorSubsystemsReal_MaterialSave_DestinationDirectoryFailureRetainsDirtyState) +{ + ScratchDir scratch("material_destination_directory"); + MaterialWorkingDirectoryGuard workingDirectory(scratch.Path()); + const auto destination = scratch.Path() / "Assets" / "Materials" / "FirstMaterial.spkmat"; + ASSERT_TRUE(std::filesystem::create_directories(destination)); + SparkEditor::MaterialEditorPanel panel; + panel.CreateMaterial("FirstMaterial", "Shaders/QA.hlsl"); + EXPECT_FALSE(panel.SaveMaterial()); + EXPECT_TRUE(panel.HasUnsavedChanges()); + EXPECT_TRUE(std::filesystem::is_directory(destination)); +} + +TEST(EditorSubsystemsReal_MaterialSave_UsesNativeUtf8Path) +{ + ScratchDir scratch("material_utf8"); + MaterialWorkingDirectoryGuard workingDirectory(scratch.Path()); + const auto filename = std::filesystem::path(u8"塗料"); + const auto utf8Name = Spark::FileUtils::TryPathToUtf8(filename); + ASSERT_TRUE(utf8Name.has_value()); + const auto destination = scratch.Path() / "Assets" / "Materials" / std::filesystem::path(u8"塗料.spkmat"); + SparkEditor::MaterialEditorPanel panel; + panel.CreateMaterial(*utf8Name, "Shaders/QA.hlsl"); + ASSERT_TRUE(panel.SaveMaterial()); + EXPECT_TRUE(std::filesystem::is_regular_file(destination)); + EXPECT_FALSE(panel.HasUnsavedChanges()); +} + +TEST(EditorSubsystemsReal_MaterialSave_ReopenPreservesAuthoredValues) +{ + ScratchDir scratch("material_reopen"); + MaterialWorkingDirectoryGuard workingDirectory(scratch.Path()); + const std::string path = scratch.File("Authored.spkmat"); + const std::string authored = + "name: Authored Material\nshader: Shaders/Custom Shader.hlsl\n" + "param roughness float 0.248\nparam Vector2 float2 2 3\n" + "param Vector3 float3 4 5 6\nparam Vector4 float4 7 8 9 10\n" + "param Tint color 0.1 0.2 0.3 0.4\nparam Count int 17\nparam Enabled bool true\n" + "param Diffuse texture2d Textures/Color Map.png\nparam Environment texturecube Textures/Sky Cube.dds\n" + "param Matrix matrix4x4 1 0 0 0 0 2 0 0 0 0 3 0 4 5 6 1\n" + "texture_slot Albedo 3 Textures/Color Map.png 2 3 0.25 0.5\n" + "blend_mode 2\ncull_mode 1\ndepth_write false\ndepth_test true\n" + "cast_shadows false\nreceive_shadows true\nalpha_clip 0.33\nrender_queue 2500\n"; + ASSERT_TRUE(Spark::FileUtils::WriteTextFile(path, authored)); + SparkEditor::MaterialEditorPanel panel; + panel.OpenMaterial(path); + EXPECT_FALSE(panel.HasUnsavedChanges()); + ASSERT_TRUE(panel.SaveMaterial()); + const std::string saved = Spark::FileUtils::ReadTextFile(path).value_or(""); + for (const std::string& line : {"name: Authored Material", + "shader: Shaders/Custom Shader.hlsl", + "param roughness float 0.248", + "param Vector2 float2 2 3", + "param Vector3 float3 4 5 6", + "param Vector4 float4 7 8 9 10", + "param Tint color 0.1 0.2 0.3 0.4", + "param Count int 17", + "param Enabled bool true", + "param Diffuse texture2d Textures/Color Map.png", + "param Environment texturecube Textures/Sky Cube.dds", + "param Matrix matrix4x4 1 0 0 0 0 2 0 0 0 0 3 0 4 5 6 1", + "texture_slot Albedo 3 Textures/Color Map.png 2 3 0.25 0.5", + "blend_mode 2", + "cull_mode 1", + "depth_write false", + "depth_test true", + "cast_shadows false", + "receive_shadows true", + "alpha_clip 0.33", + "render_queue 2500"}) + { + EXPECT_TRUE(saved.find(line) != std::string::npos); + } +} + +TEST(EditorSubsystemsReal_MaterialSave_MissingLoadRetainsSelectionAndDirtyState) +{ + ScratchDir scratch("material_missing_load"); + MaterialWorkingDirectoryGuard workingDirectory(scratch.Path()); + SparkEditor::MaterialEditorPanel panel; + panel.CreateMaterial("Existing", "Shaders/QA.hlsl"); + panel.OpenMaterial(scratch.File("Missing.spkmat")); + EXPECT_TRUE(panel.HasUnsavedChanges()); + ASSERT_TRUE(panel.SaveMaterial()); + EXPECT_TRUE(std::filesystem::is_regular_file(scratch.Path() / "Assets/Materials/Existing.spkmat")); + EXPECT_FALSE(std::filesystem::exists(scratch.Path() / "Missing.spkmat")); +} + +TEST(EditorSubsystemsReal_MaterialSave_MalformedLoadRetainsAssetAndDirtyState) +{ + ScratchDir scratch("material_malformed_load"); + MaterialWorkingDirectoryGuard workingDirectory(scratch.Path()); + const std::string path = scratch.File("Malformed.spkmat"); + const std::vector invalidRecords = { + "param roughness float wrong\n", "texture_slot Ambient Occlusion -1 none 1 1 0 0\n", + "texture_slot Ambient Occlusion wrong none 1 1 0 0\n", "texture_slot Ambient Occlusion 4 none 1 nan 0 0\n", + "texture_slot Ambient Occlusion 4 none 1 1 0 0\ntexture_slot Ambient Occlusion 4 none 1 1 0 0\n"}; + for (const auto& record : invalidRecords) + { + const std::string invalid = "name: Invalid\nshader: Shaders/QA.hlsl\n" + record; + ASSERT_TRUE(Spark::FileUtils::WriteTextFile(path, invalid)); + SparkEditor::MaterialEditorPanel panel; + panel.CreateMaterial("Existing", "Shaders/QA.hlsl"); + panel.OpenMaterial(path); + EXPECT_TRUE(panel.HasUnsavedChanges()); + ASSERT_TRUE(panel.SaveMaterial()); + EXPECT_EQ(Spark::FileUtils::ReadTextFile(path).value_or(""), invalid); + EXPECT_TRUE(std::filesystem::is_regular_file(scratch.Path() / "Assets/Materials/Existing.spkmat")); + } +} + +TEST(EditorSubsystemsReal_MaterialSave_AssetActivationLoadsUtf8Material) +{ + ScratchDir scratch("material_activation"); + const auto assets = scratch.Path() / "Assets"; + const auto folder = assets / Spark::FileUtils::PathFromUtf8("Materials_\xE6\xB5\x8B\xE8\xAF\x95"); + std::filesystem::create_directories(folder); + const auto file = folder / "Authored.SPKMAT"; + const std::string authored = "name: Activated\nshader: Shaders/Authored.hlsl\nparam roughness float 0.248\n"; + std::ofstream(file) << authored; + + SparkEditor::MaterialEditorPanel material; + material.SetVisible(false); + SparkEditor::AssetBrowserPanel browser; + browser.SetProjectPath(*Spark::FileUtils::TryPathToUtf8(assets)); + int calls = 0; + std::string activatedPath; + browser.SetOnMaterialOpened( + [&](const std::string& path) + { + ++calls; + activatedPath = path; + material.OpenMaterial(path); + }); + EXPECT_TRUE(browser.OpenAsset(*Spark::FileUtils::TryPathToUtf8(file))); + EXPECT_EQ(calls, 1); + EXPECT_EQ(Spark::FileUtils::PathFromUtf8(activatedPath), std::filesystem::weakly_canonical(file)); + EXPECT_TRUE(material.IsVisible()); + ASSERT_TRUE(material.SaveMaterial()); + std::ifstream saved(file); + const std::string contents((std::istreambuf_iterator(saved)), std::istreambuf_iterator()); + EXPECT_TRUE(contents.find("name: Activated\n") != std::string::npos); + EXPECT_TRUE(contents.find("shader: Shaders/Authored.hlsl\n") != std::string::npos); + EXPECT_TRUE(contents.find("param roughness float 0.248\n") != std::string::npos); +} + +TEST(EditorSubsystemsReal_MaterialSave_DefaultWriterRoundTripKeepsAllTextureSlots) +{ + ScratchDir scratch("material_default_slots"); + MaterialWorkingDirectoryGuard workingDirectory(scratch.Path()); + SparkEditor::MaterialEditorPanel writer; + writer.CreateMaterial("DefaultSlots", "Shaders/Authored.hlsl"); + ASSERT_TRUE(writer.SaveMaterial()); + const auto file = scratch.Path() / "Assets/Materials/DefaultSlots.spkmat"; + std::ifstream before(file); + const std::string authored((std::istreambuf_iterator(before)), std::istreambuf_iterator()); + EXPECT_TRUE(authored.find("texture_slot Ambient Occlusion 4 none 1 1 0 0") != std::string::npos); + SparkEditor::MaterialEditorPanel reader; + reader.SetVisible(false); + reader.OpenMaterial(*Spark::FileUtils::TryPathToUtf8(file)); + EXPECT_TRUE(reader.IsVisible()); + ASSERT_TRUE(reader.SaveMaterial()); + std::ifstream after(file); + const std::string reopened((std::istreambuf_iterator(after)), std::istreambuf_iterator()); + EXPECT_EQ(reopened, authored); +} + +TEST(EditorSubsystemsReal_MaterialSave_AssetActivationPreservesProjectBoundary) +{ + ScratchDir scratch("material_activation_boundary"); + const auto assets = scratch.Path() / "Assets"; + std::filesystem::create_directories(assets); + std::ofstream(assets / "Valid.spkmat") << "name: Valid\nshader: Shaders/Authored.hlsl\n"; + std::ofstream(assets / "Other.obj") << "mesh"; + std::ofstream(scratch.Path() / "Outside.spkmat") << "name: Outside\nshader: Shaders/Authored.hlsl\n"; + const auto utf8 = [](const std::filesystem::path& path) { return *Spark::FileUtils::TryPathToUtf8(path); }; + SparkEditor::AssetBrowserPanel browser; + browser.SetProjectPath(utf8(assets)); + EXPECT_FALSE(browser.OpenAsset(utf8(assets / "Valid.spkmat"))); + int calls = 0; + browser.SetOnMaterialOpened([&](const std::string&) { ++calls; }); + EXPECT_FALSE(browser.OpenAsset(utf8(assets / "Other.obj"))); + EXPECT_FALSE(browser.OpenAsset(utf8(assets / "Missing.spkmat"))); + EXPECT_FALSE(browser.OpenAsset(utf8(scratch.Path() / "Outside.spkmat"))); + EXPECT_FALSE(browser.OpenAsset(utf8(assets))); + EXPECT_EQ(calls, 0); + browser.ClearProject(); + EXPECT_FALSE(browser.OpenAsset(utf8(assets / "Valid.spkmat"))); + EXPECT_EQ(calls, 0); +} diff --git a/Tests/TestFPSGameCameraReloadReal.cpp b/Tests/TestFPSGameCameraReloadReal.cpp new file mode 100644 index 000000000..cefc4f1e5 --- /dev/null +++ b/Tests/TestFPSGameCameraReloadReal.cpp @@ -0,0 +1,161 @@ +/** + * @file TestFPSGameCameraReloadReal.cpp + * @brief Fresh-process regression for authored camera reloads through the real FPS DLL. + */ + +#include "Game/Game.h" +#include "Game/Player.h" +#include "Camera/SparkEngineCamera.h" +#include "Graphics/GraphicsEngine.h" +#include "Input/InputManager.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace +{ + void Require(bool condition, const std::string& message) + { + if (!condition) + throw std::runtime_error(message); + } + + void ExpectNear(float actual, float expected, const std::string& field) + { + Require(std::isfinite(actual) && std::abs(actual - expected) <= 0.0001f, + field + ": expected " + std::to_string(expected) + ", got " + std::to_string(actual)); + } + + void ExpectVector(const DirectX::XMFLOAT3& actual, const DirectX::XMFLOAT3& expected, const std::string& field) + { + ExpectNear(actual.x, expected.x, field + ".x"); + ExpectNear(actual.y, expected.y, field + ".y"); + ExpectNear(actual.z, expected.z, field + ".z"); + } + + void ExpectCamera(const SparkEngineCamera::CameraState& actual, const DirectX::XMFLOAT3& position, + const DirectX::XMFLOAT3& rotation, float fov, float nearPlane, float farPlane) + { + ExpectVector(actual.position, position, "camera position"); + ExpectVector(actual.rotation, rotation, "camera rotation"); + ExpectNear(actual.defaultFov, fov, "default FOV"); + ExpectNear(actual.currentFov, fov, "current FOV"); + ExpectNear(actual.nearPlane, nearPlane, "near plane"); + ExpectNear(actual.farPlane, farPlane, "far plane"); + } + + class OwnedSceneDirectory + { + public: + explicit OwnedSceneDirectory(const std::filesystem::path& scenes) + { + const auto stamp = std::chrono::steady_clock::now().time_since_epoch().count(); + m_path = scenes / ("fps-camera-reload-" + std::to_string(stamp)); + Require(std::filesystem::create_directory(m_path), "could not create a fresh owned scene directory"); + } + + ~OwnedSceneDirectory() + { + std::error_code error; + std::filesystem::remove_all(m_path, error); + } + + const std::filesystem::path& Path() const { return m_path; } + + private: + std::filesystem::path m_path; + }; + + void WriteScene(const std::filesystem::path& path, std::string_view text) + { + std::ofstream stream(path, std::ios::binary); + stream << text; + stream.close(); + Require(!stream.fail(), "could not write scene fixture: " + path.string()); + } +} // namespace + +int main(int argc, char** argv) +{ + try + { + Require(argc == 2, "expected the isolated runtime directory argument"); + const auto runtime = std::filesystem::canonical(argv[1]); + Require(std::filesystem::canonical(argv[0]).parent_path() == runtime, + "runtime assets must be adjacent to this test executable"); + const auto assets = std::filesystem::canonical(runtime / "Assets"); + Require(assets.parent_path() == runtime && std::filesystem::is_directory(assets / "Models") && + std::filesystem::is_regular_file(assets / "Scenes" / "level1.scene"), + "required staged FPS assets are missing"); + Require(!std::filesystem::exists(runtime / "Startup.sparkscene"), + "the legacy reload regression requires an isolated legacy startup"); + const auto scenes = std::filesystem::canonical(assets / "Scenes"); + Require(scenes.parent_path() == assets, "scene fixtures must stay inside the staged runtime assets"); + OwnedSceneDirectory owned(scenes); + WriteScene(owned.Path() / "a.scene", + "[Scene]\nname=ReloadA\n[Object]\ntype=plane\nname=FloorA\nposition=0,0,0\n" + "[Camera]\nname=CameraA\nposition=1,2,-20\nrotation=5,10,0\nprojection=perspective\n" + "isMain=true\nfov=70\nnearPlane=0.1\nfarPlane=1000\n"); + WriteScene(owned.Path() / "b.scene", + "[Scene]\nname=ReloadB\n[Object]\ntype=plane\nname=FloorB\nposition=3,0,4\n" + "[Camera]\nname=CameraB\nposition=7,3,-17\nrotation=15,25,0\nprojection=perspective\n" + "isMain=true\nfov=95\nnearPlane=0.25\nfarPlane=750\n"); + WriteScene(owned.Path() / "malformed.scene", + "[Scene]\nname=Broken\n[Camera]\nname=BrokenCamera\nposition=not-a-transform\n"); + + // These are real engine objects. Game supports CPU initialization without + // a graphics device; no simulation tick or platform input window is needed. + GraphicsEngine graphics; + InputManager input; + Game game; + Require(SUCCEEDED(game.Initialize(&graphics, &input)), "real FPS Game initialization failed"); + SparkEngineCamera* const camera = game.GetCamera(); + Player* const player = game.GetPlayer(); + SceneManager* const scene = game.GetSceneManager(); + Require(camera && player && scene, "the real game did not initialize camera/player/scene state"); + const auto relative = owned.Path().filename().generic_string() + "/"; + + Require(game.LoadScene(relative + "a.scene"), "authored scene A failed to load"); + Require(game.GetCamera() == camera && game.GetPlayer() == player && game.GetSceneManager() == scene, + "reload A replaced runtime owners"); + ExpectCamera(camera->Console_GetState(), {1, 2, -20}, {5, 10, 0}, 70, 0.1f, 1000); + ExpectVector(player->GetPosition(), {1, 2, -20}, "player position after A"); + Require(scene->FindNode("FloorA") >= 0 && scene->FindNode("CameraA") >= 0, "scene A was not committed"); + + Require(game.LoadScene(relative + "b.scene"), "authored scene B failed to load"); + Require(game.GetCamera() == camera && game.GetPlayer() == player && game.GetSceneManager() == scene, + "reload B replaced runtime owners"); + const auto committedCamera = camera->Console_GetState(); + ExpectCamera(committedCamera, {7, 3, -17}, {15, 25, 0}, 95, 0.25f, 750); + ExpectVector(player->GetPosition(), {7, 3, -17}, "player position after B"); + Require(scene->FindNode("FloorB") >= 0 && scene->FindNode("CameraB") >= 0 && scene->FindNode("FloorA") < 0, + "scene B did not replace scene A"); + const int committedCount = scene->GetNodeCount(); + const auto committedPath = scene->GetCurrentFilePath(); + const auto committedPlayerPosition = player->GetPosition(); + + Require(!game.LoadScene(relative + "malformed.scene"), "malformed existing scene was accepted"); + Require(game.GetCamera() == camera && game.GetPlayer() == player && game.GetSceneManager() == scene, + "failed reload replaced runtime owners"); + ExpectCamera(camera->Console_GetState(), committedCamera.position, committedCamera.rotation, + committedCamera.defaultFov, committedCamera.nearPlane, committedCamera.farPlane); + ExpectVector(player->GetPosition(), committedPlayerPosition, "player position after rejected reload"); + Require(scene->GetNodeCount() == committedCount && scene->GetCurrentFilePath() == committedPath && + scene->GetMetadata().sceneName == "ReloadB" && scene->FindNode("FloorB") >= 0 && + scene->FindNode("CameraB") >= 0 && scene->FindNode("BrokenCamera") < 0, + "failed reload changed the committed scene graph"); + std::cout << "Real FPS DLL camera reload and failed-load retention passed\n"; + return 0; + } + catch (const std::exception& error) + { + std::cerr << "Real FPS DLL camera reload failed: " << error.what() << '\n'; + return 1; + } +} diff --git a/Tests/TestFPSMultiplayer.cpp b/Tests/TestFPSMultiplayer.cpp index 2d7da84cd..9013bc8c3 100644 --- a/Tests/TestFPSMultiplayer.cpp +++ b/Tests/TestFPSMultiplayer.cpp @@ -1242,9 +1242,20 @@ TEST(FPSMultiplayerProduction_NetworkPathServerAdmitsInputAndBroadcastsSnapshots held.sequenceNumber = kFirstFireSequence + index; ASSERT_TRUE(remote.Send(FPSMessageType::PlayerInput, held.Serialize())); server.Update(kFrame); + // Dispatch this input before sending the next, without advancing the + // simulation while waiting for the receive thread. A tight send loop + // can arrive as a burst and correctly exhaust the input budget; extra + // simulated frames can instead expire the projectiles being measured. + const auto inputDeadline = std::chrono::steady_clock::now() + std::chrono::seconds(2); + while (Access::LastAppliedSequence(server, remoteId) != held.sequenceNumber && + std::chrono::steady_clock::now() < inputDeadline) + { + Spark::Net::NetworkManager::GetInstance().Update(0.0f); + std::this_thread::sleep_for(std::chrono::milliseconds(2)); + } + ASSERT_EQ(Access::LastAppliedSequence(server, remoteId), held.sequenceNumber); } - ASSERT_TRUE(PumpUntil( - server, [&] { return Access::LastAppliedSequence(server, remoteId) == kFirstFireSequence + kFireInputs - 1; })); + ASSERT_EQ(Access::LastAppliedSequence(server, remoteId), kFirstFireSequence + kFireInputs - 1); EXPECT_EQ(Access::ActiveProjectiles(server), static_cast(10)); // Disconnect through NetworkManager removes the player and its score row. diff --git a/Tests/TestFPSOwnedSaveDecode.cpp b/Tests/TestFPSOwnedSaveDecode.cpp new file mode 100644 index 000000000..8909df1f6 --- /dev/null +++ b/Tests/TestFPSOwnedSaveDecode.cpp @@ -0,0 +1,116 @@ +// Scoped native content verifier. Called only in its own SparkTests process by +// run_fps_owned_save_decode.py; never reads a game or user-profile directory. +#include "TestFramework.h" +#include "Engine/ECS/Components.h" +#include "Engine/SaveSystem/SaveSystem.h" +#include "Game/FPSQuickLoad.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#endif + +namespace +{ + namespace fs = std::filesystem; + constexpr size_t kInputCap = 16 * 1024 * 1024; + + void RequirePlainPath(const fs::path& path) + { + ASSERT_TRUE(path.is_absolute()); + for (auto current = path; !current.empty(); current = current.parent_path()) + { + ASSERT_FALSE(fs::is_symlink(fs::symlink_status(current))); +#ifdef _WIN32 + const auto attributes = GetFileAttributesW(current.c_str()); + ASSERT_TRUE(attributes != INVALID_FILE_ATTRIBUTES); + ASSERT_TRUE((attributes & FILE_ATTRIBUTE_REPARSE_POINT) == 0); +#endif + if (current == current.parent_path()) + break; + } + } + + void RequirePrimaryOnly(const fs::path& directory) + { + size_t count = 0; + for (const auto& entry : fs::directory_iterator(directory)) + { + ++count; + ASSERT_TRUE(entry.path().filename() == "fps_quicksave.spark_save"); + RequirePlainPath(entry.path()); + ASSERT_TRUE(entry.is_regular_file()); + } + ASSERT_EQ(count, static_cast(1)); + } + + std::vector ReadPrimary(const fs::path& path) + { + const auto size = fs::file_size(path); + ASSERT_TRUE(size > 0 && size <= kInputCap); + std::vector bytes(static_cast(size)); + std::ifstream input(path, std::ios::binary); + ASSERT_TRUE(input.good()); + input.read(reinterpret_cast(bytes.data()), static_cast(bytes.size())); + ASSERT_TRUE(input.good()); + ASSERT_EQ(input.peek(), std::char_traits::eof()); + return bytes; + } +} // namespace + +TEST(FPSInputDispatch_DecodeOwnedPrimary) +{ + const char* configured = std::getenv("SPARK_FPS_DECODE_DIRECTORY"); + if (!configured || !*configured) + SKIP_TEST("Requires a copied primary in an explicitly owned decoder directory"); + const std::string directoryText(configured); + // SaveSystem's path API is narrow; avoid lossy Windows path conversion. + for (unsigned char character : directoryText) + ASSERT_TRUE(character > 0 && character < 128); + const fs::path directory(directoryText); + ASSERT_TRUE(directory == directory.lexically_normal()); + RequirePlainPath(directory); + ASSERT_TRUE(fs::is_directory(directory)); + RequirePrimaryOnly(directory); + const auto primary = directory / "fps_quicksave.spark_save"; + const auto before = ReadPrimary(primary); + ASSERT_TRUE(sodium_init() >= 0); + std::array hash{}; + ASSERT_EQ(crypto_hash_sha256(hash.data(), before.data(), before.size()), 0); + std::array digest{}; + sodium_bin2hex(digest.data(), digest.size(), hash.data(), hash.size()); + + auto& saves = Spark::SaveSystem::GetInstance(); + saves.SetFileCache(nullptr); + ASSERT_TRUE(saves.Initialize(directoryText)); + ASSERT_EQ(saves.GetSaveDirectory(), directoryText); + World scratch(World::EntityEventCleanupMode::Suppressed); + Spark::FPSLocalProfile profile; + std::string error; + ASSERT_TRUE(Spark::LoadSlotWithProfile(saves, "fps_quicksave", scratch, profile, error) == + Spark::FPSQuickLoadStatus::Loaded); + std::unordered_map canonical; + profile.WriteTo(canonical); // Existing persisted-profile schema and float precision. + RequirePrimaryOnly(directory); + ASSERT_TRUE(ReadPrimary(primary) == before); + auto canonicalJson = nlohmann::json::object(); + for (const auto& [key, value] : canonical) + canonicalJson[key] = value; + nlohmann::json receipt = {{"inputSha256", digest.data()}, + {"inputBytes", static_cast(before.size())}, + {"canonicalProfile", canonicalJson}}; + const auto text = receipt.dump(); + ASSERT_TRUE(!text.empty() && text.size() <= 16384); + ASSERT_TRUE(std::printf("SPARK_FPS_SAVE_DECODE %s\n", text.c_str()) > 0); + ASSERT_EQ(std::fflush(stdout), 0); +} diff --git a/Tests/TestFPSWeatherPort.cpp b/Tests/TestFPSWeatherPort.cpp index 845080f52..e6f82d424 100644 --- a/Tests/TestFPSWeatherPort.cpp +++ b/Tests/TestFPSWeatherPort.cpp @@ -3,7 +3,9 @@ #include "Game/FPSWeatherPort.h" #include "Game/FPSWeatherIntegration.h" #include "Core/EngineWeatherAdapter.h" -#include "Graphics/WeatherSystem.h" +#include + +#include namespace { @@ -25,6 +27,24 @@ namespace float lastIntensity{-1.0f}; float lastTransitionSeconds{-1.0f}; }; + class RecordingWeatherService final : public Spark::IWeatherService + { + public: + bool SetWeather(Spark::WeatherPreset preset, float intensity, float transitionSeconds) override + { + ++calls; + lastPreset = preset; + lastIntensity = intensity; + lastTransitionSeconds = transitionSeconds; + return accepted; + } + + bool accepted{true}; + int calls{0}; + Spark::WeatherPreset lastPreset{Spark::WeatherPreset::Clear}; + float lastIntensity{-1.0f}; + float lastTransitionSeconds{-1.0f}; + }; } // namespace TEST(FPSWeatherPort_FakePreservesNarrowContract) @@ -47,15 +67,41 @@ TEST(FPSWeatherPort_OptionalCapabilityCanBeUnavailable) EXPECT_EQ(port.calls, 1); } -TEST(FPSWeatherPort_ProductionAdapterMapsToEngineWeather) +TEST(FPSWeatherPort_ProductionAdapterMapsEveryPublicPreset) { - Spark::WeatherSystem weather; + RecordingWeatherService weather; SparkGameFPS::EngineWeatherAdapter adapter(&weather); + constexpr std::array modulePresets{SparkGameFPS::WeatherPreset::Clear, SparkGameFPS::WeatherPreset::Rain, + SparkGameFPS::WeatherPreset::Snow, SparkGameFPS::WeatherPreset::Fog, + SparkGameFPS::WeatherPreset::Storm}; + constexpr std::array publicPresets{Spark::WeatherPreset::Clear, Spark::WeatherPreset::Rain, + Spark::WeatherPreset::Snow, Spark::WeatherPreset::Fog, + Spark::WeatherPreset::Storm}; + for (size_t i = 0; i < modulePresets.size(); ++i) + { + ASSERT_TRUE(adapter.SetWeather(modulePresets[i], 0.8f, 3.0f)); + EXPECT_EQ(weather.calls, static_cast(i + 1)); + EXPECT_EQ(static_cast(weather.lastPreset), static_cast(publicPresets[i])); + EXPECT_NEAR(weather.lastIntensity, 0.8f, 1.0e-6f); + EXPECT_NEAR(weather.lastTransitionSeconds, 3.0f, 1.0e-6f); + } +} - ASSERT_TRUE(adapter.SetWeather(SparkGameFPS::WeatherPreset::Storm, 0.8f, 3.0f)); - EXPECT_EQ(static_cast(weather.GetTargetState().type), static_cast(Spark::WeatherType::Storm)); - EXPECT_NEAR(weather.GetTargetState().intensity, 0.8f, 1.0e-6f); - EXPECT_TRUE(weather.IsTransitioning()); +TEST(FPSWeatherPort_ProductionAdapterPropagatesServiceRefusal) +{ + RecordingWeatherService weather; + weather.accepted = false; + SparkGameFPS::EngineWeatherAdapter adapter(&weather); + EXPECT_FALSE(adapter.SetWeather(SparkGameFPS::WeatherPreset::Rain, 0.5f, 1.0f)); + EXPECT_EQ(weather.calls, 1); +} + +TEST(FPSWeatherPort_ProductionAdapterRejectsUnknownPresetWithoutServiceCall) +{ + RecordingWeatherService weather; + SparkGameFPS::EngineWeatherAdapter adapter(&weather); + EXPECT_FALSE(adapter.SetWeather(static_cast(-1), 0.5f, 1.0f)); + EXPECT_EQ(weather.calls, 0); } TEST(FPSWeatherPort_ProductionAdapterReportsMissingEngineCapability) @@ -92,4 +138,28 @@ TEST(FPSWeatherIntegration_RejectsWrongThreadWithoutMutation) EXPECT_FALSE(initializedOnWorker); EXPECT_EQ(port.calls, 0); + + ASSERT_TRUE(integration.Initialize()); + FakeWeatherPort replacement; + bool activeOnWorker = true; + bool weatherSetOnWorker = true; + std::thread activeWorker( + [&] + { + initializedOnWorker = integration.Initialize(); + activeOnWorker = integration.IsActive(); + weatherSetOnWorker = integration.SetWeather(SparkGameFPS::WeatherPreset::Rain, 0.5f, 1.0f); + integration.Bind(&replacement); + integration.Clear(); + }); + activeWorker.join(); + + EXPECT_FALSE(initializedOnWorker); + EXPECT_FALSE(activeOnWorker); + EXPECT_FALSE(weatherSetOnWorker); + EXPECT_TRUE(integration.IsActive()); + EXPECT_EQ(port.calls, 1); + EXPECT_TRUE(integration.SetWeather(SparkGameFPS::WeatherPreset::Rain, 0.5f, 1.0f)); + EXPECT_EQ(port.calls, 2); + EXPECT_EQ(replacement.calls, 0); } diff --git a/Tests/TestInputFrameEdgesReal.cpp b/Tests/TestInputFrameEdgesReal.cpp index 9f693eccb..6a17d2455 100644 --- a/Tests/TestInputFrameEdgesReal.cpp +++ b/Tests/TestInputFrameEdgesReal.cpp @@ -21,7 +21,11 @@ #include "Input/InputManager.h" +#include #include +#include +#include +#include #include namespace @@ -32,6 +36,14 @@ namespace { input.Update(); } + + std::string ReadWin32InputHostSource() + { + const std::string path = + std::string(SPARK_TEST_SOURCE_DIR) + "/SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp"; + std::ifstream input(path, std::ios::binary); + return {std::istreambuf_iterator(input), std::istreambuf_iterator()}; + } } // namespace TEST(InputFrameEdgesReal_KeyDownDeliveredBeforeTickIsPressedForExactlyOneFrame) @@ -136,3 +148,89 @@ TEST(InputFrameEdgesReal_TimedReleaseIsAReleaseEdgeOnTheFrameThatAppliesIt) RunFrameInputStep(input); EXPECT_FALSE(input.WasKeyReleased(VK_SPACE)); } + +TEST(InputFrameEdgesReal_ObservationIsLatchedAndSequenceAdvancesOnlyOnUpdate) +{ + InputManager input; + const auto initial = input.GetInputFrameSequence(); + input.HandleMessage(WM_KEYDOWN, VK_F2, 0); + EXPECT_FALSE(input.IsFrameKeyDown(VK_F2)); + EXPECT_EQ(input.GetInputFrameSequence(), initial); + input.Update(); + EXPECT_EQ(input.GetInputFrameSequence(), initial + 1); + EXPECT_TRUE(input.IsFrameKeyDown(VK_F2)); + input.HandleMessage(WM_KEYUP, VK_F2, 0); + EXPECT_TRUE(input.IsFrameKeyDown(VK_F2)); + EXPECT_EQ(input.GetInputFrameSequence(), initial + 1); + input.Update(); + EXPECT_FALSE(input.IsFrameKeyDown(VK_F2)); + EXPECT_TRUE(input.WasKeyReleased(VK_F2)); + EXPECT_EQ(input.GetInputFrameSequence(), initial + 2); +} + +TEST(InputFrameEdgesReal_GenericModifiersAliasEitherSideWithoutLosingSideState) +{ + struct ModifierKeys + { + int generic; + int left; + int right; + }; + + constexpr std::array modifiers = { + {{VK_SHIFT, VK_LSHIFT, VK_RSHIFT}, {VK_CONTROL, VK_LCONTROL, VK_RCONTROL}, {VK_MENU, VK_LMENU, VK_RMENU}}}; + + for (const auto& keys : modifiers) + { + InputManager input; + RunFrameInputStep(input); + + input.HandleMessage(WM_KEYDOWN, keys.left, 0); + EXPECT_TRUE(input.IsKeyDown(keys.generic)); + EXPECT_TRUE(input.IsKeyDown(keys.left)); + EXPECT_FALSE(input.IsKeyDown(keys.right)); + RunFrameInputStep(input); + EXPECT_TRUE(input.IsFrameKeyDown(keys.generic)); + EXPECT_TRUE(input.WasKeyPressed(keys.generic)); + EXPECT_TRUE(input.WasKeyPressed(keys.left)); + + input.HandleMessage(WM_KEYDOWN, keys.right, 0); + RunFrameInputStep(input); + EXPECT_TRUE(input.IsKeyDown(keys.generic)); + EXPECT_FALSE(input.WasKeyPressed(keys.generic)); + EXPECT_TRUE(input.WasKeyPressed(keys.right)); + + input.HandleMessage(WM_KEYUP, keys.left, 0); + EXPECT_TRUE(input.IsKeyDown(keys.generic)); + RunFrameInputStep(input); + EXPECT_TRUE(input.IsFrameKeyDown(keys.generic)); + EXPECT_FALSE(input.WasKeyReleased(keys.generic)); + EXPECT_TRUE(input.WasKeyReleased(keys.left)); + EXPECT_TRUE(input.IsKeyDown(keys.right)); + + input.HandleMessage(WM_KEYUP, keys.right, 0); + EXPECT_FALSE(input.IsKeyDown(keys.generic)); + RunFrameInputStep(input); + EXPECT_FALSE(input.IsFrameKeyDown(keys.generic)); + EXPECT_TRUE(input.WasKeyReleased(keys.generic)); + EXPECT_TRUE(input.WasKeyReleased(keys.right)); + } +} + +TEST(InputFrameEdgesReal_Win32HostNormalizesModifierSidesAndSystemKeys) +{ + const std::string source = ReadWin32InputHostSource(); + ASSERT_FALSE(source.empty()); + + EXPECT_TRUE(source.find("case WM_SYSKEYDOWN:") != std::string::npos); + EXPECT_TRUE(source.find("case WM_SYSKEYUP:") != std::string::npos); + EXPECT_TRUE(source.find("MapVirtualKeyW(scanCode, MAPVK_VSC_TO_VK_EX)") != std::string::npos); + EXPECT_TRUE(source.find("(static_cast(lParam) & 0x01000000u) != 0") != std::string::npos); + EXPECT_TRUE(source.find("scanCode |= 0xE000u;") != std::string::npos); + EXPECT_TRUE(source.find("mappedKey == VK_LSHIFT || mappedKey == VK_RSHIFT") != std::string::npos); + EXPECT_TRUE(source.find("mappedKey == VK_LCONTROL || mappedKey == VK_RCONTROL") != std::string::npos); + EXPECT_TRUE(source.find("mappedKey == VK_LMENU || mappedKey == VK_RMENU") != std::string::npos); + EXPECT_TRUE(source.find("(msg == WM_KEYDOWN || msg == WM_SYSKEYDOWN) ? WM_KEYDOWN : WM_KEYUP") != + std::string::npos); + EXPECT_TRUE(source.find("NormalizeWin32ModifierVirtualKey(wParam, lParam)") != std::string::npos); +} diff --git a/Tests/TestLegacyGameObjectMaterial.cpp b/Tests/TestLegacyGameObjectMaterial.cpp index c85b1f341..76ea3cc2e 100644 --- a/Tests/TestLegacyGameObjectMaterial.cpp +++ b/Tests/TestLegacyGameObjectMaterial.cpp @@ -136,11 +136,11 @@ TEST(LegacyGameObject_AuthoredMaterialChangesBasicDrawBinding) } } - std::error_code relativeError; - const auto relativeRoot = std::filesystem::relative(std::filesystem::path(projectRoot), - std::filesystem::current_path(), relativeError); - EXPECT_TRUE(!relativeError && !relativeRoot.empty() && !relativeRoot.is_absolute()); - if (!relativeError && !relativeRoot.empty() && !relativeRoot.is_absolute()) + // A relative project root must be rejected even when the test build and + // source trees reside on different Windows drives. + const std::filesystem::path relativeRoot("Tests/Fixtures/LegacyBasicMaterial"); + EXPECT_TRUE(!relativeRoot.empty() && !relativeRoot.is_absolute()); + if (!relativeRoot.empty() && !relativeRoot.is_absolute()) { const std::u8string relativeUtf8 = relativeRoot.generic_u8string(); const std::string relativeBytes(reinterpret_cast(relativeUtf8.data()), diff --git a/Tests/TestMOD390VisualScriptGraphsReal.cpp b/Tests/TestMOD390VisualScriptGraphsReal.cpp index 5078a271d..b46908b63 100644 --- a/Tests/TestMOD390VisualScriptGraphsReal.cpp +++ b/Tests/TestMOD390VisualScriptGraphsReal.cpp @@ -27,6 +27,7 @@ #include "../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoRuntime.h" #include "Engine/Scripting/VisualScriptCompiler.h" #include "Engine/Scripting/VisualScriptGraphIO.h" +#include "Engine/Scripting/VisualScriptEmitter.h" #ifdef SPARK_ANGELSCRIPT_SUPPORT #include "Engine/ECS/Components.h" @@ -386,6 +387,16 @@ TEST(VisualScriptGraphs_CompilerRejectsCyclesAndNonLiteralDefaults) ASSERT_FALSE(result.errors.empty()); EXPECT_STR_CONTAINS(result.errors.front(), "Data cycle"); + // Sequence ignores data values, but reachable malformed dependencies still + // diagnose their cycle. Unreachable dependencies must remain unvalidated. + dataCycle.nodes[1].type = ScriptNodeType::Sequence; + result = VisualScriptCompiler::Compile(dataCycle); + EXPECT_FALSE(result.success); + ASSERT_FALSE(result.errors.empty()); + EXPECT_STR_CONTAINS(result.errors.front(), "Data cycle"); + dataCycle.connections.erase(dataCycle.connections.begin()); + EXPECT_TRUE(VisualScriptCompiler::Compile(dataCycle).success); + // A variable default is spliced after '=', so anything but a literal of its type is refused. VisualScriptGraph injected; injected.className = "Injected"; @@ -450,6 +461,38 @@ TEST(VisualScriptGraphs_FunctionBodyEmitsEachStatementOnce) EXPECT_STR_CONTAINS(result.errors.front(), "no entry statement"); } +TEST(VisualScriptGraphs_IndexedTopologyPreservesRepeatedChains) +{ + using Spark::Scripting::Detail::EmitBudget; + using Spark::Scripting::Detail::VisualScriptEmitter; + const auto exec = [] { return Pin(PinKind::Execution); }; + VisualScriptGraph graph; + graph.nodes = {Node(1, ScriptNodeType::OnStart, {}, {exec()}), + Node(2, ScriptNodeType::Sequence, {exec()}, {exec(), exec()}), + Node(3, ScriptNodeType::PrintMessage, {exec(), Pin(PinKind::String, 0, "A")}, {exec()}), + Node(4, ScriptNodeType::PrintMessage, {exec(), Pin(PinKind::String, 0, "B")}, {exec()}), + Node(1, ScriptNodeType::OnStart, {}, {Pin(PinKind::Float), exec()})}; + graph.connections = {{1, 0, 2, 0}, {2, 0, 3, 0}, {3, 0, 4, 0}, {2, 1, 3, 0}}; + std::vector errors; + EmitBudget budget; + VisualScriptEmitter emitter(graph, false, errors, budget); + // Node lookup remains ID-first, while pin metadata belongs to the exact + // borrowed node, including hand-built duplicate-ID event declarations. + EXPECT_TRUE(emitter.FindNode(1) == &graph.nodes.front()); + EXPECT_TRUE(emitter.ExecOutputPins(graph.nodes.back()) == std::vector{1}); + std::string code; + emitter.EmitPinChains(graph.nodes.front(), 0, "", code); + const std::string expected = "print(\"A\");\nprint(\"B\");\nprint(\"A\");\nprint(\"B\");\n"; + EXPECT_EQ(code, expected); + EXPECT_TRUE(errors.empty()); + EXPECT_EQ(budget.steps, size_t{5}); + // Every completed nested chain releases only its own active path suffix. + emitter.EmitPinChains(graph.nodes.front(), 0, "", code); + EXPECT_EQ(code, expected + expected); + EXPECT_TRUE(errors.empty()); + EXPECT_EQ(budget.steps, size_t{10}); +} + TEST(VisualScriptGraphs_HostileDiamondFailsInBoundedTime) { // 48 layers of two Sequence nodes, each wired to both nodes of the next layer: diff --git a/Tests/TestModuleLifecycleReal.cpp b/Tests/TestModuleLifecycleReal.cpp index 02767dcfb..3912479db 100644 --- a/Tests/TestModuleLifecycleReal.cpp +++ b/Tests/TestModuleLifecycleReal.cpp @@ -625,6 +625,21 @@ TEST(ModuleLifecycleRecord_LibraryTargetNameDropsPlatformAffixes) #endif } +TEST(ModuleLifecycleRecord_MissingOrAmbiguousGameCannotPublishSingleGameProof) +{ + ModuleManager::LifecycleEvidence evidence; + EXPECT_EQ(evidence.FindGameModule(), nullptr); + ModuleManager::ModuleLifecycleRecord first; + first.kind = Spark::ModuleKind::Game; + first.libraryPath = "SparkGeneratedGame.dll"; + evidence.modules.push_back(first); + ASSERT_NE(evidence.FindGameModule(), nullptr); + evidence.modules.push_back(first); + EXPECT_EQ(evidence.FindGameModule(), nullptr); + evidence.modules[0].kind = Spark::ModuleKind::Addon; + EXPECT_EQ(evidence.FindGameModule(), &evidence.modules[1]); +} + TEST(ModuleLifecycleRecord_FormatsTheHostRecordByteCompatibly) { ModuleManager::ModuleLifecycleRecord record; diff --git a/Tests/TestPLT210RuntimeProcessesReal.cpp b/Tests/TestPLT210RuntimeProcessesReal.cpp index e0d5f81d0..34d072a89 100644 --- a/Tests/TestPLT210RuntimeProcessesReal.cpp +++ b/Tests/TestPLT210RuntimeProcessesReal.cpp @@ -115,7 +115,8 @@ TEST(PLT210_SparkConsole_EnginePipeStdoutCarriesOnlyCommands) for (int i = 0; i < 5; ++i) launched->WriteStdin("[INFO] [Core] PLT210 engine log line " + std::to_string(i) + "\n"); - // Let the console render several prompt cycles (it redraws every 100 ms). + // Leave the console idle across several 100 ms polls: those polls must not + // redraw the prompt or contaminate the command channel. std::this_thread::sleep_for(std::chrono::milliseconds(600)); launched->CloseStdin(); if (!launched->WaitForExit(std::chrono::milliseconds(2000))) @@ -133,6 +134,12 @@ TEST(PLT210_SparkConsole_EnginePipeStdoutCarriesOnlyCommands) EXPECT_EQ(stdoutText, std::string()); // The logs were received and displayed on the human-facing stream instead. EXPECT_STR_CONTAINS(stderrText, "PLT210 engine log line 4"); + size_t promptCount = 0; + for (size_t position = 0; (position = stderrText.find("> ", position)) != std::string::npos; position += 2) + { + ++promptCount; + } + EXPECT_EQ(promptCount, size_t{1}); } #endif // __linux__ diff --git a/Tests/TestPrototypeModuleKitReal.cpp b/Tests/TestPrototypeModuleKitReal.cpp index 947719bc7..7b466576b 100644 --- a/Tests/TestPrototypeModuleKitReal.cpp +++ b/Tests/TestPrototypeModuleKitReal.cpp @@ -420,6 +420,12 @@ TEST(PrototypeModuleKit_StateRulesRegisterThroughSdkContext) detector.Shutdown(); EXPECT_FALSE(detector.HasRule("Kit.Early")); EXPECT_TRUE(rules->AddRule("Kit.Early", "Kit", Spark::StateViolationSeverity::Error, probeCheck(probe, runs))); + // Public category cleanup must also release an early callback before host startup. + rules->RemoveRulesByCategory("Kit"); + rules->RemoveRulesByCategory("Kit"); + EXPECT_FALSE(detector.HasRule("Kit.Early")); + EXPECT_EQ(detector.GetRuleCount(), rulesBeforeStart); + EXPECT_TRUE(rules->AddRule("Kit.Early", "Kit", Spark::StateViolationSeverity::Error, probeCheck(probe, runs))); detector.Initialize(); EXPECT_TRUE(detector.HasRule("Kit.Early")); detector.SetWorld(&world); diff --git a/Tests/TestReliableChannel.cpp b/Tests/TestReliableChannel.cpp index 4e0e4115b..822734d8b 100644 --- a/Tests/TestReliableChannel.cpp +++ b/Tests/TestReliableChannel.cpp @@ -647,7 +647,8 @@ TEST(ReliablePerPeer_TwoClientsSameSequences_BothDispatched) { auto& nm = Net::NetworkManager::GetInstance(); nm.Shutdown(); - EXPECT_TRUE(nm.StartServer(28451, 8)); + EXPECT_TRUE(nm.StartServer(0, 8)); + EXPECT_NE(nm.GetBoundPort(), static_cast(0)); std::unordered_map receivedBySender; nm.RegisterHandler(Net::MessageType::ChatMessage, @@ -655,8 +656,8 @@ TEST(ReliablePerPeer_TwoClientsSameSequences_BothDispatched) RawUdpClient clientA; RawUdpClient clientB; - EXPECT_TRUE(clientA.Open(28451)); - EXPECT_TRUE(clientB.Open(28451)); + EXPECT_TRUE(clientA.Open(nm.GetBoundPort())); + EXPECT_TRUE(clientB.Open(nm.GetBoundPort())); EXPECT_TRUE(clientA.Connect(nm, "ClientA")); EXPECT_TRUE(clientB.Connect(nm, "ClientB")); EXPECT_NE(clientA.GetClientID(), clientB.GetClientID()); @@ -684,7 +685,8 @@ TEST(ReliablePerPeer_OrderedChannelIndependentPerPeer) { auto& nm = Net::NetworkManager::GetInstance(); nm.Shutdown(); - EXPECT_TRUE(nm.StartServer(28452, 8)); + EXPECT_TRUE(nm.StartServer(0, 8)); + EXPECT_NE(nm.GetBoundPort(), static_cast(0)); std::unordered_map> deliveredBySender; nm.RegisterHandler(Net::MessageType::UserDefined, [&deliveredBySender](const Net::NetworkMessage& msg) @@ -692,8 +694,8 @@ TEST(ReliablePerPeer_OrderedChannelIndependentPerPeer) RawUdpClient clientA; RawUdpClient clientB; - EXPECT_TRUE(clientA.Open(28452)); - EXPECT_TRUE(clientB.Open(28452)); + EXPECT_TRUE(clientA.Open(nm.GetBoundPort())); + EXPECT_TRUE(clientB.Open(nm.GetBoundPort())); EXPECT_TRUE(clientA.Connect(nm, "ClientA")); EXPECT_TRUE(clientB.Connect(nm, "ClientB")); @@ -730,12 +732,13 @@ TEST(ReliablePerPeer_AckFromOnePeerDoesNotClearAnothers) { auto& nm = Net::NetworkManager::GetInstance(); nm.Shutdown(); - EXPECT_TRUE(nm.StartServer(28453, 8)); + EXPECT_TRUE(nm.StartServer(0, 8)); + EXPECT_NE(nm.GetBoundPort(), static_cast(0)); RawUdpClient clientA; RawUdpClient clientB; - EXPECT_TRUE(clientA.Open(28453)); - EXPECT_TRUE(clientB.Open(28453)); + EXPECT_TRUE(clientA.Open(nm.GetBoundPort())); + EXPECT_TRUE(clientB.Open(nm.GetBoundPort())); EXPECT_TRUE(clientA.Connect(nm, "ClientA")); EXPECT_TRUE(clientB.Connect(nm, "ClientB")); @@ -784,10 +787,11 @@ TEST(NetworkWire_MaxPayload_LoopbackSendPreservesWholeDatagram) { auto& nm = Net::NetworkManager::GetInstance(); nm.Shutdown(); - EXPECT_TRUE(nm.StartServer(28454, 2)); + EXPECT_TRUE(nm.StartServer(0, 2)); + EXPECT_NE(nm.GetBoundPort(), static_cast(0)); RawUdpClient client; - EXPECT_TRUE(client.Open(28454)); + EXPECT_TRUE(client.Open(nm.GetBoundPort())); EXPECT_TRUE(client.Connect(nm, "MaxPayloadClient")); Net::NetworkMessage outbound; @@ -826,10 +830,11 @@ TEST(NetworkWire_MaxPlusOneReliableRejectedBeforeSequenceAllocation) { auto& nm = Net::NetworkManager::GetInstance(); nm.Shutdown(); - EXPECT_TRUE(nm.StartServer(28455, 2)); + EXPECT_TRUE(nm.StartServer(0, 2)); + EXPECT_NE(nm.GetBoundPort(), static_cast(0)); RawUdpClient client; - EXPECT_TRUE(client.Open(28455)); + EXPECT_TRUE(client.Open(nm.GetBoundPort())); EXPECT_TRUE(client.Connect(nm, "OversizeClient")); const uint64_t droppedBefore = nm.GetStats().packetsDropped; @@ -874,10 +879,11 @@ TEST(NetworkWire_5KiBReliableLoopbackReceiveIsNotTruncated) { auto& nm = Net::NetworkManager::GetInstance(); nm.Shutdown(); - EXPECT_TRUE(nm.StartServer(28456, 2)); + EXPECT_TRUE(nm.StartServer(0, 2)); + EXPECT_NE(nm.GetBoundPort(), static_cast(0)); RawUdpClient client; - EXPECT_TRUE(client.Open(28456)); + EXPECT_TRUE(client.Open(nm.GetBoundPort())); EXPECT_TRUE(client.Connect(nm, "FiveKiBClient")); std::vector expected(5 * 1024); @@ -900,10 +906,11 @@ TEST(NetworkWire_SensitiveOwnershipIsLocalAndHighChannelBitsAreRejected) { auto& nm = Net::NetworkManager::GetInstance(); nm.Shutdown(); - EXPECT_TRUE(nm.StartServer(28457, 2)); + EXPECT_TRUE(nm.StartServer(0, 2)); + EXPECT_NE(nm.GetBoundPort(), static_cast(0)); RawUdpClient client; - EXPECT_TRUE(client.Open(28457)); + EXPECT_TRUE(client.Open(nm.GetBoundPort())); EXPECT_TRUE(client.Connect(nm, "SensitiveOwnershipClient")); bool serverSawSensitive = false; diff --git a/Tests/TestSceneManagerReflectedReal.cpp b/Tests/TestSceneManagerReflectedReal.cpp index 74bec5b60..f7ceed8e3 100644 --- a/Tests/TestSceneManagerReflectedReal.cpp +++ b/Tests/TestSceneManagerReflectedReal.cpp @@ -1,12 +1,17 @@ #include "TestFramework.h" #include "Engine/ECS/Components.h" +#include "Engine/Events/EventSystem.h" +#include "Game/GameMechanics.h" #include "SceneManager/ReflectedSceneSerializer.h" #include "SceneManager/SceneManager.h" +#include "Utils/EventBus.h" #include #include +#include #include #include +#include namespace { @@ -48,6 +53,26 @@ namespace void Write(const std::string& text) const { std::ofstream(scene, std::ios::binary) << text; } + std::string WithSpawns(int count = 2) const + { + World world; + ASSERT_TRUE(Spark::DeserializeInto(world, original, Spark::SceneDeserializeMode::StrictRecovery)); + for (int i = 0; i < count; ++i) + { + auto entity = world.CreateEntity("AuthoredSpawn" + std::to_string(i)); + auto& transform = world.AddComponent(entity); + transform.position = {7.0f + i, 11.0f, -13.0f}; + transform.rotation = {10.0f, 90.0f, 0.0f}; + auto& spawn = world.AddComponent(entity); + spawn.spawnRadius = 0.0f; + spawn.respawnDelay = 0.0f; + spawn.priority = i; + } + std::string result; + ASSERT_TRUE(Spark::TrySerializeWorld(world, result)); + return result; + } + void ExpectRejectedWithRollback(const std::string& text) { SceneManager manager(nullptr, nullptr); @@ -93,7 +118,7 @@ TEST(SceneManager_ReflectedGameplayRejectsUnknownComponent) { ReflectedGameplayFixture fixture; auto document = nlohmann::json::parse(fixture.original); - document["entities"][0]["components"].push_back({{"type", "UnknownGameplay"}, {"fields", {}}}); + document["entities"][std::size_t{0}]["components"].push_back({{"type", "UnknownGameplay"}, {"fields", {}}}); fixture.ExpectRejectedWithRollback(document.dump()); } @@ -113,7 +138,7 @@ TEST(SceneManager_ReflectedGameplayRejectsHierarchy) { ReflectedGameplayFixture fixture; auto document = nlohmann::json::parse(fixture.original); - document["entities"][1]["parent"] = document["entities"][0]["id"]; + document["entities"][1]["parent"] = document["entities"][std::size_t{0}]["id"]; fixture.ExpectRejectedWithRollback(document.dump()); } @@ -127,3 +152,141 @@ TEST(SceneManager_ReflectedGameplayRejectsMaterialLoss) component["fields"]["materialPath"] = "Assets/Materials/authored.json"; fixture.ExpectRejectedWithRollback(document.dump()); } + +TEST(SceneManager_ReflectedGameplaySpawnSelectionAndRespawnUseAuthoredPoint) +{ + ReflectedGameplayFixture fixture; + fixture.Write(fixture.WithSpawns()); + SceneManager scene(nullptr, nullptr); + ASSERT_TRUE(scene.LoadScene(fixture.scene.wstring())); + Spark::RespawnSystem respawn; + ASSERT_TRUE(respawn.Initialize()); + ASSERT_EQ(respawn.BindSpawnPoints(Spark::RespawnSystem::CollectAuthoredSpawnPoints(scene)), 2); + // StartWaves (F11's production action) uses this exact selector. This is a + // real-class selection/event test, not keyboard or rendered-game evidence. + const auto selected = respawn.GetBestSpawnPoint(-1); + EXPECT_EQ(selected.name, std::string("AuthoredSpawn1")); + EXPECT_EQ(selected.position.x, 8.0f); + EXPECT_EQ(selected.position.y, 11.0f); + EXPECT_EQ(selected.position.z, -13.0f); + EXPECT_EQ(selected.rotation.y, 90.0f); + + Spark::EventBus bus; + Spark::PlayerRespawnEvent event{}; + int published = 0; + auto subscription = bus.Subscribe( + [&](const Spark::PlayerRespawnEvent& value) + { + event = value; + ++published; + }); + respawn.SetEventBus(&bus); + respawn.OnPlayerDeath("Enemy", "Rifle", false); + const float delay = respawn.GetRespawnDelay(); + EXPECT_TRUE(delay > 0.0f); // Point cooldown=0 must not override the death timer. + respawn.Update(delay / 2.0f); + EXPECT_EQ(published, 0); + respawn.Update(delay); + EXPECT_EQ(published, 1); + EXPECT_EQ(event.spawnX, selected.position.x); + EXPECT_EQ(event.spawnY, selected.position.y); + EXPECT_EQ(event.spawnZ, selected.position.z); + ASSERT_TRUE(respawn.HasLastRespawnPoint()); + EXPECT_EQ(respawn.GetLastRespawnPoint().rotation.y, selected.rotation.y); + auto tied = Spark::RespawnSystem::CollectAuthoredSpawnPoints(scene); + for (auto& spawn : tied) + spawn.priority = 4; + ASSERT_EQ(respawn.BindSpawnPoints(tied), 2); + EXPECT_EQ(respawn.GetBestSpawnPoint(-1).name, tied.front().name); +} + +TEST(SceneManager_ReflectedGameplayRejectsUnsupportedSpawnSemantics) +{ + ReflectedGameplayFixture fixture; + const std::pair unsupported[] = { + {"spawnTag", "wave_spawn"}, {"enabled", "false"}, {"teamID", "1"}, + {"spawnRadius", "1"}, {"respawnDelay", "5"}, {"maxConcurrent", "1"}}; + for (const auto& [field, value] : unsupported) + { + fixture.Write(fixture.original); + auto document = nlohmann::json::parse(fixture.WithSpawns(1)); + for (auto& entity : document["entities"]) + for (auto& component : entity["components"]) + if (component["type"] == "SpawnPointComponent") + component["fields"][field] = value; + fixture.ExpectRejectedWithRollback(document.dump()); + } + // Missing fields cannot silently become supported zero-radius/cooldown values. + fixture.Write(fixture.original); + auto omitted = nlohmann::json::parse(fixture.WithSpawns(1)); + for (auto& entity : omitted["entities"]) + for (auto& component : entity["components"]) + if (component["type"] == "SpawnPointComponent") + { + auto fields = nlohmann::json::object(); + for (const auto& [key, value] : component["fields"].items()) + if (key != "spawnRadius") + fields[key] = value; + component["fields"] = fields; + } + fixture.ExpectRejectedWithRollback(omitted.dump()); +} + +TEST(SceneManager_ReflectedGameplayRejectsSpawnTruncationAndMeshlessScene) +{ + ReflectedGameplayFixture fixture; + fixture.Write(fixture.WithSpawns(32)); + SceneManager boundary(nullptr, nullptr); + ASSERT_TRUE(boundary.LoadScene(fixture.scene.wstring())); + Spark::RespawnSystem respawn; + ASSERT_TRUE(respawn.Initialize()); + EXPECT_EQ(respawn.BindSpawnPoints(Spark::RespawnSystem::CollectAuthoredSpawnPoints(boundary)), 32); + fixture.Write(fixture.original); + fixture.ExpectRejectedWithRollback(fixture.WithSpawns(33)); + fixture.Write(fixture.original); + auto document = nlohmann::json::parse(fixture.WithSpawns(1)); + auto meshlessEntities = nlohmann::json::array(); + for (const auto& entity : document["entities"]) + { + bool mesh = false; + for (const auto& component : entity["components"]) + mesh = mesh || component["type"] == "MeshRenderer"; + if (!mesh) + meshlessEntities.push_back(entity); + } + ASSERT_TRUE(meshlessEntities.size() < document["entities"].size()); + document["entities"] = meshlessEntities; + fixture.ExpectRejectedWithRollback(document.dump()); +} + +TEST(SceneManager_ReflectedGameplayRejectsSpawnShapeAndUnexpectedFields) +{ + ReflectedGameplayFixture fixture; + for (int variant = 0; variant < 4; ++variant) + { + World world; + ASSERT_TRUE(Spark::DeserializeInto(world, fixture.WithSpawns(1), Spark::SceneDeserializeMode::StrictRecovery)); + for (auto entity : world.GetEntitiesWith()) + { + if (variant == 0) + world.GetComponent(entity)->scale = {2, 1, 1}; + else if (variant == 1) + world.GetComponent(entity)->rotation.x = 90.0f; + else if (variant == 2) + world.AddComponent(entity).meshPath = "Assets/Meshes/triangle.obj"; + else + world.AddComponent(entity).isMainCamera = true; + } + std::string serialized; + ASSERT_TRUE(Spark::TrySerializeWorld(world, serialized)); + fixture.Write(fixture.original); + fixture.ExpectRejectedWithRollback(serialized); + } + fixture.Write(fixture.original); + auto runtimeField = nlohmann::json::parse(fixture.WithSpawns(1)); + for (auto& entity : runtimeField["entities"]) + for (auto& component : entity["components"]) + if (component["type"] == "SpawnPointComponent") + component["fields"]["lastUsedTime"] = "0"; + fixture.ExpectRejectedWithRollback(runtimeField.dump()); +} diff --git a/Tests/TestSdkWeatherService.cpp b/Tests/TestSdkWeatherService.cpp new file mode 100644 index 000000000..020a8ac2d --- /dev/null +++ b/Tests/TestSdkWeatherService.cpp @@ -0,0 +1,92 @@ +#include "TestFramework.h" + +#include "Core/EngineContext.h" +#include "Graphics/WeatherSystem.h" +#include + +#include + +TEST(SdkWeatherService_AllPresetsReachHost) +{ + EngineContext context; + Spark::WeatherSystem weather; + context.SetWeather(&weather); + auto* service = context.GetWeatherService(); + ASSERT_TRUE(service != nullptr); + const Spark::WeatherPreset presets[] = {Spark::WeatherPreset::Clear, Spark::WeatherPreset::Rain, + Spark::WeatherPreset::Snow, Spark::WeatherPreset::Fog, + Spark::WeatherPreset::Storm}; + const Spark::WeatherType types[] = {Spark::WeatherType::Clear, Spark::WeatherType::Rain, Spark::WeatherType::Snow, + Spark::WeatherType::Fog, Spark::WeatherType::Storm}; + for (int i = 0; i < 5; ++i) + { + ASSERT_TRUE(service->SetWeather(presets[i], 0.7f, 2.0f)); + EXPECT_EQ(static_cast(weather.GetTargetState().type), static_cast(types[i])); + EXPECT_NEAR(weather.GetTargetState().intensity, 0.7f, 1.0e-6f); + weather.Update(1.0f); + EXPECT_TRUE(weather.IsTransitioning()); + weather.Update(1.0f); + EXPECT_FALSE(weather.IsTransitioning()); + EXPECT_EQ(static_cast(weather.GetCurrentState().type), static_cast(types[i])); + } +} + +TEST(SdkWeatherService_RetainedServiceTracksRegistryLifetime) +{ + EngineContext context; + EXPECT_TRUE(context.GetWeatherService() == nullptr); + Spark::WeatherSystem first; + Spark::WeatherSystem second; + context.SetWeather(&first); + auto* service = context.GetWeatherService(); + ASSERT_TRUE(service != nullptr); + context.SetWeather(nullptr); + EXPECT_TRUE(context.GetWeatherService() == nullptr); + EXPECT_FALSE(service->SetWeather(Spark::WeatherPreset::Storm, 1.0f, 1.0f)); + EXPECT_FALSE(first.IsTransitioning()); + context.RegisterSystem(&second); + EXPECT_TRUE(context.GetWeatherService() == service); + ASSERT_TRUE(service->SetWeather(Spark::WeatherPreset::Rain, 0.3f, 1.0f)); + EXPECT_FALSE(first.IsTransitioning()); + EXPECT_EQ(static_cast(second.GetTargetState().type), static_cast(Spark::WeatherType::Rain)); +} + +TEST(SdkWeatherService_InvalidCommandsDoNotReplacePendingTransition) +{ + EngineContext context; + Spark::WeatherSystem weather; + context.SetWeather(&weather); + auto* service = context.GetWeatherService(); + ASSERT_TRUE(service != nullptr); + ASSERT_TRUE(service->SetWeather(Spark::WeatherPreset::Snow, 0.4f, 2.0f)); + weather.Update(1.0f); + EXPECT_FALSE(service->SetWeather(static_cast(99), 1.0f, 1.0f)); + EXPECT_FALSE(service->SetWeather(Spark::WeatherPreset::Storm, std::numeric_limits::quiet_NaN(), 1.0f)); + EXPECT_FALSE(service->SetWeather(Spark::WeatherPreset::Storm, 1.0f, std::numeric_limits::infinity())); + EXPECT_FALSE(service->SetWeather(Spark::WeatherPreset::Storm, -std::numeric_limits::infinity(), 1.0f)); + EXPECT_EQ(static_cast(weather.GetTargetState().type), static_cast(Spark::WeatherType::Snow)); + EXPECT_NEAR(weather.GetTargetState().intensity, 0.4f, 1.0e-6f); + weather.Update(1.0f); + EXPECT_FALSE(weather.IsTransitioning()); + EXPECT_EQ(static_cast(weather.GetCurrentState().type), static_cast(Spark::WeatherType::Snow)); +} + +TEST(SdkWeatherService_PreservesHostFiniteScalarSemantics) +{ + EngineContext context; + Spark::WeatherSystem weather; + context.SetWeather(&weather); + auto* service = context.GetWeatherService(); + ASSERT_TRUE(service != nullptr); + ASSERT_TRUE(service->SetWeather(Spark::WeatherPreset::Rain, -1.0f, -2.0f)); + EXPECT_NEAR(weather.GetTargetState().intensity, Spark::GetWeatherPreset(Spark::WeatherType::Rain).intensity, + 1.0e-6f); + weather.Update(0.005f); + EXPECT_TRUE(weather.IsTransitioning()); + weather.Update(0.005f); + EXPECT_FALSE(weather.IsTransitioning()); + ASSERT_TRUE(service->SetWeather(Spark::WeatherPreset::Rain, 2.0f, 0.0f)); + EXPECT_NEAR(weather.GetTargetState().intensity, 1.0f, 1.0e-6f); + ASSERT_TRUE(service->SetWeather(Spark::WeatherPreset::Rain, 0.0f, 0.0f)); + EXPECT_NEAR(weather.GetTargetState().intensity, 0.0f, 1.0e-6f); +} diff --git a/Tests/TestSparkPak.cpp b/Tests/TestSparkPak.cpp index 8b169795e..7fa144445 100644 --- a/Tests/TestSparkPak.cpp +++ b/Tests/TestSparkPak.cpp @@ -16,6 +16,12 @@ #include #include +#if defined(_WIN32) +#include +#else +#include +#endif + // ============================================================================ // Standalone reimplementation of SparkPak core types for test isolation // ============================================================================ @@ -255,9 +261,19 @@ namespace std::unordered_map m_entries; }; + std::filesystem::path TempRoot() + { +#if defined(_WIN32) + const auto processId = static_cast(::_getpid()); +#else + const auto processId = static_cast(::getpid()); +#endif + return std::filesystem::temp_directory_path() / ("sparkpak_tests_" + std::to_string(processId)); + } + std::string TempPath(const std::string& name) { - auto dir = std::filesystem::temp_directory_path() / "sparkpak_tests"; + const auto dir = TempRoot(); std::filesystem::create_directories(dir); return (dir / name).string(); } @@ -265,7 +281,7 @@ namespace void Cleanup() { std::error_code ec; - std::filesystem::remove_all(std::filesystem::temp_directory_path() / "sparkpak_tests", ec); + std::filesystem::remove_all(TempRoot(), ec); } } // anonymous namespace diff --git a/Tests/TestTF120Travel.cpp b/Tests/TestTF120Travel.cpp index a5cb32702..04d6e35a4 100644 --- a/Tests/TestTF120Travel.cpp +++ b/Tests/TestTF120Travel.cpp @@ -78,21 +78,8 @@ namespace { static const fs::path root = []() -> fs::path { - fs::path p = fs::current_path(); - for (int i = 0; i < 10; ++i) - { - if (fs::exists(p / "Assets" / "MMOFPS" / "Data" / "continents.json")) - { - return p; - } - const fs::path parent = p.parent_path(); - if (parent.empty() || parent == p) - { - break; - } - p = parent; - } - return {}; + const fs::path source(SPARK_TEST_SOURCE_DIR); + return fs::exists(source / "Assets" / "MMOFPS" / "Data" / "continents.json") ? source : fs::path{}; }(); return root; } diff --git a/Tests/TestTFDataTables.cpp b/Tests/TestTFDataTables.cpp index e024f1f30..5132c2747 100644 --- a/Tests/TestTFDataTables.cpp +++ b/Tests/TestTFDataTables.cpp @@ -44,17 +44,8 @@ namespace { static const fs::path root = []() -> fs::path { - fs::path p = fs::current_path(); - for (int i = 0; i < 10; ++i) - { - if (fs::exists(p / "Assets" / "MMOFPS" / "Data" / "regions.json")) - return p; - const fs::path parent = p.parent_path(); - if (parent.empty() || parent == p) - break; - p = parent; - } - return {}; + const fs::path source(SPARK_TEST_SOURCE_DIR); + return fs::exists(source / "Assets" / "MMOFPS" / "Data" / "regions.json") ? source : fs::path{}; }(); return root; } diff --git a/Tests/TestTFRegionLattice.cpp b/Tests/TestTFRegionLattice.cpp index 3b92c9b34..79b3c2f7f 100644 --- a/Tests/TestTFRegionLattice.cpp +++ b/Tests/TestTFRegionLattice.cpp @@ -66,14 +66,7 @@ namespace { Lattice lat; - fs::path root = fs::current_path(); - for (int i = 0; i < 10 && !fs::exists(root / "Assets/MMOFPS/Data/regions.json"); ++i) - { - const fs::path parent = root.parent_path(); - if (parent.empty() || parent == root) - return lat; - root = parent; - } + const fs::path root(SPARK_TEST_SOURCE_DIR); std::ifstream f(root / "Assets/MMOFPS/Data/regions.json", std::ios::binary); if (!f.is_open()) return lat; diff --git a/Tests/TestTFReplicationRefresh.cpp b/Tests/TestTFReplicationRefresh.cpp new file mode 100644 index 000000000..8d378ff29 --- /dev/null +++ b/Tests/TestTFReplicationRefresh.cpp @@ -0,0 +1,141 @@ +/** @file TestTFReplicationRefresh.cpp @brief Actual sender-cache loss recovery and entity lifetime. */ +#include "TestFramework.h" + +#include "Net/TFRepProtocol.h" +#include "Net/TFReplicationRefresh.h" + +#include +#include + +namespace +{ + struct PawnState + { + Terrafront::QuantPos position; + uint16_t health; + bool operator==(const PawnState&) const = default; + }; + + PawnState StateAt(float x, uint16_t health = 450) + { + const float position[3] = {x, 24.0f, 3744.0f}; + return {Terrafront::QuantPos::From(position), health}; + } +} // namespace + +TEST(TFReplicationRefresh_DroppedFinalUpdateRecoversWhilePawnStaysStationary) +{ + Terrafront::TFReplicationStateCache sender; + constexpr Terrafront::EntityId entity = 42; + const PawnState original = StateAt(296.0f); + const PawnState moved = StateAt(320.0f, 400); + PawnState receiver = original; // reliable Create established identity/state + sender.Remember(entity, original, 0.0); + unsigned int sends = 0; + auto deliver = [&](double clock, const PawnState& state, bool drop) + { + if (sender.ShouldSend(entity, state, clock)) + { + ++sends; + if (!drop) + { + receiver = state; + } + } + }; + + // The final changed snapshot is lost. No later movement can incidentally + // repair it: all subsequent ticks use this identical authoritative state. + deliver(0.25, moved, true); + EXPECT_TRUE(receiver == original); + for (unsigned int tick = 6; tick < 25; ++tick) + { + deliver(static_cast(tick) / Terrafront::kReplicationHz, moved, false); + EXPECT_TRUE(receiver == original); + } + EXPECT_EQ(sends, 1u); + deliver(1.25, moved, false); + EXPECT_TRUE(receiver == moved); + EXPECT_EQ(sends, 2u); +} + +TEST(TFReplicationRefresh_QuietTrafficIsBoundedAndDirtyChangesSendImmediately) +{ + Terrafront::TFReplicationStateCache sender; + constexpr Terrafront::EntityId entity = 43; + const auto initial = StateAt(296.0f); + sender.Remember(entity, initial, 0.0); + unsigned int quietSends = 0; + for (unsigned int tick = 1; tick <= 100; ++tick) + { + if (sender.ShouldSend(entity, initial, static_cast(tick) / Terrafront::kReplicationHz)) + { + ++quietSends; + } + } + EXPECT_EQ(quietSends, 5u); // five seconds, not the full 100-tick update rate + EXPECT_TRUE(sender.ShouldSend(entity, StateAt(300.0f), 5.01)); + EXPECT_TRUE(sender.ShouldSend(entity, StateAt(300.0f, 399), 5.02)); + EXPECT_FALSE(sender.ShouldSend(entity, StateAt(300.0f, 399), 5.03)); +} + +TEST(TFReplicationRefresh_IndependentEntitiesCannotPostponeEachOthersRecovery) +{ + Terrafront::TFReplicationStateCache sender; + const auto stationary = StateAt(296.0f); + sender.Remember(44, stationary, 0.0); + sender.Remember(45, stationary, 0.5); + EXPECT_TRUE(sender.ShouldSend(44, stationary, 1.0)); + EXPECT_FALSE(sender.ShouldSend(45, stationary, 1.0)); + EXPECT_TRUE(sender.ShouldSend(45, stationary, 1.5)); +} + +TEST(TFReplicationRefresh_DespawnErasesStateBeforeEntityIdReuse) +{ + Terrafront::TFReplicationStateCache sender; + const auto state = StateAt(296.0f); + sender.Remember(46, state, 10.0); + sender.Remember(47, state, 10.0); + sender.Erase(46); + EXPECT_EQ(sender.Size(), std::size_t{1}); + EXPECT_FALSE(sender.Entries().contains(46)); + EXPECT_TRUE(sender.ShouldSend(46, state, 10.01)); + EXPECT_FALSE(sender.ShouldSend(47, state, 10.01)); +} + +TEST(TFReplicationRefresh_ServerDepartureClearsEveryEntityRefreshDeadline) +{ + Terrafront::TFReplicationStateCache sender; + const auto state = StateAt(296.0f); + sender.Remember(48, state, 20.0); + sender.Remember(49, state, 20.0); + sender.Clear(); // actual server-role departure and shutdown use this path + EXPECT_TRUE(sender.Empty()); + EXPECT_EQ(sender.Size(), std::size_t{0}); + EXPECT_TRUE(sender.ShouldSend(48, state, 0.0)); + EXPECT_TRUE(sender.ShouldSend(49, state, 0.0)); +} + +TEST(TFReplicationRefresh_ClockRestartCannotSuppressStateBehindOldDeadline) +{ + Terrafront::TFReplicationStateCache sender; + const auto state = StateAt(296.0f); + sender.Remember(50, state, 100.0); + EXPECT_TRUE(sender.ShouldSend(50, state, 0.0)); + EXPECT_FALSE(sender.ShouldSend(50, state, 0.5)); + EXPECT_TRUE(sender.ShouldSend(50, state, 1.0)); +} + +TEST(TFReplicationRefresh_NonFiniteClocksSendAndFiniteTimeRestoresRecovery) +{ + Terrafront::TFReplicationStateCache sender; + const auto state = StateAt(296.0f); + for (double invalid : {std::numeric_limits::quiet_NaN(), std::numeric_limits::infinity()}) + { + sender.Remember(51, state, 10.0); + EXPECT_TRUE(sender.ShouldSend(51, state, invalid)); + EXPECT_TRUE(sender.ShouldSend(51, state, 0.0)); + EXPECT_FALSE(sender.ShouldSend(51, state, 0.5)); + EXPECT_TRUE(sender.ShouldSend(51, state, 1.0)); + } +} diff --git a/Tests/TestThirdPartyIntegration.cpp b/Tests/TestThirdPartyIntegration.cpp index 1aae93604..69b7b0f7a 100644 --- a/Tests/TestThirdPartyIntegration.cpp +++ b/Tests/TestThirdPartyIntegration.cpp @@ -11,6 +11,12 @@ #include #include +#if defined(_WIN32) +#include +#else +#include +#endif + // ============================================================================ // stb_image integration tests // ============================================================================ @@ -54,6 +60,16 @@ TEST(StbImage_IsHdr_NonExistent) // boundary for texture content. namespace { + std::filesystem::path AssetSecTempPath(const char* name) + { +#if defined(_WIN32) + const auto processId = static_cast(::_getpid()); +#else + const auto processId = static_cast(::getpid()); +#endif + return std::filesystem::temp_directory_path() / ("spark_assetsec_" + std::to_string(processId) + "_" + name); + } + void PutLE32(std::vector& bytes, size_t offset, uint32_t value) { for (int i = 0; i < 4; ++i) @@ -78,7 +94,7 @@ namespace stbi_uc* LoadViaFile(const std::vector& bytes, const char* name, int& w, int& h, int& comp) { - const auto path = (std::filesystem::temp_directory_path() / name).string(); + const auto path = AssetSecTempPath(name).string(); { std::ofstream out(path, std::ios::binary | std::ios::trunc); out.write(reinterpret_cast(bytes.data()), static_cast(bytes.size())); diff --git a/Tests/Tools/run_crash_symbolication_canary.py b/Tests/Tools/run_crash_symbolication_canary.py index ecc544160..9b676036b 100644 --- a/Tests/Tools/run_crash_symbolication_canary.py +++ b/Tests/Tools/run_crash_symbolication_canary.py @@ -19,11 +19,15 @@ watchdog still ends the probe by SIGSEGV within the budget and the async-signal-safe log already holds the symbolic frames; and a stack overflow (``--stack-overflow``) is still reported from the alternate stack. +6. requires full or closed stderr pipes to retain the report and original + fatal signal, including the stalled-report watchdog, without changing the + launcher's shared stderr descriptor flags. """ from __future__ import annotations import argparse +import fcntl import json import os import signal @@ -116,6 +120,81 @@ def check_stack_overflow_report(probe: Path, temp_root: Path) -> None: require("*** SYMBOLIC FRAMES ***" in text, "stack-overflow report has no symbolic-frame section") +def check_unavailable_stderr_report(probe: Path, temp_root: Path, *, closed: bool, stalled: bool) -> None: + """Real fatal reporting cannot depend on a supervisor draining stderr.""" + read_fd, write_fd = os.pipe() + process = None + try: + original_flags = fcntl.fcntl(write_fd, fcntl.F_GETFL) + if closed: + os.close(read_fd) + read_fd = -1 + else: + fcntl.fcntl(write_fd, fcntl.F_SETFL, original_flags | os.O_NONBLOCK) + while True: + try: + os.write(write_fd, b"x" * 4096) + except BlockingIOError: + break + fcntl.fcntl(write_fd, fcntl.F_SETFL, original_flags) + mode = ["--stall-report"] if stalled else [] + started = time.monotonic() + process = subprocess.Popen( + [str(probe), *mode], env=dict(os.environ, TMPDIR=str(temp_root)), cwd=temp_root, + stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=write_fd, + ) + try: + process.wait(timeout=STALLED_REPORT_DEADLINE_SECONDS) + except subprocess.TimeoutExpired as exc: + raise CanaryFailure("unavailable stderr hung fatal reporting past its watchdog budget") from exc + elapsed = time.monotonic() - started + require(process.returncode == -signal.SIGSEGV, + f"unavailable stderr changed fatal termination to {process.returncode} after {elapsed:.1f}s") + require(fcntl.fcntl(write_fd, fcntl.F_GETFL) == original_flags, + "fatal diagnostics changed the launcher's shared stderr descriptor flags") + logs = [path for path in temp_root.glob("spark_crash_*/SymbolicationCanary_*.log") if path.is_file()] + require(len(logs) == 1, f"unavailable stderr left {logs}, expected exactly one report") + text = logs[0].read_text(errors="replace") + for marker in ("Signal : 11 - SIGSEGV", "*** STACK TRACE ***", "*** SYMBOLIC FRAMES ***"): + require(marker in text, f"unavailable stderr prevented the report's {marker!r}") + if stalled: + require(not list(temp_root.glob("spark_crash_*/crash_manifest_*.json")), + "stalled stderr report unexpectedly published its incomplete manifest") + finally: + if process is not None and process.poll() is None: + process.kill() + try: + process.wait(timeout=2) + except subprocess.TimeoutExpired as exc: + raise CanaryFailure("unavailable-stderr probe could not be reaped after termination") from exc + if read_fd >= 0: + os.close(read_fd) + os.close(write_fd) + + +def check_file_stderr_report(probe: Path, temp_root: Path) -> None: + """The independent diagnostic description appends without moving shared stderr.""" + stderr_path = temp_root / "stderr.log" + sentinel = b"existing stderr contents\n" + with stderr_path.open("w+b") as stderr: + stderr.write(sentinel) + stderr.flush() + stderr.seek(0) + original_flags = fcntl.fcntl(stderr.fileno(), fcntl.F_GETFL) + completed = subprocess.run( + [str(probe)], env=dict(os.environ, TMPDIR=str(temp_root)), cwd=temp_root, + stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=stderr, + timeout=PROBE_TIMEOUT_SECONDS, + ) + require(completed.returncode == -signal.SIGSEGV, "file stderr changed the original fatal signal") + require(stderr.tell() == 0, "fatal diagnostics moved the launcher's shared stderr offset") + require(fcntl.fcntl(stderr.fileno(), fcntl.F_GETFL) == original_flags, + "fatal diagnostics changed the launcher's file stderr flags") + output = stderr.read() + require(output.startswith(sentinel) and b"[SPARK ENGINE] CRASH:" in output[len(sentinel):], + "fatal diagnostics failed to append after the existing stderr contents") + + def symbolicate(*arguments: str) -> subprocess.CompletedProcess[str]: return subprocess.run( [sys.executable, str(SYMBOLICATE), *arguments], @@ -208,11 +287,20 @@ def main() -> int: overflow_root = scratch_root / "tmp-overflow" overflow_root.mkdir() check_stack_overflow_report(args.probe, overflow_root) + for closed in (False, True): + for stalled in (False, True): + stderr_root = scratch_root / f"tmp-stderr-{closed}-{stalled}" + stderr_root.mkdir() + check_unavailable_stderr_report(args.probe, stderr_root, closed=closed, stalled=stalled) + file_stderr_root = scratch_root / "tmp-file-stderr" + file_stderr_root.mkdir() + check_file_stderr_report(args.probe, file_stderr_root) print( f"symbolication canary passed: {CRASH_SITE} at {args.probe_source.name}:{expected_line} " f"(build-id {build_id}); wrong build-id and symlinked entry refused; " - "stalled report terminated by its watchdog; stack overflow reported" + "stalled report terminated by its watchdog; stack overflow reported; " + "full and closed stderr pipes preserve reports, fatal signals and descriptor flags" ) return 0 except (CanaryFailure, subprocess.TimeoutExpired, OSError, ValueError, KeyError) as exc: diff --git a/Tests/Tools/test_build_matrix_parity.py b/Tests/Tools/test_build_matrix_parity.py index 90dc31759..5e01b1a97 100644 --- a/Tests/Tools/test_build_matrix_parity.py +++ b/Tests/Tools/test_build_matrix_parity.py @@ -3403,6 +3403,83 @@ def test_reviewed_fuzz_policy_target_is_only_corroborated_for_validation(self) - set(), ) + def test_reviewed_isa_target_requires_exact_source_record_and_windows_floor(self) -> None: + declarations = inventory.extract_cmake_targets() + cache = { + "SPARK_NATIVE_ARCH": "OFF", + "SPARK_TOOLCHAIN_CXX_COMPILER_ID": "MSVC", + "SPARK_TOOLCHAIN_CXX_ARCHITECTURE": "x64", + } + for profile in ("windows-shipping", "windows-validation"): + with self.subTest(profile=profile): + self.assertEqual( + inventory.reviewed_configured_function_targets(declarations, profile, cache), + {"CpuFloor_IsaBaseline"}, + ) + for key, changed in ( + ("SPARK_NATIVE_ARCH", "ON"), + ("SPARK_TOOLCHAIN_CXX_COMPILER_ID", "Clang"), + ("SPARK_TOOLCHAIN_CXX_ARCHITECTURE", "ARM64"), + ): + for value in (None, changed): + with self.subTest(key=key, value=value): + altered = dict(cache) + if value is None: + altered.pop(key) + else: + altered[key] = value + self.assertEqual( + inventory.reviewed_configured_function_targets(declarations, "windows-shipping", altered), + set(), + ) + self.assertEqual( + inventory.reviewed_configured_function_targets(declarations, "installed-sdk-consumer", cache), set() + ) + for key, value in (("line", 50), ("file", "cmake/Invented.cmake"), + ("definitionScope", ["unused_function"]), ("target", "Invented")): + with self.subTest(record_key=key): + altered = copy.deepcopy(declarations) + next(item for item in altered if item["target"] == "CpuFloor_IsaBaseline")[key] = value + self.assertEqual( + inventory.reviewed_configured_function_targets(altered, "windows-shipping", cache), set() + ) + + def test_reviewed_isa_target_requires_real_unconditional_root_call(self) -> None: + declarations = inventory.extract_cmake_targets() + cache = { + "SPARK_NATIVE_ARCH": "OFF", + "SPARK_TOOLCHAIN_CXX_COMPILER_ID": "MSVC", + "SPARK_TOOLCHAIN_CXX_ARCHITECTURE": "x64", + } + source = inventory.CMAKE_ROOT.read_text(encoding="utf-8") + call = "spark_register_isa_baseline_scan(${SPARK_SHIPPED_IMAGE_TARGETS})" + self.assertEqual(source.count(call), 1) + mutations = ( + "", "spark_register_isa_baseline_scan(SparkEngine)", + f"if(UNKNOWN_GUARD)\n{call}\nendif()", + f"function(unused)\n{call}\nendfunction()", f"{call}\n{call}", + "spark_register_isa_baseline_scan(", + ) + for replacement in mutations: + with self.subTest(replacement=replacement): + with mock.patch.object(Path, "read_text", return_value=source.replace(call, replacement)): + self.assertEqual( + inventory.reviewed_configured_function_targets(declarations, "windows-shipping", cache), + set(), + ) + + def test_real_isa_utility_is_corroborated_without_granting_producer_authority(self) -> None: + with tempfile.TemporaryDirectory(dir=TEST_TEMP_ROOT) as raw: + cache = dict(self.shipping_cache) + cache["SPARK_NATIVE_ARCH"] = "OFF" + evidence = self.shipping_evidence( + Path(raw), cache=cache, + targets=(("SparkEngine", "EXECUTABLE"), ("CpuFloor_IsaBaseline", "UTILITY")), + ) + findings = check_parity.check_codemodel_provenance(self.bound_data(evidence)) + self.assertNotIn("configured-target-undeclared", finding_categories(findings)) + self.assertIn("codemodel-producer-authority-unavailable", finding_categories(findings)) + def test_caller_asserted_commit_cannot_replace_producer_provenance(self) -> None: with tempfile.TemporaryDirectory(dir=TEST_TEMP_ROOT) as raw: write_codemodel_reply( diff --git a/Tests/Tools/test_compare_windows_shipping_repro.py b/Tests/Tools/test_compare_windows_shipping_repro.py new file mode 100644 index 000000000..b41343596 --- /dev/null +++ b/Tests/Tools/test_compare_windows_shipping_repro.py @@ -0,0 +1,398 @@ +#!/usr/bin/env python3 +"""BLD-100 diagnostics locate remaining differences without changing acceptance.""" + +from __future__ import annotations + +import contextlib +import importlib.util +import io +import json +import struct +import tempfile +import unittest +from pathlib import Path +from unittest import mock + +REPO = Path(__file__).resolve().parents[2] +SCRIPT = REPO / ".github/scripts/compare_windows_shipping_repro.py" +spec = importlib.util.spec_from_file_location("windows_repro", SCRIPT) +helper = importlib.util.module_from_spec(spec) +assert spec.loader is not None +spec.loader.exec_module(helper) + + +def coff(sections: list[tuple[bytes, bytes]], timestamp: int = 0, outside: bytes = b"") -> bytes: + header = struct.pack(" bytes: + header = (f"unit.obj/ {timestamp:<12}{0:<6}{0:<6}{0:<8}{len(member):<10}`\n").encode("ascii") + assert len(header) == 60 + return b"!\n" + header + member + (b"\n" if len(member) & 1 else b"") + + +def bigobj(sections: list[tuple[bytes, bytes]], timestamp: int = 0) -> bytes: + ordinary = coff(sections) + header = struct.pack(" bytes: + count = (-len(payload) - 4) % 4 + padding = bytes(0xF0 + value for value in range(count, 0, -1)) + return struct.pack(" None: + self.temp = tempfile.TemporaryDirectory() + self.addCleanup(self.temp.cleanup) + self.directory = Path(self.temp.name) + self.roots = [self.directory / "first", self.directory / "second"] + self.build_roots = ["C:\\tree-a\\build", "C:\\tree-b\\build"] + + def run_pair(self, first: bytes, second: bytes) -> tuple[int, dict | None, dict | None]: + arguments = [] + for label, root, build_root, content in zip(("first", "second"), self.roots, self.build_roots, (first, second)): + (root / "lib").mkdir(parents=True, exist_ok=True) + (root / "lib/core.lib").write_bytes(content) + manifest = self.directory / f"{label}.json" + manifest.write_text(json.dumps(helper.comparator.build_manifest(root, build_root)), encoding="utf-8") + arguments.extend((f"--{label}-manifest", str(manifest), f"--{label}-root", str(root), + f"--{label}-build-root", build_root)) + report, diagnostics = self.directory / "report.json", self.directory / "diagnostics.json" + arguments.extend(("--report", str(report), "--diagnostics", str(diagnostics))) + with contextlib.redirect_stdout(io.StringIO()): + result = helper.main(arguments) + return (result, json.loads(report.read_text()) if report.exists() else None, + json.loads(diagnostics.read_text()) if diagnostics.exists() else None) + + def pair(self, section: bytes = b".debug$T", different: bool = True) -> tuple[bytes, bytes]: + result = [] + for root in self.build_roots: + member = coff([(b".text", b"code"), (section, root.encode() if different else b"types"), + (b".debug$S", root.encode() + b"\\unit.obj")]) + result.append(archive(member)) + return tuple(result) + + def test_type_section_root_is_reported_and_still_fails_original_comparison(self) -> None: + code, report, detail = self.run_pair(*self.pair()) + self.assertEqual(code, 1) + first = helper.comparator.load_manifest(self.directory / "first.json") + second = helper.comparator.load_manifest(self.directory / "second.json") + self.assertEqual(report, helper.comparator.compare_manifests(first, second)) + self.assertTrue(detail["diagnosticOnly"]) + library = detail["libraries"][0] + self.assertEqual(library["member"], "unit.obj") + self.assertEqual(library["memberIndex"], 0) + self.assertEqual(library["differingRegionCount"], 1) + region = library["differingRegions"][0] + self.assertEqual(region["first"]["name"], ".debug$T (#1)") + self.assertEqual(region["first"]["buildRootOccurrences"], 1) + self.assertEqual(region["second"]["buildRootOccurrences"], 1) + self.assertNotEqual(region["first"]["normalizedSha256"], region["second"]["normalizedSha256"]) + + def test_only_authorized_debug_s_difference_remains_equivalent(self) -> None: + code, report, detail = self.run_pair(*self.pair(different=False)) + self.assertEqual(code, 0) + self.assertTrue(report["equivalent"]) + self.assertTrue(detail["acceptanceEquivalent"]) + self.assertEqual(detail["libraries"], []) + + def test_code_bytes_are_reported_without_normalization(self) -> None: + pair = [archive(coff([(b".text", value), (b".debug$S", root.encode())])) + for value, root in zip((b"one", b"two"), self.build_roots)] + code, _, detail = self.run_pair(*pair) + self.assertEqual(code, 1) + region = detail["libraries"][0]["differingRegions"][0] + self.assertEqual(region["first"]["name"], ".text (#0)") + self.assertEqual(region["first"]["rawSha256"], region["first"]["normalizedSha256"]) + + def test_archive_header_coff_header_and_uncovered_bytes_are_retained(self) -> None: + pair = [archive(coff([(b".debug$S", root.encode())], timestamp=index, outside=bytes([index])), + timestamp=index) + for index, root in enumerate(self.build_roots)] + code, _, detail = self.run_pair(*pair) + self.assertEqual(code, 1) + names = [region["first"]["name"] for region in detail["libraries"][0]["differingRegions"]] + self.assertEqual(names, ["", "", ""]) + + def test_member_budget_is_explicit_and_does_not_promote_failure(self) -> None: + with mock.patch.object(helper, "MAX_MEMBER_BYTES", 8): + code, report, detail = self.run_pair(*self.pair()) + self.assertEqual(code, 1) + self.assertFalse(report["equivalent"]) + self.assertEqual(detail["libraries"][0]["status"], "member-exceeds-diagnostic-byte-limit") + + def test_changed_region_budget_records_omission_and_preserves_failure(self) -> None: + pair = [archive(coff([(b".text", bytes([index])), (b".debug$T", root.encode()), + (b".debug$S", root.encode())])) + for index, root in enumerate(self.build_roots)] + with mock.patch.object(helper, "MAX_CHANGED_REGIONS", 1): + code, _, detail = self.run_pair(*pair) + self.assertEqual(code, 1) + library = detail["libraries"][0] + self.assertEqual(library["differingRegionCount"], 2) + self.assertEqual(len(library["differingRegions"]), 1) + self.assertEqual(library["omittedDifferingRegions"], 1) + + def test_reader_rejects_bytes_that_no_longer_match_the_manifest(self) -> None: + content = self.pair()[0] + root = self.roots[0] + root.mkdir() + file = root / "core.lib" + file.write_bytes(content) + entry = helper.comparator.build_manifest(root, self.build_roots[0])["entries"][0]["sections"][0] + file.write_bytes(content.replace(b"code", b"evil")) + with self.assertRaisesRegex(helper.comparator.InputError, "digest differs"): + helper._member(file, 0, entry, self.build_roots[0].encode()) + + def test_section_parser_rejects_out_of_bounds_and_overlapping_layouts(self) -> None: + data = bytearray(coff([(b".text", b"code"), (b".debug$T", b"types")])) + struct.pack_into(" None: + members = [] + for root in self.build_roots: + ordinary = coff([(b".debug$T", root.encode()), (b".debug$S", root.encode())]) + header = struct.pack(" None: + self.build_roots[1] += "x" + with contextlib.redirect_stderr(io.StringIO()): + code, report, detail = self.run_pair(*self.pair()) + self.assertEqual(code, 2) + self.assertIsNone(report) + self.assertIsNone(detail) + + def test_valid_short_import_members_retain_comparison_failure_and_unavailable_evidence(self) -> None: + members = [] + for symbol in (b"symbolA", b"symbolB"): + names = symbol + b"\0module.dll\0" + # MSVC IMPORT_OBJECT_HEADER: version 0 distinguishes this valid + # short import object from BigObj despite the shared signature. + header = struct.pack(" None: + write_bytes = Path.write_bytes + + def write(path: Path, data: bytes) -> int: + if path.name == "diagnostics.json": + raise PermissionError(13, "diagnostic fixture write refused") + return write_bytes(path, data) + + for different, expected in ((True, 1), (False, 0)): + with self.subTest(different=different): + errors = io.StringIO() + with mock.patch.object(Path, "write_bytes", write), contextlib.redirect_stderr(errors): + code, report, detail = self.run_pair(*self.pair(different=different)) + self.assertEqual(code, expected) + self.assertEqual(report["equivalent"], not different) + self.assertIsNone(detail) + self.assertIn("diagnostics unavailable", errors.getvalue()) + + def test_diagnostic_read_error_is_retained_without_changing_failure(self) -> None: + with mock.patch.object(helper, "_member", side_effect=OSError(5, "fixture I/O unavailable", "absolute/path")): + code, report, detail = self.run_pair(*self.pair()) + self.assertEqual(code, 1) + self.assertFalse(report["equivalent"]) + library = detail["libraries"][0] + self.assertEqual(library["status"], "inspection-unavailable") + self.assertEqual(library["error"], "fixture I/O unavailable") + + def test_global_diagnostic_failure_retains_bounded_error_and_original_status(self) -> None: + with mock.patch.object(helper, "diagnostics", side_effect=ValueError("fixture unavailable")): + code, report, detail = self.run_pair(*self.pair()) + self.assertEqual(code, 1) + self.assertFalse(report["equivalent"]) + self.assertEqual(detail["status"], "inspection-unavailable") + self.assertEqual(detail["error"], "fixture unavailable") + + def test_v2_header_fields_checksum_bytes_and_directive_strings_retain_strict_failure(self) -> None: + members = [archive(bigobj([(b".chks64", struct.pack(" None: + code, _, detail = self.run_pair(archive(coff([(b".text", b"same")], timestamp=9)), + archive(coff([(b".text", b"same")], timestamp=10))) + self.assertEqual(code, 1) + decoded = detail["libraries"][0]["differingRegions"][0]["details"] + self.assertEqual(decoded["headers"]["first"]["format"], "coff") + self.assertEqual(decoded["fieldDifferences"], [{"field": "timeDateStamp", "first": 9, "second": 10}]) + + def test_residual_codeview_records_and_source_strings_are_identified(self) -> None: + pair = [] + for suffix in (b"a", b"b"): + types = struct.pack(" None: + for data in (b"not-c13", struct.pack(" None: + delta = helper._byte_differences(b"a" * 2048, b"b" * 2048) + self.assertEqual(delta["differingByteCount"], 2048) + self.assertEqual(len(delta["samples"]), helper.MAX_BYTE_SAMPLES) + self.assertEqual(delta["omittedDifferingBytes"], 2048 - helper.MAX_BYTE_SAMPLES * helper.MAX_SAMPLE_BYTES) + self.assertTrue(all(len(sample["firstHex"]) <= helper.MAX_SAMPLE_BYTES * 2 for sample in delta["samples"])) + text = b"\0".join(b"a" * 400 for _ in range(12)) + strings = helper._string_windows(text, [{"offset": 401 * index + 200} for index in range(12)]) + windows = strings["windows"] + self.assertEqual(len(windows), helper.MAX_STRING_SAMPLES) + self.assertEqual(strings["omittedWindows"], 4) + self.assertTrue(all(len(window["text"]) <= helper.MAX_STRING_BYTES for window in windows)) + self.assertTrue(all(window["truncatedBefore"] and window["truncatedAfter"] for window in windows)) + data = struct.pack(" None: + self.run_pair(*self.pair()) + for root in self.roots: + content = (root / "lib/core.lib").read_bytes() + for name in ("extra-a.lib", "extra-b.lib"): + (root / "lib" / name).write_bytes(content) + manifests = [helper.comparator.build_manifest(root, build_root) + for root, build_root in zip(self.roots, self.build_roots)] + report = helper.comparator.compare_manifests(*manifests) + with mock.patch.object(helper, "MAX_LIBRARIES", 1): + detail = helper.diagnostics(*manifests, *self.roots, *self.build_roots, report) + self.assertFalse(report["equivalent"]) + self.assertEqual(len(report["differing"]), 3) + self.assertEqual(len(detail["libraries"]), 1) + self.assertEqual(detail["omittedLibraries"], 2) + + def test_invalid_codeview_symbol_subsections_do_not_hide_precise_byte_deltas(self) -> None: + for data in (struct.pack(" None: + members = [archive(coff([(b".text", b"same")], timestamp=index)) for index in (1, 2)] + with mock.patch.object(helper, "_header_fields", side_effect=struct.error("fixture undecodable")): + code, report, detail = self.run_pair(*members) + self.assertEqual(code, 1) + self.assertFalse(report["equivalent"]) + self.assertEqual(detail["libraries"][0]["differingRegions"][0]["details"]["status"], "inspection-unavailable") + for pair, expected in ((members, 1), ((members[0], members[0]), 0)): + with self.subTest(expected=expected), mock.patch.object(helper, "MAX_DIAGNOSTIC_BYTES", 400): + code, report, detail = self.run_pair(*pair) + self.assertEqual(code, expected) + self.assertEqual(report["equivalent"], expected == 0) + self.assertLessEqual((self.directory / "diagnostics.json").stat().st_size, 400) + self.assertEqual(detail["schema"], "spark.windows-shipping-repro-diagnostics/2") + self.assertEqual(detail["status"], "inspection-unavailable") + self.assertEqual(detail["error"], "diagnostic output exceeds its byte limit") + + def test_sampled_byte_runs_map_across_codeview_record_boundaries_with_record_cap(self) -> None: + first = struct.pack(" None: + delta = helper._byte_differences(b"abcd", b"a") + self.assertEqual(delta["differingByteCount"], 3) + self.assertEqual(delta["samples"], [{"offset": 1, "firstHex": "626364", "secondHex": ""}]) + details = helper._diagnose_member((bytes(60), coff([(b".debug$T", b"first")])), + (bytes(60), coff([(b".drectve", b"other")])), b"root-a", b"root-b") + self.assertEqual(details["differingRegions"][1]["details"]["status"], "inspection-unavailable") + self.assertEqual(details["differingRegions"][1]["details"]["error"], "region layout differs") + + +if __name__ == "__main__": + unittest.main() diff --git a/Tests/Tools/test_cpu_floor.py b/Tests/Tools/test_cpu_floor.py index 7315b48b5..0d156dfcc 100644 --- a/Tests/Tools/test_cpu_floor.py +++ b/Tests/Tools/test_cpu_floor.py @@ -132,6 +132,10 @@ def configure_probe(body: str, *extra: str, languages: str = "NONE") -> subproce (source / "CMakeLists.txt").write_text( "cmake_minimum_required(VERSION 3.25)\n" f"project(CpuFloorProbe LANGUAGES {languages})\n" + # LANGUAGES NONE has no compiler target identity. Give its synthetic + # x86 test target an explicit architecture rather than rely on host env. + + ('set(CMAKE_SYSTEM_PROCESSOR "x86_64")\n' if languages == "NONE" else "") + + f'include("{_cmake_path(FLOOR_MODULE)}")\n' + textwrap.dedent(body) + "spark_assert_cpu_floor()\n", encoding="utf-8", ) @@ -292,6 +296,11 @@ class VendoredJoltFloorTests(unittest.TestCase): set(JPH_USE_DX12 OFF CACHE BOOL "" FORCE) set(JPH_USE_VK OFF CACHE BOOL "" FORCE) set(JPH_USE_MTL OFF CACHE BOOL "" FORCE) + # Upstream Jolt keys its MSVC ISA controls on the VS platform even with + # Ninja. Give this control fixture the detected compiler target identity. + if(MSVC AND "${{CMAKE_VS_PLATFORM_NAME}}" STREQUAL "") + set(CMAKE_VS_PLATFORM_NAME "${{CMAKE_CXX_COMPILER_ARCHITECTURE_ID}}") + endif() {floor} add_subdirectory("{jolt}" "${{CMAKE_BINARY_DIR}}/Jolt") get_target_property(_opts Jolt INTERFACE_COMPILE_OPTIONS) @@ -347,5 +356,44 @@ def test_shipping_presets_keep_native_arch_off(self) -> None: self.assertEqual(presets[name].get("cacheVariables", {}).get("SPARK_NATIVE_ARCH"), "OFF") +@unittest.skipUnless(CMAKE and platform.system() == "Windows", "MSVC Windows probe is required") +class LibsodiumMsvcArchitectureProbeTests(unittest.TestCase): + """The real libsodium wrapper must use MSVC's compiler architecture identity.""" + + def test_empty_system_processor_x64_architecture_keeps_variants_disabled(self) -> None: + with tempfile.TemporaryDirectory(prefix="spark-sodium-arch-probe-") as temporary: + root = Path(temporary) + source = root / "src" + build = root / "build" + source.mkdir() + (source / "CMakeLists.txt").write_text( + "cmake_minimum_required(VERSION 3.25)\n" + "project(SparkSodiumArchitectureProbe LANGUAGES C)\n" + 'set(CMAKE_SYSTEM_PROCESSOR "")\n' + f'include("{FLOOR_MODULE.as_posix()}")\n' + 'spark_cpu_floor_enforced(_enforced)\n' + 'if(NOT _enforced)\n message(FATAL_ERROR "MSVC target CPU floor was bypassed")\nendif()\n' + f'include("{(REPO_ROOT / "cmake" / "SparkLibsodium.cmake").as_posix()}")\n' + 'get_target_property(_options spark_sodium COMPILE_OPTIONS)\n' + 'file(WRITE "${CMAKE_BINARY_DIR}/architecture-probe.txt"\n' + ' "MSVC=${MSVC}\\nSYSTEM=${CMAKE_SYSTEM_PROCESSOR}\\nARCH=${CMAKE_C_COMPILER_ARCHITECTURE_ID}\\nOPTIONS=${_options}\\n")\n', + encoding="utf-8", + ) + result = _run([CMAKE, "-S", str(source), "-B", str(build), "-G", "Ninja"], root) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + probe = (build / "architecture-probe.txt").read_text(encoding="utf-8") + if "MSVC=1" not in probe: + self.skipTest("CMake selected a non-MSVC compiler") + self.assertIn("MSVC=1", probe) + self.assertIn("\nSYSTEM=\n", probe) + self.assertIn("ARCH=x64\n", probe) + self.assertRegex(probe, r"OPTIONS=.*?/FI[^;\n]*spark_sodium_cpu_floor\.h") + headers = list(build.rglob("spark_sodium_cpu_floor.h")) + self.assertEqual(1, len(headers), headers) + header = headers[0].read_text(encoding="utf-8") + for feature in ("HAVE_AVXINTRIN_H", "HAVE_WMMINTRIN_H", "HAVE_AVX2INTRIN_H", "HAVE_AVX512FINTRIN_H"): + self.assertIn("#undef " + feature, header) + + if __name__ == "__main__": unittest.main() diff --git a/Tests/Tools/test_docs_health.py b/Tests/Tools/test_docs_health.py index e11477e8a..9af363dc3 100644 --- a/Tests/Tools/test_docs_health.py +++ b/Tests/Tools/test_docs_health.py @@ -935,6 +935,48 @@ def test_tracked_tree_is_not_loaded_outside_a_repository_root(self) -> None: class RepositoryEvidenceTests(unittest.TestCase): + def test_master_results_honor_safe_tmpdir_when_mktemp_uses_a_symlink(self) -> None: + with tempfile.TemporaryDirectory(prefix="docs-master-temp-") as directory: + root = Path(directory).resolve() + checkout = root / "checkout" + safe_temp = root / "safe-temp" + unsafe_link = root / "unsafe-link" + safe_temp.mkdir() + try: + unsafe_link.symlink_to(safe_temp, target_is_directory=True) + except OSError as error: + self.skipTest(f"directory symlinks unavailable: {error}") + for name in ("docs_currentness.py", "docs_contract.py"): + write(checkout / "tools" / name, (REPO_ROOT / "tools" / name).read_text(encoding="utf-8")) + write(checkout / "docs" / "update-all-docs.sh", + (REPO_ROOT / "docs" / "update-all-docs.sh").read_text(encoding="utf-8")) + contract = docs_currentness.load_contract() + write(checkout / "docs" / "generated-docs-manifest.json", json.dumps(contract)) + for generator in contract["generators"]: + write(checkout / "docs" / generator["script"], "#!/bin/bash\nexit 0\n") + fake_bin = root / "bin" + fake_mktemp = fake_bin / "mktemp" + write(fake_mktemp, '#!/bin/bash\n: > "$UNSAFE_RESULTS"\nprintf "%s\\n" "$UNSAFE_RESULTS"\n') + fake_mktemp.chmod(0o755) + health = root / "health.json" + result = subprocess.run( + [docs_currentness.find_bash(allow_override=False), str(checkout / "docs" / "update-all-docs.sh"), "update"], + cwd=checkout, + env={**os.environ, "PATH": str(fake_bin)+os.pathsep+os.environ["PATH"], + "PYTHON": sys.executable, "TMPDIR": str(safe_temp), + "UNSAFE_RESULTS": str(unsafe_link / "results.tsv"), + "SPARK_DOC_HEALTH_OUTPUT": str(health), + "SPARKENGINE_DOC_SOURCE_SHA": EXACT_SHA, + "SPARKENGINE_DOC_SOURCE_COMMITTED_AT": COMMITTED_AT}, + capture_output=True, text=True, check=False, timeout=30, + ) + self.assertEqual(0, result.returncode, result.stdout+result.stderr) + evidence = json.loads(health.read_text(encoding="utf-8")) + self.assertEqual("pass", evidence["overall"]) + self.assertEqual(9, evidence["successes"]) + self.assertEqual(0, evidence["failures"]) + self.assertFalse((safe_temp / "results.tsv").exists(), "bare mktemp was called") + def test_manifest_declares_every_generator_exactly_once(self) -> None: contract = docs_currentness.load_contract() ids = tuple(row["id"] for row in contract["generators"]) @@ -989,6 +1031,83 @@ def test_wiki_ecs_inventory_is_identical_for_lf_and_crlf_headers(self) -> None: self.assertNotIn(b"\r", published) self.assertEqual(generated[0], generated[1]) + def test_wiki_multiline_sections_work_with_bsd_awk_argument_rules(self) -> None: + with tempfile.TemporaryDirectory(prefix="wiki-bsd-awk-") as directory: + root = Path(directory) + write(root / "docs" / "sync-wiki.sh", (REPO_ROOT / "docs" / "sync-wiki.sh").read_text(encoding="utf-8")) + for relative in ("SparkEditor/Source/Panels", "Tests", "GameModules"): + (root / relative).mkdir(parents=True) + write(root / "SparkEngine/Source/Engine/ECS/Components/FixtureComponents.h", + "struct FirstComponent {};\nstruct SecondComponent {};\n") + write(root / "SparkEngine/Source/Engine/ECS/Systems/FixtureSystems.h", + "class FixtureSystem {};\n") + page = root / "wiki/subsystems/Entity-Component-System.md" + write(page, "# ECS\nAuthored text stays.\n") + git_bash = Path(r"C:\Program Files\Git\bin\bash.exe") + shell = str(git_bash if git_bash.is_file() else "bash") + actual_awk = subprocess.run([shell, "-c", "command -v awk"], + capture_output=True, text=True, check=True).stdout.strip() + wrapper = root / "bin/awk" + write(wrapper, '''#!/bin/bash +# BSD awk rejects embedded newlines in -v string assignments. +assignment=false +for argument in "$@"; do + if $assignment && [[ "$argument" == *$'\\n'* ]]; then + echo "awk: newline in string" >&2 + exit 2 + fi + assignment=false + [ "$argument" != "-v" ] || assignment=true +done +exec "$SPARK_TEST_REAL_AWK" "$@" +''') + wrapper.chmod(0o755) + result = subprocess.run( + [shell, "docs/sync-wiki.sh", "sync"], cwd=root, + env={**os.environ, "PATH": str(wrapper.parent) + os.pathsep + os.environ["PATH"], + "SPARK_TEST_REAL_AWK": actual_awk, "SPARK_WIKI_DIR": str(root / "wiki")}, + capture_output=True, text=True, check=False, timeout=30, + ) + self.assertEqual(0, result.returncode, result.stdout + result.stderr) + self.assertEqual( + ["FirstComponent", "SecondComponent", "FixtureSystem"], + [line.split("`")[1] for line in page.read_text(encoding="utf-8").splitlines() + if line.startswith("| `")], + ) + self.assertIn("Authored text stays.", page.read_text(encoding="utf-8")) + + def test_codebase_statistics_retains_named_subsystem_counts(self) -> None: + with tempfile.TemporaryDirectory(prefix="stats-subsystem-counts-") as directory: + root = Path(directory) + for name in ("update-codebase-stats.sh", "codebase-metrics.py", "generated-docs-manifest.json"): + write(root / "docs" / name, (REPO_ROOT / "docs" / name).read_text(encoding="utf-8")) + for relative in ("wiki/advanced", "SparkEditor/Source", "SparkEngine/Source/Engine/ECS/Components", + "Tests", "Shaders", "Assets", "GameModules", "SparkSDK", "cmake"): + (root / relative).mkdir(parents=True) + sources = { + "SparkEngine/Source/Graphics/Fixture.cpp": "// graphics\n" * 8, + "SparkEngine/Source/Engine/AI/Fixture.cpp": "// ai\n" * 3, + "SparkEngine/Source/Engine/2D/Fixture.cpp": "// 2d\n" * 4, + "SparkEngine/Source/Engine/Physics/Fixture.cpp": "// physics\n" * 5, + "SparkEngine/Source/Engine/ECS/Systems/ECSystems.h": "class FixtureSystem {};\n", + } + for relative, content in sources.items(): + write(root / relative, content) + write(root / "CMakeLists.txt", "option(ENABLE_FIXTURE \"Fixture\" ON)\n") + manifest = root / "tracked-paths" + manifest.write_bytes(b"\0".join(path.encode("utf-8") for path in sources) + b"\0") + git_bash = Path(r"C:\Program Files\Git\bin\bash.exe") + result = subprocess.run( + [str(git_bash if git_bash.is_file() else "bash"), "docs/update-codebase-stats.sh", "generate"], + cwd=root, env={**os.environ, "SPARK_DOC_TRACKED_PATHS": str(manifest)}, + capture_output=True, text=True, check=False, timeout=30, + ) + self.assertEqual(0, result.returncode, result.stdout + result.stderr) + page = (root / "wiki/advanced/Codebase-Statistics.md").read_text(encoding="utf-8") + for subsystem, lines in (("AI", 3), ("2D", 4), ("Physics", 5), ("ECS", 1)): + self.assertIn(f"| {subsystem} | {lines} |", page) + self.assertNotIn("| Networking |", page) + def test_wiki_test_inventory_includes_all_registered_test_sources(self) -> None: with tempfile.TemporaryDirectory(prefix="wiki-test-inventory-") as directory: wiki = Path(directory) diff --git a/Tests/Tools/test_editor_play_truth.py b/Tests/Tools/test_editor_play_truth.py index 26ad6036f..abefb9158 100644 --- a/Tests/Tools/test_editor_play_truth.py +++ b/Tests/Tools/test_editor_play_truth.py @@ -81,5 +81,21 @@ def test_debug_panels_do_not_promise_state_preview_runtime_data(self) -> None: has_copy(self, f"SparkEditor/Source/Panels/{panel}", truth) +class EditorDocumentWiringTests(unittest.TestCase): + def test_hierarchy_and_inspector_wiring_is_platform_neutral(self) -> None: + ui = source("SparkEditor/Source/Core/EditorUI.cpp") + rewire = ui.split("void EditorUI::RewirePanelsToWorld()", 1)[1].split( + "bool EditorUI::SaveCurrentScene", 1)[0] + + self.assertIn('m_panels.find("Hierarchy")', rewire) + self.assertIn("hierarchy->SetSelectionSink(this)", rewire) + self.assertIn('m_panels.find("Inspector")', rewire) + self.assertIn("inspector->SetEditorUI(this)", rewire) + + windows_graphics = ui.split("void EditorUI::SetGraphicsDevice", 1)[1].split( + "void EditorUI::HandleKeyboardShortcuts", 1)[0] + self.assertNotIn("SetEditorUI", windows_graphics) + + if __name__ == "__main__": unittest.main() diff --git a/Tests/Tools/test_fps_input_dispatch.py b/Tests/Tools/test_fps_input_dispatch.py new file mode 100644 index 000000000..4ac2b0478 --- /dev/null +++ b/Tests/Tools/test_fps_input_dispatch.py @@ -0,0 +1,240 @@ +"""Parser/source and normal capture regressions. Synthetic records are not native evidence.""" +import copy +import io +import os +from pathlib import Path +import subprocess +import sys +import tempfile +import unittest +from unittest import mock +from types import SimpleNamespace +import stat +import importlib.util +ROOT = Path(__file__).resolve().parents[2] +spec = importlib.util.spec_from_file_location('fps_input_dispatch', ROOT/'Tests/PackageSmoke/RunFPSInputDispatch.py') +driver = importlib.util.module_from_spec(spec) +spec.loader.exec_module(driver) + + +class WrapperCaptureTests(unittest.TestCase): + def test_normal_child_stdout_stderr_and_stdin_are_captured(self): + child = Path(sys.executable) + if os.name == 'nt': + child = child.with_name('pythonw.exe') + self.assertTrue(child.is_file(), 'Windows GUI Python child is required') + payload = ("import sys; print('CAPTURE_STDOUT',flush=True); " + "print('CAPTURE_STDERR',file=sys.stderr,flush=True); " + "print('CAPTURE_STDIN_EOF='+str(sys.stdin.buffer.read()==b''),flush=True)") + flags = subprocess.CREATE_NO_WINDOW if os.name == 'nt' else 0 + result = subprocess.run([sys.executable, '-c', driver.WRAPPER, str(child), '-c', payload], + input=b'GO\n', stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + creationflags=flags, timeout=10, check=True) + lines = result.stdout.decode('utf-8').splitlines() + self.assertEqual(len([line for line in lines if line.startswith('SPARK_INPUT_CHILD ')]), 1) + self.assertEqual(sorted(line for line in lines if not line.startswith('SPARK_INPUT_CHILD ')), + ['CAPTURE_STDERR', 'CAPTURE_STDIN_EOF=True', 'CAPTURE_STDOUT']) + + def test_inner_launch_explicitly_routes_existing_binary_capture_streams(self): + captured_out, captured_err = io.BytesIO(), io.BytesIO() + child = SimpleNamespace(pid=1234, wait=mock.Mock(return_value=0)) + process_module = SimpleNamespace(Popen=mock.Mock(return_value=child), DEVNULL=subprocess.DEVNULL) + system_module = SimpleNamespace(argv=['wrapper', 'normal-child'], + stdin=SimpleNamespace(buffer=io.BytesIO(b'GO\n')), + stdout=SimpleNamespace(buffer=captured_out), stderr=SimpleNamespace(buffer=captured_err), + exit=mock.Mock(side_effect=SystemExit(0))) + with mock.patch.dict(sys.modules, subprocess=process_module, sys=system_module), mock.patch('builtins.print'): + with self.assertRaises(SystemExit) as exit_result: + exec(driver.WRAPPER, {}) + self.assertEqual(exit_result.exception.code, 0) + process_module.Popen.assert_called_once_with(['normal-child'], stdin=subprocess.DEVNULL, + stdout=captured_out, stderr=captured_err) + child.wait.assert_called_once_with() + + +class ReceiptTests(unittest.TestCase): + def setUp(self): + self.root = Path(__file__).resolve().parent / 'synthetic-save-root' + self.replay = driver.Replay(self.root) + + def record(self, phase='before', **changes): + p = 'fps.profile.class=0\nfps.profile.playTime=0.000000\n'.encode().hex() + r = dict(v=1, phase=phase, input=1, update=1, mask=0, pressed=0, released=0, + paused=0, action=0, result=-1, reason=0, operation=0, faults=0, profile=p, + transfer='-', saves=str(self.root).encode().hex()) + r.update(changes) + return 'SPARK_FPS_INPUT ' + ' '.join(f'{k}={r[k]}' for k in driver.TRACE_FIELDS) + '\n' + + def idle(self): + for phase in ('before', 'dispatch', 'complete'): + self.replay.feed(self.record(phase)) + + def test_complete_idle_and_exact_terminal(self): + self.idle() + self.assertEqual(len(self.replay.frames), 1) + self.replay.feed(f'SPARK_FPS_INPUT_END v=1 records=3 bytes={self.replay.byte_count} failed=0\n') + self.assertTrue(self.replay.ended) + + def test_requires_actual_operation_result_and_transfer(self): + for mutation in ({'result': 0}, {'transfer': '-'}, {'operation': 2}, {'action': 2}): + with self.subTest(mutation=mutation): + replay = driver.Replay(self.root) + replay.feed(self.record(mask=1, pressed=1)) + fields = dict(mask=1, pressed=1, action=1, result=1, operation=1, + transfer='fps.profile.class=0\nfps.profile.playTime=0.000000\n'.encode().hex()) + fields.update(mutation) + with self.assertRaises(ValueError): + replay.feed(self.record('operation', **fields)) + + def test_rejects_cross_frame_dispatch(self): + self.replay.feed(self.record()) + with self.assertRaises(ValueError): + self.replay.feed(self.record('dispatch', input=2)) + + def test_rejects_completion_without_dispatch(self): + self.replay.feed(self.record()) + with self.assertRaises(ValueError): + self.replay.feed(self.record('complete')) + + def test_rejects_faults_paused_and_wrong_save_root(self): + for mutation in ({'faults': 1}, {'paused': 1}, {'saves': str(self.root/'wrong').encode().hex()}): + with self.subTest(mutation=mutation), self.assertRaises(ValueError): + driver.Replay(self.root).feed(self.record(**mutation)) + + def test_rejects_duplicate_phase_and_stale_frame(self): + self.replay.feed(self.record()) + with self.assertRaises(ValueError): + self.replay.feed(self.record()) + self.replay = driver.Replay(self.root) + self.idle() + with self.assertRaises(ValueError): + self.replay.feed(self.record()) + + def test_rejects_unobserved_key_dispatch(self): + self.replay.feed(self.record(mask=1, pressed=1)) + with self.assertRaises(ValueError): + self.replay.feed(self.record('dispatch', mask=1, pressed=1)) + + def test_rejects_nonfinite_and_duplicate_profile(self): + for payload in ('fps.profile.class=nan\nfps.profile.playTime=0\n', + 'fps.profile.class=0\nfps.profile.class=0\nfps.profile.playTime=0\n'): + with self.subTest(payload=payload), self.assertRaises(ValueError): + driver.parse_trace(self.record(profile=payload.encode().hex())) + + def test_rejects_prefixed_or_extra_fields(self): + for line in ('[info] '+self.record(), self.record().rstrip()+' extra=1\n'): + with self.subTest(line=line), self.assertRaises(ValueError): + self.replay.feed(line) + + def test_rejects_incomplete_or_overflow_terminal(self): + self.idle() + for line in ('SPARK_FPS_INPUT_END v=1 records=3 bytes=1 failed=0\n', + f'SPARK_FPS_INPUT_END v=1 records=3 bytes={self.replay.byte_count} failed=1\n'): + with self.subTest(line=line), self.assertRaises(ValueError): + self.replay.feed(line) + + def test_full_successful_save_frame(self): + self.replay.feed(self.record(mask=1, pressed=1)) + fields = dict(mask=1, pressed=1, action=1, result=1, operation=1, + transfer='fps.profile.class=0\nfps.profile.playTime=0.000000\n'.encode().hex()) + for phase in ('operation', 'dispatch', 'complete'): + self.replay.feed(self.record(phase, **fields)) + self.assertEqual(self.replay.operations[0]['action'], 1) + self.assertEqual(self.replay.operation, 1) + + def test_missing_slot_requires_failure_reason_and_unchanged_profile(self): + for change in ({}, {'result':1}, {'reason':0}, {'action':1}, + {'profile':'fps.profile.class=4\nfps.profile.playTime=0.000000\n'.encode().hex()}): + with self.subTest(change=change): + replay = driver.Replay(self.root, missing_only=True) + replay.feed(self.record(mask=2, pressed=2)) + fields = dict(mask=2, pressed=2, action=2, result=0, reason=1, operation=1) + fields.update(change) + if change: + with self.assertRaises(ValueError): + replay.feed(self.record('operation', **fields)) + else: + for phase in ('operation','dispatch','complete'): + replay.feed(self.record(phase, **fields)) + self.assertEqual(replay.operations[0]['profile'], replay.operations[0]['beforeProfile']) + + def test_missing_save_binding_is_rejected(self): + with self.assertRaises(ValueError): + self.replay.feed(self.record(saves='-')) + + def test_owned_window_rejection_prevents_message(self): + window = driver.OwnedWindow.__new__(driver.OwnedWindow) + window.validate = mock.Mock(side_effect=ValueError('wrong PID/path/HWND')) + window.u = mock.Mock() + with self.assertRaises(ValueError): + window.send(1, True) + window.u.PostMessageW.assert_not_called() + + def test_expired_deadline_does_not_wait_for_frame(self): + child = driver.Child.__new__(driver.Child) + child.deadline = 0 + child.queue = mock.Mock() + with self.assertRaises(TimeoutError): + child.next() + child.queue.get.assert_not_called() + + def test_restored_completed_frame_checks_every_field_and_clock(self): + saved = {'fps.profile.class':'0', 'fps.profile.xp':'12', 'fps.profile.health':'75.000000', + 'fps.profile.playTime':'1.000000'} + valid = dict(saved, **{'fps.profile.playTime':'1.100000'}) + driver.restored_frame({'profile':valid,'update':5},saved,5) + for changes in ({'fps.profile.xp':'13'}, {'fps.profile.health':'74.000000'}, + {'fps.profile.playTime':'0.900000'}, {'fps.profile.playTime':'1.300000'}, + {'fps.profile.playTime':'nan'}): + with self.subTest(changes=changes), self.assertRaises(ValueError): + driver.restored_frame({'profile':dict(valid,**changes),'update':5},saved,5) + + def test_oversize_copy_is_rejected_before_file_read(self): + slot = mock.Mock() + slot.stat.return_value = SimpleNamespace(st_mode=stat.S_IFREG,st_size=16*1024*1024+1) + with mock.patch.object(driver,'plain',return_value=slot), self.assertRaises(ValueError): + driver.copy_primary(self.root/'slot',self.root/'copy') + slot.open.assert_not_called() + + def test_lifecycle_rejects_each_duplicate_unique_callback(self): + marker = 'SPARK_MODULE_LIFECYCLE module=SparkGameFPS create=1 load=1 update=4 fixed=2 render=4 unload=1 destroy=1 faults=0' + device = 'SPARK_D3D11_DEVICE driver=warp certification=software-only' + driver.check_lifecycle([device,marker]) + for field in ('create','load','unload','destroy'): + with self.subTest(field=field), self.assertRaises(ValueError): + driver.check_lifecycle([device,marker.replace(' '+field+'=1',' '+field+'=2')]) + + +class SourceContracts(unittest.TestCase): + def test_observers_and_dispatch_are_bound_to_real_calls(self): + root = ROOT + game = (root/'GameModules/SparkGameFPS/Source/Game/Game.cpp').read_text(encoding='utf-8') + systems = (root/'GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp').read_text(encoding='utf-8') + self.assertIn('if (savePressed != loadPressed)', game) + self.assertLess(game.index('const bool succeeded = savePressed ? QuickSaveProfile'), + game.index('RecordInputObservation("operation")')) + self.assertIn('if (m_inputObservationEnabled && !inputUpdateCompleted)', game) + self.assertIn('GetRecordsSnapshot()', systems) + self.assertIn('GetEnvironmentVariableW(L"SPARK_FPS_INPUT_TRACE", setting, 2) == 1', systems) + self.assertIn("setting[0] == L'1'", systems) + self.assertIn('profile.WriteTo(fields)', systems) + self.assertIn('m_inputObservationRecords >= 256', systems) + self.assertIn('m_inputObservationBytes + text.size() > 98304', systems) + + def test_no_global_input_or_engine_launch_on_import(self): + source = Path(driver.__file__).read_text(encoding='utf-8') + self.assertNotIn('.SendInput(', source) + self.assertNotIn('.SetForegroundWindow(', source) + self.assertNotIn('time.sleep(', source) + self.assertIn('self.validate()\n vk = KEYS[bit]', source) + self.assertIn("'LOCALAPPDATA', 'APPDATA', 'TEMP', 'TMP'", source) + self.assertIn("'-test-seconds', '30'", source) + self.assertIn('deadline = start + 85', source) + self.assertIn("current['input'] == previous['input'] + 1", source) + self.assertIn("scout['fps.profile.class'] == SCOUT", source) + self.assertIn("mutated['fps.profile.class'] == VANGUARD", source) + self.assertIn('owner deadline exceeded during final identity checks',source) + + +if __name__ == '__main__': + unittest.main() diff --git a/Tests/Tools/test_generate_sbom.py b/Tests/Tools/test_generate_sbom.py index 63db492ed..092e041f3 100755 --- a/Tests/Tools/test_generate_sbom.py +++ b/Tests/Tools/test_generate_sbom.py @@ -113,6 +113,16 @@ def notice_text(entries: dict[str, str]) -> str: GOOD_NOTICE = {"Alpha": "v1.0.0", "Beta": "b" * 40, "Gamma": "snapshot"} +RUNTIME_RULES_TEXT = json.dumps( + { + **json.loads(RULES_TEXT), + "payloadRules": [ + *json.loads(RULES_TEXT)["payloadRules"], + {"pattern": "^bin/(vcruntime140|msvcp140)\\.dll$", "systemRuntime": "Microsoft Visual C++ Runtime"}, + ], + } +) + class ReconcileCase(unittest.TestCase): """A synthetic package that reconciles; each test changes one thing.""" @@ -235,6 +245,71 @@ def test_notice_without_generated_inventory_is_an_input_error(self) -> None: with self.assertRaises(sbom.InputError): self.run_reconcile() + def test_authoritative_system_runtime_notice_is_not_lock_dependency(self) -> None: + rules = sbom.notices.parse_package_rules(RUNTIME_RULES_TEXT, "runtime fixture rules") + runtime_notice = ( + notice_text(GOOD_NOTICE).replace("Complete license and notice texts\n=================================\n\n", "") + + "Microsoft Visual C++ Runtime\n" + " Source: Microsoft Visual C++ Redistributable\n" + " Version: MSVC 14.44\n" + " License: Microsoft Software License Terms\n" + " Terms: Redistributed unmodified under the Microsoft Software License Terms\n" + " Files: vcruntime140.dll\n\n" + "Complete license and notice texts\n=================================\n\n" + ) + self.notice.write_text(runtime_notice, encoding="utf-8") + files = GOOD_FILES + ["bin/vcruntime140.dll"] + report = sbom.reconcile(INVENTORY, rules, sorted(files), self.notice, []) + self.assertEqual(report["errors"], []) + + def test_runtime_notice_without_terms_remains_fail_closed(self) -> None: + rules = sbom.notices.parse_package_rules(RUNTIME_RULES_TEXT, "runtime fixture rules") + self.notice.write_text( + notice_text(GOOD_NOTICE).replace("Complete license and notice texts\n=================================\n\n", "") + + "Microsoft Visual C++ Runtime\n" + " Source: Microsoft Visual C++ Redistributable\n" + " Version: MSVC 14.44\n" + " Files: vcruntime140.dll\n\n" + "Complete license and notice texts\n=================================\n\n", + encoding="utf-8", + ) + report = sbom.reconcile(INVENTORY, rules, sorted(GOOD_FILES + ["bin/vcruntime140.dll"]), self.notice, []) + self.assertIn("authoritative Terms line", "\n".join(report["errors"])) + + def test_shipped_runtime_requires_an_inventory_entry(self) -> None: + rules = sbom.notices.parse_package_rules(RUNTIME_RULES_TEXT, "runtime fixture rules") + report = sbom.reconcile( + INVENTORY, + rules, + sorted(GOOD_FILES + ["bin/vcruntime140.dll"]), + self.notice, + [], + ) + self.assertIn("no authoritative system runtime entry", "\n".join(report["errors"])) + + def test_runtime_entry_without_payload_is_not_an_authorization(self) -> None: + rules = sbom.notices.parse_package_rules(RUNTIME_RULES_TEXT, "runtime fixture rules") + notice = notice_text(GOOD_NOTICE).replace( + "Complete license and notice texts\n=================================\n\n", "" + ) + ( + "Microsoft Visual C++ Runtime\n" + " Source: Microsoft Visual C++ Redistributable\n" + " Version: MSVC 14.44\n" + " Terms: Redistributed unmodified under the Microsoft Software License Terms\n" + " Files: vcruntime140.dll\n\n" + "Complete license and notice texts\n=================================\n\n" + ) + self.notice.write_text(notice, encoding="utf-8") + report = sbom.reconcile(INVENTORY, rules, sorted(GOOD_FILES), self.notice, []) + self.assertIn("ships no runtime files", "\n".join(report["errors"])) + + def test_unreviewed_runtime_looking_notice_stays_unknown(self) -> None: + rules = sbom.notices.parse_package_rules(RUNTIME_RULES_TEXT, "runtime fixture rules") + notice = notice_text({**GOOD_NOTICE, "Microsoft Visual C++ Runtime (unreviewed)": "MSVC 14.44"}) + self.notice.write_text(notice, encoding="utf-8") + report = sbom.reconcile(INVENTORY, rules, sorted(GOOD_FILES), self.notice, []) + self.assertIn("Microsoft Visual C++ Runtime (unreviewed)", "\n".join(report["errors"])) + class TestInstallManifestAndTree(unittest.TestCase): def setUp(self) -> None: diff --git a/Tests/Tools/test_installed_module_abi_rejection.py b/Tests/Tools/test_installed_module_abi_rejection.py index 329183cb1..73d2533c4 100644 --- a/Tests/Tools/test_installed_module_abi_rejection.py +++ b/Tests/Tools/test_installed_module_abi_rejection.py @@ -81,6 +81,7 @@ def test_fixture_must_change_only_sdk_in_requested_direction(self): class OrchestrationTests(unittest.TestCase): + SDK_VERSION = 9 def setUp(self): self.temporary = tempfile.TemporaryDirectory(prefix="abi-contract-") self.addCleanup(self.temporary.cleanup) @@ -104,9 +105,9 @@ def image(name, version): fields.update(sdk_version=str(version), binary_sha256=ABI.digest(path)) Path(str(path) + ".sparkabi").write_text("\n".join(f"{k}={v}" for k, v in fields.items())) return path - image("SparkGameFPS.dll", 9) - self.newer = image("SparkMismatchedModuleFixture.dll", 10) - self.previous = image("SparkPreviousSdkModuleFixture.dll", 8) + image("SparkGameFPS.dll", self.SDK_VERSION) + self.newer = image("SparkMismatchedModuleFixture.dll", self.SDK_VERSION + 1) + self.previous = image("SparkPreviousSdkModuleFixture.dll", self.SDK_VERSION - 1) self.argv = ["--installed-root", str(self.prefix), "--newer", str(self.newer), "--previous", str(self.previous), "--evidence-root", str(self.evidence), "--source-sha", "a" * 40, "--configuration", "MinSizeRel"] @@ -125,8 +126,8 @@ def response(self, command, **kwargs): self.assertTrue(Path(env[key]).is_relative_to(module.parent)) self.assertFalse(Path(env["SPARK_MODULE_ABI_SENTINEL"]).exists()) self.assertEqual(kwargs["timeout"], 120) - declared = 10 if "Mismatched" in module.name else 8 - return subprocess.CompletedProcess(command, 2, InstalledAbiTests().output(str(module), 9, declared), "") + declared = self.SDK_VERSION + (1 if "Mismatched" in module.name else -1) + return subprocess.CompletedProcess(command, 2, InstalledAbiTests().output(str(module), self.SDK_VERSION, declared), "") def run_driver(self, effect): with mock.patch.object(ABI.subprocess, "run", side_effect=effect) as runner, \ @@ -178,5 +179,10 @@ def mutate(command, **kwargs): self.assertTrue(all("changed" in case["error"] for case in report["cases"])) +class Abi10OrchestrationTests(OrchestrationTests): + """Same mocked driver proof for host10 versus benign9/11 declarations.""" + SDK_VERSION = 10 + + if __name__ == "__main__": unittest.main() diff --git a/Tests/Tools/test_installed_native_runner.py b/Tests/Tools/test_installed_native_runner.py index 088a92543..fbf37060b 100644 --- a/Tests/Tools/test_installed_native_runner.py +++ b/Tests/Tools/test_installed_native_runner.py @@ -25,9 +25,39 @@ def setUp(self): self.built = self.binary / 'SparkEngine.exe' self.built.write_bytes(b'benign identity fixture') self.expected = runner.digest(self.built) - runner.save(self.root / 'identity.json', {'host_sha256': self.expected, + runner.save(self.root / 'identity.json', {'source_sha': runner.SOURCE, + 'host_sha256': self.expected, 'images': {str(self.built): self.expected}}) + def test_missing_or_changed_source_identity_prevents_any_subprocess(self): + path = self.root / 'identity.json' + captured = json.loads(path.read_text()) + for source_sha in (None, '0' * 40): + identity = dict(captured) + if source_sha is None: + del identity['source_sha'] + else: + identity['source_sha'] = source_sha + runner.save(path, identity) + for phase in ('sdk', 'abi', 'closure'): + with self.subTest(source_sha=source_sha, phase=phase), patch.object(runner, 'owned_run') as process: + with self.assertRaisesRegex(ValueError, 'Weather mode changed across phases'): + runner.run_phase(phase, self.source, self.root) + process.assert_not_called() + self.assertFalse((self.root / (phase + '-binding.json')).exists()) + + def test_changed_weather_mode_prevents_any_subprocess(self): + path = self.root / 'identity.json' + identity = json.loads(path.read_text()) + identity['weather_consumer'] = True + runner.save(path, identity) + for phase in ('sdk', 'abi', 'closure'): + with self.subTest(phase=phase), patch.object(runner, 'owned_run') as process: + with self.assertRaisesRegex(ValueError, 'Weather mode changed across phases'): + runner.run_phase(phase, self.source, self.root) + process.assert_not_called() + self.assertFalse((self.root / (phase + '-binding.json')).exists()) + def test_sdk_uses_installed_runner_reference_compiler_and_bound(self): installed = self.root / 'sdk/prefix/bin/SparkEngine.exe' def simulated(command, **kwargs): diff --git a/Tests/Tools/test_libsodium_debug_build.py b/Tests/Tools/test_libsodium_debug_build.py new file mode 100644 index 000000000..16bff2b71 --- /dev/null +++ b/Tests/Tools/test_libsodium_debug_build.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 +"""Build the real non-MSVC crypto component and exercise its password contract.""" + +import argparse +import json +import os +from pathlib import Path +import re +import shlex +import shutil +import subprocess +import tempfile +import unittest + +ROOT = Path(__file__).resolve().parents[2] +CMAKE = shutil.which("cmake") +COMPILER_ARGUMENTS: list[str] = [] + + +def run(arguments: list[str]) -> str: + result = subprocess.run(arguments, text=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=150) + if result.returncode: + raise AssertionError(f"Command failed ({result.returncode}): {shlex.join(arguments)}\n{result.stdout[-12000:]}") + return result.stdout + + +@unittest.skipIf(os.name == "nt", "The optimization fix applies to the non-MSVC component") +class LibsodiumDebugBuildTests(unittest.TestCase): + def test_debug_dependency_flags_and_existing_password_contract(self) -> None: + self.assertIsNotNone(CMAKE, "CMake is required for this build contract") + with tempfile.TemporaryDirectory(prefix="spark-sodium-debug-") as temporary: + source = Path(temporary) + source.joinpath("main.cpp").write_text( + '#include "TestFramework.h"\n' + 'int g_assertionsPassed=0, g_assertionsFailed=0, g_assertionsWaived=0, ' + 'g_assertionsNoCrash=0, g_testsWarned=0;\n' + 'std::string g_currentTest;\n' + 'int main() { for(auto* test : GetTestRegistry()) { g_currentTest=test->name; ' + 'try { test->func(); } catch (...) { ++g_assertionsFailed; } ' + 'std::cout << test->name << "\\n"; } ' + 'std::cout << "passed=" << g_assertionsPassed << " failed=" << g_assertionsFailed << "\\n"; ' + 'return g_assertionsFailed != 0 || g_assertionsPassed == 0; }\n', + encoding="utf-8", + ) + root = ROOT.as_posix() + source.joinpath("CMakeLists.txt").write_text( + 'cmake_minimum_required(VERSION 3.25)\n' + 'project(SparkSodiumDebugContract LANGUAGES C CXX)\n' + 'set(CMAKE_CXX_STANDARD 23)\n' + 'set(CMAKE_EXPORT_COMPILE_COMMANDS ON)\n' + f'set(SPARK_CONTRACT_ROOT [==[{root}]==])\n' + 'include("${SPARK_CONTRACT_ROOT}/cmake/SparkLibsodium.cmake")\n' + 'add_executable(password_contract main.cpp\n' + ' "${SPARK_CONTRACT_ROOT}/Tests/TestPasswordHash.cpp"\n' + ' "${SPARK_CONTRACT_ROOT}/SparkEngine/Source/Utils/PasswordHash.cpp"\n' + ' "${SPARK_CONTRACT_ROOT}/SparkEngine/Source/Utils/SecureRandom.cpp")\n' + 'target_compile_definitions(password_contract PRIVATE SPARK_HAS_LIBSODIUM=1)\n' + 'target_include_directories(password_contract PRIVATE\n' + ' "${SPARK_CONTRACT_ROOT}/Tests" "${SPARK_CONTRACT_ROOT}/SparkEngine/Source")\n' + 'target_link_libraries(password_contract PRIVATE spark_sodium)\n', + encoding="utf-8", + ) + generator = "Ninja" if shutil.which("ninja") else "Unix Makefiles" + for configuration in ("Debug", "Release"): + build = source / configuration + run([CMAKE, "-S", str(source), "-B", str(build), "-G", generator, + f"-DCMAKE_BUILD_TYPE={configuration}", *COMPILER_ARGUMENTS]) + commands = json.loads(build.joinpath("compile_commands.json").read_text(encoding="utf-8")) + sodium_commands = [entry for entry in commands if "/ThirdParty/Security/libsodium/" in entry["file"]] + self.assertGreater(len(sodium_commands), 100, "The fixture must configure the actual vendored target") + for entry in sodium_commands: + flags = entry.get("arguments") or shlex.split(entry["command"]) + with self.subTest(configuration=configuration, source=entry["file"]): + for flag in ("-fno-strict-aliasing", "-fno-strict-overflow", "-fwrapv"): + self.assertIn(flag, flags) + self.assertIn("-DHAVE_INLINE_ASM=1", flags) + self.assertTrue(any(f in flags for f in + ("-DHAVE_C11_MEMORY_FENCES=1", "-DHAVE_GCC_MEMORY_FENCES=1"))) + self.assertFalse(any(f in flags for f in + ("-DHAVE_AVXINTRIN_H=1", "-DHAVE_AVX2INTRIN_H=1", + "-DHAVE_AVX512FINTRIN_H=1", "-DHAVE_WMMINTRIN_H=1"))) + optimizations = [flag for flag in flags if flag.startswith("-O")] + if configuration == "Debug": + self.assertTrue(any(flag.startswith("-g") for flag in flags)) + self.assertTrue(optimizations, "Debug crypto must have an explicit optimization level") + self.assertEqual(optimizations[-1], "-O2") + self.assertGreater(flags.index("-O2"), flags.index("-flax-vector-conversions")) + else: + # The Debug-only override must leave the normal Release flags intact. + self.assertNotIn("-O2", flags[flags.index("-flax-vector-conversions") + 1:]) + if configuration == "Debug": + for entry in commands: + if entry["file"].endswith("/Utils/PasswordHash.cpp"): + flags = entry.get("arguments") or shlex.split(entry["command"]) + self.assertFalse(any(f in flags for f in ("-O1", "-O2", "-O3", "-Og")), + "Only the dependency should acquire optimization") + run([CMAKE, "--build", str(build), "--target", "password_contract", "--parallel", "2"]) + output = run([str(build / "password_contract")]) + for name in ("CreatesSelfDescribingUniqueHashes", "RejectsLegacyMalformedAndUnboundedWorkFactors", + "MatchesPublishedPBKDF2Sha256Construction", "PreservesPreMigrationHmacBytes"): + self.assertIn("SparkPasswordHash_" + name, output) + result = re.search(r"^passed=(\d+) failed=0$", output, re.MULTILINE) + self.assertIsNotNone(result) + self.assertGreaterEqual(int(result.group(1)), 12) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument("--cmake", default=CMAKE) + parser.add_argument("--c-compiler") + parser.add_argument("--cxx-compiler") + arguments, remaining = parser.parse_known_args() + CMAKE = arguments.cmake + if arguments.c_compiler: + COMPILER_ARGUMENTS.append(f"-DCMAKE_C_COMPILER={arguments.c_compiler}") + if arguments.cxx_compiler: + COMPILER_ARGUMENTS.append(f"-DCMAKE_CXX_COMPILER={arguments.cxx_compiler}") + unittest.main(argv=[__file__, *remaining]) diff --git a/Tests/Tools/test_module_private_dependencies.py b/Tests/Tools/test_module_private_dependencies.py index 128771dd4..58ef13a7c 100644 --- a/Tests/Tools/test_module_private_dependencies.py +++ b/Tests/Tools/test_module_private_dependencies.py @@ -39,7 +39,7 @@ # Reviewed one-way ceilings for SparkGameFPS (MOD-310 target: zero). Lower them # together with the committed inventory whenever headers or copied files are # removed; never raise them. -FPS_PRIVATE_HEADER_CEILING = 38 +FPS_PRIVATE_HEADER_CEILING = 36 FPS_COPIED_INFRASTRUCTURE_CEILING = 1 diff --git a/Tests/Tools/test_ops100_telemetry_spool.py b/Tests/Tools/test_ops100_telemetry_spool.py index c49fb7df2..a6639a8a8 100644 --- a/Tests/Tools/test_ops100_telemetry_spool.py +++ b/Tests/Tools/test_ops100_telemetry_spool.py @@ -69,7 +69,7 @@ def test_valid_cpp_shaped_batch(self) -> None: def test_current_runtime_filename_with_sequence_range_is_accepted(self) -> None: first = valid_event() first["sequence"] = 7 - second = valid_event() + second = dict(first) second["sequence"] = 9 self.write_batch([first, second], self.runtime_batch_name(7, 9)) validator = self.validate() diff --git a/Tests/Tools/test_sdk240_abi_surface.py b/Tests/Tools/test_sdk240_abi_surface.py index 99ff20b19..2c304ab52 100644 --- a/Tests/Tools/test_sdk240_abi_surface.py +++ b/Tests/Tools/test_sdk240_abi_surface.py @@ -121,7 +121,14 @@ def test_golden_records_real_engine_context_vtable(self) -> None: # Declaration order is vtable order; the destructor is declared first. self.assertTrue(slots[0].startswith("~IEngineContext"), slots[0]) self.assertEqual(slots[1], "GraphicsEngine* GetGraphics()") - self.assertEqual(slots[-1], "IStateValidation* GetStateValidation()") + self.assertEqual(slots[-2], "IStateValidation* GetStateValidation()") + self.assertEqual(slots[-1], "IWeatherService* GetWeatherService()") + weather = golden["surface"]["enums"]["Spark::WeatherPreset"] + self.assertEqual(weather, {"underlying": "uint32_t", "values": [ + "Clear = 0", "Rain = 1", "Snow = 2", "Fog = 3", "Storm = 4"]}) + self.assertEqual(golden["surface"]["interfaces"]["Spark::IWeatherService"]["virtuals"], + ["~IWeatherService()", + "bool SetWeather(WeatherPreset preset, float intensity, float transitionSeconds)"]) header = (INCLUDE / "IEngineContext.h").read_text(encoding="utf-8") pinned = int(re.search(r"EngineContextVirtualCount = (\d+);", header).group(1)) self.assertEqual(len(slots), pinned) @@ -146,6 +153,14 @@ def test_update_refuses_to_repin_an_unbumped_abi_change(self) -> None: self.sdk.set_engine_context_count(GROWN_COUNT) self.assertFails(self.sdk.run("update"), "without a SPARK_SDK_VERSION bump") + def test_weather_enum_change_requires_version_bump(self) -> None: + self.sdk.edit("IWeatherService.h", "Rain = 1", "Rain = 5") + self.assertFails(self.sdk.run(), "Spark::WeatherPreset") + + def test_weather_signature_change_requires_version_bump(self) -> None: + self.sdk.edit("IWeatherService.h", "float intensity", "double intensity") + self.assertFails(self.sdk.run(), "Spark::IWeatherService") + def test_reordered_virtuals_fail(self) -> None: self.sdk.edit("IModule.h", "virtual void OnPause() {}", "virtual void OnPauseTmp() {}") self.sdk.edit("IModule.h", "virtual void OnResume() {}", "virtual void OnPause() {}") diff --git a/Tests/Tools/test_sdk_component_completeness.py b/Tests/Tools/test_sdk_component_completeness.py index 4d621b456..87f6584a0 100644 --- a/Tests/Tools/test_sdk_component_completeness.py +++ b/Tests/Tools/test_sdk_component_completeness.py @@ -18,6 +18,7 @@ "include/Spark/GeneratedVersion.h", "include/Spark/IModule.h", "include/Spark/ModuleABI.h", + "include/Spark/IWeatherService.h", "lib/cmake/SparkEngine/SparkEngineConfig.cmake", "lib/cmake/SparkEngine/SparkEngineConfigVersion.cmake", "lib/cmake/SparkEngine/SparkEngineTargets.cmake", @@ -32,7 +33,7 @@ class SdkComponentCompletenessTests(unittest.TestCase): - def _write_fixture(self, root: Path) -> tuple[Path, Path]: + def _write_fixture(self, root: Path, *, fail_runtime: bool = False) -> tuple[Path, Path]: source = root / "source" build = root / "build" for relative in REQUIRED_FILES: @@ -54,14 +55,27 @@ def _write_fixture(self, root: Path) -> tuple[Path, Path]: ) elif relative.endswith("MIGRATION.md"): path.write_text( - "## Current version: SDK ABI v9\nThere is no N-1 module load\n", + "## Current version: SDK ABI v10\nThere is no N-1 module load\n", encoding="utf-8", ) else: path.write_text("fixture\n", encoding="utf-8") cmake = source / "CMakeLists.txt" - install_lines = [] + runtime_code = ( + 'message(FATAL_ERROR "fixture runtime install failed")' + if fail_runtime + else 'file(WRITE "${CMAKE_INSTALL_PREFIX}/runtime-installed" "runtime\\n")' + ) + install_lines = [ + f'install(CODE [[{runtime_code}]] COMPONENT runtime)', + 'install(CODE [[\n' + 'file(WRITE "${CMAKE_INSTALL_PREFIX}/sdk-started" "sdk\\n")\n' + 'if(NOT EXISTS "${CMAKE_INSTALL_PREFIX}/runtime-installed")\n' + ' message(FATAL_ERROR "SDK fixture requires runtime to be installed first")\n' + 'endif()\n' + ']] COMPONENT sdk)', + ] for relative in REQUIRED_FILES: install_lines.append( f'install(FILES "${{CMAKE_CURRENT_SOURCE_DIR}}/{relative}" OPTIONAL ' @@ -143,7 +157,7 @@ def test_every_required_file_is_fail_closed(self) -> None: for relative, token in ( ("share/SparkEngine/sdk/API-REFERENCE.md", "## Module lifecycle"), - ("share/SparkEngine/sdk/MIGRATION.md", "## Current version: SDK ABI v9"), + ("share/SparkEngine/sdk/MIGRATION.md", "## Current version: SDK ABI v10"), ): with self.subTest(missing_documentation=relative): path = source / relative @@ -156,6 +170,18 @@ def test_every_required_file_is_fail_closed(self) -> None: self.assertIn(token, output) path.write_text(original, encoding="utf-8") + def test_failed_runtime_dependency_stops_before_sdk_install(self) -> None: + temp_parent = os.environ.get("TMP") or os.environ.get("TEMP") + with tempfile.TemporaryDirectory(prefix="spark-sdk-dependency-", dir=temp_parent) as temporary: + root = Path(temporary) + build, _ = self._write_fixture(root, fail_runtime=True) + test_root = root / "failed-runtime" + result = self._run_check(build, test_root) + self.assertNotEqual(result.returncode, 0) + self.assertIn("Installing the runtime component failed", result.stdout + result.stderr) + self.assertIn("fixture runtime install failed", result.stdout + result.stderr) + self.assertFalse((test_root / "prefix/sdk-started").exists()) + if __name__ == "__main__": unittest.main() diff --git a/Tests/Tools/test_sdk_weather_consumer.py b/Tests/Tools/test_sdk_weather_consumer.py new file mode 100644 index 000000000..1ae14720a --- /dev/null +++ b/Tests/Tools/test_sdk_weather_consumer.py @@ -0,0 +1,179 @@ +"""Compiler-free checks using the actual CMake parsers and consumer injection.""" +import hashlib +import json +import importlib.util +from pathlib import Path +import subprocess +import tempfile +import unittest +from unittest.mock import patch + +ROOT = Path(__file__).resolve().parents[2] +RUNNER = ROOT/'Tests/PackageSmoke/RunInstalledSDKTemplate.cmake' +LIFECYCLE = ROOT/'cmake/RunSparkModuleProfileLifecycle.cmake' +DEVICE = 'SPARK_D3D11_DEVICE driver=warp certification=software-only\n' +COUNTS = ' create=1 load=1 update=3 fixed=2 render=3 unload=1 destroy=1 faults=0\n' + +def bracket(value): + return '[===['+value+']===]' + + +class WeatherConsumerContracts(unittest.TestCase): + def cmake(self, body, good=True): + with tempfile.TemporaryDirectory() as tmp: + script=Path(tmp)/'test.cmake' + script.write_text(body,encoding='utf-8') + result=subprocess.run(['cmake','-P',str(script)],capture_output=True,text=True,timeout=30) + self.assertEqual(result.returncode==0,good,result.stdout+result.stderr) + + def test_weather_records_fail_closed(self): + lines=['set(SPARK_SDK_WEATHER_PARSER_ONLY ON)', 'include('+bracket(RUNNER.as_posix())+')'] + null='SPARK_SDK_WEATHER module=SparkGeneratedGame available=0 accepted=0 invalid_rejected=0 clear_accepted=0 callback=OnLoad\n' + live=null.replace('=0','=1') + cases=[(null,0,True),(live,1,True),(null,1,False),(live,0,False), + ('',1,False),(live+live,1,False),('[log] '+live,1,False), + (live.replace('accepted=1','accepted=0'),1,False), + (live.replace('SparkGeneratedGame','SparkGameFPS'),1,False), + (live+'SPARK_SDK_WEATHER broken\n',1,False)] + for text,available,good in cases: + lines.append('_spark_sdk_template_weather_result('+bracket(text)+' "" '+str(available)+' error)') + lines += [('if(NOT error STREQUAL "")' if good else 'if(error STREQUAL "")'), + 'message(FATAL_ERROR "weather case verdict mismatch")','endif()'] + self.cmake('\n'.join(lines)) + + def test_real_lifecycle_parser_keeps_default_and_checks_named_consumer(self): + lines=['set(SPARK_LIFECYCLE_PARSER_INCLUDE_ONLY ON)', 'include('+bracket(LIFECYCLE.as_posix())+')'] + fps=DEVICE+'SPARK_MODULE_LIFECYCLE module=SparkGameFPS'+COUNTS + generated=DEVICE+'SPARK_MODULE_LIFECYCLE module=SparkGeneratedGame'+COUNTS + cases=[(fps,'',True),(generated,'SparkGeneratedGame',True),(generated,'',False), + (fps,'SparkGeneratedGame',False),(DEVICE,'SparkGeneratedGame',False), + (generated+generated,'SparkGeneratedGame',False), + (generated.replace('fixed=2','fixed=0'),'SparkGeneratedGame',False), + (generated.replace('faults=0','faults=1'),'SparkGeneratedGame',False), + (generated,'bad.*',False)] + for text,module,good in cases: + arg=' '+bracket(module) if module else '' + lines.append('_spark_validate_lifecycle_result(0 '+bracket(text)+' "" ok reason'+arg+')') + lines += [('if(NOT ok)' if good else 'if(ok)'), 'message(FATAL_ERROR "lifecycle case verdict mismatch")','endif()'] + self.cmake('\n'.join(lines)) + + def test_production_injection_uses_public_types_and_rejects_ambiguous_hooks(self): + source=RUNNER.read_text(encoding='utf-8') + start=source.index('if(SPARK_SDK_WEATHER_CONSUMER)\n set(_consumer_header') + block=source[start:source.index('\nset(_configure',start)] + for original,good in [('m_context = context;\n',True),('no hook\n',False),('m_context = context;\nm_context = context;\n',False)]: + with tempfile.TemporaryDirectory() as tmp: + project=Path(tmp) + (project/'Source').mkdir() + header=project/'Source/GameModule.h' + header.write_text(original) + self.cmake('set(SPARK_SDK_WEATHER_CONSUMER ON)\nset(_source '+bracket(project.as_posix())+')\n'+block,good) + if good: + text=header.read_text() + self.assertIn('#include ',text) + self.assertIn('context->GetWeatherService()',text) + self.assertIn('Spark::WeatherPreset::Rain, 0.25f, 0.5f',text) + self.assertIn('static_cast(99)',text) + self.assertNotIn('Graphics/WeatherSystem.h',text) + + def test_optional_route_preserves_headless_and_real_windowed_requirements(self): + source=RUNNER.read_text(encoding='utf-8') + self.assertIn('NOT CMAKE_HOST_WIN32 OR NOT _sdk_version STREQUAL "10"',source) + self.assertIn('"${_engine}" -headless -game "${_images}" -require-game',source) + windowed=source[source.index('# The real windowed host registers WeatherSystem'):] + self.assertNotIn('-headless',windowed) + self.assertIn('"SPARK_D3D11_DRIVER=warp"',windowed) + self.assertIn('_weather_sidecar_before STREQUAL _weather_sidecar_after',windowed) + self.assertIn('_weather_host_before STREQUAL _weather_host_after',windowed) + self.assertIn('_image_sha256 STREQUAL _weather_module_after',windowed) + + def test_windows_producer_uses_real_unambiguous_teardown_record(self): + source=(ROOT/'SparkEngine/Source/Core/SparkEngineWindows.cpp').read_text(encoding='utf-8') + block=source[source.index('const ModuleManager::LifecycleEvidence evidence = ModuleManager::GetLastTeardownLifecycleEvidence();'):] + self.assertIn('evidence.FindGameModule()',block) + self.assertIn('ModuleManager::FormatLifecycleRecord(*record)',block) + self.assertNotIn('FindModule("Spark Arena - Engine Showcase")',block) + self.assertNotIn('module=SparkGeneratedGame',block) + + def test_weather_streams_are_complete_proof_not_diagnostic_tails(self): + spec=importlib.util.spec_from_file_location('weather_collector',ROOT/'.github/scripts/qualify-installed-native.py') + module=importlib.util.module_from_spec(spec);spec.loader.exec_module(module) + for size,good in [(20000,True),(131073,False)]: + with tempfile.TemporaryDirectory() as tmp: + root=Path(tmp);(root/'sdk').mkdir() + raw=b'w'*size + (root/'sdk/runtime-weather-stdout.log').write_bytes(raw) + if good: + module.compact(root) + self.assertEqual((root/'diagnostics-text/sdk/runtime-weather-stdout.log').read_bytes(),raw) + else: + with self.assertRaises(ValueError):module.compact(root) + self.assertFalse((root/'diagnostics-text').exists()) + + def test_mode_bound_complete_receipt_and_tamper_rejection(self): + spec=importlib.util.spec_from_file_location('receipt_collector',ROOT/'.github/scripts/qualify-installed-native.py') + module=importlib.util.module_from_spec(spec);spec.loader.exec_module(module) + source=RUNNER.read_text() + start=source.index(' # Complete identity proof') + writer=source[start:source.index(' message(STATUS "SPARK_SDK_WEATHER_RUNTIME',start)] + # This unit owns consumer proof only; the permanent workflow tests exercise + # the real combined focused+consumer collector, including missing proofs. + with patch.object(module, 'focused_proof', return_value=None, create=True): + for mutation in ('none','missing-receipt','missing-stream','tampered-stream','wrong-source','wrong-binding','wrong-result','duplicate-key','mode-omitted','missing-binding','failed-sdk'): + with self.subTest(mutation=mutation), tempfile.TemporaryDirectory() as tmp: + root=Path(tmp);sdk=root/'sdk';sdk.mkdir() + identity=dict(source_sha='a'*40,workflow_sha='b'*40,run_id='123',run_attempt='1',host_sha256='c'*64,weather_consumer=True,focused={}) + module.save(root/'identity.json',identity) + for weather,available in (('',0),('-weather',1)): + (sdk/f'runtime{weather}-stdout.log').write_text(f'SPARK_SDK_WEATHER module=SparkGeneratedGame available={available} accepted={available} invalid_rejected={available} clear_accepted={available} callback=OnLoad\n') + (sdk/f'runtime{weather}-stderr.log').write_text('x'*20000) + variables=dict(_scanned='2',SPARK_TEST_ROOT=sdk.as_posix(),_module_name='SparkGeneratedGame',SPARK_WEATHER_SOURCE_SHA='a'*40,SPARK_WEATHER_WORKFLOW_SHA='b'*40,SPARK_WEATHER_RUN_ID='123',SPARK_WEATHER_RUN_ATTEMPT='1',_weather_consumer_sha256='d'*64,_weather_host_after='c'*64,_image_sha256='e'*64,_weather_sidecar_after='f'*64) + self.cmake('\n'.join('set('+key+' '+bracket(value)+')' for key,value in variables.items())+'\n'+writer) + receipt=sdk/'weather-identity.json' + boundary=json.loads(receipt.read_text()) + self.assertIs(type(boundary['boundary_scanned']),int) + self.assertEqual(boundary['boundary_scanned'],2) + self.assertIs(type(boundary['boundary_violations']),int) + self.assertEqual(boundary['boundary_violations'],0) + binding=dict(passed=True,source_sha='a'*40,host_sha256='c'*64,weather_identity_sha256=module.digest(receipt)) + module.save(root/'sdk-binding.json',binding) + if mutation=='missing-receipt':receipt.unlink() + if mutation=='missing-stream':(sdk/'runtime-weather-stderr.log').unlink() + if mutation=='tampered-stream':(sdk/'runtime-weather-stderr.log').write_text('tampered') + if mutation=='wrong-source': + value=json.loads(receipt.read_text());value['source_sha']='0'*40;module.save(receipt,value) + if mutation=='wrong-binding':binding['weather_identity_sha256']='0'*64;module.save(root/'sdk-binding.json',binding) + if mutation=='wrong-result': + path=sdk/'runtime-weather-stdout.log';path.write_text(path.read_text().replace('accepted=1','accepted=0')) + value=json.loads(receipt.read_text());value['streams'][path.name]=module.digest(path);module.save(receipt,value) + if mutation=='duplicate-key':receipt.write_text(receipt.read_text().replace('{','{"module":"bad",',1)) + if mutation=='missing-binding':(root/'sdk-binding.json').unlink() + if mutation=='failed-sdk': + (root/'sdk-binding.json').unlink();receipt.unlink();module.save(root/'sdk-failure.json',dict(error='fixture failure')) + if mutation in ('none','failed-sdk'): + module.compact(root,True,'a'*40) + self.assertEqual((root/'diagnostics-text/sdk/runtime-weather-stderr.log').stat().st_size,20000) + if mutation=='none':self.assertEqual((root/'diagnostics-text/sdk/weather-identity.json').read_bytes(),receipt.read_bytes()) + else: + with self.assertRaises((ValueError,FileNotFoundError)): + module.compact(root,mutation!='mode-omitted','a'*40) + self.assertFalse((root/'diagnostics-text').exists()) + + def test_current_weather_source_and_run_cannot_drift(self): + spec=importlib.util.spec_from_file_location('identity_collector',ROOT/'.github/scripts/qualify-installed-native.py') + module=importlib.util.module_from_spec(spec);spec.loader.exec_module(module) + identity=dict(source_sha='a'*40,workflow_sha='b'*40,run_id='123',run_attempt='1') + env=dict(GITHUB_SHA='b'*40,GITHUB_RUN_ID='123',GITHUB_RUN_ATTEMPT='1') + for mutation in ('none','head','dirty','workflow','run','attempt'): + changed=dict(env) + if mutation in ('workflow','run','attempt'): + changed[dict(workflow='GITHUB_SHA',run='GITHUB_RUN_ID',attempt='GITHUB_RUN_ATTEMPT')[mutation]]='wrong' + def git(*args): + if args[0]=='rev-parse':return ('c' if mutation=='head' else 'a')*40 + return ' M tracked.cpp' if mutation=='dirty' else '' + with patch.dict(module.os.environ,changed): + if mutation=='none':module.weather_source_identity(identity,git) + else: + with self.assertRaises(ValueError):module.weather_source_identity(identity,git) + +if __name__=='__main__': unittest.main() diff --git a/Tests/Tools/test_sdl_component_archives.py b/Tests/Tools/test_sdl_component_archives.py new file mode 100644 index 000000000..f9ee2b2c0 --- /dev/null +++ b/Tests/Tools/test_sdl_component_archives.py @@ -0,0 +1,180 @@ +#!/usr/bin/env python3 +"""Exercise production SDL2 component rules with real CMake and CPack.""" + +from __future__ import annotations + +import os +from pathlib import Path +import shutil +import subprocess +import sys +import tarfile +import tempfile +import unittest +import zipfile + + +REPO = Path(__file__).resolve().parents[2] + + +@unittest.skipUnless(sys.platform in ("linux", "darwin"), "POSIX shared-library component rules") +class SDLComponentArchiveTests(unittest.TestCase): + @classmethod + def setUpClass(cls) -> None: + cls.cmake = shutil.which("cmake") + cls.cpack = shutil.which("cpack") + cls.compiler = shutil.which("cc") + cls.generator = "Ninja" if shutil.which("ninja") else "Unix Makefiles" + if not all((cls.cmake, cls.cpack, cls.compiler)) or ( + cls.generator == "Unix Makefiles" and not shutil.which("make") + ): + raise unittest.SkipTest("CMake, CPack, a C compiler and a build tool are required") + cls.fixture = tempfile.TemporaryDirectory(prefix="spark-sdl-component-") + cls.addClassCleanup(cls.fixture.cleanup) + cls.root = Path(cls.fixture.name).resolve() + cls.source = cls.root / "source" + cls.build = cls.root / "build" + cls.source.mkdir() + + # Use the actual root-owned install rules and RPATH policy. The small + # shared library replaces only SDL's compilation, not package logic. + production = (REPO / "CMakeLists.txt").read_text(encoding="utf-8") + start = production.index("if(APPLE)\n set(CMAKE_MACOSX_RPATH ON)") + rpath = production[start:production.index("\nendif()", start) + len("\nendif()")] + start = production.index('if(TARGET SDL2 AND EXISTS "${SDL2_SUBMODULE_DIR}/include")') + start = production.index("\n", start) + 1 + end = production.index(" install(FILES ${_SDL2_PUBLIC_HEADERS}", start) + install_rules = production[start:end] + (cls.source / "sdl.c").write_text("int spark_sdl_fixture(void) { return 0; }\n", encoding="utf-8") + (cls.source / "CMakeLists.txt").write_text( + "cmake_minimum_required(VERSION 3.25)\n" + "project(SparkSDLComponentFixture C)\n" + + rpath + "\n" + "set(SPARK_INSTALL_COMPONENT_RUNTIME runtime)\n" + "set(SPARK_INSTALL_COMPONENT_SDK sdk)\n" + "add_library(SDL2 SHARED sdl.c)\n" + "set_target_properties(SDL2 PROPERTIES VERSION 1.2 SOVERSION 1)\n" + + install_rules + "\n" + 'file(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/names.txt" CONTENT ' + '"$\\n$\\n' + '$\\n")\n' + 'file(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/image.txt" CONTENT "$")\n' + "set(CPACK_PACKAGE_NAME SparkSDLComponentFixture)\n" + "set(CPACK_PACKAGE_VERSION 1.0.0)\n" + "set(CPACK_COMPONENTS_ALL runtime sdk)\n" + "set(CPACK_ARCHIVE_COMPONENT_INSTALL ON)\n" + "set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE)\n" + f'set(CPACK_PROJECT_CONFIG_FILE "{(REPO / "cmake/SparkCPackOptions.cmake").as_posix()}")\n' + "include(CPack)\n", + encoding="utf-8", + ) + cls.checked(cls.cmake, "-S", cls.source, "-B", cls.build, "-G", cls.generator) + cls.checked(cls.cmake, "--build", cls.build) + cls.real_name, cls.soname, cls.linker_name = (cls.build / "names.txt").read_text().splitlines() + cls.image = Path((cls.build / "image.txt").read_text()) + + @classmethod + def checked(cls, *arguments: object) -> subprocess.CompletedProcess: + result = subprocess.run([str(argument) for argument in arguments], capture_output=True, + text=True, check=False, timeout=60) + if result.returncode: + raise AssertionError(result.stdout + result.stderr) + return result + + def setUp(self) -> None: + self.work = Path(tempfile.mkdtemp(prefix="case-", dir=self.root)) + self.addCleanup(shutil.rmtree, self.work) + + def install(self, prefix: Path, component: str) -> None: + self.checked(self.cmake, "--install", self.build, "--prefix", prefix, "--component", component) + + def consumer(self, prefix: Path) -> subprocess.CompletedProcess: + source = self.work / "consumer" + source.mkdir() + (source / "CMakeLists.txt").write_text( + "cmake_minimum_required(VERSION 3.25)\nproject(SDLConsumer NONE)\n" + f'include("{(prefix / "lib/cmake/SDL2/SDL2Targets.cmake").as_posix()}")\n', + encoding="utf-8", + ) + return subprocess.run([self.cmake, "-S", str(source), "-B", str(self.work / "consumer-build")], + capture_output=True, text=True, check=False, timeout=30) + + def assert_regular_payload(self, prefix: Path) -> None: + expected = self.image.read_bytes() + for name in (self.real_name, self.soname, self.linker_name): + with self.subTest(library=name): + file = prefix / "lib" / name + self.assertTrue(file.is_file()) + self.assertFalse(file.is_symlink()) + self.assertEqual(expected, file.read_bytes()) + + def test_runtime_then_sdk_preserves_names_bytes_and_exported_target(self) -> None: + prefix = self.work / "prefix" + self.install(prefix, "runtime") + self.install(prefix, "sdk") + self.assert_regular_payload(prefix) + result = self.consumer(prefix) + self.assertEqual(0, result.returncode, result.stdout + result.stderr) + + def test_real_cpack_archives_pass_unchanged_production_preflight(self) -> None: + for generator, pattern in (("TGZ", "*.tar.gz"), ("ZIP", "*.zip")): + with self.subTest(generator=generator): + output = self.work / generator + self.checked(self.cpack, "--config", self.build / "CPackConfig.cmake", + "-G", generator, "-B", output) + archives = list(output.glob(pattern)) + self.assertEqual(1, len(archives)) + archive = archives[0] + self.checked(sys.executable, "-B", REPO / ".github/scripts/validate-extracted-package.py", + "--preflight-archive", archive) + extracted = output / "extracted" + if generator == "TGZ": + with tarfile.open(archive) as payload: + payload.extractall(extracted, filter="data") + else: + with zipfile.ZipFile(archive) as payload: + payload.extractall(extracted) + roots = list(extracted.iterdir()) + self.assertEqual(1, len(roots)) + self.assert_regular_payload(roots[0]) + + def test_sdk_alone_does_not_satisfy_declared_runtime_dependency(self) -> None: + prefix = self.work / "prefix" + self.install(prefix, "sdk") + self.assertFalse((prefix / "lib" / self.real_name).exists()) + result = self.consumer(prefix) + self.assertNotEqual(0, result.returncode) + self.assertIn(self.real_name, result.stdout + result.stderr) + self.assertIn("does not exist", result.stdout + result.stderr) + + def test_sdk_replaces_a_legacy_in_prefix_developer_link(self) -> None: + prefix = self.work / "prefix" + self.install(prefix, "runtime") + real = prefix / "lib" / self.real_name + alias = prefix / "lib" / self.linker_name + alias.symlink_to(real.name) + # CMake's plain file install can retain an up-to-date symlink. + future = self.image.stat().st_mtime_ns + 10_000_000_000 + os.utime(real, ns=(future, future)) + self.install(prefix, "sdk") + self.assert_regular_payload(prefix) + + def test_sdk_rejects_a_legacy_developer_link_outside_library_directory(self) -> None: + prefix = self.work / "prefix" + library = prefix / "lib" + library.mkdir(parents=True) + sentinel = self.work / "outside-library" + sentinel.write_bytes(b"preserve outside bytes") + alias = library / self.linker_name + alias.symlink_to(sentinel) + result = subprocess.run([self.cmake, "--install", str(self.build), "--prefix", str(prefix), + "--component", "sdk"], capture_output=True, text=True, + check=False, timeout=30) + self.assertNotEqual(0, result.returncode) + self.assertIn("SDL2 install link escapes its library directory", result.stdout + result.stderr) + self.assertTrue(alias.is_symlink()) + self.assertEqual(b"preserve outside bytes", sentinel.read_bytes()) + + +if __name__ == "__main__": + unittest.main() diff --git a/Tests/Tools/test_site_runtime_tests.py b/Tests/Tools/test_site_runtime_tests.py index bbcb2e54c..ca8bd1e5c 100644 --- a/Tests/Tools/test_site_runtime_tests.py +++ b/Tests/Tools/test_site_runtime_tests.py @@ -3,8 +3,10 @@ from __future__ import annotations +import json import os from pathlib import Path +import re import subprocess import sys import tempfile @@ -45,6 +47,62 @@ class SiteRuntimeRunnerTests(unittest.TestCase): + def test_ctest_prioritizes_the_complete_bundle_with_unchanged_safety_bounds(self) -> None: + source = (ROOT / "Tests" / "CMakeLists.txt").read_text(encoding="utf-8") + source = re.sub(r"#[^\n]*", "", source) + registrations = re.findall( + r"add_test\(\s*NAME\s+runtime-bundle-validation\s+(.*?)\)", source, re.DOTALL + ) + self.assertEqual(1, len(registrations)) + properties = re.findall( + r"set_tests_properties\(runtime-bundle-validation\s+PROPERTIES\s+(.*?)\)", + source, + re.DOTALL, + ) + self.assertEqual(1, len(properties)) + python = Path(sys.executable).as_posix() + registration = "add_test(NAME runtime-bundle-validation " + registrations[0] + ")" + registration = registration.replace("${CMAKE_SOURCE_DIR}", ROOT.as_posix()) + fixture = ( + "cmake_minimum_required(VERSION 3.25)\n" + "project(RuntimeRegistration LANGUAGES NONE)\nenable_testing()\n" + f'set(Python3_EXECUTABLE "{python}")\n' + 'set(SPARK_NODE_EXECUTABLE node)\n' + 'set(SPARK_SITE_DATA_TREE_LOCK "site-data-source-tree")\n' + + registration + "\n" + + "set_tests_properties(runtime-bundle-validation PROPERTIES " + properties[0] + ")\n" + ) + (self.root / "CMakeLists.txt").write_text(fixture, encoding="utf-8") + build = self.root / "build" + result = subprocess.run( + ["cmake", "-S", str(self.root), "-B", str(build)], + capture_output=True, text=True, timeout=30, check=False, + ) + self.assertEqual(0, result.returncode, result.stdout + result.stderr) + result = subprocess.run( + ["ctest", "--test-dir", str(build), "-L", "unit", "--show-only=json-v1"], + capture_output=True, text=True, timeout=30, check=False, + ) + self.assertEqual(0, result.returncode, result.stdout + result.stderr) + tests = json.loads(result.stdout)["tests"] + self.assertEqual(1, len(tests)) + self.assertEqual("runtime-bundle-validation", tests[0]["name"]) + self.assertEqual( + [python, WRAPPER.as_posix(), "node", "test/verifyBundle.test.mjs", "test/freshness.test.mjs", + "test/siteDataRuntime.test.mjs", "test/browserRuntime.test.mjs", "test/bootstrap.test.mjs", + "test/siteDataRuntime.fixture.test.mjs"], + tests[0]["command"], + ) + actual = {value["name"]: value["value"] for value in tests[0]["properties"]} + self.assertEqual(600, actual["COST"]) + self.assertEqual(600, actual["TIMEOUT"]) + self.assertFalse(actual.get("RUN_SERIAL", False)) + self.assertEqual(1, actual.get("PROCESSORS", 1)) + self.assertEqual(["node", "readiness", "site-data", "unit"], actual["LABELS"]) + self.assertEqual(["site-data-source-tree"], actual["RESOURCE_LOCK"]) + self.assertEqual([f"PYTHON={python}"], actual["ENVIRONMENT"]) + self.assertEqual((ROOT / "tools/site-data/runtime").as_posix(), actual["WORKING_DIRECTORY"]) + def setUp(self) -> None: self._directory = tempfile.TemporaryDirectory(prefix="site-runtime-runner-") self.root = Path(self._directory.name) diff --git a/Tests/Tools/test_terrafront_ci.py b/Tests/Tools/test_terrafront_ci.py index e57ac2131..f069f6e9a 100644 --- a/Tests/Tools/test_terrafront_ci.py +++ b/Tests/Tools/test_terrafront_ci.py @@ -51,7 +51,7 @@ def test_non_ctest_json_fails(self): check_selection.check({"tests": []}, "terrafront-multiclient") def test_workflow_is_advisory_but_steps_fail_closed(self): - jobs = yaml.safe_load((ROOT / ".github/workflows/build.yml").read_text())["jobs"] + jobs = yaml.safe_load((ROOT / ".github/workflows/build.yml").read_text(encoding="utf-8"))["jobs"] job = jobs["terrafront-multiclient"] self.assertEqual(job["runs-on"], "ubuntu-24.04") self.assertIs(job["continue-on-error"], True) @@ -77,7 +77,7 @@ def test_workflow_is_advisory_but_steps_fail_closed(self): self.assertNotIn("**/userdata", upload["with"]["path"]) def test_all_six_impaired_scenarios_are_registered_separately(self): - cmake = (ROOT / "Tests/CMakeLists.txt").read_text() + cmake = (ROOT / "Tests/CMakeLists.txt").read_text(encoding="utf-8") start = cmake.index("# Separate entries preserve bounded execution") block = cmake[start:cmake.index("endforeach()", start)] for suffix, name in zip(check_selection.SCENARIOS, mc.SCENARIOS): diff --git a/Tests/Tools/test_terrafront_multiclient.py b/Tests/Tools/test_terrafront_multiclient.py index 6e9564f40..49f721059 100644 --- a/Tests/Tools/test_terrafront_multiclient.py +++ b/Tests/Tools/test_terrafront_multiclient.py @@ -12,6 +12,7 @@ import io import json +import re import sys import tempfile import unittest @@ -182,7 +183,8 @@ def parsed(role: str, self_id: int, pawns: dict, **kwargs) -> multiclient.Observ def scripted_run(scenario: multiclient.Scenario, states: list[dict], client_ids: list[tuple[int | None, ...]], - server_extra: list[str] | None = None) -> tuple[multiclient.RoleLog, list[multiclient.RoleLog]]: + server_extra: list[str] | None = None, server_runtime: str = "", + client_runtime: tuple[str, ...] = ()) -> tuple[multiclient.RoleLog, list[multiclient.RoleLog]]: """Audits for @p scenario where the server shows states[i] around checkpoint i. states[i]: keyword arguments for observation() (pawns, regions, vehicles, @@ -204,7 +206,8 @@ def state_at(server_seconds: float) -> dict: at += multiclient.SERVER_OBSERVE_INTERVAL_S frame += 15 lines += server_extra or [] - server = multiclient.RoleLog("server", 0, SERVER_ANCHOR, multiclient.parse_audit("\n".join(lines) + "\n")) + server = multiclient.RoleLog("server", 0, SERVER_ANCHOR, multiclient.parse_audit("\n".join(lines) + "\n"), + runtime_text=server_runtime) clients = [] for number, faction in enumerate(scenario.client_factions): @@ -214,7 +217,7 @@ def state_at(server_seconds: float) -> dict: views.append(None if self_id is None else observation("client", self_id, **state)) text = client_audit(0, views, scenario=scenario) clients.append(multiclient.RoleLog(f"client{number + 1}", 0, CLIENT_ANCHOR, multiclient.parse_audit(text), - faction)) + faction, client_runtime[number] if number < len(client_runtime) else "")) return server, clients @@ -242,19 +245,26 @@ def combat_states(kills_after: int = 1, respawn_health: int = 450) -> list[dict] def forged_lines(kinds: tuple[str, ...], forged: int, player: int = 2) -> list[str]: - lines = entry(2000, 40.0, "tf_cheat_stats", - [" > [TF] anti-cheat violations (1 player):", f" p{player} moveClamps=0 (spikes=0) " - f"fireRateRejects=0 fireOriginRejects=0 inputRateRejects=0 forged={forged}"]) - for index, kind in enumerate(kinds): - lines += entry(1000 + index, 30.0 + index, "tf_observe", - [f" > [Game] [TF-AUDIT] forged-state kind={kind} player={player} total={index + 1}"]) - return lines + # Real command output after session cleanup contains the durable summary, + # not asynchronous Logger messages or the removed player's live stats. + return entry(2000, 52.0, "tf_cheat_stats", [" > [TF] anti-cheat violations (0 players):", + f" > forged-state audit: {forged} records, latest kind={kinds[-1]} player={player}"]) + + +def forged_runtime(kinds: tuple[str, ...], player: int = 2) -> str: + return "\n".join([*(f"[Game] [TF-AUDIT] forged-state kind={kind} player={player} total={index + 1}" + for index, kind in enumerate(kinds)), + f"[Game] [TF-anticheat] player {player} crossed the kick threshold (violation score 12) -- disconnecting"]) def forged_states(saved: str = multiclient.FORGED_LEGAL_PRIMARY) -> list[dict]: world = {2: pawn(1, 450, SANCTUARY_PAD), 1: pawn(2, 450, (344.0, 24.0, 3744.0))} return [{"pawns": world, "players": {2: (multiclient.FORGED_LEGAL_PRIMARY, 0, 1, 0)}}, - {"pawns": world, "players": {2: (saved, 0, 1, 0)}}] + {"pawns": world, "players": {2: (saved, 0, 1, 0)}}, + {"pawns": {1: world[1]}}] + + +FORGED_IDS = [(2, 1), (2, 1), (None, 1)] def reconnect_states(before: tuple = (multiclient.RECONNECT_LEGAL_PRIMARY, 12, 1, 0), @@ -298,9 +308,10 @@ def territory_states(owners: tuple[int, ...] = multiclient.TERRITORY_OWNERS) -> return [{"pawns": world, "regions": {**DEFAULT_REGIONS, multiclient.TERRITORY_REGION: owner}} for owner in owners] -def run_scenario(name: str, states: list[dict], ids: list[tuple], server_extra: list[str] | None = None) -> dict: +def run_scenario(name: str, states: list[dict], ids: list[tuple], server_extra: list[str] | None = None, + server_runtime: str = "", client_runtime: tuple[str, ...] = ()) -> dict: scenario = multiclient.SCENARIOS[name] - server, clients = scripted_run(scenario, states, ids, server_extra) + server, clients = scripted_run(scenario, states, ids, server_extra, server_runtime, client_runtime) return multiclient.evaluate(scenario, server, clients) @@ -370,8 +381,10 @@ def test_stale_observation_from_the_previous_command_is_ignored(self) -> None: def test_cheat_stats_and_audit_lines_parse(self) -> None: entries = multiclient.parse_audit("\n".join(forged_lines(("loadout-ineligible",), 1)) + "\n") - self.assertEqual(multiclient.cheat_stats_snapshots(entries), [{2: 1}]) - self.assertEqual(multiclient.forged_audit_records(entries), {("loadout-ineligible", 2)}) + self.assertEqual(multiclient.cheat_stats_snapshots(entries), [{}]) + self.assertEqual(multiclient.forged_audit_records(entries), set()) + self.assertEqual(multiclient.forged_audit_records(entries, forged_runtime(("loadout-ineligible",))), + {("loadout-ineligible", 2)}) class ComparatorTests(unittest.TestCase): @@ -483,6 +496,19 @@ def test_pure_client_self_line_is_not_compared_with_the_server_wallet(self) -> N class ScheduleTests(unittest.TestCase): + def test_forged_audit_is_after_final_probe_at_both_admitted_lag_extremes(self) -> None: + base = multiclient.SCENARIOS["forged_state"] + impairment = multiclient.Impairment.parse("80,20,0.03,2,3", 17) + for scenario in (base, multiclient.impaired(base, impairment)): + self.assertEqual(multiclient.schedule_violations(scenario), []) + last_probe = max(at for at, _ in multiclient.timed_client_steps(scenario, 0)) + events = multiclient.server_step_times(scenario.server_steps[0]) + self.assertTrue(events) + for lag in (multiclient.CLIENT_LAG_MIN_S, multiclient.CLIENT_LAG_MAX_S): + with self.subTest(impaired=scenario is not base, lag=lag): + self.assertTrue(all(at - lag > last_probe + scenario.event_settle_s for at in events)) + self.assertLessEqual(events[-1] - lag, scenario.client_seconds) + # The schedule this harness first shipped: checkpoint 0 one second before a walk. TIGHT = replace(SCENARIO, name="tight", client_steps=(*SCENARIO.client_steps[:-2], (18.0, "tf_walk 1 0 2"), (28.0, "tf_walk 0 1 2")), @@ -546,6 +572,11 @@ def test_client_lag_outside_the_schedule_fails(self) -> None: class ScenarioVerdictTests(unittest.TestCase): + def forged_run(self, states=None, kinds=FORGED_KINDS, total=4, runtime=None, client_runtime=None): + return run_scenario("forged_state", states or forged_states(), FORGED_IDS, forged_lines(kinds, total), + forged_runtime(kinds) if runtime is None else runtime, + ("[TF] client link down", "") if client_runtime is None else client_runtime) + def assert_passes(self, summary: dict) -> None: self.assertTrue(summary["passed"], summary["problems"]) @@ -577,38 +608,75 @@ def test_combat_inside_the_sanctuary_fails(self) -> None: self.assert_fails_with(run_scenario("combat_kill_respawn", states, COMBAT_IDS), "sanctuary") def test_forged_state_rejected_and_audited_passes(self) -> None: - extra = forged_lines(FORGED_KINDS, 4) - self.assert_passes(run_scenario("forged_state", forged_states(), [(2, 1)] * 2, extra)) + self.assert_passes(self.forged_run()) def test_forged_state_rejected_but_not_audited_fails(self) -> None: # RED proof: an unchanged loadout alone is "rejected", not "rejected and audited". - extra = forged_lines(("loadout-ineligible",), 2) - self.assert_fails_with(run_scenario("forged_state", forged_states(), [(2, 1)] * 2, extra), + self.assert_fails_with(self.forged_run(kinds=("loadout-ineligible",), total=2), "kind=loadout-unknown-weapon") def test_forged_state_audited_but_applied_fails(self) -> None: - extra = forged_lines(FORGED_KINDS, 4) - self.assert_fails_with(run_scenario("forged_state", forged_states(saved="auc_rifle"), [(2, 1)] * 2, extra), + self.assert_fails_with(self.forged_run(states=forged_states(saved="auc_rifle")), "expected mra_rifle") def test_forged_state_without_counters_fails(self) -> None: - extra = forged_lines(("loadout-ineligible", "loadout-unknown-weapon"), 1) - self.assert_fails_with(run_scenario("forged_state", forged_states(), [(2, 1)] * 2, extra), + self.assert_fails_with(self.forged_run(kinds=("loadout-ineligible", "loadout-unknown-weapon"), total=1), "forged-state counters") def test_each_fire_rejection_needs_its_own_audit_kind(self) -> None: for missing in FORGED_KINDS[2:]: - extra = forged_lines(tuple(kind for kind in FORGED_KINDS if kind != missing), 4) - self.assert_fails_with(run_scenario("forged_state", forged_states(), [(2, 1)] * 2, extra), + self.assert_fails_with(self.forged_run(kinds=tuple(kind for kind in FORGED_KINDS if kind != missing)), f"kind={missing}") def test_audited_fire_that_still_damages_a_player_fails(self) -> None: states = forged_states() - states[1] = {**states[1], "pawns": dict(states[1]["pawns"])} - faction, cls, health, pos = states[1]["pawns"][1] - states[1]["pawns"][1] = (faction, cls, health - 1, pos) - self.assert_fails_with(run_scenario("forged_state", states, [(2, 1)] * 2, - forged_lines(FORGED_KINDS, 4)), "health changed") + states[2] = {**states[2], "pawns": dict(states[2]["pawns"])} + faction, cls, health, pos = states[2]["pawns"][1] + states[2]["pawns"][1] = (faction, cls, health - 1, pos) + self.assert_fails_with(self.forged_run(states=states), "health changed") + + def test_forged_audit_requires_real_runtime_output(self) -> None: + self.assert_fails_with(self.forged_run(runtime=""), "kind=loadout-ineligible") + + def test_forged_audit_preserves_all_four_counter_values(self) -> None: + text = forged_runtime(FORGED_KINDS).replace("total=3", "total=2") + self.assert_fails_with(self.forged_run(runtime=text), "forged-state counters") + + def test_forged_audit_rejects_reordered_duplicate_and_extra_events(self) -> None: + lines = forged_runtime(FORGED_KINDS).splitlines() + for events in (list(reversed(lines[:-1])), [lines[0], *lines[:-1]], + [*lines[:-1], lines[-2].replace("total=4", "total=5")], + [*lines[:-1], lines[0].replace("player=2", "player=3")]): + with self.subTest(events=events): + self.assert_fails_with(self.forged_run(runtime="\n".join([*events, lines[-1]])), + "forged-state counters") + + def test_forged_durable_summary_before_the_final_probe_fails(self) -> None: + server, clients = scripted_run(multiclient.SCENARIOS["forged_state"], forged_states(), FORGED_IDS, + forged_lines(FORGED_KINDS, 4), forged_runtime(FORGED_KINDS), + ("[TF] client link down", "")) + server.entries[-1].seconds = 1.0 + self.assert_fails_with(multiclient.evaluate(multiclient.SCENARIOS["forged_state"], server, clients), + "before the final rejection settled") + + def test_forged_rejection_requires_actual_kick_and_link_down(self) -> None: + text = forged_runtime(FORGED_KINDS).split("[Game] [TF-anticheat]")[0] + self.assert_fails_with(self.forged_run(runtime=text), "no anti-cheat kick evidence") + self.assert_fails_with(self.forged_run(client_runtime=("", "")), "never observed its link down") + + def test_forged_kick_requires_authoritative_cleanup(self) -> None: + states = forged_states() + states[2] = states[1] + self.assert_fails_with(self.forged_run(states=states), "still has authoritative pawn") + + def test_forged_kick_requires_durable_audit_after_live_stats_cleanup(self) -> None: + self.assert_fails_with(self.forged_run(total=3), "post-kick durable audit") + server, clients = scripted_run(multiclient.SCENARIOS["forged_state"], forged_states(), FORGED_IDS, + forged_lines(FORGED_KINDS, 4), forged_runtime(FORGED_KINDS), + ("[TF] client link down", "")) + server.entries[-1].output.append(" p2 moveClamps=0 (spikes=0) forged=4") + self.assert_fails_with(multiclient.evaluate(multiclient.SCENARIOS["forged_state"], server, clients), + "post-kick live violation stats") def test_reconnect_restoring_saved_state_passes(self) -> None: self.assert_passes(run_scenario("reconnect", reconnect_states(), RECONNECT_IDS)) @@ -706,6 +774,23 @@ def test_server_script_repeats_each_step_across_its_window(self) -> None: class ProcessTests(unittest.TestCase): + def test_child_reads_async_runtime_logs_without_inventing_audit_entries(self) -> None: + with tempfile.TemporaryDirectory() as workdir: + role = Path(workdir) / "server" + role.mkdir() + audit = role / "exec_audit.log" + audit.write_text("\n".join(forged_lines(FORGED_KINDS, 4)) + "\n", encoding="utf-8") + trace = forged_runtime(FORGED_KINDS) + (role / "stderr.log").write_text(trace, encoding="utf-8") + (role / "stdout.log").write_text("ordinary stdout", encoding="utf-8") + child = multiclient.Child("server", mock.Mock(returncode=0), audit, anchor=SERVER_ANCHOR) + log = child.log() + self.assertEqual(multiclient.forged_audit_records(log.entries), set()) + self.assertEqual(multiclient.forged_audit_records(log.entries, log.runtime_text), + {(kind, 2) for kind in FORGED_KINDS}) + self.assertIn("ordinary stdout", log.runtime_text) + self.assertEqual(len(log.entries), 1) + def test_engine_that_exits_early_fails_the_run(self) -> None: # A stand-in "engine" (the interpreter) exits without ever writing an # audit: the run must fail, not report zero divergences. @@ -762,6 +847,29 @@ def net(role: int) -> str: class ImpairmentTests(unittest.TestCase): + def test_loss_settle_budget_covers_production_periodic_refresh_and_one_tick(self) -> None: + source = REPO_ROOT / "GameModules/SparkGameMMOFPS/Source" + types = (source / "Core/TFTypes.h").read_text(encoding="utf-8") + refresh = (source / "Net/TFReplicationRefresh.h").read_text(encoding="utf-8") + hz = float(re.search(r"kReplicationHz\s*=\s*([\d.]+)f", types).group(1)) + ticks = int(re.search(r"kRefreshTicks\s*=\s*(\d+)", refresh).group(1)) + self.assertEqual(hz, multiclient.REPLICATION_HZ) + self.assertEqual(ticks, multiclient.PAWN_REFRESH_TICKS) + self.assertIn("kRefreshTicks / static_cast(kReplicationHz)", refresh) + self.assertGreaterEqual(multiclient.RESEND_ALLOWANCE_S, (ticks + 1) / hz) + profile = multiclient.Impairment.parse("80,20,0.03,2,3", 17) + self.assertAlmostEqual(profile.settle_s(), + 2 * (0.100 + multiclient.REORDER_HOLD_S) + (ticks + 1) / hz) + + def test_all_hosted_impaired_schedules_remain_quiet_with_loss_recovery_budget(self) -> None: + profile = multiclient.Impairment.parse("80,20,0.03,2,3", 17) + for name, base in multiclient.SCENARIOS.items(): + with self.subTest(scenario=name): + scheduled = multiclient.impaired(base, profile) + self.assertEqual(multiclient.schedule_violations(scheduled), []) + self.assertGreaterEqual(scheduled.client_seconds, + scheduled.checkpoints[-1] + multiclient.CLIENT_TAIL_S) + def evaluate(self, **kwargs) -> dict: server, clients = impaired_logs(**kwargs) return multiclient.evaluate(multiclient.impaired(SCENARIO, IMPAIRMENT), server, clients, IMPAIRMENT) diff --git a/Tests/Tools/test_validate_docs_links_manifest.py b/Tests/Tools/test_validate_docs_links_manifest.py new file mode 100644 index 000000000..ae8d42c81 --- /dev/null +++ b/Tests/Tools/test_validate_docs_links_manifest.py @@ -0,0 +1,65 @@ +import os +import sys +import tempfile +import unittest +from pathlib import Path +from unittest import mock + +REPO_ROOT = Path(__file__).resolve().parents[2] +sys.path.insert(0, str(REPO_ROOT / "tools")) +sys.path.insert(0, str(REPO_ROOT / "tools" / "site-data")) + +import validate_docs_links as links + + +class TrackedManifestTests(unittest.TestCase): + def test_manifest_preserves_merged_directory_casing(self) -> None: + with tempfile.TemporaryDirectory(prefix="docs-tracked-manifest-") as temporary: + root = Path(temporary) + (root / "Tools").mkdir() + (root / "Tools" / "x.c").write_text("x", encoding="utf-8") + (root / "Tools" / "y.c").write_text("y", encoding="utf-8") + manifest = root / ".docs-tracked-files" + # The logical lowercase spelling is the tracked spelling even though + # the case-insensitive fixture has one physical Tools/ directory. + manifest.write_bytes(b"tools/x.c\0Tools/y.c\0") + with mock.patch.dict(os.environ, {"SPARK_DOC_TRACKED_PATHS": str(manifest)}, clear=False): + tracked = links.load_tracked_tree(root) + self.assertIsNotNone(tracked) + self.assertTrue(links.exact_case(root / "tools" / "x.c", root, tracked)) + self.assertTrue(links.exact_case(root / "Tools" / "y.c", root, tracked)) + self.assertFalse(links.exact_case(root / "Tools" / "x.c", root, tracked)) + self.assertFalse(links.exact_case(root / "TOOLS" / "x.c", root, tracked)) + + def test_manifest_malformed_input_fails_closed(self) -> None: + with tempfile.TemporaryDirectory(prefix="docs-tracked-manifest-") as temporary: + root = Path(temporary) + manifest = root / ".docs-tracked-files" + for payload in (b"Tools/x.c", b"", b"\0", b"Tools/x.c\0\0", b"\xff\0", b"../x.c\0", + b"Tools/x.c\0Tools/x.c\0"): + with self.subTest(payload=payload): + manifest.write_bytes(payload) + with mock.patch.dict(os.environ, {"SPARK_DOC_TRACKED_PATHS": str(manifest)}, clear=False): + with self.assertRaises(links.LinkContractError): + links.load_tracked_tree(root) + + def test_manifest_rejects_casefold_duplicate_and_outside_path(self) -> None: + with tempfile.TemporaryDirectory(prefix="docs-tracked-manifest-") as temporary: + root = Path(temporary) + manifest = root / ".docs-tracked-files" + manifest.write_bytes(b"Tools/x.c\0tools/x.c\0") + with mock.patch.dict(os.environ, {"SPARK_DOC_TRACKED_PATHS": str(manifest)}, clear=False): + with self.assertRaises(links.LinkContractError): + links.load_tracked_tree(root) + outside = root.parent / (root.name + "-outside") + outside.write_bytes(b"Tools/x.c\0") + try: + with mock.patch.dict(os.environ, {"SPARK_DOC_TRACKED_PATHS": str(outside)}, clear=False): + with self.assertRaises(links.LinkContractError): + links.load_tracked_tree(root) + finally: + outside.unlink() + + +if __name__ == "__main__": + unittest.main() diff --git a/Tests/Tools/test_verify_package_versions.py b/Tests/Tools/test_verify_package_versions.py index b26ca6742..7c7960bce 100644 --- a/Tests/Tools/test_verify_package_versions.py +++ b/Tests/Tools/test_verify_package_versions.py @@ -12,6 +12,7 @@ from pathlib import Path import shutil import struct +import subprocess import sys import tarfile import tempfile @@ -171,6 +172,72 @@ def test_nsis_installer_obeys_inspection_size_limit(self) -> None: with mock.patch.object(vpv, "MAX_MEMBER_BYTES", 1): self.assertEqual(self.errors(installer), [f"{installer.name}: {installer.name} is too large to inspect"]) + def test_cpack_nsis_stamps_fixed_and_string_versions_from_package_version(self) -> None: + cmake = shutil.which("cmake") + self.assertIsNotNone(cmake, "CMake is required to validate the actual package producer") + script = self.temp / "nsis-options.cmake" + definitions = self.temp / "nsis-definitions.txt" + raw_template = self.temp / "raw-template.txt" + stock_template = self.temp / "stock-template.txt" + preserved = self.temp / "preserved-options.txt" + options = (ROOT / "cmake/SparkCPackOptions.cmake").as_posix() + for generator in ("NSIS", "ZIP", "WIX"): + for version in (VERSION, "7.8.9"): + with self.subTest(generator=generator, version=version): + script.write_text( + f'set(CPACK_GENERATOR "{generator}")\n' + f'set(CPACK_PACKAGE_VERSION "{version}")\n' + 'set(CPACK_PACKAGE_FILE_NAME "SparkEngine")\n' + 'set(CPACK_NSIS_EXECUTABLE_PRE_ARGUMENTS "V4")\n' + 'set(CMAKE_MODULE_PATH "preserved-module-path")\n' + f'set(CPACK_PACKAGE_DIRECTORY "{(self.temp / generator).as_posix()}")\n' + f'include("{options}")\n' + f'include("{options}")\n' + 'set(_template "${CPACK_PACKAGE_DIRECTORY}/spark-nsis-template/NSIS.template.in")\n' + 'set(_raw "")\n' + 'if(EXISTS "${_template}")\n' + ' file(READ "${_template}" _raw)\n' + 'endif()\n' + 'string(CONFIGURE "${_raw}" _configured @ONLY)\n' + 'file(READ "${CMAKE_ROOT}/Modules/Internal/CPack/NSIS.template.in" _stock)\n' + f'file(WRITE "{stock_template.as_posix()}" "${{_stock}}")\n' + f'file(WRITE "{raw_template.as_posix()}" "${{_raw}}")\n' + f'file(WRITE "{definitions.as_posix()}" "${{_configured}}")\n' + f'file(WRITE "{preserved.as_posix()}" ' + '"${CPACK_NSIS_EXECUTABLE_PRE_ARGUMENTS}\\n${CMAKE_MODULE_PATH}")\n', + encoding="utf-8", + ) + result = subprocess.run([cmake, "-P", str(script)], + capture_output=True, text=True, check=False, timeout=30) + self.assertEqual(0, result.returncode, result.stdout + result.stderr) + directives = definitions.read_text(encoding="utf-8") + pre_arguments, module_path = preserved.read_text(encoding="utf-8").split("\n") + self.assertEqual("V4", pre_arguments) + self.assertTrue(module_path.endswith("preserved-module-path")) + if generator != "NSIS": + self.assertEqual("", directives) + self.assertEqual("preserved-module-path", module_path) + continue + for fixed in ("VIProductVersion", "VIFileVersion"): + self.assertEqual(1, directives.count(f'{fixed} "{version}.0"')) + for key in ("FileVersion", "ProductVersion"): + self.assertEqual(1, directives.count( + f'VIAddVersionKey /LANG=1033 "{key}" "{version}.0"')) + raw = raw_template.read_text(encoding="utf-8") + start = raw.index("\nVIProductVersion") + final_directive = 'VIAddVersionKey /LANG=1033 "ProductVersion" "@CPACK_PACKAGE_VERSION@.0"\n' + end = raw.index(final_directive, start) + len(final_directive) + self.assertEqual(stock_template.read_text(encoding="utf-8"), raw[:start] + raw[end:]) + + for missing_directory in ('unset(CPACK_PACKAGE_DIRECTORY)', 'set(CPACK_PACKAGE_DIRECTORY "")'): + with self.subTest(missing_directory=missing_directory): + script.write_text(f'set(CPACK_GENERATOR NSIS)\n{missing_directory}\n' + f'include("{options}")\n', encoding="utf-8") + result = subprocess.run([cmake, "-P", str(script)], cwd=self.temp, + capture_output=True, text=True, check=False, timeout=30) + self.assertNotEqual(0, result.returncode) + self.assertIn("NSIS version metadata requires CPACK_PACKAGE_DIRECTORY", result.stderr) + def test_first_party_game_dll_version_resource_is_checked(self) -> None: members = self.members(**{"bin/SparkGameFPS.dll": pe_image(None)}) self.assertEqual(self.errors(self.package(members=members)), diff --git a/Tests/test-warning-waivers.json b/Tests/test-warning-waivers.json index 2e5955b9e..089c170ec 100644 --- a/Tests/test-warning-waivers.json +++ b/Tests/test-warning-waivers.json @@ -158,6 +158,11 @@ "owner": "rendering", "kind": "environment" }, + { + "prefix": "Requires a copied primary in an explicitly owned decoder directory", + "owner": "persistence", + "kind": "environment" + }, { "prefix": "SPARK_TESTS_EXPECTED_VERSION was not injected by the build system", "owner": "build", diff --git a/ThirdParty/supply-chain.lock b/ThirdParty/supply-chain.lock index fa0107b50..66834750a 100644 --- a/ThirdParty/supply-chain.lock +++ b/ThirdParty/supply-chain.lock @@ -851,6 +851,21 @@ "sha256": "caf1932d76a909c909b7a2e41443cdfe3c79a49a380da1a22fa422e1d00d3ca7", "output": "archive", "verification": "get-file-hash" + }, + { + "name": "CMake 4.4.1 Windows Shipping CI archive", + "class": "downloads", + "license_spdx": "BSD-3-Clause", + "owner": "Krilliac", + "justification": "Shipping CI requires CMake/CPack 4.3 or newer for per-user MSI authoring. This fixed 4.4.1 tool archive is hash-checked before extraction and never enters engine packages.", + "path": ".github/workflows/build.yml", + "pin_path": ".github/workflows/build.yml", + "command": "Invoke-WebRequest -Uri 'https://github.com/Kitware/CMake/releases/download/v4.4.1/cmake-4.4.1-windows-x86_64.zip' -OutFile $archive", + "source_url": "https://github.com/Kitware/CMake/releases/download/v4.4.1/cmake-4.4.1-windows-x86_64.zip", + "url": "https://github.com/Kitware/CMake/releases/download/v4.4.1/cmake-4.4.1-windows-x86_64.zip", + "sha256": "091919e1cde162b69d2d5e0f3b1f5670c973e72133f78126fbb18042947d6f19", + "output": "archive", + "verification": "get-file-hash" } ] } diff --git a/Tools/Terrafront/multiclient.py b/Tools/Terrafront/multiclient.py index 26e88ec99..3c9685700 100644 --- a/Tools/Terrafront/multiclient.py +++ b/Tools/Terrafront/multiclient.py @@ -125,10 +125,13 @@ FLUX_INCOME_SLACK = 8 FACTION_IDS = {"mra": 1, "auc": 2, "hlx": 3} # Impaired runs (--impair): the reorder hold is InstabilitySettings::reorderHoldMs, -# the resend allowance covers one reliable retransmit after a dropped packet, and +# the resend allowance covers a quiet pawn's periodic full-state refresh plus +# one replication tick (also covering the shorter reliable retransmit), and # the sprint speed (classes.json sprintSpeed) turns a delay into a position slack. REORDER_HOLD_S = 0.04 -RESEND_ALLOWANCE_S = 0.5 +REPLICATION_HZ = 20.0 +PAWN_REFRESH_TICKS = 20 +RESEND_ALLOWANCE_S = (PAWN_REFRESH_TICKS + 1) / REPLICATION_HZ MAX_PAWN_SPEED_MPS = 7.2 CHECKPOINT_PAD_S = 0.5 CLIENT_TAIL_S = 2.5 @@ -144,6 +147,8 @@ AUDIT_HEADER = re.compile(r"^frame (\d+) t=(\d+(?:\.\d+)?)s \| (ok |ERR) \| (.*)$") KEY_VALUE = re.compile(r"(\w+)=(\S*)") FORGED_AUDIT = re.compile(r"\[TF-AUDIT\] forged-state kind=(\S+) player=(\d+)") +FORGED_AUDIT_EVENT = re.compile(r"\[TF-AUDIT\] forged-state kind=(\S+) player=(\d+) total=(\d+)") +FORGED_AUDIT_SUMMARY = re.compile(r"forged-state audit: (\d+) records?, latest kind=(\S+) player=(\d+)") CHEAT_STATS_ROW = re.compile(r"\bp(\d+)\s+moveClamps=.*\bforged=(\d+)") @@ -326,22 +331,23 @@ def _volley(client: int, start: float, spacing: float, shots: int) -> tuple[tupl client_factions=("mra", "auc"), client_steps=ONBOARDING, solo_steps=( - (0, 31.5, "tf_aim_at enemy"), - *_volley(0, 32.0, 0.3, 6), - (0, 41.0, "tf_aim_at enemy"), - *_volley(0, 41.5, 0.2, 25), - (1, 56.0, "tf_spawn"), + (0, 32.5, "tf_aim_at enemy"), + *_volley(0, 33.0, 0.3, 6), + (0, 43.0, "tf_aim_at enemy"), + *_volley(0, 43.5, 0.2, 25), + (1, 59.0, "tf_spawn"), ), server_steps=( ServerStep(13.0, 24.0, "tf_place_faction mra {:.0f} {:.0f}".format(*ARENA_MRA)), ServerStep(13.0, 24.0, "tf_place_faction auc {:.0f} {:.0f}".format(*ARENA_AUC)), - ServerStep(58.0, 69.0, "tf_place_faction auc {:.0f} {:.0f}".format(*ARENA_AUC)), + ServerStep(61.0, 72.0, "tf_place_faction auc {:.0f} {:.0f}".format(*ARENA_AUC)), ), - checkpoints=(28.0, 37.5, 50.0, 73.0), + checkpoints=(28.0, 38.5, 52.0, 76.0), absent=((2, 1),), - client_seconds=76.0, + client_seconds=79.0, ), - # A saves a legal primary, then sends a foreign-faction and an unknown weapon. + # Prove rejection before escalation, then prove the fourth rejection kicks A + # and leaves the durable audit intact. The remaining client must stay healthy. "forged_state": Scenario( name="forged_state", client_factions=("mra", "auc"), @@ -350,12 +356,13 @@ def _volley(client: int, start: float, spacing: float, shots: int) -> tuple[tupl (0, 14.0, f"tf_give {FORGED_LEGAL_PRIMARY}"), (0, 22.0, "tf_give auc_rifle"), (0, 24.0, "tf_give_raw 32766"), - (0, 25.0, "tf_fire_raw auc_rifle"), - (0, 26.0, "tf_fire_raw np_shotgun"), + (0, 34.0, "tf_fire_raw auc_rifle"), + (0, 36.0, "tf_fire_raw np_shotgun"), ), - server_steps=(ServerStep(30.5, 41.0, "tf_cheat_stats", changes_world=False),), - checkpoints=(18.5, 31.0), - client_seconds=43.0, + server_steps=(ServerStep(39.5, 49.5, "tf_cheat_stats", changes_world=False),), + checkpoints=(18.5, 28.5, 41.0), + offline=((2, 0),), + client_seconds=50.0, ), # B saves a legal primary, tries a forged one, leaves, and comes back in the # new process through tf_connect / tf_login / tf_enter (run() splits the script). @@ -397,20 +404,20 @@ def _volley(client: int, start: float, spacing: float, shots: int) -> tuple[tupl client_factions=("mra", "auc"), client_steps=ONBOARDING, solo_steps=( - (0, 31.5, "tf_vehicle_buy drifter"), - (0, 39.5, "tf_vehicle_seat enter"), - (0, 47.5, "tf_walk 1 0 2"), - (0, 61.5, "tf_vehicle_seat exit"), + (0, 32.5, "tf_vehicle_buy drifter"), + (0, 40.5, "tf_vehicle_seat enter"), + (0, 48.5, "tf_walk 1 0 2"), + (0, 62.5, "tf_vehicle_seat exit"), ), server_steps=( ServerStep(13.0, 24.0, "tf_place_faction mra {:.0f} {:.0f}".format(*VEHICLE_TERMINAL_MRA)), ServerStep(13.0, 24.0, "tf_place_faction auc {:.0f} {:.0f}".format(*VEHICLE_WATCHER_AUC)), ServerStep(13.0, 24.0, f"tf_flux_floor mra {VEHICLE_FLUX_FLOOR}"), - ServerStep(69.5, 80.5, "tf_damage_vehicles 5000"), + ServerStep(70.5, 81.5, "tf_damage_vehicles 5000"), ), - checkpoints=(28.0, 36.0, 44.0, 57.5, 66.0, 85.0), + checkpoints=(28.0, 37.0, 45.0, 58.5, 67.0, 86.0), walk_settle_s=4.0, # a driven hull coasts after the throttle is released - client_seconds=88.0, + client_seconds=89.0, ), } @@ -508,7 +515,7 @@ def expected(self, role_index: int) -> tuple[float, float, float, float, float, def settle_s(self) -> float: """Extra settle time after any change: a round trip at the worst delay, the reorder hold, a resend.""" resend = RESEND_ALLOWANCE_S if self.loss > 0 else 0.0 - return 2.0 * (self.lag_ms + self.jitter_ms) / 1000.0 + REORDER_HOLD_S + resend + return 2.0 * ((self.lag_ms + self.jitter_ms) / 1000.0 + REORDER_HOLD_S) + resend def position_slack_m(self) -> float: """How far a sprinting pawn moves during one worst-case one-way delay.""" @@ -724,13 +731,14 @@ def observe_samples(entries: list[AuditEntry]) -> list[Sample]: return samples -def forged_audit_records(entries: list[AuditEntry]) -> set[tuple[str, int]]: +def forged_audit_records(entries: list[AuditEntry], runtime_text: str = "") -> set[tuple[str, int]]: """Every (kind, player) the server's "[TF-AUDIT] forged-state" log lines named.""" records = set() for entry in entries: for line in entry.output: for match in FORGED_AUDIT.finditer(line): records.add((match.group(1), int(match.group(2)))) + records.update((match.group(1), int(match.group(2))) for match in FORGED_AUDIT.finditer(runtime_text)) return records @@ -757,6 +765,7 @@ class RoleLog: anchor: float | None # wall-clock (monotonic) seconds at which the -exec clock started entries: list[AuditEntry] faction: str | None = None + runtime_text: str = "" # real retained role output, including asynchronous Logger messages @dataclass @@ -766,6 +775,10 @@ class RunViews: server: list[Observation | None] clients: list[list[Observation | None]] # [client][checkpoint] server_entries: list[AuditEntry] + server_runtime_text: str = "" + client_runtime_text: list[str] = field(default_factory=list) + scenario: Scenario | None = None + client_lags: list[float | None] = field(default_factory=list) def self_id(self, client: int, checkpoint: int) -> int | None: view = self.clients[client][checkpoint] @@ -931,7 +944,10 @@ def evaluate_views(scenario: Scenario, server: RoleLog, clients: list[RoleLog], server_samples = [s for s in observe_samples(server.entries) if s.observation is not None] client_samples = [observe_samples(c.entries) for c in clients] checkpoints: list[dict] = [] - views = RunViews([], [[] for _ in clients], server.entries) + views = RunViews([], [[] for _ in clients], server.entries, server.runtime_text, + [client.runtime_text for client in clients], scenario, + [client.anchor - server.anchor if client.anchor is not None and server.anchor is not None + else None for client in clients]) known_ids: list[int | None] = [None] * len(clients) for index in range(len(scenario.checkpoints)): @@ -1044,14 +1060,18 @@ def combat_verdict(views: RunViews) -> list[str]: def forged_verdict(views: RunViews) -> list[str]: - """client1's forged loadouts are rejected (saved primary unchanged) AND audited (log line plus counter).""" - missing = _require_views(views, (0, 1), "forged") + """Rejection preserves state; escalation removes the offender and preserves all audit evidence.""" + missing = _require_views(views, (1,), "forged") + missing += [f"forged: client1 checkpoint {i} is missing" for i in (0, 1) + if i >= len(views.clients[0]) or views.clients[0][i] is None] + if len(views.server) != 3: + missing.append("forged: expected before-rejection, rejected-loadout and post-kick checkpoints") if missing: return missing problems = [] a = views.self_id(0, 0) b = views.self_id(1, 0) - for index, view in enumerate(views.server): + for index, view in enumerate(views.server[:2]): for player in (a, b): before, after = views.server[0].pawns.get(player), view.pawns.get(player) if before is None or after is None or before.health != after.health: @@ -1063,17 +1083,47 @@ def forged_verdict(views: RunViews) -> list[str]: other = view.players.get(b) if other is None or other.loadout != "default": problems.append(f"forged: player {b} was affected (loadout {other.loadout if other else 'missing'})") - audited = forged_audit_records(views.server_entries) + after = views.server[2] + if a in after.pawns or a in after.players: + problems.append(f"forged: kicked player {a} still has authoritative pawn or progression state") + survivor = after.pawns.get(b) + before = views.server[0].pawns.get(b) + if survivor is None or before is None or survivor.health != before.health: + problems.append(f"forged: player {b} health changed after rejected fire") + saved_other = after.players.get(b) + if saved_other is None or saved_other.loadout != "default": + problems.append(f"forged: player {b} was affected after the kick") + kick = re.search(rf"\[TF-anticheat\] player {a} crossed the kick threshold \(violation score 12\)", + views.server_runtime_text) + if kick is None: + problems.append(f"forged: no anti-cheat kick evidence for player {a}") + if not views.client_runtime_text or "[TF] client link down" not in views.client_runtime_text[0]: + problems.append("forged: client1 never observed its link down") + audited = forged_audit_records(views.server_entries, views.server_runtime_text) for kind in ("loadout-ineligible", "loadout-unknown-weapon", "fire-weapon-not-in-loadout", "fire-weapon-locked"): if (kind, a) not in audited: problems.append(f"forged: no [TF-AUDIT] forged-state kind={kind} line for player {a}") if any(player == b for _, player in audited): problems.append(f"forged: player {b} was audited without forging anything") - snapshots = [rows for rows in cheat_stats_snapshots(views.server_entries) if a in rows] - if not snapshots: - problems.append(f"forged: no tf_cheat_stats run listed player {a}") - elif snapshots[-1][a] != 4 or snapshots[-1].get(b, 0) != 0: - problems.append(f"forged: forged-state counters {snapshots[-1]} (expected {a}: 4, {b}: 0)") + events = [(m.group(1), int(m.group(2)), int(m.group(3))) + for m in FORGED_AUDIT_EVENT.finditer(views.server_runtime_text)] + expected_kinds = ("loadout-ineligible", "loadout-unknown-weapon", "fire-weapon-not-in-loadout", "fire-weapon-locked") + if events != [(kind, a, count) for kind, count in zip(expected_kinds, range(1, 5))]: + problems.append(f"forged: forged-state counters for player {a} do not prove all four ordered rejections") + snapshots = cheat_stats_snapshots(views.server_entries) + if not snapshots or a in snapshots[-1] or snapshots[-1].get(b, 0) != 0: + problems.append("forged: post-kick live violation stats were not cleaned up or survivor was affected") + outputs = command_outputs(views.server_entries, "tf_cheat_stats") + lag = views.client_lags[0] if views.client_lags else None + if views.scenario is None or lag is None: + problems.append("forged: no measured clock binding for the post-kick audit") + else: + last_probe = max(at for at, _ in timed_client_steps(views.scenario, 0)) + if not outputs or outputs[-1][0] <= lag + last_probe + views.scenario.event_settle_s: + problems.append("forged: durable audit command ran before the final rejection settled") + summaries = list(FORGED_AUDIT_SUMMARY.finditer("\n".join(outputs[-1][1]))) if outputs else [] + if not summaries or summaries[-1].groups() != ("4", "fire-weapon-locked", str(a)): + problems.append("forged: post-kick durable audit does not retain all four rejections") return problems @@ -1626,7 +1676,10 @@ def log(self) -> RoleLog: text = self.audit.read_text(encoding="utf-8", errors="replace") if self.audit.exists() else "" # A deliberate kill is the scenario, not a crash; every other exit status counts. returncode = 0 if self.killed else self.process.returncode - return RoleLog(self.role, returncode, self.anchor if text else None, parse_audit(text)) + return RoleLog(self.role, returncode, self.anchor if text else None, parse_audit(text), + runtime_text="\n".join(path.read_text(encoding="utf-8", errors="replace") + for name in ("stdout.log", "stderr.log") + if (path := self.audit.parent / name).exists())) def launch(role: str, args: argparse.Namespace, workdir: Path, script: str, seconds: float, @@ -1714,7 +1767,8 @@ def join_reconnected_client(first: RoleLog, second: RoleLog, impairment: Impairm if offset <= 0: raise HarnessError("reconnect: returning process clock did not start after original process") entries = [*first.entries, *(replace(entry, seconds=entry.seconds + offset) for entry in second.entries)] - return RoleLog(first.role, 0, first.anchor, entries, first.faction) + return RoleLog(first.role, 0, first.anchor, entries, first.faction, + first.runtime_text + "\n" + second.runtime_text) def run(args: argparse.Namespace, name: str, workdir: Path) -> dict: diff --git a/Tools/buildmatrix/inventory.py b/Tools/buildmatrix/inventory.py index 8d16de919..af48f6c27 100644 --- a/Tools/buildmatrix/inventory.py +++ b/Tools/buildmatrix/inventory.py @@ -1078,6 +1078,29 @@ def _tracked_cmake_inputs() -> list[Path]: # absent from the top-level static target set even though the configured File # API reports them. Admit only this reviewed declaration in its active profile. _REVIEWED_CONFIGURED_FUNCTION_TARGET_CONTRACTS = { + "CpuFloor_IsaBaseline": { + "profiles": frozenset({"windows-shipping", "windows-validation"}), + "requiredCache": { + "SPARK_NATIVE_ARCH": "OFF", + "SPARK_TOOLCHAIN_CXX_COMPILER_ID": "MSVC", + "SPARK_TOOLCHAIN_CXX_ARCHITECTURE": "X64", + }, + "requiredCall": { + "file": "CMakeLists.txt", + "name": "spark_register_isa_baseline_scan", + "arguments": ["${SPARK_SHIPPED_IMAGE_TARGETS}"], + }, + "record": { + "target": "CpuFloor_IsaBaseline", + "kind": "utility", + "file": "cmake/SparkIsaBaseline.cmake", + "line": 49, + "conditionFrames": [], + "definitionScope": ["spark_register_isa_baseline_scan"], + "origin": "function-template", + "resolved": True, + }, + }, "check-fuzz-policy": { "profiles": frozenset({"windows-validation"}), "requiredCache": {"SPARK_ENABLE_FUZZ_POLICY_CHECKS": "ON"}, @@ -1270,6 +1293,26 @@ def reviewed_configured_function_targets( for name, required in contract["requiredCache"].items() ): continue + call = contract.get("requiredCall") + if call is not None: + # A literal target in an unused function is not a configured target. + # Require the real, unconditional root invocation; unknown guards, + # nested definitions, changed arguments, or duplicate calls fail closed. + try: + source = (REPO_ROOT / call["file"]).read_text(encoding="utf-8", errors="strict") + commands = list(_commands_with_conditions(source, call["file"])) + except (OSError, UnicodeError, InventoryError): + continue + calls = [command for command in commands if command["name"] == call["name"]] + if len(calls) != 1: + continue + invocation = calls[0] + if ( + invocation.get("definitionScope") + or invocation.get("conditionFrames") + or _tokenize_cmake_arguments(invocation["body"]) != call["arguments"] + ): + continue if declaration == contract["record"]: reviewed.add(str(target)) return reviewed diff --git a/Tools/clang-tidy-budget.json b/Tools/clang-tidy-budget.json index bfb52945b..eb1d4e46e 100644 --- a/Tools/clang-tidy-budget.json +++ b/Tools/clang-tidy-budget.json @@ -2,15 +2,15 @@ "schemaVersion": 1, "description": "CI-110 clang-tidy diagnostic budget: distinct diagnostics per file and check across every shipped-product translation unit, measured with the clang-tidy CI lane configuration. The checks and total fields summarize the files map. Lower entries as diagnostics are fixed; raising one is a reviewed exception. Regenerate with Tools/clang_tidy_budget.py update.", "clangTidyMajorVersion": 18, - "measuredAt": "Hosted clang-tidy 18.1.3 lane artifact clang-tidy-output (Build SparkEngine run 36455093181, job 109041200498) at 3d330173c1474d6becc6ce8cfd81a0fb4967e479, less the diagnostics the cifix2 clang-tidy-budget change fixed (each fixed (file, check) re-measured locally with clang-tidy 21.1.8 on the lane's libc++ Debug configure, which reproduced the hosted counts of every regressed entry except MMOPersistenceSystem.cpp bugprone-unchecked-optional-access; that entry was re-measured with clang-tidy 18.1.8: 10 at HEAD, 0 after). Stale entries the hosted run reported are lowered to its measured counts (2026-09-28). PlatformerHazardSystem.cpp braces lowered 17 -> 16 for the MOD-295 laser-toggle log removal (local clang-tidy 18, 103b76663). Re-measured in full on int/cifix2 (all 1001 translation units) with clang-tidy 18.1.8 on the lane's clang + libc++ 18 Debug configure (Vulkan unavailable, as on the hosted runner), which reproduced the hosted 3d330173c counts for every (file, check) pair in files unchanged since then; the wave-7 regressions were braced or fixed by hand and TFCrypto.cpp modernize-use-auto (2 -> 1) and GraphicsDeviceResourcesLinuxShaders.cpp braces (12 -> 10) lowered to the measured counts (2026-09-28). SEC-120 parser split merged (int/sec120, 2026-09-29): DataTableSystem.h braces 82 -> 73, CollaborativeEditSession.cpp braces 57 -> 50 (measured 51 after the codec moved to CollaborativeWireCodec.cpp, 50 after one more statement was braced) and the DialogueSystem.cpp using-namespace entry removed; the 14 translation units that are or include a changed shipped-product file were re-measured with clang-tidy 18.1.8 on the lane's clang + libc++ 18 Debug configure (Vulkan unavailable), and the new FpsSnapshotCodec.cpp, CollaborativeWireCodec.cpp, DialogueTreeLoader.cpp and StringTable.cpp report no diagnostics. MOD-320 session gate merged (int/mod320, 2026-09-29): SparkGameMMO Main.cpp braces 35 -> 33 and MMOWorldSetup.cpp braces 18 -> 17 (the lane braced the lines it rewrote), and SparkGateway GatewayAreaControl.cpp braces 92 -> 85, stale since the tf-data merge (01a345d80) braced its handoff Apply path; every SparkGameMMO, SparkGateway and SparkServer translation unit (36) was re-measured with clang-tidy 18.1.8 on the lane's clang + libc++ 18 Debug configure (Vulkan unavailable), and the new MMOSessionGate.cpp, MMOSessionGateProtocol.cpp, MMOSessionGateWorld.cpp, MMOSessionCommands.cpp, MMOPlayerSession.cpp and the relocated Engine/Networking/GatewayAuthenticator.h report no diagnostics. Hosted clang-tidy 18.1.3 lane on 3a07a4af3 (Build SparkEngine run 36584055785) reported five stale entries, lowered to its counts (2026-09-29): SparkGameFPS Game.h bugprone-forward-declaration-namespace 2 -> 1, SparkGameOpenWorld Main.cpp braces 17 -> 16, SparkGameRacing Main.cpp braces 26 -> 25, NetworkManager.cpp braces 27 -> 26, and the GameSystemEnums.h performance-enum-size entry removed (the header now only forwards to Spark/GameTypes.h). Its two new bugprone-exception-escape destructors (TFServerSim, AreaHandoffDispatcher) were fixed in code, not budgeted. CI-fix fleet (2026-09-30): the new braces/use-auto diagnostics its racing, NetworkManager and OpenGL edits introduced were braced/fixed in code (clang-tidy 18.1.8 on each changed translation unit, base 9daffa856 vs head, identical counts elsewhere), and RacingTrackColliders.cpp lowered to its measured counts: braces 20 -> 18, modernize-use-emplace 2 -> 1. SEC-120 installer/mod-manifest lane (2026-09-29): SparkInstaller InstallState.cpp braces 23 -> 0 (strict bounded marker readers plus the remaining ReadFile/Load/Save statements braced) and the ModSystem.cpp braces entry removed (its one unbraced statement moved to ModSystemLifecycle.cpp and was braced); the changed translation units were re-measured with clang-tidy 18.1.8 on the lane's clang + libc++ 18 Debug configure (Vulkan unavailable), and ModSystemLifecycle.cpp reports no diagnostics. SEC-120 replay/animation lane (2026-09-30): SparkEngine AnimationSystem.cpp braces 9 -> 7 and its modernize-loop-convert entry removed (the .skel/.sanim decoders moved to AnimationBinaryFormat.cpp, whose loop was converted); AnimationSystem.cpp, AnimationBinaryFormat.cpp and ReplaySystem.cpp were re-measured with clang-tidy 18.1.8 on the lane's clang + libc++ 18 Debug configure, and AnimationBinaryFormat.cpp reports no diagnostics. Crash sandbox artifact roots (rel/crash-appcontainer, 2026-09-30): CrashHandler.cpp braces 55 -> 54 (InitializeCrashArtifactDirectory braced its early return; clang-tidy 18.1.8 on the lane's clang + libc++ 18 Debug configure, base aecd03563 vs head, identical counts otherwise). MOD-310 continuation (2026-09-30): removed the 12 stale StateMachine.h/AngleUtils.h entries already lowered in original lane commit 187e5571f; both private headers are now forwarding includes with no implementation. This is a port of that removal, not a new full-tree measurement; Game.cpp and newly changed translation units still require exact-tree clang-tidy verification. MOD-310 port verification (rel/w8-mod310, 2026-09-30): SparkGameFPS Main.cpp braces 110 -> 108 (OnLoad braced its EventBus/physics wiring); clang-tidy 18.1.8 on the lane's clang + libc++ 18 Debug configure over every changed translation unit, base aecd03563 vs head, shows no new diagnostic in a changed file. TF-120 travel lane (2026-09-30): SparkGameMMOFPS TFWorldSetup.cpp braces 33 -> 7 and its modernize-use-starts-ends-with entry removed (the terrain parse and height function moved to TFTerrainModel.cpp, braced); TFWorldSetup.cpp and TFServerSimHandoff.cpp were re-measured with clang-tidy 18.1.8 (base c14bca676 vs head, identical counts elsewhere), and TFTerrainModel.cpp reports no diagnostics. ModSystemIO.cpp bugprone-implicit-widening-of-multiplication-result lowered 1 -> 0 for the SEC-120 mod-json-swap-race fix (the manifest cap moved to ModSystem.h as a size_t product; local clang-tidy 18.1.8). Hosted clang-tidy on 5c9521923 (Build SparkEngine run for PR #587): SparkGameFPS Game.cpp bugprone-exception-escape 1 -> 0 after the MOD-310/fps-visible-frame merge; entry removed (2026-09-30). SEC-120 fuzz batch (2026-09-30): SparkGateway GatewayAreaControl.cpp braces 85 -> 84 (the epoch-state reader moved to GatewayAreaControlState.cpp, whose statements are braced), SparkGameRTS RTSPersistence.cpp braces 27 -> 5 and RTSCommandSystem.cpp braces 18 -> 17 (Validate and IsCommandValid moved to RTSPersistenceValidation.cpp and were braced); OrchestrationJournal.cpp, AsyncDatabase.cpp, MMOPersistenceSystem.cpp, GatewayAreaControl.cpp, RTSPersistence.cpp and RTSCommandSystem.cpp were re-measured with clang-tidy 18.1.8 on the lane's clang + libc++ 18 Debug configure (base c14bca676 vs head, identical deduplicated counts elsewhere), and the new MMOCharacterRecord.cpp, GatewayAreaControlState.cpp and RTSPersistenceValidation.cpp report no diagnostics of their own. Hosted clang-tidy 18.1.3 on 079b99131 (run 36811181228): RTSSkirmishSimulation.cpp braces 23 -> 22 and InvalidStateDetector.cpp 14 -> 13 lowered to its counts; the new unbraced statements it reported were braced in code (OrchestrationJournal.cpp, 11 lines, entry 41 -> 35; PhysicsSystem.cpp 5; PasswordHash.cpp 2; SecureMemory.h 1), counted from the hosted diagnostics rather than a local re-measure (2026-10-01). VisualScript Main.cpp readability-braces-around-statements 17 -> 13 (lifescript lane removed three unbraced OnUpdate ifs and braced vs_restart), measured with clang-tidy 22.1.8 on the Windows Ninja compile database; the same measurement reproduces the base file's 17 (2026-10-01). EventResponseSystem.cpp owned reductions measured on 4e19349d55664db0f3bb1a37fd4fc5468d96ee62 by run37004609090/job110829847299: bugprone-branch-clone1 ->0, readability-braces-around-statements58 ->1. Other file/check budgets unchanged; inherited full-tree findings remain unresolved. Renderer-owned reductions measured by hosted clang-tidy 18.1.3 on 65d4fafd346ee8bdef3664c8e8b0ff7e0e358259, run 37004792871, job 110830420280: GraphicsRenderPipelinesLinux.cpp modernize-loop-convert 1 -> 0 and WorldBasicRenderer.cpp readability-braces-around-statements 28 -> 22. Other file/check budgets are unchanged; this is not a claim that inherited full-tree budget violations are resolved. Combined integration preserves the independently measured ScopeGuard and renderer reductions; aggregate totals recomputed, no new allowance added. Missing shipped-product roots (2026-10-02, PR #589): measured exactly all four translation units of SparkAssetPipelineCore/src and SparkCrashReporter/src on Ubuntu 24.04 with Ubuntu LLVM version 18.1.3, the blocking tidy lane's unchanged libc++ Debug configure and .clang-tidy, at c098b7b0291559d13aeadff6b8d9276174bab522, Actions run 36972283770 (serial raw log SHA-256 8772b13c06108bda52bf10ecc97fbf70a52f28e570d1f6ac459423cb89335a00). New-file counts: {\"SparkAssetPipelineCore/src/AssetCooker.cpp\": {}, \"SparkCrashReporter/src/CrashAutoIssues.cpp\": {}, \"SparkCrashReporter/src/CrashReporterApp.cpp\": {}, \"SparkCrashReporter/src/main.cpp\": {\"bugprone-exception-escape\": 1}}. Every pre-existing file/check entry is unchanged; this four-file measurement is not a new full-tree measurement. Integrated onto 388c125f4 preserving every existing per-file/check value; combined-source analysis not yet run.", - "total": 16043, + "measuredAt": "PR616 hosted LLVM 18.1.3 complete lane, Build run 37446187239 job 112213235808 at PR head 6707de6af; per-file Asset Browser allocations follow moved code. The single new MaterialEditorMaterialParser.h widening diagnostic is removed by the reviewed size_t-first multiplication fix in this change; next hosted lane must confirm.", + "total": 15659, "checks": { "bugprone-assignment-in-if-condition": 6, "bugprone-branch-clone": 61, "bugprone-empty-catch": 28, "bugprone-exception-escape": 129, "bugprone-forward-declaration-namespace": 1, - "bugprone-implicit-widening-of-multiplication-result": 109, + "bugprone-implicit-widening-of-multiplication-result": 105, "bugprone-inc-dec-in-conditions": 1, "bugprone-incorrect-roundings": 9, "bugprone-integer-division": 4, @@ -34,15 +34,15 @@ "modernize-avoid-bind": 1, "modernize-concat-nested-namespaces": 31, "modernize-deprecated-headers": 10, - "modernize-loop-convert": 48, + "modernize-loop-convert": 46, "modernize-macro-to-enum": 17, "modernize-make-unique": 3, - "modernize-pass-by-value": 37, - "modernize-raw-string-literal": 73, + "modernize-pass-by-value": 33, + "modernize-raw-string-literal": 60, "modernize-redundant-void-arg": 1, - "modernize-return-braced-init-list": 182, - "modernize-use-auto": 376, - "modernize-use-default-member-init": 111, + "modernize-return-braced-init-list": 178, + "modernize-use-auto": 372, + "modernize-use-default-member-init": 110, "modernize-use-emplace": 96, "modernize-use-equals-default": 20, "modernize-use-equals-delete": 122, @@ -52,8 +52,8 @@ "modernize-use-transparent-functors": 2, "modernize-use-using": 10, "performance-avoid-endl": 134, - "performance-enum-size": 309, - "performance-faster-string-find": 4, + "performance-enum-size": 308, + "performance-faster-string-find": 2, "performance-inefficient-string-concatenation": 17, "performance-inefficient-vector-operation": 7, "performance-move-const-arg": 11, @@ -62,7 +62,7 @@ "performance-trivially-destructible": 1, "performance-unnecessary-copy-initialization": 6, "performance-unnecessary-value-param": 106, - "readability-braces-around-statements": 13458, + "readability-braces-around-statements": 13109, "readability-inconsistent-declaration-parameter-name": 24 }, "files": { @@ -130,15 +130,13 @@ }, "GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp": { "modernize-concat-nested-namespaces": 1, - "modernize-return-braced-init-list": 1, - "readability-braces-around-statements": 6 + "modernize-return-braced-init-list": 1 }, "GameModules/SparkGameFPS/Source/Game/FPSLocalProfile.cpp": { "readability-braces-around-statements": 4 }, "GameModules/SparkGameFPS/Source/Game/Game.cpp": { - "google-build-using-namespace": 1, - "readability-braces-around-statements": 35 + "google-build-using-namespace": 1 }, "GameModules/SparkGameFPS/Source/Game/Game.h": { "bugprone-forward-declaration-namespace": 1, @@ -150,8 +148,7 @@ "readability-braces-around-statements": 37 }, "GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp": { - "google-build-using-namespace": 1, - "readability-braces-around-statements": 2 + "google-build-using-namespace": 1 }, "GameModules/SparkGameFPS/Source/Game/GameMechanics.cpp": { "google-build-using-namespace": 1, @@ -313,9 +310,8 @@ "readability-braces-around-statements": 10 }, "GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.cpp": { - "bugprone-implicit-widening-of-multiplication-result": 1, "modernize-use-auto": 1, - "readability-braces-around-statements": 12 + "readability-braces-around-statements": 11 }, "GameModules/SparkGameMMOFPS/Source/Console/TFCommands.cpp": { "google-build-using-namespace": 2, @@ -709,7 +705,7 @@ "readability-braces-around-statements": 9 }, "GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp": { - "readability-braces-around-statements": 18 + "readability-braces-around-statements": 17 }, "GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp": { "modernize-use-auto": 1, @@ -1163,8 +1159,7 @@ "SparkBuild/src/ProcessRunner.cpp": { "modernize-deprecated-headers": 1, "modernize-use-equals-default": 1, - "performance-unnecessary-value-param": 3, - "readability-braces-around-statements": 24 + "performance-unnecessary-value-param": 3 }, "SparkBuild/src/SparkBuild.cpp": { "bugprone-empty-catch": 2, @@ -1320,7 +1315,7 @@ }, "SparkEditor/Source/Core/EditorLayoutManager.cpp": { "modernize-raw-string-literal": 5, - "readability-braces-around-statements": 41 + "readability-braces-around-statements": 33 }, "SparkEditor/Source/Core/EditorLayoutManager.h": { "performance-enum-size": 1 @@ -1357,17 +1352,12 @@ "SparkEditor/Source/Core/EditorRecovery.h": { "bugprone-implicit-widening-of-multiplication-result": 1 }, - "SparkEditor/Source/Core/EditorRecoveryFiles.h": { - "readability-braces-around-statements": 7 - }, "SparkEditor/Source/Core/EditorRecoveryJson.h": { "readability-braces-around-statements": 6 }, "SparkEditor/Source/Core/EditorTheme.cpp": { - "modernize-raw-string-literal": 3, - "modernize-return-braced-init-list": 14, - "performance-faster-string-find": 2, - "readability-braces-around-statements": 15 + "modernize-return-braced-init-list": 10, + "readability-braces-around-statements": 9 }, "SparkEditor/Source/Core/EditorUI.cpp": { "bugprone-branch-clone": 1, @@ -1386,15 +1376,13 @@ }, "SparkEditor/Source/Core/EditorWindowManager.cpp": { "modernize-raw-string-literal": 3, - "readability-braces-around-statements": 27 + "readability-braces-around-statements": 25 }, "SparkEditor/Source/Core/ProjectManager.cpp": { - "bugprone-implicit-widening-of-multiplication-result": 1, "modernize-deprecated-headers": 1, - "modernize-raw-string-literal": 12, + "modernize-raw-string-literal": 2, "modernize-return-braced-init-list": 2, - "modernize-use-auto": 1, - "readability-braces-around-statements": 140 + "readability-braces-around-statements": 105 }, "SparkEditor/Source/Core/TutorialSystem.h": { "modernize-use-equals-delete": 2 @@ -1465,11 +1453,16 @@ "performance-enum-size": 1, "readability-braces-around-statements": 27 }, - "SparkEditor/Source/Panels/AssetBrowserPanel.cpp": { + "SparkEditor/Source/Panels/AssetBrowserGrid.cpp": { "bugprone-empty-catch": 1, "bugprone-implicit-widening-of-multiplication-result": 1, - "modernize-return-braced-init-list": 1, - "readability-braces-around-statements": 43 + "readability-braces-around-statements": 25 + }, + "SparkEditor/Source/Panels/AssetBrowserPanel.cpp": { + "readability-braces-around-statements": 18 + }, + "SparkEditor/Source/Panels/AssetBrowserPathUtils.h": { + "modernize-return-braced-init-list": 1 }, "SparkEditor/Source/Panels/AudioMixerPanel.cpp": { "readability-braces-around-statements": 7 @@ -1669,7 +1662,6 @@ "readability-braces-around-statements": 13 }, "SparkEditor/Source/Panels/MaterialEditorPanel.cpp": { - "modernize-loop-convert": 1, "performance-inefficient-string-concatenation": 2, "readability-braces-around-statements": 6 }, @@ -1769,9 +1761,6 @@ "modernize-use-auto": 1, "readability-braces-around-statements": 12 }, - "SparkEditor/Source/Panels/SceneImportPanel.cpp": { - "readability-braces-around-statements": 24 - }, "SparkEditor/Source/Panels/SceneImportPanelDrawing.cpp": { "readability-braces-around-statements": 9 }, @@ -1918,12 +1907,9 @@ "readability-braces-around-statements": 6 }, "SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp": { - "bugprone-implicit-widening-of-multiplication-result": 3, + "bugprone-implicit-widening-of-multiplication-result": 1, "google-build-using-namespace": 1, - "modernize-use-auto": 3, - "modernize-use-default-member-init": 1, - "performance-enum-size": 1, - "readability-braces-around-statements": 104 + "readability-braces-around-statements": 22 }, "SparkEditor/Source/SceneSystem/SceneComponentCodec.cpp": { "modernize-use-auto": 1, @@ -1948,8 +1934,7 @@ "SparkEditor/Source/SceneSystem/SceneSerializer.cpp": { "bugprone-branch-clone": 1, "bugprone-empty-catch": 1, - "google-build-using-namespace": 1, - "readability-braces-around-statements": 8 + "google-build-using-namespace": 1 }, "SparkEditor/Source/SceneSystem/SceneSerializer.h": { "bugprone-implicit-widening-of-multiplication-result": 1, @@ -2859,8 +2844,7 @@ "readability-braces-around-statements": 6 }, "SparkEngine/Source/Engine/UI/UISystem.cpp": { - "modernize-loop-convert": 2, - "modernize-pass-by-value": 4 + "modernize-loop-convert": 1 }, "SparkEngine/Source/Engine/UI/UISystem.h": { "performance-enum-size": 2 @@ -3766,8 +3750,7 @@ "bugprone-exception-escape": 1, "modernize-use-std-numbers": 1, "performance-no-automatic-move": 1, - "performance-unnecessary-value-param": 1, - "readability-braces-around-statements": 60 + "performance-unnecessary-value-param": 1 }, "SparkEngine/Source/Utils/Assert.cpp": { "readability-braces-around-statements": 2 @@ -3864,7 +3847,7 @@ "modernize-use-starts-ends-with": 4, "performance-enum-size": 1, "performance-no-int-to-ptr": 1, - "readability-braces-around-statements": 54 + "readability-braces-around-statements": 52 }, "SparkEngine/Source/Utils/CrashHandlerStub.cpp": { "readability-braces-around-statements": 2 @@ -4058,7 +4041,7 @@ "modernize-use-equals-delete": 2 }, "SparkEngine/Source/Utils/PasswordHash.cpp": { - "readability-braces-around-statements": 18 + "readability-braces-around-statements": 15 }, "SparkEngine/Source/Utils/Process.h": { "performance-enum-size": 1 @@ -4208,16 +4191,12 @@ "SparkInstaller/src/GitBootstrap.cpp": { "readability-braces-around-statements": 23 }, - "SparkInstaller/src/GitRunner.cpp": { - "readability-braces-around-statements": 24 - }, "SparkInstaller/src/InstallState.cpp": { "bugprone-implicit-widening-of-multiplication-result": 1, "modernize-raw-string-literal": 7 }, "SparkInstaller/src/Installer.cpp": { - "bugprone-branch-clone": 1, - "readability-braces-around-statements": 10 + "bugprone-branch-clone": 1 }, "SparkInstaller/src/gui/BackendLinux.cpp": { "bugprone-branch-clone": 1, @@ -4236,7 +4215,7 @@ }, "SparkLauncher/src/LauncherApp.cpp": { "modernize-use-auto": 1, - "readability-braces-around-statements": 17 + "readability-braces-around-statements": 9 }, "SparkLauncher/src/LauncherBackendLinux.cpp": { "bugprone-branch-clone": 1, @@ -4248,7 +4227,7 @@ }, "SparkLauncher/src/LauncherProcess.cpp": { "performance-no-automatic-move": 1, - "readability-braces-around-statements": 42 + "readability-braces-around-statements": 41 }, "SparkServer/src/ServerApplication.cpp": { "readability-braces-around-statements": 68 diff --git a/cmake/RunSparkModuleProfileLifecycle.cmake b/cmake/RunSparkModuleProfileLifecycle.cmake index b94b8d0d6..334e2c7e7 100644 --- a/cmake/RunSparkModuleProfileLifecycle.cmake +++ b/cmake/RunSparkModuleProfileLifecycle.cmake @@ -1,6 +1,15 @@ cmake_minimum_required(VERSION 3.25) function(_spark_validate_lifecycle_result child_result child_stdout child_stderr out_ok out_reason) + set(_expected_module "SparkGameFPS") + if(ARGC GREATER 5) + set(_expected_module "${ARGV5}") + endif() + if(NOT _expected_module MATCHES "^[A-Za-z][A-Za-z0-9_]*$") + set(${out_ok} FALSE PARENT_SCOPE) + set(${out_reason} "invalid expected module identity" PARENT_SCOPE) + return() + endif() set(_ok TRUE) set(_reason "") @@ -58,9 +67,9 @@ function(_spark_validate_lifecycle_result child_result child_stdout child_stderr elseif(_ok) list(GET _lifecycle_candidates 0 _marker) if(NOT _marker MATCHES - "^SPARK_MODULE_LIFECYCLE module=SparkGameFPS create=[0-9]+ load=[0-9]+ update=[0-9]+ fixed=[0-9]+ render=[0-9]+ unload=[0-9]+ destroy=[0-9]+ faults=[0-9]+$") + "^SPARK_MODULE_LIFECYCLE module=${_expected_module} create=[0-9]+ load=[0-9]+ update=[0-9]+ fixed=[0-9]+ render=[0-9]+ unload=[0-9]+ destroy=[0-9]+ faults=[0-9]+$") set(_ok FALSE) - set(_reason "the single lifecycle marker is not an exact standalone SparkGameFPS record") + set(_reason "the single lifecycle marker is not an exact standalone ${_expected_module} record") endif() if(_ok) diff --git a/cmake/SparkCPackOptions.cmake b/cmake/SparkCPackOptions.cmake index 82ede6d9e..694d195d8 100644 --- a/cmake/SparkCPackOptions.cmake +++ b/cmake/SparkCPackOptions.cmake @@ -27,15 +27,55 @@ if(CPACK_GENERATOR STREQUAL "NSIS" OR CPACK_GENERATOR STREQUAL "WIX") endif() endif() +if(CPACK_GENERATOR STREQUAL "NSIS") + if(NOT DEFINED CPACK_PACKAGE_DIRECTORY OR CPACK_PACKAGE_DIRECTORY STREQUAL "") + message(FATAL_ERROR "NSIS version metadata requires CPACK_PACKAGE_DIRECTORY") + endif() + # CPack's default NSIS template does not create a VERSIONINFO resource. + # The installer is a shipped PE product and must carry the same fixed and + # string versions as the runtime binaries, not just a versioned filename. + # Component generation overwrites the internal CPACK_NSIS_DEFINES variable. + # Derive a template from this CMake installation and preserve its component + # placeholder. CPack searches CMAKE_MODULE_PATH for custom templates. + file(READ "${CMAKE_ROOT}/Modules/Internal/CPack/NSIS.template.in" _spark_nsis_template) + string(REGEX MATCHALL "@CPACK_NSIS_DEFINES@" _spark_nsis_anchors "${_spark_nsis_template}") + list(LENGTH _spark_nsis_anchors _spark_nsis_anchor_count) + if(NOT _spark_nsis_anchor_count EQUAL 1) + message(FATAL_ERROR "The NSIS template must have exactly one version-metadata insertion anchor") + endif() + set(_spark_nsis_version_metadata [=[ +VIProductVersion "@CPACK_PACKAGE_VERSION@.0" +VIFileVersion "@CPACK_PACKAGE_VERSION@.0" +VIAddVersionKey /LANG=1033 "ProductName" "SparkEngine" +VIAddVersionKey /LANG=1033 "CompanyName" "Spark Engine Team" +VIAddVersionKey /LANG=1033 "FileDescription" "SparkEngine Runtime Installer" +VIAddVersionKey /LANG=1033 "LegalCopyright" "Copyright (C) SparkEngine contributors" +VIAddVersionKey /LANG=1033 "FileVersion" "@CPACK_PACKAGE_VERSION@.0" +VIAddVersionKey /LANG=1033 "ProductVersion" "@CPACK_PACKAGE_VERSION@.0" +]=]) + string(REPLACE "@CPACK_NSIS_DEFINES@" + "@CPACK_NSIS_DEFINES@\n${_spark_nsis_version_metadata}" + _spark_nsis_template "${_spark_nsis_template}") + set(_spark_nsis_template_dir "${CPACK_PACKAGE_DIRECTORY}/spark-nsis-template") + file(MAKE_DIRECTORY "${_spark_nsis_template_dir}") + file(WRITE "${_spark_nsis_template_dir}/NSIS.template.in" "${_spark_nsis_template}") + list(PREPEND CMAKE_MODULE_PATH "${_spark_nsis_template_dir}") + unset(_spark_nsis_template) + unset(_spark_nsis_anchors) + unset(_spark_nsis_anchor_count) + unset(_spark_nsis_version_metadata) + unset(_spark_nsis_template_dir) +endif() + if(CPACK_GENERATOR STREQUAL "WIX") # Qualification and installation are per-user and must never request UAC - # or default to Program Files. CMake added this WiX switch in 3.29; older + # or default to Program Files. CMake supports per-user WiX packages in 4.3; older # versions can still build the engine and ZIP, but cannot create this MSI. # The closure driver also includes this file in cmake -P mode only to # obtain the component set; that operation does not generate an MSI. get_property(_spark_packaging_role GLOBAL PROPERTY CMAKE_ROLE) - if(_spark_packaging_role STREQUAL "CPACK" AND CMAKE_VERSION VERSION_LESS "3.29") - message(FATAL_ERROR "Per-user Windows MSI packaging requires CMake 3.29 or newer") + if(_spark_packaging_role STREQUAL "CPACK" AND CMAKE_VERSION VERSION_LESS "4.3") + message(FATAL_ERROR "Per-user Windows MSI packaging requires CMake 4.3 or newer") endif() unset(_spark_packaging_role) set(CPACK_WIX_INSTALL_SCOPE "perUser") diff --git a/cmake/SparkCpuFloor.cmake b/cmake/SparkCpuFloor.cmake index 5e8120706..8a192081c 100644 --- a/cmake/SparkCpuFloor.cmake +++ b/cmake/SparkCpuFloor.cmake @@ -31,11 +31,30 @@ include_guard(GLOBAL) +# Compiler identities describe the target even when a Windows launcher omits +# PROCESSOR_ARCHITECTURE. Keep non-MSVC toolchain/system identities authoritative. +function(spark_cpu_floor_target_is_x86 out_var) + set(_arch "${CMAKE_SYSTEM_PROCESSOR}") + if(MSVC) + if(NOT "${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}" STREQUAL "") + set(_arch "${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}") + elseif(NOT "${CMAKE_C_COMPILER_ARCHITECTURE_ID}" STREQUAL "") + set(_arch "${CMAKE_C_COMPILER_ARCHITECTURE_ID}") + endif() + endif() + set(_x86 FALSE) + if(_arch MATCHES "^(x64|X64|x86_64|AMD64|amd64|x86|X86|i[3-6]86)$") + set(_x86 TRUE) + endif() + set(${out_var} ${_x86} PARENT_SCOPE) +endfunction() + # True when the configured target is x86/x86-64 and the build is not tuned for # the build host, i.e. when the stable-v1 CPU floor applies. function(spark_cpu_floor_enforced out_var) set(_enforced FALSE) - if(NOT SPARK_NATIVE_ARCH AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|AMD64|amd64|x86|X86|i[3-6]86)$") + spark_cpu_floor_target_is_x86(_x86) + if(NOT SPARK_NATIVE_ARCH AND _x86) set(_enforced TRUE) endif() set(${out_var} ${_enforced} PARENT_SCOPE) @@ -88,7 +107,8 @@ endfunction() # keep whatever a previous configuration chose. function(spark_configure_jolt_cpu_floor) spark_cpu_floor_enforced(_enforced) - if(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|AMD64|amd64|x86|X86|i[3-6]86)$") + spark_cpu_floor_target_is_x86(_x86) + if(NOT _x86) return() endif() if(_enforced) diff --git a/cmake/SparkLibsodium.cmake b/cmake/SparkLibsodium.cmake index 7ca3c5684..23cc0d1b2 100644 --- a/cmake/SparkLibsodium.cmake +++ b/cmake/SparkLibsodium.cmake @@ -99,7 +99,14 @@ if(MSVC) # VEX code was otherwise inlined into SecureChannel::Seal/Open and # PasswordHash, where no reviewed runtime-dispatch range could bound it. # CpuFloor_LibsodiumVariants fails on any AVX2/AES-NI host if one returns. - if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(x86_64|AMD64|amd64|x86|X86|i[3-6]86)$") + # Windows launchers can omit PROCESSOR_ARCHITECTURE, leaving CMake's system + # processor empty. The C compiler's architecture identifies the actual + # target and also avoids using the host architecture for cross compilation. + set(_spark_sodium_msvc_arch "${CMAKE_C_COMPILER_ARCHITECTURE_ID}") + if(_spark_sodium_msvc_arch STREQUAL "") + set(_spark_sodium_msvc_arch "${CMAKE_SYSTEM_PROCESSOR}") + endif() + if(_spark_sodium_msvc_arch MATCHES "^(x64|X64|x86_64|AMD64|amd64|x86|X86|i[3-6]86)$") set(_spark_sodium_floor_header "${_spark_sodium_gen_include}/spark_sodium_cpu_floor.h") file(CONFIGURE OUTPUT "${_spark_sodium_floor_header}" CONTENT [[ /* Generated by cmake/SparkLibsodium.cmake: keep libsodium within the OD-04 CPU floor on MSVC. */ @@ -246,9 +253,13 @@ else() # Upstream's recommended code-generation flags; warnings are upstream's to # fix, so the vendored target is compiled silently. + # Keep the cryptographic dependency optimized in Debug, as upstream's + # configure.ac does by default. At -O0 the 600,000-round password verifier + # exceeds the production authenticator's 2 s deadline on CI runners. + # Debug symbols and the engine's own Debug code remain enabled. target_compile_options(spark_sodium PRIVATE -w -fvisibility=hidden -fno-strict-aliasing -fno-strict-overflow -fwrapv - -flax-vector-conversions) + -flax-vector-conversions $<$:-O2>) set_property(TARGET spark_sodium PROPERTY POSITION_INDEPENDENT_CODE ON) endif() diff --git a/cmake/SparkWindowsVersionInfo.cmake b/cmake/SparkWindowsVersionInfo.cmake index 0e85e4359..3e4aceead 100644 --- a/cmake/SparkWindowsVersionInfo.cmake +++ b/cmake/SparkWindowsVersionInfo.cmake @@ -130,4 +130,11 @@ function(spark_attach_shipped_windows_version_info) spark_target_windows_version_info("${_spark_executable}") endif() endforeach() + # The discovered module list also drives installation. Stamp those shipped + # DLLs before their post-build ABI sidecars hash the final linked image. + foreach(_spark_game_module IN LISTS _SPARK_GAME_MODULE_NAMES) + if(TARGET "${_spark_game_module}") + spark_target_windows_version_info("${_spark_game_module}") + endif() + endforeach() endfunction() diff --git a/cmake/TestSparkWindowsVersionInfo.cmake b/cmake/TestSparkWindowsVersionInfo.cmake index aaef954c6..292dff9b9 100644 --- a/cmake/TestSparkWindowsVersionInfo.cmake +++ b/cmake/TestSparkWindowsVersionInfo.cmake @@ -104,3 +104,48 @@ foreach(_spark_expected IN ITEMS endif() endforeach() message(STATUS "Validated first-party DLL VERSIONINFO resource") + +# Exercise the production attachment helper, not only its resource generator. +# Only selected discovered modules are shipped, and a repeated helper call must +# not attach a second resource to the same target. +set(_spark_attachment_fixture "${SPARK_TEST_OUTPUT_DIR}/attachment-fixture") +file(MAKE_DIRECTORY "${_spark_attachment_fixture}") +file(WRITE "${_spark_attachment_fixture}/module.cpp" "int fixture() { return 0; }\n") +file(WRITE "${_spark_attachment_fixture}/CMakeLists.txt" " +cmake_minimum_required(VERSION 3.25) +project(SparkVersionAttachmentFixture LANGUAGES CXX) +include(\"${SPARK_SOURCE_DIR}/cmake/SparkWindowsVersionInfo.cmake\") +set(WIN32 TRUE) +set(SPARK_ENGINE_VERSION 7.8.9) +add_library(SparkGameVersionFixture SHARED module.cpp) +add_library(SparkGameUnselectedFixture SHARED module.cpp) +set(_SPARK_GAME_MODULE_NAMES SparkGameVersionFixture) +spark_attach_shipped_windows_version_info() +spark_attach_shipped_windows_version_info() +get_target_property(_attached SparkGameVersionFixture SPARK_WINDOWS_VERSIONINFO_ATTACHED) +get_target_property(_unselected SparkGameUnselectedFixture SPARK_WINDOWS_VERSIONINFO_ATTACHED) +if(NOT _attached OR _unselected) + message(FATAL_ERROR \"Selected module version attachment is incorrect\") +endif() +get_target_property(_sources SparkGameVersionFixture SOURCES) +list(FILTER _sources INCLUDE REGEX \"VersionInfo[.]rc$\") +list(LENGTH _sources _count) +if(NOT _count EQUAL 1) + message(FATAL_ERROR \"Expected exactly one attached module resource\") +endif() +list(GET _sources 0 _resource) +configure_file(\"\${_resource}\" \"${_spark_attachment_fixture}/attached-module.rc\" COPYONLY) +") +execute_process(COMMAND "${CMAKE_COMMAND}" -G Ninja + -S "${_spark_attachment_fixture}" -B "${_spark_attachment_fixture}/build" + RESULT_VARIABLE _spark_attachment_result + OUTPUT_VARIABLE _spark_attachment_stdout ERROR_VARIABLE _spark_attachment_stderr) +if(NOT _spark_attachment_result EQUAL 0) + message(FATAL_ERROR + "Module attachment configure failed: ${_spark_attachment_stdout}\n${_spark_attachment_stderr}") +endif() +file(READ "${_spark_attachment_fixture}/attached-module.rc" _spark_attached_resource) +if(NOT _spark_attached_resource STREQUAL _spark_dll_resource) + message(FATAL_ERROR "Attached module resource differs from the validated DLL resource") +endif() +message(STATUS "Validated selected module VERSIONINFO attachment and idempotence") diff --git a/docs/readiness/ENGINE_READINESS_HANDOFF.md b/docs/readiness/ENGINE_READINESS_HANDOFF.md index f539891de..935a33312 100644 --- a/docs/readiness/ENGINE_READINESS_HANDOFF.md +++ b/docs/readiness/ENGINE_READINESS_HANDOFF.md @@ -1649,7 +1649,7 @@ Progress: 2 of 3 implemented, 0 evidenced at an exact commit. 1. **[unmet]** Malformed input cannot cause crash, OOB, path escape, integer overflow, or unbounded allocation/time - Evidence: `docs/sec120-fuzz-policy-check.json`, `tools/fuzz-policy/build_binding.py`, `FuzzerTests/CMakeLists.txt` - - 74 of 137 inventoried parsers have libFuzzer targets with seed corpora; 63 remain blocked. All registered targets require fatal UBSan at compile and link. Batch 3 adds eight editor and eight engine/tool targets; editor layout and window-layout substitute for binary-scene and crash-state. Linux sanitizer smoke, campaigns and exact-commit CI remain unverified. + - 74 of 138 parsers have libFuzzer targets and bounded corpora; 64 remain blocked. The reflected gameplay adapter has no harness for its second JSON parse and component/asset checks; DeserializeInto and text-reader harnesses do not execute LoadReflected. All targets require fatal UBSan. Hosted sanitizer evidence, campaigns, and closure remain unverified. 2. **[implemented]** Every found issue lands with a minimized regression fixture - Evidence: `tools/fuzz-policy/corpus_manifest.py`, `tools/fuzz-policy/check_fuzz_policy.py`, `tools/fuzz-policy/import_regression.py`, `tools/fuzz-policy/run_campaign.py`, `FuzzerTests/policy/test_fuzz_policy.py`, `FuzzerTests/policy/test_fuzz_campaign.py`, `.github/workflows/fuzz-scheduled.yml` - The gate requires each regression seed, guard and source-touching fixed_commit. Scheduled default time now scales with target count. Imports are not the only intake path; review and smoke records can be added manually. Historical minimization and guard RED proof remain unverified. Empty input lacks an approved regression record type. @@ -2545,7 +2545,7 @@ Progress: 4 of 4 implemented, 0 evidenced at an exact commit. 1. **[implemented]** External consumer needs no source-tree include/lib - Evidence: `cmake/RunInstalledPackageConsumer.cmake`, `cmake/TestPackageConsumerBoundary.cmake`, `Tests/CMakeLists.txt`, `Tests/PackageSmoke/FPSProgression/CMakeLists.txt`, `Tests/PackageSmoke/RunInstalledSDKTemplate.cmake`, `cmake/SparkPackageConsumerBoundary.cmake` - - Linux: opt-in PackageConsumer_LinuxInstalledSDK. Windows: SDKConsumer_InstalledEmptyProjectTemplate installs only the sdk component, builds the shipped EmptyProject, and boundary-scans ninja -t deps/commands dumps, failing if they are unscanned or never mention the prefix. SDKConsumer_TemplateRunnerContract passes locally; the Windows GREEN run is not independently verified. + - Linux: opt-in PackageConsumer_LinuxInstalledSDK. Windows: SDKConsumer_InstalledEmptyProjectTemplate installs runtime, sdk, and tools (sdk/tools depend on runtime), builds EmptyProject, and scans ninja -t deps/commands; unscanned dumps or missing prefix fail. SDKConsumer_TemplateRunnerContract passes locally; Windows GREEN is not independently verified. 2. **[implemented]** Any module whose ABI descriptor differs from the host, including an N-1 module, is rejected before OS load with a diagnostic naming the field and both versions (OD-02) - Evidence: `Tests/TestModuleABIDiagnostics.cpp`, `Tests/TestModuleVersion.cpp`, `SparkEngine/Source/Core/ModuleManager.cpp` - ModuleABI_ tests drive production LoadModule with sidecars for all ten fields plus struct_size and N-1 sdk_version, asserting exact 'rejected before OS load' messages that name the field and both values. ModuleVersion_ tests load real N-1 and N+1 SDK module images and assert the same named-field, both-versions rejection before any module code runs. @@ -4406,7 +4406,7 @@ ctest --test-dir build/linux-gcc-release -L prototype-module-kit --output-on-fai **Priority:** P1 · **Status:** in-progress · **Wave:** 4 · **Area:** networking · **Owner:** unassigned · **Release-blocking:** yes **Profile applicability:** `stable-v1`=outside -SparkGameFPS multiplayer currently ignores address and port and fabricates connection state; optional LAN work must remain experimental and independent of the stable single-player slice. Owner decision OD-14 (2026-09-24, docs/readiness/OWNER-DECISIONS.md): FPS multiplayer consolidates onto the multiplayer primitives used by SparkGameMMOFPS instead of keeping a separate FPSMultiplayerSystem implementation; the duplicate is removed only after parity is proven. +SparkGameFPS multiplayer uses the production encrypted UDP transport with loopback handshake, input and snapshot tests; rendered-player integration, constrained LAN acceptance and exact-commit qualification remain open. Optional LAN work must remain experimental and independent of the stable single-player slice. Owner decision OD-14 (2026-09-24, docs/readiness/OWNER-DECISIONS.md): FPS multiplayer consolidates onto the multiplayer primitives used by SparkGameMMOFPS instead of keeping a separate FPSMultiplayerSystem implementation; the duplicate is removed only after parity is proven. **Dependency contract** @@ -4435,7 +4435,7 @@ Progress: 4 of 4 implemented, 0 evidenced at an exact commit. 1. **[implemented]** Two clients converge on authoritative spawn-move-kill-respawn-score - Evidence: `Tests/TestFPSLANLoopback.cpp`, `Tests/Fixtures/FPSLANLoopbackPeer.cpp`, `Tests/Fixtures/FPSLANLoopbackScenario.h`, `Tests/CMakeLists.txt` - - FPSLAN_ThreeProcessLoopbackConvergence runs one server and two client processes over loopback UDP through a spawn-move-kill-respawn-score round; spawns, respawn, positions, health and scores converge with server, and quitting clients leave. Converged state is FPSMultiplayerSystem's; the rendered game reads none of it back (see risks). Local pass only; no constrained LAN or encrypted transport. + - FPSLAN_ThreeProcessLoopbackConvergence runs one server and two clients over loopback UDP through spawn-move-kill-respawn-score. Spawns, positions, health, respawn and scores converge, and quitting clients leave. This is FPSMultiplayerSystem state; the rendered game does not consume it (see risks). Local pass only; constrained LAN and exact-commit qualification remain open. 2. **[implemented]** No fake connection state remains - Evidence: `GameModules/SparkGameFPS/Source/Game/MultiplayerSystem.cpp`, `GameModules/SparkGameFPS/Source/Game/MultiplayerSystem.h`, `GameModules/SparkGameFPS/Source/Game/MultiplayerNetFlow.cpp`, `GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp`, `Tests/TestFPSMultiplayer.cpp`, `GameModules/SparkGameFPS/module.json` - Pending the central MSVC build and a FPSMultiplayerProduction_ run. diff --git a/docs/readiness/build-matrix-inventory.json b/docs/readiness/build-matrix-inventory.json index 96c3577c6..b4744eebb 100644 --- a/docs/readiness/build-matrix-inventory.json +++ b/docs/readiness/build-matrix-inventory.json @@ -625,7 +625,7 @@ "description": "Fail configuration when the NSIS or WiX toolchain is missing", "default": "OFF", "file": "CMakeLists.txt", - "line": 3722, + "line": 3751, "conditionFrames": [], "definitionScope": [] }, @@ -1378,7 +1378,7 @@ "description": "Register the slow installed-SDK template verification as a CTest", "default": "OFF", "file": "Tests/CMakeLists.txt", - "line": 4541, + "line": 4606, "conditionFrames": [], "definitionScope": [] }, @@ -1387,10 +1387,10 @@ "description": "Register real-time installed-package objective runs for experimental game modules", "default": "OFF", "file": "Tests/CMakeLists.txt", - "line": 3952, + "line": 4017, "conditionFrames": [ { - "id": "Tests/CMakeLists.txt:3947", + "id": "Tests/CMakeLists.txt:4012", "branch": 0, "branches": [ "BUILD_GAME_MODULES AND NOT CMAKE_CROSSCOMPILING AND TARGET SparkEngine" @@ -1404,7 +1404,7 @@ "description": "Register the slow Linux installed-package consumer test (PackageConsumer_*)", "default": "OFF", "file": "Tests/CMakeLists.txt", - "line": 4579, + "line": 4644, "conditionFrames": [], "definitionScope": [] }, @@ -1413,7 +1413,7 @@ "description": "Register installed CPack tree repeatability qualification", "default": "OFF", "file": "Tests/CMakeLists.txt", - "line": 4755, + "line": 4820, "conditionFrames": [], "definitionScope": [] }, @@ -1422,10 +1422,10 @@ "description": "Register the ten-minute headless FPS/NullRHI soak (label soak)", "default": "OFF", "file": "Tests/CMakeLists.txt", - "line": 3895, + "line": 3960, "conditionFrames": [ { - "id": "Tests/CMakeLists.txt:3823", + "id": "Tests/CMakeLists.txt:3888", "branch": 0, "branches": [ "Python3_Interpreter_FOUND" @@ -1439,7 +1439,7 @@ "description": "Register the TF-110 dedicated server + two-client run (label terrafront-multiclient)", "default": "OFF", "file": "Tests/CMakeLists.txt", - "line": 5019, + "line": 5084, "conditionFrames": [], "definitionScope": [] }, @@ -1448,7 +1448,7 @@ "description": "Register the OpenGL hardware-row lane (needs a GPU-backed GL 4.5 context)", "default": "OFF", "file": "Tests/CMakeLists.txt", - "line": 1900, + "line": 1960, "conditionFrames": [], "definitionScope": [] }, @@ -1508,7 +1508,7 @@ "description": "Fail configuration when the NSIS or WiX toolchain is missing", "default": "OFF", "file": "CMakeLists.txt", - "line": 3722, + "line": 3751, "conditionFrames": [], "definitionScope": [] }, @@ -1535,7 +1535,7 @@ "description": "Run the ctest SparkTests lanes with --warn-is-error (known-flaky waivers become failures)", "default": "OFF", "file": "Tests/CMakeLists.txt", - "line": 1762, + "line": 1818, "conditionFrames": [], "definitionScope": [] }, @@ -2601,7 +2601,7 @@ "target": "SparkCompatibleModuleFixture", "kind": "shared_library", "file": "Tests/CMakeLists.txt", - "line": 853, + "line": 895, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -2651,10 +2651,10 @@ "target": "SparkCrashArtifactSandboxProbe", "kind": "executable", "file": "Tests/CMakeLists.txt", - "line": 2258, + "line": 2318, "conditionFrames": [ { - "id": "Tests/CMakeLists.txt:2257", + "id": "Tests/CMakeLists.txt:2317", "branch": 0, "branches": [ "MSVC AND NOT CMAKE_CROSSCOMPILING" @@ -2787,10 +2787,10 @@ "target": "SparkCrashSymbolicationProbe", "kind": "executable", "file": "Tests/CMakeLists.txt", - "line": 5732, + "line": 5811, "conditionFrames": [ { - "id": "Tests/CMakeLists.txt:5730", + "id": "Tests/CMakeLists.txt:5809", "branch": 0, "branches": [ "CMAKE_SYSTEM_NAME STREQUAL \"Linux\" AND NOT CMAKE_CROSSCOMPILING AND MINIZ_FOUND\n AND Python3_Interpreter_FOUND AND CMAKE_OBJCOPY AND CMAKE_ADDR2LINE" @@ -2833,7 +2833,7 @@ "target": "SparkDebugHookTeardownProbe", "kind": "executable", "file": "Tests/CMakeLists.txt", - "line": 815, + "line": 819, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -2953,14 +2953,50 @@ "origin": "declaration", "resolved": true }, + { + "target": "SparkFPSCameraReloadRuntime", + "kind": "utility", + "file": "Tests/CMakeLists.txt", + "line": 847, + "conditionFrames": [ + { + "id": "Tests/CMakeLists.txt:830", + "branch": 0, + "branches": [ + "WIN32 AND TARGET SparkGameFPS" + ] + } + ], + "definitionScope": [], + "origin": "declaration", + "resolved": true + }, + { + "target": "SparkFPSCameraReloadTests", + "kind": "executable", + "file": "Tests/CMakeLists.txt", + "line": 831, + "conditionFrames": [ + { + "id": "Tests/CMakeLists.txt:830", + "branch": 0, + "branches": [ + "WIN32 AND TARGET SparkGameFPS" + ] + } + ], + "definitionScope": [], + "origin": "declaration", + "resolved": true + }, { "target": "SparkFPSLANLoopbackPeer", "kind": "executable", "file": "Tests/CMakeLists.txt", - "line": 1502, + "line": 1558, "conditionFrames": [ { - "id": "Tests/CMakeLists.txt:1464", + "id": "Tests/CMakeLists.txt:1520", "branch": 0, "branches": [ "ENABLE_NETWORKING" @@ -2975,7 +3011,7 @@ "target": "SparkForwardMinorPluginFixture", "kind": "shared_library", "file": "Tests/CMakeLists.txt", - "line": 969, + "line": 1011, "conditionFrames": [], "definitionScope": [], "origin": "wrapper-call", @@ -2985,7 +3021,7 @@ "target": "SparkFuzzAchievement", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3713, + "line": 3762, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3015,7 +3051,7 @@ "target": "SparkFuzzAssetCooker", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3725, + "line": 3774, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3025,7 +3061,7 @@ "target": "SparkFuzzAssetMigration", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3711, + "line": 3760, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3135,7 +3171,7 @@ "target": "SparkFuzzEditorLayout", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3661, + "line": 3710, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3155,7 +3191,7 @@ "target": "SparkFuzzEditorProjectFile", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3404, + "line": 3453, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3165,7 +3201,7 @@ "target": "SparkFuzzEditorRecovery", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3453, + "line": 3502, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3175,7 +3211,7 @@ "target": "SparkFuzzEditorSceneImport", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3515, + "line": 3564, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3185,7 +3221,7 @@ "target": "SparkFuzzEditorSceneJson", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3288, + "line": 3337, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3195,7 +3231,7 @@ "target": "SparkFuzzEditorSceneLoad", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3343, + "line": 3392, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3205,7 +3241,7 @@ "target": "SparkFuzzEditorThemeImport", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3566, + "line": 3615, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3215,7 +3251,7 @@ "target": "SparkFuzzEditorWindowLayout", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3613, + "line": 3662, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3225,7 +3261,7 @@ "target": "SparkFuzzEngineSettings", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 2914, + "line": 2963, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3235,7 +3271,7 @@ "target": "SparkFuzzEntityArchetype", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3021, + "line": 3070, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3245,7 +3281,7 @@ "target": "SparkFuzzEventResponse", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3715, + "line": 3764, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3335,7 +3371,7 @@ "target": "SparkFuzzLauncherModuleManifest", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3735, + "line": 3784, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3345,7 +3381,7 @@ "target": "SparkFuzzLauncherTemplate", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3730, + "line": 3779, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3401,6 +3437,16 @@ "origin": "declaration", "resolved": true }, + { + "target": "SparkFuzzMaterialEditorFiles", + "kind": "executable", + "file": "FuzzerTests/CMakeLists.txt", + "line": 2910, + "conditionFrames": [], + "definitionScope": [], + "origin": "declaration", + "resolved": true + }, { "target": "SparkFuzzMaterialLoader", "kind": "executable", @@ -3435,7 +3481,7 @@ "target": "SparkFuzzModuleSidecar", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3069, + "line": 3118, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3495,7 +3541,7 @@ "target": "SparkFuzzPluginMetadata", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3120, + "line": 3169, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3525,7 +3571,7 @@ "target": "SparkFuzzReflectionBinary", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3174, + "line": 3223, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3555,7 +3601,7 @@ "target": "SparkFuzzReplayCrashManifest", "kind": "executable", "file": "FuzzerTests/Replay/CMakeLists.txt", - "line": 54, + "line": 67, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3571,14 +3617,24 @@ "origin": "declaration", "resolved": true }, + { + "target": "SparkFuzzReplayMaterialEditorFiles", + "kind": "executable", + "file": "FuzzerTests/Replay/CMakeLists.txt", + "line": 50, + "conditionFrames": [], + "definitionScope": [], + "origin": "declaration", + "resolved": true + }, { "target": "SparkFuzzReplayNeuralWeights", "kind": "executable", "file": "FuzzerTests/Replay/CMakeLists.txt", - "line": 70, + "line": 83, "conditionFrames": [ { - "id": "FuzzerTests/Replay/CMakeLists.txt:69", + "id": "FuzzerTests/Replay/CMakeLists.txt:82", "branch": 0, "branches": [ "NOT WIN32" @@ -3603,10 +3659,10 @@ "target": "SparkFuzzReplayTextureStex", "kind": "executable", "file": "FuzzerTests/Replay/CMakeLists.txt", - "line": 72, + "line": 85, "conditionFrames": [ { - "id": "FuzzerTests/Replay/CMakeLists.txt:69", + "id": "FuzzerTests/Replay/CMakeLists.txt:82", "branch": 0, "branches": [ "NOT WIN32" @@ -3621,7 +3677,7 @@ "target": "SparkFuzzRuntimePrefab", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3709, + "line": 3758, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3681,7 +3737,7 @@ "target": "SparkFuzzShaderDiskCache", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3223, + "line": 3272, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3771,7 +3827,7 @@ "target": "SparkFuzzUILayout", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 3719, + "line": 3768, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3781,7 +3837,7 @@ "target": "SparkFuzzVirtualFileSystem", "kind": "executable", "file": "FuzzerTests/CMakeLists.txt", - "line": 2968, + "line": 3017, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -3951,10 +4007,10 @@ "target": "SparkGatewayTopologyProbe", "kind": "executable", "file": "Tests/CMakeLists.txt", - "line": 837, + "line": 879, "conditionFrames": [ { - "id": "Tests/CMakeLists.txt:836", + "id": "Tests/CMakeLists.txt:878", "branch": 0, "branches": [ "TARGET SparkGatewayCore" @@ -4082,7 +4138,7 @@ "target": "SparkLegacyModuleFixture", "kind": "shared_library", "file": "Tests/CMakeLists.txt", - "line": 857, + "line": 899, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -4092,10 +4148,10 @@ "target": "SparkMMOSessionGatePeer", "kind": "executable", "file": "Tests/CMakeLists.txt", - "line": 1471, + "line": 1527, "conditionFrames": [ { - "id": "Tests/CMakeLists.txt:1464", + "id": "Tests/CMakeLists.txt:1520", "branch": 0, "branches": [ "ENABLE_NETWORKING" @@ -4110,7 +4166,7 @@ "target": "SparkMismatchedModuleFixture", "kind": "shared_library", "file": "Tests/CMakeLists.txt", - "line": 848, + "line": 890, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -4120,7 +4176,7 @@ "target": "SparkModuleSiblingDependency", "kind": "shared_library", "file": "Tests/CMakeLists.txt", - "line": 859, + "line": 901, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -4150,10 +4206,10 @@ "target": "SparkNetworkingDisabledCompileContract", "kind": "executable", "file": "Tests/CMakeLists.txt", - "line": 828, + "line": 870, "conditionFrames": [ { - "id": "Tests/CMakeLists.txt:827", + "id": "Tests/CMakeLists.txt:869", "branch": 0, "branches": [ "NOT ENABLE_NETWORKING" @@ -4190,7 +4246,7 @@ "target": "SparkPreviousSdkModuleFixture", "kind": "shared_library", "file": "Tests/CMakeLists.txt", - "line": 851, + "line": 893, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -4200,7 +4256,7 @@ "target": "SparkRegistryLifecycleModuleFixture", "kind": "shared_library", "file": "Tests/CMakeLists.txt", - "line": 855, + "line": 897, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -4210,7 +4266,7 @@ "target": "SparkRollbackRefusingPluginFixture", "kind": "shared_library", "file": "Tests/CMakeLists.txt", - "line": 974, + "line": 1016, "conditionFrames": [], "definitionScope": [], "origin": "wrapper-call", @@ -4270,7 +4326,7 @@ "target": "SparkSiblingDependentModuleFixture", "kind": "shared_library", "file": "Tests/CMakeLists.txt", - "line": 861, + "line": 903, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -4320,7 +4376,7 @@ "target": "SparkValidPluginFixture", "kind": "shared_library", "file": "Tests/CMakeLists.txt", - "line": 964, + "line": 1006, "conditionFrames": [], "definitionScope": [], "origin": "wrapper-call", @@ -4330,7 +4386,7 @@ "target": "SparkWeaponEnumCompatibility", "kind": "object_library", "file": "Tests/CMakeLists.txt", - "line": 804, + "line": 808, "conditionFrames": [], "definitionScope": [], "origin": "declaration", @@ -5298,7 +5354,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 853, + "line": 895, "kind": "shared_library", "origin": "declaration", "definitionScope": [], @@ -5372,7 +5428,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 2258, + "line": 2318, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -5480,7 +5536,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 5732, + "line": 5811, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -5534,7 +5590,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 815, + "line": 819, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -5650,6 +5706,42 @@ } ] }, + { + "target": "SparkFPSCameraReloadRuntime", + "kind": "utility", + "buildable": true, + "origins": [ + "declaration" + ], + "declarations": [ + { + "file": "Tests/CMakeLists.txt", + "line": 847, + "kind": "utility", + "origin": "declaration", + "definitionScope": [], + "resolved": true + } + ] + }, + { + "target": "SparkFPSCameraReloadTests", + "kind": "executable", + "buildable": true, + "origins": [ + "declaration" + ], + "declarations": [ + { + "file": "Tests/CMakeLists.txt", + "line": 831, + "kind": "executable", + "origin": "declaration", + "definitionScope": [], + "resolved": true + } + ] + }, { "target": "SparkFPSLANLoopbackPeer", "kind": "executable", @@ -5660,7 +5752,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 1502, + "line": 1558, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -5678,7 +5770,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 969, + "line": 1011, "kind": "shared_library", "origin": "wrapper-call", "definitionScope": [], @@ -5696,7 +5788,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3713, + "line": 3762, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -5750,7 +5842,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3725, + "line": 3774, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -5768,7 +5860,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3711, + "line": 3760, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -5966,7 +6058,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3661, + "line": 3710, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6002,7 +6094,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3404, + "line": 3453, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6020,7 +6112,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3453, + "line": 3502, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6038,7 +6130,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3515, + "line": 3564, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6056,7 +6148,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3288, + "line": 3337, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6074,7 +6166,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3343, + "line": 3392, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6092,7 +6184,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3566, + "line": 3615, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6110,7 +6202,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3613, + "line": 3662, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6128,7 +6220,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 2914, + "line": 2963, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6146,7 +6238,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3021, + "line": 3070, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6164,7 +6256,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3715, + "line": 3764, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6326,7 +6418,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3735, + "line": 3784, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6344,7 +6436,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3730, + "line": 3779, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6442,6 +6534,24 @@ } ] }, + { + "target": "SparkFuzzMaterialEditorFiles", + "kind": "executable", + "buildable": true, + "origins": [ + "declaration" + ], + "declarations": [ + { + "file": "FuzzerTests/CMakeLists.txt", + "line": 2910, + "kind": "executable", + "origin": "declaration", + "definitionScope": [], + "resolved": true + } + ] + }, { "target": "SparkFuzzMaterialLoader", "kind": "executable", @@ -6506,7 +6616,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3069, + "line": 3118, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6614,7 +6724,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3120, + "line": 3169, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6668,7 +6778,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3174, + "line": 3223, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6722,7 +6832,7 @@ "declarations": [ { "file": "FuzzerTests/Replay/CMakeLists.txt", - "line": 54, + "line": 67, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6748,6 +6858,24 @@ } ] }, + { + "target": "SparkFuzzReplayMaterialEditorFiles", + "kind": "executable", + "buildable": true, + "origins": [ + "declaration" + ], + "declarations": [ + { + "file": "FuzzerTests/Replay/CMakeLists.txt", + "line": 50, + "kind": "executable", + "origin": "declaration", + "definitionScope": [], + "resolved": true + } + ] + }, { "target": "SparkFuzzReplayNeuralWeights", "kind": "executable", @@ -6758,7 +6886,7 @@ "declarations": [ { "file": "FuzzerTests/Replay/CMakeLists.txt", - "line": 70, + "line": 83, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6794,7 +6922,7 @@ "declarations": [ { "file": "FuzzerTests/Replay/CMakeLists.txt", - "line": 72, + "line": 85, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6812,7 +6940,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3709, + "line": 3758, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -6920,7 +7048,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3223, + "line": 3272, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -7082,7 +7210,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 3719, + "line": 3768, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -7100,7 +7228,7 @@ "declarations": [ { "file": "FuzzerTests/CMakeLists.txt", - "line": 2968, + "line": 3017, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -7406,7 +7534,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 837, + "line": 879, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -7542,7 +7670,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 857, + "line": 899, "kind": "shared_library", "origin": "declaration", "definitionScope": [], @@ -7560,7 +7688,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 1471, + "line": 1527, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -7578,7 +7706,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 848, + "line": 890, "kind": "shared_library", "origin": "declaration", "definitionScope": [], @@ -7596,7 +7724,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 859, + "line": 901, "kind": "shared_library", "origin": "declaration", "definitionScope": [], @@ -7634,7 +7762,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 828, + "line": 870, "kind": "executable", "origin": "declaration", "definitionScope": [], @@ -7690,7 +7818,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 851, + "line": 893, "kind": "shared_library", "origin": "declaration", "definitionScope": [], @@ -7708,7 +7836,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 855, + "line": 897, "kind": "shared_library", "origin": "declaration", "definitionScope": [], @@ -7726,7 +7854,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 974, + "line": 1016, "kind": "shared_library", "origin": "wrapper-call", "definitionScope": [], @@ -7834,7 +7962,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 861, + "line": 903, "kind": "shared_library", "origin": "declaration", "definitionScope": [], @@ -7908,7 +8036,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 964, + "line": 1006, "kind": "shared_library", "origin": "wrapper-call", "definitionScope": [], @@ -7926,7 +8054,7 @@ "declarations": [ { "file": "Tests/CMakeLists.txt", - "line": 804, + "line": 808, "kind": "object_library", "origin": "declaration", "definitionScope": [], @@ -8988,7 +9116,7 @@ "continueOnError": "absent", "hasRun": true, "env": [], - "runDigest": "20f965da492c2364" + "runDigest": "7d25a12d2aa62ec9" }, { "index": 6, @@ -9740,7 +9868,7 @@ "continueOnError": "absent", "hasRun": true, "env": [], - "runDigest": "b744945108bec918" + "runDigest": "92640a898da166e7" }, { "index": 58, @@ -10022,7 +10150,7 @@ "env": [ "PYTHONDONTWRITEBYTECODE" ], - "runDigest": "ad53f5196b1ed61e" + "runDigest": "9591bb3af678e3a6" }, { "index": 2, @@ -10484,7 +10612,7 @@ "continueOnError": "absent", "hasRun": true, "env": [], - "runDigest": "e7c18f841a5908dc" + "runDigest": "43c5269e530b006e" }, { "index": 3, @@ -10520,7 +10648,7 @@ "continueOnError": "absent", "hasRun": true, "env": [], - "runDigest": "d59b40acd7d50e4e" + "runDigest": "1890bf10fe1ebdb6" }, { "index": 6, @@ -10695,7 +10823,7 @@ "continueOnError": "absent", "hasRun": true, "env": [], - "runDigest": "e7c18f841a5908dc" + "runDigest": "43c5269e530b006e" }, { "index": 3, @@ -11833,7 +11961,7 @@ "continueOnError": "absent", "hasRun": true, "env": [], - "runDigest": "aa854d3d7363656e" + "runDigest": "3e408f8b06dc265e" }, { "index": 5, @@ -11869,7 +11997,7 @@ "continueOnError": "absent", "hasRun": true, "env": [], - "runDigest": "9913a9200b579ce7" + "runDigest": "cfd446a36d42390c" }, { "index": 8, @@ -12039,7 +12167,7 @@ "continueOnError": "absent", "hasRun": true, "env": [], - "runDigest": "04d1482b4a194b41" + "runDigest": "dbb9ecbe0a6517f6" }, { "index": 22, @@ -12167,7 +12295,7 @@ "permissions": { "contents": "read" }, - "stepCount": 27, + "stepCount": 28, "steps": [ { "index": 0, @@ -12183,6 +12311,18 @@ }, { "index": 1, + "name": "Pin CMake and CPack for per-user Shipping MSI", + "id": "", + "uses": "", + "shell": "pwsh", + "if": "absent", + "continueOnError": "absent", + "hasRun": true, + "env": [], + "runDigest": "537cbd62c5c47296" + }, + { + "index": 2, "name": "Setup MSVC", "id": "", "uses": "microsoft/setup-msbuild@30375c66a4eea26614e0d39710365f22f8b0af57", @@ -12194,7 +12334,7 @@ "runDigest": "" }, { - "index": 2, + "index": 3, "name": "Configure and build the Windows Shipping lane", "id": "", "uses": "", @@ -12206,7 +12346,7 @@ "runDigest": "ea9a46d2c01da324" }, { - "index": 3, + "index": 4, "name": "Check Windows Shipping PE ISA floor (BLD-100)", "id": "", "uses": "", @@ -12218,7 +12358,7 @@ "runDigest": "073e3fb984aa18fe" }, { - "index": 4, + "index": 5, "name": "Verify stable Shipping product versions", "id": "", "uses": "", @@ -12230,7 +12370,7 @@ "runDigest": "1b4a50ff47db6a1d" }, { - "index": 5, + "index": 6, "name": "Stage and map Shipping private symbols", "id": "", "uses": "", @@ -12242,7 +12382,7 @@ "runDigest": "f65bb54896bb762c" }, { - "index": 6, + "index": 7, "name": "Verify Shipping runtime dependency closure (PLT-200)", "id": "", "uses": "", @@ -12254,7 +12394,7 @@ "runDigest": "b9e48a9367a24c28" }, { - "index": 7, + "index": 8, "name": "Upload Windows Shipping dependency closure", "id": "", "uses": "actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a", @@ -12266,7 +12406,7 @@ "runDigest": "" }, { - "index": 8, + "index": 9, "name": "Upload Windows Shipping private symbols", "id": "", "uses": "actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a", @@ -12278,7 +12418,7 @@ "runDigest": "" }, { - "index": 9, + "index": 10, "name": "Capture Windows Shipping provenance", "id": "", "uses": "", @@ -12290,7 +12430,7 @@ "runDigest": "eaaff83d3b3b01dd" }, { - "index": 10, + "index": 11, "name": "Verify Shipping is a distinct configuration (BLD-100)", "id": "", "uses": "", @@ -12302,7 +12442,7 @@ "runDigest": "8963db5f9c2a7690" }, { - "index": 11, + "index": 12, "name": "Install the Windows Shipping SDK for the consumer profile", "id": "", "uses": "", @@ -12314,7 +12454,7 @@ "runDigest": "36f226b69437d456" }, { - "index": 12, + "index": 13, "name": "Configure and build the Windows validation lane", "id": "", "uses": "", @@ -12326,7 +12466,7 @@ "runDigest": "5605dbef17f25623" }, { - "index": 13, + "index": 14, "name": "Capture Windows validation provenance", "id": "", "uses": "", @@ -12338,7 +12478,7 @@ "runDigest": "3460874c75995c44" }, { - "index": 14, + "index": 15, "name": "Configure and build the installed SDK consumer lane", "id": "", "uses": "", @@ -12350,7 +12490,7 @@ "runDigest": "9cd61c1b24e1a4ef" }, { - "index": 15, + "index": 16, "name": "Capture installed SDK consumer provenance", "id": "", "uses": "", @@ -12362,7 +12502,7 @@ "runDigest": "22ba85fa35d4e34d" }, { - "index": 16, + "index": 17, "name": "Generate the configured build-matrix inventory", "id": "", "uses": "", @@ -12374,7 +12514,7 @@ "runDigest": "e3982ce2ce04dc8f" }, { - "index": 17, + "index": 18, "name": "Check the configured build matrix", "id": "build-matrix-parity", "uses": "", @@ -12386,7 +12526,7 @@ "runDigest": "847469c7e07435aa" }, { - "index": 18, + "index": 19, "name": "Package Windows Shipping MSI for package-smoke consumer", "id": "", "uses": "", @@ -12398,7 +12538,7 @@ "runDigest": "9d7b1cdb557b7c1f" }, { - "index": 19, + "index": 20, "name": "Package and verify Windows Shipping ZIP and NSIS artifacts", "id": "", "uses": "", @@ -12410,7 +12550,7 @@ "runDigest": "740efca49939e821" }, { - "index": 20, + "index": 21, "name": "Upload Windows Shipping package reconciliation and provenance", "id": "", "uses": "actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a", @@ -12422,7 +12562,7 @@ "runDigest": "" }, { - "index": 21, + "index": 22, "name": "Upload exact Windows Shipping MSI for package smoke", "id": "", "uses": "actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a", @@ -12434,7 +12574,7 @@ "runDigest": "" }, { - "index": 22, + "index": 23, "name": "Upload Windows Shipping MSI packaging diagnostics", "id": "", "uses": "actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a", @@ -12446,7 +12586,7 @@ "runDigest": "" }, { - "index": 23, + "index": 24, "name": "Bundle bounded build-matrix diagnostics", "id": "", "uses": "", @@ -12458,7 +12598,7 @@ "runDigest": "2c87576df40aa153" }, { - "index": 24, + "index": 25, "name": "Upload build-matrix report diagnostics", "id": "", "uses": "actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a", @@ -12470,7 +12610,7 @@ "runDigest": "" }, { - "index": 25, + "index": 26, "name": "Upload build-matrix evidence", "id": "", "uses": "actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a", @@ -12482,7 +12622,7 @@ "runDigest": "" }, { - "index": 26, + "index": 27, "name": "Record build-matrix evidence", "id": "", "uses": "", @@ -12568,7 +12708,7 @@ "continueOnError": "absent", "hasRun": true, "env": [], - "runDigest": "97d1eea19530a6b3" + "runDigest": "b38e4495e94f9241" }, { "index": 4, @@ -12580,7 +12720,7 @@ "continueOnError": "absent", "hasRun": true, "env": [], - "runDigest": "c02983c50229d1a6" + "runDigest": "44c47d5667d5f433" }, { "index": 5, @@ -12592,7 +12732,7 @@ "continueOnError": "absent", "hasRun": true, "env": [], - "runDigest": "8134113ebecd66de" + "runDigest": "23a0655ae1cbf746" }, { "index": 6, @@ -12640,7 +12780,7 @@ "matrixResolved": true, "defaultShell": "", "permissions": {}, - "stepCount": 19, + "stepCount": 20, "steps": [ { "index": 0, @@ -12703,7 +12843,7 @@ "continueOnError": "absent", "hasRun": true, "env": [], - "runDigest": "aa854d3d7363656e" + "runDigest": "3e408f8b06dc265e" }, { "index": 5, @@ -12818,7 +12958,7 @@ { "index": 14, "name": "Run Tests", - "id": "", + "id": "vs2026-release-tests", "uses": "", "shell": "", "if": "matrix.config == 'Release'", @@ -12837,7 +12977,7 @@ "continueOnError": "absent", "hasRun": true, "env": [], - "runDigest": "ccfea9cd882fe6e7" + "runDigest": "26b4929ab923832e" }, { "index": 16, @@ -12853,6 +12993,18 @@ }, { "index": 17, + "name": "Upload bounded VS2026 CPU-floor review inputs", + "id": "", + "uses": "actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a", + "shell": "", + "if": "always() && matrix.config == 'Release' && steps.vs2026-release-tests.outcome == 'failure'", + "continueOnError": "absent", + "hasRun": false, + "env": [], + "runDigest": "" + }, + { + "index": 18, "name": "Upload Build Artifacts", "id": "", "uses": "actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a", @@ -12864,7 +13016,7 @@ "runDigest": "" }, { - "index": 18, + "index": 19, "name": "Upload sccache server log", "id": "", "uses": "actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a", @@ -16088,7 +16240,7 @@ "gating": "blocking", "tool": "cmake", "kind": "build", - "command": "cmake --build build/fuzz-policy --target SparkFuzzJsonUtils SparkFuzzCrashManifest SparkFuzzNeuralWeights SparkFuzzTextureStex SparkFuzzSceneManifest SparkFuzzArchive SparkFuzzShaderBlob SparkFuzzShaderServiceProtocol SparkFuzzConfigParser SparkFuzzTelemetrySpool SparkFuzzSaveSystem SparkFuzzEditorPrefab SparkFuzzReflectedScene SparkFuzzSceneManagerText SparkFuzzFbx SparkFuzzGltf SparkFuzzSoundWav SparkFuzzExr SparkFuzzTextureLinux SparkFuzzObjStatic SparkFuzzTFLanBeacon SparkFuzzMMOChatWire SparkFuzzMMOClientState SparkFuzzMMOEntityEvents SparkFuzzZipListing SparkFuzzExecScript SparkFuzzSparkBuildConfig SparkFuzzVisualScriptGraph SparkFuzzNavMesh SparkFuzzSparkTerrain SparkFuzzAssetServiceProtocol SparkFuzzDaemonFrame SparkFuzzDaemonWire SparkFuzzBinaryReader SparkFuzzEditorCollaboration SparkFuzzDataTable SparkFuzzDialogue SparkFuzzLocalization SparkFuzzFpsSnapshot SparkFuzzSessionGateProtocol SparkFuzzInstallState SparkFuzzModManifest SparkFuzzReplay SparkFuzzAnimationBinary SparkFuzzOrchestrationJournal SparkFuzzAsyncDatabase SparkFuzzMMOCharacterRecord SparkFuzzGatewayAreaControlState SparkFuzzRTSPersistence SparkFuzzOrchestratorIdentity SparkFuzzMaterialLoader SparkFuzzEngineSettings SparkFuzzVirtualFileSystem SparkFuzzEntityArchetype SparkFuzzModuleSidecar SparkFuzzPluginMetadata SparkFuzzReflectionBinary SparkFuzzShaderDiskCache SparkFuzzEditorSceneJson SparkFuzzEditorSceneLoad SparkFuzzEditorProjectFile SparkFuzzEditorRecovery SparkFuzzEditorSceneImport SparkFuzzEditorThemeImport SparkFuzzEditorWindowLayout SparkFuzzEditorLayout SparkFuzzRuntimePrefab SparkFuzzAssetMigration SparkFuzzAchievement SparkFuzzEventResponse SparkFuzzUILayout SparkFuzzAssetCooker SparkFuzzLauncherTemplate SparkFuzzLauncherModuleManifest", + "command": "cmake --build build/fuzz-policy --target SparkFuzzJsonUtils SparkFuzzCrashManifest SparkFuzzNeuralWeights SparkFuzzTextureStex SparkFuzzSceneManifest SparkFuzzArchive SparkFuzzShaderBlob SparkFuzzShaderServiceProtocol SparkFuzzConfigParser SparkFuzzTelemetrySpool SparkFuzzSaveSystem SparkFuzzEditorPrefab SparkFuzzReflectedScene SparkFuzzSceneManagerText SparkFuzzFbx SparkFuzzGltf SparkFuzzSoundWav SparkFuzzExr SparkFuzzTextureLinux SparkFuzzObjStatic SparkFuzzTFLanBeacon SparkFuzzMMOChatWire SparkFuzzMMOClientState SparkFuzzMMOEntityEvents SparkFuzzZipListing SparkFuzzExecScript SparkFuzzSparkBuildConfig SparkFuzzVisualScriptGraph SparkFuzzNavMesh SparkFuzzSparkTerrain SparkFuzzAssetServiceProtocol SparkFuzzDaemonFrame SparkFuzzDaemonWire SparkFuzzBinaryReader SparkFuzzEditorCollaboration SparkFuzzDataTable SparkFuzzDialogue SparkFuzzLocalization SparkFuzzFpsSnapshot SparkFuzzSessionGateProtocol SparkFuzzInstallState SparkFuzzModManifest SparkFuzzReplay SparkFuzzAnimationBinary SparkFuzzOrchestrationJournal SparkFuzzAsyncDatabase SparkFuzzMMOCharacterRecord SparkFuzzGatewayAreaControlState SparkFuzzRTSPersistence SparkFuzzOrchestratorIdentity SparkFuzzMaterialLoader SparkFuzzMaterialEditorFiles SparkFuzzEngineSettings SparkFuzzVirtualFileSystem SparkFuzzEntityArchetype SparkFuzzModuleSidecar SparkFuzzPluginMetadata SparkFuzzReflectionBinary SparkFuzzShaderDiskCache SparkFuzzEditorSceneJson SparkFuzzEditorSceneLoad SparkFuzzEditorProjectFile SparkFuzzEditorRecovery SparkFuzzEditorSceneImport SparkFuzzEditorThemeImport SparkFuzzEditorWindowLayout SparkFuzzEditorLayout SparkFuzzRuntimePrefab SparkFuzzAssetMigration SparkFuzzAchievement SparkFuzzEventResponse SparkFuzzUILayout SparkFuzzAssetCooker SparkFuzzLauncherTemplate SparkFuzzLauncherModuleManifest", "commandProvenance": "literal", "targets": [ "SparkFuzzAchievement", @@ -16133,6 +16285,7 @@ "SparkFuzzMMOChatWire", "SparkFuzzMMOClientState", "SparkFuzzMMOEntityEvents", + "SparkFuzzMaterialEditorFiles", "SparkFuzzMaterialLoader", "SparkFuzzModManifest", "SparkFuzzModuleSidecar", @@ -16272,7 +16425,7 @@ "gating": "blocking", "tool": "cmake", "kind": "configure", - "command": "cmake -B build -DSPARK_ENGINE_VERSION=\"$spark_engine_version\" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON -DSPARK_LIFECYCLE_TEST_HOOKS=ON -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_FLAGS=\"-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer\" -DCMAKE_C_FLAGS=\"-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer\" -DCMAKE_EXE_LINKER_FLAGS=\"-fsanitize=address,undefined -no-pie\" -DCMAKE_SHARED_LINKER_FLAGS=\"-fsanitize=address,undefined\"", + "command": "cmake -B build -DSPARK_ENGINE_VERSION=\"$spark_engine_version\" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON -DSPARK_LIFECYCLE_TEST_HOOKS=ON -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_FLAGS_DEBUG=\"-g -Og\" -DCMAKE_C_FLAGS_DEBUG=\"-g -Og\" -DCMAKE_CXX_FLAGS=\"-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer\" -DCMAKE_C_FLAGS=\"-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer\" -DCMAKE_EXE_LINKER_FLAGS=\"-fsanitize=address,undefined -no-pie\" -DCMAKE_SHARED_LINKER_FLAGS=\"-fsanitize=address,undefined\"", "commandProvenance": "literal", "options": { "SPARK_ENGINE_VERSION": "$spark_engine_version", @@ -16283,6 +16436,8 @@ "CMAKE_CXX_COMPILER": "g++-14", "CMAKE_C_COMPILER_LAUNCHER": "ccache", "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", + "CMAKE_CXX_FLAGS_DEBUG": "-g -Og", + "CMAKE_C_FLAGS_DEBUG": "-g -Og", "CMAKE_CXX_FLAGS": "-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer", "CMAKE_C_FLAGS": "-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer", "CMAKE_EXE_LINKER_FLAGS": "-fsanitize=address,undefined -no-pie", @@ -17445,7 +17600,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the Windows Shipping lane", - "stepIndex": 2, + "stepIndex": 3, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17466,7 +17621,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the Windows Shipping lane", - "stepIndex": 2, + "stepIndex": 3, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17493,7 +17648,7 @@ { "job": "build-windows-shipping", "step": "Check Windows Shipping PE ISA floor (BLD-100)", - "stepIndex": 3, + "stepIndex": 4, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17520,7 +17675,7 @@ { "job": "build-windows-shipping", "step": "Stage and map Shipping private symbols", - "stepIndex": 5, + "stepIndex": 6, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17542,7 +17697,7 @@ { "job": "build-windows-shipping", "step": "Stage and map Shipping private symbols", - "stepIndex": 5, + "stepIndex": 6, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17564,7 +17719,7 @@ { "job": "build-windows-shipping", "step": "Verify Shipping runtime dependency closure (PLT-200)", - "stepIndex": 6, + "stepIndex": 7, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17583,7 +17738,7 @@ { "job": "build-windows-shipping", "step": "Install the Windows Shipping SDK for the consumer profile", - "stepIndex": 11, + "stepIndex": 12, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17605,7 +17760,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the Windows validation lane", - "stepIndex": 12, + "stepIndex": 13, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17626,7 +17781,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the Windows validation lane", - "stepIndex": 12, + "stepIndex": 13, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17653,7 +17808,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the installed SDK consumer lane", - "stepIndex": 14, + "stepIndex": 15, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17681,7 +17836,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the installed SDK consumer lane", - "stepIndex": 14, + "stepIndex": 15, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17708,7 +17863,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the installed SDK consumer lane", - "stepIndex": 14, + "stepIndex": 15, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17731,7 +17886,7 @@ { "job": "build-windows-shipping", "step": "Package Windows Shipping MSI for package-smoke consumer", - "stepIndex": 18, + "stepIndex": 19, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17750,7 +17905,7 @@ { "job": "build-windows-shipping", "step": "Package and verify Windows Shipping ZIP and NSIS artifacts", - "stepIndex": 19, + "stepIndex": 20, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17769,7 +17924,7 @@ { "job": "build-windows-shipping", "step": "Package and verify Windows Shipping ZIP and NSIS artifacts", - "stepIndex": 19, + "stepIndex": 20, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -17800,7 +17955,7 @@ "gating": "advisory", "tool": "cmake", "kind": "configure", - "command": "cmake --preset windows-shipping 2>&1 | tee ../reproducibility-a-configure.log", + "command": "cmake --preset windows-shipping 2>&1 | tee \"$physical_parent/reproducibility-a-configure.log\"", "commandProvenance": "literal", "options": {}, "preset": "windows-shipping", @@ -17821,7 +17976,7 @@ "gating": "advisory", "tool": "cmake", "kind": "build", - "command": "cmake --build --preset windows-shipping --config MinSizeRel --parallel 1 2>&1 | tee ../reproducibility-a-build.log", + "command": "cmake --build --preset windows-shipping --config MinSizeRel --parallel 1 2>&1 | tee \"$physical_parent/reproducibility-a-build.log\"", "commandProvenance": "literal", "targets": [ "all" @@ -17848,10 +18003,10 @@ "gating": "advisory", "tool": "cmake", "kind": "install", - "command": "cmake --install build/windows-shipping --config MinSizeRel --prefix ../reproducibility-stage-a", + "command": "cmake --install build/windows-shipping --config MinSizeRel --prefix \"$physical_parent/reproducibility-stage-a\"", "commandProvenance": "literal", "configuration": "MinSizeRel", - "prefix": "../reproducibility-stage-a", + "prefix": "$physical_parent/reproducibility-stage-a", "component": "", "commandIndex": 2 }, @@ -17870,7 +18025,7 @@ "gating": "advisory", "tool": "cmake", "kind": "configure", - "command": "cmake --preset windows-shipping 2>&1 | tee ../reproducibility-b-configure.log", + "command": "cmake --preset windows-shipping 2>&1 | tee \"$physical_parent/reproducibility-b-configure.log\"", "commandProvenance": "literal", "options": {}, "preset": "windows-shipping", @@ -17891,7 +18046,7 @@ "gating": "advisory", "tool": "cmake", "kind": "build", - "command": "cmake --build --preset windows-shipping --config MinSizeRel --parallel 1 2>&1 | tee ../reproducibility-b-build.log", + "command": "cmake --build --preset windows-shipping --config MinSizeRel --parallel 1 2>&1 | tee \"$physical_parent/reproducibility-b-build.log\"", "commandProvenance": "literal", "targets": [ "all" @@ -17918,10 +18073,10 @@ "gating": "advisory", "tool": "cmake", "kind": "install", - "command": "cmake --install build/windows-shipping --config MinSizeRel --prefix ../reproducibility-stage-b", + "command": "cmake --install build/windows-shipping --config MinSizeRel --prefix \"$physical_parent/reproducibility-stage-b\"", "commandProvenance": "literal", "configuration": "MinSizeRel", - "prefix": "../reproducibility-stage-b", + "prefix": "$physical_parent/reproducibility-stage-b", "component": "", "commandIndex": 2 }, @@ -19795,7 +19950,7 @@ "gating": "blocking", "tool": "cmake", "kind": "configure", - "command": "cmake -B build -DSPARK_ENGINE_VERSION=\"$spark_engine_version\" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON -DSPARK_LIFECYCLE_TEST_HOOKS=ON -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_FLAGS=\"-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer\" -DCMAKE_C_FLAGS=\"-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer\" -DCMAKE_EXE_LINKER_FLAGS=\"-fsanitize=address,undefined -no-pie\" -DCMAKE_SHARED_LINKER_FLAGS=\"-fsanitize=address,undefined\"", + "command": "cmake -B build -DSPARK_ENGINE_VERSION=\"$spark_engine_version\" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON -DSPARK_LIFECYCLE_TEST_HOOKS=ON -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_FLAGS_DEBUG=\"-g -Og\" -DCMAKE_C_FLAGS_DEBUG=\"-g -Og\" -DCMAKE_CXX_FLAGS=\"-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer\" -DCMAKE_C_FLAGS=\"-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer\" -DCMAKE_EXE_LINKER_FLAGS=\"-fsanitize=address,undefined -no-pie\" -DCMAKE_SHARED_LINKER_FLAGS=\"-fsanitize=address,undefined\"", "commandProvenance": "literal", "options": { "SPARK_ENGINE_VERSION": "$spark_engine_version", @@ -19806,6 +19961,8 @@ "CMAKE_CXX_COMPILER": "g++-14", "CMAKE_C_COMPILER_LAUNCHER": "ccache", "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", + "CMAKE_CXX_FLAGS_DEBUG": "-g -Og", + "CMAKE_C_FLAGS_DEBUG": "-g -Og", "CMAKE_CXX_FLAGS": "-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer", "CMAKE_C_FLAGS": "-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer", "CMAKE_EXE_LINKER_FLAGS": "-fsanitize=address,undefined -no-pie", @@ -20105,7 +20262,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the Windows Shipping lane", - "stepIndex": 2, + "stepIndex": 3, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -20126,7 +20283,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the Windows validation lane", - "stepIndex": 12, + "stepIndex": 13, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -20147,7 +20304,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the installed SDK consumer lane", - "stepIndex": 14, + "stepIndex": 15, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -20187,7 +20344,7 @@ "gating": "advisory", "tool": "cmake", "kind": "configure", - "command": "cmake --preset windows-shipping 2>&1 | tee ../reproducibility-a-configure.log", + "command": "cmake --preset windows-shipping 2>&1 | tee \"$physical_parent/reproducibility-a-configure.log\"", "commandProvenance": "literal", "options": {}, "preset": "windows-shipping", @@ -20208,7 +20365,7 @@ "gating": "advisory", "tool": "cmake", "kind": "configure", - "command": "cmake --preset windows-shipping 2>&1 | tee ../reproducibility-b-configure.log", + "command": "cmake --preset windows-shipping 2>&1 | tee \"$physical_parent/reproducibility-b-configure.log\"", "commandProvenance": "literal", "options": {}, "preset": "windows-shipping", @@ -20896,7 +21053,7 @@ "gating": "blocking", "tool": "cmake", "kind": "build", - "command": "cmake --build build/fuzz-policy --target SparkFuzzJsonUtils SparkFuzzCrashManifest SparkFuzzNeuralWeights SparkFuzzTextureStex SparkFuzzSceneManifest SparkFuzzArchive SparkFuzzShaderBlob SparkFuzzShaderServiceProtocol SparkFuzzConfigParser SparkFuzzTelemetrySpool SparkFuzzSaveSystem SparkFuzzEditorPrefab SparkFuzzReflectedScene SparkFuzzSceneManagerText SparkFuzzFbx SparkFuzzGltf SparkFuzzSoundWav SparkFuzzExr SparkFuzzTextureLinux SparkFuzzObjStatic SparkFuzzTFLanBeacon SparkFuzzMMOChatWire SparkFuzzMMOClientState SparkFuzzMMOEntityEvents SparkFuzzZipListing SparkFuzzExecScript SparkFuzzSparkBuildConfig SparkFuzzVisualScriptGraph SparkFuzzNavMesh SparkFuzzSparkTerrain SparkFuzzAssetServiceProtocol SparkFuzzDaemonFrame SparkFuzzDaemonWire SparkFuzzBinaryReader SparkFuzzEditorCollaboration SparkFuzzDataTable SparkFuzzDialogue SparkFuzzLocalization SparkFuzzFpsSnapshot SparkFuzzSessionGateProtocol SparkFuzzInstallState SparkFuzzModManifest SparkFuzzReplay SparkFuzzAnimationBinary SparkFuzzOrchestrationJournal SparkFuzzAsyncDatabase SparkFuzzMMOCharacterRecord SparkFuzzGatewayAreaControlState SparkFuzzRTSPersistence SparkFuzzOrchestratorIdentity SparkFuzzMaterialLoader SparkFuzzEngineSettings SparkFuzzVirtualFileSystem SparkFuzzEntityArchetype SparkFuzzModuleSidecar SparkFuzzPluginMetadata SparkFuzzReflectionBinary SparkFuzzShaderDiskCache SparkFuzzEditorSceneJson SparkFuzzEditorSceneLoad SparkFuzzEditorProjectFile SparkFuzzEditorRecovery SparkFuzzEditorSceneImport SparkFuzzEditorThemeImport SparkFuzzEditorWindowLayout SparkFuzzEditorLayout SparkFuzzRuntimePrefab SparkFuzzAssetMigration SparkFuzzAchievement SparkFuzzEventResponse SparkFuzzUILayout SparkFuzzAssetCooker SparkFuzzLauncherTemplate SparkFuzzLauncherModuleManifest", + "command": "cmake --build build/fuzz-policy --target SparkFuzzJsonUtils SparkFuzzCrashManifest SparkFuzzNeuralWeights SparkFuzzTextureStex SparkFuzzSceneManifest SparkFuzzArchive SparkFuzzShaderBlob SparkFuzzShaderServiceProtocol SparkFuzzConfigParser SparkFuzzTelemetrySpool SparkFuzzSaveSystem SparkFuzzEditorPrefab SparkFuzzReflectedScene SparkFuzzSceneManagerText SparkFuzzFbx SparkFuzzGltf SparkFuzzSoundWav SparkFuzzExr SparkFuzzTextureLinux SparkFuzzObjStatic SparkFuzzTFLanBeacon SparkFuzzMMOChatWire SparkFuzzMMOClientState SparkFuzzMMOEntityEvents SparkFuzzZipListing SparkFuzzExecScript SparkFuzzSparkBuildConfig SparkFuzzVisualScriptGraph SparkFuzzNavMesh SparkFuzzSparkTerrain SparkFuzzAssetServiceProtocol SparkFuzzDaemonFrame SparkFuzzDaemonWire SparkFuzzBinaryReader SparkFuzzEditorCollaboration SparkFuzzDataTable SparkFuzzDialogue SparkFuzzLocalization SparkFuzzFpsSnapshot SparkFuzzSessionGateProtocol SparkFuzzInstallState SparkFuzzModManifest SparkFuzzReplay SparkFuzzAnimationBinary SparkFuzzOrchestrationJournal SparkFuzzAsyncDatabase SparkFuzzMMOCharacterRecord SparkFuzzGatewayAreaControlState SparkFuzzRTSPersistence SparkFuzzOrchestratorIdentity SparkFuzzMaterialLoader SparkFuzzMaterialEditorFiles SparkFuzzEngineSettings SparkFuzzVirtualFileSystem SparkFuzzEntityArchetype SparkFuzzModuleSidecar SparkFuzzPluginMetadata SparkFuzzReflectionBinary SparkFuzzShaderDiskCache SparkFuzzEditorSceneJson SparkFuzzEditorSceneLoad SparkFuzzEditorProjectFile SparkFuzzEditorRecovery SparkFuzzEditorSceneImport SparkFuzzEditorThemeImport SparkFuzzEditorWindowLayout SparkFuzzEditorLayout SparkFuzzRuntimePrefab SparkFuzzAssetMigration SparkFuzzAchievement SparkFuzzEventResponse SparkFuzzUILayout SparkFuzzAssetCooker SparkFuzzLauncherTemplate SparkFuzzLauncherModuleManifest", "commandProvenance": "literal", "targets": [ "SparkFuzzAchievement", @@ -20941,6 +21098,7 @@ "SparkFuzzMMOChatWire", "SparkFuzzMMOClientState", "SparkFuzzMMOEntityEvents", + "SparkFuzzMaterialEditorFiles", "SparkFuzzMaterialLoader", "SparkFuzzModManifest", "SparkFuzzModuleSidecar", @@ -21329,7 +21487,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the Windows Shipping lane", - "stepIndex": 2, + "stepIndex": 3, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -21356,7 +21514,7 @@ { "job": "build-windows-shipping", "step": "Check Windows Shipping PE ISA floor (BLD-100)", - "stepIndex": 3, + "stepIndex": 4, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -21383,7 +21541,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the Windows validation lane", - "stepIndex": 12, + "stepIndex": 13, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -21410,7 +21568,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the installed SDK consumer lane", - "stepIndex": 14, + "stepIndex": 15, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -21449,7 +21607,7 @@ "gating": "advisory", "tool": "cmake", "kind": "build", - "command": "cmake --build --preset windows-shipping --config MinSizeRel --parallel 1 2>&1 | tee ../reproducibility-a-build.log", + "command": "cmake --build --preset windows-shipping --config MinSizeRel --parallel 1 2>&1 | tee \"$physical_parent/reproducibility-a-build.log\"", "commandProvenance": "literal", "targets": [ "all" @@ -21476,7 +21634,7 @@ "gating": "advisory", "tool": "cmake", "kind": "build", - "command": "cmake --build --preset windows-shipping --config MinSizeRel --parallel 1 2>&1 | tee ../reproducibility-b-build.log", + "command": "cmake --build --preset windows-shipping --config MinSizeRel --parallel 1 2>&1 | tee \"$physical_parent/reproducibility-b-build.log\"", "commandProvenance": "literal", "targets": [ "all" @@ -22639,7 +22797,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the installed SDK consumer lane", - "stepIndex": 14, + "stepIndex": 15, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -23224,7 +23382,7 @@ { "job": "build-windows-shipping", "step": "Capture Windows Shipping provenance", - "stepIndex": 9, + "stepIndex": 10, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -23252,7 +23410,7 @@ { "job": "build-windows-shipping", "step": "Capture Windows validation provenance", - "stepIndex": 13, + "stepIndex": 14, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -23280,7 +23438,7 @@ { "job": "build-windows-shipping", "step": "Capture installed SDK consumer provenance", - "stepIndex": 15, + "stepIndex": 16, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -23308,7 +23466,7 @@ { "job": "build-windows-shipping", "step": "Generate the configured build-matrix inventory", - "stepIndex": 16, + "stepIndex": 17, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -23340,7 +23498,7 @@ { "job": "build-windows-shipping", "step": "Check the configured build matrix", - "stepIndex": 17, + "stepIndex": 18, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -23368,7 +23526,7 @@ { "job": "build-windows-shipping", "step": "Check the configured build matrix", - "stepIndex": 17, + "stepIndex": 18, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -23473,7 +23631,7 @@ "gating": "blocking", "tool": "cmake", "kind": "configure", - "command": "cmake -B build -DSPARK_ENGINE_VERSION=\"$spark_engine_version\" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON -DSPARK_LIFECYCLE_TEST_HOOKS=ON -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_FLAGS=\"-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer\" -DCMAKE_C_FLAGS=\"-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer\" -DCMAKE_EXE_LINKER_FLAGS=\"-fsanitize=address,undefined -no-pie\" -DCMAKE_SHARED_LINKER_FLAGS=\"-fsanitize=address,undefined\"", + "command": "cmake -B build -DSPARK_ENGINE_VERSION=\"$spark_engine_version\" -DCMAKE_BUILD_TYPE=Debug -DBUILD_TESTS=ON -DSPARK_LIFECYCLE_TEST_HOOKS=ON -DCMAKE_C_COMPILER=gcc-14 -DCMAKE_CXX_COMPILER=g++-14 -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_FLAGS_DEBUG=\"-g -Og\" -DCMAKE_C_FLAGS_DEBUG=\"-g -Og\" -DCMAKE_CXX_FLAGS=\"-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer\" -DCMAKE_C_FLAGS=\"-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer\" -DCMAKE_EXE_LINKER_FLAGS=\"-fsanitize=address,undefined -no-pie\" -DCMAKE_SHARED_LINKER_FLAGS=\"-fsanitize=address,undefined\"", "commandProvenance": "literal", "options": { "SPARK_ENGINE_VERSION": "$spark_engine_version", @@ -23484,6 +23642,8 @@ "CMAKE_CXX_COMPILER": "g++-14", "CMAKE_C_COMPILER_LAUNCHER": "ccache", "CMAKE_CXX_COMPILER_LAUNCHER": "ccache", + "CMAKE_CXX_FLAGS_DEBUG": "-g -Og", + "CMAKE_C_FLAGS_DEBUG": "-g -Og", "CMAKE_CXX_FLAGS": "-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer", "CMAKE_C_FLAGS": "-fsanitize=address,undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer", "CMAKE_EXE_LINKER_FLAGS": "-fsanitize=address,undefined -no-pie", @@ -23783,7 +23943,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the Windows Shipping lane", - "stepIndex": 2, + "stepIndex": 3, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -23804,7 +23964,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the Windows validation lane", - "stepIndex": 12, + "stepIndex": 13, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -23825,7 +23985,7 @@ { "job": "build-windows-shipping", "step": "Configure and build the installed SDK consumer lane", - "stepIndex": 14, + "stepIndex": 15, "matrix": {}, "matrixResolved": true, "runnerOs": "windows", @@ -23865,7 +24025,7 @@ "gating": "advisory", "tool": "cmake", "kind": "configure", - "command": "cmake --preset windows-shipping 2>&1 | tee ../reproducibility-a-configure.log", + "command": "cmake --preset windows-shipping 2>&1 | tee \"$physical_parent/reproducibility-a-configure.log\"", "commandProvenance": "literal", "options": {}, "preset": "windows-shipping", @@ -23886,7 +24046,7 @@ "gating": "advisory", "tool": "cmake", "kind": "configure", - "command": "cmake --preset windows-shipping 2>&1 | tee ../reproducibility-b-configure.log", + "command": "cmake --preset windows-shipping 2>&1 | tee \"$physical_parent/reproducibility-b-configure.log\"", "commandProvenance": "literal", "options": {}, "preset": "windows-shipping", diff --git a/docs/readiness/work-items/10-security-network-operations.json b/docs/readiness/work-items/10-security-network-operations.json index 498b857ea..48a2eb3a5 100644 --- a/docs/readiness/work-items/10-security-network-operations.json +++ b/docs/readiness/work-items/10-security-network-operations.json @@ -385,7 +385,7 @@ "Required fuzz smoke is deterministic and blocking" ], "acceptanceStatus": [ - {"criterionDigest": "sha256:cd03931e2734", "state": "unmet", "note": "74 of 137 inventoried parsers have libFuzzer targets with seed corpora; 63 remain blocked. All registered targets require fatal UBSan at compile and link. Batch 3 adds eight editor and eight engine/tool targets; editor layout and window-layout substitute for binary-scene and crash-state. Linux sanitizer smoke, campaigns and exact-commit CI remain unverified.", "evidence": ["docs/sec120-fuzz-policy-check.json", "tools/fuzz-policy/build_binding.py", "FuzzerTests/CMakeLists.txt"]}, + {"criterionDigest": "sha256:cd03931e2734", "state": "unmet", "note": "74 of 138 parsers have libFuzzer targets and bounded corpora; 64 remain blocked. The reflected gameplay adapter has no harness for its second JSON parse and component/asset checks; DeserializeInto and text-reader harnesses do not execute LoadReflected. All targets require fatal UBSan. Hosted sanitizer evidence, campaigns, and closure remain unverified.", "evidence": ["docs/sec120-fuzz-policy-check.json", "tools/fuzz-policy/build_binding.py", "FuzzerTests/CMakeLists.txt"]}, { "criterionDigest": "sha256:f3d43da4661a", "state": "implemented", @@ -1097,7 +1097,7 @@ "Tests/TestEngineSettingsReal.cpp CrashSettings_RetiredTransportCredentialsAreDroppedOnLoadAndNeverWritten (ctest CrashSettingsCredentials, label crash-security) proves retired crash-transport keys from settings.ini and settings.local.ini are dropped on load and never saved; Tests/Tools/test_ops100_crash_security.py source/settings policy checks forbid credential-bearing crash configuration, environment overrides, and transport calls in SparkEngine/Source and shipped settings", "Tests/TestTelemetrySpool.cpp, exercised by TelemetrySpool, proves C++ durable spool recovery, terminal rejection, retry boundaries, bounds/drop accounting, consent revocation, and hostile artifact rejection", "Tests/Tools/run_crash_capture_security.py, registered as ctest CrashCapturePackageSecurity (labels crash-security;security;integration) on every native host that builds SparkCrashReporter with miniz (stub builds and cross-compiles are excluded), runs the production producer test CrashHandler_UngatedReportWritesAnArtifactAndTheAssertGateDoesNot (Tests/TestCrashHandlerGatingReal.cpp, Windows minidump path and POSIX log-only assertion path) in an isolated temporary root and validates its untouched artifacts with the native reporter and validate_crash_package.py, including traversal and legacy-transport-field copies; on POSIX the owned work root is removed through a directory fd pinned to its recorded identity (Windows retains it); 2026-09-25 local Linux run (linux-gcc-release): ctest -L crash-security passes. The linux-shipping configuration that security-runtime selects was not run locally and is unverified. No hosted record.", - "Tests/Tools/run_crash_symbolication_canary.py, registered as ctest CrashReporter_Symbolication (labels crash-canary;integration) on native Linux builds with miniz, objcopy and addr2line, runs SparkCrashSymbolicationProbe (Tests/Fixtures/CrashSymbolicationProbe.cpp, -g -O2 -fno-lto, --build-id=sha1) under an isolated TMPDIR, requires death by SIGSEGV and one crash log, stores the probe's split debug info by build-id, and requires frame 0 (the exact faulting pc from the signal context) to resolve to SparkSymbolicationCanaryCrashSite at the marked CrashSymbolicationProbe.cpp line and a return-address frame to resolve to main; it also requires a build-id-mismatched store entry and a symlinked entry to be refused. It proves offline symbolication of a debug-info probe only, not relay delivery or release-binary symbolication.", + "Tests/Tools/run_crash_symbolication_canary.py, registered as ctest CrashReporter_Symbolication (labels crash-canary;integration) on native Linux builds with miniz, objcopy and addr2line, runs SparkCrashSymbolicationProbe (Tests/Fixtures/CrashSymbolicationProbe.cpp, -g -O0 -fno-omit-frame-pointer -fno-lto, --build-id=sha1) under an isolated TMPDIR, requires death by SIGSEGV and one crash log, stores the probe's split debug info by build-id, and requires frame 0 (the exact faulting pc from the signal context) to resolve to SparkSymbolicationCanaryCrashSite at the marked CrashSymbolicationProbe.cpp line and a return-address frame to resolve to main; it also requires a build-id-mismatched store entry and a symlinked entry to be refused. It proves offline symbolication of a debug-info probe only, not relay delivery or release-binary symbolication.", "Tests/TestCrashSymbolication.cpp (ctest CrashSymbolicationRecords, SPARK_TEST_EXPECT_COUNT=5) covers the bounded NT_GNU_BUILD_ID note parser against truncated, hostile-length, oversized and foreign notes, and the fixed-buffer SYMBOLIC FRAMES format, including whole-line truncation without an end marker", "Tests/Tools/test_ops100_symbolication.py (run by validate-ops100) covers the symbolizer grammar and bounds, store refusal of binaries without DWARF or build-id, idempotent store publication, missing-symbols reporting, build-id mismatch refusal, symlinked entry/directory/root refusal, and CLI exit codes against ELF files compiled on the host" ], diff --git a/docs/readiness/work-items/20-platform-runtime-editor.json b/docs/readiness/work-items/20-platform-runtime-editor.json index 965bcc3e6..cdaa4fdad 100644 --- a/docs/readiness/work-items/20-platform-runtime-editor.json +++ b/docs/readiness/work-items/20-platform-runtime-editor.json @@ -2391,7 +2391,7 @@ "Tests/PackageSmoke/RunInstalledSDKTemplate.cmake", "cmake/SparkPackageConsumerBoundary.cmake" ], - "note": "Linux: opt-in PackageConsumer_LinuxInstalledSDK. Windows: SDKConsumer_InstalledEmptyProjectTemplate installs only the sdk component, builds the shipped EmptyProject, and boundary-scans ninja -t deps/commands dumps, failing if they are unscanned or never mention the prefix. SDKConsumer_TemplateRunnerContract passes locally; the Windows GREEN run is not independently verified." + "note": "Linux: opt-in PackageConsumer_LinuxInstalledSDK. Windows: SDKConsumer_InstalledEmptyProjectTemplate installs runtime, sdk, and tools (sdk/tools depend on runtime), builds EmptyProject, and scans ninja -t deps/commands; unscanned dumps or missing prefix fail. SDKConsumer_TemplateRunnerContract passes locally; Windows GREEN is not independently verified." }, { "criterionDigest": "sha256:3e936e0f4337", diff --git a/docs/readiness/work-items/30-game-modules.json b/docs/readiness/work-items/30-game-modules.json index f86cf61d1..cadcd87a2 100644 --- a/docs/readiness/work-items/30-game-modules.json +++ b/docs/readiness/work-items/30-game-modules.json @@ -746,7 +746,7 @@ "wave": 4, "area": "networking", "owner": "unassigned", - "rationale": "SparkGameFPS multiplayer currently ignores address and port and fabricates connection state; optional LAN work must remain experimental and independent of the stable single-player slice. Owner decision OD-14 (2026-09-24, docs/readiness/OWNER-DECISIONS.md): FPS multiplayer consolidates onto the multiplayer primitives used by SparkGameMMOFPS instead of keeping a separate FPSMultiplayerSystem implementation; the duplicate is removed only after parity is proven.", + "rationale": "SparkGameFPS multiplayer uses the production encrypted UDP transport with loopback handshake, input and snapshot tests; rendered-player integration, constrained LAN acceptance and exact-commit qualification remain open. Optional LAN work must remain experimental and independent of the stable single-player slice. Owner decision OD-14 (2026-09-24, docs/readiness/OWNER-DECISIONS.md): FPS multiplayer consolidates onto the multiplayer primitives used by SparkGameMMOFPS instead of keeping a separate FPSMultiplayerSystem implementation; the duplicate is removed only after parity is proven.", "dependencies": [ "MOD-310", "NET-100" @@ -783,7 +783,7 @@ "Tests/Fixtures/FPSLANLoopbackScenario.h", "Tests/CMakeLists.txt" ], - "note": "FPSLAN_ThreeProcessLoopbackConvergence runs one server and two client processes over loopback UDP through a spawn-move-kill-respawn-score round; spawns, respawn, positions, health and scores converge with server, and quitting clients leave. Converged state is FPSMultiplayerSystem's; the rendered game reads none of it back (see risks). Local pass only; no constrained LAN or encrypted transport." + "note": "FPSLAN_ThreeProcessLoopbackConvergence runs one server and two clients over loopback UDP through spawn-move-kill-respawn-score. Spawns, positions, health, respawn and scores converge, and quitting clients leave. This is FPSMultiplayerSystem state; the rendered game does not consume it (see risks). Local pass only; constrained LAN and exact-commit qualification remain open." }, { "criterionDigest": "sha256:5bc1ee8cc5b7", diff --git a/docs/sec120-fuzz-policy-check.json b/docs/sec120-fuzz-policy-check.json index 2ae2640d8..883155f3f 100644 --- a/docs/sec120-fuzz-policy-check.json +++ b/docs/sec120-fuzz-policy-check.json @@ -1,23 +1,23 @@ { "closure_blockers": [ - "63 inventoried parsers have no fuzz target" + "64 inventoried parsers have no fuzz target" ], "corpus": { - "bound_target_count": 74, - "corpus_count": 74, + "bound_target_count": 75, + "corpus_count": 75, "max_staleness_days": 90, "regression_count": 73, - "seed_bytes": 17438903, - "seed_count": 691 + "seed_bytes": 17440633, + "seed_count": 699 }, "coverage_claim": false, "inputs": { - "corpus_manifest": "992044a2cf5967eb38c324c4b64daec99c13aafc0e9b1eca457c6f2811586eeb", - "inventory": "6844c2da4cefa3df3c8d35049c6e4b26267f87be5d150c98265b80b29512640d" + "corpus_manifest": "ea62a2434a02f04a6917993ef8e9bb88c4121c84c1a54409d5292e89f07feb89", + "inventory": "7c8b148094eb8ea2d6916c961a0380fa463d9a463637a1debe403d10657b374b" }, "inventory": { - "blocked_count": 63, - "candidate_count": 307, + "blocked_count": 64, + "candidate_count": 310, "deferred_candidate_count": 0, "excluded_files": [], "excluded_subtrees": [ @@ -44,8 +44,8 @@ "same-process-data": 6 }, "exempt_candidate_count": 120, - "fuzzed_count": 74, - "parser_count": 137, + "fuzzed_count": 75, + "parser_count": 139, "scan_roots": [ "SparkEngine/Source", "SparkEditor/Source", @@ -65,7 +65,7 @@ "SparkSDK/Include", "GameModules" ], - "scanned_file_count": 2183, + "scanned_file_count": 2194, "unclassified_candidate_count": 0 }, "passed": false, diff --git a/docs/site/readiness.json b/docs/site/readiness.json index 7824ccc87..5ba2b01b5 100644 --- a/docs/site/readiness.json +++ b/docs/site/readiness.json @@ -1045,7 +1045,7 @@ "verification": "unit-tested", "support": "supported", "release": "blocked", - "summary": "SparkGameFPS is the declared first-party single-player vertical slice of the stable-v1 release profile. It is in scope and intended to be supported; it is not certified. Its release state is blocked and it holds the whole profile at blocked until its gates pass. Multiplayer is outside the profile and its existing multiplayer path is fake, so it is not release evidence for anything. The installed public entrypoint consumer and source-boundary contract now pass, but the complete FPS DLL still uses private engine headers and SparkEngineLib.", + "summary": "SparkGameFPS is the declared first-party single-player vertical slice of the stable-v1 release profile. It is in scope and intended to be supported; it is not certified. Its release state is blocked and it holds the whole profile at blocked until its gates pass. Multiplayer is experimental and outside the profile. Its production encrypted UDP transport has loopback handshake, input and snapshot tests; rendered-player integration, constrained LAN acceptance and exact-commit qualification remain open. The installed public entrypoint consumer and source-boundary contract now pass, but the complete FPS DLL still uses private engine headers and SparkEngineLib.", "limitations": [ "Not certified: no same-commit author-cook-package-install-run evidence for the slice", "The production DLL still builds against SparkEngineLib and private engine-source include paths; the installed entrypoint consumer and source-boundary contract pass, but the complete public-API-only requirement is unmet", diff --git a/docs/sync-wiki.sh b/docs/sync-wiki.sh index 0eec99318..52cd1db10 100755 --- a/docs/sync-wiki.sh +++ b/docs/sync-wiki.sh @@ -63,7 +63,11 @@ update_auto_section() { local tmpfile tmpfile=$(mktemp) - awk -v start="$start_marker" -v end="$end_marker" -v body="$content" ' + # BSD awk rejects literal newlines in -v assignments. Read the complete + # body from the environment so multiline sections also retain literal + # backslashes instead of being interpreted as awk string escapes. + SPARK_WIKI_SECTION_BODY="$content" awk -v start="$start_marker" -v end="$end_marker" ' + BEGIN { body=ENVIRON["SPARK_WIKI_SECTION_BODY"] } $0 ~ start { print; print body; skip=1; next } $0 ~ end { skip=0 } !skip { print } diff --git a/docs/update-all-docs.sh b/docs/update-all-docs.sh index 05210ee71..e8cbc4f65 100755 --- a/docs/update-all-docs.sh +++ b/docs/update-all-docs.sh @@ -58,7 +58,9 @@ case "$MODE" in *) echo "Unknown command: $MODE" >&2; exit 1 ;; esac -RESULTS_FILE="$(mktemp)" +# Apple mktemp can prefer /var/folders over TMPDIR. Python honors the safe +# job-owned TMPDIR needed by the health reader's no-reparse path contract. +RESULTS_FILE="$("$PYTHON_BIN" -c 'import os,tempfile; fd,path=tempfile.mkstemp(prefix="spark-doc-results-"); os.close(fd); print(path)')" || exit 1 HEALTH_OUTPUT="${SPARK_DOC_HEALTH_OUTPUT:-$SCRIPT_DIR/.health.json}" STARTED_AT="$("$PYTHON_BIN" -c "from datetime import datetime,timezone; print(datetime.now(timezone.utc).isoformat().replace('+00:00','Z'))")" FINAL_EXIT=1 diff --git a/docs/update-codebase-stats.sh b/docs/update-codebase-stats.sh index e3c5431d2..7a5427dc3 100755 --- a/docs/update-codebase-stats.sh +++ b/docs/update-codebase-stats.sh @@ -52,6 +52,11 @@ log_info() { echo -e "${BLUE}[STATS]${NC} $1"; } log_success() { echo -e "${GREEN}[STATS]${NC} $1"; } log_warning() { echo -e "${YELLOW}[STATS]${NC} $1"; } +# Indexed arrays work with the Bash 3.2 shipped by macOS. Keep names and counts +# in matching order instead of requiring Bash 4 associative/global declarations. +SUBSYSTEM_NAMES=("AI" "Networking" "ECS" "Animation" "Gameplay" "Scripting" "SaveSystem" "UI" "World" "Dialogue" "Cinematic" "Modding" "2D" "Coroutine" "Replay" "Streaming" "Tween" "Destruction" "Localization" "Mobile" "Events" "Loading" "VR" "Persistence" "Physics" "Editor") +SUBSYSTEM_LINES=() + # ============================================================================ # Counting functions — single source of truth # ============================================================================ @@ -145,10 +150,9 @@ collect_metrics() { LINES_CAMERA=$(engine_subsystem_lines "Camera") # Engine/... subsystems - local subsystems=("AI" "Networking" "ECS" "Animation" "Gameplay" "Scripting" "SaveSystem" "UI" "World" "Dialogue" "Cinematic" "Modding" "2D" "Coroutine" "Replay" "Streaming" "Tween" "Destruction" "Localization" "Mobile" "Events" "Loading" "VR" "Persistence" "Physics" "Editor") - declare -g -A SUBSYSTEM_LINES - for sub in "${subsystems[@]}"; do - SUBSYSTEM_LINES[$sub]=$(engine_subsystem_lines "Engine/$sub") + SUBSYSTEM_LINES=() + for sub in "${SUBSYSTEM_NAMES[@]}"; do + SUBSYSTEM_LINES[${#SUBSYSTEM_LINES[@]}]=$(engine_subsystem_lines "Engine/$sub") done # ECS metrics @@ -241,8 +245,10 @@ HEREDOC # Generate engine subsystem table dynamically echo "| Subsystem | Lines |" echo "|-----------|------:|" - for sub in AI Networking ECS Animation Gameplay Scripting SaveSystem UI World Dialogue Cinematic Modding 2D Coroutine Replay Streaming Tween Destruction Localization Mobile Events Loading VR Persistence Physics Editor; do - local lines="${SUBSYSTEM_LINES[$sub]}" + local index=0 + for sub in "${SUBSYSTEM_NAMES[@]}"; do + local lines="${SUBSYSTEM_LINES[$index]}" + index=$((index + 1)) if [ "$lines" -gt 0 ] 2>/dev/null; then echo "| $sub | $(format_number "$lines") |" fi diff --git a/tools/fuzz-policy/corpus-manifest.json b/tools/fuzz-policy/corpus-manifest.json index a0b3b2be8..3ad9bd74e 100644 --- a/tools/fuzz-policy/corpus-manifest.json +++ b/tools/fuzz-policy/corpus-manifest.json @@ -1803,6 +1803,23 @@ "smoke_seconds": 10 }, "regressions": [] + }, + { + "id": "material-editor-spkmat-corpus", + "parser_id": "material-editor-spkmat-parser", + "corpus_dir": "FuzzerTests/corpora/material-editor-files", + "last_verified": "2026-10-06", + "content_digest": "d5e7a50b854ec91df80254ad564135ce3922d4f5c4e95657d6753cbff709be40", + "budget": { + "max_input_bytes": 65536, + "max_parse_time_ms": 1000, + "max_memory_mb": 256, + "max_depth": 1, + "max_corpus_entries": 32, + "max_corpus_bytes": 4194304, + "smoke_seconds": 10 + }, + "regressions": [] } ] } diff --git a/tools/fuzz-policy/parser-inventory.json b/tools/fuzz-policy/parser-inventory.json index c0fb4bbec..4dcdd8f81 100644 --- a/tools/fuzz-policy/parser-inventory.json +++ b/tools/fuzz-policy/parser-inventory.json @@ -324,6 +324,22 @@ "harness_entry_symbol": "SparkFuzzDeserializeReflectedScene" } }, + { + "id": "reflected-gameplay-scene", + "description": "Reflected editor scene primary-byte reader and transactional gameplay scene adapter.", + "trust_boundary": "untrusted-file", + "source_files": [ + "SparkEngine/Source/SceneManager/SceneManagerReflected.cpp" + ], + "formats": [ + ".sparkscene" + ], + "status": "blocked", + "blocker": { + "reason": "No production-entry-point fuzz harness and bounded corpus exercise SceneManager::LoadReflected, including its second JSON parse, component restrictions, confined assets, and gameplay adaptation. Existing scene-serializer and scene-manager-text targets do not execute this adapter.", + "ticket": "SEC-120" + } + }, { "id": "scene-manager-text", "description": "SceneManager versioned text, INI and legacy object-line scene readers.", @@ -527,7 +543,9 @@ "source_files": [ "SparkEngine/Source/Engine/Gameplay/AchievementSystem.h" ], - "formats": [".bin"], + "formats": [ + ".bin" + ], "status": "fuzzed", "target": { "harness": "FuzzerTests/FuzzAchievementProgress.cpp", @@ -549,7 +567,9 @@ "SparkEngine/Source/Engine/Gameplay/EventResponseSystem.h", "SparkEngine/Source/Engine/Gameplay/EventResponseRules.cpp" ], - "formats": [".json"], + "formats": [ + ".json" + ], "status": "fuzzed", "target": { "harness": "FuzzerTests/FuzzEventResponse.cpp", @@ -640,7 +660,9 @@ "source_files": [ "SparkEngine/Source/Engine/ECS/RuntimePrefab.h" ], - "formats": [".prefab"], + "formats": [ + ".prefab" + ], "status": "fuzzed", "target": { "harness": "FuzzerTests/FuzzRuntimePrefab.cpp", @@ -727,7 +749,9 @@ "source_files": [ "SparkEngine/Source/Core/AssetMigration.h" ], - "formats": [".bin"], + "formats": [ + ".bin" + ], "status": "fuzzed", "target": { "harness": "FuzzerTests/FuzzAssetMigration.cpp", @@ -775,7 +799,11 @@ "SparkEngine/Source/Engine/UI/UIFactory.cpp", "SparkEngine/Source/Engine/UI/UIFactory.h" ], - "formats": [".uilayout", ".json", ".uicfg"], + "formats": [ + ".uilayout", + ".json", + ".uicfg" + ], "status": "fuzzed", "target": { "harness": "FuzzerTests/FuzzUILayout.cpp", @@ -926,7 +954,10 @@ "source_files": [ "SparkAssetPipelineCore/src/AssetCooker.cpp" ], - "formats": ["asset-source", ".json"], + "formats": [ + "asset-source", + ".json" + ], "status": "fuzzed", "target": { "harness": "FuzzerTests/FuzzAssetCooker.cpp", @@ -1456,7 +1487,9 @@ "SparkLauncher/src/LauncherApp.cpp", "SparkLauncher/src/LauncherTemplates.cpp" ], - "formats": ["template.json"], + "formats": [ + "template.json" + ], "status": "fuzzed", "target": { "harness": "FuzzerTests/FuzzLauncherTemplate.cpp", @@ -1476,7 +1509,9 @@ "source_files": [ "SparkLauncher/src/LauncherProcess.cpp" ], - "formats": ["spark.modules.json"], + "formats": [ + "spark.modules.json" + ], "status": "fuzzed", "target": { "harness": "FuzzerTests/FuzzLauncherModuleManifest.cpp", @@ -2847,6 +2882,31 @@ "corpus_id": "mmo-session-gate-protocol-corpus", "entry_symbol": "MMO::SessionGateWire::Decode" } + }, + { + "id": "material-editor-spkmat-parser", + "description": "Legacy .spkmat material decoder used by MaterialEditorPanel::OpenMaterial.", + "trust_boundary": "untrusted-file", + "source_files": [ + "SparkEditor/Source/Panels/MaterialEditorFiles.cpp", + "SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp", + "SparkEditor/Source/Panels/MaterialEditorMaterialParser.h", + "SparkEditor/Source/Panels/MaterialEditorDefaults.cpp" + ], + "formats": [ + ".spkmat" + ], + "status": "fuzzed", + "target": { + "harness": "FuzzerTests/FuzzMaterialEditorFiles.cpp", + "cmake_file": "FuzzerTests/CMakeLists.txt", + "cmake_target": "SparkFuzzMaterialEditorFiles", + "test_selector": "FuzzMaterialEditorFilesSmoke", + "corpus_id": "material-editor-spkmat-corpus", + "entry_symbol": "SparkEditor::ParseMaterialText", + "binding_source": "FuzzerTests/FuzzMaterialEditorFilesProduction.cpp", + "harness_entry_symbol": "SparkFuzzParseMaterialEditorFiles" + } } ], "deferred_candidates": [], diff --git a/tools/generate-sbom.py b/tools/generate-sbom.py index 6cd481768..2526f5a2b 100755 --- a/tools/generate-sbom.py +++ b/tools/generate-sbom.py @@ -754,6 +754,45 @@ def reconcile( errors.append(f"locked dependency '{name}' has install payload rules but ships no file in this package") listed = _notice_inventory(notice_path) + # System runtimes are owned by the package notice rule set, not + # dependencies.lock. Parse the same generated inventory that GOV-400 + # validates so this reconciliation accepts only an authoritative runtime + # entry carrying redistribution terms and the shipped DLL names. + try: + notice_text = notice_path.read_bytes().decode("utf-8", errors="strict") + notice_entries = notices.parse_package_notice(notice_text, rules, str(notice_path)) + except (OSError, UnicodeDecodeError, notices.NoticeInputError) as error: + raise InputError(f"{notice_path}: cannot parse generated package inventory: {error}") from error + runtime_names = {rule.system_runtime for rule in rules.payload if rule.system_runtime is not None} + runtime_entries = {entry.name: entry for entry in notice_entries if entry.name in runtime_names} + runtime_files: dict[str, set[str]] = {name: set() for name in runtime_names} + for rel in files: + rule = next((r for r in rules.payload if r.pattern.search(rel)), None) + if rule is not None and rule.system_runtime in runtime_files: + runtime_files[rule.system_runtime].add(PurePosixPath(rel).name) + invalid_runtime_entries: set[str] = set() + for name in sorted(runtime_names): + if runtime_files[name] and name not in listed: + errors.append(f"{NOTICE_NAME} has no authoritative system runtime entry '{name}'") + invalid_runtime_entries.add(name) + continue + if not runtime_files[name] and name in listed: + errors.append(f"{NOTICE_NAME} lists system runtime '{name}' but ships no runtime files") + invalid_runtime_entries.add(name) + continue + if name not in listed: + continue + entry = runtime_entries.get(name) + if entry is None or not entry.terms: + errors.append(f"{NOTICE_NAME} system runtime '{name}' has no authoritative Terms line") + invalid_runtime_entries.add(name) + continue + missing = sorted(runtime_files[name] - {PurePosixPath(path).name for path in entry.files}) + if missing: + errors.append( + f"{NOTICE_NAME} system runtime '{name}' does not list shipped file(s): {', '.join(missing)}" + ) + invalid_runtime_entries.add(name) for name, dep in dependencies.items(): if name not in listed: errors.append(f"{NOTICE_NAME} does not list locked dependency '{name}'") @@ -762,7 +801,8 @@ def reconcile( f"{NOTICE_NAME} lists '{name}' at version {listed[name]!r}; the lock pins {dep.version!r}" ) font_entries = sorted(name for name in set(listed) - set(dependencies) if FONT_ENTRY_PATTERN.match(name)) - for name in sorted(set(listed) - set(dependencies) - set(font_entries)): + valid_runtime_entries = (runtime_names & set(listed)) - invalid_runtime_entries + for name in sorted(set(listed) - set(dependencies) - set(font_entries) - valid_runtime_entries): errors.append(f"{NOTICE_NAME} lists '{name}', which dependencies.lock does not lock") return { diff --git a/tools/site-data/validate_docs_links.py b/tools/site-data/validate_docs_links.py index 3a4d9295d..53b14c8bd 100644 --- a/tools/site-data/validate_docs_links.py +++ b/tools/site-data/validate_docs_links.py @@ -22,6 +22,7 @@ sys.path.insert(0, str(REPO_ROOT / "tools" / "site-data")) from common import SITE_CONTRACT_ROOT, github_heading_slug, load_json +import docs_contract from docs_contract import validate_api_manifest MAX_DOCUMENTS = 1500 @@ -321,32 +322,72 @@ class TrackedTree: def load_tracked_tree(repo_root: Path) -> TrackedTree | None: - """Return the index paths of *repo_root*, or None when it is not a git work tree root.""" + """Return exact tracked paths, using the isolated snapshot manifest when supplied. + + The isolated documentation snapshot has no Git metadata. Its NUL-delimited + inventory is authoritative and retains logical path casing even when the + checkout filesystem merges ``Tools/`` and ``tools/``. + """ try: top = subprocess.run( ["git", "-C", str(repo_root), "rev-parse", "--show-toplevel"], check=False, capture_output=True, timeout=60, ) - if top.returncode or not top.stdout.strip(): - return None - if Path(os.fsdecode(top.stdout.strip())).resolve() != repo_root.resolve(): - return None + git_available = not top.returncode and bool(top.stdout.strip()) and Path( + os.fsdecode(top.stdout.strip()) + ).resolve() == repo_root.resolve() listed = subprocess.run( ["git", "-C", str(repo_root), "ls-files", "-z", "--cached"], check=False, capture_output=True, timeout=120, - ) + ) if git_available else None except (OSError, subprocess.TimeoutExpired): + listed = None + if listed is not None and listed.returncode == 0: + entries: set[str] = set() + for raw in listed.stdout.split(b"\x00"): + if not raw: + continue + logical = raw.decode("utf-8", errors="surrogateescape") + parts = logical.split("/") + for index in range(1, len(parts) + 1): + entries.add("/".join(parts[:index])) + return TrackedTree(frozenset(entries), frozenset(entry.casefold() for entry in entries)) + + external = os.environ.get("SPARK_DOC_TRACKED_PATHS") + if not external: return None - if listed.returncode: - return None - entries: set[str] = set() - for raw in listed.stdout.split(b"\x00"): - if not raw: - continue - logical = raw.decode("utf-8", errors="surrogateescape") + manifest = Path(external) + try: + docs_contract.assert_contained(manifest, repo_root, label="tracked-path manifest") + raw = docs_contract.read_regular_bytes( + manifest, label="tracked-path manifest", maximum=docs_contract.MAX_JSON_BYTES + ) + if not raw or not raw.endswith(b"\0"): + raise LinkContractError("tracked-path manifest must be NUL terminated") + leaves: set[str] = set() + folded_leaves: set[str] = set() + for item in raw[:-1].split(b"\0"): + if not item: + raise LinkContractError("tracked-path manifest contains an empty path") + try: + value = item.decode("utf-8") + except UnicodeDecodeError as exc: + raise LinkContractError("tracked-path manifest has a non-UTF-8 path") from exc + logical = docs_contract.safe_relative(value).as_posix() + if logical in leaves or logical.casefold() in folded_leaves: + raise LinkContractError(f"tracked-path manifest contains duplicate path: {logical}") + leaves.add(logical) + folded_leaves.add(logical.casefold()) + if not leaves: + raise LinkContractError("tracked-path manifest is empty") + except (docs_contract.ContractError, OSError) as exc: + if isinstance(exc, LinkContractError): + raise + raise LinkContractError(f"cannot read tracked-path manifest: {exc}") from exc + entries = set(leaves) + for logical in tuple(leaves): parts = logical.split("/") - for index in range(1, len(parts) + 1): - entries.add("/".join(parts[:index])) + entries.update("/".join(parts[:index]) for index in range(1, len(parts))) return TrackedTree(frozenset(entries), frozenset(entry.casefold() for entry in entries)) @@ -537,7 +578,15 @@ def validate_docs_links( path_cache: dict[tuple[str, str], tuple[Path | None, str | None]] = {} filesystem_cache: dict[str, str | None] = {} line_count_cache: dict[str, int] = {} - tracked = load_tracked_tree(REPO_ROOT) + try: + tracked = load_tracked_tree(REPO_ROOT) + except LinkContractError as exc: + return errors + [{ + "source": "SPARK_DOC_TRACKED_PATHS", + "line": 0, + "target": os.environ.get("SPARK_DOC_TRACKED_PATHS", ""), + "error": str(exc), + }] total_links = 0 for document in documents: try: diff --git a/wiki/Home.md b/wiki/Home.md index a67179f70..ff0afbd51 100644 --- a/wiki/Home.md +++ b/wiki/Home.md @@ -96,11 +96,11 @@ SparkEngine is licensed under the [Spark Open License](https://github.com/Krilli | Metric | Count | |--------|-------| -| Header files | 1096 | +| Header files | 1101 | | Struct declarations in 17 component headers | 81 | | Engine System Classes | 76 | | `*Panel.h` class inventory | 64 | -| Test-bearing `.cpp`/`.mm` files | 738 | -| Source-level test definitions | 8530 | +| Test-bearing `.cpp`/`.mm` files | 742 | +| Source-level test definitions | 8563 | | Wiki pages | 206 | diff --git a/wiki/advanced/Codebase-Statistics.md b/wiki/advanced/Codebase-Statistics.md index 5df25d10d..7e589e0c4 100644 --- a/wiki/advanced/Codebase-Statistics.md +++ b/wiki/advanced/Codebase-Statistics.md @@ -11,26 +11,26 @@ x64 profile remains blocked and uncertified in `docs/site/readiness.json`. | Section | Lines | |---------|------:| -| **SparkEngine/Source** | 346913 | -| **SparkEditor/Source** | 106228 | -| **GameModules** | 163669 | +| **SparkEngine/Source** | 347396 | +| **SparkEditor/Source** | 106742 | +| **GameModules** | 164092 | | **External services** | 12922 | -| **Asset pipeline** | 3188 | -| **Tests** | 276437 | -| **SparkConsole/src** | 1861 | +| **Asset pipeline** | 3231 | +| **Tests** | 277774 | +| **SparkConsole/src** | 1866 | | **SparkShaderCompiler/src** | 847 | -| **Total C++ (excl. ThirdParty)** | **~933347** | +| **Total C++ (excl. ThirdParty)** | **~936157** | ### File Counts | Category | Count | |----------|------:| -| Header files (.h/.hh/.hpp/.hxx/.inl) | 1247 | -| Implementation files (.c/.cc/.cpp/.cxx/.mm) | 1988 | +| Header files (.h/.hh/.hpp/.hxx/.inl) | 1253 | +| Implementation files (.c/.cc/.cpp/.cxx/.mm) | 1999 | | HLSL shader files | 44 | | GLSL shader files | 14 | | AngelScript files (.as) | 1 | -| Test-bearing implementation files (.cpp/.mm) | 738 | +| Test-bearing implementation files (.cpp/.mm) | 741 | | Wiki pages (.md) | 206 | ### Largest Top-Level Source Section @@ -43,14 +43,14 @@ Graphics contains 125930 lines, or 36% of `SparkEngine/Source`. This is a source | Subsystem | Lines | % of Source | |-----------|------:|:----------:| -| Graphics | 125930 | 36.3% | -| Engine (all subsystems) | 100706 | 29.0% | -| Utils | 49354 | 14.2% | -| Core | 33513 | 9.6% | +| Graphics | 125930 | 36.2% | +| Engine (all subsystems) | 100750 | 29.0% | +| Utils | 49400 | 14.2% | +| Core | 33610 | 9.6% | | Physics | 11142 | 3.2% | | Audio | 6961 | 2.0% | -| Input | 3938 | 1.1% | -| SceneManager | 4625 | 1.3% | +| Input | 3968 | 1.1% | +| SceneManager | 4842 | 1.3% | | Enums | 1025 | 0.2% | | Game | 2950 | 0.8% | | Camera | 999 | 0.2% | @@ -60,13 +60,13 @@ Graphics contains 125930 lines, or 36% of `SparkEngine/Source`. This is a source | Subsystem | Lines | |-----------|------:| | Networking | 18859 | -| AI | 13692 | +| AI | 13693 | | ECS | 8814 | | Gameplay | 8285 | -| Scripting | 8148 | +| Scripting | 8189 | | Animation | 6959 | | SaveSystem | 4348 | -| UI | 2709 | +| UI | 2711 | | Modding | 2654 | | Streaming | 2236 | | Editor | 1737 | @@ -104,14 +104,14 @@ It does not measure registration, runtime use, support, or readiness. | Metric | Count | |--------|------:| | `*Panel.h` class inventory | 64 | -| Total editor lines | 106228 | +| Total editor lines | 106742 | ## Testing Metrics | Metric | Count | |--------|------:| -| Test files | 738 | -| TEST() definitions | 8530 | +| Test files | 741 | +| TEST() definitions | 8563 | | Configured sanitizer workflow lanes | ASan + UBSan + LSan + TSan + MSan | ## Build System Metrics @@ -121,7 +121,7 @@ It does not measure registration, runtime use, support, or readiness. | CMake option() declarations | 34 | | ENABLE_* feature toggles | 24 | | Game modules | 11 | -| SDK public headers | 23 | +| SDK public headers | 24 | | Documented build compiler paths | MSVC v143/v145, GCC 13+, Clang 17+, Apple Clang, MinGW-w64 | | Platforms | Windows, Linux, macOS (experimental) | @@ -157,7 +157,7 @@ inventory is implementation evidence, not support certification. | File | Lines | |------|------:| -| `CrashHandler.cpp` | 2859 | +| `CrashHandler.cpp` | 2905 | | `OpenGLDevice.cpp` | 2588 | | `NetworkConnection.cpp` | 2500 | | `ModuleManager.cpp` | 2223 | @@ -187,7 +187,7 @@ inventory is implementation evidence, not support certification. | File | Lines | |------|------:| -| `EditorUI.cpp` | 2723 | +| `EditorUI.cpp` | 2725 | | `ProjectManager.cpp` | 2362 | | `BuildPipeline.cpp` | 1881 | | `CollaborativeEditSession.cpp` | 1773 | diff --git a/wiki/advanced/Fuzz-Policy-and-Parser-Security.md b/wiki/advanced/Fuzz-Policy-and-Parser-Security.md index 9aaea8c45..ef5b656a0 100644 --- a/wiki/advanced/Fuzz-Policy-and-Parser-Security.md +++ b/wiki/advanced/Fuzz-Policy-and-Parser-Security.md @@ -9,12 +9,19 @@ SEC-120 remains open and release-blocking. Production fuzz targets and bounded seed corpora cover some inventoried parsers. The current target and corpus set is recorded in `tools/fuzz-policy/parser-inventory.json` and `tools/fuzz-policy/corpus-manifest.json`. -The current structural snapshot has 137 inventoried parsers: 58 fuzzed, 79 blocked, +The current structural snapshot has 138 inventoried parsers: 74 fuzzed, 64 blocked, zero deferred candidates and 120 OD-21 exemptions. These counts are generated in -`docs/sec120-fuzz-policy-check.json`; 79 missing harnesses keep closure open. +`docs/sec120-fuzz-policy-check.json`; 64 missing harnesses keep closure open. Exact-SHA hosted sanitizer evidence, scheduled campaigns, coverage, and crash-free-duration evidence remain absent. +The reflected gameplay adapter (`SceneManagerReflected.cpp`) is a separate +untrusted-file parser owned by SEC-120. It reparses validated scene bytes and +applies gameplay component, asset, camera and spawn restrictions. Existing +reflected-world and text-reader fuzz targets do not execute `LoadReflected`, +so this parser remains blocked until its own production-bound harness and +bounded corpus exist. + The deterministic snapshot in `docs/sec120-fuzz-policy-check.json` is validated by CI. Read its generated inventory, corpus, exemption, and blocker metrics for the current source-tree state. The unwired material file import path (`Material::LoadFromFile`, diff --git a/wiki/advanced/Testing.md b/wiki/advanced/Testing.md index 2f2ffdc2a..e0e7feace 100644 --- a/wiki/advanced/Testing.md +++ b/wiki/advanced/Testing.md @@ -1051,7 +1051,7 @@ extents; this does not change plane order or clip-space calculations. ## Test File Inventory -*738 test-bearing `.cpp`/`.mm` files, 8530 source-level test definitions* +*742 test-bearing `.cpp`/`.mm` files, 8563 source-level test definitions* | Test File | Test Definitions | |-----------|------------------| @@ -1253,7 +1253,7 @@ extents; this does not change plane order or clip-space calculations. | `TestEditorRecovery` | 18 | | `TestEditorStateCompatibility` | 8 | | `TestEditorSubsystems` | 138 | -| `TestEditorSubsystemsReal` | 16 | +| `TestEditorSubsystemsReal` | 26 | | `TestEditorUndoHierarchyReal` | 9 | | `TestEditorUndoWorldMatrixReal` | 2 | | `TestEditorUntrustedProject` | 5 | @@ -1283,10 +1283,12 @@ extents; this does not change plane order or clip-space calculations. | `TestFBXImportValidation` | 3 | | `TestFBXImporter` | 17 | | `TestFPSComponentsReal` | 11 | +| `TestFPSGameCameraReloadReal` | 0 | | `TestFPSGameplayIntegration` | 17 | | `TestFPSLANLoopback` | 2 | | `TestFPSMultiplayer` | 19 | -| `TestFPSWeatherPort` | 6 | +| `TestFPSOwnedSaveDecode` | 1 | +| `TestFPSWeatherPort` | 8 | | `TestFastNoise2SIMD` | 32 | | `TestFaultIsolation` | 14 | | `TestFaultIsolationReal` | 8 | @@ -1362,7 +1364,7 @@ extents; this does not change plane order or clip-space calculations. | `TestInGameConsole` | 12 | | `TestInputActionSystem` | 12 | | `TestInputBindings` | 5 | -| `TestInputFrameEdgesReal` | 5 | +| `TestInputFrameEdgesReal` | 8 | | `TestInputSystem` | 11 | | `TestInstanceManager` | 14 | | `TestInventorySystem` | 11 | @@ -1415,7 +1417,7 @@ extents; this does not change plane order or clip-space calculations. | `TestMOD380VehiclePhysicsReal` | 5 | | `TestMOD390VisualScriptDiagnosticsReal` | 7 | | `TestMOD390VisualScriptGameplayReal` | 4 | -| `TestMOD390VisualScriptGraphsReal` | 14 | +| `TestMOD390VisualScriptGraphsReal` | 15 | | `TestMOD390VisualScriptHotReloadReal` | 4 | | `TestMSanCanary` | 2 | | `TestMacOSPlatform` | 6 | @@ -1443,7 +1445,7 @@ extents; this does not change plane order or clip-space calculations. | `TestModuleDependency` | 5 | | `TestModuleDiscovery` | 7 | | `TestModuleHotReload` | 12 | -| `TestModuleLifecycleReal` | 16 | +| `TestModuleLifecycleReal` | 17 | | `TestModuleVersion` | 6 | | `TestMovementSystem` | 18 | | `TestMovieRenderPipeline` | 11 | @@ -1599,7 +1601,7 @@ extents; this does not change plane order or clip-space calculations. | `TestSceneConfigDatabaseReal` | 9 | | `TestSceneGraph2D` | 14 | | `TestSceneManager` | 21 | -| `TestSceneManagerReflectedReal` | 6 | +| `TestSceneManagerReflectedReal` | 10 | | `TestSceneManagerUnicodeReal` | 1 | | `TestSceneRoundtrip` | 8 | | `TestSceneSaveConfinedReal` | 5 | @@ -1615,6 +1617,7 @@ extents; this does not change plane order or clip-space calculations. | `TestScriptHookManagerPhaseBB` | 14 | | `TestScriptHotReload` | 16 | | `TestScriptSandbox` | 7 | +| `TestSdkWeatherService` | 4 | | `TestSeamlessAreaManager` | 14 | | `TestSecDaemonCacheHardening` | 8 | | `TestSecDaemonPipeIdentity` | 5 | @@ -1699,6 +1702,7 @@ extents; this does not change plane order or clip-space calculations. | `TestTFOutfitStore` | 18 | | `TestTFRedeployRules` | 7 | | `TestTFRegionLattice` | 11 | +| `TestTFReplicationRefresh` | 7 | | `TestTFScramAuth` | 11 | | `TestTFSecondaryMotion` | 7 | | `TestTFServerSecurity` | 9 | diff --git a/wiki/development/CI-Reproducible-Builds.md b/wiki/development/CI-Reproducible-Builds.md index 237b80a77..15a56928a 100644 --- a/wiki/development/CI-Reproducible-Builds.md +++ b/wiki/development/CI-Reproducible-Builds.md @@ -20,6 +20,109 @@ The Windows Shipping producer and the Linux trusted verifier must compute the sa `Build Matrix Verifier` accepts only `push` and `workflow_dispatch` builds on `Working`. Its workflow trigger filters the branch and its job conditions filter those event types. Pull-request and scheduled builds remain ordinary CI evidence and must not invoke the publication verifier as if they were accepted release sources. The verifier still independently checks repository, workflow, commit, run attempt, artifact, and receipt identity before publishing a status. +### Installed native qualification fixtures + +`.github/scripts/qualify-installed-native.py` captures `source_sha` in +`identity.json` during its build phase. Later SDK, ABI and dependency-closure +phases require that same source identity, qualification mode and image hashes +before starting a process. Compiler-free fixtures in +`Tests/Tools/test_installed_native_runner.py` must include the captured source +identity to reach the intended host-binding, timeout and closure checks. Missing +or changed identities remain failures; do not relax the runner to accommodate +an incomplete fixture. + +Reproduce the fixture checks with: + +```bash +python3 -B Tests/Tools/test_installed_native_runner.py +``` + +The ABI10 weather workflow's source-contract job gates its Windows native job. +Run every source-contract step in +`.github/workflows/installed-weather-qualification.yml` before requesting native +evidence; CMake, Ninja and PyYAML are required for those source checks. Passing +them qualifies the orchestration checks only. Native product results must retain +their separately pinned product and workflow commits, and do not certify Windows +11, physical graphics, installer signing or release readiness. + +`FPSWeatherIntegration_RejectsWrongThreadWithoutMutation` covers both inactive +and active weather integration. Worker calls must return refusal before reading +game-thread state, and must leave the bound port and activation state unchanged. +The owned save decoder's missing-fixture skip is classified in +`Tests/test-warning-waivers.json`; its dedicated qualification runner still +requires a real copied primary and rejects skipped decoding as evidence. +The native decoder builds its canonical profile JSON object one string entry at +a time. The vendored JSON API does not support implicit `std::unordered_map` +conversion; keep the persisted profile keys and values as strings in the receipt. +Cast its byte count to `std::uint64_t` explicitly: on macOS, `size_t` does not +select the vendored JSON integer constructor unambiguously. +Reflected scene rejection fixtures rebuild filtered objects and arrays instead +of calling unsupported JSON `erase` overloads; retain every other field/entity. +Installed lineage command binding accepts Windows executable path case aliases +only when they identify the same physical file. `PATHEXT` can return `cmake.EXE` +while CMake reports `cmake.exe`. Source pins, configuration, argument order and +flag spelling remain exact; different or unresolvable tools must fail binding. +Verify the complete configured command before compiling as well as afterward, +so a binding mismatch fails before the expensive native build. +Installed reflected-scene failures retain their specific reason on stderr when +static engine code has an uninitialized module-local logger. An initialized +logger still uses its configured structured sinks and filtering. Runtime camera +FOV checks allow the existing `1e-6` relative numeric tolerance for the float +degrees/radians round trip; authored scene fields remain exact, and missing, +duplicate, non-finite or materially changed runtime values still fail. +`SparkFPSGameCameraReloadReal` separately loads two authored legacy scenes through +the exported FPS DLL `Game`, checks the live camera's changed FOV and other state, +and verifies that a malformed reload retains the committed state. Its isolated +staged assets and CPU initialization require no graphics device. Required Windows +CTest executes it; compiling it in native qualification alone is not runtime proof. +Documentation health allocates its results file with Python under the safe job +`TMPDIR`; Apple's bare `mktemp` can choose `/var/folders` across a symlink and +make every generator result unreadable under the strict no-reparse contract. +The asset cooker fixture verifies invalid native filename bytes before claiming +its UTF-8 rejection was exercised. Apple filesystems that refuse creation with +an encoding error report that case as unexercised; unexpected I/O errors fail. +Held-fire network tests wait for each input's applied sequence without advancing +simulation time during socket dispatch, retaining the separate flood-limit test. +`ModuleLifecycleRecordHost` selects all six production lifecycle-record cases. +The Linux symbolication probe uses `-O0 -fno-omit-frame-pointer` so the actual +signal-safe frame-chain walker can retain its caller. The canary still requires +the exact fault location and a return frame in `main`; this is a fixture option, +not a change to production crash capture or optimization. +Fatal stderr diagnostics are best effort so an unread or closed pipe cannot +block the crash report or its watchdog. Linux prepares a separate nonblocking +open-file description during handler installation, preserving inherited flags. +Other POSIX hosts emit these optional diagnostics only when stderr is already +nonblocking. The private report and original fatal termination remain canonical; +ordinary nonfatal diagnostics keep their existing behavior. The Linux canary +checks full and closed stderr pipes, including the stalled-report timeout. +Non-MSVC Debug builds optimize the pinned crypto dependency with `-O2` while +retaining symbols, security flags and the ISA floor. The password verifier keeps +its 600,000 rounds and the authenticator keeps its two-second guard. The Linux +component regression checks actual compile commands and runs the existing hash +cases. ASan explicitly uses `-g -Og` for Debug C/C++ code while keeping assertions, +sanitizer instrumentation and the full-suite 1,800-second limit. + +Qualification workflows also participate in readiness ownership validation. +The stdlib-only workflow parser accepts literal blocks (`|` / `|-`) for multiline +strings; use those instead of wrapped plain or quoted scalars. When converting +existing workflows, compare the complete parsed YAML values before and after, +including command newlines, then check the strict parser against those values. +Source pins, permissions, deadlines and triggers must retain their meanings. + +The mainline Windows Release CPU-floor gate uses +`.github/scripts/extract_sde_archive.py` after verifying the pinned Intel SDE +archive hash. Its single streaming XZ pass avoids the native Windows tar +extraction timeout observed in Build run `37196542008`. Keep the five-minute +setup limit and propagate extractor failures; the below-floor process test +remains required. Extraction measurements are printed into the job log. + +The fuzz-policy structural gate requires every detected parser to have an +accurate classification. `SceneManagerReflected.cpp` owns a second JSON read +and gameplay adaptation beyond `DeserializeInto`; neither the reflected-world +nor text-reader harness executes it. Its `reflected-gameplay-scene` inventory +entry therefore remains blocked under SEC-120. A structural pass does not +prove this adapter is fuzz covered or close the release gate. + ## clang-format check (runs on every PR — job `check-format`) ```bash @@ -695,6 +798,13 @@ normalization and `a`/`tree-b` in ordinary mode only after an equivalent result. Failed comparisons retain both trees. This corrects successful cleanup without changing byte comparison, OD-24 normalization or unresolved archive differences. +Windows Shipping also retains `coff-diagnostics.json`, capped at 1 MiB, alongside +the unchanged comparison report. It inspects one differing ordinary member per +static library and reports section hashes, header hashes and remaining bytes. +Unavailable inspection is explicit and preserves the comparison result. These +hashes locate differences; they do not prove their cause or permit additional +normalization. The cap applies to this JSON, not the complete hosted artifact. + Shipping retains a separate diagnostic-only JSON bundle for parity findings, inventory and the pending receipt when present. Its provenance records missing inputs explicitly; missing receipts are never synthesized. The bundle caps JSON diff --git a/wiki/getting-started/Engine-Architecture-Flowchart.md b/wiki/getting-started/Engine-Architecture-Flowchart.md index 4e60f448c..800475831 100644 --- a/wiki/getting-started/Engine-Architecture-Flowchart.md +++ b/wiki/getting-started/Engine-Architecture-Flowchart.md @@ -3,7 +3,7 @@ > Complete visual guide to how SparkEngine works, from boot to shutdown. -_Generated from 773 headers, 652 source files, 81 ECS components, 12 ECS systems, 64 editor panels, 6 RHI backends._ +_Generated from 776 headers, 657 source files, 81 ECS components, 12 ECS systems, 64 editor panels, 6 RHI backends._ --- diff --git a/wiki/reference/Class-Hierarchy.md b/wiki/reference/Class-Hierarchy.md index 8ea154beb..d4c7b7178 100644 --- a/wiki/reference/Class-Hierarchy.md +++ b/wiki/reference/Class-Hierarchy.md @@ -1,6 +1,6 @@ # Class Hierarchy -> **Total inheritance edges:** 486. Derived from the exact first-party source contract. +> **Total inheritance edges:** 488. Derived from the exact first-party source contract. Auto-generated by `docs/generate-class-hierarchy.sh`. @@ -214,6 +214,7 @@ classDiagram IConsole <|-- EngineSdkConsole ILogger <|-- EngineSdkLogger IStateValidation <|-- EngineSdkStateValidation + IWeatherService <|-- EngineSdkWeather SequencerTrack <|-- EntityPropertyTrack SequencerTrack <|-- EntityTransformTrack IOnlinePlatform <|-- EpicPlatform @@ -495,6 +496,7 @@ classDiagram IAreaHandoffParticipant <|-- RecordingParticipant LifecycleStage <|-- RecordingStage ISystem <|-- RecordingSystem + IWeatherService <|-- RecordingWeatherService IModule <|-- RegistryLifecycleModule IEngineContext <|-- ReloadLoopEngineContext ISystem <|-- RenderSystem diff --git a/wiki/reference/Class-Index.md b/wiki/reference/Class-Index.md index ff5117a18..984069f99 100644 --- a/wiki/reference/Class-Index.md +++ b/wiki/reference/Class-Index.md @@ -2,11 +2,11 @@ > Every declared class and struct. > -> **Total:** 5750 symbols. Auto-generated by `docs/generate-symbol-index.sh`. +> **Total:** 5761 symbols. Auto-generated by `docs/generate-symbol-index.sh`. | Symbol | Kind | Module | Source | Brief | |--------|------|--------|--------|-------| -| `a` | struct | SparkEngine | [SceneManager.cpp:L404](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L404) | | +| `a` | struct | SparkEngine | [SceneManager.cpp:L448](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L448) | | | `AABB` | struct | SparkEngine | [FrustumCulling.h:L48](../../SparkEngine/Source/Graphics/FrustumCulling.h#L48) | Axis-aligned bounding box represented by min/max corners. | | `AABB` | struct | SparkSDK | [MathTypes.h:L98](../../SparkSDK/Include/Spark/MathTypes.h#L98) | Axis-aligned bounding box | | `AABB` | struct | Tests | [TestFrustumCulling.cpp:L23](../../Tests/TestFrustumCulling.cpp#L23) | | @@ -33,7 +33,7 @@ | `AbilityFlags` | struct | GameModules | [PlatformerPlayerController.h:L50](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L50) | Tracks which abilities the player has unlocked | | `AbilityState` | struct | GameModules | [ClassAbilityState.h:L15](../../GameModules/SparkGameFPS/Source/Game/ClassAbilityState.h#L15) | Ability runtime state | | `AbilitySystem` | class | SparkEngine | [AbilitySystem.h:L280](../../SparkEngine/Source/Engine/Gameplay/AbilitySystem.h#L280) | | -| `AbilitySystem` | class | SparkSDK | [IEngineContext.h:L56](../../SparkSDK/Include/Spark/IEngineContext.h#L56) | | +| `AbilitySystem` | class | SparkSDK | [IEngineContext.h:L57](../../SparkSDK/Include/Spark/IEngineContext.h#L57) | | | `AbilitySystem` | struct | Tests | [TestAbilitySystem.cpp:L103](../../Tests/TestAbilitySystem.cpp#L103) | | | `AbilitySystem` | struct | Tests | [TestGameplayStress.cpp:L355](../../Tests/TestGameplayStress.cpp#L355) | | | `AbilitySystemTest` | class | Tests | [TestECSystemSpecialized.cpp:L290](../../Tests/TestECSystemSpecialized.cpp#L290) | | @@ -129,7 +129,7 @@ | `AimSent` | struct | GameModules | [TFVehicleSystemRecords.h:L175](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystemRecords.h#L175) | | | `AISettings` | struct | SparkEngine | [EngineSettings.h:L353](../../SparkEngine/Source/Core/EngineSettings.h#L353) | | | `AISystem` | class | SparkEngine | [AISystem.h:L254](../../SparkEngine/Source/Engine/AI/AISystem.h#L254) | | -| `AISystem` | class | SparkSDK | [IEngineContext.h:L46](../../SparkSDK/Include/Spark/IEngineContext.h#L46) | | +| `AISystem` | class | SparkSDK | [IEngineContext.h:L47](../../SparkSDK/Include/Spark/IEngineContext.h#L47) | | | `AIUpdateSystem` | class | SparkEngine | [ECSystems.h:L441](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L441) | | | `AIUpdateSystem` | class | Tests | [TestECSystemOrdering.cpp:L121](../../Tests/TestECSystemOrdering.cpp#L121) | | | `AlignedWeightLayout` | struct | SparkEngine | [CpuNeuralInference.h:L41](../../SparkEngine/Source/Graphics/Neural/CpuNeuralInference.h#L41) | SIMD-friendly weight layout with rows padded to 8-float alignment. | @@ -140,11 +140,11 @@ | `AllocatorCursorProbe` | struct | Tests | [Test_persistence_SaveSystem.cpp:L468](../../Tests/harden/Test_persistence_SaveSystem.cpp#L468) | | | `AmbientAudioDef` | struct | GameModules | [TFDataTables.h:L166](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTables.h#L166) | | | `AngelScriptEngine` | class | GameModules | [VisualScriptDemoWorld.h:L21](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.h#L21) | | -| `AngelScriptEngine` | class | SparkEngine | [EngineContext.h:L45](../../SparkEngine/Source/Core/EngineContext.h#L45) | | +| `AngelScriptEngine` | class | SparkEngine | [EngineContext.h:L46](../../SparkEngine/Source/Core/EngineContext.h#L46) | | | `AngelScriptEngine` | class | SparkEngine | [EngineSetup.h:L19](../../SparkEngine/Source/Core/EngineSetup.h#L19) | | | `AngelScriptEngine` | class | SparkEngine | [ECSystems.h:L74](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L74) | | | `AngelScriptEngine` | class | SparkEngine | [AngelScriptEngine.h:L104](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L104) | | -| `AngelScriptEngine` | class | SparkSDK | [IEngineContext.h:L28](../../SparkSDK/Include/Spark/IEngineContext.h#L28) | | +| `AngelScriptEngine` | class | SparkSDK | [IEngineContext.h:L29](../../SparkSDK/Include/Spark/IEngineContext.h#L29) | | | `AngelScriptEngine` | class | Tests | [TestAngelScriptEngine.cpp:L72](../../Tests/TestAngelScriptEngine.cpp#L72) | | | `AngelScriptMemoryByteCodeStream` | class | Tests | [TestVisualScriptCompiler.cpp:L715](../../Tests/TestVisualScriptCompiler.cpp#L715) | | | `AnimalInstance` | struct | GameModules | [OWWildlifeSystem.h:L46](../../GameModules/SparkGameOpenWorld/Source/Wildlife/OWWildlifeSystem.h#L46) | Runtime state for a single spawned animal | @@ -167,7 +167,7 @@ | `AnimationLayer` | struct | SparkEngine | [AnimationTypes.h:L243](../../SparkEngine/Source/Engine/Animation/AnimationTypes.h#L243) | | | `AnimationLayer` | struct | Tests | [TestAnimationSystem.cpp:L266](../../Tests/TestAnimationSystem.cpp#L266) | | | `AnimationManager` | class | SparkEngine | [AnimationSystem.h:L374](../../SparkEngine/Source/Engine/Animation/AnimationSystem.h#L374) | | -| `AnimationManager` | class | SparkSDK | [IEngineContext.h:L40](../../SparkSDK/Include/Spark/IEngineContext.h#L40) | | +| `AnimationManager` | class | SparkSDK | [IEngineContext.h:L41](../../SparkSDK/Include/Spark/IEngineContext.h#L41) | | | `AnimationManager` | class | Tests | [TestAnimationSystem.cpp:L386](../../Tests/TestAnimationSystem.cpp#L386) | | | `AnimationRetargeter` | class | SparkEngine | [AnimationRetargeting.h:L216](../../SparkEngine/Source/Engine/Animation/AnimationRetargeting.h#L216) | Retargets animation poses from one skeleton to another | | `AnimationSettings` | struct | SparkEditor | [AssetPipelineTypes.h:L141](../../SparkEditor/Source/AssetPipeline/AssetPipelineTypes.h#L141) | | @@ -279,7 +279,7 @@ | `Asset` | class | SparkEngine | [AssetPipeline.h:L195](../../SparkEngine/Source/Graphics/AssetPipeline.h#L195) | Asset base class | | `Asset` | class | Tests | [TestAssetPipelineCache.cpp:L59](../../Tests/TestAssetPipelineCache.cpp#L59) | | | `AssetAuditGraph` | class | SparkEditor | [AssetAuditGraph.h:L121](../../SparkEditor/Source/Panels/AssetAuditGraph.h#L121) | | -| `AssetBrowserPanel` | class | SparkEditor | [AssetBrowserPanel.h:L26](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L26) | Asset browser panel | +| `AssetBrowserPanel` | class | SparkEditor | [AssetBrowserPanel.h:L27](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L27) | Asset browser panel | | `AssetCache` | class | SparkEngine | [AssetPipeline.h:L332](../../SparkEngine/Source/Graphics/AssetPipeline.h#L332) | Asset cache with LRU eviction | | `AssetCache` | class | Tests | [TestAssetPipelineCache.cpp:L85](../../Tests/TestAssetPipelineCache.cpp#L85) | | | `AssetCacheStats` | struct | SparkEngine | [AssetServiceProtocol.h:L85](../../SparkEngine/Source/Utils/AssetServiceProtocol.h#L85) | | @@ -302,17 +302,17 @@ | `AssetMetrics` | struct | SparkEngine | [AssetPipeline.h:L387](../../SparkEngine/Source/Graphics/AssetPipeline.h#L387) | Asset pipeline metrics | | `AssetMigrationRegistry` | class | SparkEngine | [AssetMigration.h:L196](../../SparkEngine/Source/Core/AssetMigration.h#L196) | Singleton registry that chains migration steps to upgrade assets. | | `AssetNode` | struct | SparkEditor | [AssetAuditGraph.h:L73](../../SparkEditor/Source/Panels/AssetAuditGraph.h#L73) | Information about a single asset in the graph | -| `AssetPipeline` | class | SparkEngine | [EngineContext.h:L46](../../SparkEngine/Source/Core/EngineContext.h#L46) | | +| `AssetPipeline` | class | SparkEngine | [EngineContext.h:L47](../../SparkEngine/Source/Core/EngineContext.h#L47) | | | `AssetPipeline` | class | SparkEngine | [AssetPipeline.h:L381](../../SparkEngine/Source/Graphics/AssetPipeline.h#L381) | Asset pipeline system | | `AssetPipeline` | class | SparkEngine | [FoliageRenderer.h:L45](../../SparkEngine/Source/Graphics/FoliageRenderer.h#L45) | | | `AssetPipeline` | class | SparkEngine | [GraphicsEngine.h:L88](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L88) | | | `AssetPipeline` | class | SparkEngine | [RTSceneFeeder.h:L32](../../SparkEngine/Source/Graphics/HybridRT/RTSceneFeeder.h#L32) | | -| `AssetPipeline` | class | SparkSDK | [IEngineContext.h:L29](../../SparkSDK/Include/Spark/IEngineContext.h#L29) | | +| `AssetPipeline` | class | SparkSDK | [IEngineContext.h:L30](../../SparkSDK/Include/Spark/IEngineContext.h#L30) | | | `AssetProcessor` | class | SparkEditor | [AdvancedAssetPipeline.h:L35](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L35) | Base class for asset processors | | `AssetReference` | struct | SparkEditor | [SceneFileTypes.h:L1074](../../SparkEditor/Source/SceneSystem/SceneFileTypes.h#L1074) | Asset reference for dependency tracking | | `AssetRegistry` | class | SparkEngine | [AssetIntegration.h:L74](../../SparkEngine/Source/Core/AssetIntegration.h#L74) | | | `AssetRegistry` | class | SparkEngine | [EngineRuntime.h:L38](../../SparkEngine/Source/Core/EngineRuntime.h#L38) | | -| `AssetRegistry` | class | SparkSDK | [IEngineContext.h:L90](../../SparkSDK/Include/Spark/IEngineContext.h#L90) | | +| `AssetRegistry` | class | SparkSDK | [IEngineContext.h:L91](../../SparkSDK/Include/Spark/IEngineContext.h#L91) | | | `AssetService` | class | SparkDaemon | [AssetService.h:L53](../../SparkDaemon/src/AssetService.h#L53) | | | `AssetServiceClient` | class | SparkEngine | [AssetServiceClient.h:L28](../../SparkEngine/Source/Utils/AssetServiceClient.h#L28) | | | `AssetStallConfig` | struct | SparkEngine | [AssetStallDetector.h:L53](../../SparkEngine/Source/Utils/AssetStallDetector.h#L53) | Configuration for asset stall detection | @@ -342,12 +342,12 @@ | `AudioEngine` | class | SparkEngine | [AudioEngine.h:L115](../../SparkEngine/Source/Audio/AudioEngine.h#L115) | | | `AudioEngine` | class | SparkEngine | [XAudio2AudioBackend.h:L18](../../SparkEngine/Source/Audio/XAudio2AudioBackend.h#L18) | | | `AudioEngine` | class | SparkEngine | [EngineConsoleCommands.h:L11](../../SparkEngine/Source/Core/EngineConsoleCommands.h#L11) | Registers engine-wide console commands (modules, physics, audio, save, architecture) | -| `AudioEngine` | class | SparkEngine | [EngineContext.h:L42](../../SparkEngine/Source/Core/EngineContext.h#L42) | | +| `AudioEngine` | class | SparkEngine | [EngineContext.h:L43](../../SparkEngine/Source/Core/EngineContext.h#L43) | | | `AudioEngine` | class | SparkEngine | [EngineRuntime.h:L31](../../SparkEngine/Source/Core/EngineRuntime.h#L31) | | | `AudioEngine` | class | SparkEngine | [EngineSetup.h:L22](../../SparkEngine/Source/Core/EngineSetup.h#L22) | | | `AudioEngine` | class | SparkEngine | [ECSIntegration.h:L31](../../SparkEngine/Source/Engine/ECS/ECSIntegration.h#L31) | | | `AudioEngine` | class | SparkEngine | [ECSystems.h:L73](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L73) | | -| `AudioEngine` | class | SparkSDK | [IEngineContext.h:L25](../../SparkSDK/Include/Spark/IEngineContext.h#L25) | | +| `AudioEngine` | class | SparkSDK | [IEngineContext.h:L26](../../SparkSDK/Include/Spark/IEngineContext.h#L26) | | | `AudioEngine` | class | Tests | [TestAudioEngine.cpp:L50](../../Tests/TestAudioEngine.cpp#L50) | | | `AudioExtendedSettings` | struct | SparkEngine | [EngineSettings.h:L321](../../SparkEngine/Source/Core/EngineSettings.h#L321) | | | `AudioHandleTag` | struct | SparkEngine | [OpaqueHandle.h:L79](../../SparkEngine/Source/Utils/OpaqueHandle.h#L79) | | @@ -398,7 +398,7 @@ | `Axis2DValue` | struct | SparkEngine | [InputActionSystem.h:L69](../../SparkEngine/Source/Input/InputActionSystem.h#L69) | A 2D axis value | | `AxisBinding` | struct | Tests | [TestInputSystem.cpp:L40](../../Tests/TestInputSystem.cpp#L40) | | | `AxisIntersectResult` | struct | Tests | [TestGizmoMath.cpp:L69](../../Tests/TestGizmoMath.cpp#L69) | | -| `b` | struct | SparkEngine | [SceneManager.cpp:L405](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L405) | | +| `b` | struct | SparkEngine | [SceneManager.cpp:L449](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L449) | | | `BackendState` | struct | Tests | [TestTelemetrySpool.cpp:L60](../../Tests/TestTelemetrySpool.cpp#L60) | | | `BakeLight` | struct | SparkEngine | [LightmapBaker.h:L85](../../SparkEngine/Source/Graphics/LightmapBaker.h#L85) | A light source for baking | | `BakeMesh` | struct | SparkEngine | [LightmapBaker.h:L76](../../SparkEngine/Source/Graphics/LightmapBaker.h#L76) | A mesh contributed to the bake | @@ -599,7 +599,7 @@ | `Case` | struct | SparkCrashReporter | [CrashReporterConsentTests.cpp:L385](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L385) | | | `Case` | struct | Tests | [TestCoverageScripting.cpp:L271](../../Tests/TestCoverageScripting.cpp#L271) | | | `Case` | struct | Tests | [TestEditorAssetDropWorldReal.cpp:L222](../../Tests/TestEditorAssetDropWorldReal.cpp#L222) | | -| `Case` | struct | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L260](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L260) | | +| `Case` | struct | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L261](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L261) | | | `Case` | struct | Tests | [TestModuleABI.cpp:L1189](../../Tests/TestModuleABI.cpp#L1189) | | | `Case` | struct | Tests | [TestSDK240ModuleDiagnostics.cpp:L151](../../Tests/TestSDK240ModuleDiagnostics.cpp#L151) | | | `CastState` | struct | Tests | [TestAbilitySystem.cpp:L88](../../Tests/TestAbilitySystem.cpp#L88) | | @@ -799,7 +799,7 @@ | `CompanionServiceB` | struct | Tests | [TestSparkGameFPSMirrorCompanionsReal.cpp:L305](../../Tests/TestSparkGameFPSMirrorCompanionsReal.cpp#L305) | | | `CompatibleFixtureEnvironment` | struct | Tests | [TestModuleLifecycleReal.cpp:L139](../../Tests/TestModuleLifecycleReal.cpp#L139) | | | `CompatibleModule` | class | Tests | [CompatibleModule.cpp:L33](../../Tests/Fixtures/ModuleABI/CompatibleModule.cpp#L33) | | -| `CompiledGraphRun` | struct | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L554](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L554) | | +| `CompiledGraphRun` | struct | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L597](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L597) | | | `CompiledShaderBlob` | struct | SparkEngine | [ShaderCrossCompiler.h:L71](../../SparkEngine/Source/Graphics/ShaderCrossCompiler.h#L71) | | | `CompiledVariant` | struct | SparkEngine | [ShaderVariantSystem.h:L113](../../SparkEngine/Source/Graphics/ShaderVariantSystem.h#L113) | | | `CompilerConfig` | struct | SparkShaderCompiler | [main.cpp:L62](../../SparkShaderCompiler/src/main.cpp#L62) | | @@ -818,7 +818,7 @@ | `ComponentSerializerEntry` | struct | SparkEngine | [SceneSnapshotSerializer.h:L97](../../SparkEngine/Source/Engine/Editor/SceneSnapshotSerializer.h#L97) | Type-erased serialization functions for a single component type. | | `ComponentSerializerRegistry` | class | SparkEngine | [SceneSnapshotSerializer.h:L118](../../SparkEngine/Source/Engine/Editor/SceneSnapshotSerializer.h#L118) | Registry of component serializers | | `ComponentSerializerRegistry` | class | SparkEngine | [SaveSystem.h:L174](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L174) | | -| `ComponentSerializerRegistry` | class | SparkSDK | [IEngineContext.h:L100](../../SparkSDK/Include/Spark/IEngineContext.h#L100) | | +| `ComponentSerializerRegistry` | class | SparkSDK | [IEngineContext.h:L101](../../SparkSDK/Include/Spark/IEngineContext.h#L101) | | | `CompositeBinding2D` | struct | SparkEngine | [InputActionSystem.h:L85](../../SparkEngine/Source/Input/InputActionSystem.h#L85) | Composite binding for 2D axes (e.g. WASD) | | `CompositeCommand` | class | SparkEditor | [EditorCommand.h:L78](../../SparkEditor/Source/UndoRedo/EditorCommand.h#L78) | Composite command that groups multiple commands into a single undo step | | `CompositeConstants` | struct | SparkEngine | [RTCompositor.h:L38](../../SparkEngine/Source/Graphics/HybridRT/RTCompositor.h#L38) | Constant buffer layout for RTComposite.hlsl (matches HLSL cbuffer) | @@ -853,7 +853,7 @@ | `ConditionSet` | struct | SparkEngine | [ConditionSystem.h:L95](../../SparkEngine/Source/Engine/Gameplay/ConditionSystem.h#L95) | | | `ConditionSet` | struct | Tests | [TestConditionSystem.cpp:L58](../../Tests/TestConditionSystem.cpp#L58) | | | `ConditionSystem` | class | SparkEngine | [ConditionSystem.h:L112](../../SparkEngine/Source/Engine/Gameplay/ConditionSystem.h#L112) | Universal condition evaluator used by all gameplay systems | -| `ConditionSystem` | class | SparkSDK | [IEngineContext.h:L58](../../SparkSDK/Include/Spark/IEngineContext.h#L58) | | +| `ConditionSystem` | class | SparkSDK | [IEngineContext.h:L59](../../SparkSDK/Include/Spark/IEngineContext.h#L59) | | | `ConditionSystem` | class | Tests | [TestConditionSystem.cpp:L67](../../Tests/TestConditionSystem.cpp#L67) | | | `ConeGenerator` | class | SparkEngine | [EnvironmentQuery.h:L160](../../SparkEngine/Source/Engine/AI/EnvironmentQuery.h#L160) | Generates points along a cone (arc) from agent toward a direction | | `Config` | struct | SparkEngine | [AIComponents.h:L68](../../SparkEngine/Source/Engine/ECS/Components/AIComponents.h#L68) | | @@ -912,7 +912,7 @@ | `ContextEventBusScope` | struct | Tests | [TestENG200ScriptBindingsReal.cpp:L93](../../Tests/TestENG200ScriptBindingsReal.cpp#L93) | | | `Continent` | struct | SparkEditor | [RegionMapEditorPanel.h:L60](../../SparkEditor/Source/Panels/RegionMapEditorPanel.h#L60) | | | `ContinentDef` | struct | GameModules | [TFDataTables.h:L131](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTables.h#L131) | | -| `ContinentGround` | struct | Tests | [TestTF120Travel.cpp:L101](../../Tests/TestTF120Travel.cpp#L101) | | +| `ContinentGround` | struct | Tests | [TestTF120Travel.cpp:L88](../../Tests/TestTF120Travel.cpp#L88) | | | `ContinentMeta` | struct | GameModules | [TFTravelSystem.h:L73](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L73) | | | `ContinentSelection` | struct | GameModules | [TFDataTables.cpp:L95](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTables.cpp#L95) | | | `ControlPoint` | struct | SparkEditor | [SplineEditorPanel.h:L39](../../SparkEditor/Source/Panels/SplineEditorPanel.h#L39) | | @@ -922,7 +922,7 @@ | `ConversationState` | struct | SparkEngine | [DialogueSystem.h:L178](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L178) | Runtime state of an active conversation. | | `CookLogEntry` | struct | SparkEditor | [DedicatedServerPanel.h:L194](../../SparkEditor/Source/Panels/DedicatedServerPanel.h#L194) | | | `CookOutputLock` | class | SparkAssetPipelineCore | [AssetCooker.cpp:L725](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L725) | | -| `CookPackageScenario` | class | Tests | [TestEditorCookPackageReal.cpp:L129](../../Tests/TestEditorCookPackageReal.cpp#L129) | | +| `CookPackageScenario` | class | Tests | [TestEditorCookPackageReal.cpp:L131](../../Tests/TestEditorCookPackageReal.cpp#L131) | | | `CookRecord` | struct | SparkAssetPipelineCore | [AssetCooker.h:L12](../../SparkAssetPipelineCore/include/SparkAssetPipelineCore/AssetCooker.h#L12) | | | `CookRequest` | struct | SparkAssetPipelineCore | [AssetCooker.h:L20](../../SparkAssetPipelineCore/include/SparkAssetPipelineCore/AssetCooker.h#L20) | | | `CookResult` | struct | SparkAssetPipelineCore | [AssetCooker.h:L29](../../SparkAssetPipelineCore/include/SparkAssetPipelineCore/AssetCooker.h#L29) | | @@ -934,7 +934,7 @@ | `CoroutineInfo` | struct | SparkEditor | [CoroutineDebugPanel.h:L43](../../SparkEditor/Source/Panels/CoroutineDebugPanel.h#L43) | | | `CoroutineScheduler` | class | GameModules | [Game.h:L50](../../GameModules/SparkGameFPS/Source/Game/Game.h#L50) | | | `CoroutineScheduler` | class | SparkEngine | [CoroutineScheduler.h:L65](../../SparkEngine/Source/Engine/Coroutine/CoroutineScheduler.h#L65) | Central scheduler that ticks all active coroutines each frame. | -| `CoroutineScheduler` | class | SparkSDK | [IEngineContext.h:L88](../../SparkSDK/Include/Spark/IEngineContext.h#L88) | | +| `CoroutineScheduler` | class | SparkSDK | [IEngineContext.h:L89](../../SparkSDK/Include/Spark/IEngineContext.h#L89) | | | `CountedEvent` | struct | Tests | [TestAdversarialEngine.cpp:L154](../../Tests/TestAdversarialEngine.cpp#L154) | | | `CounterFixture` | struct | Tests | [TestFixtures.cpp:L9](../../Tests/TestFixtures.cpp#L9) | | | `CountingSimulation` | class | Tests | [TestAreaSimulationHook.cpp:L27](../../Tests/TestAreaSimulationHook.cpp#L27) | | @@ -977,8 +977,8 @@ | `CrashInfo` | struct | SparkEditor | [EditorCrashHandler.h:L29](../../SparkEditor/Source/Core/EditorCrashHandler.h#L29) | Crash information structure | | `CrashManifest` | struct | SparkCrashReporter | [CrashReporterApp.h:L41](../../SparkCrashReporter/src/CrashReporterApp.h#L41) | | | `CrashModuleIdentity` | struct | SparkEngine | [CrashSymbolication.h:L29](../../SparkEngine/Source/Utils/CrashSymbolication.h#L29) | Identity of one loaded ELF module, precomputed before any crash. | -| `CrashModuleScan` | struct | SparkEngine | [CrashHandler.cpp:L1824](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1824) | | -| `CrashModuleTable` | struct | SparkEngine | [CrashHandler.cpp:L1809](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1809) | | +| `CrashModuleScan` | struct | SparkEngine | [CrashHandler.cpp:L1825](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1825) | | +| `CrashModuleTable` | struct | SparkEngine | [CrashHandler.cpp:L1810](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1810) | | | `CrashRedactionContext` | struct | SparkEngine | [CrashRedaction.h:L27](../../SparkEngine/Source/Utils/CrashRedaction.h#L27) | What a crash report must not carry off the user's machine | | `CrashReportingSettings` | struct | SparkEngine | [EngineSettings.h:L527](../../SparkEngine/Source/Core/EngineSettings.h#L527) | [CrashReporting] settings. Crash reports stay local: there is deliberately no | | `CrashSectionWriter` | class | SparkEngine | [CrashSymbolication.h:L112](../../SparkEngine/Source/Utils/CrashSymbolication.h#L112) | Fixed-buffer text writer for the signal path. | @@ -1116,7 +1116,7 @@ | `DedicatedServerProcessController` | class | SparkEditor | [DedicatedServerPanel.h:L37](../../SparkEditor/Source/Panels/DedicatedServerPanel.h#L37) | | | `DedicatedServerProcessController` | class | SparkEditor | [DedicatedServerProcessController.h:L54](../../SparkEditor/Source/Panels/DedicatedServerProcessController.h#L54) | | | `DedicatedServerProcessSnapshot` | struct | SparkEditor | [DedicatedServerProcessController.h:L45](../../SparkEditor/Source/Panels/DedicatedServerProcessController.h#L45) | | -| `defaultAction` | struct | SparkEngine | [CrashHandler.cpp:L2134](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2134) | | +| `defaultAction` | struct | SparkEngine | [CrashHandler.cpp:L2165](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2165) | | | `defaultAction` | struct | Tests | [TestPLT210ProcessPosixReal.cpp:L101](../../Tests/TestPLT210ProcessPosixReal.cpp#L101) | | | `DeferredDeletionQueue` | class | SparkEngine | [DeferredDeletionQueue.h:L35](../../SparkEngine/Source/Graphics/RHI/DeferredDeletionQueue.h#L35) | Queue that defers resource destruction by a configurable frame count. | | `DeferredEntry` | struct | SparkEngine | [DeferredDeletionQueue.h:L109](../../SparkEngine/Source/Graphics/RHI/DeferredDeletionQueue.h#L109) | Get the current internal frame counter. | @@ -1149,7 +1149,7 @@ | `DesignerScreen` | struct | SparkEditor | [UIDesignerSystem.h:L100](../../SparkEditor/Source/UIDesigner/UIDesignerSystem.h#L100) | A complete UI screen/layout | | `DesignerStyle` | struct | SparkEditor | [UIDesignerSystem.h:L87](../../SparkEditor/Source/UIDesigner/UIDesignerSystem.h#L87) | A UI style definition | | `DesignerWidget` | struct | SparkEditor | [UIDesignerSystem.h:L69](../../SparkEditor/Source/UIDesigner/UIDesignerSystem.h#L69) | A widget instance in the UI tree | -| `DestinationAuthority` | struct | Tests | [TestTF120Travel.cpp:L244](../../Tests/TestTF120Travel.cpp#L244) | | +| `DestinationAuthority` | struct | Tests | [TestTF120Travel.cpp:L231](../../Tests/TestTF120Travel.cpp#L231) | | | `DestinationLock` | class | SparkInstaller | [Installer.cpp:L51](../../SparkInstaller/src/Installer.cpp#L51) | | | `DestructibleComponent` | struct | SparkEngine | [DestructionSystem.h:L109](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L109) | ECS component for destructible entities. | | `DestructibleComponent` | struct | SparkEngine | [PlacementComponents.h:L208](../../SparkEngine/Source/Engine/ECS/Components/PlacementComponents.h#L208) | Marks an entity as destructible with fracture on damage. | @@ -1161,7 +1161,7 @@ | `DestructionSettings` | struct | Tests | [TestEngineSettingsEdgeCases.cpp:L460](../../Tests/TestEngineSettingsEdgeCases.cpp#L460) | | | `DestructionSystem` | class | GameModules | [Game.h:L46](../../GameModules/SparkGameFPS/Source/Game/Game.h#L46) | | | `DestructionSystem` | class | SparkEngine | [DestructionSystem.h:L181](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L181) | Manages destructible objects, fracturing, and debris. | -| `DestructionSystem` | class | SparkSDK | [IEngineContext.h:L98](../../SparkSDK/Include/Spark/IEngineContext.h#L98) | | +| `DestructionSystem` | class | SparkSDK | [IEngineContext.h:L99](../../SparkSDK/Include/Spark/IEngineContext.h#L99) | | | `DeterministicTimeController` | class | SparkEngine | [MovieRenderPipeline.h:L154](../../SparkEngine/Source/Engine/Rendering/MovieRenderPipeline.h#L154) | Tracks fixed-time steps locally; does not override engine delta time | | `DeviceLossCallback` | class | SparkEngine | [AudioEngine.h:L752](../../SparkEngine/Source/Audio/AudioEngine.h#L752) | | | `DiagnosticsFixture` | struct | Tests | [TestMOD390VisualScriptDiagnosticsReal.cpp:L48](../../Tests/TestMOD390VisualScriptDiagnosticsReal.cpp#L48) | | @@ -1181,7 +1181,7 @@ | `DialogueSystem` | class | GameModules | [Game.h:L45](../../GameModules/SparkGameFPS/Source/Game/Game.h#L45) | | | `DialogueSystem` | class | SparkEngine | [SparkEngineWindowsInternal.h:L29](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L29) | | | `DialogueSystem` | class | SparkEngine | [DialogueSystem.h:L196](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L196) | Manages dialogue trees and active conversations. | -| `DialogueSystem` | class | SparkSDK | [IEngineContext.h:L93](../../SparkSDK/Include/Spark/IEngineContext.h#L93) | | +| `DialogueSystem` | class | SparkSDK | [IEngineContext.h:L94](../../SparkSDK/Include/Spark/IEngineContext.h#L94) | | | `DialogueTree` | struct | GameModules | [RPGDialogueSystem.h:L67](../../GameModules/SparkGameRPG/Source/Dialogue/RPGDialogueSystem.h#L67) | A complete dialogue tree with a root node | | `DialogueTree` | class | SparkEngine | [DialogueSystem.h:L121](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L121) | A complete dialogue tree — a graph of DialogueNodes. | | `DialogueTriggerComponent` | struct | SparkEngine | [PlacementComponents.h:L265](../../SparkEngine/Source/Engine/ECS/Components/PlacementComponents.h#L265) | Marks an entity as a dialogue interaction point. | @@ -1336,8 +1336,9 @@ | `Enemy` | class | GameModules | [ProjectilePool.h:L51](../../GameModules/SparkGameFPS/Source/Projectiles/ProjectilePool.h#L51) | | | `Engine` | struct | Tests | [Test_scripting_hardening.cpp:L109](../../Tests/harden/Test_scripting_hardening.cpp#L109) | | | `EngineBootstrap` | class | SparkEngine | [EngineBootstrap.h:L91](../../SparkEngine/Source/Core/EngineBootstrap.h#L91) | | -| `EngineContext` | class | SparkEngine | [EngineContext.h:L95](../../SparkEngine/Source/Core/EngineContext.h#L95) | | +| `EngineContext` | class | SparkEngine | [EngineContext.h:L96](../../SparkEngine/Source/Core/EngineContext.h#L96) | | | `EngineContext` | class | SparkEngine | [EngineRuntime.h:L34](../../SparkEngine/Source/Core/EngineRuntime.h#L34) | | +| `EngineContext` | class | SparkEngine | [EngineSdkWeather.h:L8](../../SparkEngine/Source/Core/EngineSdkWeather.h#L8) | Context-owned implementation of the public weather command service. | | `EngineProfilingData` | struct | SparkEditor | [IntegrationTypes.h:L99](../../SparkEditor/Source/Integration/IntegrationTypes.h#L99) | Profiling data from engine | | `EngineProfilingData` | struct | SparkEditor | [SparkEngineIntegration.h:L109](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L109) | Profiling data from engine | | `EngineRuntime` | struct | SparkEngine | [EngineRuntime.h:L63](../../SparkEngine/Source/Core/EngineRuntime.h#L63) | Ownership container for engine subsystem unique_ptrs. | @@ -1345,6 +1346,7 @@ | `EngineSdkConsole` | class | SparkEngine | [EngineSdkConsole.h:L29](../../SparkEngine/Source/Core/EngineSdkConsole.h#L29) | | | `EngineSdkLogger` | class | SparkEngine | [EngineSdkLogger.h:L24](../../SparkEngine/Source/Core/EngineSdkLogger.h#L24) | | | `EngineSdkStateValidation` | class | SparkEngine | [EngineSdkStateValidation.h:L25](../../SparkEngine/Source/Core/EngineSdkStateValidation.h#L25) | | +| `EngineSdkWeather` | class | SparkEngine | [EngineSdkWeather.h:L10](../../SparkEngine/Source/Core/EngineSdkWeather.h#L10) | Context-owned implementation of the public weather command service. | | `EngineSettings` | class | SparkEngine | [EngineSettings.h:L96](../../SparkEngine/Source/Core/EngineSettings.h#L96) | | | `EngineSettings` | class | SparkEngine | [InstabilitySimulator.h:L30](../../SparkEngine/Source/Engine/Networking/InstabilitySimulator.h#L30) | | | `EngineSettings` | class | Tests | [TestEngineSettingsParser.cpp:L166](../../Tests/TestEngineSettingsParser.cpp#L166) | | @@ -1388,6 +1390,7 @@ | `EntityState` | struct | SparkEngine | [NetworkManager.h:L413](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L413) | | | `EntitySubscriptionHandle` | class | SparkEngine | [EntityEventBus.h:L56](../../SparkEngine/Source/Utils/EntityEventBus.h#L56) | RAII handle for entity-scoped subscriptions. | | `EntityTransformTrack` | class | SparkEngine | [Sequencer.h:L156](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L156) | | +| `Entry` | struct | GameModules | [TFReplicationRefresh.h:L47](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L47) | | | `Entry` | struct | GameModules | [TFTerrainModel.cpp:L45](../../GameModules/SparkGameMMOFPS/Source/World/TFTerrainModel.cpp#L45) | | | `Entry` | struct | SparkDaemon | [AssetService.h:L105](../../SparkDaemon/src/AssetService.h#L105) | | | `Entry` | struct | SparkDaemon | [ShaderService.h:L118](../../SparkDaemon/src/ShaderService.h#L118) | | @@ -1398,7 +1401,7 @@ | `Entry` | struct | SparkEngine | [ScheduledCallback.h:L176](../../SparkEngine/Source/Utils/ScheduledCallback.h#L176) | Cancel all pending callbacks. | | `Entry` | struct | Tests | [TestAdversarialEngine.cpp:L1246](../../Tests/TestAdversarialEngine.cpp#L1246) | | | `Entry` | struct | Tests | [TestScheduledCallback.cpp:L74](../../Tests/TestScheduledCallback.cpp#L74) | | -| `Entry` | struct | Tests | [TestSparkPak.cpp:L142](../../Tests/TestSparkPak.cpp#L142) | | +| `Entry` | struct | Tests | [TestSparkPak.cpp:L148](../../Tests/TestSparkPak.cpp#L148) | | | `EntryView` | struct | GameModules | [TFSocialSystem.h:L51](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L51) | | | `EnvironmentLighting` | struct | SparkEngine | [LightingSystem.h:L194](../../SparkEngine/Source/Graphics/LightingSystem.h#L194) | Environment lighting settings | | `EnvironmentSettings` | struct | SparkEditor | [SceneFileTypes.h:L1087](../../SparkEditor/Source/SceneSystem/SceneFileTypes.h#L1087) | Environment and scene settings | @@ -1433,7 +1436,7 @@ | `EventBus` | class | SparkEngine | [PhysicsSystem.h:L38](../../SparkEngine/Source/Physics/PhysicsSystem.h#L38) | | | `EventBus` | class | SparkEngine | [EventBus.h:L67](../../SparkEngine/Source/Utils/EventBus.h#L67) | | | `EventBus` | class | SparkEngine | [EventBus.h:L154](../../SparkEngine/Source/Utils/EventBus.h#L154) | Type-safe publish/subscribe event bus. | -| `EventBus` | class | SparkSDK | [IEngineContext.h:L36](../../SparkSDK/Include/Spark/IEngineContext.h#L36) | | +| `EventBus` | class | SparkSDK | [IEngineContext.h:L37](../../SparkSDK/Include/Spark/IEngineContext.h#L37) | | | `EventBus` | class | SparkServer | [ServerApplication.h:L29](../../SparkServer/src/ServerApplication.h#L29) | | | `EventBus` | class | Tests | [TestEventSystem.cpp:L19](../../Tests/TestEventSystem.cpp#L19) | | | `EventCue` | struct | SparkEngine | [Sequencer.h:L106](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L106) | | @@ -1468,7 +1471,7 @@ | `ExecutionSentinel` | class | Tests | [TestModuleVersion.cpp:L134](../../Tests/TestModuleVersion.cpp#L134) | | | `ExhibitProp` | struct | GameModules | [GameplayShowcase.cpp:L586](../../GameModules/SparkGame/Source/Core/GameplayShowcase.cpp#L586) | | | `existing` | struct | SparkDaemon | [DaemonServer.cpp:L381](../../SparkDaemon/src/DaemonServer.cpp#L381) | | -| `existing` | struct | SparkEngine | [SceneManager.cpp:L423](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L423) | | +| `existing` | struct | SparkEngine | [SceneManager.cpp:L471](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L471) | | | `existing` | struct | SparkGateway | [GatewayAreaControl.cpp:L287](../../SparkGateway/src/GatewayAreaControl.cpp#L287) | | | `Expectation` | struct | Tests | [TestShaderCompilerReal.cpp:L424](../../Tests/TestShaderCompilerReal.cpp#L424) | | | `ExpectedObj` | struct | Tests | [TestENG220ObjImportReal.cpp:L54](../../Tests/TestENG220ObjImportReal.cpp#L54) | | @@ -1499,7 +1502,7 @@ | `FakeProgression` | struct | Tests | [TestTFOnboarding.cpp:L1040](../../Tests/TestTFOnboarding.cpp#L1040) | | | `FakeProgression` | struct | Tests | [TestTFOnboarding.cpp:L1094](../../Tests/TestTFOnboarding.cpp#L1094) | | | `FakeStore` | struct | Tests | [TestTFOnboarding.cpp:L1068](../../Tests/TestTFOnboarding.cpp#L1068) | | -| `FakeWeatherPort` | class | Tests | [TestFPSWeatherPort.cpp:L10](../../Tests/TestFPSWeatherPort.cpp#L10) | | +| `FakeWeatherPort` | class | Tests | [TestFPSWeatherPort.cpp:L12](../../Tests/TestFPSWeatherPort.cpp#L12) | | | `FastNoiseLite` | class | SparkEngine | [FastNoiseLite.h:L38](../../SparkEngine/Source/Graphics/FastNoiseLite.h#L38) | Fast portable noise generator | | `FastTravelPoint` | struct | GameModules | [OWPlayerSystem.h:L54](../../GameModules/SparkGameOpenWorld/Source/Player/OWPlayerSystem.h#L54) | A fast travel destination the player has unlocked | | `FaultCase` | struct | Tests | [TestLIFE200LifecycleLoopReal.cpp:L389](../../Tests/TestLIFE200LifecycleLoopReal.cpp#L389) | | @@ -1515,7 +1518,7 @@ | `FBXImportResult` | struct | SparkEngine | [FBXImporter.h:L103](../../SparkEngine/Source/Graphics/FBXImporter.h#L103) | Complete result of an FBX import operation. | | `FBXKeyframe` | struct | SparkEngine | [FBXImporter.h:L78](../../SparkEngine/Source/Graphics/FBXImporter.h#L78) | A single animation keyframe for one bone. | | `FBXMeshData` | struct | SparkEngine | [FBXImporter.h:L59](../../SparkEngine/Source/Graphics/FBXImporter.h#L59) | Mesh geometry extracted from an FBX Geometry node. | -| `FdCloser` | struct | SparkEngine | [SceneManager.cpp:L376](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L376) | | +| `FdCloser` | struct | SparkEngine | [SceneManager.cpp:L416](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L416) | | | `FdCloser` | struct | SparkLauncher | [LauncherProcess.cpp:L519](../../SparkLauncher/src/LauncherProcess.cpp#L519) | | | `FeedbackEntry` | struct | SparkEngine | [VirtualTexture.h:L57](../../SparkEngine/Source/Graphics/VirtualTexture.h#L57) | A single entry from the GPU feedback buffer. | | `FieldBuffer` | class | Tests | [TestReplicationFields.cpp:L59](../../Tests/TestReplicationFields.cpp#L59) | | @@ -1840,11 +1843,11 @@ | `GraphicsEngine` | class | GameModules | [TFViewModel.h:L42](../../GameModules/SparkGameMMOFPS/Source/Game/TFViewModel.h#L42) | | | `GraphicsEngine` | class | GameModules | [TFRegionDecor.h:L61](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionDecor.h#L61) | | | `GraphicsEngine` | class | GameModules | [TFWeatherFx.h:L71](../../GameModules/SparkGameMMOFPS/Source/World/TFWeatherFx.h#L71) | | -| `GraphicsEngine` | class | SparkEditor | [AssetBrowserPanel.h:L16](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L16) | | +| `GraphicsEngine` | class | SparkEditor | [AssetBrowserPanel.h:L17](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L17) | | | `GraphicsEngine` | class | SparkEditor | [BasicMaterialEditorPanel.h:L29](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L29) | | | `GraphicsEngine` | class | SparkEditor | [GameViewPanel.h:L23](../../SparkEditor/Source/Panels/GameViewPanel.h#L23) | | | `GraphicsEngine` | class | SparkEditor | [SceneViewPanel.h:L24](../../SparkEditor/Source/Panels/SceneViewPanel.h#L24) | | -| `GraphicsEngine` | class | SparkEngine | [EngineContext.h:L39](../../SparkEngine/Source/Core/EngineContext.h#L39) | | +| `GraphicsEngine` | class | SparkEngine | [EngineContext.h:L40](../../SparkEngine/Source/Core/EngineContext.h#L40) | | | `GraphicsEngine` | class | SparkEngine | [EngineRuntime.h:L28](../../SparkEngine/Source/Core/EngineRuntime.h#L28) | | | `GraphicsEngine` | class | SparkEngine | [EngineSetup.h:L20](../../SparkEngine/Source/Core/EngineSetup.h#L20) | | | `GraphicsEngine` | class | SparkEngine | [IGameModule.h:L19](../../SparkEngine/Source/Core/IGameModule.h#L19) | | @@ -1860,7 +1863,7 @@ | `GraphicsEngine` | class | SparkEngine | [RenderPipeline.h:L28](../../SparkEngine/Source/Graphics/RenderPipeline.h#L28) | | | `GraphicsEngine` | class | SparkEngine | [WorldBasicRenderer.h:L15](../../SparkEngine/Source/Graphics/WorldBasicRenderer.h#L15) | | | `GraphicsEngine` | class | SparkEngine | [SceneManager.h:L83](../../SparkEngine/Source/SceneManager/SceneManager.h#L83) | | -| `GraphicsEngine` | class | SparkSDK | [IEngineContext.h:L22](../../SparkSDK/Include/Spark/IEngineContext.h#L22) | | +| `GraphicsEngine` | class | SparkSDK | [IEngineContext.h:L23](../../SparkSDK/Include/Spark/IEngineContext.h#L23) | | | `GraphicsSettings` | struct | SparkEngine | [EngineSettings.h:L113](../../SparkEngine/Source/Core/EngineSettings.h#L113) | | | `GraphicsSettings` | struct | SparkEngine | [GraphicsEngineTypes.h:L123](../../SparkEngine/Source/Graphics/GraphicsEngineTypes.h#L123) | Advanced graphics settings | | `GraphicsSettings` | struct | Tests | [TestEngineSettingsEdgeCases.cpp:L24](../../Tests/TestEngineSettingsEdgeCases.cpp#L24) | | @@ -1891,7 +1894,7 @@ | `HandleAllocator` | class | SparkEngine | [VersionedHandle.h:L65](../../SparkEngine/Source/Utils/VersionedHandle.h#L65) | Manages allocation and validation of versioned handles. | | `HandleAllocator` | class | Tests | [TestVersionedHandle.cpp:L19](../../Tests/TestVersionedHandle.cpp#L19) | | | `HandleCloser` | struct | SparkEditor | [ProjectManager.cpp:L375](../../SparkEditor/Source/Core/ProjectManager.cpp#L375) | | -| `HandleCloser` | struct | SparkEngine | [SceneManager.cpp:L227](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L227) | | +| `HandleCloser` | struct | SparkEngine | [SceneManager.cpp:L245](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L245) | | | `HandleCloser` | struct | SparkLauncher | [LauncherProcess.cpp:L468](../../SparkLauncher/src/LauncherProcess.cpp#L468) | | | `HandlerEntry` | struct | Tests | [TestCrossSystemIntegration.cpp:L154](../../Tests/TestCrossSystemIntegration.cpp#L154) | | | `HandleSet` | struct | SparkEngine | [TelemetrySpool.cpp:L70](../../SparkEngine/Source/Utils/TelemetrySpool.cpp#L70) | | @@ -1899,7 +1902,7 @@ | `HandoffRequest` | struct | SparkEngine | [AreaHandoffParticipant.h:L41](../../SparkEngine/Source/Engine/Networking/AreaHandoffParticipant.h#L41) | Immutable input delivered to a game-owned handoff participant. | | `HashGridLevelStats` | struct | SparkEngine | [NeuralRadianceCache.h:L77](../../SparkEngine/Source/Graphics/Neural/NeuralRadianceCache.h#L77) | Per-level hash grid statistics. | | `HazardInstance` | struct | GameModules | [PlatformerHazardSystem.h:L31](../../GameModules/SparkGamePlatformer/Source/Hazard/PlatformerHazardSystem.h#L31) | A single hazard instance placed in a level | -| `Header` | struct | Tests | [TestSparkPak.cpp:L36](../../Tests/TestSparkPak.cpp#L36) | | +| `Header` | struct | Tests | [TestSparkPak.cpp:L42](../../Tests/TestSparkPak.cpp#L42) | | | `HeadlessBridge` | struct | Tests | [TestProcessDrawListLinux.cpp:L45](../../Tests/TestProcessDrawListLinux.cpp#L45) | | | `HeadlessTickStats` | class | SparkEngine | [HeadlessTickStats.h:L35](../../SparkEngine/Source/Core/HeadlessTickStats.h#L35) | Fixed-size tick work-time histogram with nearest-rank percentiles. | | `HealEvent` | struct | Tests | [TestEntityEventBus.cpp:L14](../../Tests/TestEntityEventBus.cpp#L14) | | @@ -1949,7 +1952,7 @@ | `HookRegistration` | struct | Tests | [TestScriptHookManager.cpp:L58](../../Tests/TestScriptHookManager.cpp#L58) | | | `HostFootprint` | struct | Tests | [TestLIFE200ModuleReloadLoopReal.cpp:L128](../../Tests/TestLIFE200ModuleReloadLoopReal.cpp#L128) | | | `HostRegistryScope` | struct | Tests | [TestLIFE200ModuleReloadLoopReal.cpp:L89](../../Tests/TestLIFE200ModuleReloadLoopReal.cpp#L89) | | -| `HostRun` | struct | Tests | [TestEditorCookPackageReal.cpp:L122](../../Tests/TestEditorCookPackageReal.cpp#L122) | | +| `HostRun` | struct | Tests | [TestEditorCookPackageReal.cpp:L124](../../Tests/TestEditorCookPackageReal.cpp#L124) | | | `HostSceneLoadReport` | struct | SparkEngine | [HostScenePreview.h:L32](../../SparkEngine/Source/Core/HostScenePreview.h#L32) | Outcome of LoadHostScene. | | `HotReloadFixture` | struct | Tests | [TestENG200ScriptHotReloadReal.cpp:L45](../../Tests/TestENG200ScriptHotReloadReal.cpp#L45) | | | `HotReloadFixture` | struct | Tests | [TestMOD390VisualScriptHotReloadReal.cpp:L130](../../Tests/TestMOD390VisualScriptHotReloadReal.cpp#L130) | | @@ -1985,7 +1988,7 @@ | `ICommand` | class | Tests | [TestCommandHistory.cpp:L19](../../Tests/TestCommandHistory.cpp#L19) | | | `IConsole` | class | GameModules | [AdvancedConsoleCommands.h:L19](../../GameModules/SparkGameFPS/Source/Console/AdvancedConsoleCommands.h#L19) | | | `IConsole` | class | SparkSDK | [IConsole.h:L62](../../SparkSDK/Include/Spark/IConsole.h#L62) | Abstract console command registry for game modules | -| `IConsole` | class | SparkSDK | [IEngineContext.h:L79](../../SparkSDK/Include/Spark/IEngineContext.h#L79) | | +| `IConsole` | class | SparkSDK | [IEngineContext.h:L80](../../SparkSDK/Include/Spark/IEngineContext.h#L80) | | | `IContactListener` | class | SparkEngine | [JoltPhysicsInterface.h:L184](../../SparkEngine/Source/Engine/Physics/JoltPhysicsInterface.h#L184) | Interface for receiving collision callbacks | | `ICVar` | class | SparkEngine | [ConsoleVariable.h:L105](../../SparkEngine/Source/Utils/ConsoleVariable.h#L105) | | | `ICVar` | class | Tests | [TestConsoleVariables.cpp:L54](../../Tests/TestConsoleVariables.cpp#L54) | | @@ -2045,7 +2048,7 @@ | `IEngineContext` | class | GameModules | [RacingRaceFlow.h:L12](../../GameModules/SparkGameRacing/Source/Core/RacingRaceFlow.h#L12) | | | `IEngineContext` | class | GameModules | [VisualScriptDemoWorld.h:L25](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.h#L25) | | | `IEngineContext` | class | SparkEngine | [ModuleHotReload.h:L19](../../SparkEngine/Source/Core/ModuleHotReload.h#L19) | | -| `IEngineContext` | class | SparkSDK | [IEngineContext.h:L121](../../SparkSDK/Include/Spark/IEngineContext.h#L121) | | +| `IEngineContext` | class | SparkSDK | [IEngineContext.h:L122](../../SparkSDK/Include/Spark/IEngineContext.h#L122) | | | `IFPSWeatherPort` | class | GameModules | [FPSWeatherPort.h:L21](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherPort.h#L21) | | | `IFreezable` | class | SparkEngine | [FreezeSystem.h:L186](../../SparkEngine/Source/Engine/SaveSystem/FreezeSystem.h#L186) | Interface for subsystems that participate in save state serialization. | | `IGameModule` | class | SparkEngine | [IGameModule.h:L30](../../SparkEngine/Source/Core/IGameModule.h#L30) | Abstract interface for game modules loaded by the engine | @@ -2056,7 +2059,7 @@ | `IGoldenImageCapture` | class | SparkEngine | [GoldenImageTest.h:L140](../../SparkEngine/Source/Utils/GoldenImageTest.h#L140) | Abstract interface for framebuffer capture. | | `IKChain` | struct | SparkEngine | [AnimationTypes.h:L405](../../SparkEngine/Source/Engine/Animation/AnimationTypes.h#L405) | | | `IKChain` | struct | SparkEngine | [IKSolver.h:L44](../../SparkEngine/Source/Engine/Animation/IKSolver.h#L44) | | -| `ILogger` | class | SparkSDK | [IEngineContext.h:L78](../../SparkSDK/Include/Spark/IEngineContext.h#L78) | | +| `ILogger` | class | SparkSDK | [IEngineContext.h:L79](../../SparkSDK/Include/Spark/IEngineContext.h#L79) | | | `ILogger` | class | SparkSDK | [ILogger.h:L39](../../SparkSDK/Include/Spark/ILogger.h#L39) | Abstract logging interface for game modules | | `ILogSink` | class | SparkEngine | [Logger.h:L300](../../SparkEngine/Source/Utils/Logger.h#L300) | Interface for log output destinations | | `ImageComparisonResult` | struct | SparkEngine | [GoldenImageTest.h:L91](../../SparkEngine/Source/Utils/GoldenImageTest.h#L91) | Result of comparing a captured screenshot against a golden image. | @@ -2077,6 +2080,7 @@ | `ImVec4` | struct | SparkEditor | [EditorTheme.h:L15](../../SparkEditor/Source/Core/EditorTheme.h#L15) | | | `Inbound` | struct | GameModules | [MMOSessionGate.h:L66](../../GameModules/SparkGameMMO/Source/Session/MMOSessionGate.h#L66) | Submit a client command. Zero requestId assigns the next monotonically increasing ID. | | `InboundCommand` | struct | SparkEngine | [RemoteDebugSystem.h:L158](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugSystem.h#L158) | | +| `IndexedNode` | struct | SparkEngine | [VisualScriptEmitter.h:L149](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L149) | | | `INetworkRuntime` | class | SparkEngine | [INetworkRuntime.h:L19](../../SparkEngine/Source/Engine/Networking/INetworkRuntime.h#L19) | DedicatedServer-facing networking runtime abstraction. | | `INetworkService` | class | SparkSDK | [ServiceInterfaces.h:L15](../../SparkSDK/Include/Spark/ServiceInterfaces.h#L15) | Thin runtime interface for networking lifecycle orchestration. | | `info` | struct | SparkAssetPipelineCore | [AssetCooker.cpp:L449](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L449) | | @@ -2090,9 +2094,9 @@ | `info` | struct | SparkEngine | [VirtualFileSystem.cpp:L307](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L307) | | | `info` | struct | SparkEngine | [CrashArtifactDirectory.h:L293](../../SparkEngine/Source/Utils/CrashArtifactDirectory.h#L293) | | | `info` | struct | SparkEngine | [CrashArtifactRetention.h:L183](../../SparkEngine/Source/Utils/CrashArtifactRetention.h#L183) | | -| `info` | struct | SparkEngine | [CrashHandler.cpp:L191](../../SparkEngine/Source/Utils/CrashHandler.cpp#L191) | | -| `info` | struct | SparkEngine | [CrashHandler.cpp:L353](../../SparkEngine/Source/Utils/CrashHandler.cpp#L353) | | -| `info` | struct | SparkEngine | [CrashHandler.cpp:L418](../../SparkEngine/Source/Utils/CrashHandler.cpp#L418) | | +| `info` | struct | SparkEngine | [CrashHandler.cpp:L192](../../SparkEngine/Source/Utils/CrashHandler.cpp#L192) | | +| `info` | struct | SparkEngine | [CrashHandler.cpp:L354](../../SparkEngine/Source/Utils/CrashHandler.cpp#L354) | | +| `info` | struct | SparkEngine | [CrashHandler.cpp:L419](../../SparkEngine/Source/Utils/CrashHandler.cpp#L419) | | | `info` | struct | SparkEngine | [SaveFileDurability.cpp:L114](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L114) | | | `info` | struct | SparkGateway | [GatewaySecurity.cpp:L310](../../SparkGateway/src/GatewaySecurity.cpp#L310) | | | `info` | struct | SparkInstaller | [Installer.cpp:L72](../../SparkInstaller/src/Installer.cpp#L72) | | @@ -2127,16 +2131,16 @@ | `InputManager` | class | GameModules | [FPSArenaAutopilot.h:L37](../../GameModules/SparkGameFPS/Source/Game/FPSArenaAutopilot.h#L37) | | | `InputManager` | class | GameModules | [Game.h:L55](../../GameModules/SparkGameFPS/Source/Game/Game.h#L55) | | | `InputManager` | class | GameModules | [VehicleSystem.h:L32](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L32) | | -| `InputManager` | class | SparkEngine | [EngineContext.h:L40](../../SparkEngine/Source/Core/EngineContext.h#L40) | | +| `InputManager` | class | SparkEngine | [EngineContext.h:L41](../../SparkEngine/Source/Core/EngineContext.h#L41) | | | `InputManager` | class | SparkEngine | [EngineRuntime.h:L29](../../SparkEngine/Source/Core/EngineRuntime.h#L29) | | | `InputManager` | class | SparkEngine | [IGameModule.h:L20](../../SparkEngine/Source/Core/IGameModule.h#L20) | | | `InputManager` | class | SparkEngine | [SparkEngine.h:L25](../../SparkEngine/Source/Core/SparkEngine.h#L25) | | | `InputManager` | class | SparkEngine | [InputManager.h:L49](../../SparkEngine/Source/Input/InputManager.h#L49) | | | `InputManager` | class | SparkEngine | [SceneManager.h:L84](../../SparkEngine/Source/SceneManager/SceneManager.h#L84) | | -| `InputManager` | class | SparkSDK | [IEngineContext.h:L23](../../SparkSDK/Include/Spark/IEngineContext.h#L23) | | -| `InputMetrics` | struct | SparkEngine | [InputManager.h:L273](../../SparkEngine/Source/Input/InputManager.h#L273) | Input metrics structure for console integration | +| `InputManager` | class | SparkSDK | [IEngineContext.h:L24](../../SparkSDK/Include/Spark/IEngineContext.h#L24) | | +| `InputMetrics` | struct | SparkEngine | [InputManager.h:L280](../../SparkEngine/Source/Input/InputManager.h#L280) | Input metrics structure for console integration | | `InputPreset` | struct | SparkEngine | [InputBindings.h:L97](../../SparkEngine/Source/Input/InputBindings.h#L97) | A named preset containing a full set of input bindings. | -| `InputSettings` | struct | SparkEngine | [InputManager.h:L293](../../SparkEngine/Source/Input/InputManager.h#L293) | Input settings structure for console control | +| `InputSettings` | struct | SparkEngine | [InputManager.h:L300](../../SparkEngine/Source/Input/InputManager.h#L300) | Input settings structure for console control | | `InputState` | struct | Tests | [TestServerMockClient.cpp:L404](../../Tests/TestServerMockClient.cpp#L404) | | | `InspectorPanel` | class | SparkEditor | [InspectorPanel.h:L41](../../SparkEditor/Source/Panels/InspectorPanel.h#L41) | Inspector panel | | `InspectorPendingWorldEdit` | class | SparkEditor | [InspectorPendingWorldEdit.h:L26](../../SparkEditor/Source/Panels/InspectorPendingWorldEdit.h#L26) | | @@ -2150,7 +2154,7 @@ | `InstanceData` | struct | Tests | [TestInstanceManager.cpp:L46](../../Tests/TestInstanceManager.cpp#L46) | | | `InstanceLockout` | struct | SparkEngine | [InstanceManager.h:L156](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L156) | Lockout tracking -- prevents re-running cleared instances | | `InstanceManager` | class | SparkEngine | [InstanceManager.h:L179](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L179) | Manages creation, lifecycle, and cleanup of instanced content | -| `InstanceManager` | class | SparkSDK | [IEngineContext.h:L59](../../SparkSDK/Include/Spark/IEngineContext.h#L59) | | +| `InstanceManager` | class | SparkSDK | [IEngineContext.h:L60](../../SparkSDK/Include/Spark/IEngineContext.h#L60) | | | `InstanceManager` | class | Tests | [TestInstanceManager.cpp:L62](../../Tests/TestInstanceManager.cpp#L62) | | | `InstanceTemplate` | struct | SparkEngine | [InstanceManager.h:L119](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L119) | Blueprint for an instance type (dungeon, raid, arena, etc.) | | `InstanceTemplate` | struct | Tests | [TestInstanceManager.cpp:L37](../../Tests/TestInstanceManager.cpp#L37) | | @@ -2173,7 +2177,7 @@ | `InvalidateAssetRequest` | struct | SparkEngine | [AssetServiceProtocol.h:L75](../../SparkEngine/Source/Utils/AssetServiceProtocol.h#L75) | | | `InvalidateAssetResponse` | struct | SparkEngine | [AssetServiceProtocol.h:L80](../../SparkEngine/Source/Utils/AssetServiceProtocol.h#L80) | | | `InvalidStateDetector` | class | SparkEngine | [InvalidStateDetector.h:L96](../../SparkEngine/Source/Utils/InvalidStateDetector.h#L96) | Singleton runtime detector for impossible ECS state combinations. | -| `InvalidStateDetector` | class | SparkSDK | [IEngineContext.h:L99](../../SparkSDK/Include/Spark/IEngineContext.h#L99) | | +| `InvalidStateDetector` | class | SparkSDK | [IEngineContext.h:L100](../../SparkSDK/Include/Spark/IEngineContext.h#L100) | | | `InvalidStateDetector` | class | SparkSDK | [ModuleDllMain.h:L54](../../SparkSDK/Include/Spark/ModuleDllMain.h#L54) | | | `InvalidStateDetectorConfig` | struct | SparkEngine | [InvalidStateDetector.h:L66](../../SparkEngine/Source/Utils/InvalidStateDetector.h#L66) | | | `InvalidStateDetectorStatus` | struct | SparkEngine | [InvalidStateDetector.h:L75](../../SparkEngine/Source/Utils/InvalidStateDetector.h#L75) | | @@ -2244,7 +2248,7 @@ | `ISlangModule` | class | SparkEngine | [SlangShaderInterface.h:L238](../../SparkEngine/Source/Graphics/SlangShaderInterface.h#L238) | Interface for a compiled Slang module containing one or more entry points | | `ISlangSession` | class | SparkEngine | [SlangShaderInterface.h:L268](../../SparkEngine/Source/Graphics/SlangShaderInterface.h#L268) | Abstract session interface for Slang shader compilation | | `IsolatedProjectManager` | class | Tests | [ScopedEditorProfile.h:L16](../../Tests/Fixtures/ScopedEditorProfile.h#L16) | | -| `IStateValidation` | class | SparkSDK | [IEngineContext.h:L80](../../SparkSDK/Include/Spark/IEngineContext.h#L80) | | +| `IStateValidation` | class | SparkSDK | [IEngineContext.h:L81](../../SparkSDK/Include/Spark/IEngineContext.h#L81) | | | `IStateValidation` | class | SparkSDK | [IStateValidation.h:L93](../../SparkSDK/Include/Spark/IStateValidation.h#L93) | Abstract registry of ECS state-invariant rules for game modules | | `ISystem` | class | SparkEngine | [ECSystemTypes.h:L67](../../SparkEngine/Source/Engine/ECS/Systems/ECSystemTypes.h#L67) | | | `ISystem` | class | Tests | [TestECSystemOrdering.cpp:L69](../../Tests/TestECSystemOrdering.cpp#L69) | | @@ -2272,6 +2276,8 @@ | `ITransport` | class | SparkEngine | [ITransport.h:L31](../../SparkEngine/Source/Engine/Networking/ITransport.h#L31) | Abstract transport interface for sending and receiving raw packets. | | `IUndoCommand` | class | Tests | [TestUndoRedoManager.cpp:L22](../../Tests/TestUndoRedoManager.cpp#L22) | | | `IUnknown` | struct | SparkEngine | [PlatformD3DStubs.h:L33](../../SparkEngine/Source/Core/PlatformD3DStubs.h#L33) | | +| `IWeatherService` | class | GameModules | [EngineWeatherAdapter.h:L7](../../GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.h#L7) | | +| `IWeatherService` | class | SparkSDK | [IWeatherService.h:L26](../../SparkSDK/Include/Spark/IWeatherService.h#L26) | | | `IXAudio2` | struct | SparkEngine | [PlatformAudioStubs.h:L154](../../SparkEngine/Source/Core/PlatformAudioStubs.h#L154) | | | `IXAudio2MasteringVoice` | struct | SparkEngine | [PlatformAudioStubs.h:L107](../../SparkEngine/Source/Core/PlatformAudioStubs.h#L107) | | | `IXAudio2SourceVoice` | struct | SparkEngine | [PlatformAudioStubs.h:L74](../../SparkEngine/Source/Core/PlatformAudioStubs.h#L74) | | @@ -2302,7 +2308,7 @@ | `KillfeedEntry` | struct | GameModules | [TFHUD.h:L105](../../GameModules/SparkGameMMOFPS/Source/UI/TFHUD.h#L105) | | | `KillRecord` | struct | GameModules | [GameMechanics.h:L79](../../GameModules/SparkGameFPS/Source/Game/GameMechanics.h#L79) | Kill/death tracking entry | | `KillTrackerScore` | struct | GameModules | [GameMechanics.h:L92](../../GameModules/SparkGameFPS/Source/Game/GameMechanics.h#L92) | Player score tracking | -| `KitPlacement` | struct | GameModules | [GameConsoleOps.cpp:L880](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L880) | | +| `KitPlacement` | struct | GameModules | [GameConsoleOps.cpp:L888](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L888) | | | `KitPlacement` | struct | GameModules | [RTSDemoPresentation.cpp:L46](../../GameModules/SparkGameRTS/Source/Demo/RTSDemoPresentation.cpp#L46) | | | `KitPlacement` | struct | GameModules | [VisualScriptDemoWorld.cpp:L376](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.cpp#L376) | | | `KitProp` | struct | GameModules | [ARPGDungeonSystem.cpp:L65](../../GameModules/SparkGameARPG/Source/Dungeon/ARPGDungeonSystem.cpp#L65) | | @@ -2430,7 +2436,7 @@ | `LocalFileCache` | class | SparkEngine | [SceneManager.h:L88](../../SparkEngine/Source/SceneManager/SceneManager.h#L88) | | | `LocalFileCache` | class | SparkEngine | [ConfigParser.h:L55](../../SparkEngine/Source/Utils/ConfigParser.h#L55) | | | `LocalFileCache` | class | SparkEngine | [LocalFileCache.h:L69](../../SparkEngine/Source/Utils/LocalFileCache.h#L69) | In-memory file cache with LRU eviction | -| `LocalFileCache` | class | SparkSDK | [IEngineContext.h:L89](../../SparkSDK/Include/Spark/IEngineContext.h#L89) | | +| `LocalFileCache` | class | SparkSDK | [IEngineContext.h:L90](../../SparkSDK/Include/Spark/IEngineContext.h#L90) | | | `LocalFileProvider` | class | SparkEngine | [VirtualFileSystem.h:L125](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L125) | Filesystem-backed resource provider. | | `LocalFileTelemetryBackend` | class | SparkEngine | [Telemetry.h:L152](../../SparkEngine/Source/Utils/Telemetry.h#L152) | Writes telemetry events to JSON files on disk. | | `LocalFixtureAuthenticator` | class | SparkGateway | [GatewayLocalAdapters.h:L54](../../SparkGateway/src/GatewayLocalAdapters.h#L54) | | @@ -2441,7 +2447,7 @@ | `LocalizationSettings` | struct | SparkEngine | [EngineSettings.h:L769](../../SparkEngine/Source/Core/EngineSettings.h#L769) | | | `LocalizationSystem` | class | GameModules | [ShowcaseLocalization.h:L20](../../GameModules/SparkGame/Source/Core/ShowcaseLocalization.h#L20) | | | `LocalizationSystem` | class | SparkEngine | [LocalizationSystem.h:L108](../../SparkEngine/Source/Engine/Localization/LocalizationSystem.h#L108) | Central localization manager — singleton accessible via Get(). | -| `LocalizationSystem` | class | SparkSDK | [IEngineContext.h:L96](../../SparkSDK/Include/Spark/IEngineContext.h#L96) | | +| `LocalizationSystem` | class | SparkSDK | [IEngineContext.h:L97](../../SparkSDK/Include/Spark/IEngineContext.h#L97) | | | `LocalizedString` | struct | SparkEditor | [LocalizationPanel.h:L35](../../SparkEditor/Source/Panels/LocalizationPanel.h#L35) | | | `LocalSquadView` | struct | GameModules | [TFSquadSystem.h:L157](../../GameModules/SparkGameMMOFPS/Source/Game/TFSquadSystem.h#L157) | | | `LocalStack` | struct | Tests | [TestOnlineServicesLocalStack.cpp:L89](../../Tests/TestOnlineServicesLocalStack.cpp#L89) | | @@ -2517,6 +2523,7 @@ | `MaterialCBSlot` | struct | SparkEngine | [PersistentMaterialCB.h:L35](../../SparkEngine/Source/Graphics/PersistentMaterialCB.h#L35) | | | `MaterialChangeReactiveSystem` | class | SparkEngine | [ReactiveSystem.h:L184](../../SparkEngine/Source/Engine/ECS/ReactiveSystem.h#L184) | Concrete reactive system for MeshRenderer material changes. | | `MaterialConstants` | struct | SparkEngine | [MaterialSystem.h:L40](../../SparkEngine/Source/Graphics/MaterialSystem.h#L40) | GPU-aligned constant buffer matching HLSL material layout | +| `MaterialDefinition` | struct | SparkEditor | [MaterialEditorMaterialParser.h:L10](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.h#L10) | Shared material schema and production text-parser entry for editor files and fuzzing. | | `MaterialDefinition` | struct | SparkEditor | [MaterialEditorPanel.h:L129](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L129) | Complete material definition. | | `MaterialDefinition` | struct | SparkEngine | [MaterialDefinition.h:L150](../../SparkEngine/Source/Graphics/MaterialDefinition.h#L150) | A complete declarative material definition. | | `MaterialDefinitionRegistry` | class | SparkEngine | [MaterialDefinition.h:L475](../../SparkEngine/Source/Graphics/MaterialDefinition.h#L475) | Registry of material definitions, keyed by name. | @@ -2550,6 +2557,7 @@ | `MaterialTexture` | struct | Tests | [TestMaterialSystemValidation.cpp:L83](../../Tests/TestMaterialSystemValidation.cpp#L83) | | | `MaterialTextureValidator` | class | SparkEngine | [AssetValidator.h:L54](../../SparkEngine/Source/Core/AssetValidator.h#L54) | | | `MaterialValues` | struct | Tests | [TestRHI210D3D11SceneGoldenReal.cpp:L91](../../Tests/TestRHI210D3D11SceneGoldenReal.cpp#L91) | | +| `MaterialWorkingDirectoryGuard` | class | Tests | [TestEditorSubsystemsReal.cpp:L71](../../Tests/TestEditorSubsystemsReal.cpp#L71) | | | `MatHandle` | struct | Tests | [TestExtendedSystems.cpp:L769](../../Tests/TestExtendedSystems.cpp#L769) | | | `MathUtils` | class | SparkEngine | [MathUtils.h:L68](../../SparkEngine/Source/Utils/MathUtils.h#L68) | | | `MathUtilsExtended` | class | SparkEngine | [MathUtilsExtended.h:L46](../../SparkEngine/Source/Utils/MathUtilsExtended.h#L46) | | @@ -2611,7 +2619,7 @@ | `Meta` | struct | GameModules | [TFPlayerMeta.h:L85](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFPlayerMeta.h#L85) | | | `metadata` | struct | SparkDaemon | [OrchestratorIdentity.cpp:L156](../../SparkDaemon/src/OrchestratorIdentity.cpp#L156) | | | `metadata` | struct | SparkDaemon | [OrchestratorIdentity.cpp:L180](../../SparkDaemon/src/OrchestratorIdentity.cpp#L180) | | -| `metadata` | struct | SparkEngine | [CrashHandler.cpp:L2326](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2326) | | +| `metadata` | struct | SparkEngine | [CrashHandler.cpp:L2364](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2364) | | | `MetalArgumentBuffer` | class | SparkEngine | [MetalDevice.h:L293](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L293) | Wraps a Metal argument buffer for bindless resource binding. | | `MetalBuffer` | class | SparkEngine | [MetalDevice.h:L132](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L132) | | | `MetalCommandList` | class | SparkEngine | [MetalDevice.h:L354](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L354) | | @@ -2721,12 +2729,13 @@ | `ModelAreaAssetLoader` | class | Tests | [TestAreaAssetLoader.cpp:L50](../../Tests/TestAreaAssetLoader.cpp#L50) | | | `ModelObject` | class | GameModules | [ModelObject.h:L20](../../GameModules/SparkGameFPS/Source/Game/ModelObject.h#L20) | GameObject that can load and render .obj model files | | `ModelVertex` | struct | SparkEngine | [ModelVertex.h:L43](../../SparkEngine/Source/Game/ModelVertex.h#L43) | | +| `ModifierKeys` | struct | Tests | [TestInputFrameEdgesReal.cpp:L173](../../Tests/TestInputFrameEdgesReal.cpp#L173) | | | `ModInfo` | struct | SparkEngine | [ModSystem.h:L42](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L42) | Metadata for a single mod. | | `ModManifest` | struct | Tests | [TestModSystem.cpp:L54](../../Tests/TestModSystem.cpp#L54) | | | `ModsRootReader` | class | SparkEngine | [ModSystem.cpp:L72](../../SparkEngine/Source/Engine/Modding/ModSystem.cpp#L72) | | | `ModSystem` | class | SparkEngine | [SparkEngineWindowsInternal.h:L30](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L30) | | | `ModSystem` | class | SparkEngine | [ModSystem.h:L78](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L78) | Discovers, loads, and manages game modifications. | -| `ModSystem` | class | SparkSDK | [IEngineContext.h:L94](../../SparkSDK/Include/Spark/IEngineContext.h#L94) | | +| `ModSystem` | class | SparkSDK | [IEngineContext.h:L95](../../SparkSDK/Include/Spark/IEngineContext.h#L95) | | | `ModuleChangeEvent` | struct | SparkEngine | [ModuleHotReload.h:L33](../../SparkEngine/Source/Core/ModuleHotReload.h#L33) | | | `ModuleCompatibilityMismatch` | struct | SparkSDK | [ModuleABI.h:L212](../../SparkSDK/Include/Spark/ModuleABI.h#L212) | The descriptor field a failed check compared, as both sides see it. | | `ModuleContract` | struct | Tests | [TestModuleABI.cpp:L692](../../Tests/TestModuleABI.cpp#L692) | | @@ -2783,7 +2792,7 @@ | `MultipleRenderTargets` | class | SparkEngine | [RenderTarget.h:L183](../../SparkEngine/Source/Graphics/RenderTarget.h#L183) | Multiple render targets (MRT) group | | `MusicManager` | class | GameModules | [Game.h:L49](../../GameModules/SparkGameFPS/Source/Game/Game.h#L49) | | | `MusicManager` | class | SparkEngine | [MusicManager.h:L221](../../SparkEngine/Source/Audio/MusicManager.h#L221) | | -| `MusicManager` | class | SparkSDK | [IEngineContext.h:L74](../../SparkSDK/Include/Spark/IEngineContext.h#L74) | | +| `MusicManager` | class | SparkSDK | [IEngineContext.h:L75](../../SparkSDK/Include/Spark/IEngineContext.h#L75) | | | `MusicOcclusionResult` | struct | SparkEngine | [MusicManager.h:L173](../../SparkEngine/Source/Audio/MusicManager.h#L173) | Simplified occlusion result for music system. | | `MusicReverbZone` | struct | SparkEngine | [MusicManager.h:L190](../../SparkEngine/Source/Audio/MusicManager.h#L190) | Music-specific reverb zone with inline parameters. | | `MusicTrack` | struct | SparkEngine | [MusicManager.h:L102](../../SparkEngine/Source/Audio/MusicManager.h#L102) | | @@ -2853,7 +2862,7 @@ | `NetworkIdentityData` | struct | SparkEditor | [SceneFileTypes.h:L523](../../SparkEditor/Source/SceneSystem/SceneFileTypes.h#L523) | Network identity scene data | | `NetworkInterpolationBuffer` | class | SparkEngine | [NetworkInterpolation.h:L55](../../SparkEngine/Source/Engine/Networking/NetworkInterpolation.h#L55) | | | `NetworkManager` | class | SparkEngine | [NetworkManager.h:L522](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L522) | | -| `NetworkManager` | class | SparkSDK | [IEngineContext.h:L84](../../SparkSDK/Include/Spark/IEngineContext.h#L84) | | +| `NetworkManager` | class | SparkSDK | [IEngineContext.h:L85](../../SparkSDK/Include/Spark/IEngineContext.h#L85) | | | `NetworkManager` | class | Tests | [TestNetworkManagerOrchestration.cpp:L99](../../Tests/TestNetworkManagerOrchestration.cpp#L99) | | | `NetworkManagerClientIdTestAccess` | struct | Tests | [TestNetworkManagerIntegration.cpp:L38](../../Tests/TestNetworkManagerIntegration.cpp#L38) | | | `NetworkManagerEndpointLifecycleTestAccess` | struct | Tests | [TestNetworkManagerEdgeCases.cpp:L31](../../Tests/TestNetworkManagerEdgeCases.cpp#L31) | | @@ -2898,6 +2907,7 @@ | `Node2D` | class | SparkEngine | [SceneGraph2D.h:L92](../../SparkEngine/Source/Engine/2D/SceneGraph2D.h#L92) | Base node in the 2D scene graph | | `NodeInput` | struct | Tests | [TestShaderGraphCompiler.cpp:L27](../../Tests/TestShaderGraphCompiler.cpp#L27) | | | `NodeLock` | struct | SparkEditor | [CollaborativeEditSession.h:L182](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L182) | Lock information for a scene node | +| `NodeTopology` | struct | SparkEngine | [VisualScriptEmitter.h:L154](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L154) | | | `NodeTypeEntry` | struct | SparkEngine | [VisualScriptNodePalette.cpp:L15](../../SparkEngine/Source/Engine/Scripting/VisualScriptNodePalette.cpp#L15) | | | `NodeUI` | struct | SparkEditor | [VisualScriptPanel.h:L103](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L103) | | | `NoiseGraph` | class | SparkEngine | [FastNoise2SIMD.h:L709](../../SparkEngine/Source/Graphics/FastNoise2SIMD.h#L709) | Composable noise node graph with batch evaluation | @@ -2996,7 +3006,7 @@ | `OriginRebasingStats` | struct | SparkEngine | [WorldOriginSystem.h:L63](../../SparkEngine/Source/Engine/World/WorldOriginSystem.h#L63) | Statistics about origin rebasing | | `osInfo` | struct | SparkEditor | [EditorCrashHandler.cpp:L752](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L752) | | | `OtherDerived` | struct | Tests | [TestSafetyCoreUtils.cpp:L148](../../Tests/TestSafetyCoreUtils.cpp#L148) | | -| `ours` | struct | SparkEngine | [SceneManager.cpp:L464](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L464) | | +| `ours` | struct | SparkEngine | [SceneManager.cpp:L520](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L520) | | | `OverlayStat` | struct | SparkEngine | [DebugOverlay.h:L78](../../SparkEngine/Source/Utils/DebugOverlay.h#L78) | Real-time stat entry for the overlay | | `OWDynamicEventSystem` | class | GameModules | [SparkGameOpenWorld.h:L31](../../GameModules/SparkGameOpenWorld/Source/Core/SparkGameOpenWorld.h#L31) | | | `OWDynamicEventSystem` | class | GameModules | [OWDynamicEventSystem.h:L69](../../GameModules/SparkGameOpenWorld/Source/Events/OWDynamicEventSystem.h#L69) | Dynamic world event spawning and lifecycle management | @@ -3010,6 +3020,7 @@ | `OWGatheringSystem` | class | GameModules | [OWGatheringSystem.h:L102](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.h#L102) | Resource gathering and crafting system | | `OWGatheringSystem` | class | GameModules | [OWPlayerController.h:L23](../../GameModules/SparkGameOpenWorld/Source/Player/OWPlayerController.h#L23) | | | `OwnedEditorProcess` | class | SparkEditor | [EditorProcessLaunch.h:L117](../../SparkEditor/Source/Utils/EditorProcessLaunch.h#L117) | Single-process-tree RAII owner for editor-launched children. | +| `OwnedSceneDirectory` | class | Tests | [TestFPSGameCameraReloadReal.cpp:L53](../../Tests/TestFPSGameCameraReloadReal.cpp#L53) | | | `OwnerOnlySecurity` | class | SparkDaemon | [DaemonServer.cpp:L117](../../SparkDaemon/src/DaemonServer.cpp#L117) | | | `OWPlayerController` | class | GameModules | [SparkGameOpenWorld.h:L26](../../GameModules/SparkGameOpenWorld/Source/Core/SparkGameOpenWorld.h#L26) | | | `OWPlayerController` | class | GameModules | [OWPlayerController.h:L50](../../GameModules/SparkGameOpenWorld/Source/Player/OWPlayerController.h#L50) | Player movement and interaction controller for the open world | @@ -3110,7 +3121,8 @@ | `PawnInfo` | struct | GameModules | [TFFootsteps.h:L53](../../GameModules/SparkGameMMOFPS/Source/Game/TFFootsteps.h#L53) | | | `PawnInfo` | struct | GameModules | [TFPlayerSystem.h:L27](../../GameModules/SparkGameMMOFPS/Source/Game/TFPlayerSystem.h#L27) | | | `PawnInfo` | struct | GameModules | [TFWeaponSystem.h:L38](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L38) | | -| `PawnInfo` | struct | GameModules | [TFReplication.h:L37](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L37) | | +| `PawnInfo` | struct | GameModules | [TFReplication.h:L39](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L39) | | +| `PawnState` | struct | Tests | [TestTFReplicationRefresh.cpp:L12](../../Tests/TestTFReplicationRefresh.cpp#L12) | | | `PawnView` | struct | GameModules | [TFHUD.h:L94](../../GameModules/SparkGameMMOFPS/Source/UI/TFHUD.h#L94) | | | `PBRProperties` | struct | SparkEngine | [MaterialSystem.h:L135](../../SparkEngine/Source/Graphics/MaterialSystem.h#L135) | PBR material properties | | `PBRProperties` | struct | Tests | [TestMaterialSystemValidation.cpp:L58](../../Tests/TestMaterialSystemValidation.cpp#L58) | | @@ -3232,7 +3244,7 @@ | `PhysicsSystem` | class | GameModules | [RacingTrackSystem.h:L24](../../GameModules/SparkGameRacing/Source/Track/RacingTrackSystem.h#L24) | | | `PhysicsSystem` | class | GameModules | [RacingVehicleSystem.h:L40](../../GameModules/SparkGameRacing/Source/Vehicle/RacingVehicleSystem.h#L40) | | | `PhysicsSystem` | class | SparkEngine | [AudioMixer.h:L41](../../SparkEngine/Source/Audio/AudioMixer.h#L41) | | -| `PhysicsSystem` | class | SparkEngine | [EngineContext.h:L43](../../SparkEngine/Source/Core/EngineContext.h#L43) | | +| `PhysicsSystem` | class | SparkEngine | [EngineContext.h:L44](../../SparkEngine/Source/Core/EngineContext.h#L44) | | | `PhysicsSystem` | class | SparkEngine | [EngineRuntime.h:L33](../../SparkEngine/Source/Core/EngineRuntime.h#L33) | | | `PhysicsSystem` | class | SparkEngine | [EngineSetup.h:L21](../../SparkEngine/Source/Core/EngineSetup.h#L21) | | | `PhysicsSystem` | class | SparkEngine | [ECSIntegration.h:L30](../../SparkEngine/Source/Engine/ECS/ECSIntegration.h#L30) | | @@ -3246,7 +3258,7 @@ | `PhysicsSystem` | class | SparkEngine | [RagdollSystem.h:L28](../../SparkEngine/Source/Physics/RagdollSystem.h#L28) | | | `PhysicsSystem` | class | SparkEngine | [SoftBodyPhysics.h:L27](../../SparkEngine/Source/Physics/SoftBodyPhysics.h#L27) | | | `PhysicsSystem` | class | SparkEngine | [VehiclePhysics.h:L26](../../SparkEngine/Source/Physics/VehiclePhysics.h#L26) | | -| `PhysicsSystem` | class | SparkSDK | [IEngineContext.h:L26](../../SparkSDK/Include/Spark/IEngineContext.h#L26) | | +| `PhysicsSystem` | class | SparkSDK | [IEngineContext.h:L27](../../SparkSDK/Include/Spark/IEngineContext.h#L27) | | | `PhysicsSystem` | class | Tests | [TestPhysicsSystem.cpp:L97](../../Tests/TestPhysicsSystem.cpp#L97) | | | `PhysicsUpdateSystem` | class | SparkEngine | [ECSystems.h:L182](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L182) | | | `PhysicsUpdateSystem` | class | Tests | [TestECSystemOrdering.cpp:L84](../../Tests/TestECSystemOrdering.cpp#L84) | | @@ -3260,7 +3272,7 @@ | `PIEServerConfig` | struct | SparkEditor | [DedicatedServerPanel.h:L85](../../SparkEditor/Source/Panels/DedicatedServerPanel.h#L85) | | | `PinDescriptor` | struct | Tests | [TestShaderGraphCompiler.cpp:L211](../../Tests/TestShaderGraphCompiler.cpp#L211) | | | `PinnedDirectory` | struct | SparkCrashReporter | [CrashReporterApp.cpp:L741](../../SparkCrashReporter/src/CrashReporterApp.cpp#L741) | | -| `PinnedFile` | struct | SparkEngine | [CrashHandler.cpp:L265](../../SparkEngine/Source/Utils/CrashHandler.cpp#L265) | | +| `PinnedFile` | struct | SparkEngine | [CrashHandler.cpp:L266](../../SparkEngine/Source/Utils/CrashHandler.cpp#L266) | | | `Pipeline` | struct | Tests | [TestRHI225D3D12ParityReal.cpp:L375](../../Tests/TestRHI225D3D12ParityReal.cpp#L375) | | | `PipelineCacheMetrics` | struct | SparkEngine | [PipelineStateCache.h:L103](../../SparkEngine/Source/Graphics/PipelineStateCache.h#L103) | Cache metrics for profiling state object reuse. | | `PipelineCallbacks` | struct | SparkEngine | [RenderGraphBuilder.h:L176](../../SparkEngine/Source/Graphics/RenderGraph/RenderGraphBuilder.h#L176) | User-supplied rendering callbacks for each standard pass. | @@ -3276,7 +3288,7 @@ | `PixelPerfectComponent` | struct | SparkEngine | [Sprite2DComponents.h:L493](../../SparkEngine/Source/Engine/ECS/Components/Sprite2DComponents.h#L493) | | | `PixelPerfectData` | struct | SparkEditor | [SceneFileTypes.h:L408](../../SparkEditor/Source/SceneSystem/SceneFileTypes.h#L408) | Pixel-perfect rendering scene data | | `PixelShaderResource` | class | SparkEngine | [Shader.h:L254](../../SparkEngine/Source/Graphics/Shader.h#L254) | Pixel shader resource | -| `placed` | struct | SparkEngine | [SceneManager.cpp:L463](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L463) | | +| `placed` | struct | SparkEngine | [SceneManager.cpp:L519](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L519) | | | `PlacementBrush` | struct | SparkEditor | [ObjectPlacementPanel.h:L40](../../SparkEditor/Source/Panels/ObjectPlacementPanel.h#L40) | | | `PlacementRequest` | struct | SparkGateway | [GatewayCoordinator.h:L43](../../SparkGateway/src/GatewayCoordinator.h#L43) | | | `Plain` | struct | Tests | [TestTypeTraits.cpp:L72](../../Tests/TestTypeTraits.cpp#L72) | | @@ -3439,7 +3451,7 @@ | `PrefabScratch` | class | Tests | [TestPrefabPersistence.cpp:L40](../../Tests/TestPrefabPersistence.cpp#L40) | | | `PreflightFailure` | struct | SparkInstaller | [InstallerPreflight.h:L21](../../SparkInstaller/src/InstallerPreflight.h#L21) | | | `PreparedAutoIssue` | struct | SparkCrashReporter | [CrashAutoIssues.h:L26](../../SparkCrashReporter/src/CrashAutoIssues.h#L26) | | -| `PreparedSignalArtifacts` | struct | SparkEngine | [CrashHandler.cpp:L2305](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2305) | | +| `PreparedSignalArtifacts` | struct | SparkEngine | [CrashHandler.cpp:L2343](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2343) | | | `PreparedStatementData` | struct | SparkEngine | [AsyncDatabase.h:L85](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L85) | Prepared statement handle with bindable parameters. | | `PreparedStatementParam` | struct | SparkEngine | [AsyncDatabase.h:L79](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L79) | A single parameter bound to a prepared statement slot. | | `PrepareFailureProbe` | struct | Tests | [Test_persistence_SaveSystem.cpp:L443](../../Tests/harden/Test_persistence_SaveSystem.cpp#L443) | | @@ -3639,7 +3651,7 @@ | `RawCollabPeer` | struct | Tests | [TestCollaborativeEditing.cpp:L96](../../Tests/TestCollaborativeEditing.cpp#L96) | | | `RawHandshakeResult` | struct | Tests | [SecureTestPeer.h:L100](../../Tests/Fixtures/SecureTestPeer.h#L100) | A completed client-side raw handshake. | | `RawPeer` | class | Tests | [TestNetTransportSecurity.cpp:L105](../../Tests/TestNetTransportSecurity.cpp#L105) | | -| `RawTocEntry` | struct | Tests | [TestSparkPak.cpp:L817](../../Tests/TestSparkPak.cpp#L817) | | +| `RawTocEntry` | struct | Tests | [TestSparkPak.cpp:L833](../../Tests/TestSparkPak.cpp#L833) | | | `RawUdpClient` | class | Tests | [TestReliableChannel.cpp:L441](../../Tests/TestReliableChannel.cpp#L441) | | | `RawUDPSender` | class | Tests | [TestNetworkStress.cpp:L41](../../Tests/TestNetworkStress.cpp#L41) | | | `Ray` | struct | SparkEngine | [CollisionSystem.h:L106](../../SparkEngine/Source/Physics/CollisionSystem.h#L106) | 3D ray for raycasting operations | @@ -3684,12 +3696,13 @@ | `RecordingParticipant` | class | Tests | [TestHandoffParticipant.cpp:L15](../../Tests/TestHandoffParticipant.cpp#L15) | | | `RecordingStage` | class | Tests | [TestLifecycleCompositionRootFailure.cpp:L72](../../Tests/TestLifecycleCompositionRootFailure.cpp#L72) | | | `RecordingSystem` | class | Tests | [Test_tests_ecsystemordering_real.cpp:L29](../../Tests/harden/Test_tests_ecsystemordering_real.cpp#L29) | | +| `RecordingWeatherService` | class | Tests | [TestFPSWeatherPort.cpp:L30](../../Tests/TestFPSWeatherPort.cpp#L30) | | | `RecoveryFiles` | struct | SparkEditor | [EditorRecoveryFiles.h:L39](../../SparkEditor/Source/Core/EditorRecoveryFiles.h#L39) | | | `Rect` | struct | SparkEngine | [UILayoutExtensions.h:L98](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L98) | | | `RecursiveEvent` | struct | Tests | [TestAdversarialEngine.cpp:L213](../../Tests/TestAdversarialEngine.cpp#L213) | | | `RedeployFacts` | struct | Tests | [TestTFRedeployRules.cpp:L77](../../Tests/TestTFRedeployRules.cpp#L77) | | | `ReflAttr_TestStruct` | struct | Tests | [TestReflectionReal.cpp:L35](../../Tests/TestReflectionReal.cpp#L35) | | -| `ReflectedGameplayFixture` | struct | Tests | [TestSceneManagerReflectedReal.cpp:L13](../../Tests/TestSceneManagerReflectedReal.cpp#L13) | | +| `ReflectedGameplayFixture` | struct | Tests | [TestSceneManagerReflectedReal.cpp:L18](../../Tests/TestSceneManagerReflectedReal.cpp#L18) | | | `ReflectionProbe` | struct | SparkEngine | [ReflectionProbeCache.h:L35](../../SparkEngine/Source/Graphics/ReflectionProbeCache.h#L35) | | | `ReflectionProbeCache` | class | SparkEngine | [ReflectionProbeCache.h:L82](../../SparkEngine/Source/Graphics/ReflectionProbeCache.h#L82) | Manages cached reflection probe cubemaps | | `ReflectionProbeComponent` | struct | SparkEngine | [VolumeComponents.h:L105](../../SparkEngine/Source/Engine/ECS/Components/VolumeComponents.h#L105) | Defines a reflection probe capture point. | @@ -3732,7 +3745,7 @@ | `RemoteDebugServer` | class | SparkEngine | [RemoteDebugAccessControl.h:L26](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugAccessControl.h#L26) | | | `RemoteDebugServer` | class | SparkEngine | [RemoteDebugSystem.h:L251](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugSystem.h#L251) | Owns logical server state and dispatches authenticated incoming commands. | | `RemoteDebugSystem` | class | SparkEngine | [RemoteDebugSystem.h:L668](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugSystem.h#L668) | Top-level singleton owning both server and client instances. | -| `RemotePawn` | struct | GameModules | [TFReplication.h:L41](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L41) | | +| `RemotePawn` | struct | GameModules | [TFReplication.h:L43](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L43) | | | `RemoteSession` | class | SparkEngine | [RemoteDebugSystem.h:L67](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugSystem.h#L67) | Mutable state of a single remote debug connection (thread-safe queues). | | `RemoveNodeCommand` | class | SparkEditor | [VisualScriptPanel.h:L48](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L48) | Undo command for removing a node from the visual script graph | | `RenameBlocker` | class | Tests | [TestEditorStateCompatibility.cpp:L75](../../Tests/TestEditorStateCompatibility.cpp#L75) | | @@ -3787,7 +3800,7 @@ | `ReplayProtection` | class | Tests | [TestNetworkEncryption.cpp:L140](../../Tests/TestNetworkEncryption.cpp#L140) | | | `ReplaySettings` | struct | SparkEngine | [EngineSettings.h:L797](../../SparkEngine/Source/Core/EngineSettings.h#L797) | | | `ReplaySystem` | class | SparkEditor | [ReplayPanel.h:L15](../../SparkEditor/Source/Panels/ReplayPanel.h#L15) | | -| `ReplaySystem` | class | SparkSDK | [IEngineContext.h:L95](../../SparkSDK/Include/Spark/IEngineContext.h#L95) | | +| `ReplaySystem` | class | SparkSDK | [IEngineContext.h:L96](../../SparkSDK/Include/Spark/IEngineContext.h#L96) | | | `ReplicatedEntity` | struct | SparkEngine | [NetworkManager.h:L347](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L347) | | | `ReplicatedEntityEntry` | struct | SparkEngine | [EntityReplicator.h:L63](../../SparkEngine/Source/Engine/Networking/EntityReplicator.h#L63) | Internal bookkeeping for a single replicated entity. | | `ReplicatedEntityState` | struct | Tests | [TestNetworkReplicationIntegration.cpp:L25](../../Tests/TestNetworkReplicationIntegration.cpp#L25) | | @@ -4005,13 +4018,13 @@ | `RuntimePrefab` | class | SparkEngine | [RuntimePrefab.h:L88](../../SparkEngine/Source/Engine/ECS/RuntimePrefab.h#L88) | A reusable entity template holding component descriptors. | | `RuntimeTerrain` | struct | SparkEngine | [TerrainAssetFormat.h:L152](../../SparkEngine/Source/Graphics/TerrainAssetFormat.h#L152) | The runtime's view of a .sparkterrain asset: the fields TerrainRenderer publishes on a | | `sa` | struct | SparkEditor | [EditorCrashHandler.cpp:L254](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L254) | | -| `sa` | struct | SparkEngine | [CrashHandler.cpp:L2682](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2682) | | +| `sa` | struct | SparkEngine | [CrashHandler.cpp:L2728](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2728) | | | `SafeArea` | struct | SparkEngine | [MobilePlatform.h:L137](../../SparkEngine/Source/Engine/Mobile/MobilePlatform.h#L137) | Screen safe area (avoiding notches, home indicators). | | `SAHBucket` | struct | SparkEngine | [BVHAccelerator.h:L178](../../SparkEngine/Source/Graphics/BVHAccelerator.h#L178) | | | `Sample` | struct | SparkEngine | [InterpolationBuffer.h:L192](../../SparkEngine/Source/Engine/Networking/InterpolationBuffer.h#L192) | | | `Sample` | struct | SparkEngine | [PCSSshadows.h:L58](../../SparkEngine/Source/Graphics/PCSSshadows.h#L58) | Pre-computed Poisson disk sample points for PCSS filtering | | `Sample` | struct | Tests | [TestExtendedSystems.cpp:L191](../../Tests/TestExtendedSystems.cpp#L191) | | -| `Sample` | struct | Tests | [TestTF120Travel.cpp:L309](../../Tests/TestTF120Travel.cpp#L309) | | +| `Sample` | struct | Tests | [TestTF120Travel.cpp:L296](../../Tests/TestTF120Travel.cpp#L296) | | | `SamplePoint` | struct | SparkEngine | [ScreenSpaceEffects.h:L161](../../SparkEngine/Source/Graphics/ScreenSpaceEffects.h#L161) | | | `Sampler` | struct | Tests | [GLTFSkinningReference.h:L34](../../Tests/GLTFSkinningReference.h#L34) | | | `SamplerTag` | struct | SparkEngine | [RHIHandlePool.h:L90](../../SparkEngine/Source/Graphics/RHI/RHIHandlePool.h#L90) | | @@ -4032,7 +4045,7 @@ | `SaveSystem` | class | GameModules | [Game.h:L47](../../GameModules/SparkGameFPS/Source/Game/Game.h#L47) | | | `SaveSystem` | class | SparkEditor | [SaveSystemPanel.h:L16](../../SparkEditor/Source/Panels/SaveSystemPanel.h#L16) | | | `SaveSystem` | class | SparkEngine | [SaveSystem.h:L471](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L471) | | -| `SaveSystem` | class | SparkSDK | [IEngineContext.h:L87](../../SparkSDK/Include/Spark/IEngineContext.h#L87) | | +| `SaveSystem` | class | SparkSDK | [IEngineContext.h:L88](../../SparkSDK/Include/Spark/IEngineContext.h#L88) | | | `SaveSystemPanel` | class | SparkEditor | [SaveSystemPanel.h:L29](../../SparkEditor/Source/Panels/SaveSystemPanel.h#L29) | Panel for browsing and managing the save files on disk | | `SaveSystemSettings` | struct | SparkEngine | [EngineSettings.h:L782](../../SparkEngine/Source/Core/EngineSettings.h#L782) | | | `SaveSystemSettings` | struct | Tests | [TestEngineSettingsEdgeCases.cpp:L470](../../Tests/TestEngineSettingsEdgeCases.cpp#L470) | | @@ -4055,9 +4068,9 @@ | `SceneManager` | class | GameModules | [GameMechanics.h:L28](../../GameModules/SparkGameFPS/Source/Game/GameMechanics.h#L28) | | | `SceneManager` | class | GameModules | [TFWorldSetup.h:L51](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetup.h#L51) | | | `SceneManager` | class | SparkEditor | [SceneManager.h:L29](../../SparkEditor/Source/SceneSystem/SceneManager.h#L29) | Scene management system | -| `SceneManager` | class | SparkEngine | [EngineContext.h:L44](../../SparkEngine/Source/Core/EngineContext.h#L44) | | +| `SceneManager` | class | SparkEngine | [EngineContext.h:L45](../../SparkEngine/Source/Core/EngineContext.h#L45) | | | `SceneManager` | class | SparkEngine | [SceneManager.h:L130](../../SparkEngine/Source/SceneManager/SceneManager.h#L130) | | -| `SceneManager` | class | SparkSDK | [IEngineContext.h:L27](../../SparkSDK/Include/Spark/IEngineContext.h#L27) | | +| `SceneManager` | class | SparkSDK | [IEngineContext.h:L28](../../SparkSDK/Include/Spark/IEngineContext.h#L28) | | | `SceneManager` | class | Tests | [TestSceneManager.cpp:L38](../../Tests/TestSceneManager.cpp#L38) | | | `SceneManifest` | struct | SparkEngine | [SceneManifest.h:L51](../../SparkEngine/Source/Engine/Streaming/SceneManifest.h#L51) | Asset manifest describing all resources needed for a scene/area | | `SceneMergeHandler` | class | SparkEditor | [VersionControlTypes.h:L266](../../SparkEditor/Source/VersionControl/VersionControlTypes.h#L266) | Scene merge handler | @@ -4094,7 +4107,7 @@ | `ScopedClearedEnvironmentVariable` | class | Tests | [TestCrashHandlerGatingReal.cpp:L97](../../Tests/TestCrashHandlerGatingReal.cpp#L97) | | | `ScopedComInitialization` | class | Tests | [TestFileUtils.cpp:L85](../../Tests/TestFileUtils.cpp#L85) | | | `ScopedContext` | class | SparkEngine | [SparkError.h:L179](../../SparkEngine/Source/Utils/SparkError.h#L179) | | -| `ScopedContextWorld` | class | Tests | [TestEditorSubsystemsReal.cpp:L294](../../Tests/TestEditorSubsystemsReal.cpp#L294) | | +| `ScopedContextWorld` | class | Tests | [TestEditorSubsystemsReal.cpp:L317](../../Tests/TestEditorSubsystemsReal.cpp#L317) | | | `ScopedContradictInfoSdk` | class | Tests | [TestModuleABIDiagnostics.cpp:L137](../../Tests/TestModuleABIDiagnostics.cpp#L137) | Makes the compatible fixture contradict its descriptor for one scope. | | `ScopedCpuSection` | class | SparkEngine | [CpuDebugger.h:L402](../../SparkEngine/Source/Utils/CpuDebugger.h#L402) | RAII scope guard for automatic CPU section timing | | `ScopedCrashSignalDispositions` | class | Tests | [TestCrashHandlerGatingReal.cpp:L182](../../Tests/TestCrashHandlerGatingReal.cpp#L182) | | @@ -4125,7 +4138,7 @@ | `ScopedGPUEvent` | class | SparkEngine | [GPUDebugMarkers.h:L348](../../SparkEngine/Source/Graphics/GPUDebugMarkers.h#L348) | RAII scoped GPU event — begins on construction, ends on destruction | | `ScopedHandle` | class | SparkAssetPipelineCore | [AssetCooker.cpp:L241](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L241) | | | `ScopedHandle` | class | SparkEngine | [HeldHandles.h:L38](../../SparkEngine/Source/Engine/Modding/HeldHandles.h#L38) | | -| `ScopedHostConsoleBinding` | struct | Tests | [TestFPSMultiplayer.cpp:L1390](../../Tests/TestFPSMultiplayer.cpp#L1390) | | +| `ScopedHostConsoleBinding` | struct | Tests | [TestFPSMultiplayer.cpp:L1401](../../Tests/TestFPSMultiplayer.cpp#L1401) | | | `ScopedImageCom` | class | SparkEngine | [AssetTypesWindowsMedia.cpp:L131](../../SparkEngine/Source/Graphics/AssetTypesWindowsMedia.cpp#L131) | | | `ScopedInjectedContext` | class | Tests | [TestEditorPanelsRealBackends.cpp:L83](../../Tests/TestEditorPanelsRealBackends.cpp#L83) | Installs an injected EngineContext for one scope and clears it on exit. | | `ScopedInjectedContext` | struct | Tests | [VisualScriptGameplayHarness.h:L67](../../Tests/VisualScriptGameplayHarness.h#L67) | | @@ -4145,7 +4158,7 @@ | `ScopedNetworkSecurity` | class | Tests | [NetworkTestSecurity.h:L36](../../Tests/Fixtures/NetworkTestSecurity.h#L36) | Restores the singleton's security configuration when it goes out of scope | | `ScopedNoGPUBackends` | class | Tests | [TestD3D11DeviceContractsReal.cpp:L47](../../Tests/TestD3D11DeviceContractsReal.cpp#L47) | | | `ScopedPathPrefix` | class | SparkInstaller | [InstallerTransactionTests.cpp:L300](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L300) | | -| `ScopedPathVariable` | class | SparkBuild | [ProcessRunnerTests.cpp:L560](../../SparkBuild/tests/ProcessRunnerTests.cpp#L560) | | +| `ScopedPathVariable` | class | SparkBuild | [ProcessRunnerTests.cpp:L553](../../SparkBuild/tests/ProcessRunnerTests.cpp#L553) | | | `ScopedProfileTimer` | class | SparkEngine | [Profiler.h:L153](../../SparkEngine/Source/Utils/Profiler.h#L153) | Scoped CPU timer - automatically records start/end | | `ScopedRecoveryDirectory` | class | Tests | [TestEditorRecovery.cpp:L19](../../Tests/TestEditorRecovery.cpp#L19) | | | `ScopedRegistrationOwner` | class | SparkEngine | [NetworkManager.h:L633](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L633) | | @@ -4192,7 +4205,7 @@ | `Scratch` | class | Tests | [TestEditorUntrustedProject.cpp:L36](../../Tests/TestEditorUntrustedProject.cpp#L36) | | | `Scratch` | class | Tests | [TestSEC2PersistenceHardening.cpp:L55](../../Tests/TestSEC2PersistenceHardening.cpp#L55) | | | `ScratchCrashDir` | class | Tests | [TestEditorCrashHandlerFilterReal.cpp:L41](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L41) | Unique scratch directory removed on scope exit. | -| `ScratchDir` | class | Tests | [TestEditorSubsystemsReal.cpp:L39](../../Tests/TestEditorSubsystemsReal.cpp#L39) | Unique scratch directory for one test, removed by the destructor. | +| `ScratchDir` | class | Tests | [TestEditorSubsystemsReal.cpp:L42](../../Tests/TestEditorSubsystemsReal.cpp#L42) | Unique scratch directory for one test, removed by the destructor. | | `ScratchDir` | struct | Tests | [TestSEC3GameplayHardening.cpp:L50](../../Tests/TestSEC3GameplayHardening.cpp#L50) | | | `ScratchDirectory` | class | SparkCooker | [main.cpp:L41](../../SparkCooker/src/main.cpp#L41) | | | `ScratchDirectory` | class | SparkCrashReporter | [CrashReporterConsentTests.cpp:L46](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L46) | | @@ -4253,7 +4266,7 @@ | `SDFTraceConstants` | struct | SparkEngine | [HybridRTTypes.h:L56](../../SparkEngine/Source/Graphics/HybridRT/HybridRTTypes.h#L56) | Matches HLSL TraceConstants cbuffer layout | | `SDL_Window` | struct | SparkEditor | [EditorApplication.h:L24](../../SparkEditor/Source/Core/EditorApplication.h#L24) | | | `SeamlessAreaManager` | class | SparkEngine | [SeamlessAreaManager.h:L77](../../SparkEngine/Source/Engine/Streaming/SeamlessAreaManager.h#L77) | | -| `SeamlessAreaManager` | class | SparkSDK | [IEngineContext.h:L69](../../SparkSDK/Include/Spark/IEngineContext.h#L69) | | +| `SeamlessAreaManager` | class | SparkSDK | [IEngineContext.h:L70](../../SparkSDK/Include/Spark/IEngineContext.h#L70) | | | `SeamlessAreaManager` | class | Tests | [TestSeamlessAreaManager.cpp:L63](../../Tests/TestSeamlessAreaManager.cpp#L63) | | | `SearchPanel` | class | SparkEditor | [SearchPanel.h:L64](../../SparkEditor/Source/Panels/SearchPanel.h#L64) | Global search panel for the editor | | `SearchResult` | struct | SparkEditor | [SearchPanel.h:L37](../../SparkEditor/Source/Panels/SearchPanel.h#L37) | A single search result entry | @@ -4279,13 +4292,13 @@ | `SelfMirror` | struct | GameModules | [TFAbilitySystem.h:L162](../../GameModules/SparkGameMMOFPS/Source/Game/TFAbilitySystem.h#L162) | | | `SelfWaitContext` | struct | Tests | [TestPluginABI.cpp:L159](../../Tests/TestPluginABI.cpp#L159) | | | `SentState` | struct | GameModules | [TFVehicleSystemRecords.h:L165](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystemRecords.h#L165) | | -| `SentState` | struct | GameModules | [TFReplication.h:L79](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L79) | | +| `SentState` | struct | GameModules | [TFReplication.h:L83](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L83) | | | `Sequence` | class | SparkEngine | [Sequencer.h:L257](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L257) | | | `SequenceNode` | class | SparkEngine | [BehaviorTreeNodes.h:L39](../../SparkEngine/Source/Engine/AI/BehaviorTreeNodes.h#L39) | Composite node that runs children left-to-right, stopping on first failure. | | `SequenceNode` | class | Tests | [TestAIBehaviorTree.cpp:L57](../../Tests/TestAIBehaviorTree.cpp#L57) | | | `SequenceNode` | class | Tests | [TestAIStress.cpp:L70](../../Tests/TestAIStress.cpp#L70) | | | `SequencerManager` | class | SparkEngine | [Sequencer.h:L334](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L334) | | -| `SequencerManager` | class | SparkSDK | [IEngineContext.h:L51](../../SparkSDK/Include/Spark/IEngineContext.h#L51) | | +| `SequencerManager` | class | SparkSDK | [IEngineContext.h:L52](../../SparkSDK/Include/Spark/IEngineContext.h#L52) | | | `SequencerTrack` | class | SparkEngine | [Sequencer.h:L126](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L126) | | | `SerializationResult` | struct | SparkEditor | [SceneSerializer.h:L36](../../SparkEditor/Source/SceneSystem/SceneSerializer.h#L36) | Scene serialization result | | `SerializedComponent` | struct | SparkEditor | [PrefabAsset.h:L37](../../SparkEditor/Source/Prefabs/PrefabAsset.h#L37) | Serialized component data within a prefab | @@ -4411,7 +4424,7 @@ | `ShowcaseString` | struct | GameModules | [ShowcaseLocalization.h:L26](../../GameModules/SparkGame/Source/Core/ShowcaseLocalization.h#L26) | A status label key and the English text used when the host has no table for it | | `ShutdownStage` | class | SparkEngine | [ShutdownStage.cpp:L6](../../SparkEngine/Source/Core/Lifecycle/ShutdownStage.cpp#L6) | | | `si` | struct | SparkEditor | [EditorCrashHandler.cpp:L802](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L802) | | -| `si` | struct | SparkEngine | [CrashHandler.cpp:L1690](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1690) | | +| `si` | struct | SparkEngine | [CrashHandler.cpp:L1691](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1691) | | | `SiblingDependentModule` | class | Tests | [SiblingDependentModule.cpp:L9](../../Tests/Fixtures/ModuleABI/SiblingDependentModule.cpp#L9) | | | `SignalArtifactBuffer` | class | SparkEngine | [CrashHandlerSupport.h:L55](../../SparkEngine/Source/Utils/CrashHandlerSupport.h#L55) | | | `SignalCrashManifest` | struct | SparkEngine | [CrashHandlerSupport.h:L129](../../SparkEngine/Source/Utils/CrashHandlerSupport.h#L129) | | @@ -4501,7 +4514,7 @@ | `SoundEffectFactory` | class | SparkEngine | [SoundEffect.h:L213](../../SparkEngine/Source/Audio/SoundEffect.h#L213) | | | `SoundEntry` | struct | Tests | [TestAudioEngine.cpp:L37](../../Tests/TestAudioEngine.cpp#L37) | | | `SoundPlayedEvent` | struct | SparkEngine | [EventSystem.h:L270](../../SparkEngine/Source/Engine/Events/EventSystem.h#L270) | Fired when a sound begins playing. | -| `SourceAuthority` | struct | Tests | [TestTF120Travel.cpp:L200](../../Tests/TestTF120Travel.cpp#L200) | | +| `SourceAuthority` | struct | Tests | [TestTF120Travel.cpp:L187](../../Tests/TestTF120Travel.cpp#L187) | | | `SourceEntry` | struct | SparkAssetPipelineCore | [AssetCooker.cpp:L1396](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L1396) | | | `SourceReference` | struct | Tests | [TestAssetManifestReal.cpp:L226](../../Tests/TestAssetManifestReal.cpp#L226) | | | `SparkBodyActivationListener` | class | SparkEngine | [PhysicsSystem.cpp:L282](../../SparkEngine/Source/Physics/PhysicsSystem.cpp#L282) | | @@ -4514,7 +4527,7 @@ | `SparkEngineCamera` | class | GameModules | [TFWorldSetup.h:L50](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetup.h#L50) | | | `SparkEngineCamera` | class | SparkEngine | [SparkEngineCamera.h:L53](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L53) | | | `SparkEngineCamera` | class | SparkEngine | [SparkEngine.h:L27](../../SparkEngine/Source/Core/SparkEngine.h#L27) | | -| `SparkEngineCamera` | class | SparkSDK | [IEngineContext.h:L31](../../SparkSDK/Include/Spark/IEngineContext.h#L31) | | +| `SparkEngineCamera` | class | SparkSDK | [IEngineContext.h:L32](../../SparkSDK/Include/Spark/IEngineContext.h#L32) | | | `SparkEngineCamera` | class | Tests | [TestCameraTransforms.cpp:L95](../../Tests/TestCameraTransforms.cpp#L95) | | | `SparkEngineIntegration` | class | SparkEditor | [SparkEngineIntegration.h:L181](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L181) | Deep integration system between Spark Engine Editor and Runtime | | `SparkGameARPGModule` | class | GameModules | [SparkGameARPG.h:L49](../../GameModules/SparkGameARPG/Source/Core/SparkGameARPG.h#L49) | | @@ -4675,9 +4688,9 @@ | `StringTable` | class | SparkEngine | [LocalizationSystem.h:L50](../../SparkEngine/Source/Engine/Localization/LocalizationSystem.h#L50) | String table mapping key → localized text for one language. | | `StubBenchmarkScenario` | class | Tests | [TestBenchmarkFramework.cpp:L24](../../Tests/TestBenchmarkFramework.cpp#L24) | | | `StubMigrationStep` | class | Tests | [TestAssetMigration.cpp:L147](../../Tests/TestAssetMigration.cpp#L147) | | -| `StubSystemA` | class | Tests | [TestECSystemsReal.cpp:L36](../../Tests/TestECSystemsReal.cpp#L36) | | -| `StubSystemB` | class | Tests | [TestECSystemsReal.cpp:L51](../../Tests/TestECSystemsReal.cpp#L51) | | -| `StubSystemC` | class | Tests | [TestECSystemsReal.cpp:L66](../../Tests/TestECSystemsReal.cpp#L66) | | +| `StubSystemA` | class | Tests | [TestECSystemsReal.cpp:L26](../../Tests/TestECSystemsReal.cpp#L26) | | +| `StubSystemB` | class | Tests | [TestECSystemsReal.cpp:L41](../../Tests/TestECSystemsReal.cpp#L41) | | +| `StubSystemC` | class | Tests | [TestECSystemsReal.cpp:L56](../../Tests/TestECSystemsReal.cpp#L56) | | | `SubmixVoiceRecord` | struct | SparkEngine | [AudioEngine.h:L789](../../SparkEngine/Source/Audio/AudioEngine.h#L789) | One created submix voice plus the parameters needed to recreate it. | | `Subscription` | struct | Tests | [TestEventSystem.cpp:L80](../../Tests/TestEventSystem.cpp#L80) | | | `SubscriptionHandle` | class | GameModules | [Game.h:L44](../../GameModules/SparkGameFPS/Source/Game/Game.h#L44) | | @@ -4717,7 +4730,7 @@ | `SystemTiming` | struct | SparkEngine | [PerformanceStats.h:L122](../../SparkEngine/Source/Utils/PerformanceStats.h#L122) | Timing data for a single engine system | | `SystemTiming` | struct | Tests | [TestDebugHookManager.cpp:L468](../../Tests/TestDebugHookManager.cpp#L468) | | | `SystemTiming` | struct | Tests | [TestPerformanceStats.cpp:L92](../../Tests/TestPerformanceStats.cpp#L92) | | -| `t` | struct | SparkEngine | [CrashHandler.cpp:L126](../../SparkEngine/Source/Utils/CrashHandler.cpp#L126) | | +| `t` | struct | SparkEngine | [CrashHandler.cpp:L127](../../SparkEngine/Source/Utils/CrashHandler.cpp#L127) | | | `TAASettings` | struct | SparkEngine | [EngineSettings.h:L265](../../SparkEngine/Source/Core/EngineSettings.h#L265) | | | `TAASettings` | struct | SparkEngine | [TemporalEffectsTypes.h:L55](../../SparkEngine/Source/Graphics/TemporalEffectsTypes.h#L55) | Configuration for Temporal Anti-Aliasing | | `TAASettings` | struct | SparkEngine | [TemporalTypes.h:L58](../../SparkEngine/Source/Graphics/TemporalTypes.h#L58) | Configuration for Temporal Anti-Aliasing | @@ -4815,8 +4828,8 @@ | `TestObject` | struct | Tests | [TestObjectPoolReal.cpp:L11](../../Tests/TestObjectPoolReal.cpp#L11) | Real-class tests for Spark::ObjectPool | | `TestOutcomeInputs` | struct | Tests | [TestFramework.h:L122](../../Tests/TestFramework.h#L122) | | | `TestOutput` | struct | Tests | [TestMain.cpp:L363](../../Tests/TestMain.cpp#L363) | | -| `TestPakReader` | class | Tests | [TestSparkPak.cpp:L151](../../Tests/TestSparkPak.cpp#L151) | | -| `TestPakWriter` | class | Tests | [TestSparkPak.cpp:L62](../../Tests/TestSparkPak.cpp#L62) | | +| `TestPakReader` | class | Tests | [TestSparkPak.cpp:L157](../../Tests/TestSparkPak.cpp#L157) | | +| `TestPakWriter` | class | Tests | [TestSparkPak.cpp:L68](../../Tests/TestSparkPak.cpp#L68) | | | `TestParallaxLayer` | struct | Tests | [TestSprite2DComponents.cpp:L617](../../Tests/TestSprite2DComponents.cpp#L617) | | | `TestPhysicsBody` | class | Tests | [TestPhysicsInterpolation.cpp:L92](../../Tests/TestPhysicsInterpolation.cpp#L92) | | | `TestPhysicsSystem` | class | Tests | [TestPhysicsInterpolation.cpp:L125](../../Tests/TestPhysicsInterpolation.cpp#L125) | | @@ -4841,7 +4854,7 @@ | `TestSpriteAnimator` | struct | Tests | [TestSprite2DComponents.cpp:L125](../../Tests/TestSprite2DComponents.cpp#L125) | | | `TestSpriteRenderer` | struct | Tests | [TestSprite2DComponents.cpp:L36](../../Tests/TestSprite2DComponents.cpp#L36) | | | `TestStruct` | struct | Tests | [TestReflection.cpp:L445](../../Tests/TestReflection.cpp#L445) | | -| `TestSystemManager` | class | Tests | [TestECSystemsReal.cpp:L74](../../Tests/TestECSystemsReal.cpp#L74) | | +| `TestSystemManager` | class | Tests | [TestECSystemsReal.cpp:L64](../../Tests/TestECSystemsReal.cpp#L64) | | | `TestTagComponent` | struct | Tests | [TestECSWorld.cpp:L115](../../Tests/TestECSWorld.cpp#L115) | | | `TestThrashTracker` | struct | Tests | [TestTextureZombiePool.cpp:L68](../../Tests/TestTextureZombiePool.cpp#L68) | | | `TestTilemapComponent` | struct | Tests | [TestSprite2DComponents.cpp:L269](../../Tests/TestSprite2DComponents.cpp#L269) | | @@ -5107,7 +5120,7 @@ | `TFRegionSystem` | class | GameModules | [TFTypes.h:L107](../../GameModules/SparkGameMMOFPS/Source/Core/TFTypes.h#L107) | | | `TFRegionSystem` | class | GameModules | [TFRegionSystem.h:L73](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.h#L73) | | | `TFReplication` | class | GameModules | [TFTypes.h:L109](../../GameModules/SparkGameMMOFPS/Source/Core/TFTypes.h#L109) | | -| `TFReplication` | class | GameModules | [TFReplication.h:L54](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L54) | | +| `TFReplication` | class | GameModules | [TFReplication.h:L57](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L57) | | | `TFSanctuaryDecor` | class | GameModules | [TFSanctuaryDecor.h:L42](../../GameModules/SparkGameMMOFPS/Source/World/TFSanctuaryDecor.h#L42) | | | `TFSanctuaryDecor` | class | GameModules | [TFTravelSystem.h:L58](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L58) | | | `TFScoreboard` | class | GameModules | [TFTypes.h:L129](../../GameModules/SparkGameMMOFPS/Source/Core/TFTypes.h#L129) | | @@ -5187,7 +5200,7 @@ | `ThreadLockState` | struct | Tests | [TestDeadlockDetector.cpp:L37](../../Tests/TestDeadlockDetector.cpp#L37) | | | `ThreadRecord` | struct | SparkEngine | [ThreadDebugger.h:L45](../../SparkEngine/Source/Utils/ThreadDebugger.h#L45) | Record of a tracked thread | | `ThreadSafeRandomEngine` | class | SparkEngine | [RandomEngine.h:L216](../../SparkEngine/Source/Utils/RandomEngine.h#L216) | Mutex-protected wrapper around RandomEngine for shared use. | -| `ThreadStacksCapture` | struct | SparkEngine | [CrashHandler.cpp:L867](../../SparkEngine/Source/Utils/CrashHandler.cpp#L867) | | +| `ThreadStacksCapture` | struct | SparkEngine | [CrashHandler.cpp:L868](../../SparkEngine/Source/Utils/CrashHandler.cpp#L868) | | | `ThreadState` | struct | SparkEngine | [DeadlockDetector.h:L123](../../SparkEngine/Source/Utils/DeadlockDetector.h#L123) | | | `ThreadState` | struct | Tests | [TestDeadlockDetector.cpp:L112](../../Tests/TestDeadlockDetector.cpp#L112) | | | `ThreatInfo` | struct | SparkEngine | [GroupAI.h:L103](../../SparkEngine/Source/Engine/AI/GroupAI.h#L103) | Information about a known threat shared across the group. | @@ -5209,28 +5222,28 @@ | `TilemapRenderSystem` | class | SparkEngine | [Systems2D.h:L367](../../SparkEngine/Source/Engine/ECS/Systems/Systems2D.h#L367) | Submits tilemap tile draw commands to the SpriteBatch. | | `TilemapSnapshot` | struct | SparkEditor | [TilemapEditorPanel.h:L96](../../SparkEditor/Source/Panels/TilemapEditorPanel.h#L96) | | | `TilesetInfo` | struct | SparkEngine | [Sprite2DComponents.h:L236](../../SparkEngine/Source/Engine/ECS/Components/Sprite2DComponents.h#L236) | | -| `TimedKeyRelease` | struct | SparkEngine | [InputManager.h:L93](../../SparkEngine/Source/Input/InputManager.h#L93) | A console-simulated key press waiting for its release deadline. | +| `TimedKeyRelease` | struct | SparkEngine | [InputManager.h:L95](../../SparkEngine/Source/Input/InputManager.h#L95) | A console-simulated key press waiting for its release deadline. | | `TimeOfDayChangedEvent` | struct | SparkEngine | [EventSystem.h:L105](../../SparkEngine/Source/Engine/Events/EventSystem.h#L105) | Fired when the time of day changes significantly (e.g. dawn, dusk). | | `TimeOfDayPanel` | class | SparkEditor | [TimeOfDayPanel.h:L19](../../SparkEditor/Source/Panels/TimeOfDayPanel.h#L19) | Panel for controlling the engine TimeOfDaySystem day/night cycle | | `TimeOfDaySettings` | struct | SparkEngine | [EngineSettings.h:L570](../../SparkEngine/Source/Core/EngineSettings.h#L570) | | | `TimeOfDaySettings` | struct | Tests | [TestSubsystemConsoleCommands.cpp:L45](../../Tests/TestSubsystemConsoleCommands.cpp#L45) | | | `TimeOfDaySystem` | class | SparkEngine | [TimeOfDaySystem.h:L64](../../SparkEngine/Source/Engine/World/TimeOfDaySystem.h#L64) | | -| `TimeOfDaySystem` | class | SparkSDK | [IEngineContext.h:L92](../../SparkSDK/Include/Spark/IEngineContext.h#L92) | | +| `TimeOfDaySystem` | class | SparkSDK | [IEngineContext.h:L93](../../SparkSDK/Include/Spark/IEngineContext.h#L93) | | | `TimeOfDaySystem` | class | Tests | [TestTimeOfDaySystem.cpp:L32](../../Tests/TestTimeOfDaySystem.cpp#L32) | | -| `timeoutAction` | struct | SparkEngine | [CrashHandler.cpp:L2186](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2186) | | -| `Timer` | class | SparkEngine | [EngineContext.h:L41](../../SparkEngine/Source/Core/EngineContext.h#L41) | | +| `timeoutAction` | struct | SparkEngine | [CrashHandler.cpp:L2222](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2222) | | +| `Timer` | class | SparkEngine | [EngineContext.h:L42](../../SparkEngine/Source/Core/EngineContext.h#L42) | | | `Timer` | class | SparkEngine | [EngineRuntime.h:L30](../../SparkEngine/Source/Core/EngineRuntime.h#L30) | | | `Timer` | class | SparkEngine | [IGameModule.h:L21](../../SparkEngine/Source/Core/IGameModule.h#L21) | | | `Timer` | class | SparkEngine | [SparkEngine.h:L26](../../SparkEngine/Source/Core/SparkEngine.h#L26) | | | `Timer` | class | SparkEngine | [Timer.h:L35](../../SparkEngine/Source/Utils/Timer.h#L35) | | -| `Timer` | class | SparkSDK | [IEngineContext.h:L24](../../SparkSDK/Include/Spark/IEngineContext.h#L24) | | +| `Timer` | class | SparkSDK | [IEngineContext.h:L25](../../SparkSDK/Include/Spark/IEngineContext.h#L25) | | | `Timer` | class | SparkServer | [ServerApplication.h:L24](../../SparkServer/src/ServerApplication.h#L24) | | | `TimerManager` | class | SparkEngine | [TimerManager.h:L86](../../SparkEngine/Source/Utils/TimerManager.h#L86) | Centralized gameplay timer service | | `TimerState` | struct | SparkEngine | [EventResponseSystem.h:L311](../../SparkEngine/Source/Engine/Gameplay/EventResponseSystem.h#L311) | | | `TLASInstance` | struct | SparkEngine | [MetalRayTracing.h:L73](../../SparkEngine/Source/Graphics/RHI/Metal/MetalRayTracing.h#L73) | Per-instance TLAS entry (row-major 3x4 affine transform). | | `Toast` | struct | GameModules | [TFMedalSystem.h:L235](../../GameModules/SparkGameMMOFPS/Source/Game/TFMedalSystem.h#L235) | | -| `TOCEntry` | struct | Tests | [TestSparkPak.cpp:L80](../../Tests/TestSparkPak.cpp#L80) | | -| `TOCEntry` | struct | Tests | [TestSparkPak.cpp:L154](../../Tests/TestSparkPak.cpp#L154) | | +| `TOCEntry` | struct | Tests | [TestSparkPak.cpp:L86](../../Tests/TestSparkPak.cpp#L86) | | +| `TOCEntry` | struct | Tests | [TestSparkPak.cpp:L160](../../Tests/TestSparkPak.cpp#L160) | | | `TokenCursor` | class | SparkEditor | [PrefabTextFormat.cpp:L104](../../SparkEditor/Source/Prefabs/PrefabTextFormat.cpp#L104) | | | `TokenEntry` | struct | SparkEngine | [NetworkSecurity.h:L91](../../SparkEngine/Source/Engine/Networking/NetworkSecurity.h#L91) | | | `TokenFacts` | struct | Tests | [CrashArtifactSandboxProbe.cpp:L67](../../Tests/Fixtures/CrashArtifactSandboxProbe.cpp#L67) | | @@ -5315,19 +5328,19 @@ | `TutorialStep` | struct | SparkEditor | [TutorialSystem.h:L88](../../SparkEditor/Source/Core/TutorialSystem.h#L88) | A single step within a tutorial sequence. | | `TutorialSystem` | class | SparkEditor | [TutorialSystem.h:L121](../../SparkEditor/Source/Core/TutorialSystem.h#L121) | Singleton that manages interactive editor tutorials. | | `tv` | struct | SparkConsole | [ConsoleApp.cpp:L50](../../SparkConsole/src/ConsoleApp.cpp#L50) | | -| `tv` | struct | SparkConsole | [ConsoleApp.cpp:L543](../../SparkConsole/src/ConsoleApp.cpp#L543) | | +| `tv` | struct | SparkConsole | [ConsoleApp.cpp:L547](../../SparkConsole/src/ConsoleApp.cpp#L547) | | | `Tween` | class | SparkEngine | [Tween.h:L261](../../SparkEngine/Source/Utils/Tween.h#L261) | A single tween that interpolates a float | | `Tween` | class | Tests | [TestTween.cpp:L112](../../Tests/TestTween.cpp#L112) | | | `TweenInstance` | class | SparkEngine | [TweenSystem.h:L85](../../SparkEngine/Source/Engine/Tween/TweenSystem.h#L85) | A single tween operation that interpolates a value over time. | | `TweenManager` | class | SparkEngine | [Tween.h:L410](../../SparkEngine/Source/Utils/Tween.h#L410) | Central manager for all active tweens. Call Update() once per frame. | | `TweenSystem` | class | SparkEngine | [TweenSystem.h:L147](../../SparkEngine/Source/Engine/Tween/TweenSystem.h#L147) | | -| `TweenSystem` | class | SparkSDK | [IEngineContext.h:L97](../../SparkSDK/Include/Spark/IEngineContext.h#L97) | | +| `TweenSystem` | class | SparkSDK | [IEngineContext.h:L98](../../SparkSDK/Include/Spark/IEngineContext.h#L98) | | | `TwoEntityScene` | struct | Tests | [TestEDT210InspectorEditCommitReal.cpp:L134](../../Tests/TestEDT210InspectorEditCommitReal.cpp#L134) | | | `Type` | struct | SparkEngine | [Reflection.h:L461](../../SparkEngine/Source/Core/Reflection.h#L461) | Begin type reflection registration. | | `Type` | struct | SparkEngine | [Reflection.h:L474](../../SparkEngine/Source/Core/Reflection.h#L474) | Begin type reflection with a base class. | | `TypeCheckResult` | struct | Tests | [TestShaderGraphCompiler.cpp:L225](../../Tests/TestShaderGraphCompiler.cpp#L225) | | | `TypedNode` | struct | Tests | [TestShaderGraphCompiler.cpp:L217](../../Tests/TestShaderGraphCompiler.cpp#L217) | | -| `TypeIdHash` | struct | SparkEngine | [EngineContext.h:L80](../../SparkEngine/Source/Core/EngineContext.h#L80) | | +| `TypeIdHash` | struct | SparkEngine | [EngineContext.h:L81](../../SparkEngine/Source/Core/EngineContext.h#L81) | | | `TypeInfo` | struct | SparkEngine | [Reflection.h:L111](../../SparkEngine/Source/Core/Reflection.h#L111) | Runtime metadata for a registered type. | | `TypeInfo` | struct | Tests | [TestReflection.cpp:L59](../../Tests/TestReflection.cpp#L59) | | | `TypeRegistry` | class | SparkEngine | [Reflection.h:L188](../../SparkEngine/Source/Core/Reflection.h#L188) | Central registry of all reflected types. | @@ -5360,11 +5373,11 @@ | `UISystem` | class | GameModules | [ARPGHud.h:L28](../../GameModules/SparkGameARPG/Source/UI/ARPGHud.h#L28) | | | `UISystem` | class | SparkEngine | [SparkEngineWindowsInternal.h:L33](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L33) | | | `UISystem` | class | SparkEngine | [UISystem.h:L419](../../SparkEngine/Source/Engine/UI/UISystem.h#L419) | Top-level UI management system. | -| `UISystem` | class | SparkSDK | [IEngineContext.h:L104](../../SparkSDK/Include/Spark/IEngineContext.h#L104) | | +| `UISystem` | class | SparkSDK | [IEngineContext.h:L105](../../SparkSDK/Include/Spark/IEngineContext.h#L105) | | | `UITextInput` | class | SparkEngine | [UILayoutExtensions.h:L119](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L119) | | | `UIWidget` | class | SparkEngine | [UISystem.h:L124](../../SparkEngine/Source/Engine/UI/UISystem.h#L124) | Base class for all UI widgets. | | `UIWidgetConfig` | struct | SparkEngine | [UIFactory.h:L97](../../SparkEngine/Source/Engine/UI/UIFactory.h#L97) | Simple config node for UI widget definition | -| `un` | struct | SparkEngine | [CrashHandler.cpp:L1683](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1683) | | +| `un` | struct | SparkEngine | [CrashHandler.cpp:L1684](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1684) | | | `UnackedTracker` | struct | Tests | [TestReliableChannel.cpp:L57](../../Tests/TestReliableChannel.cpp#L57) | | | `UndoHistoryPanel` | class | SparkEditor | [UndoHistoryPanel.h:L26](../../SparkEditor/Source/Panels/UndoHistoryPanel.h#L26) | Panel displaying the undo/redo command history | | `UndoRedoManager` | class | SparkEditor | [UndoRedoManager.h:L37](../../SparkEditor/Source/UndoRedo/UndoRedoManager.h#L37) | Manages the undo/redo command stack for the editor | @@ -5506,7 +5519,7 @@ | `VignetteSettings` | struct | Tests | [TestPostProcessingPipeline.cpp:L56](../../Tests/TestPostProcessingPipeline.cpp#L56) | | | `Violation` | struct | SparkEngine | [MemoryIntegrity.h:L76](../../SparkEngine/Source/Engine/Security/MemoryIntegrity.h#L76) | Record of a single integrity violation | | `VirtualFileSystem` | class | SparkEngine | [VirtualFileSystem.h:L186](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L186) | Singleton mount-priority virtual filesystem. | -| `VirtualFileSystem` | class | SparkSDK | [IEngineContext.h:L77](../../SparkSDK/Include/Spark/IEngineContext.h#L77) | | +| `VirtualFileSystem` | class | SparkSDK | [IEngineContext.h:L78](../../SparkSDK/Include/Spark/IEngineContext.h#L78) | | | `VirtualTextureManager` | class | SparkEngine | [VirtualTexture.h:L77](../../SparkEngine/Source/Graphics/VirtualTexture.h#L77) | | | `VirtualTexturePage` | struct | SparkEngine | [VirtualTexture.h:L36](../../SparkEngine/Source/Graphics/VirtualTexture.h#L36) | A single tile in the virtual texture page cache. | | `VisibilityEntry` | struct | SparkEngine | [MeshClusterSystem.h:L96](../../SparkEngine/Source/Graphics/MeshClusterSystem.h#L96) | Per-pixel visibility buffer output for deferred shading | @@ -5545,7 +5558,7 @@ | `VRSettings` | struct | SparkEngine | [EngineSettings.h:L704](../../SparkEngine/Source/Core/EngineSettings.h#L704) | | | `VRSettings` | struct | Tests | [TestEngineSettingsEdgeCases.cpp:L448](../../Tests/TestEngineSettingsEdgeCases.cpp#L448) | | | `VRSystem` | class | SparkEngine | [VRSystem.h:L120](../../SparkEngine/Source/Engine/VR/VRSystem.h#L120) | Manages VR hardware initialization, tracking, and rendering. | -| `VRSystem` | class | SparkSDK | [IEngineContext.h:L64](../../SparkSDK/Include/Spark/IEngineContext.h#L64) | | +| `VRSystem` | class | SparkSDK | [IEngineContext.h:L65](../../SparkSDK/Include/Spark/IEngineContext.h#L65) | | | `VRSystem` | class | Tests | [TestVRSystem.cpp:L66](../../Tests/TestVRSystem.cpp#L66) | | | `VulkanBuffer` | class | SparkEngine | [VulkanDevice.h:L109](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L109) | | | `VulkanCommandList` | class | SparkEngine | [VulkanDevice.h:L315](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L315) | | @@ -5611,7 +5624,7 @@ | `WeaponStats` | struct | GameModules | [WeaponStats.h:L23](../../GameModules/SparkGameFPS/Source/Projectiles/WeaponStats.h#L23) | Weapon statistics and configuration structure | | `WeaponSystem` | class | SparkEngine | [EngineRuntime.h:L52](../../SparkEngine/Source/Core/EngineRuntime.h#L52) | | | `WeaponSystem` | class | SparkEngine | [WeaponManager.h:L277](../../SparkEngine/Source/Engine/Gameplay/WeaponManager.h#L277) | Processes all entities with WeaponInventoryComponent | -| `WeaponSystem` | class | SparkSDK | [IEngineContext.h:L57](../../SparkSDK/Include/Spark/IEngineContext.h#L57) | | +| `WeaponSystem` | class | SparkSDK | [IEngineContext.h:L58](../../SparkSDK/Include/Spark/IEngineContext.h#L58) | | | `WeatherAudioState` | struct | SparkEngine | [WeatherGameplayIntegration.h:L57](../../SparkEngine/Source/Engine/Gameplay/WeatherGameplayIntegration.h#L57) | Tracks ambient weather audio state with volume levels. | | `WeatherChangedEvent` | struct | SparkEngine | [EventSystem.h:L97](../../SparkEngine/Source/Engine/Events/EventSystem.h#L97) | Fired when the weather changes. | | `WeatherComponent` | struct | SparkEngine | [GameplayComponents.h:L140](../../SparkEngine/Source/Engine/ECS/Components/GameplayComponents.h#L140) | Per-entity weather zone data. | @@ -5623,10 +5636,9 @@ | `WeatherSettings` | struct | Tests | [TestSubsystemConsoleCommands.cpp:L24](../../Tests/TestSubsystemConsoleCommands.cpp#L24) | | | `WeatherState` | struct | SparkEngine | [WeatherSystem.h:L87](../../SparkEngine/Source/Graphics/WeatherSystem.h#L87) | Complete weather state describing current atmospheric conditions | | `WeatherState` | struct | Tests | [TestWeatherSystem.cpp:L23](../../Tests/TestWeatherSystem.cpp#L23) | | -| `WeatherSystem` | class | GameModules | [EngineWeatherAdapter.h:L7](../../GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.h#L7) | | | `WeatherSystem` | class | SparkEngine | [SparkEngineWindowsInternal.h:L28](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L28) | | | `WeatherSystem` | class | SparkEngine | [WeatherSystem.h:L225](../../SparkEngine/Source/Graphics/WeatherSystem.h#L225) | Manages weather state, transitions, and effect parameters | -| `WeatherSystem` | class | SparkSDK | [IEngineContext.h:L91](../../SparkSDK/Include/Spark/IEngineContext.h#L91) | | +| `WeatherSystem` | class | SparkSDK | [IEngineContext.h:L92](../../SparkSDK/Include/Spark/IEngineContext.h#L92) | | | `WeatherSystem` | class | Tests | [TestWeatherSystem.cpp:L84](../../Tests/TestWeatherSystem.cpp#L84) | | | `WeightedAnimation` | struct | SparkEngine | [BlendSpace.h:L66](../../SparkEngine/Source/Engine/Animation/BlendSpace.h#L66) | A single weighted animation contribution in a blend result. | | `WFCResult` | struct | SparkEngine | [ProceduralGenerator.h:L139](../../SparkEngine/Source/Engine/Procedural/ProceduralGenerator.h#L139) | Result of Wave Function Collapse generation | @@ -5667,7 +5679,7 @@ | `World` | class | SparkEditor | [SceneStatisticsPanel.h:L22](../../SparkEditor/Source/Panels/SceneStatisticsPanel.h#L22) | | | `World` | class | SparkEditor | [SceneViewPanel.h:L25](../../SparkEditor/Source/Panels/SceneViewPanel.h#L25) | | | `World` | class | SparkEditor | [SearchPanel.h:L19](../../SparkEditor/Source/Panels/SearchPanel.h#L19) | | -| `World` | class | SparkEngine | [EngineContext.h:L47](../../SparkEngine/Source/Core/EngineContext.h#L47) | | +| `World` | class | SparkEngine | [EngineContext.h:L48](../../SparkEngine/Source/Core/EngineContext.h#L48) | | | `World` | class | SparkEngine | [HostScenePreview.h:L24](../../SparkEngine/Source/Core/HostScenePreview.h#L24) | | | `World` | class | SparkEngine | [AIBudgetTypes.h:L22](../../SparkEngine/Source/Engine/AI/AIBudgetTypes.h#L22) | | | `World` | class | SparkEngine | [AIIntegration.h:L57](../../SparkEngine/Source/Engine/AI/AIIntegration.h#L57) | | @@ -5683,13 +5695,12 @@ | `World` | class | SparkEngine | [RTSceneFeeder.h:L31](../../SparkEngine/Source/Graphics/HybridRT/RTSceneFeeder.h#L31) | | | `World` | class | SparkEngine | [WorldBasicRenderer.h:L14](../../SparkEngine/Source/Graphics/WorldBasicRenderer.h#L14) | | | `World` | class | SparkEngine | [ReflectedSceneSerializer.h:L10](../../SparkEngine/Source/SceneManager/ReflectedSceneSerializer.h#L10) | Reflection-driven JSON scene serialization for World objects. | -| `World` | class | SparkSDK | [IEngineContext.h:L30](../../SparkSDK/Include/Spark/IEngineContext.h#L30) | | +| `World` | class | SparkSDK | [IEngineContext.h:L31](../../SparkSDK/Include/Spark/IEngineContext.h#L31) | | | `World` | class | SparkSDK | [IStateValidation.h:L62](../../SparkSDK/Include/Spark/IStateValidation.h#L62) | | | `World` | class | SparkServer | [ServerApplication.h:L25](../../SparkServer/src/ServerApplication.h#L25) | | | `World` | struct | Tests | [TestAngelScriptEngine.cpp:L15](../../Tests/TestAngelScriptEngine.cpp#L15) | | | `World` | struct | Tests | [TestECSystemOrdering.cpp:L26](../../Tests/TestECSystemOrdering.cpp#L26) | | | `World` | class | Tests | [TestECSystemSpecialized.cpp:L143](../../Tests/TestECSystemSpecialized.cpp#L143) | | -| `World` | class | Tests | [TestECSystemsReal.cpp:L24](../../Tests/TestECSystemsReal.cpp#L24) | | | `WorldAssetField` | struct | SparkEditor | [InspectorWorldAssetDrop.cpp:L21](../../SparkEditor/Source/Panels/InspectorWorldAssetDrop.cpp#L21) | | | `WorldBasicRenderStats` | struct | SparkEngine | [WorldBasicRenderer.h:L19](../../SparkEngine/Source/Graphics/WorldBasicRenderer.h#L19) | | | `WorldBossDef` | struct | GameModules | [MMOWorldBossSystem.h:L57](../../GameModules/SparkGameMMO/Source/WorldBoss/MMOWorldBossSystem.h#L57) | World boss definition | diff --git a/wiki/reference/Enum-Index.md b/wiki/reference/Enum-Index.md index 8917b5f56..eff07d094 100644 --- a/wiki/reference/Enum-Index.md +++ b/wiki/reference/Enum-Index.md @@ -2,7 +2,7 @@ > Every declared enum. > -> **Total:** 955 symbols. Auto-generated by `docs/generate-symbol-index.sh`. +> **Total:** 956 symbols. Auto-generated by `docs/generate-symbol-index.sh`. | Symbol | Kind | Module | Source | Brief | |--------|------|--------|--------|-------| @@ -166,7 +166,7 @@ | `ComponentType` | enum | SparkEditor | [SceneSystemEnums.h:L21](../../SparkEditor/Source/Enums/SceneSystemEnums.h#L21) | Component type enumeration | | `CompositeOp` | enum | SparkEngine | [UICompositor.h:L42](../../SparkEngine/Source/Graphics/UICompositor.h#L42) | | | `CompositionMode` | enum | SparkEditor | [LevelStreamingEnums.h:L94](../../SparkEditor/Source/Enums/LevelStreamingEnums.h#L94) | World composition modes | -| `Compression` | enum | Tests | [TestSparkPak.cpp:L29](../../Tests/TestSparkPak.cpp#L29) | | +| `Compression` | enum | Tests | [TestSparkPak.cpp:L35](../../Tests/TestSparkPak.cpp#L35) | | | `CompressionMethod` | enum | SparkEngine | [CompressionUtils.h:L19](../../SparkEngine/Source/Utils/CompressionUtils.h#L19) | Compression algorithm selection. | | `ComputePriority` | enum | Tests | [TestAsyncComputeScheduler.cpp:L15](../../Tests/TestAsyncComputeScheduler.cpp#L15) | | | `ConditionGroupLogic` | enum | SparkEngine | [ConditionSystem.h:L81](../../SparkEngine/Source/Engine/Gameplay/ConditionSystem.h#L81) | | @@ -191,7 +191,7 @@ | `CraftingDiscipline` | enum | GameModules | [MMOEnums.h:L73](../../GameModules/SparkGameMMO/Source/Enums/MMOEnums.h#L73) | Crafting skill disciplines | | `CraftingStation` | enum | GameModules | [MMOEnums.h:L59](../../GameModules/SparkGameMMO/Source/Enums/MMOEnums.h#L59) | Crafting station types required for recipes | | `CraftState` | enum | SparkEngine | [LootAndCraftingSystem.h:L266](../../SparkEngine/Source/Engine/Crafting/LootAndCraftingSystem.h#L266) | State of an in-progress craft | -| `CrashReportDelivery` | enum | SparkEngine | [CrashHandler.cpp:L502](../../SparkEngine/Source/Utils/CrashHandler.cpp#L502) | | +| `CrashReportDelivery` | enum | SparkEngine | [CrashHandler.cpp:L503](../../SparkEngine/Source/Utils/CrashHandler.cpp#L503) | | | `CrosshairStyle` | enum | GameModules | [HUDSystem.h:L33](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L33) | Crosshair style options | | `CSGOperation` | enum | SparkEngine | [CSGSystem.h:L80](../../SparkEngine/Source/Engine/LevelDesign/CSGSystem.h#L80) | Boolean operation types | | `CullMode` | enum | SparkEditor | [RenderingEnums.h:L84](../../SparkEditor/Source/Enums/RenderingEnums.h#L84) | Cull modes | @@ -954,6 +954,7 @@ | `WeaponType` | enum | SparkSDK | [WeaponTypes.h:L20](../../SparkSDK/Include/Spark/WeaponTypes.h#L20) | Weapon types supported by the game system | | `WeatherCondition` | enum | GameModules | [RacingEnums.h:L75](../../GameModules/SparkGameRacing/Source/Enums/RacingEnums.h#L75) | Weather conditions affecting visibility and grip | | `WeatherPreset` | enum | GameModules | [FPSWeatherPort.h:L12](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherPort.h#L12) | | +| `WeatherPreset` | enum | SparkSDK | [IWeatherService.h:L12](../../SparkSDK/Include/Spark/IWeatherService.h#L12) | | | `WeatherType` | enum | SparkEngine | [WeatherSystem.h:L51](../../SparkEngine/Source/Graphics/WeatherSystem.h#L51) | Available weather conditions | | `WeatherType` | enum | Tests | [TestWeatherSystem.cpp:L12](../../Tests/TestWeatherSystem.cpp#L12) | | | `WindDirection` | enum | SparkEngine | [WeatherSystem.h:L65](../../SparkEngine/Source/Graphics/WeatherSystem.h#L65) | Wind direction presets | diff --git a/wiki/reference/File-Tree.md b/wiki/reference/File-Tree.md index 9d264b75a..7994f2c09 100644 --- a/wiki/reference/File-Tree.md +++ b/wiki/reference/File-Tree.md @@ -66,13 +66,13 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`FPSConsolePolicy.h`](../../GameModules/SparkGameFPS/Source/Console/FPSConsolePolicy.h) - 116 LOC ### `GameModules/SparkGameFPS/Source/Core/` -- [`EngineWeatherAdapter.cpp`](../../GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.cpp) - 35 LOC +- [`EngineWeatherAdapter.cpp`](../../GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.cpp) - 36 LOC - [`EngineWeatherAdapter.h`](../../GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.h) - 25 LOC - [`FPSAssert.h`](../../GameModules/SparkGameFPS/Source/Core/FPSAssert.h) - 66 LOC - [`FPSLog.h`](../../GameModules/SparkGameFPS/Source/Core/FPSLog.h) - 114 LOC - [`HeadlessArena.cpp`](../../GameModules/SparkGameFPS/Source/Core/HeadlessArena.cpp) - 109 LOC - [`HeadlessPersistence.cpp`](../../GameModules/SparkGameFPS/Source/Core/HeadlessPersistence.cpp) - 187 LOC -- [`Main.cpp`](../../GameModules/SparkGameFPS/Source/Core/Main.cpp) - 1388 LOC +- [`Main.cpp`](../../GameModules/SparkGameFPS/Source/Core/Main.cpp) - 1391 LOC - [`SparkGameFPS.h`](../../GameModules/SparkGameFPS/Source/Core/SparkGameFPS.h) - 127 LOC ### `GameModules/SparkGameFPS/Source/Game/` @@ -84,7 +84,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`Enemy.h`](../../GameModules/SparkGameFPS/Source/Game/Enemy.h) - 140 LOC - [`FPSArenaAutopilot.cpp`](../../GameModules/SparkGameFPS/Source/Game/FPSArenaAutopilot.cpp) - 197 LOC - [`FPSArenaAutopilot.h`](../../GameModules/SparkGameFPS/Source/Game/FPSArenaAutopilot.h) - 130 LOC -- [`FPSAssetPaths.cpp`](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp) - 245 LOC +- [`FPSAssetPaths.cpp`](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp) - 263 LOC - [`FPSAssetPaths.h`](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h) - 88 LOC - [`FPSGameplayEvents.cpp`](../../GameModules/SparkGameFPS/Source/Game/FPSGameplayEvents.cpp) - 48 LOC - [`FPSLocalProfile.cpp`](../../GameModules/SparkGameFPS/Source/Game/FPSLocalProfile.cpp) - 127 LOC @@ -92,14 +92,14 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`FPSQuickLoad.cpp`](../../GameModules/SparkGameFPS/Source/Game/FPSQuickLoad.cpp) - 40 LOC - [`FPSQuickLoad.h`](../../GameModules/SparkGameFPS/Source/Game/FPSQuickLoad.h) - 50 LOC - [`FPSStateRules.h`](../../GameModules/SparkGameFPS/Source/Game/FPSStateRules.h) - 41 LOC -- [`FPSWeatherIntegration.h`](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h) - 58 LOC +- [`FPSWeatherIntegration.h`](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h) - 60 LOC - [`FPSWeatherPort.h`](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherPort.h) - 30 LOC - [`FpsSnapshotCodec.cpp`](../../GameModules/SparkGameFPS/Source/Game/FpsSnapshotCodec.cpp) - 190 LOC -- [`Game.cpp`](../../GameModules/SparkGameFPS/Source/Game/Game.cpp) - 1117 LOC -- [`Game.h`](../../GameModules/SparkGameFPS/Source/Game/Game.h) - 759 LOC -- [`GameConsoleOps.cpp`](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp) - 1141 LOC +- [`Game.cpp`](../../GameModules/SparkGameFPS/Source/Game/Game.cpp) - 1244 LOC +- [`Game.h`](../../GameModules/SparkGameFPS/Source/Game/Game.h) - 783 LOC +- [`GameConsoleOps.cpp`](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp) - 1149 LOC - [`GameDebugUI.cpp`](../../GameModules/SparkGameFPS/Source/Game/GameDebugUI.cpp) - 214 LOC -- [`GameEngineSystems.cpp`](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp) - 458 LOC +- [`GameEngineSystems.cpp`](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp) - 631 LOC - [`GameMechanics.cpp`](../../GameModules/SparkGameFPS/Source/Game/GameMechanics.cpp) - 231 LOC - [`GameMechanics.h`](../../GameModules/SparkGameFPS/Source/Game/GameMechanics.h) - 293 LOC - [`GameMechanicsRespawn.cpp`](../../GameModules/SparkGameFPS/Source/Game/GameMechanicsRespawn.cpp) - 272 LOC @@ -458,9 +458,10 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TFOnboardingSessionRules.h`](../../GameModules/SparkGameMMOFPS/Source/Net/TFOnboardingSessionRules.h) - 61 LOC - [`TFRedeployProtocol.h`](../../GameModules/SparkGameMMOFPS/Source/Net/TFRedeployProtocol.h) - 64 LOC - [`TFRepProtocol.h`](../../GameModules/SparkGameMMOFPS/Source/Net/TFRepProtocol.h) - 280 LOC -- [`TFReplication.cpp`](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp) - 334 LOC -- [`TFReplication.h`](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h) - 142 LOC +- [`TFReplication.cpp`](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp) - 343 LOC +- [`TFReplication.h`](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h) - 146 LOC - [`TFReplicationClient.cpp`](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp) - 266 LOC +- [`TFReplicationRefresh.h`](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h) - 54 LOC - [`TFScramWire.cpp`](../../GameModules/SparkGameMMOFPS/Source/Net/TFScramWire.cpp) - 224 LOC - [`TFScramWire.h`](../../GameModules/SparkGameMMOFPS/Source/Net/TFScramWire.h) - 106 LOC - [`TFServerSim.cpp`](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.cpp) - 401 LOC @@ -826,7 +827,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`AssetCooker.cpp`](../../SparkAssetPipelineCore/src/AssetCooker.cpp) - 1550 LOC ### `SparkAssetPipelineCore/tests/` -- [`AssetCookerTests.cpp`](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp) - 411 LOC +- [`AssetCookerTests.cpp`](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp) - 454 LOC ### `SparkAutomation/src/` - [`main.cpp`](../../SparkAutomation/src/main.cpp) - 681 LOC @@ -856,15 +857,15 @@ Auto-generated by `docs/generate-file-tree.sh`. ### `SparkBuild/tests/` - [`DownloaderTests.cpp`](../../SparkBuild/tests/DownloaderTests.cpp) - 979 LOC -- [`ProcessRunnerTests.cpp`](../../SparkBuild/tests/ProcessRunnerTests.cpp) - 758 LOC +- [`ProcessRunnerTests.cpp`](../../SparkBuild/tests/ProcessRunnerTests.cpp) - 749 LOC ### `SparkConsole/src/` - [`CommandParser.cpp`](../../SparkConsole/src/CommandParser.cpp) - 57 LOC - [`CommandParser.h`](../../SparkConsole/src/CommandParser.h) - 37 LOC - [`CommandRegistry.cpp`](../../SparkConsole/src/CommandRegistry.cpp) - 84 LOC - [`CommandRegistry.h`](../../SparkConsole/src/CommandRegistry.h) - 79 LOC -- [`ConsoleApp.cpp`](../../SparkConsole/src/ConsoleApp.cpp) - 1190 LOC -- [`ConsoleApp.h`](../../SparkConsole/src/ConsoleApp.h) - 152 LOC +- [`ConsoleApp.cpp`](../../SparkConsole/src/ConsoleApp.cpp) - 1194 LOC +- [`ConsoleApp.h`](../../SparkConsole/src/ConsoleApp.h) - 153 LOC - [`ConsoleHistoryPolicy.h`](../../SparkConsole/src/ConsoleHistoryPolicy.h) - 52 LOC - [`PipeMessageFramer.h`](../../SparkConsole/src/PipeMessageFramer.h) - 77 LOC - [`main.cpp`](../../SparkConsole/src/main.cpp) - 135 LOC @@ -940,7 +941,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`EditorApplication.cpp`](../../SparkEditor/Source/Core/EditorApplication.cpp) - 322 LOC - [`EditorApplication.h`](../../SparkEditor/Source/Core/EditorApplication.h) - 175 LOC -- [`EditorApplicationLinux.cpp`](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp) - 358 LOC +- [`EditorApplicationLinux.cpp`](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp) - 359 LOC - [`EditorApplicationWindows.cpp`](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp) - 484 LOC - [`EditorCommandRegistry.cpp`](../../SparkEditor/Source/Core/EditorCommandRegistry.cpp) - 176 LOC - [`EditorCrashHandler.cpp`](../../SparkEditor/Source/Core/EditorCrashHandler.cpp) - 890 LOC @@ -958,7 +959,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`EditorMenuBar.cpp`](../../SparkEditor/Source/Core/EditorMenuBar.cpp) - 860 LOC - [`EditorNotificationManager.cpp`](../../SparkEditor/Source/Core/EditorNotificationManager.cpp) - 151 LOC - [`EditorNotificationManager.h`](../../SparkEditor/Source/Core/EditorNotificationManager.h) - 62 LOC -- [`EditorPanel.cpp`](../../SparkEditor/Source/Core/EditorPanel.cpp) - 86 LOC +- [`EditorPanel.cpp`](../../SparkEditor/Source/Core/EditorPanel.cpp) - 87 LOC - [`EditorPanel.h`](../../SparkEditor/Source/Core/EditorPanel.h) - 301 LOC - [`EditorPanelFactory.cpp`](../../SparkEditor/Source/Core/EditorPanelFactory.cpp) - 360 LOC - [`EditorPanelFactoryMetadata.cpp`](../../SparkEditor/Source/Core/EditorPanelFactoryMetadata.cpp) - 209 LOC @@ -973,12 +974,12 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`EditorTheme.h`](../../SparkEditor/Source/Core/EditorTheme.h) - 342 LOC - [`EditorThemeDocument.cpp`](../../SparkEditor/Source/Core/EditorThemeDocument.cpp) - 132 LOC - [`EditorThemeDocument.h`](../../SparkEditor/Source/Core/EditorThemeDocument.h) - 42 LOC -- [`EditorUI.cpp`](../../SparkEditor/Source/Core/EditorUI.cpp) - 2723 LOC -- [`EditorUI.h`](../../SparkEditor/Source/Core/EditorUI.h) - 533 LOC +- [`EditorUI.cpp`](../../SparkEditor/Source/Core/EditorUI.cpp) - 2725 LOC +- [`EditorUI.h`](../../SparkEditor/Source/Core/EditorUI.h) - 531 LOC - [`EditorWindowManager.cpp`](../../SparkEditor/Source/Core/EditorWindowManager.cpp) - 414 LOC - [`EditorWindowManager.h`](../../SparkEditor/Source/Core/EditorWindowManager.h) - 250 LOC - [`IEditorPlugin.h`](../../SparkEditor/Source/Core/IEditorPlugin.h) - 100 LOC -- [`ProjectDocument.cpp`](../../SparkEditor/Source/Core/ProjectDocument.cpp) - 581 LOC +- [`ProjectDocument.cpp`](../../SparkEditor/Source/Core/ProjectDocument.cpp) - 582 LOC - [`ProjectDocument.h`](../../SparkEditor/Source/Core/ProjectDocument.h) - 97 LOC - [`ProjectManager.cpp`](../../SparkEditor/Source/Core/ProjectManager.cpp) - 2362 LOC - [`ProjectManager.h`](../../SparkEditor/Source/Core/ProjectManager.h) - 270 LOC @@ -1019,8 +1020,10 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`AbilityEditorPanel.cpp`](../../SparkEditor/Source/Panels/AbilityEditorPanel.cpp) - 381 LOC - [`AbilityEditorPanel.h`](../../SparkEditor/Source/Panels/AbilityEditorPanel.h) - 98 LOC - [`AssetAuditGraph.h`](../../SparkEditor/Source/Panels/AssetAuditGraph.h) - 490 LOC -- [`AssetBrowserPanel.cpp`](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp) - 771 LOC -- [`AssetBrowserPanel.h`](../../SparkEditor/Source/Panels/AssetBrowserPanel.h) - 127 LOC +- [`AssetBrowserGrid.cpp`](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp) - 376 LOC +- [`AssetBrowserPanel.cpp`](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp) - 416 LOC +- [`AssetBrowserPanel.h`](../../SparkEditor/Source/Panels/AssetBrowserPanel.h) - 138 LOC +- [`AssetBrowserPathUtils.h`](../../SparkEditor/Source/Panels/AssetBrowserPathUtils.h) - 37 LOC - [`AudioMixerPanel.cpp`](../../SparkEditor/Source/Panels/AudioMixerPanel.cpp) - 279 LOC - [`AudioMixerPanel.h`](../../SparkEditor/Source/Panels/AudioMixerPanel.h) - 91 LOC - [`BasicMaterialEditorDrawing.cpp`](../../SparkEditor/Source/Panels/BasicMaterialEditorDrawing.cpp) - 347 LOC @@ -1092,10 +1095,14 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`InspectorWorldAssetDrop.h`](../../SparkEditor/Source/Panels/InspectorWorldAssetDrop.h) - 57 LOC - [`LocalizationPanel.cpp`](../../SparkEditor/Source/Panels/LocalizationPanel.cpp) - 261 LOC - [`LocalizationPanel.h`](../../SparkEditor/Source/Panels/LocalizationPanel.h) - 60 LOC -- [`MaterialEditorPanel.cpp`](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp) - 693 LOC +- [`MaterialEditorDefaults.cpp`](../../SparkEditor/Source/Panels/MaterialEditorDefaults.cpp) - 208 LOC +- [`MaterialEditorFiles.cpp`](../../SparkEditor/Source/Panels/MaterialEditorFiles.cpp) - 226 LOC +- [`MaterialEditorMaterialParser.cpp`](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp) - 352 LOC +- [`MaterialEditorMaterialParser.h`](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.h) - 16 LOC +- [`MaterialEditorPanel.cpp`](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp) - 523 LOC - [`MaterialEditorPanel.h`](../../SparkEditor/Source/Panels/MaterialEditorPanel.h) - 278 LOC - [`MaterialEditorParameters.cpp`](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp) - 537 LOC -- [`MaterialEditorPreview.cpp`](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp) - 787 LOC +- [`MaterialEditorPreview.cpp`](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp) - 594 LOC - [`ModdingPanel.cpp`](../../SparkEditor/Source/Panels/ModdingPanel.cpp) - 260 LOC - [`ModdingPanel.h`](../../SparkEditor/Source/Panels/ModdingPanel.h) - 66 LOC - [`NetworkDebugPanel.h`](../../SparkEditor/Source/Panels/NetworkDebugPanel.h) - 521 LOC @@ -1107,7 +1114,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`Physics2DPanel.h`](../../SparkEditor/Source/Panels/Physics2DPanel.h) - 80 LOC - [`Physics3DPanel.cpp`](../../SparkEditor/Source/Panels/Physics3DPanel.cpp) - 331 LOC - [`Physics3DPanel.h`](../../SparkEditor/Source/Panels/Physics3DPanel.h) - 111 LOC -- [`PlayControlLaunch.cpp`](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp) - 409 LOC +- [`PlayControlLaunch.cpp`](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp) - 411 LOC - [`PlayControlPanel.cpp`](../../SparkEditor/Source/Panels/PlayControlPanel.cpp) - 245 LOC - [`PlayControlPanel.h`](../../SparkEditor/Source/Panels/PlayControlPanel.h) - 114 LOC - [`PlayModeToolbarPanel.cpp`](../../SparkEditor/Source/Panels/PlayModeToolbarPanel.cpp) - 648 LOC @@ -1313,7 +1320,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`EngineConsoleCommands.cpp`](../../SparkEngine/Source/Core/EngineConsoleCommands.cpp) - 1040 LOC - [`EngineConsoleCommands.h`](../../SparkEngine/Source/Core/EngineConsoleCommands.h) - 28 LOC - [`EngineContext.cpp`](../../SparkEngine/Source/Core/EngineContext.cpp) - 105 LOC -- [`EngineContext.h`](../../SparkEngine/Source/Core/EngineContext.h) - 435 LOC +- [`EngineContext.h`](../../SparkEngine/Source/Core/EngineContext.h) - 440 LOC - [`EngineDiagnostics.cpp`](../../SparkEngine/Source/Core/EngineDiagnostics.cpp) - 1095 LOC - [`EngineDiagnostics.h`](../../SparkEngine/Source/Core/EngineDiagnostics.h) - 94 LOC - [`EngineDiagnosticsExtended.cpp`](../../SparkEngine/Source/Core/EngineDiagnosticsExtended.cpp) - 554 LOC @@ -1325,6 +1332,8 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`EngineSdkLogger.h`](../../SparkEngine/Source/Core/EngineSdkLogger.h) - 31 LOC - [`EngineSdkStateValidation.cpp`](../../SparkEngine/Source/Core/EngineSdkStateValidation.cpp) - 36 LOC - [`EngineSdkStateValidation.h`](../../SparkEngine/Source/Core/EngineSdkStateValidation.h) - 31 LOC +- [`EngineSdkWeather.cpp`](../../SparkEngine/Source/Core/EngineSdkWeather.cpp) - 46 LOC +- [`EngineSdkWeather.h`](../../SparkEngine/Source/Core/EngineSdkWeather.h) - 18 LOC - [`EngineSettings.cpp`](../../SparkEngine/Source/Core/EngineSettings.cpp) - 1718 LOC - [`EngineSettings.h`](../../SparkEngine/Source/Core/EngineSettings.h) - 1149 LOC - [`EngineSettingsConsole.cpp`](../../SparkEngine/Source/Core/EngineSettingsConsole.cpp) - 184 LOC @@ -1395,15 +1404,15 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`SparkEngineLinuxInit.cpp`](../../SparkEngine/Source/Core/SparkEngineLinuxInit.cpp) - 480 LOC - [`SparkEngineLinuxInternal.h`](../../SparkEngine/Source/Core/SparkEngineLinuxInternal.h) - 94 LOC - [`SparkEngineLinuxSDL2.cpp`](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2.cpp) - 578 LOC -- [`SparkEngineLinuxSDL2Events.cpp`](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2Events.cpp) - 234 LOC +- [`SparkEngineLinuxSDL2Events.cpp`](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2Events.cpp) - 236 LOC - [`SparkEngineMacOS.cpp`](../../SparkEngine/Source/Core/SparkEngineMacOS.cpp) - 136 LOC - [`SparkEngineMacOS.h`](../../SparkEngine/Source/Core/SparkEngineMacOS.h) - 54 LOC -- [`SparkEngineWindows.cpp`](../../SparkEngine/Source/Core/SparkEngineWindows.cpp) - 556 LOC +- [`SparkEngineWindows.cpp`](../../SparkEngine/Source/Core/SparkEngineWindows.cpp) - 552 LOC - [`SparkEngineWindowsHeadless.cpp`](../../SparkEngine/Source/Core/SparkEngineWindowsHeadless.cpp) - 538 LOC - [`SparkEngineWindowsInit.cpp`](../../SparkEngine/Source/Core/SparkEngineWindowsInit.cpp) - 335 LOC - [`SparkEngineWindowsInternal.h`](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h) - 107 LOC -- [`SparkEngineWindowsModules.cpp`](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp) - 244 LOC -- [`SparkEngineWindowsWin32.cpp`](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp) - 492 LOC +- [`SparkEngineWindowsModules.cpp`](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp) - 245 LOC +- [`SparkEngineWindowsWin32.cpp`](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp) - 521 LOC - [`SparkExport.h`](../../SparkEngine/Source/Core/SparkExport.h) - 38 LOC - [`SparkPak.cpp`](../../SparkEngine/Source/Core/SparkPak.cpp) - 549 LOC - [`SparkPak.h`](../../SparkEngine/Source/Core/SparkPak.h) - 170 LOC @@ -1434,7 +1443,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`AIDirector.cpp`](../../SparkEngine/Source/Engine/AI/AIDirector.cpp) - 262 LOC - [`AIDirector.h`](../../SparkEngine/Source/Engine/AI/AIDirector.h) - 220 LOC - [`AIIntegration.h`](../../SparkEngine/Source/Engine/AI/AIIntegration.h) - 297 LOC -- [`AISystem.cpp`](../../SparkEngine/Source/Engine/AI/AISystem.cpp) - 937 LOC +- [`AISystem.cpp`](../../SparkEngine/Source/Engine/AI/AISystem.cpp) - 938 LOC - [`AISystem.h`](../../SparkEngine/Source/Engine/AI/AISystem.h) - 428 LOC - [`BehaviorTree.h`](../../SparkEngine/Source/Engine/AI/BehaviorTree.h) - 318 LOC - [`BehaviorTreeNodes.h`](../../SparkEngine/Source/Engine/AI/BehaviorTreeNodes.h) - 417 LOC @@ -1755,8 +1764,8 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`VisualScriptCompiler.cpp`](../../SparkEngine/Source/Engine/Scripting/VisualScriptCompiler.cpp) - 284 LOC - [`VisualScriptCompiler.h`](../../SparkEngine/Source/Engine/Scripting/VisualScriptCompiler.h) - 71 LOC - [`VisualScriptEmitNode.cpp`](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitNode.cpp) - 331 LOC -- [`VisualScriptEmitter.cpp`](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp) - 521 LOC -- [`VisualScriptEmitter.h`](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h) - 157 LOC +- [`VisualScriptEmitter.cpp`](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp) - 549 LOC +- [`VisualScriptEmitter.h`](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h) - 170 LOC - [`VisualScriptGraphIO.cpp`](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphIO.cpp) - 578 LOC - [`VisualScriptGraphIO.h`](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphIO.h) - 134 LOC - [`VisualScriptGraphTypes.h`](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphTypes.h) - 144 LOC @@ -1794,7 +1803,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`UILayoutExtensions.h`](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h) - 280 LOC - [`UISystem.cpp`](../../SparkEngine/Source/Engine/UI/UISystem.cpp) - 177 LOC - [`UISystem.h`](../../SparkEngine/Source/Engine/UI/UISystem.h) - 491 LOC -- [`UIWidgets.cpp`](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp) - 268 LOC +- [`UIWidgets.cpp`](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp) - 270 LOC ### `SparkEngine/Source/Engine/VR/` - [`VRSystem.cpp`](../../SparkEngine/Source/Engine/VR/VRSystem.cpp) - 120 LOC @@ -2289,8 +2298,8 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`InputActionSystem.h`](../../SparkEngine/Source/Input/InputActionSystem.h) - 530 LOC - [`InputBindings.cpp`](../../SparkEngine/Source/Input/InputBindings.cpp) - 203 LOC - [`InputBindings.h`](../../SparkEngine/Source/Input/InputBindings.h) - 218 LOC -- [`InputManager.cpp`](../../SparkEngine/Source/Input/InputManager.cpp) - 1020 LOC -- [`InputManager.h`](../../SparkEngine/Source/Input/InputManager.h) - 519 LOC +- [`InputManager.cpp`](../../SparkEngine/Source/Input/InputManager.cpp) - 1043 LOC +- [`InputManager.h`](../../SparkEngine/Source/Input/InputManager.h) - 526 LOC - [`InputTypes.h`](../../SparkEngine/Source/Input/InputTypes.h) - 19 LOC - [`PlatformInput.h`](../../SparkEngine/Source/Input/PlatformInput.h) - 501 LOC ### `SparkEngine/Source/Physics/` @@ -2334,9 +2343,9 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`ReflectedSceneValidation.cpp`](../../SparkEngine/Source/SceneManager/ReflectedSceneValidation.cpp) - 299 LOC - [`ReflectedSceneValidation.h`](../../SparkEngine/Source/SceneManager/ReflectedSceneValidation.h) - 59 LOC - [`SceneConfigDatabase.h`](../../SparkEngine/Source/SceneManager/SceneConfigDatabase.h) - 162 LOC -- [`SceneManager.cpp`](../../SparkEngine/Source/SceneManager/SceneManager.cpp) - 1245 LOC -- [`SceneManager.h`](../../SparkEngine/Source/SceneManager/SceneManager.h) - 609 LOC -- [`SceneManagerReflected.cpp`](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp) - 154 LOC +- [`SceneManager.cpp`](../../SparkEngine/Source/SceneManager/SceneManager.cpp) - 1391 LOC +- [`SceneManager.h`](../../SparkEngine/Source/SceneManager/SceneManager.h) - 611 LOC +- [`SceneManagerReflected.cpp`](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp) - 223 LOC - [`SceneManagerTypes.h`](../../SparkEngine/Source/SceneManager/SceneManagerTypes.h) - 229 LOC - [`SceneTextFormat.cpp`](../../SparkEngine/Source/SceneManager/SceneTextFormat.cpp) - 697 LOC - [`SceneTextFormat.h`](../../SparkEngine/Source/SceneManager/SceneTextFormat.h) - 109 LOC @@ -2382,7 +2391,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`CpuDebugger.h`](../../SparkEngine/Source/Utils/CpuDebugger.h) - 455 LOC - [`CrashArtifactDirectory.h`](../../SparkEngine/Source/Utils/CrashArtifactDirectory.h) - 377 LOC - [`CrashArtifactRetention.h`](../../SparkEngine/Source/Utils/CrashArtifactRetention.h) - 338 LOC -- [`CrashHandler.cpp`](../../SparkEngine/Source/Utils/CrashHandler.cpp) - 2859 LOC +- [`CrashHandler.cpp`](../../SparkEngine/Source/Utils/CrashHandler.cpp) - 2905 LOC - [`CrashHandler.h`](../../SparkEngine/Source/Utils/CrashHandler.h) - 163 LOC - [`CrashHandlerStub.cpp`](../../SparkEngine/Source/Utils/CrashHandlerStub.cpp) - 39 LOC - [`CrashHandlerSupport.h`](../../SparkEngine/Source/Utils/CrashHandlerSupport.h) - 326 LOC @@ -2591,17 +2600,18 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`LauncherProcess.h`](../../SparkLauncher/src/LauncherProcess.h) - 86 LOC - [`LauncherTemplates.cpp`](../../SparkLauncher/src/LauncherTemplates.cpp) - 67 LOC - [`LauncherTemplates.h`](../../SparkLauncher/src/LauncherTemplates.h) - 49 LOC -- [`main.cpp`](../../SparkLauncher/src/main.cpp) - 164 LOC +- [`main.cpp`](../../SparkLauncher/src/main.cpp) - 178 LOC ### `SparkSDK/Include/Spark/` - [`AngleUtils.h`](../../SparkSDK/Include/Spark/AngleUtils.h) - 91 LOC - [`EventTypes.h`](../../SparkSDK/Include/Spark/EventTypes.h) - 28 LOC - [`GameTypes.h`](../../SparkSDK/Include/Spark/GameTypes.h) - 364 LOC - [`IConsole.h`](../../SparkSDK/Include/Spark/IConsole.h) - 106 LOC -- [`IEngineContext.h`](../../SparkSDK/Include/Spark/IEngineContext.h) - 399 LOC +- [`IEngineContext.h`](../../SparkSDK/Include/Spark/IEngineContext.h) - 404 LOC - [`ILogger.h`](../../SparkSDK/Include/Spark/ILogger.h) - 57 LOC - [`IModule.h`](../../SparkSDK/Include/Spark/IModule.h) - 208 LOC - [`IStateValidation.h`](../../SparkSDK/Include/Spark/IStateValidation.h) - 121 LOC +- [`IWeatherService.h`](../../SparkSDK/Include/Spark/IWeatherService.h) - 40 LOC - [`InputTypes.h`](../../SparkSDK/Include/Spark/InputTypes.h) - 94 LOC - [`MathTypes.h`](../../SparkSDK/Include/Spark/MathTypes.h) - 113 LOC - [`ModuleABI.h`](../../SparkSDK/Include/Spark/ModuleABI.h) - 274 LOC @@ -2615,7 +2625,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`SparkExport.h`](../../SparkSDK/Include/Spark/SparkExport.h) - 42 LOC - [`SparkSDK.h`](../../SparkSDK/Include/Spark/SparkSDK.h) - 35 LOC - [`StateMachine.h`](../../SparkSDK/Include/Spark/StateMachine.h) - 321 LOC -- [`Version.h`](../../SparkSDK/Include/Spark/Version.h) - 71 LOC +- [`Version.h`](../../SparkSDK/Include/Spark/Version.h) - 75 LOC - [`WeaponTypes.h`](../../SparkSDK/Include/Spark/WeaponTypes.h) - 55 LOC ### `SparkServer/src/` @@ -2754,7 +2764,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestAIDebugRendererReal.cpp`](../../Tests/TestAIDebugRendererReal.cpp) - 106 LOC - [`TestAIDirector.cpp`](../../Tests/TestAIDirector.cpp) - 91 LOC - [`TestAIDirectorPhaseII.cpp`](../../Tests/TestAIDirectorPhaseII.cpp) - 94 LOC -- [`TestAIIntegratedSystem.cpp`](../../Tests/TestAIIntegratedSystem.cpp) - 167 LOC +- [`TestAIIntegratedSystem.cpp`](../../Tests/TestAIIntegratedSystem.cpp) - 174 LOC - [`TestAIStress.cpp`](../../Tests/TestAIStress.cpp) - 822 LOC - [`TestASSET220GamePackagerReal.cpp`](../../Tests/TestASSET220GamePackagerReal.cpp) - 177 LOC - [`TestAbilitySystem.cpp`](../../Tests/TestAbilitySystem.cpp) - 730 LOC @@ -2785,7 +2795,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestAssetManifestReal.cpp`](../../Tests/TestAssetManifestReal.cpp) - 496 LOC - [`TestAssetMigration.cpp`](../../Tests/TestAssetMigration.cpp) - 473 LOC - [`TestAssetMigrationPhaseEE.cpp`](../../Tests/TestAssetMigrationPhaseEE.cpp) - 130 LOC -- [`TestAssetParserHardening.cpp`](../../Tests/TestAssetParserHardening.cpp) - 461 LOC +- [`TestAssetParserHardening.cpp`](../../Tests/TestAssetParserHardening.cpp) - 477 LOC - [`TestAssetPipelineCache.cpp`](../../Tests/TestAssetPipelineCache.cpp) - 490 LOC - [`TestAssetPipelineIntegration.cpp`](../../Tests/TestAssetPipelineIntegration.cpp) - 200 LOC - [`TestAssetPipelineReal.cpp`](../../Tests/TestAssetPipelineReal.cpp) - 282 LOC @@ -2918,7 +2928,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestECSWorld.cpp`](../../Tests/TestECSWorld.cpp) - 152 LOC - [`TestECSystemOrdering.cpp`](../../Tests/TestECSystemOrdering.cpp) - 521 LOC - [`TestECSystemSpecialized.cpp`](../../Tests/TestECSystemSpecialized.cpp) - 862 LOC -- [`TestECSystemsReal.cpp`](../../Tests/TestECSystemsReal.cpp) - 257 LOC +- [`TestECSystemsReal.cpp`](../../Tests/TestECSystemsReal.cpp) - 247 LOC - [`TestEDT210InspectorEditCommitReal.cpp`](../../Tests/TestEDT210InspectorEditCommitReal.cpp) - 324 LOC - [`TestENG200ScriptAudioAnimationReal.cpp`](../../Tests/TestENG200ScriptAudioAnimationReal.cpp) - 377 LOC - [`TestENG200ScriptBindingsReal.cpp`](../../Tests/TestENG200ScriptBindingsReal.cpp) - 808 LOC @@ -2934,8 +2944,8 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestEditorAssetReference.cpp`](../../Tests/TestEditorAssetReference.cpp) - 31 LOC - [`TestEditorAutomation.cpp`](../../Tests/TestEditorAutomation.cpp) - 228 LOC - [`TestEditorCommands.cpp`](../../Tests/TestEditorCommands.cpp) - 321 LOC -- [`TestEditorCookPackageReal.cpp`](../../Tests/TestEditorCookPackageReal.cpp) - 535 LOC -- [`TestEditorCrashHandlerFilterReal.cpp`](../../Tests/TestEditorCrashHandlerFilterReal.cpp) - 581 LOC +- [`TestEditorCookPackageReal.cpp`](../../Tests/TestEditorCookPackageReal.cpp) - 562 LOC +- [`TestEditorCrashHandlerFilterReal.cpp`](../../Tests/TestEditorCrashHandlerFilterReal.cpp) - 583 LOC - [`TestEditorDocumentReal.cpp`](../../Tests/TestEditorDocumentReal.cpp) - 233 LOC - [`TestEditorDocumentTransition.cpp`](../../Tests/TestEditorDocumentTransition.cpp) - 83 LOC - [`TestEditorGizmoTransformReal.cpp`](../../Tests/TestEditorGizmoTransformReal.cpp) - 155 LOC @@ -2945,7 +2955,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestEditorRecovery.cpp`](../../Tests/TestEditorRecovery.cpp) - 564 LOC - [`TestEditorStateCompatibility.cpp`](../../Tests/TestEditorStateCompatibility.cpp) - 441 LOC - [`TestEditorSubsystems.cpp`](../../Tests/TestEditorSubsystems.cpp) - 3315 LOC -- [`TestEditorSubsystemsReal.cpp`](../../Tests/TestEditorSubsystemsReal.cpp) - 608 LOC +- [`TestEditorSubsystemsReal.cpp`](../../Tests/TestEditorSubsystemsReal.cpp) - 849 LOC - [`TestEditorUndoHierarchyReal.cpp`](../../Tests/TestEditorUndoHierarchyReal.cpp) - 277 LOC - [`TestEditorUndoWorldMatrixReal.cpp`](../../Tests/TestEditorUndoWorldMatrixReal.cpp) - 225 LOC - [`TestEditorUntrustedProject.cpp`](../../Tests/TestEditorUntrustedProject.cpp) - 255 LOC @@ -2975,10 +2985,12 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestFBXImportValidation.cpp`](../../Tests/TestFBXImportValidation.cpp) - 85 LOC - [`TestFBXImporter.cpp`](../../Tests/TestFBXImporter.cpp) - 315 LOC - [`TestFPSComponentsReal.cpp`](../../Tests/TestFPSComponentsReal.cpp) - 158 LOC +- [`TestFPSGameCameraReloadReal.cpp`](../../Tests/TestFPSGameCameraReloadReal.cpp) - 161 LOC - [`TestFPSGameplayIntegration.cpp`](../../Tests/TestFPSGameplayIntegration.cpp) - 305 LOC - [`TestFPSLANLoopback.cpp`](../../Tests/TestFPSLANLoopback.cpp) - 564 LOC -- [`TestFPSMultiplayer.cpp`](../../Tests/TestFPSMultiplayer.cpp) - 1458 LOC -- [`TestFPSWeatherPort.cpp`](../../Tests/TestFPSWeatherPort.cpp) - 95 LOC +- [`TestFPSMultiplayer.cpp`](../../Tests/TestFPSMultiplayer.cpp) - 1469 LOC +- [`TestFPSOwnedSaveDecode.cpp`](../../Tests/TestFPSOwnedSaveDecode.cpp) - 116 LOC +- [`TestFPSWeatherPort.cpp`](../../Tests/TestFPSWeatherPort.cpp) - 165 LOC - [`TestFastNoise2SIMD.cpp`](../../Tests/TestFastNoise2SIMD.cpp) - 486 LOC - [`TestFaultIsolation.cpp`](../../Tests/TestFaultIsolation.cpp) - 352 LOC - [`TestFaultIsolationReal.cpp`](../../Tests/TestFaultIsolationReal.cpp) - 108 LOC @@ -3056,7 +3068,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestInGameConsole.cpp`](../../Tests/TestInGameConsole.cpp) - 229 LOC - [`TestInputActionSystem.cpp`](../../Tests/TestInputActionSystem.cpp) - 235 LOC - [`TestInputBindings.cpp`](../../Tests/TestInputBindings.cpp) - 71 LOC -- [`TestInputFrameEdgesReal.cpp`](../../Tests/TestInputFrameEdgesReal.cpp) - 138 LOC +- [`TestInputFrameEdgesReal.cpp`](../../Tests/TestInputFrameEdgesReal.cpp) - 236 LOC - [`TestInputSystem.cpp`](../../Tests/TestInputSystem.cpp) - 206 LOC - [`TestInstanceManager.cpp`](../../Tests/TestInstanceManager.cpp) - 441 LOC - [`TestInventorySystem.cpp`](../../Tests/TestInventorySystem.cpp) - 375 LOC @@ -3109,7 +3121,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestMOD380VehiclePhysicsReal.cpp`](../../Tests/TestMOD380VehiclePhysicsReal.cpp) - 463 LOC - [`TestMOD390VisualScriptDiagnosticsReal.cpp`](../../Tests/TestMOD390VisualScriptDiagnosticsReal.cpp) - 353 LOC - [`TestMOD390VisualScriptGameplayReal.cpp`](../../Tests/TestMOD390VisualScriptGameplayReal.cpp) - 283 LOC -- [`TestMOD390VisualScriptGraphsReal.cpp`](../../Tests/TestMOD390VisualScriptGraphsReal.cpp) - 822 LOC +- [`TestMOD390VisualScriptGraphsReal.cpp`](../../Tests/TestMOD390VisualScriptGraphsReal.cpp) - 865 LOC - [`TestMOD390VisualScriptHotReloadReal.cpp`](../../Tests/TestMOD390VisualScriptHotReloadReal.cpp) - 342 LOC - [`TestMSanCanary.cpp`](../../Tests/TestMSanCanary.cpp) - 62 LOC - [`TestMacOSPlatform.cpp`](../../Tests/TestMacOSPlatform.cpp) - 131 LOC @@ -3137,7 +3149,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestModuleDependency.cpp`](../../Tests/TestModuleDependency.cpp) - 139 LOC - [`TestModuleDiscovery.cpp`](../../Tests/TestModuleDiscovery.cpp) - 321 LOC - [`TestModuleHotReload.cpp`](../../Tests/TestModuleHotReload.cpp) - 170 LOC -- [`TestModuleLifecycleReal.cpp`](../../Tests/TestModuleLifecycleReal.cpp) - 673 LOC +- [`TestModuleLifecycleReal.cpp`](../../Tests/TestModuleLifecycleReal.cpp) - 688 LOC - [`TestModuleVersion.cpp`](../../Tests/TestModuleVersion.cpp) - 316 LOC - [`TestMovementSystem.cpp`](../../Tests/TestMovementSystem.cpp) - 540 LOC - [`TestMovieRenderPipeline.cpp`](../../Tests/TestMovieRenderPipeline.cpp) - 180 LOC @@ -3186,7 +3198,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestOpenWorldModule.cpp`](../../Tests/TestOpenWorldModule.cpp) - 974 LOC - [`TestPLT210AngelScriptVector3Real.cpp`](../../Tests/TestPLT210AngelScriptVector3Real.cpp) - 75 LOC - [`TestPLT210ProcessPosixReal.cpp`](../../Tests/TestPLT210ProcessPosixReal.cpp) - 175 LOC -- [`TestPLT210RuntimeProcessesReal.cpp`](../../Tests/TestPLT210RuntimeProcessesReal.cpp) - 138 LOC +- [`TestPLT210RuntimeProcessesReal.cpp`](../../Tests/TestPLT210RuntimeProcessesReal.cpp) - 145 LOC - [`TestPacketValidator.cpp`](../../Tests/TestPacketValidator.cpp) - 203 LOC - [`TestPacketValidatorReal.cpp`](../../Tests/TestPacketValidatorReal.cpp) - 93 LOC - [`TestParallelCulling.cpp`](../../Tests/TestParallelCulling.cpp) - 263 LOC @@ -3219,7 +3231,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestProcess.cpp`](../../Tests/TestProcess.cpp) - 399 LOC - [`TestProcessDrawListLinux.cpp`](../../Tests/TestProcessDrawListLinux.cpp) - 357 LOC - [`TestProfiler.cpp`](../../Tests/TestProfiler.cpp) - 316 LOC -- [`TestPrototypeModuleKitReal.cpp`](../../Tests/TestPrototypeModuleKitReal.cpp) - 511 LOC +- [`TestPrototypeModuleKitReal.cpp`](../../Tests/TestPrototypeModuleKitReal.cpp) - 517 LOC - [`TestProximityTriggerSystem.cpp`](../../Tests/TestProximityTriggerSystem.cpp) - 170 LOC - [`TestQuaternionStubsReal.cpp`](../../Tests/TestQuaternionStubsReal.cpp) - 316 LOC - [`TestQuestSystem.cpp`](../../Tests/TestQuestSystem.cpp) - 425 LOC @@ -3256,7 +3268,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestReflectionProbeCache.cpp`](../../Tests/TestReflectionProbeCache.cpp) - 275 LOC - [`TestReflectionReal.cpp`](../../Tests/TestReflectionReal.cpp) - 615 LOC - [`TestRegionMapDataSource.cpp`](../../Tests/TestRegionMapDataSource.cpp) - 166 LOC -- [`TestReliableChannel.cpp`](../../Tests/TestReliableChannel.cpp) - 995 LOC +- [`TestReliableChannel.cpp`](../../Tests/TestReliableChannel.cpp) - 1002 LOC - [`TestReliableOrderedSequenceReal.cpp`](../../Tests/TestReliableOrderedSequenceReal.cpp) - 526 LOC - [`TestRemoteDebugSystem.cpp`](../../Tests/TestRemoteDebugSystem.cpp) - 817 LOC - [`TestRenderCommandRing.cpp`](../../Tests/TestRenderCommandRing.cpp) - 239 LOC @@ -3293,7 +3305,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestSceneConfigDatabaseReal.cpp`](../../Tests/TestSceneConfigDatabaseReal.cpp) - 130 LOC - [`TestSceneGraph2D.cpp`](../../Tests/TestSceneGraph2D.cpp) - 118 LOC - [`TestSceneManager.cpp`](../../Tests/TestSceneManager.cpp) - 652 LOC -- [`TestSceneManagerReflectedReal.cpp`](../../Tests/TestSceneManagerReflectedReal.cpp) - 129 LOC +- [`TestSceneManagerReflectedReal.cpp`](../../Tests/TestSceneManagerReflectedReal.cpp) - 292 LOC - [`TestSceneManagerUnicodeReal.cpp`](../../Tests/TestSceneManagerUnicodeReal.cpp) - 123 LOC - [`TestSceneRoundtrip.cpp`](../../Tests/TestSceneRoundtrip.cpp) - 96 LOC - [`TestSceneSaveConfinedReal.cpp`](../../Tests/TestSceneSaveConfinedReal.cpp) - 283 LOC @@ -3309,6 +3321,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestScriptHookManagerPhaseBB.cpp`](../../Tests/TestScriptHookManagerPhaseBB.cpp) - 353 LOC - [`TestScriptHotReload.cpp`](../../Tests/TestScriptHotReload.cpp) - 483 LOC - [`TestScriptSandbox.cpp`](../../Tests/TestScriptSandbox.cpp) - 99 LOC +- [`TestSdkWeatherService.cpp`](../../Tests/TestSdkWeatherService.cpp) - 92 LOC - [`TestSeamlessAreaManager.cpp`](../../Tests/TestSeamlessAreaManager.cpp) - 546 LOC - [`TestSecDaemonCacheHardening.cpp`](../../Tests/TestSecDaemonCacheHardening.cpp) - 327 LOC - [`TestSecDaemonPipeIdentity.cpp`](../../Tests/TestSecDaemonPipeIdentity.cpp) - 357 LOC @@ -3350,7 +3363,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestSparkGameFPSMirrorCompanionsReal.cpp`](../../Tests/TestSparkGameFPSMirrorCompanionsReal.cpp) - 355 LOC - [`TestSparkGameShowcase.cpp`](../../Tests/TestSparkGameShowcase.cpp) - 667 LOC - [`TestSparkGatewayCoordinator.cpp`](../../Tests/TestSparkGatewayCoordinator.cpp) - 462 LOC -- [`TestSparkPak.cpp`](../../Tests/TestSparkPak.cpp) - 940 LOC +- [`TestSparkPak.cpp`](../../Tests/TestSparkPak.cpp) - 956 LOC - [`TestSparkServerApplication.cpp`](../../Tests/TestSparkServerApplication.cpp) - 550 LOC - [`TestSparkServerHealth.cpp`](../../Tests/TestSparkServerHealth.cpp) - 381 LOC - [`TestSparkTerrainFormatReal.cpp`](../../Tests/TestSparkTerrainFormatReal.cpp) - 153 LOC @@ -3377,12 +3390,12 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestTF120Migration.cpp`](../../Tests/TestTF120Migration.cpp) - 425 LOC - [`TestTF120Residency.cpp`](../../Tests/TestTF120Residency.cpp) - 819 LOC - [`TestTF120SharedSaveRoot.cpp`](../../Tests/TestTF120SharedSaveRoot.cpp) - 725 LOC -- [`TestTF120Travel.cpp`](../../Tests/TestTF120Travel.cpp) - 619 LOC +- [`TestTF120Travel.cpp`](../../Tests/TestTF120Travel.cpp) - 606 LOC - [`TestTFAbilityWire.cpp`](../../Tests/TestTFAbilityWire.cpp) - 140 LOC - [`TestTFCaptureMath.cpp`](../../Tests/TestTFCaptureMath.cpp) - 246 LOC - [`TestTFChatRules.cpp`](../../Tests/TestTFChatRules.cpp) - 156 LOC - [`TestTFDamageModel.cpp`](../../Tests/TestTFDamageModel.cpp) - 325 LOC -- [`TestTFDataTables.cpp`](../../Tests/TestTFDataTables.cpp) - 705 LOC +- [`TestTFDataTables.cpp`](../../Tests/TestTFDataTables.cpp) - 696 LOC - [`TestTFDeathRecapWire.cpp`](../../Tests/TestTFDeathRecapWire.cpp) - 144 LOC - [`TestTFFixedStep.cpp`](../../Tests/TestTFFixedStep.cpp) - 55 LOC - [`TestTFLanBeaconCodec.cpp`](../../Tests/TestTFLanBeaconCodec.cpp) - 113 LOC @@ -3392,7 +3405,8 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestTFOnboarding.cpp`](../../Tests/TestTFOnboarding.cpp) - 1574 LOC - [`TestTFOutfitStore.cpp`](../../Tests/TestTFOutfitStore.cpp) - 803 LOC - [`TestTFRedeployRules.cpp`](../../Tests/TestTFRedeployRules.cpp) - 202 LOC -- [`TestTFRegionLattice.cpp`](../../Tests/TestTFRegionLattice.cpp) - 426 LOC +- [`TestTFRegionLattice.cpp`](../../Tests/TestTFRegionLattice.cpp) - 419 LOC +- [`TestTFReplicationRefresh.cpp`](../../Tests/TestTFReplicationRefresh.cpp) - 141 LOC - [`TestTFScramAuth.cpp`](../../Tests/TestTFScramAuth.cpp) - 507 LOC - [`TestTFSecondaryMotion.cpp`](../../Tests/TestTFSecondaryMotion.cpp) - 264 LOC - [`TestTFServerSecurity.cpp`](../../Tests/TestTFServerSecurity.cpp) - 312 LOC @@ -3410,7 +3424,7 @@ Auto-generated by `docs/generate-file-tree.sh`. - [`TestTextureCompressorPhaseGG.cpp`](../../Tests/TestTextureCompressorPhaseGG.cpp) - 98 LOC - [`TestTextureStexBoundsReal.cpp`](../../Tests/TestTextureStexBoundsReal.cpp) - 232 LOC - [`TestTextureZombiePool.cpp`](../../Tests/TestTextureZombiePool.cpp) - 171 LOC -- [`TestThirdPartyIntegration.cpp`](../../Tests/TestThirdPartyIntegration.cpp) - 458 LOC +- [`TestThirdPartyIntegration.cpp`](../../Tests/TestThirdPartyIntegration.cpp) - 474 LOC - [`TestThreadDebugger.cpp`](../../Tests/TestThreadDebugger.cpp) - 336 LOC - [`TestThreadSafeQueue.cpp`](../../Tests/TestThreadSafeQueue.cpp) - 133 LOC - [`TestTimeOfDaySystem.cpp`](../../Tests/TestTimeOfDaySystem.cpp) - 394 LOC @@ -3510,5 +3524,5 @@ Auto-generated by `docs/generate-file-tree.sh`. | Metric | Count | |--------|------:| -| Source files scanned | 3015 | -| Total logical lines | 916714 | +| Source files scanned | 3029 | +| Total logical lines | 919402 | diff --git a/wiki/reference/Function-Index.md b/wiki/reference/Function-Index.md index b09118b11..4cce48518 100644 --- a/wiki/reference/Function-Index.md +++ b/wiki/reference/Function-Index.md @@ -2,7 +2,7 @@ > Free functions and out-of-line methods. > -> **Total:** 46075 symbols. Auto-generated by `docs/generate-symbol-index.sh`. +> **Total:** 46190 symbols. Auto-generated by `docs/generate-symbol-index.sh`. | Symbol | Kind | Module | Source | Brief | |--------|------|--------|--------|-------| @@ -19,7 +19,7 @@ | `_dup2` | function | Tests | [TestSparkError.cpp:L33](../../Tests/TestSparkError.cpp#L33) | | | `_fileno` | function | Tests | [TestSparkError.cpp:L21](../../Tests/TestSparkError.cpp#L21) | | | `_open` | function | Tests | [TestSparkError.cpp:L29](../../Tests/TestSparkError.cpp#L29) | | -| `_putenv_s` | function | SparkBuild | [ProcessRunnerTests.cpp:L598](../../SparkBuild/tests/ProcessRunnerTests.cpp#L598) | | +| `_putenv_s` | function | SparkBuild | [ProcessRunnerTests.cpp:L591](../../SparkBuild/tests/ProcessRunnerTests.cpp#L591) | | | `_putenv_s` | function | Tests | [TestSaveInterruptionReal.cpp:L169](../../Tests/TestSaveInterruptionReal.cpp#L169) | | | `_tfPerf` | function | GameModules | [TFBotSystem.cpp:L207](../../GameModules/SparkGameMMOFPS/Source/Game/TFBotSystem.cpp#L207) | | | `_tfPerf` | function | GameModules | [TFRegionSystem.cpp:L113](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.cpp#L113) | | @@ -31,7 +31,7 @@ | `a` | function | Tests | [TestEditorAutomation.cpp:L77](../../Tests/TestEditorAutomation.cpp#L77) | | | `a` | function | Tests | [TestEditorSubsystems.cpp:L2895](../../Tests/TestEditorSubsystems.cpp#L2895) | | | `a` | function | Tests | [TestEditorSubsystems.cpp:L2905](../../Tests/TestEditorSubsystems.cpp#L2905) | | -| `a` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L71](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L71) | | +| `a` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L72](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L72) | | | `a` | function | Tests | [TestServerMockClient.cpp:L557](../../Tests/TestServerMockClient.cpp#L557) | | | `a` | function | Tests | [TestServerMockClient.cpp:L1023](../../Tests/TestServerMockClient.cpp#L1023) | | | `a` | function | Tests | [TestServerMockClient.cpp:L1040](../../Tests/TestServerMockClient.cpp#L1040) | | @@ -99,9 +99,9 @@ | `AbortCoroutineSequence` | function | GameModules | [GameplayShowcase.h:L153](../../GameModules/SparkGame/Source/Core/GameplayShowcase.h#L153) | | | `AbortMigration` | function | GameModules | [TFDatabase.h:L313](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFDatabase.h#L313) | | | `About` | function | SparkEngine | [SparkEngineWindowsInternal.h:L105](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L105) | Run the engine in headless/dedicated server mode (Windows). | -| `About` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L482](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L482) | | +| `About` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L511](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L511) | | | `Absolute` | function | Tests | [TestRuntimePackageContentRoots.cpp:L23](../../Tests/TestRuntimePackageContentRoots.cpp#L23) | | -| `absolute` | function | Tests | [TestTFDataTables.cpp:L605](../../Tests/TestTFDataTables.cpp#L605) | | +| `absolute` | function | Tests | [TestTFDataTables.cpp:L596](../../Tests/TestTFDataTables.cpp#L596) | | | `absolutePath` | function | SparkEngine | [DaemonFraming.h:L178](../../SparkEngine/Source/Utils/DaemonFraming.h#L178) | | | `AbsoluteToLocal` | function | SparkEngine | [WorldOriginSystem.h:L156](../../SparkEngine/Source/Engine/World/WorldOriginSystem.h#L156) | Convert an absolute world position to local (rebased) space | | `Accept` | function | SparkEngine | [NetworkEncryption.h:L185](../../SparkEngine/Source/Engine/Networking/NetworkEncryption.h#L185) | Record a sequence if it is fresh | @@ -156,7 +156,7 @@ | `AcknowledgeRecovery` | function | Tests | [TestFreezeDetector.cpp:L99](../../Tests/TestFreezeDetector.cpp#L99) | | | `AcknowledgeSequence` | function | SparkEngine | [DeltaSnapshotManager.h:L144](../../SparkEngine/Source/Engine/Networking/DeltaSnapshotManager.h#L144) | | | `AcknowledgeSequence` | function | Tests | [TestNetworkManagerOrchestration.cpp:L275](../../Tests/TestNetworkManagerOrchestration.cpp#L275) | | -| `ackPayload` | function | Tests | [TestReliableChannel.cpp:L760](../../Tests/TestReliableChannel.cpp#L760) | | +| `ackPayload` | function | Tests | [TestReliableChannel.cpp:L763](../../Tests/TestReliableChannel.cpp#L763) | | | `AclFixtureError` | function | Tests | [TestGatewaySecurity.cpp:L55](../../Tests/TestGatewaySecurity.cpp#L55) | | | `AclFixtureError` | function | Tests | [TestGatewaySecurity.cpp:L111](../../Tests/TestGatewaySecurity.cpp#L111) | | | `AclFixtureError` | function | Tests | [TestGatewaySecurity.cpp:L120](../../Tests/TestGatewaySecurity.cpp#L120) | | @@ -224,10 +224,13 @@ | `ActiveTaskCount` | function | SparkEngine | [DynamicPluginHost.cpp:L553](../../SparkEngine/Source/Core/DynamicPluginHost.cpp#L553) | | | `ActiveWeaponDefLocal` | function | GameModules | [TFWeaponSystem.h:L72](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L72) | | | `ActiveWeaponModel` | function | GameModules | [TFWeaponSystem.h:L63](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L63) | | +| `activeWorker` | function | Tests | [TestFPSWeatherPort.cpp:L146](../../Tests/TestFPSWeatherPort.cpp#L146) | | | `actual` | function | Tests | [TestGoldenImageTest.cpp:L154](../../Tests/TestGoldenImageTest.cpp#L154) | | | `actual` | function | Tests | [TestGoldenImageTest.cpp:L189](../../Tests/TestGoldenImageTest.cpp#L189) | | -| `adapter` | function | Tests | [TestFPSWeatherPort.cpp:L53](../../Tests/TestFPSWeatherPort.cpp#L53) | | -| `adapter` | function | Tests | [TestFPSWeatherPort.cpp:L63](../../Tests/TestFPSWeatherPort.cpp#L63) | | +| `adapter` | function | Tests | [TestFPSWeatherPort.cpp:L73](../../Tests/TestFPSWeatherPort.cpp#L73) | | +| `adapter` | function | Tests | [TestFPSWeatherPort.cpp:L94](../../Tests/TestFPSWeatherPort.cpp#L94) | | +| `adapter` | function | Tests | [TestFPSWeatherPort.cpp:L102](../../Tests/TestFPSWeatherPort.cpp#L102) | | +| `adapter` | function | Tests | [TestFPSWeatherPort.cpp:L109](../../Tests/TestFPSWeatherPort.cpp#L109) | | | `Adapter` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L120](../../Tests/TestRHI225D3D12ParityReal.cpp#L120) | | | `Adapter` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L139](../../Tests/TestRHI225D3D12ParityReal.cpp#L139) | | | `Adapter` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L212](../../Tests/TestRHI225D3D12ParityReal.cpp#L212) | | @@ -341,7 +344,7 @@ | `AddEventTrack` | function | SparkEngine | [Sequencer.h:L268](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L268) | | | `AddFadeTrack` | function | SparkEngine | [Sequencer.h:L270](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L270) | | | `AddFile` | function | SparkEngine | [SparkPakWriter.h:L41](../../SparkEngine/Source/Core/SparkPakWriter.h#L41) | Add a file from a raw byte buffer. | -| `AddFile` | function | Tests | [TestSparkPak.cpp:L65](../../Tests/TestSparkPak.cpp#L65) | | +| `AddFile` | function | Tests | [TestSparkPak.cpp:L71](../../Tests/TestSparkPak.cpp#L71) | | | `AddFloat` | function | SparkEngine | [ProfileProperties.h:L67](../../SparkEngine/Source/Utils/ProfileProperties.h#L67) | Add to a property's float value | | `AddFloat` | function | Tests | [TestExtendedSystems.cpp:L552](../../Tests/TestExtendedSystems.cpp#L552) | | | `AddFloat4Parameter` | function | SparkEngine | [MaterialDefinition.h:L172](../../SparkEngine/Source/Graphics/MaterialDefinition.h#L172) | Add a float4 parameter (color, vector). | @@ -396,7 +399,7 @@ | `AddNewRule` | function | SparkEditor | [EventResponsePanel.h:L81](../../SparkEditor/Source/Panels/EventResponsePanel.h#L81) | | | `AddNode` | function | SparkEngine | [DialogueSystem.h:L136](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L136) | Add a node to the tree. | | `AddNode` | function | SparkEngine | [FastNoise2SIMD.h:L720](../../SparkEngine/Source/Graphics/FastNoise2SIMD.h#L720) | Add a node to the graph (takes ownership) | -| `AddNode` | function | SparkEngine | [SceneManager.h:L245](../../SparkEngine/Source/SceneManager/SceneManager.h#L245) | | +| `AddNode` | function | SparkEngine | [SceneManager.h:L247](../../SparkEngine/Source/SceneManager/SceneManager.h#L247) | | | `AddNode` | function | Tests | [TestAIStress.cpp:L352](../../Tests/TestAIStress.cpp#L352) | | | `AddNode` | function | Tests | [TestSceneManager.cpp:L50](../../Tests/TestSceneManager.cpp#L50) | | | `AddNodeAtPosition` | function | SparkEditor | [VisualScriptPanel.h:L141](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L141) | | @@ -488,7 +491,7 @@ | `AddSystem` | function | SparkEngine | [PhaseSystemManager.h:L100](../../SparkEngine/Source/Engine/ECS/Systems/PhaseSystemManager.h#L100) | Construct and register a system in a specific execution phase. | | `AddSystem` | function | SparkEngine | [PhaseSystemManager.h:L113](../../SparkEngine/Source/Engine/ECS/Systems/PhaseSystemManager.h#L113) | Legacy: register a system in the flat (unphased) list. | | `AddSystem` | function | Tests | [TestECSystemOrdering.cpp:L206](../../Tests/TestECSystemOrdering.cpp#L206) | | -| `AddSystem` | function | Tests | [TestECSystemsReal.cpp:L77](../../Tests/TestECSystemsReal.cpp#L77) | | +| `AddSystem` | function | Tests | [TestECSystemsReal.cpp:L67](../../Tests/TestECSystemsReal.cpp#L67) | | | `AddTag` | function | SparkEngine | [GameplayComponents.h:L34](../../SparkEngine/Source/Engine/ECS/Components/GameplayComponents.h#L34) | | | `AddTag` | function | SparkEngine | [GameplayTags.h:L79](../../SparkEngine/Source/Engine/Gameplay/GameplayTags.h#L79) | Add a tag to this container | | `AddTag` | function | Tests | [TestECSStress.cpp:L64](../../Tests/TestECSStress.cpp#L64) | | @@ -503,7 +506,7 @@ | `AddTextureLayer` | function | SparkEditor | [TerrainData.h:L156](../../SparkEditor/Source/Terrain/TerrainData.h#L156) | | | `AddTextureSlot` | function | SparkEngine | [MaterialDefinition.h:L189](../../SparkEngine/Source/Graphics/MaterialDefinition.h#L189) | Add a texture slot declaration. | | `AddTile` | function | SparkEditor | [LevelStreamingSystem.h:L117](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.h#L117) | Add tile to world | -| `AddToHistory` | function | SparkConsole | [ConsoleApp.h:L119](../../SparkConsole/src/ConsoleApp.h#L119) | | +| `AddToHistory` | function | SparkConsole | [ConsoleApp.h:L120](../../SparkConsole/src/ConsoleApp.h#L120) | | | `AddToRecentProjects` | function | SparkEditor | [ProjectManager.h:L234](../../SparkEditor/Source/Core/ProjectManager.h#L234) | | | `AddToRecentSearches` | function | SparkEditor | [SearchPanel.h:L135](../../SparkEditor/Source/Panels/SearchPanel.h#L135) | | | `AddToSelection` | function | GameModules | [RTSCommandSystem.h:L65](../../GameModules/SparkGameRTS/Source/Command/RTSCommandSystem.h#L65) | | @@ -617,6 +620,7 @@ | `AffixCountRange` | function | GameModules | [ARPGLootSystem.cpp:L30](../../GameModules/SparkGameARPG/Source/Loot/ARPGLootSystem.cpp#L30) | | | `AffixLevelScale` | function | GameModules | [ARPGLootSystem.cpp:L48](../../GameModules/SparkGameARPG/Source/Loot/ARPGLootSystem.cpp#L48) | | | `after` | function | Tests | [TestEditorSubsystems.cpp:L844](../../Tests/TestEditorSubsystems.cpp#L844) | | +| `after` | function | Tests | [TestEditorSubsystemsReal.cpp:L822](../../Tests/TestEditorSubsystemsReal.cpp#L822) | | | `afterRepeat` | function | SparkCrashReporter | [CrashReporterManifestTests.cpp:L788](../../SparkCrashReporter/tests/CrashReporterManifestTests.cpp#L788) | | | `AgentStateToString` | function | SparkEditor | [AIDebugPanel.h:L75](../../SparkEditor/Source/Panels/AIDebugPanel.h#L75) | | | `AggregateSkipped` | function | SparkEditor | [SceneImportPanel.h:L116](../../SparkEditor/Source/Panels/SceneImportPanel.h#L116) | Aggregate a flat skipped-type list into "type xN" strings. | @@ -680,8 +684,8 @@ | `AimIKModifier::Apply` | method | SparkEngine | [PoseModifier.cpp:L189](../../SparkEngine/Source/Engine/Animation/PoseModifier.cpp#L189) | | | `AimIKModifier::SetBoneChain` | method | SparkEngine | [PoseModifier.cpp:L182](../../SparkEngine/Source/Engine/Animation/PoseModifier.cpp#L182) | | | `AISystem::ClearBehaviors` | method | SparkEngine | [AISystem.cpp:L254](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L254) | | -| `AISystem::Console_GetAgentInfo` | method | SparkEngine | [AISystem.cpp:L685](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L685) | | -| `AISystem::Console_ListAgents` | method | SparkEngine | [AISystem.cpp:L643](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L643) | | +| `AISystem::Console_GetAgentInfo` | method | SparkEngine | [AISystem.cpp:L686](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L686) | | +| `AISystem::Console_ListAgents` | method | SparkEngine | [AISystem.cpp:L644](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L644) | | | `AISystem::CreateBehaviorInstance` | method | SparkEngine | [AISystem.cpp:L205](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L205) | | | `AISystem::RegisterBehavior` | method | SparkEngine | [AISystem.cpp:L197](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L197) | | | `AISystem::Update` | method | SparkEngine | [AISystem.cpp:L82](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L82) | | @@ -1141,7 +1145,7 @@ | `ApplyDifficulty` | function | SparkEngine | [AIDirector.h:L190](../../SparkEngine/Source/Engine/AI/AIDirector.h#L190) | Set intensity manually (console integration / debugging). | | `ApplyDirtyObstacles` | function | SparkEngine | [NavMeshObstacles.h:L268](../../SparkEngine/Source/Engine/AI/NavMeshObstacles.h#L268) | Re-carve all obstacles marked dirty since the last apply. | | `ApplyDot` | function | GameModules | [ARPGCombatSystem.h:L81](../../GameModules/SparkGameARPG/Source/Combat/ARPGCombatSystem.h#L81) | | -| `ApplyDueTimedKeyReleases` | function | SparkEngine | [InputManager.h:L376](../../SparkEngine/Source/Input/InputManager.h#L376) | Release every console-simulated key whose hold duration has elapsed | +| `ApplyDueTimedKeyReleases` | function | SparkEngine | [InputManager.h:L383](../../SparkEngine/Source/Input/InputManager.h#L383) | Release every console-simulated key whose hold duration has elapsed | | `ApplyEase` | function | SparkEngine | [TweenSystem.cpp:L19](../../SparkEngine/Source/Engine/Tween/TweenSystem.cpp#L19) | | | `ApplyEase` | function | SparkEngine | [TweenSystem.h:L73](../../SparkEngine/Source/Engine/Tween/TweenSystem.h#L73) | Apply the given ease function to a linear t value in [0, 1]. | | `ApplyEffect` | function | SparkEngine | [AbilitySystem.h:L327](../../SparkEngine/Source/Engine/Gameplay/AbilitySystem.h#L327) | | @@ -1192,7 +1196,7 @@ | `ApplyPlatformCarry` | function | GameModules | [PlatformerPlayerController.h:L168](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L168) | | | `ApplyPlayerDrive` | function | GameModules | [RacingRaceFlow.cpp:L193](../../GameModules/SparkGameRacing/Source/Core/RacingRaceFlow.cpp#L193) | | | `ApplyPose` | function | GameModules | [ARPGActorPresentation.cpp:L98](../../GameModules/SparkGameARPG/Source/Demo/ARPGActorPresentation.cpp#L98) | | -| `ApplyPosixCoreDumpPolicy` | function | SparkEngine | [CrashHandler.cpp:L2148](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2148) | | +| `ApplyPosixCoreDumpPolicy` | function | SparkEngine | [CrashHandler.cpp:L2179](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2179) | | | `ApplyPowerUp` | function | GameModules | [PlatformerPlayerController.h:L135](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L135) | Apply a temporary power-up effect | | `ApplyPrediction` | function | SparkEngine | [ClientPrediction.h:L130](../../SparkEngine/Source/Engine/Networking/ClientPrediction.h#L130) | Apply predicted movement locally. | | `ApplyPrefabToInstances` | function | SparkEditor | [PrefabManager.h:L203](../../SparkEditor/Source/Prefabs/PrefabManager.h#L203) | | @@ -1327,12 +1331,12 @@ | `AreTypesCompatible` | function | SparkEditor | [VisualScriptPanel.h:L147](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L147) | | | `arg` | function | SparkEditor | [main.cpp:L696](../../SparkEditor/Source/main.cpp#L696) | | | `Arg` | function | SparkEngine | [Process.h:L66](../../SparkEngine/Source/Utils/Process.h#L66) | | -| `args` | function | SparkEditor | [EditorUI.cpp:L1469](../../SparkEditor/Source/Core/EditorUI.cpp#L1469) | | +| `args` | function | SparkEditor | [EditorUI.cpp:L1489](../../SparkEditor/Source/Core/EditorUI.cpp#L1489) | | | `args` | function | SparkEditor | [ConsolePanel.cpp:L790](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L790) | | | `args` | function | SparkEditor | [EditorAutomation.h:L268](../../SparkEditor/Source/Panels/EditorAutomation.h#L268) | | | `args` | function | SparkEngine | [InGameConsole.h:L317](../../SparkEngine/Source/Utils/InGameConsole.h#L317) | | | `argument` | function | SparkConsole | [main.cpp:L32](../../SparkConsole/src/main.cpp#L32) | | -| `argument` | function | SparkLauncher | [main.cpp:L60](../../SparkLauncher/src/main.cpp#L60) | | +| `argument` | function | SparkLauncher | [main.cpp:L63](../../SparkLauncher/src/main.cpp#L63) | | | `ArgumentValue` | function | SparkEngine | [SparkEngineLinuxInit.cpp:L75](../../SparkEngine/Source/Core/SparkEngineLinuxInit.cpp#L75) | | | `ArgumentValue` | function | SparkEngine | [StartupSplash.cpp:L69](../../SparkEngine/Source/Core/StartupSplash.cpp#L69) | | | `ArithmeticShiftRight` | function | SparkEngine | [FastNoise2SIMD.h:L98](../../SparkEngine/Source/Graphics/FastNoise2SIMD.h#L98) | Defined arithmetic right shift for a 32-bit two's-complement bit pattern | @@ -1343,7 +1347,7 @@ | `ArmCrashAt` | function | Tests | [TestDATA120BackupRestore.cpp:L475](../../Tests/TestDATA120BackupRestore.cpp#L475) | | | `Armed` | function | GameModules | [TFChaosHarness.h:L76](../../GameModules/SparkGameMMOFPS/Source/Game/TFChaosHarness.h#L76) | | | `ArmRespawn` | function | GameModules | [GameMechanics.h:L227](../../GameModules/SparkGameFPS/Source/Game/GameMechanics.h#L227) | Arm the respawn countdown without scoring a death. | -| `ArmSignalReportWatchdog` | function | SparkEngine | [CrashHandler.cpp:L2183](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2183) | | +| `ArmSignalReportWatchdog` | function | SparkEngine | [CrashHandler.cpp:L2214](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2214) | | | `ARPGActorPresentation::DestroyActors` | method | GameModules | [ARPGActorPresentation.cpp:L282](../../GameModules/SparkGameARPG/Source/Demo/ARPGActorPresentation.cpp#L282) | | | `ARPGActorPresentation::GetHeroEntity` | method | GameModules | [ARPGActorPresentation.cpp:L303](../../GameModules/SparkGameARPG/Source/Demo/ARPGActorPresentation.cpp#L303) | | | `ARPGActorPresentation::GetMonsterEntity` | method | GameModules | [ARPGActorPresentation.cpp:L308](../../GameModules/SparkGameARPG/Source/Demo/ARPGActorPresentation.cpp#L308) | | @@ -1486,7 +1490,7 @@ | `arrowB` | function | SparkEditor | [SceneViewPanel.cpp:L1058](../../SparkEditor/Source/Panels/SceneViewPanel.cpp#L1058) | | | `artifact` | function | Tests | [TestCrashHandlerGatingReal.cpp:L305](../../Tests/TestCrashHandlerGatingReal.cpp#L305) | | | `Artifact` | function | Tests | [TestTelemetrySpool.cpp:L47](../../Tests/TestTelemetrySpool.cpp#L47) | | -| `ArtifactNameInPinnedRoot` | function | SparkEngine | [CrashHandler.cpp:L208](../../SparkEngine/Source/Utils/CrashHandler.cpp#L208) | | +| `ArtifactNameInPinnedRoot` | function | SparkEngine | [CrashHandler.cpp:L209](../../SparkEngine/Source/Utils/CrashHandler.cpp#L209) | | | `ArtifactNameInRoot` | function | SparkCrashReporter | [CrashReporterApp.cpp:L839](../../SparkCrashReporter/src/CrashReporterApp.cpp#L839) | | | `as` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L327](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L327) | | | `as` | function | SparkEngine | [GraphicsDeviceResourcesWindowsBasicState.cpp:L521](../../SparkEngine/Source/Graphics/GraphicsDeviceResourcesWindowsBasicState.cpp#L521) | | @@ -1532,7 +1536,7 @@ | `ASPlaySound` | function | SparkEngine | [AngelScriptEngine.h:L872](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L872) | | | `ASPrint` | function | SparkEngine | [AngelScriptEngine.cpp:L63](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.cpp#L63) | | | `ASPrint` | function | SparkEngine | [AngelScriptEngine.h:L738](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L738) | Print a message to the debug console (callable from AngelScript as `print()`) | -| `Assemble` | function | Tests | [TestEditorCookPackageReal.cpp:L396](../../Tests/TestEditorCookPackageReal.cpp#L396) | | +| `Assemble` | function | Tests | [TestEditorCookPackageReal.cpp:L407](../../Tests/TestEditorCookPackageReal.cpp#L407) | | | `Assemble` | function | Tests | [TestEditorSubsystems.cpp:L2460](../../Tests/TestEditorSubsystems.cpp#L2460) | | | `AssembleNativePackage` | function | SparkEditor | [BuildPipeline.h:L145](../../SparkEditor/Source/Panels/BuildPipeline.h#L145) | | | `AssembleNativePackageContents` | function | SparkEditor | [BuildPipeline.h:L153](../../SparkEditor/Source/Panels/BuildPipeline.h#L153) | | @@ -1568,23 +1572,24 @@ | `asset` | function | Tests | [TestGLTFAnimationImport.cpp:L538](../../Tests/TestGLTFAnimationImport.cpp#L538) | | | `asset` | function | Tests | [TestGLTFAnimationImport.cpp:L552](../../Tests/TestGLTFAnimationImport.cpp#L552) | | | `asset` | function | Tests | [TestMMOAssetImport.cpp:L59](../../Tests/TestMMOAssetImport.cpp#L59) | | -| `AssetBrowserPanel::ClearProject` | method | SparkEditor | [AssetBrowserPanel.cpp:L325](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L325) | | -| `AssetBrowserPanel::HandleEvent` | method | SparkEditor | [AssetBrowserPanel.cpp:L300](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L300) | | -| `AssetBrowserPanel::HasValidProjectRoot` | method | SparkEditor | [AssetBrowserPanel.cpp:L751](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L751) | | -| `AssetBrowserPanel::ImportAsset` | method | SparkEditor | [AssetBrowserPanel.cpp:L633](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L633) | | -| `AssetBrowserPanel::Initialize` | method | SparkEditor | [AssetBrowserPanel.cpp:L111](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L111) | | -| `AssetBrowserPanel::IsContainedByProject` | method | SparkEditor | [AssetBrowserPanel.cpp:L760](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L760) | | -| `AssetBrowserPanel::NavigateToFolder` | method | SparkEditor | [AssetBrowserPanel.cpp:L336](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L336) | | -| `AssetBrowserPanel::RefreshAssets` | method | SparkEditor | [AssetBrowserPanel.cpp:L592](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L592) | | -| `AssetBrowserPanel::Render` | method | SparkEditor | [AssetBrowserPanel.cpp:L164](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L164) | | -| `AssetBrowserPanel::RenderAssetDetails` | method | SparkEditor | [AssetBrowserPanel.cpp:L558](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L558) | | -| `AssetBrowserPanel::RenderAssetGrid` | method | SparkEditor | [AssetBrowserPanel.cpp:L410](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L410) | | -| `AssetBrowserPanel::RenderFolderNode` | method | SparkEditor | [AssetBrowserPanel.cpp:L382](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L382) | | -| `AssetBrowserPanel::RenderFolderTree` | method | SparkEditor | [AssetBrowserPanel.cpp:L353](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L353) | | -| `AssetBrowserPanel::SetOperationResult` | method | SparkEditor | [AssetBrowserPanel.cpp:L765](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L765) | | -| `AssetBrowserPanel::SetProjectPath` | method | SparkEditor | [AssetBrowserPanel.cpp:L305](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L305) | | -| `AssetBrowserPanel::Shutdown` | method | SparkEditor | [AssetBrowserPanel.cpp:L295](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L295) | | -| `AssetBrowserPanel::Update` | method | SparkEditor | [AssetBrowserPanel.cpp:L118](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L118) | | +| `AssetBrowserPanel::ClearProject` | method | SparkEditor | [AssetBrowserPanel.cpp:L152](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L152) | | +| `AssetBrowserPanel::HandleEvent` | method | SparkEditor | [AssetBrowserPanel.cpp:L105](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L105) | | +| `AssetBrowserPanel::HasValidProjectRoot` | method | SparkEditor | [AssetBrowserPanel.cpp:L396](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L396) | | +| `AssetBrowserPanel::ImportAsset` | method | SparkEditor | [AssetBrowserPanel.cpp:L278](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L278) | | +| `AssetBrowserPanel::Initialize` | method | SparkEditor | [AssetBrowserPanel.cpp:L88](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L88) | | +| `AssetBrowserPanel::IsContainedByProject` | method | SparkEditor | [AssetBrowserPanel.cpp:L405](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L405) | | +| `AssetBrowserPanel::NavigateToFolder` | method | SparkEditor | [AssetBrowserPanel.cpp:L163](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L163) | | +| `AssetBrowserPanel::OpenAsset` | method | SparkEditor | [AssetBrowserPanel.cpp:L110](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L110) | | +| `AssetBrowserPanel::RefreshAssets` | method | SparkEditor | [AssetBrowserPanel.cpp:L237](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L237) | | +| `AssetBrowserPanel::Render` | method | SparkEditor | [AssetBrowserGrid.cpp:L59](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L59) | | +| `AssetBrowserPanel::RenderAssetDetails` | method | SparkEditor | [AssetBrowserGrid.cpp:L342](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L342) | | +| `AssetBrowserPanel::RenderAssetGrid` | method | SparkEditor | [AssetBrowserGrid.cpp:L190](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L190) | | +| `AssetBrowserPanel::RenderFolderNode` | method | SparkEditor | [AssetBrowserPanel.cpp:L209](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L209) | | +| `AssetBrowserPanel::RenderFolderTree` | method | SparkEditor | [AssetBrowserPanel.cpp:L180](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L180) | | +| `AssetBrowserPanel::SetOperationResult` | method | SparkEditor | [AssetBrowserPanel.cpp:L410](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L410) | | +| `AssetBrowserPanel::SetProjectPath` | method | SparkEditor | [AssetBrowserPanel.cpp:L132](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L132) | | +| `AssetBrowserPanel::Shutdown` | method | SparkEditor | [AssetBrowserPanel.cpp:L100](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L100) | | +| `AssetBrowserPanel::Update` | method | SparkEditor | [AssetBrowserPanel.cpp:L95](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L95) | | | `AssetCache::AddAsset` | method | SparkEngine | [AssetTypesLinuxMedia.cpp:L184](../../SparkEngine/Source/Graphics/AssetTypesLinuxMedia.cpp#L184) | | | `AssetCache::AddAsset` | method | SparkEngine | [AssetTypesWindowsMedia.cpp:L562](../../SparkEngine/Source/Graphics/AssetTypesWindowsMedia.cpp#L562) | | | `AssetCache::Clear` | method | SparkEngine | [AssetTypesLinuxMedia.cpp:L253](../../SparkEngine/Source/Graphics/AssetTypesLinuxMedia.cpp#L253) | | @@ -1618,7 +1623,7 @@ | `AssetDependencyGraph::RemoveAsset` | method | SparkEditor | [AssetProcessors.cpp:L753](../../SparkEditor/Source/AssetPipeline/AssetProcessors.cpp#L753) | | | `AssetDependencyGraph::RemoveDependency` | method | SparkEditor | [AssetProcessors.cpp:L786](../../SparkEditor/Source/AssetPipeline/AssetProcessors.cpp#L786) | | | `assetDir` | function | SparkEditor | [AdvancedAssetPipelineUI.cpp:L608](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipelineUI.cpp#L608) | | -| `AssetExists` | function | Tests | [TestTFDataTables.cpp:L75](../../Tests/TestTFDataTables.cpp#L75) | | +| `AssetExists` | function | Tests | [TestTFDataTables.cpp:L66](../../Tests/TestTFDataTables.cpp#L66) | | | `AssetFileFor` | function | Tests | [TestSecDaemonCacheHardening.cpp:L209](../../Tests/TestSecDaemonCacheHardening.cpp#L209) | | | `AssetGet` | function | Tests | [TestDaemonLRU.cpp:L85](../../Tests/TestDaemonLRU.cpp#L85) | | | `AssetHandle` | function | SparkEngine | [AssetHandle.h:L43](../../SparkEngine/Source/Core/AssetHandle.h#L43) | | @@ -1737,7 +1742,9 @@ | `ASSetRotation` | function | SparkEngine | [AngelScriptEngine.cpp:L308](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.cpp#L308) | | | `ASSetRotation` | function | SparkEngine | [AngelScriptEngine.h:L834](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L834) | Set entity rotation from euler angles (callable as `setRotation()`) | | `Assets` | function | Tests | [TestSEC4NarrowPathsReal.cpp:L155](../../Tests/TestSEC4NarrowPathsReal.cpp#L155) | | -| `AssetSecDir` | function | Tests | [TestAssetParserHardening.cpp:L39](../../Tests/TestAssetParserHardening.cpp#L39) | | +| `AssetSecDir` | function | Tests | [TestAssetParserHardening.cpp:L55](../../Tests/TestAssetParserHardening.cpp#L55) | | +| `AssetSecRoot` | function | Tests | [TestAssetParserHardening.cpp:L45](../../Tests/TestAssetParserHardening.cpp#L45) | | +| `AssetSecTempPath` | function | Tests | [TestThirdPartyIntegration.cpp:L63](../../Tests/TestThirdPartyIntegration.cpp#L63) | | | `AssetService::BlobPath` | method | SparkDaemon | [AssetService.cpp:L318](../../SparkDaemon/src/AssetService.cpp#L318) | | | `AssetService::DeleteAllBlobFiles` | method | SparkDaemon | [AssetService.cpp:L443](../../SparkDaemon/src/AssetService.cpp#L443) | | | `AssetService::DeleteBlobFile` | method | SparkDaemon | [AssetService.cpp:L437](../../SparkDaemon/src/AssetService.cpp#L437) | | @@ -1799,7 +1806,7 @@ | `AssetValidator::ValidateFile` | method | SparkEngine | [AssetValidator.cpp:L246](../../SparkEngine/Source/Core/AssetValidator.cpp#L246) | | | `AssignAlternateOwnerOnlyAcl` | function | Tests | [TestGatewaySecurity.cpp:L197](../../Tests/TestGatewaySecurity.cpp#L197) | | | `AssignChampionAffixes` | function | GameModules | [ARPGMonsterSystem.h:L117](../../GameModules/SparkGameARPG/Source/Monster/ARPGMonsterSystem.h#L117) | | -| `AssignCrashConfig` | function | SparkEngine | [CrashHandler.cpp:L100](../../SparkEngine/Source/Utils/CrashHandler.cpp#L100) | | +| `AssignCrashConfig` | function | SparkEngine | [CrashHandler.cpp:L101](../../SparkEngine/Source/Utils/CrashHandler.cpp#L101) | | | `assigned` | function | GameModules | [TFDataTablesParseWorld.cpp:L187](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTablesParseWorld.cpp#L187) | | | `AssignEntity` | function | SparkEngine | [HLODSystem.h:L250](../../SparkEngine/Source/Engine/HLOD/HLODSystem.h#L250) | Place an entity into the cell containing the given position | | `AssignLightsToCluster` | function | Tests | [TestGPUClusterCulling.cpp:L44](../../Tests/TestGPUClusterCulling.cpp#L44) | | @@ -2034,13 +2041,14 @@ | `authenticator` | function | Tests | [TestGatewaySecurity.cpp:L333](../../Tests/TestGatewaySecurity.cpp#L333) | | | `authenticator` | function | Tests | [TestGatewaySecurity.cpp:L358](../../Tests/TestGatewaySecurity.cpp#L358) | | | `AuthErrText` | function | GameModules | [TFLoginFlow.cpp:L31](../../GameModules/SparkGameMMOFPS/Source/UI/TFLoginFlow.cpp#L31) | | -| `Author` | function | Tests | [TestEditorCookPackageReal.cpp:L283](../../Tests/TestEditorCookPackageReal.cpp#L283) | | -| `AuthorCookAndPackage` | function | Tests | [TestEditorCookPackageReal.cpp:L165](../../Tests/TestEditorCookPackageReal.cpp#L165) | | -| `authority` | function | Tests | [TestTF120Travel.cpp:L362](../../Tests/TestTF120Travel.cpp#L362) | | -| `authority` | function | Tests | [TestTF120Travel.cpp:L430](../../Tests/TestTF120Travel.cpp#L430) | | +| `Author` | function | Tests | [TestEditorCookPackageReal.cpp:L294](../../Tests/TestEditorCookPackageReal.cpp#L294) | | +| `AuthorCookAndPackage` | function | Tests | [TestEditorCookPackageReal.cpp:L167](../../Tests/TestEditorCookPackageReal.cpp#L167) | | +| `authored` | function | Tests | [TestEditorSubsystemsReal.cpp:L815](../../Tests/TestEditorSubsystemsReal.cpp#L815) | | +| `authority` | function | Tests | [TestTF120Travel.cpp:L349](../../Tests/TestTF120Travel.cpp#L349) | | +| `authority` | function | Tests | [TestTF120Travel.cpp:L417](../../Tests/TestTF120Travel.cpp#L417) | | | `AuthorityActive` | function | GameModules | [TFAlertSystem.h:L187](../../GameModules/SparkGameMMOFPS/Source/World/TFAlertSystem.h#L187) | | | `AuthorityLockTarget` | function | GameModules | [TFDatabase.h:L383](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFDatabase.h#L383) | | -| `AuthorTerrain` | function | Tests | [TestEditorSubsystemsReal.cpp:L69](../../Tests/TestEditorSubsystemsReal.cpp#L69) | Build a small authored terrain in the editor: heights, a bound texture layer, a detail mesh. | +| `AuthorTerrain` | function | Tests | [TestEditorSubsystemsReal.cpp:L92](../../Tests/TestEditorSubsystemsReal.cpp#L92) | Build a small authored terrain in the editor: heights, a bound texture layer, a detail mesh. | | `AutoComplete` | function | SparkEngine | [InGameConsole.h:L411](../../SparkEngine/Source/Utils/InGameConsole.h#L411) | | | `AutoDiscoverCodeRegions` | function | SparkEngine | [MemoryIntegrity.h:L223](../../SparkEngine/Source/Engine/Security/MemoryIntegrity.h#L223) | | | `AutoGenerateTexturePlacement` | function | SparkEditor | [TerrainEditor.h:L66](../../SparkEditor/Source/Terrain/TerrainEditor.h#L66) | | @@ -2085,7 +2093,7 @@ | `b` | function | Tests | [TestBitFlags.cpp:L86](../../Tests/TestBitFlags.cpp#L86) | | | `b` | function | Tests | [TestEditorSubsystems.cpp:L2896](../../Tests/TestEditorSubsystems.cpp#L2896) | | | `b` | function | Tests | [TestEditorSubsystems.cpp:L2906](../../Tests/TestEditorSubsystems.cpp#L2906) | | -| `b` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L72](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L72) | | +| `b` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L73](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L73) | | | `b` | function | Tests | [TestUUID.cpp:L42](../../Tests/TestUUID.cpp#L42) | | | `b` | function | Tests | [TestUUID.cpp:L54](../../Tests/TestUUID.cpp#L54) | | | `b` | function | Tests | [TestUUID.cpp:L115](../../Tests/TestUUID.cpp#L115) | | @@ -2186,6 +2194,7 @@ | `BatchTestAABB` | function | SparkEngine | [FrustumCulling.h:L368](../../SparkEngine/Source/Graphics/FrustumCulling.h#L368) | | | `BCryptGenRandom` | function | SparkEngine | [CrashArtifactDirectory.h:L38](../../SparkEngine/Source/Utils/CrashArtifactDirectory.h#L38) | | | `BeerLambert` | function | SparkEngine | [FogSystem.h:L179](../../SparkEngine/Source/Graphics/FogSystem.h#L179) | | +| `before` | function | Tests | [TestEditorSubsystemsReal.cpp:L814](../../Tests/TestEditorSubsystemsReal.cpp#L814) | | | `Begin` | function | SparkEngine | [MovieRenderPipeline.h:L158](../../SparkEngine/Source/Engine/Rendering/MovieRenderPipeline.h#L158) | Begin local fixed-time tracking | | `begin` | function | SparkEngine | [EnumUtils.h:L190](../../SparkEngine/Source/Enums/EnumUtils.h#L190) | | | `Begin` | function | SparkEngine | [SpriteBatch.h:L84](../../SparkEngine/Source/Graphics/2D/SpriteBatch.h#L84) | | @@ -2268,6 +2277,7 @@ | `BeginGPUSample` | function | SparkEditor | [PerformanceProfiler.h:L136](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L136) | Begin GPU profiling sample | | `BeginGPUTimer` | function | SparkEngine | [Profiler.h:L223](../../SparkEngine/Source/Utils/Profiler.h#L223) | Begin a GPU timing query | | `BeginHandshake` | function | Tests | [TestNetTransportSecurity.cpp:L166](../../Tests/TestNetTransportSecurity.cpp#L166) | | +| `BeginInputObservation` | function | GameModules | [Game.h:L649](../../GameModules/SparkGameFPS/Source/Game/Game.h#L649) | Process input and translate to game actions | | `BeginLine` | function | SparkEngine | [CrashSymbolication.h:L117](../../SparkEngine/Source/Utils/CrashSymbolication.h#L117) | | | `BeginLoading` | function | SparkEngine | [LoadingScreen.h:L117](../../SparkEngine/Source/Engine/Loading/LoadingScreen.h#L117) | Begin a new loading session. | | `BeginLogin` | function | GameModules | [TFAccountSystem.h:L114](../../GameModules/SparkGameMMOFPS/Source/Account/TFAccountSystem.h#L114) | | @@ -2303,13 +2313,13 @@ | `big` | function | Tests | [TestAdversarialEngine.cpp:L453](../../Tests/TestAdversarialEngine.cpp#L453) | | | `big` | function | Tests | [TestAdversarialEngine.cpp:L1677](../../Tests/TestAdversarialEngine.cpp#L1677) | | | `big` | function | Tests | [TestNetworkStress.cpp:L391](../../Tests/TestNetworkStress.cpp#L391) | | -| `bigData` | function | Tests | [TestSparkPak.cpp:L425](../../Tests/TestSparkPak.cpp#L425) | | +| `bigData` | function | Tests | [TestSparkPak.cpp:L441](../../Tests/TestSparkPak.cpp#L441) | | | `bigPayload` | function | Tests | [TestAdversarialEngine.cpp:L240](../../Tests/TestAdversarialEngine.cpp#L240) | | | `Binaries` | function | Tests | [TestSEC4NarrowPathsReal.cpp:L154](../../Tests/TestSEC4NarrowPathsReal.cpp#L154) | | | `binary` | function | Tests | [TestDATA120PersistenceReal.cpp:L491](../../Tests/TestDATA120PersistenceReal.cpp#L491) | | | `binary` | function | Tests | [TestPluginABI.cpp:L362](../../Tests/TestPluginABI.cpp#L362) | | | `BinaryOutputMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L187](../../SparkBuild/tests/ProcessRunnerTests.cpp#L187) | | -| `BinaryOutputMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L743](../../SparkBuild/tests/ProcessRunnerTests.cpp#L743) | | +| `BinaryOutputMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L734](../../SparkBuild/tests/ProcessRunnerTests.cpp#L734) | | | `BinaryReader` | function | SparkEngine | [Serializer.h:L237](../../SparkEngine/Source/Utils/Serializer.h#L237) | Construct a reader from a `std::vector`. | | `BinaryReader` | function | SparkEngine | [TelemetrySpoolFormat.cpp:L55](../../SparkEngine/Source/Utils/TelemetrySpoolFormat.cpp#L55) | | | `BinaryWriter` | function | SparkEngine | [Serializer.h:L123](../../SparkEngine/Source/Utils/Serializer.h#L123) | Construct an empty writer with optional reserved capacity. | @@ -2444,8 +2454,8 @@ | `Blue` | function | SparkEngine | [ColorUtils.h:L58](../../SparkEngine/Source/Utils/ColorUtils.h#L58) | | | `Blue` | function | SparkEngine | [DebugDraw.h:L57](../../SparkEngine/Source/Utils/DebugDraw.h#L57) | RGBA color for debug shapes | | `BluishGray` | function | SparkEngine | [FogSystem.h:L70](../../SparkEngine/Source/Graphics/FogSystem.h#L70) | | -| `bmp` | function | Tests | [TestAssetParserHardening.cpp:L288](../../Tests/TestAssetParserHardening.cpp#L288) | | -| `bmp` | function | Tests | [TestThirdPartyIntegration.cpp:L65](../../Tests/TestThirdPartyIntegration.cpp#L65) | | +| `bmp` | function | Tests | [TestAssetParserHardening.cpp:L304](../../Tests/TestAssetParserHardening.cpp#L304) | | +| `bmp` | function | Tests | [TestThirdPartyIntegration.cpp:L81](../../Tests/TestThirdPartyIntegration.cpp#L81) | | | `bob` | function | Tests | [TestServerMockClient.cpp:L538](../../Tests/TestServerMockClient.cpp#L538) | | | `bodies` | function | Tests | [TestECSIntegration.cpp:L299](../../Tests/TestECSIntegration.cpp#L299) | | | `body` | function | SparkEngine | [DaemonClient.cpp:L275](../../SparkEngine/Source/Utils/DaemonClient.cpp#L275) | | @@ -2532,6 +2542,7 @@ | `bottomUp` | function | Tests | [TestRHI240LinuxForwardPassReal.cpp:L320](../../Tests/TestRHI240LinuxForwardPassReal.cpp#L320) | | | `bottomUp` | function | Tests | [TestRHI240OpenGLGoldenReal.cpp:L186](../../Tests/TestRHI240OpenGLGoldenReal.cpp#L186) | | | `bound` | function | GameModules | [VisualScriptDemoRuntime.h:L154](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoRuntime.h#L154) | | +| `boundary` | function | Tests | [TestSceneManagerReflectedReal.cpp:L239](../../Tests/TestSceneManagerReflectedReal.cpp#L239) | | | `BoundCharOf` | function | GameModules | [TFOutfitSystem.h:L209](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L209) | | | `BoundContinent` | function | GameModules | [TFDatabase.h:L293](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFDatabase.h#L293) | | | `BoundedAllowedAceTrustee` | function | SparkEngine | [SecureRandom.cpp:L107](../../SparkEngine/Source/Utils/SecureRandom.cpp#L107) | | @@ -2654,8 +2665,8 @@ | `Buffer` | function | SparkEngine | [MakeDesc.h:L319](../../SparkEngine/Source/Graphics/MakeDesc.h#L319) | Constant buffer descriptor | | `buffer` | function | SparkEngine | [RHIBridge.cpp:L124](../../SparkEngine/Source/Graphics/RHI/RHIBridge.cpp#L124) | | | `buffer` | function | SparkEngine | [TextureSystemWindowsTexture.cpp:L83](../../SparkEngine/Source/Graphics/TextureSystemWindowsTexture.cpp#L83) | | -| `buffer` | function | SparkEngine | [SceneManager.cpp:L256](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L256) | | -| `buffer` | function | SparkEngine | [SceneManager.cpp:L351](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L351) | | +| `buffer` | function | SparkEngine | [SceneManager.cpp:L280](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L280) | | +| `buffer` | function | SparkEngine | [SceneManager.cpp:L391](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L391) | | | `buffer` | function | SparkGateway | [GatewayAreaControl.cpp:L1374](../../SparkGateway/src/GatewayAreaControl.cpp#L1374) | | | `buffer` | function | SparkInstaller | [GitBootstrap.cpp:L110](../../SparkInstaller/src/GitBootstrap.cpp#L110) | | | `buffer` | function | SparkLauncher | [LauncherPaths.cpp:L23](../../SparkLauncher/src/LauncherPaths.cpp#L23) | | @@ -2758,7 +2769,7 @@ | `builder` | function | Tests | [TF120PeerProcess.h:L152](../../Tests/TF120PeerProcess.h#L152) | | | `builder` | function | Tests | [TF120PeerProcess.h:L155](../../Tests/TF120PeerProcess.h#L155) | | | `builder` | function | Tests | [TestCrashHandlerGatingReal.cpp:L412](../../Tests/TestCrashHandlerGatingReal.cpp#L412) | | -| `builder` | function | Tests | [TestEditorCookPackageReal.cpp:L197](../../Tests/TestEditorCookPackageReal.cpp#L197) | | +| `builder` | function | Tests | [TestEditorCookPackageReal.cpp:L199](../../Tests/TestEditorCookPackageReal.cpp#L199) | | | `builder` | function | Tests | [TestFPSLANLoopback.cpp:L155](../../Tests/TestFPSLANLoopback.cpp#L155) | | | `BuildFilteredRgbPng` | function | Tests | [TestGoldenImageTest.cpp:L445](../../Tests/TestGoldenImageTest.cpp#L445) | | | `BuildFromBoneNames` | function | SparkEngine | [AnimationRetargeting.h:L65](../../SparkEngine/Source/Engine/Animation/AnimationRetargeting.h#L65) | | @@ -2917,6 +2928,7 @@ | `bytes` | function | SparkLauncher | [LauncherProcess.cpp:L535](../../SparkLauncher/src/LauncherProcess.cpp#L535) | | | `bytes` | function | Tests | [TestAssetMigration.cpp:L325](../../Tests/TestAssetMigration.cpp#L325) | | | `bytes` | function | Tests | [TestFBXImporter.cpp:L28](../../Tests/TestFBXImporter.cpp#L28) | | +| `bytes` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L61](../../Tests/TestFPSOwnedSaveDecode.cpp#L61) | | | `Bytes` | function | Tests | [TestNET100TransportReal.cpp:L40](../../Tests/TestNET100TransportReal.cpp#L40) | | | `Bytes` | function | Tests | [TestSecureTransportWired.cpp:L53](../../Tests/TestSecureTransportWired.cpp#L53) | | | `bytes` | function | Tests | [TestSecureTransportWired.cpp:L701](../../Tests/TestSecureTransportWired.cpp#L701) | | @@ -3093,15 +3105,15 @@ | `CanInstall` | function | GameModules | [TFHandoffParticipant.h:L28](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.h#L28) | Game-thread pawn operations supplied by the live authoritative simulation. | | `CanInstall` | function | GameModules | [TFServerSim.h:L140](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L140) | Game-thread handoff callbacks; the host dispatcher serializes control requests with simulation. | | `CanInstall` | function | Tests | [TestTF120Migration.cpp:L82](../../Tests/TestTF120Migration.cpp#L82) | | -| `CanInstall` | function | Tests | [TestTF120Travel.cpp:L222](../../Tests/TestTF120Travel.cpp#L222) | | -| `CanInstall` | function | Tests | [TestTF120Travel.cpp:L252](../../Tests/TestTF120Travel.cpp#L252) | | +| `CanInstall` | function | Tests | [TestTF120Travel.cpp:L209](../../Tests/TestTF120Travel.cpp#L209) | | +| `CanInstall` | function | Tests | [TestTF120Travel.cpp:L239](../../Tests/TestTF120Travel.cpp#L239) | | | `CanInteract` | function | SparkEngine | [FPSComponents.h:L262](../../SparkEngine/Source/Engine/ECS/Components/FPSComponents.h#L262) | Check if the interaction can be triggered. | | `CanLoad` | function | SparkEditor | [SaveSystemPanel.h:L67](../../SparkEditor/Source/Panels/SaveSystemPanel.h#L67) | Whether a load is possible: at least one enumerated slot plus a live game World. | | `CanMerge` | function | SparkEditor | [VersionControlTypes.h:L239](../../SparkEditor/Source/VersionControl/VersionControlTypes.h#L239) | Check if handler can merge file | | `CanMerge` | function | SparkEditor | [VersionControlTypes.h:L270](../../SparkEditor/Source/VersionControl/VersionControlTypes.h#L270) | Scene merge handler | | `CanMerge` | function | SparkEditor | [VersionControlTypes.h:L283](../../SparkEditor/Source/VersionControl/VersionControlTypes.h#L283) | Material merge handler | | `CanMutateCharacterProfile` | function | GameModules | [TFOnboardingSessionRules.h:L28](../../GameModules/SparkGameMMOFPS/Source/Net/TFOnboardingSessionRules.h#L28) | | -| `CanonicalDirectoryString` | function | SparkEditor | [AssetBrowserPanel.cpp:L57](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L57) | | +| `CanonicalDirectoryString` | function | SparkEditor | [AssetBrowserPanel.cpp:L34](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L34) | | | `CanonicalizeFilesystemPath` | function | SparkEngine | [ProjectAssetPath.cpp:L125](../../SparkEngine/Source/Graphics/ProjectAssetPath.cpp#L125) | | | `CanonicalizeFilesystemPath` | function | SparkEngine | [ProjectAssetPath.h:L29](../../SparkEngine/Source/Graphics/ProjectAssetPath.h#L29) | Canonicalize a UTF-8 filesystem path without requiring its leaf to exist. | | `CanonicalModel` | function | Tests | [TestENG220ObjImportReal.cpp:L188](../../Tests/TestENG220ObjImportReal.cpp#L188) | | @@ -3141,7 +3153,7 @@ | `CanShutdownEngine` | function | SparkEngine | [SparkEngineLinuxInternal.h:L35](../../SparkEngine/Source/Core/SparkEngineLinuxInternal.h#L35) | | | `CanShutdownEngine` | function | SparkEngine | [SparkEngineWindowsInternal.h:L51](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L51) | | | `CanSpawnAt` | function | GameModules | [TFRegionSystem.h:L97](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.h#L97) | | -| `CanSpawnAt` | function | Tests | [TestTFRegionLattice.cpp:L156](../../Tests/TestTFRegionLattice.cpp#L156) | | +| `CanSpawnAt` | function | Tests | [TestTFRegionLattice.cpp:L149](../../Tests/TestTFRegionLattice.cpp#L149) | | | `CanStart` | function | SparkEngine | [GameplaySystemExtension.h:L75](../../SparkEngine/Source/Engine/Gameplay/GameplaySystemExtension.h#L75) | Check whether the quest can be started in the given context | | `CanStart` | function | Tests | [TestGameplayExtensionRegistry.cpp:L35](../../Tests/TestGameplayExtensionRegistry.cpp#L35) | | | `CanStart` | function | Tests | [TestGameplayExtensionRegistry.cpp:L120](../../Tests/TestGameplayExtensionRegistry.cpp#L120) | | @@ -3183,8 +3195,8 @@ | `capture` | function | Tests | [TestMetalRayTracingLive.mm:L334](../../Tests/TestMetalRayTracingLive.mm#L334) | | | `Capture` | function | Tests | [TestRHI210D3D11DeferredResolveReal.cpp:L76](../../Tests/TestRHI210D3D11DeferredResolveReal.cpp#L76) | | | `Capture` | function | Tests | [TestTF120Migration.cpp:L65](../../Tests/TestTF120Migration.cpp#L65) | | -| `Capture` | function | Tests | [TestTF120Travel.cpp:L206](../../Tests/TestTF120Travel.cpp#L206) | | -| `Capture` | function | Tests | [TestTF120Travel.cpp:L250](../../Tests/TestTF120Travel.cpp#L250) | | +| `Capture` | function | Tests | [TestTF120Travel.cpp:L193](../../Tests/TestTF120Travel.cpp#L193) | | +| `Capture` | function | Tests | [TestTF120Travel.cpp:L237](../../Tests/TestTF120Travel.cpp#L237) | | | `Capture` | function | Tests | [TestTelemetrySpool.cpp:L62](../../Tests/TestTelemetrySpool.cpp#L62) | | | `CaptureAuthoredScene` | function | Templates | [GameModule.h:L263](../../Templates/PlatformerKit/Source/GameModule.h#L263) | | | `CaptureAuthoredScene` | function | Templates | [GameModule.h:L435](../../Templates/RPGStarter/Source/GameModule.h#L435) | | @@ -3203,7 +3215,7 @@ | `CaptureGuilds` | function | GameModules | [MMOGuildSystem.h:L104](../../GameModules/SparkGameMMO/Source/Guild/MMOGuildSystem.h#L104) | | | `CaptureHud` | function | Tests | [TestMOD330ARPGDungeonReal.cpp:L570](../../Tests/TestMOD330ARPGDungeonReal.cpp#L570) | | | `CaptureLocalProfile` | function | GameModules | [Game.h:L414](../../GameModules/SparkGameFPS/Source/Game/Game.h#L414) | Snapshot the declared local profile (progression, class, loadout, score). | -| `CaptureMouse` | function | SparkEngine | [InputManager.h:L258](../../SparkEngine/Source/Input/InputManager.h#L258) | Capture or release the mouse cursor | +| `CaptureMouse` | function | SparkEngine | [InputManager.h:L265](../../SparkEngine/Source/Input/InputManager.h#L265) | Capture or release the mouse cursor | | `capturePath` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L325](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L325) | | | `capturePath` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L378](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L378) | | | `capturePath` | function | SparkCrashReporter | [CrashReporterManifestTests.cpp:L710](../../SparkCrashReporter/tests/CrashReporterManifestTests.cpp#L710) | | @@ -3235,15 +3247,15 @@ | `CaptureSnapshot` | function | GameModules | [OWEngineSystems.h:L68](../../GameModules/SparkGameOpenWorld/Source/Core/OWEngineSystems.h#L68) | | | `CaptureSnapshot` | function | SparkEngine | [FrameInspector.h:L294](../../SparkEngine/Source/Utils/FrameInspector.h#L294) | Capture a snapshot of current state | | `CaptureSpawnState` | function | Templates | [GameModule.h:L785](../../Templates/FPSStarter/Source/GameModule.h#L785) | | -| `CaptureStackTraceString` | function | SparkEngine | [CrashHandler.cpp:L1635](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1635) | | -| `CaptureStackTraceString` | function | SparkEngine | [CrashHandler.cpp:L2763](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2763) | | +| `CaptureStackTraceString` | function | SparkEngine | [CrashHandler.cpp:L1636](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1636) | | +| `CaptureStackTraceString` | function | SparkEngine | [CrashHandler.cpp:L2809](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2809) | | | `CaptureState` | function | GameModules | [RPGNPCSystem.h:L174](../../GameModules/SparkGameRPG/Source/NPC/RPGNPCSystem.h#L174) | Capture the world clock and every NPC's mutable state, sorted by NPC id | | `CaptureState` | function | GameModules | [RTSMatchSystem.h:L77](../../GameModules/SparkGameRTS/Source/Match/RTSMatchSystem.h#L77) | | | `CaptureState` | function | GameModules | [RacingRaceManager.h:L140](../../GameModules/SparkGameRacing/Source/Race/RacingRaceManager.h#L140) | | | `CaptureStderr` | function | SparkEngine | [Process.h:L76](../../SparkEngine/Source/Utils/Process.h#L76) | | | `CaptureStdin` | function | SparkEngine | [Process.h:L85](../../SparkEngine/Source/Utils/Process.h#L85) | | | `CaptureStdout` | function | SparkEngine | [Process.h:L73](../../SparkEngine/Source/Utils/Process.h#L73) | | -| `CaptureSymbolicFrames` | function | SparkEngine | [CrashHandler.cpp:L1906](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1906) | | +| `CaptureSymbolicFrames` | function | SparkEngine | [CrashHandler.cpp:L1907](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1907) | | | `CaptureTestDirectory` | function | Tests | [TestScreenCapture.cpp:L11](../../Tests/TestScreenCapture.cpp#L11) | | | `CaptureTrace` | function | Tests | [TestENG200ScriptBindingsReal.cpp:L47](../../Tests/TestENG200ScriptBindingsReal.cpp#L47) | | | `CaptureTrace` | function | Tests | [TestENG200ScriptHotReloadReal.cpp:L36](../../Tests/TestENG200ScriptHotReloadReal.cpp#L36) | | @@ -3427,7 +3439,7 @@ | `Checkpoint` | function | GameModules | [TFRegionSystem.h:L82](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.h#L82) | | | `Checkpoint` | function | Tests | [TestTFOnboarding.cpp:L1072](../../Tests/TestTFOnboarding.cpp#L1072) | | | `CheckpointPersistenceBeforeTeardown` | function | GameModules | [TFShutdownOrder.h:L7](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFShutdownOrder.h#L7) | Pins the data-loss-sensitive shutdown dependency. | -| `CheckProjectDocument` | function | SparkEditor | [ProjectDocument.cpp:L394](../../SparkEditor/Source/Core/ProjectDocument.cpp#L394) | | +| `CheckProjectDocument` | function | SparkEditor | [ProjectDocument.cpp:L395](../../SparkEditor/Source/Core/ProjectDocument.cpp#L395) | | | `CheckProjectDocument` | function | SparkEditor | [ProjectDocument.h:L72](../../SparkEditor/Source/Core/ProjectDocument.h#L72) | Structural and version gate for a project document. | | `CheckRegularFile` | function | SparkEngine | [NetworkTrustStore.cpp:L108](../../SparkEngine/Source/Engine/Networking/NetworkTrustStore.cpp#L108) | | | `CheckSavior` | function | GameModules | [TFMedalSystem.h:L252](../../GameModules/SparkGameMMOFPS/Source/Game/TFMedalSystem.h#L252) | | @@ -3448,12 +3460,12 @@ | `child` | function | Tests | [TestRuntimePrefab.cpp:L132](../../Tests/TestRuntimePrefab.cpp#L132) | | | `ChildCount` | function | Tests | [TestAIStress.cpp:L86](../../Tests/TestAIStress.cpp#L86) | | | `ChildCount` | function | Tests | [TestAIStress.cpp:L108](../../Tests/TestAIStress.cpp#L108) | | -| `ChildDirectories` | function | SparkEditor | [AssetBrowserPanel.cpp:L91](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L91) | | +| `ChildDirectories` | function | SparkEditor | [AssetBrowserPanel.cpp:L68](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L68) | | | `ChildrenOf` | function | Tests | [TestEditorUndoHierarchyReal.cpp:L32](../../Tests/TestEditorUndoHierarchyReal.cpp#L32) | | | `chunk` | function | SparkEngine | [ReflectedScenePersistence.cpp:L68](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L68) | | | `chunk` | function | SparkEngine | [GoldenImagePng.h:L215](../../SparkEngine/Source/Utils/GoldenImagePng.h#L215) | | | `chunk` | function | SparkEngine | [SaveFileDurability.cpp:L424](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L424) | | -| `Cindral` | function | Tests | [TestTF120Travel.cpp:L133](../../Tests/TestTF120Travel.cpp#L133) | | +| `Cindral` | function | Tests | [TestTF120Travel.cpp:L120](../../Tests/TestTF120Travel.cpp#L120) | | | `CinematicSequencerPanel::Initialize` | method | SparkEditor | [CinematicSequencerPanel.cpp:L22](../../SparkEditor/Source/Panels/CinematicSequencerPanel.cpp#L22) | | | `CinematicSequencerPanel::Render` | method | SparkEditor | [CinematicSequencerPanel.cpp:L48](../../SparkEditor/Source/Panels/CinematicSequencerPanel.cpp#L48) | | | `CinematicSequencerPanel::RenderPropertyEditor` | method | SparkEditor | [CinematicSequencerPanel.cpp:L332](../../SparkEditor/Source/Panels/CinematicSequencerPanel.cpp#L332) | | @@ -3501,7 +3513,7 @@ | `ClassifyTestOutcome` | function | Tests | [TestFramework.h:L133](../../Tests/TestFramework.h#L133) | | | `ClassName` | function | GameModules | [TFCommands.cpp:L140](../../GameModules/SparkGameMMOFPS/Source/Console/TFCommands.cpp#L140) | | | `className` | function | GameModules | [VisualScriptDemoWorld.cpp:L155](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.cpp#L155) | | -| `className` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L147](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L147) | | +| `className` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L148](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L148) | | | `ClassShortTag` | function | GameModules | [TFScoreboard.cpp:L257](../../GameModules/SparkGameMMOFPS/Source/UI/TFScoreboard.cpp#L257) | | | `ClassSystem::ActivatePrimaryAbility` | method | GameModules | [ClassSystem.cpp:L449](../../GameModules/SparkGameFPS/Source/Game/ClassSystem.cpp#L449) | | | `ClassSystem::ActivateSecondaryAbility` | method | GameModules | [ClassSystem.cpp:L457](../../GameModules/SparkGameFPS/Source/Game/ClassSystem.cpp#L457) | | @@ -3544,7 +3556,7 @@ | `Cleanup` | function | SparkEngine | [ProcessLinux.cpp:L56](../../SparkEngine/Source/Utils/ProcessLinux.cpp#L56) | | | `Cleanup` | function | SparkEngine | [ProcessWin32Internal.h:L40](../../SparkEngine/Source/Utils/ProcessWin32Internal.h#L40) | | | `Cleanup` | function | Tests | [TestSequencerAudioWiring.cpp:L78](../../Tests/TestSequencerAudioWiring.cpp#L78) | | -| `Cleanup` | function | Tests | [TestSparkPak.cpp:L265](../../Tests/TestSparkPak.cpp#L265) | | +| `Cleanup` | function | Tests | [TestSparkPak.cpp:L281](../../Tests/TestSparkPak.cpp#L281) | | | `CleanupCacheTestDir` | function | Tests | [TestLocalFileCache.cpp:L14](../../Tests/TestLocalFileCache.cpp#L14) | | | `CleanupDir` | function | Tests | [TestGamePackager.cpp:L21](../../Tests/TestGamePackager.cpp#L21) | | | `CleanupFinished` | function | GameModules | [QuestSystem.h:L381](../../GameModules/SparkGameFPS/Source/Game/QuestSystem.h#L381) | Remove completed and failed quests from the active list | @@ -3556,9 +3568,10 @@ | `CleanupScriptInstance` | function | SparkEngine | [AngelScriptEngine.h:L714](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L714) | Release all resources held by a script instance | | `CleanupTempDir` | function | Tests | [TestFileWatcher.cpp:L18](../../Tests/TestFileWatcher.cpp#L18) | | | `CleanupTempShaderDir` | function | Tests | [TestShaderHotReload.cpp:L38](../../Tests/TestShaderHotReload.cpp#L38) | | -| `Clear` | function | GameModules | [FPSWeatherIntegration.h:L39](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L39) | | +| `Clear` | function | GameModules | [FPSWeatherIntegration.h:L41](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L41) | | | `Clear` | function | GameModules | [InventorySystem.h:L356](../../GameModules/SparkGameFPS/Source/Game/InventorySystem.h#L356) | Clear the entire inventory | | `Clear` | function | GameModules | [TFEvents.h:L132](../../GameModules/SparkGameMMOFPS/Source/Core/TFEvents.h#L132) | | +| `Clear` | function | GameModules | [TFReplicationRefresh.h:L41](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L41) | | | `Clear` | function | GameModules | [TFScramWire.h:L72](../../GameModules/SparkGameMMOFPS/Source/Net/TFScramWire.h#L72) | | | `Clear` | function | GameModules | [TFPlayerMeta.h:L105](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFPlayerMeta.h#L105) | | | `Clear` | function | SparkEditor | [CommandHistory.h:L162](../../SparkEditor/Source/CommandHistory.h#L162) | Clear all history (e.g., when opening a new scene). | @@ -3609,7 +3622,7 @@ | `Clear` | function | SparkEngine | [TemporalTypes.h:L254](../../SparkEngine/Source/Graphics/TemporalTypes.h#L254) | Clear all stored history | | `Clear` | function | SparkEngine | [VoxelConeTracing.h:L107](../../SparkEngine/Source/Graphics/VoxelConeTracing.h#L107) | | | `Clear` | function | SparkEngine | [PhysicsDebugRenderer.h:L63](../../SparkEngine/Source/Physics/PhysicsDebugRenderer.h#L63) | Clear all collected debug data. | -| `Clear` | function | SparkEngine | [SceneManager.h:L345](../../SparkEngine/Source/SceneManager/SceneManager.h#L345) | Destroy all GameObjects and clear the node list without resetting metadata. | +| `Clear` | function | SparkEngine | [SceneManager.h:L347](../../SparkEngine/Source/SceneManager/SceneManager.h#L347) | Destroy all GameObjects and clear the node list without resetting metadata. | | `Clear` | function | SparkEngine | [BitFlags.h:L117](../../SparkEngine/Source/Utils/BitFlags.h#L117) | Clear one or more flags. | | `Clear` | function | SparkEngine | [ChromeTracing.h:L149](../../SparkEngine/Source/Utils/ChromeTracing.h#L149) | | | `Clear` | function | SparkEngine | [ColorUtils.h:L64](../../SparkEngine/Source/Utils/ColorUtils.h#L64) | | @@ -3760,7 +3773,7 @@ | `clearPrepared` | function | GameModules | [TFCrypto.cpp:L133](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.cpp#L133) | | | `clearPrepared` | function | GameModules | [TFCrypto.cpp:L153](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.cpp#L153) | | | `ClearProfilingData` | function | SparkEditor | [PerformanceProfiler.h:L249](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L249) | Clear all profiling data | -| `ClearProject` | function | SparkEditor | [AssetBrowserPanel.h:L81](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L81) | Forget the active project and every path/selection derived from it. | +| `ClearProject` | function | SparkEditor | [AssetBrowserPanel.h:L82](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L82) | Forget the active project and every path/selection derived from it. | | `ClearRecentProjects` | function | SparkEditor | [ProjectManager.h:L182](../../SparkEditor/Source/Core/ProjectManager.h#L182) | | | `ClearReferences` | function | SparkEngine | [TemplateRuntime.h:L440](../../SparkEngine/Source/Game/TemplateRuntime.h#L440) | | | `ClearRenderTarget` | function | SparkEngine | [D3D11Device.h:L257](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L257) | | @@ -3843,7 +3856,7 @@ | `client` | function | Tests | [TestServerMockClient.cpp:L1166](../../Tests/TestServerMockClient.cpp#L1166) | | | `client` | function | Tests | [TestServerMockClient.cpp:L1179](../../Tests/TestServerMockClient.cpp#L1179) | | | `client` | function | Tests | [TestServerMockClient.cpp:L1207](../../Tests/TestServerMockClient.cpp#L1207) | | -| `ClientActive` | function | GameModules | [TFReplication.h:L105](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L105) | | +| `ClientActive` | function | GameModules | [TFReplication.h:L109](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L109) | | | `ClientAdvance` | function | GameModules | [TFGrenadeSystem.h:L253](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L253) | | | `ClientAdvance` | function | GameModules | [TFPingSystem.h:L258](../../GameModules/SparkGameMMOFPS/Source/Game/TFPingSystem.h#L258) | | | `ClientAdvanceSmoke` | function | GameModules | [TFGrenadeSystem.h:L236](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L236) | | @@ -3851,7 +3864,7 @@ | `ClientDropMirror` | function | GameModules | [TFVehicleSystem.h:L242](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L242) | | | `ClientEnsureHandlers` | function | GameModules | [TFDeployableSystem.h:L214](../../GameModules/SparkGameMMOFPS/Source/Game/TFDeployableSystem.h#L214) | | | `ClientEnsureHandlers` | function | GameModules | [TFVehicleSystem.h:L231](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L231) | | -| `ClientEnsureHandlers` | function | GameModules | [TFReplication.h:L106](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L106) | | +| `ClientEnsureHandlers` | function | GameModules | [TFReplication.h:L110](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L110) | | | `ClientEnsureHandlers` | function | GameModules | [TFDirectivePanel.h:L120](../../GameModules/SparkGameMMOFPS/Source/UI/TFDirectivePanel.h#L120) | | | `ClientEnsureNetHandlers` | function | GameModules | [TFTravelSystem.h:L185](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L185) | | | `ClientHandleBoom` | function | GameModules | [TFGrenadeSystem.h:L252](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L252) | | @@ -3918,7 +3931,7 @@ | `ClientPumpRequests` | function | GameModules | [TFDirectivePanel.h:L124](../../GameModules/SparkGameMMOFPS/Source/UI/TFDirectivePanel.h#L124) | | | `ClientReleaseHandlers` | function | GameModules | [TFDeployableSystem.h:L215](../../GameModules/SparkGameMMOFPS/Source/Game/TFDeployableSystem.h#L215) | | | `ClientReleaseHandlers` | function | GameModules | [TFVehicleSystem.h:L232](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L232) | | -| `ClientReleaseHandlers` | function | GameModules | [TFReplication.h:L107](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L107) | | +| `ClientReleaseHandlers` | function | GameModules | [TFReplication.h:L111](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L111) | | | `ClientReleaseHandlers` | function | GameModules | [TFDirectivePanel.h:L121](../../GameModules/SparkGameMMOFPS/Source/UI/TFDirectivePanel.h#L121) | | | `ClientReleaseNetHandlers` | function | GameModules | [TFTravelSystem.h:L186](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L186) | | | `ClientRequestAccept` | function | GameModules | [TFOutfitSystem.h:L120](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L120) | | @@ -4203,7 +4216,7 @@ | `CollectBodyIds` | function | SparkEngine | [PhysicsSystem.cpp:L515](../../SparkEngine/Source/Physics/PhysicsSystem.cpp#L515) | | | `CollectCoin` | function | Templates | [GameModule.h:L142](../../Templates/PlatformerKit/Source/GameModule.h#L142) | | | `CollectCoin` | function | Tests | [TestMOD390VisualScriptHotReloadReal.cpp:L142](../../Tests/TestMOD390VisualScriptHotReloadReal.cpp#L142) | | -| `CollectCrashModuleIdentity` | function | SparkEngine | [CrashHandler.cpp:L1847](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1847) | | +| `CollectCrashModuleIdentity` | function | SparkEngine | [CrashHandler.cpp:L1848](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1848) | | | `CollectDataFiles` | function | SparkEngine | [GamePackager.h:L474](../../SparkEngine/Source/Engine/Build/GamePackager.h#L474) | | | `CollectDirectory` | function | SparkEngine | [GamePackager.h:L480](../../SparkEngine/Source/Engine/Build/GamePackager.h#L480) | | | `CollectDrop` | function | GameModules | [LootSystem.h:L153](../../GameModules/SparkGameFPS/Source/Game/LootSystem.h#L153) | | @@ -4320,7 +4333,7 @@ | `CommandRegistry::RegisterCommand` | method | SparkEngine | [ConsoleProcessManager.cpp:L275](../../SparkEngine/Source/Utils/ConsoleProcessManager.cpp#L275) | | | `CommandResult` | function | Tests | [TestSparkGameShowcase.cpp:L220](../../Tests/TestSparkGameShowcase.cpp#L220) | | | `CommandResult` | function | Tests | [TestSparkGameShowcase.cpp:L634](../../Tests/TestSparkGameShowcase.cpp#L634) | | -| `commFile` | function | SparkEngine | [CrashHandler.cpp:L1773](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1773) | | +| `commFile` | function | SparkEngine | [CrashHandler.cpp:L1774](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1774) | | | `Commit` | function | GameModules | [TFHandoffParticipant.h:L40](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.h#L40) | | | `Commit` | function | SparkEditor | [VersionControlSystem.h:L148](../../SparkEditor/Source/VersionControl/VersionControlSystem.h#L148) | Commit staged changes | | `Commit` | function | Tests | [TestEDT210InspectorEditCommitReal.cpp:L100](../../Tests/TestEDT210InspectorEditCommitReal.cpp#L100) | | @@ -4392,7 +4405,7 @@ | `CompileComputeShader` | function | SparkEngine | [UpscalingSystemWindows.cpp:L265](../../SparkEngine/Source/Graphics/UpscalingSystemWindows.cpp#L265) | | | `CompileCSFromFile` | function | SparkEngine | [GPUParticleSystemWindows.cpp:L40](../../SparkEngine/Source/Graphics/GPUParticleSystemWindows.cpp#L40) | | | `CompileCullShader` | function | Tests | [TestGPUDrivenRendererD3D11.cpp:L46](../../Tests/TestGPUDrivenRendererD3D11.cpp#L46) | | -| `CompiledGraphRun` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L563](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L563) | | +| `CompiledGraphRun` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L606](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L606) | | | `CompileEffectShaders` | function | SparkEngine | [PostProcessingPipeline.h:L345](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L345) | | | `CompileEmbeddedPixelShader` | function | SparkEngine | [GraphicsEngine.h:L1345](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L1345) | | | `CompileEmbeddedVertexShader` | function | SparkEngine | [GraphicsEngine.h:L1344](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L1344) | | @@ -4664,8 +4677,8 @@ | `ConfigureAcceptedSocket` | function | SparkGateway | [GatewayAreaControl.cpp:L255](../../SparkGateway/src/GatewayAreaControl.cpp#L255) | | | `ConfigureAndBuild` | function | SparkInstaller | [Installer.cpp:L175](../../SparkInstaller/src/Installer.cpp#L175) | | | `ConfigureController` | function | SparkEditor | [ServiceTopologyPanel.h:L27](../../SparkEditor/Source/Panels/ServiceTopologyPanel.h#L27) | | -| `configuredPrefix` | function | SparkEngine | [CrashHandler.cpp:L511](../../SparkEngine/Source/Utils/CrashHandler.cpp#L511) | | -| `configuredPrefix` | function | SparkEngine | [CrashHandler.cpp:L513](../../SparkEngine/Source/Utils/CrashHandler.cpp#L513) | | +| `configuredPrefix` | function | SparkEngine | [CrashHandler.cpp:L512](../../SparkEngine/Source/Utils/CrashHandler.cpp#L512) | | +| `configuredPrefix` | function | SparkEngine | [CrashHandler.cpp:L514](../../SparkEngine/Source/Utils/CrashHandler.cpp#L514) | | | `ConfigureExecScriptArgs` | function | SparkEngine | [SparkEngineLinux.cpp:L141](../../SparkEngine/Source/Core/SparkEngineLinux.cpp#L141) | | | `ConfigureIdentity` | function | Tests | [TestVersionControlSystemGitReal.cpp:L62](../../Tests/TestVersionControlSystemGitReal.cpp#L62) | Give the repo a local identity so commits do not depend on the machine's global git config. | | `ConfigureLocalPlayer` | function | GameModules | [MMOPlayerSystem.h:L108](../../GameModules/SparkGameMMO/Source/Player/MMOPlayerSystem.h#L108) | | @@ -4732,7 +4745,7 @@ | `ConsistentGeneration` | function | Tests | [TestSaveInterruptionReal.cpp:L227](../../Tests/TestSaveInterruptionReal.cpp#L227) | | | `ConsistentGeneration` | function | Tests | [TestSaveInterruptionReal.cpp:L280](../../Tests/TestSaveInterruptionReal.cpp#L280) | | | `console` | function | GameModules | [AdvancedConsoleCommands.cpp:L81](../../GameModules/SparkGameFPS/Source/Console/AdvancedConsoleCommands.cpp#L81) | | -| `console` | function | GameModules | [Main.cpp:L397](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L397) | | +| `console` | function | GameModules | [Main.cpp:L400](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L400) | | | `Console_AddZone` | function | GameModules | [GravitySystem.h:L214](../../GameModules/SparkGameFPS/Source/Game/GravitySystem.h#L214) | Create a radial gravity zone (pulls toward center) | | `Console_ApplyForce` | function | SparkEngine | [PhysicsBody.h:L156](../../SparkEngine/Source/Physics/PhysicsBody.h#L156) | | | `Console_ApplyForce` | function | SparkEngine | [PhysicsSystem.h:L476](../../SparkEngine/Source/Physics/PhysicsSystem.h#L476) | | @@ -4740,13 +4753,13 @@ | `Console_ApplyPhysicsSettings` | function | GameModules | [Player.h:L587](../../GameModules/SparkGameFPS/Source/Game/Player.h#L587) | Apply physics settings from console | | `Console_ApplySettings` | function | SparkEngine | [AudioEngine.h:L588](../../SparkEngine/Source/Audio/AudioEngine.h#L588) | Apply audio settings from console | | `Console_ApplySettings` | function | SparkEngine | [GraphicsEngine.h:L728](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L728) | | -| `Console_ApplySettings` | function | SparkEngine | [InputManager.h:L418](../../SparkEngine/Source/Input/InputManager.h#L418) | Apply input settings from console | +| `Console_ApplySettings` | function | SparkEngine | [InputManager.h:L425](../../SparkEngine/Source/Input/InputManager.h#L425) | Apply input settings from console | | `Console_Benchmark` | function | SparkEngine | [GraphicsEngine.h:L716](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L716) | | -| `Console_BindKey` | function | SparkEngine | [InputManager.h:L346](../../SparkEngine/Source/Input/InputManager.h#L346) | Bind a key to an action via console | +| `Console_BindKey` | function | SparkEngine | [InputManager.h:L353](../../SparkEngine/Source/Input/InputManager.h#L353) | Bind a key to an action via console | | `Console_ChangeWeapon` | function | GameModules | [Player.h:L555](../../GameModules/SparkGameFPS/Source/Game/Player.h#L555) | Force weapon change (console integration) | | `Console_ClearCache` | function | SparkEngine | [MaterialSystem.h:L420](../../SparkEngine/Source/Graphics/MaterialSystem.h#L420) | Clear material cache | | `Console_ClearCache` | function | SparkEngine | [Shader.h:L496](../../SparkEngine/Source/Graphics/Shader.h#L496) | Clear shader cache via console | -| `Console_ClearInputStates` | function | SparkEngine | [InputManager.h:L386](../../SparkEngine/Source/Input/InputManager.h#L386) | Clear all input states via console | +| `Console_ClearInputStates` | function | SparkEngine | [InputManager.h:L393](../../SparkEngine/Source/Input/InputManager.h#L393) | Clear all input states via console | | `Console_CreateBody` | function | SparkEngine | [PhysicsSystem.h:L472](../../SparkEngine/Source/Physics/PhysicsSystem.h#L472) | | | `Console_CreateLight` | function | SparkEngine | [LightingSystem.h:L382](../../SparkEngine/Source/Graphics/LightingSystem.h#L382) | Create light via console | | `Console_CreateRenderTarget` | function | SparkEngine | [RenderTarget.h:L318](../../SparkEngine/Source/Graphics/RenderTarget.h#L318) | Create render target via console | @@ -4788,13 +4801,13 @@ | `Console_GetMetrics` | function | SparkEngine | [RenderTarget.h:L298](../../SparkEngine/Source/Graphics/RenderTarget.h#L298) | Get render target metrics | | `Console_GetMetrics` | function | SparkEngine | [Shader.h:L448](../../SparkEngine/Source/Graphics/Shader.h#L448) | Get shader compilation metrics | | `Console_GetMetrics` | function | SparkEngine | [TextureSystem.h:L354](../../SparkEngine/Source/Graphics/TextureSystem.h#L354) | | -| `Console_GetMetrics` | function | SparkEngine | [InputManager.h:L406](../../SparkEngine/Source/Input/InputManager.h#L406) | Get comprehensive input metrics (console integration) | +| `Console_GetMetrics` | function | SparkEngine | [InputManager.h:L413](../../SparkEngine/Source/Input/InputManager.h#L413) | Get comprehensive input metrics (console integration) | | `Console_GetMetrics` | function | SparkEngine | [PhysicsSystem.h:L469](../../SparkEngine/Source/Physics/PhysicsSystem.h#L469) | | | `Console_GetMixerInfo` | function | SparkEngine | [MusicManager.h:L81](../../SparkEngine/Source/Audio/MusicManager.h#L81) | | | `Console_GetNavMeshInfo` | function | SparkEngine | [NavMesh.h:L499](../../SparkEngine/Source/Engine/AI/NavMesh.h#L499) | Get detailed information about a specific NavMesh (console integration). | -| `Console_GetNodeInfo` | function | SparkEngine | [SceneManager.h:L444](../../SparkEngine/Source/SceneManager/SceneManager.h#L444) | Return detailed information about a specific node (console integration). | +| `Console_GetNodeInfo` | function | SparkEngine | [SceneManager.h:L446](../../SparkEngine/Source/SceneManager/SceneManager.h#L446) | Return detailed information about a specific node (console integration). | | `Console_GetPipelineStats` | function | SparkEngine | [RenderPipeline.h:L156](../../SparkEngine/Source/Graphics/RenderPipeline.h#L156) | Get pipeline statistics from the last frame. | -| `Console_GetRecentEvents` | function | SparkEngine | [InputManager.h:L393](../../SparkEngine/Source/Input/InputManager.h#L393) | Get recent input events via console | +| `Console_GetRecentEvents` | function | SparkEngine | [InputManager.h:L400](../../SparkEngine/Source/Input/InputManager.h#L400) | Get recent input events via console | | `Console_GetRenderTargetInfo` | function | SparkEngine | [RenderTarget.h:L308](../../SparkEngine/Source/Graphics/RenderTarget.h#L308) | Get detailed render target information | | `Console_GetReport` | function | SparkEngine | [ConstantBufferDiff.h:L122](../../SparkEngine/Source/Graphics/ConstantBufferDiff.h#L122) | | | `Console_GetReport` | function | SparkEngine | [VulkanDescriptorCache.h:L104](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDescriptorCache.h#L104) | Get diagnostic report. | @@ -4808,7 +4821,7 @@ | `Console_GetScoreboard` | function | GameModules | [GameMechanics.h:L270](../../GameModules/SparkGameFPS/Source/Game/GameMechanics.h#L270) | Register a kill for scoring | | `Console_GetSequenceInfo` | function | SparkEngine | [Sequencer.h:L377](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L377) | Deliver queued cues to the attached audio service exactly once. | | `Console_GetSettings` | function | SparkEngine | [AudioEngine.h:L582](../../SparkEngine/Source/Audio/AudioEngine.h#L582) | Get current audio settings (console integration) | -| `Console_GetSettings` | function | SparkEngine | [InputManager.h:L412](../../SparkEngine/Source/Input/InputManager.h#L412) | Get current input settings (console integration) | +| `Console_GetSettings` | function | SparkEngine | [InputManager.h:L419](../../SparkEngine/Source/Input/InputManager.h#L419) | Get current input settings (console integration) | | `Console_GetShaderInfo` | function | SparkEngine | [Shader.h:L479](../../SparkEngine/Source/Graphics/Shader.h#L479) | Get detailed shader information via console | | `Console_GetSourceInfo` | function | SparkEngine | [AudioEngine.h:L658](../../SparkEngine/Source/Audio/AudioEngine.h#L658) | Get audio source information via console | | `Console_GetState` | function | GameModules | [Player.h:L563](../../GameModules/SparkGameFPS/Source/Game/Player.h#L563) | Get complete player state (console integration) | @@ -4944,7 +4957,7 @@ | `Console_GetTextureMemoryInfo` | function | SparkEngine | [MaterialSystem.h:L435](../../SparkEngine/Source/Graphics/MaterialSystem.h#L435) | Get texture memory usage | | `Console_GetVRAMUsage` | function | SparkEngine | [GraphicsEngine.h:L732](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L732) | | | `Console_GiveAmmo` | function | GameModules | [Player.h:L549](../../GameModules/SparkGameFPS/Source/Game/Player.h#L549) | Give ammunition to current weapon (console integration) | -| `Console_IsActionActive` | function | SparkEngine | [InputManager.h:L400](../../SparkEngine/Source/Input/InputManager.h#L400) | Check if a specific action is currently active via console | +| `Console_IsActionActive` | function | SparkEngine | [InputManager.h:L407](../../SparkEngine/Source/Input/InputManager.h#L407) | Check if a specific action is currently active via console | | `Console_ListAgents` | function | SparkEngine | [AISystem.h:L343](../../SparkEngine/Source/Engine/AI/AISystem.h#L343) | Return a formatted list of all active AI agents (console integration). | | `Console_ListAnimations` | function | SparkEngine | [AnimationSystem.h:L445](../../SparkEngine/Source/Engine/Animation/AnimationSystem.h#L445) | List all registered clip names (console integration). | | `Console_ListAssets` | function | SparkEngine | [AssetIntegration.h:L220](../../SparkEngine/Source/Core/AssetIntegration.h#L220) | Console integration: list all registered assets. | @@ -4955,7 +4968,7 @@ | `Console_ListClients` | function | SparkEngine | [NetworkManager.h:L891](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L891) | | | `Console_ListEffects` | function | SparkEngine | [PostProcessingPipeline.h:L229](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L229) | | | `Console_ListEmitters` | function | SparkEngine | [ParticleSystem.h:L255](../../SparkEngine/Source/Graphics/ParticleSystem.h#L255) | | -| `Console_ListKeyBindings` | function | SparkEngine | [InputManager.h:L358](../../SparkEngine/Source/Input/InputManager.h#L358) | Get list of current key bindings via console | +| `Console_ListKeyBindings` | function | SparkEngine | [InputManager.h:L365](../../SparkEngine/Source/Input/InputManager.h#L365) | Get list of current key bindings via console | | `Console_ListKeys` | function | SparkEngine | [LocalizationSystem.h:L192](../../SparkEngine/Source/Engine/Localization/LocalizationSystem.h#L192) | List all keys for the current language (console integration). | | `Console_ListLights` | function | SparkEngine | [LightingSystem.h:L372](../../SparkEngine/Source/Graphics/LightingSystem.h#L372) | List all lights | | `Console_ListLODChains` | function | SparkEngine | [MeshLOD.h:L146](../../SparkEngine/Source/Graphics/MeshLOD.h#L146) | | @@ -4963,7 +4976,7 @@ | `Console_ListMaterialVariants` | function | SparkEngine | [MaterialSystem.h:L460](../../SparkEngine/Source/Graphics/MaterialSystem.h#L460) | List material variants | | `Console_ListMods` | function | SparkEngine | [ModSystem.h:L208](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L208) | List all mods (console integration). | | `Console_ListNavMeshes` | function | SparkEngine | [NavMesh.h:L491](../../SparkEngine/Source/Engine/AI/NavMesh.h#L491) | List all registered NavMesh names (console integration). | -| `Console_ListNodes` | function | SparkEngine | [SceneManager.h:L433](../../SparkEngine/Source/SceneManager/SceneManager.h#L433) | Return a formatted list of all nodes in the scene (console integration). | +| `Console_ListNodes` | function | SparkEngine | [SceneManager.h:L435](../../SparkEngine/Source/SceneManager/SceneManager.h#L435) | Return a formatted list of all nodes in the scene (console integration). | | `Console_ListObjects` | function | GameModules | [InteractiveObject.h:L496](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L496) | Spawn a destructible object | | `Console_ListObstacles` | function | SparkEngine | [NavMeshObstacles.h:L310](../../SparkEngine/Source/Engine/AI/NavMeshObstacles.h#L310) | List all active obstacles (console integration). | | `Console_ListPlaylists` | function | SparkEngine | [MusicManager.h:L268](../../SparkEngine/Source/Audio/MusicManager.h#L268) | | @@ -4988,20 +5001,20 @@ | `Console_ListZones` | function | GameModules | [GravitySystem.h:L213](../../GameModules/SparkGameFPS/Source/Game/GravitySystem.h#L213) | Create a radial gravity zone (pulls toward center) | | `Console_LoadAsset` | function | SparkEngine | [AssetPipeline.h:L513](../../SparkEngine/Source/Graphics/AssetPipeline.h#L513) | Load asset via console | | `Console_LookAt` | function | SparkEngine | [SparkEngineCamera.h:L360](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L360) | Look at a specific point (console integration) | -| `Console_MoveNode` | function | SparkEngine | [SceneManager.h:L458](../../SparkEngine/Source/SceneManager/SceneManager.h#L458) | | +| `Console_MoveNode` | function | SparkEngine | [SceneManager.h:L460](../../SparkEngine/Source/SceneManager/SceneManager.h#L460) | | | `Console_PausePhysics` | function | SparkEngine | [PhysicsSystem.h:L479](../../SparkEngine/Source/Physics/PhysicsSystem.h#L479) | | | `Console_PlayTestSound` | function | SparkEngine | [AudioEngine.h:L553](../../SparkEngine/Source/Audio/AudioEngine.h#L553) | Play a test sound via console | | `Console_PreloadDirectory` | function | SparkEngine | [AssetPipeline.h:L553](../../SparkEngine/Source/Graphics/AssetPipeline.h#L553) | Preload assets from directory | | `Console_Raycast` | function | SparkEngine | [PhysicsSystem.h:L481](../../SparkEngine/Source/Physics/PhysicsSystem.h#L481) | | | `Console_RecompileAll` | function | SparkEngine | [Shader.h:L453](../../SparkEngine/Source/Graphics/Shader.h#L453) | Force recompilation of all shaders via console | | `Console_RefreshAudio` | function | SparkEngine | [AudioEngine.h:L651](../../SparkEngine/Source/Audio/AudioEngine.h#L651) | Force audio system refresh via console | -| `Console_RefreshInput` | function | SparkEngine | [InputManager.h:L434](../../SparkEngine/Source/Input/InputManager.h#L434) | Force input system refresh via console | +| `Console_RefreshInput` | function | SparkEngine | [InputManager.h:L441](../../SparkEngine/Source/Input/InputManager.h#L441) | Force input system refresh via console | | `Console_RegisterStateCallback` | function | GameModules | [Player.h:L569](../../GameModules/SparkGameFPS/Source/Game/Player.h#L569) | Register console state change callback | | `Console_RegisterStateCallback` | function | SparkEngine | [AudioEngine.h:L599](../../SparkEngine/Source/Audio/AudioEngine.h#L599) | Register console state change callback | | `Console_RegisterStateCallback` | function | SparkEngine | [SparkEngineCamera.h:L352](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L352) | Register console state change callback | | `Console_RegisterStateCallback` | function | SparkEngine | [GraphicsEngine.h:L730](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L730) | | | `Console_RegisterStateCallback` | function | SparkEngine | [Shader.h:L485](../../SparkEngine/Source/Graphics/Shader.h#L485) | Register console state change callback | -| `Console_RegisterStateCallback` | function | SparkEngine | [InputManager.h:L429](../../SparkEngine/Source/Input/InputManager.h#L429) | Register console state change callback | +| `Console_RegisterStateCallback` | function | SparkEngine | [InputManager.h:L436](../../SparkEngine/Source/Input/InputManager.h#L436) | Register console state change callback | | `Console_ReloadAllAssets` | function | SparkEngine | [AssetPipeline.h:L558](../../SparkEngine/Source/Graphics/AssetPipeline.h#L558) | Reload all assets | | `Console_ReloadAllTextures` | function | SparkEngine | [TextureSystem.h:L361](../../SparkEngine/Source/Graphics/TextureSystem.h#L361) | | | `Console_ReloadIBL` | function | SparkEngine | [LightingSystem.h:L422](../../SparkEngine/Source/Graphics/LightingSystem.h#L422) | Reload IBL textures | @@ -5009,14 +5022,14 @@ | `Console_ReloadTexture` | function | SparkEngine | [TextureSystem.h:L360](../../SparkEngine/Source/Graphics/TextureSystem.h#L360) | | | `Console_RemoveBody` | function | SparkEngine | [PhysicsSystem.h:L473](../../SparkEngine/Source/Physics/PhysicsSystem.h#L473) | | | `Console_RemoveZone` | function | GameModules | [GravitySystem.h:L216](../../GameModules/SparkGameFPS/Source/Game/GravitySystem.h#L216) | | -| `Console_RenameNode` | function | SparkEngine | [SceneManager.h:L472](../../SparkEngine/Source/SceneManager/SceneManager.h#L472) | | +| `Console_RenameNode` | function | SparkEngine | [SceneManager.h:L474](../../SparkEngine/Source/SceneManager/SceneManager.h#L474) | | | `Console_RenderTargetPoolStatus` | function | SparkEngine | [PostProcessingPipeline.h:L248](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L248) | Console-friendly render-target pool status. | | `Console_Reset` | function | SparkEngine | [PhysicsSystem.h:L483](../../SparkEngine/Source/Physics/PhysicsSystem.h#L483) | | | `Console_ResetDevice` | function | SparkEngine | [GraphicsEngine.h:L726](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L726) | | | `Console_ResetToDefaults` | function | SparkEngine | [AudioEngine.h:L593](../../SparkEngine/Source/Audio/AudioEngine.h#L593) | Reset audio settings to defaults via console | | `Console_ResetToDefaults` | function | SparkEngine | [SparkEngineCamera.h:L340](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L340) | Reset camera to default settings (console integration) | | `Console_ResetToDefaults` | function | SparkEngine | [GraphicsEngine.h:L729](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L729) | | -| `Console_ResetToDefaults` | function | SparkEngine | [InputManager.h:L423](../../SparkEngine/Source/Input/InputManager.h#L423) | Reset input settings to defaults via console | +| `Console_ResetToDefaults` | function | SparkEngine | [InputManager.h:L430](../../SparkEngine/Source/Input/InputManager.h#L430) | Reset input settings to defaults via console | | `Console_ResizeRenderTarget` | function | SparkEngine | [RenderTarget.h:L324](../../SparkEngine/Source/Graphics/RenderTarget.h#L324) | Resize specific render target | | `Console_SaveRenderTarget` | function | SparkEngine | [RenderTarget.h:L313](../../SparkEngine/Source/Graphics/RenderTarget.h#L313) | Save render target to file | | `Console_ScanDirectory` | function | SparkEngine | [AssetPipeline.h:L543](../../SparkEngine/Source/Graphics/AssetPipeline.h#L543) | Scan directory for assets | @@ -5044,9 +5057,9 @@ | `Console_SetHealth` | function | GameModules | [Player.h:L493](../../GameModules/SparkGameFPS/Source/Game/Player.h#L493) | Set player health directly (console integration) | | `Console_SetHotReload` | function | SparkEngine | [Shader.h:L459](../../SparkEngine/Source/Graphics/Shader.h#L459) | Enable/disable hot reloading via console | | `Console_SetInfiniteAmmo` | function | GameModules | [Player.h:L543](../../GameModules/SparkGameFPS/Source/Game/Player.h#L543) | Enable/disable infinite ammo (console integration) | -| `Console_SetInputLogging` | function | SparkEngine | [InputManager.h:L338](../../SparkEngine/Source/Input/InputManager.h#L338) | Enable/disable input logging via console | +| `Console_SetInputLogging` | function | SparkEngine | [InputManager.h:L345](../../SparkEngine/Source/Input/InputManager.h#L345) | Enable/disable input logging via console | | `Console_SetIntensity` | function | SparkEngine | [AIDirector.h:L185](../../SparkEngine/Source/Engine/AI/AIDirector.h#L185) | Set intensity manually (console integration / debugging). | -| `Console_SetInvertMouseY` | function | SparkEngine | [InputManager.h:L326](../../SparkEngine/Source/Input/InputManager.h#L326) | Enable/disable Y-axis inversion via console | +| `Console_SetInvertMouseY` | function | SparkEngine | [InputManager.h:L333](../../SparkEngine/Source/Input/InputManager.h#L333) | Enable/disable Y-axis inversion via console | | `Console_SetInvertY` | function | SparkEngine | [SparkEngineCamera.h:L300](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L300) | Set Y-axis inversion (console integration) | | `Console_SetJumpHeight` | function | GameModules | [Player.h:L517](../../GameModules/SparkGameFPS/Source/Game/Player.h#L517) | Set player jump height (console integration) | | `Console_SetLightColor` | function | SparkEngine | [LightingSystem.h:L397](../../SparkEngine/Source/Graphics/LightingSystem.h#L397) | Set light color via console | @@ -5061,10 +5074,10 @@ | `Console_SetMaxHealth` | function | GameModules | [Player.h:L505](../../GameModules/SparkGameFPS/Source/Game/Player.h#L505) | Set player maximum health (console integration) | | `Console_SetMemoryBudget` | function | SparkEngine | [TextureSystem.h:L358](../../SparkEngine/Source/Graphics/TextureSystem.h#L358) | | | `Console_SetMode` | function | SparkEngine | [UpscalingSystem.h:L485](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L485) | Console command to set upscaling mode by name | -| `Console_SetMouseAcceleration` | function | SparkEngine | [InputManager.h:L320](../../SparkEngine/Source/Input/InputManager.h#L320) | Enable/disable mouse acceleration via console | -| `Console_SetMouseDeadZone` | function | SparkEngine | [InputManager.h:L314](../../SparkEngine/Source/Input/InputManager.h#L314) | Set mouse dead zone via console | +| `Console_SetMouseAcceleration` | function | SparkEngine | [InputManager.h:L327](../../SparkEngine/Source/Input/InputManager.h#L327) | Enable/disable mouse acceleration via console | +| `Console_SetMouseDeadZone` | function | SparkEngine | [InputManager.h:L321](../../SparkEngine/Source/Input/InputManager.h#L321) | Set mouse dead zone via console | | `Console_SetMouseSensitivity` | function | SparkEngine | [SparkEngineCamera.h:L294](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L294) | Set mouse sensitivity (console integration) | -| `Console_SetMouseSensitivity` | function | SparkEngine | [InputManager.h:L308](../../SparkEngine/Source/Input/InputManager.h#L308) | Set mouse sensitivity via console | +| `Console_SetMouseSensitivity` | function | SparkEngine | [InputManager.h:L315](../../SparkEngine/Source/Input/InputManager.h#L315) | Set mouse sensitivity via console | | `Console_SetMoveSpeed` | function | SparkEngine | [SparkEngineCamera.h:L306](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L306) | Set movement speed (console integration) | | `Console_SetMusicVolume` | function | SparkEngine | [AudioEngine.h:L507](../../SparkEngine/Source/Audio/AudioEngine.h#L507) | Set music volume via console | | `Console_SetNoclip` | function | GameModules | [Player.h:L537](../../GameModules/SparkGameFPS/Source/Game/Player.h#L537) | Enable/disable noclip mode (console integration) | @@ -5077,7 +5090,7 @@ | `Console_SetQuality` | function | SparkEngine | [DXRSupport.h:L242](../../SparkEngine/Source/Graphics/RHI/DXRSupport.h#L242) | | | `Console_SetQuality` | function | SparkEngine | [TextureSystem.h:L357](../../SparkEngine/Source/Graphics/TextureSystem.h#L357) | | | `Console_SetQuality` | function | SparkEngine | [UpscalingSystem.h:L514](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L514) | Console command to set quality preset by name | -| `Console_SetRawMouseInput` | function | SparkEngine | [InputManager.h:L332](../../SparkEngine/Source/Input/InputManager.h#L332) | Enable/disable raw mouse input via console | +| `Console_SetRawMouseInput` | function | SparkEngine | [InputManager.h:L339](../../SparkEngine/Source/Input/InputManager.h#L339) | Enable/disable raw mouse input via console | | `Console_SetRenderingPipeline` | function | SparkEngine | [GraphicsEngine.h:L719](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L719) | | | `Console_SetRenderPath` | function | SparkEngine | [GraphicsEngine.h:L709](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L709) | | | `Console_SetRenderScale` | function | SparkEngine | [GraphicsEngine.h:L723](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L723) | | @@ -5095,7 +5108,7 @@ | `Console_SetVSync` | function | SparkEngine | [GraphicsEngine.h:L718](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L718) | | | `Console_SetWireframe` | function | SparkEngine | [GraphicsEngine.h:L717](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L717) | | | `Console_SetWorldGravity` | function | GameModules | [GravitySystem.h:L217](../../GameModules/SparkGameFPS/Source/Game/GravitySystem.h#L217) | | -| `Console_SimulateKeyPress` | function | SparkEngine | [InputManager.h:L368](../../SparkEngine/Source/Input/InputManager.h#L368) | Simulate a key press via console | +| `Console_SimulateKeyPress` | function | SparkEngine | [InputManager.h:L375](../../SparkEngine/Source/Input/InputManager.h#L375) | Simulate a key press via console | | `Console_SmoothMoveTo` | function | SparkEngine | [SparkEngineCamera.h:L369](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L369) | Smooth transition to position (console integration) | | `Console_SpawnEffect` | function | SparkEngine | [ParticleSystem.h:L257](../../SparkEngine/Source/Graphics/ParticleSystem.h#L257) | | | `Console_SpawnTestDecal` | function | SparkEngine | [DecalSystem.h:L152](../../SparkEngine/Source/Graphics/DecalSystem.h#L152) | | @@ -5103,46 +5116,47 @@ | `Console_StopAllSounds` | function | SparkEngine | [AudioEngine.h:L564](../../SparkEngine/Source/Audio/AudioEngine.h#L564) | Stop all playing sounds via console | | `Console_StopSound` | function | SparkEngine | [AudioEngine.h:L559](../../SparkEngine/Source/Audio/AudioEngine.h#L559) | Stop a specific sound source via console | | `Console_ToggleVisualization` | function | SparkEngine | [RenderTarget.h:L329](../../SparkEngine/Source/Graphics/RenderTarget.h#L329) | Toggle render target visualization | -| `Console_UnbindKey` | function | SparkEngine | [InputManager.h:L352](../../SparkEngine/Source/Input/InputManager.h#L352) | Unbind a key action via console | +| `Console_UnbindKey` | function | SparkEngine | [InputManager.h:L359](../../SparkEngine/Source/Input/InputManager.h#L359) | Unbind a key action via console | | `Console_UnloadAsset` | function | SparkEngine | [AssetPipeline.h:L518](../../SparkEngine/Source/Graphics/AssetPipeline.h#L518) | Unload asset via console | | `Console_UnloadTextureFromSlot` | function | SparkEngine | [MaterialSystem.h:L455](../../SparkEngine/Source/Graphics/MaterialSystem.h#L455) | Unload texture from material slot | | `Console_ValidateMaterials` | function | SparkEngine | [MaterialSystem.h:L440](../../SparkEngine/Source/Graphics/MaterialSystem.h#L440) | Validate all loaded materials | | `Console_ValidateRenderTargets` | function | SparkEngine | [RenderTarget.h:L344](../../SparkEngine/Source/Graphics/RenderTarget.h#L344) | Validate all render targets | | `Console_ValidateShaders` | function | SparkEngine | [Shader.h:L491](../../SparkEngine/Source/Graphics/Shader.h#L491) | Validate all loaded shaders via console | | `ConsoleApp` | function | SparkConsole | [ConsoleApp.h:L42](../../SparkConsole/src/ConsoleApp.h#L42) | | -| `ConsoleApp::AddToHistory` | method | SparkConsole | [ConsoleApp.cpp:L1162](../../SparkConsole/src/ConsoleApp.cpp#L1162) | | +| `ConsoleApp::AddToHistory` | method | SparkConsole | [ConsoleApp.cpp:L1166](../../SparkConsole/src/ConsoleApp.cpp#L1166) | | | `ConsoleApp::ClearDisplay` | method | SparkConsole | [ConsoleApp.cpp:L125](../../SparkConsole/src/ConsoleApp.cpp#L125) | | | `ConsoleApp::DetectPipeMode` | method | SparkConsole | [ConsoleApp.cpp:L198](../../SparkConsole/src/ConsoleApp.cpp#L198) | | | `ConsoleApp::DisplayHandle` | method | SparkConsole | [ConsoleApp.cpp:L100](../../SparkConsole/src/ConsoleApp.cpp#L100) | | -| `ConsoleApp::ExecuteCommand` | method | SparkConsole | [ConsoleApp.cpp:L819](../../SparkConsole/src/ConsoleApp.cpp#L819) | | -| `ConsoleApp::HandleBackspaceKey` | method | SparkConsole | [ConsoleApp.cpp:L606](../../SparkConsole/src/ConsoleApp.cpp#L606) | | -| `ConsoleApp::HandlePrintableChar` | method | SparkConsole | [ConsoleApp.cpp:L620](../../SparkConsole/src/ConsoleApp.cpp#L620) | | -| `ConsoleApp::OnEnginePipeClosed` | method | SparkConsole | [ConsoleApp.cpp:L579](../../SparkConsole/src/ConsoleApp.cpp#L579) | | -| `ConsoleApp::PipeKeyboardThreadFunc` | method | SparkConsole | [ConsoleApp.cpp:L292](../../SparkConsole/src/ConsoleApp.cpp#L292) | | -| `ConsoleApp::PollPipeModeInput` | method | SparkConsole | [ConsoleApp.cpp:L218](../../SparkConsole/src/ConsoleApp.cpp#L218) | | -| `ConsoleApp::PollStandaloneInput` | method | SparkConsole | [ConsoleApp.cpp:L253](../../SparkConsole/src/ConsoleApp.cpp#L253) | | -| `ConsoleApp::PollWindowsPipeData` | method | SparkConsole | [ConsoleApp.cpp:L443](../../SparkConsole/src/ConsoleApp.cpp#L443) | | +| `ConsoleApp::ExecuteCommand` | method | SparkConsole | [ConsoleApp.cpp:L823](../../SparkConsole/src/ConsoleApp.cpp#L823) | | +| `ConsoleApp::HandleBackspaceKey` | method | SparkConsole | [ConsoleApp.cpp:L610](../../SparkConsole/src/ConsoleApp.cpp#L610) | | +| `ConsoleApp::HandlePrintableChar` | method | SparkConsole | [ConsoleApp.cpp:L624](../../SparkConsole/src/ConsoleApp.cpp#L624) | | +| `ConsoleApp::OnEnginePipeClosed` | method | SparkConsole | [ConsoleApp.cpp:L583](../../SparkConsole/src/ConsoleApp.cpp#L583) | | +| `ConsoleApp::PipeKeyboardThreadFunc` | method | SparkConsole | [ConsoleApp.cpp:L294](../../SparkConsole/src/ConsoleApp.cpp#L294) | | +| `ConsoleApp::PollPipeModeInput` | method | SparkConsole | [ConsoleApp.cpp:L233](../../SparkConsole/src/ConsoleApp.cpp#L233) | | +| `ConsoleApp::PollStandaloneInput` | method | SparkConsole | [ConsoleApp.cpp:L255](../../SparkConsole/src/ConsoleApp.cpp#L255) | | +| `ConsoleApp::PollWindowsPipeData` | method | SparkConsole | [ConsoleApp.cpp:L447](../../SparkConsole/src/ConsoleApp.cpp#L447) | | | `ConsoleApp::PrintBanner` | method | SparkConsole | [ConsoleApp.cpp:L173](../../SparkConsole/src/ConsoleApp.cpp#L173) | | -| `ConsoleApp::PrintDuplicateSkipNotice` | method | SparkConsole | [ConsoleApp.cpp:L694](../../SparkConsole/src/ConsoleApp.cpp#L694) | | -| `ConsoleApp::PrintEngineLog` | method | SparkConsole | [ConsoleApp.cpp:L717](../../SparkConsole/src/ConsoleApp.cpp#L717) | | -| `ConsoleApp::PrintLog` | method | SparkConsole | [ConsoleApp.cpp:L648](../../SparkConsole/src/ConsoleApp.cpp#L648) | | -| `ConsoleApp::PrintResult` | method | SparkConsole | [ConsoleApp.cpp:L773](../../SparkConsole/src/ConsoleApp.cpp#L773) | | -| `ConsoleApp::ProcessPipeMessages` | method | SparkConsole | [ConsoleApp.cpp:L419](../../SparkConsole/src/ConsoleApp.cpp#L419) | | -| `ConsoleApp::ReadEngineInput` | method | SparkConsole | [ConsoleApp.cpp:L597](../../SparkConsole/src/ConsoleApp.cpp#L597) | | -| `ConsoleApp::ReadEngineInputPosix` | method | SparkConsole | [ConsoleApp.cpp:L527](../../SparkConsole/src/ConsoleApp.cpp#L527) | | -| `ConsoleApp::ReadEngineInputWindows` | method | SparkConsole | [ConsoleApp.cpp:L496](../../SparkConsole/src/ConsoleApp.cpp#L496) | | -| `ConsoleApp::RegisterAliasCommands` | method | SparkConsole | [ConsoleApp.cpp:L1089](../../SparkConsole/src/ConsoleApp.cpp#L1089) | | -| `ConsoleApp::RegisterCoreCommands` | method | SparkConsole | [ConsoleApp.cpp:L848](../../SparkConsole/src/ConsoleApp.cpp#L848) | | -| `ConsoleApp::RegisterDefaultCommands` | method | SparkConsole | [ConsoleApp.cpp:L841](../../SparkConsole/src/ConsoleApp.cpp#L841) | | -| `ConsoleApp::RegisterDiagnosticCommands` | method | SparkConsole | [ConsoleApp.cpp:L938](../../SparkConsole/src/ConsoleApp.cpp#L938) | | -| `ConsoleApp::ResolveAlias` | method | SparkConsole | [ConsoleApp.cpp:L632](../../SparkConsole/src/ConsoleApp.cpp#L632) | | -| `ConsoleApp::Run` | method | SparkConsole | [ConsoleApp.cpp:L357](../../SparkConsole/src/ConsoleApp.cpp#L357) | | -| `ConsoleApp::RunBatch` | method | SparkConsole | [ConsoleApp.cpp:L400](../../SparkConsole/src/ConsoleApp.cpp#L400) | | -| `ConsoleApp::SetConsoleColor` | method | SparkConsole | [ConsoleApp.cpp:L807](../../SparkConsole/src/ConsoleApp.cpp#L807) | | -| `ConsoleApp::SetConsoleColor` | method | SparkConsole | [ConsoleApp.cpp:L812](../../SparkConsole/src/ConsoleApp.cpp#L812) | | +| `ConsoleApp::PrintDuplicateSkipNotice` | method | SparkConsole | [ConsoleApp.cpp:L698](../../SparkConsole/src/ConsoleApp.cpp#L698) | | +| `ConsoleApp::PrintEngineLog` | method | SparkConsole | [ConsoleApp.cpp:L721](../../SparkConsole/src/ConsoleApp.cpp#L721) | | +| `ConsoleApp::PrintLog` | method | SparkConsole | [ConsoleApp.cpp:L652](../../SparkConsole/src/ConsoleApp.cpp#L652) | | +| `ConsoleApp::PrintPipePrompt` | method | SparkConsole | [ConsoleApp.cpp:L218](../../SparkConsole/src/ConsoleApp.cpp#L218) | | +| `ConsoleApp::PrintResult` | method | SparkConsole | [ConsoleApp.cpp:L777](../../SparkConsole/src/ConsoleApp.cpp#L777) | | +| `ConsoleApp::ProcessPipeMessages` | method | SparkConsole | [ConsoleApp.cpp:L423](../../SparkConsole/src/ConsoleApp.cpp#L423) | | +| `ConsoleApp::ReadEngineInput` | method | SparkConsole | [ConsoleApp.cpp:L601](../../SparkConsole/src/ConsoleApp.cpp#L601) | | +| `ConsoleApp::ReadEngineInputPosix` | method | SparkConsole | [ConsoleApp.cpp:L531](../../SparkConsole/src/ConsoleApp.cpp#L531) | | +| `ConsoleApp::ReadEngineInputWindows` | method | SparkConsole | [ConsoleApp.cpp:L500](../../SparkConsole/src/ConsoleApp.cpp#L500) | | +| `ConsoleApp::RegisterAliasCommands` | method | SparkConsole | [ConsoleApp.cpp:L1093](../../SparkConsole/src/ConsoleApp.cpp#L1093) | | +| `ConsoleApp::RegisterCoreCommands` | method | SparkConsole | [ConsoleApp.cpp:L852](../../SparkConsole/src/ConsoleApp.cpp#L852) | | +| `ConsoleApp::RegisterDefaultCommands` | method | SparkConsole | [ConsoleApp.cpp:L845](../../SparkConsole/src/ConsoleApp.cpp#L845) | | +| `ConsoleApp::RegisterDiagnosticCommands` | method | SparkConsole | [ConsoleApp.cpp:L942](../../SparkConsole/src/ConsoleApp.cpp#L942) | | +| `ConsoleApp::ResolveAlias` | method | SparkConsole | [ConsoleApp.cpp:L636](../../SparkConsole/src/ConsoleApp.cpp#L636) | | +| `ConsoleApp::Run` | method | SparkConsole | [ConsoleApp.cpp:L360](../../SparkConsole/src/ConsoleApp.cpp#L360) | | +| `ConsoleApp::RunBatch` | method | SparkConsole | [ConsoleApp.cpp:L404](../../SparkConsole/src/ConsoleApp.cpp#L404) | | +| `ConsoleApp::SetConsoleColor` | method | SparkConsole | [ConsoleApp.cpp:L811](../../SparkConsole/src/ConsoleApp.cpp#L811) | | +| `ConsoleApp::SetConsoleColor` | method | SparkConsole | [ConsoleApp.cpp:L816](../../SparkConsole/src/ConsoleApp.cpp#L816) | | | `ConsoleApp::WriteDisplay` | method | SparkConsole | [ConsoleApp.cpp:L119](../../SparkConsole/src/ConsoleApp.cpp#L119) | | | `ConsoleLifecycleGuard` | function | Tests | [TestConsoleProcessPipeReal.cpp:L122](../../Tests/TestConsoleProcessPipeReal.cpp#L122) | | -| `ConsoleLogContains` | function | Tests | [TestFPSMultiplayer.cpp:L1400](../../Tests/TestFPSMultiplayer.cpp#L1400) | | +| `ConsoleLogContains` | function | Tests | [TestFPSMultiplayer.cpp:L1411](../../Tests/TestFPSMultiplayer.cpp#L1411) | | | `ConsoleLogTarget::WriteLog` | method | SparkEditor | [EditorLogger.cpp:L18](../../SparkEditor/Source/Core/EditorLogger.cpp#L18) | | | `ConsolePanel::AddLogEntry` | method | SparkEditor | [ConsolePanel.cpp:L295](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L295) | | | `ConsolePanel::Clear` | method | SparkEditor | [ConsolePanel.cpp:L315](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L315) | | @@ -5343,7 +5357,7 @@ | `Consume` | function | Tests | [TestRenderCommandRing.cpp:L49](../../Tests/TestRenderCommandRing.cpp#L49) | | | `ConsumeDedicatedServerRequest` | function | SparkEngine | [PlayModeManager.h:L400](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L400) | Check if a PIE dedicated server was requested and consume the flag. | | `ConsumeProjectSelectorChoice` | function | SparkEngine | [SparkEngineWindowsInternal.h:L87](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L87) | Consume a project-selector pick: load + init the chosen module. | -| `ConsumeProjectSelectorChoice` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L188](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L188) | Consume a project-selector pick: load + init the chosen module. | +| `ConsumeProjectSelectorChoice` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L189](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L189) | Consume a project-selector pick: load + init the chosen module. | | `consumer` | function | Tests | [TestRenderCommandRing.cpp:L144](../../Tests/TestRenderCommandRing.cpp#L144) | | | `consumer` | function | Tests | [TestThreadSafeQueue.cpp:L117](../../Tests/TestThreadSafeQueue.cpp#L117) | | | `consumer` | function | Tests | [TestWorkSema.cpp:L50](../../Tests/TestWorkSema.cpp#L50) | | @@ -5384,7 +5398,7 @@ | `ContainsPoint` | function | SparkEditor | [LevelStreamingTypes.h:L146](../../SparkEditor/Source/LevelStreaming/LevelStreamingTypes.h#L146) | Check if point is inside volume | | `ContainsSecret` | function | Tests | [TestDATA120SecretsAtRest.cpp:L72](../../Tests/TestDATA120SecretsAtRest.cpp#L72) | | | `content` | function | SparkBuild | [Config.cpp:L764](../../SparkBuild/src/Config.cpp#L764) | | -| `content` | function | SparkEditor | [EditorUI.cpp:L1986](../../SparkEditor/Source/Core/EditorUI.cpp#L1986) | | +| `content` | function | SparkEditor | [EditorUI.cpp:L2006](../../SparkEditor/Source/Core/EditorUI.cpp#L2006) | | | `content` | function | SparkEditor | [ProjectManager.cpp:L1284](../../SparkEditor/Source/Core/ProjectManager.cpp#L1284) | | | `content` | function | SparkEditor | [BuildPipeline.cpp:L615](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L615) | | | `content` | function | SparkEditor | [BuildPipeline.cpp:L649](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L649) | | @@ -5393,7 +5407,7 @@ | `content` | function | SparkEngine | [DataTableSystem.h:L868](../../SparkEngine/Source/Engine/DataTable/DataTableSystem.h#L868) | | | `content` | function | SparkEngine | [DialogueTreeLoader.cpp:L66](../../SparkEngine/Source/Engine/Dialogue/DialogueTreeLoader.cpp#L66) | | | `content` | function | SparkEngine | [StringTable.cpp:L86](../../SparkEngine/Source/Engine/Localization/StringTable.cpp#L86) | | -| `content` | function | SparkEngine | [SceneManager.cpp:L1087](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1087) | | +| `content` | function | SparkEngine | [SceneManager.cpp:L1203](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1203) | | | `content` | function | SparkEngine | [BenchmarkFrameworkBaseline.cpp:L292](../../SparkEngine/Source/Utils/BenchmarkFrameworkBaseline.cpp#L292) | | | `content` | function | SparkEngine | [ConfigParser.h:L72](../../SparkEngine/Source/Utils/ConfigParser.h#L72) | | | `content` | function | Tests | [TestCrashArtifactRetention.cpp:L83](../../Tests/TestCrashArtifactRetention.cpp#L83) | | @@ -5408,8 +5422,10 @@ | `contentC` | function | Tests | [TestLocalFileCache.cpp:L266](../../Tests/TestLocalFileCache.cpp#L266) | | | `ContentRoot` | function | GameModules | [TFWorldSetup.h:L141](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetup.h#L141) | | | `contents` | function | SparkCrashReporter | [CrashReporterManifestTests.cpp:L447](../../SparkCrashReporter/tests/CrashReporterManifestTests.cpp#L447) | | +| `contents` | function | SparkEditor | [MaterialEditorFiles.cpp:L45](../../SparkEditor/Source/Panels/MaterialEditorFiles.cpp#L45) | | | `contents` | function | SparkEngine | [NetworkTrustStore.cpp:L142](../../SparkEngine/Source/Engine/Networking/NetworkTrustStore.cpp#L142) | | | `contents` | function | SparkInstaller | [InstallState.cpp:L477](../../SparkInstaller/src/InstallState.cpp#L477) | | +| `contents` | function | Tests | [TestEditorSubsystemsReal.cpp:L800](../../Tests/TestEditorSubsystemsReal.cpp#L800) | | | `contents` | function | Tests | [TestEditorWindowManager.cpp:L256](../../Tests/TestEditorWindowManager.cpp#L256) | | | `contents` | function | Tests | [TestEditorWindowManager.cpp:L338](../../Tests/TestEditorWindowManager.cpp#L338) | | | `Contents` | function | Tests | [TestModuleVersion.cpp:L167](../../Tests/TestModuleVersion.cpp#L167) | | @@ -5432,7 +5448,7 @@ | `context` | function | Tests | [TestModuleABI.cpp:L812](../../Tests/TestModuleABI.cpp#L812) | | | `context` | function | Tests | [TestModuleABI.cpp:L908](../../Tests/TestModuleABI.cpp#L908) | | | `context` | function | Tests | [TestOpenWorldModule.cpp:L954](../../Tests/TestOpenWorldModule.cpp#L954) | | -| `context` | function | Tests | [TestPrototypeModuleKitReal.cpp:L494](../../Tests/TestPrototypeModuleKitReal.cpp#L494) | | +| `context` | function | Tests | [TestPrototypeModuleKitReal.cpp:L500](../../Tests/TestPrototypeModuleKitReal.cpp#L500) | | | `context` | function | Tests | [TestSparkGameShowcase.cpp:L343](../../Tests/TestSparkGameShowcase.cpp#L343) | | | `context` | function | Tests | [TestSparkGameShowcase.cpp:L406](../../Tests/TestSparkGameShowcase.cpp#L406) | | | `context` | function | Tests | [TestSparkGameShowcase.cpp:L449](../../Tests/TestSparkGameShowcase.cpp#L449) | | @@ -5445,10 +5461,11 @@ | `ContextEventBus` | function | Tests | [TestEngineWiringReal.cpp:L65](../../Tests/TestEngineWiringReal.cpp#L65) | | | `ContextEventBusScope` | function | Tests | [TestENG200ScriptBindingsReal.cpp:L98](../../Tests/TestENG200ScriptBindingsReal.cpp#L98) | | | `ContextJoltSystem` | function | SparkEngine | [PhysicsBody.h:L171](../../SparkEngine/Source/Physics/PhysicsBody.h#L171) | | -| `ContextProgramCounter` | function | SparkEngine | [CrashHandler.cpp:L1888](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1888) | | +| `ContextProgramCounter` | function | SparkEngine | [CrashHandler.cpp:L1889](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1889) | | | `ContinentFile` | function | GameModules | [TFSavePaths.h:L283](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFSavePaths.h#L283) | | | `continuation` | function | GameModules | [TFChatRules.h:L37](../../GameModules/SparkGameMMOFPS/Source/Net/TFChatRules.h#L37) | | | `Continue` | function | SparkEditor | [ScriptDebugPanel.h:L91](../../SparkEditor/Source/Panels/ScriptDebugPanel.h#L91) | | +| `control` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L278](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L278) | | | `control` | function | Tests | [TestAssetMigration.cpp:L296](../../Tests/TestAssetMigration.cpp#L296) | | | `control` | function | Tests | [TestGatewayAreaControl.cpp:L875](../../Tests/TestGatewayAreaControl.cpp#L875) | | | `control` | function | Tests | [TestGatewayAreaControl.cpp:L888](../../Tests/TestGatewayAreaControl.cpp#L888) | | @@ -5505,12 +5522,12 @@ | `ConvertVertexFormat` | function | SparkEngine | [D3D12Device.h:L224](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L224) | | | `ConvertVertexFormat` | function | SparkEngine | [MetalDevice.h:L525](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L525) | | | `ConvertVertexFormat` | function | SparkEngine | [VulkanDevice.h:L528](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L528) | | -| `Cook` | function | Tests | [TestEditorCookPackageReal.cpp:L372](../../Tests/TestEditorCookPackageReal.cpp#L372) | | +| `Cook` | function | Tests | [TestEditorCookPackageReal.cpp:L383](../../Tests/TestEditorCookPackageReal.cpp#L383) | | | `Cook` | function | Tests | [TestEditorUntrustedProject.cpp:L91](../../Tests/TestEditorUntrustedProject.cpp#L91) | | | `CookAssets` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L1309](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L1309) | | | `cookColor` | function | SparkEditor | [DedicatedServerPanel.cpp:L486](../../SparkEditor/Source/Panels/DedicatedServerPanel.cpp#L486) | | | `CookFile` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L1294](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L1294) | | -| `CookPackageScenario` | function | Tests | [TestEditorCookPackageReal.cpp:L132](../../Tests/TestEditorCookPackageReal.cpp#L132) | | +| `CookPackageScenario` | function | Tests | [TestEditorCookPackageReal.cpp:L134](../../Tests/TestEditorCookPackageReal.cpp#L134) | | | `CookWorkerThread` | function | SparkEditor | [BuildPipeline.h:L163](../../SparkEditor/Source/Panels/BuildPipeline.h#L163) | | | `Cooldown` | function | SparkEngine | [Cooldown.h:L49](../../SparkEngine/Source/Utils/Cooldown.h#L49) | Construct a cooldown with a given duration. | | `coordinator` | function | Tests | [TestGatewayAreaControl.cpp:L894](../../Tests/TestGatewayAreaControl.cpp#L894) | | @@ -5521,7 +5538,7 @@ | `copy` | function | Tests | [Test_persistence_SaveSystem.cpp:L391](../../Tests/harden/Test_persistence_SaveSystem.cpp#L391) | | | `CopyCompatibleFixture` | function | Tests | [TestModuleDiscovery.cpp:L103](../../Tests/TestModuleDiscovery.cpp#L103) | | | `CopyCompatibleFixtureToTemp` | function | Tests | [TestModuleABI.cpp:L156](../../Tests/TestModuleABI.cpp#L156) | | -| `CopyCrashModuleName` | function | SparkEngine | [CrashHandler.cpp:L1831](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1831) | | +| `CopyCrashModuleName` | function | SparkEngine | [CrashHandler.cpp:L1832](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1832) | | | `CopyDirectoryContents` | function | SparkEditor | [BuildPipeline.cpp:L382](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L382) | | | `CopyExceptionContext` | function | SparkEngine | [MiniDumpWithoutStacks.cpp:L136](../../SparkEngine/Source/Utils/MiniDumpWithoutStacks.cpp#L136) | | | `CopyExceptionInformation` | function | SparkEngine | [MiniDumpWithoutStacks.cpp:L179](../../SparkEngine/Source/Utils/MiniDumpWithoutStacks.cpp#L179) | | @@ -5549,7 +5566,7 @@ | `CopyTexture` | function | SparkEngine | [VulkanDevice.h:L363](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L363) | | | `CopyToBuf` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L149](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L149) | Copy a std::string into a fixed char buffer with truncation. | | `CopyWhole` | function | SparkLauncher | [LauncherApp.cpp:L47](../../SparkLauncher/src/LauncherApp.cpp#L47) | | -| `core` | function | SparkEngine | [CrashHandler.cpp:L2358](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2358) | | +| `core` | function | SparkEngine | [CrashHandler.cpp:L2396](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2396) | | | `corner` | function | GameModules | [TFHUDDraw.cpp:L294](../../GameModules/SparkGameMMOFPS/Source/UI/TFHUDDraw.cpp#L294) | | | `Coroutine` | function | SparkEngine | [CoroutineTypes.h:L335](../../SparkEngine/Source/Engine/Coroutine/CoroutineTypes.h#L335) | A single coroutine: a named sequence of action steps separated by yields. | | `Coroutine` | function | Tests | [TestCoroutineScheduler.cpp:L68](../../Tests/TestCoroutineScheduler.cpp#L68) | | @@ -5618,10 +5635,10 @@ | `CountLiveObjects` | function | Tests | [TestRHI210D3D11ValidationReal.cpp:L51](../../Tests/TestRHI210D3D11ValidationReal.cpp#L51) | | | `CountMissingRestorePrepare` | function | Tests | [Test_persistence_SaveSystem.cpp:L501](../../Tests/harden/Test_persistence_SaveSystem.cpp#L501) | | | `CountNamed` | function | Tests | [TestMOD330ARPGWorldActors.cpp:L138](../../Tests/TestMOD330ARPGWorldActors.cpp#L138) | | -| `CountOccurrences` | function | Tests | [TestEditorCookPackageReal.cpp:L114](../../Tests/TestEditorCookPackageReal.cpp#L114) | | -| `CountOccurrences` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L133](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L133) | | +| `CountOccurrences` | function | Tests | [TestEditorCookPackageReal.cpp:L116](../../Tests/TestEditorCookPackageReal.cpp#L116) | | +| `CountOccurrences` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L134](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L134) | | | `CountOutput` | function | Tests | [VisualScriptGameplayHarness.h:L204](../../Tests/VisualScriptGameplayHarness.h#L204) | | -| `CountPendingCrashManifests` | function | SparkEngine | [CrashHandler.cpp:L565](../../SparkEngine/Source/Utils/CrashHandler.cpp#L565) | | +| `CountPendingCrashManifests` | function | SparkEngine | [CrashHandler.cpp:L566](../../SparkEngine/Source/Utils/CrashHandler.cpp#L566) | | | `CountPixels` | function | Tests | [TestRHI230VulkanValidationReal.cpp:L677](../../Tests/TestRHI230VulkanValidationReal.cpp#L677) | | | `CountProcessHandles` | function | Tests | [LifecycleLoopGuards.h:L55](../../Tests/LifecycleLoopGuards.h#L55) | | | `CountProcessThreads` | function | Tests | [LifecycleLoopGuards.h:L80](../../Tests/LifecycleLoopGuards.h#L80) | | @@ -5632,7 +5649,7 @@ | `CountStagedModuleImages` | function | Tests | [TestModuleABI.cpp:L279](../../Tests/TestModuleABI.cpp#L279) | | | `CountStateSwitches` | function | SparkEngine | [DrawSortKey.h:L299](../../SparkEngine/Source/Graphics/DrawSortKey.h#L299) | Count the number of unique shader+material combinations in a sorted list. | | `CountTag` | function | Tests | [TestReliableOrderedSequenceReal.cpp:L194](../../Tests/TestReliableOrderedSequenceReal.cpp#L194) | | -| `CountTerrainEntities` | function | Tests | [TestEditorSubsystemsReal.cpp:L321](../../Tests/TestEditorSubsystemsReal.cpp#L321) | | +| `CountTerrainEntities` | function | Tests | [TestEditorSubsystemsReal.cpp:L344](../../Tests/TestEditorSubsystemsReal.cpp#L344) | | | `CountTrace` | function | Tests | [TestENG200ScriptFaultsReal.cpp:L28](../../Tests/TestENG200ScriptFaultsReal.cpp#L28) | | | `CountTransientCandidatePrepare` | function | Tests | [Test_persistence_SaveSystem.cpp:L533](../../Tests/harden/Test_persistence_SaveSystem.cpp#L533) | | | `CountValidationMessage` | function | Tests | [VulkanTestSupport.h:L39](../../Tests/VulkanTestSupport.h#L39) | | @@ -5662,8 +5679,8 @@ | `CrashDumpType` | function | SparkEditor | [EditorCrashHandler.h:L109](../../SparkEditor/Source/Core/EditorCrashHandler.h#L109) | | | `crashedSource` | function | Tests | [TestTF120Migration.cpp:L287](../../Tests/TestTF120Migration.cpp#L287) | | | `CrashExceptionFilter` | function | Tests | [TestMain.cpp:L195](../../Tests/TestMain.cpp#L195) | | -| `CrashFilter` | function | SparkEngine | [CrashHandler.cpp:L819](../../SparkEngine/Source/Utils/CrashHandler.cpp#L819) | | -| `CrashFilter` | function | SparkEngine | [CrashHandler.cpp:L1052](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1052) | | +| `CrashFilter` | function | SparkEngine | [CrashHandler.cpp:L820](../../SparkEngine/Source/Utils/CrashHandler.cpp#L820) | | +| `CrashFilter` | function | SparkEngine | [CrashHandler.cpp:L1053](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1053) | | | `CrashManifestCountOrFull` | function | SparkEngine | [CrashHandlerSupport.h:L48](../../SparkEngine/Source/Utils/CrashHandlerSupport.h#L48) | | | `CrashManifestReadyName` | function | SparkEngine | [CrashHandlerSupport.h:L219](../../SparkEngine/Source/Utils/CrashHandlerSupport.h#L219) | Build the only filename shape accepted for a ready crash manifest. | | `CrashPolicyTestBinary` | function | Tests | [TestCrashHandlerGatingReal.cpp:L398](../../Tests/TestCrashHandlerGatingReal.cpp#L398) | | @@ -5772,7 +5789,7 @@ | `CreateColorPalette` | function | SparkEditor | [EditorTheme.h:L304](../../SparkEditor/Source/Core/EditorTheme.h#L304) | | | `CreateColorTarget` | function | Tests | [TestPostProcessingPipelineD3D11.cpp:L45](../../Tests/TestPostProcessingPipelineD3D11.cpp#L45) | | | `CreateCombatArena` | function | GameModules | [Game.h:L323](../../GameModules/SparkGameFPS/Source/Game/Game.h#L323) | Create the enhanced combat arena level | -| `CreateCombatBehavior` | function | SparkEngine | [AISystem.cpp:L800](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L800) | | +| `CreateCombatBehavior` | function | SparkEngine | [AISystem.cpp:L801](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L801) | | | `CreateCombatBehavior` | function | SparkEngine | [BehaviorTree.h:L291](../../SparkEngine/Source/Engine/AI/BehaviorTree.h#L291) | | | `CreateCommandPool` | function | SparkEngine | [VulkanDevice.h:L506](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L506) | | | `CreateCommandQueues` | function | SparkEngine | [D3D12Device.h:L210](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L210) | | @@ -5790,7 +5807,7 @@ | `CreateContext` | function | SparkEngine | [InputActionSystem.h:L277](../../SparkEngine/Source/Input/InputActionSystem.h#L277) | Create a named input context | | `CreateConvexHullShape` | function | SparkEngine | [PhysicsSystem.h:L804](../../SparkEngine/Source/Physics/PhysicsSystem.h#L804) | | | `CreateCookArguments` | function | SparkEditor | [BuildPipeline.h:L103](../../SparkEditor/Source/Panels/BuildPipeline.h#L103) | Construct SparkCooker's deterministic argument vector. | -| `CreateCorePanels` | function | SparkEditor | [EditorUI.h:L508](../../SparkEditor/Source/Core/EditorUI.h#L508) | | +| `CreateCorePanels` | function | SparkEditor | [EditorUI.h:L506](../../SparkEditor/Source/Core/EditorUI.h#L506) | | | `CreateCube` | function | SparkEngine | [Primitives.h:L54](../../SparkEngine/Source/Game/Primitives.h#L54) | | | `CreateCube` | function | SparkEngine | [Mesh.h:L82](../../SparkEngine/Source/Graphics/Mesh.h#L82) | Generate a procedural cube mesh | | `CreateCylinderMesh` | function | SparkEngine | [WorldBasicRenderer.cpp:L139](../../SparkEngine/Source/Graphics/WorldBasicRenderer.cpp#L139) | | @@ -5848,14 +5865,14 @@ | `CreateEntity` | function | Tests | [TestECSIntegration.cpp:L99](../../Tests/TestECSIntegration.cpp#L99) | | | `CreateEntity` | function | Tests | [TestECSystemOrdering.cpp:L38](../../Tests/TestECSystemOrdering.cpp#L38) | | | `CreateEntity` | function | Tests | [TestECSystemSpecialized.cpp:L148](../../Tests/TestECSystemSpecialized.cpp#L148) | | -| `CreateExclusiveOutputFile` | function | SparkEngine | [CrashHandler.cpp:L375](../../SparkEngine/Source/Utils/CrashHandler.cpp#L375) | | +| `CreateExclusiveOutputFile` | function | SparkEngine | [CrashHandler.cpp:L376](../../SparkEngine/Source/Utils/CrashHandler.cpp#L376) | | | `CreateExplosion` | function | SparkEngine | [SoundEffect.h:L266](../../SparkEngine/Source/Audio/SoundEffect.h#L266) | Create an explosion sound effect | | `CreateFakeCheckout` | function | SparkInstaller | [InstallerTransactionTests.cpp:L407](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L407) | | | `CreateFakeGit` | function | SparkInstaller | [InstallerTransactionTests.cpp:L380](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L380) | | | `CreateFigure8Track` | function | GameModules | [RacingTrackSystem.h:L226](../../GameModules/SparkGameRacing/Source/Track/RacingTrackSystem.h#L226) | | | `CreateFixedConstraint` | function | SparkEngine | [PhysicsSystem.h:L250](../../SparkEngine/Source/Physics/PhysicsSystem.h#L250) | | | `CreateFixture` | function | Tests | [TestPostProcessingPipelineD3D11.cpp:L27](../../Tests/TestPostProcessingPipelineD3D11.cpp#L27) | | -| `CreateFleeBehavior` | function | SparkEngine | [AISystem.cpp:L917](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L917) | | +| `CreateFleeBehavior` | function | SparkEngine | [AISystem.cpp:L918](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L918) | | | `CreateFleeBehavior` | function | SparkEngine | [BehaviorTree.h:L314](../../SparkEngine/Source/Engine/AI/BehaviorTree.h#L314) | Create a flee behavior tree for injured or non-combatant agents. | | `CreateFootstep` | function | SparkEngine | [SoundEffect.h:L275](../../SparkEngine/Source/Audio/SoundEffect.h#L275) | Create a footstep sound effect | | `CreateFormation` | function | SparkEngine | [FormationSystem.h:L148](../../SparkEngine/Source/Engine/AI/FormationSystem.h#L148) | Create a new formation. | @@ -5902,7 +5919,7 @@ | `CreateGroup` | function | SparkEngine | [GroupAI.h:L160](../../SparkEngine/Source/Engine/AI/GroupAI.h#L160) | Create a new AI group with a leader. | | `CreateGroup` | function | Tests | [TestGroupAI.cpp:L52](../../Tests/TestGroupAI.cpp#L52) | | | `CreateGroupFilterTable` | function | SparkEngine | [PhysicsSystem.h:L565](../../SparkEngine/Source/Physics/PhysicsSystem.h#L565) | Create a GroupFilterTable for sub-group-based collision filtering. | -| `CreateGuardBehavior` | function | SparkEngine | [AISystem.cpp:L865](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L865) | | +| `CreateGuardBehavior` | function | SparkEngine | [AISystem.cpp:L866](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L866) | | | `CreateGuardBehavior` | function | SparkEngine | [BehaviorTree.h:L303](../../SparkEngine/Source/Engine/AI/BehaviorTree.h#L303) | | | `CreateGuild` | function | GameModules | [MMOGuildSystem.h:L77](../../GameModules/SparkGameMMO/Source/Guild/MMOGuildSystem.h#L77) | | | `CreateGunshot` | function | SparkEngine | [SoundEffect.h:L256](../../SparkEngine/Source/Audio/SoundEffect.h#L256) | Create a gunshot sound effect | @@ -5974,7 +5991,7 @@ | `CreateMetalView` | function | SparkEngine | [SparkEngineMacOS.h:L39](../../SparkEngine/Source/Core/SparkEngineMacOS.h#L39) | Create an NSView-wrapped Metal view for an SDL_Window. | | `CreateModule` | function | GameModules | [SparkGame.h:L65](../../GameModules/SparkGame/Source/Core/SparkGame.h#L65) | | | `CreateModule` | function | GameModules | [SparkGameARPG.h:L98](../../GameModules/SparkGameARPG/Source/Core/SparkGameARPG.h#L98) | | -| `CreateModule` | function | GameModules | [Main.cpp:L1378](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1378) | | +| `CreateModule` | function | GameModules | [Main.cpp:L1381](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1381) | | | `CreateModule` | function | GameModules | [SparkGameFPS.h:L125](../../GameModules/SparkGameFPS/Source/Core/SparkGameFPS.h#L125) | | | `CreateModule` | function | GameModules | [SparkGameMMO.h:L125](../../GameModules/SparkGameMMO/Source/Core/SparkGameMMO.h#L125) | | | `CreateModule` | function | GameModules | [SparkGameOpenWorld.h:L87](../../GameModules/SparkGameOpenWorld/Source/Core/SparkGameOpenWorld.h#L87) | | @@ -6002,12 +6019,12 @@ | `CreateOwnedStagingDirectory` | function | SparkEditor | [ProjectManager.cpp:L572](../../SparkEditor/Source/Core/ProjectManager.cpp#L572) | | | `CreatePanel` | function | SparkEngine | [UISystem.h:L326](../../SparkEngine/Source/Engine/UI/UISystem.h#L326) | | | `CreatePanel` | function | SparkEngine | [UISystem.h:L377](../../SparkEngine/Source/Engine/UI/UISystem.h#L377) | Create a top-level panel. | -| `CreatePanels` | function | SparkEditor | [EditorUI.h:L507](../../SparkEditor/Source/Core/EditorUI.h#L507) | | +| `CreatePanels` | function | SparkEditor | [EditorUI.h:L505](../../SparkEditor/Source/Core/EditorUI.h#L505) | | | `CreateParallel` | function | SparkEngine | [TweenSystem.h:L190](../../SparkEngine/Source/Engine/Tween/TweenSystem.h#L190) | | | `CreateParty` | function | GameModules | [MMOPartySystem.h:L76](../../GameModules/SparkGameMMO/Source/Party/MMOPartySystem.h#L76) | | | `CreatePassResources` | function | SparkEngine | [FoliageRenderer.h:L477](../../SparkEngine/Source/Graphics/FoliageRenderer.h#L477) | | | `CreatePathConstraint` | function | SparkEngine | [PhysicsSystem.h:L311](../../SparkEngine/Source/Physics/PhysicsSystem.h#L311) | Create a path constraint — body follows a spline path. | -| `CreatePatrolBehavior` | function | SparkEngine | [AISystem.cpp:L744](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L744) | | +| `CreatePatrolBehavior` | function | SparkEngine | [AISystem.cpp:L745](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L745) | | | `CreatePatrolBehavior` | function | SparkEngine | [BehaviorTree.h:L279](../../SparkEngine/Source/Engine/AI/BehaviorTree.h#L279) | Create a patrol behavior tree that walks between waypoints. | | `CreatePawnEntity` | function | GameModules | [TFPlayerSystem.h:L113](../../GameModules/SparkGameMMOFPS/Source/Game/TFPlayerSystem.h#L113) | | | `CreatePayload` | function | SparkDaemon | [ServiceTests.cpp:L109](../../SparkDaemon/tests/ServiceTests.cpp#L109) | | @@ -6166,8 +6183,8 @@ | `CreateTemporalTargets` | function | SparkEngine | [RenderTarget.h:L285](../../SparkEngine/Source/Graphics/RenderTarget.h#L285) | | | `CreateTemporalUpscalingShader` | function | SparkEngine | [UpscalingSystemWindows.cpp:L240](../../SparkEngine/Source/Graphics/UpscalingSystemWindows.cpp#L240) | Compile and create the temporal upscaling compute shader | | `CreateTempShaderDir` | function | Tests | [TestShaderHotReload.cpp:L11](../../Tests/TestShaderHotReload.cpp#L11) | | -| `CreateTestDevice` | function | Tests | [TestAssetParserHardening.cpp:L67](../../Tests/TestAssetParserHardening.cpp#L67) | | -| `CreateTestObjects` | function | GameModules | [Game.h:L657](../../GameModules/SparkGameFPS/Source/Game/Game.h#L657) | Create initial test objects for the scene | +| `CreateTestDevice` | function | Tests | [TestAssetParserHardening.cpp:L83](../../Tests/TestAssetParserHardening.cpp#L83) | | +| `CreateTestObjects` | function | GameModules | [Game.h:L681](../../GameModules/SparkGameFPS/Source/Game/Game.h#L681) | Create initial test objects for the scene | | `CreateTestScene` | function | GameModules | [Game.h:L563](../../GameModules/SparkGameFPS/Source/Game/Game.h#L563) | Create a test scene with predefined objects | | `CreateTexture` | function | SparkEngine | [D3D11Device.h:L325](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L325) | | | `CreateTexture` | function | SparkEngine | [D3D12Device.h:L104](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L104) | | @@ -6183,7 +6200,7 @@ | `CreateTexture2D` | function | SparkEngine | [RHIAdapter.h:L298](../../SparkEngine/Source/Graphics/RHI/RHIAdapter.h#L298) | Create a 2D texture. | | `CreateTexture2D` | function | SparkEngine | [RHIBridge.h:L180](../../SparkEngine/Source/Graphics/RHI/RHIBridge.h#L180) | Create a 2D texture with optional initial data | | `CreateTonemapPass` | function | SparkEngine | [GraphicsEngineRHI.h:L215](../../SparkEngine/Source/Graphics/GraphicsEngineRHI.h#L215) | | -| `CreateToolAndContentPanels` | function | SparkEditor | [EditorUI.h:L510](../../SparkEditor/Source/Core/EditorUI.h#L510) | | +| `CreateToolAndContentPanels` | function | SparkEditor | [EditorUI.h:L508](../../SparkEditor/Source/Core/EditorUI.h#L508) | | | `CreateTriangle` | function | SparkEngine | [Mesh.h:L92](../../SparkEngine/Source/Graphics/Mesh.h#L92) | Generate a simple triangle mesh | | `CreateTrigger` | function | Tests | [TestProximityTriggerSystem.cpp:L49](../../Tests/TestProximityTriggerSystem.cpp#L49) | | | `CreateUniqueSiblingPath` | function | SparkEditor | [BuildPipeline.cpp:L208](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L208) | | @@ -6607,7 +6624,7 @@ | `data` | function | Tests | [TestRHI240OpenGLReal.cpp:L505](../../Tests/TestRHI240OpenGLReal.cpp#L505) | | | `data` | function | Tests | [TestRHI240OpenGLReal.cpp:L567](../../Tests/TestRHI240OpenGLReal.cpp#L567) | | | `data` | function | Tests | [TestSecDaemonCacheHardening.cpp:L79](../../Tests/TestSecDaemonCacheHardening.cpp#L79) | | -| `data` | function | Tests | [TestSparkPak.cpp:L232](../../Tests/TestSparkPak.cpp#L232) | | +| `data` | function | Tests | [TestSparkPak.cpp:L238](../../Tests/TestSparkPak.cpp#L238) | | | `dataFile` | function | SparkEditor | [LevelStreamingSystem.cpp:L1168](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.cpp#L1168) | | | `datagram` | function | Tests | [FPSLANLoopbackPeer.cpp:L800](../../Tests/Fixtures/FPSLANLoopbackPeer.cpp#L800) | | | `datagram` | function | Tests | [SecureTestPeer.cpp:L413](../../Tests/Fixtures/SecureTestPeer.cpp#L413) | | @@ -6950,7 +6967,7 @@ | `DeduceFieldType` | function | Tests | [TestReflection.cpp:L136](../../Tests/TestReflection.cpp#L136) | | | `DefaultFramebufferColorBuffer` | function | SparkEngine | [OpenGLDevice.cpp:L115](../../SparkEngine/Source/Graphics/RHI/OpenGL/OpenGLDevice.cpp#L115) | | | `DefaultLiteral` | function | SparkEngine | [VisualScriptCodegen.cpp:L158](../../SparkEngine/Source/Engine/Scripting/VisualScriptCodegen.cpp#L158) | | -| `DefaultLiteral` | function | SparkEngine | [VisualScriptEmitter.cpp:L330](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L330) | | +| `DefaultLiteral` | function | SparkEngine | [VisualScriptEmitter.cpp:L343](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L343) | | | `DefaultLiteral` | function | SparkEngine | [VisualScriptEmitter.h:L68](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L68) | | | `DefaultMinFreeBytes` | function | SparkInstaller | [InstallerPreflight.cpp:L162](../../SparkInstaller/src/InstallerPreflight.cpp#L162) | | | `DefaultMinFreeBytes` | function | SparkInstaller | [InstallerPreflight.h:L28](../../SparkInstaller/src/InstallerPreflight.h#L28) | | @@ -6958,7 +6975,7 @@ | `DefaultNetworkSecurityDirectory` | function | SparkEngine | [NetworkTrustStore.cpp:L556](../../SparkEngine/Source/Engine/Networking/NetworkTrustStore.cpp#L556) | | | `DefaultNewProjectLocation` | function | SparkLauncher | [LauncherApp.h:L41](../../SparkLauncher/src/LauncherApp.h#L41) | | | `DefaultOrchestratorIdentityPath` | function | SparkDaemon | [OrchestratorIdentity.cpp:L371](../../SparkDaemon/src/OrchestratorIdentity.cpp#L371) | | -| `DefaultSearchBases` | function | GameModules | [FPSAssetPaths.cpp:L54](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L54) | | +| `DefaultSearchBases` | function | GameModules | [FPSAssetPaths.cpp:L62](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L62) | | | `DefaultSearchBases` | function | GameModules | [FPSAssetPaths.h:L41](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L41) | The bases probed by Root(): the host executable directory and | | `DefaultSocketPath` | function | SparkDaemon | [main.cpp:L83](../../SparkDaemon/src/main.cpp#L83) | | | `DefaultTerrainPath` | function | SparkEditor | [TerrainEditor.h:L42](../../SparkEditor/Source/Terrain/TerrainEditor.h#L42) | Project-relative default location for a terrain of the given name. | @@ -6980,7 +6997,7 @@ | `DefineWorldAreas` | function | GameModules | [RPGWorldSetup.h:L74](../../GameModules/SparkGameRPG/Source/World/RPGWorldSetup.h#L74) | | | `DefOf` | function | GameModules | [TFVehicleSystem.h:L155](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L155) | | | `DefWindowProcW` | function | SparkEditor | [EditorApplicationWindows.cpp:L474](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp#L474) | | -| `DefWindowProcW` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L479](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L479) | | +| `DefWindowProcW` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L508](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L508) | | | `DefWindowProcW` | function | SparkInstaller | [BackendWindows.cpp:L72](../../SparkInstaller/src/gui/BackendWindows.cpp#L72) | | | `DefWindowProcW` | function | SparkLauncher | [LauncherBackendWindows.cpp:L79](../../SparkLauncher/src/LauncherBackendWindows.cpp#L79) | | | `DegreesToRadians` | function | SparkEngine | [MathUtils.h:L140](../../SparkEngine/Source/Utils/MathUtils.h#L140) | | @@ -7095,7 +7112,7 @@ | `DeriveScramKeysFromSaltedPassword` | function | GameModules | [TFCrypto.h:L72](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.h#L72) | | | `Desaturate` | function | SparkEditor | [EditorTheme.h:L69](../../SparkEditor/Source/Core/EditorTheme.h#L69) | Create a desaturated version of this color | | `DescendantSpawnerMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L330](../../SparkBuild/tests/ProcessRunnerTests.cpp#L330) | | -| `DescendantSpawnerMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L735](../../SparkBuild/tests/ProcessRunnerTests.cpp#L735) | | +| `DescendantSpawnerMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L726](../../SparkBuild/tests/ProcessRunnerTests.cpp#L726) | | | `DescendToNextFloor` | function | GameModules | [ARPGDungeonSystem.h:L70](../../GameModules/SparkGameARPG/Source/Dungeon/ARPGDungeonSystem.h#L70) | | | `DescribeDependencyGraphError` | function | SparkEngine | [ModuleManager.cpp:L248](../../SparkEngine/Source/Core/ModuleManager.cpp#L248) | | | `DescribeEntity` | function | SparkEngine | [ReflectedSceneValidation.cpp:L113](../../SparkEngine/Source/SceneManager/ReflectedSceneValidation.cpp#L113) | | @@ -7151,16 +7168,16 @@ | `DespawnBot` | function | GameModules | [TFBotSystem.h:L206](../../GameModules/SparkGameMMOFPS/Source/Game/TFBotSystem.h#L206) | | | `destination` | function | GameModules | [TFDatabaseResidency.cpp:L269](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFDatabaseResidency.cpp#L269) | | | `destination` | function | SparkEditor | [JSONSceneSerializer.cpp:L471](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L471) | | -| `destination` | function | SparkEngine | [SceneManager.cpp:L945](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L945) | | +| `destination` | function | SparkEngine | [SceneManager.cpp:L1045](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1045) | | | `destination` | function | Tests | [TestTF120Migration.cpp:L166](../../Tests/TestTF120Migration.cpp#L166) | | | `destination` | function | Tests | [TestTF120Migration.cpp:L210](../../Tests/TestTF120Migration.cpp#L210) | | | `destination` | function | Tests | [TestTF120Migration.cpp:L248](../../Tests/TestTF120Migration.cpp#L248) | | | `destination` | function | Tests | [TestTF120Migration.cpp:L308](../../Tests/TestTF120Migration.cpp#L308) | | | `destination` | function | Tests | [TestTF120Migration.cpp:L367](../../Tests/TestTF120Migration.cpp#L367) | | -| `destination` | function | Tests | [TestTF120Travel.cpp:L431](../../Tests/TestTF120Travel.cpp#L431) | | -| `destination` | function | Tests | [TestTF120Travel.cpp:L552](../../Tests/TestTF120Travel.cpp#L552) | | -| `DestinationAuthority` | function | Tests | [TestTF120Travel.cpp:L246](../../Tests/TestTF120Travel.cpp#L246) | | -| `destinationAuthority` | function | Tests | [TestTF120Travel.cpp:L550](../../Tests/TestTF120Travel.cpp#L550) | | +| `destination` | function | Tests | [TestTF120Travel.cpp:L418](../../Tests/TestTF120Travel.cpp#L418) | | +| `destination` | function | Tests | [TestTF120Travel.cpp:L539](../../Tests/TestTF120Travel.cpp#L539) | | +| `DestinationAuthority` | function | Tests | [TestTF120Travel.cpp:L233](../../Tests/TestTF120Travel.cpp#L233) | | +| `destinationAuthority` | function | Tests | [TestTF120Travel.cpp:L537](../../Tests/TestTF120Travel.cpp#L537) | | | `DestinationForPass` | function | SparkEngine | [PostProcessingTypes.h:L72](../../SparkEngine/Source/Graphics/PostProcessingTypes.h#L72) | | | `DestinationLock` | function | SparkInstaller | [Installer.cpp:L54](../../SparkInstaller/src/Installer.cpp#L54) | | | `Destroy` | function | SparkEngine | [RenderTarget.h:L128](../../SparkEngine/Source/Graphics/RenderTarget.h#L128) | Destroy DirectX resources | @@ -7194,7 +7211,7 @@ | `DestroyMetalView` | function | SparkEngine | [SparkEngineMacOS.h:L44](../../SparkEngine/Source/Core/SparkEngineMacOS.h#L44) | Destroy a view previously returned by CreateMetalView(). No-op on non-macOS. | | `DestroyModule` | function | GameModules | [SparkGame.h:L66](../../GameModules/SparkGame/Source/Core/SparkGame.h#L66) | | | `DestroyModule` | function | GameModules | [SparkGameARPG.h:L99](../../GameModules/SparkGameARPG/Source/Core/SparkGameARPG.h#L99) | | -| `DestroyModule` | function | GameModules | [Main.cpp:L1383](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1383) | | +| `DestroyModule` | function | GameModules | [Main.cpp:L1386](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1386) | | | `DestroyModule` | function | GameModules | [SparkGameFPS.h:L126](../../GameModules/SparkGameFPS/Source/Core/SparkGameFPS.h#L126) | | | `DestroyModule` | function | GameModules | [SparkGameMMO.h:L126](../../GameModules/SparkGameMMO/Source/Core/SparkGameMMO.h#L126) | | | `DestroyModule` | function | GameModules | [SparkGameOpenWorld.h:L88](../../GameModules/SparkGameOpenWorld/Source/Core/SparkGameOpenWorld.h#L88) | | @@ -7420,8 +7437,8 @@ | `Dim` | function | SparkBuild | [Terminal.h:L16](../../SparkBuild/src/Terminal.h#L16) | | | `Dim` | function | SparkInstaller | [WizardTui.cpp:L30](../../SparkInstaller/src/tui/WizardTui.cpp#L30) | | | `dir` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L329](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L329) | | -| `dir` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L445](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L445) | | -| `dir` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L521](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L521) | | +| `dir` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L447](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L447) | | +| `dir` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L523](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L523) | | | `dir` | function | Tests | [TestModuleDiscovery.cpp:L168](../../Tests/TestModuleDiscovery.cpp#L168) | | | `dir` | function | Tests | [TestModuleDiscovery.cpp:L200](../../Tests/TestModuleDiscovery.cpp#L200) | | | `dir` | function | Tests | [TestModuleDiscovery.cpp:L242](../../Tests/TestModuleDiscovery.cpp#L242) | | @@ -7448,15 +7465,17 @@ | `Direction` | function | SparkEngine | [MathUtils.h:L301](../../SparkEngine/Source/Utils/MathUtils.h#L301) | | | `DirectionalEffectiveDistance` | function | SparkEngine | [SeamlessAreaManager.h:L191](../../SparkEngine/Source/Engine/Streaming/SeamlessAreaManager.h#L191) | Compute a distance biased by alignment with the player's movement direction. | | `DirectiveIndexOfId` | function | GameModules | [TFDirectivePanel.cpp:L45](../../GameModules/SparkGameMMOFPS/Source/UI/TFDirectivePanel.cpp#L45) | | -| `directory` | function | GameModules | [GameConsoleOps.cpp:L606](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L606) | | +| `directory` | function | GameModules | [GameConsoleOps.cpp:L614](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L614) | | | `directory` | function | SparkBuild | [PathSecurity.cpp:L137](../../SparkBuild/src/PathSecurity.cpp#L137) | | | `directory` | function | SparkCrashReporter | [CrashAutoIssues.cpp:L215](../../SparkCrashReporter/src/CrashAutoIssues.cpp#L215) | | | `directory` | function | SparkEngine | [ModSystem.cpp:L199](../../SparkEngine/Source/Engine/Modding/ModSystem.cpp#L199) | | | `Directory` | function | Tests | [TestEditorStateCompatibility.cpp:L128](../../Tests/TestEditorStateCompatibility.cpp#L128) | | +| `directory` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L80](../../Tests/TestFPSOwnedSaveDecode.cpp#L80) | | | `Directory` | function | Tests | [TestMOD380RacingCompleteRaceReal.cpp:L518](../../Tests/TestMOD380RacingCompleteRaceReal.cpp#L518) | | | `DirectoryNames` | function | SparkBuild | [DownloaderTests.cpp:L266](../../SparkBuild/tests/DownloaderTests.cpp#L266) | | | `DirectoryNames` | function | SparkBuild | [DownloaderTests.cpp:L507](../../SparkBuild/tests/DownloaderTests.cpp#L507) | | | `DirectoryNames` | function | SparkBuild | [DownloaderTests.cpp:L737](../../SparkBuild/tests/DownloaderTests.cpp#L737) | | +| `directoryText` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L76](../../Tests/TestFPSOwnedSaveDecode.cpp#L76) | | | `DirectStorageLoader::Cancel` | method | SparkEngine | [DirectStorageLoader.cpp:L161](../../SparkEngine/Source/Engine/Streaming/DirectStorageLoader.cpp#L161) | | | `DirectStorageLoader::Console_GetStatus` | method | SparkEngine | [DirectStorageLoader.cpp:L394](../../SparkEngine/Source/Engine/Streaming/DirectStorageLoader.cpp#L394) | | | `DirectStorageLoader::ExecuteLoad` | method | SparkEngine | [DirectStorageLoader.cpp:L309](../../SparkEngine/Source/Engine/Streaming/DirectStorageLoader.cpp#L309) | | @@ -7883,7 +7902,7 @@ | `DrawPerceptionCone` | function | SparkEngine | [AIDebugRenderer.h:L133](../../SparkEngine/Source/Engine/AI/AIDebugRenderer.h#L133) | Render a perception cone for an AI agent | | `DrawPhysicsHeatmap` | function | SparkEngine | [DebugDraw.h:L374](../../SparkEngine/Source/Utils/DebugDraw.h#L374) | | | `DrawProjectSelectorPanel` | function | SparkEngine | [SparkEngineWindowsInternal.h:L83](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L83) | ImGui panel listing discovered game modules (bare-launch flow). | -| `DrawProjectSelectorPanel` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L153](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L153) | ImGui panel listing discovered game modules (bare-launch flow). | +| `DrawProjectSelectorPanel` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L154](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L154) | ImGui panel listing discovered game modules (bare-launch flow). | | `DrawProjectsTab` | function | SparkLauncher | [LauncherApp.h:L38](../../SparkLauncher/src/LauncherApp.h#L38) | | | `DrawRay` | function | SparkEngine | [DebugDraw.h:L150](../../SparkEngine/Source/Utils/DebugDraw.h#L150) | Draw a ray from origin along direction for given length | | `DrawRecentTab` | function | GameModules | [TFSocialPanel.h:L50](../../GameModules/SparkGameMMOFPS/Source/UI/TFSocialPanel.h#L50) | | @@ -8041,7 +8060,7 @@ | `EditorApplication::InitializeImGui` | method | SparkEditor | [EditorApplicationLinux.cpp:L94](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L94) | | | `EditorApplication::InitializeImGui` | method | SparkEditor | [EditorApplicationWindows.cpp:L155](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp#L155) | | | `EditorApplication::OnShutdownRequested` | method | SparkEditor | [EditorApplication.cpp:L285](../../SparkEditor/Source/Core/EditorApplication.cpp#L285) | | -| `EditorApplication::OnWindowResize` | method | SparkEditor | [EditorApplicationLinux.cpp:L264](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L264) | | +| `EditorApplication::OnWindowResize` | method | SparkEditor | [EditorApplicationLinux.cpp:L265](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L265) | | | `EditorApplication::OnWindowResize` | method | SparkEditor | [EditorApplicationWindows.cpp:L324](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp#L324) | | | `EditorApplication::ProcessMessages` | method | SparkEditor | [EditorApplicationLinux.cpp:L204](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L204) | | | `EditorApplication::ProcessMessages` | method | SparkEditor | [EditorApplicationWindows.cpp:L267](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp#L267) | | @@ -8051,9 +8070,9 @@ | `EditorApplication::Run` | method | SparkEditor | [EditorApplicationLinux.cpp:L143](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L143) | | | `EditorApplication::Run` | method | SparkEditor | [EditorApplicationWindows.cpp:L203](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp#L203) | | | `EditorApplication::SaveProjectForShutdown` | method | SparkEditor | [EditorApplication.cpp:L303](../../SparkEditor/Source/Core/EditorApplication.cpp#L303) | | -| `EditorApplication::SetWindowTitle` | method | SparkEditor | [EditorApplicationLinux.cpp:L274](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L274) | | +| `EditorApplication::SetWindowTitle` | method | SparkEditor | [EditorApplicationLinux.cpp:L275](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L275) | | | `EditorApplication::SetWindowTitle` | method | SparkEditor | [EditorApplicationWindows.cpp:L349](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp#L349) | | -| `EditorApplication::Shutdown` | method | SparkEditor | [EditorApplicationLinux.cpp:L282](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L282) | | +| `EditorApplication::Shutdown` | method | SparkEditor | [EditorApplicationLinux.cpp:L283](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L283) | | | `EditorApplication::Shutdown` | method | SparkEditor | [EditorApplicationWindows.cpp:L358](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp#L358) | | | `EditorApplication::Update` | method | SparkEditor | [EditorApplication.cpp:L220](../../SparkEditor/Source/Core/EditorApplication.cpp#L220) | | | `EditorApplication::UpdatePerformanceMetrics` | method | SparkEditor | [EditorApplication.cpp:L249](../../SparkEditor/Source/Core/EditorApplication.cpp#L249) | | @@ -8143,9 +8162,9 @@ | `EditorNotificationManager::Show` | method | SparkEditor | [EditorNotificationManager.cpp:L18](../../SparkEditor/Source/Core/EditorNotificationManager.cpp#L18) | | | `EditorNotificationManager::Update` | method | SparkEditor | [EditorNotificationManager.cpp:L30](../../SparkEditor/Source/Core/EditorNotificationManager.cpp#L30) | | | `EditorPanel::BeginPanel` | method | SparkEditor | [EditorPanel.cpp:L22](../../SparkEditor/Source/Core/EditorPanel.cpp#L22) | | -| `EditorPanel::EndPanel` | method | SparkEditor | [EditorPanel.cpp:L73](../../SparkEditor/Source/Core/EditorPanel.cpp#L73) | | +| `EditorPanel::EndPanel` | method | SparkEditor | [EditorPanel.cpp:L74](../../SparkEditor/Source/Core/EditorPanel.cpp#L74) | | | `EditorPanel::HandleEvent` | method | SparkEditor | [ConsolePanel.cpp:L235](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L235) | | -| `EditorPanel::NotifyStateChange` | method | SparkEditor | [EditorPanel.cpp:L78](../../SparkEditor/Source/Core/EditorPanel.cpp#L78) | | +| `EditorPanel::NotifyStateChange` | method | SparkEditor | [EditorPanel.cpp:L79](../../SparkEditor/Source/Core/EditorPanel.cpp#L79) | | | `EditorPluginManager::Console_ListPlugins` | method | SparkEditor | [EditorPluginManager.cpp:L444](../../SparkEditor/Source/Core/EditorPluginManager.cpp#L444) | | | `EditorPluginManager::FindDynamicPlugin` | method | SparkEditor | [EditorPluginManager.cpp:L483](../../SparkEditor/Source/Core/EditorPluginManager.cpp#L483) | | | `EditorPluginManager::FindDynamicPlugin` | method | SparkEditor | [EditorPluginManager.cpp:L490](../../SparkEditor/Source/Core/EditorPluginManager.cpp#L490) | | @@ -8205,46 +8224,46 @@ | `EditorTheme::GetTheme` | method | SparkEditor | [EditorTheme.cpp:L147](../../SparkEditor/Source/Core/EditorTheme.cpp#L147) | | | `EditorTheme::InitializeDefaultThemes` | method | SparkEditor | [EditorTheme.cpp:L416](../../SparkEditor/Source/Core/EditorTheme.cpp#L416) | | | `EditorTheme::RegisterTheme` | method | SparkEditor | [EditorTheme.cpp:L169](../../SparkEditor/Source/Core/EditorTheme.cpp#L169) | | -| `EditorUI::ApplyTheme` | method | SparkEditor | [EditorUI.cpp:L1417](../../SparkEditor/Source/Core/EditorUI.cpp#L1417) | | -| `EditorUI::CaptureRecoveryIfDue` | method | SparkEditor | [EditorUI.cpp:L1632](../../SparkEditor/Source/Core/EditorUI.cpp#L1632) | | -| `EditorUI::ClearMatchingRecoveryAfterSuccessfulSave` | method | SparkEditor | [EditorUI.cpp:L1879](../../SparkEditor/Source/Core/EditorUI.cpp#L1879) | | -| `EditorUI::ClearPendingProjectTransition` | method | SparkEditor | [EditorUI.cpp:L2174](../../SparkEditor/Source/Core/EditorUI.cpp#L2174) | | -| `EditorUI::ClearPendingRecoveryOffer` | method | SparkEditor | [EditorUI.cpp:L1724](../../SparkEditor/Source/Core/EditorUI.cpp#L1724) | | +| `EditorUI::ApplyTheme` | method | SparkEditor | [EditorUI.cpp:L1437](../../SparkEditor/Source/Core/EditorUI.cpp#L1437) | | +| `EditorUI::CaptureRecoveryIfDue` | method | SparkEditor | [EditorUI.cpp:L1652](../../SparkEditor/Source/Core/EditorUI.cpp#L1652) | | +| `EditorUI::ClearMatchingRecoveryAfterSuccessfulSave` | method | SparkEditor | [EditorUI.cpp:L1899](../../SparkEditor/Source/Core/EditorUI.cpp#L1899) | | +| `EditorUI::ClearPendingProjectTransition` | method | SparkEditor | [EditorUI.cpp:L2194](../../SparkEditor/Source/Core/EditorUI.cpp#L2194) | | +| `EditorUI::ClearPendingRecoveryOffer` | method | SparkEditor | [EditorUI.cpp:L1744](../../SparkEditor/Source/Core/EditorUI.cpp#L1744) | | | `EditorUI::CreateCorePanels` | method | SparkEditor | [EditorPanelFactory.cpp:L93](../../SparkEditor/Source/Core/EditorPanelFactory.cpp#L93) | | | `EditorUI::CreatePanels` | method | SparkEditor | [EditorPanelFactory.cpp:L240](../../SparkEditor/Source/Core/EditorPanelFactory.cpp#L240) | | | `EditorUI::CreateToolAndContentPanels` | method | SparkEditor | [EditorPanelFactory.cpp:L142](../../SparkEditor/Source/Core/EditorPanelFactory.cpp#L142) | | -| `EditorUI::DiscardPendingRecovery` | method | SparkEditor | [EditorUI.cpp:L1849](../../SparkEditor/Source/Core/EditorUI.cpp#L1849) | | -| `EditorUI::ExecuteCommand` | method | SparkEditor | [EditorUI.cpp:L1436](../../SparkEditor/Source/Core/EditorUI.cpp#L1436) | | -| `EditorUI::ExecuteDocumentTransition` | method | SparkEditor | [EditorUI.cpp:L2122](../../SparkEditor/Source/Core/EditorUI.cpp#L2122) | | -| `EditorUI::ExportLayout` | method | SparkEditor | [EditorUI.cpp:L2016](../../SparkEditor/Source/Core/EditorUI.cpp#L2016) | | -| `EditorUI::GetCanonicalActiveProjectIdentity` | method | SparkEditor | [EditorUI.cpp:L1517](../../SparkEditor/Source/Core/EditorUI.cpp#L1517) | | -| `EditorUI::GetProjectRelativeCurrentScenePath` | method | SparkEditor | [EditorUI.cpp:L1546](../../SparkEditor/Source/Core/EditorUI.cpp#L1546) | | -| `EditorUI::GetStats` | method | SparkEditor | [EditorUI.cpp:L1490](../../SparkEditor/Source/Core/EditorUI.cpp#L1490) | | -| `EditorUI::HandleKeyboardShortcuts` | method | SparkEditor | [EditorUI.cpp:L2664](../../SparkEditor/Source/Core/EditorUI.cpp#L2664) | | -| `EditorUI::HasRecoveryData` | method | SparkEditor | [EditorUI.cpp:L1512](../../SparkEditor/Source/Core/EditorUI.cpp#L1512) | | -| `EditorUI::ImportLayout` | method | SparkEditor | [EditorUI.cpp:L1978](../../SparkEditor/Source/Core/EditorUI.cpp#L1978) | | +| `EditorUI::DiscardPendingRecovery` | method | SparkEditor | [EditorUI.cpp:L1869](../../SparkEditor/Source/Core/EditorUI.cpp#L1869) | | +| `EditorUI::ExecuteCommand` | method | SparkEditor | [EditorUI.cpp:L1456](../../SparkEditor/Source/Core/EditorUI.cpp#L1456) | | +| `EditorUI::ExecuteDocumentTransition` | method | SparkEditor | [EditorUI.cpp:L2142](../../SparkEditor/Source/Core/EditorUI.cpp#L2142) | | +| `EditorUI::ExportLayout` | method | SparkEditor | [EditorUI.cpp:L2036](../../SparkEditor/Source/Core/EditorUI.cpp#L2036) | | +| `EditorUI::GetCanonicalActiveProjectIdentity` | method | SparkEditor | [EditorUI.cpp:L1537](../../SparkEditor/Source/Core/EditorUI.cpp#L1537) | | +| `EditorUI::GetProjectRelativeCurrentScenePath` | method | SparkEditor | [EditorUI.cpp:L1566](../../SparkEditor/Source/Core/EditorUI.cpp#L1566) | | +| `EditorUI::GetStats` | method | SparkEditor | [EditorUI.cpp:L1510](../../SparkEditor/Source/Core/EditorUI.cpp#L1510) | | +| `EditorUI::HandleKeyboardShortcuts` | method | SparkEditor | [EditorUI.cpp:L2666](../../SparkEditor/Source/Core/EditorUI.cpp#L2666) | | +| `EditorUI::HasRecoveryData` | method | SparkEditor | [EditorUI.cpp:L1532](../../SparkEditor/Source/Core/EditorUI.cpp#L1532) | | +| `EditorUI::ImportLayout` | method | SparkEditor | [EditorUI.cpp:L1998](../../SparkEditor/Source/Core/EditorUI.cpp#L1998) | | | `EditorUI::Initialize` | method | SparkEditor | [EditorUI.cpp:L172](../../SparkEditor/Source/Core/EditorUI.cpp#L172) | | | `EditorUI::InitializeCommandPalette` | method | SparkEditor | [EditorCommandRegistry.cpp:L22](../../SparkEditor/Source/Core/EditorCommandRegistry.cpp#L22) | | | `EditorUI::InitializeManagers` | method | SparkEditor | [EditorUI.cpp:L290](../../SparkEditor/Source/Core/EditorUI.cpp#L290) | | | `EditorUI::InitializePanelCategories` | method | SparkEditor | [EditorPanelFactoryMetadata.cpp:L93](../../SparkEditor/Source/Core/EditorPanelFactoryMetadata.cpp#L93) | | | `EditorUI::InitializePanelIcons` | method | SparkEditor | [EditorPanelFactoryMetadata.cpp:L16](../../SparkEditor/Source/Core/EditorPanelFactoryMetadata.cpp#L16) | | -| `EditorUI::IsPanelVisible` | method | SparkEditor | [EditorUI.cpp:L1290](../../SparkEditor/Source/Core/EditorUI.cpp#L1290) | | -| `EditorUI::LoadLayout` | method | SparkEditor | [EditorUI.cpp:L1362](../../SparkEditor/Source/Core/EditorUI.cpp#L1362) | | -| `EditorUI::NewScene` | method | SparkEditor | [EditorUI.cpp:L2190](../../SparkEditor/Source/Core/EditorUI.cpp#L2190) | | -| `EditorUI::NewSceneNow` | method | SparkEditor | [EditorUI.cpp:L2195](../../SparkEditor/Source/Core/EditorUI.cpp#L2195) | | -| `EditorUI::ObserveDocumentHistoryForRecovery` | method | SparkEditor | [EditorUI.cpp:L1602](../../SparkEditor/Source/Core/EditorUI.cpp#L1602) | | -| `EditorUI::OfferMatchingRecoveryForCurrentProject` | method | SparkEditor | [EditorUI.cpp:L1699](../../SparkEditor/Source/Core/EditorUI.cpp#L1699) | | -| `EditorUI::OpenScene` | method | SparkEditor | [EditorUI.cpp:L2483](../../SparkEditor/Source/Core/EditorUI.cpp#L2483) | | -| `EditorUI::PersistRecoverySnapshotOnUiThread` | method | SparkEditor | [EditorUI.cpp:L1652](../../SparkEditor/Source/Core/EditorUI.cpp#L1652) | | -| `EditorUI::ProcessGlobalHotkeys` | method | SparkEditor | [EditorUI.cpp:L636](../../SparkEditor/Source/Core/EditorUI.cpp#L636) | | -| `EditorUI::ProcessSceneShortcuts` | method | SparkEditor | [EditorUI.cpp:L614](../../SparkEditor/Source/Core/EditorUI.cpp#L614) | | -| `EditorUI::RecordRecoveryOperation` | method | SparkEditor | [EditorUI.cpp:L1576](../../SparkEditor/Source/Core/EditorUI.cpp#L1576) | | -| `EditorUI::RegisterCommand` | method | SparkEditor | [EditorUI.cpp:L1476](../../SparkEditor/Source/Core/EditorUI.cpp#L1476) | | +| `EditorUI::IsPanelVisible` | method | SparkEditor | [EditorUI.cpp:L1310](../../SparkEditor/Source/Core/EditorUI.cpp#L1310) | | +| `EditorUI::LoadLayout` | method | SparkEditor | [EditorUI.cpp:L1382](../../SparkEditor/Source/Core/EditorUI.cpp#L1382) | | +| `EditorUI::NewScene` | method | SparkEditor | [EditorUI.cpp:L2210](../../SparkEditor/Source/Core/EditorUI.cpp#L2210) | | +| `EditorUI::NewSceneNow` | method | SparkEditor | [EditorUI.cpp:L2215](../../SparkEditor/Source/Core/EditorUI.cpp#L2215) | | +| `EditorUI::ObserveDocumentHistoryForRecovery` | method | SparkEditor | [EditorUI.cpp:L1622](../../SparkEditor/Source/Core/EditorUI.cpp#L1622) | | +| `EditorUI::OfferMatchingRecoveryForCurrentProject` | method | SparkEditor | [EditorUI.cpp:L1719](../../SparkEditor/Source/Core/EditorUI.cpp#L1719) | | +| `EditorUI::OpenScene` | method | SparkEditor | [EditorUI.cpp:L2515](../../SparkEditor/Source/Core/EditorUI.cpp#L2515) | | +| `EditorUI::PersistRecoverySnapshotOnUiThread` | method | SparkEditor | [EditorUI.cpp:L1672](../../SparkEditor/Source/Core/EditorUI.cpp#L1672) | | +| `EditorUI::ProcessGlobalHotkeys` | method | SparkEditor | [EditorUI.cpp:L656](../../SparkEditor/Source/Core/EditorUI.cpp#L656) | | +| `EditorUI::ProcessSceneShortcuts` | method | SparkEditor | [EditorUI.cpp:L634](../../SparkEditor/Source/Core/EditorUI.cpp#L634) | | +| `EditorUI::RecordRecoveryOperation` | method | SparkEditor | [EditorUI.cpp:L1596](../../SparkEditor/Source/Core/EditorUI.cpp#L1596) | | +| `EditorUI::RegisterCommand` | method | SparkEditor | [EditorUI.cpp:L1496](../../SparkEditor/Source/Core/EditorUI.cpp#L1496) | | | `EditorUI::RegisterEditCommands` | method | SparkEditor | [EditorCommandRegistry.cpp:L82](../../SparkEditor/Source/Core/EditorCommandRegistry.cpp#L82) | | | `EditorUI::RegisterPanelToggleCommands` | method | SparkEditor | [EditorCommandRegistry.cpp:L35](../../SparkEditor/Source/Core/EditorCommandRegistry.cpp#L35) | | | `EditorUI::RegisterSceneCommands` | method | SparkEditor | [EditorCommandRegistry.cpp:L128](../../SparkEditor/Source/Core/EditorCommandRegistry.cpp#L128) | | | `EditorUI::RegisterToolCommands` | method | SparkEditor | [EditorCommandRegistry.cpp:L155](../../SparkEditor/Source/Core/EditorCommandRegistry.cpp#L155) | | -| `EditorUI::Render` | method | SparkEditor | [EditorUI.cpp:L701](../../SparkEditor/Source/Core/EditorUI.cpp#L701) | | +| `EditorUI::Render` | method | SparkEditor | [EditorUI.cpp:L721](../../SparkEditor/Source/Core/EditorUI.cpp#L721) | | | `EditorUI::RenderBuildMenu` | method | SparkEditor | [EditorMenuBar.cpp:L635](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L635) | | | `EditorUI::RenderEditMenu` | method | SparkEditor | [EditorMenuBar.cpp:L228](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L228) | | | `EditorUI::RenderFileMenu` | method | SparkEditor | [EditorMenuBar.cpp:L198](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L198) | | @@ -8258,51 +8277,51 @@ | `EditorUI::RenderGameObjectVolumeSubMenu` | method | SparkEditor | [EditorMenuBar.cpp:L339](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L339) | | | `EditorUI::RenderHelpMenu` | method | SparkEditor | [EditorMenuBar.cpp:L670](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L670) | | | `EditorUI::RenderMainMenuBar` | method | SparkEditor | [EditorMenuBar.cpp:L113](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L113) | | -| `EditorUI::RenderModalDialogs` | method | SparkEditor | [EditorUI.cpp:L1119](../../SparkEditor/Source/Core/EditorUI.cpp#L1119) | | -| `EditorUI::RenderPanels` | method | SparkEditor | [EditorUI.cpp:L1076](../../SparkEditor/Source/Core/EditorUI.cpp#L1076) | | -| `EditorUI::RenderRecoveryModal` | method | SparkEditor | [EditorUI.cpp:L1904](../../SparkEditor/Source/Core/EditorUI.cpp#L1904) | | -| `EditorUI::RenderStatusBar` | method | SparkEditor | [EditorUI.cpp:L939](../../SparkEditor/Source/Core/EditorUI.cpp#L939) | | +| `EditorUI::RenderModalDialogs` | method | SparkEditor | [EditorUI.cpp:L1139](../../SparkEditor/Source/Core/EditorUI.cpp#L1139) | | +| `EditorUI::RenderPanels` | method | SparkEditor | [EditorUI.cpp:L1096](../../SparkEditor/Source/Core/EditorUI.cpp#L1096) | | +| `EditorUI::RenderRecoveryModal` | method | SparkEditor | [EditorUI.cpp:L1924](../../SparkEditor/Source/Core/EditorUI.cpp#L1924) | | +| `EditorUI::RenderStatusBar` | method | SparkEditor | [EditorUI.cpp:L959](../../SparkEditor/Source/Core/EditorUI.cpp#L959) | | | `EditorUI::RenderToolbar` | method | SparkEditor | [EditorMenuBar.cpp:L830](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L830) | | | `EditorUI::RenderToolbarPlayControls` | method | SparkEditor | [EditorMenuBar.cpp:L775](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L775) | | | `EditorUI::RenderToolbarSnapControls` | method | SparkEditor | [EditorMenuBar.cpp:L817](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L817) | | | `EditorUI::RenderToolbarTransformTools` | method | SparkEditor | [EditorMenuBar.cpp:L713](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L713) | | -| `EditorUI::RenderUnsavedChangesDialog` | method | SparkEditor | [EditorUI.cpp:L1152](../../SparkEditor/Source/Core/EditorUI.cpp#L1152) | | -| `EditorUI::RenderWelcomeScreen` | method | SparkEditor | [EditorUI.cpp:L1201](../../SparkEditor/Source/Core/EditorUI.cpp#L1201) | | +| `EditorUI::RenderUnsavedChangesDialog` | method | SparkEditor | [EditorUI.cpp:L1172](../../SparkEditor/Source/Core/EditorUI.cpp#L1172) | | +| `EditorUI::RenderWelcomeScreen` | method | SparkEditor | [EditorUI.cpp:L1221](../../SparkEditor/Source/Core/EditorUI.cpp#L1221) | | | `EditorUI::RenderWindowMenu` | method | SparkEditor | [EditorMenuBar.cpp:L502](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L502) | | -| `EditorUI::RequestCreateProject` | method | SparkEditor | [EditorUI.cpp:L2100](../../SparkEditor/Source/Core/EditorUI.cpp#L2100) | | -| `EditorUI::RequestDocumentTransition` | method | SparkEditor | [EditorUI.cpp:L2115](../../SparkEditor/Source/Core/EditorUI.cpp#L2115) | | -| `EditorUI::RequestExitWithConfirmation` | method | SparkEditor | [EditorUI.cpp:L2183](../../SparkEditor/Source/Core/EditorUI.cpp#L2183) | | -| `EditorUI::RequestOpenProject` | method | SparkEditor | [EditorUI.cpp:L2089](../../SparkEditor/Source/Core/EditorUI.cpp#L2089) | | -| `EditorUI::ResetRecoveryCaptureTracking` | method | SparkEditor | [EditorUI.cpp:L1589](../../SparkEditor/Source/Core/EditorUI.cpp#L1589) | | -| `EditorUI::ResetToDefaultLayout` | method | SparkEditor | [EditorUI.cpp:L1403](../../SparkEditor/Source/Core/EditorUI.cpp#L1403) | | -| `EditorUI::ResetWorldAfterProjectClose` | method | SparkEditor | [EditorUI.cpp:L2228](../../SparkEditor/Source/Core/EditorUI.cpp#L2228) | | -| `EditorUI::RestorePendingRecovery` | method | SparkEditor | [EditorUI.cpp:L1756](../../SparkEditor/Source/Core/EditorUI.cpp#L1756) | | -| `EditorUI::RewirePanelsToWorld` | method | SparkEditor | [EditorUI.cpp:L2314](../../SparkEditor/Source/Core/EditorUI.cpp#L2314) | | -| `EditorUI::SaveCurrentScene` | method | SparkEditor | [EditorUI.cpp:L2395](../../SparkEditor/Source/Core/EditorUI.cpp#L2395) | | -| `EditorUI::SaveLayout` | method | SparkEditor | [EditorUI.cpp:L1305](../../SparkEditor/Source/Core/EditorUI.cpp#L1305) | | -| `EditorUI::SaveScene` | method | SparkEditor | [EditorUI.cpp:L2237](../../SparkEditor/Source/Core/EditorUI.cpp#L2237) | | +| `EditorUI::RequestCreateProject` | method | SparkEditor | [EditorUI.cpp:L2120](../../SparkEditor/Source/Core/EditorUI.cpp#L2120) | | +| `EditorUI::RequestDocumentTransition` | method | SparkEditor | [EditorUI.cpp:L2135](../../SparkEditor/Source/Core/EditorUI.cpp#L2135) | | +| `EditorUI::RequestExitWithConfirmation` | method | SparkEditor | [EditorUI.cpp:L2203](../../SparkEditor/Source/Core/EditorUI.cpp#L2203) | | +| `EditorUI::RequestOpenProject` | method | SparkEditor | [EditorUI.cpp:L2109](../../SparkEditor/Source/Core/EditorUI.cpp#L2109) | | +| `EditorUI::ResetRecoveryCaptureTracking` | method | SparkEditor | [EditorUI.cpp:L1609](../../SparkEditor/Source/Core/EditorUI.cpp#L1609) | | +| `EditorUI::ResetToDefaultLayout` | method | SparkEditor | [EditorUI.cpp:L1423](../../SparkEditor/Source/Core/EditorUI.cpp#L1423) | | +| `EditorUI::ResetWorldAfterProjectClose` | method | SparkEditor | [EditorUI.cpp:L2248](../../SparkEditor/Source/Core/EditorUI.cpp#L2248) | | +| `EditorUI::RestorePendingRecovery` | method | SparkEditor | [EditorUI.cpp:L1776](../../SparkEditor/Source/Core/EditorUI.cpp#L1776) | | +| `EditorUI::RewirePanelsToWorld` | method | SparkEditor | [EditorUI.cpp:L2334](../../SparkEditor/Source/Core/EditorUI.cpp#L2334) | | +| `EditorUI::SaveCurrentScene` | method | SparkEditor | [EditorUI.cpp:L2427](../../SparkEditor/Source/Core/EditorUI.cpp#L2427) | | +| `EditorUI::SaveLayout` | method | SparkEditor | [EditorUI.cpp:L1325](../../SparkEditor/Source/Core/EditorUI.cpp#L1325) | | +| `EditorUI::SaveScene` | method | SparkEditor | [EditorUI.cpp:L2257](../../SparkEditor/Source/Core/EditorUI.cpp#L2257) | | | `EditorUI::SetDefaultPanelVisibility` | method | SparkEditor | [EditorPanelFactoryMetadata.cpp:L186](../../SparkEditor/Source/Core/EditorPanelFactoryMetadata.cpp#L186) | | -| `EditorUI::SetEngineConnected` | method | SparkEditor | [EditorUI.cpp:L1495](../../SparkEditor/Source/Core/EditorUI.cpp#L1495) | | -| `EditorUI::SetFrameNumber` | method | SparkEditor | [EditorUI.cpp:L1485](../../SparkEditor/Source/Core/EditorUI.cpp#L1485) | | -| `EditorUI::SetGraphicsDevice` | method | SparkEditor | [EditorUI.cpp:L2530](../../SparkEditor/Source/Core/EditorUI.cpp#L2530) | | -| `EditorUI::SetPanelVisible` | method | SparkEditor | [EditorUI.cpp:L1296](../../SparkEditor/Source/Core/EditorUI.cpp#L1296) | | -| `EditorUI::SetTransformTool` | method | SparkEditor | [EditorUI.cpp:L2287](../../SparkEditor/Source/Core/EditorUI.cpp#L2287) | | -| `EditorUI::SetupDefaultDockLayout` | method | SparkEditor | [EditorUI.cpp:L784](../../SparkEditor/Source/Core/EditorUI.cpp#L784) | | -| `EditorUI::ShowModalDialog` | method | SparkEditor | [EditorUI.cpp:L2053](../../SparkEditor/Source/Core/EditorUI.cpp#L2053) | | -| `EditorUI::ShowNewProjectDialog` | method | SparkEditor | [EditorUI.cpp:L2065](../../SparkEditor/Source/Core/EditorUI.cpp#L2065) | | -| `EditorUI::ShowNotification` | method | SparkEditor | [EditorUI.cpp:L1431](../../SparkEditor/Source/Core/EditorUI.cpp#L1431) | | -| `EditorUI::ShowOpenProjectDialog` | method | SparkEditor | [EditorUI.cpp:L2073](../../SparkEditor/Source/Core/EditorUI.cpp#L2073) | | +| `EditorUI::SetEngineConnected` | method | SparkEditor | [EditorUI.cpp:L1515](../../SparkEditor/Source/Core/EditorUI.cpp#L1515) | | +| `EditorUI::SetFrameNumber` | method | SparkEditor | [EditorUI.cpp:L1505](../../SparkEditor/Source/Core/EditorUI.cpp#L1505) | | +| `EditorUI::SetGraphicsDevice` | method | SparkEditor | [EditorUI.cpp:L2562](../../SparkEditor/Source/Core/EditorUI.cpp#L2562) | | +| `EditorUI::SetPanelVisible` | method | SparkEditor | [EditorUI.cpp:L1316](../../SparkEditor/Source/Core/EditorUI.cpp#L1316) | | +| `EditorUI::SetTransformTool` | method | SparkEditor | [EditorUI.cpp:L2307](../../SparkEditor/Source/Core/EditorUI.cpp#L2307) | | +| `EditorUI::SetupDefaultDockLayout` | method | SparkEditor | [EditorUI.cpp:L804](../../SparkEditor/Source/Core/EditorUI.cpp#L804) | | +| `EditorUI::ShowModalDialog` | method | SparkEditor | [EditorUI.cpp:L2073](../../SparkEditor/Source/Core/EditorUI.cpp#L2073) | | +| `EditorUI::ShowNewProjectDialog` | method | SparkEditor | [EditorUI.cpp:L2085](../../SparkEditor/Source/Core/EditorUI.cpp#L2085) | | +| `EditorUI::ShowNotification` | method | SparkEditor | [EditorUI.cpp:L1451](../../SparkEditor/Source/Core/EditorUI.cpp#L1451) | | +| `EditorUI::ShowOpenProjectDialog` | method | SparkEditor | [EditorUI.cpp:L2093](../../SparkEditor/Source/Core/EditorUI.cpp#L2093) | | | `EditorUI::ShowOpenSceneDialog` | method | SparkEditor | [EditorMenuBar.cpp:L86](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L86) | | | `EditorUI::ShowOpenSceneDialogNow` | method | SparkEditor | [EditorMenuBar.cpp:L91](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L91) | | -| `EditorUI::ShowProjectBrowser` | method | SparkEditor | [EditorUI.cpp:L2081](../../SparkEditor/Source/Core/EditorUI.cpp#L2081) | | -| `EditorUI::Shutdown` | method | SparkEditor | [EditorUI.cpp:L812](../../SparkEditor/Source/Core/EditorUI.cpp#L812) | | -| `EditorUI::StopPlayModeForDocumentTransition` | method | SparkEditor | [EditorUI.cpp:L2257](../../SparkEditor/Source/Core/EditorUI.cpp#L2257) | | -| `EditorUI::SuppressRecoveryAfterExplicitDocumentDiscard` | method | SparkEditor | [EditorUI.cpp:L1733](../../SparkEditor/Source/Core/EditorUI.cpp#L1733) | | -| `EditorUI::SwapWorld` | method | SparkEditor | [EditorUI.cpp:L2263](../../SparkEditor/Source/Core/EditorUI.cpp#L2263) | | -| `EditorUI::Update` | method | SparkEditor | [EditorUI.cpp:L569](../../SparkEditor/Source/Core/EditorUI.cpp#L569) | | -| `EditorUI::UpdateAssetDatabaseInfo` | method | SparkEditor | [EditorUI.cpp:L1500](../../SparkEditor/Source/Core/EditorUI.cpp#L1500) | | -| `EditorUI::UpdateSceneInfo` | method | SparkEditor | [EditorUI.cpp:L1506](../../SparkEditor/Source/Core/EditorUI.cpp#L1506) | | -| `EditorUI::UpdateStats` | method | SparkEditor | [EditorUI.cpp:L1265](../../SparkEditor/Source/Core/EditorUI.cpp#L1265) | | +| `EditorUI::ShowProjectBrowser` | method | SparkEditor | [EditorUI.cpp:L2101](../../SparkEditor/Source/Core/EditorUI.cpp#L2101) | | +| `EditorUI::Shutdown` | method | SparkEditor | [EditorUI.cpp:L832](../../SparkEditor/Source/Core/EditorUI.cpp#L832) | | +| `EditorUI::StopPlayModeForDocumentTransition` | method | SparkEditor | [EditorUI.cpp:L2277](../../SparkEditor/Source/Core/EditorUI.cpp#L2277) | | +| `EditorUI::SuppressRecoveryAfterExplicitDocumentDiscard` | method | SparkEditor | [EditorUI.cpp:L1753](../../SparkEditor/Source/Core/EditorUI.cpp#L1753) | | +| `EditorUI::SwapWorld` | method | SparkEditor | [EditorUI.cpp:L2283](../../SparkEditor/Source/Core/EditorUI.cpp#L2283) | | +| `EditorUI::Update` | method | SparkEditor | [EditorUI.cpp:L589](../../SparkEditor/Source/Core/EditorUI.cpp#L589) | | +| `EditorUI::UpdateAssetDatabaseInfo` | method | SparkEditor | [EditorUI.cpp:L1520](../../SparkEditor/Source/Core/EditorUI.cpp#L1520) | | +| `EditorUI::UpdateSceneInfo` | method | SparkEditor | [EditorUI.cpp:L1526](../../SparkEditor/Source/Core/EditorUI.cpp#L1526) | | +| `EditorUI::UpdateStats` | method | SparkEditor | [EditorUI.cpp:L1285](../../SparkEditor/Source/Core/EditorUI.cpp#L1285) | | | `EditorUI::WireCallbacks` | method | SparkEditor | [EditorUI.cpp:L408](../../SparkEditor/Source/Core/EditorUI.cpp#L408) | | | `EditorWindowManager::Console_GetStatus` | method | SparkEditor | [EditorWindowManager.cpp:L216](../../SparkEditor/Source/Core/EditorWindowManager.cpp#L216) | | | `EditorWindowManager::DeleteLayout` | method | SparkEditor | [EditorWindowManager.cpp:L197](../../SparkEditor/Source/Core/EditorWindowManager.cpp#L197) | | @@ -8331,7 +8350,7 @@ | `ElevatorObject::GetInteractionPrompt` | method | GameModules | [InteractiveObject.cpp:L380](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.cpp#L380) | | | `ElevatorObject::Interact` | method | GameModules | [InteractiveObject.cpp:L365](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.cpp#L365) | | | `ElevatorObject::Update` | method | GameModules | [InteractiveObject.cpp:L344](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.cpp#L344) | | -| `ElfW` | function | SparkEngine | [CrashHandler.cpp:L1861](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1861) | | +| `ElfW` | function | SparkEngine | [CrashHandler.cpp:L1862](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1862) | | | `embedded` | function | Tests | [TestEditorAssetReference.cpp:L28](../../Tests/TestEditorAssetReference.cpp#L28) | | | `Emit` | function | SparkInstaller | [Installer.cpp:L40](../../SparkInstaller/src/Installer.cpp#L40) | | | `Emit` | function | Tests | [FPSLANLoopbackPeer.cpp:L131](../../Tests/Fixtures/FPSLANLoopbackPeer.cpp#L131) | | @@ -8351,7 +8370,9 @@ | `EmitStep` | function | SparkEngine | [VisualScriptEmitter.h:L119](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L119) | | | `emitted` | function | SparkEngine | [MeshOptimizer.h:L128](../../SparkEngine/Source/Graphics/MeshOptimizer.h#L128) | | | `emitter` | function | SparkEngine | [VisualScriptCompiler.cpp:L210](../../SparkEngine/Source/Engine/Scripting/VisualScriptCompiler.cpp#L210) | | +| `emitter` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L478](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L478) | | | `EmplaceOrReplace` | function | SparkEngine | [CoreComponentSerializersInternal.h:L47](../../SparkEngine/Source/Engine/Editor/CoreComponentSerializersInternal.h#L47) | | +| `Empty` | function | GameModules | [TFReplicationRefresh.h:L42](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L42) | | | `empty` | function | SparkEngine | [AlignedHeapArray.h:L191](../../SparkEngine/Source/Utils/AlignedHeapArray.h#L191) | | | `Empty` | function | SparkEngine | [Octree.h:L160](../../SparkEngine/Source/Utils/Octree.h#L160) | Check if the tree is empty. | | `empty` | function | Tests | [TestAlignedHeapArray.cpp:L99](../../Tests/TestAlignedHeapArray.cpp#L99) | | @@ -8517,6 +8538,7 @@ | `EndFrame` | function | Tests | [TestTransientBufferAllocatorPhaseX.cpp:L137](../../Tests/TestTransientBufferAllocatorPhaseX.cpp#L137) | | | `EndGPUSample` | function | SparkEditor | [PerformanceProfiler.h:L142](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L142) | End GPU profiling sample | | `EndGPUTimer` | function | SparkEngine | [Profiler.h:L228](../../SparkEngine/Source/Utils/Profiler.h#L228) | End a GPU timing query | +| `EndInputObservation` | function | GameModules | [Game.h:L651](../../GameModules/SparkGameFPS/Source/Game/Game.h#L651) | Process input and translate to game actions | | `endless` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L242](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L242) | | | `EndlessAnswerBuffer` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L217](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L217) | | | `EndLine` | function | SparkEngine | [CrashSymbolication.h:L162](../../SparkEngine/Source/Utils/CrashSymbolication.h#L162) | Terminate the current line; returns false once the buffer is full. | @@ -8605,6 +8627,8 @@ | `EngineSdkLogger::Warn` | method | SparkEngine | [EngineSdkLogger.cpp:L29](../../SparkEngine/Source/Core/EngineSdkLogger.cpp#L29) | | | `EngineSdkStateValidation::AddRule` | method | SparkEngine | [EngineSdkStateValidation.cpp:L13](../../SparkEngine/Source/Core/EngineSdkStateValidation.cpp#L13) | | | `EngineSdkStateValidation::RemoveRulesByCategory` | method | SparkEngine | [EngineSdkStateValidation.cpp:L33](../../SparkEngine/Source/Core/EngineSdkStateValidation.cpp#L33) | | +| `EngineSdkWeather` | function | SparkEngine | [EngineSdkWeather.h:L13](../../SparkEngine/Source/Core/EngineSdkWeather.h#L13) | | +| `EngineSdkWeather::SetWeather` | method | SparkEngine | [EngineSdkWeather.cpp:L8](../../SparkEngine/Source/Core/EngineSdkWeather.cpp#L8) | | | `EngineSettings::ApplyDebugSettings` | method | SparkEngine | [EngineSettings.cpp:L1269](../../SparkEngine/Source/Core/EngineSettings.cpp#L1269) | | | `EngineSettings::FindSettingsPath` | method | SparkEngine | [EngineSettings.cpp:L1005](../../SparkEngine/Source/Core/EngineSettings.cpp#L1005) | | | `EngineSettings::GetInstance` | method | SparkEngine | [EngineSettings.cpp:L817](../../SparkEngine/Source/Core/EngineSettings.cpp#L817) | | @@ -8747,6 +8771,7 @@ | `EntityTransformTrack::EvaluateRotation` | method | SparkEngine | [Sequencer.cpp:L227](../../SparkEngine/Source/Engine/Cinematic/Sequencer.cpp#L227) | | | `EntityTransformTrack::EvaluateScale` | method | SparkEngine | [Sequencer.cpp:L232](../../SparkEngine/Source/Engine/Cinematic/Sequencer.cpp#L232) | | | `EntityTransformTrack::GetDuration` | method | SparkEngine | [Sequencer.cpp:L189](../../SparkEngine/Source/Engine/Cinematic/Sequencer.cpp#L189) | | +| `Entries` | function | GameModules | [TFReplicationRefresh.h:L44](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L44) | | | `entry` | function | SparkEditor | [ConsolePanel.cpp:L121](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L121) | | | `EntryJson` | function | Tests | [TestGoldenImageTest.cpp:L101](../../Tests/TestGoldenImageTest.cpp#L101) | | | `EntryType` | function | SparkInstaller | [GitBootstrap.cpp:L56](../../SparkInstaller/src/GitBootstrap.cpp#L56) | | @@ -8770,7 +8795,7 @@ | `envOverride` | function | Tests | [TestUserDataPathsReal.cpp:L223](../../Tests/TestUserDataPathsReal.cpp#L223) | | | `Eof` | function | SparkEditor | [EditorLayoutManager.cpp:L327](../../SparkEditor/Source/Core/EditorLayoutManager.cpp#L327) | | | `ep` | function | SparkEngine | [GraphicsDeviceResourcesLinuxShaders.cpp:L135](../../SparkEngine/Source/Graphics/GraphicsDeviceResourcesLinuxShaders.cpp#L135) | | -| `EqualsIgnoringCase` | function | SparkEngine | [SceneManager.cpp:L272](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L272) | | +| `EqualsIgnoringCase` | function | SparkEngine | [SceneManager.cpp:L298](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L298) | | | `EqualsNoCase` | function | GameModules | [TFOutfitSystemInternal.h:L28](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystemInternal.h#L28) | | | `EqualsNoCase` | function | GameModules | [TFOutfitStore.cpp:L34](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFOutfitStore.cpp#L34) | | | `Equip` | function | GameModules | [RPGCharacterSystem.h:L134](../../GameModules/SparkGameRPG/Source/Character/RPGCharacterSystem.h#L134) | | @@ -8780,6 +8805,7 @@ | `EquipStarterGear` | function | GameModules | [RPGDemoSession.h:L55](../../GameModules/SparkGameRPG/Source/Gameplay/RPGDemoSession.h#L55) | | | `EquipTool` | function | GameModules | [Player.h:L406](../../GameModules/SparkGameFPS/Source/Game/Player.h#L406) | Switch to class tool | | `equivalent` | function | Tests | [TestShaderHotReload.cpp:L134](../../Tests/TestShaderHotReload.cpp#L134) | | +| `Erase` | function | GameModules | [TFReplicationRefresh.h:L40](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L40) | | | `Erase` | function | GameModules | [TFPlayerMeta.h:L104](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFPlayerMeta.h#L104) | | | `EraseByIterator` | function | SparkDaemon | [AssetService.h:L124](../../SparkDaemon/src/AssetService.h#L124) | | | `EraseIf` | function | SparkEngine | [ContainerUtils.h:L106](../../SparkEngine/Source/Utils/ContainerUtils.h#L106) | Erase all elements matching a predicate. | @@ -8796,7 +8822,7 @@ | `Err` | function | SparkEngine | [LocalFileCache.h:L256](../../SparkEngine/Source/Utils/LocalFileCache.h#L256) | | | `Err` | function | SparkEngine | [Result.h:L146](../../SparkEngine/Source/Utils/Result.h#L146) | | | `err` | function | Tests | [TestResult.cpp:L35](../../Tests/TestResult.cpp#L35) | | -| `error` | function | SparkEditor | [EditorUI.cpp:L1955](../../SparkEditor/Source/Core/EditorUI.cpp#L1955) | | +| `error` | function | SparkEditor | [EditorUI.cpp:L1975](../../SparkEditor/Source/Core/EditorUI.cpp#L1975) | | | `Error` | function | SparkEngine | [EngineSdkLogger.h:L29](../../SparkEngine/Source/Core/EngineSdkLogger.h#L29) | | | `error` | function | SparkEngine | [Expected.h:L40](../../SparkEngine/Source/Utils/Expected.h#L40) | | | `error` | function | SparkEngine | [Expected.h:L41](../../SparkEngine/Source/Utils/Expected.h#L41) | | @@ -8867,18 +8893,8 @@ | `EscapeJsonString` | function | SparkEditor | [EditorLayoutManager.cpp:L274](../../SparkEditor/Source/Core/EditorLayoutManager.cpp#L274) | | | `EscapeJsonString` | function | SparkEditor | [EditorLayoutManager.h:L242](../../SparkEditor/Source/Core/EditorLayoutManager.h#L242) | | | `EscapeKVField` | function | SparkEngine | [AsyncDatabase.cpp:L170](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.cpp#L170) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L336](../../SparkEditor/Source/Core/ProjectDocument.cpp#L336) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L346](../../SparkEditor/Source/Core/ProjectDocument.cpp#L346) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L486](../../SparkEditor/Source/Core/ProjectDocument.cpp#L486) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L487](../../SparkEditor/Source/Core/ProjectDocument.cpp#L487) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L488](../../SparkEditor/Source/Core/ProjectDocument.cpp#L488) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L489](../../SparkEditor/Source/Core/ProjectDocument.cpp#L489) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L492](../../SparkEditor/Source/Core/ProjectDocument.cpp#L492) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L494](../../SparkEditor/Source/Core/ProjectDocument.cpp#L494) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L495](../../SparkEditor/Source/Core/ProjectDocument.cpp#L495) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L565](../../SparkEditor/Source/Core/ProjectDocument.cpp#L565) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L566](../../SparkEditor/Source/Core/ProjectDocument.cpp#L566) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L567](../../SparkEditor/Source/Core/ProjectDocument.cpp#L567) | | +| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L337](../../SparkEditor/Source/Core/ProjectDocument.cpp#L337) | | +| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L347](../../SparkEditor/Source/Core/ProjectDocument.cpp#L347) | | | `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.h:L62](../../SparkEditor/Source/Core/ProjectDocument.h#L62) | Escape a string for a JSON string literal (quotes, backslash, control bytes). | | `EscapeRemoteTextForLog` | function | SparkEngine | [DedicatedServer.h:L373](../../SparkEngine/Source/Engine/Networking/DedicatedServer.h#L373) | | | `EscapeSaslName` | function | GameModules | [TFAccountSystem.cpp:L172](../../GameModules/SparkGameMMOFPS/Source/Account/TFAccountSystem.cpp#L172) | | @@ -9111,7 +9127,7 @@ | `ExecuteActions` | function | SparkEngine | [EventResponseSystem.h:L260](../../SparkEngine/Source/Engine/Gameplay/EventResponseSystem.h#L260) | Execute a list of actions in the context of an entity | | `ExecuteActions` | function | Tests | [TestEventResponseSystem.cpp:L159](../../Tests/TestEventResponseSystem.cpp#L159) | | | `ExecuteCommand` | function | SparkConsole | [CommandRegistry.h:L62](../../SparkConsole/src/CommandRegistry.h#L62) | Execute a registered command by name. | -| `ExecuteCommand` | function | SparkConsole | [ConsoleApp.h:L110](../../SparkConsole/src/ConsoleApp.h#L110) | | +| `ExecuteCommand` | function | SparkConsole | [ConsoleApp.h:L111](../../SparkConsole/src/ConsoleApp.h#L111) | | | `ExecuteCommand` | function | SparkEditor | [EditorUI.h:L234](../../SparkEditor/Source/Core/EditorUI.h#L234) | | | `ExecuteCommand` | function | SparkEditor | [ConsolePanel.h:L125](../../SparkEditor/Source/Panels/ConsolePanel.h#L125) | Execute a command | | `ExecuteCommand` | function | SparkEditor | [EditorAutomation.h:L233](../../SparkEditor/Source/Panels/EditorAutomation.h#L233) | Execute a command by name with arguments | @@ -9133,9 +9149,9 @@ | `ExecuteConsoleCommand` | function | SparkEditor | [SparkEngineIntegration.h:L458](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L458) | Execute console command in engine | | `ExecuteConsoleCommand` | function | SparkEngine | [RemoteDebugSystem.h:L612](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugSystem.h#L612) | Execute a console command on the remote game. | | `ExecuteDLSS` | function | SparkEngine | [UpscalingSystem.h:L198](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L198) | | -| `ExecuteDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2097](../../SparkEditor/Source/Core/EditorUI.cpp#L2097) | | -| `ExecuteDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2112](../../SparkEditor/Source/Core/EditorUI.cpp#L2112) | | -| `ExecuteDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2119](../../SparkEditor/Source/Core/EditorUI.cpp#L2119) | | +| `ExecuteDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2117](../../SparkEditor/Source/Core/EditorUI.cpp#L2117) | | +| `ExecuteDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2132](../../SparkEditor/Source/Core/EditorUI.cpp#L2132) | | +| `ExecuteDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2139](../../SparkEditor/Source/Core/EditorUI.cpp#L2139) | | | `ExecuteDocumentTransition` | function | SparkEditor | [EditorUI.h:L450](../../SparkEditor/Source/Core/EditorUI.h#L450) | | | `ExecuteFrame` | function | SparkEngine | [RenderPipeline.h:L125](../../SparkEngine/Source/Graphics/RenderPipeline.h#L125) | | | `ExecuteFSR1` | function | SparkEngine | [UpscalingSystem.h:L171](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L171) | | @@ -9174,7 +9190,7 @@ | `Exists` | function | SparkEngine | [VirtualFileSystem.h:L131](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L131) | Construct a provider rooted at the given directory. | | `Exists` | function | SparkEngine | [VirtualFileSystem.h:L208](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L208) | Check whether any mount contains the given file. | | `Exists` | function | SparkInstaller | [InstallState.h:L46](../../SparkInstaller/src/InstallState.h#L46) | | -| `Exists` | function | Tests | [TestSparkPak.cpp:L223](../../Tests/TestSparkPak.cpp#L223) | | +| `Exists` | function | Tests | [TestSparkPak.cpp:L229](../../Tests/TestSparkPak.cpp#L229) | | | `ExistsWithExactCase` | function | Tests | [TestAssetManifestReal.cpp:L283](../../Tests/TestAssetManifestReal.cpp#L283) | | | `ExistsWithExactCase` | function | Tests | [TestGameModuleMMO.cpp:L82](../../Tests/TestGameModuleMMO.cpp#L82) | | | `ExitPlayMode` | function | SparkEngine | [PlayModeManager.h:L110](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L110) | | @@ -9193,6 +9209,7 @@ | `ExpectAnalytic` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L1090](../../Tests/TestRHI225D3D12ParityReal.cpp#L1090) | | | `ExpectBackendsAgree` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L1126](../../Tests/TestRHI225D3D12ParityReal.cpp#L1126) | | | `ExpectBinding` | function | Tests | [TestGPUDrivenRendererD3D11.cpp:L58](../../Tests/TestGPUDrivenRendererD3D11.cpp#L58) | | +| `ExpectCamera` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L42](../../Tests/TestFPSGameCameraReloadReal.cpp#L42) | | | `ExpectClean` | function | Tests | [TestRHI225D3D12ValidationReal.cpp:L132](../../Tests/TestRHI225D3D12ValidationReal.cpp#L132) | | | `ExpectClean` | function | Tests | [VulkanTestSupport.h:L131](../../Tests/VulkanTestSupport.h#L131) | | | `ExpectCleanProbe` | function | Tests | [TestAngelScriptStackAlignmentReal.cpp:L429](../../Tests/TestAngelScriptStackAlignmentReal.cpp#L429) | | @@ -9206,7 +9223,7 @@ | `expected` | function | Tests | [TestGoldenImageTest.cpp:L481](../../Tests/TestGoldenImageTest.cpp#L481) | | | `expected` | function | Tests | [TestRHI230VulkanGoldenReal.cpp:L521](../../Tests/TestRHI230VulkanGoldenReal.cpp#L521) | | | `expected` | function | Tests | [TestRHI240OpenGLGoldenReal.cpp:L716](../../Tests/TestRHI240OpenGLGoldenReal.cpp#L716) | | -| `expected` | function | Tests | [TestReliableChannel.cpp:L883](../../Tests/TestReliableChannel.cpp#L883) | | +| `expected` | function | Tests | [TestReliableChannel.cpp:L889](../../Tests/TestReliableChannel.cpp#L889) | | | `ExpectedBinaryOutput` | function | SparkBuild | [ProcessRunnerTests.cpp:L177](../../SparkBuild/tests/ProcessRunnerTests.cpp#L177) | | | `ExpectedFieldDiagnostic` | function | Tests | [TestModuleABIDiagnostics.cpp:L88](../../Tests/TestModuleABIDiagnostics.cpp#L88) | | | `expectedImage` | function | Tests | [RHI210D3D11GoldenSupport.h:L897](../../Tests/RHI210D3D11GoldenSupport.h#L897) | | @@ -9217,18 +9234,19 @@ | `ExpectFailureReported` | function | Tests | [TestOnlineServices.cpp:L226](../../Tests/TestOnlineServices.cpp#L226) | | | `ExpectFixtureRegistrations` | function | Tests | [TestLIFE200ModuleReloadLoopReal.cpp:L142](../../Tests/TestLIFE200ModuleReloadLoopReal.cpp#L142) | | | `ExpectIndexedInstanced` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L889](../../Tests/TestRHI225D3D12ParityReal.cpp#L889) | | -| `ExpectInstalledHost` | function | Tests | [TestEditorCookPackageReal.cpp:L256](../../Tests/TestEditorCookPackageReal.cpp#L256) | | +| `ExpectInstalledHost` | function | Tests | [TestEditorCookPackageReal.cpp:L267](../../Tests/TestEditorCookPackageReal.cpp#L267) | | | `ExpectLatchedFailure` | function | Tests | [TestLifecycleCompositionRootFailure.cpp:L156](../../Tests/TestLifecycleCompositionRootFailure.cpp#L156) | | | `ExpectMatricesNear` | function | Tests | [TestQuaternionStubsReal.cpp:L67](../../Tests/TestQuaternionStubsReal.cpp#L67) | | | `ExpectMonsterActorsMatch` | function | Tests | [TestMOD330ARPGWorldActors.cpp:L147](../../Tests/TestMOD330ARPGWorldActors.cpp#L147) | | | `ExpectMRTClearAndDraw` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L955](../../Tests/TestRHI225D3D12ParityReal.cpp#L955) | | +| `ExpectNear` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L29](../../Tests/TestFPSGameCameraReloadReal.cpp#L29) | | | `ExpectNothingLeftBehind` | function | Tests | [TestMOD390VisualScriptDiagnosticsReal.cpp:L147](../../Tests/TestMOD390VisualScriptDiagnosticsReal.cpp#L147) | | | `ExpectNoThreadGrowth` | function | Tests | [TestLIFE200ModuleReloadLoopReal.cpp:L151](../../Tests/TestLIFE200ModuleReloadLoopReal.cpp#L151) | | | `ExpectOutfitDocumentRejected` | function | Tests | [TestTFOutfitStore.cpp:L53](../../Tests/TestTFOutfitStore.cpp#L53) | | | `ExpectPost` | function | Tests | [TestFPSLANLoopback.cpp:L283](../../Tests/TestFPSLANLoopback.cpp#L283) | | | `ExpectQuaternionNear` | function | Tests | [TestQuaternionStubsReal.cpp:L58](../../Tests/TestQuaternionStubsReal.cpp#L58) | | | `ExpectRejected` | function | Tests | [TestSessionCompatibilityReal.cpp:L70](../../Tests/TestSessionCompatibilityReal.cpp#L70) | | -| `ExpectRejectedWithRollback` | function | Tests | [TestSceneManagerReflectedReal.cpp:L51](../../Tests/TestSceneManagerReflectedReal.cpp#L51) | | +| `ExpectRejectedWithRollback` | function | Tests | [TestSceneManagerReflectedReal.cpp:L76](../../Tests/TestSceneManagerReflectedReal.cpp#L76) | | | `ExpectRenderToTextureThenSample` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L997](../../Tests/TestRHI225D3D12ParityReal.cpp#L997) | | | `ExpectResult` | function | Tests | [TestHandoffParticipant.cpp:L61](../../Tests/TestHandoffParticipant.cpp#L61) | | | `ExpectRetiredFixtureFailsClosed` | function | Tests | [Test_persistence_SaveSystem.cpp:L2420](../../Tests/harden/Test_persistence_SaveSystem.cpp#L2420) | | @@ -9239,7 +9257,7 @@ | `ExpectSameItem` | function | Tests | [TestMOD330ARPGDungeonReal.cpp:L131](../../Tests/TestMOD330ARPGDungeonReal.cpp#L131) | | | `ExpectSameMonster` | function | Tests | [TestMOD330ARPGDungeonReal.cpp:L116](../../Tests/TestMOD330ARPGDungeonReal.cpp#L116) | | | `ExpectSameView` | function | Tests | [TestFPSLANLoopback.cpp:L289](../../Tests/TestFPSLANLoopback.cpp#L289) | | -| `ExpectSceneRecords` | function | Tests | [TestEditorCookPackageReal.cpp:L441](../../Tests/TestEditorCookPackageReal.cpp#L441) | | +| `ExpectSceneRecords` | function | Tests | [TestEditorCookPackageReal.cpp:L452](../../Tests/TestEditorCookPackageReal.cpp#L452) | | | `ExpectShippedBloomExtract` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L1044](../../Tests/TestRHI225D3D12ParityReal.cpp#L1044) | | | `ExpectSolidTriangle` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L683](../../Tests/TestRHI225D3D12ParityReal.cpp#L683) | | | `ExpectStderrRestored` | function | Tests | [TestSparkError.cpp:L150](../../Tests/TestSparkError.cpp#L150) | | @@ -9249,6 +9267,7 @@ | `ExpectTexturedQuadPoint` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L769](../../Tests/TestRHI225D3D12ParityReal.cpp#L769) | | | `ExpectTonemappedCubeFrame` | function | Tests | [TestRHI240LinuxForwardPassReal.cpp:L466](../../Tests/TestRHI240LinuxForwardPassReal.cpp#L466) | | | `ExpectValidResults` | function | Tests | [TestMOD380RacingCompleteRaceReal.cpp:L109](../../Tests/TestMOD380RacingCompleteRaceReal.cpp#L109) | | +| `ExpectVector` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L35](../../Tests/TestFPSGameCameraReloadReal.cpp#L35) | | | `ExpectVertexColorInterpolation` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L713](../../Tests/TestRHI225D3D12ParityReal.cpp#L713) | | | `ExpectViewportScissor` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L927](../../Tests/TestRHI225D3D12ParityReal.cpp#L927) | | | `ExpectWikiMatrixInStep` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L1149](../../Tests/TestRHI225D3D12ParityReal.cpp#L1149) | | @@ -9352,11 +9371,11 @@ | `f` | function | Tests | [TestGLSLPipelineIntegration.cpp:L326](../../Tests/TestGLSLPipelineIntegration.cpp#L326) | | | `f` | function | Tests | [TestGLSLPipelineIntegration.cpp:L356](../../Tests/TestGLSLPipelineIntegration.cpp#L356) | | | `f` | function | Tests | [TestGLSLPipelineIntegration.cpp:L503](../../Tests/TestGLSLPipelineIntegration.cpp#L503) | | -| `f` | function | Tests | [TestTFDataTables.cpp:L67](../../Tests/TestTFDataTables.cpp#L67) | | +| `f` | function | Tests | [TestTFDataTables.cpp:L58](../../Tests/TestTFDataTables.cpp#L58) | | | `f` | function | Tests | [TestTFOutfitStore.cpp:L353](../../Tests/TestTFOutfitStore.cpp#L353) | | | `f` | function | Tests | [TestTFOutfitStore.cpp:L610](../../Tests/TestTFOutfitStore.cpp#L610) | | | `f` | function | Tests | [TestTFOutfitStore.cpp:L647](../../Tests/TestTFOutfitStore.cpp#L647) | | -| `f` | function | Tests | [TestTFRegionLattice.cpp:L77](../../Tests/TestTFRegionLattice.cpp#L77) | | +| `f` | function | Tests | [TestTFRegionLattice.cpp:L70](../../Tests/TestTFRegionLattice.cpp#L70) | | | `F32` | function | GameModules | [RTSSkirmishSimulation.cpp:L51](../../GameModules/SparkGameRTS/Source/Simulation/RTSSkirmishSimulation.cpp#L51) | | | `faceData` | function | SparkEngine | [LightingSystemInternalWindowsIBL.cpp:L53](../../SparkEngine/Source/Graphics/LightingSystemInternalWindowsIBL.cpp#L53) | | | `FaceNormal` | function | SparkEngine | [OBJStaticMeshLoader.cpp:L212](../../SparkEngine/Source/Graphics/OBJStaticMeshLoader.cpp#L212) | | @@ -9839,7 +9858,7 @@ | `FieldInt` | function | Tests | [TestFPSLANLoopback.cpp:L217](../../Tests/TestFPSLANLoopback.cpp#L217) | | | `fields` | function | SparkDaemon | [OrchestrationService.cpp:L1282](../../SparkDaemon/src/OrchestrationService.cpp#L1282) | | | `fields` | function | SparkEditor | [PrefabTextFormat.cpp:L288](../../SparkEditor/Source/Prefabs/PrefabTextFormat.cpp#L288) | | -| `fields` | function | Tests | [TestTF120Travel.cpp:L328](../../Tests/TestTF120Travel.cpp#L328) | | +| `fields` | function | Tests | [TestTF120Travel.cpp:L315](../../Tests/TestTF120Travel.cpp#L315) | | | `FieldToString` | function | GameModules | [TFOutfitSystemInternal.h:L46](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystemInternal.h#L46) | | | `FieldValueIsReadable` | function | SparkEngine | [ReflectedSceneSerializer.cpp:L65](../../SparkEngine/Source/SceneManager/ReflectedSceneSerializer.cpp#L65) | | | `FightCurrentEncounter` | function | Tests | [TestMOD350RPGQuestSliceReal.cpp:L173](../../Tests/TestMOD350RPGQuestSliceReal.cpp#L173) | | @@ -9868,8 +9887,8 @@ | `file` | function | SparkEditor | [EditorCrashHandler.cpp:L837](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L837) | | | `file` | function | SparkEditor | [EditorLogger.cpp:L247](../../SparkEditor/Source/Core/EditorLogger.cpp#L247) | | | `file` | function | SparkEditor | [EditorTheme.cpp:L1408](../../SparkEditor/Source/Core/EditorTheme.cpp#L1408) | | -| `file` | function | SparkEditor | [EditorUI.cpp:L1982](../../SparkEditor/Source/Core/EditorUI.cpp#L1982) | | -| `file` | function | SparkEditor | [EditorUI.cpp:L2020](../../SparkEditor/Source/Core/EditorUI.cpp#L2020) | | +| `file` | function | SparkEditor | [EditorUI.cpp:L2002](../../SparkEditor/Source/Core/EditorUI.cpp#L2002) | | +| `file` | function | SparkEditor | [EditorUI.cpp:L2040](../../SparkEditor/Source/Core/EditorUI.cpp#L2040) | | | `file` | function | SparkEditor | [ProjectManager.cpp:L663](../../SparkEditor/Source/Core/ProjectManager.cpp#L663) | | | `file` | function | SparkEditor | [ProjectManager.cpp:L2189](../../SparkEditor/Source/Core/ProjectManager.cpp#L2189) | | | `file` | function | SparkEditor | [ProjectManager.cpp:L2309](../../SparkEditor/Source/Core/ProjectManager.cpp#L2309) | | @@ -9884,8 +9903,9 @@ | `file` | function | SparkEditor | [ConsolePanel.cpp:L337](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L337) | | | `file` | function | SparkEditor | [DecorLayoutEditorIO.cpp:L174](../../SparkEditor/Source/Panels/DecorLayoutEditorIO.cpp#L174) | | | `file` | function | SparkEditor | [GameModuleSelectorPanel.cpp:L487](../../SparkEditor/Source/Panels/GameModuleSelectorPanel.cpp#L487) | | -| `file` | function | SparkEditor | [MaterialEditorPanel.cpp:L337](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L337) | | -| `file` | function | SparkEditor | [PlayControlLaunch.cpp:L322](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L322) | | +| `file` | function | SparkEditor | [MaterialEditorFiles.cpp:L44](../../SparkEditor/Source/Panels/MaterialEditorFiles.cpp#L44) | | +| `file` | function | SparkEditor | [MaterialEditorFiles.cpp:L120](../../SparkEditor/Source/Panels/MaterialEditorFiles.cpp#L120) | | +| `file` | function | SparkEditor | [PlayControlLaunch.cpp:L324](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L324) | | | `file` | function | SparkEditor | [RegionMapEditorIO.cpp:L242](../../SparkEditor/Source/Panels/RegionMapEditorIO.cpp#L242) | | | `file` | function | SparkEditor | [VisualScriptPanel.cpp:L1274](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L1274) | | | `file` | function | SparkEditor | [PerformanceProfiler.cpp:L495](../../SparkEditor/Source/Profiler/PerformanceProfiler.cpp#L495) | | @@ -9952,8 +9972,8 @@ | `file` | function | SparkEngine | [TextureCompressor.cpp:L229](../../SparkEngine/Source/Graphics/TextureCompressor.cpp#L229) | | | `file` | function | SparkEngine | [TextureCompressor.cpp:L275](../../SparkEngine/Source/Graphics/TextureCompressor.cpp#L275) | | | `file` | function | SparkEngine | [TextureSystemLinuxTexture.cpp:L59](../../SparkEngine/Source/Graphics/TextureSystemLinuxTexture.cpp#L59) | | -| `file` | function | SparkEngine | [SceneManager.cpp:L311](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L311) | | -| `file` | function | SparkEngine | [SceneManager.cpp:L901](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L901) | | +| `file` | function | SparkEngine | [SceneManager.cpp:L345](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L345) | | +| `file` | function | SparkEngine | [SceneManager.cpp:L995](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L995) | | | `file` | function | SparkEngine | [ChromeTracing.h:L122](../../SparkEngine/Source/Utils/ChromeTracing.h#L122) | | | `file` | function | SparkEngine | [ConfigParser.h:L69](../../SparkEngine/Source/Utils/ConfigParser.h#L69) | | | `file` | function | SparkEngine | [ConfigParser.h:L152](../../SparkEngine/Source/Utils/ConfigParser.h#L152) | | @@ -9977,13 +9997,13 @@ | `file` | function | Tests | [TestDialogueSystem.cpp:L72](../../Tests/TestDialogueSystem.cpp#L72) | | | `file` | function | Tests | [TestDialogueSystem.cpp:L87](../../Tests/TestDialogueSystem.cpp#L87) | | | `file` | function | Tests | [TestENG220ObjImportReal.cpp:L66](../../Tests/TestENG220ObjImportReal.cpp#L66) | | -| `file` | function | Tests | [TestEditorCookPackageReal.cpp:L110](../../Tests/TestEditorCookPackageReal.cpp#L110) | | +| `file` | function | Tests | [TestEditorCookPackageReal.cpp:L112](../../Tests/TestEditorCookPackageReal.cpp#L112) | | | `file` | function | Tests | [TestEditorProjectMaterializationReal.cpp:L53](../../Tests/TestEditorProjectMaterializationReal.cpp#L53) | | | `file` | function | Tests | [TestEditorProjectMaterializationReal.cpp:L59](../../Tests/TestEditorProjectMaterializationReal.cpp#L59) | | | `file` | function | Tests | [TestEditorSubsystems.cpp:L1384](../../Tests/TestEditorSubsystems.cpp#L1384) | | | `file` | function | Tests | [TestEditorSubsystems.cpp:L2350](../../Tests/TestEditorSubsystems.cpp#L2350) | | | `file` | function | Tests | [TestEditorSubsystems.cpp:L2399](../../Tests/TestEditorSubsystems.cpp#L2399) | | -| `File` | function | Tests | [TestEditorSubsystemsReal.cpp:L61](../../Tests/TestEditorSubsystemsReal.cpp#L61) | | +| `File` | function | Tests | [TestEditorSubsystemsReal.cpp:L64](../../Tests/TestEditorSubsystemsReal.cpp#L64) | | | `file` | function | Tests | [TestEngineSettingsReal.cpp:L240](../../Tests/TestEngineSettingsReal.cpp#L240) | | | `file` | function | Tests | [TestEngineSettingsReal.cpp:L249](../../Tests/TestEngineSettingsReal.cpp#L249) | | | `file` | function | Tests | [TestEngineSettingsReal.cpp:L299](../../Tests/TestEngineSettingsReal.cpp#L299) | | @@ -10034,7 +10054,7 @@ | `file` | function | Tests | [TestSparkGameFPSLoopReal.cpp:L672](../../Tests/TestSparkGameFPSLoopReal.cpp#L672) | | | `file` | function | Tests | [TestSparkGameFPSLoopReal.cpp:L695](../../Tests/TestSparkGameFPSLoopReal.cpp#L695) | | | `file` | function | Tests | [TestSparkGameFPSLoopReal.cpp:L737](../../Tests/TestSparkGameFPSLoopReal.cpp#L737) | | -| `file` | function | Tests | [TestTF120Travel.cpp:L119](../../Tests/TestTF120Travel.cpp#L119) | | +| `file` | function | Tests | [TestTF120Travel.cpp:L106](../../Tests/TestTF120Travel.cpp#L106) | | | `FileContainsSubstring` | function | SparkEngine | [WineDetection.cpp:L51](../../SparkEngine/Source/Utils/WineDetection.cpp#L51) | | | `fileData` | function | SparkEngine | [OpenALAudioEngine.cpp:L596](../../SparkEngine/Source/Audio/OpenALAudioEngine.cpp#L596) | | | `fileData` | function | SparkEngine | [SaveSystem.cpp:L161](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.cpp#L161) | | @@ -10105,7 +10125,7 @@ | `Finalize` | function | Tests | [TestMovementSystem.cpp:L41](../../Tests/TestMovementSystem.cpp#L41) | | | `FinalizeDeviceCapabilities` | function | SparkEngine | [RHITypes.h:L395](../../SparkEngine/Source/Graphics/RHI/RHITypes.h#L395) | Normalizes capability state across backends. | | `FinalizeJob` | function | SparkEngine | [MovieRenderPipeline.h:L420](../../SparkEngine/Source/Engine/Rendering/MovieRenderPipeline.h#L420) | | -| `FinalPath` | function | SparkEngine | [SceneManager.cpp:L254](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L254) | | +| `FinalPath` | function | SparkEngine | [SceneManager.cpp:L278](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L278) | | | `finalPathBuffer` | function | SparkEditor | [ProjectManager.cpp:L393](../../SparkEditor/Source/Core/ProjectManager.cpp#L393) | | | `FinalPathOf` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L263](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L263) | | | `FinalPathOf` | function | SparkEngine | [HeldHandles.h:L65](../../SparkEngine/Source/Engine/Modding/HeldHandles.h#L65) | | @@ -10130,7 +10150,7 @@ | `FindAccount` | function | GameModules | [MMOAccountSystem.h:L133](../../GameModules/SparkGameMMO/Source/Account/MMOAccountSystem.h#L133) | | | `FindAccountByUsername` | function | GameModules | [TFDatabase.h:L266](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFDatabase.h#L266) | | | `FindAreaId` | function | GameModules | [MMOWorldSetup.h:L127](../../GameModules/SparkGameMMO/Source/World/MMOWorldSetup.h#L127) | | -| `FindAssetRoot` | function | GameModules | [FPSAssetPaths.cpp:L40](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L40) | | +| `FindAssetRoot` | function | GameModules | [FPSAssetPaths.cpp:L44](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L44) | | | `FindAssetRoot` | function | GameModules | [FPSAssetPaths.h:L35](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L35) | Pick the first search base that holds a usable asset tree. | | `FindBestPoint` | function | SparkEngine | [TacticalPointSystem.h:L136](../../SparkEngine/Source/Engine/AI/TacticalPointSystem.h#L136) | Find the single best tactical point matching a query. | | `FindBestPoint` | function | Tests | [TestTacticalPointSystem.cpp:L57](../../Tests/TestTacticalPointSystem.cpp#L57) | | @@ -10258,17 +10278,17 @@ | `FindNearestVehicle` | function | GameModules | [VehicleSystem.h:L327](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L327) | Find nearest vehicle to a position within range | | `FindNewCrashArtifactDirectory` | function | Tests | [TestCrashHandlerGatingReal.cpp:L232](../../Tests/TestCrashHandlerGatingReal.cpp#L232) | | | `FindNode` | function | SparkEngine | [VisualScriptEmitter.h:L98](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L98) | | -| `FindNode` | function | SparkEngine | [SceneManager.h:L315](../../SparkEngine/Source/SceneManager/SceneManager.h#L315) | Find the first node with the given name and return its index. | +| `FindNode` | function | SparkEngine | [SceneManager.h:L317](../../SparkEngine/Source/SceneManager/SceneManager.h#L317) | Find the first node with the given name and return its index. | | `FindNode` | function | Tests | [TestSceneManager.cpp:L149](../../Tests/TestSceneManager.cpp#L149) | | | `FindNode` | function | Tests | [TestVisualScriptCompiler.cpp:L128](../../Tests/TestVisualScriptCompiler.cpp#L128) | | | `FindNumberValue` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L108](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L108) | Extract a scalar numeric value for @p key. Returns false if absent or non-numeric. | | `FindObject` | function | SparkEditor | [SceneFile.h:L43](../../SparkEditor/Source/SceneSystem/SceneFile.h#L43) | Find object by ID | -| `FindObject` | function | Tests | [TestEditorSubsystemsReal.cpp:L377](../../Tests/TestEditorSubsystemsReal.cpp#L377) | | +| `FindObject` | function | Tests | [TestEditorSubsystemsReal.cpp:L400](../../Tests/TestEditorSubsystemsReal.cpp#L400) | | | `FindObjectsByName` | function | SparkEditor | [SceneFile.h:L50](../../SparkEditor/Source/SceneSystem/SceneFile.h#L50) | Find objects by name | | `FindOnlinePlayerByCharName` | function | GameModules | [TFOutfitSystem.h:L211](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L211) | | | `FindOrCreateDecl` | function | SparkEngine | [ParallelSystemExecutor.h:L256](../../SparkEngine/Source/Engine/ECS/Systems/ParallelSystemExecutor.h#L256) | | | `FindOrCreateLifecycleRecord` | function | SparkEngine | [ModuleManager.h:L393](../../SparkEngine/Source/Core/ModuleManager.h#L393) | Remove host registry callbacks before an image can be unmapped. | -| `FindOutsideString` | function | SparkEditor | [ProjectDocument.cpp:L302](../../SparkEditor/Source/Core/ProjectDocument.cpp#L302) | | +| `FindOutsideString` | function | SparkEditor | [ProjectDocument.cpp:L303](../../SparkEditor/Source/Core/ProjectDocument.cpp#L303) | | | `FindPackagedDefaultScene` | function | SparkEditor | [BuildPipeline.cpp:L593](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L593) | | | `FindParameter` | function | SparkEditor | [MaterialEditorPanel.h:L143](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L143) | Find a parameter by name. | | `FindParameter` | function | SparkEngine | [MaterialDefinition.h:L199](../../SparkEngine/Source/Graphics/MaterialDefinition.h#L199) | Find a parameter declaration by name. | @@ -10358,10 +10378,10 @@ | `Finish` | function | SparkCrashReporter | [CrashReporterApp.cpp:L151](../../SparkCrashReporter/src/CrashReporterApp.cpp#L151) | | | `Finish` | function | SparkCrashReporter | [CrashReporterApp.cpp:L163](../../SparkCrashReporter/src/CrashReporterApp.cpp#L163) | | | `Finish` | function | Tests | [GLTFSkinningReference.h:L103](../../Tests/GLTFSkinningReference.h#L103) | | -| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L220](../../Tests/TestEditorCookPackageReal.cpp#L220) | | -| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L234](../../Tests/TestEditorCookPackageReal.cpp#L234) | | -| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L243](../../Tests/TestEditorCookPackageReal.cpp#L243) | | -| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L250](../../Tests/TestEditorCookPackageReal.cpp#L250) | | +| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L231](../../Tests/TestEditorCookPackageReal.cpp#L231) | | +| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L245](../../Tests/TestEditorCookPackageReal.cpp#L245) | | +| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L254](../../Tests/TestEditorCookPackageReal.cpp#L254) | | +| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L261](../../Tests/TestEditorCookPackageReal.cpp#L261) | | | `FinishAclFixtureSetup` | function | Tests | [TestGatewaySecurity.cpp:L61](../../Tests/TestGatewaySecurity.cpp#L61) | | | `FinishAndPark` | function | Tests | [TestMOD380RacingCompleteRaceReal.cpp:L588](../../Tests/TestMOD380RacingCompleteRaceReal.cpp#L588) | | | `FinishConvergedRound` | function | Tests | [TestFPSLANLoopback.cpp:L351](../../Tests/TestFPSLANLoopback.cpp#L351) | | @@ -10374,7 +10394,7 @@ | `FinishLoad` | function | Tests | [TestAssetStallDetector.cpp:L120](../../Tests/TestAssetStallDetector.cpp#L120) | | | `FinishReload` | function | Templates | [GameModule.h:L816](../../Templates/FPSStarter/Source/GameModule.h#L816) | | | `FinishRun` | function | Tests | [TestMOD330ARPGDungeonReal.cpp:L105](../../Tests/TestMOD330ARPGDungeonReal.cpp#L105) | | -| `FinishSignalArtifact` | function | SparkEngine | [CrashHandler.cpp:L2324](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2324) | | +| `FinishSignalArtifact` | function | SparkEngine | [CrashHandler.cpp:L2362](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2362) | | | `FinishTutorial` | function | GameModules | [TFTutorial.h:L119](../../GameModules/SparkGameMMOFPS/Source/Game/TFTutorial.h#L119) | | | `FinishUnload` | function | SparkEngine | [DynamicPluginHost.h:L92](../../SparkEngine/Source/Core/DynamicPluginHost.h#L92) | | | `Finite` | function | GameModules | [RTSPersistenceValidation.cpp:L26](../../GameModules/SparkGameRTS/Source/Core/RTSPersistenceValidation.cpp#L26) | | @@ -10405,11 +10425,11 @@ | `first` | function | Tests | [TestEditorSubsystems.cpp:L831](../../Tests/TestEditorSubsystems.cpp#L831) | | | `first` | function | Tests | [TestGatewayAreaControl.cpp:L1186](../../Tests/TestGatewayAreaControl.cpp#L1186) | | | `first` | function | Tests | [TestServiceTopologyController.cpp:L206](../../Tests/TestServiceTopologyController.cpp#L206) | | -| `first` | function | Tests | [TestSparkPak.cpp:L677](../../Tests/TestSparkPak.cpp#L677) | | +| `first` | function | Tests | [TestSparkPak.cpp:L693](../../Tests/TestSparkPak.cpp#L693) | | | `first` | function | Tests | [Test_scripting_hardening.cpp:L324](../../Tests/harden/Test_scripting_hardening.cpp#L324) | | | `FirstDataOutput` | function | SparkEngine | [VisualScriptCodegen.cpp:L288](../../SparkEngine/Source/Engine/Scripting/VisualScriptCodegen.cpp#L288) | | | `FirstDataOutput` | function | SparkEngine | [VisualScriptEmitter.h:L80](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L80) | | -| `FirstDifference` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L69](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L69) | | +| `FirstDifference` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L70](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L70) | | | `FirstDivergence` | function | Tests | [TestMOD370SkirmishDeterminismReal.cpp:L131](../../Tests/TestMOD370SkirmishDeterminismReal.cpp#L131) | | | `FirstEntityName` | function | Tests | [TestSerializationHardening.cpp:L100](../../Tests/TestSerializationHardening.cpp#L100) | | | `firstInitializer` | function | Tests | [TestMemoryIntegrity.cpp:L471](../../Tests/TestMemoryIntegrity.cpp#L471) | | @@ -10457,7 +10477,7 @@ | `FixedUpdate` | function | GameModules | [TFVehicleTerminal.h:L43](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleTerminal.h#L43) | | | `FixedUpdate` | function | GameModules | [TFWeaponSystem.h:L48](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L48) | | | `FixedUpdate` | function | GameModules | [TFClientNet.h:L78](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L78) | | -| `FixedUpdate` | function | GameModules | [TFReplication.h:L61](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L61) | | +| `FixedUpdate` | function | GameModules | [TFReplication.h:L65](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L65) | | | `FixedUpdate` | function | GameModules | [TFServerSim.h:L62](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L62) | | | `FixedUpdate` | function | GameModules | [TFChatWindow.h:L47](../../GameModules/SparkGameMMOFPS/Source/UI/TFChatWindow.h#L47) | | | `FixedUpdate` | function | GameModules | [TFDeathRecap.h:L67](../../GameModules/SparkGameMMOFPS/Source/UI/TFDeathRecap.h#L67) | | @@ -10581,8 +10601,8 @@ | `FlushEvents` | function | SparkEngine | [Telemetry.h:L544](../../SparkEngine/Source/Utils/Telemetry.h#L544) | Flush all queued events to the registered backend. | | `FlushFileDurably` | function | SparkEngine | [ReflectedScenePersistence.cpp:L100](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L100) | | | `FlushFileDurably` | function | SparkEngine | [ReflectedScenePersistence.cpp:L188](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L188) | | -| `FlushFileDurably` | function | SparkEngine | [SceneManager.cpp:L76](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L76) | | -| `FlushFileDurably` | function | SparkEngine | [SceneManager.cpp:L184](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L184) | | +| `FlushFileDurably` | function | SparkEngine | [SceneManager.cpp:L80](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L80) | | +| `FlushFileDurably` | function | SparkEngine | [SceneManager.cpp:L198](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L198) | | | `FlushOutgoingQueue` | function | SparkEngine | [NetworkManager.h:L915](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L915) | | | `FlushPendingWorldEdit` | function | SparkEditor | [InspectorPanel.h:L181](../../SparkEditor/Source/Panels/InspectorPanel.h#L181) | | | `FlushPendingWrite` | function | SparkEngine | [ConsoleProcessManager.h:L137](../../SparkEngine/Source/Utils/ConsoleProcessManager.h#L137) | | @@ -10595,7 +10615,7 @@ | `FluxOf` | function | GameModules | [TFProgressionSystem.h:L104](../../GameModules/SparkGameMMOFPS/Source/Game/TFProgressionSystem.h#L104) | | | `FluxOnDisk` | function | Tests | [TestDATA120BackupRestore.cpp:L114](../../Tests/TestDATA120BackupRestore.cpp#L114) | | | `FNV1a` | function | SparkEngine | [AssetHandle.h:L66](../../SparkEngine/Source/Core/AssetHandle.h#L66) | | -| `FNV1a` | function | Tests | [TestSparkPak.cpp:L48](../../Tests/TestSparkPak.cpp#L48) | | +| `FNV1a` | function | Tests | [TestSparkPak.cpp:L54](../../Tests/TestSparkPak.cpp#L54) | | | `FNV1a32` | function | SparkEngine | [HashFNV1a.h:L191](../../SparkEngine/Source/Utils/HashFNV1a.h#L191) | | | `FNV1a64` | function | SparkEngine | [HashFNV1a.h:L178](../../SparkEngine/Source/Utils/HashFNV1a.h#L178) | | | `FnvHash` | function | Tests | [TestExtendedSystems.cpp:L32](../../Tests/TestExtendedSystems.cpp#L32) | | @@ -10702,7 +10722,7 @@ | `ForEachInAABB` | function | SparkEngine | [Octree.h:L144](../../SparkEngine/Source/Utils/Octree.h#L144) | Execute a callback for each object whose AABB intersects the query box. | | `ForEachInAABBRecursive` | function | SparkEngine | [Octree.h:L453](../../SparkEngine/Source/Utils/Octree.h#L453) | | | `ForEachRecipient` | function | GameModules | [TFPingSystem.h:L254](../../GameModules/SparkGameMMOFPS/Source/Game/TFPingSystem.h#L254) | | -| `ForEachRemotePawn` | function | GameModules | [TFReplication.h:L67](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L67) | | +| `ForEachRemotePawn` | function | GameModules | [TFReplication.h:L71](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L71) | | | `ForEachScoreRow` | function | GameModules | [TFMedalSystem.h:L203](../../GameModules/SparkGameMMOFPS/Source/Game/TFMedalSystem.h#L203) | | | `ForEachSetBit` | function | SparkEngine | [BitUtils.h:L101](../../SparkEngine/Source/Utils/BitUtils.h#L101) | Invoke a callable for each set bit index, LSB-first. | | `ForEachSetBit` | function | Tests | [TestBitUtils.cpp:L48](../../Tests/TestBitUtils.cpp#L48) | | @@ -10780,7 +10800,7 @@ | `FormatSize` | function | SparkEditor | [AssetAuditGraph.h:L475](../../SparkEditor/Source/Panels/AssetAuditGraph.h#L475) | | | `FormatSize` | function | SparkEngine | [GamePackager.h:L542](../../SparkEngine/Source/Engine/Build/GamePackager.h#L542) | | | `FormatSymbolicCrashFrames` | function | SparkEngine | [CrashSymbolication.h:L212](../../SparkEngine/Source/Utils/CrashSymbolication.h#L212) | | -| `FormatSymbolicSection` | function | SparkEngine | [CrashHandler.cpp:L1986](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1986) | | +| `FormatSymbolicSection` | function | SparkEngine | [CrashHandler.cpp:L1988](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1988) | | | `FormatTimestamp` | function | SparkEditor | [ConsolePanel.cpp:L349](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L349) | | | `FormatTimestamp` | function | SparkEditor | [ConsolePanel.cpp:L357](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L357) | | | `FormatTimestamp` | function | SparkEditor | [ConsolePanel.cpp:L362](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L362) | | @@ -10944,7 +10964,7 @@ | `FreshResidencyDb` | function | Tests | [TestTF120Residency.cpp:L42](../../Tests/TestTF120Residency.cpp#L42) | | | `FreshSequence` | function | Tests | [TestSequencerAudioWiring.cpp:L70](../../Tests/TestSequencerAudioWiring.cpp#L70) | | | `FreshSharedDb` | function | Tests | [TestTF120SharedSaveRoot.cpp:L38](../../Tests/TestTF120SharedSaveRoot.cpp#L38) | | -| `FreshTravelDb` | function | Tests | [TestTF120Travel.cpp:L284](../../Tests/TestTF120Travel.cpp#L284) | | +| `FreshTravelDb` | function | Tests | [TestTF120Travel.cpp:L271](../../Tests/TestTF120Travel.cpp#L271) | | | `Friends` | function | GameModules | [TFSocialSystem.h:L98](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L98) | | | `From` | function | GameModules | [TFFireFxProtocol.h:L105](../../GameModules/SparkGameMMOFPS/Source/Net/TFFireFxProtocol.h#L105) | | | `From` | function | GameModules | [TFFireFxProtocol.h:L165](../../GameModules/SparkGameMMOFPS/Source/Net/TFFireFxProtocol.h#L165) | | @@ -11010,7 +11030,9 @@ | `fs::exists` | method | SparkInstaller | [Installer.cpp:L170](../../SparkInstaller/src/Installer.cpp#L170) | | | `fs::exists` | method | SparkInstaller | [InstallerPreflight.cpp:L35](../../SparkInstaller/src/InstallerPreflight.cpp#L35) | | | `fs::exists` | method | Tests | [TestAdvancedAssetPipeline.cpp:L105](../../Tests/TestAdvancedAssetPipeline.cpp#L105) | | -| `fs::exists` | method | Tests | [TestTFDataTables.cpp:L77](../../Tests/TestTFDataTables.cpp#L77) | | +| `fs::exists` | method | Tests | [TestTF120Travel.cpp:L82](../../Tests/TestTF120Travel.cpp#L82) | | +| `fs::exists` | method | Tests | [TestTFDataTables.cpp:L48](../../Tests/TestTFDataTables.cpp#L48) | | +| `fs::exists` | method | Tests | [TestTFDataTables.cpp:L68](../../Tests/TestTFDataTables.cpp#L68) | | | `fs::is_directory` | method | SparkEngine | [FileUtils.h:L339](../../SparkEngine/Source/Utils/FileUtils.h#L339) | | | `fs::is_directory` | method | Tests | [TestAssetManifestReal.cpp:L331](../../Tests/TestAssetManifestReal.cpp#L331) | | | `fs::is_regular_file` | method | SparkBuild | [PathSecurity.cpp:L74](../../SparkBuild/src/PathSecurity.cpp#L74) | | @@ -11025,7 +11047,7 @@ | `fs::path` | method | SparkEditor | [ProjectManager.cpp:L170](../../SparkEditor/Source/Core/ProjectManager.cpp#L170) | | | `fs::path` | method | SparkEditor | [ProjectManager.cpp:L190](../../SparkEditor/Source/Core/ProjectManager.cpp#L190) | | | `fs::path` | method | SparkEditor | [ProjectManager.cpp:L192](../../SparkEditor/Source/Core/ProjectManager.cpp#L192) | | -| `fs::path` | method | SparkEditor | [AssetBrowserPanel.cpp:L49](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L49) | | +| `fs::path` | method | SparkEditor | [AssetBrowserPathUtils.h:L29](../../SparkEditor/Source/Panels/AssetBrowserPathUtils.h#L29) | | | `fs::path` | method | SparkEditor | [BasicMaterialEditorDrawing.cpp:L35](../../SparkEditor/Source/Panels/BasicMaterialEditorDrawing.cpp#L35) | | | `fs::path` | method | SparkEditor | [BasicMaterialEditorPanel.cpp:L48](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L48) | | | `fs::path` | method | SparkEditor | [BuildPipeline.cpp:L76](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L76) | | @@ -11111,7 +11133,7 @@ | `FxaaReference` | function | Tests | [TestRHI210D3D11PassGoldenReal.cpp:L227](../../Tests/TestRHI210D3D11PassGoldenReal.cpp#L227) | | | `g_deltaSmoother` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L49](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L49) | | | `g_real_syscall` | function | tools | [gvisor-wine-shim.c:L917](../../tools/gvisor-wine-shim.c#L917) | | -| `g_rtlDllShutdownInProgress` | function | SparkEngine | [CrashHandler.cpp:L858](../../SparkEngine/Source/Utils/CrashHandler.cpp#L858) | | +| `g_rtlDllShutdownInProgress` | function | SparkEngine | [CrashHandler.cpp:L859](../../SparkEngine/Source/Utils/CrashHandler.cpp#L859) | | | `GainExperience` | function | GameModules | [ARPGHeroSystem.h:L94](../../GameModules/SparkGameARPG/Source/Hero/ARPGHeroSystem.h#L94) | | | `Game` | function | SparkEngine | [EngineSettings.h:L925](../../SparkEngine/Source/Core/EngineSettings.h#L925) | | | `Game` | function | SparkEngine | [EngineSettings.h:L926](../../SparkEngine/Source/Core/EngineSettings.h#L926) | | @@ -11119,69 +11141,72 @@ | `Game::ApplyCameraSettings` | method | GameModules | [GameConsoleOps.cpp:L79](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L79) | | | `Game::ApplyDebugSettings` | method | GameModules | [GameConsoleOps.cpp:L102](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L102) | | | `Game::ApplyGraphicsSettings` | method | GameModules | [GameConsoleOps.cpp:L321](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L321) | | -| `Game::ApplyLocalProfile` | method | GameModules | [GameEngineSystems.cpp:L328](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L328) | | +| `Game::ApplyLocalProfile` | method | GameModules | [GameEngineSystems.cpp:L336](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L336) | | | `Game::ApplyPhysicsSettings` | method | GameModules | [GameConsoleOps.cpp:L52](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L52) | | -| `Game::BindSceneMaterialRoots` | method | GameModules | [Game.cpp:L381](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L381) | | -| `Game::CaptureLocalProfile` | method | GameModules | [GameEngineSystems.cpp:L299](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L299) | | +| `Game::BeginInputObservation` | method | GameModules | [GameEngineSystems.cpp:L521](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L521) | | +| `Game::BindSceneMaterialRoots` | method | GameModules | [Game.cpp:L397](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L397) | | +| `Game::CaptureLocalProfile` | method | GameModules | [GameEngineSystems.cpp:L307](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L307) | | | `Game::ClearScene` | method | GameModules | [GameConsoleOps.cpp:L276](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L276) | | -| `Game::ConnectToServer` | method | GameModules | [GameConsoleOps.cpp:L1048](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1048) | | -| `Game::CreateCombatArena` | method | GameModules | [GameConsoleOps.cpp:L751](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L751) | | -| `Game::CreateTestObjects` | method | GameModules | [Game.cpp:L980](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L980) | | -| `Game::CreateTestScene` | method | GameModules | [GameConsoleOps.cpp:L920](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L920) | | -| `Game::CycleNextClass` | method | GameModules | [GameConsoleOps.cpp:L670](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L670) | | -| `Game::CyclePrevClass` | method | GameModules | [GameConsoleOps.cpp:L677](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L677) | | +| `Game::ConnectToServer` | method | GameModules | [GameConsoleOps.cpp:L1056](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1056) | | +| `Game::CreateCombatArena` | method | GameModules | [GameConsoleOps.cpp:L759](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L759) | | +| `Game::CreateTestObjects` | method | GameModules | [Game.cpp:L1107](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L1107) | | +| `Game::CreateTestScene` | method | GameModules | [GameConsoleOps.cpp:L928](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L928) | | +| `Game::CycleNextClass` | method | GameModules | [GameConsoleOps.cpp:L678](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L678) | | +| `Game::CyclePrevClass` | method | GameModules | [GameConsoleOps.cpp:L685](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L685) | | | `Game::DeleteObject` | method | GameModules | [GameConsoleOps.cpp:L258](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L258) | | -| `Game::DisconnectNetwork` | method | GameModules | [GameConsoleOps.cpp:L1066](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1066) | | +| `Game::DisconnectNetwork` | method | GameModules | [GameConsoleOps.cpp:L1074](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1074) | | +| `Game::EndInputObservation` | method | GameModules | [GameEngineSystems.cpp:L610](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L610) | | | `Game::GetAliveEnemyCount` | method | GameModules | [GameSetup.cpp:L368](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L368) | | -| `Game::GetAvailableScenes` | method | GameModules | [GameConsoleOps.cpp:L592](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L592) | | +| `Game::GetAvailableScenes` | method | GameModules | [GameConsoleOps.cpp:L600](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L600) | | | `Game::GetGraphicsPerformance` | method | GameModules | [GameConsoleOps.cpp:L350](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L350) | | -| `Game::GetNetworkStats` | method | GameModules | [GameConsoleOps.cpp:L1134](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1134) | | -| `Game::GetNetworkStatus` | method | GameModules | [GameConsoleOps.cpp:L1126](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1126) | | +| `Game::GetNetworkStats` | method | GameModules | [GameConsoleOps.cpp:L1142](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1142) | | +| `Game::GetNetworkStatus` | method | GameModules | [GameConsoleOps.cpp:L1134](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1134) | | | `Game::GetPerformanceStats` | method | GameModules | [GameConsoleOps.cpp:L122](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L122) | | -| `Game::GetPlayerClass` | method | GameModules | [GameConsoleOps.cpp:L663](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L663) | | +| `Game::GetPlayerClass` | method | GameModules | [GameConsoleOps.cpp:L671](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L671) | | | `Game::GetStatusString` | method | GameModules | [GameDebugUI.cpp:L65](../../GameModules/SparkGameFPS/Source/Game/GameDebugUI.cpp#L65) | | -| `Game::HandleInput` | method | GameModules | [Game.cpp:L893](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L893) | | -| `Game::Initialize` | method | GameModules | [Game.cpp:L78](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L78) | | +| `Game::HandleInput` | method | GameModules | [Game.cpp:L985](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L985) | | +| `Game::Initialize` | method | GameModules | [Game.cpp:L80](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L80) | | | `Game::InitializeEnemies` | method | GameModules | [GameSetup.cpp:L379](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L379) | | -| `Game::InitializeEngineSystems` | method | GameModules | [GameEngineSystems.cpp:L55](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L55) | | +| `Game::InitializeEngineSystems` | method | GameModules | [GameEngineSystems.cpp:L63](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L63) | | | `Game::InitializeGameModeAndHUD` | method | GameModules | [GameSetup.cpp:L163](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L163) | | | `Game::InitializeGameplaySystems` | method | GameModules | [GameSetup.cpp:L424](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L424) | | | `Game::InitializeInteractionObjects` | method | GameModules | [GameSetup.cpp:L45](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L45) | | | `Game::InitializeInventorySystem` | method | GameModules | [GameSetup.cpp:L257](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L257) | | | `Game::InitializeQuestSystem` | method | GameModules | [GameSetup.cpp:L305](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L305) | | | `Game::InitializeRespawnAndVehicles` | method | GameModules | [GameSetup.cpp:L110](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L110) | | -| `Game::InvalidateSceneBasicMaterials` | method | GameModules | [Game.cpp:L408](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L408) | | -| `Game::IsNetworkActive` | method | GameModules | [GameConsoleOps.cpp:L1121](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1121) | | -| `Game::LoadScene` | method | GameModules | [GameConsoleOps.cpp:L468](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L468) | | -| `Game::LogSceneIdentity` | method | GameModules | [Game.cpp:L354](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L354) | | +| `Game::InvalidateSceneBasicMaterials` | method | GameModules | [Game.cpp:L430](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L430) | | +| `Game::IsNetworkActive` | method | GameModules | [GameConsoleOps.cpp:L1129](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1129) | | +| `Game::LoadScene` | method | GameModules | [GameConsoleOps.cpp:L476](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L476) | | +| `Game::LogSceneIdentity` | method | GameModules | [Game.cpp:L370](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L370) | | | `Game::ParseAuthoredFiniteFloat` | method | GameModules | [Game.cpp:L50](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L50) | | -| `Game::PlayerEnterNearestVehicle` | method | GameModules | [GameConsoleOps.cpp:L998](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L998) | | -| `Game::PlayerExitVehicle` | method | GameModules | [GameConsoleOps.cpp:L1015](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1015) | | -| `Game::QuickLoadProfile` | method | GameModules | [GameEngineSystems.cpp:L412](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L412) | | -| `Game::QuickSaveProfile` | method | GameModules | [GameEngineSystems.cpp:L368](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L368) | | +| `Game::PlayerEnterNearestVehicle` | method | GameModules | [GameConsoleOps.cpp:L1006](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1006) | | +| `Game::PlayerExitVehicle` | method | GameModules | [GameConsoleOps.cpp:L1023](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1023) | | +| `Game::QuickLoadProfile` | method | GameModules | [GameEngineSystems.cpp:L429](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L429) | | +| `Game::QuickSaveProfile` | method | GameModules | [GameEngineSystems.cpp:L380](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L380) | | +| `Game::RecordInputObservation` | method | GameModules | [GameEngineSystems.cpp:L563](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L563) | | | `Game::RefreshAuthoredSceneRuntimeState` | method | GameModules | [GameConsoleOps.cpp:L399](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L399) | | | `Game::RefreshGraphicsSettings` | method | GameModules | [GameConsoleOps.cpp:L372](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L372) | | -| `Game::Render` | method | GameModules | [Game.cpp:L771](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L771) | | +| `Game::Render` | method | GameModules | [Game.cpp:L855](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L855) | | | `Game::RenderDebugUI` | method | GameModules | [GameDebugUI.cpp:L172](../../GameModules/SparkGameFPS/Source/Game/GameDebugUI.cpp#L172) | | -| `Game::SaveScene` | method | GameModules | [GameConsoleOps.cpp:L542](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L542) | | +| `Game::SaveScene` | method | GameModules | [GameConsoleOps.cpp:L550](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L550) | | | `Game::SetArenaAutopilot` | method | GameModules | [GameDebugUI.cpp:L122](../../GameModules/SparkGameFPS/Source/Game/GameDebugUI.cpp#L122) | | -| `Game::SetEngineContext` | method | GameModules | [GameEngineSystems.cpp:L38](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L38) | | -| `Game::SetEventBus` | method | GameModules | [Game.cpp:L504](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L504) | | -| `Game::SetPhysicsSystem` | method | GameModules | [Game.cpp:L492](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L492) | | -| `Game::SetPlayerClass` | method | GameModules | [GameConsoleOps.cpp:L644](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L644) | | +| `Game::SetEngineContext` | method | GameModules | [GameEngineSystems.cpp:L46](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L46) | | +| `Game::SetEventBus` | method | GameModules | [Game.cpp:L543](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L543) | | +| `Game::SetPhysicsSystem` | method | GameModules | [Game.cpp:L527](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L527) | | +| `Game::SetPlayerClass` | method | GameModules | [GameConsoleOps.cpp:L652](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L652) | | | `Game::SetTimeScale` | method | GameModules | [GameConsoleOps.cpp:L296](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L296) | | -| `Game::Shutdown` | method | GameModules | [Game.cpp:L438](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L438) | | +| `Game::Shutdown` | method | GameModules | [Game.cpp:L470](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L470) | | | `Game::SpawnEnemy` | method | GameModules | [GameSetup.cpp:L345](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L345) | | | `Game::SpawnObject` | method | GameModules | [GameConsoleOps.cpp:L204](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L204) | | -| `Game::SpawnVehicle` | method | GameModules | [GameConsoleOps.cpp:L979](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L979) | | -| `Game::StartServer` | method | GameModules | [GameConsoleOps.cpp:L1028](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1028) | | +| `Game::SpawnVehicle` | method | GameModules | [GameConsoleOps.cpp:L987](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L987) | | +| `Game::StartServer` | method | GameModules | [GameConsoleOps.cpp:L1036](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1036) | | | `Game::StartWaves` | method | GameModules | [GameSetup.cpp:L525](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L525) | | | `Game::TeleportPlayer` | method | GameModules | [GameConsoleOps.cpp:L180](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L180) | | -| `Game::Update` | method | GameModules | [Game.cpp:L617](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L617) | | +| `Game::Update` | method | GameModules | [Game.cpp:L666](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L666) | | | `Game::UpdateArenaAutopilot` | method | GameModules | [GameDebugUI.cpp:L139](../../GameModules/SparkGameFPS/Source/Game/GameDebugUI.cpp#L139) | | -| `Game::UpdateCamera` | method | GameModules | [Game.cpp:L872](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L872) | | -| `Game::UpdateGameObjects` | method | GameModules | [Game.cpp:L881](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L881) | | -| `Game::UpdateMultiplayer` | method | GameModules | [GameConsoleOps.cpp:L1077](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1077) | | +| `Game::UpdateCamera` | method | GameModules | [Game.cpp:L958](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L958) | | +| `Game::UpdateGameObjects` | method | GameModules | [Game.cpp:L969](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L969) | | +| `Game::UpdateMultiplayer` | method | GameModules | [GameConsoleOps.cpp:L1085](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1085) | | | `GameCoroutine` | function | SparkEngine | [CoroutineTypes.h:L212](../../SparkEngine/Source/Engine/Coroutine/CoroutineTypes.h#L212) | | | `gameKind` | function | Tests | [TestModuleABI.cpp:L338](../../Tests/TestModuleABI.cpp#L338) | | | `gameKind` | function | Tests | [TestSparkServerApplication.cpp:L120](../../Tests/TestSparkServerApplication.cpp#L120) | | @@ -11518,7 +11543,7 @@ | `Get` | function | GameModules | [OWGatheringSystem.h:L66](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.h#L66) | Player resource inventory (raw material counts) | | `Get` | function | SparkCrashReporter | [CrashReporterApp.cpp:L715](../../SparkCrashReporter/src/CrashReporterApp.cpp#L715) | | | `Get` | function | SparkEngine | [AssetIntegration.h:L118](../../SparkEngine/Source/Core/AssetIntegration.h#L118) | Retrieve a loaded asset by handle. | -| `Get` | function | SparkEngine | [EngineContext.h:L106](../../SparkEngine/Source/Core/EngineContext.h#L106) | Global accessor for the singleton EngineContext instance | +| `Get` | function | SparkEngine | [EngineContext.h:L107](../../SparkEngine/Source/Core/EngineContext.h#L107) | Global accessor for the singleton EngineContext instance | | `Get` | function | SparkEngine | [LifecycleCompositionRoot.h:L70](../../SparkEngine/Source/Core/Lifecycle/LifecycleCompositionRoot.h#L70) | The process-wide root built from the production engine stages. | | `Get` | function | SparkEngine | [NonNull.h:L64](../../SparkEngine/Source/Core/NonNull.h#L64) | | | `Get` | function | SparkEngine | [PlatformD3DStubs.h:L115](../../SparkEngine/Source/Core/PlatformD3DStubs.h#L115) | | @@ -11555,10 +11580,10 @@ | `Get` | function | Tests | [TestTemporalEffects.cpp:L116](../../Tests/TestTemporalEffects.cpp#L116) | | | `get_return_object` | function | SparkEngine | [CoroutineTypes.h:L190](../../SparkEngine/Source/Engine/Coroutine/CoroutineTypes.h#L190) | | | `GetAbilities` | function | GameModules | [PlatformerPlayerController.h:L118](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L118) | Unlocked abilities | -| `GetAbilities` | function | SparkEngine | [EngineContext.h:L220](../../SparkEngine/Source/Core/EngineContext.h#L220) | | | `GetAbilities` | function | SparkEngine | [EngineContext.h:L221](../../SparkEngine/Source/Core/EngineContext.h#L221) | | -| `GetAbilities` | function | SparkSDK | [IEngineContext.h:L258](../../SparkSDK/Include/Spark/IEngineContext.h#L258) | Get the ability system (spells, auras, procs) | +| `GetAbilities` | function | SparkEngine | [EngineContext.h:L222](../../SparkEngine/Source/Core/EngineContext.h#L222) | | | `GetAbilities` | function | SparkSDK | [IEngineContext.h:L259](../../SparkSDK/Include/Spark/IEngineContext.h#L259) | Get the ability system (spells, auras, procs) | +| `GetAbilities` | function | SparkSDK | [IEngineContext.h:L260](../../SparkSDK/Include/Spark/IEngineContext.h#L260) | Get the ability system (spells, auras, procs) | | `GetAbilities` | function | Tests | [TestGameModulePlatformerARPG.cpp:L322](../../Tests/TestGameModulePlatformerARPG.cpp#L322) | | | `GetAbilities` | function | Tests | [TestGameModulePlatformerARPG.cpp:L326](../../Tests/TestGameModulePlatformerARPG.cpp#L326) | | | `GetAbility` | function | Tests | [TestAbilitySystem.cpp:L118](../../Tests/TestAbilitySystem.cpp#L118) | | @@ -11665,10 +11690,10 @@ | `GetAffectedAssets` | function | SparkEditor | [AdvancedAssetPipeline.h:L216](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L216) | Get all assets that would be affected by changing an asset | | `GetAffixPoolSize` | function | GameModules | [ARPGLootSystem.h:L65](../../GameModules/SparkGameARPG/Source/Loot/ARPGLootSystem.h#L65) | | | `GetAgentCount` | function | SparkEngine | [CollisionAvoidance.h:L154](../../SparkEngine/Source/Engine/AI/CollisionAvoidance.h#L154) | Get the number of registered agents. | -| `GetAI` | function | SparkEngine | [EngineContext.h:L168](../../SparkEngine/Source/Core/EngineContext.h#L168) | | | `GetAI` | function | SparkEngine | [EngineContext.h:L169](../../SparkEngine/Source/Core/EngineContext.h#L169) | | -| `GetAI` | function | SparkSDK | [IEngineContext.h:L163](../../SparkSDK/Include/Spark/IEngineContext.h#L163) | Get the AI system (owned by AIIntegratedSystem; registered by the gameplay lifecycle) | +| `GetAI` | function | SparkEngine | [EngineContext.h:L170](../../SparkEngine/Source/Core/EngineContext.h#L170) | | | `GetAI` | function | SparkSDK | [IEngineContext.h:L164](../../SparkSDK/Include/Spark/IEngineContext.h#L164) | Get the AI system (owned by AIIntegratedSystem; registered by the gameplay lifecycle) | +| `GetAI` | function | SparkSDK | [IEngineContext.h:L165](../../SparkSDK/Include/Spark/IEngineContext.h#L165) | Get the AI system (owned by AIIntegratedSystem; registered by the gameplay lifecycle) | | `GetAI` | function | Tests | [TestMOD370SkirmishDeterminismReal.cpp:L677](../../Tests/TestMOD370SkirmishDeterminismReal.cpp#L677) | | | `GetAI` | function | Tests | [TestMOD370SkirmishDeterminismReal.cpp:L678](../../Tests/TestMOD370SkirmishDeterminismReal.cpp#L678) | | | `GetAISystem` | function | SparkEngine | [AIIntegration.h:L239](../../SparkEngine/Source/Engine/AI/AIIntegration.h#L239) | | @@ -11731,10 +11756,10 @@ | `GetAngleSteps` | function | SparkEngine | [FoliageImpostorBaker.h:L305](../../SparkEngine/Source/Graphics/FoliageImpostorBaker.h#L305) | Angle steps per species used for the most recent bake. | | `GetAngularVelocity` | function | SparkEngine | [JoltPhysicsInterface.h:L293](../../SparkEngine/Source/Engine/Physics/JoltPhysicsInterface.h#L293) | | | `GetAngularVelocity` | function | SparkEngine | [PhysicsBody.h:L86](../../SparkEngine/Source/Physics/PhysicsBody.h#L86) | | -| `GetAnimation` | function | SparkEngine | [EngineContext.h:L160](../../SparkEngine/Source/Core/EngineContext.h#L160) | | -| `GetAnimation` | function | SparkEngine | [EngineContext.h:L164](../../SparkEngine/Source/Core/EngineContext.h#L164) | | -| `GetAnimation` | function | SparkSDK | [IEngineContext.h:L159](../../SparkSDK/Include/Spark/IEngineContext.h#L159) | Get the animation system (the engine's AnimationManager; registered by the gameplay lifecycle) | +| `GetAnimation` | function | SparkEngine | [EngineContext.h:L161](../../SparkEngine/Source/Core/EngineContext.h#L161) | | +| `GetAnimation` | function | SparkEngine | [EngineContext.h:L165](../../SparkEngine/Source/Core/EngineContext.h#L165) | | | `GetAnimation` | function | SparkSDK | [IEngineContext.h:L160](../../SparkSDK/Include/Spark/IEngineContext.h#L160) | Get the animation system (the engine's AnimationManager; registered by the gameplay lifecycle) | +| `GetAnimation` | function | SparkSDK | [IEngineContext.h:L161](../../SparkSDK/Include/Spark/IEngineContext.h#L161) | Get the animation system (the engine's AnimationManager; registered by the gameplay lifecycle) | | `GetAnimation` | function | Tests | [TestGameModulePlatformerARPG.cpp:L306](../../Tests/TestGameModulePlatformerARPG.cpp#L306) | | | `GetAnimation` | function | Tests | [TestGameModulePlatformerARPG.cpp:L310](../../Tests/TestGameModulePlatformerARPG.cpp#L310) | | | `GetAOBuffer` | function | SparkEngine | [GTAOEffect.h:L363](../../SparkEngine/Source/Graphics/GTAOEffect.h#L363) | Get the raw (non-denoised) AO buffer | @@ -11759,10 +11784,10 @@ | `GetAreas` | function | GameModules | [RPGWorldSetup.h:L69](../../GameModules/SparkGameRPG/Source/World/RPGWorldSetup.h#L69) | | | `GetAreaState` | function | SparkEngine | [SeamlessAreaManager.h:L140](../../SparkEngine/Source/Engine/Streaming/SeamlessAreaManager.h#L140) | | | `GetAreaState` | function | Tests | [TestSeamlessAreaManager.cpp:L110](../../Tests/TestSeamlessAreaManager.cpp#L110) | | -| `GetAreaStreaming` | function | SparkEngine | [EngineContext.h:L256](../../SparkEngine/Source/Core/EngineContext.h#L256) | | -| `GetAreaStreaming` | function | SparkEngine | [EngineContext.h:L260](../../SparkEngine/Source/Core/EngineContext.h#L260) | | -| `GetAreaStreaming` | function | SparkSDK | [IEngineContext.h:L290](../../SparkSDK/Include/Spark/IEngineContext.h#L290) | Get the seamless area streaming manager | +| `GetAreaStreaming` | function | SparkEngine | [EngineContext.h:L257](../../SparkEngine/Source/Core/EngineContext.h#L257) | | +| `GetAreaStreaming` | function | SparkEngine | [EngineContext.h:L261](../../SparkEngine/Source/Core/EngineContext.h#L261) | | | `GetAreaStreaming` | function | SparkSDK | [IEngineContext.h:L291](../../SparkSDK/Include/Spark/IEngineContext.h#L291) | Get the seamless area streaming manager | +| `GetAreaStreaming` | function | SparkSDK | [IEngineContext.h:L292](../../SparkSDK/Include/Spark/IEngineContext.h#L292) | Get the seamless area streaming manager | | `GetAreaStreaming` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L437](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L437) | | | `GetAreaStreaming` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L441](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L441) | | | `GetAreaStreaming` | function | Tests | [TestOpenWorldModule.cpp:L280](../../Tests/TestOpenWorldModule.cpp#L280) | | @@ -11784,15 +11809,15 @@ | `GetAssetLoader` | function | SparkEngine | [SeamlessAreaManager.h:L154](../../SparkEngine/Source/Engine/Streaming/SeamlessAreaManager.h#L154) | Get the area asset loader (for diagnostics or direct access) | | `GetAssetMetadata` | function | SparkEditor | [AdvancedAssetPipeline.h:L326](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L326) | Get asset metadata | | `GetAssetMetadata` | function | SparkEngine | [AssetPipeline.h:L480](../../SparkEngine/Source/Graphics/AssetPipeline.h#L480) | | -| `GetAssetPipeline` | function | SparkEngine | [EngineContext.h:L191](../../SparkEngine/Source/Core/EngineContext.h#L191) | | +| `GetAssetPipeline` | function | SparkEngine | [EngineContext.h:L192](../../SparkEngine/Source/Core/EngineContext.h#L192) | | | `GetAssetPipeline` | function | SparkEngine | [GraphicsEngine.h:L379](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L379) | | -| `GetAssetPipeline` | function | SparkSDK | [IEngineContext.h:L205](../../SparkSDK/Include/Spark/IEngineContext.h#L205) | Get the asset pipeline for model/texture/audio loading | | `GetAssetPipeline` | function | SparkSDK | [IEngineContext.h:L206](../../SparkSDK/Include/Spark/IEngineContext.h#L206) | Get the asset pipeline for model/texture/audio loading | -| `GetAssetRegistry` | function | SparkEngine | [EngineContext.h:L201](../../SparkEngine/Source/Core/EngineContext.h#L201) | | +| `GetAssetPipeline` | function | SparkSDK | [IEngineContext.h:L207](../../SparkSDK/Include/Spark/IEngineContext.h#L207) | Get the asset pipeline for model/texture/audio loading | | `GetAssetRegistry` | function | SparkEngine | [EngineContext.h:L202](../../SparkEngine/Source/Core/EngineContext.h#L202) | | -| `GetAssetRegistry` | function | SparkSDK | [IEngineContext.h:L217](../../SparkSDK/Include/Spark/IEngineContext.h#L217) | Get the asset registry for handle-based asset lookups | +| `GetAssetRegistry` | function | SparkEngine | [EngineContext.h:L203](../../SparkEngine/Source/Core/EngineContext.h#L203) | | | `GetAssetRegistry` | function | SparkSDK | [IEngineContext.h:L218](../../SparkSDK/Include/Spark/IEngineContext.h#L218) | Get the asset registry for handle-based asset lookups | -| `GetAssets` | function | SparkEditor | [AssetBrowserPanel.h:L100](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L100) | Wire live basic-path cache invalidation after an import. | +| `GetAssetRegistry` | function | SparkSDK | [IEngineContext.h:L219](../../SparkSDK/Include/Spark/IEngineContext.h#L219) | Get the asset registry for handle-based asset lookups | +| `GetAssets` | function | SparkEditor | [AssetBrowserPanel.h:L110](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L110) | Wire live basic-path cache invalidation after an import. | | `GetAssetScanError` | function | SparkEditor | [SearchPanel.h:L108](../../SparkEditor/Source/Panels/SearchPanel.h#L108) | Message describing the last asset-scan failure, empty when the scan was clean. | | `GetAssetsExceedingBudget` | function | Tests | [TestAssetDependencyGraph.cpp:L101](../../Tests/TestAssetDependencyGraph.cpp#L101) | | | `GetAssetType` | function | SparkEditor | [AdvancedAssetPipeline.h:L59](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L59) | Get asset type this processor handles | @@ -11810,10 +11835,10 @@ | `GetAttempts` | function | Tests | [TestSelfRecovery.cpp:L216](../../Tests/TestSelfRecovery.cpp#L216) | | | `GetAttenuation` | function | SparkEngine | [LightingSystem.h:L118](../../SparkEngine/Source/Graphics/LightingSystem.h#L118) | | | `GetAuctionListString` | function | GameModules | [MMOTradingSystem.h:L108](../../GameModules/SparkGameMMO/Source/Trading/MMOTradingSystem.h#L108) | | -| `GetAudio` | function | SparkEngine | [EngineContext.h:L155](../../SparkEngine/Source/Core/EngineContext.h#L155) | | | `GetAudio` | function | SparkEngine | [EngineContext.h:L156](../../SparkEngine/Source/Core/EngineContext.h#L156) | | -| `GetAudio` | function | SparkSDK | [IEngineContext.h:L151](../../SparkSDK/Include/Spark/IEngineContext.h#L151) | Get the audio engine | +| `GetAudio` | function | SparkEngine | [EngineContext.h:L157](../../SparkEngine/Source/Core/EngineContext.h#L157) | | | `GetAudio` | function | SparkSDK | [IEngineContext.h:L152](../../SparkSDK/Include/Spark/IEngineContext.h#L152) | Get the audio engine | +| `GetAudio` | function | SparkSDK | [IEngineContext.h:L153](../../SparkSDK/Include/Spark/IEngineContext.h#L153) | Get the audio engine | | `GetAudio` | function | Tests | [module_logging_context.h:L40](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L40) | | | `GetAudio` | function | Tests | [module_logging_context.h:L41](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L41) | | | `GetAudio` | function | Tests | [TestGameModuleMMO.cpp:L73](../../Tests/TestGameModuleMMO.cpp#L73) | | @@ -11869,7 +11894,7 @@ | `GetAvailableRecipes` | function | GameModules | [MMOCraftingSystem.h:L87](../../GameModules/SparkGameMMO/Source/Crafting/MMOCraftingSystem.h#L87) | | | `GetAvailableRewards` | function | GameModules | [MMOReputationSystem.h:L82](../../GameModules/SparkGameMMO/Source/Reputation/MMOReputationSystem.h#L82) | | | `GetAvailableScenes` | function | GameModules | [Game.h:L557](../../GameModules/SparkGameFPS/Source/Game/Game.h#L557) | Get list of available scenes | -| `GetAvailableScenes` | function | SparkEngine | [SceneManager.h:L418](../../SparkEngine/Source/SceneManager/SceneManager.h#L418) | Enumerate all scene files found in a directory. | +| `GetAvailableScenes` | function | SparkEngine | [SceneManager.h:L420](../../SparkEngine/Source/SceneManager/SceneManager.h#L420) | Enumerate all scene files found in a directory. | | `GetAvailableSkills` | function | GameModules | [ARPGSkillSystem.h:L66](../../GameModules/SparkGameARPG/Source/Skill/ARPGSkillSystem.h#L66) | | | `GetAvailableSource` | function | SparkEngine | [AudioEngine.h:L688](../../SparkEngine/Source/Audio/AudioEngine.h#L688) | Get an available audio source from the pool | | `GetAvailableSource` | function | SparkEngine | [OpenALAudioEngine.h:L191](../../SparkEngine/Source/Audio/OpenALAudioEngine.h#L191) | Get an available source from the pool | @@ -12093,10 +12118,10 @@ | `GetCallbacks` | function | GameModules | [WaveSpawner.h:L123](../../GameModules/SparkGameFPS/Source/Game/WaveSpawner.h#L123) | | | `GetCamera` | function | GameModules | [Game.h:L274](../../GameModules/SparkGameFPS/Source/Game/Game.h#L274) | Get camera instance for console integration | | `GetCamera` | function | GameModules | [TFWorldSetup.h:L117](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetup.h#L117) | | -| `GetCamera` | function | SparkEngine | [EngineContext.h:L238](../../SparkEngine/Source/Core/EngineContext.h#L238) | | | `GetCamera` | function | SparkEngine | [EngineContext.h:L239](../../SparkEngine/Source/Core/EngineContext.h#L239) | | -| `GetCamera` | function | SparkSDK | [IEngineContext.h:L274](../../SparkSDK/Include/Spark/IEngineContext.h#L274) | Get the active camera | +| `GetCamera` | function | SparkEngine | [EngineContext.h:L240](../../SparkEngine/Source/Core/EngineContext.h#L240) | | | `GetCamera` | function | SparkSDK | [IEngineContext.h:L275](../../SparkSDK/Include/Spark/IEngineContext.h#L275) | Get the active camera | +| `GetCamera` | function | SparkSDK | [IEngineContext.h:L276](../../SparkSDK/Include/Spark/IEngineContext.h#L276) | Get the active camera | | `GetCameraCell` | function | SparkEngine | [PortalCulling.h:L215](../../SparkEngine/Source/Graphics/PortalCulling.h#L215) | Get the cell the camera is currently in (kInvalidCell if outside all cells). | | `GetCameraCell` | function | Tests | [TestPortalCulling.cpp:L182](../../Tests/TestPortalCulling.cpp#L182) | | | `GetCameraMode` | function | SparkEngine | [PlayModeManager.h:L251](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L251) | | @@ -12182,10 +12207,10 @@ | `GetChildren` | function | SparkEngine | [SceneGraph2D.h:L203](../../SparkEngine/Source/Engine/2D/SceneGraph2D.h#L203) | | | `GetChromaticAberrationSettings` | function | SparkEngine | [PostProcessingPipeline.h:L138](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L138) | | | `GetChromaticAberrationSettings` | function | SparkEngine | [PostProcessingPipeline.h:L139](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L139) | | -| `GetCinematic` | function | SparkEngine | [EngineContext.h:L227](../../SparkEngine/Source/Core/EngineContext.h#L227) | | -| `GetCinematic` | function | SparkEngine | [EngineContext.h:L231](../../SparkEngine/Source/Core/EngineContext.h#L231) | | -| `GetCinematic` | function | SparkSDK | [IEngineContext.h:L266](../../SparkSDK/Include/Spark/IEngineContext.h#L266) | Get the cinematic sequencer manager | +| `GetCinematic` | function | SparkEngine | [EngineContext.h:L228](../../SparkEngine/Source/Core/EngineContext.h#L228) | | +| `GetCinematic` | function | SparkEngine | [EngineContext.h:L232](../../SparkEngine/Source/Core/EngineContext.h#L232) | | | `GetCinematic` | function | SparkSDK | [IEngineContext.h:L267](../../SparkSDK/Include/Spark/IEngineContext.h#L267) | Get the cinematic sequencer manager | +| `GetCinematic` | function | SparkSDK | [IEngineContext.h:L268](../../SparkSDK/Include/Spark/IEngineContext.h#L268) | Get the cinematic sequencer manager | | `GetCinematicList` | function | GameModules | [MMOEngineSystems.h:L86](../../GameModules/SparkGameMMO/Source/Core/MMOEngineSystems.h#L86) | Unsubscribe events and release references | | `GetClass` | function | GameModules | [Player.h:L314](../../GameModules/SparkGameFPS/Source/Game/Player.h#L314) | Get the player's current class type | | `GetClass` | function | GameModules | [MMOCharacterSystem.h:L160](../../GameModules/SparkGameMMO/Source/Character/MMOCharacterSystem.h#L160) | | @@ -12304,10 +12329,10 @@ | `GetComponentRaw` | function | SparkEngine | [Reflection.h:L391](../../SparkEngine/Source/Core/Reflection.h#L391) | Get a raw pointer to a component by type name. Returns nullptr if not found. | | `GetComponents` | function | SparkEditor | [PrefabAsset.h:L99](../../SparkEditor/Source/Prefabs/PrefabAsset.h#L99) | Get all serialized components | | `GetComponents` | function | SparkEditor | [PrefabAsset.h:L105](../../SparkEditor/Source/Prefabs/PrefabAsset.h#L105) | Get mutable reference to components for editing | -| `GetComponentSerializers` | function | SparkEngine | [EngineContext.h:L273](../../SparkEngine/Source/Core/EngineContext.h#L273) | | -| `GetComponentSerializers` | function | SparkEngine | [EngineContext.h:L277](../../SparkEngine/Source/Core/EngineContext.h#L277) | | -| `GetComponentSerializers` | function | SparkSDK | [IEngineContext.h:L348](../../SparkSDK/Include/Spark/IEngineContext.h#L348) | Get the host's component serializer registry | +| `GetComponentSerializers` | function | SparkEngine | [EngineContext.h:L274](../../SparkEngine/Source/Core/EngineContext.h#L274) | | +| `GetComponentSerializers` | function | SparkEngine | [EngineContext.h:L278](../../SparkEngine/Source/Core/EngineContext.h#L278) | | | `GetComponentSerializers` | function | SparkSDK | [IEngineContext.h:L349](../../SparkSDK/Include/Spark/IEngineContext.h#L349) | Get the host's component serializer registry | +| `GetComponentSerializers` | function | SparkSDK | [IEngineContext.h:L350](../../SparkSDK/Include/Spark/IEngineContext.h#L350) | Get the host's component serializer registry | | `GetComponentSerializers` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L63](../../Tests/TestLIFE200ModuleReloadReal.cpp#L63) | | | `GetComponentSerializers` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L67](../../Tests/TestLIFE200ModuleReloadReal.cpp#L67) | | | `GetComponentSerializers` | function | Tests | [TestModuleABI.cpp:L101](../../Tests/TestModuleABI.cpp#L101) | | @@ -12324,10 +12349,10 @@ | `GetComputeEncoder` | function | SparkEngine | [MetalDevice.h:L402](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L402) | | | `GetComputeQueue` | function | SparkEngine | [D3D12Device.h:L166](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L166) | Returns ID3D12Device5 when DXR is supported, nullptr otherwise. | | `GetComputeShader` | function | SparkEngine | [D3D11Device.h:L138](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L138) | | -| `GetConditions` | function | SparkEngine | [EngineContext.h:L245](../../SparkEngine/Source/Core/EngineContext.h#L245) | | | `GetConditions` | function | SparkEngine | [EngineContext.h:L246](../../SparkEngine/Source/Core/EngineContext.h#L246) | | -| `GetConditions` | function | SparkSDK | [IEngineContext.h:L282](../../SparkSDK/Include/Spark/IEngineContext.h#L282) | Get the condition system (universal gameplay conditions) | +| `GetConditions` | function | SparkEngine | [EngineContext.h:L247](../../SparkEngine/Source/Core/EngineContext.h#L247) | | | `GetConditions` | function | SparkSDK | [IEngineContext.h:L283](../../SparkSDK/Include/Spark/IEngineContext.h#L283) | Get the condition system (universal gameplay conditions) | +| `GetConditions` | function | SparkSDK | [IEngineContext.h:L284](../../SparkSDK/Include/Spark/IEngineContext.h#L284) | Get the condition system (universal gameplay conditions) | | `GetConfig` | function | GameModules | [HUDSystem.h:L259](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L259) | Get mutable HUD configuration | | `GetConfig` | function | GameModules | [HUDSystem.h:L265](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L265) | Get read-only HUD configuration | | `GetConfig` | function | SparkEngine | [PlayModeManager.h:L301](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L301) | | @@ -12361,8 +12386,8 @@ | `GetConnectionState` | function | SparkEngine | [NetworkManager.h:L1265](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L1265) | | | `GetConnectionState` | function | Tests | [TestNetworkManagerOrchestration.cpp:L331](../../Tests/TestNetworkManagerOrchestration.cpp#L331) | | | `GetConnectionStatus` | function | SparkEditor | [SparkEngineIntegration.h:L232](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L232) | Get connection status | -| `GetConsole` | function | SparkEngine | [EngineContext.h:L288](../../SparkEngine/Source/Core/EngineContext.h#L288) | | -| `GetConsole` | function | SparkSDK | [IEngineContext.h:L367](../../SparkSDK/Include/Spark/IEngineContext.h#L367) | Get the host's console command registry | +| `GetConsole` | function | SparkEngine | [EngineContext.h:L289](../../SparkEngine/Source/Core/EngineContext.h#L289) | | +| `GetConsole` | function | SparkSDK | [IEngineContext.h:L368](../../SparkSDK/Include/Spark/IEngineContext.h#L368) | Get the host's console command registry | | `GetConsole` | function | Tests | [module_logging_context.h:L47](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L47) | | | `GetConsole` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L73](../../Tests/TestLIFE200ModuleReloadReal.cpp#L73) | | | `GetConsole` | function | Tests | [TestModuleABI.cpp:L119](../../Tests/TestModuleABI.cpp#L119) | | @@ -12388,10 +12413,10 @@ | `GetCooldownProgress` | function | GameModules | [ClassAbilityState.h:L35](../../GameModules/SparkGameFPS/Source/Game/ClassAbilityState.h#L35) | Return cooldown completion; nonpositive cooldown maxima return one. | | `GetCooldowns` | function | GameModules | [ARPGSkillSystem.h:L77](../../GameModules/SparkGameARPG/Source/Skill/ARPGSkillSystem.h#L77) | Active cooldowns for @p heroId (skills whose remaining cooldown is above zero). | | `GetCopyQueue` | function | SparkEngine | [D3D12Device.h:L165](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L165) | Returns ID3D12Device5 when DXR is supported, nullptr otherwise. | -| `GetCoroutineScheduler` | function | SparkEngine | [EngineContext.h:L194](../../SparkEngine/Source/Core/EngineContext.h#L194) | | | `GetCoroutineScheduler` | function | SparkEngine | [EngineContext.h:L195](../../SparkEngine/Source/Core/EngineContext.h#L195) | | -| `GetCoroutineScheduler` | function | SparkSDK | [IEngineContext.h:L209](../../SparkSDK/Include/Spark/IEngineContext.h#L209) | Get the coroutine scheduler for async tasks | +| `GetCoroutineScheduler` | function | SparkEngine | [EngineContext.h:L196](../../SparkEngine/Source/Core/EngineContext.h#L196) | | | `GetCoroutineScheduler` | function | SparkSDK | [IEngineContext.h:L210](../../SparkSDK/Include/Spark/IEngineContext.h#L210) | Get the coroutine scheduler for async tasks | +| `GetCoroutineScheduler` | function | SparkSDK | [IEngineContext.h:L211](../../SparkSDK/Include/Spark/IEngineContext.h#L211) | Get the coroutine scheduler for async tasks | | `GetCoroutineScheduler` | function | Tests | [TestGameModulePlatformerARPG.cpp:L314](../../Tests/TestGameModulePlatformerARPG.cpp#L314) | | | `GetCoroutineScheduler` | function | Tests | [TestGameModulePlatformerARPG.cpp:L318](../../Tests/TestGameModulePlatformerARPG.cpp#L318) | | | `GetCoroutineScheduler` | function | Tests | [TestSparkGameShowcase.cpp:L82](../../Tests/TestSparkGameShowcase.cpp#L82) | | @@ -12414,7 +12439,7 @@ | `GetCoverCount` | function | SparkEngine | [CoverSystem.h:L139](../../SparkEngine/Source/Engine/AI/CoverSystem.h#L139) | Get the total number of registered cover points. | | `GetCpuPointer` | function | SparkEngine | [NullRHIResources.h:L86](../../SparkEngine/Source/Graphics/RHI/NullRHIResources.h#L86) | CPU pointer used by NullRHIDevice::MapBuffer. | | `GetCpuPointer` | function | Tests | [TestTransientBufferAllocatorPhaseX.cpp:L65](../../Tests/TestTransientBufferAllocatorPhaseX.cpp#L65) | | -| `GetCrashArtifactPrefix` | function | SparkEngine | [CrashHandler.cpp:L508](../../SparkEngine/Source/Utils/CrashHandler.cpp#L508) | | +| `GetCrashArtifactPrefix` | function | SparkEngine | [CrashHandler.cpp:L509](../../SparkEngine/Source/Utils/CrashHandler.cpp#L509) | | | `GetCrashHandler` | function | SparkEditor | [EditorUI.h:L151](../../SparkEditor/Source/Core/EditorUI.h#L151) | | | `GetCreatedEntities` | function | Tests | [TestSystemManagerIntegration.cpp:L71](../../Tests/TestSystemManagerIntegration.cpp#L71) | | | `GetCreates` | function | SparkEngine | [RenderGraphPass.h:L67](../../SparkEngine/Source/Graphics/RenderGraphPass.h#L67) | | @@ -12448,14 +12473,14 @@ | `GetCurrentExecutablePath` | function | SparkEditor | [EditorProcessLaunch.cpp:L26](../../SparkEditor/Source/Utils/EditorProcessLaunch.cpp#L26) | | | `GetCurrentExposure` | function | SparkEngine | [TonemapColorGrading.h:L143](../../SparkEngine/Source/Graphics/TonemapColorGrading.h#L143) | Get the current adapted exposure value | | `GetCurrentFade` | function | SparkEngine | [Sequencer.h:L304](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L304) | | -| `GetCurrentFilePath` | function | SparkEngine | [SceneManager.h:L385](../../SparkEngine/Source/SceneManager/SceneManager.h#L385) | Return the file path from which the current scene was last loaded or saved. | +| `GetCurrentFilePath` | function | SparkEngine | [SceneManager.h:L387](../../SparkEngine/Source/SceneManager/SceneManager.h#L387) | Return the file path from which the current scene was last loaded or saved. | | `GetCurrentFilePath` | function | SparkEngine | [FileLogger.h:L188](../../SparkEngine/Source/Utils/FileLogger.h#L188) | Get the current log file path | | `GetCurrentFilePath` | function | SparkEngine | [Logger.h:L351](../../SparkEngine/Source/Utils/Logger.h#L351) | | | `GetCurrentFileSize` | function | SparkEngine | [FileLogger.h:L198](../../SparkEngine/Source/Utils/FileLogger.h#L198) | Get current file size in bytes | | `GetCurrentFileSize` | function | SparkEngine | [Logger.h:L352](../../SparkEngine/Source/Utils/Logger.h#L352) | | | `GetCurrentFloor` | function | GameModules | [ARPGDungeonSystem.h:L69](../../GameModules/SparkGameARPG/Source/Dungeon/ARPGDungeonSystem.h#L69) | | | `GetCurrentFloorNumber` | function | GameModules | [ARPGDungeonSystem.h:L76](../../GameModules/SparkGameARPG/Source/Dungeon/ARPGDungeonSystem.h#L76) | | -| `GetCurrentFolder` | function | SparkEditor | [AssetBrowserPanel.h:L99](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L99) | Wire live basic-path cache invalidation after an import. | +| `GetCurrentFolder` | function | SparkEditor | [AssetBrowserPanel.h:L109](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L109) | Wire live basic-path cache invalidation after an import. | | `GetCurrentFOV` | function | GameModules | [RacingCameraSystem.h:L89](../../GameModules/SparkGameRacing/Source/Camera/RacingCameraSystem.h#L89) | | | `GetCurrentFov` | function | Tests | [TestCameraTransforms.cpp:L231](../../Tests/TestCameraTransforms.cpp#L231) | | | `GetCurrentFps` | function | SparkEditor | [SceneStatisticsPanel.h:L63](../../SparkEditor/Source/Panels/SceneStatisticsPanel.h#L63) | Frames per second derived from the measured frame delta. | @@ -12496,7 +12521,7 @@ | `GetCurrentPlaybackTime` | function | SparkEngine | [Sequencer.h:L295](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L295) | | | `GetCurrentPlaybackTime` | function | Tests | [TestAnimationSystem.cpp:L353](../../Tests/TestAnimationSystem.cpp#L353) | | | `GetCurrentPosixThreadId` | function | SparkEditor | [EditorCrashHandler.cpp:L159](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L159) | | -| `GetCurrentProcessId` | function | SparkEngine | [CrashHandler.cpp:L1094](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1094) | | +| `GetCurrentProcessId` | function | SparkEngine | [CrashHandler.cpp:L1095](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1095) | | | `GetCurrentProject` | function | SparkEditor | [ProjectManager.h:L157](../../SparkEditor/Source/Core/ProjectManager.h#L157) | Persist a successfully opened/saved scene as project-relative state. | | `GetCurrentPrompt` | function | GameModules | [InteractiveObject.h:L451](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L451) | Get interaction prompt for HUD | | `GetCurrentRenderScale` | function | SparkEngine | [UpscalingSystem.h:L139](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L139) | Get the current render scale factor | @@ -12531,7 +12556,7 @@ | `GetCurrentTheme` | function | SparkEditor | [EditorUI.h:L228](../../SparkEditor/Source/Core/EditorUI.h#L228) | | | `GetCurrentThemeData` | function | SparkEditor | [EditorTheme.h:L234](../../SparkEditor/Source/Core/EditorTheme.h#L234) | Get current theme name | | `GetCurrentThemeName` | function | SparkEditor | [EditorTheme.h:L232](../../SparkEditor/Source/Core/EditorTheme.h#L232) | Get current theme name | -| `GetCurrentThreadId` | function | SparkEngine | [CrashHandler.cpp:L1095](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1095) | | +| `GetCurrentThreadId` | function | SparkEngine | [CrashHandler.cpp:L1096](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1096) | | | `GetCurrentThreadId` | function | SparkEngine | [ThreadDebugger.h:L425](../../SparkEngine/Source/Utils/ThreadDebugger.h#L425) | Utility to get a stable uint64_t thread ID from std::this_thread | | `GetCurrentTime` | function | SparkEngine | [VideoPlayer.h:L320](../../SparkEngine/Source/Engine/Cinematic/VideoPlayer.h#L320) | Get current playback time | | `GetCurrentTimestamp` | function | SparkEditor | [ProjectManager.cpp:L70](../../SparkEditor/Source/Core/ProjectManager.cpp#L70) | | @@ -12566,12 +12591,12 @@ | `GetD3D12Resource` | function | SparkEngine | [D3D12Types.h:L402](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L402) | | | `GetD3D12Resource` | function | SparkEngine | [D3D12Types.h:L486](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L486) | | | `GetD3DContext` | function | SparkEngine | [RenderDevice.h:L113](../../SparkEngine/Source/Graphics/RenderDevice.h#L113) | | -| `GetD3DContext` | function | SparkEngine | [CrashHandler.cpp:L816](../../SparkEngine/Source/Utils/CrashHandler.cpp#L816) | | +| `GetD3DContext` | function | SparkEngine | [CrashHandler.cpp:L817](../../SparkEngine/Source/Utils/CrashHandler.cpp#L817) | | | `GetD3DContext` | function | SparkEngine | [D3DUtils.cpp:L45](../../SparkEngine/Source/Utils/D3DUtils.cpp#L45) | | | `GetD3DContext` | function | SparkEngine | [D3DUtils.cpp:L84](../../SparkEngine/Source/Utils/D3DUtils.cpp#L84) | | | `GetD3DContext` | function | SparkEngine | [D3DUtils.h:L70](../../SparkEngine/Source/Utils/D3DUtils.h#L70) | Get the DirectX 11 immediate device context @return Pointer to the context, or nullptr if not initialized | | `GetD3DDevice` | function | SparkEngine | [RenderDevice.h:L112](../../SparkEngine/Source/Graphics/RenderDevice.h#L112) | | -| `GetD3DDevice` | function | SparkEngine | [CrashHandler.cpp:L815](../../SparkEngine/Source/Utils/CrashHandler.cpp#L815) | | +| `GetD3DDevice` | function | SparkEngine | [CrashHandler.cpp:L816](../../SparkEngine/Source/Utils/CrashHandler.cpp#L816) | | | `GetD3DDevice` | function | SparkEngine | [D3DUtils.cpp:L38](../../SparkEngine/Source/Utils/D3DUtils.cpp#L38) | | | `GetD3DDevice` | function | SparkEngine | [D3DUtils.cpp:L80](../../SparkEngine/Source/Utils/D3DUtils.cpp#L80) | | | `GetD3DDevice` | function | SparkEngine | [D3DUtils.h:L67](../../SparkEngine/Source/Utils/D3DUtils.h#L67) | Get the DirectX 11 device @return Pointer to the device, or nullptr if not initialized | @@ -12780,10 +12805,10 @@ | `GetDescriptorTables` | function | SparkEngine | [D3D12Device.h:L196](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L196) | | | `GetDesiredTileSize` | function | SparkEngine | [CachedShadowAtlas.h:L313](../../SparkEngine/Source/Graphics/CachedShadowAtlas.h#L313) | Determine tile size based on priority | | `GetDestination` | function | GameModules | [InteractiveObject.h:L320](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L320) | | -| `GetDestruction` | function | SparkEngine | [EngineContext.h:L225](../../SparkEngine/Source/Core/EngineContext.h#L225) | | | `GetDestruction` | function | SparkEngine | [EngineContext.h:L226](../../SparkEngine/Source/Core/EngineContext.h#L226) | | -| `GetDestruction` | function | SparkSDK | [IEngineContext.h:L262](../../SparkSDK/Include/Spark/IEngineContext.h#L262) | Get the destruction system for destructible objects | +| `GetDestruction` | function | SparkEngine | [EngineContext.h:L227](../../SparkEngine/Source/Core/EngineContext.h#L227) | | | `GetDestruction` | function | SparkSDK | [IEngineContext.h:L263](../../SparkSDK/Include/Spark/IEngineContext.h#L263) | Get the destruction system for destructible objects | +| `GetDestruction` | function | SparkSDK | [IEngineContext.h:L264](../../SparkSDK/Include/Spark/IEngineContext.h#L264) | Get the destruction system for destructible objects | | `GetDestructionSound` | function | SparkEngine | [DestructionSystem.h:L90](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L90) | Set the destruction sound effect. | | `GetDetailedInfo` | function | SparkEngine | [MaterialSystem.h:L264](../../SparkEngine/Source/Graphics/MaterialSystem.h#L264) | | | `GetDetailNoiseTexture` | function | SparkEngine | [VolumetricClouds.h:L178](../../SparkEngine/Source/Graphics/VolumetricClouds.h#L178) | Upload latest CPU-generated noise/weather to the GPU textures | @@ -12801,10 +12826,10 @@ | `GetDeviceInfo` | function | SparkEngine | [RHIDevice.h:L186](../../SparkEngine/Source/Graphics/RHI/RHIDevice.h#L186) | | | `GetDeviceInfo` | function | SparkEngine | [VulkanDevice.h:L473](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L473) | | | `GetDeviceInfo` | function | Tests | [TestTransientBufferAllocatorPhaseX.cpp:L144](../../Tests/TestTransientBufferAllocatorPhaseX.cpp#L144) | | -| `GetDialogue` | function | SparkEngine | [EngineContext.h:L209](../../SparkEngine/Source/Core/EngineContext.h#L209) | | | `GetDialogue` | function | SparkEngine | [EngineContext.h:L210](../../SparkEngine/Source/Core/EngineContext.h#L210) | | -| `GetDialogue` | function | SparkSDK | [IEngineContext.h:L233](../../SparkSDK/Include/Spark/IEngineContext.h#L233) | Get the dialogue system | +| `GetDialogue` | function | SparkEngine | [EngineContext.h:L211](../../SparkEngine/Source/Core/EngineContext.h#L211) | | | `GetDialogue` | function | SparkSDK | [IEngineContext.h:L234](../../SparkSDK/Include/Spark/IEngineContext.h#L234) | Get the dialogue system | +| `GetDialogue` | function | SparkSDK | [IEngineContext.h:L235](../../SparkSDK/Include/Spark/IEngineContext.h#L235) | Get the dialogue system | | `GetDialogue` | function | Tests | [TestMOD350RPGQuestSliceReal.cpp:L91](../../Tests/TestMOD350RPGQuestSliceReal.cpp#L91) | | | `GetDialogue` | function | Tests | [TestMOD350RPGQuestSliceReal.cpp:L92](../../Tests/TestMOD350RPGQuestSliceReal.cpp#L92) | | | `GetDialogue` | function | Tests | [TestModuleABI.cpp:L113](../../Tests/TestModuleABI.cpp#L113) | | @@ -12928,7 +12953,7 @@ | `GetElapsedMs` | function | SparkEngine | [AIBudgetLimiterCore.h:L181](../../SparkEngine/Source/Engine/AI/AIBudgetLimiterCore.h#L181) | Get elapsed time since BeginFrame() in milliseconds. | | `GetElapsedTime` | function | SparkEngine | [InstanceManager.h:L91](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L91) | | | `GetElapsedTime` | function | SparkEngine | [TimerManager.h:L273](../../SparkEngine/Source/Utils/TimerManager.h#L273) | Get elapsed time since last fire | -| `GetElapsedTime` | function | SparkSDK | [IEngineContext.h:L318](../../SparkSDK/Include/Spark/IEngineContext.h#L318) | Get elapsed time since engine start in seconds | +| `GetElapsedTime` | function | SparkSDK | [IEngineContext.h:L319](../../SparkSDK/Include/Spark/IEngineContext.h#L319) | Get elapsed time since engine start in seconds | | `GetEmitter` | function | SparkEngine | [ParticleSystem.h:L239](../../SparkEngine/Source/Graphics/ParticleSystem.h#L239) | | | `GetEmitterCount` | function | SparkEngine | [ParticleSystem.h:L252](../../SparkEngine/Source/Graphics/ParticleSystem.h#L252) | | | `GetEnabledCategoryCount` | function | SparkEngine | [GameplayDebugger.h:L371](../../SparkEngine/Source/Utils/GameplayDebugger.h#L371) | Get count of enabled categories | @@ -12940,16 +12965,16 @@ | `GetEnemiesKilledThisWave` | function | GameModules | [WaveSpawner.h:L111](../../GameModules/SparkGameFPS/Source/Game/WaveSpawner.h#L111) | | | `GetEnergy` | function | GameModules | [Player.h:L338](../../GameModules/SparkGameFPS/Source/Game/Player.h#L338) | Get the ability energy pool | | `GetEngineContext` | function | GameModules | [Game.h:L343](../../GameModules/SparkGameFPS/Source/Game/Game.h#L343) | Get the engine context | -| `GetEnginePID` | function | SparkEngine | [CrashHandler.cpp:L524](../../SparkEngine/Source/Utils/CrashHandler.cpp#L524) | | -| `GetEnginePID` | function | SparkEngine | [CrashHandler.cpp:L716](../../SparkEngine/Source/Utils/CrashHandler.cpp#L716) | | +| `GetEnginePID` | function | SparkEngine | [CrashHandler.cpp:L525](../../SparkEngine/Source/Utils/CrashHandler.cpp#L525) | | +| `GetEnginePID` | function | SparkEngine | [CrashHandler.cpp:L717](../../SparkEngine/Source/Utils/CrashHandler.cpp#L717) | | | `GetEngineRPM` | function | SparkEngine | [VehiclePhysics.h:L90](../../SparkEngine/Source/Physics/VehiclePhysics.h#L90) | Get current engine RPM. | | `GetEngineRuntime` | function | SparkEngine | [EngineRuntime.cpp:L87](../../SparkEngine/Source/Core/EngineRuntime.cpp#L87) | | | `GetEngineRuntime` | function | SparkEngine | [EngineRuntime.h:L153](../../SparkEngine/Source/Core/EngineRuntime.h#L153) | Access the process-wide EngineRuntime instance. | | `GetEngineRuntime` | function | SparkEngine | [SparkEngineWindowsHeadless.cpp:L264](../../SparkEngine/Source/Core/SparkEngineWindowsHeadless.cpp#L264) | | | `GetEngineState` | function | SparkEditor | [SparkEngineIntegration.h:L422](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L422) | Get current engine state | -| `GetEngineVersion` | function | SparkEngine | [EngineContext.h:L418](../../SparkEngine/Source/Core/EngineContext.h#L418) | | -| `GetEngineVersion` | function | SparkSDK | [IEngineContext.h:L309](../../SparkSDK/Include/Spark/IEngineContext.h#L309) | Get the packed engine version (0xMMmmpp) | -| `GetEngineVersion` | function | SparkSDK | [Version.h:L50](../../SparkSDK/Include/Spark/Version.h#L50) | Get the packed engine version at runtime | +| `GetEngineVersion` | function | SparkEngine | [EngineContext.h:L421](../../SparkEngine/Source/Core/EngineContext.h#L421) | | +| `GetEngineVersion` | function | SparkSDK | [IEngineContext.h:L310](../../SparkSDK/Include/Spark/IEngineContext.h#L310) | Get the packed engine version (0xMMmmpp) | +| `GetEngineVersion` | function | SparkSDK | [Version.h:L54](../../SparkSDK/Include/Spark/Version.h#L54) | Get the packed engine version at runtime | | `GetEngineVersion` | function | Tests | [module_logging_context.h:L44](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L44) | | | `GetEngineVersion` | function | Tests | [TestGameModuleMMO.cpp:L76](../../Tests/TestGameModuleMMO.cpp#L76) | | | `GetEngineVersion` | function | Tests | [TestGameModuleMMO.cpp:L735](../../Tests/TestGameModuleMMO.cpp#L735) | | @@ -13006,7 +13031,7 @@ | `GetEntryCount` | function | SparkEngine | [SceneConfigDatabase.h:L130](../../SparkEngine/Source/SceneManager/SceneConfigDatabase.h#L130) | | | `GetEntryCount` | function | SparkEngine | [LocalFileCache.h:L331](../../SparkEngine/Source/Utils/LocalFileCache.h#L331) | Number of entries currently in cache | | `GetEntryCount` | function | Tests | [TestShaderDiskCache.cpp:L39](../../Tests/TestShaderDiskCache.cpp#L39) | | -| `GetEntryCount` | function | Tests | [TestSparkPak.cpp:L238](../../Tests/TestSparkPak.cpp#L238) | | +| `GetEntryCount` | function | Tests | [TestSparkPak.cpp:L244](../../Tests/TestSparkPak.cpp#L244) | | | `GetEntryPoint` | function | SparkEngine | [D3D11Device.h:L128](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L128) | | | `GetEntryPoint` | function | SparkEngine | [D3D12Types.h:L530](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L530) | | | `GetEntryPoint` | function | SparkEngine | [MetalDevice.h:L197](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L197) | | @@ -13028,10 +13053,10 @@ | `GetEstimatedMemoryUsage` | function | SparkEngine | [TransientResourcePool.h:L129](../../SparkEngine/Source/Graphics/RenderGraph/TransientResourcePool.h#L129) | Estimated total memory usage in bytes. | | `GetEstimatedRTT` | function | SparkEngine | [NetworkManager.h:L807](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L807) | | | `GetEstimatedRTT` | function | Tests | [TestNetworkManagerOrchestration.cpp:L335](../../Tests/TestNetworkManagerOrchestration.cpp#L335) | | -| `GetEventBus` | function | SparkEngine | [EngineContext.h:L153](../../SparkEngine/Source/Core/EngineContext.h#L153) | | | `GetEventBus` | function | SparkEngine | [EngineContext.h:L154](../../SparkEngine/Source/Core/EngineContext.h#L154) | | -| `GetEventBus` | function | SparkSDK | [IEngineContext.h:L143](../../SparkSDK/Include/Spark/IEngineContext.h#L143) | Get the event bus for publish/subscribe messaging | +| `GetEventBus` | function | SparkEngine | [EngineContext.h:L155](../../SparkEngine/Source/Core/EngineContext.h#L155) | | | `GetEventBus` | function | SparkSDK | [IEngineContext.h:L144](../../SparkSDK/Include/Spark/IEngineContext.h#L144) | Get the event bus for publish/subscribe messaging | +| `GetEventBus` | function | SparkSDK | [IEngineContext.h:L145](../../SparkSDK/Include/Spark/IEngineContext.h#L145) | Get the event bus for publish/subscribe messaging | | `GetEventBus` | function | Tests | [module_logging_context.h:L38](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L38) | | | `GetEventBus` | function | Tests | [module_logging_context.h:L39](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L39) | | | `GetEventBus` | function | Tests | [TestGameModuleMMO.cpp:L70](../../Tests/TestGameModuleMMO.cpp#L70) | | @@ -13128,10 +13153,10 @@ | `GetFieldCount` | function | Tests | [TestReplicationFields.cpp:L149](../../Tests/TestReplicationFields.cpp#L149) | | | `GetFieldIndex` | function | SparkEngine | [ReplicationFields.h:L84](../../SparkEngine/Source/Engine/Networking/ReplicationFields.h#L84) | Implicit read-only conversion for convenience | | `GetFieldSet` | function | SparkEngine | [EntityReplicator.h:L113](../../SparkEngine/Source/Engine/Networking/EntityReplicator.h#L113) | Get mutable access to an entity's field set (for marking dirty) | -| `GetFileCache` | function | SparkEngine | [EngineContext.h:L199](../../SparkEngine/Source/Core/EngineContext.h#L199) | | | `GetFileCache` | function | SparkEngine | [EngineContext.h:L200](../../SparkEngine/Source/Core/EngineContext.h#L200) | | -| `GetFileCache` | function | SparkSDK | [IEngineContext.h:L213](../../SparkSDK/Include/Spark/IEngineContext.h#L213) | Get the local file cache | +| `GetFileCache` | function | SparkEngine | [EngineContext.h:L201](../../SparkEngine/Source/Core/EngineContext.h#L201) | | | `GetFileCache` | function | SparkSDK | [IEngineContext.h:L214](../../SparkSDK/Include/Spark/IEngineContext.h#L214) | Get the local file cache | +| `GetFileCache` | function | SparkSDK | [IEngineContext.h:L215](../../SparkSDK/Include/Spark/IEngineContext.h#L215) | Get the local file cache | | `GetFileCount` | function | SparkEngine | [SparkPakWriter.h:L54](../../SparkEngine/Source/Core/SparkPakWriter.h#L54) | Number of files staged for writing. | | `GetFileDiff` | function | SparkEditor | [VersionControlSystem.h:L222](../../SparkEditor/Source/VersionControl/VersionControlSystem.h#L222) | Get file differences | | `GetFileModTime` | function | SparkEngine | [ShaderCompilationLinux.cpp:L37](../../SparkEngine/Source/Graphics/ShaderCompilationLinux.cpp#L37) | | @@ -13146,8 +13171,8 @@ | `GetFileStatus` | function | SparkEditor | [VersionControlSystem.h:L301](../../SparkEditor/Source/VersionControl/VersionControlSystem.h#L301) | Get file status | | `GetFilesWritten` | function | SparkEngine | [Telemetry.h:L228](../../SparkEngine/Source/Utils/Telemetry.h#L228) | Number of files successfully written since creation. | | `GetFileTimestamp` | function | SparkEngine | [AssetPipeline.h:L602](../../SparkEngine/Source/Graphics/AssetPipeline.h#L602) | | -| `GetFileTypeColor` | function | SparkEditor | [AssetBrowserPanel.cpp:L149](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L149) | | -| `GetFileTypeIcon` | function | SparkEditor | [AssetBrowserPanel.cpp:L124](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L124) | | +| `GetFileTypeColor` | function | SparkEditor | [AssetBrowserGrid.cpp:L44](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L44) | | +| `GetFileTypeIcon` | function | SparkEditor | [AssetBrowserGrid.cpp:L19](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L19) | | | `GetFilmGrainSettings` | function | SparkEngine | [PostProcessingPipeline.h:L141](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L141) | | | `GetFilmGrainSettings` | function | SparkEngine | [PostProcessingPipeline.h:L142](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L142) | | | `GetFilmGrainSettings` | function | Tests | [TestPostProcessingPipeline.cpp:L225](../../Tests/TestPostProcessingPipeline.cpp#L225) | | @@ -13181,7 +13206,7 @@ | `GetFloat4` | function | SparkEditor | [SceneJSONReader.cpp:L207](../../SparkEditor/Source/SceneSystem/SceneJSONReader.cpp#L207) | | | `GetFogStatusString` | function | GameModules | [RTSFogOfWarSystem.h:L82](../../GameModules/SparkGameRTS/Source/FogOfWar/RTSFogOfWarSystem.h#L82) | | | `GetFogVolumeTexture` | function | SparkEngine | [FroxelVolumetricFog.h:L203](../../SparkEngine/Source/Graphics/FroxelVolumetricFog.h#L203) | Get the 3D fog volume texture | -| `GetFolders` | function | SparkEditor | [AssetBrowserPanel.h:L101](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L101) | Wire live basic-path cache invalidation after an import. | +| `GetFolders` | function | SparkEditor | [AssetBrowserPanel.h:L111](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L111) | Wire live basic-path cache invalidation after an import. | | `GetFontCount` | function | SparkEngine | [FontSystem.h:L412](../../SparkEngine/Source/Engine/Text/FontSystem.h#L412) | Get the number of loaded fonts | | `GetFontInfo` | function | SparkEngine | [FontSystem.h:L398](../../SparkEngine/Source/Engine/Text/FontSystem.h#L398) | Get information about a loaded font | | `GetFormat` | function | SparkEngine | [SoundEffect.h:L103](../../SparkEngine/Source/Audio/SoundEffect.h#L103) | Get the audio format structure | @@ -13232,7 +13257,7 @@ | `GetFrameHistory` | function | SparkEngine | [Profiler.h:L258](../../SparkEngine/Source/Utils/Profiler.h#L258) | | | `GetFrameIndex` | function | SparkEngine | [TemporalEffects.h:L368](../../SparkEngine/Source/Graphics/TemporalEffects.h#L368) | Get the current frame index | | `GetFrameNumber` | function | SparkEngine | [FrameInspector.h:L265](../../SparkEngine/Source/Utils/FrameInspector.h#L265) | | -| `GetFrameNumber` | function | SparkSDK | [IEngineContext.h:L324](../../SparkSDK/Include/Spark/IEngineContext.h#L324) | Get the current frame number (monotonically increasing) | +| `GetFrameNumber` | function | SparkSDK | [IEngineContext.h:L325](../../SparkSDK/Include/Spark/IEngineContext.h#L325) | Get the current frame number (monotonically increasing) | | `GetFrameProjectionMatrix` | function | SparkEngine | [GraphicsEngine.h:L962](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L962) | Get the projection matrix from the most recent frame. | | `GetFrames` | function | SparkEngine | [StackTrace.h:L120](../../SparkEngine/Source/Utils/StackTrace.h#L120) | Get the resolved stack frames | | `GetFrameStatistics` | function | SparkEngine | [RHIBridge.h:L263](../../SparkEngine/Source/Graphics/RHI/RHIBridge.h#L263) | | @@ -13269,10 +13294,10 @@ | `GetGameplayFrameCount` | function | SparkEngine | [GameplaySystemLifecycle.h:L74](../../SparkEngine/Source/Core/GameplaySystemLifecycle.h#L74) | Get the current gameplay frame counter (debug hooks at shutdown, fault records) | | `GetGameplayFrameCountImpl` | function | SparkEngine | [GameplayLifecycleShared.cpp:L1395](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L1395) | | | `GetGameplayFrameCountImpl` | function | SparkEngine | [GameplayLifecycleShared.h:L66](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.h#L66) | | -| `GetGameplayTagService` | function | SparkEngine | [EngineContext.h:L179](../../SparkEngine/Source/Core/EngineContext.h#L179) | | | `GetGameplayTagService` | function | SparkEngine | [EngineContext.h:L180](../../SparkEngine/Source/Core/EngineContext.h#L180) | | -| `GetGameplayTagService` | function | SparkSDK | [IEngineContext.h:L179](../../SparkSDK/Include/Spark/IEngineContext.h#L179) | Get the gameplay tag lifecycle interface (DI-friendly). | +| `GetGameplayTagService` | function | SparkEngine | [EngineContext.h:L181](../../SparkEngine/Source/Core/EngineContext.h#L181) | | | `GetGameplayTagService` | function | SparkSDK | [IEngineContext.h:L180](../../SparkSDK/Include/Spark/IEngineContext.h#L180) | Get the gameplay tag lifecycle interface (DI-friendly). | +| `GetGameplayTagService` | function | SparkSDK | [IEngineContext.h:L181](../../SparkSDK/Include/Spark/IEngineContext.h#L181) | Get the gameplay tag lifecycle interface (DI-friendly). | | `GetGameVersion` | function | SparkEngine | [IGameModule.h:L39](../../SparkEngine/Source/Core/IGameModule.h#L39) | Get the version string of this game module | | `GetGameVersion` | function | Tests | [LegacyModule.cpp:L12](../../Tests/Fixtures/ModuleABI/LegacyModule.cpp#L12) | | | `GetGatherTimer` | function | GameModules | [RTSResourceSystem.h:L87](../../GameModules/SparkGameRTS/Source/Resource/RTSResourceSystem.h#L87) | Seconds accumulated toward the next harvest trip, in [0, GATHER_INTERVAL). | @@ -13309,10 +13334,10 @@ | `GetGPUVirtualAddress` | function | SparkEngine | [D3D12Types.h:L405](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L405) | | | `GetGradients` | function | SparkEngine | [CpuNeuralTraining.h:L185](../../SparkEngine/Source/Graphics/Neural/CpuNeuralTraining.h#L185) | Access to raw gradient buffer (for diagnostics / custom updates). | | `GetGraphics` | function | SparkEditor | [EditorUI.h:L268](../../SparkEditor/Source/Core/EditorUI.h#L268) | Get the editor's GraphicsEngine, attached to the editor's own | -| `GetGraphics` | function | SparkEngine | [EngineContext.h:L147](../../SparkEngine/Source/Core/EngineContext.h#L147) | Reset the global EngineContext (shutdown only) | -| `GetGraphics` | function | SparkEngine | [EngineContext.h:L148](../../SparkEngine/Source/Core/EngineContext.h#L148) | | -| `GetGraphics` | function | SparkSDK | [IEngineContext.h:L131](../../SparkSDK/Include/Spark/IEngineContext.h#L131) | Get the graphics/rendering engine | +| `GetGraphics` | function | SparkEngine | [EngineContext.h:L148](../../SparkEngine/Source/Core/EngineContext.h#L148) | Reset the global EngineContext (shutdown only) | +| `GetGraphics` | function | SparkEngine | [EngineContext.h:L149](../../SparkEngine/Source/Core/EngineContext.h#L149) | | | `GetGraphics` | function | SparkSDK | [IEngineContext.h:L132](../../SparkSDK/Include/Spark/IEngineContext.h#L132) | Get the graphics/rendering engine | +| `GetGraphics` | function | SparkSDK | [IEngineContext.h:L133](../../SparkSDK/Include/Spark/IEngineContext.h#L133) | Get the graphics/rendering engine | | `GetGraphics` | function | Tests | [module_logging_context.h:L32](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L32) | | | `GetGraphics` | function | Tests | [module_logging_context.h:L33](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L33) | | | `GetGraphics` | function | Tests | [TestGameModuleMMO.cpp:L64](../../Tests/TestGameModuleMMO.cpp#L64) | | @@ -13361,7 +13386,7 @@ | `GetGraphics` | function | Tests | [TestSparkGameShowcase.cpp:L69](../../Tests/TestSparkGameShowcase.cpp#L69) | | | `GetGraphics` | function | Tests | [Test_gamemodules_mmochat_di.cpp:L38](../../Tests/harden/Test_gamemodules_mmochat_di.cpp#L38) | | | `GetGraphics` | function | Tests | [Test_gamemodules_mmochat_di.cpp:L39](../../Tests/harden/Test_gamemodules_mmochat_di.cpp#L39) | | -| `GetGraphicsBackend` | function | SparkEditor | [EditorApplication.h:L92](../../SparkEditor/Source/Core/EditorApplication.h#L92) | Number of main-loop Present calls that did not return S_OK. | +| `GetGraphicsBackend` | function | SparkEditor | [EditorApplication.h:L92](../../SparkEditor/Source/Core/EditorApplication.h#L92) | Number of frame presentation failures reported by the active graphics backend. | | `GetGraphicsFromContext` | function | SparkEngine | [D3DUtils.cpp:L21](../../SparkEngine/Source/Utils/D3DUtils.cpp#L21) | | | `GetGraphicsPerformance` | function | GameModules | [Game.h:L528](../../GameModules/SparkGameFPS/Source/Game/Game.h#L528) | Get current graphics performance metrics | | `GetGraphicsQueue` | function | SparkEngine | [VulkanDevice.h:L488](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L488) | | @@ -13407,7 +13432,7 @@ | `GetHandlerCount` | function | SparkEngine | [ScriptHookManager.h:L238](../../SparkEngine/Source/Engine/Scripting/ScriptHookManager.h#L238) | Number of registered handlers for a specific hook type. | | `GetHandlerCount` | function | Tests | [TestScriptHookManager.cpp:L131](../../Tests/TestScriptHookManager.cpp#L131) | | | `GetHazardCount` | function | GameModules | [PlatformerHazardSystem.h:L113](../../GameModules/SparkGamePlatformer/Source/Hazard/PlatformerHazardSystem.h#L113) | Total hazards placed in the current level | -| `GetHeader` | function | Tests | [TestSparkPak.cpp:L239](../../Tests/TestSparkPak.cpp#L239) | | +| `GetHeader` | function | Tests | [TestSparkPak.cpp:L245](../../Tests/TestSparkPak.cpp#L245) | | | `GetHeadOrientation` | function | SparkEngine | [VRSystem.h:L149](../../SparkEngine/Source/Engine/VR/VRSystem.h#L149) | Get head orientation as quaternion. | | `GetHeadOrientation` | function | Tests | [TestVRSystem.cpp:L111](../../Tests/TestVRSystem.cpp#L111) | | | `GetHeadPosition` | function | SparkEngine | [VRSystem.h:L146](../../SparkEngine/Source/Engine/VR/VRSystem.h#L146) | Get head position in world space. | @@ -13520,10 +13545,10 @@ | `GetInjectionData` | function | SparkEngine | [GameImGuiLayer.cpp:L115](../../SparkEngine/Source/Core/GameImGuiLayer.cpp#L115) | | | `GetInjectionData` | function | SparkEngine | [GameImGuiLayer.cpp:L169](../../SparkEngine/Source/Core/GameImGuiLayer.cpp#L169) | | | `GetInjectionData` | function | SparkEngine | [GameImGuiLayer.h:L55](../../SparkEngine/Source/Core/GameImGuiLayer.h#L55) | | -| `GetInput` | function | SparkEngine | [EngineContext.h:L149](../../SparkEngine/Source/Core/EngineContext.h#L149) | | | `GetInput` | function | SparkEngine | [EngineContext.h:L150](../../SparkEngine/Source/Core/EngineContext.h#L150) | | -| `GetInput` | function | SparkSDK | [IEngineContext.h:L135](../../SparkSDK/Include/Spark/IEngineContext.h#L135) | Get the input manager | +| `GetInput` | function | SparkEngine | [EngineContext.h:L151](../../SparkEngine/Source/Core/EngineContext.h#L151) | | | `GetInput` | function | SparkSDK | [IEngineContext.h:L136](../../SparkSDK/Include/Spark/IEngineContext.h#L136) | Get the input manager | +| `GetInput` | function | SparkSDK | [IEngineContext.h:L137](../../SparkSDK/Include/Spark/IEngineContext.h#L137) | Get the input manager | | `GetInput` | function | Tests | [module_logging_context.h:L34](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L34) | | | `GetInput` | function | Tests | [module_logging_context.h:L35](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L35) | | | `GetInput` | function | Tests | [TestGameModuleMMO.cpp:L66](../../Tests/TestGameModuleMMO.cpp#L66) | | @@ -13574,6 +13599,7 @@ | `GetInput` | function | Tests | [Test_gamemodules_mmochat_di.cpp:L41](../../Tests/harden/Test_gamemodules_mmochat_di.cpp#L41) | | | `GetInputBuffer` | function | SparkEngine | [InGameConsole.h:L293](../../SparkEngine/Source/Utils/InGameConsole.h#L293) | Get the current input buffer text | | `GetInputCaptureHint` | function | SparkEditor | [GameViewPanel.h:L83](../../SparkEditor/Source/Panels/GameViewPanel.h#L83) | | +| `GetInputFrameSequence` | function | SparkEngine | [InputManager.h:L171](../../SparkEngine/Source/Input/InputManager.h#L171) | | | `GetInputLayout` | function | SparkEngine | [D3D11Device.h:L184](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L184) | | | `GetInputSize` | function | SparkEngine | [CpuNeuralInference.h:L62](../../SparkEngine/Source/Graphics/Neural/CpuNeuralInference.h#L62) | Input size of the first layer. | | `GetInputSize` | function | SparkEngine | [NeuralFunctionApproximator.h:L116](../../SparkEngine/Source/Graphics/Neural/NeuralFunctionApproximator.h#L116) | Input dimensionality (0 if not configured). | @@ -13747,11 +13773,11 @@ | `GetInstanceData` | function | SparkEngine | [InstanceManager.h:L199](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L199) | | | `GetInstanceInfoString` | function | GameModules | [MMODungeonSystem.h:L133](../../GameModules/SparkGameMMO/Source/Dungeon/MMODungeonSystem.h#L133) | | | `GetInstances` | function | SparkEditor | [PrefabManager.h:L189](../../SparkEditor/Source/Prefabs/PrefabManager.h#L189) | Get all instances of a specific prefab | -| `GetInstances` | function | SparkEngine | [EngineContext.h:L250](../../SparkEngine/Source/Core/EngineContext.h#L250) | | | `GetInstances` | function | SparkEngine | [EngineContext.h:L251](../../SparkEngine/Source/Core/EngineContext.h#L251) | | +| `GetInstances` | function | SparkEngine | [EngineContext.h:L252](../../SparkEngine/Source/Core/EngineContext.h#L252) | | | `GetInstances` | function | SparkEngine | [FoliageSystem.h:L209](../../SparkEngine/Source/Graphics/FoliageSystem.h#L209) | Immutable view of the instances for a specific volume. | -| `GetInstances` | function | SparkSDK | [IEngineContext.h:L286](../../SparkSDK/Include/Spark/IEngineContext.h#L286) | Get the instance manager (encounters, lockouts) | | `GetInstances` | function | SparkSDK | [IEngineContext.h:L287](../../SparkSDK/Include/Spark/IEngineContext.h#L287) | Get the instance manager (encounters, lockouts) | +| `GetInstances` | function | SparkSDK | [IEngineContext.h:L288](../../SparkSDK/Include/Spark/IEngineContext.h#L288) | Get the instance manager (encounters, lockouts) | | `GetInt` | function | GameModules | [TFDataTablesInternal.h:L32](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTablesInternal.h#L32) | | | `GetInt` | function | SparkEditor | [RegionMapEditorIO.cpp:L123](../../SparkEditor/Source/Panels/RegionMapEditorIO.cpp#L123) | | | `GetInt` | function | SparkEngine | [DataTableSystem.h:L55](../../SparkEngine/Source/Engine/DataTable/DataTableSystem.h#L55) | Get int value, or 0 if absent/unparseable. | @@ -13785,10 +13811,10 @@ | `GetInterpolationDelay` | function | SparkEngine | [NetworkInterpolation.h:L95](../../SparkEngine/Source/Engine/Networking/NetworkInterpolation.h#L95) | Get the current interpolation delay. | | `GetInterpolationDelay` | function | Tests | [TestNetworkInterpolation.cpp:L91](../../Tests/TestNetworkInterpolation.cpp#L91) | | | `GetInterval` | function | SparkEngine | [Cooldown.h:L176](../../SparkEngine/Source/Utils/Cooldown.h#L176) | Get the configured interval. | -| `GetInvalidStateDetector` | function | SparkEngine | [EngineContext.h:L268](../../SparkEngine/Source/Core/EngineContext.h#L268) | | | `GetInvalidStateDetector` | function | SparkEngine | [EngineContext.h:L269](../../SparkEngine/Source/Core/EngineContext.h#L269) | | -| `GetInvalidStateDetector` | function | SparkSDK | [IEngineContext.h:L338](../../SparkSDK/Include/Spark/IEngineContext.h#L338) | Get the host's invalid-state detector | +| `GetInvalidStateDetector` | function | SparkEngine | [EngineContext.h:L270](../../SparkEngine/Source/Core/EngineContext.h#L270) | | | `GetInvalidStateDetector` | function | SparkSDK | [IEngineContext.h:L339](../../SparkSDK/Include/Spark/IEngineContext.h#L339) | Get the host's invalid-state detector | +| `GetInvalidStateDetector` | function | SparkSDK | [IEngineContext.h:L340](../../SparkSDK/Include/Spark/IEngineContext.h#L340) | Get the host's invalid-state detector | | `GetInventory` | function | GameModules | [OWGatheringSystem.h:L115](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.h#L115) | | | `GetInventoryString` | function | GameModules | [MMOInventorySystem.h:L100](../../GameModules/SparkGameMMO/Source/Inventory/MMOInventorySystem.h#L100) | | | `GetInventoryString` | function | GameModules | [OWGatheringSystem.h:L138](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.h#L138) | Craft an item, consuming resources | @@ -13849,7 +13875,7 @@ | `GetLastConnectionError` | function | SparkEngine | [NetworkManager.h:L1266](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L1266) | | | `GetLastConnectRejectReason` | function | SparkEngine | [NetworkManager.h:L706](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L706) | | | `GetLastCorrectionMagnitude` | function | SparkEngine | [ClientPrediction.h:L165](../../SparkEngine/Source/Engine/Networking/ClientPrediction.h#L165) | Get the position correction magnitude from last reconciliation. | -| `GetLastDeltaTime` | function | Tests | [TestECSystemsReal.cpp:L60](../../Tests/TestECSystemsReal.cpp#L60) | | +| `GetLastDeltaTime` | function | Tests | [TestECSystemsReal.cpp:L50](../../Tests/TestECSystemsReal.cpp#L50) | | | `GetLastError` | function | GameModules | [VisualScriptDemoWorld.h:L104](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.h#L104) | | | `GetLastError` | function | SparkEditor | [EditorLayoutManager.h:L194](../../SparkEditor/Source/Core/EditorLayoutManager.h#L194) | Actionable reason the last SaveCurrentLayout or LoadLayout failed; empty after a success. | | `GetLastError` | function | SparkEngine | [OnlineServices.h:L153](../../SparkEngine/Source/Engine/OnlineServices/OnlineServices.h#L153) | Last human-readable failure reason from this backend (empty if none). | @@ -13879,7 +13905,7 @@ | `GetLastLoadError` | function | SparkEngine | [ModuleManager.h:L328](../../SparkEngine/Source/Core/ModuleManager.h#L328) | Detailed reason from the most recent load operation. | | `GetLastMesh` | function | SparkEditor | [CSGEditorPanel.h:L151](../../SparkEditor/Source/Panels/CSGEditorPanel.h#L151) | Last-built mesh snapshot (vertex / triangle counts). | | `GetLastMesh` | function | Tests | [TestCSGEditorPanel.cpp:L90](../../Tests/TestCSGEditorPanel.cpp#L90) | | -| `GetLastOperationMessage` | function | SparkEditor | [AssetBrowserPanel.h:L102](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L102) | Wire live basic-path cache invalidation after an import. | +| `GetLastOperationMessage` | function | SparkEditor | [AssetBrowserPanel.h:L112](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L112) | Wire live basic-path cache invalidation after an import. | | `GetLastPassTimestamps` | function | SparkEngine | [GPUPerfCounters.h:L169](../../SparkEngine/Source/Utils/GPUPerfCounters.h#L169) | | | `GetLastPipelineStats` | function | SparkEngine | [GPUPerfCounters.h:L170](../../SparkEngine/Source/Utils/GPUPerfCounters.h#L170) | | | `GetLastRenderStats` | function | SparkEditor | [SceneViewPanel.h:L154](../../SparkEditor/Source/Panels/SceneViewPanel.h#L154) | Counts measured by the last RenderWorldBasic() call in this viewport. | @@ -13897,7 +13923,7 @@ | `GetLastVisionCellWork` | function | GameModules | [RTSSkirmishSimulation.h:L117](../../GameModules/SparkGameRTS/Source/Simulation/RTSSkirmishSimulation.h#L117) | Fog cells the most recent vision refresh visited, summed over factions. | | `GetLastWireChannel` | function | Tests | [TestReliableChannel.cpp:L621](../../Tests/TestReliableChannel.cpp#L621) | | | `GetLastWireSize` | function | Tests | [TestReliableChannel.cpp:L622](../../Tests/TestReliableChannel.cpp#L622) | | -| `GetLatestMoveState` | function | GameModules | [TFReplication.h:L71](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L71) | | +| `GetLatestMoveState` | function | GameModules | [TFReplication.h:L75](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L75) | | | `GetLatestTimestamp` | function | SparkEngine | [InterpolationBuffer.h:L172](../../SparkEngine/Source/Engine/Networking/InterpolationBuffer.h#L172) | Get the timestamp of the newest sample, or 0 if empty | | `GetLauncherExecutablePath` | function | SparkLauncher | [LauncherPaths.cpp:L20](../../SparkLauncher/src/LauncherPaths.cpp#L20) | | | `GetLauncherExecutablePath` | function | SparkLauncher | [LauncherPaths.h:L9](../../SparkLauncher/src/LauncherPaths.h#L9) | Return the absolute path of the running SparkLauncher executable. | @@ -13987,10 +14013,10 @@ | `GetLocaleStatus` | function | GameModules | [MMOEngineSystems.h:L87](../../GameModules/SparkGameMMO/Source/Core/MMOEngineSystems.h#L87) | Unsubscribe events and release references | | `GetLocalGrenadeCount` | function | GameModules | [TFGrenadeSystem.h:L133](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L133) | | | `GetLocalHudView` | function | GameModules | [TFAbilitySystem.h:L146](../../GameModules/SparkGameMMOFPS/Source/Game/TFAbilitySystem.h#L146) | | -| `GetLocalization` | function | SparkEngine | [EngineContext.h:L216](../../SparkEngine/Source/Core/EngineContext.h#L216) | | | `GetLocalization` | function | SparkEngine | [EngineContext.h:L217](../../SparkEngine/Source/Core/EngineContext.h#L217) | | -| `GetLocalization` | function | SparkSDK | [IEngineContext.h:L250](../../SparkSDK/Include/Spark/IEngineContext.h#L250) | Get the localization/i18n system | +| `GetLocalization` | function | SparkEngine | [EngineContext.h:L218](../../SparkEngine/Source/Core/EngineContext.h#L218) | | | `GetLocalization` | function | SparkSDK | [IEngineContext.h:L251](../../SparkSDK/Include/Spark/IEngineContext.h#L251) | Get the localization/i18n system | +| `GetLocalization` | function | SparkSDK | [IEngineContext.h:L252](../../SparkSDK/Include/Spark/IEngineContext.h#L252) | Get the localization/i18n system | | `GetLocalization` | function | Tests | [TestSparkGameShowcase.cpp:L86](../../Tests/TestSparkGameShowcase.cpp#L86) | | | `GetLocalization` | function | Tests | [TestSparkGameShowcase.cpp:L87](../../Tests/TestSparkGameShowcase.cpp#L87) | | | `GetLocalMatrix` | function | SparkEngine | [CoreComponents.cpp:L68](../../SparkEngine/Source/Engine/ECS/Components/CoreComponents.cpp#L68) | | @@ -14013,8 +14039,8 @@ | `GetLODLevelCount` | function | SparkEngine | [MeshClusterSystem.h:L266](../../SparkEngine/Source/Graphics/MeshClusterSystem.h#L266) | Get the total number of LOD levels | | `GetLODProfile` | function | SparkEditor | [AssetProcessors.cpp:L70](../../SparkEditor/Source/AssetPipeline/AssetProcessors.cpp#L70) | | | `GetLogger` | function | SparkEditor | [EditorUI.h:L150](../../SparkEditor/Source/Core/EditorUI.h#L150) | | -| `GetLogger` | function | SparkEngine | [EngineContext.h:L285](../../SparkEngine/Source/Core/EngineContext.h#L285) | | -| `GetLogger` | function | SparkSDK | [IEngineContext.h:L358](../../SparkSDK/Include/Spark/IEngineContext.h#L358) | Get the host's logger | +| `GetLogger` | function | SparkEngine | [EngineContext.h:L286](../../SparkEngine/Source/Core/EngineContext.h#L286) | | +| `GetLogger` | function | SparkSDK | [IEngineContext.h:L359](../../SparkSDK/Include/Spark/IEngineContext.h#L359) | Get the host's logger | | `GetLogger` | function | Tests | [module_logging_context.h:L46](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L46) | | | `GetLogger` | function | Tests | [TestPrototypeModuleKitReal.cpp:L150](../../Tests/TestPrototypeModuleKitReal.cpp#L150) | | | `GetLogHistory` | function | SparkEngine | [SparkConsole.h:L235](../../SparkEngine/Source/Utils/SparkConsole.h#L235) | | @@ -14025,7 +14051,7 @@ | `GetLootRNG` | function | GameModules | [ARPGLootSystem.cpp:L23](../../GameModules/SparkGameARPG/Source/Loot/ARPGLootSystem.cpp#L23) | | | `GetLootSystem` | function | GameModules | [Game.h:L477](../../GameModules/SparkGameFPS/Source/Game/Game.h#L477) | Get the loot drop/power-up system | | `GetLowHealthVignetteIntensity` | function | GameModules | [HUDSystem.h:L337](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L337) | | -| `GetMainSwapChain` | function | SparkEngine | [CrashHandler.cpp:L814](../../SparkEngine/Source/Utils/CrashHandler.cpp#L814) | | +| `GetMainSwapChain` | function | SparkEngine | [CrashHandler.cpp:L815](../../SparkEngine/Source/Utils/CrashHandler.cpp#L815) | | | `GetMainSwapChain` | function | SparkEngine | [D3DUtils.cpp:L31](../../SparkEngine/Source/Utils/D3DUtils.cpp#L31) | | | `GetMainSwapChain` | function | SparkEngine | [D3DUtils.cpp:L76](../../SparkEngine/Source/Utils/D3DUtils.cpp#L76) | | | `GetMainSwapChain` | function | SparkEngine | [D3DUtils.h:L64](../../SparkEngine/Source/Utils/D3DUtils.h#L64) | Get the primary DXGI swap chain @return Pointer to the swap chain, or nullptr if not initialized | @@ -14119,8 +14145,8 @@ | `GetMeshVertices` | function | SparkEngine | [WaterRenderer.h:L194](../../SparkEngine/Source/Graphics/WaterRenderer.h#L194) | Get the animated vertex data for a water plane. | | `GetMessageCount` | function | SparkEngine | [FileLogger.h:L193](../../SparkEngine/Source/Utils/FileLogger.h#L193) | Get the number of messages written | | `GetMetadata` | function | SparkEngine | [AssetPipeline.h:L204](../../SparkEngine/Source/Graphics/AssetPipeline.h#L204) | | -| `GetMetadata` | function | SparkEngine | [SceneManager.h:L369](../../SparkEngine/Source/SceneManager/SceneManager.h#L369) | Return a const reference to the scene's global metadata. | -| `GetMetadata` | function | SparkEngine | [SceneManager.h:L377](../../SparkEngine/Source/SceneManager/SceneManager.h#L377) | Return a mutable reference to the scene's global metadata. | +| `GetMetadata` | function | SparkEngine | [SceneManager.h:L371](../../SparkEngine/Source/SceneManager/SceneManager.h#L371) | Return a const reference to the scene's global metadata. | +| `GetMetadata` | function | SparkEngine | [SceneManager.h:L379](../../SparkEngine/Source/SceneManager/SceneManager.h#L379) | Return a mutable reference to the scene's global metadata. | | `GetMetadata` | function | Tests | [TestSceneManager.cpp:L161](../../Tests/TestSceneManager.cpp#L161) | | | `GetMetadata` | function | Tests | [TestSceneManager.cpp:L162](../../Tests/TestSceneManager.cpp#L162) | | | `GetMetalFeatures` | function | SparkEngine | [MetalDevice.h:L502](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L502) | | @@ -14154,8 +14180,8 @@ | `GetMetricsThreadSafe` | function | SparkEngine | [Shader.h:L589](../../SparkEngine/Source/Graphics/Shader.h#L589) | Thread-safe metrics access | | `GetMetricsThreadSafe` | function | SparkEngine | [ShaderConsoleOps.cpp:L23](../../SparkEngine/Source/Graphics/ShaderConsoleOps.cpp#L23) | | | `GetMetricsThreadSafe` | function | SparkEngine | [ShaderConsoleOps.cpp:L289](../../SparkEngine/Source/Graphics/ShaderConsoleOps.cpp#L289) | | -| `GetMetricsThreadSafe` | function | SparkEngine | [InputManager.cpp:L608](../../SparkEngine/Source/Input/InputManager.cpp#L608) | | -| `GetMetricsThreadSafe` | function | SparkEngine | [InputManager.h:L511](../../SparkEngine/Source/Input/InputManager.h#L511) | Thread-safe metrics access helper | +| `GetMetricsThreadSafe` | function | SparkEngine | [InputManager.cpp:L631](../../SparkEngine/Source/Input/InputManager.cpp#L631) | | +| `GetMetricsThreadSafe` | function | SparkEngine | [InputManager.h:L518](../../SparkEngine/Source/Input/InputManager.h#L518) | Thread-safe metrics access helper | | `GetMigrationPath` | function | SparkEngine | [AssetMigration.h:L299](../../SparkEngine/Source/Core/AssetMigration.h#L299) | Compute the ordered chain of steps to migrate between versions. | | `GetMin` | function | SparkEngine | [PerformanceStats.h:L76](../../SparkEngine/Source/Utils/PerformanceStats.h#L76) | | | `GetMin` | function | Tests | [TestPerformanceStats.cpp:L40](../../Tests/TestPerformanceStats.cpp#L40) | | @@ -14184,10 +14210,10 @@ | `GetModInfo` | function | SparkEngine | [ModSystem.h:L157](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L157) | Get mod info by ID. | | `GetMods` | function | SparkEditor | [ModdingPanel.h:L45](../../SparkEditor/Source/Panels/ModdingPanel.h#L45) | Mods currently mirrored from the ModSystem, ordered by load order. | | `GetModState` | function | SparkEngine | [ModSystem.h:L160](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L160) | Get mod state. | -| `GetModSystem` | function | SparkEngine | [EngineContext.h:L211](../../SparkEngine/Source/Core/EngineContext.h#L211) | | | `GetModSystem` | function | SparkEngine | [EngineContext.h:L212](../../SparkEngine/Source/Core/EngineContext.h#L212) | | -| `GetModSystem` | function | SparkSDK | [IEngineContext.h:L237](../../SparkSDK/Include/Spark/IEngineContext.h#L237) | Get the modding system | +| `GetModSystem` | function | SparkEngine | [EngineContext.h:L213](../../SparkEngine/Source/Core/EngineContext.h#L213) | | | `GetModSystem` | function | SparkSDK | [IEngineContext.h:L238](../../SparkSDK/Include/Spark/IEngineContext.h#L238) | Get the modding system | +| `GetModSystem` | function | SparkSDK | [IEngineContext.h:L239](../../SparkSDK/Include/Spark/IEngineContext.h#L239) | Get the modding system | | `GetModSystem` | function | Tests | [TestModuleABI.cpp:L115](../../Tests/TestModuleABI.cpp#L115) | | | `GetModSystem` | function | Tests | [TestModuleABI.cpp:L116](../../Tests/TestModuleABI.cpp#L116) | | | `GetModule` | function | SparkEngine | [GameModuleLoader.h:L57](../../SparkEngine/Source/Core/GameModuleLoader.h#L57) | Get the loaded game module instance | @@ -14243,10 +14269,10 @@ | `GetMotionBlurSettings` | function | SparkEngine | [TemporalEffects.h:L358](../../SparkEngine/Source/Graphics/TemporalEffects.h#L358) | Get the maximum blur radius in pixels | | `GetMotionBlurSettings` | function | SparkEngine | [TemporalEffects.h:L359](../../SparkEngine/Source/Graphics/TemporalEffects.h#L359) | | | `GetMountCount` | function | SparkEngine | [VirtualFileSystem.h:L223](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L223) | Number of active mount points. | -| `GetMouseDelta` | function | SparkEngine | [InputManager.h:L237](../../SparkEngine/Source/Input/InputManager.h#L237) | Get mouse movement delta since last frame | +| `GetMouseDelta` | function | SparkEngine | [InputManager.h:L244](../../SparkEngine/Source/Input/InputManager.h#L244) | Get mouse movement delta since last frame | | `GetMouseDelta` | function | SparkEngine | [PlatformInput.h:L227](../../SparkEngine/Source/Input/PlatformInput.h#L227) | Get mouse movement since last poll. | | `GetMouseDelta` | function | SparkEngine | [PlatformInput.h:L265](../../SparkEngine/Source/Input/PlatformInput.h#L265) | | -| `GetMousePosition` | function | SparkEngine | [InputManager.h:L247](../../SparkEngine/Source/Input/InputManager.h#L247) | Get current mouse cursor position | +| `GetMousePosition` | function | SparkEngine | [InputManager.h:L254](../../SparkEngine/Source/Input/InputManager.h#L254) | Get current mouse cursor position | | `GetMousePosition` | function | SparkEngine | [PlatformInput.h:L220](../../SparkEngine/Source/Input/PlatformInput.h#L220) | Get the current mouse cursor position. | | `GetMousePosition` | function | SparkEngine | [PlatformInput.h:L260](../../SparkEngine/Source/Input/PlatformInput.h#L260) | | | `GetMouseSensitivity` | function | Tests | [TestCameraTransforms.cpp:L238](../../Tests/TestCameraTransforms.cpp#L238) | | @@ -14267,10 +14293,10 @@ | `GetMTLSampler` | function | SparkEngine | [MetalDevice.h:L224](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L224) | | | `GetMTLTexture` | function | SparkEngine | [MetalDevice.h:L177](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L177) | | | `GetMultiStepRemaining` | function | SparkEngine | [PlayModeManager.h:L215](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L215) | | -| `GetMusic` | function | SparkEngine | [EngineContext.h:L264](../../SparkEngine/Source/Core/EngineContext.h#L264) | | | `GetMusic` | function | SparkEngine | [EngineContext.h:L265](../../SparkEngine/Source/Core/EngineContext.h#L265) | | -| `GetMusic` | function | SparkSDK | [IEngineContext.h:L294](../../SparkSDK/Include/Spark/IEngineContext.h#L294) | Get the music manager (crossfading, playlists, combat intensity) | +| `GetMusic` | function | SparkEngine | [EngineContext.h:L266](../../SparkEngine/Source/Core/EngineContext.h#L266) | | | `GetMusic` | function | SparkSDK | [IEngineContext.h:L295](../../SparkSDK/Include/Spark/IEngineContext.h#L295) | Get the music manager (crossfading, playlists, combat intensity) | +| `GetMusic` | function | SparkSDK | [IEngineContext.h:L296](../../SparkSDK/Include/Spark/IEngineContext.h#L296) | Get the music manager (crossfading, playlists, combat intensity) | | `GetMusic` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L445](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L445) | | | `GetMusic` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L446](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L446) | | | `GetMusicVolume` | function | SparkEngine | [AudioEngine.h:L634](../../SparkEngine/Source/Audio/AudioEngine.h#L634) | Get the music volume level | @@ -14382,9 +14408,9 @@ | `GetName` | function | Tests | [TestECSystemOrdering.cpp:L145](../../Tests/TestECSystemOrdering.cpp#L145) | | | `GetName` | function | Tests | [TestECSystemOrdering.cpp:L171](../../Tests/TestECSystemOrdering.cpp#L171) | | | `GetName` | function | Tests | [TestECSystemOrdering.cpp:L193](../../Tests/TestECSystemOrdering.cpp#L193) | | -| `GetName` | function | Tests | [TestECSystemsReal.cpp:L44](../../Tests/TestECSystemsReal.cpp#L44) | | -| `GetName` | function | Tests | [TestECSystemsReal.cpp:L59](../../Tests/TestECSystemsReal.cpp#L59) | | -| `GetName` | function | Tests | [TestECSystemsReal.cpp:L70](../../Tests/TestECSystemsReal.cpp#L70) | | +| `GetName` | function | Tests | [TestECSystemsReal.cpp:L34](../../Tests/TestECSystemsReal.cpp#L34) | | +| `GetName` | function | Tests | [TestECSystemsReal.cpp:L49](../../Tests/TestECSystemsReal.cpp#L49) | | +| `GetName` | function | Tests | [TestECSystemsReal.cpp:L60](../../Tests/TestECSystemsReal.cpp#L60) | | | `GetName` | function | Tests | [TestEditorSubsystems.cpp:L68](../../Tests/TestEditorSubsystems.cpp#L68) | | | `GetName` | function | Tests | [TestEditorSubsystems.cpp:L83](../../Tests/TestEditorSubsystems.cpp#L83) | | | `GetName` | function | Tests | [TestGameObjectTransforms.cpp:L138](../../Tests/TestGameObjectTransforms.cpp#L138) | | @@ -14445,10 +14471,10 @@ | `GetNearPlane` | function | SparkEngine | [GraphicsEngine.h:L984](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L984) | Get near clip plane distance. | | `GetNearPlane` | function | Tests | [TestCameraTransforms.cpp:L233](../../Tests/TestCameraTransforms.cpp#L233) | | | `GetNeighborhood` | function | Tests | [TestSpatialGrid.cpp:L191](../../Tests/TestSpatialGrid.cpp#L191) | | -| `GetNetwork` | function | SparkEngine | [EngineContext.h:L170](../../SparkEngine/Source/Core/EngineContext.h#L170) | | | `GetNetwork` | function | SparkEngine | [EngineContext.h:L171](../../SparkEngine/Source/Core/EngineContext.h#L171) | | -| `GetNetwork` | function | SparkSDK | [IEngineContext.h:L167](../../SparkSDK/Include/Spark/IEngineContext.h#L167) | Get the network manager (requires ENABLE_NETWORKING) | +| `GetNetwork` | function | SparkEngine | [EngineContext.h:L172](../../SparkEngine/Source/Core/EngineContext.h#L172) | | | `GetNetwork` | function | SparkSDK | [IEngineContext.h:L168](../../SparkSDK/Include/Spark/IEngineContext.h#L168) | Get the network manager (requires ENABLE_NETWORKING) | +| `GetNetwork` | function | SparkSDK | [IEngineContext.h:L169](../../SparkSDK/Include/Spark/IEngineContext.h#L169) | Get the network manager (requires ENABLE_NETWORKING) | | `GetNetwork` | function | Tests | [TestGameModuleMMO.cpp:L732](../../Tests/TestGameModuleMMO.cpp#L732) | | | `GetNetwork` | function | Tests | [TestGameModuleMMO.cpp:L733](../../Tests/TestGameModuleMMO.cpp#L733) | | | `GetNetwork` | function | Tests | [TestMMOAuthNetwork.cpp:L63](../../Tests/TestMMOAuthNetwork.cpp#L63) | | @@ -14459,10 +14485,10 @@ | `GetNetwork` | function | Tests | [Test_gamemodules_mmochat_di.cpp:L53](../../Tests/harden/Test_gamemodules_mmochat_di.cpp#L53) | | | `GetNetworkCalls` | function | Tests | [Test_gamemodules_mmochat_di.cpp:L59](../../Tests/harden/Test_gamemodules_mmochat_di.cpp#L59) | | | `GetNetworkDesc` | function | SparkEngine | [NeuralInference.h:L139](../../SparkEngine/Source/Graphics/Neural/NeuralInference.h#L139) | Get the network descriptor for a handle. | -| `GetNetworkService` | function | SparkEngine | [EngineContext.h:L172](../../SparkEngine/Source/Core/EngineContext.h#L172) | | | `GetNetworkService` | function | SparkEngine | [EngineContext.h:L173](../../SparkEngine/Source/Core/EngineContext.h#L173) | | -| `GetNetworkService` | function | SparkSDK | [IEngineContext.h:L171](../../SparkSDK/Include/Spark/IEngineContext.h#L171) | Get the network lifecycle interface (DI-friendly). | +| `GetNetworkService` | function | SparkEngine | [EngineContext.h:L174](../../SparkEngine/Source/Core/EngineContext.h#L174) | | | `GetNetworkService` | function | SparkSDK | [IEngineContext.h:L172](../../SparkSDK/Include/Spark/IEngineContext.h#L172) | Get the network lifecycle interface (DI-friendly). | +| `GetNetworkService` | function | SparkSDK | [IEngineContext.h:L173](../../SparkSDK/Include/Spark/IEngineContext.h#L173) | Get the network lifecycle interface (DI-friendly). | | `GetNetworkStats` | function | GameModules | [Game.h:L604](../../GameModules/SparkGameFPS/Source/Game/Game.h#L604) | Get network statistics (ping, packet loss, etc.) | | `GetNetworkStatus` | function | GameModules | [Game.h:L599](../../GameModules/SparkGameFPS/Source/Game/Game.h#L599) | Get network role description string | | `GetNewPos` | function | Tests | [TestEditorCommands.cpp:L136](../../Tests/TestEditorCommands.cpp#L136) | | @@ -14476,8 +14502,8 @@ | `GetNextTrack` | function | SparkEngine | [MusicManager.h:L129](../../SparkEngine/Source/Audio/MusicManager.h#L129) | | | `GetNextUnitId` | function | GameModules | [RTSUnitSystem.h:L95](../../GameModules/SparkGameRTS/Source/Unit/RTSUnitSystem.h#L95) | Id the next spawned unit receives (ids are never reused, so this is persistent state). | | `GetNode` | function | SparkEngine | [DialogueSystem.h:L143](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L143) | Get a node by ID. | -| `GetNode` | function | SparkEngine | [SceneManager.h:L293](../../SparkEngine/Source/SceneManager/SceneManager.h#L293) | Return a const pointer to the node at `index`, or `nullptr` if out of range. | -| `GetNode` | function | SparkEngine | [SceneManager.h:L304](../../SparkEngine/Source/SceneManager/SceneManager.h#L304) | Return a mutable pointer to the node at `index`, or `nullptr` if out of range. | +| `GetNode` | function | SparkEngine | [SceneManager.h:L295](../../SparkEngine/Source/SceneManager/SceneManager.h#L295) | Return a const pointer to the node at `index`, or `nullptr` if out of range. | +| `GetNode` | function | SparkEngine | [SceneManager.h:L306](../../SparkEngine/Source/SceneManager/SceneManager.h#L306) | Return a mutable pointer to the node at `index`, or `nullptr` if out of range. | | `GetNode` | function | Tests | [TestSceneManager.cpp:L135](../../Tests/TestSceneManager.cpp#L135) | | | `GetNode` | function | Tests | [TestSceneManager.cpp:L142](../../Tests/TestSceneManager.cpp#L142) | | | `GetNodeCategory` | function | SparkEngine | [VisualScriptCompiler.h:L68](../../SparkEngine/Source/Engine/Scripting/VisualScriptCompiler.h#L68) | | @@ -14487,7 +14513,7 @@ | `GetNodeCount` | function | SparkEngine | [DialogueSystem.h:L156](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L156) | Get node count. | | `GetNodeCount` | function | SparkEngine | [BVHAccelerator.h:L142](../../SparkEngine/Source/Graphics/BVHAccelerator.h#L142) | Get the total node count (for profiling). | | `GetNodeCount` | function | SparkEngine | [FastNoise2SIMD.h:L754](../../SparkEngine/Source/Graphics/FastNoise2SIMD.h#L754) | Get the number of nodes in the graph | -| `GetNodeCount` | function | SparkEngine | [SceneManager.h:L322](../../SparkEngine/Source/SceneManager/SceneManager.h#L322) | Return the total number of nodes currently in the scene. | +| `GetNodeCount` | function | SparkEngine | [SceneManager.h:L324](../../SparkEngine/Source/SceneManager/SceneManager.h#L324) | Return the total number of nodes currently in the scene. | | `GetNodeCount` | function | Tests | [TestSceneManager.cpp:L155](../../Tests/TestSceneManager.cpp#L155) | | | `GetNodeDisplayName` | function | SparkEngine | [VisualScriptCompiler.h:L65](../../SparkEngine/Source/Engine/Scripting/VisualScriptCompiler.h#L65) | | | `GetNodeIds` | function | SparkEngine | [DialogueSystem.h:L153](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L153) | Get all node IDs. | @@ -14521,7 +14547,7 @@ | `GetObjectIcon` | function | SparkEditor | [HierarchyPanel.h:L307](../../SparkEditor/Source/Panels/HierarchyPanel.h#L307) | Get object icon based on components | | `GetObjectives` | function | GameModules | [HUDSystem.h:L304](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L304) | | | `GetObjects` | function | GameModules | [InteractiveObject.h:L441](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L441) | Get all interactive objects | -| `GetObjects` | function | SparkEngine | [SceneManager.h:L399](../../SparkEngine/Source/SceneManager/SceneManager.h#L399) | Return the instantiated `GameObject` list for this scene. | +| `GetObjects` | function | SparkEngine | [SceneManager.h:L401](../../SparkEngine/Source/SceneManager/SceneManager.h#L401) | Return the instantiated `GameObject` list for this scene. | | `GetObjectType` | function | GameModules | [InteractiveObject.h:L78](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L78) | Get the interaction prompt text for HUD display | | `GetObstacleCount` | function | SparkEngine | [NavMeshObstacles.h:L286](../../SparkEngine/Source/Engine/AI/NavMeshObstacles.h#L286) | Get the number of active obstacles. | | `GetObstacleDesc` | function | SparkEngine | [NavMeshObstacles.h:L295](../../SparkEngine/Source/Engine/AI/NavMeshObstacles.h#L295) | Get the descriptor for an active obstacle. | @@ -14592,7 +14618,7 @@ | `GetOverallCompletion` | function | GameModules | [OWExplorationSystem.cpp:L307](../../GameModules/SparkGameOpenWorld/Source/Exploration/OWExplorationSystem.cpp#L307) | | | `GetOverallCompletion` | function | GameModules | [OWExplorationSystem.h:L86](../../GameModules/SparkGameOpenWorld/Source/Exploration/OWExplorationSystem.h#L86) | | | `GetOverallHitRate` | function | SparkEngine | [CacheDebugger.h:L243](../../SparkEngine/Source/Utils/CacheDebugger.h#L243) | Get aggregate hit rate across all caches | -| `GetOwned` | function | SparkEngine | [EngineContext.h:L130](../../SparkEngine/Source/Core/EngineContext.h#L130) | Access the owning unique_ptr (read-only) | +| `GetOwned` | function | SparkEngine | [EngineContext.h:L131](../../SparkEngine/Source/Core/EngineContext.h#L131) | Access the owning unique_ptr (read-only) | | `GetP50FrameTimeMs` | function | SparkEditor | [PerformanceProfiler.h:L198](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L198) | 50th/95th/99th percentile frame time (ms) over the analysis window. | | `GetP95FrameTimeMs` | function | SparkEditor | [PerformanceProfiler.h:L199](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L199) | 50th/95th/99th percentile frame time (ms) over the analysis window. | | `GetP99FrameTimeMs` | function | SparkEditor | [PerformanceProfiler.h:L200](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L200) | 50th/95th/99th percentile frame time (ms) over the analysis window. | @@ -14658,7 +14684,7 @@ | `GetPendingPageCount` | function | SparkEngine | [VirtualTexture.h:L124](../../SparkEngine/Source/Graphics/VirtualTexture.h#L124) | Get the number of pages pending load | | `GetPendingQueryCount` | function | SparkEngine | [AsyncDatabase.h:L282](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L282) | Dispatch completed async callbacks on the calling (main) thread. | | `GetPendingReleaseCount` | function | SparkEngine | [D3D12Device.h:L119](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L119) | | -| `GetPendingTimedKeyReleaseCount` | function | SparkEngine | [InputManager.h:L381](../../SparkEngine/Source/Input/InputManager.h#L381) | Number of console-simulated presses still waiting for their release deadline | +| `GetPendingTimedKeyReleaseCount` | function | SparkEngine | [InputManager.h:L388](../../SparkEngine/Source/Input/InputManager.h#L388) | Number of console-simulated presses still waiting for their release deadline | | `GetPendingWriteCount` | function | SparkEngine | [VulkanDescriptorCache.h:L101](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDescriptorCache.h#L101) | Number of pending writes. | | `GetPendingWrites` | function | GameModules | [MMOPersistenceSystem.cpp:L1391](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.cpp#L1391) | | | `GetPendingWrites` | function | GameModules | [MMOPersistenceSystem.h:L257](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.h#L257) | | @@ -14670,10 +14696,10 @@ | `GetPhase` | function | GameModules | [FPSArenaAutopilot.h:L94](../../GameModules/SparkGameFPS/Source/Game/FPSArenaAutopilot.h#L94) | Stop driving and release any key it holds on @p input. | | `GetPhaseSystemManagerImpl` | function | SparkEngine | [GameplayLifecycleShared.cpp:L898](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L898) | | | `GetPhaseSystemManagerImpl` | function | SparkEngine | [GameplayLifecycleShared.h:L61](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.h#L61) | | -| `GetPhysics` | function | SparkEngine | [EngineContext.h:L157](../../SparkEngine/Source/Core/EngineContext.h#L157) | | | `GetPhysics` | function | SparkEngine | [EngineContext.h:L158](../../SparkEngine/Source/Core/EngineContext.h#L158) | | -| `GetPhysics` | function | SparkSDK | [IEngineContext.h:L155](../../SparkSDK/Include/Spark/IEngineContext.h#L155) | Get the physics system | +| `GetPhysics` | function | SparkEngine | [EngineContext.h:L159](../../SparkEngine/Source/Core/EngineContext.h#L159) | | | `GetPhysics` | function | SparkSDK | [IEngineContext.h:L156](../../SparkSDK/Include/Spark/IEngineContext.h#L156) | Get the physics system | +| `GetPhysics` | function | SparkSDK | [IEngineContext.h:L157](../../SparkSDK/Include/Spark/IEngineContext.h#L157) | Get the physics system | | `GetPhysics` | function | Tests | [module_logging_context.h:L42](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L42) | | | `GetPhysics` | function | Tests | [module_logging_context.h:L43](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L43) | | | `GetPhysics` | function | Tests | [TestGameModuleMMO.cpp:L74](../../Tests/TestGameModuleMMO.cpp#L74) | | @@ -14725,7 +14751,7 @@ | `GetPhysicsBodyCount` | function | SparkEngine | [PerformanceStats.h:L260](../../SparkEngine/Source/Utils/PerformanceStats.h#L260) | Get all system timings | | `GetPhysicsSystem` | function | SparkEngine | [FixedTimestepPhysics.h:L126](../../SparkEngine/Source/Engine/ECS/Systems/FixedTimestepPhysics.h#L126) | Get the raw physics system pointer. | | `GetPhysicsSystem` | function | SparkEngine | [PhysicsBodyImpl.cpp:L34](../../SparkEngine/Source/Physics/PhysicsBodyImpl.cpp#L34) | | -| `getpid` | function | SparkEngine | [CrashHandler.cpp:L2756](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2756) | | +| `getpid` | function | SparkEngine | [CrashHandler.cpp:L2802](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2802) | | | `GetPieces` | function | SparkEngine | [DestructionSystem.h:L86](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L86) | Get all pieces. | | `GetPIEConfig` | function | SparkEditor | [DedicatedServerPanel.h:L138](../../SparkEditor/Source/Panels/DedicatedServerPanel.h#L138) | Connect to PlayModeManager for PIE integration. | | `GetPinColor` | function | SparkEditor | [VisualScriptPanel.cpp:L86](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L86) | | @@ -14842,7 +14868,7 @@ | `GetPrefabNames` | function | SparkEditor | [PrefabManager.h:L163](../../SparkEditor/Source/Prefabs/PrefabManager.h#L163) | Get all prefab names | | `GetPrefabs` | function | SparkEditor | [PrefabManager.h:L157](../../SparkEditor/Source/Prefabs/PrefabManager.h#L157) | Get all loaded prefabs | | `GetPresentation` | function | GameModules | [TFDataTables.h:L248](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTables.h#L248) | | -| `GetPresentFailureCount` | function | SparkEditor | [EditorApplication.h:L91](../../SparkEditor/Source/Core/EditorApplication.h#L91) | Number of main-loop Present calls that did not return S_OK. | +| `GetPresentFailureCount` | function | SparkEditor | [EditorApplication.h:L91](../../SparkEditor/Source/Core/EditorApplication.h#L91) | Number of frame presentation failures reported by the active graphics backend. | | `GetPresentQueue` | function | SparkEngine | [VulkanDevice.h:L489](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L489) | | | `GetPreset` | function | GameModules | [GameMode.h:L126](../../GameModules/SparkGameFPS/Source/Game/GameMode.h#L126) | | | `GetPreset` | function | Tests | [TestWeatherSystem.cpp:L35](../../Tests/TestWeatherSystem.cpp#L35) | | @@ -14913,7 +14939,7 @@ | `GetProjectionMatrix` | function | SparkEngine | [SparkEngineCamera.h:L226](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L226) | Get the current projection transformation matrix | | `GetProjectionMatrix` | function | Tests | [TestCameraTransforms.cpp:L240](../../Tests/TestCameraTransforms.cpp#L240) | | | `GetProjectManager` | function | SparkEditor | [EditorUI.h:L152](../../SparkEditor/Source/Core/EditorUI.h#L152) | | -| `GetProjectPath` | function | SparkEditor | [AssetBrowserPanel.h:L98](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L98) | Wire live basic-path cache invalidation after an import. | +| `GetProjectPath` | function | SparkEditor | [AssetBrowserPanel.h:L108](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L108) | Wire live basic-path cache invalidation after an import. | | `GetProjectRelativeCurrentScenePath` | function | SparkEditor | [EditorUI.h:L457](../../SparkEditor/Source/Core/EditorUI.h#L457) | | | `GetProjectScenesPath` | function | SparkEditor | [ProjectManager.h:L186](../../SparkEditor/Source/Core/ProjectManager.h#L186) | | | `GetProjectScriptsPath` | function | SparkEditor | [ProjectManager.h:L187](../../SparkEditor/Source/Core/ProjectManager.h#L187) | | @@ -15050,12 +15076,12 @@ | `GetRemainingPlayerCount` | function | GameModules | [RTSMatchSystem.h:L90](../../GameModules/SparkGameRTS/Source/Match/RTSMatchSystem.h#L90) | | | `GetRemainingStackBytes` | function | SparkEngine | [MemoryMonitor.h:L228](../../SparkEngine/Source/Utils/MemoryMonitor.h#L228) | Platform-specific: get remaining stack bytes, or 0 if unavailable | | `GetRemainingTime` | function | SparkEngine | [TimerManager.h:L263](../../SparkEngine/Source/Utils/TimerManager.h#L263) | Get remaining time until next fire | -| `GetRemotePawn` | function | GameModules | [TFReplication.h:L66](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L66) | | +| `GetRemotePawn` | function | GameModules | [TFReplication.h:L70](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L70) | | | `GetRenderDimensions` | function | SparkEngine | [DynamicQualityScaler.h:L99](../../SparkEngine/Source/Graphics/DynamicQualityScaler.h#L99) | Compute scaled render dimensions from native resolution | | `GetRenderedCount` | function | SparkEngine | [Systems2D.h:L119](../../SparkEngine/Source/Engine/ECS/Systems/Systems2D.h#L119) | | | `GetRenderedEntityCount` | function | SparkEngine | [ECSystems.h:L143](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L143) | Return the number of entities submitted for rendering in the last frame. | | `GetRenderedEntityCount` | function | Tests | [TestECSystemOrdering.cpp:L195](../../Tests/TestECSystemOrdering.cpp#L195) | | -| `GetRenderedFrameCount` | function | SparkEditor | [EditorApplication.h:L89](../../SparkEditor/Source/Core/EditorApplication.h#L89) | Number of main-loop frames whose swap-chain Present returned S_OK. | +| `GetRenderedFrameCount` | function | SparkEditor | [EditorApplication.h:L89](../../SparkEditor/Source/Core/EditorApplication.h#L89) | Number of completed frame presentation calls (D3D11 success or OpenGL swap completion). | | `GetRenderEncoder` | function | SparkEngine | [MetalDevice.h:L401](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L401) | | | `GetRenderGraph` | function | SparkEngine | [RenderPipeline.h:L151](../../SparkEngine/Source/Graphics/RenderPipeline.h#L151) | Get the underlying render graph for diagnostics. | | `GetRenderingPipeline` | function | SparkEngine | [GraphicsEngine.h:L589](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L589) | Get the current rendering pipeline | @@ -15081,10 +15107,10 @@ | `GetRenderTargetView` | function | SparkEngine | [VulkanDevice.h:L159](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L159) | | | `GetRenderTargetView` | function | SparkEngine | [RenderTarget.h:L149](../../SparkEngine/Source/Graphics/RenderTarget.h#L149) | Generate mipmaps (if supported) | | `GetRep` | function | GameModules | [MMOReputationSystem.h:L58](../../GameModules/SparkGameMMO/Source/Reputation/MMOReputationSystem.h#L58) | Per-player reputation state | -| `GetReplay` | function | SparkEngine | [EngineContext.h:L214](../../SparkEngine/Source/Core/EngineContext.h#L214) | | | `GetReplay` | function | SparkEngine | [EngineContext.h:L215](../../SparkEngine/Source/Core/EngineContext.h#L215) | | -| `GetReplay` | function | SparkSDK | [IEngineContext.h:L241](../../SparkSDK/Include/Spark/IEngineContext.h#L241) | Get the replay recording/playback system | +| `GetReplay` | function | SparkEngine | [EngineContext.h:L216](../../SparkEngine/Source/Core/EngineContext.h#L216) | | | `GetReplay` | function | SparkSDK | [IEngineContext.h:L242](../../SparkSDK/Include/Spark/IEngineContext.h#L242) | Get the replay recording/playback system | +| `GetReplay` | function | SparkSDK | [IEngineContext.h:L243](../../SparkSDK/Include/Spark/IEngineContext.h#L243) | Get the replay recording/playback system | | `GetReplicatedEntityCount` | function | SparkEditor | [NetworkDebugPanel.h:L262](../../SparkEditor/Source/Panels/NetworkDebugPanel.h#L262) | Get number of tracked replicated entities | | `GetReplicatedFieldCount` | function | SparkEngine | [Reflection.h:L166](../../SparkEngine/Source/Core/Reflection.h#L166) | Get the count of fields that are marked for replication. | | `GetReportedPlayerCount` | function | SparkEditor | [DedicatedServerPanel.h:L171](../../SparkEditor/Source/Panels/DedicatedServerPanel.h#L171) | Player count read from the server's health JSON. | @@ -15150,7 +15176,7 @@ | `GetRole` | function | Tests | [TestNetworkManagerOrchestration.cpp:L330](../../Tests/TestNetworkManagerOrchestration.cpp#L330) | | | `GetRoot` | function | SparkEngine | [BehaviorTree.h:L122](../../SparkEngine/Source/Engine/AI/BehaviorTree.h#L122) | Get a non-owning pointer to the root node. | | `GetRootBounds` | function | SparkEngine | [BVHAccelerator.h:L152](../../SparkEngine/Source/Graphics/BVHAccelerator.h#L152) | Get the root bounding box of the entire scene. | -| `GetRootNodes` | function | SparkEngine | [SceneManager.h:L285](../../SparkEngine/Source/SceneManager/SceneManager.h#L285) | Return the indices of all root nodes (nodes with no parent). | +| `GetRootNodes` | function | SparkEngine | [SceneManager.h:L287](../../SparkEngine/Source/SceneManager/SceneManager.h#L287) | Return the indices of all root nodes (nodes with no parent). | | `GetRootNodes` | function | Tests | [TestSceneManager.cpp:L124](../../Tests/TestSceneManager.cpp#L124) | | | `GetRootSignature` | function | SparkEngine | [D3D12Types.h:L593](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L593) | | | `GetRotation` | function | SparkEngine | [SparkEngineCamera.h:L252](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L252) | Get the current camera rotation (pitch, yaw, roll) | @@ -15216,10 +15242,10 @@ | `GetSaveMetadata` | function | SparkEngine | [SaveSystem.h:L671](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L671) | | | `GetSavePath` | function | SparkEngine | [SaveSystem.h:L898](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L898) | | | `GetSaveSlots` | function | SparkEngine | [SaveSystem.h:L658](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L658) | | -| `GetSaveSystem` | function | SparkEngine | [EngineContext.h:L192](../../SparkEngine/Source/Core/EngineContext.h#L192) | | | `GetSaveSystem` | function | SparkEngine | [EngineContext.h:L193](../../SparkEngine/Source/Core/EngineContext.h#L193) | | -| `GetSaveSystem` | function | SparkSDK | [IEngineContext.h:L201](../../SparkSDK/Include/Spark/IEngineContext.h#L201) | Get the save system | +| `GetSaveSystem` | function | SparkEngine | [EngineContext.h:L194](../../SparkEngine/Source/Core/EngineContext.h#L194) | | | `GetSaveSystem` | function | SparkSDK | [IEngineContext.h:L202](../../SparkSDK/Include/Spark/IEngineContext.h#L202) | Get the save system | +| `GetSaveSystem` | function | SparkSDK | [IEngineContext.h:L203](../../SparkSDK/Include/Spark/IEngineContext.h#L203) | Get the save system | | `GetSaveSystem` | function | Tests | [TestLIFE200ModuleReloadLoopReal.cpp:L65](../../Tests/TestLIFE200ModuleReloadLoopReal.cpp#L65) | | | `GetSaveSystem` | function | Tests | [TestLIFE200ModuleReloadLoopReal.cpp:L66](../../Tests/TestLIFE200ModuleReloadLoopReal.cpp#L66) | | | `GetSaveSystem` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L58](../../Tests/TestLIFE200ModuleReloadReal.cpp#L58) | | @@ -15249,10 +15275,10 @@ | `GetSceneComponentPayloadTypes` | function | SparkEditor | [SceneComponentCodec.cpp:L765](../../SparkEditor/Source/SceneSystem/SceneComponentCodec.cpp#L765) | | | `GetSceneData` | function | SparkEditor | [SparkEngineIntegration.h:L279](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L279) | Get current scene data from engine | | `GetSceneManager` | function | GameModules | [Game.h:L280](../../GameModules/SparkGameFPS/Source/Game/Game.h#L280) | Get scene manager instance for console integration | -| `GetSceneManager` | function | SparkEngine | [EngineContext.h:L186](../../SparkEngine/Source/Core/EngineContext.h#L186) | | | `GetSceneManager` | function | SparkEngine | [EngineContext.h:L187](../../SparkEngine/Source/Core/EngineContext.h#L187) | | -| `GetSceneManager` | function | SparkSDK | [IEngineContext.h:L193](../../SparkSDK/Include/Spark/IEngineContext.h#L193) | Get the scene manager | +| `GetSceneManager` | function | SparkEngine | [EngineContext.h:L188](../../SparkEngine/Source/Core/EngineContext.h#L188) | | | `GetSceneManager` | function | SparkSDK | [IEngineContext.h:L194](../../SparkSDK/Include/Spark/IEngineContext.h#L194) | Get the scene manager | +| `GetSceneManager` | function | SparkSDK | [IEngineContext.h:L195](../../SparkSDK/Include/Spark/IEngineContext.h#L195) | Get the scene manager | | `GetSceneObjectCount` | function | GameModules | [Game.h:L498](../../GameModules/SparkGameFPS/Source/Game/Game.h#L498) | Get current scene object count | | `GetSceneObjects` | function | SparkEditor | [HierarchyPanel.h:L126](../../SparkEditor/Source/Panels/HierarchyPanel.h#L126) | Get all scene object names (for serialization compatibility). | | `GetScopeCount` | function | SparkEngine | [ConnectionScope.h:L237](../../SparkEngine/Source/Engine/Networking/ConnectionScope.h#L237) | Get the number of entities currently in scope for a client. | @@ -15270,18 +15296,18 @@ | `GetScreenSpaceEffects` | function | SparkEngine | [GraphicsEngine.h:L377](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L377) | | | `GetScriptContext` | function | SparkEngine | [AngelScriptEngine.h:L668](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L668) | Get the current execution context | | `GetScriptContext` | function | Tests | [TestAngelScriptEngine.cpp:L199](../../Tests/TestAngelScriptEngine.cpp#L199) | | -| `GetScriptEngine` | function | SparkEngine | [EngineContext.h:L188](../../SparkEngine/Source/Core/EngineContext.h#L188) | | | `GetScriptEngine` | function | SparkEngine | [EngineContext.h:L189](../../SparkEngine/Source/Core/EngineContext.h#L189) | | -| `GetScriptEngine` | function | SparkSDK | [IEngineContext.h:L197](../../SparkSDK/Include/Spark/IEngineContext.h#L197) | Get the AngelScript engine (requires scripting enabled) | +| `GetScriptEngine` | function | SparkEngine | [EngineContext.h:L190](../../SparkEngine/Source/Core/EngineContext.h#L190) | | | `GetScriptEngine` | function | SparkSDK | [IEngineContext.h:L198](../../SparkSDK/Include/Spark/IEngineContext.h#L198) | Get the AngelScript engine (requires scripting enabled) | +| `GetScriptEngine` | function | SparkSDK | [IEngineContext.h:L199](../../SparkSDK/Include/Spark/IEngineContext.h#L199) | Get the AngelScript engine (requires scripting enabled) | | `GetScriptGeneration` | function | SparkEngine | [AngelScriptEngine.h:L291](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L291) | Return the current attached-instance generation, or zero when absent. | | `GetScriptInstance` | function | SparkEngine | [AngelScriptEngine.h:L702](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L702) | Look up a script instance by entity ID | | `GetScriptInstance` | function | Tests | [TestAngelScriptEngine.cpp:L135](../../Tests/TestAngelScriptEngine.cpp#L135) | | | `GetScriptRoot` | function | GameModules | [VisualScriptDemoWorld.h:L101](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.h#L101) | | | `GetScrollOffset` | function | SparkEngine | [InGameConsole.h:L296](../../SparkEngine/Source/Utils/InGameConsole.h#L296) | Get the scroll offset for the output | -| `GetSDKVersion` | function | SparkEngine | [EngineContext.h:L419](../../SparkEngine/Source/Core/EngineContext.h#L419) | | -| `GetSDKVersion` | function | SparkSDK | [IEngineContext.h:L312](../../SparkSDK/Include/Spark/IEngineContext.h#L312) | Get the SDK ABI version | -| `GetSDKVersion` | function | SparkSDK | [Version.h:L56](../../SparkSDK/Include/Spark/Version.h#L56) | Get the SDK ABI version at runtime | +| `GetSDKVersion` | function | SparkEngine | [EngineContext.h:L422](../../SparkEngine/Source/Core/EngineContext.h#L422) | | +| `GetSDKVersion` | function | SparkSDK | [IEngineContext.h:L313](../../SparkSDK/Include/Spark/IEngineContext.h#L313) | Get the SDK ABI version | +| `GetSDKVersion` | function | SparkSDK | [Version.h:L60](../../SparkSDK/Include/Spark/Version.h#L60) | Get the SDK ABI version at runtime | | `GetSDKVersion` | function | Tests | [module_logging_context.h:L45](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L45) | | | `GetSDKVersion` | function | Tests | [TestGameModuleMMO.cpp:L77](../../Tests/TestGameModuleMMO.cpp#L77) | | | `GetSDKVersion` | function | Tests | [TestGameModuleMMO.cpp:L736](../../Tests/TestGameModuleMMO.cpp#L736) | | @@ -15595,8 +15621,8 @@ | `GetStateThreadSafe` | function | GameModules | [PlayerConsole.cpp:L171](../../GameModules/SparkGameFPS/Source/Game/PlayerConsole.cpp#L171) | | | `GetStateThreadSafe` | function | SparkEngine | [SparkEngineCamera.h:L407](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L407) | Thread-safe state access helper | | `GetStateThreadSafe` | function | SparkEngine | [SparkEngineCameraConsoleOps.cpp:L201](../../SparkEngine/Source/Camera/SparkEngineCameraConsoleOps.cpp#L201) | | -| `GetStateValidation` | function | SparkEngine | [EngineContext.h:L291](../../SparkEngine/Source/Core/EngineContext.h#L291) | | -| `GetStateValidation` | function | SparkSDK | [IEngineContext.h:L376](../../SparkSDK/Include/Spark/IEngineContext.h#L376) | Get the host's ECS state-invariant rule registry | +| `GetStateValidation` | function | SparkEngine | [EngineContext.h:L292](../../SparkEngine/Source/Core/EngineContext.h#L292) | | +| `GetStateValidation` | function | SparkSDK | [IEngineContext.h:L377](../../SparkSDK/Include/Spark/IEngineContext.h#L377) | Get the host's ECS state-invariant rule registry | | `GetStateValidation` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L74](../../Tests/TestLIFE200ModuleReloadReal.cpp#L74) | | | `GetStateValidation` | function | Tests | [TestModuleABI.cpp:L120](../../Tests/TestModuleABI.cpp#L120) | | | `GetStateValidation` | function | Tests | [TestSparkGameShowcase.cpp:L95](../../Tests/TestSparkGameShowcase.cpp#L95) | | @@ -15731,19 +15757,19 @@ | `GetSwapChain` | function | SparkEngine | [GraphicsEngine.h:L678](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L678) | Get the DXGI swap chain | | `GetSwapChain` | function | SparkEngine | [RHIBridge.h:L139](../../SparkEngine/Source/Graphics/RHI/RHIBridge.h#L139) | | | `GetSwapChain` | function | SparkEngine | [RenderDevice.h:L114](../../SparkEngine/Source/Graphics/RenderDevice.h#L114) | | -| `GetSystem` | function | SparkEngine | [EngineContext.h:L376](../../SparkEngine/Source/Core/EngineContext.h#L376) | Retrieve a previously registered subsystem by type | +| `GetSystem` | function | SparkEngine | [EngineContext.h:L379](../../SparkEngine/Source/Core/EngineContext.h#L379) | Retrieve a previously registered subsystem by type | | `GetSystem` | function | SparkEngine | [ECSystems.h:L810](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L810) | | | `GetSystem` | function | SparkEngine | [ECSystems.h:L820](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L820) | | | `GetSystem` | function | SparkEngine | [PhaseSystemManager.h:L157](../../SparkEngine/Source/Engine/ECS/Systems/PhaseSystemManager.h#L157) | Find a system by its name (searches both phased and flat lists). | | `GetSystem` | function | SparkEngine | [PhaseSystemManager.h:L175](../../SparkEngine/Source/Engine/ECS/Systems/PhaseSystemManager.h#L175) | | | `GetSystem` | function | Tests | [TestECSystemOrdering.cpp:L238](../../Tests/TestECSystemOrdering.cpp#L238) | | -| `GetSystem` | function | Tests | [TestECSystemsReal.cpp:L94](../../Tests/TestECSystemsReal.cpp#L94) | | +| `GetSystem` | function | Tests | [TestECSystemsReal.cpp:L84](../../Tests/TestECSystemsReal.cpp#L84) | | | `GetSystemAccentColor` | function | SparkEditor | [EditorTheme.h:L302](../../SparkEditor/Source/Core/EditorTheme.h#L302) | | -| `GetSystemChecked` | function | SparkEngine | [EngineContext.h:L398](../../SparkEngine/Source/Core/EngineContext.h#L398) | | +| `GetSystemChecked` | function | SparkEngine | [EngineContext.h:L401](../../SparkEngine/Source/Core/EngineContext.h#L401) | | | `GetSystemCount` | function | SparkEngine | [ECSystems.h:L834](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L834) | Return the total number of registered systems (enabled and disabled). | | `GetSystemCount` | function | SparkEngine | [PhaseSystemManager.h:L196](../../SparkEngine/Source/Engine/ECS/Systems/PhaseSystemManager.h#L196) | Return the total number of registered systems (phased + flat). | | `GetSystemCount` | function | Tests | [TestECSystemOrdering.cpp:L248](../../Tests/TestECSystemOrdering.cpp#L248) | | -| `GetSystemCount` | function | Tests | [TestECSystemsReal.cpp:L104](../../Tests/TestECSystemsReal.cpp#L104) | | +| `GetSystemCount` | function | Tests | [TestECSystemsReal.cpp:L94](../../Tests/TestECSystemsReal.cpp#L94) | | | `GetSystemInfo` | function | SparkEditor | [EditorCrashHandler.h:L129](../../SparkEditor/Source/Core/EditorCrashHandler.h#L129) | | | `GetSystems` | function | Tests | [TestPerformanceStats.cpp:L132](../../Tests/TestPerformanceStats.cpp#L132) | | | `GetSystemTimings` | function | SparkEngine | [PerformanceStats.h:L256](../../SparkEngine/Source/Utils/PerformanceStats.h#L256) | Get all system timings | @@ -15777,10 +15803,10 @@ | `GetTargetVersion` | function | Tests | [TestAssetMigration.cpp:L322](../../Tests/TestAssetMigration.cpp#L322) | | | `GetTeamScore` | function | GameModules | [GameMode.h:L116](../../GameModules/SparkGameFPS/Source/Game/GameMode.h#L116) | | | `GetTeamScoreboard` | function | GameModules | [GameMode.h:L115](../../GameModules/SparkGameFPS/Source/Game/GameMode.h#L115) | | -| `GetTelemetryService` | function | SparkEngine | [EngineContext.h:L174](../../SparkEngine/Source/Core/EngineContext.h#L174) | | | `GetTelemetryService` | function | SparkEngine | [EngineContext.h:L175](../../SparkEngine/Source/Core/EngineContext.h#L175) | | -| `GetTelemetryService` | function | SparkSDK | [IEngineContext.h:L175](../../SparkSDK/Include/Spark/IEngineContext.h#L175) | Get the telemetry lifecycle interface (DI-friendly). | +| `GetTelemetryService` | function | SparkEngine | [EngineContext.h:L176](../../SparkEngine/Source/Core/EngineContext.h#L176) | | | `GetTelemetryService` | function | SparkSDK | [IEngineContext.h:L176](../../SparkSDK/Include/Spark/IEngineContext.h#L176) | Get the telemetry lifecycle interface (DI-friendly). | +| `GetTelemetryService` | function | SparkSDK | [IEngineContext.h:L177](../../SparkSDK/Include/Spark/IEngineContext.h#L177) | Get the telemetry lifecycle interface (DI-friendly). | | `GetTempAllocator` | function | SparkEngine | [PhysicsSystem.h:L509](../../SparkEngine/Source/Physics/PhysicsSystem.h#L509) | Get the temp allocator (used by CharacterController). | | `GetTempAllocator` | function | SparkEngine | [PhysicsSystem.h:L514](../../SparkEngine/Source/Physics/PhysicsSystem.h#L514) | Get the temp allocator (used by CharacterController). | | `GetTempDir` | function | SparkBuild | [Downloader.h:L61](../../SparkBuild/src/Downloader.h#L61) | | @@ -15849,19 +15875,19 @@ | `GetTilesY` | function | SparkEngine | [LightManager.h:L331](../../SparkEngine/Source/Graphics/LightManager.h#L331) | | | `GetTileUV` | function | SparkEngine | [Sprite2DComponents.h:L334](../../SparkEngine/Source/Engine/ECS/Components/Sprite2DComponents.h#L334) | | | `GetTime` | function | SparkEngine | [VolumetricClouds.h:L165](../../SparkEngine/Source/Graphics/VolumetricClouds.h#L165) | Number of seconds accumulated since Initialize | -| `GetTimeOfDay` | function | SparkEngine | [EngineContext.h:L205](../../SparkEngine/Source/Core/EngineContext.h#L205) | | | `GetTimeOfDay` | function | SparkEngine | [EngineContext.h:L206](../../SparkEngine/Source/Core/EngineContext.h#L206) | | +| `GetTimeOfDay` | function | SparkEngine | [EngineContext.h:L207](../../SparkEngine/Source/Core/EngineContext.h#L207) | | | `GetTimeOfDay` | function | SparkEngine | [TimeOfDaySystem.h:L88](../../SparkEngine/Source/Engine/World/TimeOfDaySystem.h#L88) | Get the current time of day in hours [0, 24) | -| `GetTimeOfDay` | function | SparkSDK | [IEngineContext.h:L225](../../SparkSDK/Include/Spark/IEngineContext.h#L225) | Get the time-of-day system (day/night cycle) | | `GetTimeOfDay` | function | SparkSDK | [IEngineContext.h:L226](../../SparkSDK/Include/Spark/IEngineContext.h#L226) | Get the time-of-day system (day/night cycle) | +| `GetTimeOfDay` | function | SparkSDK | [IEngineContext.h:L227](../../SparkSDK/Include/Spark/IEngineContext.h#L227) | Get the time-of-day system (day/night cycle) | | `GetTimeOfDay` | function | Tests | [TestDayNightCycle.cpp:L63](../../Tests/TestDayNightCycle.cpp#L63) | | | `GetTimeOfDay` | function | Tests | [TestSparkGameShowcase.cpp:L90](../../Tests/TestSparkGameShowcase.cpp#L90) | | | `GetTimeOfDay` | function | Tests | [TestSparkGameShowcase.cpp:L91](../../Tests/TestSparkGameShowcase.cpp#L91) | | | `GetTimeOfDay` | function | Tests | [TestTimeOfDaySystem.cpp:L63](../../Tests/TestTimeOfDaySystem.cpp#L63) | | -| `GetTimer` | function | SparkEngine | [EngineContext.h:L151](../../SparkEngine/Source/Core/EngineContext.h#L151) | | | `GetTimer` | function | SparkEngine | [EngineContext.h:L152](../../SparkEngine/Source/Core/EngineContext.h#L152) | | -| `GetTimer` | function | SparkSDK | [IEngineContext.h:L139](../../SparkSDK/Include/Spark/IEngineContext.h#L139) | Get the frame timer | +| `GetTimer` | function | SparkEngine | [EngineContext.h:L153](../../SparkEngine/Source/Core/EngineContext.h#L153) | | | `GetTimer` | function | SparkSDK | [IEngineContext.h:L140](../../SparkSDK/Include/Spark/IEngineContext.h#L140) | Get the frame timer | +| `GetTimer` | function | SparkSDK | [IEngineContext.h:L141](../../SparkSDK/Include/Spark/IEngineContext.h#L141) | Get the frame timer | | `GetTimer` | function | Tests | [module_logging_context.h:L36](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L36) | | | `GetTimer` | function | Tests | [module_logging_context.h:L37](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L37) | | | `GetTimer` | function | Tests | [TestGameModuleMMO.cpp:L68](../../Tests/TestGameModuleMMO.cpp#L68) | | @@ -16042,10 +16068,10 @@ | `GetTriggeredCues` | function | SparkEngine | [Sequencer.h:L203](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L203) | | | `GetTriggeredCues` | function | SparkEngine | [Sequencer.h:L217](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L217) | | | `GetTriggeredEvents` | function | Tests | [TestSequencer.cpp:L78](../../Tests/TestSequencer.cpp#L78) | | -| `GetTween` | function | SparkEngine | [EngineContext.h:L218](../../SparkEngine/Source/Core/EngineContext.h#L218) | | | `GetTween` | function | SparkEngine | [EngineContext.h:L219](../../SparkEngine/Source/Core/EngineContext.h#L219) | | -| `GetTween` | function | SparkSDK | [IEngineContext.h:L254](../../SparkSDK/Include/Spark/IEngineContext.h#L254) | Get the tween/interpolation system | +| `GetTween` | function | SparkEngine | [EngineContext.h:L220](../../SparkEngine/Source/Core/EngineContext.h#L220) | | | `GetTween` | function | SparkSDK | [IEngineContext.h:L255](../../SparkSDK/Include/Spark/IEngineContext.h#L255) | Get the tween/interpolation system | +| `GetTween` | function | SparkSDK | [IEngineContext.h:L256](../../SparkSDK/Include/Spark/IEngineContext.h#L256) | Get the tween/interpolation system | | `GetType` | function | GameModules | [Enemy.h:L96](../../GameModules/SparkGameFPS/Source/Game/Enemy.h#L96) | Get the enemy type | | `GetType` | function | SparkEngine | [MovementSystem.h:L115](../../SparkEngine/Source/Engine/AI/MovementSystem.h#L115) | | | `GetType` | function | SparkEngine | [MovementSystem.h:L142](../../SparkEngine/Source/Engine/AI/MovementSystem.h#L142) | Does nothing -- entity stands still. | @@ -16094,7 +16120,7 @@ | `GetTypeCount` | function | Tests | [TestReflection.cpp:L115](../../Tests/TestReflection.cpp#L115) | | | `GetTypeId` | function | SparkEditor | [CommandHistory.h:L92](../../SparkEditor/Source/CommandHistory.h#L92) | Unique ID for this command type (used by MergeWith). | | `GetTypeId` | function | SparkEditor | [CommandHistory.h:L321](../../SparkEditor/Source/CommandHistory.h#L321) | | -| `GetTypeId` | function | SparkEngine | [EngineContext.h:L63](../../SparkEngine/Source/Core/EngineContext.h#L63) | | +| `GetTypeId` | function | SparkEngine | [EngineContext.h:L64](../../SparkEngine/Source/Core/EngineContext.h#L64) | | | `GetTypeId` | function | Tests | [TestCommandHistory.cpp:L27](../../Tests/TestCommandHistory.cpp#L27) | | | `GetTypeId` | function | Tests | [TestCommandHistory.cpp:L116](../../Tests/TestCommandHistory.cpp#L116) | | | `GetTypeId` | function | Tests | [TestReflection.cpp:L24](../../Tests/TestReflection.cpp#L24) | | @@ -16129,10 +16155,10 @@ | `GetUAV` | function | SparkEngine | [TextureSystem.h:L154](../../SparkEngine/Source/Graphics/TextureSystem.h#L154) | | | `GetUAVDescriptor` | function | SparkEngine | [D3D12Types.h:L491](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L491) | | | `GetUI` | function | SparkEditor | [EditorApplication.h:L110](../../SparkEditor/Source/Core/EditorApplication.h#L110) | Access the editor's UI/document layer (owns the live ECS | -| `GetUI` | function | SparkEngine | [EngineContext.h:L207](../../SparkEngine/Source/Core/EngineContext.h#L207) | | | `GetUI` | function | SparkEngine | [EngineContext.h:L208](../../SparkEngine/Source/Core/EngineContext.h#L208) | | -| `GetUI` | function | SparkSDK | [IEngineContext.h:L229](../../SparkSDK/Include/Spark/IEngineContext.h#L229) | Get the UI system | +| `GetUI` | function | SparkEngine | [EngineContext.h:L209](../../SparkEngine/Source/Core/EngineContext.h#L209) | | | `GetUI` | function | SparkSDK | [IEngineContext.h:L230](../../SparkSDK/Include/Spark/IEngineContext.h#L230) | Get the UI system | +| `GetUI` | function | SparkSDK | [IEngineContext.h:L231](../../SparkSDK/Include/Spark/IEngineContext.h#L231) | Get the UI system | | `GetUI` | function | Tests | [TestModuleABI.cpp:L111](../../Tests/TestModuleABI.cpp#L111) | | | `GetUI` | function | Tests | [TestModuleABI.cpp:L112](../../Tests/TestModuleABI.cpp#L112) | | | `GetUInt` | function | SparkEngine | [ProfileProperties.h:L79](../../SparkEngine/Source/Utils/ProfileProperties.h#L79) | Read back a property as unsigned integer | @@ -16163,7 +16189,7 @@ | `GetUpdateCount` | function | Tests | [TestECSystemOrdering.cpp:L115](../../Tests/TestECSystemOrdering.cpp#L115) | | | `GetUpdateCount` | function | Tests | [TestECSystemOrdering.cpp:L131](../../Tests/TestECSystemOrdering.cpp#L131) | | | `GetUpdateCount` | function | Tests | [TestECSystemOrdering.cpp:L147](../../Tests/TestECSystemOrdering.cpp#L147) | | -| `GetUpdateCount` | function | Tests | [TestECSystemsReal.cpp:L45](../../Tests/TestECSystemsReal.cpp#L45) | | +| `GetUpdateCount` | function | Tests | [TestECSystemsReal.cpp:L35](../../Tests/TestECSystemsReal.cpp#L35) | | | `GetUpdateCount` | function | Tests | [TestSystemManagerIntegration.cpp:L51](../../Tests/TestSystemManagerIntegration.cpp#L51) | | | `GetUpdates` | function | Tests | [TestConstantBufferDiff.cpp:L35](../../Tests/TestConstantBufferDiff.cpp#L35) | | | `GetUploadResource` | function | SparkEngine | [D3D12Types.h:L403](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L403) | | @@ -16256,10 +16282,10 @@ | `GetVertexShader` | function | SparkEngine | [D3D11Device.h:L188](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L188) | | | `GetVertexShader` | function | SparkEngine | [MetalDevice.h:L251](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L251) | | | `GetVertices` | function | SparkEngine | [SpriteBatch.h:L210](../../SparkEngine/Source/Graphics/2D/SpriteBatch.h#L210) | | -| `GetVFS` | function | SparkEngine | [EngineContext.h:L266](../../SparkEngine/Source/Core/EngineContext.h#L266) | | | `GetVFS` | function | SparkEngine | [EngineContext.h:L267](../../SparkEngine/Source/Core/EngineContext.h#L267) | | -| `GetVFS` | function | SparkSDK | [IEngineContext.h:L298](../../SparkSDK/Include/Spark/IEngineContext.h#L298) | Get the virtual file system (mount-priority layered filesystem) | +| `GetVFS` | function | SparkEngine | [EngineContext.h:L268](../../SparkEngine/Source/Core/EngineContext.h#L268) | | | `GetVFS` | function | SparkSDK | [IEngineContext.h:L299](../../SparkSDK/Include/Spark/IEngineContext.h#L299) | Get the virtual file system (mount-priority layered filesystem) | +| `GetVFS` | function | SparkSDK | [IEngineContext.h:L300](../../SparkSDK/Include/Spark/IEngineContext.h#L300) | Get the virtual file system (mount-priority layered filesystem) | | `GetVibrationLeft` | function | Tests | [TestGamepadInputProcessing.cpp:L271](../../Tests/TestGamepadInputProcessing.cpp#L271) | | | `GetVibrationRight` | function | Tests | [TestGamepadInputProcessing.cpp:L276](../../Tests/TestGamepadInputProcessing.cpp#L276) | | | `GetVideoInfo` | function | SparkEngine | [VideoPlayer.h:L309](../../SparkEngine/Source/Engine/Cinematic/VideoPlayer.h#L309) | Get video info/metadata | @@ -16317,10 +16343,10 @@ | `GetVolumeManager` | function | SparkEngine | [PostProcessingPipeline.h:L181](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L181) | | | `GetVolumetricSettings` | function | SparkEngine | [FogSystem.h:L238](../../SparkEngine/Source/Graphics/FogSystem.h#L238) | | | `GetVoxelSize` | function | SparkEngine | [VoxelConeTracing.h:L236](../../SparkEngine/Source/Graphics/VoxelConeTracing.h#L236) | | -| `GetVR` | function | SparkEngine | [EngineContext.h:L235](../../SparkEngine/Source/Core/EngineContext.h#L235) | | | `GetVR` | function | SparkEngine | [EngineContext.h:L236](../../SparkEngine/Source/Core/EngineContext.h#L236) | | -| `GetVR` | function | SparkSDK | [IEngineContext.h:L270](../../SparkSDK/Include/Spark/IEngineContext.h#L270) | Get the VR system (requires ENABLE_VR) | +| `GetVR` | function | SparkEngine | [EngineContext.h:L237](../../SparkEngine/Source/Core/EngineContext.h#L237) | | | `GetVR` | function | SparkSDK | [IEngineContext.h:L271](../../SparkSDK/Include/Spark/IEngineContext.h#L271) | Get the VR system (requires ENABLE_VR) | +| `GetVR` | function | SparkSDK | [IEngineContext.h:L272](../../SparkSDK/Include/Spark/IEngineContext.h#L272) | Get the VR system (requires ENABLE_VR) | | `GetVRAMBudgetMonitor` | function | SparkEngine | [GraphicsEngine.h:L381](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L381) | | | `GetVRAMUsage` | function | SparkEngine | [RenderDevice.h:L94](../../SparkEngine/Source/Graphics/RenderDevice.h#L94) | Get estimated VRAM usage in bytes. | | `GetWaiters` | function | SparkEngine | [WorkSema.h:L111](../../SparkEngine/Source/Utils/WorkSema.h#L111) | | @@ -16342,24 +16368,26 @@ | `GetWeaponByName` | function | SparkEngine | [WeaponManager.h:L230](../../SparkEngine/Source/Engine/Gameplay/WeaponManager.h#L230) | Look up a weapon definition by name | | `GetWeapons` | function | SparkEditor | [WeaponEditorPanel.h:L54](../../SparkEditor/Source/Panels/WeaponEditorPanel.h#L54) | The current (possibly edited) weapon table. | | `GetWeapons` | function | SparkEditor | [WeaponEditorPanel.h:L55](../../SparkEditor/Source/Panels/WeaponEditorPanel.h#L55) | The current (possibly edited) weapon table. | -| `GetWeapons` | function | SparkEngine | [EngineContext.h:L240](../../SparkEngine/Source/Core/EngineContext.h#L240) | | | `GetWeapons` | function | SparkEngine | [EngineContext.h:L241](../../SparkEngine/Source/Core/EngineContext.h#L241) | | -| `GetWeapons` | function | SparkSDK | [IEngineContext.h:L278](../../SparkSDK/Include/Spark/IEngineContext.h#L278) | Get the weapon system (weapon definitions, fire modes, recoil) | +| `GetWeapons` | function | SparkEngine | [EngineContext.h:L242](../../SparkEngine/Source/Core/EngineContext.h#L242) | | | `GetWeapons` | function | SparkSDK | [IEngineContext.h:L279](../../SparkSDK/Include/Spark/IEngineContext.h#L279) | Get the weapon system (weapon definitions, fire modes, recoil) | +| `GetWeapons` | function | SparkSDK | [IEngineContext.h:L280](../../SparkSDK/Include/Spark/IEngineContext.h#L280) | Get the weapon system (weapon definitions, fire modes, recoil) | | `GetWeaponStats` | function | GameModules | [Player.h:L783](../../GameModules/SparkGameFPS/Source/Game/Player.h#L783) | Get weapon statistics for a specific weapon type | | `GetWeaponSwitchAlpha` | function | GameModules | [HUDSystem.h:L346](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L346) | | | `GetWeaponSwitchName` | function | GameModules | [HUDSystem.h:L344](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L344) | | | `GetWeaponSwitchSlot` | function | GameModules | [HUDSystem.h:L345](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L345) | | -| `GetWeather` | function | SparkEngine | [EngineContext.h:L203](../../SparkEngine/Source/Core/EngineContext.h#L203) | | | `GetWeather` | function | SparkEngine | [EngineContext.h:L204](../../SparkEngine/Source/Core/EngineContext.h#L204) | | -| `GetWeather` | function | SparkSDK | [IEngineContext.h:L221](../../SparkSDK/Include/Spark/IEngineContext.h#L221) | Get the weather system | +| `GetWeather` | function | SparkEngine | [EngineContext.h:L205](../../SparkEngine/Source/Core/EngineContext.h#L205) | | | `GetWeather` | function | SparkSDK | [IEngineContext.h:L222](../../SparkSDK/Include/Spark/IEngineContext.h#L222) | Get the weather system | +| `GetWeather` | function | SparkSDK | [IEngineContext.h:L223](../../SparkSDK/Include/Spark/IEngineContext.h#L223) | Get the weather system | | `GetWeather` | function | Tests | [TestModuleABI.cpp:L109](../../Tests/TestModuleABI.cpp#L109) | | | `GetWeather` | function | Tests | [TestModuleABI.cpp:L110](../../Tests/TestModuleABI.cpp#L110) | | | `GetWeather` | function | Tests | [TestSparkGameShowcase.cpp:L88](../../Tests/TestSparkGameShowcase.cpp#L88) | | | `GetWeather` | function | Tests | [TestSparkGameShowcase.cpp:L89](../../Tests/TestSparkGameShowcase.cpp#L89) | | | `GetWeatherMapTexture` | function | SparkEngine | [VolumetricClouds.h:L179](../../SparkEngine/Source/Graphics/VolumetricClouds.h#L179) | Upload latest CPU-generated noise/weather to the GPU textures | | `GetWeatherPreset` | function | SparkEngine | [WeatherSystem.h:L128](../../SparkEngine/Source/Graphics/WeatherSystem.h#L128) | Get a default weather state for a given weather type | +| `GetWeatherService` | function | SparkEngine | [EngineContext.h:L294](../../SparkEngine/Source/Core/EngineContext.h#L294) | | +| `GetWeatherService` | function | SparkSDK | [IEngineContext.h:L381](../../SparkSDK/Include/Spark/IEngineContext.h#L381) | | | `GetWeatherStatus` | function | GameModules | [MMOEngineSystems.h:L85](../../GameModules/SparkGameMMO/Source/Core/MMOEngineSystems.h#L85) | Unsubscribe events and release references | | `GetWeatherStatus` | function | GameModules | [OWEngineSystems.h:L54](../../GameModules/SparkGameOpenWorld/Source/Core/OWEngineSystems.h#L54) | Validate the slot's gameplay snapshot, then restore the world and gameplay state from it. | | `GetWeatherTypeName` | function | SparkEngine | [WeatherSystem.h:L399](../../SparkEngine/Source/Graphics/WeatherSystem.h#L399) | Get a string name for a weather type. | @@ -16407,9 +16435,9 @@ | `GetWorkerCount` | function | SparkEngine | [JobSystem.h:L319](../../SparkEngine/Source/Utils/JobSystem.h#L319) | Get number of worker threads | | `GetWorkerCount` | function | Tests | [TestJobSystem.cpp:L57](../../Tests/TestJobSystem.cpp#L57) | | | `GetWorld` | function | SparkEditor | [EditorUI.h:L169](../../SparkEditor/Source/Core/EditorUI.h#L169) | The single live ECS World being edited (the document). Owned by | -| `GetWorld` | function | SparkEngine | [EngineContext.h:L185](../../SparkEngine/Source/Core/EngineContext.h#L185) | | -| `GetWorld` | function | SparkSDK | [IEngineContext.h:L183](../../SparkSDK/Include/Spark/IEngineContext.h#L183) | Get the ECS world for entity/component access | +| `GetWorld` | function | SparkEngine | [EngineContext.h:L186](../../SparkEngine/Source/Core/EngineContext.h#L186) | | | `GetWorld` | function | SparkSDK | [IEngineContext.h:L184](../../SparkSDK/Include/Spark/IEngineContext.h#L184) | Get the ECS world for entity/component access | +| `GetWorld` | function | SparkSDK | [IEngineContext.h:L185](../../SparkSDK/Include/Spark/IEngineContext.h#L185) | Get the ECS world for entity/component access | | `GetWorld` | function | Tests | [TestMOD330ARPGWorldActors.cpp:L61](../../Tests/TestMOD330ARPGWorldActors.cpp#L61) | | | `GetWorld` | function | Tests | [TestMOD340PlatformerProgressReal.cpp:L119](../../Tests/TestMOD340PlatformerProgressReal.cpp#L119) | | | `GetWorld` | function | Tests | [TestMOD350RPGQuestSliceReal.cpp:L94](../../Tests/TestMOD350RPGQuestSliceReal.cpp#L94) | | @@ -16612,7 +16640,7 @@ | `GPUDrivenRenderer::Initialize` | method | SparkEngine | [GPUDrivenRenderer.cpp:L34](../../SparkEngine/Source/Graphics/GPUDrivenRenderer.cpp#L34) | | | `GPUDrivenRenderer::Shutdown` | method | SparkEngine | [GPUDrivenRenderer.cpp:L440](../../SparkEngine/Source/Graphics/GPUDrivenRenderer.cpp#L440) | | | `gpuEvent` | function | SparkEngine | [PostProcessingPipelineWindowsPasses.cpp:L288](../../SparkEngine/Source/Graphics/PostProcessingPipelineWindowsPasses.cpp#L288) | | -| `gpuFile` | function | SparkEngine | [CrashHandler.cpp:L1720](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1720) | | +| `gpuFile` | function | SparkEngine | [CrashHandler.cpp:L1721](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1721) | | | `GPUOcclusionCuller::BuildHiZ` | method | SparkEngine | [GPUOcclusionCulling.cpp:L111](../../SparkEngine/Source/Graphics/GPUOcclusionCulling.cpp#L111) | | | `GPUOcclusionCuller::Console_GetStatus` | method | SparkEngine | [GPUOcclusionCulling.cpp:L245](../../SparkEngine/Source/Graphics/GPUOcclusionCulling.cpp#L245) | | | `GPUOcclusionCuller::CreateGPUResources` | method | SparkEngine | [GPUOcclusionCulling.cpp:L255](../../SparkEngine/Source/Graphics/GPUOcclusionCulling.cpp#L255) | | @@ -17080,7 +17108,7 @@ | `guard` | function | SparkEngine | [GraphicsEngineSubmit.cpp:L62](../../SparkEngine/Source/Graphics/GraphicsEngineSubmit.cpp#L62) | | | `guard` | function | SparkEngine | [GraphicsEngineSubmit.cpp:L145](../../SparkEngine/Source/Graphics/GraphicsEngineSubmit.cpp#L145) | | | `guard` | function | SparkEngine | [GraphicsEngineWindowsDrawList.cpp:L55](../../SparkEngine/Source/Graphics/GraphicsEngineWindowsDrawList.cpp#L55) | | -| `guard` | function | SparkEngine | [CrashHandler.cpp:L1069](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1069) | | +| `guard` | function | SparkEngine | [CrashHandler.cpp:L1070](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1070) | | | `guard` | function | SparkEngine | [JsonUtils.h:L824](../../SparkEngine/Source/Utils/JsonUtils.h#L824) | | | `guard` | function | SparkEngine | [JsonUtils.h:L862](../../SparkEngine/Source/Utils/JsonUtils.h#L862) | | | `guard` | function | Tests | [TestConsoleProcessPipeReal.cpp:L145](../../Tests/TestConsoleProcessPipeReal.cpp#L145) | | @@ -17149,7 +17177,7 @@ | `handle` | function | SparkCrashReporter | [CrashReporterApp.cpp:L977](../../SparkCrashReporter/src/CrashReporterApp.cpp#L977) | | | `handle` | function | SparkCrashReporter | [CrashReporterApp.cpp:L987](../../SparkCrashReporter/src/CrashReporterApp.cpp#L987) | | | `handle` | function | SparkEngine | [HeldHandles.h:L113](../../SparkEngine/Source/Engine/Modding/HeldHandles.h#L113) | | -| `handle` | function | SparkEngine | [SceneManager.cpp:L243](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L243) | | +| `handle` | function | SparkEngine | [SceneManager.cpp:L263](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L263) | | | `handle` | function | Tests | [TestOpaqueHandle.cpp:L17](../../Tests/TestOpaqueHandle.cpp#L17) | | | `handle` | function | Tests | [TestOpaqueHandle.cpp:L26](../../Tests/TestOpaqueHandle.cpp#L26) | | | `handle` | function | Tests | [TestOpaqueHandle.cpp:L35](../../Tests/TestOpaqueHandle.cpp#L35) | | @@ -17161,7 +17189,7 @@ | `HandleAllocator` | function | SparkEngine | [VersionedHandle.h:L72](../../SparkEngine/Source/Utils/VersionedHandle.h#L72) | Create an allocator with the given slot capacity. | | `HandleAllocator` | function | Tests | [TestVersionedHandle.cpp:L22](../../Tests/TestVersionedHandle.cpp#L22) | | | `HandleAssertion` | function | SparkEditor | [EditorCrashHandler.h:L74](../../SparkEditor/Source/Core/EditorCrashHandler.h#L74) | | -| `HandleBackspaceKey` | function | SparkConsole | [ConsoleApp.h:L95](../../SparkConsole/src/ConsoleApp.h#L95) | | +| `HandleBackspaceKey` | function | SparkConsole | [ConsoleApp.h:L96](../../SparkConsole/src/ConsoleApp.h#L96) | | | `HandleCanvasInput` | function | SparkEditor | [VisualScriptPanel.h:L140](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L140) | | | `HandleCharCreate` | function | GameModules | [TFServerSim.h:L218](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L218) | | | `HandleCharDelete` | function | GameModules | [TFServerSim.h:L219](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L219) | | @@ -17188,8 +17216,8 @@ | `HandleConsoleControl` | function | SparkServer | [main.cpp:L40](../../SparkServer/src/main.cpp#L40) | | | `HandleContinentHopRequest` | function | GameModules | [TFServerSim.h:L235](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L235) | | | `HandleCrashInternal` | function | SparkEditor | [EditorCrashHandler.h:L122](../../SparkEditor/Source/Core/EditorCrashHandler.h#L122) | | -| `HandleCrashInternal` | function | SparkEngine | [CrashHandler.cpp:L820](../../SparkEngine/Source/Utils/CrashHandler.cpp#L820) | | -| `HandleCrashInternal` | function | SparkEngine | [CrashHandler.cpp:L1058](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1058) | | +| `HandleCrashInternal` | function | SparkEngine | [CrashHandler.cpp:L821](../../SparkEngine/Source/Utils/CrashHandler.cpp#L821) | | +| `HandleCrashInternal` | function | SparkEngine | [CrashHandler.cpp:L1059](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1059) | | | `HandleDash` | function | GameModules | [PlatformerPlayerController.h:L179](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L179) | | | `handleDecodeFailure` | function | SparkEngine | [GraphicsDeviceResourcesWindowsTextures.cpp:L357](../../SparkEngine/Source/Graphics/GraphicsDeviceResourcesWindowsTextures.cpp#L357) | | | `handleDecodeFailure` | function | SparkEngine | [GraphicsDeviceResourcesWindowsTextures.cpp:L363](../../SparkEngine/Source/Graphics/GraphicsDeviceResourcesWindowsTextures.cpp#L363) | | @@ -17205,7 +17233,7 @@ | `HandleEvent` | function | SparkEditor | [AdvancedAssetPipeline.h:L279](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L279) | Handle panel events | | `HandleEvent` | function | SparkEditor | [EditorPanel.h:L87](../../SparkEditor/Source/Core/EditorPanel.h#L87) | Handle panel-specific events | | `HandleEvent` | function | SparkEditor | [LevelStreamingSystem.h:L89](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.h#L89) | Handle panel events | -| `HandleEvent` | function | SparkEditor | [AssetBrowserPanel.h:L67](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L67) | Handle panel events | +| `HandleEvent` | function | SparkEditor | [AssetBrowserPanel.h:L68](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L68) | Handle panel events | | `HandleEvent` | function | SparkEditor | [BuildCookPanel.h:L113](../../SparkEditor/Source/Panels/BuildCookPanel.h#L113) | | | `HandleEvent` | function | SparkEditor | [ConsolePanel.h:L106](../../SparkEditor/Source/Panels/ConsolePanel.h#L106) | | | `HandleEvent` | function | SparkEditor | [DebugVisualizerPanel.h:L34](../../SparkEditor/Source/Panels/DebugVisualizerPanel.h#L34) | | @@ -17243,9 +17271,9 @@ | `HandleInvalidateAsset` | function | SparkDaemon | [AssetService.cpp:L82](../../SparkDaemon/src/AssetService.cpp#L82) | | | `HandleInvalidateAsset` | function | SparkDaemon | [AssetService.h:L115](../../SparkDaemon/src/AssetService.h#L115) | | | `HandleJump` | function | GameModules | [PlatformerPlayerController.h:L177](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L177) | | -| `HandleKeyboardShortcuts` | function | SparkEditor | [EditorUI.h:L516](../../SparkEditor/Source/Core/EditorUI.h#L516) | | +| `HandleKeyboardShortcuts` | function | SparkEditor | [EditorUI.h:L514](../../SparkEditor/Source/Core/EditorUI.h#L514) | | | `HandleKillPlane` | function | GameModules | [PlatformerPlayerController.h:L173](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L173) | | -| `HandleLinuxCrash` | function | SparkEngine | [CrashHandler.cpp:L2570](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2570) | | +| `HandleLinuxCrash` | function | SparkEngine | [CrashHandler.cpp:L2616](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2616) | | | `HandleLogin` | function | GameModules | [TFServerSim.h:L213](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L213) | | | `HandleLoginProof` | function | GameModules | [TFServerSim.h:L214](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L214) | | | `HandleMessage` | function | SparkDaemon | [AssetService.h:L79](../../SparkDaemon/src/AssetService.h#L79) | Cap total cached bytes; oldest entries are evicted on overflow. | @@ -17253,8 +17281,8 @@ | `HandleMessage` | function | SparkDaemon | [ControlService.h:L43](../../SparkDaemon/src/ControlService.h#L43) | | | `HandleMessage` | function | SparkDaemon | [ServiceBase.h:L57](../../SparkDaemon/src/ServiceBase.h#L57) | Handle an incoming request frame. | | `HandleMessage` | function | SparkDaemon | [ShaderService.h:L87](../../SparkDaemon/src/ShaderService.h#L87) | | -| `HandleMessage` | function | SparkEngine | [InputManager.h:L155](../../SparkEngine/Source/Input/InputManager.h#L155) | | -| `HandleMouseButtonMessage` | function | SparkEngine | [InputManager.h:L446](../../SparkEngine/Source/Input/InputManager.h#L446) | Consolidated handler for mouse button down/up messages. | +| `HandleMessage` | function | SparkEngine | [InputManager.h:L157](../../SparkEngine/Source/Input/InputManager.h#L157) | | +| `HandleMouseButtonMessage` | function | SparkEngine | [InputManager.h:L453](../../SparkEngine/Source/Input/InputManager.h#L453) | Consolidated handler for mouse button down/up messages. | | `HandleNetworkChat` | function | GameModules | [MMOChatSystem.h:L180](../../GameModules/SparkGameMMO/Source/Chat/MMOChatSystem.h#L180) | | | `HandleObjectDragDrop` | function | SparkEditor | [HierarchyPanel.h:L300](../../SparkEditor/Source/Panels/HierarchyPanel.h#L300) | Handle object drag and drop | | `HandlePeerDisconnected` | function | GameModules | [MultiplayerSystem.h:L353](../../GameModules/SparkGameFPS/Source/Game/MultiplayerSystem.h#L353) | | @@ -17264,7 +17292,7 @@ | `HandlePlayerConnectToArea` | function | SparkEngine | [WorldServer.h:L237](../../SparkEngine/Source/Engine/Networking/WorldServer.h#L237) | Handle a new player connection placed by an external policy | | `HandlePlayerDisconnect` | function | SparkEngine | [WorldServer.h:L244](../../SparkEngine/Source/Engine/Networking/WorldServer.h#L244) | Handle player disconnection | | `HandlePlayerDisconnect` | function | Tests | [TestWorldServerRouting.cpp:L202](../../Tests/TestWorldServerRouting.cpp#L202) | | -| `HandlePrintableChar` | function | SparkConsole | [ConsoleApp.h:L96](../../SparkConsole/src/ConsoleApp.h#L96) | | +| `HandlePrintableChar` | function | SparkConsole | [ConsoleApp.h:L97](../../SparkConsole/src/ConsoleApp.h#L97) | | | `HandlePutAsset` | function | SparkDaemon | [AssetService.cpp:L80](../../SparkDaemon/src/AssetService.cpp#L80) | | | `HandlePutAsset` | function | SparkDaemon | [AssetService.h:L114](../../SparkDaemon/src/AssetService.h#L114) | | | `HandlePutCacheEntry` | function | SparkDaemon | [ShaderService.cpp:L91](../../SparkDaemon/src/ShaderService.cpp#L91) | | @@ -17276,7 +17304,7 @@ | `HandleRegister` | function | GameModules | [TFServerSim.h:L215](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L215) | | | `HandleReload` | function | SparkEngine | [WeaponManager.h:L295](../../SparkEngine/Source/Engine/Gameplay/WeaponManager.h#L295) | | | `HandleRetransmissions` | function | SparkEngine | [NetworkManager.h:L916](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L916) | | -| `HandleSDLEvent` | function | SparkEngine | [SparkEngineLinuxSDL2Events.cpp:L100](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2Events.cpp#L100) | Dispatch a single SDL event to the appropriate engine subsystem. | +| `HandleSDLEvent` | function | SparkEngine | [SparkEngineLinuxSDL2Events.cpp:L102](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2Events.cpp#L102) | Dispatch a single SDL event to the appropriate engine subsystem. | | `HandleSignal` | function | SparkDaemon | [CollabServerMain.cpp:L36](../../SparkDaemon/src/CollabServerMain.cpp#L36) | | | `HandleSignal` | function | SparkDaemon | [main.cpp:L76](../../SparkDaemon/src/main.cpp#L76) | | | `HandleSignal` | function | SparkGateway | [main.cpp:L51](../../SparkGateway/src/main.cpp#L51) | | @@ -17375,7 +17403,7 @@ | `HasFlag` | function | SparkEngine | [InputBindings.h:L85](../../SparkEngine/Source/Input/InputBindings.h#L85) | | | `HasFlag` | function | Tests | [TestConsoleVariables.cpp:L39](../../Tests/TestConsoleVariables.cpp#L39) | | | `HasFrameSample` | function | SparkEditor | [PerformanceProfiler.h:L192](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L192) | Whether at least one frame with a non-zero delta has been recorded | -| `HasFreshMoveState` | function | GameModules | [TFReplication.h:L72](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L72) | | +| `HasFreshMoveState` | function | GameModules | [TFReplication.h:L76](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L76) | | | `HasFullEngineBindings` | function | Tests | [TestFullEngineDiagnostics.cpp:L67](../../Tests/TestFullEngineDiagnostics.cpp#L67) | | | `HasGivenUp` | function | Tests | [TestSelfRecovery.cpp:L217](../../Tests/TestSelfRecovery.cpp#L217) | | | `HasGPUBuffers` | function | SparkEngine | [WaterRenderer.h:L215](../../SparkEngine/Source/Graphics/WaterRenderer.h#L215) | Check whether GPU buffers have been created. | @@ -17489,7 +17517,7 @@ | `HasSideEffects` | function | SparkEngine | [RenderGraphPass.h:L62](../../SparkEngine/Source/Graphics/RenderGraphPass.h#L62) | | | `HasSnapshot` | function | SparkEngine | [PlayModeManager.h:L371](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L371) | | | `HasSound` | function | Tests | [TestAudioEngine.cpp:L114](../../Tests/TestAudioEngine.cpp#L114) | | -| `HasStagedSibling` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L58](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L58) | | +| `HasStagedSibling` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L60](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L60) | | | `HasStagingSibling` | function | SparkInstaller | [InstallerTransactionTests.cpp:L476](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L476) | | | `HasStagingSibling` | function | SparkInstaller | [InstallerTransactionTests.cpp:L1089](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L1089) | | | `HasStencilComponent` | function | SparkEngine | [VulkanCommandList.cpp:L29](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanCommandList.cpp#L29) | | @@ -17511,8 +17539,8 @@ | `HasValidData` | function | SparkEngine | [DynamicQualityScaler.h:L87](../../SparkEngine/Source/Graphics/DynamicQualityScaler.h#L87) | Check if the scaler has enough data for a valid reading | | `HasValidItem` | function | SparkEngine | [EnvironmentQuery.h:L450](../../SparkEngine/Source/Engine/AI/EnvironmentQuery.h#L450) | | | `HasValidJoltBody` | function | SparkEngine | [PhysicsBodyImpl.cpp:L65](../../SparkEngine/Source/Physics/PhysicsBodyImpl.cpp#L65) | | -| `HasValidProjectRoot` | function | SparkEditor | [AssetBrowserPanel.cpp:L762](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L762) | | -| `HasValidProjectRoot` | function | SparkEditor | [AssetBrowserPanel.h:L111](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L111) | | +| `HasValidProjectRoot` | function | SparkEditor | [AssetBrowserPanel.cpp:L407](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L407) | | +| `HasValidProjectRoot` | function | SparkEditor | [AssetBrowserPanel.h:L121](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L121) | | | `HasValidV4Checksum` | function | Tests | [Test_persistence_SaveSystem.cpp:L230](../../Tests/harden/Test_persistence_SaveSystem.cpp#L230) | | | `HasValue` | function | Tests | [TestScriptHookManager.cpp:L48](../../Tests/TestScriptHookManager.cpp#L48) | | | `HasVertexSpace` | function | SparkEngine | [TransientBufferAllocator.h:L197](../../SparkEngine/Source/Graphics/RHI/TransientBufferAllocator.h#L197) | Check if there's room for a vertex allocation without actually allocating. | @@ -17531,7 +17559,7 @@ | `HdrTile` | function | Tests | [TestRHI240OpenGLGoldenReal.cpp:L257](../../Tests/TestRHI240OpenGLGoldenReal.cpp#L257) | | | `HeadCommit` | function | SparkInstaller | [GitRunner.h:L38](../../SparkInstaller/src/GitRunner.h#L38) | | | `header` | function | SparkDaemon | [OrchestrationJournal.cpp:L374](../../SparkDaemon/src/OrchestrationJournal.cpp#L374) | | -| `header` | function | Tests | [TestAssetParserHardening.cpp:L83](../../Tests/TestAssetParserHardening.cpp#L83) | | +| `header` | function | Tests | [TestAssetParserHardening.cpp:L99](../../Tests/TestAssetParserHardening.cpp#L99) | | | `header` | function | Tests | [TestD3D11DeviceContractsReal.cpp:L600](../../Tests/TestD3D11DeviceContractsReal.cpp#L600) | | | `header` | function | Tests | [TestGoldenImageTest.cpp:L388](../../Tests/TestGoldenImageTest.cpp#L388) | | | `headerBytes` | function | SparkDaemon | [OrchestrationJournal.cpp:L372](../../SparkDaemon/src/OrchestrationJournal.cpp#L372) | | @@ -17566,7 +17594,7 @@ | `Heartbeat` | function | SparkEngine | [FreezeDetector.h:L125](../../SparkEngine/Source/Utils/FreezeDetector.h#L125) | Called every frame from the main loop to signal liveness. | | `Heartbeat` | function | Tests | [TestFreezeDetector.cpp:L85](../../Tests/TestFreezeDetector.cpp#L85) | | | `HeavyFrame` | function | Tests | [TestEngineLoadTest.cpp:L266](../../Tests/TestEngineLoadTest.cpp#L266) | | -| `Height` | function | Tests | [TestTF120Travel.cpp:L107](../../Tests/TestTF120Travel.cpp#L107) | | +| `Height` | function | Tests | [TestTF120Travel.cpp:L94](../../Tests/TestTF120Travel.cpp#L94) | | | `HeightDensity` | function | SparkEngine | [FogSystem.h:L146](../../SparkEngine/Source/Graphics/FogSystem.h#L146) | | | `HeightGradient` | function | SparkEngine | [VolumetricClouds.h:L196](../../SparkEngine/Source/Graphics/VolumetricClouds.h#L196) | | | `heightmap` | function | SparkEngine | [ProceduralGenerator.h:L217](../../SparkEngine/Source/Engine/Procedural/ProceduralGenerator.h#L217) | | @@ -17641,7 +17669,7 @@ | `hintPos` | function | SparkEditor | [GameViewPanel.cpp:L825](../../SparkEditor/Source/Panels/GameViewPanel.cpp#L825) | | | `hintPos` | function | SparkEditor | [GameViewPanel.cpp:L833](../../SparkEditor/Source/Panels/GameViewPanel.cpp#L833) | | | `History` | function | Tests | [TestEditorAssetDropWorldReal.cpp:L47](../../Tests/TestEditorAssetDropWorldReal.cpp#L47) | | -| `History` | function | Tests | [TestEditorCookPackageReal.cpp:L96](../../Tests/TestEditorCookPackageReal.cpp#L96) | | +| `History` | function | Tests | [TestEditorCookPackageReal.cpp:L98](../../Tests/TestEditorCookPackageReal.cpp#L98) | | | `History` | function | Tests | [TestEditorDocumentReal.cpp:L25](../../Tests/TestEditorDocumentReal.cpp#L25) | | | `History` | function | Tests | [TestEditorUndoWorldMatrixReal.cpp:L37](../../Tests/TestEditorUndoWorldMatrixReal.cpp#L37) | | | `HistoryContains` | function | Tests | [TestMMOAuthNetwork.cpp:L236](../../Tests/TestMMOAuthNetwork.cpp#L236) | | @@ -17703,7 +17731,7 @@ | `Host` | function | SparkEditor | [CollaborativeEditSession.cpp:L434](../../SparkEditor/Source/Communication/CollaborativeEditSession.cpp#L434) | | | `Host` | function | SparkEditor | [CollaborativeEditSession.h:L286](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L286) | Host a new collaborative session on a TCP port | | `Host` | function | SparkEditor | [CollaborativeEditSession.h:L287](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L287) | Host a new collaborative session on a TCP port | -| `host` | function | Tests | [TestEditorCookPackageReal.cpp:L172](../../Tests/TestEditorCookPackageReal.cpp#L172) | | +| `host` | function | Tests | [TestEditorCookPackageReal.cpp:L174](../../Tests/TestEditorCookPackageReal.cpp#L174) | | | `host` | function | Tests | [TestRHI240LinuxForwardPassReal.cpp:L544](../../Tests/TestRHI240LinuxForwardPassReal.cpp#L544) | | | `host` | function | Tests | [TestRHI240LinuxForwardPassReal.cpp:L613](../../Tests/TestRHI240LinuxForwardPassReal.cpp#L613) | | | `HostAllocate` | function | SparkEngine | [DynamicPluginHost.cpp:L56](../../SparkEngine/Source/Core/DynamicPluginHost.cpp#L56) | | @@ -17801,7 +17829,7 @@ | `I` | function | GameModules | [RTSPersistenceCodec.cpp:L49](../../GameModules/SparkGameRTS/Source/Core/RTSPersistenceCodec.cpp#L49) | | | `I32` | function | GameModules | [RTSSkirmishSimulation.cpp:L50](../../GameModules/SparkGameRTS/Source/Simulation/RTSSkirmishSimulation.cpp#L50) | | | `iconPos` | function | SparkEditor | [EditorNotificationManager.cpp:L135](../../SparkEditor/Source/Core/EditorNotificationManager.cpp#L135) | | -| `iconRenderPos` | function | SparkEditor | [AssetBrowserPanel.cpp:L485](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L485) | | +| `iconRenderPos` | function | SparkEditor | [AssetBrowserGrid.cpp:L265](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L265) | | | `id` | function | SparkEngine | [AssetTypesWindowsMedia.cpp:L452](../../SparkEngine/Source/Graphics/AssetTypesWindowsMedia.cpp#L452) | | | `id` | function | Tests | [TestUUID.cpp:L96](../../Tests/TestUUID.cpp#L96) | | | `idA` | function | SparkEngine | [PhysicsConstraints.cpp:L54](../../SparkEngine/Source/Physics/PhysicsConstraints.cpp#L54) | | @@ -17878,12 +17906,12 @@ | `IM_COL32` | function | GameModules | [RTSDemoPresentation.cpp:L64](../../GameModules/SparkGameRTS/Source/Demo/RTSDemoPresentation.cpp#L64) | | | `IM_COL32` | function | GameModules | [RTSDemoPresentation.cpp:L66](../../GameModules/SparkGameRTS/Source/Demo/RTSDemoPresentation.cpp#L66) | | | `IM_COL32` | function | SparkEditor | [EditorTheme.cpp:L1259](../../SparkEditor/Source/Core/EditorTheme.cpp#L1259) | | -| `IM_COL32` | function | SparkEditor | [AssetBrowserPanel.cpp:L152](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L152) | | -| `IM_COL32` | function | SparkEditor | [AssetBrowserPanel.cpp:L154](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L154) | | -| `IM_COL32` | function | SparkEditor | [AssetBrowserPanel.cpp:L156](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L156) | | -| `IM_COL32` | function | SparkEditor | [AssetBrowserPanel.cpp:L158](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L158) | | -| `IM_COL32` | function | SparkEditor | [AssetBrowserPanel.cpp:L160](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L160) | | -| `IM_COL32` | function | SparkEditor | [AssetBrowserPanel.cpp:L161](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L161) | | +| `IM_COL32` | function | SparkEditor | [AssetBrowserGrid.cpp:L47](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L47) | | +| `IM_COL32` | function | SparkEditor | [AssetBrowserGrid.cpp:L49](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L49) | | +| `IM_COL32` | function | SparkEditor | [AssetBrowserGrid.cpp:L51](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L51) | | +| `IM_COL32` | function | SparkEditor | [AssetBrowserGrid.cpp:L53](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L53) | | +| `IM_COL32` | function | SparkEditor | [AssetBrowserGrid.cpp:L55](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L55) | | +| `IM_COL32` | function | SparkEditor | [AssetBrowserGrid.cpp:L56](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L56) | | | `IM_COL32` | function | SparkEditor | [RegionMapEditorCanvas.cpp:L35](../../SparkEditor/Source/Panels/RegionMapEditorCanvas.cpp#L35) | | | `IM_COL32` | function | SparkEditor | [RegionMapEditorCanvas.cpp:L37](../../SparkEditor/Source/Panels/RegionMapEditorCanvas.cpp#L37) | | | `IM_COL32` | function | SparkEditor | [RegionMapEditorCanvas.cpp:L39](../../SparkEditor/Source/Panels/RegionMapEditorCanvas.cpp#L39) | | @@ -17940,7 +17968,7 @@ | `ImpairmentFromEngineSettings` | function | SparkEngine | [InstabilitySimulator.cpp:L300](../../SparkEngine/Source/Engine/Networking/InstabilitySimulator.cpp#L300) | | | `Import` | function | SparkEngine | [RenderGraph.h:L181](../../SparkEngine/Source/Graphics/RenderGraph.h#L181) | | | `ImportAnimation` | function | SparkEngine | [GLTFAnimationLoader.cpp:L299](../../SparkEngine/Source/Graphics/GLTFAnimationLoader.cpp#L299) | | -| `ImportAsset` | function | SparkEditor | [AssetBrowserPanel.h:L93](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L93) | Import a file into the current folder of the active project. | +| `ImportAsset` | function | SparkEditor | [AssetBrowserPanel.h:L94](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L94) | Import a file into the current folder of the active project. | | `ImportAssetDatabase` | function | SparkEditor | [AdvancedAssetPipeline.h:L412](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L412) | Import asset database | | `ImportChannel` | function | SparkEngine | [GLTFAnimationLoader.cpp:L211](../../SparkEngine/Source/Graphics/GLTFAnimationLoader.cpp#L211) | | | `ImportedCorners` | function | Tests | [TestENG220ObjImportReal.cpp:L156](../../Tests/TestENG220ObjImportReal.cpp#L156) | | @@ -17961,8 +17989,8 @@ | `ImVec2` | function | GameModules | [RTSDemoPresentation.cpp:L382](../../GameModules/SparkGameRTS/Source/Demo/RTSDemoPresentation.cpp#L382) | | | `ImVec2` | function | SparkEditor | [GameViewPanel.cpp:L547](../../SparkEditor/Source/Panels/GameViewPanel.cpp#L547) | | | `ImVec2` | function | SparkEditor | [GameViewPanel.cpp:L557](../../SparkEditor/Source/Panels/GameViewPanel.cpp#L557) | | -| `ImVec2` | function | SparkEditor | [MaterialEditorPreview.cpp:L166](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L166) | | -| `ImVec2` | function | SparkEditor | [MaterialEditorPreview.cpp:L168](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L168) | | +| `ImVec2` | function | SparkEditor | [MaterialEditorPreview.cpp:L167](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L167) | | +| `ImVec2` | function | SparkEditor | [MaterialEditorPreview.cpp:L169](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L169) | | | `ImVec2` | function | SparkEditor | [TimeOfDayPanel.cpp:L199](../../SparkEditor/Source/Panels/TimeOfDayPanel.cpp#L199) | | | `ImVec2` | function | SparkEditor | [TimeOfDayPanel.cpp:L206](../../SparkEditor/Source/Panels/TimeOfDayPanel.cpp#L206) | | | `ImVec2` | function | SparkEditor | [WeaponEditorPanel.cpp:L411](../../SparkEditor/Source/Panels/WeaponEditorPanel.cpp#L411) | | @@ -18017,10 +18045,10 @@ | `in` | function | Tests | [TestDATA120SecretsAtRest.cpp:L52](../../Tests/TestDATA120SecretsAtRest.cpp#L52) | | | `in` | function | Tests | [TestDATA120SecretsAtRest.cpp:L92](../../Tests/TestDATA120SecretsAtRest.cpp#L92) | | | `in` | function | Tests | [TestDATA120SecretsAtRest.cpp:L163](../../Tests/TestDATA120SecretsAtRest.cpp#L163) | | -| `in` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L370](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L370) | | -| `in` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L465](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L465) | | +| `in` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L372](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L372) | | +| `in` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L467](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L467) | | | `in` | function | Tests | [TestEditorSubsystems.cpp:L1636](../../Tests/TestEditorSubsystems.cpp#L1636) | | -| `in` | function | Tests | [TestEditorSubsystemsReal.cpp:L205](../../Tests/TestEditorSubsystemsReal.cpp#L205) | | +| `in` | function | Tests | [TestEditorSubsystemsReal.cpp:L228](../../Tests/TestEditorSubsystemsReal.cpp#L228) | | | `in` | function | Tests | [TestGameModuleMMO.cpp:L115](../../Tests/TestGameModuleMMO.cpp#L115) | | | `in` | function | Tests | [TestGoldenImageTest.cpp:L387](../../Tests/TestGoldenImageTest.cpp#L387) | | | `in` | function | Tests | [TestMOD320MMOPersistenceReal.cpp:L47](../../Tests/TestMOD320MMOPersistenceReal.cpp#L47) | | @@ -18030,7 +18058,7 @@ | `in` | function | Tests | [TestMOD390VisualScriptHotReloadReal.cpp:L111](../../Tests/TestMOD390VisualScriptHotReloadReal.cpp#L111) | | | `in` | function | Tests | [TestSEC100ChatAuditLogReal.cpp:L86](../../Tests/TestSEC100ChatAuditLogReal.cpp#L86) | | | `in` | function | Tests | [TestSEC4NarrowPathsReal.cpp:L120](../../Tests/TestSEC4NarrowPathsReal.cpp#L120) | | -| `in` | function | Tests | [TestSparkPak.cpp:L772](../../Tests/TestSparkPak.cpp#L772) | | +| `in` | function | Tests | [TestSparkPak.cpp:L788](../../Tests/TestSparkPak.cpp#L788) | | | `in` | function | Tests | [TestSparkServerHealth.cpp:L365](../../Tests/TestSparkServerHealth.cpp#L365) | | | `in` | function | Tests | [TestTF120Residency.cpp:L53](../../Tests/TestTF120Residency.cpp#L53) | | | `in` | function | Tests | [TestTF120SharedSaveRoot.cpp:L49](../../Tests/TestTF120SharedSaveRoot.cpp#L49) | | @@ -18055,7 +18083,7 @@ | `indent` | function | SparkEditor | [PerformanceProfiler.cpp:L882](../../SparkEditor/Source/Profiler/PerformanceProfiler.cpp#L882) | | | `indent` | function | SparkEditor | [PerformanceProfiler.cpp:L1586](../../SparkEditor/Source/Profiler/PerformanceProfiler.cpp#L1586) | | | `Indent` | function | SparkEditor | [JSONSceneSerializer.cpp:L281](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L281) | | -| `indent` | function | SparkEngine | [SceneManager.cpp:L1194](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1194) | | +| `indent` | function | SparkEngine | [SceneManager.cpp:L1332](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1332) | | | `Index` | function | SparkEditor | [ServiceTopologyController.h:L87](../../SparkEditor/Source/Panels/ServiceTopologyController.h#L87) | | | `IndexBuffer` | function | SparkEngine | [MakeDesc.h:L311](../../SparkEngine/Source/Graphics/MakeDesc.h#L311) | Index buffer descriptor | | `indexDist` | function | GameModules | [ARPGLootSystem.cpp:L175](../../GameModules/SparkGameARPG/Source/Loot/ARPGLootSystem.cpp#L175) | | @@ -18193,7 +18221,7 @@ | `Initialize` | function | GameModules | [TFVehicleTerminal.h:L41](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleTerminal.h#L41) | | | `Initialize` | function | GameModules | [TFWeaponSystem.h:L46](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L46) | | | `Initialize` | function | GameModules | [TFClientNet.h:L76](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L76) | | -| `Initialize` | function | GameModules | [TFReplication.h:L59](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L59) | | +| `Initialize` | function | GameModules | [TFReplication.h:L63](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L63) | | | `Initialize` | function | GameModules | [TFServerSim.h:L60](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L60) | | | `Initialize` | function | GameModules | [TFChatWindow.h:L45](../../GameModules/SparkGameMMOFPS/Source/UI/TFChatWindow.h#L45) | | | `Initialize` | function | GameModules | [TFDeathRecap.h:L65](../../GameModules/SparkGameMMOFPS/Source/UI/TFDeathRecap.h#L65) | | @@ -18278,7 +18306,7 @@ | `Initialize` | function | SparkEditor | [AIEditorPanel.h:L28](../../SparkEditor/Source/Panels/AIEditorPanel.h#L28) | | | `Initialize` | function | SparkEditor | [AbilityEditorPanel.h:L29](../../SparkEditor/Source/Panels/AbilityEditorPanel.h#L29) | | | `Initialize` | function | SparkEditor | [AssetAuditGraph.h:L131](../../SparkEditor/Source/Panels/AssetAuditGraph.h#L131) | Initialize the dependency graph | -| `Initialize` | function | SparkEditor | [AssetBrowserPanel.h:L43](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L43) | Initialize the asset browser panel | +| `Initialize` | function | SparkEditor | [AssetBrowserPanel.h:L44](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L44) | Initialize the asset browser panel | | `Initialize` | function | SparkEditor | [AudioMixerPanel.h:L28](../../SparkEditor/Source/Panels/AudioMixerPanel.h#L28) | | | `Initialize` | function | SparkEditor | [BasicMaterialEditorPanel.h:L47](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L47) | | | `Initialize` | function | SparkEditor | [BuildCookPanel.h:L109](../../SparkEditor/Source/Panels/BuildCookPanel.h#L109) | | @@ -18567,7 +18595,7 @@ | `Initialize` | function | SparkEngine | [VoxelConeTracing.h:L325](../../SparkEngine/Source/Graphics/VoxelConeTracing.h#L325) | | | `Initialize` | function | SparkEngine | [WaterRenderer.h:L145](../../SparkEngine/Source/Graphics/WaterRenderer.h#L145) | Initialize the water renderer and generate default wave components. | | `Initialize` | function | SparkEngine | [InputActionSystem.h:L139](../../SparkEngine/Source/Input/InputActionSystem.h#L139) | Initialize the input action system | -| `Initialize` | function | SparkEngine | [InputManager.h:L131](../../SparkEngine/Source/Input/InputManager.h#L131) | Initialize the input manager with window handle | +| `Initialize` | function | SparkEngine | [InputManager.h:L133](../../SparkEngine/Source/Input/InputManager.h#L133) | Initialize the input manager with window handle | | `Initialize` | function | SparkEngine | [PlatformInput.h:L194](../../SparkEngine/Source/Input/PlatformInput.h#L194) | Initialize the backend. @return true on success. | | `Initialize` | function | SparkEngine | [PlatformInput.h:L249](../../SparkEngine/Source/Input/PlatformInput.h#L249) | No-op input backend for headless mode and unit tests. | | `Initialize` | function | SparkEngine | [IPhysicsBackend.h:L93](../../SparkEngine/Source/Physics/IPhysicsBackend.h#L93) | | @@ -18642,8 +18670,8 @@ | `InitializeAll` | function | SparkEngine | [PluginRegistry.h:L50](../../SparkEngine/Source/Core/PluginRegistry.h#L50) | Initialize all registered plugins (calls each initFn) | | `InitializeAll` | function | Tests | [TestECSystemOrdering.cpp:L217](../../Tests/TestECSystemOrdering.cpp#L217) | | | `InitializeBasicShaders` | function | SparkEngine | [GraphicsEngine.h:L1336](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L1336) | | -| `InitializeCommandPalette` | function | SparkEditor | [EditorUI.h:L515](../../SparkEditor/Source/Core/EditorUI.h#L515) | | -| `InitializeCrashArtifactDirectory` | function | SparkEngine | [CrashHandler.cpp:L533](../../SparkEngine/Source/Utils/CrashHandler.cpp#L533) | | +| `InitializeCommandPalette` | function | SparkEditor | [EditorUI.h:L513](../../SparkEditor/Source/Core/EditorUI.h#L513) | | +| `InitializeCrashArtifactDirectory` | function | SparkEngine | [CrashHandler.cpp:L534](../../SparkEngine/Source/Utils/CrashHandler.cpp#L534) | | | `InitializeDaemonLifecycle` | function | SparkEngine | [DaemonLifecycle.cpp:L296](../../SparkEngine/Source/Utils/DaemonLifecycle.cpp#L296) | | | `InitializeDaemonLifecycle` | function | SparkEngine | [DaemonLifecycle.h:L34](../../SparkEngine/Source/Utils/DaemonLifecycle.h#L34) | Called during engine startup (after InitGameplaySystems). | | `InitializeDebugSystemsImpl` | function | SparkEngine | [GameplayLifecycleShared.cpp:L361](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L361) | | @@ -18657,12 +18685,12 @@ | `InitializeDeferredLighting` | function | SparkEngine | [GraphicsEngine.h:L1348](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L1348) | | | `InitializeEcsPhaseSystemsImpl` | function | SparkEngine | [GameplayLifecycleShared.cpp:L904](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L904) | | | `InitializeEcsPhaseSystemsImpl` | function | SparkEngine | [GameplayLifecycleShared.h:L56](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.h#L56) | | -| `InitializeEnemies` | function | GameModules | [Game.h:L675](../../GameModules/SparkGameFPS/Source/Game/Game.h#L675) | Spawn enemy waves in the arena | -| `InitializeEngineSystems` | function | GameModules | [Game.h:L681](../../GameModules/SparkGameFPS/Source/Game/Game.h#L681) | Wire audio, weather, destruction, dialogue, and save systems | +| `InitializeEnemies` | function | GameModules | [Game.h:L699](../../GameModules/SparkGameFPS/Source/Game/Game.h#L699) | Spawn enemy waves in the arena | +| `InitializeEngineSystems` | function | GameModules | [Game.h:L705](../../GameModules/SparkGameFPS/Source/Game/Game.h#L705) | Wire audio, weather, destruction, dialogue, and save systems | | `InitializeFromContext` | function | GameModules | [SparkGameFPS.h:L66](../../GameModules/SparkGameFPS/Source/Core/SparkGameFPS.h#L66) | | | `InitializeFromDevice` | function | SparkEngine | [GraphicsEngine.h:L222](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L222) | | -| `InitializeGameModeAndHUD` | function | GameModules | [Game.h:L663](../../GameModules/SparkGameFPS/Source/Game/Game.h#L663) | Initialize GameMode, HUD, and wire event callbacks | -| `InitializeGameplaySystems` | function | GameModules | [Game.h:L678](../../GameModules/SparkGameFPS/Source/Game/Game.h#L678) | Initialize wave spawner, progression, and loot systems | +| `InitializeGameModeAndHUD` | function | GameModules | [Game.h:L687](../../GameModules/SparkGameFPS/Source/Game/Game.h#L687) | Initialize GameMode, HUD, and wire event callbacks | +| `InitializeGameplaySystems` | function | GameModules | [Game.h:L702](../../GameModules/SparkGameFPS/Source/Game/Game.h#L702) | Initialize wave spawner, progression, and loot systems | | `InitializeGameplaySystemsImpl` | function | SparkEngine | [GameplayLifecycleShared.cpp:L921](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L921) | | | `InitializeGameplaySystemsImpl` | function | SparkEngine | [GameplayLifecycleShared.h:L50](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.h#L50) | | | `InitializeGPU` | function | SparkEngine | [TemporalEffects.h:L185](../../SparkEngine/Source/Graphics/TemporalEffects.h#L185) | Initialize GPU resources for temporal effects | @@ -18670,40 +18698,42 @@ | `InitializeGraphicsForWindow` | function | SparkEngine | [SparkEngineLinuxSDL2.cpp:L80](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2.cpp#L80) | Construct and initialize GraphicsEngine against the given window / | | `InitializeHeadlessAssetServices` | function | SparkEngine | [EngineRuntime.h:L128](../../SparkEngine/Source/Core/EngineRuntime.h#L128) | Create and register the CPU-only asset services required by modules. | | `InitializeImGui` | function | SparkEditor | [EditorApplication.h:L125](../../SparkEditor/Source/Core/EditorApplication.h#L125) | | -| `InitializeInteractionObjects` | function | GameModules | [Game.h:L660](../../GameModules/SparkGameFPS/Source/Game/Game.h#L660) | Initialize interactive objects (doors, pickups, jump pads, etc.) | -| `InitializeInventorySystem` | function | GameModules | [Game.h:L666](../../GameModules/SparkGameFPS/Source/Game/Game.h#L666) | Register item definitions and configure player inventory | +| `InitializeInteractionObjects` | function | GameModules | [Game.h:L684](../../GameModules/SparkGameFPS/Source/Game/Game.h#L684) | Initialize interactive objects (doors, pickups, jump pads, etc.) | +| `InitializeInventorySystem` | function | GameModules | [Game.h:L690](../../GameModules/SparkGameFPS/Source/Game/Game.h#L690) | Register item definitions and configure player inventory | | `InitializeJobSystem` | function | SparkEngine | [EngineSetup.h:L94](../../SparkEngine/Source/Core/EngineSetup.h#L94) | Initialize the JobSystem with optimal thread count. | | `InitializeLFS` | function | SparkEditor | [VersionControlSystem.h:L463](../../SparkEditor/Source/VersionControl/VersionControlSystem.h#L463) | Initialize LFS if needed | | `InitializeLifecycleTestSystem` | function | Tests | [TestMemoryIntegrityLifecycle.cpp:L17](../../Tests/TestMemoryIntegrityLifecycle.cpp#L17) | | -| `InitializeManagers` | function | SparkEditor | [EditorUI.h:L519](../../SparkEditor/Source/Core/EditorUI.h#L519) | | +| `InitializeManagers` | function | SparkEditor | [EditorUI.h:L517](../../SparkEditor/Source/Core/EditorUI.h#L517) | | | `InitializeNetworkingSystemsImpl` | function | SparkEngine | [GameplayLifecycleShared.cpp:L883](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L883) | | | `InitializeNetworkingSystemsImpl` | function | SparkEngine | [GameplayLifecycleShared.h:L31](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.h#L31) | | | `InitializeOnLayoutFixtures` | function | Tests | [TestEditorStateCompatibility.cpp:L331](../../Tests/TestEditorStateCompatibility.cpp#L331) | | | `InitializeOnly` | function | SparkEngine | [DedicatedServer.h:L248](../../SparkEngine/Source/Engine/Networking/DedicatedServer.h#L248) | Initialize the server without starting the background | -| `InitializePanelCategories` | function | SparkEditor | [EditorUI.h:L513](../../SparkEditor/Source/Core/EditorUI.h#L513) | | -| `InitializePanelIcons` | function | SparkEditor | [EditorUI.h:L512](../../SparkEditor/Source/Core/EditorUI.h#L512) | | +| `InitializePanelCategories` | function | SparkEditor | [EditorUI.h:L511](../../SparkEditor/Source/Core/EditorUI.h#L511) | | +| `InitializePanelIcons` | function | SparkEditor | [EditorUI.h:L510](../../SparkEditor/Source/Core/EditorUI.h#L510) | | | `InitializePhysicsAndEcs` | function | Tests | [TestSubsystemIntegrationScenarios.cpp:L40](../../Tests/Integration/TestSubsystemIntegrationScenarios.cpp#L40) | | | `InitializePlayer` | function | GameModules | [RTSResourceSystem.h:L64](../../GameModules/SparkGameRTS/Source/Resource/RTSResourceSystem.h#L64) | | | `InitializePlayerProgress` | function | GameModules | [MMOGameplaySession.h:L69](../../GameModules/SparkGameMMO/Source/Gameplay/MMOGameplaySession.h#L69) | | | `InitializePlayerRep` | function | GameModules | [MMOReputationSystem.h:L80](../../GameModules/SparkGameMMO/Source/Reputation/MMOReputationSystem.h#L80) | | | `InitializePlayerState` | function | GameModules | [MMOAchievementSystem.h:L98](../../GameModules/SparkGameMMO/Source/Achievement/MMOAchievementSystem.h#L98) | | | `InitializeProductionLifecycle` | function | Tests | [TestEngineWiringReal.cpp:L81](../../Tests/TestEngineWiringReal.cpp#L81) | | -| `InitializeQuestSystem` | function | GameModules | [Game.h:L669](../../GameModules/SparkGameFPS/Source/Game/Game.h#L669) | Register quest definitions and start initial quests | +| `InitializeQuestSystem` | function | GameModules | [Game.h:L693](../../GameModules/SparkGameFPS/Source/Game/Game.h#L693) | Register quest definitions and start initial quests | | `InitializeRandom` | function | SparkEngine | [MathUtilsExtended.h:L60](../../SparkEngine/Source/Utils/MathUtilsExtended.h#L60) | Seed the random number generator from the system clock. | | `InitializeRayTracing` | function | SparkEngine | [MetalInterop.h:L19](../../SparkEngine/Source/Graphics/RHI/Metal/MetalInterop.h#L19) | | | `InitializeRayTracing` | function | SparkEngine | [MetalInterop.mm:L20](../../SparkEngine/Source/Graphics/RHI/Metal/MetalInterop.mm#L20) | | | `InitializeRepository` | function | SparkEditor | [VersionControlSystem.h:L92](../../SparkEditor/Source/VersionControl/VersionControlSystem.h#L92) | Initialize repository in directory | -| `InitializeRespawnAndVehicles` | function | GameModules | [Game.h:L672](../../GameModules/SparkGameFPS/Source/Game/Game.h#L672) | Initialize respawn points and spawn vehicles | +| `InitializeRespawnAndVehicles` | function | GameModules | [Game.h:L696](../../GameModules/SparkGameFPS/Source/Game/Game.h#L696) | Initialize respawn points and spawn vehicles | | `InitializeScriptingServiceImpl` | function | SparkEngine | [GameplayLifecycleShared.cpp:L784](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L784) | | | `InitializeScriptingServiceImpl` | function | SparkEngine | [GameplayLifecycleShared.h:L41](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.h#L41) | | | `InitializeSDL2Subsystems` | function | SparkEngine | [SparkEngineLinuxSDL2.cpp:L110](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2.cpp#L110) | | | `InitializeStage` | function | SparkEngine | [LifecycleCompositionRoot.h:L125](../../SparkEngine/Source/Core/Lifecycle/LifecycleCompositionRoot.h#L125) | | +| `InitializeStandardPBRParameters` | function | SparkEditor | [MaterialEditorDefaults.cpp:L9](../../SparkEditor/Source/Panels/MaterialEditorDefaults.cpp#L9) | Shared standard PBR schema used by authoring, decoding, and fuzzing. | +| `InitializeStandardPBRParameters` | function | SparkEditor | [MaterialEditorMaterialParser.h:L13](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.h#L13) | Append the editor's standard PBR parameters and texture slots. | | `InitializeSystems` | function | Tests | [SessionGatePeer.cpp:L230](../../Tests/Fixtures/SessionGatePeer.cpp#L230) | | | `InitializeValidated` | function | Tests | [TestRHI225D3D12ValidationReal.cpp:L103](../../Tests/TestRHI225D3D12ValidationReal.cpp#L103) | | | `InitializeWeightsXavier` | function | SparkEngine | [CpuNeuralTraining.h:L127](../../SparkEngine/Source/Graphics/Neural/CpuNeuralTraining.h#L127) | Fill @p weights with Xavier/Glorot-normal init, biases zero. | | `InitializeWindowedSubsystems` | function | SparkEngine | [SparkEngineWindowsInit.cpp:L211](../../SparkEngine/Source/Core/SparkEngineWindowsInit.cpp#L211) | | | `InitializeWindowedSubsystems` | function | SparkEngine | [SparkEngineWindowsInternal.h:L91](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L91) | Initialize windowed-mode subsystems, load modules, register commands. | -| `InitialLattice` | function | Tests | [TestTFRegionLattice.cpp:L134](../../Tests/TestTFRegionLattice.cpp#L134) | | +| `InitialLattice` | function | Tests | [TestTFRegionLattice.cpp:L127](../../Tests/TestTFRegionLattice.cpp#L127) | | | `InitInstance` | function | SparkEngine | [SparkEngineWindowsInternal.h:L103](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L103) | Run the engine in headless/dedicated server mode (Windows). | | `InitInstance` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L336](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L336) | | | `InitJet` | function | GameModules | [VehicleSystem.h:L352](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L352) | | @@ -18764,11 +18794,12 @@ | `input` | function | SparkDaemon | [OrchestrationJournal.cpp:L135](../../SparkDaemon/src/OrchestrationJournal.cpp#L135) | | | `input` | function | SparkDaemon | [OrchestrationJournal.cpp:L155](../../SparkDaemon/src/OrchestrationJournal.cpp#L155) | | | `input` | function | SparkDaemon | [ServiceTests.cpp:L519](../../SparkDaemon/tests/ServiceTests.cpp#L519) | | +| `input` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L234](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L234) | | | `input` | function | SparkEditor | [RegionMapDataSource.cpp:L46](../../SparkEditor/Source/Panels/RegionMapDataSource.cpp#L46) | | | `input` | function | SparkEditor | [PrefabAsset.cpp:L67](../../SparkEditor/Source/Prefabs/PrefabAsset.cpp#L67) | | | `input` | function | SparkEngine | [ExecScript.cpp:L58](../../SparkEngine/Source/Core/ExecScript.cpp#L58) | | | `input` | function | SparkEngine | [ReflectedScenePersistence.cpp:L58](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L58) | | -| `input` | function | SparkEngine | [SceneManagerReflected.cpp:L24](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L24) | | +| `input` | function | SparkEngine | [SceneManagerReflected.cpp:L36](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L36) | | | `input` | function | SparkEngine | [SaveFileDurability.cpp:L410](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L410) | | | `input` | function | SparkGateway | [GatewayAreaControl.cpp:L1272](../../SparkGateway/src/GatewayAreaControl.cpp#L1272) | | | `input` | function | SparkGateway | [GatewayAreaControl.cpp:L1375](../../SparkGateway/src/GatewayAreaControl.cpp#L1375) | | @@ -18791,8 +18822,10 @@ | `input` | function | Tests | [TestEditorSubsystems.cpp:L1334](../../Tests/TestEditorSubsystems.cpp#L1334) | | | `input` | function | Tests | [TestEditorSubsystems.cpp:L1357](../../Tests/TestEditorSubsystems.cpp#L1357) | | | `input` | function | Tests | [TestExecScript.cpp:L56](../../Tests/TestExecScript.cpp#L56) | | +| `input` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L62](../../Tests/TestFPSOwnedSaveDecode.cpp#L62) | | | `input` | function | Tests | [TestFileUtils.cpp:L531](../../Tests/TestFileUtils.cpp#L531) | | | `input` | function | Tests | [TestGamePackager.cpp:L242](../../Tests/TestGamePackager.cpp#L242) | | +| `input` | function | Tests | [TestInputFrameEdgesReal.cpp:L44](../../Tests/TestInputFrameEdgesReal.cpp#L44) | | | `input` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L272](../../Tests/TestLIFE200ModuleReloadReal.cpp#L272) | | | `input` | function | Tests | [TestLauncherProcess.cpp:L81](../../Tests/TestLauncherProcess.cpp#L81) | | | `input` | function | Tests | [TestMOD300ShowcaseLocalizationReal.cpp:L64](../../Tests/TestMOD300ShowcaseLocalizationReal.cpp#L64) | | @@ -18831,7 +18864,7 @@ | `input` | function | Tests | [Test_persistence_SaveSystem.cpp:L399](../../Tests/harden/Test_persistence_SaveSystem.cpp#L399) | | | `input` | function | Tests | [Test_persistence_SaveSystem.cpp:L987](../../Tests/harden/Test_persistence_SaveSystem.cpp#L987) | | | `input` | function | Tests | [Test_persistence_SaveSystem.cpp:L1056](../../Tests/harden/Test_persistence_SaveSystem.cpp#L1056) | | -| `InputAt` | function | Tests | [TestTF120Travel.cpp:L145](../../Tests/TestTF120Travel.cpp#L145) | | +| `InputAt` | function | Tests | [TestTF120Travel.cpp:L132](../../Tests/TestTF120Travel.cpp#L132) | | | `inputBatch` | function | SparkEngine | [NeuralTextureCompressor.cpp:L167](../../SparkEngine/Source/Graphics/Neural/NeuralTextureCompressor.cpp#L167) | | | `InputBindingManager::ApplyPreset` | method | SparkEngine | [InputBindings.cpp:L87](../../SparkEngine/Source/Input/InputBindings.cpp#L87) | | | `InputBindingManager::Console_GetAccessibilityStatus` | method | SparkEngine | [InputBindings.cpp:L185](../../SparkEngine/Source/Input/InputBindings.cpp#L185) | | @@ -18847,56 +18880,57 @@ | `inputFile` | function | Tests | [TestSceneSerializerReal.cpp:L264](../../Tests/TestSceneSerializerReal.cpp#L264) | | | `inputFile` | function | Tests | [TestSceneSerializerReal.cpp:L758](../../Tests/TestSceneSerializerReal.cpp#L758) | | | `inputLock` | function | SparkEngine | [NetworkConnection.cpp:L278](../../SparkEngine/Source/Engine/Networking/NetworkConnection.cpp#L278) | | -| `InputManager::ApplyDueTimedKeyReleases` | method | SparkEngine | [InputManager.cpp:L492](../../SparkEngine/Source/Input/InputManager.cpp#L492) | | -| `InputManager::CaptureMouse` | method | SparkEngine | [InputManager.cpp:L873](../../SparkEngine/Source/Input/InputManager.cpp#L873) | | -| `InputManager::CaptureMouse` | method | SparkEngine | [InputManager.cpp:L1006](../../SparkEngine/Source/Input/InputManager.cpp#L1006) | | -| `InputManager::Console_ApplySettings` | method | SparkEngine | [InputManager.cpp:L627](../../SparkEngine/Source/Input/InputManager.cpp#L627) | | -| `InputManager::Console_BindKey` | method | SparkEngine | [InputManager.cpp:L398](../../SparkEngine/Source/Input/InputManager.cpp#L398) | | -| `InputManager::Console_ClearInputStates` | method | SparkEngine | [InputManager.cpp:L526](../../SparkEngine/Source/Input/InputManager.cpp#L526) | | -| `InputManager::Console_GetMetrics` | method | SparkEngine | [InputManager.cpp:L606](../../SparkEngine/Source/Input/InputManager.cpp#L606) | | -| `InputManager::Console_GetRecentEvents` | method | SparkEngine | [InputManager.cpp:L540](../../SparkEngine/Source/Input/InputManager.cpp#L540) | | -| `InputManager::Console_GetSettings` | method | SparkEngine | [InputManager.cpp:L611](../../SparkEngine/Source/Input/InputManager.cpp#L611) | | -| `InputManager::Console_IsActionActive` | method | SparkEngine | [InputManager.cpp:L562](../../SparkEngine/Source/Input/InputManager.cpp#L562) | | -| `InputManager::Console_ListKeyBindings` | method | SparkEngine | [InputManager.cpp:L445](../../SparkEngine/Source/Input/InputManager.cpp#L445) | | -| `InputManager::Console_RefreshInput` | method | SparkEngine | [InputManager.cpp:L672](../../SparkEngine/Source/Input/InputManager.cpp#L672) | | -| `InputManager::Console_RegisterStateCallback` | method | SparkEngine | [InputManager.cpp:L665](../../SparkEngine/Source/Input/InputManager.cpp#L665) | | -| `InputManager::Console_ResetToDefaults` | method | SparkEngine | [InputManager.cpp:L647](../../SparkEngine/Source/Input/InputManager.cpp#L647) | | -| `InputManager::Console_SetInputLogging` | method | SparkEngine | [InputManager.cpp:L387](../../SparkEngine/Source/Input/InputManager.cpp#L387) | | -| `InputManager::Console_SetInvertMouseY` | method | SparkEngine | [InputManager.cpp:L369](../../SparkEngine/Source/Input/InputManager.cpp#L369) | | -| `InputManager::Console_SetMouseAcceleration` | method | SparkEngine | [InputManager.cpp:L360](../../SparkEngine/Source/Input/InputManager.cpp#L360) | | -| `InputManager::Console_SetMouseDeadZone` | method | SparkEngine | [InputManager.cpp:L344](../../SparkEngine/Source/Input/InputManager.cpp#L344) | | -| `InputManager::Console_SetMouseSensitivity` | method | SparkEngine | [InputManager.cpp:L328](../../SparkEngine/Source/Input/InputManager.cpp#L328) | | -| `InputManager::Console_SetRawMouseInput` | method | SparkEngine | [InputManager.cpp:L378](../../SparkEngine/Source/Input/InputManager.cpp#L378) | | -| `InputManager::Console_SimulateKeyPress` | method | SparkEngine | [InputManager.cpp:L462](../../SparkEngine/Source/Input/InputManager.cpp#L462) | | -| `InputManager::Console_UnbindKey` | method | SparkEngine | [InputManager.cpp:L427](../../SparkEngine/Source/Input/InputManager.cpp#L427) | | -| `InputManager::GetMetricsThreadSafe` | method | SparkEngine | [InputManager.cpp:L571](../../SparkEngine/Source/Input/InputManager.cpp#L571) | | -| `InputManager::GetMouseDelta` | method | SparkEngine | [InputManager.cpp:L263](../../SparkEngine/Source/Input/InputManager.cpp#L263) | | -| `InputManager::GetMousePosition` | method | SparkEngine | [InputManager.cpp:L268](../../SparkEngine/Source/Input/InputManager.cpp#L268) | | -| `InputManager::GetPendingTimedKeyReleaseCount` | method | SparkEngine | [InputManager.cpp:L520](../../SparkEngine/Source/Input/InputManager.cpp#L520) | | -| `InputManager::HandleMessage` | method | SparkEngine | [InputManager.cpp:L821](../../SparkEngine/Source/Input/InputManager.cpp#L821) | | -| `InputManager::HandleMessage` | method | SparkEngine | [InputManager.cpp:L961](../../SparkEngine/Source/Input/InputManager.cpp#L961) | | -| `InputManager::HandleMouseButtonMessage` | method | SparkEngine | [InputManager.cpp:L812](../../SparkEngine/Source/Input/InputManager.cpp#L812) | | -| `InputManager::Initialize` | method | SparkEngine | [InputManager.cpp:L706](../../SparkEngine/Source/Input/InputManager.cpp#L706) | | -| `InputManager::Initialize` | method | SparkEngine | [InputManager.cpp:L944](../../SparkEngine/Source/Input/InputManager.cpp#L944) | | -| `InputManager::IsKeyDown` | method | SparkEngine | [InputManager.cpp:L198](../../SparkEngine/Source/Input/InputManager.cpp#L198) | | -| `InputManager::IsKeyUp` | method | SparkEngine | [InputManager.cpp:L205](../../SparkEngine/Source/Input/InputManager.cpp#L205) | | -| `InputManager::IsMouseButtonDown` | method | SparkEngine | [InputManager.cpp:L228](../../SparkEngine/Source/Input/InputManager.cpp#L228) | | +| `InputManager::ApplyDueTimedKeyReleases` | method | SparkEngine | [InputManager.cpp:L515](../../SparkEngine/Source/Input/InputManager.cpp#L515) | | +| `InputManager::CaptureMouse` | method | SparkEngine | [InputManager.cpp:L896](../../SparkEngine/Source/Input/InputManager.cpp#L896) | | +| `InputManager::CaptureMouse` | method | SparkEngine | [InputManager.cpp:L1029](../../SparkEngine/Source/Input/InputManager.cpp#L1029) | | +| `InputManager::Console_ApplySettings` | method | SparkEngine | [InputManager.cpp:L650](../../SparkEngine/Source/Input/InputManager.cpp#L650) | | +| `InputManager::Console_BindKey` | method | SparkEngine | [InputManager.cpp:L421](../../SparkEngine/Source/Input/InputManager.cpp#L421) | | +| `InputManager::Console_ClearInputStates` | method | SparkEngine | [InputManager.cpp:L549](../../SparkEngine/Source/Input/InputManager.cpp#L549) | | +| `InputManager::Console_GetMetrics` | method | SparkEngine | [InputManager.cpp:L629](../../SparkEngine/Source/Input/InputManager.cpp#L629) | | +| `InputManager::Console_GetRecentEvents` | method | SparkEngine | [InputManager.cpp:L563](../../SparkEngine/Source/Input/InputManager.cpp#L563) | | +| `InputManager::Console_GetSettings` | method | SparkEngine | [InputManager.cpp:L634](../../SparkEngine/Source/Input/InputManager.cpp#L634) | | +| `InputManager::Console_IsActionActive` | method | SparkEngine | [InputManager.cpp:L585](../../SparkEngine/Source/Input/InputManager.cpp#L585) | | +| `InputManager::Console_ListKeyBindings` | method | SparkEngine | [InputManager.cpp:L468](../../SparkEngine/Source/Input/InputManager.cpp#L468) | | +| `InputManager::Console_RefreshInput` | method | SparkEngine | [InputManager.cpp:L695](../../SparkEngine/Source/Input/InputManager.cpp#L695) | | +| `InputManager::Console_RegisterStateCallback` | method | SparkEngine | [InputManager.cpp:L688](../../SparkEngine/Source/Input/InputManager.cpp#L688) | | +| `InputManager::Console_ResetToDefaults` | method | SparkEngine | [InputManager.cpp:L670](../../SparkEngine/Source/Input/InputManager.cpp#L670) | | +| `InputManager::Console_SetInputLogging` | method | SparkEngine | [InputManager.cpp:L410](../../SparkEngine/Source/Input/InputManager.cpp#L410) | | +| `InputManager::Console_SetInvertMouseY` | method | SparkEngine | [InputManager.cpp:L392](../../SparkEngine/Source/Input/InputManager.cpp#L392) | | +| `InputManager::Console_SetMouseAcceleration` | method | SparkEngine | [InputManager.cpp:L383](../../SparkEngine/Source/Input/InputManager.cpp#L383) | | +| `InputManager::Console_SetMouseDeadZone` | method | SparkEngine | [InputManager.cpp:L367](../../SparkEngine/Source/Input/InputManager.cpp#L367) | | +| `InputManager::Console_SetMouseSensitivity` | method | SparkEngine | [InputManager.cpp:L351](../../SparkEngine/Source/Input/InputManager.cpp#L351) | | +| `InputManager::Console_SetRawMouseInput` | method | SparkEngine | [InputManager.cpp:L401](../../SparkEngine/Source/Input/InputManager.cpp#L401) | | +| `InputManager::Console_SimulateKeyPress` | method | SparkEngine | [InputManager.cpp:L485](../../SparkEngine/Source/Input/InputManager.cpp#L485) | | +| `InputManager::Console_UnbindKey` | method | SparkEngine | [InputManager.cpp:L450](../../SparkEngine/Source/Input/InputManager.cpp#L450) | | +| `InputManager::GetMetricsThreadSafe` | method | SparkEngine | [InputManager.cpp:L594](../../SparkEngine/Source/Input/InputManager.cpp#L594) | | +| `InputManager::GetMouseDelta` | method | SparkEngine | [InputManager.cpp:L286](../../SparkEngine/Source/Input/InputManager.cpp#L286) | | +| `InputManager::GetMousePosition` | method | SparkEngine | [InputManager.cpp:L291](../../SparkEngine/Source/Input/InputManager.cpp#L291) | | +| `InputManager::GetPendingTimedKeyReleaseCount` | method | SparkEngine | [InputManager.cpp:L543](../../SparkEngine/Source/Input/InputManager.cpp#L543) | | +| `InputManager::HandleMessage` | method | SparkEngine | [InputManager.cpp:L844](../../SparkEngine/Source/Input/InputManager.cpp#L844) | | +| `InputManager::HandleMessage` | method | SparkEngine | [InputManager.cpp:L984](../../SparkEngine/Source/Input/InputManager.cpp#L984) | | +| `InputManager::HandleMouseButtonMessage` | method | SparkEngine | [InputManager.cpp:L835](../../SparkEngine/Source/Input/InputManager.cpp#L835) | | +| `InputManager::Initialize` | method | SparkEngine | [InputManager.cpp:L729](../../SparkEngine/Source/Input/InputManager.cpp#L729) | | +| `InputManager::Initialize` | method | SparkEngine | [InputManager.cpp:L967](../../SparkEngine/Source/Input/InputManager.cpp#L967) | | +| `InputManager::IsFrameKeyDown` | method | SparkEngine | [InputManager.cpp:L233](../../SparkEngine/Source/Input/InputManager.cpp#L233) | | +| `InputManager::IsKeyDown` | method | SparkEngine | [InputManager.cpp:L222](../../SparkEngine/Source/Input/InputManager.cpp#L222) | | +| `InputManager::IsKeyUp` | method | SparkEngine | [InputManager.cpp:L228](../../SparkEngine/Source/Input/InputManager.cpp#L228) | | +| `InputManager::IsMouseButtonDown` | method | SparkEngine | [InputManager.cpp:L250](../../SparkEngine/Source/Input/InputManager.cpp#L250) | | | `InputManager::KeyNameToVirtualKey` | method | SparkEngine | [InputManager.cpp:L182](../../SparkEngine/Source/Input/InputManager.cpp#L182) | | -| `InputManager::LatchFrameEdges` | method | SparkEngine | [InputManager.cpp:L246](../../SparkEngine/Source/Input/InputManager.cpp#L246) | | -| `InputManager::LogInputEvent` | method | SparkEngine | [InputManager.cpp:L308](../../SparkEngine/Source/Input/InputManager.cpp#L308) | | -| `InputManager::NotifyStateChange` | method | SparkEngine | [InputManager.cpp:L318](../../SparkEngine/Source/Input/InputManager.cpp#L318) | | -| `InputManager::ProcessMouseDelta` | method | SparkEngine | [InputManager.cpp:L285](../../SparkEngine/Source/Input/InputManager.cpp#L285) | | -| `InputManager::Update` | method | SparkEngine | [InputManager.cpp:L728](../../SparkEngine/Source/Input/InputManager.cpp#L728) | | -| `InputManager::Update` | method | SparkEngine | [InputManager.cpp:L952](../../SparkEngine/Source/Input/InputManager.cpp#L952) | | -| `InputManager::UpdateKeyState` | method | SparkEngine | [InputManager.cpp:L865](../../SparkEngine/Source/Input/InputManager.cpp#L865) | | -| `InputManager::UpdateKeyState` | method | SparkEngine | [InputManager.cpp:L995](../../SparkEngine/Source/Input/InputManager.cpp#L995) | | -| `InputManager::UpdateMouseButton` | method | SparkEngine | [InputManager.cpp:L273](../../SparkEngine/Source/Input/InputManager.cpp#L273) | | -| `InputManager::UpdateMousePosition` | method | SparkEngine | [InputManager.cpp:L279](../../SparkEngine/Source/Input/InputManager.cpp#L279) | | +| `InputManager::LatchFrameEdges` | method | SparkEngine | [InputManager.cpp:L268](../../SparkEngine/Source/Input/InputManager.cpp#L268) | | +| `InputManager::LogInputEvent` | method | SparkEngine | [InputManager.cpp:L331](../../SparkEngine/Source/Input/InputManager.cpp#L331) | | +| `InputManager::NotifyStateChange` | method | SparkEngine | [InputManager.cpp:L341](../../SparkEngine/Source/Input/InputManager.cpp#L341) | | +| `InputManager::ProcessMouseDelta` | method | SparkEngine | [InputManager.cpp:L308](../../SparkEngine/Source/Input/InputManager.cpp#L308) | | +| `InputManager::Update` | method | SparkEngine | [InputManager.cpp:L751](../../SparkEngine/Source/Input/InputManager.cpp#L751) | | +| `InputManager::Update` | method | SparkEngine | [InputManager.cpp:L975](../../SparkEngine/Source/Input/InputManager.cpp#L975) | | +| `InputManager::UpdateKeyState` | method | SparkEngine | [InputManager.cpp:L888](../../SparkEngine/Source/Input/InputManager.cpp#L888) | | +| `InputManager::UpdateKeyState` | method | SparkEngine | [InputManager.cpp:L1018](../../SparkEngine/Source/Input/InputManager.cpp#L1018) | | +| `InputManager::UpdateMouseButton` | method | SparkEngine | [InputManager.cpp:L296](../../SparkEngine/Source/Input/InputManager.cpp#L296) | | +| `InputManager::UpdateMousePosition` | method | SparkEngine | [InputManager.cpp:L302](../../SparkEngine/Source/Input/InputManager.cpp#L302) | | | `InputManager::VirtualKeyToKeyName` | method | SparkEngine | [InputManager.cpp:L191](../../SparkEngine/Source/Input/InputManager.cpp#L191) | | -| `InputManager::WasKeyPressed` | method | SparkEngine | [InputManager.cpp:L216](../../SparkEngine/Source/Input/InputManager.cpp#L216) | | -| `InputManager::WasKeyReleased` | method | SparkEngine | [InputManager.cpp:L222](../../SparkEngine/Source/Input/InputManager.cpp#L222) | | -| `InputManager::WasMouseButtonPressed` | method | SparkEngine | [InputManager.cpp:L234](../../SparkEngine/Source/Input/InputManager.cpp#L234) | | -| `InputManager::WasMouseButtonReleased` | method | SparkEngine | [InputManager.cpp:L240](../../SparkEngine/Source/Input/InputManager.cpp#L240) | | +| `InputManager::WasKeyPressed` | method | SparkEngine | [InputManager.cpp:L238](../../SparkEngine/Source/Input/InputManager.cpp#L238) | | +| `InputManager::WasKeyReleased` | method | SparkEngine | [InputManager.cpp:L244](../../SparkEngine/Source/Input/InputManager.cpp#L244) | | +| `InputManager::WasMouseButtonPressed` | method | SparkEngine | [InputManager.cpp:L256](../../SparkEngine/Source/Input/InputManager.cpp#L256) | | +| `InputManager::WasMouseButtonReleased` | method | SparkEngine | [InputManager.cpp:L262](../../SparkEngine/Source/Input/InputManager.cpp#L262) | | | `inputPatch` | function | SparkEngine | [NeuralPostProcessing.cpp:L396](../../SparkEngine/Source/Graphics/Neural/NeuralPostProcessing.cpp#L396) | | | `inputs` | function | SparkEngine | [NeuralTextureCompressor.cpp:L81](../../SparkEngine/Source/Graphics/Neural/NeuralTextureCompressor.cpp#L81) | | | `inputs` | function | Tests | [TestFPSMultiplayer.cpp:L1005](../../Tests/TestFPSMultiplayer.cpp#L1005) | | @@ -18936,8 +18970,8 @@ | `InsertOrReplace` | function | SparkDaemon | [ShaderService.h:L135](../../SparkDaemon/src/ShaderService.h#L135) | | | `InsertOrUpdate` | function | SparkEngine | [LocalFileCache.h:L367](../../SparkEngine/Source/Utils/LocalFileCache.h#L367) | | | `InsertPoint` | function | SparkEngine | [SplinePath.h:L69](../../SparkEngine/Source/Utils/SplinePath.h#L69) | Insert a control point at the given index. | -| `InSet` | function | Tests | [TestTFDataTables.cpp:L90](../../Tests/TestTFDataTables.cpp#L90) | | -| `InSet` | function | Tests | [TestTFDataTables.cpp:L95](../../Tests/TestTFDataTables.cpp#L95) | | +| `InSet` | function | Tests | [TestTFDataTables.cpp:L81](../../Tests/TestTFDataTables.cpp#L81) | | +| `InSet` | function | Tests | [TestTFDataTables.cpp:L86](../../Tests/TestTFDataTables.cpp#L86) | | | `Inside` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L569](../../Tests/TestRHI225D3D12ParityReal.cpp#L569) | | | `Inside` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L689](../../Tests/TestRHI225D3D12ParityReal.cpp#L689) | | | `inside` | function | Tests | [TestSecurityParsersReal.cpp:L426](../../Tests/TestSecurityParsersReal.cpp#L426) | | @@ -19023,12 +19057,12 @@ | `Install` | function | GameModules | [TFHandoffParticipant.h:L30](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.h#L30) | | | `Install` | function | GameModules | [TFServerSim.h:L142](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L142) | Game-thread handoff callbacks; the host dispatcher serializes control requests with simulation. | | `Install` | function | Tests | [TestTF120Migration.cpp:L90](../../Tests/TestTF120Migration.cpp#L90) | | -| `Install` | function | Tests | [TestTF120Travel.cpp:L230](../../Tests/TestTF120Travel.cpp#L230) | | -| `Install` | function | Tests | [TestTF120Travel.cpp:L259](../../Tests/TestTF120Travel.cpp#L259) | | +| `Install` | function | Tests | [TestTF120Travel.cpp:L217](../../Tests/TestTF120Travel.cpp#L217) | | +| `Install` | function | Tests | [TestTF120Travel.cpp:L246](../../Tests/TestTF120Travel.cpp#L246) | | | `InstallAssetPipelineLoader` | function | SparkEngine | [FoliageRenderer.h:L197](../../SparkEngine/Source/Graphics/FoliageRenderer.h#L197) | | -| `InstallCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L925](../../SparkEngine/Source/Utils/CrashHandler.cpp#L925) | | -| `InstallCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2646](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2646) | | -| `InstallCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2829](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2829) | | +| `InstallCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L926](../../SparkEngine/Source/Utils/CrashHandler.cpp#L926) | | +| `InstallCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2692](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2692) | | +| `InstallCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2875](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2875) | | | `InstallCrashHandler` | function | SparkEngine | [CrashHandler.h:L81](../../SparkEngine/Source/Utils/CrashHandler.h#L81) | | | `InstallCrashHandler` | function | SparkEngine | [CrashHandlerStub.cpp:L14](../../SparkEngine/Source/Utils/CrashHandlerStub.cpp#L14) | | | `InstallCrashHandlers` | function | Tests | [TestMain.cpp:L279](../../Tests/TestMain.cpp#L279) | | @@ -19053,7 +19087,7 @@ | `instance` | function | SparkEngine | [GameplaySystemLifecycle.cpp:L107](../../SparkEngine/Source/Core/GameplaySystemLifecycle.cpp#L107) | | | `Instance` | function | SparkEngine | [SceneSnapshotSerializer.h:L121](../../SparkEngine/Source/Engine/Editor/SceneSnapshotSerializer.h#L121) | | | `Instance` | function | SparkEngine | [DaemonConnection.h:L45](../../SparkEngine/Source/Utils/DaemonConnection.h#L45) | | -| `Instance` | function | Tests | [TestEditorSubsystemsReal.cpp:L310](../../Tests/TestEditorSubsystemsReal.cpp#L310) | | +| `Instance` | function | Tests | [TestEditorSubsystemsReal.cpp:L333](../../Tests/TestEditorSubsystemsReal.cpp#L333) | | | `instance` | function | Tests | [TestMaterialDefinition.cpp:L96](../../Tests/TestMaterialDefinition.cpp#L96) | | | `instance` | function | Tests | [TestMaterialDefinition.cpp:L125](../../Tests/TestMaterialDefinition.cpp#L125) | | | `instance` | function | Tests | [TestMaterialDefinition.cpp:L147](../../Tests/TestMaterialDefinition.cpp#L147) | | @@ -19086,7 +19120,7 @@ | `InstanceManager::StartEncounter` | method | SparkEngine | [InstanceEncounters.cpp:L23](../../SparkEngine/Source/Engine/Gameplay/InstanceEncounters.cpp#L23) | | | `InstanceManager::Update` | method | SparkEngine | [InstanceManager.cpp:L102](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.cpp#L102) | | | `InstantEvent` | function | SparkEngine | [ChromeTracing.h:L102](../../SparkEngine/Source/Utils/ChromeTracing.h#L102) | | -| `InstantiateNodes` | function | SparkEngine | [SceneManager.h:L529](../../SparkEngine/Source/SceneManager/SceneManager.h#L529) | Create `GameObject` instances for all nodes in `m_sceneNodes`. | +| `InstantiateNodes` | function | SparkEngine | [SceneManager.h:L531](../../SparkEngine/Source/SceneManager/SceneManager.h#L531) | Create `GameObject` instances for all nodes in `m_sceneNodes`. | | `InstantiatePrefab` | function | SparkEditor | [PrefabManager.h:L83](../../SparkEditor/Source/Prefabs/PrefabManager.h#L83) | Instantiate a prefab into the scene | | `InSymbolOperation` | function | SparkEngine | [StackTrace.h:L237](../../SparkEngine/Source/Utils/StackTrace.h#L237) | | | `Int` | function | SparkEngine | [RandomEngine.h:L92](../../SparkEngine/Source/Utils/RandomEngine.h#L92) | Generate a uniform random integer in [min, max]. | @@ -19193,6 +19227,7 @@ | `InvalidateProbe` | function | SparkEngine | [ReflectionProbeCache.h:L212](../../SparkEngine/Source/Graphics/ReflectionProbeCache.h#L212) | Invalidate a probe's cache (e.g., scene changed near it) | | `InvalidateSceneBasicMaterials` | function | GameModules | [Game.h:L623](../../GameModules/SparkGameFPS/Source/Game/Game.h#L623) | | | `InvalidateShadow` | function | SparkEngine | [CachedShadowAtlas.h:L223](../../SparkEngine/Source/Graphics/CachedShadowAtlas.h#L223) | Invalidate a cached shadow (e.g., scene geometry changed near light) | +| `invalidFile` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L286](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L286) | | | `InvalidStateDetector::AddRule` | method | SparkEngine | [InvalidStateDetector.cpp:L124](../../SparkEngine/Source/Utils/InvalidStateDetector.cpp#L124) | | | `InvalidStateDetector::ClearRules` | method | SparkEngine | [InvalidStateDetector.cpp:L165](../../SparkEngine/Source/Utils/InvalidStateDetector.cpp#L165) | | | `InvalidStateDetector::GetInstance` | method | SparkEngine | [InvalidStateDetector.cpp:L33](../../SparkEngine/Source/Utils/InvalidStateDetector.cpp#L33) | | @@ -19262,7 +19297,7 @@ | `IsActionNode` | function | SparkEngine | [VisualScriptCodegen.cpp:L24](../../SparkEngine/Source/Engine/Scripting/VisualScriptCodegen.cpp#L24) | | | `IsActionPressed` | function | SparkEngine | [PlatformInput.h:L329](../../SparkEngine/Source/Input/PlatformInput.h#L329) | Check if an action is currently held. | | `IsActionTriggered` | function | SparkEngine | [InputActionSystem.h:L453](../../SparkEngine/Source/Input/InputActionSystem.h#L453) | Check if a button action was triggered this frame | -| `IsActive` | function | GameModules | [FPSWeatherIntegration.h:L48](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L48) | | +| `IsActive` | function | GameModules | [FPSWeatherIntegration.h:L50](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L50) | | | `IsActive` | function | GameModules | [MultiplayerSystem.h:L284](../../GameModules/SparkGameFPS/Source/Game/MultiplayerSystem.h#L284) | Check if a session is open: hosting (server), or connecting or connected (client). | | `IsActive` | function | GameModules | [Projectile.h:L139](../../GameModules/SparkGameFPS/Source/Projectiles/Projectile.h#L139) | Check if projectile is currently active | | `IsActive` | function | GameModules | [TFSpectator.h:L125](../../GameModules/SparkGameMMOFPS/Source/Game/TFSpectator.h#L125) | | @@ -19291,7 +19326,7 @@ | `IsAreaLoadComplete` | function | SparkEngine | [AreaAssetLoader.h:L127](../../SparkEngine/Source/Engine/Streaming/AreaAssetLoader.h#L127) | Check if an area's load is fully complete | | `IsAreaLoadComplete` | function | Tests | [TestAreaAssetLoader.cpp:L123](../../Tests/TestAreaAssetLoader.cpp#L123) | | | `IsAssetLoaded` | function | SparkEngine | [AssetPipeline.h:L434](../../SparkEngine/Source/Graphics/AssetPipeline.h#L434) | | -| `IsAsyncLoading` | function | SparkEngine | [SceneManager.h:L407](../../SparkEngine/Source/SceneManager/SceneManager.h#L407) | Check if an asynchronous scene load is in progress. | +| `IsAsyncLoading` | function | SparkEngine | [SceneManager.h:L409](../../SparkEngine/Source/SceneManager/SceneManager.h#L409) | Check if an asynchronous scene load is in progress. | | `IsAudibleUnderSolo` | function | SparkEngine | [AudioMixer.h:L375](../../SparkEngine/Source/Audio/AudioMixer.h#L375) | Whether a bus survives the current solo selection. | | `IsAudioBackendAvailable` | function | SparkEngine | [AudioEngine.h:L141](../../SparkEngine/Source/Audio/AudioEngine.h#L141) | Check whether a real audio backend is available on this platform | | `IsAuditRecordLine` | function | Tests | [TestSEC100ChatAuditLogReal.cpp:L101](../../Tests/TestSEC100ChatAuditLogReal.cpp#L101) | | @@ -19348,7 +19383,7 @@ | `IsCanonicalEndpoint` | function | SparkEngine | [NetworkTrustStore.cpp:L177](../../SparkEngine/Source/Engine/Networking/NetworkTrustStore.cpp#L177) | | | `IsCanonicalJsonNumber` | function | SparkEngine | [DataTableSystem.h:L716](../../SparkEngine/Source/Engine/DataTable/DataTableSystem.h#L716) | | | `IsCapturable` | function | GameModules | [TFRegionSystem.h:L92](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.h#L92) | | -| `IsCapturable` | function | Tests | [TestTFRegionLattice.cpp:L142](../../Tests/TestTFRegionLattice.cpp#L142) | | +| `IsCapturable` | function | Tests | [TestTFRegionLattice.cpp:L135](../../Tests/TestTFRegionLattice.cpp#L135) | | | `IsCaptureReason` | function | GameModules | [TFDirectiveSystem.cpp:L36](../../GameModules/SparkGameMMOFPS/Source/Game/TFDirectiveSystem.cpp#L36) | | | `IsCategoryEnabled` | function | SparkEditor | [EditorLogger.h:L215](../../SparkEditor/Source/Core/EditorLogger.h#L215) | | | `IsCategoryEnabled` | function | SparkEngine | [GameplayDebugger.h:L180](../../SparkEngine/Source/Utils/GameplayDebugger.h#L180) | Check if a category is enabled | @@ -19396,7 +19431,7 @@ | `IsConfigLikeFile` | function | Tests | [TestDATA120SecretsAtRest.cpp:L143](../../Tests/TestDATA120SecretsAtRest.cpp#L143) | | | `IsConfigurationValid` | function | SparkEngine | [LifecycleCompositionRoot.h:L121](../../SparkEngine/Source/Core/Lifecycle/LifecycleCompositionRoot.h#L121) | | | `IsConfigured` | function | SparkEngine | [NeuralFunctionApproximator.h:L113](../../SparkEngine/Source/Graphics/Neural/NeuralFunctionApproximator.h#L113) | Check if the approximator has a valid architecture. | -| `IsConfinedRelativeScenePath` | function | SparkEngine | [SceneManager.cpp:L205](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L205) | | +| `IsConfinedRelativeScenePath` | function | SparkEngine | [SceneManager.cpp:L219](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L219) | | | `IsConnected` | function | GameModules | [MultiplayerSystem.h:L292](../../GameModules/SparkGameFPS/Source/Game/MultiplayerSystem.h#L292) | Check if the session is live: hosting (server), or admitted with an assigned id (client). | | `IsConnected` | function | GameModules | [TFClientNet.h:L83](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L83) | | | `IsConnected` | function | SparkEditor | [CollaborativeEditSession.h:L323](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L323) | Check if connected to a session | @@ -19418,10 +19453,10 @@ | `IsContained` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L1548](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L1548) | | | `IsContained` | function | SparkCooker | [main.cpp:L75](../../SparkCooker/src/main.cpp#L75) | | | `IsContainedBy` | function | SparkEngine | [ProjectAssetPath.cpp:L102](../../SparkEngine/Source/Graphics/ProjectAssetPath.cpp#L102) | | -| `IsContainedByProject` | function | SparkEditor | [AssetBrowserPanel.h:L112](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L112) | | +| `IsContainedByProject` | function | SparkEditor | [AssetBrowserPanel.h:L122](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L122) | | | `IsContainedIn` | function | SparkEngine | [VirtualFileSystem.cpp:L60](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L60) | | | `IsContainedLinkTarget` | function | SparkBuild | [ArchiveExtraction.cpp:L257](../../SparkBuild/src/ArchiveExtraction.cpp#L257) | | -| `IsContainedPath` | function | SparkEditor | [AssetBrowserPanel.cpp:L68](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L68) | | +| `IsContainedPath` | function | SparkEditor | [AssetBrowserPanel.cpp:L45](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L45) | | | `IsContainedRegularFile` | function | SparkInstaller | [GitBootstrap.cpp:L75](../../SparkInstaller/src/GitBootstrap.cpp#L75) | | | `IsContention` | function | GameModules | [TFSavePaths.h:L162](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFSavePaths.h#L162) | | | `IsConversationActive` | function | SparkEngine | [DialogueSystem.h:L250](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L250) | Check if a conversation is active. | @@ -19479,7 +19514,7 @@ | `IsDirty` | function | SparkEngine | [DirtyRectTracker.h:L133](../../SparkEngine/Source/Graphics/DirtyRectTracker.h#L133) | Clear all dirty regions (texture is now clean). | | `IsDirty` | function | SparkEngine | [LightingSystem.h:L145](../../SparkEngine/Source/Graphics/LightingSystem.h#L145) | | | `IsDirty` | function | SparkEngine | [PipelineStateCache.h:L328](../../SparkEngine/Source/Graphics/PipelineStateCache.h#L328) | Check if a state category is dirty. | -| `IsDirty` | function | SparkEngine | [SceneManager.h:L353](../../SparkEngine/Source/SceneManager/SceneManager.h#L353) | Return `true` if the scene has modifications that have not been saved. | +| `IsDirty` | function | SparkEngine | [SceneManager.h:L355](../../SparkEngine/Source/SceneManager/SceneManager.h#L355) | Return `true` if the scene has modifications that have not been saved. | | `IsDirty` | function | Tests | [TestDirtyRectTracker.cpp:L61](../../Tests/TestDirtyRectTracker.cpp#L61) | | | `IsDirty` | function | Tests | [TestReplicationFields.cpp:L44](../../Tests/TestReplicationFields.cpp#L44) | | | `IsDirty` | function | Tests | [TestSceneManager.cpp:L157](../../Tests/TestSceneManager.cpp#L157) | | @@ -19595,6 +19630,7 @@ | `IsFPSHUDPreviewAvailable` | function | SparkEditor | [GameViewPanel.h:L69](../../SparkEditor/Source/Panels/GameViewPanel.h#L69) | Enable the editor's legacy FPS HUD simulator for an FPS project. | | `IsFPSHUDPreviewEnabled` | function | SparkEditor | [GameViewPanel.h:L70](../../SparkEditor/Source/Panels/GameViewPanel.h#L70) | | | `IsFrameActive` | function | SparkEngine | [ConstantBufferRing.h:L319](../../SparkEngine/Source/Graphics/ConstantBufferRing.h#L319) | Check if currently mapped for a frame | +| `IsFrameKeyDown` | function | SparkEngine | [InputManager.h:L170](../../SparkEngine/Source/Input/InputManager.h#L170) | | | `IsFriendName` | function | GameModules | [TFSocialSystem.h:L96](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L96) | | | `IsFSR1Available` | function | SparkEngine | [UpscalingSystem.h:L376](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L376) | Check if FSR 1.0 is available (engine-owned EASU/RCAS compute shaders) | | `IsFSR2Available` | function | SparkEngine | [UpscalingSystem.h:L379](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L379) | Check if FSR 2.0 is available (false until the FidelityFX SDK is linked) | @@ -19619,9 +19655,9 @@ | `IsGrounded` | function | GameModules | [PlatformerPlayerController.h:L108](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L108) | True while the player stands on a level platform | | `IsHalfRes` | function | SparkEngine | [ScreenSpaceEffects.h:L94](../../SparkEngine/Source/Graphics/ScreenSpaceEffects.h#L94) | | | `IsHardwareAvailable` | function | SparkEngine | [DirectStorageLoader.h:L176](../../SparkEngine/Source/Engine/Streaming/DirectStorageLoader.h#L176) | Check if hardware DirectStorage is available | -| `IsHeadless` | function | SparkEngine | [EngineContext.h:L282](../../SparkEngine/Source/Core/EngineContext.h#L282) | | +| `IsHeadless` | function | SparkEngine | [EngineContext.h:L283](../../SparkEngine/Source/Core/EngineContext.h#L283) | | | `IsHeadless` | function | SparkEngine | [RHIBridge.h:L146](../../SparkEngine/Source/Graphics/RHI/RHIBridge.h#L146) | True when running on NullRHIDevice (no GPU / headless). | -| `IsHeadless` | function | SparkSDK | [IEngineContext.h:L306](../../SparkSDK/Include/Spark/IEngineContext.h#L306) | Check if the engine is running in headless/dedicated server mode | +| `IsHeadless` | function | SparkSDK | [IEngineContext.h:L307](../../SparkSDK/Include/Spark/IEngineContext.h#L307) | Check if the engine is running in headless/dedicated server mode | | `IsHeadless` | function | Tests | [TestGameModuleMMO.cpp:L734](../../Tests/TestGameModuleMMO.cpp#L734) | | | `IsHeadless` | function | Tests | [TestMMOAuthNetwork.cpp:L65](../../Tests/TestMMOAuthNetwork.cpp#L65) | | | `IsHealthy` | function | SparkEngine | [MemoryMonitor.h:L192](../../SparkEngine/Source/Utils/MemoryMonitor.h#L192) | Check if the monitor considers memory healthy | @@ -19725,12 +19761,12 @@ | `IsIPv4LoopbackAddress` | function | SparkEngine | [NetworkBindPolicy.h:L88](../../SparkEngine/Source/Engine/Networking/NetworkBindPolicy.h#L88) | Whether an address is a concrete host in the fixed 127/8 loopback block. | | `IsIPv4PrivateAddress` | function | SparkEngine | [NetworkBindPolicy.h:L131](../../SparkEngine/Source/Engine/Networking/NetworkBindPolicy.h#L131) | | | `IsIssueUrl` | function | SparkCrashReporter | [CrashAutoIssues.cpp:L149](../../SparkCrashReporter/src/CrashAutoIssues.cpp#L149) | | -| `IsKeyDown` | function | SparkEngine | [InputManager.cpp:L568](../../SparkEngine/Source/Input/InputManager.cpp#L568) | | -| `IsKeyDown` | function | SparkEngine | [InputManager.h:L165](../../SparkEngine/Source/Input/InputManager.h#L165) | Check if a key is currently pressed | +| `IsKeyDown` | function | SparkEngine | [InputManager.cpp:L591](../../SparkEngine/Source/Input/InputManager.cpp#L591) | | +| `IsKeyDown` | function | SparkEngine | [InputManager.h:L167](../../SparkEngine/Source/Input/InputManager.h#L167) | Check if a key is currently pressed | | `IsKeyDown` | function | SparkEngine | [PlatformInput.h:L206](../../SparkEngine/Source/Input/PlatformInput.h#L206) | Check if a key/button is currently held. | | `IsKeyDown` | function | SparkEngine | [PlatformInput.h:L252](../../SparkEngine/Source/Input/PlatformInput.h#L252) | No-op input backend for headless mode and unit tests. | | `IsKeyDown` | function | Tests | [TestInputSystem.cpp:L24](../../Tests/TestInputSystem.cpp#L24) | | -| `IsKeyUp` | function | SparkEngine | [InputManager.h:L175](../../SparkEngine/Source/Input/InputManager.h#L175) | Check if a key is currently released | +| `IsKeyUp` | function | SparkEngine | [InputManager.h:L182](../../SparkEngine/Source/Input/InputManager.h#L182) | Check if a key is currently released | | `IsKinematic` | function | SparkEngine | [PhysicsBody.h:L115](../../SparkEngine/Source/Physics/PhysicsBody.h#L115) | | | `IsKnownSoftwareGLRenderer` | function | Tests | [TestRHI240OpenGLReal.cpp:L117](../../Tests/TestRHI240OpenGLReal.cpp#L117) | | | `IsLanBroadcastActive` | function | SparkEngine | [DedicatedServer.h:L315](../../SparkEngine/Source/Engine/Networking/DedicatedServer.h#L315) | Whether the LAN broadcast worker is currently active. | @@ -19795,8 +19831,8 @@ | `IsModified` | function | Tests | [TestConsoleVariables.cpp:L66](../../Tests/TestConsoleVariables.cpp#L66) | | | `IsModified` | function | Tests | [TestConsoleVariables.cpp:L175](../../Tests/TestConsoleVariables.cpp#L175) | | | `IsMotionBlurActive` | function | SparkEngine | [TemporalEffects.h:L345](../../SparkEngine/Source/Graphics/TemporalEffects.h#L345) | Check if motion blur is active | -| `IsMouseButtonDown` | function | SparkEngine | [InputManager.h:L207](../../SparkEngine/Source/Input/InputManager.h#L207) | Check if a mouse button is currently pressed | -| `IsMouseCaptured` | function | SparkEngine | [InputManager.h:L264](../../SparkEngine/Source/Input/InputManager.h#L264) | Check if the mouse is currently captured | +| `IsMouseButtonDown` | function | SparkEngine | [InputManager.h:L214](../../SparkEngine/Source/Input/InputManager.h#L214) | Check if a mouse button is currently pressed | +| `IsMouseCaptured` | function | SparkEngine | [InputManager.h:L271](../../SparkEngine/Source/Input/InputManager.h#L271) | Check if the mouse is currently captured | | `IsMultisampled` | function | SparkEngine | [RenderTarget.h:L156](../../SparkEngine/Source/Graphics/RenderTarget.h#L156) | | | `IsNameAvailable` | function | GameModules | [MMOCharacterSystem.h:L172](../../GameModules/SparkGameMMO/Source/Character/MMOCharacterSystem.h#L172) | Check the server-owned account-to-character index without allocating a character list. | | `IsNativeTargetPlatform` | function | SparkEditor | [BuildPipeline.h:L133](../../SparkEditor/Source/Panels/BuildPipeline.h#L133) | Return the only target that this editor host can package and execute natively. | @@ -19912,7 +19948,7 @@ | `IsPrintableAscii` | function | SparkGateway | [GatewayLocalAdapters.cpp:L24](../../SparkGateway/src/GatewayLocalAdapters.cpp#L24) | | | `IsPrintableAscii` | function | Tests | [TestSEC100ChatAuditLogReal.cpp:L107](../../Tests/TestSEC100ChatAuditLogReal.cpp#L107) | | | `IsProcessAlive` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1886](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1886) | | -| `IsProcessTeardown` | function | SparkEngine | [CrashHandler.cpp:L852](../../SparkEngine/Source/Utils/CrashHandler.cpp#L852) | | +| `IsProcessTeardown` | function | SparkEngine | [CrashHandler.cpp:L853](../../SparkEngine/Source/Utils/CrashHandler.cpp#L853) | | | `IsProfiling` | function | SparkEditor | [PerformanceProfiler.h:L115](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L115) | Check if profiling is active | | `IsProgressCommitted` | function | GameModules | [TFCharacterSystem.h:L71](../../GameModules/SparkGameMMOFPS/Source/Account/TFCharacterSystem.h#L71) | | | `IsPureNode` | function | SparkEngine | [VisualScriptCodegen.cpp:L267](../../SparkEngine/Source/Engine/Scripting/VisualScriptCodegen.cpp#L267) | | @@ -19996,7 +20032,7 @@ | `IsRunningUnderWine` | function | SparkEngine | [WineDetection.cpp:L188](../../SparkEngine/Source/Utils/WineDetection.cpp#L188) | | | `IsRunningUnderWine` | function | SparkEngine | [WineDetection.cpp:L226](../../SparkEngine/Source/Utils/WineDetection.cpp#L226) | | | `IsRunningUnderWine` | function | SparkEngine | [WineDetection.h:L55](../../SparkEngine/Source/Utils/WineDetection.h#L55) | True if the process is running under Wine (any version). | -| `iss` | function | SparkConsole | [ConsoleApp.cpp:L634](../../SparkConsole/src/ConsoleApp.cpp#L634) | | +| `iss` | function | SparkConsole | [ConsoleApp.cpp:L638](../../SparkConsole/src/ConsoleApp.cpp#L638) | | | `iss` | function | SparkEditor | [AdvancedAssetPipeline.cpp:L962](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.cpp#L962) | | | `iss` | function | SparkEditor | [AssetProcessors.cpp:L133](../../SparkEditor/Source/AssetPipeline/AssetProcessors.cpp#L133) | | | `iss` | function | SparkEditor | [EditorTheme.cpp:L55](../../SparkEditor/Source/Core/EditorTheme.cpp#L55) | | @@ -20031,7 +20067,7 @@ | `IsSceneModified` | function | SparkEditor | [EditorUI.h:L282](../../SparkEditor/Source/Core/EditorUI.h#L282) | Load a reflected scene JSON (as written by SaveCurrentScene) | | `IsScriptFaulted` | function | SparkEngine | [AngelScriptEngine.h:L288](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L288) | | | `IsScriptStarted` | function | SparkEngine | [AngelScriptEngine.h:L294](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L294) | Return whether the attached instance has already received Start(). | -| `IsSDKCompatible` | function | SparkSDK | [Version.h:L66](../../SparkSDK/Include/Spark/Version.h#L66) | Check if a module's SDK version is compatible with this engine | +| `IsSDKCompatible` | function | SparkSDK | [Version.h:L70](../../SparkSDK/Include/Spark/Version.h#L70) | Check if a module's SDK version is compatible with this engine | | `IsSealedCurrentVersionSave` | function | Tests | [TestSAVE230NewerFormatSlotReal.cpp:L83](../../Tests/TestSAVE230NewerFormatSlotReal.cpp#L83) | | | `IsSeated` | function | GameModules | [TFVehicleSystem.h:L71](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L71) | | | `IsSecondaryAbilityActive` | function | GameModules | [Player.h:L371](../../GameModules/SparkGameFPS/Source/Game/Player.h#L371) | Check if secondary ability is currently active | @@ -20043,7 +20079,7 @@ | `IsSeparator` | function | GameModules | [PlatformerProgress.cpp:L84](../../GameModules/SparkGamePlatformer/Source/Core/PlatformerProgress.cpp#L84) | | | `IsServer` | function | GameModules | [MultiplayerSystem.h:L276](../../GameModules/SparkGameFPS/Source/Game/MultiplayerSystem.h#L276) | Check if this instance is the server. | | `IsServerInstance` | function | GameModules | [TFCommandsHarness.cpp:L341](../../GameModules/SparkGameMMOFPS/Source/Console/TFCommandsHarness.cpp#L341) | | -| `IsSet` | function | SparkBuild | [ProcessRunnerTests.cpp:L591](../../SparkBuild/tests/ProcessRunnerTests.cpp#L591) | | +| `IsSet` | function | SparkBuild | [ProcessRunnerTests.cpp:L584](../../SparkBuild/tests/ProcessRunnerTests.cpp#L584) | | | `IsSet` | function | SparkInstaller | [InstallerTransactionTests.cpp:L354](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L354) | | | `IsSettlementVisited` | function | GameModules | [OWSettlementSystem.h:L103](../../GameModules/SparkGameOpenWorld/Source/Settlement/OWSettlementSystem.h#L103) | Record that the player entered and interacted with a settlement. | | `IsSha256Hex` | function | SparkInstaller | [GitBootstrap.cpp:L30](../../SparkInstaller/src/GitBootstrap.cpp#L30) | | @@ -20278,7 +20314,7 @@ | `it` | function | SparkBuild | [ArchiveExtraction.cpp:L467](../../SparkBuild/src/ArchiveExtraction.cpp#L467) | | | `it` | function | SparkBuild | [ArchiveExtraction.cpp:L496](../../SparkBuild/src/ArchiveExtraction.cpp#L496) | | | `it` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L219](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L219) | | -| `it` | function | SparkEditor | [MaterialEditorPanel.cpp:L69](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L69) | | +| `it` | function | SparkEditor | [MaterialEditorPanel.cpp:L73](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L73) | | | `it` | function | SparkEditor | [SceneImportPanel.cpp:L93](../../SparkEditor/Source/Panels/SceneImportPanel.cpp#L93) | | | `it` | function | SparkEditor | [SearchPanelSearch.cpp:L52](../../SparkEditor/Source/Panels/SearchPanelSearch.cpp#L52) | | | `it` | function | SparkEngine | [ModSystem.cpp:L442](../../SparkEngine/Source/Engine/Modding/ModSystem.cpp#L442) | | @@ -20328,12 +20364,12 @@ | `json` | function | Tests | [TestSceneSerializerReal.cpp:L566](../../Tests/TestSceneSerializerReal.cpp#L566) | | | `Json::StringifyPretty` | method | SparkEngine | [ModSystemIO.cpp:L128](../../SparkEngine/Source/Engine/Modding/ModSystemIO.cpp#L128) | | | `JsonBool` | function | SparkServer | [ServerHealth.cpp:L69](../../SparkServer/src/ServerHealth.cpp#L69) | | -| `jsonEsc` | function | SparkEngine | [CrashHandler.cpp:L717](../../SparkEngine/Source/Utils/CrashHandler.cpp#L717) | | | `jsonEsc` | function | SparkEngine | [CrashHandler.cpp:L718](../../SparkEngine/Source/Utils/CrashHandler.cpp#L718) | | | `jsonEsc` | function | SparkEngine | [CrashHandler.cpp:L719](../../SparkEngine/Source/Utils/CrashHandler.cpp#L719) | | | `jsonEsc` | function | SparkEngine | [CrashHandler.cpp:L720](../../SparkEngine/Source/Utils/CrashHandler.cpp#L720) | | | `jsonEsc` | function | SparkEngine | [CrashHandler.cpp:L721](../../SparkEngine/Source/Utils/CrashHandler.cpp#L721) | | | `jsonEsc` | function | SparkEngine | [CrashHandler.cpp:L722](../../SparkEngine/Source/Utils/CrashHandler.cpp#L722) | | +| `jsonEsc` | function | SparkEngine | [CrashHandler.cpp:L723](../../SparkEngine/Source/Utils/CrashHandler.cpp#L723) | | | `JsonEscape` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1296](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1296) | | | `JsonField` | function | Tests | [TestSparkServerHealth.cpp:L30](../../Tests/TestSparkServerHealth.cpp#L30) | | | `JsonFieldValueToString` | function | SparkEngine | [ReflectedSceneSerializer.cpp:L159](../../SparkEngine/Source/SceneManager/ReflectedSceneSerializer.cpp#L159) | | @@ -20407,7 +20443,7 @@ | `KeyFileAuthenticator::PruneReplays` | method | SparkGateway | [GatewaySecurity.cpp:L513](../../SparkGateway/src/GatewaySecurity.cpp#L513) | | | `KeyFilledWith` | function | Tests | [TestNET100TrustStore.cpp:L78](../../Tests/TestNET100TrustStore.cpp#L78) | | | `KeyFor` | function | GameModules | [TFKeybinds.h:L68](../../GameModules/SparkGameMMOFPS/Source/UI/TFKeybinds.h#L68) | | -| `KeyNameToVirtualKey` | function | SparkEngine | [InputManager.h:L486](../../SparkEngine/Source/Input/InputManager.h#L486) | Convert key name to virtual key code | +| `KeyNameToVirtualKey` | function | SparkEngine | [InputManager.h:L493](../../SparkEngine/Source/Input/InputManager.h#L493) | Convert key name to virtual key code | | `keyStream` | function | Tests | [TestNetworkEncryption.cpp:L97](../../Tests/TestNetworkEncryption.cpp#L97) | | | `keyStream` | function | Tests | [TestNetworkEncryption.cpp:L123](../../Tests/TestNetworkEncryption.cpp#L123) | | | `keyString` | function | GameModules | [ShowcaseLocalization.cpp:L56](../../GameModules/SparkGame/Source/Core/ShowcaseLocalization.cpp#L56) | | @@ -20473,13 +20509,13 @@ | `LastHapticDuration` | function | Tests | [TestVRSystem.cpp:L153](../../Tests/TestVRSystem.cpp#L153) | | | `LastHapticWasLeft` | function | Tests | [TestVRSystem.cpp:L151](../../Tests/TestVRSystem.cpp#L151) | | | `LastLines` | function | SparkEditor | [BuiltinWorkflows.cpp:L20](../../SparkEditor/Source/Workflow/BuiltinWorkflows.cpp#L20) | | -| `LastOperationSucceeded` | function | SparkEditor | [AssetBrowserPanel.h:L103](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L103) | Wire live basic-path cache invalidation after an import. | +| `LastOperationSucceeded` | function | SparkEditor | [AssetBrowserPanel.h:L113](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L113) | Wire live basic-path cache invalidation after an import. | | `LastOpFeedback` | function | GameModules | [TFSocialSystem.h:L104](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L104) | | | `LastPosixError` | function | SparkEngine | [SaveFileDurability.cpp:L48](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L48) | | | `LastSentInput` | function | Tests | [TestFPSMultiplayer.cpp:L80](../../Tests/TestFPSMultiplayer.cpp#L80) | | | `LastStatus` | function | GameModules | [TFDatabase.h:L250](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFDatabase.h#L250) | | | `LastWindowsError` | function | SparkEngine | [SaveFileDurability.cpp:L43](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L43) | | -| `LatchFrameEdges` | function | SparkEngine | [InputManager.h:L518](../../SparkEngine/Source/Input/InputManager.h#L518) | Latch this frame's key/button snapshot and shift the old one to "previous" | +| `LatchFrameEdges` | function | SparkEngine | [InputManager.h:L525](../../SparkEngine/Source/Input/InputManager.h#L525) | Latch this frame's key/button snapshot and shift the old one to "previous" | | `Launch` | function | SparkEngine | [Process.h:L97](../../SparkEngine/Source/Utils/Process.h#L97) | | | `LaunchClient` | function | SparkEditor | [PlayControlPanel.h:L86](../../SparkEditor/Source/Panels/PlayControlPanel.h#L86) | | | `launchColor` | function | SparkEditor | [DedicatedServerPanel.cpp:L608](../../SparkEditor/Source/Panels/DedicatedServerPanel.cpp#L608) | | @@ -20487,10 +20523,10 @@ | `LaunchContext::CanonicalPath` | method | SparkEditor | [EditorPluginDiscovery.h:L33](../../SparkEditor/Source/Core/EditorPluginDiscovery.h#L33) | | | `LaunchContext::PathFromUtf8` | method | SparkEditor | [GameModuleSelectorPanel.cpp:L130](../../SparkEditor/Source/Panels/GameModuleSelectorPanel.cpp#L130) | | | `LaunchContext::PathFromUtf8` | method | SparkEditor | [GameModuleSelectorPanel.cpp:L181](../../SparkEditor/Source/Panels/GameModuleSelectorPanel.cpp#L181) | | -| `LaunchContext::PathToUtf8` | method | SparkEditor | [PlayControlLaunch.cpp:L373](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L373) | | -| `LaunchContext::PathToUtf8` | method | SparkEditor | [PlayControlLaunch.cpp:L406](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L406) | | +| `LaunchContext::PathToUtf8` | method | SparkEditor | [PlayControlLaunch.cpp:L375](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L375) | | +| `LaunchContext::PathToUtf8` | method | SparkEditor | [PlayControlLaunch.cpp:L408](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L408) | | | `LaunchContext::PathToUtf8` | method | SparkEditor | [EditorProcessLaunch.cpp:L129](../../SparkEditor/Source/Utils/EditorProcessLaunch.cpp#L129) | | -| `LaunchCrashReporter` | function | SparkEngine | [CrashHandler.cpp:L762](../../SparkEngine/Source/Utils/CrashHandler.cpp#L762) | | +| `LaunchCrashReporter` | function | SparkEngine | [CrashHandler.cpp:L763](../../SparkEngine/Source/Utils/CrashHandler.cpp#L763) | | | `LaunchDedicatedWithBots` | function | SparkEditor | [PlayControlPanel.h:L85](../../SparkEditor/Source/Panels/PlayControlPanel.h#L85) | | | `LaunchDetached` | function | SparkLauncher | [LauncherProcess.cpp:L620](../../SparkLauncher/src/LauncherProcess.cpp#L620) | | | `LaunchDetachedProcess` | function | SparkBuild | [SparkBuild.cpp:L36](../../SparkBuild/src/SparkBuild.cpp#L36) | | @@ -20725,9 +20761,9 @@ | `LevelUp` | function | GameModules | [ARPGHeroSystem.h:L105](../../GameModules/SparkGameARPG/Source/Hero/ARPGHeroSystem.h#L105) | | | `LevelUp` | function | GameModules | [RPGCharacterSystem.h:L139](../../GameModules/SparkGameRPG/Source/Character/RPGCharacterSystem.h#L139) | | | `LevenshteinDistance` | function | SparkEngine | [SparkConsole.cpp:L95](../../SparkEngine/Source/Utils/SparkConsole.cpp#L95) | | -| `lib` | function | Tests | [TestAssetParserHardening.cpp:L357](../../Tests/TestAssetParserHardening.cpp#L357) | | -| `lib` | function | Tests | [TestAssetParserHardening.cpp:L392](../../Tests/TestAssetParserHardening.cpp#L392) | | -| `lib` | function | Tests | [TestAssetParserHardening.cpp:L418](../../Tests/TestAssetParserHardening.cpp#L418) | | +| `lib` | function | Tests | [TestAssetParserHardening.cpp:L373](../../Tests/TestAssetParserHardening.cpp#L373) | | +| `lib` | function | Tests | [TestAssetParserHardening.cpp:L408](../../Tests/TestAssetParserHardening.cpp#L408) | | +| `lib` | function | Tests | [TestAssetParserHardening.cpp:L434](../../Tests/TestAssetParserHardening.cpp#L434) | | | `LibraryTargetName` | function | SparkEngine | [ModuleManager.h:L309](../../SparkEngine/Source/Core/ModuleManager.h#L309) | Build-target name of a module image: its filename stem without the | | `Life200EngineContext` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L44](../../Tests/TestLIFE200ModuleReloadReal.cpp#L44) | | | `LifecycleCompositionRoot::Get` | method | SparkEngine | [GameplaySystemLifecycle.cpp:L105](../../SparkEngine/Source/Core/GameplaySystemLifecycle.cpp#L105) | | @@ -20876,7 +20912,7 @@ | `Lines` | function | SparkEngine | [VisualScriptGraphWriter.cpp:L178](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphWriter.cpp#L178) | | | `lines` | function | Tests | [TestMOD380RacingCompleteRaceReal.cpp:L551](../../Tests/TestMOD380RacingCompleteRaceReal.cpp#L551) | | | `Lines` | function | Tests | [TestPrototypeModuleKitReal.cpp:L91](../../Tests/TestPrototypeModuleKitReal.cpp#L91) | | -| `lines` | function | Tests | [TestTF120Travel.cpp:L320](../../Tests/TestTF120Travel.cpp#L320) | | +| `lines` | function | Tests | [TestTF120Travel.cpp:L307](../../Tests/TestTF120Travel.cpp#L307) | | | `Lines` | function | Tests | [TestTFObservation.cpp:L24](../../Tests/TestTFObservation.cpp#L24) | | | `lineStream` | function | SparkEditor | [VersionControlConflicts.cpp:L168](../../SparkEditor/Source/VersionControl/VersionControlConflicts.cpp#L168) | | | `LinkCount` | function | GameModules | [TFSecondaryMotion.h:L75](../../GameModules/SparkGameMMOFPS/Source/Game/TFSecondaryMotion.h#L75) | | @@ -20886,9 +20922,9 @@ | `LinuxGetch` | function | SparkConsole | [ConsoleApp.cpp:L57](../../SparkConsole/src/ConsoleApp.cpp#L57) | | | `LinuxIsStdinPipe` | function | SparkConsole | [ConsoleApp.cpp:L77](../../SparkConsole/src/ConsoleApp.cpp#L77) | | | `LinuxKbhit` | function | SparkConsole | [ConsoleApp.cpp:L48](../../SparkConsole/src/ConsoleApp.cpp#L48) | | -| `LinuxSystemInfo` | function | SparkEngine | [CrashHandler.cpp:L1678](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1678) | | -| `LinuxSystemInfo` | function | SparkEngine | [CrashHandler.cpp:L2772](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2772) | | -| `LinuxThreadStacks` | function | SparkEngine | [CrashHandler.cpp:L1758](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1758) | | +| `LinuxSystemInfo` | function | SparkEngine | [CrashHandler.cpp:L1679](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1679) | | +| `LinuxSystemInfo` | function | SparkEngine | [CrashHandler.cpp:L2818](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2818) | | +| `LinuxThreadStacks` | function | SparkEngine | [CrashHandler.cpp:L1759](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1759) | | | `List` | function | GameModules | [TFCharacterSystem.h:L48](../../GameModules/SparkGameMMOFPS/Source/Account/TFCharacterSystem.h#L48) | | | `ListCharacters` | function | GameModules | [MMOPersistenceSystem.h:L227](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.h#L227) | | | `ListCharacters` | function | GameModules | [TFDatabase.h:L275](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFDatabase.h#L275) | | @@ -20912,7 +20948,7 @@ | `ListFiles` | function | SparkEngine | [VirtualFileSystem.h:L134](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L134) | Construct a provider rooted at the given directory. | | `ListFiles` | function | SparkEngine | [VirtualFileSystem.h:L217](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L217) | List files across all mounts, merging results (no duplicates). | | `ListFiles` | function | SparkEngine | [FileUtils.h:L397](../../SparkEngine/Source/Utils/FileUtils.h#L397) | | -| `ListFiles` | function | Tests | [TestSparkPak.cpp:L241](../../Tests/TestSparkPak.cpp#L241) | | +| `ListFiles` | function | Tests | [TestSparkPak.cpp:L247](../../Tests/TestSparkPak.cpp#L247) | | | `ListFilesRecursive` | function | SparkEngine | [FileUtils.h:L403](../../SparkEngine/Source/Utils/FileUtils.h#L403) | | | `ListFilesWith` | function | SparkEngine | [FileUtils.h:L367](../../SparkEngine/Source/Utils/FileUtils.h#L367) | | | `listing` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L458](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L458) | | @@ -21022,7 +21058,7 @@ | `LoadContinentMeta` | function | GameModules | [TFTravelSystem.h:L198](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L198) | | | `LoadCraftingState` | function | GameModules | [MMOPersistenceSystem.h:L295](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.h#L295) | | | `LoadCube` | function | Tests | [RHI210D3D11EngineFixture.h:L106](../../Tests/RHI210D3D11EngineFixture.h#L106) | | -| `LoadCustom` | function | SparkEngine | [SceneManager.h:L490](../../SparkEngine/Source/SceneManager/SceneManager.h#L490) | Load an authored INI or legacy `.scene` text file. | +| `LoadCustom` | function | SparkEngine | [SceneManager.h:L492](../../SparkEngine/Source/SceneManager/SceneManager.h#L492) | Load an authored INI or legacy `.scene` text file. | | `LoadDefaultMaterials` | function | SparkEditor | [MaterialEditorPanel.h:L224](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L224) | | | `LoadDemoTrack` | function | GameModules | [RacingTrackSystem.h:L172](../../GameModules/SparkGameRacing/Source/Track/RacingTrackSystem.h#L172) | | | `LoadDoc` | function | SparkEditor | [BasicMaterialEditorPanel.h:L89](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L89) | | @@ -21077,7 +21113,7 @@ | `LoadGame` | function | GameModules | [OWEngineSystems.h:L51](../../GameModules/SparkGameOpenWorld/Source/Core/OWEngineSystems.h#L51) | Validate the slot's gameplay snapshot, then restore the world and gameplay state from it. | | `LoadGame` | function | GameModules | [RPGEngineSystems.h:L53](../../GameModules/SparkGameRPG/Source/Core/RPGEngineSystems.h#L53) | Load from a named slot | | `LoadGameModules` | function | SparkEngine | [SparkEngineWindowsInternal.h:L79](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L79) | Find the module manifest or fall back to the project selector. | -| `LoadGameModules` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L69](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L69) | | +| `LoadGameModules` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L70](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L70) | | | `LoadGameModulesLinux` | function | SparkEngine | [SparkEngineLinuxInit.cpp:L83](../../SparkEngine/Source/Core/SparkEngineLinuxInit.cpp#L83) | | | `LoadGeneration` | function | Tests | [TestSaveInterruptionReal.cpp:L272](../../Tests/TestSaveInterruptionReal.cpp#L272) | | | `LoadGLTF` | function | SparkEngine | [AssetPipeline.h:L613](../../SparkEngine/Source/Graphics/AssetPipeline.h#L613) | | @@ -21088,7 +21124,7 @@ | `LoadGLTFStaticMesh` | function | SparkEngine | [GLTFStaticMeshLoader.cpp:L241](../../SparkEngine/Source/Graphics/GLTFStaticMeshLoader.cpp#L241) | | | `LoadGLTFStaticMesh` | function | SparkEngine | [GLTFStaticMeshLoader.h:L49](../../SparkEngine/Source/Graphics/GLTFStaticMeshLoader.h#L49) | | | `LoadGraph` | function | SparkEditor | [VisualScriptPanel.h:L156](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L156) | | -| `LoadGround` | function | Tests | [TestTF120Travel.cpp:L116](../../Tests/TestTF120Travel.cpp#L116) | | +| `LoadGround` | function | Tests | [TestTF120Travel.cpp:L103](../../Tests/TestTF120Travel.cpp#L103) | | | `LoadGuilds` | function | GameModules | [MMOPersistenceSystem.h:L283](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.h#L283) | | | `LoadHeadlessArena` | function | GameModules | [SparkGameFPS.h:L78](../../GameModules/SparkGameFPS/Source/Core/SparkGameFPS.h#L78) | Load the authored arena for the no-render headless lifecycle. | | `LoadHeadlessModules` | function | SparkEngine | [SparkEngineWindowsHeadless.cpp:L212](../../SparkEngine/Source/Core/SparkEngineWindowsHeadless.cpp#L212) | Load modules and register console commands for headless mode. | @@ -21111,8 +21147,8 @@ | `LoadIni` | function | SparkEngine | [StartupSplash.cpp:L174](../../SparkEngine/Source/Core/StartupSplash.cpp#L174) | | | `LoadInventory` | function | GameModules | [MMOPersistenceSystem.h:L288](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.h#L288) | | | `LoadJSON` | function | SparkEditor | [SceneSerializer.h:L200](../../SparkEditor/Source/SceneSystem/SceneSerializer.h#L200) | Load scene from JSON format | -| `LoadJSON` | function | SparkEngine | [SceneManager.cpp:L1093](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1093) | | -| `LoadJSON` | function | SparkEngine | [SceneManager.h:L501](../../SparkEngine/Source/SceneManager/SceneManager.h#L501) | Deserialize versioned line-oriented scene text into metadata and nodes. | +| `LoadJSON` | function | SparkEngine | [SceneManager.cpp:L1209](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1209) | | +| `LoadJSON` | function | SparkEngine | [SceneManager.h:L503](../../SparkEngine/Source/SceneManager/SceneManager.h#L503) | Deserialize versioned line-oriented scene text into metadata and nodes. | | `LoadJsonFile` | function | GameModules | [TFDataTables.cpp:L62](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTables.cpp#L62) | | | `LoadKnownHosts` | function | SparkEngine | [NetworkTrustStore.cpp:L450](../../SparkEngine/Source/Engine/Networking/NetworkTrustStore.cpp#L450) | | | `LoadLanguage` | function | SparkEngine | [LocalizationSystem.h:L120](../../SparkEngine/Source/Engine/Localization/LocalizationSystem.h#L120) | Load a language from a JSON file. | @@ -21182,7 +21218,7 @@ | `LoadProjectTexture` | function | GameModules | [TFWorldSetupRender.cpp:L43](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetupRender.cpp#L43) | | | `LoadRaceData` | function | GameModules | [RacingEngineSystems.h:L72](../../GameModules/SparkGameRacing/Source/Core/RacingEngineSystems.h#L72) | Load race progress from a named slot. | | `LoadRecentProjectsList` | function | SparkEditor | [ProjectManager.h:L232](../../SparkEditor/Source/Core/ProjectManager.h#L232) | | -| `LoadReflected` | function | SparkEngine | [SceneManager.h:L479](../../SparkEngine/Source/SceneManager/SceneManager.h#L479) | Set the file cache for scene I/O (non-owning). | +| `LoadReflected` | function | SparkEngine | [SceneManager.h:L481](../../SparkEngine/Source/SceneManager/SceneManager.h#L481) | Set the file cache for scene I/O (non-owning). | | `LoadRegionMapDataSources` | function | SparkEditor | [RegionMapDataSource.cpp:L129](../../SparkEditor/Source/Panels/RegionMapDataSource.cpp#L129) | | | `LoadRegionMapDataSources` | function | SparkEditor | [RegionMapDataSource.h:L30](../../SparkEditor/Source/Panels/RegionMapDataSource.h#L30) | | | `LoadRejected` | function | Tests | [TestGLTFSkinnedMeshLoader.cpp:L237](../../Tests/TestGLTFSkinnedMeshLoader.cpp#L237) | | @@ -21196,9 +21232,9 @@ | `LoadScene` | function | SparkEditor | [SceneManager.h:L43](../../SparkEditor/Source/SceneSystem/SceneManager.h#L43) | Load a scene from disk (auto-detects format). | | `LoadScene` | function | SparkEditor | [SceneSerializer.cpp:L136](../../SparkEditor/Source/SceneSystem/SceneSerializer.cpp#L136) | | | `LoadScene` | function | SparkEditor | [SceneSerializer.h:L97](../../SparkEditor/Source/SceneSystem/SceneSerializer.h#L97) | | -| `LoadScene` | function | SparkEngine | [SceneManager.h:L179](../../SparkEngine/Source/SceneManager/SceneManager.h#L179) | | +| `LoadScene` | function | SparkEngine | [SceneManager.h:L181](../../SparkEngine/Source/SceneManager/SceneManager.h#L181) | | | `LoadSceneAndTerrain` | function | GameModules | [TFWorldSetup.h:L144](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetup.h#L144) | | -| `LoadSceneAsync` | function | SparkEngine | [SceneManager.h:L228](../../SparkEngine/Source/SceneManager/SceneManager.h#L228) | | +| `LoadSceneAsync` | function | SparkEngine | [SceneManager.h:L230](../../SparkEngine/Source/SceneManager/SceneManager.h#L230) | | | `LoadSceneTag` | function | Tests | [TestDocumentInterruptionReal.cpp:L263](../../Tests/TestDocumentInterruptionReal.cpp#L263) | | | `LoadScripts` | function | GameModules | [VisualScriptDemoWorld.h:L60](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.h#L60) | Select the first search root holding the complete manifest, then compile and validate every script. | | `LoadSentinelReplay` | function | Tests | [TestSEC3GameplayHardening.cpp:L169](../../Tests/TestSEC3GameplayHardening.cpp#L169) | | @@ -21233,7 +21269,7 @@ | `LoadStoreFromPath` | function | GameModules | [TFSocialSystem.h:L193](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L193) | | | `LoadSuitTable` | function | GameModules | [TFProgressionSystem.h:L265](../../GameModules/SparkGameMMOFPS/Source/Game/TFProgressionSystem.h#L265) | | | `LoadSystemFunction` | function | SparkEngine | [CrashArtifactDirectory.h:L145](../../SparkEngine/Source/Utils/CrashArtifactDirectory.h#L145) | | -| `LoadTable` | function | Tests | [TestTFDataTables.cpp:L63](../../Tests/TestTFDataTables.cpp#L63) | | +| `LoadTable` | function | Tests | [TestTFDataTables.cpp:L54](../../Tests/TestTFDataTables.cpp#L54) | | | `LoadTableFromFile` | function | SparkEngine | [DataTableSystem.h:L849](../../SparkEngine/Source/Engine/DataTable/DataTableSystem.h#L849) | Load a table from file, auto-detecting CSV vs JSON by extension. | | `LoadTemplates` | function | GameModules | [TFRegionDecor.h:L169](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionDecor.h#L169) | | | `LoadTemplates` | function | SparkLauncher | [LauncherApp.h:L40](../../SparkLauncher/src/LauncherApp.h#L40) | | @@ -21250,7 +21286,7 @@ | `LoadTileSync` | function | SparkEditor | [LevelStreamingSystem.h:L373](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.h#L373) | Load tile synchronously | | `LoadTree` | function | SparkEngine | [DialogueSystem.h:L208](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L208) | Load a dialogue tree from a JSON file. | | `LoadVertexShader` | function | SparkEngine | [Shader.h:L308](../../SparkEngine/Source/Graphics/Shader.h#L308) | Load and compile a vertex shader from file | -| `LoadViaFile` | function | Tests | [TestThirdPartyIntegration.cpp:L79](../../Tests/TestThirdPartyIntegration.cpp#L79) | | +| `LoadViaFile` | function | Tests | [TestThirdPartyIntegration.cpp:L95](../../Tests/TestThirdPartyIntegration.cpp#L95) | | | `LoadWAVFile` | function | SparkEngine | [OpenALAudioEngine.h:L188](../../SparkEngine/Source/Audio/OpenALAudioEngine.h#L188) | Load a WAV file and create an OpenAL buffer | | `LoadWeights` | function | SparkEngine | [NeuralPostProcessing.h:L74](../../SparkEngine/Source/Graphics/Neural/NeuralPostProcessing.h#L74) | Load pre-trained denoiser weights. | | `LoadWeights` | function | SparkEngine | [NeuralPostProcessing.h:L133](../../SparkEngine/Source/Graphics/Neural/NeuralPostProcessing.h#L133) | Load pre-trained SR weights. | @@ -21422,25 +21458,25 @@ | `lock` | function | SparkBuild | [ProcessRunner.cpp:L497](../../SparkBuild/src/ProcessRunner.cpp#L497) | | | `lock` | function | SparkBuild | [ProcessRunner.cpp:L696](../../SparkBuild/src/ProcessRunner.cpp#L696) | | | `lock` | function | SparkBuild | [ProcessRunner.cpp:L721](../../SparkBuild/src/ProcessRunner.cpp#L721) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L384](../../SparkBuild/tests/ProcessRunnerTests.cpp#L384) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L400](../../SparkBuild/tests/ProcessRunnerTests.cpp#L400) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L412](../../SparkBuild/tests/ProcessRunnerTests.cpp#L412) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L443](../../SparkBuild/tests/ProcessRunnerTests.cpp#L443) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L453](../../SparkBuild/tests/ProcessRunnerTests.cpp#L453) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L469](../../SparkBuild/tests/ProcessRunnerTests.cpp#L469) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L483](../../SparkBuild/tests/ProcessRunnerTests.cpp#L483) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L508](../../SparkBuild/tests/ProcessRunnerTests.cpp#L508) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L519](../../SparkBuild/tests/ProcessRunnerTests.cpp#L519) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L691](../../SparkBuild/tests/ProcessRunnerTests.cpp#L691) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L698](../../SparkBuild/tests/ProcessRunnerTests.cpp#L698) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L433](../../SparkConsole/src/ConsoleApp.cpp#L433) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L656](../../SparkConsole/src/ConsoleApp.cpp#L656) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L719](../../SparkConsole/src/ConsoleApp.cpp#L719) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L775](../../SparkConsole/src/ConsoleApp.cpp#L775) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L951](../../SparkConsole/src/ConsoleApp.cpp#L951) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L977](../../SparkConsole/src/ConsoleApp.cpp#L977) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L1094](../../SparkConsole/src/ConsoleApp.cpp#L1094) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L1176](../../SparkConsole/src/ConsoleApp.cpp#L1176) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L383](../../SparkBuild/tests/ProcessRunnerTests.cpp#L383) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L398](../../SparkBuild/tests/ProcessRunnerTests.cpp#L398) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L410](../../SparkBuild/tests/ProcessRunnerTests.cpp#L410) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L442](../../SparkBuild/tests/ProcessRunnerTests.cpp#L442) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L464](../../SparkBuild/tests/ProcessRunnerTests.cpp#L464) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L478](../../SparkBuild/tests/ProcessRunnerTests.cpp#L478) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L500](../../SparkBuild/tests/ProcessRunnerTests.cpp#L500) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L512](../../SparkBuild/tests/ProcessRunnerTests.cpp#L512) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L683](../../SparkBuild/tests/ProcessRunnerTests.cpp#L683) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L689](../../SparkBuild/tests/ProcessRunnerTests.cpp#L689) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L220](../../SparkConsole/src/ConsoleApp.cpp#L220) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L437](../../SparkConsole/src/ConsoleApp.cpp#L437) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L660](../../SparkConsole/src/ConsoleApp.cpp#L660) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L723](../../SparkConsole/src/ConsoleApp.cpp#L723) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L779](../../SparkConsole/src/ConsoleApp.cpp#L779) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L955](../../SparkConsole/src/ConsoleApp.cpp#L955) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L981](../../SparkConsole/src/ConsoleApp.cpp#L981) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L1098](../../SparkConsole/src/ConsoleApp.cpp#L1098) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L1180](../../SparkConsole/src/ConsoleApp.cpp#L1180) | | | `lock` | function | SparkDaemon | [AssetService.cpp:L32](../../SparkDaemon/src/AssetService.cpp#L32) | | | `lock` | function | SparkDaemon | [AssetService.cpp:L67](../../SparkDaemon/src/AssetService.cpp#L67) | | | `lock` | function | SparkDaemon | [AssetService.cpp:L94](../../SparkDaemon/src/AssetService.cpp#L94) | | @@ -21734,8 +21770,8 @@ | `lock` | function | SparkEngine | [DynamicPluginHost.cpp:L567](../../SparkEngine/Source/Core/DynamicPluginHost.cpp#L567) | | | `lock` | function | SparkEngine | [DynamicPluginHost.cpp:L578](../../SparkEngine/Source/Core/DynamicPluginHost.cpp#L578) | | | `lock` | function | SparkEngine | [DynamicPluginHost.cpp:L583](../../SparkEngine/Source/Core/DynamicPluginHost.cpp#L583) | | -| `lock` | function | SparkEngine | [EngineContext.h:L361](../../SparkEngine/Source/Core/EngineContext.h#L361) | | -| `lock` | function | SparkEngine | [EngineContext.h:L379](../../SparkEngine/Source/Core/EngineContext.h#L379) | Retrieve a previously registered subsystem by type | +| `lock` | function | SparkEngine | [EngineContext.h:L364](../../SparkEngine/Source/Core/EngineContext.h#L364) | | +| `lock` | function | SparkEngine | [EngineContext.h:L382](../../SparkEngine/Source/Core/EngineContext.h#L382) | Retrieve a previously registered subsystem by type | | `lock` | function | SparkEngine | [FaultIsolation.cpp:L27](../../SparkEngine/Source/Core/FaultIsolation.cpp#L27) | | | `lock` | function | SparkEngine | [FaultIsolation.cpp:L86](../../SparkEngine/Source/Core/FaultIsolation.cpp#L86) | | | `lock` | function | SparkEngine | [FaultIsolation.cpp:L139](../../SparkEngine/Source/Core/FaultIsolation.cpp#L139) | | @@ -22295,26 +22331,26 @@ | `lock` | function | SparkEngine | [TextureSystemWindows.cpp:L201](../../SparkEngine/Source/Graphics/TextureSystemWindows.cpp#L201) | | | `lock` | function | SparkEngine | [TextureSystemWindows.cpp:L215](../../SparkEngine/Source/Graphics/TextureSystemWindows.cpp#L215) | | | `lock` | function | SparkEngine | [TextureSystemWindows.cpp:L221](../../SparkEngine/Source/Graphics/TextureSystemWindows.cpp#L221) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L330](../../SparkEngine/Source/Input/InputManager.cpp#L330) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L346](../../SparkEngine/Source/Input/InputManager.cpp#L346) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L362](../../SparkEngine/Source/Input/InputManager.cpp#L362) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L371](../../SparkEngine/Source/Input/InputManager.cpp#L371) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L380](../../SparkEngine/Source/Input/InputManager.cpp#L380) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L389](../../SparkEngine/Source/Input/InputManager.cpp#L389) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L400](../../SparkEngine/Source/Input/InputManager.cpp#L400) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L429](../../SparkEngine/Source/Input/InputManager.cpp#L429) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L447](../../SparkEngine/Source/Input/InputManager.cpp#L447) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L487](../../SparkEngine/Source/Input/InputManager.cpp#L487) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L496](../../SparkEngine/Source/Input/InputManager.cpp#L496) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L522](../../SparkEngine/Source/Input/InputManager.cpp#L522) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L528](../../SparkEngine/Source/Input/InputManager.cpp#L528) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L542](../../SparkEngine/Source/Input/InputManager.cpp#L542) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L564](../../SparkEngine/Source/Input/InputManager.cpp#L564) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L573](../../SparkEngine/Source/Input/InputManager.cpp#L573) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L613](../../SparkEngine/Source/Input/InputManager.cpp#L613) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L629](../../SparkEngine/Source/Input/InputManager.cpp#L629) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L657](../../SparkEngine/Source/Input/InputManager.cpp#L657) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L667](../../SparkEngine/Source/Input/InputManager.cpp#L667) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L353](../../SparkEngine/Source/Input/InputManager.cpp#L353) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L369](../../SparkEngine/Source/Input/InputManager.cpp#L369) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L385](../../SparkEngine/Source/Input/InputManager.cpp#L385) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L394](../../SparkEngine/Source/Input/InputManager.cpp#L394) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L403](../../SparkEngine/Source/Input/InputManager.cpp#L403) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L412](../../SparkEngine/Source/Input/InputManager.cpp#L412) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L423](../../SparkEngine/Source/Input/InputManager.cpp#L423) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L452](../../SparkEngine/Source/Input/InputManager.cpp#L452) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L470](../../SparkEngine/Source/Input/InputManager.cpp#L470) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L510](../../SparkEngine/Source/Input/InputManager.cpp#L510) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L519](../../SparkEngine/Source/Input/InputManager.cpp#L519) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L545](../../SparkEngine/Source/Input/InputManager.cpp#L545) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L551](../../SparkEngine/Source/Input/InputManager.cpp#L551) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L565](../../SparkEngine/Source/Input/InputManager.cpp#L565) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L587](../../SparkEngine/Source/Input/InputManager.cpp#L587) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L596](../../SparkEngine/Source/Input/InputManager.cpp#L596) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L636](../../SparkEngine/Source/Input/InputManager.cpp#L636) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L652](../../SparkEngine/Source/Input/InputManager.cpp#L652) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L680](../../SparkEngine/Source/Input/InputManager.cpp#L680) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L690](../../SparkEngine/Source/Input/InputManager.cpp#L690) | | | `lock` | function | SparkEngine | [PhysicsConsoleOps.cpp:L87](../../SparkEngine/Source/Physics/PhysicsConsoleOps.cpp#L87) | | | `lock` | function | SparkEngine | [PhysicsSpatialQueries.cpp:L46](../../SparkEngine/Source/Physics/PhysicsSpatialQueries.cpp#L46) | | | `lock` | function | SparkEngine | [PhysicsSpatialQueries.cpp:L107](../../SparkEngine/Source/Physics/PhysicsSpatialQueries.cpp#L107) | | @@ -22335,7 +22371,7 @@ | `lock` | function | SparkEngine | [PhysicsSystemQueries.cpp:L369](../../SparkEngine/Source/Physics/PhysicsSystemQueries.cpp#L369) | | | `lock` | function | SparkEngine | [PhysicsSystemStub.cpp:L714](../../SparkEngine/Source/Physics/PhysicsSystemStub.cpp#L714) | | | `lock` | function | SparkEngine | [PhysicsSystemStub.cpp:L848](../../SparkEngine/Source/Physics/PhysicsSystemStub.cpp#L848) | | -| `lock` | function | SparkEngine | [SceneManager.cpp:L701](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L701) | | +| `lock` | function | SparkEngine | [SceneManager.cpp:L773](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L773) | | | `lock` | function | SparkEngine | [Assert.cpp:L76](../../SparkEngine/Source/Utils/Assert.cpp#L76) | | | `lock` | function | SparkEngine | [AtomicSharedPtr.h:L51](../../SparkEngine/Source/Utils/AtomicSharedPtr.h#L51) | Atomically load the current pointer. | | `lock` | function | SparkEngine | [AtomicSharedPtr.h:L62](../../SparkEngine/Source/Utils/AtomicSharedPtr.h#L62) | Atomically store a new pointer. | @@ -22387,9 +22423,9 @@ | `lock` | function | SparkEngine | [CpuDebugger.h:L226](../../SparkEngine/Source/Utils/CpuDebugger.h#L226) | Get the number of tracked sections | | `lock` | function | SparkEngine | [CpuDebugger.h:L276](../../SparkEngine/Source/Utils/CpuDebugger.h#L276) | Print a compact summary to stderr | | `lock` | function | SparkEngine | [CpuDebugger.h:L299](../../SparkEngine/Source/Utils/CpuDebugger.h#L299) | Reset all tracking data | -| `lock` | function | SparkEngine | [CrashHandler.cpp:L1027](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1027) | | -| `lock` | function | SparkEngine | [CrashHandler.cpp:L2001](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2001) | | -| `lock` | function | SparkEngine | [CrashHandler.cpp:L2807](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2807) | | +| `lock` | function | SparkEngine | [CrashHandler.cpp:L1028](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1028) | | +| `lock` | function | SparkEngine | [CrashHandler.cpp:L2003](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2003) | | +| `lock` | function | SparkEngine | [CrashHandler.cpp:L2853](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2853) | | | `lock` | function | SparkEngine | [DaemonClient.cpp:L54](../../SparkEngine/Source/Utils/DaemonClient.cpp#L54) | | | `lock` | function | SparkEngine | [DaemonClient.cpp:L68](../../SparkEngine/Source/Utils/DaemonClient.cpp#L68) | | | `lock` | function | SparkEngine | [DaemonClient.cpp:L152](../../SparkEngine/Source/Utils/DaemonClient.cpp#L152) | | @@ -22774,7 +22810,7 @@ | `LogInfo` | function | SparkEngine | [SparkConsole.h:L155](../../SparkEngine/Source/Utils/SparkConsole.h#L155) | | | `LoginOverWire` | function | Tests | [TestTFOnboarding.cpp:L1370](../../Tests/TestTFOnboarding.cpp#L1370) | | | `LoginPacket` | function | Tests | [TestSessionGateProtocol.cpp:L25](../../Tests/TestSessionGateProtocol.cpp#L25) | | -| `LogInputEvent` | function | SparkEngine | [InputManager.h:L500](../../SparkEngine/Source/Input/InputManager.h#L500) | Add input event to recent events log | +| `LogInputEvent` | function | SparkEngine | [InputManager.h:L507](../../SparkEngine/Source/Input/InputManager.h#L507) | Add input event to recent events log | | `LogLevelToConsoleType` | function | SparkEngine | [ConsoleSink.h:L51](../../SparkEngine/Source/Utils/ConsoleSink.h#L51) | | | `LogLevelToString` | function | SparkEditor | [EditorLogger.h:L227](../../SparkEditor/Source/Core/EditorLogger.h#L227) | | | `LogLevelToString` | function | SparkEditor | [ConsolePanel.cpp:L60](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L60) | | @@ -22833,10 +22869,17 @@ | `Lookup` | function | Tests | [TestShaderDiskCache.cpp:L31](../../Tests/TestShaderDiskCache.cpp#L31) | | | `LookupCharacterStat` | function | GameModules | [RPGGameplayBridge.cpp:L290](../../GameModules/SparkGameRPG/Source/Gameplay/RPGGameplayBridge.cpp#L290) | | | `LookupContinentEndpoint` | function | GameModules | [TFTravelSystem.h:L141](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L141) | | +| `LookupExactKeyState` | function | SparkEngine | [InputManager.cpp:L198](../../SparkEngine/Source/Input/InputManager.cpp#L198) | | +| `LookupExactKeyState` | function | SparkEngine | [InputManager.cpp:L209](../../SparkEngine/Source/Input/InputManager.cpp#L209) | | +| `LookupExactKeyState` | function | SparkEngine | [InputManager.cpp:L212](../../SparkEngine/Source/Input/InputManager.cpp#L212) | | +| `LookupExactKeyState` | function | SparkEngine | [InputManager.cpp:L215](../../SparkEngine/Source/Input/InputManager.cpp#L215) | | +| `LookupExactKeyState` | function | SparkEngine | [InputManager.cpp:L218](../../SparkEngine/Source/Input/InputManager.cpp#L218) | | | `LookupFeatures` | function | SparkEngine | [NeuralRadianceCache.h:L159](../../SparkEngine/Source/Graphics/Neural/NeuralRadianceCache.h#L159) | Look up features from hash grid for a position. | | `LookupHandoffContinent` | function | GameModules | [TFTravelSystem.h:L144](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L144) | Resolve an explicit, unique gatewayAreaId to its durable continent key (never infer from mapId). | -| `LookupKeyState` | function | SparkEngine | [InputManager.cpp:L210](../../SparkEngine/Source/Input/InputManager.cpp#L210) | | -| `LookupKeyState` | function | SparkEngine | [InputManager.cpp:L219](../../SparkEngine/Source/Input/InputManager.cpp#L219) | | +| `LookupKeyState` | function | SparkEngine | [InputManager.cpp:L204](../../SparkEngine/Source/Input/InputManager.cpp#L204) | | +| `LookupKeyState` | function | SparkEngine | [InputManager.cpp:L225](../../SparkEngine/Source/Input/InputManager.cpp#L225) | | +| `LookupKeyState` | function | SparkEngine | [InputManager.cpp:L235](../../SparkEngine/Source/Input/InputManager.cpp#L235) | | +| `LookupKeyState` | function | SparkEngine | [InputManager.cpp:L241](../../SparkEngine/Source/Input/InputManager.cpp#L241) | | | `loopbackMode` | function | Tests | [TestNetworkManagerIntegration.cpp:L1222](../../Tests/TestNetworkManagerIntegration.cpp#L1222) | | | `LoopbackServerOptions` | function | Tests | [TestSparkServerHealth.cpp:L114](../../Tests/TestSparkServerHealth.cpp#L114) | | | `LoopbackSocket::Port` | method | Tests | [SecureTestPeer.cpp:L373](../../Tests/Fixtures/SecureTestPeer.cpp#L373) | | @@ -22890,11 +22933,11 @@ | `Magenta` | function | SparkBuild | [Terminal.h:L22](../../SparkBuild/src/Terminal.h#L22) | | | `Magenta` | function | SparkEngine | [ColorUtils.h:L61](../../SparkEngine/Source/Utils/ColorUtils.h#L61) | | | `Magenta` | function | SparkEngine | [DebugDraw.h:L60](../../SparkEngine/Source/Utils/DebugDraw.h#L60) | | -| `main` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L72](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L72) | | +| `main` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L74](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L74) | | | `main` | function | SparkAutomation | [main.cpp:L493](../../SparkAutomation/src/main.cpp#L493) | | | `main` | function | SparkBuild | [main.cpp:L175](../../SparkBuild/src/main.cpp#L175) | | | `main` | function | SparkBuild | [DownloaderTests.cpp:L959](../../SparkBuild/tests/DownloaderTests.cpp#L959) | | -| `main` | function | SparkBuild | [ProcessRunnerTests.cpp:L726](../../SparkBuild/tests/ProcessRunnerTests.cpp#L726) | | +| `main` | function | SparkBuild | [ProcessRunnerTests.cpp:L717](../../SparkBuild/tests/ProcessRunnerTests.cpp#L717) | | | `main` | function | SparkConsole | [main.cpp:L26](../../SparkConsole/src/main.cpp#L26) | | | `main` | function | SparkCooker | [main.cpp:L324](../../SparkCooker/src/main.cpp#L324) | | | `main` | function | SparkCrashReporter | [main.cpp:L50](../../SparkCrashReporter/src/main.cpp#L50) | | @@ -22921,7 +22964,7 @@ | `main` | function | SparkInstaller | [GitContractTests.cpp:L181](../../SparkInstaller/tests/GitContractTests.cpp#L181) | | | `main` | function | SparkInstaller | [InstallStateTests.cpp:L379](../../SparkInstaller/tests/InstallStateTests.cpp#L379) | | | `main` | function | SparkInstaller | [InstallerTransactionTests.cpp:L1368](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L1368) | | -| `main` | function | SparkLauncher | [main.cpp:L104](../../SparkLauncher/src/main.cpp#L104) | | +| `main` | function | SparkLauncher | [main.cpp:L107](../../SparkLauncher/src/main.cpp#L107) | | | `main` | function | SparkServer | [main.cpp:L60](../../SparkServer/src/main.cpp#L60) | | | `main` | function | SparkShaderCompiler | [main.cpp:L650](../../SparkShaderCompiler/src/main.cpp#L650) | | | `main` | function | SparkWorker | [main.cpp:L7](../../SparkWorker/src/main.cpp#L7) | | @@ -22943,6 +22986,7 @@ | `main` | function | Tests | [weapons.cpp:L87](../../Tests/PackageSmoke/FPSProgression/weapons.cpp#L87) | | | `main` | function | Tests | [main.cpp:L30](../../Tests/PackageSmoke/main.cpp#L30) | | | `main` | function | Tests | [DebugHookTeardownProbe.cpp:L8](../../Tests/Teardown/DebugHookTeardownProbe.cpp#L8) | Process-boundary regression probe for debug-hook static lifetime. | +| `main` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L84](../../Tests/TestFPSGameCameraReloadReal.cpp#L84) | | | `main` | function | Tests | [TestMain.cpp:L596](../../Tests/TestMain.cpp#L596) | | | `main` | function | Tests | [RemoteDebugSecurityBoundaryProbe.cpp:L314](../../Tests/Tools/RemoteDebugSecurityBoundaryProbe.cpp#L314) | | | `mainFile` | function | Tests | [TestEngineSettingsReal.cpp:L258](../../Tests/TestEngineSettingsReal.cpp#L258) | | @@ -22970,7 +23014,7 @@ | `MakeBlockoutName` | function | SparkEditor | [PrototypingSystem.h:L137](../../SparkEditor/Source/Prototyping/PrototypingSystem.h#L137) | | | `MakeBlurInput` | function | Tests | [TestRHI230VulkanGoldenReal.cpp:L256](../../Tests/TestRHI230VulkanGoldenReal.cpp#L256) | | | `MakeBlurInput` | function | Tests | [TestRHI240OpenGLGoldenReal.cpp:L288](../../Tests/TestRHI240OpenGLGoldenReal.cpp#L288) | | -| `MakeBmp` | function | Tests | [TestThirdPartyIntegration.cpp:L63](../../Tests/TestThirdPartyIntegration.cpp#L63) | | +| `MakeBmp` | function | Tests | [TestThirdPartyIntegration.cpp:L79](../../Tests/TestThirdPartyIntegration.cpp#L79) | | | `MakeBody` | function | Tests | [TestENG200ScriptBindingsReal.cpp:L411](../../Tests/TestENG200ScriptBindingsReal.cpp#L411) | | | `MakeBuffer` | function | Tests | [TestDenoiserInterface.cpp:L109](../../Tests/TestDenoiserInterface.cpp#L109) | | | `MakeBuffer` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L431](../../Tests/TestRHI225D3D12ParityReal.cpp#L431) | | @@ -22998,9 +23042,9 @@ | `MakeCoverPoint` | function | Tests | [TestCoverageAI.cpp:L69](../../Tests/TestCoverageAI.cpp#L69) | | | `MakeCrashCanary` | function | Tests | [TestCrashHandlerGatingReal.cpp:L272](../../Tests/TestCrashHandlerGatingReal.cpp#L272) | | | `MakeCrashRedactionContext` | function | SparkEngine | [CrashRedactionContext.h:L129](../../SparkEngine/Source/Utils/CrashRedactionContext.h#L129) | | -| `MakeCrashReportId` | function | SparkEngine | [CrashHandler.cpp:L115](../../SparkEngine/Source/Utils/CrashHandler.cpp#L115) | | +| `MakeCrashReportId` | function | SparkEngine | [CrashHandler.cpp:L116](../../SparkEngine/Source/Utils/CrashHandler.cpp#L116) | | | `MakeCrate` | function | Tests | [TestPrefabPersistence.cpp:L84](../../Tests/TestPrefabPersistence.cpp#L84) | | -| `MakeCreate` | function | GameModules | [TFReplication.h:L96](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L96) | | +| `MakeCreate` | function | GameModules | [TFReplication.h:L101](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L101) | | | `MakeCube` | function | Tests | [TestLODGenerator.cpp:L161](../../Tests/TestLODGenerator.cpp#L161) | | | `MakeCube` | function | Tests | [TestLODGeneratorPhaseGG.cpp:L20](../../Tests/TestLODGeneratorPhaseGG.cpp#L20) | | | `MakeD3D11Options` | function | Tests | [TestShaderCompilerReal.cpp:L44](../../Tests/TestShaderCompilerReal.cpp#L44) | | @@ -23108,7 +23152,7 @@ | `MakeLinearTree` | function | Tests | [TestDialogueStress.cpp:L13](../../Tests/TestDialogueStress.cpp#L13) | | | `MakeLink` | function | Tests | [TestNavMeshLink.cpp:L17](../../Tests/TestNavMeshLink.cpp#L17) | | | `MakeLoginChallenge` | function | GameModules | [TFScramWire.cpp:L180](../../GameModules/SparkGameMMOFPS/Source/Net/TFScramWire.cpp#L180) | | -| `MakeManifestJson` | function | SparkEngine | [CrashHandler.cpp:L678](../../SparkEngine/Source/Utils/CrashHandler.cpp#L678) | | +| `MakeManifestJson` | function | SparkEngine | [CrashHandler.cpp:L679](../../SparkEngine/Source/Utils/CrashHandler.cpp#L679) | | | `MakeMinimalMesh` | function | Tests | [TestFBXImportValidation.cpp:L13](../../Tests/TestFBXImportValidation.cpp#L13) | | | `MakeMismatchedDescriptor` | function | Tests | [MismatchedModule.cpp:L23](../../Tests/Fixtures/ModuleABI/MismatchedModule.cpp#L23) | | | `MakeMod310TempDir` | function | Tests | [TestMOD310FPSSceneReloadRespawnReal.cpp:L40](../../Tests/TestMOD310FPSSceneReloadRespawnReal.cpp#L40) | | @@ -23177,7 +23221,7 @@ | `MakeTempDir` | function | Tests | [TestShaderHotReloadPhaseU.cpp:L35](../../Tests/TestShaderHotReloadPhaseU.cpp#L35) | | | `MakeTempDir` | function | Tests | [TestSparkGameFPSLoopReal.cpp:L49](../../Tests/TestSparkGameFPSLoopReal.cpp#L49) | | | `MakeTempModsDir` | function | Tests | [Test_persistence_ModSystem.cpp:L20](../../Tests/harden/Test_persistence_ModSystem.cpp#L20) | | -| `MakeTemporaryName` | function | SparkEngine | [SceneManager.cpp:L218](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L218) | | +| `MakeTemporaryName` | function | SparkEngine | [SceneManager.cpp:L236](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L236) | | | `MakeTemporarySibling` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L57](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L57) | | | `MakeTemporarySibling` | function | SparkEditor | [JSONSceneSerializer.cpp:L95](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L95) | | | `MakeTempSaveDir` | function | Tests | [Test_persistence_SaveSystem.cpp:L95](../../Tests/harden/Test_persistence_SaveSystem.cpp#L95) | | @@ -23191,9 +23235,9 @@ | `MakeTexture` | function | Tests | [OpenGLTestSupport.h:L133](../../Tests/OpenGLTestSupport.h#L133) | | | `MakeTexture` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L454](../../Tests/TestRHI225D3D12ParityReal.cpp#L454) | | | `MakeTexture` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L470](../../Tests/TestRHI225D3D12ParityReal.cpp#L470) | | -| `MakeTimeStamp` | function | SparkEngine | [CrashHandler.cpp:L822](../../SparkEngine/Source/Utils/CrashHandler.cpp#L822) | | -| `MakeTimeStamp` | function | SparkEngine | [CrashHandler.cpp:L1331](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1331) | | -| `MakeTimeStampUtf8` | function | SparkEngine | [CrashHandler.cpp:L123](../../SparkEngine/Source/Utils/CrashHandler.cpp#L123) | | +| `MakeTimeStamp` | function | SparkEngine | [CrashHandler.cpp:L823](../../SparkEngine/Source/Utils/CrashHandler.cpp#L823) | | +| `MakeTimeStamp` | function | SparkEngine | [CrashHandler.cpp:L1332](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1332) | | +| `MakeTimeStampUtf8` | function | SparkEngine | [CrashHandler.cpp:L124](../../SparkEngine/Source/Utils/CrashHandler.cpp#L124) | | | `MakeTone` | function | Tests | [TestHRTFProcessor.cpp:L22](../../Tests/TestHRTFProcessor.cpp#L22) | | | `MakeTouch` | function | Tests | [Test_engine-misc_MobileGestures.cpp:L17](../../Tests/harden/Test_engine-misc_MobileGestures.cpp#L17) | | | `MakeTransformRecord` | function | Tests | [TestSaveSystemRoundTripReal.cpp:L53](../../Tests/TestSaveSystemRoundTripReal.cpp#L53) | | @@ -23205,7 +23249,7 @@ | `MakeUnicodeCacheDir` | function | Tests | [TestShaderDiskCachePhaseV.cpp:L80](../../Tests/TestShaderDiskCachePhaseV.cpp#L80) | | | `MakeUniqueDirectory` | function | Tests | [TestConsoleProcessPipeReal.cpp:L16](../../Tests/TestConsoleProcessPipeReal.cpp#L16) | | | `MakeUniqueLogDirectory` | function | Tests | [TestLoggerSinksReal.cpp:L18](../../Tests/TestLoggerSinksReal.cpp#L18) | | -| `MakeUniqueTemporaryPath` | function | SparkEngine | [SceneManager.cpp:L158](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L158) | | +| `MakeUniqueTemporaryPath` | function | SparkEngine | [SceneManager.cpp:L166](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L166) | | | `MakeUnitPrimitive` | function | Tests | [TestBVHAccelerator.cpp:L39](../../Tests/TestBVHAccelerator.cpp#L39) | | | `MakeVolume` | function | Tests | [TestFoliageSystem.cpp:L38](../../Tests/TestFoliageSystem.cpp#L38) | | | `MakeWallDepth` | function | Tests | [TestGTAOEffect.cpp:L37](../../Tests/TestGTAOEffect.cpp#L37) | | @@ -23222,8 +23266,8 @@ | `malformed` | function | Tests | [TestTelemetrySpool.cpp:L901](../../Tests/TestTelemetrySpool.cpp#L901) | | | `manager` | function | Tests | [TestEditorSubsystems.cpp:L1486](../../Tests/TestEditorSubsystems.cpp#L1486) | | | `manager` | function | Tests | [TestEditorSubsystems.cpp:L1536](../../Tests/TestEditorSubsystems.cpp#L1536) | | -| `manager` | function | Tests | [TestSceneManagerReflectedReal.cpp:L53](../../Tests/TestSceneManagerReflectedReal.cpp#L53) | | -| `manifest` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L225](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L225) | | +| `manager` | function | Tests | [TestSceneManagerReflectedReal.cpp:L78](../../Tests/TestSceneManagerReflectedReal.cpp#L78) | | +| `manifest` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L226](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L226) | | | `manifest` | function | Tests | [TestEditorPanelsRealBackends.cpp:L233](../../Tests/TestEditorPanelsRealBackends.cpp#L233) | | | `manifest` | function | Tests | [TestModuleABI.cpp:L401](../../Tests/TestModuleABI.cpp#L401) | | | `manifest` | function | Tests | [TestModuleABI.cpp:L422](../../Tests/TestModuleABI.cpp#L422) | | @@ -23267,7 +23311,7 @@ | `MarkDirty` | function | SparkEngine | [UIDirtyTracking.h:L167](../../SparkEngine/Source/Engine/UI/UIDirtyTracking.h#L167) | Mark screen region as dirty | | `MarkDirty` | function | SparkEngine | [PipelineStateCache.h:L323](../../SparkEngine/Source/Graphics/PipelineStateCache.h#L323) | Mark specific state categories as dirty. | | `MarkDirty` | function | SparkEngine | [TerrainRenderer.h:L123](../../SparkEngine/Source/Graphics/TerrainRenderer.h#L123) | Mark a terrain as needing mesh rebuild (e.g., after sculpting). | -| `MarkDirty` | function | SparkEngine | [SceneManager.h:L362](../../SparkEngine/Source/SceneManager/SceneManager.h#L362) | Explicitly mark the scene as having unsaved changes. | +| `MarkDirty` | function | SparkEngine | [SceneManager.h:L364](../../SparkEngine/Source/SceneManager/SceneManager.h#L364) | Explicitly mark the scene as having unsaved changes. | | `MarkDirty` | function | SparkEngine | [SplinePath.h:L150](../../SparkEngine/Source/Utils/SplinePath.h#L150) | | | `MarkDirty` | function | Tests | [TestReplicationFields.cpp:L131](../../Tests/TestReplicationFields.cpp#L131) | | | `MarkDirty` | function | Tests | [TestSceneManager.cpp:L158](../../Tests/TestSceneManager.cpp#L158) | | @@ -23379,33 +23423,33 @@ | `Material::SetTexture` | method | SparkEngine | [PBRMaterial.cpp:L270](../../SparkEngine/Source/Graphics/PBRMaterial.cpp#L270) | | | `Material::UnloadTexture` | method | SparkEngine | [PBRMaterialBinding.cpp:L28](../../SparkEngine/Source/Graphics/PBRMaterialBinding.cpp#L28) | | | `Material::UnloadTexture` | method | SparkEngine | [PBRMaterialBinding.cpp:L337](../../SparkEngine/Source/Graphics/PBRMaterialBinding.cpp#L337) | | -| `MaterialEditorPanel::CreateMaterial` | method | SparkEditor | [MaterialEditorPanel.cpp:L301](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L301) | | -| `MaterialEditorPanel::GetSelectedMaterial` | method | SparkEditor | [MaterialEditorPanel.cpp:L684](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L684) | | -| `MaterialEditorPanel::HandleEvent` | method | SparkEditor | [MaterialEditorPanel.cpp:L210](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L210) | | -| `MaterialEditorPanel::HasUnsavedChanges` | method | SparkEditor | [MaterialEditorPanel.cpp:L430](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L430) | | -| `MaterialEditorPanel::Initialize` | method | SparkEditor | [MaterialEditorPanel.cpp:L38](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L38) | | -| `MaterialEditorPanel::LoadDefaultMaterials` | method | SparkEditor | [MaterialEditorPreview.cpp:L332](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L332) | | -| `MaterialEditorPanel::OpenMaterial` | method | SparkEditor | [MaterialEditorPanel.cpp:L256](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L256) | | -| `MaterialEditorPanel::PopulateAvailableShaders` | method | SparkEditor | [MaterialEditorPanel.cpp:L53](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L53) | | -| `MaterialEditorPanel::PopulateDefaultPBRParameters` | method | SparkEditor | [MaterialEditorPreview.cpp:L588](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L588) | | -| `MaterialEditorPanel::Render` | method | SparkEditor | [MaterialEditorPanel.cpp:L124](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L124) | | +| `MaterialEditorPanel::CreateMaterial` | method | SparkEditor | [MaterialEditorFiles.cpp:L66](../../SparkEditor/Source/Panels/MaterialEditorFiles.cpp#L66) | | +| `MaterialEditorPanel::GetSelectedMaterial` | method | SparkEditor | [MaterialEditorPanel.cpp:L514](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L514) | | +| `MaterialEditorPanel::HandleEvent` | method | SparkEditor | [MaterialEditorPanel.cpp:L214](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L214) | | +| `MaterialEditorPanel::HasUnsavedChanges` | method | SparkEditor | [MaterialEditorPanel.cpp:L260](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L260) | | +| `MaterialEditorPanel::Initialize` | method | SparkEditor | [MaterialEditorPanel.cpp:L42](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L42) | | +| `MaterialEditorPanel::LoadDefaultMaterials` | method | SparkEditor | [MaterialEditorPreview.cpp:L333](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L333) | | +| `MaterialEditorPanel::OpenMaterial` | method | SparkEditor | [MaterialEditorFiles.cpp:L23](../../SparkEditor/Source/Panels/MaterialEditorFiles.cpp#L23) | | +| `MaterialEditorPanel::PopulateAvailableShaders` | method | SparkEditor | [MaterialEditorPanel.cpp:L57](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L57) | | +| `MaterialEditorPanel::PopulateDefaultPBRParameters` | method | SparkEditor | [MaterialEditorPreview.cpp:L589](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L589) | | +| `MaterialEditorPanel::Render` | method | SparkEditor | [MaterialEditorPanel.cpp:L128](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L128) | | | `MaterialEditorPanel::RenderBoolParam` | method | SparkEditor | [MaterialEditorParameters.cpp:L265](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L265) | | | `MaterialEditorPanel::RenderColorParam` | method | SparkEditor | [MaterialEditorParameters.cpp:L244](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L244) | | | `MaterialEditorPanel::RenderFloatParam` | method | SparkEditor | [MaterialEditorParameters.cpp:L199](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L199) | | -| `MaterialEditorPanel::RenderMaterialList` | method | SparkEditor | [MaterialEditorPanel.cpp:L574](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L574) | | +| `MaterialEditorPanel::RenderMaterialList` | method | SparkEditor | [MaterialEditorPanel.cpp:L404](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L404) | | | `MaterialEditorPanel::RenderParameterEditor` | method | SparkEditor | [MaterialEditorParameters.cpp:L92](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L92) | | | `MaterialEditorPanel::RenderParameterGroup` | method | SparkEditor | [MaterialEditorParameters.cpp:L127](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L127) | | -| `MaterialEditorPanel::RenderPreview` | method | SparkEditor | [MaterialEditorPreview.cpp:L149](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L149) | | -| `MaterialEditorPanel::RenderRenderStateEditor` | method | SparkEditor | [MaterialEditorPreview.cpp:L26](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L26) | | +| `MaterialEditorPanel::RenderPreview` | method | SparkEditor | [MaterialEditorPreview.cpp:L150](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L150) | | +| `MaterialEditorPanel::RenderRenderStateEditor` | method | SparkEditor | [MaterialEditorPreview.cpp:L27](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L27) | | | `MaterialEditorPanel::RenderShaderSelector` | method | SparkEditor | [MaterialEditorParameters.cpp:L27](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L27) | | | `MaterialEditorPanel::RenderTextureParam` | method | SparkEditor | [MaterialEditorParameters.cpp:L279](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L279) | | | `MaterialEditorPanel::RenderTextureSlotEditor` | method | SparkEditor | [MaterialEditorParameters.cpp:L408](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L408) | | | `MaterialEditorPanel::RenderTextureSlots` | method | SparkEditor | [MaterialEditorParameters.cpp:L377](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L377) | | -| `MaterialEditorPanel::RenderToolbar` | method | SparkEditor | [MaterialEditorPanel.cpp:L446](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L446) | | +| `MaterialEditorPanel::RenderToolbar` | method | SparkEditor | [MaterialEditorPanel.cpp:L276](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L276) | | | `MaterialEditorPanel::RenderVectorParam` | method | SparkEditor | [MaterialEditorParameters.cpp:L214](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L214) | | -| `MaterialEditorPanel::SaveMaterial` | method | SparkEditor | [MaterialEditorPanel.cpp:L320](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L320) | | -| `MaterialEditorPanel::Shutdown` | method | SparkEditor | [MaterialEditorPanel.cpp:L201](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L201) | | -| `MaterialEditorPanel::Update` | method | SparkEditor | [MaterialEditorPanel.cpp:L116](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L116) | | +| `MaterialEditorPanel::SaveMaterial` | method | SparkEditor | [MaterialEditorFiles.cpp:L85](../../SparkEditor/Source/Panels/MaterialEditorFiles.cpp#L85) | | +| `MaterialEditorPanel::Shutdown` | method | SparkEditor | [MaterialEditorPanel.cpp:L205](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L205) | | +| `MaterialEditorPanel::Update` | method | SparkEditor | [MaterialEditorPanel.cpp:L120](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L120) | | | `MaterialEffectSystem::GetEffect` | method | SparkEngine | [MaterialEffects.cpp:L46](../../SparkEngine/Source/Engine/Gameplay/MaterialEffects.cpp#L46) | | | `MaterialEffectSystem::Initialize` | method | SparkEngine | [MaterialEffects.cpp:L16](../../SparkEngine/Source/Engine/Gameplay/MaterialEffects.cpp#L16) | | | `MaterialEffectSystem::RegisterEffect` | method | SparkEngine | [MaterialEffects.cpp:L32](../../SparkEngine/Source/Engine/Gameplay/MaterialEffects.cpp#L32) | | @@ -23493,6 +23537,7 @@ | `MaterialSystem::UpdateMetrics` | method | SparkEngine | [MaterialSystem.cpp:L209](../../SparkEngine/Source/Graphics/MaterialSystem.cpp#L209) | | | `MaterialTextureValidator::GetRuleName` | method | SparkEngine | [AssetValidator.cpp:L79](../../SparkEngine/Source/Core/AssetValidator.cpp#L79) | | | `MaterialTextureValidator::ValidateAsset` | method | SparkEngine | [AssetValidator.cpp:L42](../../SparkEngine/Source/Core/AssetValidator.cpp#L42) | | +| `MaterialWorkingDirectoryGuard` | function | Tests | [TestEditorSubsystemsReal.cpp:L74](../../Tests/TestEditorSubsystemsReal.cpp#L74) | | | `MathUtils::Add` | method | SparkEngine | [MathUtils.cpp:L152](../../SparkEngine/Source/Utils/MathUtils.cpp#L152) | | | `MathUtils::Clamp` | method | SparkEngine | [MathUtils.cpp:L121](../../SparkEngine/Source/Utils/MathUtils.cpp#L121) | | | `MathUtils::Clamp` | method | SparkEngine | [MathUtils.cpp:L133](../../SparkEngine/Source/Utils/MathUtils.cpp#L133) | | @@ -23660,7 +23705,7 @@ | `MeshFilesystemPathFromLoaderPath` | function | SparkEngine | [PlaceholderMesh.h:L40](../../SparkEngine/Source/Game/PlaceholderMesh.h#L40) | | | `meshletVertexMap` | function | SparkEngine | [MeshOptimizer.h:L319](../../SparkEngine/Source/Graphics/MeshOptimizer.h#L319) | | | `MeshOf` | function | Tests | [TestMOD330ARPGWorldActors.cpp:L132](../../Tests/TestMOD330ARPGWorldActors.cpp#L132) | | -| `meshPath` | function | SparkEngine | [SceneManagerReflected.cpp:L131](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L131) | | +| `meshPath` | function | SparkEngine | [SceneManagerReflected.cpp:L196](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L196) | | | `MeshPath` | function | Tests | [TestEditorAssetDropWorldReal.cpp:L143](../../Tests/TestEditorAssetDropWorldReal.cpp#L143) | | | `MeshProcessor::GenerateAutoLODs` | method | SparkEditor | [AssetProcessors.cpp:L504](../../SparkEditor/Source/AssetPipeline/AssetProcessors.cpp#L504) | | | `MeshProcessor::GenerateThumbnail` | method | SparkEditor | [AssetProcessors.cpp:L493](../../SparkEditor/Source/AssetPipeline/AssetProcessors.cpp#L493) | | @@ -23679,7 +23724,7 @@ | `MeshSimplifier::Simplify` | method | SparkEngine | [MeshLODWindows.cpp:L64](../../SparkEngine/Source/Graphics/MeshLODWindows.cpp#L64) | | | `MeshSimplifier::SimplifyByRatio` | method | SparkEngine | [MeshLODLinux.cpp:L166](../../SparkEngine/Source/Graphics/MeshLODLinux.cpp#L166) | | | `MeshSimplifier::SimplifyByRatio` | method | SparkEngine | [MeshLODWindows.cpp:L189](../../SparkEngine/Source/Graphics/MeshLODWindows.cpp#L189) | | -| `message` | function | SparkConsole | [ConsoleApp.cpp:L473](../../SparkConsole/src/ConsoleApp.cpp#L473) | | +| `message` | function | SparkConsole | [ConsoleApp.cpp:L477](../../SparkConsole/src/ConsoleApp.cpp#L477) | | | `message` | function | Tests | [TestNetworkMMOIntegration.cpp:L88](../../Tests/TestNetworkMMOIntegration.cpp#L88) | | | `MessageBoxA` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1583](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1583) | | | `MessageBoxA` | function | SparkEngine | [PlatformTypes.h:L387](../../SparkEngine/Source/Core/PlatformTypes.h#L387) | | @@ -23688,7 +23733,7 @@ | `MessageCallback` | function | Tests | [TestAngelScriptStackAlignmentReal.cpp:L101](../../Tests/TestAngelScriptStackAlignmentReal.cpp#L101) | | | `metadata` | function | Tests | [TestPluginABI.cpp:L375](../../Tests/TestPluginABI.cpp#L375) | | | `MetadataPath` | function | SparkEngine | [PluginMetadata.cpp:L35](../../SparkEngine/Source/Core/PluginMetadata.cpp#L35) | | -| `metaFile` | function | SparkEditor | [EditorUI.cpp:L1344](../../SparkEditor/Source/Core/EditorUI.cpp#L1344) | | +| `metaFile` | function | SparkEditor | [EditorUI.cpp:L1364](../../SparkEditor/Source/Core/EditorUI.cpp#L1364) | | | `MetalArgumentBuffer` | function | SparkEngine | [MetalDevice.mm:L1310](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.mm#L1310) | | | `MetalArgumentBuffer::SetBuffer` | method | SparkEngine | [MetalDevice.mm:L90](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.mm#L90) | | | `MetalArgumentBuffer::SetSampler` | method | SparkEngine | [MetalDevice.mm:L110](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.mm#L110) | | @@ -24558,24 +24603,24 @@ | `NameOf` | function | Tests | [TestMOD330ARPGWorldActors.cpp:L126](../../Tests/TestMOD330ARPGWorldActors.cpp#L126) | | | `NameOfPlayer` | function | GameModules | [TFSocialSystem.h:L85](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L85) | | | `namePos` | function | GameModules | [TFNameplates.cpp:L327](../../GameModules/SparkGameMMOFPS/Source/UI/TFNameplates.cpp#L327) | | -| `narrow` | function | SparkConsole | [ConsoleApp.cpp:L652](../../SparkConsole/src/ConsoleApp.cpp#L652) | | +| `narrow` | function | SparkConsole | [ConsoleApp.cpp:L656](../../SparkConsole/src/ConsoleApp.cpp#L656) | | | `Narrow` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L88](../../Tests/TestRHI225D3D12ParityReal.cpp#L88) | | | `NarrowCast` | function | SparkEngine | [SafeCast.h:L42](../../SparkEngine/Source/Core/SafeCast.h#L42) | | | `narrowFile` | function | SparkEngine | [ShaderCompilationWindowsFileLoad.cpp:L96](../../SparkEngine/Source/Graphics/ShaderCompilationWindowsFileLoad.cpp#L96) | | | `narrowFile` | function | SparkEngine | [ShaderCompilationWindowsFileLoad.cpp:L162](../../SparkEngine/Source/Graphics/ShaderCompilationWindowsFileLoad.cpp#L162) | | | `narrowFilename` | function | SparkEngine | [SoundEffect.cpp:L44](../../SparkEngine/Source/Audio/SoundEffect.cpp#L44) | | -| `narrowMsg` | function | SparkConsole | [ConsoleApp.cpp:L681](../../SparkConsole/src/ConsoleApp.cpp#L681) | | -| `narrowMsg` | function | SparkConsole | [ConsoleApp.cpp:L764](../../SparkConsole/src/ConsoleApp.cpp#L764) | | -| `narrowName` | function | SparkEngine | [SceneManager.cpp:L514](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L514) | | +| `narrowMsg` | function | SparkConsole | [ConsoleApp.cpp:L685](../../SparkConsole/src/ConsoleApp.cpp#L685) | | +| `narrowMsg` | function | SparkConsole | [ConsoleApp.cpp:L768](../../SparkConsole/src/ConsoleApp.cpp#L768) | | +| `narrowName` | function | SparkEngine | [SceneManager.cpp:L572](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L572) | | | `narrowPath` | function | SparkEngine | [GraphicsDeviceResourcesLinuxShaders.cpp:L131](../../SparkEngine/Source/Graphics/GraphicsDeviceResourcesLinuxShaders.cpp#L131) | | | `narrowPath` | function | SparkEngine | [MeshLinux.cpp:L284](../../SparkEngine/Source/Graphics/MeshLinux.cpp#L284) | | | `narrowPath` | function | SparkEngine | [ShaderConsoleOps.cpp:L34](../../SparkEngine/Source/Graphics/ShaderConsoleOps.cpp#L34) | | | `narrowPath` | function | SparkEngine | [ShaderConsoleOps.cpp:L108](../../SparkEngine/Source/Graphics/ShaderConsoleOps.cpp#L108) | | | `narrowPath` | function | SparkEngine | [ShaderHotReload.cpp:L127](../../SparkEngine/Source/Graphics/ShaderHotReload.cpp#L127) | | -| `narrowPath` | function | SparkEngine | [SceneManager.cpp:L616](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L616) | | -| `narrowPath` | function | SparkEngine | [SceneManager.cpp:L846](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L846) | | +| `narrowPath` | function | SparkEngine | [SceneManager.cpp:L684](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L684) | | +| `narrowPath` | function | SparkEngine | [SceneManager.cpp:L934](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L934) | | | `narrowPath` | function | Tests | [TestGLSLPipelineIntegration.cpp:L386](../../Tests/TestGLSLPipelineIntegration.cpp#L386) | | -| `NarrowPathIfRoundTrips` | function | SparkEngine | [SceneManager.cpp:L60](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L60) | | +| `NarrowPathIfRoundTrips` | function | SparkEngine | [SceneManager.cpp:L62](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L62) | | | `NarrowSafeDirectory` | function | SparkEngine | [EngineSettings.cpp:L909](../../SparkEngine/Source/Core/EngineSettings.cpp#L909) | | | `NarrowSafeDirectory` | function | SparkEngine | [EngineSettings.h:L70](../../SparkEngine/Source/Core/EngineSettings.h#L70) | | | `Native` | function | Tests | [TestPrefabPersistence.cpp:L59](../../Tests/TestPrefabPersistence.cpp#L59) | | @@ -24585,14 +24630,14 @@ | `NativeModuleExtension` | function | SparkEditor | [BuildPipeline.cpp:L197](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L197) | | | `NativeModuleExtension` | function | SparkLauncher | [LauncherProcess.cpp:L74](../../SparkLauncher/src/LauncherProcess.cpp#L74) | | | `nativePath` | function | SparkEngine | [WorldBasicRenderer.cpp:L329](../../SparkEngine/Source/Graphics/WorldBasicRenderer.cpp#L329) | | -| `nativePath` | function | SparkEngine | [SceneManager.cpp:L887](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L887) | | +| `nativePath` | function | SparkEngine | [SceneManager.cpp:L979](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L979) | | | `nativeRoot` | function | SparkEngine | [GameObject.cpp:L158](../../SparkEngine/Source/Game/GameObject.cpp#L158) | | -| `nativeScenePath` | function | SparkEngine | [SceneManager.cpp:L519](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L519) | | +| `nativeScenePath` | function | SparkEngine | [SceneManager.cpp:L577](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L577) | | | `NativeServerPlatform` | function | SparkEditor | [DedicatedServerPanel.cpp:L81](../../SparkEditor/Source/Panels/DedicatedServerPanel.cpp#L81) | | | `NativeString` | function | Tests | [TestAngelScriptStackAlignmentReal.cpp:L159](../../Tests/TestAngelScriptStackAlignmentReal.cpp#L159) | | | `NativeTargetPlatform` | function | SparkEditor | [BuildPipeline.h:L132](../../SparkEditor/Source/Panels/BuildPipeline.h#L132) | Return the only target that this editor host can package and execute natively. | | `NavigateHistory` | function | SparkEngine | [InGameConsole.h:L224](../../SparkEngine/Source/Utils/InGameConsole.h#L224) | Navigate command history (up = -1, down = +1) | -| `NavigateToFolder` | function | SparkEditor | [AssetBrowserPanel.h:L87](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L87) | Navigate to a directory contained by the active asset root. | +| `NavigateToFolder` | function | SparkEditor | [AssetBrowserPanel.h:L88](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L88) | Navigate to a directory contained by the active asset root. | | `NavigateToResult` | function | SparkEditor | [SearchPanel.h:L126](../../SparkEditor/Source/Panels/SearchPanel.h#L126) | Act on a result: select the entity, or report the asset path. | | `NavMeshBuilder::Build` | method | SparkEngine | [NavMesh.cpp:L598](../../SparkEngine/Source/Engine/AI/NavMesh.cpp#L598) | | | `NavMeshBuilder::Build` | method | Tests | [TestNavMesh.cpp:L482](../../Tests/TestNavMesh.cpp#L482) | | @@ -24643,7 +24688,7 @@ | `Near` | function | Tests | [TestAnimationSystem.cpp:L50](../../Tests/TestAnimationSystem.cpp#L50) | | | `Near` | function | Tests | [TestAnimationSystem.cpp:L92](../../Tests/TestAnimationSystem.cpp#L92) | | | `Near` | function | Tests | [TestNavMesh.cpp:L38](../../Tests/TestNavMesh.cpp#L38) | | -| `Near` | function | Tests | [TestTF120Travel.cpp:L382](../../Tests/TestTF120Travel.cpp#L382) | | +| `Near` | function | Tests | [TestTF120Travel.cpp:L369](../../Tests/TestTF120Travel.cpp#L369) | | | `NearByte` | function | Tests | [TestPostProcessingPipelineD3D11.cpp:L111](../../Tests/TestPostProcessingPipelineD3D11.cpp#L111) | | | `NearestEnemy` | function | GameModules | [TFCommandsHarness.cpp:L314](../../GameModules/SparkGameMMOFPS/Source/Console/TFCommandsHarness.cpp#L314) | | | `NearestExistingAncestor` | function | SparkInstaller | [InstallerPreflight.cpp:L38](../../SparkInstaller/src/InstallerPreflight.cpp#L38) | | @@ -24888,7 +24933,7 @@ | `NewGame` | function | Templates | [GameModule.h:L237](../../Templates/RPGStarter/Source/GameModule.h#L237) | | | `newHeights` | function | SparkEditor | [TerrainData.cpp:L94](../../SparkEditor/Source/Terrain/TerrainData.cpp#L94) | | | `NewScene` | function | SparkEditor | [EditorUI.h:L210](../../SparkEditor/Source/Core/EditorUI.h#L210) | Select the transform tool and push it to the Scene View gizmo. | -| `NewScene` | function | SparkEngine | [SceneManager.h:L337](../../SparkEngine/Source/SceneManager/SceneManager.h#L337) | Clear the current scene and start a new, empty scene. | +| `NewScene` | function | SparkEngine | [SceneManager.h:L339](../../SparkEngine/Source/SceneManager/SceneManager.h#L339) | Clear the current scene and start a new, empty scene. | | `NewScene` | function | Tests | [TestSceneManager.cpp:L41](../../Tests/TestSceneManager.cpp#L41) | | | `NewSceneNow` | function | SparkEditor | [EditorUI.h:L452](../../SparkEditor/Source/Core/EditorUI.h#L452) | | | `newTiles` | function | SparkEngine | [Sprite2DComponents.h:L311](../../SparkEngine/Source/Engine/ECS/Components/Sprite2DComponents.h#L311) | | @@ -24929,10 +24974,10 @@ | `node` | function | Tests | [TestBehaviorTreeNodes.cpp:L77](../../Tests/TestBehaviorTreeNodes.cpp#L77) | | | `node` | function | Tests | [TestBehaviorTreeNodes.cpp:L90](../../Tests/TestBehaviorTreeNodes.cpp#L90) | | | `node` | function | Tests | [TestBehaviorTreeNodes.cpp:L98](../../Tests/TestBehaviorTreeNodes.cpp#L98) | | -| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L96](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L96) | | -| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L713](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L713) | | -| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L752](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L752) | | -| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L757](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L757) | | +| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L97](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L97) | | +| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L756](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L756) | | +| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L795](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L795) | | +| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L800](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L800) | | | `node` | function | Tests | [TestSceneGraph2D.cpp:L10](../../Tests/TestSceneGraph2D.cpp#L10) | | | `node` | function | Tests | [TestSceneGraph2D.cpp:L17](../../Tests/TestSceneGraph2D.cpp#L17) | | | `node` | function | Tests | [TestSceneGraph2D.cpp:L25](../../Tests/TestSceneGraph2D.cpp#L25) | | @@ -25010,7 +25055,7 @@ | `NormalizeDirection` | function | SparkEngine | [SkyAtmosphere.h:L204](../../SparkEngine/Source/Graphics/SkyAtmosphere.h#L204) | Normalize a 3D direction vector in place. | | `NormalizedManifest` | function | Tests | [TestGamePackager.cpp:L240](../../Tests/TestGamePackager.cpp#L240) | | | `NormalizedTime` | function | SparkEngine | [Sequencer.cpp:L57](../../SparkEngine/Source/Engine/Cinematic/Sequencer.cpp#L57) | | -| `normalizedU8` | function | GameModules | [FPSAssetPaths.cpp:L184](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L184) | | +| `normalizedU8` | function | GameModules | [FPSAssetPaths.cpp:L198](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L198) | | | `NormalizeKey` | function | SparkEngine | [LocalFileCache.h:L345](../../SparkEngine/Source/Utils/LocalFileCache.h#L345) | | | `NormalizeLocalEndpoint` | function | SparkGateway | [GatewayAreaControl.cpp:L43](../../SparkGateway/src/GatewayAreaControl.cpp#L43) | | | `NormalizeManifestArtifacts` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1044](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1044) | | @@ -25020,6 +25065,7 @@ | `NormalizeProjectPath` | function | SparkEditor | [ProjectManager.cpp:L1655](../../SparkEditor/Source/Core/ProjectManager.cpp#L1655) | | | `NormalizeTrigger` | function | SparkEngine | [GamepadInput.h:L453](../../SparkEngine/Source/Input/GamepadInput.h#L453) | Normalize a raw trigger BYTE value to [0.0, 1.0] | | `NormalizeTrustedRootAlias` | function | SparkEngine | [TelemetrySpool.cpp:L33](../../SparkEngine/Source/Utils/TelemetrySpool.cpp#L33) | | +| `NormalizeWin32ModifierVirtualKey` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L414](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L414) | | | `normalPatch` | function | SparkEngine | [NeuralPostProcessing.cpp:L173](../../SparkEngine/Source/Graphics/Neural/NeuralPostProcessing.cpp#L173) | | | `normals` | function | SparkEngine | [LODGenerator.cpp:L87](../../SparkEngine/Source/Graphics/LODGenerator.cpp#L87) | | | `normals` | function | Tests | [RHI210D3D11GoldenSupport.h:L528](../../Tests/RHI210D3D11GoldenSupport.h#L528) | | @@ -25055,7 +25101,7 @@ | `NotifyStateChange` | function | SparkEngine | [SparkEngineCamera.h:L401](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L401) | Notify console of state change | | `NotifyStateChange` | function | SparkEngine | [GraphicsEngine.h:L1316](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L1316) | | | `NotifyStateChange` | function | SparkEngine | [Shader.h:L584](../../SparkEngine/Source/Graphics/Shader.h#L584) | Notify console of shader state changes | -| `NotifyStateChange` | function | SparkEngine | [InputManager.h:L505](../../SparkEngine/Source/Input/InputManager.h#L505) | Notify console of state changes | +| `NotifyStateChange` | function | SparkEngine | [InputManager.h:L512](../../SparkEngine/Source/Input/InputManager.h#L512) | Notify console of state changes | | `NotifyStepChanged` | function | SparkEditor | [TutorialSystem.h:L373](../../SparkEditor/Source/Core/TutorialSystem.h#L373) | Notify all step-changed callbacks. | | `NotifyUnlock` | function | SparkEngine | [AchievementSystem.h:L494](../../SparkEngine/Source/Engine/Gameplay/AchievementSystem.h#L494) | Fire unlock callbacks for an achievement | | `Now` | function | GameModules | [TFBotSystem.h:L204](../../GameModules/SparkGameMMOFPS/Source/Game/TFBotSystem.h#L204) | | @@ -25099,7 +25145,7 @@ | `nullStage` | function | Tests | [TestLifecycleCompositionRootFailure.cpp:L350](../../Tests/TestLifecycleCompositionRootFailure.cpp#L350) | | | `NullSwapChain` | function | SparkEngine | [NullRHIDevice.h:L122](../../SparkEngine/Source/Graphics/RHI/NullRHIDevice.h#L122) | CPU-only swap chain with a stable NullTexture back buffer. | | `NullTexture` | function | SparkEngine | [NullRHIResources.h:L109](../../SparkEngine/Source/Graphics/RHI/NullRHIResources.h#L109) | Interface-only stub texture. No backing memory. | -| `Num` | function | Tests | [TestTFDataTables.cpp:L85](../../Tests/TestTFDataTables.cpp#L85) | | +| `Num` | function | Tests | [TestTFDataTables.cpp:L76](../../Tests/TestTFDataTables.cpp#L76) | | | `number` | function | GameModules | [TFHandoffParticipant.cpp:L24](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.cpp#L24) | | | `Number` | function | GameModules | [PlatformerProgress.cpp:L64](../../GameModules/SparkGamePlatformer/Source/Core/PlatformerProgress.cpp#L64) | | | `Number` | function | GameModules | [RTSPersistenceCodec.cpp:L93](../../GameModules/SparkGameRTS/Source/Core/RTSPersistenceCodec.cpp#L93) | | @@ -25130,6 +25176,9 @@ | `ObjLocalAabb` | function | GameModules | [TFWorldCollision.h:L182](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldCollision.h#L182) | | | `objPos` | function | SparkEngine | [SceneRenderer.cpp:L164](../../SparkEngine/Source/Graphics/SceneRenderer.cpp#L164) | | | `objStream` | function | SparkEngine | [OBJStaticMeshLoader.cpp:L402](../../SparkEngine/Source/Graphics/OBJStaticMeshLoader.cpp#L402) | | +| `ObservationHex` | function | GameModules | [GameEngineSystems.cpp:L488](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L488) | | +| `ObservationHex` | function | GameModules | [GameEngineSystems.cpp:L517](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L517) | | +| `ObservationProfile` | function | GameModules | [GameEngineSystems.cpp:L500](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L500) | | | `Observe` | function | Tests | [FPSLANLoopbackPeer.cpp:L534](../../Tests/Fixtures/FPSLANLoopbackPeer.cpp#L534) | | | `Observe` | function | Tests | [TestAngelScriptStackAlignmentReal.cpp:L127](../../Tests/TestAngelScriptStackAlignmentReal.cpp#L127) | | | `ObserveDocumentHistoryForRecovery` | function | SparkEditor | [EditorUI.h:L460](../../SparkEditor/Source/Core/EditorUI.h#L460) | | @@ -25163,7 +25212,7 @@ | `offset` | function | GameModules | [WaveSpawner.cpp:L224](../../GameModules/SparkGameFPS/Source/Game/WaveSpawner.cpp#L224) | | | `offsetSettings` | function | SparkEngine | [PhysicsShapeFactory.cpp:L207](../../SparkEngine/Source/Physics/PhysicsShapeFactory.cpp#L207) | | | `ofs` | function | SparkEngine | [ShaderDiskCache.cpp:L187](../../SparkEngine/Source/Graphics/ShaderDiskCache.cpp#L187) | | -| `ofs` | function | Tests | [TestSparkPak.cpp:L409](../../Tests/TestSparkPak.cpp#L409) | | +| `ofs` | function | Tests | [TestSparkPak.cpp:L425](../../Tests/TestSparkPak.cpp#L425) | | | `Ok` | function | SparkEngine | [UDPTransport.h:L85](../../SparkEngine/Source/Engine/Networking/UDPTransport.h#L85) | | | `Ok` | function | SparkEngine | [LocalFileCache.h:L106](../../SparkEngine/Source/Utils/LocalFileCache.h#L106) | | | `Ok` | function | SparkEngine | [LocalFileCache.h:L120](../../SparkEngine/Source/Utils/LocalFileCache.h#L120) | | @@ -25251,7 +25300,7 @@ | `OnDisconnected` | function | Tests | [TestServerMockClient.cpp:L382](../../Tests/TestServerMockClient.cpp#L382) | | | `OnDisplayResize` | function | SparkEngine | [UpscalingSystem.h:L151](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L151) | Handle display resolution change | | `OneClipAnimation` | function | Tests | [Test_ai-anim_animation.cpp:L77](../../Tests/harden/Test_ai-anim_animation.cpp#L77) | | -| `OnEnginePipeClosed` | function | SparkConsole | [ConsoleApp.h:L92](../../SparkConsole/src/ConsoleApp.h#L92) | | +| `OnEnginePipeClosed` | function | SparkConsole | [ConsoleApp.h:L93](../../SparkConsole/src/ConsoleApp.h#L93) | | | `OnEnteredWorld` | function | GameModules | [TFLoginFlow.h:L131](../../GameModules/SparkGameMMOFPS/Source/UI/TFLoginFlow.h#L131) | | | `OnEntitySelected` | function | SparkEditor | [IEditorPlugin.h:L92](../../SparkEditor/Source/Core/IEditorPlugin.h#L92) | Called when the user selects an entity | | `OneRecord` | function | Tests | [TestTFSocialStore.cpp:L67](../../Tests/TestTFSocialStore.cpp#L67) | | @@ -25272,7 +25321,7 @@ | `OnFixedUpdate` | function | GameModules | [SparkGameVisualScript.h:L49](../../GameModules/SparkGameVisualScript/Source/Core/SparkGameVisualScript.h#L49) | | | `OnFixedUpdate` | function | SparkSDK | [IModule.h:L162](../../SparkSDK/Include/Spark/IModule.h#L162) | Called at a fixed timestep for deterministic simulation | | `OnFrameEnd` | function | SparkEngine | [FrameInspector.h:L226](../../SparkEngine/Source/Utils/FrameInspector.h#L226) | Call at the end of each processed frame | -| `OnGameThread` | function | GameModules | [FPSWeatherIntegration.h:L51](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L51) | | +| `OnGameThread` | function | GameModules | [FPSWeatherIntegration.h:L53](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L53) | | | `OnGesture` | function | SparkEngine | [MobilePlatform.h:L180](../../SparkEngine/Source/Engine/Mobile/MobilePlatform.h#L180) | Register a gesture callback. | | `OnGUI` | function | SparkEditor | [IEditorPlugin.h:L72](../../SparkEditor/Source/Core/IEditorPlugin.h#L72) | Render plugin UI via ImGui | | `OnGUI` | function | Tests | [TestEditorSubsystems.cpp:L77](../../Tests/TestEditorSubsystems.cpp#L77) | | @@ -25432,7 +25481,7 @@ | `OnPlayerKilled` | function | GameModules | [TFMedalSystem.h:L247](../../GameModules/SparkGameMMOFPS/Source/Game/TFMedalSystem.h#L247) | | | `OnPlayerKilled` | function | GameModules | [TFProgressionSystem.h:L252](../../GameModules/SparkGameMMOFPS/Source/Game/TFProgressionSystem.h#L252) | | | `OnPlayerKilled` | function | GameModules | [TFVehicleSystem.h:L201](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L201) | | -| `OnPlayerKilled` | function | GameModules | [TFReplication.h:L91](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L91) | | +| `OnPlayerKilled` | function | GameModules | [TFReplication.h:L96](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L96) | | | `OnPlayerKilled` | function | GameModules | [TFServerSim.h:L176](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L176) | | | `OnPlayerKilled` | function | GameModules | [TFScoreboard.h:L93](../../GameModules/SparkGameMMOFPS/Source/UI/TFScoreboard.h#L93) | | | `OnPlayerKilledBus` | function | GameModules | [TFHUD.h:L136](../../GameModules/SparkGameMMOFPS/Source/UI/TFHUD.h#L136) | | @@ -25442,7 +25491,7 @@ | `OnPlayerSpawned` | function | GameModules | [TFGrenadeSystem.h:L244](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L244) | | | `OnPlayerSpawned` | function | GameModules | [TFOutfitSystem.h:L244](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L244) | | | `OnPlayerSpawned` | function | GameModules | [TFProgressionSystem.h:L253](../../GameModules/SparkGameMMOFPS/Source/Game/TFProgressionSystem.h#L253) | | -| `OnPlayerSpawned` | function | GameModules | [TFReplication.h:L90](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L90) | | +| `OnPlayerSpawned` | function | GameModules | [TFReplication.h:L95](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L95) | | | `OnPlayerSpawned` | function | GameModules | [TFServerSim.h:L175](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L175) | | | `OnPlayerSpawned` | function | GameModules | [TFTravelSystem.h:L154](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L154) | Keep a restored sanctuary checkpoint; discard the ordinary spawn-pad teleport queued by spawn. | | `OnProcessingPassEnd` | function | SparkEngine | [AudioEngine.h:L758](../../SparkEngine/Source/Audio/AudioEngine.h#L758) | | @@ -25484,10 +25533,10 @@ | `OnRender` | function | Templates | [GameModule.h:L131](../../Templates/RPGStarter/Source/GameModule.h#L131) | | | `OnRender` | function | Templates | [GameModule.h:L113](../../Templates/ThirdPersonStarter/Source/GameModule.h#L113) | | | `OnRender` | function | Templates | [GameModule.h:L132](../../Templates/TopDownStarter/Source/GameModule.h#L132) | | -| `OnRepCreate` | function | GameModules | [TFReplication.h:L108](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L108) | | -| `OnRepDestroy` | function | GameModules | [TFReplication.h:L110](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L110) | | -| `OnRepMoveState` | function | GameModules | [TFReplication.h:L111](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L111) | | -| `OnRepUpdate` | function | GameModules | [TFReplication.h:L109](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L109) | | +| `OnRepCreate` | function | GameModules | [TFReplication.h:L112](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L112) | | +| `OnRepDestroy` | function | GameModules | [TFReplication.h:L114](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L114) | | +| `OnRepMoveState` | function | GameModules | [TFReplication.h:L115](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L115) | | +| `OnRepUpdate` | function | GameModules | [TFReplication.h:L113](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L113) | | | `OnReset` | function | SparkEngine | [InstanceManager.h:L86](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L86) | | | `OnResize` | function | GameModules | [SparkGame.h:L45](../../GameModules/SparkGame/Source/Core/SparkGame.h#L45) | | | `OnResize` | function | GameModules | [SparkGameARPG.h:L62](../../GameModules/SparkGameARPG/Source/Core/SparkGameARPG.h#L62) | | @@ -25544,7 +25593,7 @@ | `OnSettingsChanged` | function | Tests | [TestEngineSettingsParser.cpp:L230](../../Tests/TestEngineSettingsParser.cpp#L230) | | | `OnShaderReloaded` | function | SparkEngine | [ShaderHotReload.h:L297](../../SparkEngine/Source/Graphics/ShaderHotReload.h#L297) | Register a callback invoked after each shader reload attempt. | | `OnShutdownRequested` | function | SparkEditor | [EditorApplication.h:L102](../../SparkEditor/Source/Core/EditorApplication.h#L102) | | -| `OnSignalReportTimeout` | function | SparkEngine | [CrashHandler.cpp:L2176](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2176) | | +| `OnSignalReportTimeout` | function | SparkEngine | [CrashHandler.cpp:L2207](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2207) | | | `OnSpawnReply` | function | GameModules | [TFClientNet.h:L213](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L213) | | | `onStack` | function | Tests | [TestMSanCanary.cpp:L53](../../Tests/TestMSanCanary.cpp#L53) | | | `OnStart` | function | SparkEngine | [InstanceManager.h:L81](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L81) | | @@ -25651,7 +25700,7 @@ | `Open` | function | Tests | [TestReliableChannel.cpp:L446](../../Tests/TestReliableChannel.cpp#L446) | | | `open` | function | Tests | [TestSparkError.cpp:L62](../../Tests/TestSparkError.cpp#L62) | | | `open` | function | Tests | [TestSparkError.cpp:L64](../../Tests/TestSparkError.cpp#L64) | | -| `Open` | function | Tests | [TestSparkPak.cpp:L174](../../Tests/TestSparkPak.cpp#L174) | | +| `Open` | function | Tests | [TestSparkPak.cpp:L180](../../Tests/TestSparkPak.cpp#L180) | | | `OpenALAudioBackend::GetMasterVolume` | method | SparkEngine | [OpenALAudioBackend.cpp:L118](../../SparkEngine/Source/Audio/OpenALAudioBackend.cpp#L118) | | | `OpenALAudioBackend::GetMusicVolume` | method | SparkEngine | [OpenALAudioBackend.cpp:L128](../../SparkEngine/Source/Audio/OpenALAudioBackend.cpp#L128) | | | `OpenALAudioBackend::GetSFXVolume` | method | SparkEngine | [OpenALAudioBackend.cpp:L123](../../SparkEngine/Source/Audio/OpenALAudioBackend.cpp#L123) | | @@ -25704,13 +25753,14 @@ | `OpenALAudioEngine::UpdateSources` | method | SparkEngine | [OpenALAudioEngine.cpp:L668](../../SparkEngine/Source/Audio/OpenALAudioEngine.cpp#L668) | | | `OpenArtifact` | function | SparkCrashReporter | [CrashReporterApp.cpp:L867](../../SparkCrashReporter/src/CrashReporterApp.cpp#L867) | | | `OpenArtifact` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1093](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1093) | | -| `OpenArtifactRelativeToPinnedRoot` | function | SparkEngine | [CrashHandler.cpp:L226](../../SparkEngine/Source/Utils/CrashHandler.cpp#L226) | | -| `openat` | function | SparkEngine | [CrashHandler.cpp:L2240](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2240) | | -| `openat` | function | SparkEngine | [CrashHandler.cpp:L2320](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2320) | | +| `OpenArtifactRelativeToPinnedRoot` | function | SparkEngine | [CrashHandler.cpp:L227](../../SparkEngine/Source/Utils/CrashHandler.cpp#L227) | | +| `OpenAsset` | function | SparkEditor | [AssetBrowserPanel.h:L97](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L97) | Request the editor for a .spkmat file inside the active asset root. | +| `openat` | function | SparkEngine | [CrashHandler.cpp:L2278](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2278) | | +| `openat` | function | SparkEngine | [CrashHandler.cpp:L2358](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2358) | | | `OpenBuildFolder` | function | SparkBuild | [SparkBuild.h:L53](../../SparkBuild/src/SparkBuild.h#L53) | | | `OpenChatInput` | function | GameModules | [TFChatWindow.h:L57](../../GameModules/SparkGameMMOFPS/Source/UI/TFChatWindow.h#L57) | | | `OpenClassTerminal` | function | GameModules | [TFSpawnScreen.h:L60](../../GameModules/SparkGameMMOFPS/Source/UI/TFSpawnScreen.h#L60) | | -| `OpenDirectoryBelow` | function | SparkEngine | [SceneManager.cpp:L388](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L388) | | +| `OpenDirectoryBelow` | function | SparkEngine | [SceneManager.cpp:L430](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L430) | | | `opened` | function | Tests | [TestNET100Libsodium.cpp:L58](../../Tests/TestNET100Libsodium.cpp#L58) | | | `OpenedProject` | function | Tests | [TestDocumentInterruptionReal.cpp:L367](../../Tests/TestDocumentInterruptionReal.cpp#L367) | | | `OpenFile` | function | SparkEngine | [Logger.h:L358](../../SparkEngine/Source/Utils/Logger.h#L358) | | @@ -25726,8 +25776,8 @@ | `OpenNullDescriptor` | function | Tests | [TestSparkError.cpp:L59](../../Tests/TestSparkError.cpp#L59) | | | `OpenPinnedDirectory` | function | SparkCrashReporter | [CrashReporterApp.cpp:L801](../../SparkCrashReporter/src/CrashReporterApp.cpp#L801) | | | `OpenPinnedDirectory` | function | SparkEngine | [HeldHandles.h:L110](../../SparkEngine/Source/Engine/Modding/HeldHandles.h#L110) | | -| `OpenPinnedDirectory` | function | SparkEngine | [SceneManager.cpp:L240](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L240) | | -| `OpenPinnedInputFile` | function | SparkEngine | [CrashHandler.cpp:L307](../../SparkEngine/Source/Utils/CrashHandler.cpp#L307) | | +| `OpenPinnedDirectory` | function | SparkEngine | [SceneManager.cpp:L260](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L260) | | +| `OpenPinnedInputFile` | function | SparkEngine | [CrashHandler.cpp:L308](../../SparkEngine/Source/Utils/CrashHandler.cpp#L308) | | | `OpenPrefabWriter` | function | Tests | [TestDocumentInterruptionReal.cpp:L299](../../Tests/TestDocumentInterruptionReal.cpp#L299) | | | `OpenProject` | function | SparkEditor | [ProjectManager.h:L142](../../SparkEditor/Source/Core/ProjectManager.h#L142) | Open a .sparkproject (or a directory containing one) as the current project. | | `OpenProjectWriter` | function | Tests | [TestDocumentInterruptionReal.cpp:L394](../../Tests/TestDocumentInterruptionReal.cpp#L394) | | @@ -25735,8 +25785,8 @@ | `OpenRepository` | function | Tests | [TestVersionControlSystemGitReal.cpp:L112](../../Tests/TestVersionControlSystemGitReal.cpp#L112) | Create the repository under test. Every failure here is a hard test failure. | | `OpenScene` | function | SparkEditor | [EditorUI.h:L279](../../SparkEditor/Source/Core/EditorUI.h#L279) | Load a reflected scene JSON (as written by SaveCurrentScene) | | `OpenSceneWriter` | function | Tests | [TestDocumentInterruptionReal.cpp:L238](../../Tests/TestDocumentInterruptionReal.cpp#L238) | | -| `OpenSignalArtifact` | function | SparkEngine | [CrashHandler.cpp:L2314](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2314) | | -| `OpenSignalReportLog` | function | SparkEngine | [CrashHandler.cpp:L2202](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2202) | | +| `OpenSignalArtifact` | function | SparkEngine | [CrashHandler.cpp:L2352](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2352) | | +| `OpenSignalReportLog` | function | SparkEngine | [CrashHandler.cpp:L2240](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2240) | | | `OpenWith` | function | Tests | [SecureTestPeer.cpp:L53](../../Tests/Fixtures/SecureTestPeer.cpp#L53) | | | `OpenWith` | function | Tests | [SecureTestPeer.cpp:L488](../../Tests/Fixtures/SecureTestPeer.cpp#L488) | | | `OpenWith` | function | Tests | [SecureTestPeer.cpp:L585](../../Tests/Fixtures/SecureTestPeer.cpp#L585) | | @@ -25750,7 +25800,7 @@ | `operator` | function | SparkDaemon | [ShaderService.h:L108](../../SparkDaemon/src/ShaderService.h#L108) | | | `operator` | function | SparkEditor | [EditorPluginManager.h:L29](../../SparkEditor/Source/Core/EditorPluginManager.h#L29) | | | `operator` | function | SparkEngine | [AssetHandle.h:L84](../../SparkEngine/Source/Core/AssetHandle.h#L84) | | -| `operator` | function | SparkEngine | [EngineContext.h:L82](../../SparkEngine/Source/Core/EngineContext.h#L82) | | +| `operator` | function | SparkEngine | [EngineContext.h:L83](../../SparkEngine/Source/Core/EngineContext.h#L83) | | | `operator` | function | SparkEngine | [CoverSystem.h:L175](../../SparkEngine/Source/Engine/AI/CoverSystem.h#L175) | | | `operator` | function | SparkEngine | [TacticalPointSystem.h:L201](../../SparkEngine/Source/Engine/AI/TacticalPointSystem.h#L201) | | | `operator` | function | SparkEngine | [SpatialGrid.h:L56](../../SparkEngine/Source/Engine/World/SpatialGrid.h#L56) | | @@ -25760,7 +25810,7 @@ | `operator` | function | SparkEngine | [RenderGraphTypes.h:L65](../../SparkEngine/Source/Graphics/RenderGraphTypes.h#L65) | Hash support for RenderGraphResource so it can be used in | | `operator` | function | SparkEngine | [ShaderCrossCompiler.h:L119](../../SparkEngine/Source/Graphics/ShaderCrossCompiler.h#L119) | | | `operator` | function | SparkEngine | [ShaderVariantSystem.h:L106](../../SparkEngine/Source/Graphics/ShaderVariantSystem.h#L106) | | -| `operator` | function | SparkEngine | [SceneManager.cpp:L229](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L229) | | +| `operator` | function | SparkEngine | [SceneManager.cpp:L247](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L247) | | | `operator` | function | SparkEngine | [StringPool.h:L159](../../SparkEngine/Source/Utils/StringPool.h#L159) | | | `operator` | function | SparkEngine | [UUID.h:L120](../../SparkEngine/Source/Utils/UUID.h#L120) | | | `operator` | function | Tests | [TestCrossSystemIntegration.cpp:L77](../../Tests/TestCrossSystemIntegration.cpp#L77) | | @@ -25799,8 +25849,9 @@ | `Order` | function | Tests | [TestLIFE200LifecycleLoopReal.cpp:L105](../../Tests/TestLIFE200LifecycleLoopReal.cpp#L105) | | | `Order` | function | Tests | [TestLifecycleCompositionRootFailure.cpp:L78](../../Tests/TestLifecycleCompositionRootFailure.cpp#L78) | | | `order` | function | Tests | [TestReliableOrderedSequenceReal.cpp:L172](../../Tests/TestReliableOrderedSequenceReal.cpp#L172) | | +| `ordered` | function | GameModules | [GameEngineSystems.cpp:L508](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L508) | | | `OrderedTags` | function | Tests | [TestReliableOrderedSequenceReal.cpp:L181](../../Tests/TestReliableOrderedSequenceReal.cpp#L181) | | -| `ordinary` | function | Tests | [TestSparkPak.cpp:L639](../../Tests/TestSparkPak.cpp#L639) | | +| `ordinary` | function | Tests | [TestSparkPak.cpp:L655](../../Tests/TestSparkPak.cpp#L655) | | | `original` | function | Tests | [TestCompressionUtils.cpp:L50](../../Tests/TestCompressionUtils.cpp#L50) | | | `original` | function | Tests | [TestRenderGraph.cpp:L31](../../Tests/TestRenderGraph.cpp#L31) | | | `original` | function | Tests | [TestReplicationFields.cpp:L239](../../Tests/TestReplicationFields.cpp#L239) | | @@ -25818,8 +25869,8 @@ | `otherClient` | function | Tests | [TestNET100TransportReal.cpp:L145](../../Tests/TestNET100TransportReal.cpp#L145) | | | `out` | function | SparkDaemon | [AssetService.cpp:L333](../../SparkDaemon/src/AssetService.cpp#L333) | | | `out` | function | SparkDaemon | [ShaderService.cpp:L341](../../SparkDaemon/src/ShaderService.cpp#L341) | | -| `out` | function | SparkEditor | [PlayControlLaunch.cpp:L365](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L365) | | -| `out` | function | SparkEditor | [PlayControlLaunch.cpp:L399](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L399) | | +| `out` | function | SparkEditor | [PlayControlLaunch.cpp:L367](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L367) | | +| `out` | function | SparkEditor | [PlayControlLaunch.cpp:L401](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L401) | | | `out` | function | SparkEditor | [VersionControlConflicts.cpp:L177](../../SparkEditor/Source/VersionControl/VersionControlConflicts.cpp#L177) | | | `out` | function | SparkEditor | [VersionControlConflicts.cpp:L222](../../SparkEditor/Source/VersionControl/VersionControlConflicts.cpp#L222) | | | `out` | function | SparkEngine | [SparkEngineCameraInternal.h:L33](../../SparkEngine/Source/Camera/SparkEngineCameraInternal.h#L33) | | @@ -25833,9 +25884,9 @@ | `out` | function | SparkInstaller | [InstallerTransactionTests.cpp:L56](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L56) | | | `out` | function | SparkInstaller | [PortableGitCacheTests.cpp:L52](../../SparkInstaller/tests/PortableGitCacheTests.cpp#L52) | | | `out` | function | Tests | [TestASSET220GamePackagerReal.cpp:L18](../../Tests/TestASSET220GamePackagerReal.cpp#L18) | | -| `out` | function | Tests | [TestAssetParserHardening.cpp:L50](../../Tests/TestAssetParserHardening.cpp#L50) | | -| `out` | function | Tests | [TestAssetParserHardening.cpp:L331](../../Tests/TestAssetParserHardening.cpp#L331) | | -| `out` | function | Tests | [TestAssetParserHardening.cpp:L383](../../Tests/TestAssetParserHardening.cpp#L383) | | +| `out` | function | Tests | [TestAssetParserHardening.cpp:L66](../../Tests/TestAssetParserHardening.cpp#L66) | | +| `out` | function | Tests | [TestAssetParserHardening.cpp:L347](../../Tests/TestAssetParserHardening.cpp#L347) | | +| `out` | function | Tests | [TestAssetParserHardening.cpp:L399](../../Tests/TestAssetParserHardening.cpp#L399) | | | `out` | function | Tests | [TestAudioECSBindingReal.cpp:L85](../../Tests/TestAudioECSBindingReal.cpp#L85) | | | `out` | function | Tests | [TestAudioEngineReal.cpp:L108](../../Tests/TestAudioEngineReal.cpp#L108) | | | `out` | function | Tests | [TestD3D11DeviceContractsReal.cpp:L137](../../Tests/TestD3D11DeviceContractsReal.cpp#L137) | | @@ -25851,8 +25902,8 @@ | `out` | function | Tests | [TestENG220ObjImportReal.cpp:L199](../../Tests/TestENG220ObjImportReal.cpp#L199) | | | `out` | function | Tests | [TestEditorPanelsRealBackends.cpp:L207](../../Tests/TestEditorPanelsRealBackends.cpp#L207) | | | `out` | function | Tests | [TestEditorPanelsRealBackends.cpp:L211](../../Tests/TestEditorPanelsRealBackends.cpp#L211) | | -| `out` | function | Tests | [TestEditorSubsystemsReal.cpp:L210](../../Tests/TestEditorSubsystemsReal.cpp#L210) | | -| `out` | function | Tests | [TestEditorSubsystemsReal.cpp:L230](../../Tests/TestEditorSubsystemsReal.cpp#L230) | | +| `out` | function | Tests | [TestEditorSubsystemsReal.cpp:L233](../../Tests/TestEditorSubsystemsReal.cpp#L233) | | +| `out` | function | Tests | [TestEditorSubsystemsReal.cpp:L253](../../Tests/TestEditorSubsystemsReal.cpp#L253) | | | `out` | function | Tests | [TestGamePackager.cpp:L16](../../Tests/TestGamePackager.cpp#L16) | | | `out` | function | Tests | [TestGoldenImageTest.cpp:L411](../../Tests/TestGoldenImageTest.cpp#L411) | | | `out` | function | Tests | [TestGoldenImageTest.cpp:L469](../../Tests/TestGoldenImageTest.cpp#L469) | | @@ -25879,15 +25930,15 @@ | `out` | function | Tests | [TestShaderServiceClient.cpp:L410](../../Tests/TestShaderServiceClient.cpp#L410) | | | `out` | function | Tests | [TestShaderServiceClient.cpp:L416](../../Tests/TestShaderServiceClient.cpp#L416) | | | `out` | function | Tests | [TestShaderServiceClient.cpp:L421](../../Tests/TestShaderServiceClient.cpp#L421) | | -| `out` | function | Tests | [TestSparkPak.cpp:L520](../../Tests/TestSparkPak.cpp#L520) | | -| `out` | function | Tests | [TestSparkPak.cpp:L565](../../Tests/TestSparkPak.cpp#L565) | | -| `out` | function | Tests | [TestSparkPak.cpp:L617](../../Tests/TestSparkPak.cpp#L617) | | -| `out` | function | Tests | [TestSparkPak.cpp:L782](../../Tests/TestSparkPak.cpp#L782) | | -| `out` | function | Tests | [TestSparkPak.cpp:L860](../../Tests/TestSparkPak.cpp#L860) | | +| `out` | function | Tests | [TestSparkPak.cpp:L536](../../Tests/TestSparkPak.cpp#L536) | | +| `out` | function | Tests | [TestSparkPak.cpp:L581](../../Tests/TestSparkPak.cpp#L581) | | +| `out` | function | Tests | [TestSparkPak.cpp:L633](../../Tests/TestSparkPak.cpp#L633) | | +| `out` | function | Tests | [TestSparkPak.cpp:L798](../../Tests/TestSparkPak.cpp#L798) | | +| `out` | function | Tests | [TestSparkPak.cpp:L876](../../Tests/TestSparkPak.cpp#L876) | | | `out` | function | Tests | [TestSparkTerrainFormatReal.cpp:L90](../../Tests/TestSparkTerrainFormatReal.cpp#L90) | | | `out` | function | Tests | [TestTF120Residency.cpp:L61](../../Tests/TestTF120Residency.cpp#L61) | | | `out` | function | Tests | [TestTF120SharedSaveRoot.cpp:L57](../../Tests/TestTF120SharedSaveRoot.cpp#L57) | | -| `out` | function | Tests | [TestTF120Travel.cpp:L600](../../Tests/TestTF120Travel.cpp#L600) | | +| `out` | function | Tests | [TestTF120Travel.cpp:L587](../../Tests/TestTF120Travel.cpp#L587) | | | `out` | function | Tests | [TestTFOnboarding.cpp:L554](../../Tests/TestTFOnboarding.cpp#L554) | | | `out` | function | Tests | [TestTFOnboarding.cpp:L655](../../Tests/TestTFOnboarding.cpp#L655) | | | `out` | function | Tests | [TestTFOnboarding.cpp:L698](../../Tests/TestTFOnboarding.cpp#L698) | | @@ -25903,7 +25954,7 @@ | `out` | function | Tests | [TestTFOutfitStore.cpp:L58](../../Tests/TestTFOutfitStore.cpp#L58) | | | `out` | function | Tests | [TestTFOutfitStore.cpp:L724](../../Tests/TestTFOutfitStore.cpp#L724) | | | `out` | function | Tests | [TestTextureStexBoundsReal.cpp:L72](../../Tests/TestTextureStexBoundsReal.cpp#L72) | | -| `out` | function | Tests | [TestThirdPartyIntegration.cpp:L83](../../Tests/TestThirdPartyIntegration.cpp#L83) | | +| `out` | function | Tests | [TestThirdPartyIntegration.cpp:L99](../../Tests/TestThirdPartyIntegration.cpp#L99) | | | `out` | function | Tests | [TestVersionControlSystemGitReal.cpp:L57](../../Tests/TestVersionControlSystemGitReal.cpp#L57) | | | `out` | function | Tests | [TestVersionControlSystemGitReal.cpp:L68](../../Tests/TestVersionControlSystemGitReal.cpp#L68) | Give the repo a local identity so commits do not depend on the machine's global git config. | | `out` | function | Tests | [Test_ai-anim_animation.cpp:L59](../../Tests/harden/Test_ai-anim_animation.cpp#L59) | | @@ -25938,7 +25989,7 @@ | `output` | function | SparkEditor | [EditorRecoveryFiles.h:L114](../../SparkEditor/Source/Core/EditorRecoveryFiles.h#L114) | | | `output` | function | SparkEditor | [RegionMapDataSource.cpp:L60](../../SparkEditor/Source/Panels/RegionMapDataSource.cpp#L60) | | | `output` | function | SparkEngine | [ReflectedScenePersistence.cpp:L181](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L181) | | -| `output` | function | SparkEngine | [SceneManager.cpp:L176](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L176) | | +| `output` | function | SparkEngine | [SceneManager.cpp:L186](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L186) | | | `output` | function | SparkEngine | [CompressionUtils.cpp:L33](../../SparkEngine/Source/Utils/CompressionUtils.cpp#L33) | | | `output` | function | SparkEngine | [CompressionUtils.cpp:L49](../../SparkEngine/Source/Utils/CompressionUtils.cpp#L49) | | | `output` | function | SparkEngine | [CompressionUtils.cpp:L79](../../SparkEngine/Source/Utils/CompressionUtils.cpp#L79) | | @@ -26143,11 +26194,13 @@ | `OWGatheringSystem::Shutdown` | method | GameModules | [OWGatheringSystem.cpp:L513](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.cpp#L513) | | | `OWGatheringSystem::Update` | method | GameModules | [OWGatheringSystem.cpp:L285](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.cpp#L285) | | | `OWGatheringSystem::UpdateNodeRespawns` | method | GameModules | [OWGatheringSystem.cpp:L293](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.cpp#L293) | | +| `owned` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L100](../../Tests/TestFPSGameCameraReloadReal.cpp#L100) | | | `OwnedEditorProcess` | function | SparkEditor | [EditorProcessLaunch.h:L120](../../SparkEditor/Source/Utils/EditorProcessLaunch.h#L120) | | | `OwnedEditorProcess::Adopt` | method | SparkEditor | [EditorProcessLaunch.cpp:L64](../../SparkEditor/Source/Utils/EditorProcessLaunch.cpp#L64) | | | `OwnedEditorProcess::Clear` | method | SparkEditor | [EditorProcessLaunch.cpp:L103](../../SparkEditor/Source/Utils/EditorProcessLaunch.cpp#L103) | | | `OwnedEditorProcess::Poll` | method | SparkEditor | [EditorProcessLaunch.cpp:L82](../../SparkEditor/Source/Utils/EditorProcessLaunch.cpp#L82) | | | `OwnedEditorProcess::Stop` | method | SparkEditor | [EditorProcessLaunch.cpp:L92](../../SparkEditor/Source/Utils/EditorProcessLaunch.cpp#L92) | | +| `OwnedSceneDirectory` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L56](../../Tests/TestFPSGameCameraReloadReal.cpp#L56) | | | `owner` | function | Tests | [TestEditorSubsystems.cpp:L2062](../../Tests/TestEditorSubsystems.cpp#L2062) | | | `owner` | function | Tests | [TestEditorSubsystems.cpp:L2117](../../Tests/TestEditorSubsystems.cpp#L2117) | | | `owner` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L361](../../Tests/TestLIFE200ModuleReloadReal.cpp#L361) | | @@ -26156,8 +26209,8 @@ | `owner` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L383](../../Tests/TestLIFE200ModuleReloadReal.cpp#L383) | | | `owner` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L424](../../Tests/TestLIFE200ModuleReloadReal.cpp#L424) | | | `owner` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L438](../../Tests/TestLIFE200ModuleReloadReal.cpp#L438) | | -| `owner` | function | Tests | [TestPrototypeModuleKitReal.cpp:L467](../../Tests/TestPrototypeModuleKitReal.cpp#L467) | | -| `owner` | function | Tests | [TestPrototypeModuleKitReal.cpp:L472](../../Tests/TestPrototypeModuleKitReal.cpp#L472) | | +| `owner` | function | Tests | [TestPrototypeModuleKitReal.cpp:L473](../../Tests/TestPrototypeModuleKitReal.cpp#L473) | | +| `owner` | function | Tests | [TestPrototypeModuleKitReal.cpp:L478](../../Tests/TestPrototypeModuleKitReal.cpp#L478) | | | `OwnerColor` | function | SparkEditor | [RegionMapEditorCanvas.cpp:L45](../../SparkEditor/Source/Panels/RegionMapEditorCanvas.cpp#L45) | | | `OwnerMatchesCurrentProcessUser` | function | SparkGateway | [GatewaySecurity.cpp:L112](../../SparkGateway/src/GatewaySecurity.cpp#L112) | | | `OwnerOf` | function | GameModules | [TFRegionSystem.h:L89](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.h#L89) | | @@ -26273,12 +26326,12 @@ | `P99Us` | function | Tests | [TestEngineMonitor.cpp:L142](../../Tests/TestEngineMonitor.cpp#L142) | | | `Package` | function | SparkEngine | [GamePackager.h:L72](../../SparkEngine/Source/Core/GamePackager.h#L72) | | | `Package` | function | SparkEngine | [GamePackager.h:L161](../../SparkEngine/Source/Engine/Build/GamePackager.h#L161) | Package a game build into a distributable directory | -| `Package` | function | Tests | [TestEditorCookPackageReal.cpp:L162](../../Tests/TestEditorCookPackageReal.cpp#L162) | | +| `Package` | function | Tests | [TestEditorCookPackageReal.cpp:L164](../../Tests/TestEditorCookPackageReal.cpp#L164) | | | `Package` | function | Tests | [TestSEC4NarrowPathsReal.cpp:L158](../../Tests/TestSEC4NarrowPathsReal.cpp#L158) | | | `PackageCompiledGraphs` | function | Tests | [TestENG200VisualScriptRuntimeReal.cpp:L128](../../Tests/TestENG200VisualScriptRuntimeReal.cpp#L128) | | | `packageContext` | function | SparkLauncher | [LauncherProcess.cpp:L343](../../SparkLauncher/src/LauncherProcess.cpp#L343) | | | `PackageLegacy` | function | SparkEngine | [GamePackager.h:L308](../../SparkEngine/Source/Engine/Build/GamePackager.h#L308) | Package the legacy build-tree layout through this canonical owner. | -| `PackageSettings` | function | Tests | [TestEditorCookPackageReal.cpp:L422](../../Tests/TestEditorCookPackageReal.cpp#L422) | | +| `PackageSettings` | function | Tests | [TestEditorCookPackageReal.cpp:L433](../../Tests/TestEditorCookPackageReal.cpp#L433) | | | `PackageSupportsConfiguration` | function | SparkEditor | [BuildPipeline.cpp:L137](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L137) | | | `PackageTestReadText` | function | Tests | [TestEditorSubsystems.cpp:L2397](../../Tests/TestEditorSubsystems.cpp#L2397) | | | `PackageTestUtf8` | function | Tests | [TestEditorSubsystems.cpp:L2391](../../Tests/TestEditorSubsystems.cpp#L2391) | | @@ -26333,7 +26386,7 @@ | `Palette` | function | Tests | [TestENG220GPUSkinningD3D11Real.cpp:L178](../../Tests/TestENG220GPUSkinningD3D11Real.cpp#L178) | | | `PanCamera` | function | Templates | [GameModule.h:L155](../../Templates/TopDownStarter/Source/GameModule.h#L155) | | | `panel` | function | Tests | [Test_ui-2d_ui.cpp:L73](../../Tests/harden/Test_ui-2d_ui.cpp#L73) | | -| `panelVector` | function | SparkEditor | [EditorUI.cpp:L830](../../SparkEditor/Source/Core/EditorUI.cpp#L830) | | +| `panelVector` | function | SparkEditor | [EditorUI.cpp:L850](../../SparkEditor/Source/Core/EditorUI.cpp#L850) | | | `ParallelBatchCull` | function | SparkEngine | [FrustumCulling.h:L360](../../SparkEngine/Source/Graphics/FrustumCulling.h#L360) | | | `ParallelBatchCull` | function | Tests | [TestParallelCulling.cpp:L101](../../Tests/TestParallelCulling.cpp#L101) | | | `ParallelFor` | function | SparkEngine | [JobSystem.h:L262](../../SparkEngine/Source/Utils/JobSystem.h#L262) | | @@ -26352,7 +26405,7 @@ | `ParameterList` | function | SparkEngine | [VisualScriptCompiler.cpp:L68](../../SparkEngine/Source/Engine/Scripting/VisualScriptCompiler.cpp#L68) | | | `ParametersText` | function | SparkEngine | [VisualScriptGraphWriter.cpp:L155](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphWriter.cpp#L155) | | | `parent` | function | GameModules | [RTSGridPathfinder.cpp:L254](../../GameModules/SparkGameRTS/Source/Navigation/RTSGridPathfinder.cpp#L254) | | -| `parent` | function | Tests | [TestEditorCookPackageReal.cpp:L141](../../Tests/TestEditorCookPackageReal.cpp#L141) | | +| `parent` | function | Tests | [TestEditorCookPackageReal.cpp:L143](../../Tests/TestEditorCookPackageReal.cpp#L143) | | | `parent` | function | Tests | [TestRuntimePrefab.cpp:L131](../../Tests/TestRuntimePrefab.cpp#L131) | | | `parent` | function | Tests | [TestSceneGraph2D.cpp:L56](../../Tests/TestSceneGraph2D.cpp#L56) | | | `parent` | function | Tests | [TestSceneGraph2D.cpp:L65](../../Tests/TestSceneGraph2D.cpp#L65) | | @@ -26505,6 +26558,8 @@ | `ParseManifestJsonPayload` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1096](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1096) | | | `ParseManifestJsonPayload` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1293](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1293) | | | `ParseManifestMember` | function | SparkCrashReporter | [CrashReporterApp.cpp:L560](../../SparkCrashReporter/src/CrashReporterApp.cpp#L560) | | +| `ParseMaterialText` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L334](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L334) | | +| `ParseMaterialText` | function | SparkEditor | [MaterialEditorMaterialParser.h:L15](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.h#L15) | Parse into a temporary definition; rejection preserves output, acceptance preserves filePath. | | `ParseMetadataBlock` | function | SparkEngine | [SaveFileCodec.cpp:L191](../../SparkEngine/Source/Engine/SaveSystem/SaveFileCodec.cpp#L191) | | | `ParseModJson` | function | SparkEngine | [ModSystem.h:L230](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L230) | | | `ParseNull` | function | SparkEngine | [JsonUtils.h:L592](../../SparkEngine/Source/Utils/JsonUtils.h#L592) | | @@ -26536,7 +26591,7 @@ | `ParseRconCommandLine` | function | Tests | [TestDedicatedServer.cpp:L107](../../Tests/TestDedicatedServer.cpp#L107) | | | `ParseRecoveryJson` | function | SparkEditor | [EditorRecoveryFiles.h:L139](../../SparkEditor/Source/Core/EditorRecoveryFiles.h#L139) | | | `ParseRecoveryJson` | function | SparkEditor | [EditorRecoveryJson.h:L36](../../SparkEditor/Source/Core/EditorRecoveryJson.h#L36) | | -| `ParseReference` | function | Tests | [TestTF120Travel.cpp:L317](../../Tests/TestTF120Travel.cpp#L317) | | +| `ParseReference` | function | Tests | [TestTF120Travel.cpp:L304](../../Tests/TestTF120Travel.cpp#L304) | | | `ParseRegions` | function | GameModules | [TFDataTablesInternal.h:L75](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTablesInternal.h#L75) | | | `ParseRegions` | function | GameModules | [TFDataTablesParseWorld.cpp:L26](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTablesParseWorld.cpp#L26) | | | `ParseResponse` | function | SparkEditor | [SparkEngineIntegration.h:L571](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L571) | Parse engine response | @@ -26719,12 +26774,12 @@ | `password` | function | GameModules | [TFLoginFlow.cpp:L289](../../GameModules/SparkGameMMOFPS/Source/UI/TFLoginFlow.cpp#L289) | | | `password` | function | GameModules | [TFLoginFlow.cpp:L302](../../GameModules/SparkGameMMOFPS/Source/UI/TFLoginFlow.cpp#L302) | | | `passwordBytes` | function | Tests | [TestTFOnboarding.cpp:L1426](../../Tests/TestTFOnboarding.cpp#L1426) | | -| `path` | function | GameModules | [Game.cpp:L363](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L363) | | -| `path` | function | GameModules | [GameConsoleOps.cpp:L696](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L696) | | +| `path` | function | GameModules | [Game.cpp:L379](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L379) | | +| `path` | function | GameModules | [GameConsoleOps.cpp:L704](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L704) | | | `path` | function | SparkBuild | [Config.cpp:L718](../../SparkBuild/src/Config.cpp#L718) | | | `path` | function | SparkBuild | [Downloader.cpp:L246](../../SparkBuild/src/Downloader.cpp#L246) | | -| `path` | function | SparkBuild | [ProcessRunnerTests.cpp:L670](../../SparkBuild/tests/ProcessRunnerTests.cpp#L670) | | -| `path` | function | SparkBuild | [ProcessRunnerTests.cpp:L711](../../SparkBuild/tests/ProcessRunnerTests.cpp#L711) | | +| `path` | function | SparkBuild | [ProcessRunnerTests.cpp:L663](../../SparkBuild/tests/ProcessRunnerTests.cpp#L663) | | +| `path` | function | SparkBuild | [ProcessRunnerTests.cpp:L702](../../SparkBuild/tests/ProcessRunnerTests.cpp#L702) | | | `path` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L324](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L324) | | | `path` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L377](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L377) | | | `path` | function | SparkCrashReporter | [CrashReporterManifestTests.cpp:L709](../../SparkCrashReporter/tests/CrashReporterManifestTests.cpp#L709) | | @@ -26735,12 +26790,13 @@ | `path` | function | SparkEditor | [EditorRecoveryJson.h:L48](../../SparkEditor/Source/Core/EditorRecoveryJson.h#L48) | | | `path` | function | SparkEngine | [AsyncDatabase.cpp:L769](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.cpp#L769) | | | `path` | function | SparkEngine | [AngelScriptEngine.cpp:L756](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.cpp#L756) | | -| `path` | function | SparkEngine | [SceneManagerReflected.cpp:L23](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L23) | | +| `path` | function | SparkEngine | [SceneManagerReflected.cpp:L35](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L35) | | | `Path` | function | Tests | [TestDocumentDurableWrite.cpp:L57](../../Tests/TestDocumentDurableWrite.cpp#L57) | | | `Path` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L61](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L61) | | | `Path` | function | Tests | [TestEditorPanelsRealBackends.cpp:L71](../../Tests/TestEditorPanelsRealBackends.cpp#L71) | | | `Path` | function | Tests | [TestEditorRecovery.cpp:L37](../../Tests/TestEditorRecovery.cpp#L37) | | -| `Path` | function | Tests | [TestEditorSubsystemsReal.cpp:L62](../../Tests/TestEditorSubsystemsReal.cpp#L62) | | +| `Path` | function | Tests | [TestEditorSubsystemsReal.cpp:L65](../../Tests/TestEditorSubsystemsReal.cpp#L65) | | +| `Path` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L69](../../Tests/TestFPSGameCameraReloadReal.cpp#L69) | | | `Path` | function | Tests | [TestMOD300ShowcaseLocalizationReal.cpp:L58](../../Tests/TestMOD300ShowcaseLocalizationReal.cpp#L58) | | | `Path` | function | Tests | [TestMOD330ARPGDungeonReal.cpp:L197](../../Tests/TestMOD330ARPGDungeonReal.cpp#L197) | | | `Path` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L160](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L160) | | @@ -26762,7 +26818,7 @@ | `PathFromUtf8` | function | SparkCrashReporter | [CrashReporterApp.cpp:L663](../../SparkCrashReporter/src/CrashReporterApp.cpp#L663) | | | `PathFromUtf8` | function | SparkEditor | [EditorUI.cpp:L85](../../SparkEditor/Source/Core/EditorUI.cpp#L85) | | | `PathFromUtf8` | function | SparkEditor | [ProjectManager.cpp:L174](../../SparkEditor/Source/Core/ProjectManager.cpp#L174) | | -| `PathFromUtf8` | function | SparkEditor | [AssetBrowserPanel.cpp:L44](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L44) | | +| `PathFromUtf8` | function | SparkEditor | [AssetBrowserPathUtils.h:L24](../../SparkEditor/Source/Panels/AssetBrowserPathUtils.h#L24) | | | `PathFromUtf8` | function | SparkEditor | [BasicMaterialEditorDrawing.cpp:L32](../../SparkEditor/Source/Panels/BasicMaterialEditorDrawing.cpp#L32) | | | `PathFromUtf8` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L45](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L45) | | | `PathFromUtf8` | function | SparkEditor | [PrefabAsset.cpp:L29](../../SparkEditor/Source/Prefabs/PrefabAsset.cpp#L29) | | @@ -26825,8 +26881,8 @@ | `PathToTestUtf8` | function | Tests | [TestFileUtils.cpp:L34](../../Tests/TestFileUtils.cpp#L34) | | | `PathToUtf8` | function | SparkCrashReporter | [CrashReporterApp.cpp:L672](../../SparkCrashReporter/src/CrashReporterApp.cpp#L672) | | | `PathToUtf8` | function | SparkEditor | [EditorUI.cpp:L107](../../SparkEditor/Source/Core/EditorUI.cpp#L107) | | -| `PathToUtf8` | function | SparkEditor | [EditorUI.cpp:L1536](../../SparkEditor/Source/Core/EditorUI.cpp#L1536) | | -| `PathToUtf8` | function | SparkEditor | [EditorUI.cpp:L1568](../../SparkEditor/Source/Core/EditorUI.cpp#L1568) | | +| `PathToUtf8` | function | SparkEditor | [EditorUI.cpp:L1556](../../SparkEditor/Source/Core/EditorUI.cpp#L1556) | | +| `PathToUtf8` | function | SparkEditor | [EditorUI.cpp:L1588](../../SparkEditor/Source/Core/EditorUI.cpp#L1588) | | | `PathToUtf8` | function | SparkEditor | [ProjectManager.cpp:L196](../../SparkEditor/Source/Core/ProjectManager.cpp#L196) | | | `PathToUtf8` | function | SparkEditor | [ProjectManager.cpp:L274](../../SparkEditor/Source/Core/ProjectManager.cpp#L274) | | | `PathToUtf8` | function | SparkEditor | [ProjectManager.cpp:L328](../../SparkEditor/Source/Core/ProjectManager.cpp#L328) | | @@ -26841,7 +26897,7 @@ | `PathToUtf8` | function | SparkEditor | [ProjectManager.cpp:L1647](../../SparkEditor/Source/Core/ProjectManager.cpp#L1647) | | | `PathToUtf8` | function | SparkEditor | [ProjectManager.cpp:L2226](../../SparkEditor/Source/Core/ProjectManager.cpp#L2226) | | | `PathToUtf8` | function | SparkEditor | [ProjectManager.cpp:L2241](../../SparkEditor/Source/Core/ProjectManager.cpp#L2241) | | -| `PathToUtf8` | function | SparkEditor | [AssetBrowserPanel.cpp:L31](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L31) | | +| `PathToUtf8` | function | SparkEditor | [AssetBrowserPathUtils.h:L11](../../SparkEditor/Source/Panels/AssetBrowserPathUtils.h#L11) | | | `PathToUtf8` | function | SparkEditor | [BasicMaterialEditorDrawing.cpp:L38](../../SparkEditor/Source/Panels/BasicMaterialEditorDrawing.cpp#L38) | | | `PathToUtf8` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L51](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L51) | | | `PathToUtf8` | function | SparkEditor | [PrefabManager.cpp:L32](../../SparkEditor/Source/Prefabs/PrefabManager.cpp#L32) | | @@ -26851,8 +26907,8 @@ | `PathToUtf8` | function | SparkEngine | [ModuleManager.cpp:L155](../../SparkEngine/Source/Core/ModuleManager.cpp#L155) | | | `PathToUtf8` | function | SparkEngine | [ModuleSidecar.cpp:L28](../../SparkEngine/Source/Core/ModuleSidecar.cpp#L28) | | | `PathToUtf8` | function | SparkEngine | [PluginMetadata.cpp:L29](../../SparkEngine/Source/Core/PluginMetadata.cpp#L29) | | -| `PathToUtf8` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L36](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L36) | | -| `PathToUtf8` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L230](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L230) | | +| `PathToUtf8` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L37](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L37) | | +| `PathToUtf8` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L231](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L231) | | | `PathToUtf8` | function | SparkEngine | [StartupSplash.cpp:L110](../../SparkEngine/Source/Core/StartupSplash.cpp#L110) | | | `PathToUtf8` | function | SparkEngine | [ModSystem.cpp:L262](../../SparkEngine/Source/Engine/Modding/ModSystem.cpp#L262) | | | `PathToUtf8` | function | SparkEngine | [ProjectAssetPath.cpp:L51](../../SparkEngine/Source/Graphics/ProjectAssetPath.cpp#L51) | | @@ -26907,7 +26963,7 @@ | `Pawn` | function | Tests | [TestTFObservation.cpp:L43](../../Tests/TestTFObservation.cpp#L43) | | | `payload` | function | GameModules | [MMOSessionGate.cpp:L109](../../GameModules/SparkGameMMO/Source/Session/MMOSessionGate.cpp#L109) | | | `payload` | function | GameModules | [TFVehicleNet.cpp:L249](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleNet.cpp#L249) | | -| `payload` | function | GameModules | [TFReplication.cpp:L298](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L298) | | +| `payload` | function | GameModules | [TFReplication.cpp:L310](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L310) | | | `payload` | function | GameModules | [OWPersistence.inl:L159](../../GameModules/SparkGameOpenWorld/Source/Persistence/OWPersistence.inl#L159) | | | `payload` | function | SparkDaemon | [OrchestrationJournal.cpp:L386](../../SparkDaemon/src/OrchestrationJournal.cpp#L386) | | | `payload` | function | SparkEditor | [CollaborativeEditSessionBroker.cpp:L298](../../SparkEditor/Source/Communication/CollaborativeEditSessionBroker.cpp#L298) | | @@ -26922,8 +26978,8 @@ | `payload` | function | Tests | [TestSEC2ConsoleIpcReal.cpp:L171](../../Tests/TestSEC2ConsoleIpcReal.cpp#L171) | | | `payload` | function | Tests | [TestShaderCompilerReal.cpp:L249](../../Tests/TestShaderCompilerReal.cpp#L249) | | | `payload` | function | Tests | [TestShaderCompilerReal.cpp:L299](../../Tests/TestShaderCompilerReal.cpp#L299) | | -| `payload` | function | Tests | [TestSparkPak.cpp:L619](../../Tests/TestSparkPak.cpp#L619) | | -| `payload` | function | Tests | [TestSparkPak.cpp:L660](../../Tests/TestSparkPak.cpp#L660) | | +| `payload` | function | Tests | [TestSparkPak.cpp:L635](../../Tests/TestSparkPak.cpp#L635) | | +| `payload` | function | Tests | [TestSparkPak.cpp:L676](../../Tests/TestSparkPak.cpp#L676) | | | `payloadWriter` | function | SparkEditor | [JSONSceneSerializer.cpp:L566](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L566) | | | `Pbkdf2HmacSha256` | function | GameModules | [TFCrypto.cpp:L144](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.cpp#L144) | | | `Pbkdf2HmacSha256` | function | GameModules | [TFCrypto.h:L32](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.h#L32) | | @@ -27365,10 +27421,10 @@ | `pilot` | function | GameModules | [VehicleSystem.cpp:L959](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.cpp#L959) | | | `pilot` | function | GameModules | [VehicleSystem.cpp:L1005](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.cpp#L1005) | | | `Pin` | function | Tests | [TestCoverageScripting.cpp:L58](../../Tests/TestCoverageScripting.cpp#L58) | | -| `Pin` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L87](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L87) | | +| `Pin` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L88](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L88) | | | `Pin` | function | Tests | [TestSEC3ScriptingHardening.cpp:L43](../../Tests/TestSEC3ScriptingHardening.cpp#L43) | | | `PinArtifactPath` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1021](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1021) | | -| `PinArtifactRoot` | function | SparkEngine | [CrashHandler.cpp:L159](../../SparkEngine/Source/Utils/CrashHandler.cpp#L159) | | +| `PinArtifactRoot` | function | SparkEngine | [CrashHandler.cpp:L160](../../SparkEngine/Source/Utils/CrashHandler.cpp#L160) | | | `Ping` | function | SparkEngine | [DaemonClient.h:L102](../../SparkEngine/Source/Utils/DaemonClient.h#L102) | | | `PingCol32` | function | GameModules | [TFPingUIDraw.cpp:L61](../../GameModules/SparkGameMMOFPS/Source/UI/TFPingUIDraw.cpp#L61) | | | `PingColor` | function | GameModules | [TFPingSystem.h:L101](../../GameModules/SparkGameMMOFPS/Source/Game/TFPingSystem.h#L101) | | @@ -27389,7 +27445,7 @@ | `PinTypeString` | function | SparkEngine | [VisualScriptCompiler.cpp:L143](../../SparkEngine/Source/Engine/Scripting/VisualScriptCompiler.cpp#L143) | | | `PinTypeString` | function | SparkEngine | [VisualScriptEmitter.h:L65](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L65) | | | `PinVertex` | function | SparkEngine | [SoftBodyPhysics.h:L154](../../SparkEngine/Source/Physics/SoftBodyPhysics.h#L154) | Pin a vertex to a fixed world position (make it kinematic). | -| `PipeKeyboardThreadFunc` | function | SparkConsole | [ConsoleApp.h:L78](../../SparkConsole/src/ConsoleApp.h#L78) | | +| `PipeKeyboardThreadFunc` | function | SparkConsole | [ConsoleApp.h:L79](../../SparkConsole/src/ConsoleApp.h#L79) | | | `Pipeline` | function | Tests | [TestRHI240OpenGLGoldenReal.cpp:L441](../../Tests/TestRHI240OpenGLGoldenReal.cpp#L441) | | | `PipelineStateCache::Clear` | method | SparkEngine | [PipelineStateCache.cpp:L65](../../SparkEngine/Source/Graphics/RHI/PipelineStateCache.cpp#L65) | | | `PipelineStateCache::Console_GetStatus` | method | SparkEngine | [PipelineStateCache.cpp:L71](../../SparkEngine/Source/Graphics/RHI/PipelineStateCache.cpp#L71) | | @@ -27455,8 +27511,8 @@ | `PlaceHud` | function | Templates | [GameModule.h:L737](../../Templates/FPSStarter/Source/GameModule.h#L737) | | | `PlaceKitProps` | function | GameModules | [VisualScriptDemoWorld.h:L111](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.h#L111) | | | `PlaceLevelKit` | function | GameModules | [PlatformerLevelFlow.h:L78](../../GameModules/SparkGamePlatformer/Source/Core/PlatformerLevelFlow.h#L78) | Advance one fixed physics step: platforms first so the player rides and collides with this | -| `PlaceModel` | function | GameModules | [GameConsoleOps.cpp:L718](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L718) | | -| `PlaceModelsAt` | function | GameModules | [GameConsoleOps.cpp:L738](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L738) | | +| `PlaceModel` | function | GameModules | [GameConsoleOps.cpp:L726](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L726) | | +| `PlaceModelsAt` | function | GameModules | [GameConsoleOps.cpp:L746](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L746) | | | `PlacePreviewHud` | function | Templates | [GameModule.h:L120](../../Templates/EmptyProject/Source/GameModule.h#L120) | | | `PlaceSpikeTiles` | function | GameModules | [PlatformerHazardSystem.h:L129](../../GameModules/SparkGamePlatformer/Source/Hazard/PlatformerHazardSystem.h#L129) | | | `PlaceTemplate` | function | SparkEditor | [ObjectPlacementPanel.h:L91](../../SparkEditor/Source/Panels/ObjectPlacementPanel.h#L91) | Create one entity from an entity template; false when unconnected or unsupported. | @@ -27643,18 +27699,18 @@ | `PlayControlPanel::LaunchDedicatedWithBots` | method | SparkEditor | [PlayControlLaunch.cpp:L99](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L99) | | | `PlayControlPanel::LaunchGame` | method | SparkEditor | [PlayControlLaunch.cpp:L34](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L34) | | | `PlayControlPanel::PollInstances` | method | SparkEditor | [PlayControlLaunch.cpp:L272](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L272) | | -| `PlayControlPanel::RefreshLogTail` | method | SparkEditor | [PlayControlLaunch.cpp:L306](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L306) | | +| `PlayControlPanel::RefreshLogTail` | method | SparkEditor | [PlayControlLaunch.cpp:L308](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L308) | | | `PlayControlPanel::Render` | method | SparkEditor | [PlayControlPanel.cpp:L74](../../SparkEditor/Source/Panels/PlayControlPanel.cpp#L74) | | | `PlayControlPanel::RenderPlayBar` | method | SparkEditor | [PlayControlPanel.cpp:L127](../../SparkEditor/Source/Panels/PlayControlPanel.cpp#L127) | | | `PlayControlPanel::RenderQuickConnect` | method | SparkEditor | [PlayControlPanel.cpp:L172](../../SparkEditor/Source/Panels/PlayControlPanel.cpp#L172) | | | `PlayControlPanel::RenderStatus` | method | SparkEditor | [PlayControlPanel.cpp:L189](../../SparkEditor/Source/Panels/PlayControlPanel.cpp#L189) | | | `PlayControlPanel::RoleLabel` | method | SparkEditor | [PlayControlPanel.cpp:L108](../../SparkEditor/Source/Panels/PlayControlPanel.cpp#L108) | | -| `PlayControlPanel::SetLaunchContextDirectory` | method | SparkEditor | [PlayControlLaunch.cpp:L295](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L295) | | +| `PlayControlPanel::SetLaunchContextDirectory` | method | SparkEditor | [PlayControlLaunch.cpp:L297](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L297) | | | `PlayControlPanel::Shutdown` | method | SparkEditor | [PlayControlPanel.cpp:L95](../../SparkEditor/Source/Panels/PlayControlPanel.cpp#L95) | | | `PlayControlPanel::StopAll` | method | SparkEditor | [PlayControlLaunch.cpp:L252](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L252) | | | `PlayControlPanel::Update` | method | SparkEditor | [PlayControlPanel.cpp:L40](../../SparkEditor/Source/Panels/PlayControlPanel.cpp#L40) | | -| `PlayControlPanel::WriteConnectCfg` | method | SparkEditor | [PlayControlLaunch.cpp:L376](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L376) | | -| `PlayControlPanel::WriteDedicatedBotsCfg` | method | SparkEditor | [PlayControlLaunch.cpp:L341](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L341) | | +| `PlayControlPanel::WriteConnectCfg` | method | SparkEditor | [PlayControlLaunch.cpp:L378](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L378) | | +| `PlayControlPanel::WriteDedicatedBotsCfg` | method | SparkEditor | [PlayControlLaunch.cpp:L343](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L343) | | | `PlayEngineCue` | function | GameModules | [TFVehicleFx.h:L125](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleFx.h#L125) | | | `player` | function | SparkEditor | [PrefabManager.cpp:L428](../../SparkEditor/Source/Prefabs/PrefabManager.cpp#L428) | | | `Player` | function | SparkEngine | [EngineSettings.h:L961](../../SparkEngine/Source/Core/EngineSettings.h#L961) | | @@ -27814,7 +27870,7 @@ | `PollJoinsLeaves` | function | GameModules | [TFMedalSystem.h:L268](../../GameModules/SparkGameMMOFPS/Source/Game/TFMedalSystem.h#L268) | | | `PollLaunchedProcess` | function | SparkEditor | [GameModuleSelectorPanel.h:L60](../../SparkEditor/Source/Panels/GameModuleSelectorPanel.h#L60) | | | `PollPingKey` | function | GameModules | [TFPingUI.h:L80](../../GameModules/SparkGameMMOFPS/Source/UI/TFPingUI.h#L80) | | -| `PollPipeModeInput` | function | SparkConsole | [ConsoleApp.h:L80](../../SparkConsole/src/ConsoleApp.h#L80) | | +| `PollPipeModeInput` | function | SparkConsole | [ConsoleApp.h:L81](../../SparkConsole/src/ConsoleApp.h#L81) | | | `PollPosixProcess` | function | SparkEditor | [EditorProcessLaunchPosix.cpp:L174](../../SparkEditor/Source/Utils/EditorProcessLaunchPosix.cpp#L174) | | | `PollPosixProcess` | function | SparkEditor | [EditorProcessLaunchPosixInternal.h:L148](../../SparkEditor/Source/Utils/EditorProcessLaunchPosixInternal.h#L148) | | | `PollProcessExited` | function | SparkEditor | [EditorProcessLaunch.h:L75](../../SparkEditor/Source/Utils/EditorProcessLaunch.h#L75) | Non-blocking poll of a handle from LaunchEditorProcess. Returns true | @@ -27823,9 +27879,9 @@ | `PollRaceControlEdges` | function | GameModules | [RacingRaceFlow.cpp:L249](../../GameModules/SparkGameRacing/Source/Core/RacingRaceFlow.cpp#L249) | | | `PollRaceControlEdges` | function | GameModules | [RacingRaceFlow.h:L50](../../GameModules/SparkGameRacing/Source/Core/RacingRaceFlow.h#L50) | | | `PollResponses` | function | SparkEngine | [RemoteDebugSystem.h:L598](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugSystem.h#L598) | Drain all received responses since the last poll | -| `PollStandaloneInput` | function | SparkConsole | [ConsoleApp.h:L82](../../SparkConsole/src/ConsoleApp.h#L82) | | +| `PollStandaloneInput` | function | SparkConsole | [ConsoleApp.h:L83](../../SparkConsole/src/ConsoleApp.h#L83) | | | `PollWheelSelection` | function | GameModules | [TFPingUI.h:L81](../../GameModules/SparkGameMMOFPS/Source/UI/TFPingUI.h#L81) | | -| `PollWindowsPipeData` | function | SparkConsole | [ConsoleApp.h:L87](../../SparkConsole/src/ConsoleApp.h#L87) | | +| `PollWindowsPipeData` | function | SparkConsole | [ConsoleApp.h:L88](../../SparkConsole/src/ConsoleApp.h#L88) | | | `pool` | function | Tests | [TestAdversarialEngine.cpp:L1186](../../Tests/TestAdversarialEngine.cpp#L1186) | | | `pool` | function | Tests | [TestGPUParticleSystem.cpp:L97](../../Tests/TestGPUParticleSystem.cpp#L97) | | | `pool` | function | Tests | [TestGPUParticleSystem.cpp:L183](../../Tests/TestGPUParticleSystem.cpp#L183) | | @@ -28035,7 +28091,7 @@ | `PrepareNetworkStop` | function | GameModules | [TFServerSim.h:L127](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L127) | | | `PrepareNextClientID` | function | SparkEngine | [NetworkManager.h:L925](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L925) | | | `PrepareReloadPlugin` | function | Tests | [TestPluginABI.cpp:L284](../../Tests/TestPluginABI.cpp#L284) | | -| `PrepareSignalReport` | function | SparkEngine | [CrashHandler.cpp:L2502](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2502) | | +| `PrepareSignalReport` | function | SparkEngine | [CrashHandler.cpp:L2540](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2540) | | | `PrepareStatement` | function | SparkEngine | [AsyncDatabase.h:L125](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L125) | | | `PrepareStatement` | function | SparkEngine | [AsyncDatabase.h:L187](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L187) | | | `PrepareStatement` | function | SparkEngine | [AsyncDatabase.h:L256](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L256) | Register a prepared statement SQL string by ID. | @@ -28061,8 +28117,8 @@ | `PreserveIgnoredFiles` | function | SparkInstaller | [Installer.cpp:L246](../../SparkInstaller/src/Installer.cpp#L246) | | | `PrettyImpl` | function | SparkEngine | [JsonUtils.h:L1260](../../SparkEngine/Source/Utils/JsonUtils.h#L1260) | | | `prev` | function | SparkEngine | [SparkConsole.cpp:L100](../../SparkEngine/Source/Utils/SparkConsole.cpp#L100) | | -| `previewRegion` | function | SparkEditor | [MaterialEditorPreview.cpp:L161](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L161) | | -| `Previous` | function | SparkBuild | [ProcessRunnerTests.cpp:L592](../../SparkBuild/tests/ProcessRunnerTests.cpp#L592) | | +| `previewRegion` | function | SparkEditor | [MaterialEditorPreview.cpp:L162](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L162) | | +| `Previous` | function | SparkBuild | [ProcessRunnerTests.cpp:L585](../../SparkBuild/tests/ProcessRunnerTests.cpp#L585) | | | `Previous` | function | SparkEngine | [RTHandleSystem.h:L257](../../SparkEngine/Source/Graphics/RTHandleSystem.h#L257) | | | `previousDevice` | function | Tests | [TestRHI210D3D11DeviceLossReal.cpp:L119](../../Tests/TestRHI210D3D11DeviceLossReal.cpp#L119) | | | `previousDevice` | function | Tests | [TestRHI210D3D11DeviceLossReal.cpp:L143](../../Tests/TestRHI210D3D11DeviceLossReal.cpp#L143) | | @@ -28084,8 +28140,8 @@ | `PrintContentionReport` | function | SparkEngine | [ThreadDebugger.h:L366](../../SparkEngine/Source/Utils/ThreadDebugger.h#L366) | | | `PrintDivider` | function | SparkBuild | [Terminal.cpp:L100](../../SparkBuild/src/Terminal.cpp#L100) | | | `PrintDivider` | function | SparkBuild | [Terminal.h:L29](../../SparkBuild/src/Terminal.h#L29) | | -| `PrintDuplicateSkipNotice` | function | SparkConsole | [ConsoleApp.h:L101](../../SparkConsole/src/ConsoleApp.h#L101) | | -| `PrintEngineLog` | function | SparkConsole | [ConsoleApp.h:L100](../../SparkConsole/src/ConsoleApp.h#L100) | | +| `PrintDuplicateSkipNotice` | function | SparkConsole | [ConsoleApp.h:L102](../../SparkConsole/src/ConsoleApp.h#L102) | | +| `PrintEngineLog` | function | SparkConsole | [ConsoleApp.h:L101](../../SparkConsole/src/ConsoleApp.h#L101) | | | `PrintError` | function | SparkEngine | [InGameConsole.h:L186](../../SparkEngine/Source/Utils/InGameConsole.h#L186) | Print an error message | | `PrintHeader` | function | SparkBuild | [Terminal.cpp:L109](../../SparkBuild/src/Terminal.cpp#L109) | | | `PrintHeader` | function | SparkBuild | [Terminal.h:L32](../../SparkBuild/src/Terminal.h#L32) | | @@ -28095,12 +28151,13 @@ | `PrintHotSpotReport` | function | SparkEngine | [CpuDebugger.h:L255](../../SparkEngine/Source/Utils/CpuDebugger.h#L255) | Print top N hotspots to stderr | | `PrintIOReport` | function | SparkEngine | [IODebugger.h:L264](../../SparkEngine/Source/Utils/IODebugger.h#L264) | | | `PrintLeakReport` | function | SparkEngine | [MemoryDebugger.h:L260](../../SparkEngine/Source/Utils/MemoryDebugger.h#L260) | Print a formatted leak report to stderr | -| `PrintLog` | function | SparkConsole | [ConsoleApp.h:L99](../../SparkConsole/src/ConsoleApp.h#L99) | | +| `PrintLog` | function | SparkConsole | [ConsoleApp.h:L100](../../SparkConsole/src/ConsoleApp.h#L100) | | +| `PrintPipePrompt` | function | SparkConsole | [ConsoleApp.h:L78](../../SparkConsole/src/ConsoleApp.h#L78) | | | `PrintProgress` | function | SparkBuild | [Terminal.cpp:L172](../../SparkBuild/src/Terminal.cpp#L172) | | | `PrintProgress` | function | SparkBuild | [Terminal.h:L50](../../SparkBuild/src/Terminal.h#L50) | | | `PrintProgress` | function | Tests | [TestMain.cpp:L400](../../Tests/TestMain.cpp#L400) | | | `PrintReport` | function | Tests | [FPSLANLoopbackPeer.cpp:L300](../../Tests/Fixtures/FPSLANLoopbackPeer.cpp#L300) | | -| `PrintResult` | function | SparkConsole | [ConsoleApp.h:L102](../../SparkConsole/src/ConsoleApp.h#L102) | | +| `PrintResult` | function | SparkConsole | [ConsoleApp.h:L103](../../SparkConsole/src/ConsoleApp.h#L103) | | | `PrintSectionHeader` | function | SparkBuild | [Terminal.cpp:L129](../../SparkBuild/src/Terminal.cpp#L129) | | | `PrintSectionHeader` | function | SparkBuild | [Terminal.h:L35](../../SparkBuild/src/Terminal.h#L35) | | | `PrintSectionReport` | function | SparkEngine | [CpuDebugger.h:L233](../../SparkEngine/Source/Utils/CpuDebugger.h#L233) | Print a formatted report of all section timings to stderr | @@ -28142,7 +28199,7 @@ | `ProbeTag` | function | Tests | [TestDocumentInterruptionReal.cpp:L525](../../Tests/TestDocumentInterruptionReal.cpp#L525) | | | `ProbeWritable` | function | SparkInstaller | [InstallerPreflight.cpp:L130](../../SparkInstaller/src/InstallerPreflight.cpp#L130) | | | `ProceduralCube` | function | Tests | [RHI210D3D11GoldenSupport.h:L444](../../Tests/RHI210D3D11GoldenSupport.h#L444) | | -| `ProceduralMaterialFor` | function | GameModules | [GameConsoleOps.cpp:L691](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L691) | | +| `ProceduralMaterialFor` | function | GameModules | [GameConsoleOps.cpp:L699](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L699) | | | `ProceduralPlane` | function | Tests | [RHI210D3D11GoldenSupport.h:L480](../../Tests/RHI210D3D11GoldenSupport.h#L480) | | | `ProceduralSphere` | function | Tests | [RHI210D3D11GoldenSupport.h:L500](../../Tests/RHI210D3D11GoldenSupport.h#L500) | | | `Process` | function | SparkEditor | [AdvancedAssetPipeline.h:L75](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L75) | Process asset file | @@ -28237,7 +28294,7 @@ | `ProcessEffects` | function | SparkEngine | [AbilitySystem.h:L325](../../SparkEngine/Source/Engine/Gameplay/AbilitySystem.h#L325) | | | `ProcessEntityMigrations` | function | SparkEngine | [WorldServer.h:L329](../../SparkEngine/Source/Engine/Networking/WorldServer.h#L329) | | | `ProcessFeedback` | function | SparkEngine | [VirtualTexture.h:L100](../../SparkEngine/Source/Graphics/VirtualTexture.h#L100) | Analyze feedback buffer and schedule page loads/evictions. | -| `ProcessGlobalHotkeys` | function | SparkEditor | [EditorUI.h:L530](../../SparkEditor/Source/Core/EditorUI.h#L530) | | +| `ProcessGlobalHotkeys` | function | SparkEditor | [EditorUI.h:L528](../../SparkEditor/Source/Core/EditorUI.h#L528) | | | `ProcessGPUQueries` | function | SparkEditor | [PerformanceProfiler.h:L355](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L355) | Process GPU timing queries | | `ProcessGroupExists` | function | SparkBuild | [ProcessRunner.cpp:L150](../../SparkBuild/src/ProcessRunner.cpp#L150) | | | `ProcessId` | function | Tests | [TestGatewayAreaControl.cpp:L49](../../Tests/TestGatewayAreaControl.cpp#L49) | | @@ -28258,7 +28315,7 @@ | `processLock` | function | SparkEditor | [BuildPipeline.cpp:L916](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L916) | | | `ProcessMayBeRunning` | function | SparkEngine | [CrashArtifactRetention.h:L110](../../SparkEngine/Source/Utils/CrashArtifactRetention.h#L110) | | | `ProcessMessages` | function | SparkEditor | [EditorApplication.h:L126](../../SparkEditor/Source/Core/EditorApplication.h#L126) | | -| `ProcessMouseDelta` | function | SparkEngine | [InputManager.h:L479](../../SparkEngine/Source/Input/InputManager.h#L479) | Apply mouse processing settings | +| `ProcessMouseDelta` | function | SparkEngine | [InputManager.h:L486](../../SparkEngine/Source/Input/InputManager.h#L486) | Apply mouse processing settings | | `ProcessNextJob` | function | SparkEditor | [AdvancedAssetPipeline.h:L464](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L464) | Process next job in queue | | `ProcessNode` | function | GameModules | [RPGDialogueSystem.h:L123](../../GameModules/SparkGameRPG/Source/Dialogue/RPGDialogueSystem.h#L123) | | | `ProcessNode` | function | SparkEngine | [DialogueSystem.h:L317](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L317) | List loaded dialogue trees (console integration). | @@ -28268,7 +28325,7 @@ | `ProcessOutgoing` | function | SparkEngine | [NetworkManager.h:L914](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L914) | | | `ProcessPass` | function | SparkEngine | [PostProcessingPipeline.h:L350](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L350) | | | `ProcessPendingLogEntries` | function | SparkEditor | [ConsolePanel.h:L267](../../SparkEditor/Source/Panels/ConsolePanel.h#L267) | Process pending log entries from logger | -| `ProcessPipeMessages` | function | SparkConsole | [ConsoleApp.h:L85](../../SparkConsole/src/ConsoleApp.h#L85) | | +| `ProcessPipeMessages` | function | SparkConsole | [ConsoleApp.h:L86](../../SparkConsole/src/ConsoleApp.h#L86) | | | `ProcessProcs` | function | SparkEngine | [AbilitySystem.h:L326](../../SparkEngine/Source/Engine/Gameplay/AbilitySystem.h#L326) | | | `ProcessQueue` | function | SparkEngine | [DeferredDeletionQueue.h:L62](../../SparkEngine/Source/Graphics/RHI/DeferredDeletionQueue.h#L62) | Process the queue, deleting resources whose defer period has elapsed. | | `ProcessQueuedMessages` | function | SparkEngine | [ConsoleProcessManager.h:L140](../../SparkEngine/Source/Utils/ConsoleProcessManager.h#L140) | | @@ -28282,7 +28339,7 @@ | `ProcessRunner::RunSync` | method | SparkBuild | [ProcessRunner.cpp:L319](../../SparkBuild/src/ProcessRunner.cpp#L319) | | | `ProcessRunner::RunSync` | method | SparkBuild | [ProcessRunner.cpp:L551](../../SparkBuild/src/ProcessRunner.cpp#L551) | | | `ProcessRunsAsCurrentUser` | function | SparkEngine | [DaemonFraming.h:L85](../../SparkEngine/Source/Utils/DaemonFraming.h#L85) | True only when process @p processId runs as the same user SID as this process. | -| `ProcessSceneShortcuts` | function | SparkEditor | [EditorUI.h:L529](../../SparkEditor/Source/Core/EditorUI.h#L529) | | +| `ProcessSceneShortcuts` | function | SparkEditor | [EditorUI.h:L527](../../SparkEditor/Source/Core/EditorUI.h#L527) | | | `ProcessScratchRoot` | function | Tests | [TestModuleABI.cpp:L142](../../Tests/TestModuleABI.cpp#L142) | This process's scratch root under the system temp directory. | | `ProcessServerMessages` | function | SparkEngine | [DedicatedServer.h:L345](../../SparkEngine/Source/Engine/Networking/DedicatedServer.h#L345) | Process server-specific incoming messages. | | `ProcessStick` | function | Tests | [TestGamepadInputProcessing.cpp:L282](../../Tests/TestGamepadInputProcessing.cpp#L282) | | @@ -28462,7 +28519,7 @@ | `ProjectPortalToScreen` | function | SparkEngine | [PortalCulling.h:L255](../../SparkEngine/Source/Graphics/PortalCulling.h#L255) | Project a portal polygon to screen space and compute its bounding rect. | | `ProjectProfile` | function | Tests | [TestDocumentInterruptionReal.cpp:L358](../../Tests/TestDocumentInterruptionReal.cpp#L358) | | | `ProjectRoot` | function | SparkEditor | [EditorPluginDiscovery.h:L30](../../SparkEditor/Source/Core/EditorPluginDiscovery.h#L30) | | -| `projectRoot` | function | SparkEngine | [SceneManagerReflected.cpp:L57](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L57) | | +| `projectRoot` | function | SparkEngine | [SceneManagerReflected.cpp:L81](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L81) | | | `projectRoot` | function | Tests | [TestTemplatesCompile.cpp:L165](../../Tests/TestTemplatesCompile.cpp#L165) | | | `projectRoot` | function | Tests | [TestTemplatesCompile.cpp:L218](../../Tests/TestTemplatesCompile.cpp#L218) | | | `projectRoot` | function | Tests | [TestTemplatesCompile.cpp:L254](../../Tests/TestTemplatesCompile.cpp#L254) | | @@ -28481,8 +28538,8 @@ | `projectRoot` | function | Tests | [TestTemplatesCompile.cpp:L931](../../Tests/TestTemplatesCompile.cpp#L931) | | | `projectRoot` | function | Tests | [TestTemplatesCompile.cpp:L976](../../Tests/TestTemplatesCompile.cpp#L976) | | | `projectRoot` | function | Tests | [TestTemplatesCompile.cpp:L1016](../../Tests/TestTemplatesCompile.cpp#L1016) | | -| `projectRootUtf8` | function | GameModules | [Game.cpp:L388](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L388) | | -| `projectRootUtf8` | function | GameModules | [Game.cpp:L415](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L415) | | +| `projectRootUtf8` | function | GameModules | [Game.cpp:L406](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L406) | | +| `projectRootUtf8` | function | GameModules | [Game.cpp:L439](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L439) | | | `ProjectScene` | function | Tests | [TestDocumentInterruptionReal.cpp:L352](../../Tests/TestDocumentInterruptionReal.cpp#L352) | | | `ProjectScene` | function | Tests | [TestDocumentInterruptionReal.cpp:L388](../../Tests/TestDocumentInterruptionReal.cpp#L388) | | | `ProjectScratch` | function | Tests | [TestEditorStateCompatibility.cpp:L101](../../Tests/TestEditorStateCompatibility.cpp#L101) | | @@ -28614,8 +28671,8 @@ | `Publish` | function | SparkEngine | [SaveFileDurability.cpp:L488](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L488) | | | `Publish` | function | Tests | [TestCrossSystemIntegration.cpp:L140](../../Tests/TestCrossSystemIntegration.cpp#L140) | | | `Publish` | function | Tests | [TestEventSystem.cpp:L45](../../Tests/TestEventSystem.cpp#L45) | | -| `PublishCrashManifest` | function | SparkEngine | [CrashHandler.cpp:L612](../../SparkEngine/Source/Utils/CrashHandler.cpp#L612) | | -| `PublishCrashManifest` | function | SparkEngine | [CrashHandler.cpp:L758](../../SparkEngine/Source/Utils/CrashHandler.cpp#L758) | | +| `PublishCrashManifest` | function | SparkEngine | [CrashHandler.cpp:L613](../../SparkEngine/Source/Utils/CrashHandler.cpp#L613) | | +| `PublishCrashManifest` | function | SparkEngine | [CrashHandler.cpp:L759](../../SparkEngine/Source/Utils/CrashHandler.cpp#L759) | | | `PublishFileAtomically` | function | SparkEngine | [SaveFileDurability.cpp:L510](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L510) | | | `PublishGeneration` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L979](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L979) | | | `PublishHealth` | function | SparkGateway | [GatewayApplication.h:L97](../../SparkGateway/src/GatewayApplication.h#L97) | | @@ -28693,7 +28750,7 @@ | `PutBytes` | function | Tests | [Test_ai-anim_navmesh.cpp:L27](../../Tests/harden/Test_ai-anim_navmesh.cpp#L27) | | | `PutCacheEntry` | function | SparkEngine | [ShaderServiceClient.h:L58](../../SparkEngine/Source/Utils/ShaderServiceClient.h#L58) | Store a compiled shader blob under the given key. | | `PutFloat` | function | GameModules | [MMOSessionGateProtocol.cpp:L87](../../GameModules/SparkGameMMO/Source/Session/MMOSessionGateProtocol.cpp#L87) | | -| `PutLE32` | function | Tests | [TestThirdPartyIntegration.cpp:L57](../../Tests/TestThirdPartyIntegration.cpp#L57) | | +| `PutLE32` | function | Tests | [TestThirdPartyIntegration.cpp:L73](../../Tests/TestThirdPartyIntegration.cpp#L73) | | | `PutSnapshot` | function | GameModules | [MMOSessionGateProtocol.cpp:L137](../../GameModules/SparkGameMMO/Source/Session/MMOSessionGateProtocol.cpp#L137) | | | `PutString` | function | GameModules | [MMOSessionGateProtocol.cpp:L131](../../GameModules/SparkGameMMO/Source/Session/MMOSessionGateProtocol.cpp#L131) | | | `PutString` | function | Tests | [TestSparkTerrainFormatReal.cpp:L34](../../Tests/TestSparkTerrainFormatReal.cpp#L34) | | @@ -28714,11 +28771,11 @@ | `QuantAngle` | function | GameModules | [TFVehicleNet.cpp:L46](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleNet.cpp#L46) | | | `QuantCoord` | function | GameModules | [TFFireFxProtocol.h:L85](../../GameModules/SparkGameMMOFPS/Source/Net/TFFireFxProtocol.h#L85) | | | `QuantHP` | function | GameModules | [TFVehicleNet.cpp:L41](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleNet.cpp#L41) | | -| `QuantHP` | function | GameModules | [TFReplication.cpp:L33](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L33) | | +| `QuantHP` | function | GameModules | [TFReplication.cpp:L35](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L35) | | | `Quantize` | function | Tests | [TestRHI210D3D11WorldGoldenReal.cpp:L163](../../Tests/TestRHI210D3D11WorldGoldenReal.cpp#L163) | | | `QuantizeAxis` | function | SparkEngine | [Quantization.cpp:L34](../../SparkEngine/Source/Utils/Quantization.cpp#L34) | | | `QuantizeObservedMeters` | function | GameModules | [TFObservation.h:L69](../../GameModules/SparkGameMMOFPS/Source/Game/TFObservation.h#L69) | | -| `QuantizePawn` | function | GameModules | [TFReplication.h:L88](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L88) | | +| `QuantizePawn` | function | GameModules | [TFReplication.h:L93](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L93) | | | `QuantizeQuatComponent` | function | SparkEngine | [Quantization.cpp:L20](../../SparkEngine/Source/Utils/Quantization.cpp#L20) | | | `QuantizeQuaternion` | function | SparkEngine | [AnimationCompression.h:L121](../../SparkEngine/Source/Engine/Animation/AnimationCompression.h#L121) | | | `QuantizeQuaternion` | function | Tests | [TestAnimationCompression.cpp:L70](../../Tests/TestAnimationCompression.cpp#L70) | | @@ -28870,7 +28927,7 @@ | `QuoteLiteral` | function | GameModules | [MMOPersistenceSystem.cpp:L315](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.cpp#L315) | | | `QuoteNativeArgument` | function | SparkBuild | [ProcessRunnerTests.cpp:L86](../../SparkBuild/tests/ProcessRunnerTests.cpp#L86) | | | `QuotePosixArgument` | function | SparkEditor | [EditorProcessLaunchText.h:L117](../../SparkEditor/Source/Utils/EditorProcessLaunchText.h#L117) | | -| `QuoteShellArgument` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L28](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L28) | | +| `QuoteShellArgument` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L30](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L30) | | | `QuoteShellArgument` | function | SparkBuild | [ProcessRunnerTests.cpp:L129](../../SparkBuild/tests/ProcessRunnerTests.cpp#L129) | | | `QuoteShellArgument` | function | SparkBuild | [ProcessRunnerTests.cpp:L149](../../SparkBuild/tests/ProcessRunnerTests.cpp#L149) | | | `QuoteShellArgument` | function | SparkBuild | [ProcessRunnerTests.cpp:L154](../../SparkBuild/tests/ProcessRunnerTests.cpp#L154) | | @@ -29244,6 +29301,7 @@ | `ReadBone` | function | SparkEngine | [AnimationBinaryFormat.cpp:L114](../../SparkEngine/Source/Engine/Animation/AnimationBinaryFormat.cpp#L114) | | | `ReadBool` | function | GameModules | [OWPersistence.inl:L34](../../GameModules/SparkGameOpenWorld/Source/Persistence/OWPersistence.inl#L34) | | | `ReadBool` | function | SparkEditor | [EditorLayoutManager.cpp:L429](../../SparkEditor/Source/Core/EditorLayoutManager.cpp#L429) | | +| `ReadBool` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L41](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L41) | | | `ReadBool` | function | SparkEditor | [SceneComponentCodec.h:L64](../../SparkEditor/Source/SceneSystem/SceneComponentCodec.h#L64) | | | `ReadBool` | function | SparkEngine | [SceneSnapshotSerializer.h:L73](../../SparkEngine/Source/Engine/Editor/SceneSnapshotSerializer.h#L73) | | | `ReadBool` | function | SparkInstaller | [InstallState.cpp:L285](../../SparkInstaller/src/InstallState.cpp#L285) | | @@ -29264,7 +29322,7 @@ | `ReadBytes` | function | SparkInstaller | [InstallerTransactionTests.cpp:L74](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L74) | | | `ReadBytes` | function | Tests | [TestDocumentDurableWrite.cpp:L63](../../Tests/TestDocumentDurableWrite.cpp#L63) | | | `ReadBytes` | function | Tests | [TestEditorStateCompatibility.cpp:L54](../../Tests/TestEditorStateCompatibility.cpp#L54) | | -| `ReadBytes` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L60](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L60) | | +| `ReadBytes` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L61](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L61) | | | `ReadBytes` | function | Tests | [TestNetBuffer.cpp:L137](../../Tests/TestNetBuffer.cpp#L137) | | | `ReadBytes` | function | Tests | [TestPrefabCompatibility.cpp:L55](../../Tests/TestPrefabCompatibility.cpp#L55) | | | `ReadBytes` | function | Tests | [TestPrefabPersistence.cpp:L72](../../Tests/TestPrefabPersistence.cpp#L72) | | @@ -29288,8 +29346,8 @@ | `ReadEditMessage` | function | SparkEditor | [CollaborativeWireCodec.cpp:L129](../../SparkEditor/Source/Communication/CollaborativeWireCodec.cpp#L129) | | | `ReadEditorPeer` | function | SparkEditor | [CollaborativeWireCodec.cpp:L164](../../SparkEditor/Source/Communication/CollaborativeWireCodec.cpp#L164) | | | `ReadEngineInput` | function | SparkConsole | [ConsoleApp.h:L73](../../SparkConsole/src/ConsoleApp.h#L73) | Clear the display console buffer (replaces a `system("cls")`). | -| `ReadEngineInputPosix` | function | SparkConsole | [ConsoleApp.h:L90](../../SparkConsole/src/ConsoleApp.h#L90) | | -| `ReadEngineInputWindows` | function | SparkConsole | [ConsoleApp.h:L88](../../SparkConsole/src/ConsoleApp.h#L88) | | +| `ReadEngineInputPosix` | function | SparkConsole | [ConsoleApp.h:L91](../../SparkConsole/src/ConsoleApp.h#L91) | | +| `ReadEngineInputWindows` | function | SparkConsole | [ConsoleApp.h:L89](../../SparkConsole/src/ConsoleApp.h#L89) | | | `ReadEntityId` | function | SparkEngine | [EventResponseRules.cpp:L234](../../SparkEngine/Source/Engine/Gameplay/EventResponseRules.cpp#L234) | | | `ReadEnum` | function | GameModules | [OWPersistence.inl:L43](../../GameModules/SparkGameOpenWorld/Source/Persistence/OWPersistence.inl#L43) | | | `reader` | function | GameModules | [PlatformerProgress.cpp:L221](../../GameModules/SparkGamePlatformer/Source/Core/PlatformerProgress.cpp#L221) | | @@ -29359,7 +29417,7 @@ | `reader` | function | Tests | [Test_persistence_ReplaySystem.cpp:L57](../../Tests/harden/Test_persistence_ReplaySystem.cpp#L57) | | | `ReadF32` | function | SparkEngine | [TerrainAssetFormat.h:L119](../../SparkEngine/Source/Graphics/TerrainAssetFormat.h#L119) | | | `ReadField` | function | GameModules | [FPSLocalProfile.cpp:L60](../../GameModules/SparkGameFPS/Source/Game/FPSLocalProfile.cpp#L60) | Parse one required field; reports the key that failed. | -| `ReadFile` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L21](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L21) | | +| `ReadFile` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L23](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L23) | | | `ReadFile` | function | SparkEditor | [EditorRecoveryFiles.h:L60](../../SparkEditor/Source/Core/EditorRecoveryFiles.h#L60) | | | `ReadFile` | function | SparkEngine | [SparkPak.h:L141](../../SparkEngine/Source/Core/SparkPak.h#L141) | Read a file's contents as a binary blob. | | `ReadFile` | function | SparkEngine | [ArchiveResourceProvider.h:L50](../../SparkEngine/Source/Engine/Modding/ArchiveResourceProvider.h#L50) | Whether the archive was opened successfully. | @@ -29374,7 +29432,7 @@ | `ReadFile` | function | Tests | [TestDATA120Idempotency.cpp:L70](../../Tests/TestDATA120Idempotency.cpp#L70) | | | `ReadFile` | function | Tests | [TestDATA120PersistenceReal.cpp:L50](../../Tests/TestDATA120PersistenceReal.cpp#L50) | | | `ReadFile` | function | Tests | [TestDATA120SecretsAtRest.cpp:L50](../../Tests/TestDATA120SecretsAtRest.cpp#L50) | | -| `ReadFile` | function | Tests | [TestSparkPak.cpp:L225](../../Tests/TestSparkPak.cpp#L225) | | +| `ReadFile` | function | Tests | [TestSparkPak.cpp:L231](../../Tests/TestSparkPak.cpp#L231) | | | `ReadFile` | function | Tests | [TestTF120Residency.cpp:L51](../../Tests/TestTF120Residency.cpp#L51) | | | `ReadFile` | function | Tests | [TestTF120SharedSaveRoot.cpp:L47](../../Tests/TestTF120SharedSaveRoot.cpp#L47) | | | `ReadFile` | function | Tests | [TestTFScramAuth.cpp:L38](../../Tests/TestTFScramAuth.cpp#L38) | | @@ -29459,6 +29517,7 @@ | `ReadLittleEndian32` | function | Tests | [Test_persistence_SaveSystem.cpp:L202](../../Tests/harden/Test_persistence_SaveSystem.cpp#L202) | | | `ReadLittleEndian32` | function | Tests | [Test_persistence_SaveSystem.cpp:L240](../../Tests/harden/Test_persistence_SaveSystem.cpp#L240) | | | `ReadMagic` | function | SparkEngine | [AnimationBinaryFormat.cpp:L59](../../SparkEngine/Source/Engine/Animation/AnimationBinaryFormat.cpp#L59) | | +| `ReadMaterial` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L222](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L222) | | | `ReadMaterial` | function | Tests | [TestRHI210D3D11SceneGoldenReal.cpp:L128](../../Tests/TestRHI210D3D11SceneGoldenReal.cpp#L128) | | | `ReadMeshBuffers` | function | Tests | [RHI210D3D11GoldenSupport.h:L291](../../Tests/RHI210D3D11GoldenSupport.h#L291) | | | `ReadMetadataOnly` | function | SparkEngine | [SaveSystem.h:L886](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L886) | | @@ -29481,6 +29540,7 @@ | `ReadOwnedFile` | function | SparkEngine | [TelemetrySpoolIO.cpp:L116](../../SparkEngine/Source/Utils/TelemetrySpoolIO.cpp#L116) | | | `ReadOwnedFile` | function | SparkEngine | [TelemetrySpoolInternal.h:L55](../../SparkEngine/Source/Utils/TelemetrySpoolInternal.h#L55) | | | `ReadOwnPeakRssKib` | function | SparkEngine | [SparkEngineLinuxHeadless.cpp:L64](../../SparkEngine/Source/Core/SparkEngineLinuxHeadless.cpp#L64) | This process's own peak resident set in KiB, or 0 when not measurable. | +| `ReadParameter` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L52](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L52) | | | `ReadParameters` | function | SparkEngine | [VisualScriptGraphIO.cpp:L400](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphIO.cpp#L400) | | | `ReadPendingMarker` | function | SparkInstaller | [InstallState.h:L52](../../SparkInstaller/src/InstallState.h#L52) | | | `ReadPin` | function | SparkEngine | [VisualScriptGraphIO.cpp:L186](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphIO.cpp#L186) | | @@ -29491,14 +29551,15 @@ | `ReadPixelRGBA8` | function | Tests | [TestRHI240OpenGLReal.cpp:L44](../../Tests/TestRHI240OpenGLReal.cpp#L44) | | | `ReadPositiveId` | function | GameModules | [TFSocialSystemStore.cpp:L128](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystemStore.cpp#L128) | | | `ReadPrefabFile` | function | SparkEditor | [PrefabAsset.cpp:L34](../../SparkEditor/Source/Prefabs/PrefabAsset.cpp#L34) | | -| `ReadProjectDocumentFields` | function | SparkEditor | [ProjectDocument.cpp:L452](../../SparkEditor/Source/Core/ProjectDocument.cpp#L452) | | +| `ReadPrimary` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L57](../../Tests/TestFPSOwnedSaveDecode.cpp#L57) | | +| `ReadProjectDocumentFields` | function | SparkEditor | [ProjectDocument.cpp:L453](../../SparkEditor/Source/Core/ProjectDocument.cpp#L453) | | | `ReadProjectDocumentFields` | function | SparkEditor | [ProjectDocument.h:L80](../../SparkEditor/Source/Core/ProjectDocument.h#L80) | Extract the project fields from a document CheckProjectDocument accepted. | | `ReadProjectDocumentFields` | function | SparkEditor | [ProjectManager.cpp:L1789](../../SparkEditor/Source/Core/ProjectManager.cpp#L1789) | | | `ReadQuat48` | function | SparkEngine | [NetQuantize.cpp:L18](../../SparkEngine/Source/Engine/Networking/NetQuantize.cpp#L18) | | | `ReadQuat48` | function | SparkEngine | [NetQuantize.h:L34](../../SparkEngine/Source/Engine/Networking/NetQuantize.h#L34) | Read a smallest-three 48-bit quaternion from @p buf (consumes 6 bytes). | | `ReadRaw` | function | Tests | [TestCrossSystemIntegration.cpp:L217](../../Tests/TestCrossSystemIntegration.cpp#L217) | | | `ReadRaw` | function | Tests | [TestReplicationFields.cpp:L100](../../Tests/TestReplicationFields.cpp#L100) | | -| `ReadRecentProjectsDocument` | function | SparkEditor | [ProjectDocument.cpp:L510](../../SparkEditor/Source/Core/ProjectDocument.cpp#L510) | | +| `ReadRecentProjectsDocument` | function | SparkEditor | [ProjectDocument.cpp:L511](../../SparkEditor/Source/Core/ProjectDocument.cpp#L511) | | | `ReadRecentProjectsDocument` | function | SparkEditor | [ProjectDocument.h:L92](../../SparkEditor/Source/Core/ProjectDocument.h#L92) | Extract every entry with a non-empty path from a recent-projects document. | | `ReadRecoveryFile` | function | SparkEditor | [EditorRecoveryFiles.h:L151](../../SparkEditor/Source/Core/EditorRecoveryFiles.h#L151) | | | `ReadReflectedConfig` | function | SparkEngine | [EngineSettings.cpp:L629](../../SparkEngine/Source/Core/EngineSettings.cpp#L629) | | @@ -29556,7 +29617,7 @@ | `ReadTemplateEntry` | function | SparkLauncher | [LauncherTemplates.cpp:L30](../../SparkLauncher/src/LauncherTemplates.cpp#L30) | | | `ReadText` | function | SparkEngine | [LocalFileCache.h:L94](../../SparkEngine/Source/Utils/LocalFileCache.h#L94) | Read a text file, returning cached content on subsequent calls | | `ReadText` | function | SparkInstaller | [PortableGitCacheTests.cpp:L58](../../SparkInstaller/tests/PortableGitCacheTests.cpp#L58) | | -| `ReadText` | function | Tests | [TestEditorCookPackageReal.cpp:L108](../../Tests/TestEditorCookPackageReal.cpp#L108) | | +| `ReadText` | function | Tests | [TestEditorCookPackageReal.cpp:L110](../../Tests/TestEditorCookPackageReal.cpp#L110) | | | `ReadText` | function | Tests | [TestNET100TrustStore.cpp:L58](../../Tests/TestNET100TrustStore.cpp#L58) | | | `ReadText` | function | Tests | [TestRegionMapDataSource.cpp:L39](../../Tests/TestRegionMapDataSource.cpp#L39) | | | `ReadText` | function | Tests | [TestTFSocialStore.cpp:L34](../../Tests/TestTFSocialStore.cpp#L34) | | @@ -29570,6 +29631,7 @@ | `ReadTextFile` | function | Tests | [TestEditorProjectMaterializationReal.cpp:L57](../../Tests/TestEditorProjectMaterializationReal.cpp#L57) | | | `ReadTextFile` | function | Tests | [Test_persistence_SaveSystem.cpp:L107](../../Tests/harden/Test_persistence_SaveSystem.cpp#L107) | | | `ReadTexture` | function | Tests | [TestRHI210D3D11PrimaryGoldenReal.cpp:L78](../../Tests/TestRHI210D3D11PrimaryGoldenReal.cpp#L78) | | +| `ReadTextureSlot` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L146](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L146) | | | `ReadTimestamp` | function | GameModules | [TFSocialSystemStore.cpp:L142](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystemStore.cpp#L142) | | | `ReadTOC` | function | SparkEngine | [SparkPak.h:L157](../../SparkEngine/Source/Core/SparkPak.h#L157) | The file path this archive was opened from. | | `ReadTokenFacts` | function | Tests | [CrashArtifactSandboxProbe.cpp:L77](../../Tests/Fixtures/CrashArtifactSandboxProbe.cpp#L77) | | @@ -29622,6 +29684,7 @@ | `ReadUntilEof` | function | SparkEngine | [ProcessWin32Internal.h:L113](../../SparkEngine/Source/Utils/ProcessWin32Internal.h#L113) | | | `ReadValidatedPrivateFile` | function | SparkGateway | [GatewaySecurity.cpp:L227](../../SparkGateway/src/GatewaySecurity.cpp#L227) | | | `ReadValidatedPrivateFile` | function | SparkGateway | [GatewaySecurity.cpp:L298](../../SparkGateway/src/GatewaySecurity.cpp#L298) | | +| `ReadValues` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L31](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L31) | | | `ReadVec16` | function | SparkEngine | [NetQuantize.cpp:L38](../../SparkEngine/Source/Engine/Networking/NetQuantize.cpp#L38) | | | `ReadVec16` | function | SparkEngine | [NetQuantize.h:L41](../../SparkEngine/Source/Engine/Networking/NetQuantize.h#L41) | Read a 16-bit-per-component bounded position from @p buf (consumes 6 bytes). | | `ReadVector3` | function | SparkEngine | [NetworkManager.h:L291](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L291) | | @@ -29634,10 +29697,11 @@ | `ReadWholeFile` | function | Tests | [TestExecScript.cpp:L40](../../Tests/TestExecScript.cpp#L40) | | | `ReadWholeFile` | function | Tests | [TestSEC4NarrowPathsReal.cpp:L118](../../Tests/TestSEC4NarrowPathsReal.cpp#L118) | | | `ReadWholeFile` | function | Tests | [TestSceneSerializerReal.cpp:L846](../../Tests/TestSceneSerializerReal.cpp#L846) | | +| `ReadWin32InputHostSource` | function | Tests | [TestInputFrameEdgesReal.cpp:L40](../../Tests/TestInputFrameEdgesReal.cpp#L40) | | | `ReadXZList` | function | SparkEditor | [RegionMapEditorIO.cpp:L128](../../SparkEditor/Source/Panels/RegionMapEditorIO.cpp#L128) | | | `Ready` | function | GameModules | [TFSecondaryMotion.h:L76](../../GameModules/SparkGameMMOFPS/Source/Game/TFSecondaryMotion.h#L76) | | | `Ready` | function | SparkEngine | [AssetTypesWindowsMedia.cpp:L144](../../SparkEngine/Source/Graphics/AssetTypesWindowsMedia.cpp#L144) | | -| `ready` | function | SparkEngine | [CrashHandler.cpp:L2377](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2377) | | +| `ready` | function | SparkEngine | [CrashHandler.cpp:L2415](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2415) | | | `Ready` | function | Tests | [RHI210D3D11EngineFixture.h:L215](../../Tests/RHI210D3D11EngineFixture.h#L215) | | | `Ready` | function | Tests | [TestAssetServiceClient.cpp:L85](../../Tests/TestAssetServiceClient.cpp#L85) | | | `Ready` | function | Tests | [TestSceneSaveConfinedReal.cpp:L81](../../Tests/TestSceneSaveConfinedReal.cpp#L81) | | @@ -29780,6 +29844,7 @@ | `RecordingVerifier` | function | Tests | [TestMMOAuthHardening.cpp:L35](../../Tests/TestMMOAuthHardening.cpp#L35) | | | `RecordInput` | function | SparkEngine | [ClientPrediction.h:L122](../../SparkEngine/Source/Engine/Networking/ClientPrediction.h#L122) | Record a new input and add to pending buffer. | | `RecordInput` | function | SparkEngine | [SubTickInput.h:L72](../../SparkEngine/Source/Engine/Networking/SubTickInput.h#L72) | Record an input sample into the buffer | +| `RecordInputObservation` | function | GameModules | [Game.h:L650](../../GameModules/SparkGameFPS/Source/Game/Game.h#L650) | Process input and translate to game actions | | `RecordInsertion` | function | SparkEngine | [CacheDebugger.h:L154](../../SparkEngine/Source/Utils/CacheDebugger.h#L154) | | | `RecordKill` | function | GameModules | [GameMechanics.h:L266](../../GameModules/SparkGameFPS/Source/Game/GameMechanics.h#L266) | Register a kill for scoring | | `RecordKill` | function | GameModules | [GameMode.h:L78](../../GameModules/SparkGameFPS/Source/Game/GameMode.h#L78) | | @@ -29896,15 +29961,15 @@ | `RefreshAssetIndex` | function | SparkEditor | [SearchPanel.h:L102](../../SparkEditor/Source/Panels/SearchPanel.h#L102) | Walk the asset root once and cache every regular file found. | | `RefreshAssetMetadata` | function | SparkEditor | [AdvancedAssetPipeline.h:L333](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L333) | Refresh asset metadata | | `RefreshAssetMetadata` | function | SparkEngine | [AssetPipeline.h:L481](../../SparkEngine/Source/Graphics/AssetPipeline.h#L481) | | -| `RefreshAssets` | function | SparkEditor | [AssetBrowserPanel.h:L110](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L110) | | +| `RefreshAssets` | function | SparkEditor | [AssetBrowserPanel.h:L120](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L120) | | | `RefreshAuthoredSceneRuntimeState` | function | GameModules | [Game.h:L628](../../GameModules/SparkGameFPS/Source/Game/Game.h#L628) | | | `RefreshBroadcastTargets` | function | GameModules | [TFLanDiscovery.h:L154](../../GameModules/SparkGameMMOFPS/Source/Game/TFLanDiscovery.h#L154) | | | `RefreshCaptureAvailability` | function | SparkEditor | [PerformanceProfiler.h:L382](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L382) | Render performance graph | | `RefreshClassSpeeds` | function | GameModules | [TFClientNet.h:L199](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L199) | | -| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L1047](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1047) | | -| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L1999](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1999) | | -| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L2019](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2019) | | -| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L2858](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2858) | | +| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L1048](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1048) | | +| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L2001](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2001) | | +| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L2021](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2021) | | +| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L2904](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2904) | | | `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.h:L148](../../SparkEngine/Source/Utils/CrashHandler.h#L148) | | | `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandlerStub.cpp:L36](../../SparkEngine/Source/Utils/CrashHandlerStub.cpp#L36) | | | `RefreshEndpointConfiguration` | function | GameModules | [TFLanDiscovery.h:L155](../../GameModules/SparkGameMMOFPS/Source/Game/TFLanDiscovery.h#L155) | | @@ -30024,7 +30089,7 @@ | `RegisterAgent` | function | SparkEngine | [CollisionAvoidance.h:L123](../../SparkEngine/Source/Engine/AI/CollisionAvoidance.h#L123) | Register an agent for collision avoidance. | | `RegisterAgent` | function | Tests | [TestCollisionAvoidance.cpp:L42](../../Tests/TestCollisionAvoidance.cpp#L42) | | | `RegisterAICommands` | function | SparkEngine | [SubsystemConsoleCommands.cpp:L422](../../SparkEngine/Source/Core/SubsystemConsoleCommands.cpp#L422) | | -| `RegisterAliasCommands` | function | SparkConsole | [ConsoleApp.h:L114](../../SparkConsole/src/ConsoleApp.h#L114) | | +| `RegisterAliasCommands` | function | SparkConsole | [ConsoleApp.h:L115](../../SparkConsole/src/ConsoleApp.h#L115) | | | `RegisterAll` | function | SparkEngine | [EngineBootstrap.h:L122](../../SparkEngine/Source/Core/EngineBootstrap.h#L122) | Register multiple descriptors at once | | `RegisterAnimationCommands` | function | SparkEngine | [SubsystemConsoleCommands.cpp:L469](../../SparkEngine/Source/Core/SubsystemConsoleCommands.cpp#L469) | | | `RegisterAnimationStateMachines` | function | GameModules | [MMOEngineSystems.h:L95](../../GameModules/SparkGameMMO/Source/Core/MMOEngineSystems.h#L95) | | @@ -30146,7 +30211,7 @@ | `RegisterConsoleCommandsHarness` | function | GameModules | [TFCommandsHarness.cpp:L724](../../GameModules/SparkGameMMOFPS/Source/Console/TFCommandsHarness.cpp#L724) | | | `RegisterConsoleCommandsHarness` | function | GameModules | [TFCommandsInternal.h:L59](../../GameModules/SparkGameMMOFPS/Source/Console/TFCommandsInternal.h#L59) | | | `RegisterConsoleCommandsNet` | function | GameModules | [SparkGameMMOFPS.h:L68](../../GameModules/SparkGameMMOFPS/Source/Core/SparkGameMMOFPS.h#L68) | | -| `RegisterCoreCommands` | function | SparkConsole | [ConsoleApp.h:L112](../../SparkConsole/src/ConsoleApp.h#L112) | | +| `RegisterCoreCommands` | function | SparkConsole | [ConsoleApp.h:L113](../../SparkConsole/src/ConsoleApp.h#L113) | | | `RegisterCoreComponentSerializers` | function | SparkEngine | [CoreComponentSerializers.cpp:L335](../../SparkEngine/Source/Engine/Editor/CoreComponentSerializers.cpp#L335) | | | `RegisterCoreComponentSerializers` | function | SparkEngine | [CoreComponentSerializers.h:L21](../../SparkEngine/Source/Engine/Editor/CoreComponentSerializers.h#L21) | Register snapshot serializers for all core ECS component types. | | `RegisterCoreSerializers` | function | SparkEngine | [SaveSystem.cpp:L415](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.cpp#L415) | | @@ -30162,7 +30227,7 @@ | `RegisterDefaultBosses` | function | GameModules | [MMOWorldBossSystem.h:L125](../../GameModules/SparkGameMMO/Source/WorldBoss/MMOWorldBossSystem.h#L125) | | | `RegisterDefaultClasses` | function | GameModules | [MMOCharacterSystem.h:L183](../../GameModules/SparkGameMMO/Source/Character/MMOCharacterSystem.h#L183) | | | `RegisterDefaultClasses` | function | GameModules | [RPGCharacterSystem.h:L138](../../GameModules/SparkGameRPG/Source/Character/RPGCharacterSystem.h#L138) | | -| `RegisterDefaultCommands` | function | SparkConsole | [ConsoleApp.h:L111](../../SparkConsole/src/ConsoleApp.h#L111) | | +| `RegisterDefaultCommands` | function | SparkConsole | [ConsoleApp.h:L112](../../SparkConsole/src/ConsoleApp.h#L112) | | | `RegisterDefaultDungeons` | function | GameModules | [MMODungeonSystem.h:L136](../../GameModules/SparkGameMMO/Source/Dungeon/MMODungeonSystem.h#L136) | | | `RegisterDefaultEditorCommands` | function | SparkEditor | [EditorConsoleBridge.h:L122](../../SparkEditor/Source/Utils/EditorConsoleBridge.h#L122) | | | `RegisterDefaultFactions` | function | GameModules | [MMOReputationSystem.h:L90](../../GameModules/SparkGameMMO/Source/Reputation/MMOReputationSystem.h#L90) | | @@ -30180,7 +30245,7 @@ | `RegisterDefaultTutorials` | function | SparkEditor | [TutorialSystem.h:L387](../../SparkEditor/Source/Core/TutorialSystem.h#L387) | Register the built-in default tutorials. | | `RegisterDefinition` | function | SparkEngine | [RagdollSystem.h:L209](../../SparkEngine/Source/Engine/Animation/RagdollSystem.h#L209) | Register a ragdoll definition. | | `RegisterDestructionCommands` | function | SparkEngine | [SubsystemConsoleCommandsExt.cpp:L311](../../SparkEngine/Source/Core/SubsystemConsoleCommandsExt.cpp#L311) | | -| `RegisterDiagnosticCommands` | function | SparkConsole | [ConsoleApp.h:L113](../../SparkConsole/src/ConsoleApp.h#L113) | | +| `RegisterDiagnosticCommands` | function | SparkConsole | [ConsoleApp.h:L114](../../SparkConsole/src/ConsoleApp.h#L114) | | | `RegisterDiagnosticCommands` | function | SparkEngine | [EngineDiagnostics.cpp:L926](../../SparkEngine/Source/Core/EngineDiagnostics.cpp#L926) | | | `RegisterDiagnosticCommands` | function | SparkEngine | [EngineDiagnostics.h:L92](../../SparkEngine/Source/Core/EngineDiagnostics.h#L92) | Register all diag_ | | `RegisterDialogueCommands` | function | SparkEngine | [SubsystemConsoleCommandsExt.cpp:L329](../../SparkEngine/Source/Core/SubsystemConsoleCommandsExt.cpp#L329) | | @@ -30189,7 +30254,7 @@ | `RegisterDialogueHooks` | function | GameModules | [RPGGameplayBridge.h:L34](../../GameModules/SparkGameRPG/Source/Gameplay/RPGGameplayBridge.h#L34) | | | `RegisterDialogueTrees` | function | GameModules | [MMOEngineSystems.h:L92](../../GameModules/SparkGameMMO/Source/Core/MMOEngineSystems.h#L92) | | | `RegisterDungeon` | function | GameModules | [MMODungeonSystem.h:L113](../../GameModules/SparkGameMMO/Source/Dungeon/MMODungeonSystem.h#L113) | | -| `RegisterEditCommands` | function | SparkEditor | [EditorUI.h:L524](../../SparkEditor/Source/Core/EditorUI.h#L524) | | +| `RegisterEditCommands` | function | SparkEditor | [EditorUI.h:L522](../../SparkEditor/Source/Core/EditorUI.h#L522) | | | `RegisterEditorCommand` | function | SparkEditor | [EditorConsoleBridge.h:L100](../../SparkEditor/Source/Utils/EditorConsoleBridge.h#L100) | Register an editor command on the engine console. | | `RegisteredMusicTrackNames` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L455](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L455) | | | `RegisteredPanel` | function | Tests | [TestEditorStateCompatibility.cpp:L320](../../Tests/TestEditorStateCompatibility.cpp#L320) | | @@ -30282,7 +30347,7 @@ | `RegisterPanel` | function | SparkEditor | [EditorLayoutManager.h:L119](../../SparkEditor/Source/Core/EditorLayoutManager.h#L119) | Register a panel and its default configuration. | | `RegisterPanel` | function | SparkEditor | [EditorPluginManager.h:L206](../../SparkEditor/Source/Core/EditorPluginManager.h#L206) | Register an EditorPanel from a plugin | | `RegisterPanel` | function | Tests | [TestEditorLayoutManager.cpp:L57](../../Tests/TestEditorLayoutManager.cpp#L57) | | -| `RegisterPanelToggleCommands` | function | SparkEditor | [EditorUI.h:L523](../../SparkEditor/Source/Core/EditorUI.h#L523) | | +| `RegisterPanelToggleCommands` | function | SparkEditor | [EditorUI.h:L521](../../SparkEditor/Source/Core/EditorUI.h#L521) | | | `RegisterParticleCommands` | function | SparkEngine | [SubsystemConsoleCommandsExt.cpp:L695](../../SparkEngine/Source/Core/SubsystemConsoleCommandsExt.cpp#L695) | | | `RegisterPass` | function | SparkEngine | [RenderPipeline.h:L136](../../SparkEngine/Source/Graphics/RenderPipeline.h#L136) | Register a custom render pass. | | `RegisterPattern` | function | SparkEngine | [DestructionSystem.h:L222](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L222) | Register a fracture pattern. | @@ -30335,7 +30400,7 @@ | `RegisterSaveSystemCommands` | function | SparkEngine | [SubsystemConsoleCommandsExt.cpp:L722](../../SparkEngine/Source/Core/SubsystemConsoleCommandsExt.cpp#L722) | | | `RegisterScenario` | function | SparkEngine | [BenchmarkFramework.h:L78](../../SparkEngine/Source/Utils/BenchmarkFramework.h#L78) | | | `RegisterScene` | function | SparkEngine | [SceneConfigDatabase.h:L98](../../SparkEngine/Source/SceneManager/SceneConfigDatabase.h#L98) | Register a scene configuration entry. | -| `RegisterSceneCommands` | function | SparkEditor | [EditorUI.h:L525](../../SparkEditor/Source/Core/EditorUI.h#L525) | | +| `RegisterSceneCommands` | function | SparkEditor | [EditorUI.h:L523](../../SparkEditor/Source/Core/EditorUI.h#L523) | | | `RegisterSceneMigrationToV2` | function | Tests | [TestAssetMigration.cpp:L369](../../Tests/TestAssetMigration.cpp#L369) | | | `RegisterSchema` | function | SparkEngine | [PacketValidator.h:L128](../../SparkEngine/Source/Engine/Networking/PacketValidator.h#L128) | | | `RegisterScriptingCommands` | function | SparkEngine | [SubsystemConsoleCommandsExt.cpp:L212](../../SparkEngine/Source/Core/SubsystemConsoleCommandsExt.cpp#L212) | | @@ -30359,7 +30424,7 @@ | `RegisterSubsystemConsoleCommands` | function | SparkEngine | [SubsystemConsoleCommands.cpp:L736](../../SparkEngine/Source/Core/SubsystemConsoleCommands.cpp#L736) | | | `RegisterSubsystemConsoleCommands` | function | SparkEngine | [SubsystemConsoleCommands.h:L22](../../SparkEngine/Source/Core/SubsystemConsoleCommands.h#L22) | Register console commands for all engine subsystems | | `RegisterSurfaceMapping` | function | SparkEngine | [DecalSystem.h:L139](../../SparkEngine/Source/Graphics/DecalSystem.h#L139) | | -| `RegisterSystem` | function | SparkEngine | [EngineContext.h:L358](../../SparkEngine/Source/Core/EngineContext.h#L358) | Register an arbitrary subsystem by type | +| `RegisterSystem` | function | SparkEngine | [EngineContext.h:L361](../../SparkEngine/Source/Core/EngineContext.h#L361) | Register an arbitrary subsystem by type | | `RegisterTable` | function | SparkEngine | [LootAndCraftingSystem.h:L116](../../SparkEngine/Source/Engine/Crafting/LootAndCraftingSystem.h#L116) | Register a loot table by name | | `RegisterTable` | function | SparkEngine | [DataTableSystem.h:L830](../../SparkEngine/Source/Engine/DataTable/DataTableSystem.h#L830) | Register a pre-built table under a name. | | `RegisterTag` | function | SparkEngine | [GameplayTags.h:L194](../../SparkEngine/Source/Engine/Gameplay/GameplayTags.h#L194) | Register a tag by string view. | @@ -30374,7 +30439,7 @@ | `RegisterTheme` | function | SparkEditor | [EditorTheme.h:L227](../../SparkEditor/Source/Core/EditorTheme.h#L227) | Register a new theme | | `RegisterTierConfigs` | function | GameModules | [ARPGDungeonSystem.h:L96](../../GameModules/SparkGameARPG/Source/Dungeon/ARPGDungeonSystem.h#L96) | Re-place the crypt kit after SaveSystem replaced the World's entities. | | `RegisterTimeOfDayCommands` | function | SparkEngine | [EngineConsoleCommands.cpp:L773](../../SparkEngine/Source/Core/EngineConsoleCommands.cpp#L773) | | -| `RegisterToolCommands` | function | SparkEditor | [EditorUI.h:L526](../../SparkEditor/Source/Core/EditorUI.h#L526) | | +| `RegisterToolCommands` | function | SparkEditor | [EditorUI.h:L524](../../SparkEditor/Source/Core/EditorUI.h#L524) | | | `RegisterTrack` | function | SparkEngine | [MusicManager.h:L231](../../SparkEngine/Source/Audio/MusicManager.h#L231) | | | `RegisterTree` | function | GameModules | [RPGDialogueSystem.h:L102](../../GameModules/SparkGameRPG/Source/Dialogue/RPGDialogueSystem.h#L102) | | | `RegisterTree` | function | SparkEngine | [DialogueSystem.h:L215](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L215) | Register a dialogue tree directly. | @@ -30451,20 +30516,21 @@ | `Reject` | function | SparkEngine | [ReflectedSceneValidation.cpp:L280](../../SparkEngine/Source/SceneManager/ReflectedSceneValidation.cpp#L280) | | | `Reject` | function | SparkEngine | [ReflectedSceneValidation.cpp:L293](../../SparkEngine/Source/SceneManager/ReflectedSceneValidation.cpp#L293) | | | `Reject` | function | SparkEngine | [ReflectedSceneValidation.h:L28](../../SparkEngine/Source/SceneManager/ReflectedSceneValidation.h#L28) | Store @p message in @p error (when non-null) and return false. | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L26](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L26) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L29](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L29) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L34](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L34) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L41](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L41) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L49](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L49) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L69](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L69) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L71](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L71) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L73](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L73) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L83](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L83) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L88](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L88) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L99](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L99) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L111](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L111) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L124](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L124) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L134](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L134) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L39](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L39) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L44](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L44) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L51](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L51) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L60](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L60) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L70](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L70) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L97](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L97) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L101](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L101) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L107](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L107) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L119](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L119) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L126](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L126) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L140](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L140) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L162](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L162) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L173](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L173) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L188](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L188) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L200](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L200) | | | `RejectArchive` | function | SparkBuild | [Downloader.cpp:L444](../../SparkBuild/src/Downloader.cpp#L444) | | | `RejectArchive` | function | SparkBuild | [Downloader.cpp:L516](../../SparkBuild/src/Downloader.cpp#L516) | | | `RejectArchive` | function | SparkBuild | [Downloader.cpp:L519](../../SparkBuild/src/Downloader.cpp#L519) | | @@ -30480,13 +30546,14 @@ | `RejectIfOpen` | function | SparkEngine | [OnlineServices.h:L887](../../SparkEngine/Source/Engine/OnlineServices/OnlineServices.h#L887) | | | `RejectPendingConnect` | function | SparkEngine | [NetworkManager.h:L928](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L928) | | | `RejectRemoteAdministrationKeys` | function | SparkServer | [ServerApplication.cpp:L129](../../SparkServer/src/ServerApplication.cpp#L129) | | -| `relative` | function | GameModules | [FPSAssetPaths.cpp:L155](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L155) | | -| `relative` | function | GameModules | [GameConsoleOps.cpp:L572](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L572) | | +| `relative` | function | GameModules | [FPSAssetPaths.cpp:L169](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L169) | | +| `relative` | function | GameModules | [GameConsoleOps.cpp:L580](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L580) | | | `relative` | function | SparkEngine | [OBJStaticMeshLoader.cpp:L151](../../SparkEngine/Source/Graphics/OBJStaticMeshLoader.cpp#L151) | | | `relative` | function | Tests | [TestGameModuleMMO.cpp:L84](../../Tests/TestGameModuleMMO.cpp#L84) | | | `relativeBytes` | function | Tests | [TestLegacyGameObjectMaterial.cpp:L146](../../Tests/TestLegacyGameObjectMaterial.cpp#L146) | | | `RelativeFiles` | function | Tests | [TestGamePackager.cpp:L228](../../Tests/TestGamePackager.cpp#L228) | | -| `relativeU8` | function | GameModules | [FPSAssetPaths.cpp:L205](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L205) | | +| `relativeRoot` | function | Tests | [TestLegacyGameObjectMaterial.cpp:L141](../../Tests/TestLegacyGameObjectMaterial.cpp#L141) | | +| `relativeU8` | function | GameModules | [FPSAssetPaths.cpp:L223](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L223) | | | `relativeUtf8` | function | Tests | [assets.cpp:L39](../../Tests/PackageSmoke/FPSProgression/assets.cpp#L39) | | | `Release` | function | GameModules | [TFCrypto.cpp:L55](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.cpp#L55) | | | `Release` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L860](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L860) | | @@ -30586,6 +30653,7 @@ | `remap` | function | SparkEngine | [LODGenerator.cpp:L396](../../SparkEngine/Source/Graphics/LODGenerator.cpp#L396) | | | `remap` | function | SparkEngine | [MeshOptimizer.h:L259](../../SparkEngine/Source/Graphics/MeshOptimizer.h#L259) | | | `remap` | function | SparkEngine | [SceneTextFormat.cpp:L621](../../SparkEngine/Source/SceneManager/SceneTextFormat.cpp#L621) | | +| `Remember` | function | GameModules | [TFReplicationRefresh.h:L35](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L35) | | | `Remember` | function | SparkEngine | [PerceptionSystem.h:L113](../../SparkEngine/Source/Engine/AI/PerceptionSystem.h#L113) | | | `Remember` | function | Tests | [TestDocumentInterruptionReal.cpp:L187](../../Tests/TestDocumentInterruptionReal.cpp#L187) | | | `Remember` | function | Tests | [TestPerceptionSystemMath.cpp:L88](../../Tests/TestPerceptionSystemMath.cpp#L88) | | @@ -30613,7 +30681,7 @@ | `RemoveAsset` | function | SparkEditor | [AssetAuditGraph.h:L188](../../SparkEditor/Source/Panels/AssetAuditGraph.h#L188) | Remove an asset and all its edges | | `RemoveAsset` | function | SparkEngine | [AssetPipeline.h:L344](../../SparkEngine/Source/Graphics/AssetPipeline.h#L344) | | | `RemoveAsset` | function | Tests | [TestAssetPipelineCache.cpp:L120](../../Tests/TestAssetPipelineCache.cpp#L120) | | -| `RemoveAssetSecDir` | function | Tests | [TestAssetParserHardening.cpp:L60](../../Tests/TestAssetParserHardening.cpp#L60) | | +| `RemoveAssetSecDir` | function | Tests | [TestAssetParserHardening.cpp:L76](../../Tests/TestAssetParserHardening.cpp#L76) | | | `RemoveAura` | function | SparkEngine | [AbilitySystem.h:L307](../../SparkEngine/Source/Engine/Gameplay/AbilitySystem.h#L307) | | | `RemoveAura` | function | Tests | [TestAbilitySystem.cpp:L186](../../Tests/TestAbilitySystem.cpp#L186) | | | `RemoveBinding` | function | SparkEngine | [InputBindings.h:L141](../../SparkEngine/Source/Input/InputBindings.h#L141) | Remove a binding for an action. | @@ -30669,7 +30737,7 @@ | `RemoveEntity` | function | Tests | [TestSpatialGrid.cpp:L75](../../Tests/TestSpatialGrid.cpp#L75) | | | `RemoveEntry` | function | SparkEngine | [LocalFileCache.h:L400](../../SparkEngine/Source/Utils/LocalFileCache.h#L400) | | | `RemoveFileNoThrow` | function | SparkEngine | [ReflectedScenePersistence.cpp:L191](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L191) | | -| `RemoveFileNoThrow` | function | SparkEngine | [SceneManager.cpp:L187](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L187) | | +| `RemoveFileNoThrow` | function | SparkEngine | [SceneManager.cpp:L201](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L201) | | | `RemoveFromFormation` | function | SparkEngine | [FormationSystem.h:L169](../../SparkEngine/Source/Engine/AI/FormationSystem.h#L169) | Remove an entity from a formation. | | `RemoveFromLayer` | function | SparkEngine | [CollisionMaskComponents.h:L65](../../SparkEngine/Source/Engine/ECS/Components/CollisionMaskComponents.h#L65) | Remove layers from the FROM mask | | `RemoveFromNode` | function | SparkEngine | [Octree.h:L348](../../SparkEngine/Source/Utils/Octree.h#L348) | | @@ -30707,7 +30775,7 @@ | `RemoveModuleFiles` | function | Tests | [TestModuleVersion.cpp:L126](../../Tests/TestModuleVersion.cpp#L126) | | | `RemoveNavMesh` | function | SparkEngine | [NavMesh.h:L473](../../SparkEngine/Source/Engine/AI/NavMesh.h#L473) | Unregister and free a single NavMesh by name. | | `RemoveNavMesh` | function | Tests | [TestNavMesh.cpp:L458](../../Tests/TestNavMesh.cpp#L458) | | -| `RemoveNode` | function | SparkEngine | [SceneManager.h:L260](../../SparkEngine/Source/SceneManager/SceneManager.h#L260) | | +| `RemoveNode` | function | SparkEngine | [SceneManager.h:L262](../../SparkEngine/Source/SceneManager/SceneManager.h#L262) | | | `RemoveNode` | function | Tests | [TestSceneManager.cpp:L66](../../Tests/TestSceneManager.cpp#L66) | | | `RemoveNodeCommand::Execute` | method | SparkEditor | [VisualScriptPanel.cpp:L1592](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L1592) | | | `RemoveNodeCommand::Undo` | method | SparkEditor | [VisualScriptPanel.cpp:L1613](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L1613) | | @@ -30793,7 +30861,7 @@ | `RenameNoReplace` | function | SparkBuild | [ArchiveExtraction.cpp:L107](../../SparkBuild/src/ArchiveExtraction.cpp#L107) | | | `RenameObject` | function | SparkEditor | [HierarchyPanel.h:L348](../../SparkEditor/Source/Panels/HierarchyPanel.h#L348) | Rename object | | `RenameSlot` | function | SparkEditor | [SaveSystemPanel.h:L61](../../SparkEditor/Source/Panels/SaveSystemPanel.h#L61) | Rename a save file on disk; returns false if the target exists or I/O fails. | -| `renameStorage` | function | SparkEngine | [CrashHandler.cpp:L639](../../SparkEngine/Source/Utils/CrashHandler.cpp#L639) | | +| `renameStorage` | function | SparkEngine | [CrashHandler.cpp:L640](../../SparkEngine/Source/Utils/CrashHandler.cpp#L640) | | | `RenameWorldEntity` | function | SparkEditor | [HierarchyPanel.h:L239](../../SparkEditor/Source/Panels/HierarchyPanel.h#L239) | Apply an undoable rename to a World entity's NameComponent. | | `Render` | function | GameModules | [Enemy.h:L75](../../GameModules/SparkGameFPS/Source/Game/Enemy.h#L75) | | | `Render` | function | GameModules | [Game.h:L151](../../GameModules/SparkGameFPS/Source/Game/Game.h#L151) | Render the current frame using unified graphics system | @@ -30823,7 +30891,7 @@ | `Render` | function | SparkEditor | [AIDebugPanel.h:L38](../../SparkEditor/Source/Panels/AIDebugPanel.h#L38) | | | `Render` | function | SparkEditor | [AIEditorPanel.h:L30](../../SparkEditor/Source/Panels/AIEditorPanel.h#L30) | | | `Render` | function | SparkEditor | [AbilityEditorPanel.h:L31](../../SparkEditor/Source/Panels/AbilityEditorPanel.h#L31) | | -| `Render` | function | SparkEditor | [AssetBrowserPanel.h:L54](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L54) | Render asset browser panel | +| `Render` | function | SparkEditor | [AssetBrowserPanel.h:L55](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L55) | Render asset browser panel | | `Render` | function | SparkEditor | [AudioMixerPanel.h:L30](../../SparkEditor/Source/Panels/AudioMixerPanel.h#L30) | | | `Render` | function | SparkEditor | [BasicMaterialEditorPanel.h:L49](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L49) | | | `Render` | function | SparkEditor | [BuildCookPanel.h:L111](../../SparkEditor/Source/Panels/BuildCookPanel.h#L111) | | @@ -30939,8 +31007,8 @@ | `RenderAppearanceSettings` | function | SparkEditor | [ParticleEditorPanel.h:L40](../../SparkEditor/Source/Panels/ParticleEditorPanel.h#L40) | | | `RenderAreaList` | function | SparkEditor | [StreamingPanel.h:L60](../../SparkEditor/Source/Panels/StreamingPanel.h#L60) | | | `RenderAssetCooking` | function | SparkEditor | [BuildCookPanel.h:L122](../../SparkEditor/Source/Panels/BuildCookPanel.h#L122) | | -| `RenderAssetDetails` | function | SparkEditor | [AssetBrowserPanel.h:L109](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L109) | | -| `RenderAssetGrid` | function | SparkEditor | [AssetBrowserPanel.h:L108](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L108) | | +| `RenderAssetDetails` | function | SparkEditor | [AssetBrowserPanel.h:L119](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L119) | | +| `RenderAssetGrid` | function | SparkEditor | [AssetBrowserPanel.h:L118](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L118) | | | `RenderAssetInspector` | function | SparkEditor | [AdvancedAssetPipeline.h:L433](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L433) | Render asset inspector | | `RenderAssetList` | function | SparkEditor | [AdvancedAssetPipeline.h:L418](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L418) | Render asset list | | `RenderAudioDebug` | function | SparkEditor | [DebugVisualizerPanel.h:L55](../../SparkEditor/Source/Panels/DebugVisualizerPanel.h#L55) | | @@ -30975,7 +31043,7 @@ | `RenderBuildActions` | function | SparkEditor | [BuildCookPanel.h:L124](../../SparkEditor/Source/Panels/BuildCookPanel.h#L124) | | | `RenderBuildControls` | function | SparkEditor | [CSGEditorPanel.h:L174](../../SparkEditor/Source/Panels/CSGEditorPanel.h#L174) | Default operation used by the ImGui "Create" button. | | `RenderBuildLog` | function | SparkEditor | [BuildCookPanel.h:L125](../../SparkEditor/Source/Panels/BuildCookPanel.h#L125) | | -| `RenderBuildMenu` | function | SparkEditor | [EditorUI.h:L492](../../SparkEditor/Source/Core/EditorUI.h#L492) | | +| `RenderBuildMenu` | function | SparkEditor | [EditorUI.h:L490](../../SparkEditor/Source/Core/EditorUI.h#L490) | | | `RenderBuildOptions` | function | SparkEditor | [BuildCookPanel.h:L120](../../SparkEditor/Source/Panels/BuildCookPanel.h#L120) | | | `RenderCallStack` | function | SparkEditor | [ScriptDebugPanel.h:L98](../../SparkEditor/Source/Panels/ScriptDebugPanel.h#L98) | | | `RenderCamera2DComponent` | function | SparkEditor | [InspectorPanel.h:L104](../../SparkEditor/Source/Panels/InspectorPanel.h#L104) | | @@ -31088,7 +31156,7 @@ | `RenderDebugUI` | function | GameModules | [TFVehicleTerminal.h:L45](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleTerminal.h#L45) | | | `RenderDebugUI` | function | GameModules | [TFWeaponSystem.h:L50](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L50) | | | `RenderDebugUI` | function | GameModules | [TFClientNet.h:L80](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L80) | | -| `RenderDebugUI` | function | GameModules | [TFReplication.h:L63](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L63) | | +| `RenderDebugUI` | function | GameModules | [TFReplication.h:L67](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L67) | | | `RenderDebugUI` | function | GameModules | [TFServerSim.h:L64](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L64) | | | `RenderDebugUI` | function | GameModules | [TFChatWindow.h:L49](../../GameModules/SparkGameMMOFPS/Source/UI/TFChatWindow.h#L49) | | | `RenderDebugUI` | function | GameModules | [TFDeathRecap.h:L70](../../GameModules/SparkGameMMOFPS/Source/UI/TFDeathRecap.h#L70) | | @@ -31164,7 +31232,7 @@ | `RenderDeviceStatus` | function | SparkEditor | [VRConfigPanel.h:L32](../../SparkEditor/Source/Panels/VRConfigPanel.h#L32) | | | `RenderDPSChart` | function | SparkEditor | [WeaponEditorPanel.h:L61](../../SparkEditor/Source/Panels/WeaponEditorPanel.h#L61) | The current (possibly edited) weapon table. | | `RenderEditLog` | function | SparkEditor | [CollaborationPanel.h:L37](../../SparkEditor/Source/Panels/CollaborationPanel.h#L37) | | -| `RenderEditMenu` | function | SparkEditor | [EditorUI.h:L482](../../SparkEditor/Source/Core/EditorUI.h#L482) | | +| `RenderEditMenu` | function | SparkEditor | [EditorUI.h:L480](../../SparkEditor/Source/Core/EditorUI.h#L480) | | | `RenderEditorTab` | function | SparkEditor | [ProjectSettingsPanel.h:L47](../../SparkEditor/Source/Panels/ProjectSettingsPanel.h#L47) | | | `RenderEmissionSettings` | function | SparkEditor | [ParticleEditorPanel.h:L38](../../SparkEditor/Source/Panels/ParticleEditorPanel.h#L38) | | | `RenderEmptyContextMenu` | function | SparkEditor | [HierarchyPanel.h:L292](../../SparkEditor/Source/Panels/HierarchyPanel.h#L292) | Render empty space context menu | @@ -31175,22 +31243,22 @@ | `RenderEventLog` | function | SparkEditor | [EventMonitorPanel.h:L56](../../SparkEditor/Source/Panels/EventMonitorPanel.h#L56) | | | `RenderEventLog` | function | SparkEditor | [StreamingPanel.h:L64](../../SparkEditor/Source/Panels/StreamingPanel.h#L64) | | | `RenderFileList` | function | SparkEditor | [SceneImportPanel.h:L111](../../SparkEditor/Source/Panels/SceneImportPanel.h#L111) | Execute the import of @p parsed into the current World as ONE | -| `RenderFileMenu` | function | SparkEditor | [EditorUI.h:L479](../../SparkEditor/Source/Core/EditorUI.h#L479) | Re-point the panels that cache a raw ::World | -| `RenderFileProjectItems` | function | SparkEditor | [EditorUI.h:L481](../../SparkEditor/Source/Core/EditorUI.h#L481) | | -| `RenderFileSceneItems` | function | SparkEditor | [EditorUI.h:L480](../../SparkEditor/Source/Core/EditorUI.h#L480) | | +| `RenderFileMenu` | function | SparkEditor | [EditorUI.h:L477](../../SparkEditor/Source/Core/EditorUI.h#L477) | Wire document-backed panels to the current World and EditorUI. | +| `RenderFileProjectItems` | function | SparkEditor | [EditorUI.h:L479](../../SparkEditor/Source/Core/EditorUI.h#L479) | Wire document-backed panels to the current World and EditorUI. | +| `RenderFileSceneItems` | function | SparkEditor | [EditorUI.h:L478](../../SparkEditor/Source/Core/EditorUI.h#L478) | Wire document-backed panels to the current World and EditorUI. | | `RenderFilterBar` | function | SparkEditor | [CoroutineDebugPanel.h:L52](../../SparkEditor/Source/Panels/CoroutineDebugPanel.h#L52) | | | `RenderFilterButtons` | function | SparkEditor | [SearchPanel.h:L131](../../SparkEditor/Source/Panels/SearchPanel.h#L131) | | | `RenderFilterControls` | function | SparkEditor | [ConsolePanel.h:L200](../../SparkEditor/Source/Panels/ConsolePanel.h#L200) | Render filter controls | | `RenderFlashOverlay` | function | GameModules | [TFGrenadeSystem.h:L155](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L155) | | | `RenderFloatParam` | function | SparkEditor | [MaterialEditorPanel.h:L214](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L214) | Check if the material has unsaved changes. | | `RenderFogVolumeComponent` | function | SparkEditor | [InspectorPanel.h:L135](../../SparkEditor/Source/Panels/InspectorPanel.h#L135) | | -| `RenderFolderNode` | function | SparkEditor | [AssetBrowserPanel.h:L107](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L107) | | -| `RenderFolderTree` | function | SparkEditor | [AssetBrowserPanel.h:L106](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L106) | | +| `RenderFolderNode` | function | SparkEditor | [AssetBrowserPanel.h:L117](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L117) | | +| `RenderFolderTree` | function | SparkEditor | [AssetBrowserPanel.h:L116](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L116) | | | `RenderFoliagePass` | function | SparkEngine | [FoliageRenderer.h:L439](../../SparkEngine/Source/Graphics/FoliageRenderer.h#L439) | | | `RenderForward` | function | SparkEngine | [GraphicsEngine.h:L1321](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L1321) | | | `RenderForwardPlus` | function | SparkEngine | [GraphicsEngine.h:L1324](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L1324) | | | `RenderFPSHUD` | function | SparkEditor | [GameViewPanel.h:L93](../../SparkEditor/Source/Panels/GameViewPanel.h#L93) | | -| `RenderFPSToolsMenu` | function | SparkEditor | [EditorUI.h:L491](../../SparkEditor/Source/Core/EditorUI.h#L491) | | +| `RenderFPSToolsMenu` | function | SparkEditor | [EditorUI.h:L489](../../SparkEditor/Source/Core/EditorUI.h#L489) | | | `RenderFrame` | function | Tests | [TestRHI210D3D11FrameGoldenReal.cpp:L117](../../Tests/TestRHI210D3D11FrameGoldenReal.cpp#L117) | | | `RenderFrame` | function | Tests | [TestRHI225D3D12ValidationReal.cpp:L235](../../Tests/TestRHI225D3D12ValidationReal.cpp#L235) | | | `RenderFrameProperties` | function | SparkEditor | [SpriteAnimationEditorPanel.h:L50](../../SparkEditor/Source/Panels/SpriteAnimationEditorPanel.h#L50) | | @@ -31209,11 +31277,11 @@ | `RenderFullscreen` | function | Tests | [TestRHI230VulkanValidationReal.cpp:L650](../../Tests/TestRHI230VulkanValidationReal.cpp#L650) | | | `RenderGameContent` | function | SparkEditor | [GameViewPanel.h:L92](../../SparkEditor/Source/Panels/GameViewPanel.h#L92) | | | `RenderGameModeConfig` | function | SparkEditor | [FPSToolsPanel.h:L31](../../SparkEditor/Source/Panels/FPSToolsPanel.h#L31) | | -| `RenderGameObject2DSubMenu` | function | SparkEditor | [EditorUI.h:L485](../../SparkEditor/Source/Core/EditorUI.h#L485) | | -| `RenderGameObject3DSubMenu` | function | SparkEditor | [EditorUI.h:L484](../../SparkEditor/Source/Core/EditorUI.h#L484) | | -| `RenderGameObjectMenu` | function | SparkEditor | [EditorUI.h:L483](../../SparkEditor/Source/Core/EditorUI.h#L483) | | -| `RenderGameObjectSpecializedSubMenus` | function | SparkEditor | [EditorUI.h:L487](../../SparkEditor/Source/Core/EditorUI.h#L487) | | -| `RenderGameObjectVolumeSubMenu` | function | SparkEditor | [EditorUI.h:L486](../../SparkEditor/Source/Core/EditorUI.h#L486) | | +| `RenderGameObject2DSubMenu` | function | SparkEditor | [EditorUI.h:L483](../../SparkEditor/Source/Core/EditorUI.h#L483) | | +| `RenderGameObject3DSubMenu` | function | SparkEditor | [EditorUI.h:L482](../../SparkEditor/Source/Core/EditorUI.h#L482) | | +| `RenderGameObjectMenu` | function | SparkEditor | [EditorUI.h:L481](../../SparkEditor/Source/Core/EditorUI.h#L481) | | +| `RenderGameObjectSpecializedSubMenus` | function | SparkEditor | [EditorUI.h:L485](../../SparkEditor/Source/Core/EditorUI.h#L485) | | +| `RenderGameObjectVolumeSubMenu` | function | SparkEditor | [EditorUI.h:L484](../../SparkEditor/Source/Core/EditorUI.h#L484) | | | `RenderGameplayTab` | function | SparkEditor | [ProjectSettingsPanel.h:L42](../../SparkEditor/Source/Panels/ProjectSettingsPanel.h#L42) | | | `RenderGenerationTools` | function | SparkEditor | [TerrainEditor.h:L95](../../SparkEditor/Source/Terrain/TerrainEditor.h#L95) | | | `RenderGPU` | function | SparkEngine | [SkyAtmosphere.h:L174](../../SparkEngine/Source/Graphics/SkyAtmosphere.h#L174) | | @@ -31233,7 +31301,7 @@ | `RenderHealthArmorBars` | function | SparkEditor | [GameViewPanel.h:L97](../../SparkEditor/Source/Panels/GameViewPanel.h#L97) | | | `RenderHealthComponent` | function | SparkEditor | [InspectorPanel.h:L118](../../SparkEditor/Source/Panels/InspectorPanel.h#L118) | | | `RenderHeightmapTools` | function | SparkEditor | [TerrainEditor.h:L89](../../SparkEditor/Source/Terrain/TerrainEditor.h#L89) | | -| `RenderHelpMenu` | function | SparkEditor | [EditorUI.h:L493](../../SparkEditor/Source/Core/EditorUI.h#L493) | | +| `RenderHelpMenu` | function | SparkEditor | [EditorUI.h:L491](../../SparkEditor/Source/Core/EditorUI.h#L491) | | | `RenderHierarchyTree` | function | SparkEditor | [HierarchyPanel.h:L228](../../SparkEditor/Source/Panels/HierarchyPanel.h#L228) | Render the main hierarchy tree | | `RenderHistoryList` | function | SparkEditor | [UndoHistoryPanel.h:L45](../../SparkEditor/Source/Panels/UndoHistoryPanel.h#L45) | | | `RenderHistoryPanel` | function | SparkEditor | [VersionControlSystem.h:L357](../../SparkEditor/Source/VersionControl/VersionControlSystem.h#L357) | Render history panel | @@ -31269,7 +31337,7 @@ | `RenderLoginScreen` | function | GameModules | [TFLoginFlow.h:L136](../../GameModules/SparkGameMMOFPS/Source/UI/TFLoginFlow.h#L136) | | | `RenderLogOutput` | function | SparkEditor | [WorkflowPanel.h:L42](../../SparkEditor/Source/Panels/WorkflowPanel.h#L42) | Set the EditorUI pointer for workflow context access. | | `RenderLowHealthVignette` | function | SparkEditor | [GameViewPanel.h:L106](../../SparkEditor/Source/Panels/GameViewPanel.h#L106) | | -| `RenderMainMenuBar` | function | SparkEditor | [EditorUI.h:L478](../../SparkEditor/Source/Core/EditorUI.h#L478) | Re-point the panels that cache a raw ::World | +| `RenderMainMenuBar` | function | SparkEditor | [EditorUI.h:L476](../../SparkEditor/Source/Core/EditorUI.h#L476) | Wire document-backed panels to the current World and EditorUI. | | `RenderManifestControls` | function | SparkEditor | [GameModuleSelectorPanel.h:L57](../../SparkEditor/Source/Panels/GameModuleSelectorPanel.h#L57) | | | `RenderMapCanvas` | function | SparkEditor | [TilemapEditorPanel.h:L60](../../SparkEditor/Source/Panels/TilemapEditorPanel.h#L60) | | | `RenderMapProperties` | function | SparkEditor | [TilemapEditorPanel.h:L61](../../SparkEditor/Source/Panels/TilemapEditorPanel.h#L61) | | @@ -31291,7 +31359,7 @@ | `RenderMinimap` | function | SparkEditor | [GameViewPanel.h:L99](../../SparkEditor/Source/Panels/GameViewPanel.h#L99) | | | `RenderMixBuses` | function | SparkEditor | [AudioMixerPanel.h:L67](../../SparkEditor/Source/Panels/AudioMixerPanel.h#L67) | | | `RenderModal` | function | SparkEditor | [ProjectBrowserPanel.h:L73](../../SparkEditor/Source/Panels/ProjectBrowserPanel.h#L73) | | -| `RenderModalDialogs` | function | SparkEditor | [EditorUI.h:L503](../../SparkEditor/Source/Core/EditorUI.h#L503) | | +| `RenderModalDialogs` | function | SparkEditor | [EditorUI.h:L501](../../SparkEditor/Source/Core/EditorUI.h#L501) | | | `RenderModDetails` | function | SparkEditor | [ModdingPanel.h:L55](../../SparkEditor/Source/Panels/ModdingPanel.h#L55) | Re-read the mod list from the ModSystem into m_mods. | | `RenderModdingLocalizationTab` | function | SparkEditor | [ProjectSettingsPanel.h:L52](../../SparkEditor/Source/Panels/ProjectSettingsPanel.h#L52) | | | `RenderModList` | function | SparkEditor | [ModdingPanel.h:L54](../../SparkEditor/Source/Panels/ModdingPanel.h#L54) | Re-read the mod list from the ModSystem into m_mods. | @@ -31331,7 +31399,7 @@ | `RenderPackagingOptions` | function | SparkEditor | [BuildCookPanel.h:L123](../../SparkEditor/Source/Panels/BuildCookPanel.h#L123) | | | `RenderPacketLog` | function | SparkEditor | [NetworkDebugPanel.h:L388](../../SparkEditor/Source/Panels/NetworkDebugPanel.h#L388) | | | `RenderPacketLog` | function | SparkEditor | [NetworkDebugPanel.h:L482](../../SparkEditor/Source/Panels/NetworkDebugPanel.h#L482) | | -| `RenderPanels` | function | SparkEditor | [EditorUI.h:L502](../../SparkEditor/Source/Core/EditorUI.h#L502) | | +| `RenderPanels` | function | SparkEditor | [EditorUI.h:L500](../../SparkEditor/Source/Core/EditorUI.h#L500) | | | `RenderParallaxBGComponent` | function | SparkEditor | [InspectorPanel.h:L107](../../SparkEditor/Source/Panels/InspectorPanel.h#L107) | | | `RenderParameterEditor` | function | SparkEditor | [MaterialEditorPanel.h:L212](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L212) | Check if the material has unsaved changes. | | `RenderParameterGroup` | function | SparkEditor | [MaterialEditorPanel.h:L213](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L213) | Check if the material has unsaved changes. | @@ -31490,7 +31558,7 @@ | `RenderStats` | function | SparkEditor | [DebugVisualizerPanel.h:L57](../../SparkEditor/Source/Panels/DebugVisualizerPanel.h#L57) | | | `RenderStats` | function | SparkEditor | [EventMonitorPanel.h:L57](../../SparkEditor/Source/Panels/EventMonitorPanel.h#L57) | | | `RenderStatus` | function | SparkEditor | [PlayControlPanel.h:L79](../../SparkEditor/Source/Panels/PlayControlPanel.h#L79) | | -| `RenderStatusBar` | function | SparkEditor | [EditorUI.h:L501](../../SparkEditor/Source/Core/EditorUI.h#L501) | | +| `RenderStatusBar` | function | SparkEditor | [EditorUI.h:L499](../../SparkEditor/Source/Core/EditorUI.h#L499) | | | `RenderStatusDisplay` | function | SparkEditor | [PlayModeToolbarPanel.h:L63](../../SparkEditor/Source/Panels/PlayModeToolbarPanel.h#L63) | | | `RenderStreamingSettings` | function | SparkEditor | [StreamingPanel.h:L61](../../SparkEditor/Source/Panels/StreamingPanel.h#L61) | | | `RenderStreamingStatistics` | function | SparkEditor | [LevelStreamingSystem.h:L316](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.h#L316) | Render streaming statistics | @@ -31619,7 +31687,7 @@ | `RenderTimeline` | function | SparkEditor | [CinematicSequencerPanel.h:L68](../../SparkEditor/Source/Panels/CinematicSequencerPanel.h#L68) | | | `RenderTimeline` | function | SparkEditor | [SpriteAnimationEditorPanel.h:L48](../../SparkEditor/Source/Panels/SpriteAnimationEditorPanel.h#L48) | | | `RenderTimeScaleControls` | function | SparkEditor | [PlayModeToolbarPanel.h:L59](../../SparkEditor/Source/Panels/PlayModeToolbarPanel.h#L59) | Connect to the engine's PlayModeManager. | -| `RenderToolbar` | function | SparkEditor | [EditorUI.h:L494](../../SparkEditor/Source/Core/EditorUI.h#L494) | | +| `RenderToolbar` | function | SparkEditor | [EditorUI.h:L492](../../SparkEditor/Source/Core/EditorUI.h#L492) | | | `RenderToolbar` | function | SparkEditor | [BasicMaterialEditorPanel.h:L93](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L93) | | | `RenderToolbar` | function | SparkEditor | [CinematicSequencerPanel.h:L67](../../SparkEditor/Source/Panels/CinematicSequencerPanel.h#L67) | | | `RenderToolbar` | function | SparkEditor | [DecorLayoutEditorPanel.h:L129](../../SparkEditor/Source/Panels/DecorLayoutEditorPanel.h#L129) | | @@ -31637,9 +31705,9 @@ | `RenderToolbar` | function | SparkEditor | [SpriteAnimationEditorPanel.h:L46](../../SparkEditor/Source/Panels/SpriteAnimationEditorPanel.h#L46) | | | `RenderToolbar` | function | SparkEditor | [TilemapEditorPanel.h:L58](../../SparkEditor/Source/Panels/TilemapEditorPanel.h#L58) | | | `RenderToolbar` | function | SparkEditor | [UndoHistoryPanel.h:L46](../../SparkEditor/Source/Panels/UndoHistoryPanel.h#L46) | | -| `RenderToolbarPlayControls` | function | SparkEditor | [EditorUI.h:L497](../../SparkEditor/Source/Core/EditorUI.h#L497) | | -| `RenderToolbarSnapControls` | function | SparkEditor | [EditorUI.h:L500](../../SparkEditor/Source/Core/EditorUI.h#L500) | | -| `RenderToolbarTransformTools` | function | SparkEditor | [EditorUI.h:L495](../../SparkEditor/Source/Core/EditorUI.h#L495) | | +| `RenderToolbarPlayControls` | function | SparkEditor | [EditorUI.h:L495](../../SparkEditor/Source/Core/EditorUI.h#L495) | | +| `RenderToolbarSnapControls` | function | SparkEditor | [EditorUI.h:L498](../../SparkEditor/Source/Core/EditorUI.h#L498) | | +| `RenderToolbarTransformTools` | function | SparkEditor | [EditorUI.h:L493](../../SparkEditor/Source/Core/EditorUI.h#L493) | | | `RenderToolPalette` | function | SparkEditor | [TerrainEditor.h:L87](../../SparkEditor/Source/Terrain/TerrainEditor.h#L87) | | | `RenderTraceLog` | function | SparkEditor | [ScriptDebugPanel.h:L96](../../SparkEditor/Source/Panels/ScriptDebugPanel.h#L96) | | | `RenderTrackingInfo` | function | SparkEditor | [VRConfigPanel.h:L33](../../SparkEditor/Source/Panels/VRConfigPanel.h#L33) | | @@ -31696,10 +31764,10 @@ | `RenderWeaponPreview` | function | SparkEditor | [WeaponEditorPanel.h:L60](../../SparkEditor/Source/Panels/WeaponEditorPanel.h#L60) | The current (possibly edited) weapon table. | | `RenderWeaponProperties` | function | SparkEditor | [WeaponEditorPanel.h:L59](../../SparkEditor/Source/Panels/WeaponEditorPanel.h#L59) | The current (possibly edited) weapon table. | | `RenderWeatherComponent` | function | SparkEditor | [InspectorPanel.h:L125](../../SparkEditor/Source/Panels/InspectorPanel.h#L125) | | -| `RenderWelcomeScreen` | function | SparkEditor | [EditorUI.h:L504](../../SparkEditor/Source/Core/EditorUI.h#L504) | | +| `RenderWelcomeScreen` | function | SparkEditor | [EditorUI.h:L502](../../SparkEditor/Source/Core/EditorUI.h#L502) | | | `RenderWidgetInspector` | function | SparkEditor | [UIDesignerPanel.h:L40](../../SparkEditor/Source/Panels/UIDesignerPanel.h#L40) | | | `RenderWidgetTree` | function | SparkEditor | [UIDesignerPanel.h:L39](../../SparkEditor/Source/Panels/UIDesignerPanel.h#L39) | | -| `RenderWindowMenu` | function | SparkEditor | [EditorUI.h:L490](../../SparkEditor/Source/Core/EditorUI.h#L490) | | +| `RenderWindowMenu` | function | SparkEditor | [EditorUI.h:L488](../../SparkEditor/Source/Core/EditorUI.h#L488) | | | `RenderWindZoneComponent` | function | SparkEditor | [InspectorPanel.h:L139](../../SparkEditor/Source/Panels/InspectorPanel.h#L139) | | | `RenderWorkflowList` | function | SparkEditor | [WorkflowPanel.h:L40](../../SparkEditor/Source/Panels/WorkflowPanel.h#L40) | Set the EditorUI pointer for workflow context access. | | `RenderWorld` | function | GameModules | [TFWorldSetup.h:L111](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetup.h#L111) | | @@ -31717,6 +31785,7 @@ | `RenderWorldToolbar` | function | SparkEditor | [HierarchyPanel.h:L233](../../SparkEditor/Source/Panels/HierarchyPanel.h#L233) | Render the Create/Delete toolbar for World-backed mode (Unit C2). | | `RenderWorldToTexture` | function | SparkEditor | [GameViewPanel.h:L111](../../SparkEditor/Source/Panels/GameViewPanel.h#L111) | | | `RenderWorldVariables` | function | SparkEditor | [ConditionEditorPanel.h:L63](../../SparkEditor/Source/Panels/ConditionEditorPanel.h#L63) | | +| `reopened` | function | Tests | [TestEditorSubsystemsReal.cpp:L823](../../Tests/TestEditorSubsystemsReal.cpp#L823) | | | `reopened` | function | Tests | [TestSEC2PersistenceHardening.cpp:L416](../../Tests/TestSEC2PersistenceHardening.cpp#L416) | | | `Repair` | function | GameModules | [VehicleSystem.h:L218](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L218) | Repair the vehicle | | `RepairRequiredFileName` | function | SparkInstaller | [InstallState.h:L40](../../SparkInstaller/src/InstallState.h#L40) | | @@ -31732,7 +31801,7 @@ | `ReplaceFileAtomically` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L71](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L71) | | | `ReplaceFileAtomically` | function | SparkEditor | [JSONSceneSerializer.cpp:L103](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L103) | | | `ReplaceFileAtomically` | function | SparkEngine | [ReflectedScenePersistence.cpp:L140](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L140) | | -| `ReplaceFileAtomically` | function | SparkEngine | [SceneManager.cpp:L114](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L114) | | +| `ReplaceFileAtomically` | function | SparkEngine | [SceneManager.cpp:L118](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L118) | | | `ReplaceFileAtomically` | function | SparkEngine | [SaveFileDurability.cpp:L357](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L357) | | | `ReplaceFirstAscii` | function | Tests | [Test_persistence_SaveSystem.cpp:L149](../../Tests/harden/Test_persistence_SaveSystem.cpp#L149) | | | `ReplaceLengthPrefixedString` | function | Tests | [Test_persistence_SaveSystem.cpp:L160](../../Tests/harden/Test_persistence_SaveSystem.cpp#L160) | | @@ -31853,7 +31922,7 @@ | `RequestCreateProject` | function | SparkEditor | [ProjectBrowserPanel.h:L79](../../SparkEditor/Source/Panels/ProjectBrowserPanel.h#L79) | | | `RequestDash` | function | GameModules | [PlatformerPlayerController.h:L150](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L150) | Queue a dash for the next fixed update. | | `RequestDedicatedServer` | function | SparkEngine | [PlayModeManager.h:L390](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L390) | Request a dedicated server to be spawned alongside PIE. | -| `RequestDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2187](../../SparkEditor/Source/Core/EditorUI.cpp#L2187) | | +| `RequestDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2207](../../SparkEditor/Source/Core/EditorUI.cpp#L2207) | | | `RequestDocumentTransition` | function | SparkEditor | [EditorUI.h:L449](../../SparkEditor/Source/Core/EditorUI.h#L449) | Atomically replace the edited document World. Clears the | | `requested` | function | SparkEditor | [BuildPipeline.cpp:L156](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L156) | | | `RequestExit` | function | SparkEditor | [EditorApplication.h:L85](../../SparkEditor/Source/Core/EditorApplication.h#L85) | Absolute path of the persisted window layout | @@ -31876,6 +31945,7 @@ | `RequestTileLoad` | function | SparkEditor | [LevelStreamingSystem.h:L178](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.h#L178) | Request tile loading | | `RequestTileUnload` | function | SparkEditor | [LevelStreamingSystem.h:L186](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.h#L186) | Request tile unloading | | `Require` | function | Tests | [TestAngelScriptStackAlignmentReal.cpp:L79](../../Tests/TestAngelScriptStackAlignmentReal.cpp#L79) | | +| `Require` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L23](../../Tests/TestFPSGameCameraReloadReal.cpp#L23) | | | `RequireActiveBackend` | function | Tests | [TestRHI240LinuxForwardPassReal.cpp:L521](../../Tests/TestRHI240LinuxForwardPassReal.cpp#L521) | | | `RequireBool` | function | SparkEngine | [SaveSystem.cpp:L385](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.cpp#L385) | | | `required` | function | SparkEngine | [GamePackager.h:L441](../../SparkEngine/Source/Engine/Build/GamePackager.h#L441) | | @@ -31886,6 +31956,8 @@ | `RequireKeys` | function | SparkEngine | [VisualScriptGraphIO.cpp:L55](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphIO.cpp#L55) | | | `RequireLavapipe` | function | Tests | [TestRHI230VulkanGoldenReal.cpp:L93](../../Tests/TestRHI230VulkanGoldenReal.cpp#L93) | | | `RequireLlvmpipe` | function | Tests | [TestRHI240OpenGLGoldenReal.cpp:L96](../../Tests/TestRHI240OpenGLGoldenReal.cpp#L96) | | +| `RequirePlainPath` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L28](../../Tests/TestFPSOwnedSaveDecode.cpp#L28) | | +| `RequirePrimaryOnly` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L44](../../Tests/TestFPSOwnedSaveDecode.cpp#L44) | | | `RequiresConfirmation` | function | SparkEditor | [EditorWorkflow.h:L101](../../SparkEditor/Source/Workflow/EditorWorkflow.h#L101) | True when the workflow performs destructive work (deleting directories). | | `RequireSodium` | function | GameModules | [TFCrypto.cpp:L66](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.cpp#L66) | | | `RequireSodium` | function | SparkEngine | [PasswordHash.cpp:L41](../../SparkEngine/Source/Utils/PasswordHash.cpp#L41) | | @@ -32060,9 +32132,9 @@ | `ResetNM` | function | Tests | [TestNetworkManagerEdgeCases.cpp:L166](../../Tests/TestNetworkManagerEdgeCases.cpp#L166) | | | `ResetNullStats` | function | SparkEngine | [NullRHIDevice.h:L360](../../SparkEngine/Source/Graphics/RHI/NullRHIDevice.h#L360) | | | `ResetOptimizerState` | function | SparkEngine | [CpuNeuralTraining.h:L188](../../SparkEngine/Source/Graphics/Neural/CpuNeuralTraining.h#L188) | Reset Adam step counter + moment buffers (e.g. after LR change). | -| `ResetOwned` | function | SparkEngine | [EngineContext.h:L141](../../SparkEngine/Source/Core/EngineContext.h#L141) | Reset the global EngineContext (shutdown only) | +| `ResetOwned` | function | SparkEngine | [EngineContext.h:L142](../../SparkEngine/Source/Core/EngineContext.h#L142) | Reset the global EngineContext (shutdown only) | | `ResetPassHistory` | function | SparkEngine | [GPUTimestampQuery.h:L361](../../SparkEngine/Source/Graphics/GPUTimestampQuery.h#L361) | Drop all completed samples for one named pass. | -| `ResetPinnedArtifactRoot` | function | SparkEngine | [CrashHandler.cpp:L145](../../SparkEngine/Source/Utils/CrashHandler.cpp#L145) | | +| `ResetPinnedArtifactRoot` | function | SparkEngine | [CrashHandler.cpp:L146](../../SparkEngine/Source/Utils/CrashHandler.cpp#L146) | | | `ResetPlatformRuntime` | function | GameModules | [PlatformerLevelSystem.h:L231](../../GameModules/SparkGamePlatformer/Source/Level/PlatformerLevelSystem.h#L231) | | | `ResetPlayerTransform` | function | Templates | [GameModule.h:L298](../../Templates/MMOStarter/Source/GameModule.h#L298) | | | `ResetPlayerTransform` | function | Templates | [GameModule.h:L362](../../Templates/MultiplayerArena/Source/GameModule.h#L362) | | @@ -32089,7 +32161,7 @@ | `ResetSequencer` | function | Tests | [TestSequencerReal.cpp:L13](../../Tests/TestSequencerReal.cpp#L13) | | | `ResetSession` | function | Templates | [GameModule.h:L207](../../Templates/MMOStarter/Source/GameModule.h#L207) | | | `ResetSessionState` | function | GameModules | [TFClientNet.h:L189](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L189) | | -| `ResetSingleton` | function | Tests | [TestAIIntegratedSystem.cpp:L29](../../Tests/TestAIIntegratedSystem.cpp#L29) | | +| `ResetSingleton` | function | Tests | [TestAIIntegratedSystem.cpp:L36](../../Tests/TestAIIntegratedSystem.cpp#L36) | | | `ResetSingleton` | function | Tests | [TestShaderHotReloadPhaseU.cpp:L64](../../Tests/TestShaderHotReloadPhaseU.cpp#L64) | | | `ResetState` | function | Tests | [TestConnectionScopeWiring.cpp:L30](../../Tests/TestConnectionScopeWiring.cpp#L30) | | | `ResetStatistics` | function | SparkEngine | [PacketValidator.h:L189](../../SparkEngine/Source/Engine/Networking/PacketValidator.h#L189) | | @@ -32162,19 +32234,19 @@ | `ResizeAllTargets` | function | SparkEngine | [RenderTarget.h:L288](../../SparkEngine/Source/Graphics/RenderTarget.h#L288) | | | `ResizeGPUResources` | function | SparkEngine | [GPUOcclusionCulling.h:L157](../../SparkEngine/Source/Graphics/GPUOcclusionCulling.h#L157) | Recreate GPU resources on render target resize | | `ResizeGPUResources` | function | SparkEngine | [ScreenSpaceEffects.h:L311](../../SparkEngine/Source/Graphics/ScreenSpaceEffects.h#L311) | Recreate GPU render targets after a window resize | -| `Resolve` | function | GameModules | [FPSAssetPaths.cpp:L141](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L141) | | +| `Resolve` | function | GameModules | [FPSAssetPaths.cpp:L155](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L155) | | | `Resolve` | function | GameModules | [FPSAssetPaths.h:L68](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L68) | Resolve a path expressed relative to the asset root. | | `Resolve` | function | SparkEditor | [EditorUI.h:L84](../../SparkEditor/Source/Core/EditorUI.h#L84) | | | `Resolve` | function | SparkEngine | [AngelScriptEngine.h:L789](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L789) | | | `Resolve` | function | SparkEngine | [OBJStaticMeshLoader.cpp:L141](../../SparkEngine/Source/Graphics/OBJStaticMeshLoader.cpp#L141) | | | `Resolve` | function | Tests | [TestAdversarialEngine.cpp:L101](../../Tests/TestAdversarialEngine.cpp#L101) | | | `Resolve` | function | Tests | [TestDocumentInterruptionReal.cpp:L539](../../Tests/TestDocumentInterruptionReal.cpp#L539) | | -| `Resolve` | function | Tests | [TestTF120Travel.cpp:L110](../../Tests/TestTF120Travel.cpp#L110) | | -| `ResolveAlias` | function | SparkConsole | [ConsoleApp.h:L122](../../SparkConsole/src/ConsoleApp.h#L122) | | +| `Resolve` | function | Tests | [TestTF120Travel.cpp:L97](../../Tests/TestTF120Travel.cpp#L97) | | +| `ResolveAlias` | function | SparkConsole | [ConsoleApp.h:L123](../../SparkConsole/src/ConsoleApp.h#L123) | | | `ResolveAlias` | function | Tests | [TestAdversarialEngine.cpp:L1233](../../Tests/TestAdversarialEngine.cpp#L1233) | | | `ResolveAlias` | function | Tests | [TestAdversarialEngine.cpp:L1240](../../Tests/TestAdversarialEngine.cpp#L1240) | | | `ResolveAliases` | function | SparkEngine | [SparkConsole.h:L269](../../SparkEngine/Source/Utils/SparkConsole.h#L269) | | -| `ResolveArea` | function | Tests | [TestTF120Travel.cpp:L174](../../Tests/TestTF120Travel.cpp#L174) | | +| `ResolveArea` | function | Tests | [TestTF120Travel.cpp:L161](../../Tests/TestTF120Travel.cpp#L161) | | | `ResolveAsset` | function | SparkEngine | [WorldBasicRenderer.h:L44](../../SparkEngine/Source/Graphics/WorldBasicRenderer.h#L44) | | | `ResolveAssetDiskPath` | function | SparkEditor | [BasicMaterialEditorPanel.h:L101](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L101) | Map an asset-relative texture path ("Textures/x.png" or "Assets/Textures/x.png") | | `ResolveAttack` | function | GameModules | [ARPGDemoEncounter.cpp:L338](../../GameModules/SparkGameARPG/Source/Demo/ARPGDemoEncounter.cpp#L338) | | @@ -32192,8 +32264,8 @@ | `ResolveContinent` | function | GameModules | [TFHandoffParticipant.h:L26](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.h#L26) | Game-thread pawn operations supplied by the live authoritative simulation. | | `ResolveContinent` | function | GameModules | [TFServerSim.h:L138](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L138) | Game-thread handoff callbacks; the host dispatcher serializes control requests with simulation. | | `ResolveContinent` | function | Tests | [TestTF120Migration.cpp:L48](../../Tests/TestTF120Migration.cpp#L48) | | -| `ResolveContinent` | function | Tests | [TestTF120Travel.cpp:L204](../../Tests/TestTF120Travel.cpp#L204) | | -| `ResolveContinent` | function | Tests | [TestTF120Travel.cpp:L248](../../Tests/TestTF120Travel.cpp#L248) | | +| `ResolveContinent` | function | Tests | [TestTF120Travel.cpp:L191](../../Tests/TestTF120Travel.cpp#L191) | | +| `ResolveContinent` | function | Tests | [TestTF120Travel.cpp:L235](../../Tests/TestTF120Travel.cpp#L235) | | | `ResolveContinentSelection` | function | GameModules | [TFDataTables.cpp:L101](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTables.cpp#L101) | | | `ResolveCrashArtifactBaseDirectory` | function | SparkEngine | [CrashArtifactDirectory.h:L320](../../SparkEngine/Source/Utils/CrashArtifactDirectory.h#L320) | | | `ResolveCrashReporterExecutable` | function | SparkEngine | [CrashHandlerSupport.h:L264](../../SparkEngine/Source/Utils/CrashHandlerSupport.h#L264) | Resolve the crash reporter from the trusted executable tree. | @@ -32272,14 +32344,14 @@ | `ResolveRootWide` | function | GameModules | [TFSavePaths.h:L241](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFSavePaths.h#L241) | | | `ResolveSaveDirectory` | function | SparkEngine | [EngineSettings.cpp:L961](../../SparkEngine/Source/Core/EngineSettings.cpp#L961) | | | `ResolveSaveDirectory` | function | SparkEngine | [EngineSettings.h:L83](../../SparkEngine/Source/Core/EngineSettings.h#L83) | | -| `ResolveScenePath` | function | GameModules | [FPSAssetPaths.cpp:L165](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L165) | | +| `ResolveScenePath` | function | GameModules | [FPSAssetPaths.cpp:L179](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L179) | | | `ResolveScenePath` | function | GameModules | [FPSAssetPaths.h:L86](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L86) | Resolve a user-provided scene name inside the trusted scene tree. | | `ResolveSenderLabel` | function | GameModules | [TFChatWindow.h:L73](../../GameModules/SparkGameMMOFPS/Source/UI/TFChatWindow.h#L73) | | | `ResolveSlotForModel` | function | GameModules | [TFViewModel.h:L102](../../GameModules/SparkGameMMOFPS/Source/Game/TFViewModel.h#L102) | | | `ResolveSpawnPos` | function | GameModules | [TFRedeployRules.cpp:L61](../../GameModules/SparkGameMMOFPS/Source/Game/TFRedeployRules.cpp#L61) | | | `ResolveSpawnPos` | function | GameModules | [TFRedeployRules.h:L56](../../GameModules/SparkGameMMOFPS/Source/Game/TFRedeployRules.h#L56) | | | `ResolveSpriteDraw` | function | SparkEngine | [WorldBasicRenderer.cpp:L52](../../SparkEngine/Source/Graphics/WorldBasicRenderer.cpp#L52) | | -| `ResolveStartupScene` | function | GameModules | [FPSAssetPaths.cpp:L102](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L102) | | +| `ResolveStartupScene` | function | GameModules | [FPSAssetPaths.cpp:L114](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L114) | | | `ResolveStartupScene` | function | GameModules | [FPSAssetPaths.h:L62](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L62) | Select the packaged startup scene beside the host executable. | | `ResolveStartupSplashConfig` | function | SparkEngine | [StartupSplash.cpp:L393](../../SparkEngine/Source/Core/StartupSplash.cpp#L393) | | | `ResolveSymbols` | function | SparkEngine | [StackTrace.h:L333](../../SparkEngine/Source/Utils/StackTrace.h#L333) | | @@ -32291,7 +32363,7 @@ | `ResolveTimeOfDay` | function | SparkEditor | [TimeOfDayPanel.cpp:L84](../../SparkEditor/Source/Panels/TimeOfDayPanel.cpp#L84) | | | `ResolveTimeOfDay` | function | SparkEditor | [TimeOfDayPanel.cpp:L89](../../SparkEditor/Source/Panels/TimeOfDayPanel.cpp#L89) | | | `ResolveUserDataPath` | function | SparkEngine | [GameplayLifecycleShared.cpp:L192](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L192) | | -| `ResolveUtf8` | function | GameModules | [FPSAssetPaths.cpp:L148](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L148) | | +| `ResolveUtf8` | function | GameModules | [FPSAssetPaths.cpp:L162](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L162) | | | `ResolveUtf8` | function | GameModules | [FPSAssetPaths.h:L75](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L75) | UTF-8 form of Resolve(), for APIs that take std::string paths. | | `ResolveVariantKey` | function | SparkEngine | [ShaderVariantSystem.h:L243](../../SparkEngine/Source/Graphics/ShaderVariantSystem.h#L243) | Resolve a material's keyword overrides into a final variant key | | `ResolveVelocity` | function | SparkEngine | [Physics2D.h:L387](../../SparkEngine/Source/Engine/2D/Physics2D.h#L387) | | @@ -32466,8 +32538,8 @@ | `Retire` | function | GameModules | [TFServerSim.h:L143](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L143) | Game-thread handoff callbacks; the host dispatcher serializes control requests with simulation. | | `Retire` | function | SparkEngine | [D3D12Types.h:L317](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L317) | | | `Retire` | function | Tests | [TestTF120Migration.cpp:L105](../../Tests/TestTF120Migration.cpp#L105) | | -| `Retire` | function | Tests | [TestTF120Travel.cpp:L232](../../Tests/TestTF120Travel.cpp#L232) | | -| `Retire` | function | Tests | [TestTF120Travel.cpp:L274](../../Tests/TestTF120Travel.cpp#L274) | | +| `Retire` | function | Tests | [TestTF120Travel.cpp:L219](../../Tests/TestTF120Travel.cpp#L219) | | +| `Retire` | function | Tests | [TestTF120Travel.cpp:L261](../../Tests/TestTF120Travel.cpp#L261) | | | `RetireDescriptorPages` | function | SparkEngine | [D3D12Types.h:L762](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L762) | Hands every descriptor page this list filled to the pool, reusable once | | `Retriangulate` | function | SparkEngine | [BlendSpace.h:L156](../../SparkEngine/Source/Engine/Animation/BlendSpace.h#L156) | Rebuild the Delaunay triangulation from current samples (logically const — lazy cache). | | `RetryDeferredSpoolPurges_GameThread` | function | SparkEngine | [Telemetry.h:L1156](../../SparkEngine/Source/Utils/Telemetry.h#L1156) | | @@ -32496,7 +32568,7 @@ | `RewindToTime` | function | SparkEngine | [NetworkManager.h:L430](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L430) | | | `RewindToTime` | function | Tests | [TestAdversarialEngine.cpp:L1712](../../Tests/TestAdversarialEngine.cpp#L1712) | | | `RewindToTime` | function | Tests | [TestLagCompensationIntegration.cpp:L54](../../Tests/TestLagCompensationIntegration.cpp#L54) | | -| `RewirePanelsToWorld` | function | SparkEditor | [EditorUI.h:L477](../../SparkEditor/Source/Core/EditorUI.h#L477) | Re-point the panels that cache a raw ::World | +| `RewirePanelsToWorld` | function | SparkEditor | [EditorUI.h:L475](../../SparkEditor/Source/Core/EditorUI.h#L475) | Wire document-backed panels to the current World and EditorUI. | | `Rewrite` | function | Tests | [TestMOD300ShowcaseLocalizationReal.cpp:L61](../../Tests/TestMOD300ShowcaseLocalizationReal.cpp#L61) | | | `Rewrite` | function | Tests | [TestMOD390VisualScriptDiagnosticsReal.cpp:L98](../../Tests/TestMOD390VisualScriptDiagnosticsReal.cpp#L98) | | | `Rewrite` | function | Tests | [TestMOD390VisualScriptHotReloadReal.cpp:L96](../../Tests/TestMOD390VisualScriptHotReloadReal.cpp#L96) | | @@ -32504,7 +32576,7 @@ | `rgba` | function | SparkEngine | [GraphicsConsoleOpsWindowsDiagnostics.cpp:L166](../../SparkEngine/Source/Graphics/GraphicsConsoleOpsWindowsDiagnostics.cpp#L166) | | | `rgba` | function | SparkEngine | [TextureCompressor.cpp:L223](../../SparkEngine/Source/Graphics/TextureCompressor.cpp#L223) | | | `rgba` | function | SparkEngine | [GoldenImagePng.h:L275](../../SparkEngine/Source/Utils/GoldenImagePng.h#L275) | | -| `rgba` | function | Tests | [TestAssetParserHardening.cpp:L211](../../Tests/TestAssetParserHardening.cpp#L211) | | +| `rgba` | function | Tests | [TestAssetParserHardening.cpp:L227](../../Tests/TestAssetParserHardening.cpp#L227) | | | `rgba` | function | Tests | [TestGoldenImageTest.cpp:L415](../../Tests/TestGoldenImageTest.cpp#L415) | | | `rgba` | function | Tests | [TestTextureCompressorPhaseGG.cpp:L69](../../Tests/TestTextureCompressorPhaseGG.cpp#L69) | | | `rgba` | function | Tests | [TestTextureStexBoundsReal.cpp:L97](../../Tests/TestTextureStexBoundsReal.cpp#L97) | | @@ -32727,7 +32799,7 @@ | `RolloverIfNeeded` | function | GameModules | [TFOutfitSystem.h:L220](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L220) | | | `RolloverWeek` | function | GameModules | [TFOutfitStore.h:L144](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFOutfitStore.h#L144) | | | `RollRarity` | function | GameModules | [ARPGLootSystem.h:L91](../../GameModules/SparkGameARPG/Source/Loot/ARPGLootSystem.h#L91) | Keep future item IDs above @p itemId so a restored item never shares an ID with a new drop. | -| `Root` | function | GameModules | [FPSAssetPaths.cpp:L75](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L75) | | +| `Root` | function | GameModules | [FPSAssetPaths.cpp:L83](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L83) | | | `Root` | function | GameModules | [FPSAssetPaths.h:L49](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L49) | The resolved asset root, computed once per process. A packaged | | `Root` | function | GameModules | [TFSavePaths.h:L233](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFSavePaths.h#L233) | | | `root` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L371](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L371) | | @@ -32754,6 +32826,7 @@ | `root` | function | Tests | [TestLifecycleCompositionRootFailure.cpp:L420](../../Tests/TestLifecycleCompositionRootFailure.cpp#L420) | | | `root` | function | Tests | [TestMOD300ShowcaseLocalizationReal.cpp:L121](../../Tests/TestMOD300ShowcaseLocalizationReal.cpp#L121) | | | `Root` | function | Tests | [TestSceneSaveConfinedReal.cpp:L82](../../Tests/TestSceneSaveConfinedReal.cpp#L82) | | +| `root` | function | Tests | [TestTFRegionLattice.cpp:L69](../../Tests/TestTFRegionLattice.cpp#L69) | | | `Root` | function | Tests | [TestTelemetrySpool.cpp:L46](../../Tests/TestTelemetrySpool.cpp#L46) | | | `root` | function | Tests | [TestUILayoutExtensions.cpp:L359](../../Tests/TestUILayoutExtensions.cpp#L359) | | | `root` | function | Tests | [TestUILayoutExtensions.cpp:L387](../../Tests/TestUILayoutExtensions.cpp#L387) | | @@ -32761,10 +32834,10 @@ | `root` | function | Tests | [TestUILayoutExtensions.cpp:L404](../../Tests/TestUILayoutExtensions.cpp#L404) | | | `root` | function | Tests | [TestUILayoutExtensions.cpp:L414](../../Tests/TestUILayoutExtensions.cpp#L414) | | | `root` | function | Tests | [TestUILayoutExtensions.cpp:L427](../../Tests/TestUILayoutExtensions.cpp#L427) | | -| `RootExists` | function | GameModules | [FPSAssetPaths.cpp:L96](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L96) | | +| `RootExists` | function | GameModules | [FPSAssetPaths.cpp:L108](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L108) | | | `RootExists` | function | GameModules | [FPSAssetPaths.h:L52](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L52) | True when Root() actually exists on disk. | | `RootUtf8` | function | Tests | [TestRHI210D3D11FrameGoldenReal.cpp:L253](../../Tests/TestRHI210D3D11FrameGoldenReal.cpp#L253) | | -| `rootUtf8` | function | Tests | [TestTFDataTables.cpp:L596](../../Tests/TestTFDataTables.cpp#L596) | | +| `rootUtf8` | function | Tests | [TestTFDataTables.cpp:L587](../../Tests/TestTFDataTables.cpp#L587) | | | `Roster` | function | GameModules | [TFSocialSystem.h:L101](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L101) | | | `RosterFactionOf` | function | GameModules | [TFSocialSystem.h:L92](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L92) | | | `RosterNameOf` | function | GameModules | [TFSocialPanel.h:L54](../../GameModules/SparkGameMMOFPS/Source/UI/TFSocialPanel.h#L54) | | @@ -33180,11 +33253,11 @@ | `Run` | function | Tests | [TestBenchmarkFramework.cpp:L34](../../Tests/TestBenchmarkFramework.cpp#L34) | | | `Run` | function | Tests | [TestFramework.h:L160](../../Tests/TestFramework.h#L160) | | | `Run` | function | Tests | [TestMOD340PlatformerCompletionReal.cpp:L73](../../Tests/TestMOD340PlatformerCompletionReal.cpp#L73) | | -| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L629](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L629) | | -| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L668](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L668) | | -| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L733](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L733) | | -| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L778](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L778) | | -| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L815](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L815) | | +| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L672](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L672) | | +| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L711](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L711) | | +| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L776](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L776) | | +| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L821](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L821) | | +| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L858](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L858) | | | `Run` | function | Tests | [TestNetImpairmentWiring.cpp:L55](../../Tests/TestNetImpairmentWiring.cpp#L55) | | | `run` | function | Tests | [TestSecDaemonPipeIdentity.cpp:L185](../../Tests/TestSecDaemonPipeIdentity.cpp#L185) | | | `run` | function | Tests | [TestSecDaemonPipeIdentity.cpp:L204](../../Tests/TestSecDaemonPipeIdentity.cpp#L204) | | @@ -33211,9 +33284,9 @@ | `RunCollabServer` | function | SparkEditor | [main.cpp:L164](../../SparkEditor/Source/main.cpp#L164) | Run as a headless collaborative editing server (no GUI). | | `RunCollabServer` | function | SparkEditor | [main.cpp:L357](../../SparkEditor/Source/main.cpp#L357) | | | `RunCommand` | function | SparkEditor | [BuildPipeline.h:L166](../../SparkEditor/Source/Panels/BuildPipeline.h#L166) | | -| `RunCompletionOwnedDestructionTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L493](../../SparkBuild/tests/ProcessRunnerTests.cpp#L493) | | -| `RunCompletionReentryTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L427](../../SparkBuild/tests/ProcessRunnerTests.cpp#L427) | | -| `RunCookChild` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L44](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L44) | | +| `RunCompletionOwnedDestructionTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L488](../../SparkBuild/tests/ProcessRunnerTests.cpp#L488) | | +| `RunCompletionReentryTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L425](../../SparkBuild/tests/ProcessRunnerTests.cpp#L425) | | +| `RunCookChild` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L46](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L46) | | | `RunCrashChild` | function | Tests | [TestDATA120BackupRestore.cpp:L539](../../Tests/TestDATA120BackupRestore.cpp#L539) | | | `RunCrashPolicyProbe` | function | Tests | [TestCrashHandlerGatingReal.cpp:L405](../../Tests/TestCrashHandlerGatingReal.cpp#L405) | | | `RunCrashReporter` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1607](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1607) | | @@ -33237,7 +33310,7 @@ | `RunFolderPicker` | function | SparkEditor | [FolderDialog.cpp:L28](../../SparkEditor/Source/Utils/FolderDialog.cpp#L28) | | | `RunFolderPicker` | function | SparkEditor | [VersionControlRender.cpp:L25](../../SparkEditor/Source/VersionControl/VersionControlRender.cpp#L25) | | | `RunFrame` | function | Tests | [Test_ecs_ai_pathfollow.cpp:L66](../../Tests/harden/Test_ecs_ai_pathfollow.cpp#L66) | | -| `RunFrameInputStep` | function | Tests | [TestInputFrameEdgesReal.cpp:L31](../../Tests/TestInputFrameEdgesReal.cpp#L31) | | +| `RunFrameInputStep` | function | Tests | [TestInputFrameEdgesReal.cpp:L35](../../Tests/TestInputFrameEdgesReal.cpp#L35) | | | `RunFrames` | function | Tests | [TestServerLiveMockClient.cpp:L87](../../Tests/TestServerLiveMockClient.cpp#L87) | | | `RunFreshInstallBuildFailureResumeTest` | function | SparkInstaller | [InstallerTransactionTests.cpp:L1134](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L1134) | | | `RunFreshInstallCloneFailureTest` | function | SparkInstaller | [InstallerTransactionTests.cpp:L1105](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L1105) | | @@ -33280,13 +33353,13 @@ | `RunOpenGLEngine` | function | Tests | [TestRHI240LinuxForwardPassReal.cpp:L539](../../Tests/TestRHI240LinuxForwardPassReal.cpp#L539) | | | `RunOrchestrator` | function | SparkEditor | [ServiceTopologyPanel.h:L28](../../SparkEditor/Source/Panels/ServiceTopologyPanel.h#L28) | | | `RunOversizedMarkerRejectedBeforeParsingTest` | function | SparkInstaller | [InstallStateTests.cpp:L158](../../SparkInstaller/tests/InstallStateTests.cpp#L158) | | -| `RunPackagedScene` | function | Tests | [TestEditorCookPackageReal.cpp:L194](../../Tests/TestEditorCookPackageReal.cpp#L194) | | +| `RunPackagedScene` | function | Tests | [TestEditorCookPackageReal.cpp:L196](../../Tests/TestEditorCookPackageReal.cpp#L196) | | | `RunPathPinTest` | function | SparkBuild | [DownloaderTests.cpp:L368](../../SparkBuild/tests/DownloaderTests.cpp#L368) | | | `RunPendingMarkerRoundTripAndBoundTest` | function | SparkInstaller | [InstallStateTests.cpp:L327](../../SparkInstaller/tests/InstallStateTests.cpp#L327) | | | `RunPlan` | function | SparkBuild | [main.cpp:L91](../../SparkBuild/src/main.cpp#L91) | | | `RunPlan` | function | SparkBuild | [main.cpp:L198](../../SparkBuild/src/main.cpp#L198) | | | `RunPlantedLinkTest` | function | SparkInstaller | [PortableGitCacheTests.cpp:L301](../../SparkInstaller/tests/PortableGitCacheTests.cpp#L301) | | -| `RunPlantedToolSearchTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L615](../../SparkBuild/tests/ProcessRunnerTests.cpp#L615) | | +| `RunPlantedToolSearchTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L608](../../SparkBuild/tests/ProcessRunnerTests.cpp#L608) | | | `RunPortableGitCacheTests` | function | SparkInstaller | [GitContractTests.cpp:L23](../../SparkInstaller/tests/GitContractTests.cpp#L23) | | | `RunPortableGitCacheTests` | function | SparkInstaller | [PortableGitCacheTests.cpp:L351](../../SparkInstaller/tests/PortableGitCacheTests.cpp#L351) | | | `RunPortableZipExtractionTest` | function | SparkBuild | [DownloaderTests.cpp:L452](../../SparkBuild/tests/DownloaderTests.cpp#L452) | | @@ -33317,7 +33390,7 @@ | `RunScriptedDrive` | function | Tests | [TestMOD380VehiclePhysicsReal.cpp:L232](../../Tests/TestMOD380VehiclePhysicsReal.cpp#L232) | | | `RunScriptedSkirmish` | function | Tests | [TestMOD370SkirmishDeterminismReal.cpp:L115](../../Tests/TestMOD370SkirmishDeterminismReal.cpp#L115) | | | `RunSDL2MainLoop` | function | SparkEngine | [SparkEngineLinuxInternal.h:L85](../../SparkEngine/Source/Core/SparkEngineLinuxInternal.h#L85) | Run the SDL2 event pump and per-frame engine tick loop. | -| `RunSDL2MainLoop` | function | SparkEngine | [SparkEngineLinuxSDL2Events.cpp:L171](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2Events.cpp#L171) | | +| `RunSDL2MainLoop` | function | SparkEngine | [SparkEngineLinuxSDL2Events.cpp:L173](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2Events.cpp#L173) | | | `RunSDL2Windowed` | function | SparkEngine | [SparkEngineLinuxInternal.h:L88](../../SparkEngine/Source/Core/SparkEngineLinuxInternal.h#L88) | Run the engine in SDL2 windowed mode (Linux). | | `RunSDL2Windowed` | function | SparkEngine | [SparkEngineLinuxSDL2.cpp:L166](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2.cpp#L166) | Run the engine in SDL2 windowed mode (Linux). | | `RunServer` | function | Tests | [FPSLANLoopbackPeer.cpp:L579](../../Tests/Fixtures/FPSLANLoopbackPeer.cpp#L579) | | @@ -33335,7 +33408,7 @@ | `RunStateSizeAndEncodingBoundTest` | function | SparkInstaller | [InstallStateTests.cpp:L273](../../SparkInstaller/tests/InstallStateTests.cpp#L273) | | | `RunStatsCommand` | function | SparkEngine | [DaemonLifecycle.cpp:L85](../../SparkEngine/Source/Utils/DaemonLifecycle.cpp#L85) | | | `RunSync` | function | SparkBuild | [ProcessRunner.h:L34](../../SparkBuild/src/ProcessRunner.h#L34) | | -| `RunSyncBinaryOutputTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L533](../../SparkBuild/tests/ProcessRunnerTests.cpp#L533) | | +| `RunSyncBinaryOutputTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L526](../../SparkBuild/tests/ProcessRunnerTests.cpp#L526) | | | `RunTeardown` | function | SparkEngine | [LifecycleCompositionRoot.h:L126](../../SparkEngine/Source/Core/Lifecycle/LifecycleCompositionRoot.h#L126) | | | `RuntimeAbiMismatchDiagnostic` | function | Tests | [TestModuleVersion.cpp:L100](../../Tests/TestModuleVersion.cpp#L100) | | | `runtimeAdapter` | function | SparkEngine | [DedicatedServer.cpp:L41](../../SparkEngine/Source/Engine/Networking/DedicatedServer.cpp#L41) | | @@ -33344,7 +33417,7 @@ | `RuntimePrefab::Serialize` | method | SparkEngine | [RuntimePrefab.h:L218](../../SparkEngine/Source/Engine/ECS/RuntimePrefab.h#L218) | Simple asset file header written before prefab data. | | `RuntimeSupportMessage` | function | GameModules | [VisualScriptDemoRuntime.h:L51](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoRuntime.h#L51) | | | `RunToResults` | function | Tests | [TestMOD380RacingCompleteRaceReal.cpp:L86](../../Tests/TestMOD380RacingCompleteRaceReal.cpp#L86) | | -| `RunTravelSourcePeer` | function | Tests | [TestTF120Travel.cpp:L347](../../Tests/TestTF120Travel.cpp#L347) | | +| `RunTravelSourcePeer` | function | Tests | [TestTF120Travel.cpp:L334](../../Tests/TestTF120Travel.cpp#L334) | | | `RunUniqueReservationTest` | function | SparkBuild | [DownloaderTests.cpp:L68](../../SparkBuild/tests/DownloaderTests.cpp#L68) | | | `RunUnverifiedTreeRepairTest` | function | SparkInstaller | [PortableGitCacheTests.cpp:L161](../../SparkInstaller/tests/PortableGitCacheTests.cpp#L161) | | | `RunUpdate` | function | SparkEngine | [LifecycleCompositionRoot.h:L95](../../SparkEngine/Source/Core/Lifecycle/LifecycleCompositionRoot.h#L95) | Update every stage; a no-op once the root is Failed or shut down. | @@ -33406,10 +33479,10 @@ | `SameFloat` | function | Tests | [TestPrefabCompatibility.cpp:L113](../../Tests/TestPrefabCompatibility.cpp#L113) | | | `SameFloat` | function | Tests | [TestPrefabCompatibility.cpp:L119](../../Tests/TestPrefabCompatibility.cpp#L119) | | | `SameFloat` | function | Tests | [TestPrefabCompatibility.cpp:L124](../../Tests/TestPrefabCompatibility.cpp#L124) | | -| `SameGraph` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L120](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L120) | | +| `SameGraph` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L121](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L121) | | | `SameIdentity` | function | SparkCrashReporter | [CrashReporterApp.cpp:L682](../../SparkCrashReporter/src/CrashReporterApp.cpp#L682) | | | `SameIdentity` | function | SparkCrashReporter | [CrashReporterApp.cpp:L917](../../SparkCrashReporter/src/CrashReporterApp.cpp#L917) | | -| `SameInode` | function | SparkEngine | [SceneManager.cpp:L402](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L402) | | +| `SameInode` | function | SparkEngine | [SceneManager.cpp:L446](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L446) | | | `SamePath` | function | SparkEditor | [EditorLaunchContext.h:L66](../../SparkEditor/Source/Utils/EditorLaunchContext.h#L66) | | | `SamePluginFile` | function | SparkEngine | [DynamicPluginHost.cpp:L322](../../SparkEngine/Source/Core/DynamicPluginHost.cpp#L322) | | | `SamePrefab` | function | Tests | [TestPrefabCompatibility.cpp:L133](../../Tests/TestPrefabCompatibility.cpp#L133) | | @@ -33511,6 +33584,7 @@ | `SaveCurrentLayoutToFile` | function | SparkEditor | [EditorWindowManager.h:L127](../../SparkEditor/Source/Core/EditorWindowManager.h#L127) | Save the current layout to a file path | | `SaveCurrentScene` | function | SparkEditor | [EditorUI.h:L272](../../SparkEditor/Source/Core/EditorUI.h#L272) | Get the editor's GraphicsEngine, attached to the editor's own | | `saved` | function | SparkEngine | [GraphicsDeferredLightingWindows.cpp:L210](../../SparkEngine/Source/Graphics/GraphicsDeferredLightingWindows.cpp#L210) | | +| `saved` | function | Tests | [TestEditorSubsystemsReal.cpp:L799](../../Tests/TestEditorSubsystemsReal.cpp#L799) | | | `savedCustom` | function | Tests | [TestEditorSubsystems.cpp:L1142](../../Tests/TestEditorSubsystems.cpp#L1142) | | | `savedLegacy` | function | Tests | [TestEditorSubsystems.cpp:L1129](../../Tests/TestEditorSubsystems.cpp#L1129) | | | `SaveDoc` | function | SparkEditor | [BasicMaterialEditorPanel.h:L90](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L90) | | @@ -33524,7 +33598,7 @@ | `SaveInstallState` | function | SparkInstaller | [InstallerTransactionTests.cpp:L417](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L417) | | | `SaveInventory` | function | GameModules | [MMOPersistenceSystem.h:L287](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.h#L287) | | | `SaveJSON` | function | SparkEditor | [SceneSerializer.h:L184](../../SparkEditor/Source/SceneSystem/SceneSerializer.h#L184) | Save scene in JSON format | -| `SaveJSON` | function | SparkEngine | [SceneManager.h:L512](../../SparkEngine/Source/SceneManager/SceneManager.h#L512) | Serialize the current scene to versioned line-oriented text. | +| `SaveJSON` | function | SparkEngine | [SceneManager.h:L514](../../SparkEngine/Source/SceneManager/SceneManager.h#L514) | Serialize the current scene to versioned line-oriented text. | | `SaveLayout` | function | SparkEditor | [EditorUI.h:L222](../../SparkEditor/Source/Core/EditorUI.h#L222) | | | `SaveLayout` | function | SparkEditor | [EditorWindowManager.h:L113](../../SparkEditor/Source/Core/EditorWindowManager.h#L113) | Save the current layout under a name | | `SaveLayout` | function | Tests | [TestEditorWindowManager.cpp:L46](../../Tests/TestEditorWindowManager.cpp#L46) | | @@ -33573,11 +33647,11 @@ | `SaveScene` | function | SparkEditor | [SceneManager.h:L46](../../SparkEditor/Source/SceneSystem/SceneManager.h#L46) | Save the current scene to disk. | | `SaveScene` | function | SparkEditor | [SceneSerializer.cpp:L148](../../SparkEditor/Source/SceneSystem/SceneSerializer.cpp#L148) | | | `SaveScene` | function | SparkEditor | [SceneSerializer.h:L84](../../SparkEditor/Source/SceneSystem/SceneSerializer.h#L84) | | -| `SaveScene` | function | SparkEngine | [SceneManager.h:L190](../../SparkEngine/Source/SceneManager/SceneManager.h#L190) | Serialize the current scene to the versioned text format. | -| `SaveSceneWithinRoot` | function | SparkEngine | [SceneManager.h:L212](../../SparkEngine/Source/SceneManager/SceneManager.h#L212) | | +| `SaveScene` | function | SparkEngine | [SceneManager.h:L192](../../SparkEngine/Source/SceneManager/SceneManager.h#L192) | Serialize the current scene to the versioned text format. | +| `SaveSceneWithinRoot` | function | SparkEngine | [SceneManager.h:L214](../../SparkEngine/Source/SceneManager/SceneManager.h#L214) | | | `SaveScreenshot` | function | SparkEngine | [GraphicsEngine.h:L699](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L699) | Save screenshot | -| `SaveScreenshot` | function | SparkEngine | [CrashHandler.cpp:L827](../../SparkEngine/Source/Utils/CrashHandler.cpp#L827) | | -| `SaveScreenshot` | function | SparkEngine | [CrashHandler.cpp:L1540](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1540) | | +| `SaveScreenshot` | function | SparkEngine | [CrashHandler.cpp:L828](../../SparkEngine/Source/Utils/CrashHandler.cpp#L828) | | +| `SaveScreenshot` | function | SparkEngine | [CrashHandler.cpp:L1541](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1541) | | | `SaveSelectionGroup` | function | SparkEditor | [SelectionManager.h:L461](../../SparkEditor/Source/Panels/SelectionManager.h#L461) | Save current selection as a named group | | `SaveSlot` | function | Tests | [TestMOD350RPGQuestSliceReal.cpp:L217](../../Tests/TestMOD350RPGQuestSliceReal.cpp#L217) | | | `SaveSnapshot` | function | SparkEngine | [AudioMixer.h:L339](../../SparkEngine/Source/Audio/AudioMixer.h#L339) | Save current mixer state as a named snapshot. | @@ -33632,8 +33706,8 @@ | `SaveSystemPanel::System` | method | SparkEditor | [SaveSystemPanel.cpp:L51](../../SparkEditor/Source/Panels/SaveSystemPanel.cpp#L51) | | | `SaveSystemPanel::Update` | method | SparkEditor | [SaveSystemPanel.cpp:L71](../../SparkEditor/Source/Panels/SaveSystemPanel.cpp#L71) | | | `SaveTerrain` | function | SparkEditor | [TerrainEditor.h:L34](../../SparkEditor/Source/Terrain/TerrainEditor.h#L34) | | -| `SaveTextWithinRoot` | function | SparkEngine | [SceneManager.cpp:L278](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L278) | | -| `SaveTextWithinRoot` | function | SparkEngine | [SceneManager.cpp:L409](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L409) | | +| `SaveTextWithinRoot` | function | SparkEngine | [SceneManager.cpp:L304](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L304) | | +| `SaveTextWithinRoot` | function | SparkEngine | [SceneManager.cpp:L453](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L453) | | | `SaveToCloud` | function | SparkEngine | [OnlineServices.h:L178](../../SparkEngine/Source/Engine/OnlineServices/OnlineServices.h#L178) | | | `SaveToCloud` | function | SparkEngine | [OnlineServices.h:L334](../../SparkEngine/Source/Engine/OnlineServices/OnlineServices.h#L334) | | | `SaveToCloud` | function | SparkEngine | [OnlineServices.h:L498](../../SparkEngine/Source/Engine/OnlineServices/OnlineServices.h#L498) | | @@ -33699,12 +33773,12 @@ | `ScanWithinLimits` | function | SparkEngine | [JsonUtils.h:L387](../../SparkEngine/Source/Utils/JsonUtils.h#L387) | | | `ScatterLight` | function | SparkEngine | [FroxelVolumetricFog.h:L154](../../SparkEngine/Source/Graphics/FroxelVolumetricFog.h#L154) | Pass 2: Evaluate light scattering per froxel | | `scenario` | function | Tests | [assets.cpp:L14](../../Tests/PackageSmoke/FPSProgression/assets.cpp#L14) | | -| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L467](../../Tests/TestEditorCookPackageReal.cpp#L467) | | -| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L474](../../Tests/TestEditorCookPackageReal.cpp#L474) | | -| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L484](../../Tests/TestEditorCookPackageReal.cpp#L484) | | -| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L501](../../Tests/TestEditorCookPackageReal.cpp#L501) | | -| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L515](../../Tests/TestEditorCookPackageReal.cpp#L515) | | -| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L527](../../Tests/TestEditorCookPackageReal.cpp#L527) | | +| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L478](../../Tests/TestEditorCookPackageReal.cpp#L478) | | +| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L485](../../Tests/TestEditorCookPackageReal.cpp#L485) | | +| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L495](../../Tests/TestEditorCookPackageReal.cpp#L495) | | +| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L525](../../Tests/TestEditorCookPackageReal.cpp#L525) | | +| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L540](../../Tests/TestEditorCookPackageReal.cpp#L540) | | +| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L552](../../Tests/TestEditorCookPackageReal.cpp#L552) | | | `scene` | function | GameModules | [HeadlessArena.cpp:L39](../../GameModules/SparkGameFPS/Source/Core/HeadlessArena.cpp#L39) | | | `scene` | function | Tests | [TestAssetManifestReal.cpp:L259](../../Tests/TestAssetManifestReal.cpp#L259) | | | `scene` | function | Tests | [TestMOD310FPSSceneReloadRespawnReal.cpp:L73](../../Tests/TestMOD310FPSSceneReloadRespawnReal.cpp#L73) | | @@ -33715,8 +33789,9 @@ | `scene` | function | Tests | [TestRHI225D3D12ValidationReal.cpp:L308](../../Tests/TestRHI225D3D12ValidationReal.cpp#L308) | | | `scene` | function | Tests | [TestRHI225D3D12ValidationReal.cpp:L328](../../Tests/TestRHI225D3D12ValidationReal.cpp#L328) | | | `scene` | function | Tests | [TestRHI225D3D12ValidationReal.cpp:L362](../../Tests/TestRHI225D3D12ValidationReal.cpp#L362) | | -| `scene` | function | Tests | [TestSceneManagerReflectedReal.cpp:L71](../../Tests/TestSceneManagerReflectedReal.cpp#L71) | | -| `scene` | function | Tests | [TestSceneManagerReflectedReal.cpp:L103](../../Tests/TestSceneManagerReflectedReal.cpp#L103) | | +| `scene` | function | Tests | [TestSceneManagerReflectedReal.cpp:L96](../../Tests/TestSceneManagerReflectedReal.cpp#L96) | | +| `scene` | function | Tests | [TestSceneManagerReflectedReal.cpp:L128](../../Tests/TestSceneManagerReflectedReal.cpp#L128) | | +| `scene` | function | Tests | [TestSceneManagerReflectedReal.cpp:L160](../../Tests/TestSceneManagerReflectedReal.cpp#L160) | | | `scene` | function | Tests | [TestSceneManagerUnicodeReal.cpp:L90](../../Tests/TestSceneManagerUnicodeReal.cpp#L90) | | | `scene` | function | Tests | [TestSceneSaveConfinedReal.cpp:L117](../../Tests/TestSceneSaveConfinedReal.cpp#L117) | | | `scene` | function | Tests | [TestSceneSaveConfinedReal.cpp:L148](../../Tests/TestSceneSaveConfinedReal.cpp#L148) | | @@ -33757,35 +33832,35 @@ | `SceneImportPanel::ScanSceneFiles` | method | SparkEditor | [SceneImportPanel.cpp:L80](../../SparkEditor/Source/Panels/SceneImportPanel.cpp#L80) | | | `SceneImportPanel::Shutdown` | method | SparkEditor | [SceneImportPanel.cpp:L71](../../SparkEditor/Source/Panels/SceneImportPanel.cpp#L71) | | | `SceneImportPanel::Update` | method | SparkEditor | [SceneImportPanel.cpp:L69](../../SparkEditor/Source/Panels/SceneImportPanel.cpp#L69) | | -| `SceneManager::AddNode` | method | SparkEngine | [SceneManager.cpp:L714](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L714) | | -| `SceneManager::Clear` | method | SparkEngine | [SceneManager.cpp:L837](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L837) | | -| `SceneManager::Console_GetNodeInfo` | method | SparkEngine | [SceneManager.cpp:L1201](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1201) | | -| `SceneManager::Console_ListNodes` | method | SparkEngine | [SceneManager.cpp:L1182](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1182) | | -| `SceneManager::Console_MoveNode` | method | SparkEngine | [SceneManager.cpp:L1219](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1219) | | -| `SceneManager::Console_RenameNode` | method | SparkEngine | [SceneManager.cpp:L1229](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1229) | | +| `SceneManager::AddNode` | method | SparkEngine | [SceneManager.cpp:L788](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L788) | | +| `SceneManager::Clear` | method | SparkEngine | [SceneManager.cpp:L925](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L925) | | +| `SceneManager::Console_GetNodeInfo` | method | SparkEngine | [SceneManager.cpp:L1339](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1339) | | +| `SceneManager::Console_ListNodes` | method | SparkEngine | [SceneManager.cpp:L1318](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1318) | | +| `SceneManager::Console_MoveNode` | method | SparkEngine | [SceneManager.cpp:L1359](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1359) | | +| `SceneManager::Console_RenameNode` | method | SparkEngine | [SceneManager.cpp:L1371](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1371) | | | `SceneManager::CreateNewScene` | method | SparkEditor | [SceneManager.cpp:L40](../../SparkEditor/Source/SceneSystem/SceneManager.cpp#L40) | | -| `SceneManager::FindNode` | method | SparkEngine | [SceneManager.cpp:L816](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L816) | | -| `SceneManager::GetAvailableScenes` | method | SparkEngine | [SceneManager.cpp:L858](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L858) | | -| `SceneManager::GetNode` | method | SparkEngine | [SceneManager.cpp:L802](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L802) | | -| `SceneManager::GetNode` | method | SparkEngine | [SceneManager.cpp:L809](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L809) | | -| `SceneManager::GetObjects` | method | SparkEngine | [SceneManager.cpp:L500](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L500) | | -| `SceneManager::GetRootNodes` | method | SparkEngine | [SceneManager.cpp:L791](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L791) | | +| `SceneManager::FindNode` | method | SparkEngine | [SceneManager.cpp:L902](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L902) | | +| `SceneManager::GetAvailableScenes` | method | SparkEngine | [SceneManager.cpp:L946](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L946) | | +| `SceneManager::GetNode` | method | SparkEngine | [SceneManager.cpp:L884](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L884) | | +| `SceneManager::GetNode` | method | SparkEngine | [SceneManager.cpp:L893](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L893) | | +| `SceneManager::GetObjects` | method | SparkEngine | [SceneManager.cpp:L558](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L558) | | +| `SceneManager::GetRootNodes` | method | SparkEngine | [SceneManager.cpp:L871](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L871) | | | `SceneManager::Initialize` | method | SparkEditor | [SceneManager.cpp:L22](../../SparkEditor/Source/SceneSystem/SceneManager.cpp#L22) | | -| `SceneManager::InstantiateNodes` | method | SparkEngine | [SceneManager.cpp:L970](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L970) | | -| `SceneManager::LoadCustom` | method | SparkEngine | [SceneManager.cpp:L1076](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1076) | | -| `SceneManager::LoadJSON` | method | SparkEngine | [SceneManager.cpp:L884](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L884) | | -| `SceneManager::LoadReflected` | method | SparkEngine | [SceneManagerReflected.cpp:L16](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L16) | | +| `SceneManager::InstantiateNodes` | method | SparkEngine | [SceneManager.cpp:L1072](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1072) | | +| `SceneManager::LoadCustom` | method | SparkEngine | [SceneManager.cpp:L1192](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1192) | | +| `SceneManager::LoadJSON` | method | SparkEngine | [SceneManager.cpp:L976](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L976) | | +| `SceneManager::LoadReflected` | method | SparkEngine | [SceneManagerReflected.cpp:L18](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L18) | | | `SceneManager::LoadScene` | method | SparkEditor | [SceneManager.cpp:L126](../../SparkEditor/Source/SceneSystem/SceneManager.cpp#L126) | | -| `SceneManager::LoadScene` | method | SparkEngine | [SceneManager.cpp:L509](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L509) | | -| `SceneManager::LoadSceneAsync` | method | SparkEngine | [SceneManager.cpp:L683](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L683) | | -| `SceneManager::NewScene` | method | SparkEngine | [SceneManager.cpp:L829](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L829) | | -| `SceneManager::RemoveNode` | method | SparkEngine | [SceneManager.cpp:L737](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L737) | | -| `SceneManager::SaveJSON` | method | SparkEngine | [SceneManager.cpp:L939](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L939) | | +| `SceneManager::LoadScene` | method | SparkEngine | [SceneManager.cpp:L567](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L567) | | +| `SceneManager::LoadSceneAsync` | method | SparkEngine | [SceneManager.cpp:L755](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L755) | | +| `SceneManager::NewScene` | method | SparkEngine | [SceneManager.cpp:L917](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L917) | | +| `SceneManager::RemoveNode` | method | SparkEngine | [SceneManager.cpp:L811](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L811) | | +| `SceneManager::SaveJSON` | method | SparkEngine | [SceneManager.cpp:L1037](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1037) | | | `SceneManager::SaveScene` | method | SparkEditor | [SceneManager.cpp:L150](../../SparkEditor/Source/SceneSystem/SceneManager.cpp#L150) | | -| `SceneManager::SaveScene` | method | SparkEngine | [SceneManager.cpp:L624](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L624) | | -| `SceneManager::SaveSceneWithinRoot` | method | SparkEngine | [SceneManager.cpp:L639](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L639) | | -| `SceneManager::SerializeSceneText` | method | SparkEngine | [SceneManager.cpp:L929](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L929) | | -| `SceneManager::SetParent` | method | SparkEngine | [SceneManager.cpp:L766](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L766) | | +| `SceneManager::SaveScene` | method | SparkEngine | [SceneManager.cpp:L692](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L692) | | +| `SceneManager::SaveSceneWithinRoot` | method | SparkEngine | [SceneManager.cpp:L707](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L707) | | +| `SceneManager::SerializeSceneText` | method | SparkEngine | [SceneManager.cpp:L1027](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1027) | | +| `SceneManager::SetParent` | method | SparkEngine | [SceneManager.cpp:L844](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L844) | | | `SceneManager::Shutdown` | method | SparkEditor | [SceneManager.cpp:L33](../../SparkEditor/Source/SceneSystem/SceneManager.cpp#L33) | | | `SceneManager::Update` | method | SparkEditor | [SceneManager.cpp:L31](../../SparkEditor/Source/SceneSystem/SceneManager.cpp#L31) | | | `SceneMergeHandler::AutoMerge` | method | SparkEditor | [VersionControlSystem.cpp:L42](../../SparkEditor/Source/VersionControl/VersionControlSystem.cpp#L42) | | @@ -33795,7 +33870,7 @@ | `SceneMergeHandler::ValidateMerge` | method | SparkEditor | [VersionControlSystem.cpp:L87](../../SparkEditor/Source/VersionControl/VersionControlSystem.cpp#L87) | | | `ScenePackageFixture` | function | Tests | [TestEditorSubsystems.cpp:L2413](../../Tests/TestEditorSubsystems.cpp#L2413) | | | `ScenePath` | function | Tests | [TestEditorAssetDropWorldReal.cpp:L179](../../Tests/TestEditorAssetDropWorldReal.cpp#L179) | | -| `scenePathUtf8` | function | GameModules | [GameConsoleOps.cpp:L490](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L490) | | +| `scenePathUtf8` | function | GameModules | [GameConsoleOps.cpp:L498](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L498) | | | `SceneReferenceValidator::GetRuleName` | method | SparkEngine | [AssetValidator.cpp:L113](../../SparkEngine/Source/Core/AssetValidator.cpp#L113) | | | `SceneReferenceValidator::ValidateAsset` | method | SparkEngine | [AssetValidator.cpp:L84](../../SparkEngine/Source/Core/AssetValidator.cpp#L84) | | | `SceneRenderer::BeginFrame` | method | SparkEngine | [SceneRenderer.cpp:L50](../../SparkEngine/Source/Graphics/SceneRenderer.cpp#L50) | | @@ -33917,7 +33992,7 @@ | `ScopedNetworkBindMode` | function | Tests | [TestSparkServerApplication.cpp:L60](../../Tests/TestSparkServerApplication.cpp#L60) | | | `ScopedNetworkSecurity` | function | Tests | [NetworkTestSecurity.h:L39](../../Tests/Fixtures/NetworkTestSecurity.h#L39) | Restores the singleton's security configuration when it goes out of scope | | `ScopedPathPrefix` | function | SparkInstaller | [InstallerTransactionTests.cpp:L303](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L303) | | -| `ScopedPathVariable` | function | SparkBuild | [ProcessRunnerTests.cpp:L563](../../SparkBuild/tests/ProcessRunnerTests.cpp#L563) | | +| `ScopedPathVariable` | function | SparkBuild | [ProcessRunnerTests.cpp:L556](../../SparkBuild/tests/ProcessRunnerTests.cpp#L556) | | | `ScopedRuntimeTestDirectory` | function | Tests | [TestTemplateRuntimeReal.cpp:L37](../../Tests/TestTemplateRuntimeReal.cpp#L37) | | | `ScopedServerConfig` | function | Tests | [TestSEC100RemoteAdminUnavailableReal.cpp:L178](../../Tests/TestSEC100RemoteAdminUnavailableReal.cpp#L178) | One uniquely named server INI in the temp directory, removed on scope exit. | | `ScopedShowcaseRoot` | function | Tests | [TestMOD300ShowcaseLocalizationReal.cpp:L37](../../Tests/TestMOD300ShowcaseLocalizationReal.cpp#L37) | | @@ -33958,26 +34033,37 @@ | `scratch` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L191](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L191) | | | `scratch` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L211](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L211) | | | `scratch` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L260](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L260) | | -| `scratch` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L566](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L566) | | +| `scratch` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L568](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L568) | | | `scratch` | function | Tests | [TestEditorStateCompatibility.cpp:L145](../../Tests/TestEditorStateCompatibility.cpp#L145) | | | `scratch` | function | Tests | [TestEditorStateCompatibility.cpp:L177](../../Tests/TestEditorStateCompatibility.cpp#L177) | | | `scratch` | function | Tests | [TestEditorStateCompatibility.cpp:L206](../../Tests/TestEditorStateCompatibility.cpp#L206) | | | `scratch` | function | Tests | [TestEditorStateCompatibility.cpp:L233](../../Tests/TestEditorStateCompatibility.cpp#L233) | | | `scratch` | function | Tests | [TestEditorStateCompatibility.cpp:L271](../../Tests/TestEditorStateCompatibility.cpp#L271) | | | `scratch` | function | Tests | [TestEditorStateCompatibility.cpp:L383](../../Tests/TestEditorStateCompatibility.cpp#L383) | | -| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L113](../../Tests/TestEditorSubsystemsReal.cpp#L113) | | -| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L145](../../Tests/TestEditorSubsystemsReal.cpp#L145) | | -| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L163](../../Tests/TestEditorSubsystemsReal.cpp#L163) | | -| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L195](../../Tests/TestEditorSubsystemsReal.cpp#L195) | | -| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L225](../../Tests/TestEditorSubsystemsReal.cpp#L225) | | -| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L274](../../Tests/TestEditorSubsystemsReal.cpp#L274) | | -| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L561](../../Tests/TestEditorSubsystemsReal.cpp#L561) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L136](../../Tests/TestEditorSubsystemsReal.cpp#L136) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L168](../../Tests/TestEditorSubsystemsReal.cpp#L168) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L186](../../Tests/TestEditorSubsystemsReal.cpp#L186) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L218](../../Tests/TestEditorSubsystemsReal.cpp#L218) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L248](../../Tests/TestEditorSubsystemsReal.cpp#L248) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L297](../../Tests/TestEditorSubsystemsReal.cpp#L297) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L584](../../Tests/TestEditorSubsystemsReal.cpp#L584) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L635](../../Tests/TestEditorSubsystemsReal.cpp#L635) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L649](../../Tests/TestEditorSubsystemsReal.cpp#L649) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L662](../../Tests/TestEditorSubsystemsReal.cpp#L662) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L675](../../Tests/TestEditorSubsystemsReal.cpp#L675) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L690](../../Tests/TestEditorSubsystemsReal.cpp#L690) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L737](../../Tests/TestEditorSubsystemsReal.cpp#L737) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L750](../../Tests/TestEditorSubsystemsReal.cpp#L750) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L773](../../Tests/TestEditorSubsystemsReal.cpp#L773) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L808](../../Tests/TestEditorSubsystemsReal.cpp#L808) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L829](../../Tests/TestEditorSubsystemsReal.cpp#L829) | | | `Scratch` | function | Tests | [TestEditorUntrustedProject.cpp:L39](../../Tests/TestEditorUntrustedProject.cpp#L39) | | | `scratch` | function | Tests | [TestEditorUntrustedProject.cpp:L132](../../Tests/TestEditorUntrustedProject.cpp#L132) | | | `scratch` | function | Tests | [TestEditorUntrustedProject.cpp:L156](../../Tests/TestEditorUntrustedProject.cpp#L156) | | | `scratch` | function | Tests | [TestEditorUntrustedProject.cpp:L177](../../Tests/TestEditorUntrustedProject.cpp#L177) | | | `scratch` | function | Tests | [TestEditorUntrustedProject.cpp:L200](../../Tests/TestEditorUntrustedProject.cpp#L200) | | | `scratch` | function | Tests | [TestEditorUntrustedProject.cpp:L231](../../Tests/TestEditorUntrustedProject.cpp#L231) | | +| `scratch` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L97](../../Tests/TestFPSOwnedSaveDecode.cpp#L97) | | | `scratch` | function | Tests | [TestFilesystemLinks.cpp:L193](../../Tests/TestFilesystemLinks.cpp#L193) | | | `scratch` | function | Tests | [TestFilesystemLinks.cpp:L229](../../Tests/TestFilesystemLinks.cpp#L229) | | | `scratch` | function | Tests | [TestGoldenImageTest.cpp:L381](../../Tests/TestGoldenImageTest.cpp#L381) | | @@ -34023,7 +34109,7 @@ | `scratch` | function | Tests | [TestSerializationHardening.cpp:L363](../../Tests/TestSerializationHardening.cpp#L363) | | | `scratch` | function | Tests | [TestSerializationHardening.cpp:L422](../../Tests/TestSerializationHardening.cpp#L422) | | | `ScratchCrashDir` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L44](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L44) | Unique scratch directory removed on scope exit. | -| `ScratchDir` | function | Tests | [TestEditorSubsystemsReal.cpp:L42](../../Tests/TestEditorSubsystemsReal.cpp#L42) | Unique scratch directory for one test, removed by the destructor. | +| `ScratchDir` | function | Tests | [TestEditorSubsystemsReal.cpp:L45](../../Tests/TestEditorSubsystemsReal.cpp#L45) | Unique scratch directory for one test, removed by the destructor. | | `ScratchDir` | function | Tests | [TestSEC3GameplayHardening.cpp:L54](../../Tests/TestSEC3GameplayHardening.cpp#L54) | | | `ScratchDirectory` | function | SparkCooker | [main.cpp:L44](../../SparkCooker/src/main.cpp#L44) | | | `ScratchDirectory` | function | Tests | [TestDocumentDurableWrite.cpp:L41](../../Tests/TestDocumentDurableWrite.cpp#L41) | | @@ -34235,7 +34321,7 @@ | `second` | function | Tests | [TestEditorSubsystems.cpp:L832](../../Tests/TestEditorSubsystems.cpp#L832) | | | `second` | function | Tests | [TestGatewayAreaControl.cpp:L1187](../../Tests/TestGatewayAreaControl.cpp#L1187) | | | `second` | function | Tests | [TestServiceTopologyController.cpp:L211](../../Tests/TestServiceTopologyController.cpp#L211) | | -| `second` | function | Tests | [TestSparkPak.cpp:L678](../../Tests/TestSparkPak.cpp#L678) | | +| `second` | function | Tests | [TestSparkPak.cpp:L694](../../Tests/TestSparkPak.cpp#L694) | | | `second` | function | Tests | [Test_scripting_hardening.cpp:L329](../../Tests/harden/Test_scripting_hardening.cpp#L329) | | | `secondClient` | function | Tests | [TestGatewayAreaControl.cpp:L285](../../Tests/TestGatewayAreaControl.cpp#L285) | | | `secondInitializer` | function | Tests | [TestMemoryIntegrity.cpp:L477](../../Tests/TestMemoryIntegrity.cpp#L477) | | @@ -34244,7 +34330,7 @@ | `secret` | function | Tests | [TestSecureTransportWired.cpp:L580](../../Tests/TestSecureTransportWired.cpp#L580) | | | `secret` | function | Tests | [TestSecurityParsersReal.cpp:L428](../../Tests/TestSecurityParsersReal.cpp#L428) | | | `secret` | function | Tests | [TestSecurityParsersReal.cpp:L474](../../Tests/TestSecurityParsersReal.cpp#L474) | | -| `section` | function | SparkEngine | [CrashHandler.cpp:L2766](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2766) | | +| `section` | function | SparkEngine | [CrashHandler.cpp:L2812](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2812) | | | `section` | function | Tests | [TestDebugUtilities.cpp:L91](../../Tests/TestDebugUtilities.cpp#L91) | | | `SecureChannel::Open` | method | SparkEngine | [NetworkEncryption.cpp:L246](../../SparkEngine/Source/Engine/Networking/NetworkEncryption.cpp#L246) | | | `SecureChannel::RotateSendKey` | method | SparkEngine | [NetworkEncryption.cpp:L296](../../SparkEngine/Source/Engine/Networking/NetworkEncryption.cpp#L296) | | @@ -34295,7 +34381,7 @@ | `SeedOutfitStore` | function | Tests | [TestDATA120BackupRestore.cpp:L766](../../Tests/TestDATA120BackupRestore.cpp#L766) | | | `SeedPredictionAt` | function | GameModules | [TFClientNet.h:L197](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L197) | | | `SeedQuadMeshData` | function | Tests | [TestProcessDrawListLinux.cpp:L84](../../Tests/TestProcessDrawListLinux.cpp#L84) | | -| `SeedTraveller` | function | Tests | [TestTF120Travel.cpp:L296](../../Tests/TestTF120Travel.cpp#L296) | | +| `SeedTraveller` | function | Tests | [TestTF120Travel.cpp:L283](../../Tests/TestTF120Travel.cpp#L283) | | | `Seek` | function | SparkEngine | [SteeringBehaviors.h:L126](../../SparkEngine/Source/Engine/AI/SteeringBehaviors.h#L126) | | | `Seek` | function | SparkEngine | [SteeringBehaviors.h:L207](../../SparkEngine/Source/Engine/AI/SteeringBehaviors.h#L207) | | | `Seek` | function | SparkEngine | [VideoPlayer.h:L207](../../SparkEngine/Source/Engine/Cinematic/VideoPlayer.h#L207) | Seek to a specific time | @@ -34452,7 +34538,7 @@ | `SendRegionState` | function | GameModules | [TFRegionSystem.h:L178](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.h#L178) | | | `SendRegister` | function | GameModules | [TFLoginFlow.h:L149](../../GameModules/SparkGameMMOFPS/Source/UI/TFLoginFlow.h#L149) | | | `SendRep` | function | GameModules | [TFDeployableSystem.h:L213](../../GameModules/SparkGameMMOFPS/Source/Game/TFDeployableSystem.h#L213) | | -| `SendRep` | function | GameModules | [TFReplication.h:L101](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L101) | | +| `SendRep` | function | GameModules | [TFReplication.h:L106](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L106) | | | `SendReply` | function | GameModules | [TFOutfitSystem.h:L227](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L227) | | | `SendRequest` | function | GameModules | [TFAbilitySystem.h:L192](../../GameModules/SparkGameMMOFPS/Source/Game/TFAbilitySystem.h#L192) | | | `SendRequest` | function | GameModules | [TFOutfitSystem.h:L235](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L235) | | @@ -34536,7 +34622,7 @@ | `sentinel` | function | Tests | [TestPrefabPersistence.cpp:L113](../../Tests/TestPrefabPersistence.cpp#L113) | | | `SentinelBlob` | function | Tests | [TestSEC2RenderingHardeningReal.cpp:L77](../../Tests/TestSEC2RenderingHardeningReal.cpp#L77) | | | `SentinelMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L316](../../SparkBuild/tests/ProcessRunnerTests.cpp#L316) | | -| `SentinelMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L731](../../SparkBuild/tests/ProcessRunnerTests.cpp#L731) | | +| `SentinelMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L722](../../SparkBuild/tests/ProcessRunnerTests.cpp#L722) | | | `sentinelSwitch` | function | Tests | [TestModuleABI.cpp:L905](../../Tests/TestModuleABI.cpp#L905) | | | `Sep` | function | SparkEditor | [JSONSceneSerializer.cpp:L272](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L272) | | | `Separate` | function | GameModules | [RTSPersistenceCodec.cpp:L66](../../GameModules/SparkGameRTS/Source/Core/RTSPersistenceCodec.cpp#L66) | | @@ -34634,7 +34720,7 @@ | `SerializeName` | function | SparkEngine | [CoreComponentSerializers.cpp:L34](../../SparkEngine/Source/Engine/Editor/CoreComponentSerializers.cpp#L34) | | | `SerializePacket` | function | Tests | [TestSubsystemIntegrationScenarios.cpp:L126](../../Tests/Integration/TestSubsystemIntegrationScenarios.cpp#L126) | | | `SerializeRigidBody` | function | SparkEngine | [CoreComponentSerializersPhysicsAudio.cpp:L88](../../SparkEngine/Source/Engine/Editor/CoreComponentSerializersPhysicsAudio.cpp#L88) | | -| `SerializeSceneText` | function | SparkEngine | [SceneManager.h:L520](../../SparkEngine/Source/SceneManager/SceneManager.h#L520) | Validate the live graph and render it as versioned scene text. | +| `SerializeSceneText` | function | SparkEngine | [SceneManager.h:L522](../../SparkEngine/Source/SceneManager/SceneManager.h#L522) | Validate the live graph and render it as versioned scene text. | | `SerializeSnapshot` | function | GameModules | [OWEngineSystems.h:L58](../../GameModules/SparkGameOpenWorld/Source/Core/OWEngineSystems.h#L58) | Deterministic text codec used by disk persistence and regression tests. | | `SerializeTagThroughRegistry` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L125](../../Tests/TestLIFE200ModuleReloadReal.cpp#L125) | | | `SerializeToBinary` | function | SparkEngine | [ReflectionSerializer.h:L129](../../SparkEngine/Source/Core/ReflectionSerializer.h#L129) | | @@ -34711,7 +34797,7 @@ | `ServerAccept` | function | GameModules | [TFSquadSystem.h:L221](../../GameModules/SparkGameMMOFPS/Source/Game/TFSquadSystem.h#L221) | | | `ServerActivate` | function | GameModules | [TFAbilitySystem.h:L182](../../GameModules/SparkGameMMOFPS/Source/Game/TFAbilitySystem.h#L182) | | | `ServerActivate` | function | GameModules | [TFAbilitySystemServer.cpp:L118](../../GameModules/SparkGameMMOFPS/Source/Game/TFAbilitySystemServer.cpp#L118) | | -| `ServerActive` | function | GameModules | [TFReplication.h:L95](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L95) | | +| `ServerActive` | function | GameModules | [TFReplication.h:L100](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L100) | | | `ServerAddOutfitScore` | function | GameModules | [TFOutfitSystem.h:L221](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L221) | | | `ServerAdoptHandoff` | function | GameModules | [TFTravelSystem.h:L147](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L147) | Keep a restored sanctuary checkpoint; discard the ordinary spawn-pad teleport queued by spawn. | | `ServerAdvancePhase` | function | GameModules | [TFAbilitySystem.h:L184](../../GameModules/SparkGameMMOFPS/Source/Game/TFAbilitySystem.h#L184) | | @@ -34736,12 +34822,12 @@ | `ServerBounce` | function | GameModules | [TFGrenadeSystem.h:L241](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L241) | | | `ServerBroadcast` | function | GameModules | [TFGrenadeSystem.h:L243](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L243) | | | `ServerBroadcastAim` | function | GameModules | [TFVehicleSystem.h:L228](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L228) | | -| `ServerBroadcastDestroy` | function | GameModules | [TFReplication.h:L99](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L99) | | +| `ServerBroadcastDestroy` | function | GameModules | [TFReplication.h:L104](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L104) | | | `ServerBroadcastImpactFx` | function | GameModules | [TFWeaponSystem.h:L228](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L228) | | | `ServerBroadcastRemoteFireFx` | function | GameModules | [TFWeaponSystem.h:L218](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L218) | | | `ServerBroadcastState` | function | GameModules | [TFAbilitySystem.h:L188](../../GameModules/SparkGameMMOFPS/Source/Game/TFAbilitySystem.h#L188) | | | `ServerBroadcastUpdates` | function | GameModules | [TFVehicleSystem.h:L224](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L224) | | -| `ServerBroadcastUpdates` | function | GameModules | [TFReplication.h:L98](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L98) | | +| `ServerBroadcastUpdates` | function | GameModules | [TFReplication.h:L103](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L103) | | | `ServerBuildContinentInfo` | function | GameModules | [TFTravelSystem.h:L160](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L160) | | | `ServerCreate` | function | GameModules | [TFOutfitSystem.h:L197](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L197) | | | `ServerCreate` | function | GameModules | [TFSquadSystem.h:L219](../../GameModules/SparkGameMMOFPS/Source/Game/TFSquadSystem.h#L219) | | @@ -34814,7 +34900,7 @@ | `ServerPollEnteredPlayers` | function | GameModules | [TFSocialSystem.h:L168](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L168) | | | `ServerPollNewClients` | function | GameModules | [TFDeployableSystem.h:L209](../../GameModules/SparkGameMMOFPS/Source/Game/TFDeployableSystem.h#L209) | | | `ServerPollNewClients` | function | GameModules | [TFVehicleSystem.h:L223](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L223) | | -| `ServerPollNewClients` | function | GameModules | [TFReplication.h:L97](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L97) | | +| `ServerPollNewClients` | function | GameModules | [TFReplication.h:L102](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L102) | | | `ServerPollNewClients` | function | GameModules | [TFRegionSystem.h:L175](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.h#L175) | | | `ServerPromote` | function | GameModules | [TFSquadSystem.h:L223](../../GameModules/SparkGameMMOFPS/Source/Game/TFSquadSystem.h#L223) | | | `ServerPruneStale` | function | GameModules | [TFTravelSystem.h:L156](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L156) | | @@ -34919,7 +35005,7 @@ | `ServiceTopologyPanel::Shutdown` | method | SparkEditor | [ServiceTopologyPanel.cpp:L157](../../SparkEditor/Source/Panels/ServiceTopologyPanel.cpp#L157) | | | `ServiceTopologyPanel::Update` | method | SparkEditor | [ServiceTopologyPanel.cpp:L44](../../SparkEditor/Source/Panels/ServiceTopologyPanel.cpp#L44) | | | `SessionId` | function | GameModules | [TFHandoffParticipant.h:L45](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.h#L45) | Public routing identity; never a login credential or session token. | -| `Set` | function | SparkBuild | [ProcessRunnerTests.cpp:L595](../../SparkBuild/tests/ProcessRunnerTests.cpp#L595) | | +| `Set` | function | SparkBuild | [ProcessRunnerTests.cpp:L588](../../SparkBuild/tests/ProcessRunnerTests.cpp#L588) | | | `Set` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L88](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L88) | | | `Set` | function | SparkCrashReporter | [CrashReporterManifestTests.cpp:L93](../../SparkCrashReporter/tests/CrashReporterManifestTests.cpp#L93) | | | `Set` | function | SparkEngine | [ModuleManager.cpp:L332](../../SparkEngine/Source/Core/ModuleManager.cpp#L332) | | @@ -34943,7 +35029,7 @@ | `Set3DEnabled` | function | SparkEngine | [XAudio2AudioBackend.h:L69](../../SparkEngine/Source/Audio/XAudio2AudioBackend.h#L69) | | | `Set3DEnabled` | function | Tests | [TestSequencerAudioWiring.cpp:L61](../../Tests/TestSequencerAudioWiring.cpp#L61) | | | `setA` | function | Tests | [TestAnimationSystem.cpp:L868](../../Tests/TestAnimationSystem.cpp#L868) | | -| `SetAbilities` | function | SparkEngine | [EngineContext.h:L325](../../SparkEngine/Source/Core/EngineContext.h#L325) | | +| `SetAbilities` | function | SparkEngine | [EngineContext.h:L328](../../SparkEngine/Source/Core/EngineContext.h#L328) | | | `SetAbilitySeamPresent` | function | GameModules | [TFChaosHarness.h:L82](../../GameModules/SparkGameMMOFPS/Source/Game/TFChaosHarness.h#L82) | | | `SetAccessibility` | function | SparkEngine | [InputBindings.h:L187](../../SparkEngine/Source/Input/InputBindings.h#L187) | Set accessibility flags. | | `SetAccountStatus` | function | GameModules | [MMOAccountSystem.h:L135](../../GameModules/SparkGameMMO/Source/Account/MMOAccountSystem.h#L135) | | @@ -34966,7 +35052,7 @@ | `SetActiveVariant` | function | Tests | [TestMaterialSystemValidation.cpp:L156](../../Tests/TestMaterialSystemValidation.cpp#L156) | | | `SetAdamConfig` | function | SparkEngine | [NeuralFunctionApproximator.h:L107](../../SparkEngine/Source/Graphics/Neural/NeuralFunctionApproximator.h#L107) | Override the Adam optimizer config used by training calls. | | `SetAdvancedProperties` | function | SparkEngine | [MaterialSystem.h:L238](../../SparkEngine/Source/Graphics/MaterialSystem.h#L238) | | -| `SetAI` | function | SparkEngine | [EngineContext.h:L304](../../SparkEngine/Source/Core/EngineContext.h#L304) | | +| `SetAI` | function | SparkEngine | [EngineContext.h:L307](../../SparkEngine/Source/Core/EngineContext.h#L307) | | | `SetAlbedoGuide` | function | SparkEngine | [DenoiserInterface.h:L100](../../SparkEngine/Source/Graphics/DenoiserInterface.h#L100) | | | `SetAlbedoGuide` | function | SparkEngine | [DenoiserInterface.h:L145](../../SparkEngine/Source/Graphics/DenoiserInterface.h#L145) | | | `SetAlbedoGuide` | function | SparkEngine | [NeuralPostProcessing.h:L62](../../SparkEngine/Source/Graphics/Neural/NeuralPostProcessing.h#L62) | | @@ -34981,27 +35067,27 @@ | `SetAnchor` | function | SparkEngine | [UISystem.h:L148](../../SparkEngine/Source/Engine/UI/UISystem.h#L148) | Set anchor point. | | `SetAngularVelocity` | function | SparkEngine | [JoltPhysicsInterface.h:L292](../../SparkEngine/Source/Engine/Physics/JoltPhysicsInterface.h#L292) | | | `SetAngularVelocity` | function | SparkEngine | [PhysicsBody.h:L87](../../SparkEngine/Source/Physics/PhysicsBody.h#L87) | | -| `SetAnimation` | function | SparkEngine | [EngineContext.h:L303](../../SparkEngine/Source/Core/EngineContext.h#L303) | | +| `SetAnimation` | function | SparkEngine | [EngineContext.h:L306](../../SparkEngine/Source/Core/EngineContext.h#L306) | | | `SetAreaLoad` | function | Tests | [TestWorldServerRouting.cpp:L283](../../Tests/TestWorldServerRouting.cpp#L283) | | | `SetAreaOnline` | function | SparkEngine | [WorldServer.h:L181](../../SparkEngine/Source/Engine/Networking/WorldServer.h#L181) | Run a single world server tick (for external driving) | | `SetAreaOnline` | function | Tests | [TestWorldServerRouting.cpp:L289](../../Tests/TestWorldServerRouting.cpp#L289) | | | `SetAreaResolver` | function | GameModules | [MMOPlayerSystem.h:L117](../../GameModules/SparkGameMMO/Source/Player/MMOPlayerSystem.h#L117) | | -| `SetAreaStreaming` | function | SparkEngine | [EngineContext.h:L333](../../SparkEngine/Source/Core/EngineContext.h#L333) | | +| `SetAreaStreaming` | function | SparkEngine | [EngineContext.h:L336](../../SparkEngine/Source/Core/EngineContext.h#L336) | | | `SetAreaTransitionCallback` | function | GameModules | [MMOPlayerSystem.h:L118](../../GameModules/SparkGameMMO/Source/Player/MMOPlayerSystem.h#L118) | | | `SetArenaAutopilot` | function | GameModules | [Game.h:L492](../../GameModules/SparkGameFPS/Source/Game/Game.h#L492) | Start or stop the arena autopilot (developer command `fps_autoplay`). | | `SetArgumentBuffer` | function | SparkEngine | [MetalDevice.h:L405](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L405) | | | `SetAssertCallback` | function | SparkEditor | [EditorCrashHandler.h:L72](../../SparkEditor/Source/Core/EditorCrashHandler.h#L72) | | -| `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandler.cpp:L1025](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1025) | | -| `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandler.cpp:L2805](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2805) | | -| `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandler.cpp:L2853](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2853) | | +| `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandler.cpp:L1026](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1026) | | +| `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandler.cpp:L2851](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2851) | | +| `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandler.cpp:L2899](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2899) | | | `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandler.h:L132](../../SparkEngine/Source/Utils/CrashHandler.h#L132) | Toggle whether assertion failures generate crash reports at runtime | | `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandlerStub.cpp:L31](../../SparkEngine/Source/Utils/CrashHandlerStub.cpp#L31) | | | `SetAssetChangedCallback` | function | SparkEditor | [SparkEngineIntegration.h:L490](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L490) | Set asset changed callback | -| `SetAssetPipeline` | function | SparkEngine | [EngineContext.h:L312](../../SparkEngine/Source/Core/EngineContext.h#L312) | | -| `SetAssetRegistry` | function | SparkEngine | [EngineContext.h:L316](../../SparkEngine/Source/Core/EngineContext.h#L316) | | +| `SetAssetPipeline` | function | SparkEngine | [EngineContext.h:L315](../../SparkEngine/Source/Core/EngineContext.h#L315) | | +| `SetAssetRegistry` | function | SparkEngine | [EngineContext.h:L319](../../SparkEngine/Source/Core/EngineContext.h#L319) | | | `SetAssetRoot` | function | SparkEditor | [SearchPanel.h:L85](../../SparkEditor/Source/Panels/SearchPanel.h#L85) | Directory searched for asset results (empty = no project asset root). | | `SetAttenuation` | function | SparkEngine | [LightingSystem.h:L119](../../SparkEngine/Source/Graphics/LightingSystem.h#L119) | | -| `SetAudio` | function | SparkEngine | [EngineContext.h:L301](../../SparkEngine/Source/Core/EngineContext.h#L301) | | +| `SetAudio` | function | SparkEngine | [EngineContext.h:L304](../../SparkEngine/Source/Core/EngineContext.h#L304) | | | `SetAudioBackend` | function | SparkEngine | [Sequencer.h:L366](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L366) | Attach the non-owning runtime audio service. | | `SetAudioCallback` | function | SparkEngine | [Sequencer.h:L291](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L291) | | | `SetAudioChannels` | function | SparkEngine | [DebugOverlay.h:L221](../../SparkEngine/Source/Utils/DebugOverlay.h#L221) | | @@ -35069,7 +35155,7 @@ | `SetCallbacks` | function | SparkEngine | [ModuleHotReload.h:L179](../../SparkEngine/Source/Engine/HotReload/ModuleHotReload.h#L179) | Set callbacks for the actual unload/reload operations | | `SetCallbacks` | function | SparkEngine | [DedicatedServer.h:L333](../../SparkEngine/Source/Engine/Networking/DedicatedServer.h#L333) | Capture an owned, internally consistent server statistics snapshot. | | `SetCallbacks` | function | SparkEngine | [RenderGraphBuilder.h:L260](../../SparkEngine/Source/Graphics/RenderGraph/RenderGraphBuilder.h#L260) | Register callbacks that perform the actual GPU work. | -| `SetCamera` | function | SparkEngine | [EngineContext.h:L329](../../SparkEngine/Source/Core/EngineContext.h#L329) | | +| `SetCamera` | function | SparkEngine | [EngineContext.h:L332](../../SparkEngine/Source/Core/EngineContext.h#L332) | | | `SetCameraMode` | function | SparkEngine | [PlayModeManager.h:L244](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L244) | | | `SetCameraPosition` | function | SparkEngine | [TerrainSystem.h:L39](../../SparkEngine/Source/Engine/ECS/Systems/TerrainSystem.h#L39) | | | `SetCameraPosition` | function | SparkEngine | [PostProcessingPipeline.h:L191](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L191) | Set the camera world position used by the volume manager. | @@ -35097,7 +35183,7 @@ | `SetCheatsEnabled` | function | SparkEngine | [ConsoleVariable.h:L217](../../SparkEngine/Source/Utils/ConsoleVariable.h#L217) | Check if cheats are enabled (controls Cheat-flagged cvars) | | `SetCheatsEnabled` | function | Tests | [TestConsoleVariables.cpp:L236](../../Tests/TestConsoleVariables.cpp#L236) | | | `SetCheckInterval` | function | SparkEngine | [MemoryMonitor.h:L153](../../SparkEngine/Source/Utils/MemoryMonitor.h#L153) | Set interval between full health checks (seconds) | -| `SetCinematic` | function | SparkEngine | [EngineContext.h:L327](../../SparkEngine/Source/Core/EngineContext.h#L327) | | +| `SetCinematic` | function | SparkEngine | [EngineContext.h:L330](../../SparkEngine/Source/Core/EngineContext.h#L330) | | | `SetCircuitPolicy` | function | SparkEngine | [OnlineServices.h:L1127](../../SparkEngine/Source/Engine/OnlineServices/OnlineServices.h#L1127) | Replace the circuit-breaker budget (defaults match the spec: 5 failures, 30 s) | | `SetClass` | function | GameModules | [Player.h:L308](../../GameModules/SparkGameFPS/Source/Game/Player.h#L308) | Set the player's class and apply class stats/loadout | | `SetClassSystem` | function | GameModules | [InteractiveObject.h:L192](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L192) | | @@ -35131,10 +35217,10 @@ | `SetColumns` | function | SparkEngine | [UILayoutExtensions.h:L70](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L70) | | | `SetCombatIntensity` | function | SparkEngine | [MusicManager.h:L253](../../SparkEngine/Source/Audio/MusicManager.h#L253) | | | `SetCompactMode` | function | SparkEngine | [DebugOverlay.h:L207](../../SparkEngine/Source/Utils/DebugOverlay.h#L207) | Toggle between compact (FPS only) and expanded modes | -| `SetComponentSerializers` | function | SparkEngine | [EngineContext.h:L340](../../SparkEngine/Source/Core/EngineContext.h#L340) | | +| `SetComponentSerializers` | function | SparkEngine | [EngineContext.h:L343](../../SparkEngine/Source/Core/EngineContext.h#L343) | | | `SetCompressionLevel` | function | SparkEditor | [SceneSerializer.h:L149](../../SparkEditor/Source/SceneSystem/SceneSerializer.h#L149) | Set compression level for binary format | | `SetComputePipelineState` | function | SparkEngine | [MetalDevice.h:L404](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L404) | | -| `SetConditions` | function | SparkEngine | [EngineContext.h:L331](../../SparkEngine/Source/Core/EngineContext.h#L331) | | +| `SetConditions` | function | SparkEngine | [EngineContext.h:L334](../../SparkEngine/Source/Core/EngineContext.h#L334) | | | `SetConfig` | function | SparkEngine | [PlayModeManager.h:L300](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L300) | | | `SetConfig` | function | SparkEngine | [SeamlessAreaManager.h:L135](../../SparkEngine/Source/Engine/Streaming/SeamlessAreaManager.h#L135) | | | `SetConfig` | function | Tests | [TestSeamlessAreaManager.cpp:L108](../../Tests/TestSeamlessAreaManager.cpp#L108) | | @@ -35142,8 +35228,8 @@ | `SetConfiguration` | function | SparkEditor | [PerformanceProfiler.h:L255](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L255) | Set profiler configuration | | `SetConnected` | function | Tests | [TestGamepadInputProcessing.cpp:L127](../../Tests/TestGamepadInputProcessing.cpp#L127) | | | `SetConsent` | function | SparkEngine | [Telemetry.h:L697](../../SparkEngine/Source/Utils/Telemetry.h#L697) | Set user consent for telemetry collection. | -| `SetConsoleColor` | function | SparkConsole | [ConsoleApp.h:L104](../../SparkConsole/src/ConsoleApp.h#L104) | | -| `SetConsoleColor` | function | SparkConsole | [ConsoleApp.h:L106](../../SparkConsole/src/ConsoleApp.h#L106) | | +| `SetConsoleColor` | function | SparkConsole | [ConsoleApp.h:L105](../../SparkConsole/src/ConsoleApp.h#L105) | | +| `SetConsoleColor` | function | SparkConsole | [ConsoleApp.h:L107](../../SparkConsole/src/ConsoleApp.h#L107) | | | `SetConsoleMessageCallback` | function | SparkEditor | [SparkEngineIntegration.h:L508](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L508) | Set console message callback | | `SetConstantBuffer` | function | SparkEngine | [D3D11Device.h:L268](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L268) | | | `SetConstantBuffer` | function | SparkEngine | [D3D12Types.h:L704](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L704) | | @@ -35159,7 +35245,7 @@ | `SetContentSize` | function | SparkEngine | [UILayoutExtensions.h:L88](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L88) | | | `SetCooldown` | function | GameModules | [InteractiveObject.h:L294](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L294) | | | `SetCooldown` | function | Tests | [TestSelfRecovery.cpp:L145](../../Tests/TestSelfRecovery.cpp#L145) | | -| `SetCoroutineScheduler` | function | SparkEngine | [EngineContext.h:L314](../../SparkEngine/Source/Core/EngineContext.h#L314) | | +| `SetCoroutineScheduler` | function | SparkEngine | [EngineContext.h:L317](../../SparkEngine/Source/Core/EngineContext.h#L317) | | | `SetCrashCallback` | function | SparkEditor | [EditorCrashHandler.h:L71](../../SparkEditor/Source/Core/EditorCrashHandler.h#L71) | | | `SetCreateProjectRequestHandler` | function | SparkEditor | [ProjectBrowserPanel.h:L61](../../SparkEditor/Source/Panels/ProjectBrowserPanel.h#L61) | | | `SetCrosshairSpread` | function | GameModules | [HUDSystem.h:L325](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L325) | | @@ -35251,7 +35337,7 @@ | `SetDefaultFadeDuration` | function | SparkEngine | [DecalSystem.h:L144](../../SparkEngine/Source/Graphics/DecalSystem.h#L144) | | | `SetDefaultFadeTime` | function | SparkEngine | [DecalSystem.h:L143](../../SparkEngine/Source/Graphics/DecalSystem.h#L143) | | | `SetDefaultMaterial` | function | SparkEngine | [PhysicsSystem.h:L457](../../SparkEngine/Source/Physics/PhysicsSystem.h#L457) | | -| `SetDefaultPanelVisibility` | function | SparkEditor | [EditorUI.h:L514](../../SparkEditor/Source/Core/EditorUI.h#L514) | | +| `SetDefaultPanelVisibility` | function | SparkEditor | [EditorUI.h:L512](../../SparkEditor/Source/Core/EditorUI.h#L512) | | | `SetDefaultPermissions` | function | GameModules | [MMOGuildSystem.h:L115](../../GameModules/SparkGameMMO/Source/Guild/MMOGuildSystem.h#L115) | | | `SetDefaultState` | function | SparkEngine | [AnimationSystem.h:L125](../../SparkEngine/Source/Engine/Animation/AnimationSystem.h#L125) | Set the initial state entered when the machine first runs. | | `SetDefaultState` | function | Tests | [TestAnimationStress.cpp:L272](../../Tests/TestAnimationStress.cpp#L272) | | @@ -35269,7 +35355,7 @@ | `SetDescriptor` | function | SparkEngine | [D3D12Types.h:L411](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L411) | | | `SetDesiredIntensityRange` | function | SparkEngine | [AIDirector.h:L136](../../SparkEngine/Source/Engine/AI/AIDirector.h#L136) | Set the desired intensity range. | | `SetDestination` | function | GameModules | [InteractiveObject.h:L319](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L319) | | -| `SetDestruction` | function | SparkEngine | [EngineContext.h:L326](../../SparkEngine/Source/Core/EngineContext.h#L326) | | +| `SetDestruction` | function | SparkEngine | [EngineContext.h:L329](../../SparkEngine/Source/Core/EngineContext.h#L329) | | | `SetDestructionCallback` | function | GameModules | [VehicleSystem.h:L239](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L239) | Set destruction callback | | `SetDestructionSound` | function | SparkEngine | [DestructionSystem.h:L89](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L89) | Set the destruction sound effect. | | `SetDeterministicSimulation` | function | SparkEngine | [PhysicsSystem.h:L205](../../SparkEngine/Source/Physics/PhysicsSystem.h#L205) | | @@ -35279,7 +35365,7 @@ | `SetDevice` | function | SparkEngine | [PostProcessingPipeline.h:L307](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L307) | Set the D3D11 device and context for GPU execution | | `SetDevice` | function | SparkEngine | [TemporalEffects.h:L166](../../SparkEngine/Source/Graphics/TemporalEffects.h#L166) | Set D3D11 device and context for GPU execution | | `SetDeviceContext` | function | SparkEngine | [AsyncComputeScheduler.h:L130](../../SparkEngine/Source/Graphics/AsyncComputeScheduler.h#L130) | Set the D3D11 device context used for immediate dispatch. | -| `SetDialogue` | function | SparkEngine | [EngineContext.h:L320](../../SparkEngine/Source/Core/EngineContext.h#L320) | | +| `SetDialogue` | function | SparkEngine | [EngineContext.h:L323](../../SparkEngine/Source/Core/EngineContext.h#L323) | | | `SetDifficultyScale` | function | GameModules | [WaveSpawner.h:L122](../../GameModules/SparkGameFPS/Source/Game/WaveSpawner.h#L122) | | | `SetDirection` | function | SparkEngine | [UILayoutExtensions.h:L43](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L43) | | | `SetDirection` | function | SparkEngine | [LightingSystem.h:L94](../../SparkEngine/Source/Graphics/LightingSystem.h#L94) | | @@ -35362,7 +35448,7 @@ | `SetErrorCallback` | function | Tests | [TestScriptHotReload.cpp:L55](../../Tests/TestScriptHotReload.cpp#L55) | | | `SetEventBus` | function | GameModules | [Game.h:L349](../../GameModules/SparkGameFPS/Source/Game/Game.h#L349) | Connect the engine's event bus for cross-system communication | | `SetEventBus` | function | GameModules | [GameMechanics.h:L165](../../GameModules/SparkGameFPS/Source/Game/GameMechanics.h#L165) | Connect the engine event bus so respawns publish PlayerRespawnEvent. | -| `SetEventBus` | function | SparkEngine | [EngineContext.h:L300](../../SparkEngine/Source/Core/EngineContext.h#L300) | | +| `SetEventBus` | function | SparkEngine | [EngineContext.h:L303](../../SparkEngine/Source/Core/EngineContext.h#L303) | | | `SetEventBus` | function | SparkEngine | [WeatherSystem.h:L393](../../SparkEngine/Source/Graphics/WeatherSystem.h#L393) | Set an EventBus for publishing WeatherChangedEvent. | | `SetEventBus` | function | SparkEngine | [PhysicsSystem.h:L440](../../SparkEngine/Source/Physics/PhysicsSystem.h#L440) | | | `SetEventCallback` | function | SparkEngine | [Sequencer.h:L288](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L288) | | @@ -35390,10 +35476,10 @@ | `SetFieldFromString` | function | SparkEngine | [Reflection.h:L439](../../SparkEngine/Source/Core/Reflection.h#L439) | | | `SetFieldFromString` | function | Tests | [TestReflection.cpp:L328](../../Tests/TestReflection.cpp#L328) | | | `SetFileCache` | function | SparkEditor | [ProjectManager.h:L172](../../SparkEditor/Source/Core/ProjectManager.h#L172) | | -| `SetFileCache` | function | SparkEngine | [EngineContext.h:L315](../../SparkEngine/Source/Core/EngineContext.h#L315) | | +| `SetFileCache` | function | SparkEngine | [EngineContext.h:L318](../../SparkEngine/Source/Core/EngineContext.h#L318) | | | `SetFileCache` | function | SparkEngine | [SaveSystem.h:L815](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L815) | Set the file cache for save I/O (non-owning). | | `SetFileCache` | function | SparkEngine | [Shader.h:L364](../../SparkEngine/Source/Graphics/Shader.h#L364) | Set the file cache used for shader source loading | -| `SetFileCache` | function | SparkEngine | [SceneManager.h:L475](../../SparkEngine/Source/SceneManager/SceneManager.h#L475) | Set the file cache for scene I/O (non-owning). | +| `SetFileCache` | function | SparkEngine | [SceneManager.h:L477](../../SparkEngine/Source/SceneManager/SceneManager.h#L477) | Set the file cache for scene I/O (non-owning). | | `SetFileInformationByHandle` | function | SparkCrashReporter | [CrashReporterApp.cpp:L903](../../SparkCrashReporter/src/CrashReporterApp.cpp#L903) | | | `SetFilePath` | function | SparkEditor | [PrefabAsset.h:L93](../../SparkEditor/Source/Prefabs/PrefabAsset.h#L93) | Set the file path | | `SetFileSystemMonitoring` | function | SparkEditor | [AdvancedAssetPipeline.h:L368](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L368) | Enable/disable file system monitoring | @@ -35446,7 +35532,7 @@ | `SetFromString` | function | Tests | [TestConsoleVariables.cpp:L64](../../Tests/TestConsoleVariables.cpp#L64) | | | `SetFromString` | function | Tests | [TestConsoleVariables.cpp:L153](../../Tests/TestConsoleVariables.cpp#L153) | | | `SetGameModuleSelector` | function | SparkEditor | [PlayControlPanel.h:L57](../../SparkEditor/Source/Panels/PlayControlPanel.h#L57) | Wire the Game Module Selector panel so the play bar launches | -| `SetGameplayTagService` | function | SparkEngine | [EngineContext.h:L308](../../SparkEngine/Source/Core/EngineContext.h#L308) | | +| `SetGameplayTagService` | function | SparkEngine | [EngineContext.h:L311](../../SparkEngine/Source/Core/EngineContext.h#L311) | | | `SetGenerator` | function | SparkEngine | [MovementSystem.h:L344](../../SparkEngine/Source/Engine/AI/MovementSystem.h#L344) | Place a generator into its declared slot, replacing any existing one. | | `SetGenerator` | function | Tests | [TestMovementSystem.cpp:L138](../../Tests/TestMovementSystem.cpp#L138) | | | `SetGizmoMode` | function | SparkEditor | [SceneViewPanel.h:L136](../../SparkEditor/Source/Panels/SceneViewPanel.h#L136) | Select the active viewport transform tool. Cancels any in-flight drag | @@ -35461,11 +35547,11 @@ | `SetGlobalMaxRetries` | function | SparkEngine | [FaultIsolation.h:L73](../../SparkEngine/Source/Core/FaultIsolation.h#L73) | | | `SetGlobalMaxRetries` | function | Tests | [TestFaultIsolation.cpp:L75](../../Tests/TestFaultIsolation.cpp#L75) | | | `SetGlobalShadowQuality` | function | SparkEngine | [LightingSystem.h:L347](../../SparkEngine/Source/Graphics/LightingSystem.h#L347) | | -| `SetGraphics` | function | SparkEditor | [AssetBrowserPanel.h:L96](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L96) | Wire live basic-path cache invalidation after an import. | +| `SetGraphics` | function | SparkEditor | [AssetBrowserPanel.h:L106](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L106) | Wire live basic-path cache invalidation after an import. | | `SetGraphics` | function | SparkEditor | [BasicMaterialEditorPanel.h:L56](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L56) | Give the panel access to the editor's attach-mode GraphicsEngine | | `SetGraphics` | function | SparkEditor | [GameViewPanel.h:L44](../../SparkEditor/Source/Panels/GameViewPanel.h#L44) | | | `SetGraphics` | function | SparkEditor | [SceneViewPanel.h:L99](../../SparkEditor/Source/Panels/SceneViewPanel.h#L99) | Give the panel access to the editor's attach-mode GraphicsEngine | -| `SetGraphics` | function | SparkEngine | [EngineContext.h:L297](../../SparkEngine/Source/Core/EngineContext.h#L297) | | +| `SetGraphics` | function | SparkEngine | [EngineContext.h:L300](../../SparkEngine/Source/Core/EngineContext.h#L300) | | | `SetGraphicsDevice` | function | SparkEditor | [EditorUI.h:L262](../../SparkEditor/Source/Core/EditorUI.h#L262) | | | `SetGraphicsEngine` | function | GameModules | [ModelObject.h:L69](../../GameModules/SparkGameFPS/Source/Game/ModelObject.h#L69) | Set graphics engine for rendering | | `SetGraphicsEngine` | function | GameModules | [Player.h:L483](../../GameModules/SparkGameFPS/Source/Game/Player.h#L483) | Set the graphics engine for weapon rendering shader setup | @@ -35512,8 +35598,8 @@ | `SetIndexBuffer` | function | SparkEngine | [RHIDevice.h:L96](../../SparkEngine/Source/Graphics/RHI/RHIDevice.h#L96) | | | `SetIndexBuffer` | function | SparkEngine | [VulkanDevice.h:L345](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L345) | | | `SetInitializeRollbackPrelude` | function | SparkEngine | [LifecycleCompositionRoot.h:L115](../../SparkEngine/Source/Core/Lifecycle/LifecycleCompositionRoot.h#L115) | | -| `SetInjected` | function | SparkEngine | [EngineContext.h:L121](../../SparkEngine/Source/Core/EngineContext.h#L121) | | -| `SetInput` | function | SparkEngine | [EngineContext.h:L298](../../SparkEngine/Source/Core/EngineContext.h#L298) | | +| `SetInjected` | function | SparkEngine | [EngineContext.h:L122](../../SparkEngine/Source/Core/EngineContext.h#L122) | | +| `SetInput` | function | SparkEngine | [EngineContext.h:L301](../../SparkEngine/Source/Core/EngineContext.h#L301) | | | `SetInput` | function | SparkEngine | [VehiclePhysics.h:L80](../../SparkEngine/Source/Physics/VehiclePhysics.h#L80) | | | `SetInputSRV` | function | SparkEngine | [PostProcessingPipeline.h:L313](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L313) | Set the borrowed input scene texture SRV for this frame | | `SetInputTextures` | function | SparkEngine | [MetalRayTracing.h:L196](../../SparkEngine/Source/Graphics/RHI/Metal/MetalRayTracing.h#L196) | Set GBuffer inputs (depth + normals). Passed textures | @@ -35523,7 +35609,7 @@ | `SetInspectedObject` | function | SparkEditor | [TilemapEditorPanel.h:L44](../../SparkEditor/Source/Panels/TilemapEditorPanel.h#L44) | | | `SetInspectedObjectByID` | function | SparkEditor | [InspectorPanel.h:L63](../../SparkEditor/Source/Panels/InspectorPanel.h#L63) | Set the selected object by its ObjectID | | `SetInstanceOverride` | function | SparkEditor | [PrefabManager.h:L217](../../SparkEditor/Source/Prefabs/PrefabManager.h#L217) | | -| `SetInstances` | function | SparkEngine | [EngineContext.h:L332](../../SparkEngine/Source/Core/EngineContext.h#L332) | | +| `SetInstances` | function | SparkEngine | [EngineContext.h:L335](../../SparkEngine/Source/Core/EngineContext.h#L335) | | | `SetInstructionLimit` | function | SparkEngine | [ScriptSandbox.h:L104](../../SparkEngine/Source/Engine/Scripting/ScriptSandbox.h#L104) | | | `SetInt` | function | SparkEngine | [AsyncDatabase.h:L90](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L90) | Prepared statement handle with bindable parameters. | | `SetInt` | function | SparkEngine | [ConfigParser.h:L262](../../SparkEngine/Source/Utils/ConfigParser.h#L262) | | @@ -35540,7 +35626,7 @@ | `SetInterpolationEnabled` | function | Tests | [TestPhysicsSystem.cpp:L131](../../Tests/TestPhysicsSystem.cpp#L131) | | | `SetInterval` | function | SparkEngine | [Cooldown.h:L182](../../SparkEngine/Source/Utils/Cooldown.h#L182) | Set a new interval. | | `SetIntoLayers` | function | SparkEngine | [CollisionMaskComponents.h:L56](../../SparkEngine/Source/Engine/ECS/Components/CollisionMaskComponents.h#L56) | Set the INTO mask to exactly the given layers | -| `SetInvalidStateDetector` | function | SparkEngine | [EngineContext.h:L339](../../SparkEngine/Source/Core/EngineContext.h#L339) | | +| `SetInvalidStateDetector` | function | SparkEngine | [EngineContext.h:L342](../../SparkEngine/Source/Core/EngineContext.h#L342) | | | `SetInvertY` | function | Tests | [TestCameraTransforms.cpp:L194](../../Tests/TestCameraTransforms.cpp#L194) | | | `SetJumpInput` | function | GameModules | [PlatformerPlayerController.h:L141](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L141) | Set jump-button state; a rising edge queues a buffered jump. | | `SetKeepChangesOnStop` | function | SparkEngine | [PlayModeManager.h:L258](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L258) | | @@ -35601,7 +35687,7 @@ | `SetLoadOrder` | function | SparkEngine | [ModSystem.h:L171](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L171) | Set the load order for enabled mods. | | `SetLoadRadius` | function | SparkEngine | [HLODSystem.h:L438](../../SparkEngine/Source/Engine/HLOD/HLODSystem.h#L438) | Get the world partition grid for cell management | | `SetLocalFileCache` | function | SparkEngine | [ShaderCrossCompiler.h:L279](../../SparkEngine/Source/Graphics/ShaderCrossCompiler.h#L279) | Set a disk cache for persistent shader caching across sessions. | -| `SetLocalization` | function | SparkEngine | [EngineContext.h:L323](../../SparkEngine/Source/Core/EngineContext.h#L323) | | +| `SetLocalization` | function | SparkEngine | [EngineContext.h:L326](../../SparkEngine/Source/Core/EngineContext.h#L326) | | | `SetLocalSelection` | function | SparkEditor | [CollaborativeEditSession.h:L343](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L343) | | | `SetLocalShotHook` | function | GameModules | [TFWeaponSystem.h:L105](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L105) | | | `SetLocalViewportCamera` | function | SparkEditor | [CollaborativeEditSession.h:L344](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L344) | | @@ -35711,7 +35797,7 @@ | `SetModEnabled` | function | SparkEditor | [ModdingPanel.h:L39](../../SparkEditor/Source/Panels/ModdingPanel.h#L39) | Enable or disable a discovered mod; returns false if the id is unknown. | | `SetModified` | function | SparkEditor | [EditorPanel.h:L145](../../SparkEditor/Source/Core/EditorPanel.h#L145) | Set modified state | | `SetModified` | function | SparkEditor | [PrefabAsset.h:L192](../../SparkEditor/Source/Prefabs/PrefabAsset.h#L192) | Mark the prefab as modified or saved | -| `SetModSystem` | function | SparkEngine | [EngineContext.h:L321](../../SparkEngine/Source/Core/EngineContext.h#L321) | | +| `SetModSystem` | function | SparkEngine | [EngineContext.h:L324](../../SparkEngine/Source/Core/EngineContext.h#L324) | | | `SetMotd` | function | GameModules | [MMOGuildSystem.h:L89](../../GameModules/SparkGameMMO/Source/Guild/MMOGuildSystem.h#L89) | | | `SetMotionBlurEnabled` | function | SparkEngine | [TemporalEffects.h:L362](../../SparkEngine/Source/Graphics/TemporalEffects.h#L362) | | | `SetMotionVectorsSRV` | function | SparkEngine | [TemporalEffects.h:L179](../../SparkEngine/Source/Graphics/TemporalEffects.h#L179) | Set the motion vectors SRV (RG16F) | @@ -35725,7 +35811,7 @@ | `SetMoveSpeed` | function | Tests | [TestCameraTransforms.cpp:L192](../../Tests/TestCameraTransforms.cpp#L192) | | | `SetMSAALevel` | function | SparkEngine | [GraphicsEngine.h:L617](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L617) | Set multi-sampling anti-aliasing level | | `SetMTLTexture` | function | SparkEngine | [MetalDevice.h:L179](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L179) | | -| `SetMusic` | function | SparkEngine | [EngineContext.h:L337](../../SparkEngine/Source/Core/EngineContext.h#L337) | | +| `SetMusic` | function | SparkEngine | [EngineContext.h:L340](../../SparkEngine/Source/Core/EngineContext.h#L340) | | | `SetMusicVolume` | function | SparkEngine | [AudioEngine.h:L308](../../SparkEngine/Source/Audio/AudioEngine.h#L308) | Set the music volume level | | `SetMusicVolume` | function | SparkEngine | [IAudioBackend.h:L129](../../SparkEngine/Source/Audio/IAudioBackend.h#L129) | Set music volume (0.0 - 1.0) | | `SetMusicVolume` | function | SparkEngine | [NullAudioBackend.h:L85](../../SparkEngine/Source/Audio/NullAudioBackend.h#L85) | | @@ -35738,8 +35824,8 @@ | `SetName` | function | SparkEngine | [GameObject.h:L243](../../SparkEngine/Source/Game/GameObject.h#L243) | Set the name of the object | | `SetName` | function | Tests | [TestGameObjectTransforms.cpp:L139](../../Tests/TestGameObjectTransforms.cpp#L139) | | | `SetNavMesh` | function | SparkEngine | [NavMeshObstacles.h:L200](../../SparkEngine/Source/Engine/AI/NavMeshObstacles.h#L200) | | -| `SetNetwork` | function | SparkEngine | [EngineContext.h:L305](../../SparkEngine/Source/Core/EngineContext.h#L305) | | -| `SetNetworkService` | function | SparkEngine | [EngineContext.h:L306](../../SparkEngine/Source/Core/EngineContext.h#L306) | | +| `SetNetwork` | function | SparkEngine | [EngineContext.h:L308](../../SparkEngine/Source/Core/EngineContext.h#L308) | | +| `SetNetworkService` | function | SparkEngine | [EngineContext.h:L309](../../SparkEngine/Source/Core/EngineContext.h#L309) | | | `SetNoiseType` | function | SparkEngine | [FastNoiseLite.h:L97](../../SparkEngine/Source/Graphics/FastNoiseLite.h#L97) | | | `SetNonBlocking` | function | GameModules | [TFLanDiscoveryInternal.h:L50](../../GameModules/SparkGameMMOFPS/Source/Game/TFLanDiscoveryInternal.h#L50) | | | `SetNonBlocking` | function | GameModules | [TFLanDiscoveryInternal.h:L82](../../GameModules/SparkGameMMOFPS/Source/Game/TFLanDiscoveryInternal.h#L82) | | @@ -35753,6 +35839,7 @@ | `SetOcclusionEnabled` | function | SparkEngine | [AudioMixer.h:L319](../../SparkEngine/Source/Audio/AudioMixer.h#L319) | Enable or disable audio occlusion globally. | | `SetOcclusionSettings` | function | SparkEngine | [MusicManager.h:L262](../../SparkEngine/Source/Audio/MusicManager.h#L262) | | | `SetOn` | function | GameModules | [InteractiveObject.h:L219](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L219) | | +| `SetOnMaterialOpened` | function | SparkEditor | [AssetBrowserPanel.h:L100](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L100) | Connect material activation to the persistent material editor panel. | | `SetOnPrefabsChanged` | function | SparkEditor | [PrefabManager.h:L245](../../SparkEditor/Source/Prefabs/PrefabManager.h#L245) | Set callback for when prefab list changes | | `SetOnProjectClosed` | function | SparkEditor | [ProjectManager.h:L195](../../SparkEditor/Source/Core/ProjectManager.h#L195) | | | `SetOnProjectOpened` | function | SparkEditor | [ProjectManager.h:L194](../../SparkEditor/Source/Core/ProjectManager.h#L194) | | @@ -35768,7 +35855,7 @@ | `SetOpenProbeForTesting` | function | SparkEngine | [VirtualFileSystem.h:L146](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L146) | Test seam: called with the resolved path after every containment check passed | | `SetOpenProjectRequestHandler` | function | SparkEditor | [ProjectBrowserPanel.h:L57](../../SparkEditor/Source/Panels/ProjectBrowserPanel.h#L57) | | | `SetOpenSpeed` | function | GameModules | [InteractiveObject.h:L144](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L144) | | -| `SetOperationResult` | function | SparkEditor | [AssetBrowserPanel.h:L113](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L113) | | +| `SetOperationResult` | function | SparkEditor | [AssetBrowserPanel.h:L123](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L123) | | | `SetOptions` | function | SparkEngine | [AIDebugRenderer.h:L192](../../SparkEngine/Source/Engine/AI/AIDebugRenderer.h#L192) | Set debug draw options | | `SetOptions` | function | Tests | [TestAIDebugRenderer.cpp:L61](../../Tests/TestAIDebugRenderer.cpp#L61) | | | `SetOrbitAngles` | function | GameModules | [RacingCameraSystem.h:L85](../../GameModules/SparkGameRacing/Source/Camera/RacingCameraSystem.h#L85) | | @@ -35780,7 +35867,7 @@ | `SetOutputRTV` | function | SparkEngine | [PostProcessingPipeline.h:L316](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L316) | Set the borrowed final output RTV for this frame | | `SetOutputTextures` | function | SparkEngine | [MetalRayTracing.h:L200](../../SparkEngine/Source/Graphics/RHI/Metal/MetalRayTracing.h#L200) | Set per-effect output render targets. Passing nullptr | | `SetOverlayVisible` | function | SparkEngine | [Profiler.h:L272](../../SparkEngine/Source/Utils/Profiler.h#L272) | | -| `SetOwned` | function | SparkEngine | [EngineContext.h:L136](../../SparkEngine/Source/Core/EngineContext.h#L136) | Set the global EngineContext (initialization only) | +| `SetOwned` | function | SparkEngine | [EngineContext.h:L137](../../SparkEngine/Source/Core/EngineContext.h#L137) | Set the global EngineContext (initialization only) | | `SetPadding` | function | SparkEngine | [UILayoutExtensions.h:L50](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L50) | | | `SetPadding` | function | SparkEngine | [UISystem.h:L315](../../SparkEngine/Source/Engine/UI/UISystem.h#L315) | Set padding inside the panel. | | `SetPanelCategory` | function | SparkEditor | [EditorPanel.h:L298](../../SparkEditor/Source/Core/EditorPanel.h#L298) | Set panel category (called by EditorPanelFactory at creation) | @@ -35793,7 +35880,7 @@ | `SetPanelVisible` | function | Tests | [TestEditorLayoutManager.cpp:L64](../../Tests/TestEditorLayoutManager.cpp#L64) | | | `SetParent` | function | SparkEngine | [Components.h:L117](../../SparkEngine/Source/Engine/ECS/Components.h#L117) | | | `SetParent` | function | SparkEngine | [RuntimePrefab.h:L156](../../SparkEngine/Source/Engine/ECS/RuntimePrefab.h#L156) | Set a parent prefab for inheritance / nesting. | -| `SetParent` | function | SparkEngine | [SceneManager.h:L275](../../SparkEngine/Source/SceneManager/SceneManager.h#L275) | | +| `SetParent` | function | SparkEngine | [SceneManager.h:L277](../../SparkEngine/Source/SceneManager/SceneManager.h#L277) | | | `SetParent` | function | Tests | [TestSceneManager.cpp:L101](../../Tests/TestSceneManager.cpp#L101) | | | `SetParticipant` | function | SparkEngine | [AreaHandoffDispatcher.h:L37](../../SparkEngine/Source/Engine/Networking/AreaHandoffDispatcher.h#L37) | | | `SetParticleEffect` | function | SparkEngine | [DestructionSystem.h:L93](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L93) | Set the particle effect name for destruction. | @@ -35818,7 +35905,7 @@ | `SetPersistence` | function | GameModules | [MMOCharacterSystem.h:L156](../../GameModules/SparkGameMMO/Source/Character/MMOCharacterSystem.h#L156) | | | `SetPhase` | function | SparkEngine | [InstanceManager.h:L96](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L96) | | | `SetPhysics` | function | SparkEngine | [AudioMixer.h:L228](../../SparkEngine/Source/Audio/AudioMixer.h#L228) | Attach the physics system used for occlusion traces. | -| `SetPhysics` | function | SparkEngine | [EngineContext.h:L302](../../SparkEngine/Source/Core/EngineContext.h#L302) | | +| `SetPhysics` | function | SparkEngine | [EngineContext.h:L305](../../SparkEngine/Source/Core/EngineContext.h#L305) | | | `SetPhysicsBodies` | function | SparkEngine | [DebugOverlay.h:L220](../../SparkEngine/Source/Utils/DebugOverlay.h#L220) | | | `SetPhysicsBodyCount` | function | SparkEngine | [PerformanceStats.h:L222](../../SparkEngine/Source/Utils/PerformanceStats.h#L222) | Set the current physics body count | | `SetPhysicsSystem` | function | GameModules | [Game.h:L346](../../GameModules/SparkGameFPS/Source/Game/Game.h#L346) | Set physics system on all projectile pools | @@ -35914,7 +36001,7 @@ | `SetProjectilePool` | function | GameModules | [Player.h:L209](../../GameModules/SparkGameFPS/Source/Game/Player.h#L209) | Set the projectile pool for weapon projectiles | | `SetProjectilePool` | function | GameModules | [VehicleSystem.h:L161](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L161) | Set the projectile pool used for vehicle weapon firing | | `SetProjectilePool` | function | GameModules | [VehicleSystem.h:L337](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L337) | Set projectile pool for all current and future vehicles | -| `SetProjectPath` | function | SparkEditor | [AssetBrowserPanel.h:L73](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L73) | Set project path | +| `SetProjectPath` | function | SparkEditor | [AssetBrowserPanel.h:L74](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L74) | Set project path | | `SetProjectPrefabDirectory` | function | SparkEditor | [PrefabManager.h:L98](../../SparkEditor/Source/Prefabs/PrefabManager.h#L98) | Set the open project's prefab directory (`/Prefabs`); empty when no project is open | | `SetProperty` | function | SparkEngine | [RemoteDebugSystem.h:L637](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugSystem.h#L637) | Set the value of a named property. | | `SetQuality` | function | SparkEngine | [HybridRTManager.h:L178](../../SparkEngine/Source/Graphics/HybridRT/HybridRTManager.h#L178) | | @@ -35958,7 +36045,7 @@ | `SetRenderTargets` | function | SparkEngine | [RHIAdapter.h:L156](../../SparkEngine/Source/Graphics/RHI/RHIAdapter.h#L156) | Set one or more render targets with an optional depth buffer. | | `SetRenderTargets` | function | SparkEngine | [RHIDevice.h:L81](../../SparkEngine/Source/Graphics/RHI/RHIDevice.h#L81) | | | `SetRenderTargets` | function | SparkEngine | [VulkanDevice.h:L333](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L333) | | -| `SetReplay` | function | SparkEngine | [EngineContext.h:L322](../../SparkEngine/Source/Core/EngineContext.h#L322) | | +| `SetReplay` | function | SparkEngine | [EngineContext.h:L325](../../SparkEngine/Source/Core/EngineContext.h#L325) | | | `SetReputation` | function | GameModules | [MMOReputationSystem.h:L79](../../GameModules/SparkGameMMO/Source/Reputation/MMOReputationSystem.h#L79) | | | `SetRequiresConfirmation` | function | SparkEditor | [EditorWorkflow.h:L102](../../SparkEditor/Source/Workflow/EditorWorkflow.h#L102) | True when the workflow performs destructive work (deleting directories). | | `SetResourceResolver` | function | SparkEngine | [DynamicPluginHost.h:L42](../../SparkEngine/Source/Core/DynamicPluginHost.h#L42) | | @@ -36005,7 +36092,7 @@ | `SetSampler` | function | SparkEngine | [VulkanDevice.h:L348](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L348) | | | `SetSaveDirectory` | function | SparkEditor | [SaveSystemPanel.h:L55](../../SparkEditor/Source/Panels/SaveSystemPanel.h#L55) | Point the panel and the SaveSystem at @p directory and re-enumerate. | | `SetSaveDirectory` | function | SparkEngine | [SaveSystem.h:L800](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L800) | Override the directory used to store save files at runtime. | -| `SetSaveSystem` | function | SparkEngine | [EngineContext.h:L313](../../SparkEngine/Source/Core/EngineContext.h#L313) | | +| `SetSaveSystem` | function | SparkEngine | [EngineContext.h:L316](../../SparkEngine/Source/Core/EngineContext.h#L316) | | | `SetSaveVersion` | function | SparkEngine | [FreezeSystem.h:L293](../../SparkEngine/Source/Engine/SaveSystem/FreezeSystem.h#L293) | | | `SetScale` | function | SparkEngine | [SceneGraph2D.h:L105](../../SparkEngine/Source/Engine/2D/SceneGraph2D.h#L105) | | | `SetScale` | function | SparkEngine | [AngelScriptEngine.h:L783](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L783) | | @@ -36020,7 +36107,7 @@ | `SetScene` | function | SparkEditor | [TilemapEditorPanel.h:L43](../../SparkEditor/Source/Panels/TilemapEditorPanel.h#L43) | | | `SetScene` | function | SparkEditor | [PrefabManager.h:L248](../../SparkEditor/Source/Prefabs/PrefabManager.h#L248) | Set the active scene for entity queries and instantiation. | | `SetSceneChangedCallback` | function | SparkEditor | [SparkEngineIntegration.h:L496](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L496) | Set scene changed callback | -| `SetSceneManager` | function | SparkEngine | [EngineContext.h:L310](../../SparkEngine/Source/Core/EngineContext.h#L310) | | +| `SetSceneManager` | function | SparkEngine | [EngineContext.h:L313](../../SparkEngine/Source/Core/EngineContext.h#L313) | | | `SetScissorRect` | function | SparkEngine | [D3D11Device.h:L261](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L261) | | | `SetScissorRect` | function | SparkEngine | [D3D12Types.h:L697](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L697) | | | `SetScissorRect` | function | SparkEngine | [MetalDevice.h:L369](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L369) | | @@ -36038,7 +36125,7 @@ | `SetScriptContext` | function | Tests | [TestAngelScriptEngine.cpp:L198](../../Tests/TestAngelScriptEngine.cpp#L198) | | | `SetScriptedCommander` | function | GameModules | [RTSSkirmishSimulation.h:L89](../../GameModules/SparkGameRTS/Source/Simulation/RTSSkirmishSimulation.h#L89) | Bind (or clear with nullptr) the commander that issues Human orders at the start of every tick. | | `SetScriptedMove` | function | GameModules | [TFClientNet.h:L112](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L112) | | -| `SetScriptEngine` | function | SparkEngine | [EngineContext.h:L311](../../SparkEngine/Source/Core/EngineContext.h#L311) | | +| `SetScriptEngine` | function | SparkEngine | [EngineContext.h:L314](../../SparkEngine/Source/Core/EngineContext.h#L314) | | | `SetScrollOffset` | function | SparkEngine | [UILayoutExtensions.h:L90](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L90) | | | `SetSearchFilter` | function | SparkEditor | [HierarchyPanel.h:L200](../../SparkEditor/Source/Panels/HierarchyPanel.h#L200) | Set search filter | | `SetSection` | function | SparkEngine | [DebugOverlay.h:L196](../../SparkEngine/Source/Utils/DebugOverlay.h#L196) | | @@ -36096,7 +36183,7 @@ | `SetShowInactiveObjects` | function | SparkEditor | [HierarchyPanel.h:L206](../../SparkEditor/Source/Panels/HierarchyPanel.h#L206) | Set whether to show inactive objects | | `SetShowObjectIDs` | function | SparkEditor | [HierarchyPanel.h:L212](../../SparkEditor/Source/Panels/HierarchyPanel.h#L212) | Set whether to show object IDs | | `SetShutdownRequestHandler` | function | SparkEngine | [ConsoleProcessManager.h:L100](../../SparkEngine/Source/Utils/ConsoleProcessManager.h#L100) | | -| `SetSignalReportStallForTesting` | function | SparkEngine | [CrashHandler.cpp:L2564](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2564) | | +| `SetSignalReportStallForTesting` | function | SparkEngine | [CrashHandler.cpp:L2610](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2610) | | | `SetSignalReportStallForTesting` | function | SparkEngine | [CrashHandler.h:L161](../../SparkEngine/Source/Utils/CrashHandler.h#L161) | Test seam: make the fatal-signal handler's best-effort stage block. | | `SetSimulation` | function | SparkEngine | [AreaServer.h:L124](../../SparkEngine/Source/Engine/Networking/AreaServer.h#L124) | | | `SetSimulationSettings` | function | SparkEditor | [NetworkDebugPanel.h:L222](../../SparkEditor/Source/Panels/NetworkDebugPanel.h#L222) | Set simulation settings (from external systems) | @@ -36183,7 +36270,7 @@ | `SetTargetBackend` | function | SparkEngine | [ShaderHotReload.h:L286](../../SparkEngine/Source/Graphics/ShaderHotReload.h#L286) | Graphics backend reloads are compiled for. | | `SetTargetPosition` | function | SparkEngine | [PoseModifier.h:L122](../../SparkEngine/Source/Engine/Animation/PoseModifier.h#L122) | | | `SetTargetPosition` | function | SparkEngine | [PoseModifier.h:L152](../../SparkEngine/Source/Engine/Animation/PoseModifier.h#L152) | | -| `SetTelemetryService` | function | SparkEngine | [EngineContext.h:L307](../../SparkEngine/Source/Core/EngineContext.h#L307) | | +| `SetTelemetryService` | function | SparkEngine | [EngineContext.h:L310](../../SparkEngine/Source/Core/EngineContext.h#L310) | | | `SetTemporalBlend` | function | SparkEngine | [RTCompositor.h:L69](../../SparkEngine/Source/Graphics/HybridRT/RTCompositor.h#L69) | | | `SetTestEnvironment` | function | Tests | [TestModuleABI.cpp:L179](../../Tests/TestModuleABI.cpp#L179) | | | `SetTestSecondsLimit` | function | SparkEngine | [ExecScript.h:L91](../../SparkEngine/Source/Core/ExecScript.h#L91) | `-test-seconds N`: wall-clock limit after which the loop should exit (<= 0 disables). | @@ -36210,14 +36297,14 @@ | `SetTime` | function | GameModules | [RPGEngineSystems.h:L60](../../GameModules/SparkGameRPG/Source/Core/RPGEngineSystems.h#L60) | Set time of day (0-24 hours) | | `SetTime` | function | SparkEngine | [Sequencer.h:L280](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L280) | | | `SetTimeOfDay` | function | GameModules | [RTSEngineSystems.h:L83](../../GameModules/SparkGameRTS/Source/Core/RTSEngineSystems.h#L83) | Set the time of day (0-24 hour). | -| `SetTimeOfDay` | function | SparkEngine | [EngineContext.h:L318](../../SparkEngine/Source/Core/EngineContext.h#L318) | | +| `SetTimeOfDay` | function | SparkEngine | [EngineContext.h:L321](../../SparkEngine/Source/Core/EngineContext.h#L321) | | | `SetTimeOfDay` | function | SparkEngine | [TimeOfDaySystem.h:L85](../../SparkEngine/Source/Engine/World/TimeOfDaySystem.h#L85) | Set the current time of day | | `SetTimeOfDay` | function | Tests | [TestDayNightCycle.cpp:L57](../../Tests/TestDayNightCycle.cpp#L57) | | | `SetTimeOfDay` | function | Tests | [TestTimeOfDaySystem.cpp:L54](../../Tests/TestTimeOfDaySystem.cpp#L54) | | | `SetTimeoutDuration` | function | Tests | [TestNetworkManagerOrchestration.cpp:L327](../../Tests/TestNetworkManagerOrchestration.cpp#L327) | | | `SetTimeoutHandler` | function | SparkEngine | [NetworkManager.h:L804](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L804) | Remove a client's visibility scope, reverting to "see everything". | | `SetTimeoutHandler` | function | Tests | [TestNetworkManagerOrchestration.cpp:L326](../../Tests/TestNetworkManagerOrchestration.cpp#L326) | | -| `SetTimer` | function | SparkEngine | [EngineContext.h:L299](../../SparkEngine/Source/Core/EngineContext.h#L299) | | +| `SetTimer` | function | SparkEngine | [EngineContext.h:L302](../../SparkEngine/Source/Core/EngineContext.h#L302) | | | `SetTimer` | function | SparkEngine | [TimerManager.h:L118](../../SparkEngine/Source/Utils/TimerManager.h#L118) | Set (create or replace) a named timer | | `SetTimerRate` | function | SparkEngine | [TimerManager.h:L178](../../SparkEngine/Source/Utils/TimerManager.h#L178) | Change the rate of an existing timer | | `SetTimeScale` | function | GameModules | [Game.h:L246](../../GameModules/SparkGameFPS/Source/Game/Game.h#L246) | Set time scale for the entire game simulation | @@ -36271,10 +36358,10 @@ | `SetTriggerThreshold` | function | Tests | [TestGamepadInputProcessing.cpp:L257](../../Tests/TestGamepadInputProcessing.cpp#L257) | | | `SetTurbidity` | function | SparkEngine | [SkyAtmosphere.h:L133](../../SparkEngine/Source/Graphics/SkyAtmosphere.h#L133) | | | `SetTurnInput` | function | GameModules | [OWPlayerController.h:L66](../../GameModules/SparkGameOpenWorld/Source/Player/OWPlayerController.h#L66) | Turn rate in degrees per second (+ is clockwise, toward east from north) | -| `SetTween` | function | SparkEngine | [EngineContext.h:L324](../../SparkEngine/Source/Core/EngineContext.h#L324) | | +| `SetTween` | function | SparkEngine | [EngineContext.h:L327](../../SparkEngine/Source/Core/EngineContext.h#L327) | | | `SetType` | function | SparkEngine | [LightingSystem.h:L83](../../SparkEngine/Source/Graphics/LightingSystem.h#L83) | | | `SetUAVDescriptor` | function | SparkEngine | [D3D12Types.h:L496](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L496) | | -| `SetUI` | function | SparkEngine | [EngineContext.h:L319](../../SparkEngine/Source/Core/EngineContext.h#L319) | | +| `SetUI` | function | SparkEngine | [EngineContext.h:L322](../../SparkEngine/Source/Core/EngineContext.h#L322) | | | `SetUInt` | function | SparkEngine | [ProfileProperties.h:L70](../../SparkEngine/Source/Utils/ProfileProperties.h#L70) | Set a property's value as unsigned integer (stored in float) | | `SetUint32` | function | Tests | [TestNeuralWeightsValidation.cpp:L32](../../Tests/TestNeuralWeightsValidation.cpp#L32) | | | `SetUndoRedoManager` | function | SparkEditor | [VisualScriptPanel.h:L214](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L214) | | @@ -36306,7 +36393,7 @@ | `SetupCrashHandler` | function | SparkEngine | [SparkEngineLinuxInternal.h:L38](../../SparkEngine/Source/Core/SparkEngineLinuxInternal.h#L38) | | | `SetupCrashHandler` | function | SparkEngine | [SparkEngineWindowsInternal.h:L54](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L54) | | | `SetupCustomDrawCallbacks` | function | SparkEditor | [EditorTheme.h:L298](../../SparkEditor/Source/Core/EditorTheme.h#L298) | Create custom orange accent theme | -| `SetupDefaultDockLayout` | function | SparkEditor | [EditorUI.h:L505](../../SparkEditor/Source/Core/EditorUI.h#L505) | | +| `SetupDefaultDockLayout` | function | SparkEditor | [EditorUI.h:L503](../../SparkEditor/Source/Core/EditorUI.h#L503) | | | `SetupDefaultRaceRoster` | function | GameModules | [SparkGameRacing.h:L65](../../GameModules/SparkGameRacing/Source/Core/SparkGameRacing.h#L65) | | | `SetupDeferredPipeline` | function | SparkEngine | [GraphicsEngine.h:L1317](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L1317) | | | `SetupDestruction` | function | GameModules | [ARPGEngineSystems.h:L112](../../GameModules/SparkGameARPG/Source/Core/ARPGEngineSystems.h#L112) | | @@ -36365,7 +36452,7 @@ | `SetVertexBuffer` | function | SparkEngine | [RHIDevice.h:L95](../../SparkEngine/Source/Graphics/RHI/RHIDevice.h#L95) | | | `SetVertexBuffer` | function | SparkEngine | [VulkanDevice.h:L344](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L344) | | | `SetVerticalThrust` | function | GameModules | [VehicleSystem.h:L150](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L150) | Apply vertical thrust (aerial vehicles) | -| `SetVFS` | function | SparkEngine | [EngineContext.h:L338](../../SparkEngine/Source/Core/EngineContext.h#L338) | | +| `SetVFS` | function | SparkEngine | [EngineContext.h:L341](../../SparkEngine/Source/Core/EngineContext.h#L341) | | | `SetVibration` | function | SparkEngine | [GamepadInput.h:L306](../../SparkEngine/Source/Input/GamepadInput.h#L306) | | | `SetVibration` | function | Tests | [TestGamepadInputProcessing.cpp:L223](../../Tests/TestGamepadInputProcessing.cpp#L223) | | | `SetViewAngles` | function | GameModules | [TFClientNet.h:L116](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L116) | | @@ -36398,27 +36485,30 @@ | `SetVolumeBlendEnabled` | function | SparkEngine | [PostProcessingPipeline.h:L202](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L202) | Whether `Process()` should push the blended volume stack | | `SetVolumetricSettings` | function | SparkEngine | [FogSystem.h:L237](../../SparkEngine/Source/Graphics/FogSystem.h#L237) | | | `SetVolumetricSettings` | function | SparkEngine | [GraphicsEngine.h:L641](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L641) | Configure volumetric lighting | -| `SetVR` | function | SparkEngine | [EngineContext.h:L328](../../SparkEngine/Source/Core/EngineContext.h#L328) | | +| `SetVR` | function | SparkEngine | [EngineContext.h:L331](../../SparkEngine/Source/Core/EngineContext.h#L331) | | | `SetVRAMBudgetMonitor` | function | SparkEngine | [TextureSystem.h:L282](../../SparkEngine/Source/Graphics/TextureSystem.h#L282) | Set the VRAM budget monitor for pressure-driven eviction | | `SetVRAMUsageMB` | function | SparkEngine | [DebugOverlay.h:L219](../../SparkEngine/Source/Utils/DebugOverlay.h#L219) | | | `SetWaitTime` | function | GameModules | [InteractiveObject.h:L259](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L259) | | | `SetWatchDirectory` | function | SparkEngine | [ModuleHotReload.h:L139](../../SparkEngine/Source/Engine/HotReload/ModuleHotReload.h#L139) | Set the base directory to watch for DLL changes | | `SetWatchExtensions` | function | SparkEngine | [ScriptHotReload.h:L96](../../SparkEngine/Source/Engine/Scripting/ScriptHotReload.h#L96) | Set file extensions to watch (default: .as, .angelscript) | | `SetWatchExtensions` | function | Tests | [TestScriptHotReload.cpp:L53](../../Tests/TestScriptHotReload.cpp#L53) | | -| `SetWeapons` | function | SparkEngine | [EngineContext.h:L330](../../SparkEngine/Source/Core/EngineContext.h#L330) | | +| `SetWeapons` | function | SparkEngine | [EngineContext.h:L333](../../SparkEngine/Source/Core/EngineContext.h#L333) | | | `SetWeaponStatus` | function | GameModules | [TFHUD.h:L79](../../GameModules/SparkGameMMOFPS/Source/UI/TFHUD.h#L79) | | | `SetWeaponType` | function | GameModules | [InteractiveObject.h:L350](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L350) | | | `SetWeather` | function | GameModules | [EngineWeatherAdapter.h:L20](../../GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.h#L20) | | -| `SetWeather` | function | GameModules | [FPSWeatherIntegration.h:L32](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L32) | | +| `SetWeather` | function | GameModules | [FPSWeatherIntegration.h:L34](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L34) | | | `SetWeather` | function | GameModules | [FPSWeatherPort.h:L28](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherPort.h#L28) | | | `SetWeather` | function | GameModules | [OWEngineSystems.h:L52](../../GameModules/SparkGameOpenWorld/Source/Core/OWEngineSystems.h#L52) | Validate the slot's gameplay snapshot, then restore the world and gameplay state from it. | | `SetWeather` | function | GameModules | [RPGEngineSystems.h:L57](../../GameModules/SparkGameRPG/Source/Core/RPGEngineSystems.h#L57) | Set weather type by name (clear/rain/snow/fog/storm) | | `SetWeather` | function | GameModules | [RTSEngineSystems.h:L80](../../GameModules/SparkGameRTS/Source/Core/RTSEngineSystems.h#L80) | Set the weather type by name ("clear", "rain", "fog", "storm", "snow"). | | `SetWeather` | function | GameModules | [RacingEngineSystems.h:L84](../../GameModules/SparkGameRacing/Source/Core/RacingEngineSystems.h#L84) | Set weather type by name (clear/rain/storm). | -| `SetWeather` | function | SparkEngine | [EngineContext.h:L317](../../SparkEngine/Source/Core/EngineContext.h#L317) | | +| `SetWeather` | function | SparkEngine | [EngineContext.h:L320](../../SparkEngine/Source/Core/EngineContext.h#L320) | | +| `SetWeather` | function | SparkEngine | [EngineSdkWeather.h:L14](../../SparkEngine/Source/Core/EngineSdkWeather.h#L14) | | | `SetWeather` | function | SparkEngine | [VolumetricClouds.h:L145](../../SparkEngine/Source/Graphics/VolumetricClouds.h#L145) | Set coverage/type/rain from the weather system | | `SetWeather` | function | SparkEngine | [WeatherSystem.h:L243](../../SparkEngine/Source/Graphics/WeatherSystem.h#L243) | Set a new weather condition with transition | -| `SetWeather` | function | Tests | [TestFPSWeatherPort.cpp:L13](../../Tests/TestFPSWeatherPort.cpp#L13) | | +| `SetWeather` | function | SparkSDK | [IWeatherService.h:L38](../../SparkSDK/Include/Spark/IWeatherService.h#L38) | | +| `SetWeather` | function | Tests | [TestFPSWeatherPort.cpp:L15](../../Tests/TestFPSWeatherPort.cpp#L15) | | +| `SetWeather` | function | Tests | [TestFPSWeatherPort.cpp:L33](../../Tests/TestFPSWeatherPort.cpp#L33) | | | `SetWeather` | function | Tests | [TestWeatherSystem.cpp:L93](../../Tests/TestWeatherSystem.cpp#L93) | | | `SetWeatherPort` | function | GameModules | [Game.h:L335](../../GameModules/SparkGameFPS/Source/Game/Game.h#L335) | Set the engine context for SDK v2 subsystem access | | `SetWeatherPreset` | function | GameModules | [Game.h:L337](../../GameModules/SparkGameFPS/Source/Game/Game.h#L337) | Set the engine context for SDK v2 subsystem access | @@ -36439,7 +36529,7 @@ | `SetWorld` | function | SparkEditor | [SceneStatisticsPanel.h:L44](../../SparkEditor/Source/Panels/SceneStatisticsPanel.h#L44) | Point the panel at the document World whose entities it counts. | | `SetWorld` | function | SparkEditor | [SceneViewPanel.h:L107](../../SparkEditor/Source/Panels/SceneViewPanel.h#L107) | Inject the shared ECS World to render (owned by EditorUI; the | | `SetWorld` | function | SparkEditor | [SearchPanel.h:L78](../../SparkEditor/Source/Panels/SearchPanel.h#L78) | Point the panel at the document World whose entities it searches. | -| `SetWorld` | function | SparkEngine | [EngineContext.h:L309](../../SparkEngine/Source/Core/EngineContext.h#L309) | | +| `SetWorld` | function | SparkEngine | [EngineContext.h:L312](../../SparkEngine/Source/Core/EngineContext.h#L312) | | | `SetWorld` | function | SparkEngine | [DestructionSystem.h:L207](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L207) | Set the ECS World pointer for entity creation. Must be called before ApplyDamage. | | `SetWorld` | function | SparkEngine | [InvalidStateDetector.h:L124](../../SparkEngine/Source/Utils/InvalidStateDetector.h#L124) | | | `SetWorldGravity` | function | GameModules | [GravitySystem.h:L173](../../GameModules/SparkGameFPS/Source/Game/GravitySystem.h#L173) | Set the world default gravity | @@ -36657,6 +36747,7 @@ | `ShouldRender` | function | SparkEngine | [InGameConsole.h:L281](../../SparkEngine/Source/Utils/InGameConsole.h#L281) | Check if the console overlay should be rendered | | `ShouldReorder` | function | SparkEngine | [InstabilitySimulator.h:L127](../../SparkEngine/Source/Engine/Networking/InstabilitySimulator.h#L127) | Check if a packet should be reordered based on reorderPercent | | `ShouldRunScript` | function | Tests | [TestAngelScriptEngine.cpp:L201](../../Tests/TestAngelScriptEngine.cpp#L201) | | +| `ShouldSend` | function | GameModules | [TFReplicationRefresh.h:L23](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L23) | | | `ShouldShowInputCaptureHint` | function | SparkEditor | [GameViewPanel.h:L87](../../SparkEditor/Source/Panels/GameViewPanel.h#L87) | | | `ShouldShowInputReleaseHint` | function | SparkEditor | [GameViewPanel.h:L88](../../SparkEditor/Source/Panels/GameViewPanel.h#L88) | | | `ShouldShowStartupSplash` | function | SparkEngine | [StartupSplash.cpp:L423](../../SparkEngine/Source/Core/StartupSplash.cpp#L423) | | @@ -36774,7 +36865,7 @@ | `Shutdown` | function | GameModules | [TFVehicleTerminal.h:L44](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleTerminal.h#L44) | | | `Shutdown` | function | GameModules | [TFWeaponSystem.h:L49](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L49) | | | `Shutdown` | function | GameModules | [TFClientNet.h:L79](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L79) | | -| `Shutdown` | function | GameModules | [TFReplication.h:L62](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L62) | | +| `Shutdown` | function | GameModules | [TFReplication.h:L66](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L66) | | | `Shutdown` | function | GameModules | [TFServerSim.h:L63](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L63) | | | `Shutdown` | function | GameModules | [TFChatWindow.h:L48](../../GameModules/SparkGameMMOFPS/Source/UI/TFChatWindow.h#L48) | | | `Shutdown` | function | GameModules | [TFDeathRecap.h:L68](../../GameModules/SparkGameMMOFPS/Source/UI/TFDeathRecap.h#L68) | | @@ -36858,7 +36949,7 @@ | `Shutdown` | function | SparkEditor | [AIEditorPanel.h:L31](../../SparkEditor/Source/Panels/AIEditorPanel.h#L31) | | | `Shutdown` | function | SparkEditor | [AbilityEditorPanel.h:L32](../../SparkEditor/Source/Panels/AbilityEditorPanel.h#L32) | | | `Shutdown` | function | SparkEditor | [AssetAuditGraph.h:L139](../../SparkEditor/Source/Panels/AssetAuditGraph.h#L139) | Shut down and clear all data | -| `Shutdown` | function | SparkEditor | [AssetBrowserPanel.h:L59](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L59) | Shutdown the asset browser panel | +| `Shutdown` | function | SparkEditor | [AssetBrowserPanel.h:L60](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L60) | Shutdown the asset browser panel | | `Shutdown` | function | SparkEditor | [AudioMixerPanel.h:L31](../../SparkEditor/Source/Panels/AudioMixerPanel.h#L31) | | | `Shutdown` | function | SparkEditor | [BasicMaterialEditorPanel.h:L50](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L50) | | | `Shutdown` | function | SparkEditor | [BuildCookPanel.h:L112](../../SparkEditor/Source/Panels/BuildCookPanel.h#L112) | | @@ -37242,10 +37333,10 @@ | `SignalHandler` | function | SparkEditor | [EditorCrashHandler.h:L126](../../SparkEditor/Source/Core/EditorCrashHandler.h#L126) | | | `SignalHandler` | function | SparkEngine | [SparkEngineLinux.cpp:L66](../../SparkEngine/Source/Core/SparkEngineLinux.cpp#L66) | | | `SignalPosixProcess` | function | SparkEditor | [EditorProcessLaunchPosixInternal.h:L171](../../SparkEditor/Source/Utils/EditorProcessLaunchPosixInternal.h#L171) | | -| `SignalSafeLength` | function | SparkEngine | [CrashHandler.cpp:L2071](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2071) | | -| `SignalSafeWrite` | function | SparkEngine | [CrashHandler.cpp:L2079](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2079) | | -| `SignalSafeWrite` | function | SparkEngine | [CrashHandler.cpp:L2100](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2100) | | -| `SignalSafeWriteNumber` | function | SparkEngine | [CrashHandler.cpp:L2106](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2106) | | +| `SignalSafeLength` | function | SparkEngine | [CrashHandler.cpp:L2077](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2077) | | +| `SignalSafeWrite` | function | SparkEngine | [CrashHandler.cpp:L2085](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2085) | | +| `SignalSafeWrite` | function | SparkEngine | [CrashHandler.cpp:L2106](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2106) | | +| `SignalSafeWriteNumber` | function | SparkEngine | [CrashHandler.cpp:L2137](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2137) | | | `SignedBody` | function | SparkGateway | [GatewayAreaControl.cpp:L552](../../SparkGateway/src/GatewayAreaControl.cpp#L552) | | | `SignedDistance` | function | SparkEngine | [D3D11FrustumCulling.h:L84](../../SparkEngine/Source/Graphics/D3D11FrustumCulling.h#L84) | | | `silent` | function | Tests | [TestNetTransportSecurity.cpp:L412](../../Tests/TestNetTransportSecurity.cpp#L412) | | @@ -37347,8 +37438,9 @@ | `SingleValue3D` | function | SparkEngine | [FastNoiseLite.h:L266](../../SparkEngine/Source/Graphics/FastNoiseLite.h#L266) | | | `SingleValue3D` | function | SparkEngine | [FastNoiseLite.h:L268](../../SparkEngine/Source/Graphics/FastNoiseLite.h#L268) | | | `SingleValue3D` | function | SparkEngine | [FastNoiseLite.h:L500](../../SparkEngine/Source/Graphics/FastNoiseLite.h#L500) | | -| `size` | function | SparkEditor | [AssetBrowserPanel.cpp:L432](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L432) | | -| `size` | function | SparkEditor | [AssetBrowserPanel.cpp:L474](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L474) | | +| `Size` | function | GameModules | [TFReplicationRefresh.h:L43](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L43) | | +| `size` | function | SparkEditor | [AssetBrowserGrid.cpp:L212](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L212) | | +| `size` | function | SparkEditor | [AssetBrowserGrid.cpp:L254](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L254) | | | `size` | function | SparkEditor | [WeaponEditorPanel.cpp:L384](../../SparkEditor/Source/Panels/WeaponEditorPanel.cpp#L384) | | | `Size` | function | SparkEngine | [SceneSnapshotSerializer.h:L57](../../SparkEngine/Source/Engine/Editor/SceneSnapshotSerializer.h#L57) | | | `Size` | function | SparkEngine | [AsyncDatabase.h:L107](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L107) | A batch of queries executed atomically (all-or-nothing). | @@ -37554,10 +37646,12 @@ | `source` | function | Tests | [TestTF120Migration.cpp:L247](../../Tests/TestTF120Migration.cpp#L247) | | | `source` | function | Tests | [TestTF120Migration.cpp:L307](../../Tests/TestTF120Migration.cpp#L307) | | | `source` | function | Tests | [TestTF120Migration.cpp:L366](../../Tests/TestTF120Migration.cpp#L366) | | -| `source` | function | Tests | [TestTF120Travel.cpp:L363](../../Tests/TestTF120Travel.cpp#L363) | | -| `source` | function | Tests | [TestTF120Travel.cpp:L551](../../Tests/TestTF120Travel.cpp#L551) | | -| `SourceAuthority` | function | Tests | [TestTF120Travel.cpp:L202](../../Tests/TestTF120Travel.cpp#L202) | | -| `sourceAuthority` | function | Tests | [TestTF120Travel.cpp:L549](../../Tests/TestTF120Travel.cpp#L549) | | +| `source` | function | Tests | [TestTF120Travel.cpp:L81](../../Tests/TestTF120Travel.cpp#L81) | | +| `source` | function | Tests | [TestTF120Travel.cpp:L350](../../Tests/TestTF120Travel.cpp#L350) | | +| `source` | function | Tests | [TestTF120Travel.cpp:L538](../../Tests/TestTF120Travel.cpp#L538) | | +| `source` | function | Tests | [TestTFDataTables.cpp:L47](../../Tests/TestTFDataTables.cpp#L47) | | +| `SourceAuthority` | function | Tests | [TestTF120Travel.cpp:L189](../../Tests/TestTF120Travel.cpp#L189) | | +| `sourceAuthority` | function | Tests | [TestTF120Travel.cpp:L536](../../Tests/TestTF120Travel.cpp#L536) | | | `SourceDataDirectory` | function | Tests | [TestRegionMapDataSource.cpp:L24](../../Tests/TestRegionMapDataSource.cpp#L24) | | | `sourceDir` | function | Tests | [TestEditorStateCompatibility.cpp:L40](../../Tests/TestEditorStateCompatibility.cpp#L40) | | | `sourceDir` | function | Tests | [TestEditorStateCompatibility.cpp:L42](../../Tests/TestEditorStateCompatibility.cpp#L42) | | @@ -37579,8 +37673,8 @@ | `sp` | function | Tests | [TestGameModeReal.cpp:L83](../../Tests/TestGameModeReal.cpp#L83) | | | `SpacedNumber` | function | SparkEditor | [PrefabTextFormat.cpp:L138](../../SparkEditor/Source/Prefabs/PrefabTextFormat.cpp#L138) | | | `spaces` | function | Tests | [TestLauncherProcess.cpp:L240](../../Tests/TestLauncherProcess.cpp#L240) | | -| `Spark::AssetPipeline::CookAssets` | method | SparkAssetPipelineCore | [AssetCookerTests.cpp:L86](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L86) | | -| `Spark::Cinematic::SequencerManager::GetInstance` | method | GameModules | [Main.cpp:L950](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L950) | | +| `Spark::AssetPipeline::CookAssets` | method | SparkAssetPipelineCore | [AssetCookerTests.cpp:L88](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L88) | | +| `Spark::Cinematic::SequencerManager::GetInstance` | method | GameModules | [Main.cpp:L953](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L953) | | | `Spark::ComponentFactory::Get` | method | SparkEngine | [AngelScriptEngine.cpp:L1475](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.cpp#L1475) | | | `Spark::ContainerUtils::Contains` | method | GameModules | [MMOCharacterSystem.cpp:L200](../../GameModules/SparkGameMMO/Source/Character/MMOCharacterSystem.cpp#L200) | | | `Spark::ContainerUtils::Contains` | method | GameModules | [MMOCraftingSystem.cpp:L329](../../GameModules/SparkGameMMO/Source/Crafting/MMOCraftingSystem.cpp#L329) | | @@ -37594,16 +37688,16 @@ | `Spark::ContainerUtils::Contains` | method | SparkEngine | [LocalFileCache.h:L297](../../SparkEngine/Source/Utils/LocalFileCache.h#L297) | Check if a path is currently cached | | `Spark::Core::Lifecycle::GetGameplayFrameCountImpl` | method | SparkEngine | [GameplaySystemLifecycle.cpp:L341](../../SparkEngine/Source/Core/GameplaySystemLifecycle.cpp#L341) | | | `Spark::Core::Lifecycle::GetPhaseSystemManagerImpl` | method | Tests | [TestLIFE200LifecycleLoopReal.cpp:L225](../../Tests/TestLIFE200LifecycleLoopReal.cpp#L225) | | -| `Spark::CrashHandlerDetail::FormatSymbolicCrashFrames` | method | SparkEngine | [CrashHandler.cpp:L1993](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1993) | | -| `Spark::CrashHandlerDetail::PathFromUtf8` | method | SparkEngine | [CrashHandler.cpp:L521](../../SparkEngine/Source/Utils/CrashHandler.cpp#L521) | | -| `Spark::CrashHandlerDetail::WideToUtf8` | method | SparkEngine | [CrashHandler.cpp:L112](../../SparkEngine/Source/Utils/CrashHandler.cpp#L112) | | +| `Spark::CrashHandlerDetail::FormatSymbolicCrashFrames` | method | SparkEngine | [CrashHandler.cpp:L1995](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1995) | | +| `Spark::CrashHandlerDetail::PathFromUtf8` | method | SparkEngine | [CrashHandler.cpp:L522](../../SparkEngine/Source/Utils/CrashHandler.cpp#L522) | | +| `Spark::CrashHandlerDetail::WideToUtf8` | method | SparkEngine | [CrashHandler.cpp:L113](../../SparkEngine/Source/Utils/CrashHandler.cpp#L113) | | | `Spark::Daemon::FormatDaemonStats` | method | SparkEngine | [DaemonLifecycle.cpp:L92](../../SparkEngine/Source/Utils/DaemonLifecycle.cpp#L92) | | | `Spark::Daemon::FormatDaemonStats` | method | SparkEngine | [DaemonLifecycle.cpp:L142](../../SparkEngine/Source/Utils/DaemonLifecycle.cpp#L142) | | | `Spark::Editor::CommandHistory::GetInstance` | method | SparkEditor | [EditorUI.cpp:L196](../../SparkEditor/Source/Core/EditorUI.cpp#L196) | | | `Spark::Editor::CommandHistory::GetInstance` | method | Tests | [TestEDT210InspectorEditCommitReal.cpp:L109](../../Tests/TestEDT210InspectorEditCommitReal.cpp#L109) | | | `Spark::Editor::CommandHistory::GetInstance` | method | Tests | [TestEDT210InspectorEditCommitReal.cpp:L114](../../Tests/TestEDT210InspectorEditCommitReal.cpp#L114) | | | `Spark::Editor::CommandHistory::GetInstance` | method | Tests | [TestEditorAssetDropWorldReal.cpp:L49](../../Tests/TestEditorAssetDropWorldReal.cpp#L49) | | -| `Spark::Editor::CommandHistory::GetInstance` | method | Tests | [TestEditorCookPackageReal.cpp:L98](../../Tests/TestEditorCookPackageReal.cpp#L98) | | +| `Spark::Editor::CommandHistory::GetInstance` | method | Tests | [TestEditorCookPackageReal.cpp:L100](../../Tests/TestEditorCookPackageReal.cpp#L100) | | | `Spark::Editor::CommandHistory::GetInstance` | method | Tests | [TestEditorDocumentReal.cpp:L27](../../Tests/TestEditorDocumentReal.cpp#L27) | | | `Spark::Editor::CommandHistory::GetInstance` | method | Tests | [TestEditorUndoWorldMatrixReal.cpp:L39](../../Tests/TestEditorUndoWorldMatrixReal.cpp#L39) | | | `Spark::FileIntegrity::ComputeSha256` | method | Tests | [TestGoldenImageTest.cpp:L79](../../Tests/TestGoldenImageTest.cpp#L79) | | @@ -37622,14 +37716,14 @@ | `Spark::HeadlessTickStats::ParseVmHwmKib` | method | SparkEngine | [SparkEngineLinuxHeadless.cpp:L71](../../SparkEngine/Source/Core/SparkEngineLinuxHeadless.cpp#L71) | | | `Spark::IsSDKCompatible` | method | Tests | [module_api.cpp:L12](../../Tests/PackageSmoke/FPSProgression/module_api.cpp#L12) | | | `Spark::JobSystem::ParseWorkerCount` | method | SparkEngine | [SparkEngineLinux.cpp:L243](../../SparkEngine/Source/Core/SparkEngineLinux.cpp#L243) | | -| `Spark::Json::Parse` | method | Tests | [TestTFDataTables.cpp:L72](../../Tests/TestTFDataTables.cpp#L72) | | +| `Spark::Json::Parse` | method | Tests | [TestTFDataTables.cpp:L63](../../Tests/TestTFDataTables.cpp#L63) | | | `Spark::Json::ParseBounded` | method | SparkEditor | [EditorRecoveryJson.h:L38](../../SparkEditor/Source/Core/EditorRecoveryJson.h#L38) | | | `Spark::Json::ParseStrict` | method | SparkEditor | [RegionMapDataSource.cpp:L107](../../SparkEditor/Source/Panels/RegionMapDataSource.cpp#L107) | | | `Spark::Json::StringifyPretty` | method | SparkLauncher | [LauncherProcess.cpp:L381](../../SparkLauncher/src/LauncherProcess.cpp#L381) | | | `Spark::Json::Value` | method | Tests | [TestDATA120SecretsAtRest.cpp:L120](../../Tests/TestDATA120SecretsAtRest.cpp#L120) | | | `Spark::Net::InstabilitySimulator::GetInstance` | method | SparkEngine | [SubsystemConsoleCommands.cpp:L354](../../SparkEngine/Source/Core/SubsystemConsoleCommands.cpp#L354) | | | `Spark::Net::InstabilitySimulator::GetInstance` | method | SparkEngine | [SubsystemConsoleCommands.cpp:L408](../../SparkEngine/Source/Core/SubsystemConsoleCommands.cpp#L408) | | -| `Spark::Net::NetworkManager::GetInstance` | method | GameModules | [GameConsoleOps.cpp:L1138](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1138) | | +| `Spark::Net::NetworkManager::GetInstance` | method | GameModules | [GameConsoleOps.cpp:L1146](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1146) | | | `Spark::Net::NetworkManager::GetInstance` | method | Tests | [DebugHookTeardownProbe.cpp:L14](../../Tests/Teardown/DebugHookTeardownProbe.cpp#L14) | | | `Spark::ParseExecScript` | method | Tests | [TestExecScript.cpp:L57](../../Tests/TestExecScript.cpp#L57) | | | `Spark::PasswordHash::ComputeHmacSha256` | method | SparkGateway | [GatewaySecurity.cpp:L64](../../SparkGateway/src/GatewaySecurity.cpp#L64) | | @@ -37782,8 +37876,8 @@ | `SparkEngineIntegration::UpdateEntityTransform` | method | SparkEditor | [SparkEngineIntegration.cpp:L377](../../SparkEditor/Source/Integration/SparkEngineIntegration.cpp#L377) | | | `SparkError::HResultFailed` | method | SparkEngine | [SparkError.h:L326](../../SparkEngine/Source/Utils/SparkError.h#L326) | | | `SparkError::HResultFailed` | method | SparkEngine | [SparkError.h:L336](../../SparkEngine/Source/Utils/SparkError.h#L336) | | -| `SparkFPS::FPSMultiplayerSystem::GetInstance` | method | GameModules | [GameConsoleOps.cpp:L1123](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1123) | | -| `SparkFPS::FPSMultiplayerSystem::GetInstance` | method | GameModules | [GameConsoleOps.cpp:L1130](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1130) | | +| `SparkFPS::FPSMultiplayerSystem::GetInstance` | method | GameModules | [GameConsoleOps.cpp:L1131](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1131) | | +| `SparkFPS::FPSMultiplayerSystem::GetInstance` | method | GameModules | [GameConsoleOps.cpp:L1138](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1138) | | | `SparkGameARPGModule::GetModuleInfo` | method | GameModules | [Main.cpp:L54](../../GameModules/SparkGameARPG/Source/Core/Main.cpp#L54) | | | `SparkGameARPGModule::OnFixedUpdate` | method | GameModules | [Main.cpp:L316](../../GameModules/SparkGameARPG/Source/Core/Main.cpp#L316) | | | `SparkGameARPGModule::OnImGui` | method | GameModules | [Main.cpp:L346](../../GameModules/SparkGameARPG/Source/Core/Main.cpp#L346) | | @@ -37824,7 +37918,7 @@ | `SparkGameMMOModule::RegisterStateValidationRules` | method | GameModules | [Main.cpp:L343](../../GameModules/SparkGameMMO/Source/Core/Main.cpp#L343) | | | `SparkGameMMOModule::ShutdownSystems` | method | GameModules | [Main.cpp:L427](../../GameModules/SparkGameMMO/Source/Core/Main.cpp#L427) | | | `SparkGameMMOModule::UnregisterConsoleCommands` | method | GameModules | [Main.cpp:L971](../../GameModules/SparkGameMMO/Source/Core/Main.cpp#L971) | | -| `SparkGameModule` | function | GameModules | [Main.cpp:L1380](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1380) | | +| `SparkGameModule` | function | GameModules | [Main.cpp:L1383](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1383) | | | `SparkGameModule::GetModuleInfo` | method | GameModules | [Main.cpp:L95](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L95) | | | `SparkGameModule::HeadlessQuickLoad` | method | GameModules | [HeadlessPersistence.cpp:L143](../../GameModules/SparkGameFPS/Source/Core/HeadlessPersistence.cpp#L143) | | | `SparkGameModule::HeadlessQuickSave` | method | GameModules | [HeadlessPersistence.cpp:L100](../../GameModules/SparkGameFPS/Source/Core/HeadlessPersistence.cpp#L100) | | @@ -37835,13 +37929,13 @@ | `SparkGameModule::OnLoad` | method | GameModules | [Main.cpp:L105](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L105) | | | `SparkGameModule::OnPause` | method | GameModules | [Main.cpp:L231](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L231) | | | `SparkGameModule::OnRender` | method | GameModules | [Main.cpp:L225](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L225) | | -| `SparkGameModule::OnResize` | method | GameModules | [Main.cpp:L379](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L379) | | +| `SparkGameModule::OnResize` | method | GameModules | [Main.cpp:L382](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L382) | | | `SparkGameModule::OnResume` | method | GameModules | [Main.cpp:L237](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L237) | | | `SparkGameModule::OnUnload` | method | GameModules | [Main.cpp:L195](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L195) | | | `SparkGameModule::OnUpdate` | method | GameModules | [Main.cpp:L200](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L200) | | -| `SparkGameModule::RegisterGameConsoleCommands` | method | GameModules | [Main.cpp:L390](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L390) | | +| `SparkGameModule::RegisterGameConsoleCommands` | method | GameModules | [Main.cpp:L393](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L393) | | | `SparkGameModule::RegisterHeadlessPersistenceCommands` | method | GameModules | [HeadlessPersistence.cpp:L39](../../GameModules/SparkGameFPS/Source/Core/HeadlessPersistence.cpp#L39) | | -| `SparkGameModule::Shutdown` | method | GameModules | [Main.cpp:L341](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L341) | | +| `SparkGameModule::Shutdown` | method | GameModules | [Main.cpp:L346](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L346) | | | `SparkGameModule::ShutdownHeadlessArena` | method | GameModules | [HeadlessArena.cpp:L90](../../GameModules/SparkGameFPS/Source/Core/HeadlessArena.cpp#L90) | | | `SparkGameOpenWorldModule::GetModuleInfo` | method | GameModules | [Main.cpp:L48](../../GameModules/SparkGameOpenWorld/Source/Core/Main.cpp#L48) | | | `SparkGameOpenWorldModule::OnFixedUpdate` | method | GameModules | [Main.cpp:L296](../../GameModules/SparkGameOpenWorld/Source/Core/Main.cpp#L296) | | @@ -38263,7 +38357,7 @@ | `StandardPipelineBuilder::MakeShadowDesc` | method | SparkEngine | [RenderGraphBuilder.cpp:L71](../../SparkEngine/Source/Graphics/RenderGraph/RenderGraphBuilder.cpp#L71) | | | `StandardPipelineBuilder::SetCallbacks` | method | SparkEngine | [RenderGraphBuilder.cpp:L31](../../SparkEngine/Source/Graphics/RenderGraph/RenderGraphBuilder.cpp#L31) | | | `StandardPipelineBuilder::SetFrameData` | method | SparkEngine | [RenderGraphBuilder.cpp:L26](../../SparkEngine/Source/Graphics/RenderGraph/RenderGraphBuilder.cpp#L26) | | -| `StandOnSpawnPad` | function | Tests | [TestTF120Travel.cpp:L164](../../Tests/TestTF120Travel.cpp#L164) | | +| `StandOnSpawnPad` | function | Tests | [TestTF120Travel.cpp:L151](../../Tests/TestTF120Travel.cpp#L151) | | | `Start` | function | GameModules | [WaveSpawner.h:L82](../../GameModules/SparkGameFPS/Source/Game/WaveSpawner.h#L82) | Start wave progression from wave 1 | | `Start` | function | SparkEngine | [DynamicPluginHost.h:L52](../../SparkEngine/Source/Core/DynamicPluginHost.h#L52) | | | `Start` | function | SparkEngine | [ModuleHotReload.h:L80](../../SparkEngine/Source/Core/ModuleHotReload.h#L80) | Start watching for changes | @@ -38381,6 +38475,7 @@ | `State` | function | Tests | [TestEDT210InspectorEditCommitReal.cpp:L55](../../Tests/TestEDT210InspectorEditCommitReal.cpp#L55) | | | `State` | function | Tests | [TestENG200ScriptHotReloadReal.cpp:L99](../../Tests/TestENG200ScriptHotReloadReal.cpp#L99) | | | `State` | function | Tests | [TestEditorAssetDropWorldReal.cpp:L61](../../Tests/TestEditorAssetDropWorldReal.cpp#L61) | | +| `StateAt` | function | Tests | [TestTFReplicationRefresh.cpp:L19](../../Tests/TestTFReplicationRefresh.cpp#L19) | | | `StateDocument` | function | SparkInstaller | [InstallStateTests.cpp:L224](../../SparkInstaller/tests/InstallStateTests.cpp#L224) | | | `stateLock` | function | SparkEngine | [NetworkConnection.cpp:L253](../../SparkEngine/Source/Engine/Networking/NetworkConnection.cpp#L253) | | | `stateLock` | function | SparkEngine | [NetworkConnection.cpp:L431](../../SparkEngine/Source/Engine/Networking/NetworkConnection.cpp#L431) | | @@ -38425,11 +38520,11 @@ | `status` | function | SparkEditor | [main.cpp:L51](../../SparkEditor/Source/main.cpp#L51) | | | `status` | function | SparkEngine | [SparkEngineLinuxHeadless.cpp:L67](../../SparkEngine/Source/Core/SparkEngineLinuxHeadless.cpp#L67) | | | `status` | function | Tests | [TestEngineLoadTest.cpp:L119](../../Tests/TestEngineLoadTest.cpp#L119) | | -| `statusBarPos` | function | SparkEditor | [EditorUI.cpp:L945](../../SparkEditor/Source/Core/EditorUI.cpp#L945) | | -| `statusBarSize` | function | SparkEditor | [EditorUI.cpp:L946](../../SparkEditor/Source/Core/EditorUI.cpp#L946) | | +| `statusBarPos` | function | SparkEditor | [EditorUI.cpp:L965](../../SparkEditor/Source/Core/EditorUI.cpp#L965) | | +| `statusBarSize` | function | SparkEditor | [EditorUI.cpp:L966](../../SparkEditor/Source/Core/EditorUI.cpp#L966) | | | `statusColor` | function | SparkEditor | [WorkflowPanel.cpp:L193](../../SparkEditor/Source/Panels/WorkflowPanel.cpp#L193) | | | `statusColor` | function | SparkEditor | [VersionControlRender.cpp:L163](../../SparkEditor/Source/VersionControl/VersionControlRender.cpp#L163) | | -| `statusFile` | function | SparkEngine | [CrashHandler.cpp:L1739](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1739) | | +| `statusFile` | function | SparkEngine | [CrashHandler.cpp:L1740](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1740) | | | `StatusLine` | function | Tests | [TestSparkGameShowcase.cpp:L197](../../Tests/TestSparkGameShowcase.cpp#L197) | | | `StatusLine` | function | Tests | [TestSparkGameShowcase.cpp:L216](../../Tests/TestSparkGameShowcase.cpp#L216) | | | `StatusString` | function | GameModules | [TFAlertSystem.cpp:L76](../../GameModules/SparkGameMMOFPS/Source/World/TFAlertSystem.cpp#L76) | | @@ -38475,7 +38570,7 @@ | `std::any_of` | method | SparkEngine | [EnvironmentQuery.h:L452](../../SparkEngine/Source/Engine/AI/EnvironmentQuery.h#L452) | | | `std::any_of` | method | SparkEngine | [RuntimePrefab.h:L138](../../SparkEngine/Source/Engine/ECS/RuntimePrefab.h#L138) | Check whether the prefab contains a component of the given type. | | `std::any_of` | method | SparkEngine | [AbilityAuras.cpp:L131](../../SparkEngine/Source/Engine/Gameplay/AbilityAuras.cpp#L131) | | -| `std::any_of` | method | SparkEngine | [VisualScriptEmitter.cpp:L440](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L440) | | +| `std::any_of` | method | SparkEngine | [VisualScriptEmitter.cpp:L465](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L465) | | | `std::any_of` | method | SparkEngine | [FoliageSystem.cpp:L269](../../SparkEngine/Source/Graphics/FoliageSystem.cpp#L269) | | | `std::any_of` | method | SparkEngine | [InvalidStateDetector.h:L162](../../SparkEngine/Source/Utils/InvalidStateDetector.h#L162) | Remove all registered rules (including the engine defaults). | | `std::any_of` | method | Tests | [TestENG220ObjImportReal.cpp:L152](../../Tests/TestENG220ObjImportReal.cpp#L152) | | @@ -38531,7 +38626,7 @@ | `std::exp` | method | SparkEngine | [FogSystem.h:L181](../../SparkEngine/Source/Graphics/FogSystem.h#L181) | | | `std::fabs` | method | Tests | [TestNetQuantize.cpp:L38](../../Tests/TestNetQuantize.cpp#L38) | | | `std::fabs` | method | Tests | [TestSEC3ScriptingHardening.cpp:L336](../../Tests/TestSEC3ScriptingHardening.cpp#L336) | | -| `std::fabs` | method | Tests | [TestTF120Travel.cpp:L384](../../Tests/TestTF120Travel.cpp#L384) | | +| `std::fabs` | method | Tests | [TestTF120Travel.cpp:L371](../../Tests/TestTF120Travel.cpp#L371) | | | `std::fclose` | method | SparkEngine | [NeuralWeights.cpp:L294](../../SparkEngine/Source/Graphics/Neural/NeuralWeights.cpp#L294) | | | `std::filesystem::current_path` | method | SparkEngine | [SparkEngineLinuxInit.cpp:L64](../../SparkEngine/Source/Core/SparkEngineLinuxInit.cpp#L64) | | | `std::filesystem::current_path` | method | SparkEngine | [SparkEngineMacOS.cpp:L102](../../SparkEngine/Source/Core/SparkEngineMacOS.cpp#L102) | | @@ -38544,14 +38639,14 @@ | `std::filesystem::exists` | method | SparkEditor | [VersionControlSystem.cpp:L89](../../SparkEditor/Source/VersionControl/VersionControlSystem.cpp#L89) | | | `std::filesystem::exists` | method | SparkEditor | [VersionControlSystem.cpp:L160](../../SparkEditor/Source/VersionControl/VersionControlSystem.cpp#L160) | | | `std::filesystem::exists` | method | Tests | [TestReflectedSceneCompatibility.cpp:L66](../../Tests/TestReflectedSceneCompatibility.cpp#L66) | | -| `std::filesystem::is_directory` | method | GameModules | [FPSAssetPaths.cpp:L99](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L99) | | +| `std::filesystem::is_directory` | method | GameModules | [FPSAssetPaths.cpp:L111](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L111) | | | `std::filesystem::is_directory` | method | SparkEditor | [EditorLaunchContext.h:L174](../../SparkEditor/Source/Utils/EditorLaunchContext.h#L174) | | | `std::filesystem::is_regular_file` | method | GameModules | [VisualScriptDemoWorld.cpp:L90](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.cpp#L90) | | | `std::filesystem::is_regular_file` | method | SparkAssetPipelineCore | [AssetCooker.cpp:L218](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L218) | | | `std::filesystem::is_regular_file` | method | SparkLauncher | [LauncherProcess.cpp:L117](../../SparkLauncher/src/LauncherProcess.cpp#L117) | | | `std::filesystem::is_regular_file` | method | Tests | [TestGameModuleMMO.cpp:L109](../../Tests/TestGameModuleMMO.cpp#L109) | | | `std::filesystem::is_symlink` | method | SparkLauncher | [LauncherProcess.cpp:L123](../../SparkLauncher/src/LauncherProcess.cpp#L123) | | -| `std::filesystem::path` | method | GameModules | [FPSAssetPaths.cpp:L29](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L29) | | +| `std::filesystem::path` | method | GameModules | [FPSAssetPaths.cpp:L31](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L31) | | | `std::filesystem::path` | method | GameModules | [TFSavePaths.h:L534](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFSavePaths.h#L534) | | | `std::filesystem::path` | method | GameModules | [OWPersistence.inl:L351](../../GameModules/SparkGameOpenWorld/Source/Persistence/OWPersistence.inl#L351) | | | `std::filesystem::path` | method | SparkAssetPipelineCore | [AssetCooker.cpp:L171](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L171) | | @@ -38590,12 +38685,15 @@ | `std::filesystem::temp_directory_path` | method | SparkBuild | [ProcessRunnerTests.cpp:L57](../../SparkBuild/tests/ProcessRunnerTests.cpp#L57) | | | `std::filesystem::temp_directory_path` | method | SparkDaemon | [OrchestratorIdentity.cpp:L384](../../SparkDaemon/src/OrchestratorIdentity.cpp#L384) | | | `std::filesystem::temp_directory_path` | method | SparkInstaller | [InstallStateTests.cpp:L14](../../SparkInstaller/tests/InstallStateTests.cpp#L14) | | +| `std::filesystem::temp_directory_path` | method | Tests | [TestAssetParserHardening.cpp:L52](../../Tests/TestAssetParserHardening.cpp#L52) | | | `std::filesystem::temp_directory_path` | method | Tests | [TestExecScript.cpp:L50](../../Tests/TestExecScript.cpp#L50) | | | `std::filesystem::temp_directory_path` | method | Tests | [TestFileUtils.cpp:L29](../../Tests/TestFileUtils.cpp#L29) | | | `std::filesystem::temp_directory_path` | method | Tests | [TestLoggerSinksReal.cpp:L21](../../Tests/TestLoggerSinksReal.cpp#L21) | | | `std::filesystem::temp_directory_path` | method | Tests | [TestOnlineServicesLocalStack.cpp:L214](../../Tests/TestOnlineServicesLocalStack.cpp#L214) | | | `std::filesystem::temp_directory_path` | method | Tests | [TestScreenCapture.cpp:L15](../../Tests/TestScreenCapture.cpp#L15) | | +| `std::filesystem::temp_directory_path` | method | Tests | [TestSparkPak.cpp:L271](../../Tests/TestSparkPak.cpp#L271) | | | `std::filesystem::temp_directory_path` | method | Tests | [TestStartupSplash.cpp:L19](../../Tests/TestStartupSplash.cpp#L19) | | +| `std::filesystem::temp_directory_path` | method | Tests | [TestThirdPartyIntegration.cpp:L70](../../Tests/TestThirdPartyIntegration.cpp#L70) | | | `std::filesystem::u8path` | method | SparkCrashReporter | [CrashReporterApp.cpp:L666](../../SparkCrashReporter/src/CrashReporterApp.cpp#L666) | | | `std::filesystem::u8path` | method | SparkEditor | [EditorLaunchContext.h:L25](../../SparkEditor/Source/Utils/EditorLaunchContext.h#L25) | | | `std::filesystem::u8path` | method | SparkEngine | [ModuleManager.cpp:L149](../../SparkEngine/Source/Core/ModuleManager.cpp#L149) | | @@ -38614,7 +38712,7 @@ | `std::find` | method | Tests | [TestContainerUtils.cpp:L63](../../Tests/TestContainerUtils.cpp#L63) | | | `std::find` | method | Tests | [TestCrashHandlerGatingReal.cpp:L237](../../Tests/TestCrashHandlerGatingReal.cpp#L237) | | | `std::find` | method | Tests | [TestPrototypeModuleKitReal.cpp:L110](../../Tests/TestPrototypeModuleKitReal.cpp#L110) | | -| `std::find` | method | Tests | [TestTFDataTables.cpp:L98](../../Tests/TestTFDataTables.cpp#L98) | | +| `std::find` | method | Tests | [TestTFDataTables.cpp:L89](../../Tests/TestTFDataTables.cpp#L89) | | | `std::find_if` | method | SparkEditor | [EditorPluginManager.cpp:L473](../../SparkEditor/Source/Core/EditorPluginManager.cpp#L473) | | | `std::find_if` | method | SparkEditor | [EditorPluginManager.cpp:L479](../../SparkEditor/Source/Core/EditorPluginManager.cpp#L479) | | | `std::find_if` | method | SparkEditor | [EditorPluginManager.cpp:L485](../../SparkEditor/Source/Core/EditorPluginManager.cpp#L485) | | @@ -38778,13 +38876,13 @@ | `std::min` | method | SparkEngine | [ConnectRateLimiter.cpp:L28](../../SparkEngine/Source/Engine/Networking/ConnectRateLimiter.cpp#L28) | | | `std::min` | method | SparkEngine | [FastNoise2SIMD.h:L642](../../SparkEngine/Source/Graphics/FastNoise2SIMD.h#L642) | | | `std::min` | method | SparkEngine | [GraphicsEngineSubmit.cpp:L131](../../SparkEngine/Source/Graphics/GraphicsEngineSubmit.cpp#L131) | | -| `std::min` | method | SparkEngine | [InputManager.cpp:L545](../../SparkEngine/Source/Input/InputManager.cpp#L545) | | +| `std::min` | method | SparkEngine | [InputManager.cpp:L568](../../SparkEngine/Source/Input/InputManager.cpp#L568) | | | `std::min` | method | SparkEngine | [ProcessPipeBuffer.h:L21](../../SparkEngine/Source/Utils/ProcessPipeBuffer.h#L21) | | | `std::min` | method | SparkServer | [ServerHealth.cpp:L114](../../SparkServer/src/ServerHealth.cpp#L114) | | | `std::min` | method | Tests | [TestNetQuantize.cpp:L33](../../Tests/TestNetQuantize.cpp#L33) | | | `std::min_element` | method | SparkEngine | [VisualScriptEmitNode.cpp:L29](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitNode.cpp#L29) | | | `std::move` | method | SparkEditor | [StandaloneCollaborationClient.cpp:L69](../../SparkEditor/Source/Communication/StandaloneCollaborationClient.cpp#L69) | | -| `std::move` | method | SparkEngine | [CrashHandler.cpp:L913](../../SparkEngine/Source/Utils/CrashHandler.cpp#L913) | | +| `std::move` | method | SparkEngine | [CrashHandler.cpp:L914](../../SparkEngine/Source/Utils/CrashHandler.cpp#L914) | | | `std::move` | method | Tests | [TestFPSLANLoopback.cpp:L165](../../Tests/TestFPSLANLoopback.cpp#L165) | | | `std::mt19937_64` | method | SparkEngine | [UUID.h:L48](../../SparkEngine/Source/Utils/UUID.h#L48) | | | `std::none_of` | method | SparkEditor | [EditorLayoutManager.cpp:L75](../../SparkEditor/Source/Core/EditorLayoutManager.cpp#L75) | | @@ -38802,12 +38900,12 @@ | `std::pow` | method | SparkEngine | [TweenSystem.cpp:L54](../../SparkEngine/Source/Engine/Tween/TweenSystem.cpp#L54) | | | `std::pow` | method | SparkEngine | [Tween.h:L202](../../SparkEngine/Source/Utils/Tween.h#L202) | | | `std::pow` | method | Tests | [TestRHI210D3D11PassGoldenReal.cpp:L284](../../Tests/TestRHI210D3D11PassGoldenReal.cpp#L284) | | -| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L667](../../SparkConsole/src/ConsoleApp.cpp#L667) | | -| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L679](../../SparkConsole/src/ConsoleApp.cpp#L679) | | -| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L703](../../SparkConsole/src/ConsoleApp.cpp#L703) | | -| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L711](../../SparkConsole/src/ConsoleApp.cpp#L711) | | -| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L755](../../SparkConsole/src/ConsoleApp.cpp#L755) | | -| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L766](../../SparkConsole/src/ConsoleApp.cpp#L766) | | +| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L671](../../SparkConsole/src/ConsoleApp.cpp#L671) | | +| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L683](../../SparkConsole/src/ConsoleApp.cpp#L683) | | +| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L707](../../SparkConsole/src/ConsoleApp.cpp#L707) | | +| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L715](../../SparkConsole/src/ConsoleApp.cpp#L715) | | +| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L759](../../SparkConsole/src/ConsoleApp.cpp#L759) | | +| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L770](../../SparkConsole/src/ConsoleApp.cpp#L770) | | | `std::put_time` | method | SparkEditor | [EditorLogger.cpp:L44](../../SparkEditor/Source/Core/EditorLogger.cpp#L44) | | | `std::put_time` | method | SparkEditor | [EditorLogger.cpp:L316](../../SparkEditor/Source/Core/EditorLogger.cpp#L316) | | | `std::put_time` | method | SparkEditor | [ExternalConsoleIntegration.cpp:L934](../../SparkEditor/Source/Integration/ExternalConsoleIntegration.cpp#L934) | | @@ -38832,6 +38930,7 @@ | `std::remainder` | method | GameModules | [FPSArenaAutopilot.cpp:L32](../../GameModules/SparkGameFPS/Source/Game/FPSArenaAutopilot.cpp#L32) | | | `std::remainder` | method | GameModules | [TFRepProtocol.h:L85](../../GameModules/SparkGameMMOFPS/Source/Net/TFRepProtocol.h#L85) | | | `std::rename` | method | SparkBuild | [ArchiveExtraction.cpp:L128](../../SparkBuild/src/ArchiveExtraction.cpp#L128) | | +| `std::runtime_error` | method | GameModules | [GameEngineSystems.cpp:L504](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L504) | | | `std::runtime_error` | method | GameModules | [TFCrypto.cpp:L70](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.cpp#L70) | | | `std::runtime_error` | method | GameModules | [TFCrypto.cpp:L92](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.cpp#L92) | | | `std::runtime_error` | method | SparkEditor | [EditorUI.cpp:L91](../../SparkEditor/Source/Core/EditorUI.cpp#L91) | | @@ -38879,6 +38978,7 @@ | `std::runtime_error` | method | Tests | [TestAngelScriptStackAlignmentReal.cpp:L197](../../Tests/TestAngelScriptStackAlignmentReal.cpp#L197) | | | `std::runtime_error` | method | Tests | [TestEditorSubsystems.cpp:L1806](../../Tests/TestEditorSubsystems.cpp#L1806) | | | `std::runtime_error` | method | Tests | [TestEditorSubsystems.cpp:L1812](../../Tests/TestEditorSubsystems.cpp#L1812) | | +| `std::runtime_error` | method | Tests | [TestFPSGameCameraReloadReal.cpp:L26](../../Tests/TestFPSGameCameraReloadReal.cpp#L26) | | | `std::runtime_error` | method | Tests | [TestFaultIsolation.cpp:L342](../../Tests/TestFaultIsolation.cpp#L342) | | | `std::runtime_error` | method | Tests | [TestGatewayAreaControl.cpp:L1264](../../Tests/TestGatewayAreaControl.cpp#L1264) | | | `std::runtime_error` | method | Tests | [TestLIFE200LifecycleLoopReal.cpp:L128](../../Tests/TestLIFE200LifecycleLoopReal.cpp#L128) | | @@ -38997,7 +39097,7 @@ | `std::setprecision` | method | Tests | [TestFullEngineDiagnostics.cpp:L360](../../Tests/TestFullEngineDiagnostics.cpp#L360) | | | `std::setw` | method | SparkEngine | [AudioEngine.cpp:L725](../../SparkEngine/Source/Audio/AudioEngine.cpp#L725) | | | `std::setw` | method | SparkEngine | [DedicatedServer.cpp:L1086](../../SparkEngine/Source/Engine/Networking/DedicatedServer.cpp#L1086) | | -| `std::setw` | method | SparkEngine | [InputManager.cpp:L454](../../SparkEngine/Source/Input/InputManager.cpp#L454) | | +| `std::setw` | method | SparkEngine | [InputManager.cpp:L477](../../SparkEngine/Source/Input/InputManager.cpp#L477) | | | `std::setw` | method | SparkGateway | [GatewayApplication.cpp:L61](../../SparkGateway/src/GatewayApplication.cpp#L61) | | | `std::setw` | method | SparkServer | [ServerHealth.cpp:L60](../../SparkServer/src/ServerHealth.cpp#L60) | | | `std::sin` | method | SparkEngine | [SoundEffect.cpp:L364](../../SparkEngine/Source/Audio/SoundEffect.cpp#L364) | | @@ -39074,10 +39174,10 @@ | `std::string` | method | GameModules | [HeadlessPersistence.cpp:L140](../../GameModules/SparkGameFPS/Source/Core/HeadlessPersistence.cpp#L140) | | | `std::string` | method | GameModules | [HeadlessPersistence.cpp:L153](../../GameModules/SparkGameFPS/Source/Core/HeadlessPersistence.cpp#L153) | | | `std::string` | method | GameModules | [HeadlessPersistence.cpp:L167](../../GameModules/SparkGameFPS/Source/Core/HeadlessPersistence.cpp#L167) | | -| `std::string` | method | GameModules | [Main.cpp:L684](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L684) | | -| `std::string` | method | GameModules | [Main.cpp:L746](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L746) | | -| `std::string` | method | GameModules | [Main.cpp:L1270](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1270) | | -| `std::string` | method | GameModules | [FPSAssetPaths.cpp:L162](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L162) | | +| `std::string` | method | GameModules | [Main.cpp:L687](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L687) | | +| `std::string` | method | GameModules | [Main.cpp:L749](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L749) | | +| `std::string` | method | GameModules | [Main.cpp:L1273](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1273) | | +| `std::string` | method | GameModules | [FPSAssetPaths.cpp:L176](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L176) | | | `std::string` | method | GameModules | [FPSLocalProfile.cpp:L22](../../GameModules/SparkGameFPS/Source/Game/FPSLocalProfile.cpp#L22) | | | `std::string` | method | GameModules | [InteractiveObject.cpp:L237](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.cpp#L237) | | | `std::string` | method | GameModules | [TFCommands.cpp:L348](../../GameModules/SparkGameMMOFPS/Source/Console/TFCommands.cpp#L348) | | @@ -39109,7 +39209,7 @@ | `std::string` | method | GameModules | [OWPersistence.inl:L94](../../GameModules/SparkGameOpenWorld/Source/Persistence/OWPersistence.inl#L94) | | | `std::string` | method | SparkBuild | [ProcessRunner.cpp:L108](../../SparkBuild/src/ProcessRunner.cpp#L108) | | | `std::string` | method | SparkBuild | [DownloaderTests.cpp:L263](../../SparkBuild/tests/DownloaderTests.cpp#L263) | | -| `std::string` | method | SparkConsole | [ConsoleApp.cpp:L932](../../SparkConsole/src/ConsoleApp.cpp#L932) | | +| `std::string` | method | SparkConsole | [ConsoleApp.cpp:L936](../../SparkConsole/src/ConsoleApp.cpp#L936) | | | `std::string` | method | SparkCrashReporter | [CrashReporterApp.cpp:L676](../../SparkCrashReporter/src/CrashReporterApp.cpp#L676) | | | `std::string` | method | SparkCrashReporter | [CrashReporterConsentTests.cpp:L128](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L128) | | | `std::string` | method | SparkDaemon | [OrchestratorIdentity.cpp:L72](../../SparkDaemon/src/OrchestratorIdentity.cpp#L72) | | @@ -39192,8 +39292,8 @@ | `std::string` | method | Tests | [TestDialogueSystem.cpp:L73](../../Tests/TestDialogueSystem.cpp#L73) | | | `std::string` | method | Tests | [TestDocumentInterruptionReal.cpp:L296](../../Tests/TestDocumentInterruptionReal.cpp#L296) | | | `std::string` | method | Tests | [TestENG200ScriptBindingsReal.cpp:L249](../../Tests/TestENG200ScriptBindingsReal.cpp#L249) | | -| `std::string` | method | Tests | [TestEditorCrashHandlerFilterReal.cpp:L371](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L371) | | -| `std::string` | method | Tests | [TestEditorCrashHandlerFilterReal.cpp:L466](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L466) | | +| `std::string` | method | Tests | [TestEditorCrashHandlerFilterReal.cpp:L373](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L373) | | +| `std::string` | method | Tests | [TestEditorCrashHandlerFilterReal.cpp:L468](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L468) | | | `std::string` | method | Tests | [TestEditorSubsystems.cpp:L1637](../../Tests/TestEditorSubsystems.cpp#L1637) | | | `std::string` | method | Tests | [TestEditorSubsystems.cpp:L2351](../../Tests/TestEditorSubsystems.cpp#L2351) | | | `std::string` | method | Tests | [TestEditorSubsystems.cpp:L2400](../../Tests/TestEditorSubsystems.cpp#L2400) | | @@ -39232,7 +39332,7 @@ | `std::string_view` | method | SparkInstaller | [GitContractTests.cpp:L146](../../SparkInstaller/tests/GitContractTests.cpp#L146) | | | `std::string_view` | method | SparkInstaller | [GitContractTests.cpp:L173](../../SparkInstaller/tests/GitContractTests.cpp#L173) | | | `std::string_view` | method | SparkInstaller | [InstallerTransactionTests.cpp:L96](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L96) | | -| `std::system` | method | SparkAssetPipelineCore | [AssetCookerTests.cpp:L54](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L54) | | +| `std::system` | method | SparkAssetPipelineCore | [AssetCookerTests.cpp:L56](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L56) | | | `std::system_error` | method | Tests | [TestJobSystem.cpp:L320](../../Tests/TestJobSystem.cpp#L320) | | | `std::tan` | method | GameModules | [RacingTrackColliders.cpp:L315](../../GameModules/SparkGameRacing/Source/Track/RacingTrackColliders.cpp#L315) | | | `std::tanh` | method | SparkEngine | [CpuNeuralInference.cpp:L55](../../SparkEngine/Source/Graphics/Neural/CpuNeuralInference.cpp#L55) | | @@ -39674,12 +39774,12 @@ | `StoreSaveToDisk` | function | GameModules | [TFSocialSystem.h:L199](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L199) | | | `StormIntensity01` | function | GameModules | [TFWeatherFx.h:L142](../../GameModules/SparkGameMMOFPS/Source/World/TFWeatherFx.h#L142) | | | `str` | function | SparkEngine | [DatablockRegistry.h:L331](../../SparkEngine/Source/Engine/Networking/DatablockRegistry.h#L331) | | -| `Str` | function | Tests | [TestTFDataTables.cpp:L80](../../Tests/TestTFDataTables.cpp#L80) | | +| `Str` | function | Tests | [TestTFDataTables.cpp:L71](../../Tests/TestTFDataTables.cpp#L71) | | | `StrapParams` | function | GameModules | [TFViewModelInternal.h:L164](../../GameModules/SparkGameMMOFPS/Source/Game/TFViewModelInternal.h#L164) | | -| `stream` | function | GameModules | [Game.cpp:L56](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L56) | | +| `stream` | function | GameModules | [Game.cpp:L58](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L58) | | | `stream` | function | GameModules | [VisualScriptDemoWorld.cpp:L134](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.cpp#L134) | | | `stream` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L955](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L955) | | -| `stream` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L23](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L23) | | +| `stream` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L25](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L25) | | | `stream` | function | SparkBuild | [SparkBuild.cpp:L349](../../SparkBuild/src/SparkBuild.cpp#L349) | | | `stream` | function | SparkEditor | [SparkEngineIntegration.cpp:L925](../../SparkEditor/Source/Integration/SparkEngineIntegration.cpp#L925) | | | `stream` | function | SparkEditor | [BuildPipeline.cpp:L1688](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L1688) | | @@ -39715,11 +39815,12 @@ | `stream` | function | Tests | [TestENG220ObjImportReal.cpp:L73](../../Tests/TestENG220ObjImportReal.cpp#L73) | | | `stream` | function | Tests | [TestEngineSettingsParser.cpp:L34](../../Tests/TestEngineSettingsParser.cpp#L34) | | | `stream` | function | Tests | [TestEngineWiringReal.cpp:L75](../../Tests/TestEngineWiringReal.cpp#L75) | | +| `stream` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L77](../../Tests/TestFPSGameCameraReloadReal.cpp#L77) | | | `stream` | function | Tests | [TestGameModuleRTS.cpp:L552](../../Tests/TestGameModuleRTS.cpp#L552) | | | `stream` | function | Tests | [TestMOD330ARPGDungeonReal.cpp:L213](../../Tests/TestMOD330ARPGDungeonReal.cpp#L213) | | | `stream` | function | Tests | [TestMOD350RPGQuestSliceReal.cpp:L278](../../Tests/TestMOD350RPGQuestSliceReal.cpp#L278) | | | `stream` | function | Tests | [TestMOD370SkirmishDeterminismReal.cpp:L328](../../Tests/TestMOD370SkirmishDeterminismReal.cpp#L328) | | -| `stream` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L62](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L62) | | +| `stream` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L63](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L63) | | | `stream` | function | Tests | [TestMain.cpp:L776](../../Tests/TestMain.cpp#L776) | | | `stream` | function | Tests | [TestModuleABI.cpp:L712](../../Tests/TestModuleABI.cpp#L712) | | | `stream` | function | Tests | [TestNET100TrustStore.cpp:L54](../../Tests/TestNET100TrustStore.cpp#L54) | | @@ -39900,7 +40001,7 @@ | `SUCCEEDED` | function | SparkEngine | [TonemapColorGrading.cpp:L276](../../SparkEngine/Source/Graphics/TonemapColorGrading.cpp#L276) | | | `SUCCEEDED` | function | SparkEngine | [TonemapColorGrading.cpp:L279](../../SparkEngine/Source/Graphics/TonemapColorGrading.cpp#L279) | | | `SUCCEEDED` | function | SparkEngine | [UpscalingSystemWindows.cpp:L190](../../SparkEngine/Source/Graphics/UpscalingSystemWindows.cpp#L190) | | -| `SUCCEEDED` | function | Tests | [TestAssetParserHardening.cpp:L78](../../Tests/TestAssetParserHardening.cpp#L78) | | +| `SUCCEEDED` | function | Tests | [TestAssetParserHardening.cpp:L94](../../Tests/TestAssetParserHardening.cpp#L94) | | | `SUCCEEDED` | function | Tests | [TestGPUDrivenRendererD3D11.cpp:L55](../../Tests/TestGPUDrivenRendererD3D11.cpp#L55) | | | `SUCCEEDED` | function | Tests | [TestGPUDrivenRendererD3D11.cpp:L69](../../Tests/TestGPUDrivenRendererD3D11.cpp#L69) | | | `SUCCEEDED` | function | Tests | [TestPostProcessingPipelineD3D11.cpp:L57](../../Tests/TestPostProcessingPipelineD3D11.cpp#L57) | | @@ -39965,8 +40066,8 @@ | `Suspend` | function | GameModules | [TFHandoffParticipant.h:L29](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.h#L29) | Game-thread pawn operations supplied by the live authoritative simulation. | | `Suspend` | function | GameModules | [TFServerSim.h:L141](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L141) | Game-thread handoff callbacks; the host dispatcher serializes control requests with simulation. | | `Suspend` | function | Tests | [TestTF120Migration.cpp:L84](../../Tests/TestTF120Migration.cpp#L84) | | -| `Suspend` | function | Tests | [TestTF120Travel.cpp:L224](../../Tests/TestTF120Travel.cpp#L224) | | -| `Suspend` | function | Tests | [TestTF120Travel.cpp:L257](../../Tests/TestTF120Travel.cpp#L257) | | +| `Suspend` | function | Tests | [TestTF120Travel.cpp:L211](../../Tests/TestTF120Travel.cpp#L211) | | +| `Suspend` | function | Tests | [TestTF120Travel.cpp:L244](../../Tests/TestTF120Travel.cpp#L244) | | | `SuspendPoint` | function | Tests | [TestAngelScriptStackAlignmentReal.cpp:L165](../../Tests/TestAngelScriptStackAlignmentReal.cpp#L165) | | | `SuspendRendering` | function | SparkEngine | [VulkanDevice.h:L391](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L391) | | | `Swap` | function | SparkEngine | [RTHandleSystem.h:L251](../../SparkEngine/Source/Graphics/RTHandleSystem.h#L251) | | @@ -39989,21 +40090,21 @@ | `SwitchObject::Interact` | method | GameModules | [InteractiveObject.cpp:L265](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.cpp#L265) | | | `SwitchObject::Update` | method | GameModules | [InteractiveObject.cpp:L260](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.cpp#L260) | | | `SwitchSlot` | function | GameModules | [TFWeaponSystem.h:L178](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L178) | | -| `sym` | function | SparkEngine | [CrashHandler.cpp:L1649](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1649) | | +| `sym` | function | SparkEngine | [CrashHandler.cpp:L1650](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1650) | | | `symbolLock` | function | SparkEditor | [EditorCrashHandler.cpp:L536](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L536) | | | `symbolLock` | function | SparkEditor | [EditorCrashHandler.cpp:L673](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L673) | | -| `symbolLock` | function | SparkEngine | [CrashHandler.cpp:L1273](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1273) | | -| `symbolLock` | function | SparkEngine | [CrashHandler.cpp:L1345](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1345) | | -| `symbolLock` | function | SparkEngine | [CrashHandler.cpp:L1462](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1462) | | +| `symbolLock` | function | SparkEngine | [CrashHandler.cpp:L1274](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1274) | | +| `symbolLock` | function | SparkEngine | [CrashHandler.cpp:L1346](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1346) | | +| `symbolLock` | function | SparkEngine | [CrashHandler.cpp:L1463](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1463) | | | `SymbolLock` | function | SparkEngine | [StackTrace.h:L173](../../SparkEngine/Source/Utils/StackTrace.h#L173) | | | `symbolLock` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L339](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L339) | | -| `symbolLock` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L457](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L457) | | -| `symbolLock` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L535](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L535) | | +| `symbolLock` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L459](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L459) | | +| `symbolLock` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L537](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L537) | | | `SymbolLockLease` | function | SparkEngine | [StackTrace.h:L184](../../SparkEngine/Source/Utils/StackTrace.h#L184) | | | `symlinked` | function | Tests | [TestTelemetrySpool.cpp:L952](../../Tests/TestTelemetrySpool.cpp#L952) | | -| `SymStackTrace` | function | SparkEngine | [CrashHandler.cpp:L823](../../SparkEngine/Source/Utils/CrashHandler.cpp#L823) | | -| `SymStackTrace` | function | SparkEngine | [CrashHandler.cpp:L1173](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1173) | | -| `SymStackTrace` | function | SparkEngine | [CrashHandler.cpp:L1340](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1340) | | +| `SymStackTrace` | function | SparkEngine | [CrashHandler.cpp:L824](../../SparkEngine/Source/Utils/CrashHandler.cpp#L824) | | +| `SymStackTrace` | function | SparkEngine | [CrashHandler.cpp:L1174](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1174) | | +| `SymStackTrace` | function | SparkEngine | [CrashHandler.cpp:L1341](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1341) | | | `SyncActors` | function | GameModules | [ARPGActorPresentation.h:L64](../../GameModules/SparkGameARPG/Source/Demo/ARPGActorPresentation.h#L64) | Create, move or remove actor entities so the World matches the gameplay state. | | `SyncAllBindings` | function | SparkEngine | [UIFactory.h:L139](../../SparkEngine/Source/Engine/UI/UIFactory.h#L139) | Pull all widget values back to data | | `SyncClientRecords` | function | GameModules | [TFPlayerSystem.h:L108](../../GameModules/SparkGameMMOFPS/Source/Game/TFPlayerSystem.h#L108) | | @@ -40050,9 +40151,9 @@ | `SystemCommandInterpreter` | function | SparkBuild | [ProcessRunner.cpp:L100](../../SparkBuild/src/ProcessRunner.cpp#L100) | | | `systemError` | function | SparkGateway | [GatewayAreaControl.cpp:L906](../../SparkGateway/src/GatewayAreaControl.cpp#L906) | | | `systemError` | function | SparkGateway | [GatewayAreaControl.cpp:L968](../../SparkGateway/src/GatewayAreaControl.cpp#L968) | | -| `SystemInfo` | function | SparkEngine | [CrashHandler.cpp:L824](../../SparkEngine/Source/Utils/CrashHandler.cpp#L824) | | -| `SystemInfo` | function | SparkEngine | [CrashHandler.cpp:L1175](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1175) | | -| `SystemInfo` | function | SparkEngine | [CrashHandler.cpp:L1412](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1412) | | +| `SystemInfo` | function | SparkEngine | [CrashHandler.cpp:L825](../../SparkEngine/Source/Utils/CrashHandler.cpp#L825) | | +| `SystemInfo` | function | SparkEngine | [CrashHandler.cpp:L1176](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1176) | | +| `SystemInfo` | function | SparkEngine | [CrashHandler.cpp:L1413](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1413) | | | `SystemManager::Console_ListSystems` | method | SparkEngine | [ECSystems.cpp:L853](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.cpp#L853) | | | `Systems` | function | Tests | [TestMOD340PlatformerProgressReal.cpp:L69](../../Tests/TestMOD340PlatformerProgressReal.cpp#L69) | | | `Systems` | function | Tests | [TestMOD370RTSSaveReal.cpp:L64](../../Tests/TestMOD370RTSSaveReal.cpp#L64) | | @@ -40196,8 +40297,8 @@ | `temp` | function | Tests | [TestGLTFStaticMeshLoader.cpp:L261](../../Tests/TestGLTFStaticMeshLoader.cpp#L261) | | | `temp` | function | Tests | [TestGLTFStaticMeshLoader.cpp:L274](../../Tests/TestGLTFStaticMeshLoader.cpp#L274) | | | `tempCounts` | function | SparkEngine | [MeshOptimizer.h:L114](../../SparkEngine/Source/Graphics/MeshOptimizer.h#L114) | | -| `tempDir` | function | SparkEditor | [PlayControlLaunch.cpp:L351](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L351) | | -| `tempDir` | function | SparkEditor | [PlayControlLaunch.cpp:L385](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L385) | | +| `tempDir` | function | SparkEditor | [PlayControlLaunch.cpp:L353](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L353) | | +| `tempDir` | function | SparkEditor | [PlayControlLaunch.cpp:L387](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L387) | | | `tempDirectory` | function | SparkBuild | [Downloader.cpp:L455](../../SparkBuild/src/Downloader.cpp#L455) | | | `tempDirectory` | function | SparkBuild | [DownloaderTests.cpp:L42](../../SparkBuild/tests/DownloaderTests.cpp#L42) | | | `templateMetadata` | function | Tests | [TestEditorSubsystems.cpp:L960](../../Tests/TestEditorSubsystems.cpp#L960) | | @@ -40206,7 +40307,7 @@ | `templateText` | function | Tests | [TestEditorSubsystems.cpp:L961](../../Tests/TestEditorSubsystems.cpp#L961) | | | `TemplateTreeContainsLinks` | function | SparkEditor | [ProjectManager.cpp:L614](../../SparkEditor/Source/Core/ProjectManager.cpp#L614) | | | `TemporalFilter` | function | SparkEngine | [FroxelVolumetricFog.h:L161](../../SparkEngine/Source/Graphics/FroxelVolumetricFog.h#L161) | Pass 3: Temporal reprojection and filtering | -| `temporary` | function | SparkEngine | [CrashHandler.cpp:L2382](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2382) | | +| `temporary` | function | SparkEngine | [CrashHandler.cpp:L2420](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2420) | | | `temporaryCleanup` | function | SparkEditor | [JSONSceneSerializer.cpp:L473](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L473) | | | `TemporaryDirectory` | function | Tests | [TestGLTFStaticMeshLoader.cpp:L25](../../Tests/TestGLTFStaticMeshLoader.cpp#L25) | | | `TemporaryFileCleanup` | function | SparkEditor | [JSONSceneSerializer.cpp:L120](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L120) | | @@ -40218,7 +40319,8 @@ | `TemporarySibling` | function | SparkEditor | [RegionMapDataSource.cpp:L34](../../SparkEditor/Source/Panels/RegionMapDataSource.cpp#L34) | | | `TemporarySibling` | function | SparkEngine | [NetworkTrustStore.cpp:L159](../../SparkEngine/Source/Engine/Networking/NetworkTrustStore.cpp#L159) | | | `TempPath` | function | Tests | [TestBenchmarkFramework.cpp:L14](../../Tests/TestBenchmarkFramework.cpp#L14) | Get a cross-platform temporary file path for tests | -| `TempPath` | function | Tests | [TestSparkPak.cpp:L258](../../Tests/TestSparkPak.cpp#L258) | | +| `TempPath` | function | Tests | [TestSparkPak.cpp:L274](../../Tests/TestSparkPak.cpp#L274) | | +| `TempRoot` | function | Tests | [TestSparkPak.cpp:L264](../../Tests/TestSparkPak.cpp#L264) | | | `TempScriptTree` | function | Tests | [TestCoverageScripting.cpp:L28](../../Tests/TestCoverageScripting.cpp#L28) | | | `TempStorePath` | function | Tests | [TestTFOutfitStore.cpp:L32](../../Tests/TestTFOutfitStore.cpp#L32) | | | `TempStorePath` | function | Tests | [TestTFSocialStore.cpp:L26](../../Tests/TestTFSocialStore.cpp#L26) | | @@ -40567,7 +40669,7 @@ | `text` | function | SparkEngine | [EventResponseSystem.cpp:L110](../../SparkEngine/Source/Engine/Gameplay/EventResponseSystem.cpp#L110) | | | `text` | function | SparkEngine | [VirtualFileSystem.cpp:L381](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L381) | | | `text` | function | SparkEngine | [RHIFactory.cpp:L328](../../SparkEngine/Source/Graphics/RHI/RHIFactory.cpp#L328) | | -| `text` | function | SparkEngine | [SceneManagerReflected.cpp:L30](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L30) | | +| `text` | function | SparkEngine | [SceneManagerReflected.cpp:L46](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L46) | | | `text` | function | SparkEngine | [CrashHandlerSupport.h:L165](../../SparkEngine/Source/Utils/CrashHandlerSupport.h#L165) | | | `Text` | function | SparkEngine | [CrashSymbolication.h:L119](../../SparkEngine/Source/Utils/CrashSymbolication.h#L119) | | | `text` | function | SparkGateway | [GatewayAreaControl.cpp:L599](../../SparkGateway/src/GatewayAreaControl.cpp#L599) | | @@ -40580,14 +40682,14 @@ | `text` | function | Tests | [TestSceneGraph2D.cpp:L94](../../Tests/TestSceneGraph2D.cpp#L94) | | | `textPos` | function | SparkEditor | [GameViewPanel.cpp:L818](../../SparkEditor/Source/Panels/GameViewPanel.cpp#L818) | | | `textPos` | function | SparkEditor | [SceneViewPanel.cpp:L178](../../SparkEditor/Source/Panels/SceneViewPanel.cpp#L178) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L164](../../Tests/TestAssetParserHardening.cpp#L164) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L176](../../Tests/TestAssetParserHardening.cpp#L176) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L189](../../Tests/TestAssetParserHardening.cpp#L189) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L234](../../Tests/TestAssetParserHardening.cpp#L234) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L245](../../Tests/TestAssetParserHardening.cpp#L245) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L274](../../Tests/TestAssetParserHardening.cpp#L274) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L282](../../Tests/TestAssetParserHardening.cpp#L282) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L300](../../Tests/TestAssetParserHardening.cpp#L300) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L180](../../Tests/TestAssetParserHardening.cpp#L180) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L192](../../Tests/TestAssetParserHardening.cpp#L192) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L205](../../Tests/TestAssetParserHardening.cpp#L205) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L250](../../Tests/TestAssetParserHardening.cpp#L250) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L261](../../Tests/TestAssetParserHardening.cpp#L261) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L290](../../Tests/TestAssetParserHardening.cpp#L290) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L298](../../Tests/TestAssetParserHardening.cpp#L298) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L316](../../Tests/TestAssetParserHardening.cpp#L316) | | | `texture` | function | Tests | [TestRHI210TextureDecode.cpp:L96](../../Tests/TestRHI210TextureDecode.cpp#L96) | | | `texture` | function | Tests | [TestRHI210TextureDecode.cpp:L141](../../Tests/TestRHI210TextureDecode.cpp#L141) | | | `Texture` | function | Tests | [TestRHI230VulkanGoldenReal.cpp:L398](../../Tests/TestRHI230VulkanGoldenReal.cpp#L398) | | @@ -41188,7 +41290,7 @@ | `TFHandoff_Arrive` | function | GameModules | [TFHandoffContinuity.h:L38](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffContinuity.h#L38) | | | `TFHandoff_CanCarry` | function | GameModules | [TFHandoffContinuity.h:L21](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffContinuity.h#L21) | | | `TFHandoff_CanCarry` | function | GameModules | [TFServerSimHandoff.cpp:L56](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSimHandoff.cpp#L56) | | -| `TFHandoff_CanCarry` | function | Tests | [TestTF120Travel.cpp:L219](../../Tests/TestTF120Travel.cpp#L219) | | +| `TFHandoff_CanCarry` | function | Tests | [TestTF120Travel.cpp:L206](../../Tests/TestTF120Travel.cpp#L206) | | | `TFHandoffParticipant::Abort` | method | GameModules | [TFHandoffParticipant.cpp:L154](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.cpp#L154) | | | `TFHandoffParticipant::Acknowledge` | method | GameModules | [TFHandoffParticipant.cpp:L134](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.cpp#L134) | | | `TFHandoffParticipant::Commit` | method | GameModules | [TFHandoffParticipant.cpp:L100](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.cpp#L100) | | @@ -41696,27 +41798,27 @@ | `TFReplication::ClientActive` | method | GameModules | [TFReplicationClient.cpp:L59](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L59) | | | `TFReplication::ClientEnsureHandlers` | method | GameModules | [TFReplicationClient.cpp:L65](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L65) | | | `TFReplication::ClientReleaseHandlers` | method | GameModules | [TFReplicationClient.cpp:L84](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L84) | | -| `TFReplication::FixedUpdate` | method | GameModules | [TFReplication.cpp:L76](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L76) | | +| `TFReplication::FixedUpdate` | method | GameModules | [TFReplication.cpp:L82](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L82) | | | `TFReplication::ForEachRemotePawn` | method | GameModules | [TFReplicationClient.cpp:L38](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L38) | | | `TFReplication::GetLatestMoveState` | method | GameModules | [TFReplicationClient.cpp:L44](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L44) | | | `TFReplication::GetRemotePawn` | method | GameModules | [TFReplicationClient.cpp:L29](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L29) | | -| `TFReplication::Initialize` | method | GameModules | [TFReplication.cpp:L43](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L43) | | -| `TFReplication::MakeCreate` | method | GameModules | [TFReplication.cpp:L200](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L200) | | -| `TFReplication::OnPlayerKilled` | method | GameModules | [TFReplication.cpp:L173](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L173) | | -| `TFReplication::OnPlayerSpawned` | method | GameModules | [TFReplication.cpp:L150](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L150) | | +| `TFReplication::Initialize` | method | GameModules | [TFReplication.cpp:L49](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L49) | | +| `TFReplication::MakeCreate` | method | GameModules | [TFReplication.cpp:L204](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L204) | | +| `TFReplication::OnPlayerKilled` | method | GameModules | [TFReplication.cpp:L179](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L179) | | +| `TFReplication::OnPlayerSpawned` | method | GameModules | [TFReplication.cpp:L156](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L156) | | | `TFReplication::OnRepCreate` | method | GameModules | [TFReplicationClient.cpp:L102](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L102) | | | `TFReplication::OnRepDestroy` | method | GameModules | [TFReplicationClient.cpp:L193](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L193) | | | `TFReplication::OnRepMoveState` | method | GameModules | [TFReplicationClient.cpp:L208](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L208) | | | `TFReplication::OnRepUpdate` | method | GameModules | [TFReplicationClient.cpp:L132](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L132) | | -| `TFReplication::QuantizePawn` | method | GameModules | [TFReplication.cpp:L139](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L139) | | +| `TFReplication::QuantizePawn` | method | GameModules | [TFReplication.cpp:L145](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L145) | | | `TFReplication::RenderDebugUI` | method | GameModules | [TFReplicationClient.cpp:L229](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L229) | | -| `TFReplication::SendRep` | method | GameModules | [TFReplication.cpp:L314](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L314) | | -| `TFReplication::ServerActive` | method | GameModules | [TFReplication.cpp:L192](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L192) | | -| `TFReplication::ServerBroadcastDestroy` | method | GameModules | [TFReplication.cpp:L307](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L307) | | -| `TFReplication::ServerBroadcastUpdates` | method | GameModules | [TFReplication.cpp:L251](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L251) | | -| `TFReplication::ServerPollNewClients` | method | GameModules | [TFReplication.cpp:L214](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L214) | | -| `TFReplication::Shutdown` | method | GameModules | [TFReplication.cpp:L119](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L119) | | -| `TFReplication::Update` | method | GameModules | [TFReplication.cpp:L56](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L56) | | +| `TFReplication::SendRep` | method | GameModules | [TFReplication.cpp:L325](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L325) | | +| `TFReplication::ServerActive` | method | GameModules | [TFReplication.cpp:L198](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L198) | | +| `TFReplication::ServerBroadcastDestroy` | method | GameModules | [TFReplication.cpp:L318](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L318) | | +| `TFReplication::ServerBroadcastUpdates` | method | GameModules | [TFReplication.cpp:L260](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L260) | | +| `TFReplication::ServerPollNewClients` | method | GameModules | [TFReplication.cpp:L222](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L222) | | +| `TFReplication::Shutdown` | method | GameModules | [TFReplication.cpp:L125](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L125) | | +| `TFReplication::Update` | method | GameModules | [TFReplication.cpp:L62](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L62) | | | `TFSanctuaryDecor::Initialize` | method | GameModules | [TFSanctuaryDecor.cpp:L187](../../GameModules/SparkGameMMOFPS/Source/World/TFSanctuaryDecor.cpp#L187) | | | `TFSanctuaryDecor::LocalPawn` | method | GameModules | [TFSanctuaryDecor.cpp:L241](../../GameModules/SparkGameMMOFPS/Source/World/TFSanctuaryDecor.cpp#L241) | | | `TFSanctuaryDecor::RenderUI` | method | GameModules | [TFSanctuaryDecor.cpp:L340](../../GameModules/SparkGameMMOFPS/Source/World/TFSanctuaryDecor.cpp#L340) | | @@ -42269,8 +42371,8 @@ | `TFWorldSetup::StopNetworking` | method | GameModules | [TFWorldSetupNet.cpp:L227](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetupNet.cpp#L227) | | | `TFWorldSetup::TerrainHeightAt` | method | GameModules | [TFWorldSetup.cpp:L186](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetup.cpp#L186) | | | `TFWorldSetup::Update` | method | GameModules | [TFWorldSetupUpdate.cpp:L42](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetupUpdate.cpp#L42) | | -| `tga` | function | Tests | [TestThirdPartyIntegration.cpp:L149](../../Tests/TestThirdPartyIntegration.cpp#L149) | | -| `TgaHeader` | function | Tests | [TestAssetParserHardening.cpp:L81](../../Tests/TestAssetParserHardening.cpp#L81) | | +| `tga` | function | Tests | [TestThirdPartyIntegration.cpp:L165](../../Tests/TestThirdPartyIntegration.cpp#L165) | | +| `TgaHeader` | function | Tests | [TestAssetParserHardening.cpp:L97](../../Tests/TestAssetParserHardening.cpp#L97) | | | `ThawAll` | function | SparkEngine | [FreezeSystem.h:L266](../../SparkEngine/Source/Engine/SaveSystem/FreezeSystem.h#L266) | Restore all registered subsystems from a binary buffer. | | `ThemeColor` | function | SparkEditor | [EditorTheme.cpp:L45](../../SparkEditor/Source/Core/EditorTheme.cpp#L45) | | | `ThemeColor` | function | SparkEditor | [EditorTheme.cpp:L60](../../SparkEditor/Source/Core/EditorTheme.cpp#L60) | | @@ -42312,12 +42414,12 @@ | `threadLock` | function | SparkEngine | [DirectStorageLoader.cpp:L305](../../SparkEngine/Source/Engine/Streaming/DirectStorageLoader.cpp#L305) | | | `ThreadSafeQueue` | function | SparkEngine | [ThreadSafeQueue.h:L57](../../SparkEngine/Source/Utils/ThreadSafeQueue.h#L57) | Construct a queue with an optional maximum size. | | `ThreadSafeRandomEngine` | function | SparkEngine | [RandomEngine.h:L220](../../SparkEngine/Source/Utils/RandomEngine.h#L220) | | -| `ThreadStacks` | function | SparkEngine | [CrashHandler.cpp:L825](../../SparkEngine/Source/Utils/CrashHandler.cpp#L825) | | -| `ThreadStacks` | function | SparkEngine | [CrashHandler.cpp:L1450](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1450) | | -| `ThreadStacksBounded` | function | SparkEngine | [CrashHandler.cpp:L826](../../SparkEngine/Source/Utils/CrashHandler.cpp#L826) | | -| `ThreadStacksBounded` | function | SparkEngine | [CrashHandler.cpp:L886](../../SparkEngine/Source/Utils/CrashHandler.cpp#L886) | | -| `ThreadStacksBounded` | function | SparkEngine | [CrashHandler.cpp:L1178](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1178) | | -| `ThreadStacksThreadProc` | function | SparkEngine | [CrashHandler.cpp:L875](../../SparkEngine/Source/Utils/CrashHandler.cpp#L875) | | +| `ThreadStacks` | function | SparkEngine | [CrashHandler.cpp:L826](../../SparkEngine/Source/Utils/CrashHandler.cpp#L826) | | +| `ThreadStacks` | function | SparkEngine | [CrashHandler.cpp:L1451](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1451) | | +| `ThreadStacksBounded` | function | SparkEngine | [CrashHandler.cpp:L827](../../SparkEngine/Source/Utils/CrashHandler.cpp#L827) | | +| `ThreadStacksBounded` | function | SparkEngine | [CrashHandler.cpp:L887](../../SparkEngine/Source/Utils/CrashHandler.cpp#L887) | | +| `ThreadStacksBounded` | function | SparkEngine | [CrashHandler.cpp:L1179](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1179) | | +| `ThreadStacksThreadProc` | function | SparkEngine | [CrashHandler.cpp:L876](../../SparkEngine/Source/Utils/CrashHandler.cpp#L876) | | | `ThrowAfterPreparingLiveStorage` | function | Tests | [Test_persistence_SaveSystem.cpp:L507](../../Tests/harden/Test_persistence_SaveSystem.cpp#L507) | | | `throwingContext` | function | Tests | [module_logging_consumer.cpp:L98](../../Tests/PackageSmoke/FPSProgression/module_logging_consumer.cpp#L98) | | | `ThrowingSystem` | function | Tests | [Test_tests_ecsystemordering_real.cpp:L145](../../Tests/harden/Test_tests_ecsystemordering_real.cpp#L145) | | @@ -42357,7 +42459,7 @@ | `Tick` | function | Tests | [TestAIStress.cpp:L97](../../Tests/TestAIStress.cpp#L97) | | | `Tick` | function | Tests | [TestAIStress.cpp:L118](../../Tests/TestAIStress.cpp#L118) | | | `Tick` | function | Tests | [TestEngineWiringReal.cpp:L556](../../Tests/TestEngineWiringReal.cpp#L556) | | -| `Tick` | function | Tests | [TestTF120Travel.cpp:L156](../../Tests/TestTF120Travel.cpp#L156) | | +| `Tick` | function | Tests | [TestTF120Travel.cpp:L143](../../Tests/TestTF120Travel.cpp#L143) | | | `Tick` | function | Tests | [TestWorldServerRouting.cpp:L99](../../Tests/TestWorldServerRouting.cpp#L99) | | | `Tick` | function | Tests | [VisualScriptGameplayHarness.h:L159](../../Tests/VisualScriptGameplayHarness.h#L159) | | | `Tick` | function | Tests | [Test_scripting_hardening.cpp:L210](../../Tests/harden/Test_scripting_hardening.cpp#L210) | | @@ -42468,14 +42570,14 @@ | `To` | function | SparkEngine | [Tween.h:L423](../../SparkEngine/Source/Utils/Tween.h#L423) | Create a tween that interpolates | | `ToBucket` | function | SparkEngine | [CoverSystem.h:L183](../../SparkEngine/Source/Engine/AI/CoverSystem.h#L183) | | | `ToBucket` | function | SparkEngine | [TacticalPointSystem.h:L210](../../SparkEngine/Source/Engine/AI/TacticalPointSystem.h#L210) | Convert a world position to a bucket key. | -| `toc` | function | Tests | [TestSparkPak.cpp:L498](../../Tests/TestSparkPak.cpp#L498) | | -| `toc` | function | Tests | [TestSparkPak.cpp:L543](../../Tests/TestSparkPak.cpp#L543) | | -| `toc` | function | Tests | [TestSparkPak.cpp:L595](../../Tests/TestSparkPak.cpp#L595) | | +| `toc` | function | Tests | [TestSparkPak.cpp:L514](../../Tests/TestSparkPak.cpp#L514) | | +| `toc` | function | Tests | [TestSparkPak.cpp:L559](../../Tests/TestSparkPak.cpp#L559) | | +| `toc` | function | Tests | [TestSparkPak.cpp:L611](../../Tests/TestSparkPak.cpp#L611) | | | `ToCacheStage` | function | SparkEngine | [ShaderCompilationWindows.cpp:L67](../../SparkEngine/Source/Graphics/ShaderCompilationWindows.cpp#L67) | | | `tocCompressed` | function | SparkEngine | [SparkPak.cpp:L287](../../SparkEngine/Source/Core/SparkPak.cpp#L287) | | | `tocCompressed` | function | SparkEngine | [SparkPakWriter.cpp:L307](../../SparkEngine/Source/Core/SparkPakWriter.cpp#L307) | | | `ToCompactString` | function | SparkEngine | [StackTrace.h:L145](../../SparkEngine/Source/Utils/StackTrace.h#L145) | Get a compact single-line summary (top N frames) | -| `tocRaw` | function | Tests | [TestSparkPak.cpp:L192](../../Tests/TestSparkPak.cpp#L192) | | +| `tocRaw` | function | Tests | [TestSparkPak.cpp:L198](../../Tests/TestSparkPak.cpp#L198) | | | `ToDigest` | function | GameModules | [TFAccountSystem.cpp:L91](../../GameModules/SparkGameMMOFPS/Source/Account/TFAccountSystem.cpp#L91) | | | `ToFloat4` | function | Tests | [TestQuaternionStubsReal.cpp:L34](../../Tests/TestQuaternionStubsReal.cpp#L34) | | | `ToFloat4x4` | function | Tests | [TestQuaternionStubsReal.cpp:L41](../../Tests/TestQuaternionStubsReal.cpp#L41) | | @@ -42499,7 +42601,7 @@ | `ToggleDebugUI` | function | GameModules | [TFProgressionSystem.h:L147](../../GameModules/SparkGameMMOFPS/Source/Game/TFProgressionSystem.h#L147) | | | `ToggleDebugUI` | function | GameModules | [TFVehicleSystem.h:L138](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L138) | | | `ToggleDebugUI` | function | GameModules | [TFClientNet.h:L103](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L103) | | -| `ToggleDebugUI` | function | GameModules | [TFReplication.h:L75](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L75) | | +| `ToggleDebugUI` | function | GameModules | [TFReplication.h:L79](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L79) | | | `ToggleDebugUI` | function | GameModules | [TFServerSim.h:L154](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L154) | | | `ToggleDebugUI` | function | GameModules | [TFLoginFlow.h:L88](../../GameModules/SparkGameMMOFPS/Source/UI/TFLoginFlow.h#L88) | | | `ToggleDebugUI` | function | GameModules | [TFRegionSystem.h:L113](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.h#L113) | | @@ -42739,7 +42841,7 @@ | `Transparent` | function | SparkEngine | [UISystem.h:L114](../../SparkEngine/Source/Engine/UI/UISystem.h#L114) | | | `Travel` | function | GameModules | [MMOGameplaySession.h:L48](../../GameModules/SparkGameMMO/Source/Gameplay/MMOGameplaySession.h#L48) | | | `Travel` | function | GameModules | [RPGDemoSession.h:L37](../../GameModules/SparkGameRPG/Source/Gameplay/RPGDemoSession.h#L37) | | -| `TravelRequest` | function | Tests | [TestTF120Travel.cpp:L189](../../Tests/TestTF120Travel.cpp#L189) | | +| `TravelRequest` | function | Tests | [TestTF120Travel.cpp:L176](../../Tests/TestTF120Travel.cpp#L176) | | | `traversalReload` | function | Tests | [TestSceneManagerUnicodeReal.cpp:L118](../../Tests/TestSceneManagerUnicodeReal.cpp#L118) | | | `TraversePortals` | function | SparkEngine | [PortalCulling.h:L247](../../SparkEngine/Source/Graphics/PortalCulling.h#L247) | Recursively traverse portals from a cell, narrowing visibility. | | `TraversePortals` | function | Tests | [TestPortalCulling.cpp:L189](../../Tests/TestPortalCulling.cpp#L189) | | @@ -42749,22 +42851,22 @@ | `TriangulatePolygon` | function | SparkEngine | [OBJStaticMeshLoader.cpp:L235](../../SparkEngine/Source/Graphics/OBJStaticMeshLoader.cpp#L235) | | | `triAreas` | function | SparkEngine | [RecastDetourBackend.cpp:L105](../../SparkEngine/Source/Engine/AI/RecastDetourBackend.cpp#L105) | | | `TriggerCrashHandler` | function | SparkEngine | [Assert.h:L104](../../SparkEngine/Source/Utils/Assert.h#L104) | | -| `TriggerCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L969](../../SparkEngine/Source/Utils/CrashHandler.cpp#L969) | | -| `TriggerCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2702](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2702) | | -| `TriggerCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2836](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2836) | | +| `TriggerCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L970](../../SparkEngine/Source/Utils/CrashHandler.cpp#L970) | | +| `TriggerCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2748](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2748) | | +| `TriggerCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2882](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2882) | | | `TriggerCrashHandler` | function | SparkEngine | [CrashHandler.h:L92](../../SparkEngine/Source/Utils/CrashHandler.h#L92) | Called by Assert::Fail to optionally trigger a crash report | | `TriggerCrashHandler` | function | SparkEngine | [CrashHandlerStub.cpp:L19](../../SparkEngine/Source/Utils/CrashHandlerStub.cpp#L19) | | | `TriggerCrashReport` | function | SparkEngine | [Assert.h:L105](../../SparkEngine/Source/Utils/Assert.h#L105) | | -| `TriggerCrashReport` | function | SparkEngine | [CrashHandler.cpp:L1015](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1015) | | -| `TriggerCrashReport` | function | SparkEngine | [CrashHandler.cpp:L2729](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2729) | | -| `TriggerCrashReport` | function | SparkEngine | [CrashHandler.cpp:L2842](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2842) | | +| `TriggerCrashReport` | function | SparkEngine | [CrashHandler.cpp:L1016](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1016) | | +| `TriggerCrashReport` | function | SparkEngine | [CrashHandler.cpp:L2775](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2775) | | +| `TriggerCrashReport` | function | SparkEngine | [CrashHandler.cpp:L2888](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2888) | | | `TriggerCrashReport` | function | SparkEngine | [CrashHandler.h:L105](../../SparkEngine/Source/Utils/CrashHandler.h#L105) | | | `TriggerCrashReport` | function | SparkEngine | [CrashHandlerStub.cpp:L25](../../SparkEngine/Source/Utils/CrashHandlerStub.cpp#L25) | | -| `TriggerCrashReportUnattended` | function | SparkEngine | [CrashHandler.cpp:L1020](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1020) | | -| `TriggerCrashReportUnattended` | function | SparkEngine | [CrashHandler.cpp:L2798](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2798) | | -| `TriggerCrashReportUnattended` | function | SparkEngine | [CrashHandler.cpp:L2848](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2848) | | +| `TriggerCrashReportUnattended` | function | SparkEngine | [CrashHandler.cpp:L1021](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1021) | | +| `TriggerCrashReportUnattended` | function | SparkEngine | [CrashHandler.cpp:L2844](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2844) | | +| `TriggerCrashReportUnattended` | function | SparkEngine | [CrashHandler.cpp:L2894](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2894) | | | `TriggerCrashReportUnattended` | function | SparkEngine | [CrashHandler.h:L122](../../SparkEngine/Source/Utils/CrashHandler.h#L122) | | -| `TriggerCrashReportWithDelivery` | function | SparkEngine | [CrashHandler.cpp:L996](../../SparkEngine/Source/Utils/CrashHandler.cpp#L996) | | +| `TriggerCrashReportWithDelivery` | function | SparkEngine | [CrashHandler.cpp:L997](../../SparkEngine/Source/Utils/CrashHandler.cpp#L997) | | | `TriggerEditorPanel::Initialize` | method | SparkEditor | [TriggerEditorPanel.cpp:L19](../../SparkEditor/Source/Panels/TriggerEditorPanel.cpp#L19) | | | `TriggerEditorPanel::Render` | method | SparkEditor | [TriggerEditorPanel.cpp:L27](../../SparkEditor/Source/Panels/TriggerEditorPanel.cpp#L27) | | | `TriggerEditorPanel::RenderCreateDialog` | method | SparkEditor | [TriggerEditorPanel.cpp:L149](../../SparkEditor/Source/Panels/TriggerEditorPanel.cpp#L149) | | @@ -42782,6 +42884,7 @@ | `TriggerRenderDocCapture` | function | SparkEngine | [GPUDebugMarkers.h:L262](../../SparkEngine/Source/Graphics/GPUDebugMarkers.h#L262) | | | `TriggerTypeToString` | function | SparkEngine | [EventResponseRules.cpp:L27](../../SparkEngine/Source/Engine/Gameplay/EventResponseRules.cpp#L27) | | | `Trim` | function | SparkBuild | [Config.cpp:L431](../../SparkBuild/src/Config.cpp#L431) | | +| `Trim` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L18](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L18) | | | `Trim` | function | SparkEngine | [StartupSplash.cpp:L49](../../SparkEngine/Source/Core/StartupSplash.cpp#L49) | | | `Trim` | function | SparkEngine | [EntityArchetypeLoader.cpp:L28](../../SparkEngine/Source/Engine/ECS/EntityArchetypeLoader.cpp#L28) | | | `Trim` | function | SparkEngine | [EntityArchetypeParse.cpp:L22](../../SparkEngine/Source/Engine/ECS/EntityArchetypeParse.cpp#L22) | | @@ -42923,8 +43026,8 @@ | `UDPTransport` | function | SparkEngine | [UDPTransport.h:L102](../../SparkEngine/Source/Engine/Networking/UDPTransport.h#L102) | | | `UI` | function | SparkEngine | [EngineSettings.h:L1003](../../SparkEngine/Source/Core/EngineSettings.h#L1003) | | | `UI` | function | SparkEngine | [EngineSettings.h:L1004](../../SparkEngine/Source/Core/EngineSettings.h#L1004) | | -| `UIButton::HandleClick` | method | SparkEngine | [UIWidgets.cpp:L62](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L62) | | -| `UIButton::Render` | method | SparkEngine | [UIWidgets.cpp:L79](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L79) | | +| `UIButton::HandleClick` | method | SparkEngine | [UIWidgets.cpp:L64](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L64) | | +| `UIButton::Render` | method | SparkEngine | [UIWidgets.cpp:L81](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L81) | | | `UICanvas::CreatePanel` | method | SparkEngine | [UISystem.cpp:L28](../../SparkEngine/Source/Engine/UI/UISystem.cpp#L28) | | | `UICanvas::FindWidget` | method | SparkEngine | [UISystem.cpp:L36](../../SparkEngine/Source/Engine/UI/UISystem.cpp#L36) | | | `UICanvas::HandleClick` | method | SparkEngine | [UISystem.cpp:L75](../../SparkEngine/Source/Engine/UI/UISystem.cpp#L75) | | @@ -43001,8 +43104,8 @@ | `UIGridLayout::SetCellSpacing` | method | SparkEngine | [UILayoutExtensions.cpp:L143](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L143) | | | `UIGridLayout::SetColumns` | method | SparkEngine | [UILayoutExtensions.cpp:L135](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L135) | | | `UIGridLayout::SetRows` | method | SparkEngine | [UILayoutExtensions.cpp:L139](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L139) | | -| `UIImageWidget::Render` | method | SparkEngine | [UIWidgets.cpp:L113](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L113) | | -| `UILabel::Render` | method | SparkEngine | [UIWidgets.cpp:L46](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L46) | | +| `UIImageWidget::Render` | method | SparkEngine | [UIWidgets.cpp:L115](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L115) | | +| `UILabel::Render` | method | SparkEngine | [UIWidgets.cpp:L48](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L48) | | | `UILayoutLoader::ExtractFloat` | method | SparkEngine | [UILayoutExtensions.cpp:L699](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L699) | | | `UILayoutLoader::ExtractString` | method | SparkEngine | [UILayoutExtensions.cpp:L634](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L634) | | | `UILayoutLoader::FindMatchingBrace` | method | SparkEngine | [UILayoutExtensions.cpp:L595](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L595) | | @@ -43012,17 +43115,17 @@ | `UILayoutLoader::ValidateChildren` | method | SparkEngine | [UILayoutExtensions.cpp:L486](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L486) | | | `UiMapWaypointClick` | function | GameModules | [TFSquadSystem.h:L117](../../GameModules/SparkGameMMOFPS/Source/Game/TFSquadSystem.h#L117) | | | `uint64_t` | function | SparkEngine | [UUID.h:L107](../../SparkEngine/Source/Utils/UUID.h#L107) | | -| `UIPanel::CreateButton` | method | SparkEngine | [UIWidgets.cpp:L136](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L136) | | -| `UIPanel::CreateImage` | method | SparkEngine | [UIWidgets.cpp:L152](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L152) | | -| `UIPanel::CreateLabel` | method | SparkEngine | [UIWidgets.cpp:L128](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L128) | | -| `UIPanel::CreatePanel` | method | SparkEngine | [UIWidgets.cpp:L160](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L160) | | -| `UIPanel::CreateProgressBar` | method | SparkEngine | [UIWidgets.cpp:L144](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L144) | | -| `UIPanel::FindWidget` | method | SparkEngine | [UIWidgets.cpp:L168](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L168) | | -| `UIPanel::HandleClick` | method | SparkEngine | [UIWidgets.cpp:L250](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L250) | | -| `UIPanel::RemoveWidget` | method | SparkEngine | [UIWidgets.cpp:L187](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L187) | | -| `UIPanel::Render` | method | SparkEngine | [UIWidgets.cpp:L235](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L235) | | -| `UIPanel::Update` | method | SparkEngine | [UIWidgets.cpp:L194](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L194) | | -| `UIProgressBar::Render` | method | SparkEngine | [UIWidgets.cpp:L95](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L95) | | +| `UIPanel::CreateButton` | method | SparkEngine | [UIWidgets.cpp:L138](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L138) | | +| `UIPanel::CreateImage` | method | SparkEngine | [UIWidgets.cpp:L154](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L154) | | +| `UIPanel::CreateLabel` | method | SparkEngine | [UIWidgets.cpp:L130](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L130) | | +| `UIPanel::CreatePanel` | method | SparkEngine | [UIWidgets.cpp:L162](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L162) | | +| `UIPanel::CreateProgressBar` | method | SparkEngine | [UIWidgets.cpp:L146](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L146) | | +| `UIPanel::FindWidget` | method | SparkEngine | [UIWidgets.cpp:L170](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L170) | | +| `UIPanel::HandleClick` | method | SparkEngine | [UIWidgets.cpp:L252](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L252) | | +| `UIPanel::RemoveWidget` | method | SparkEngine | [UIWidgets.cpp:L189](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L189) | | +| `UIPanel::Render` | method | SparkEngine | [UIWidgets.cpp:L237](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L237) | | +| `UIPanel::Update` | method | SparkEngine | [UIWidgets.cpp:L196](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L196) | | +| `UIProgressBar::Render` | method | SparkEngine | [UIWidgets.cpp:L97](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L97) | | | `UiRequestPing` | function | GameModules | [TFPingSystem.h:L209](../../GameModules/SparkGameMMOFPS/Source/Game/TFPingSystem.h#L209) | | | `UIScrollView` | function | SparkEngine | [UILayoutExtensions.h:L86](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L86) | | | `UIScrollView::GetMaxScroll` | method | SparkEngine | [UILayoutExtensions.cpp:L209](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L209) | | @@ -43062,9 +43165,9 @@ | `UITextInput::SetReadOnly` | method | SparkEngine | [UILayoutExtensions.cpp:L266](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L266) | | | `UITextInput::SetText` | method | SparkEngine | [UILayoutExtensions.cpp:L236](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L236) | | | `UITypedBinding` | function | SparkEngine | [UIFactory.h:L43](../../SparkEngine/Source/Engine/UI/UIFactory.h#L43) | Templated bidirectional data binding — replaces per-type classes | -| `UIWidget::HandleClick` | method | SparkEngine | [UIWidgets.cpp:L33](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L33) | | -| `UIWidget::Render` | method | SparkEngine | [UIWidgets.cpp:L28](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L28) | | -| `UIWidget::Update` | method | SparkEngine | [UIWidgets.cpp:L23](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L23) | | +| `UIWidget::HandleClick` | method | SparkEngine | [UIWidgets.cpp:L35](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L35) | | +| `UIWidget::Render` | method | SparkEngine | [UIWidgets.cpp:L30](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L30) | | +| `UIWidget::Update` | method | SparkEngine | [UIWidgets.cpp:L25](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L25) | | | `UnackedMessagesWithPayload` | function | Tests | [TestNetworkManagerIntegration.cpp:L84](../../Tests/TestNetworkManagerIntegration.cpp#L84) | | | `UnassignWorker` | function | GameModules | [RTSResourceSystem.h:L77](../../GameModules/SparkGameRTS/Source/Resource/RTSResourceSystem.h#L77) | | | `UnbanAccount` | function | GameModules | [MMOAccountSystem.h:L137](../../GameModules/SparkGameMMO/Source/Account/MMOAccountSystem.h#L137) | | @@ -43182,8 +43285,8 @@ | `UniqueEndpoint` | function | SparkDaemon | [CollabProcessSmoke.cpp:L37](../../SparkDaemon/tests/CollabProcessSmoke.cpp#L37) | | | `UniqueEndpoint` | function | Tests | [TestSecDaemonPipeIdentity.cpp:L53](../../Tests/TestSecDaemonPipeIdentity.cpp#L53) | | | `UniqueEndpoint` | function | Tests | [TestSecDaemonPipeIdentity.cpp:L73](../../Tests/TestSecDaemonPipeIdentity.cpp#L73) | | -| `UniqueHandle` | function | SparkEngine | [SceneManager.cpp:L246](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L246) | | -| `UniqueHandle` | function | SparkEngine | [SceneManager.cpp:L250](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L250) | | +| `UniqueHandle` | function | SparkEngine | [SceneManager.cpp:L267](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L267) | | +| `UniqueHandle` | function | SparkEngine | [SceneManager.cpp:L273](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L273) | | | `UniqueLifecycleCacheDir` | function | Tests | [TestDaemonLifecycle.cpp:L56](../../Tests/TestDaemonLifecycle.cpp#L56) | | | `UniqueLifecyclePath` | function | Tests | [TestDaemonLifecycle.cpp:L45](../../Tests/TestDaemonLifecycle.cpp#L45) | | | `UniqueLocalCache` | function | Tests | [TestShaderDiskCacheDaemon.cpp:L48](../../Tests/TestShaderDiskCacheDaemon.cpp#L48) | | @@ -43442,7 +43545,7 @@ | `Update` | function | GameModules | [TFVehicleTerminal.h:L42](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleTerminal.h#L42) | | | `Update` | function | GameModules | [TFWeaponSystem.h:L47](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L47) | | | `Update` | function | GameModules | [TFClientNet.h:L77](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L77) | | -| `Update` | function | GameModules | [TFReplication.h:L60](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L60) | | +| `Update` | function | GameModules | [TFReplication.h:L64](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L64) | | | `Update` | function | GameModules | [TFServerSim.h:L61](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L61) | | | `Update` | function | GameModules | [TFChatWindow.h:L46](../../GameModules/SparkGameMMOFPS/Source/UI/TFChatWindow.h#L46) | | | `Update` | function | GameModules | [TFDeathRecap.h:L66](../../GameModules/SparkGameMMOFPS/Source/UI/TFDeathRecap.h#L66) | | @@ -43515,7 +43618,7 @@ | `Update` | function | SparkEditor | [AIDebugPanel.h:L37](../../SparkEditor/Source/Panels/AIDebugPanel.h#L37) | | | `Update` | function | SparkEditor | [AIEditorPanel.h:L29](../../SparkEditor/Source/Panels/AIEditorPanel.h#L29) | | | `Update` | function | SparkEditor | [AbilityEditorPanel.h:L30](../../SparkEditor/Source/Panels/AbilityEditorPanel.h#L30) | | -| `Update` | function | SparkEditor | [AssetBrowserPanel.h:L49](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L49) | Update asset browser panel | +| `Update` | function | SparkEditor | [AssetBrowserPanel.h:L50](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L50) | Update asset browser panel | | `Update` | function | SparkEditor | [AudioMixerPanel.h:L29](../../SparkEditor/Source/Panels/AudioMixerPanel.h#L29) | | | `Update` | function | SparkEditor | [BasicMaterialEditorPanel.h:L48](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L48) | | | `Update` | function | SparkEditor | [BuildCookPanel.h:L110](../../SparkEditor/Source/Panels/BuildCookPanel.h#L110) | | @@ -43720,7 +43823,7 @@ | `Update` | function | SparkEngine | [WeatherSystem.h:L268](../../SparkEngine/Source/Graphics/WeatherSystem.h#L268) | Update the weather system | | `Update` | function | SparkEngine | [GamepadInput.h:L178](../../SparkEngine/Source/Input/GamepadInput.h#L178) | | | `Update` | function | SparkEngine | [InputActionSystem.h:L335](../../SparkEngine/Source/Input/InputActionSystem.h#L335) | Update all action states (call once per frame) | -| `Update` | function | SparkEngine | [InputManager.h:L142](../../SparkEngine/Source/Input/InputManager.h#L142) | Update input states for the current frame | +| `Update` | function | SparkEngine | [InputManager.h:L144](../../SparkEngine/Source/Input/InputManager.h#L144) | Update input states for the current frame | | `Update` | function | SparkEngine | [CharacterController.h:L111](../../SparkEngine/Source/Physics/CharacterController.h#L111) | Update the character controller position based on velocity and gravity. | | `Update` | function | SparkEngine | [ClothSimulation.h:L232](../../SparkEngine/Source/Physics/ClothSimulation.h#L232) | Update all cloth simulations. | | `Update` | function | SparkEngine | [PhysicsSystem.h:L145](../../SparkEngine/Source/Physics/PhysicsSystem.h#L145) | | @@ -43772,9 +43875,9 @@ | `Update` | function | Tests | [TestECSystemSpecialized.cpp:L350](../../Tests/TestECSystemSpecialized.cpp#L350) | | | `Update` | function | Tests | [TestECSystemSpecialized.cpp:L824](../../Tests/TestECSystemSpecialized.cpp#L824) | | | `Update` | function | Tests | [TestECSystemSpecialized.cpp:L848](../../Tests/TestECSystemSpecialized.cpp#L848) | | -| `Update` | function | Tests | [TestECSystemsReal.cpp:L39](../../Tests/TestECSystemsReal.cpp#L39) | | -| `Update` | function | Tests | [TestECSystemsReal.cpp:L54](../../Tests/TestECSystemsReal.cpp#L54) | | -| `Update` | function | Tests | [TestECSystemsReal.cpp:L69](../../Tests/TestECSystemsReal.cpp#L69) | | +| `Update` | function | Tests | [TestECSystemsReal.cpp:L29](../../Tests/TestECSystemsReal.cpp#L29) | | +| `Update` | function | Tests | [TestECSystemsReal.cpp:L44](../../Tests/TestECSystemsReal.cpp#L44) | | +| `Update` | function | Tests | [TestECSystemsReal.cpp:L59](../../Tests/TestECSystemsReal.cpp#L59) | | | `Update` | function | Tests | [TestEditorSubsystems.cpp:L76](../../Tests/TestEditorSubsystems.cpp#L76) | | | `Update` | function | Tests | [TestEditorSubsystems.cpp:L91](../../Tests/TestEditorSubsystems.cpp#L91) | | | `Update` | function | Tests | [TestExtendedSystems.cpp:L973](../../Tests/TestExtendedSystems.cpp#L973) | | @@ -43821,7 +43924,7 @@ | `UpdateAll` | function | SparkEngine | [ECSystems.h:L783](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L783) | | | `UpdateAll` | function | SparkEngine | [PhaseSystemManager.h:L137](../../SparkEngine/Source/Engine/ECS/Systems/PhaseSystemManager.h#L137) | | | `UpdateAll` | function | Tests | [TestECSystemOrdering.cpp:L224](../../Tests/TestECSystemOrdering.cpp#L224) | | -| `UpdateAll` | function | Tests | [TestECSystemsReal.cpp:L85](../../Tests/TestECSystemsReal.cpp#L85) | | +| `UpdateAll` | function | Tests | [TestECSystemsReal.cpp:L75](../../Tests/TestECSystemsReal.cpp#L75) | | | `UpdateAllAgents` | function | SparkEngine | [ParallelPerception.h:L177](../../SparkEngine/Source/Engine/AI/ParallelPerception.h#L177) | | | `UpdateAllBindings` | function | SparkEngine | [UIFactory.h:L136](../../SparkEngine/Source/Engine/UI/UIFactory.h#L136) | Push all data values to widgets | | `UpdateAndDrawFlakes` | function | GameModules | [TFWeatherFx.h:L174](../../GameModules/SparkGameMMOFPS/Source/World/TFWeatherFx.h#L174) | | @@ -43831,7 +43934,7 @@ | `UpdateAndRender` | function | GameModules | [TFVehicleFx.h:L86](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleFx.h#L86) | | | `UpdateAnimation` | function | GameModules | [Player.h:L725](../../GameModules/SparkGameFPS/Source/Game/Player.h#L725) | Update animation timers and effects | | `UpdateAreaDistances` | function | SparkEngine | [SeamlessAreaManager.h:L193](../../SparkEngine/Source/Engine/Streaming/SeamlessAreaManager.h#L193) | Compute a distance biased by alignment with the player's movement direction. | -| `UpdateArenaAutopilot` | function | GameModules | [Game.h:L649](../../GameModules/SparkGameFPS/Source/Game/Game.h#L649) | Step the arena autopilot when enabled and fire when it is on target. | +| `UpdateArenaAutopilot` | function | GameModules | [Game.h:L673](../../GameModules/SparkGameFPS/Source/Game/Game.h#L673) | Step the arena autopilot when enabled and fire when it is on target. | | `UpdateAssetDatabaseInfo` | function | SparkEditor | [EditorUI.h:L246](../../SparkEditor/Source/Core/EditorUI.h#L246) | | | `UpdateAudio` | function | SparkEngine | [WeatherGameplayIntegration.h:L108](../../SparkEngine/Source/Engine/Gameplay/WeatherGameplayIntegration.h#L108) | | | `UpdateAuras` | function | SparkEngine | [AbilitySystem.h:L324](../../SparkEngine/Source/Engine/Gameplay/AbilitySystem.h#L324) | | @@ -43944,7 +44047,7 @@ | `UpdateIsolated` | function | SparkEngine | [PhaseSystemManager.h:L256](../../SparkEngine/Source/Engine/ECS/Systems/PhaseSystemManager.h#L256) | | | `UpdateJetpack` | function | GameModules | [Player.h:L759](../../GameModules/SparkGameFPS/Source/Game/Player.h#L759) | Handle jetpack mechanics for Scout | | `UpdateJumpBuffer` | function | GameModules | [PlatformerPlayerController.h:L182](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L182) | | -| `UpdateKeyState` | function | SparkEngine | [InputManager.h:L448](../../SparkEngine/Source/Input/InputManager.h#L448) | Consolidated handler for mouse button down/up messages. | +| `UpdateKeyState` | function | SparkEngine | [InputManager.h:L455](../../SparkEngine/Source/Input/InputManager.h#L455) | Consolidated handler for mouse button down/up messages. | | `UpdateKillFeed` | function | GameModules | [HUDSystem.h:L439](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L439) | | | `UpdateLasers` | function | GameModules | [PlatformerHazardSystem.h:L127](../../GameModules/SparkGamePlatformer/Source/Hazard/PlatformerHazardSystem.h#L127) | Get wind force at a given position (for wind zones) | | `UpdateLayers` | function | SparkEngine | [AnimationSystem.h:L316](../../SparkEngine/Source/Engine/Animation/AnimationSystem.h#L316) | Advance layer playback times and sample/blend all layers. | @@ -43970,11 +44073,11 @@ | `UpdateMetrics` | function | SparkEngine | [RenderTarget.h:L381](../../SparkEngine/Source/Graphics/RenderTarget.h#L381) | | | `UpdateMetrics` | function | SparkEngine | [TextureSystem.h:L438](../../SparkEngine/Source/Graphics/TextureSystem.h#L438) | | | `UpdateMetrics` | function | SparkEngine | [PhysicsSystem.h:L807](../../SparkEngine/Source/Physics/PhysicsSystem.h#L807) | | -| `UpdateMouseButton` | function | SparkEngine | [InputManager.h:L458](../../SparkEngine/Source/Input/InputManager.h#L458) | Update the state of a specific mouse button | -| `UpdateMousePosition` | function | SparkEngine | [InputManager.h:L469](../../SparkEngine/Source/Input/InputManager.h#L469) | Update mouse position and calculate delta | +| `UpdateMouseButton` | function | SparkEngine | [InputManager.h:L465](../../SparkEngine/Source/Input/InputManager.h#L465) | Update the state of a specific mouse button | +| `UpdateMousePosition` | function | SparkEngine | [InputManager.h:L476](../../SparkEngine/Source/Input/InputManager.h#L476) | Update mouse position and calculate delta | | `UpdateMovement` | function | GameModules | [Player.h:L707](../../GameModules/SparkGameFPS/Source/Game/Player.h#L707) | Update movement based on input and physics | | `UpdateMovement` | function | SparkEngine | [AISystem.h:L394](../../SparkEngine/Source/Engine/AI/AISystem.h#L394) | | -| `UpdateMultiplayer` | function | GameModules | [Game.h:L724](../../GameModules/SparkGameFPS/Source/Game/Game.h#L724) | Tick the FPS multiplayer session and send local input at its fixed 60 Hz step. | +| `UpdateMultiplayer` | function | GameModules | [Game.h:L748](../../GameModules/SparkGameFPS/Source/Game/Game.h#L748) | Tick the FPS multiplayer session and send local input at its fixed 60 Hz step. | | `UpdateNodeRespawns` | function | GameModules | [OWGatheringSystem.h:L143](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.h#L143) | | | `UpdateNonECSSystems` | function | SparkEngine | [GameplayLifecycleShared.cpp:L968](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L968) | | | `UpdateObjectGravity` | function | GameModules | [GravitySystem.h:L156](../../GameModules/SparkGameFPS/Source/Game/GravitySystem.h#L156) | Get gravity state for an object (with transitions) | @@ -44063,7 +44166,7 @@ | `UpdateStatistics` | function | SparkEditor | [EditorLogger.h:L229](../../SparkEditor/Source/Core/EditorLogger.h#L229) | | | `UpdateStatistics` | function | SparkEditor | [LevelStreamingSystem.h:L406](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.h#L406) | Update streaming statistics | | `UpdateStats` | function | SparkEditor | [EditorCrashHandler.h:L132](../../SparkEditor/Source/Core/EditorCrashHandler.h#L132) | | -| `UpdateStats` | function | SparkEditor | [EditorUI.h:L506](../../SparkEditor/Source/Core/EditorUI.h#L506) | | +| `UpdateStats` | function | SparkEditor | [EditorUI.h:L504](../../SparkEditor/Source/Core/EditorUI.h#L504) | | | `UpdateStats` | function | SparkEditor | [ConsolePanel.h:L262](../../SparkEditor/Source/Panels/ConsolePanel.h#L262) | Update statistics | | `UpdateStats` | function | SparkEngine | [RenderGraph.h:L1301](../../SparkEngine/Source/Graphics/RenderGraph.h#L1301) | Update aggregate statistics after compilation. | | `UpdateStreaming` | function | SparkEngine | [HLODSystem.h:L291](../../SparkEngine/Source/Engine/HLOD/HLODSystem.h#L291) | Update streaming: load nearby cells, unload distant ones | @@ -44181,9 +44284,9 @@ | `Utf8` | function | Tests | [ScopedEditorProfile.h:L33](../../Tests/Fixtures/ScopedEditorProfile.h#L33) | | | `Utf8` | function | Tests | [TF120PeerProcess.h:L123](../../Tests/TF120PeerProcess.h#L123) | | | `Utf8` | function | Tests | [TestDocumentInterruptionReal.cpp:L114](../../Tests/TestDocumentInterruptionReal.cpp#L114) | | -| `Utf8` | function | Tests | [TestEditorCookPackageReal.cpp:L102](../../Tests/TestEditorCookPackageReal.cpp#L102) | | -| `Utf8` | function | Tests | [TestEditorCookPackageReal.cpp:L269](../../Tests/TestEditorCookPackageReal.cpp#L269) | | -| `Utf8` | function | Tests | [TestEditorCookPackageReal.cpp:L276](../../Tests/TestEditorCookPackageReal.cpp#L276) | | +| `Utf8` | function | Tests | [TestEditorCookPackageReal.cpp:L104](../../Tests/TestEditorCookPackageReal.cpp#L104) | | +| `Utf8` | function | Tests | [TestEditorCookPackageReal.cpp:L280](../../Tests/TestEditorCookPackageReal.cpp#L280) | | +| `Utf8` | function | Tests | [TestEditorCookPackageReal.cpp:L287](../../Tests/TestEditorCookPackageReal.cpp#L287) | | | `Utf8` | function | Tests | [TestEditorStateCompatibility.cpp:L48](../../Tests/TestEditorStateCompatibility.cpp#L48) | | | `Utf8` | function | Tests | [TestEditorUntrustedProject.cpp:L67](../../Tests/TestEditorUntrustedProject.cpp#L67) | | | `Utf8` | function | Tests | [TestModuleDiscovery.cpp:L84](../../Tests/TestModuleDiscovery.cpp#L84) | | @@ -44293,8 +44396,8 @@ | `ValidateHit` | function | SparkEngine | [NetworkManager.h:L882](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L882) | | | `ValidateHit` | function | Tests | [TestLagCompensationIntegration.cpp:L156](../../Tests/TestLagCompensationIntegration.cpp#L156) | | | `ValidateInverseBind` | function | SparkEngine | [GLTFSkinSkeleton.cpp:L190](../../SparkEngine/Source/Graphics/GLTFSkinSkeleton.cpp#L190) | | -| `ValidateLaunchRequest` | function | SparkLauncher | [main.cpp:L28](../../SparkLauncher/src/main.cpp#L28) | | -| `ValidateLaunchRequest` | function | SparkLauncher | [main.cpp:L126](../../SparkLauncher/src/main.cpp#L126) | | +| `ValidateLaunchRequest` | function | SparkLauncher | [main.cpp:L30](../../SparkLauncher/src/main.cpp#L30) | | +| `ValidateLaunchRequest` | function | SparkLauncher | [main.cpp:L130](../../SparkLauncher/src/main.cpp#L130) | | | `ValidateLexemes` | function | GameModules | [TFJsonStrict.h:L22](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFJsonStrict.h#L22) | | | `ValidateMatchAndFog` | function | GameModules | [RTSPersistenceValidation.cpp:L175](../../GameModules/SparkGameRTS/Source/Core/RTSPersistenceValidation.cpp#L175) | | | `ValidateMemberNames` | function | SparkBuild | [ArchiveExtraction.cpp:L315](../../SparkBuild/src/ArchiveExtraction.cpp#L315) | | @@ -44415,7 +44518,7 @@ | `ValidBc1_4x4` | function | Tests | [TestTextureStexBoundsReal.cpp:L87](../../Tests/TestTextureStexBoundsReal.cpp#L87) | | | `ValidBeacon` | function | Tests | [TestTFLanBeaconCodec.cpp:L22](../../Tests/TestTFLanBeaconCodec.cpp#L22) | | | `validData` | function | Tests | [TestFBXImporter.cpp:L79](../../Tests/TestFBXImporter.cpp#L79) | | -| `ValidDocument` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L109](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L109) | | +| `ValidDocument` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L110](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L110) | | | `ValidFloat` | function | GameModules | [MMOSessionGateProtocol.cpp:L126](../../GameModules/SparkGameMMO/Source/Session/MMOSessionGateProtocol.cpp#L126) | | | `ValidGrenadeChoiceKey` | function | GameModules | [TFProgressionSystem.h:L235](../../GameModules/SparkGameMMOFPS/Source/Game/TFProgressionSystem.h#L235) | | | `ValidLoadoutSlotKey` | function | GameModules | [TFProgressionSystem.h:L262](../../GameModules/SparkGameMMOFPS/Source/Game/TFProgressionSystem.h#L262) | | @@ -44425,6 +44528,7 @@ | `validVerts` | function | SparkEngine | [OcclusionCulling.cpp:L205](../../SparkEngine/Source/Graphics/OcclusionCulling.cpp#L205) | | | `value` | function | SparkCrashReporter | [CrashAutoIssues.cpp:L77](../../SparkCrashReporter/src/CrashAutoIssues.cpp#L77) | | | `value` | function | SparkEditor | [CollaborativeWireCodec.cpp:L111](../../SparkEditor/Source/Communication/CollaborativeWireCodec.cpp#L111) | | +| `value` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L192](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L192) | | | `Value` | function | SparkEditor | [JSONSceneSerializer.cpp:L194](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L194) | | | `Value` | function | SparkEditor | [JSONSceneSerializer.cpp:L195](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L195) | | | `Value` | function | SparkEditor | [JSONSceneSerializer.cpp:L196](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L196) | | @@ -44454,7 +44558,7 @@ | `Value` | function | SparkEngine | [Result.h:L75](../../SparkEngine/Source/Utils/Result.h#L75) | | | `Value` | function | SparkEngine | [Result.h:L76](../../SparkEngine/Source/Utils/Result.h#L76) | | | `value` | function | Tests | [TestCrashHandlerGatingReal.cpp:L276](../../Tests/TestCrashHandlerGatingReal.cpp#L276) | | -| `value` | function | Tests | [TestTFDataTables.cpp:L97](../../Tests/TestTFDataTables.cpp#L97) | | +| `value` | function | Tests | [TestTFDataTables.cpp:L88](../../Tests/TestTFDataTables.cpp#L88) | | | `valueDist` | function | GameModules | [ARPGLootSystem.cpp:L182](../../GameModules/SparkGameARPG/Source/Loot/ARPGLootSystem.cpp#L182) | | | `ValueNoise2D` | function | Tests | [TestGraphicsIntegration.cpp:L575](../../Tests/TestGraphicsIntegration.cpp#L575) | | | `ValueOr` | function | SparkEngine | [Result.h:L79](../../SparkEngine/Source/Utils/Result.h#L79) | | @@ -44464,7 +44568,7 @@ | `VarianceClip` | function | SparkEngine | [TemporalEffectsTypes.h:L341](../../SparkEngine/Source/Graphics/TemporalEffectsTypes.h#L341) | | | `VarianceClip` | function | SparkEngine | [TemporalTypes.h:L331](../../SparkEngine/Source/Graphics/TemporalTypes.h#L331) | Variance-based clip (more accurate than AABB clamp) | | `VarName` | function | SparkEngine | [VisualScriptCodegen.cpp:L132](../../SparkEngine/Source/Engine/Scripting/VisualScriptCodegen.cpp#L132) | | -| `VarName` | function | SparkEngine | [VisualScriptEmitter.cpp:L325](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L325) | | +| `VarName` | function | SparkEngine | [VisualScriptEmitter.cpp:L338](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L338) | | | `VarName` | function | SparkEngine | [VisualScriptEmitter.h:L62](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L62) | | | `VarName` | function | SparkEngine | [ShaderGraphCompiler.cpp:L38](../../SparkEngine/Source/Graphics/ShaderGraph/ShaderGraphCompiler.cpp#L38) | | | `VarName` | function | SparkEngine | [ShaderGraphCompiler.cpp:L219](../../SparkEngine/Source/Graphics/ShaderGraph/ShaderGraphCompiler.cpp#L219) | | @@ -44498,7 +44602,7 @@ | `Vector3LengthSquared` | function | SparkEngine | [CollisionSystem.h:L317](../../SparkEngine/Source/Physics/CollisionSystem.h#L317) | Calculate the squared length of a 3D vector | | `Vector3Lerp` | function | SparkEngine | [CollisionSystem.h:L357](../../SparkEngine/Source/Physics/CollisionSystem.h#L357) | Linear interpolation between two 3D vectors | | `Vector3Normalize` | function | SparkEngine | [CollisionSystem.h:L324](../../SparkEngine/Source/Physics/CollisionSystem.h#L324) | Normalize a 3D vector to unit length | -| `Vector3Pin` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L125](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L125) | | +| `Vector3Pin` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L126](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L126) | | | `Vector3Reflect` | function | SparkEngine | [CollisionSystem.h:L348](../../SparkEngine/Source/Physics/CollisionSystem.h#L348) | Reflect a vector off a surface normal | | `Vehicle` | function | GameModules | [VehicleSystem.h:L120](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L120) | | | `Vehicle::ApplyGravity` | method | GameModules | [VehicleSystem.cpp:L480](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.cpp#L480) | | @@ -44656,7 +44760,7 @@ | `vetoUnload` | function | Tests | [TestModuleABI.cpp:L609](../../Tests/TestModuleABI.cpp#L609) | | | `vetoUnload` | function | Tests | [TestModuleABI.cpp:L661](../../Tests/TestModuleABI.cpp#L661) | | | `vetoUnload` | function | Tests | [TestModuleABI.cpp:L680](../../Tests/TestModuleABI.cpp#L680) | | -| `Veyra` | function | Tests | [TestTF120Travel.cpp:L139](../../Tests/TestTF120Travel.cpp#L139) | | +| `Veyra` | function | Tests | [TestTF120Travel.cpp:L126](../../Tests/TestTF120Travel.cpp#L126) | | | `victim` | function | Tests | [TestSecurityParsersReal.cpp:L472](../../Tests/TestSecurityParsersReal.cpp#L472) | | | `View` | function | Tests | [TestGLTFSkinnedMeshLoader.cpp:L82](../../Tests/TestGLTFSkinnedMeshLoader.cpp#L82) | | | `View` | function | Tests | [TestRHI240LinuxForwardPassReal.cpp:L253](../../Tests/TestRHI240LinuxForwardPassReal.cpp#L253) | | @@ -44678,7 +44782,7 @@ | `VirtualFileSystem::ResolveProvider` | method | SparkEngine | [VirtualFileSystem.cpp:L606](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L606) | | | `VirtualFileSystem::Shutdown` | method | SparkEngine | [VirtualFileSystem.cpp:L479](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L479) | | | `VirtualFileSystem::Unmount` | method | SparkEngine | [VirtualFileSystem.cpp:L501](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L501) | | -| `VirtualKeyToKeyName` | function | SparkEngine | [InputManager.h:L493](../../SparkEngine/Source/Input/InputManager.h#L493) | Convert virtual key code to key name | +| `VirtualKeyToKeyName` | function | SparkEngine | [InputManager.h:L500](../../SparkEngine/Source/Input/InputManager.h#L500) | Convert virtual key code to key name | | `VirtualTextureManager::Console_GetStatus` | method | SparkEngine | [VirtualTexture.cpp:L232](../../SparkEngine/Source/Graphics/VirtualTexture.cpp#L232) | | | `VirtualTextureManager::EvictStalePages` | method | SparkEngine | [VirtualTexture.cpp:L179](../../SparkEngine/Source/Graphics/VirtualTexture.cpp#L179) | | | `VirtualTextureManager::FindPendingPage` | method | SparkEngine | [VirtualTexture.cpp:L277](../../SparkEngine/Source/Graphics/VirtualTexture.cpp#L277) | | @@ -44695,8 +44799,8 @@ | `VisitCellNeighborhood` | function | SparkEngine | [SpatialGrid.h:L151](../../SparkEngine/Source/Engine/World/SpatialGrid.h#L151) | Visit all entities in a cell and its neighbors | | `visited` | function | GameModules | [TFRegionSystem.cpp:L302](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.cpp#L302) | | | `visited` | function | SparkEngine | [NavMesh.cpp:L208](../../SparkEngine/Source/Engine/AI/NavMesh.cpp#L208) | | -| `visited` | function | Tests | [TestTFRegionLattice.cpp:L164](../../Tests/TestTFRegionLattice.cpp#L164) | | -| `visited` | function | Tests | [TestTFRegionLattice.cpp:L223](../../Tests/TestTFRegionLattice.cpp#L223) | | +| `visited` | function | Tests | [TestTFRegionLattice.cpp:L157](../../Tests/TestTFRegionLattice.cpp#L157) | | +| `visited` | function | Tests | [TestTFRegionLattice.cpp:L216](../../Tests/TestTFRegionLattice.cpp#L216) | | | `VisitNearby` | function | SparkEngine | [SpatialGrid.h:L143](../../SparkEngine/Source/Engine/World/SpatialGrid.h#L143) | | | `VisitSettlement` | function | GameModules | [OWSettlementSystem.h:L102](../../GameModules/SparkGameOpenWorld/Source/Settlement/OWSettlementSystem.h#L102) | Record that the player entered and interacted with a settlement. | | `VisualScriptCompiler::Compile` | method | SparkEngine | [VisualScriptCompiler.cpp:L86](../../SparkEngine/Source/Engine/Scripting/VisualScriptCompiler.cpp#L86) | | @@ -44705,23 +44809,23 @@ | `VisualScriptCompiler::GetNodeDisplayName` | method | SparkEditor | [VisualScriptPanel.cpp:L82](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L82) | | | `VisualScriptCompiler::GetNodeDisplayName` | method | SparkEngine | [VisualScriptNodePalette.cpp:L177](../../SparkEngine/Source/Engine/Scripting/VisualScriptNodePalette.cpp#L177) | | | `VisualScriptCompiler::GetNodePalette` | method | SparkEngine | [VisualScriptNodePalette.cpp:L172](../../SparkEngine/Source/Engine/Scripting/VisualScriptNodePalette.cpp#L172) | | -| `VisualScriptEmitter::CollectPure` | method | SparkEngine | [VisualScriptEmitter.cpp:L345](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L345) | | -| `VisualScriptEmitter::EmitChain` | method | SparkEngine | [VisualScriptEmitter.cpp:L445](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L445) | | -| `VisualScriptEmitter::EmitControlFlow` | method | SparkEngine | [VisualScriptEmitter.cpp:L392](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L392) | | -| `VisualScriptEmitter::EmitEntryChains` | method | SparkEngine | [VisualScriptEmitter.cpp:L100](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L100) | | +| `VisualScriptEmitter::CollectPure` | method | SparkEngine | [VisualScriptEmitter.cpp:L362](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L362) | | +| `VisualScriptEmitter::EmitChain` | method | SparkEngine | [VisualScriptEmitter.cpp:L470](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L470) | | +| `VisualScriptEmitter::EmitControlFlow` | method | SparkEngine | [VisualScriptEmitter.cpp:L409](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L409) | | +| `VisualScriptEmitter::EmitEntryChains` | method | SparkEngine | [VisualScriptEmitter.cpp:L114](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L114) | | | `VisualScriptEmitter::EmitNode` | method | SparkEngine | [VisualScriptEmitNode.cpp:L36](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitNode.cpp#L36) | | -| `VisualScriptEmitter::EmitPinChains` | method | SparkEngine | [VisualScriptEmitter.cpp:L84](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L84) | | -| `VisualScriptEmitter::EmitStep` | method | SparkEngine | [VisualScriptEmitter.cpp:L155](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L155) | | -| `VisualScriptEmitter::ExecOutputPins` | method | SparkEngine | [VisualScriptEmitter.cpp:L58](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L58) | | -| `VisualScriptEmitter::FindConnectionToInput` | method | SparkEngine | [VisualScriptEmitter.cpp:L287](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L287) | | -| `VisualScriptEmitter::FindNode` | method | SparkEngine | [VisualScriptEmitter.cpp:L50](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L50) | | -| `VisualScriptEmitter::Halt` | method | SparkEngine | [VisualScriptEmitter.cpp:L145](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L145) | | -| `VisualScriptEmitter::HasExecTarget` | method | SparkEngine | [VisualScriptEmitter.cpp:L437](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L437) | | -| `VisualScriptEmitter::IsExecConnection` | method | SparkEngine | [VisualScriptEmitter.cpp:L272](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L272) | | -| `VisualScriptEmitter::Lookup` | method | SparkEngine | [VisualScriptEmitter.cpp:L261](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L261) | | -| `VisualScriptEmitter::PureDependencies` | method | SparkEngine | [VisualScriptEmitter.cpp:L336](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L336) | | -| `VisualScriptEmitter::ResolveInput` | method | SparkEngine | [VisualScriptEmitter.cpp:L301](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L301) | | -| `VisualScriptEmitter::StepLimitReached` | method | SparkEngine | [VisualScriptEmitter.cpp:L140](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L140) | | +| `VisualScriptEmitter::EmitPinChains` | method | SparkEngine | [VisualScriptEmitter.cpp:L98](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L98) | | +| `VisualScriptEmitter::EmitStep` | method | SparkEngine | [VisualScriptEmitter.cpp:L169](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L169) | | +| `VisualScriptEmitter::ExecOutputPins` | method | SparkEngine | [VisualScriptEmitter.cpp:L68](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L68) | | +| `VisualScriptEmitter::FindConnectionToInput` | method | SparkEngine | [VisualScriptEmitter.cpp:L300](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L300) | | +| `VisualScriptEmitter::FindNode` | method | SparkEngine | [VisualScriptEmitter.cpp:L60](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L60) | | +| `VisualScriptEmitter::Halt` | method | SparkEngine | [VisualScriptEmitter.cpp:L159](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L159) | | +| `VisualScriptEmitter::HasExecTarget` | method | SparkEngine | [VisualScriptEmitter.cpp:L462](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L462) | | +| `VisualScriptEmitter::IsExecConnection` | method | SparkEngine | [VisualScriptEmitter.cpp:L285](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L285) | | +| `VisualScriptEmitter::Lookup` | method | SparkEngine | [VisualScriptEmitter.cpp:L274](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L274) | | +| `VisualScriptEmitter::PureDependencies` | method | SparkEngine | [VisualScriptEmitter.cpp:L349](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L349) | | +| `VisualScriptEmitter::ResolveInput` | method | SparkEngine | [VisualScriptEmitter.cpp:L314](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L314) | | +| `VisualScriptEmitter::StepLimitReached` | method | SparkEngine | [VisualScriptEmitter.cpp:L154](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L154) | | | `VisualScriptGraphIO::ArePinKindsCompatible` | method | SparkEditor | [VisualScriptPanel.cpp:L1464](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L1464) | | | `VisualScriptGraphIO::ArePinKindsCompatible` | method | SparkEngine | [VisualScriptNodePalette.cpp:L243](../../SparkEngine/Source/Engine/Scripting/VisualScriptNodePalette.cpp#L243) | | | `VisualScriptGraphIO::LoadFile` | method | SparkEngine | [VisualScriptGraphIO.cpp:L523](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphIO.cpp#L523) | | @@ -44733,7 +44837,7 @@ | `VisualScriptGraphIO::SaveFile` | method | SparkEngine | [VisualScriptGraphWriter.cpp:L247](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphWriter.cpp#L247) | | | `VisualScriptGraphIO::ScriptFilePath` | method | SparkEngine | [VisualScriptGraphIO.cpp:L553](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphIO.cpp#L553) | | | `VisualScriptGraphIO::Serialize` | method | SparkEngine | [VisualScriptGraphWriter.cpp:L190](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphWriter.cpp#L190) | | -| `VisualScriptGraphIO::Serialize` | method | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L122](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L122) | | +| `VisualScriptGraphIO::Serialize` | method | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L123](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L123) | | | `VisualScriptPanel::AddConnectionDirect` | method | SparkEditor | [VisualScriptPanel.cpp:L1651](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L1651) | | | `VisualScriptPanel::AddContextMenuNode` | method | SparkEditor | [VisualScriptPanel.cpp:L577](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L577) | | | `VisualScriptPanel::AddNodeAtPosition` | method | SparkEditor | [VisualScriptPanel.cpp:L596](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L596) | | @@ -45071,10 +45175,10 @@ | `WasButtonPressed` | function | Tests | [TestGamepadInputProcessing.cpp:L181](../../Tests/TestGamepadInputProcessing.cpp#L181) | | | `WasButtonReleased` | function | SparkEngine | [GamepadInput.h:L229](../../SparkEngine/Source/Input/GamepadInput.h#L229) | Check if a button was released this frame (falling edge) | | `WasButtonReleased` | function | Tests | [TestGamepadInputProcessing.cpp:L189](../../Tests/TestGamepadInputProcessing.cpp#L189) | | -| `WasKeyPressed` | function | SparkEngine | [InputManager.h:L186](../../SparkEngine/Source/Input/InputManager.h#L186) | Check if a key was just pressed this frame | -| `WasKeyReleased` | function | SparkEngine | [InputManager.h:L197](../../SparkEngine/Source/Input/InputManager.h#L197) | Check if a key was just released this frame | -| `WasMouseButtonPressed` | function | SparkEngine | [InputManager.h:L217](../../SparkEngine/Source/Input/InputManager.h#L217) | Check if a mouse button was just pressed this frame | -| `WasMouseButtonReleased` | function | SparkEngine | [InputManager.h:L227](../../SparkEngine/Source/Input/InputManager.h#L227) | Check if a mouse button was just released this frame | +| `WasKeyPressed` | function | SparkEngine | [InputManager.h:L193](../../SparkEngine/Source/Input/InputManager.h#L193) | Check if a key was just pressed this frame | +| `WasKeyReleased` | function | SparkEngine | [InputManager.h:L204](../../SparkEngine/Source/Input/InputManager.h#L204) | Check if a key was just released this frame | +| `WasMouseButtonPressed` | function | SparkEngine | [InputManager.h:L224](../../SparkEngine/Source/Input/InputManager.h#L224) | Check if a mouse button was just pressed this frame | +| `WasMouseButtonReleased` | function | SparkEngine | [InputManager.h:L234](../../SparkEngine/Source/Input/InputManager.h#L234) | Check if a mouse button was just released this frame | | `Watch` | function | SparkEngine | [FileWatcher.h:L134](../../SparkEngine/Source/Utils/FileWatcher/FileWatcher.h#L134) | Watch a directory for changes | | `WatchAllLoadedModules` | function | SparkEngine | [ModuleHotReload.h:L77](../../SparkEngine/Source/Core/ModuleHotReload.h#L77) | Auto-detect all loaded modules from ModuleManager and watch their DLLs | | `WatchAndReport` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1925](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1925) | | @@ -45124,7 +45228,7 @@ | `WaypointGenerator::Initialize` | method | SparkEngine | [MovementSystem.cpp:L317](../../SparkEngine/Source/Engine/AI/MovementSystem.cpp#L317) | | | `WaypointGenerator::Reset` | method | SparkEngine | [MovementSystem.cpp:L326](../../SparkEngine/Source/Engine/AI/MovementSystem.cpp#L326) | | | `WaypointGenerator::Update` | method | SparkEngine | [MovementSystem.cpp:L319](../../SparkEngine/Source/Engine/AI/MovementSystem.cpp#L319) | | -| `wCodeName` | function | SparkEngine | [CrashHandler.cpp:L1126](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1126) | | +| `wCodeName` | function | SparkEngine | [CrashHandler.cpp:L1127](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1127) | | | `wcscpy_s` | function | SparkEngine | [PlatformTypes.h:L234](../../SparkEngine/Source/Core/PlatformTypes.h#L234) | | | `WeaponEditorPanel::Initialize` | method | SparkEditor | [WeaponEditorPanel.cpp:L22](../../SparkEditor/Source/Panels/WeaponEditorPanel.cpp#L22) | | | `WeaponEditorPanel::Render` | method | SparkEditor | [WeaponEditorPanel.cpp:L55](../../SparkEditor/Source/Panels/WeaponEditorPanel.cpp#L55) | | @@ -45256,7 +45360,7 @@ | `WideToNarrow` | function | SparkEngine | [ShaderConsoleOps.cpp:L266](../../SparkEngine/Source/Graphics/ShaderConsoleOps.cpp#L266) | | | `WideToNarrow` | function | SparkEngine | [ShaderHotReload.cpp:L229](../../SparkEngine/Source/Graphics/ShaderHotReload.cpp#L229) | | | `WideToNarrow` | function | SparkEngine | [SceneManager.cpp:L48](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L48) | | -| `WideToUtf8` | function | SparkEngine | [CrashHandler.cpp:L110](../../SparkEngine/Source/Utils/CrashHandler.cpp#L110) | | +| `WideToUtf8` | function | SparkEngine | [CrashHandler.cpp:L111](../../SparkEngine/Source/Utils/CrashHandler.cpp#L111) | | | `WideToUtf8` | function | SparkEngine | [CrashRedactionContext.h:L36](../../SparkEngine/Source/Utils/CrashRedactionContext.h#L36) | Convert wide text to UTF-8 with an exactly sized Windows destination. | | `WideToUtf8` | function | SparkEngine | [CrashRedactionContext.h:L93](../../SparkEngine/Source/Utils/CrashRedactionContext.h#L93) | | | `WideToUtf8` | function | SparkEngine | [CrashRedactionContext.h:L102](../../SparkEngine/Source/Utils/CrashRedactionContext.h#L102) | | @@ -45276,7 +45380,7 @@ | `windowsDirectory` | function | Tests | [CrashArtifactSandboxProbe.cpp:L302](../../Tests/Fixtures/CrashArtifactSandboxProbe.cpp#L302) | | | `WindowsError` | function | SparkEngine | [SecureRandom.cpp:L102](../../SparkEngine/Source/Utils/SecureRandom.cpp#L102) | | | `WinMain` | function | SparkEditor | [main.cpp:L672](../../SparkEditor/Source/main.cpp#L672) | | -| `WinMain` | function | SparkLauncher | [main.cpp:L53](../../SparkLauncher/src/main.cpp#L53) | | +| `WinMain` | function | SparkLauncher | [main.cpp:L55](../../SparkLauncher/src/main.cpp#L55) | | | `Wipe` | function | SparkEngine | [SecureHandshake.h:L195](../../SparkEngine/Source/Engine/Networking/SecureHandshake.h#L195) | | | `wipeJson` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1134](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1134) | | | `wipeLegacyValue` | function | SparkCrashReporter | [CrashReporterApp.cpp:L653](../../SparkCrashReporter/src/CrashReporterApp.cpp#L653) | | @@ -45295,7 +45399,7 @@ | `WireBytes` | function | Tests | [TestTFOnboarding.cpp:L1314](../../Tests/TestTFOnboarding.cpp#L1314) | | | `WireBytes` | function | Tests | [TestTFOnboarding.cpp:L1359](../../Tests/TestTFOnboarding.cpp#L1359) | | | `WireBytesEqual` | function | Tests | [TestTFNetProtocolLayout.cpp:L46](../../Tests/TestTFNetProtocolLayout.cpp#L46) | | -| `WireCallbacks` | function | SparkEditor | [EditorUI.h:L520](../../SparkEditor/Source/Core/EditorUI.h#L520) | | +| `WireCallbacks` | function | SparkEditor | [EditorUI.h:L518](../../SparkEditor/Source/Core/EditorUI.h#L518) | | | `WireContains` | function | Tests | [TestTFOnboarding.cpp:L1321](../../Tests/TestTFOnboarding.cpp#L1321) | | | `WireMessage` | function | Tests | [FPSLANLoopbackPeer.cpp:L680](../../Tests/Fixtures/FPSLANLoopbackPeer.cpp#L680) | | | `WireRoundTrip` | function | Tests | [TestTFNetProtocolLayout.cpp:L34](../../Tests/TestTFNetProtocolLayout.cpp#L34) | | @@ -45308,6 +45412,7 @@ | `withLogger` | function | Tests | [TestPrototypeModuleKitReal.cpp:L250](../../Tests/TestPrototypeModuleKitReal.cpp#L250) | | | `WithOpacity` | function | SparkEngine | [StartupSplash.cpp:L219](../../SparkEngine/Source/Core/StartupSplash.cpp#L219) | | | `WithServer` | function | Tests | [TestNetworkStress.cpp:L156](../../Tests/TestNetworkStress.cpp#L156) | | +| `WithSpawns` | function | Tests | [TestSceneManagerReflectedReal.cpp:L56](../../Tests/TestSceneManagerReflectedReal.cpp#L56) | | | `WithSuffix` | function | Tests | [TestDATA120BackupRestore.cpp:L86](../../Tests/TestDATA120BackupRestore.cpp#L86) | | | `WithSuffix` | function | Tests | [TestDocumentInterruptionReal.cpp:L120](../../Tests/TestDocumentInterruptionReal.cpp#L120) | | | `WithSuffix` | function | Tests | [TestEditorStateCompatibility.cpp:L66](../../Tests/TestEditorStateCompatibility.cpp#L66) | | @@ -45316,15 +45421,15 @@ | `WithSuffix` | function | Tests | [TestSEC2PersistenceHardening.cpp:L93](../../Tests/TestSEC2PersistenceHardening.cpp#L93) | | | `WizardGui::Run` | method | SparkInstaller | [WizardGui.cpp:L84](../../SparkInstaller/src/gui/WizardGui.cpp#L84) | | | `WizardTui::Run` | method | SparkInstaller | [WizardTui.cpp:L119](../../SparkInstaller/src/tui/WizardTui.cpp#L119) | | -| `wMessage` | function | SparkConsole | [ConsoleApp.cpp:L427](../../SparkConsole/src/ConsoleApp.cpp#L427) | | -| `wmsg` | function | SparkEngine | [CrashHandler.cpp:L1100](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1100) | | +| `wMessage` | function | SparkConsole | [ConsoleApp.cpp:L431](../../SparkConsole/src/ConsoleApp.cpp#L431) | | +| `wmsg` | function | SparkEngine | [CrashHandler.cpp:L1101](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1101) | | | `wname` | function | SparkEngine | [D3D12Device.cpp:L819](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.cpp#L819) | | | `WndProc` | function | SparkEngine | [SparkEngineWindowsInternal.h:L104](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L104) | Run the engine in headless/dedicated server mode (Windows). | -| `WndProc` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L414](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L414) | | +| `WndProc` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L437](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L437) | | | `WndProc` | function | SparkInstaller | [BackendWindows.cpp:L49](../../SparkInstaller/src/gui/BackendWindows.cpp#L49) | | | `WndProc` | function | SparkLauncher | [LauncherBackendWindows.cpp:L56](../../SparkLauncher/src/LauncherBackendWindows.cpp#L56) | | | `Word` | function | SparkEditor | [PrefabTextFormat.cpp:L121](../../SparkEditor/Source/Prefabs/PrefabTextFormat.cpp#L121) | | -| `worker` | function | Tests | [TestFPSWeatherPort.cpp:L90](../../Tests/TestFPSWeatherPort.cpp#L90) | | +| `worker` | function | Tests | [TestFPSWeatherPort.cpp:L136](../../Tests/TestFPSWeatherPort.cpp#L136) | | | `Worker` | function | Tests | [TestJobSystem.cpp:L60](../../Tests/TestJobSystem.cpp#L60) | | | `worker` | function | Tests | [TestSequencerAudioWiring.cpp:L108](../../Tests/TestSequencerAudioWiring.cpp#L108) | | | `worker` | function | Tests | [TestWorldBasicRender.cpp:L721](../../Tests/TestWorldBasicRender.cpp#L721) | | @@ -45347,6 +45452,14 @@ | `WorkflowRegistry::Register` | method | SparkEditor | [EditorWorkflow.cpp:L88](../../SparkEditor/Source/Workflow/EditorWorkflow.cpp#L88) | | | `WorkingDirectory` | function | SparkEngine | [Process.h:L70](../../SparkEngine/Source/Utils/Process.h#L70) | | | `workingDirectory` | function | Tests | [TestConsoleProcessPipeReal.cpp:L73](../../Tests/TestConsoleProcessPipeReal.cpp#L73) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L636](../../Tests/TestEditorSubsystemsReal.cpp#L636) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L650](../../Tests/TestEditorSubsystemsReal.cpp#L650) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L663](../../Tests/TestEditorSubsystemsReal.cpp#L663) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L676](../../Tests/TestEditorSubsystemsReal.cpp#L676) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L691](../../Tests/TestEditorSubsystemsReal.cpp#L691) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L738](../../Tests/TestEditorSubsystemsReal.cpp#L738) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L751](../../Tests/TestEditorSubsystemsReal.cpp#L751) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L809](../../Tests/TestEditorSubsystemsReal.cpp#L809) | | | `workingDirectory` | function | Tests | [TestSparkGameShowcase.cpp:L575](../../Tests/TestSparkGameShowcase.cpp#L575) | | | `workingDirectory` | function | Tests | [TestSparkGameShowcase.cpp:L642](../../Tests/TestSparkGameShowcase.cpp#L642) | | | `WorkingDirectoryGuard` | function | Tests | [TestConsoleProcessPipeReal.cpp:L39](../../Tests/TestConsoleProcessPipeReal.cpp#L39) | | @@ -45354,7 +45467,7 @@ | `WorkingTreeClean` | function | SparkInstaller | [GitRunner.h:L26](../../SparkInstaller/src/GitRunner.h#L26) | | | `WorkSema` | function | SparkEngine | [WorkSema.h:L37](../../SparkEngine/Source/Utils/WorkSema.h#L37) | | | `World` | function | SparkEngine | [Components.h:L78](../../SparkEngine/Source/Engine/ECS/Components.h#L78) | | -| `world` | function | SparkEngine | [SceneManagerReflected.cpp:L38](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L38) | | +| `world` | function | SparkEngine | [SceneManagerReflected.cpp:L56](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L56) | | | `WorldConfig` | function | SparkEngine | [EngineSettings.h:L1000](../../SparkEngine/Source/Core/EngineSettings.h#L1000) | | | `WorldConfig` | function | SparkEngine | [EngineSettings.h:L1001](../../SparkEngine/Source/Core/EngineSettings.h#L1001) | | | `WorldContainsNamedEntity` | function | Tests | [Test_persistence_SaveSystem.cpp:L423](../../Tests/harden/Test_persistence_SaveSystem.cpp#L423) | | @@ -45466,7 +45579,7 @@ | `WrapPi` | function | GameModules | [TFViewModelRender.cpp:L50](../../GameModules/SparkGameMMOFPS/Source/Game/TFViewModelRender.cpp#L50) | | | `WrapPi` | function | GameModules | [TFRepProtocol.h:L77](../../GameModules/SparkGameMMOFPS/Source/Net/TFRepProtocol.h#L77) | | | `WrapRadians` | function | GameModules | [FPSArenaAutopilot.cpp:L30](../../GameModules/SparkGameFPS/Source/Game/FPSArenaAutopilot.cpp#L30) | | -| `wResult` | function | SparkConsole | [ConsoleApp.cpp:L789](../../SparkConsole/src/ConsoleApp.cpp#L789) | | +| `wResult` | function | SparkConsole | [ConsoleApp.cpp:L793](../../SparkConsole/src/ConsoleApp.cpp#L793) | | | `wResult` | function | SparkEngine | [ConsoleProcessManagerIO.cpp:L293](../../SparkEngine/Source/Utils/ConsoleProcessManagerIO.cpp#L293) | | | `Write` | function | SparkDaemon | [BoundedWireCodec.h:L30](../../SparkDaemon/src/BoundedWireCodec.h#L30) | | | `Write` | function | SparkEditor | [SceneComponentCodec.h:L35](../../SparkEditor/Source/SceneSystem/SceneComponentCodec.h#L35) | | @@ -45496,9 +45609,9 @@ | `Write` | function | Tests | [TestENG200ScriptHotReloadReal.cpp:L78](../../Tests/TestENG200ScriptHotReloadReal.cpp#L78) | | | `Write` | function | Tests | [TestPrototypeModuleKitReal.cpp:L61](../../Tests/TestPrototypeModuleKitReal.cpp#L61) | | | `Write` | function | Tests | [TestRHI210TextureDecode.cpp:L46](../../Tests/TestRHI210TextureDecode.cpp#L46) | | -| `Write` | function | Tests | [TestSceneManagerReflectedReal.cpp:L49](../../Tests/TestSceneManagerReflectedReal.cpp#L49) | | +| `Write` | function | Tests | [TestSceneManagerReflectedReal.cpp:L54](../../Tests/TestSceneManagerReflectedReal.cpp#L54) | | | `write` | function | Tests | [TestSparkError.cpp:L77](../../Tests/TestSparkError.cpp#L77) | | -| `Write` | function | Tests | [TestSparkPak.cpp:L70](../../Tests/TestSparkPak.cpp#L70) | | +| `Write` | function | Tests | [TestSparkPak.cpp:L76](../../Tests/TestSparkPak.cpp#L76) | | | `Write` | function | Tests | [TestVisualScriptCompiler.cpp:L718](../../Tests/TestVisualScriptCompiler.cpp#L718) | | | `WriteActivationMarker` | function | SparkInstaller | [GitBootstrap.cpp:L123](../../SparkInstaller/src/GitBootstrap.cpp#L123) | | | `WriteActualRequested` | function | Tests | [RHI210D3D11GoldenSupport.h:L73](../../Tests/RHI210D3D11GoldenSupport.h#L73) | | @@ -45513,7 +45626,7 @@ | `WriteBackResults` | function | SparkEngine | [ParallelPerception.h:L224](../../SparkEngine/Source/Engine/AI/ParallelPerception.h#L224) | Write updated perception data back into ECS components. | | `WriteBackupWithDigest` | function | Tests | [TestDATA120BackupRestore.cpp:L94](../../Tests/TestDATA120BackupRestore.cpp#L94) | | | `WriteBaseline` | function | Tests | [TestGoldenImageTest.cpp:L70](../../Tests/TestGoldenImageTest.cpp#L70) | | -| `WriteBestEffortReport` | function | SparkEngine | [CrashHandler.cpp:L2446](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2446) | | +| `WriteBestEffortReport` | function | SparkEngine | [CrashHandler.cpp:L2484](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2484) | | | `WriteBinary` | function | SparkEngine | [LocalFileCache.h:L186](../../SparkEngine/Source/Utils/LocalFileCache.h#L186) | Write binary data to disk and update the cache | | `WriteBinaryFile` | function | SparkEngine | [FileUtils.h:L272](../../SparkEngine/Source/Utils/FileUtils.h#L272) | | | `WriteBinaryFile` | function | Tests | [TestModuleABI.cpp:L229](../../Tests/TestModuleABI.cpp#L229) | | @@ -45523,7 +45636,7 @@ | `WriteBool` | function | SparkEditor | [JSONSceneSerializer.cpp:L345](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L345) | | | `WriteBool` | function | SparkEditor | [SceneComponentCodec.h:L26](../../SparkEditor/Source/SceneSystem/SceneComponentCodec.h#L26) | | | `WriteBool` | function | SparkEngine | [SceneSnapshotSerializer.h:L45](../../SparkEngine/Source/Engine/Editor/SceneSnapshotSerializer.h#L45) | | -| `WriteBoundedSignalArtifacts` | function | SparkEngine | [CrashHandler.cpp:L2335](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2335) | | +| `WriteBoundedSignalArtifacts` | function | SparkEngine | [CrashHandler.cpp:L2373](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2373) | | | `WriteBytes` | function | SparkDaemon | [BoundedWireCodec.h:L49](../../SparkDaemon/src/BoundedWireCodec.h#L49) | | | `WriteBytes` | function | SparkEditor | [RegionMapDataSource.cpp:L57](../../SparkEditor/Source/Panels/RegionMapDataSource.cpp#L57) | | | `WriteBytes` | function | SparkEngine | [SceneSnapshotSerializer.h:L53](../../SparkEngine/Source/Engine/Editor/SceneSnapshotSerializer.h#L53) | | @@ -45547,7 +45660,7 @@ | `WriteCommandOutput` | function | SparkEngine | [SparkEngineWindows.cpp:L57](../../SparkEngine/Source/Core/SparkEngineWindows.cpp#L57) | | | `WriteConfigFixture` | function | Tests | [TestSparkBuildConfig.cpp:L21](../../Tests/TestSparkBuildConfig.cpp#L21) | | | `WriteConnectCfg` | function | SparkEditor | [PlayControlPanel.h:L94](../../SparkEditor/Source/Panels/PlayControlPanel.h#L94) | | -| `WriteCrashManifest` | function | SparkEngine | [CrashHandler.cpp:L733](../../SparkEngine/Source/Utils/CrashHandler.cpp#L733) | | +| `WriteCrashManifest` | function | SparkEngine | [CrashHandler.cpp:L734](../../SparkEngine/Source/Utils/CrashHandler.cpp#L734) | | | `WriteCreatePacket` | function | SparkEngine | [EntityReplicator.h:L126](../../SparkEngine/Source/Engine/Networking/EntityReplicator.h#L126) | Write full state for an entity (used when it first enters an observer's view). | | `WriteCSVHeader` | function | SparkEngine | [FileLogger.h:L307](../../SparkEngine/Source/Utils/FileLogger.h#L307) | | | `WriteCSVLine` | function | SparkEngine | [FileLogger.h:L357](../../SparkEngine/Source/Utils/FileLogger.h#L357) | | @@ -45556,18 +45669,19 @@ | `WriteDisplay` | function | SparkConsole | [ConsoleApp.h:L65](../../SparkConsole/src/ConsoleApp.h#L65) | Write human-facing text to DisplayHandle(). | | `WriteDurableReplace` | function | GameModules | [TFSavePaths.h:L373](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFSavePaths.h#L373) | | | `WriteDurableText` | function | SparkEngine | [ReflectedScenePersistence.cpp:L179](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L179) | | -| `WriteDurableText` | function | SparkEngine | [SceneManager.cpp:L174](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L174) | | +| `WriteDurableText` | function | SparkEngine | [SceneManager.cpp:L184](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L184) | | | `WriteEditMessage` | function | SparkEditor | [CollaborativeWireCodec.cpp:L117](../../SparkEditor/Source/Communication/CollaborativeWireCodec.cpp#L117) | | | `WriteEditorPeer` | function | SparkEditor | [CollaborativeWireCodec.cpp:L147](../../SparkEditor/Source/Communication/CollaborativeWireCodec.cpp#L147) | | | `WriteEmergencySignalRecord` | function | SparkEditor | [EditorCrashHandler.cpp:L103](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L103) | | | `WriteEventResponseRules` | function | SparkEngine | [EventResponseRules.cpp:L360](../../SparkEngine/Source/Engine/Gameplay/EventResponseRules.cpp#L360) | | | `WriteEventResponseRules` | function | SparkEngine | [EventResponseSystem.h:L184](../../SparkEngine/Source/Engine/Gameplay/EventResponseSystem.h#L184) | | -| `WriteExclusiveFileUtf8` | function | SparkEngine | [CrashHandler.cpp:L439](../../SparkEngine/Source/Utils/CrashHandler.cpp#L439) | | +| `WriteExclusiveFileUtf8` | function | SparkEngine | [CrashHandler.cpp:L440](../../SparkEngine/Source/Utils/CrashHandler.cpp#L440) | | | `WriteF32` | function | SparkEditor | [TerrainEditor.cpp:L46](../../SparkEditor/Source/Terrain/TerrainEditor.cpp#L46) | | +| `WriteFatalStderr` | function | SparkEngine | [CrashHandler.cpp:L2112](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2112) | | | `WriteFile` | function | SparkEngine | [BenchmarkFramework.h:L119](../../SparkEngine/Source/Utils/BenchmarkFramework.h#L119) | | | `WriteFile` | function | Tests | [TestASSET220GamePackagerReal.cpp:L15](../../Tests/TestASSET220GamePackagerReal.cpp#L15) | | -| `WriteFile` | function | Tests | [TestAssetParserHardening.cpp:L47](../../Tests/TestAssetParserHardening.cpp#L47) | | -| `WriteFile` | function | Tests | [TestAssetParserHardening.cpp:L57](../../Tests/TestAssetParserHardening.cpp#L57) | | +| `WriteFile` | function | Tests | [TestAssetParserHardening.cpp:L63](../../Tests/TestAssetParserHardening.cpp#L63) | | +| `WriteFile` | function | Tests | [TestAssetParserHardening.cpp:L73](../../Tests/TestAssetParserHardening.cpp#L73) | | | `WriteFile` | function | Tests | [TestDATA120BackupRestore.cpp:L80](../../Tests/TestDATA120BackupRestore.cpp#L80) | | | `WriteFile` | function | Tests | [TestDATA120PersistenceReal.cpp:L58](../../Tests/TestDATA120PersistenceReal.cpp#L58) | | | `WriteFile` | function | Tests | [TestFileWatcher.cpp:L24](../../Tests/TestFileWatcher.cpp#L24) | | @@ -45632,8 +45746,8 @@ | `WriteManifest` | function | Tests | [TestModuleLifecycleReal.cpp:L202](../../Tests/TestModuleLifecycleReal.cpp#L202) | | | `WriteMarkerText` | function | SparkInstaller | [InstallStateTests.cpp:L184](../../SparkInstaller/tests/InstallStateTests.cpp#L184) | | | `WriteMetadata` | function | Tests | [TestPluginABI.cpp:L373](../../Tests/TestPluginABI.cpp#L373) | | -| `WriteMiniDump` | function | SparkEngine | [CrashHandler.cpp:L821](../../SparkEngine/Source/Utils/CrashHandler.cpp#L821) | | -| `WriteMiniDump` | function | SparkEngine | [CrashHandler.cpp:L1265](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1265) | | +| `WriteMiniDump` | function | SparkEngine | [CrashHandler.cpp:L822](../../SparkEngine/Source/Utils/CrashHandler.cpp#L822) | | +| `WriteMiniDump` | function | SparkEngine | [CrashHandler.cpp:L1266](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1266) | | | `WriteMod` | function | Tests | [Test_persistence_ModSystem.cpp:L28](../../Tests/harden/Test_persistence_ModSystem.cpp#L28) | | | `WriteMOD360File` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L169](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L169) | | | `WriteMOD360SlotState` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L254](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L254) | | @@ -45666,7 +45780,7 @@ | `WritePNG` | function | SparkEngine | [ScreenCapture.h:L263](../../SparkEngine/Source/Graphics/ScreenCapture.h#L263) | Write RGBA pixel data to a PNG file | | `WriteProcessStatus` | function | SparkDaemon | [OrchestrationProtocol.h:L190](../../SparkDaemon/src/OrchestrationProtocol.h#L190) | | | `WriteProject` | function | Tests | [TestEditorSubsystems.cpp:L2455](../../Tests/TestEditorSubsystems.cpp#L2455) | | -| `WriteProjectDocument` | function | SparkEditor | [ProjectDocument.cpp:L481](../../SparkEditor/Source/Core/ProjectDocument.cpp#L481) | | +| `WriteProjectDocument` | function | SparkEditor | [ProjectDocument.cpp:L482](../../SparkEditor/Source/Core/ProjectDocument.cpp#L482) | | | `WriteProjectDocument` | function | SparkEditor | [ProjectDocument.h:L83](../../SparkEditor/Source/Core/ProjectDocument.h#L83) | Render @p fields as the project document SaveProjectFile writes. | | `WriteProjectSeed` | function | Tests | [TestDocumentInterruptionReal.cpp:L376](../../Tests/TestDocumentInterruptionReal.cpp#L376) | | | `WriteQuat48` | function | SparkEngine | [NetQuantize.cpp:L12](../../SparkEngine/Source/Engine/Networking/NetQuantize.cpp#L12) | | @@ -45690,8 +45804,8 @@ | `WriteRawSlot` | function | Tests | [TestMOD340PlatformerProgressReal.cpp:L175](../../Tests/TestMOD340PlatformerProgressReal.cpp#L175) | | | `WriteRawSlot` | function | Tests | [TestMOD370RTSSaveReal.cpp:L256](../../Tests/TestMOD370RTSSaveReal.cpp#L256) | | | `WriteRawSlot` | function | Tests | [TestMOD380RacingCompleteRaceReal.cpp:L521](../../Tests/TestMOD380RacingCompleteRaceReal.cpp#L521) | | -| `WriteRawTocArchive` | function | Tests | [TestSparkPak.cpp:L825](../../Tests/TestSparkPak.cpp#L825) | | -| `WriteRecentProjectsDocument` | function | SparkEditor | [ProjectDocument.cpp:L555](../../SparkEditor/Source/Core/ProjectDocument.cpp#L555) | | +| `WriteRawTocArchive` | function | Tests | [TestSparkPak.cpp:L841](../../Tests/TestSparkPak.cpp#L841) | | +| `WriteRecentProjectsDocument` | function | SparkEditor | [ProjectDocument.cpp:L556](../../SparkEditor/Source/Core/ProjectDocument.cpp#L556) | | | `WriteRecentProjectsDocument` | function | SparkEditor | [ProjectDocument.h:L95](../../SparkEditor/Source/Core/ProjectDocument.h#L95) | Render the first kMaxRecentProjects entries as RecentProjects.json. | | `WriteRecentProjectsDocument` | function | SparkEditor | [ProjectManager.cpp:L2312](../../SparkEditor/Source/Core/ProjectManager.cpp#L2312) | | | `WriteReferenceImage` | function | Tests | [RHI210D3D11GoldenSupport.h:L871](../../Tests/RHI210D3D11GoldenSupport.h#L871) | | @@ -45702,13 +45816,14 @@ | `WriteSave230Bytes` | function | Tests | [TestSAVE230NewerFormatSlotReal.cpp:L57](../../Tests/TestSAVE230NewerFormatSlotReal.cpp#L57) | | | `WriteSaveFile` | function | Templates | [GameModule.h:L284](../../Templates/RPGStarter/Source/GameModule.h#L284) | | | `WriteSaveHeader` | function | Tests | [Test_persistence_SaveSystem.cpp:L85](../../Tests/harden/Test_persistence_SaveSystem.cpp#L85) | | +| `WriteScene` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L75](../../Tests/TestFPSGameCameraReloadReal.cpp#L75) | | | `WriteScene` | function | Tests | [TestMOD310FPSSceneReloadRespawnReal.cpp:L56](../../Tests/TestMOD310FPSSceneReloadRespawnReal.cpp#L56) | | | `WriteScratch` | function | Tests | [TestSparkTerrainFormatReal.cpp:L85](../../Tests/TestSparkTerrainFormatReal.cpp#L85) | | | `WriteSeatComp` | function | GameModules | [TFVehicleSystem.h:L198](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L198) | | | `WriteShader` | function | Tests | [TestShaderHotReloadPhaseU.cpp:L45](../../Tests/TestShaderHotReloadPhaseU.cpp#L45) | | | `WriteSidecar` | function | Tests | [TestModuleABIDiagnostics.cpp:L95](../../Tests/TestModuleABIDiagnostics.cpp#L95) | | | `WriteSidecar` | function | Tests | [TestModuleVersion.cpp:L108](../../Tests/TestModuleVersion.cpp#L108) | | -| `WriteSignalSafeReport` | function | SparkEngine | [CrashHandler.cpp:L2244](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2244) | | +| `WriteSignalSafeReport` | function | SparkEngine | [CrashHandler.cpp:L2282](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2282) | | | `WriteSigned` | function | SparkEditor | [JSONSceneSerializer.cpp:L302](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L302) | | | `WriteSigned` | function | SparkEditor | [JSONSceneSerializer.cpp:L346](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L346) | | | `WriteSigned` | function | SparkEditor | [SceneComponentCodec.h:L27](../../SparkEditor/Source/SceneSystem/SceneComponentCodec.h#L27) | | @@ -45718,7 +45833,7 @@ | `WriteSmokeResult` | function | SparkEditor | [main.cpp:L98](../../SparkEditor/Source/main.cpp#L98) | | | `WriteSnav` | function | Tests | [Test_ai-anim_navmesh.cpp:L37](../../Tests/harden/Test_ai-anim_navmesh.cpp#L37) | | | `WriteStagingFile` | function | SparkEngine | [SaveFileDurability.cpp:L335](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L335) | | -| `WriteStderr` | function | SparkEngine | [CrashHandler.cpp:L1787](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1787) | | +| `WriteStderr` | function | SparkEngine | [CrashHandler.cpp:L1788](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1788) | | | `WriteStdin` | function | SparkEngine | [Process.h:L142](../../SparkEngine/Source/Utils/Process.h#L142) | | | `WriteStdinFor` | function | SparkEngine | [Process.h:L156](../../SparkEngine/Source/Utils/Process.h#L156) | | | `WriteStoredZip` | function | SparkBuild | [DownloaderTests.cpp:L308](../../SparkBuild/tests/DownloaderTests.cpp#L308) | | @@ -45740,7 +45855,7 @@ | `WriteString` | function | Tests | [TestNetBuffer.cpp:L47](../../Tests/TestNetBuffer.cpp#L47) | | | `WriteString` | function | Tests | [TestReplicationFields.cpp:L64](../../Tests/TestReplicationFields.cpp#L64) | | | `WriteString` | function | Tests | [TestServerMockClient.cpp:L96](../../Tests/TestServerMockClient.cpp#L96) | | -| `WriteStringArray` | function | SparkEditor | [ProjectDocument.cpp:L332](../../SparkEditor/Source/Core/ProjectDocument.cpp#L332) | | +| `WriteStringArray` | function | SparkEditor | [ProjectDocument.cpp:L333](../../SparkEditor/Source/Core/ProjectDocument.cpp#L333) | | | `WriteTempFile` | function | Tests | [Test_ai-anim_animation.cpp:L65](../../Tests/harden/Test_ai-anim_animation.cpp#L65) | | | `WriteTempVertexShader` | function | Tests | [TestD3D11DeviceContractsReal.cpp:L134](../../Tests/TestD3D11DeviceContractsReal.cpp#L134) | | | `WriteText` | function | SparkCrashReporter | [CrashReporterManifestTests.cpp:L125](../../SparkCrashReporter/tests/CrashReporterManifestTests.cpp#L125) | | @@ -46076,7 +46191,7 @@ | `ZeroImpairmentSettings` | function | Tests | [TestNetImpairmentWiring.cpp:L28](../../Tests/TestNetImpairmentWiring.cpp#L28) | | | `ZeroMotion` | function | Tests | [TestSSAOTemporalFilter.cpp:L30](../../Tests/TestSSAOTemporalFilter.cpp#L30) | | | `zeros` | function | Tests | [TestNetworkStress.cpp:L667](../../Tests/TestNetworkStress.cpp#L667) | | -| `zeros` | function | Tests | [TestSparkPak.cpp:L638](../../Tests/TestSparkPak.cpp#L638) | | +| `zeros` | function | Tests | [TestSparkPak.cpp:L654](../../Tests/TestSparkPak.cpp#L654) | | | `ZoneDamageMult` | function | GameModules | [TFBallistics.cpp:L44](../../GameModules/SparkGameMMOFPS/Source/Game/TFBallistics.cpp#L44) | | | `ZoneDamageMult` | function | GameModules | [TFBallistics.h:L50](../../GameModules/SparkGameMMOFPS/Source/Game/TFBallistics.h#L50) | | | `ZoomCamera` | function | Templates | [GameModule.h:L164](../../Templates/TopDownStarter/Source/GameModule.h#L164) | | diff --git a/wiki/reference/Macro-Index.md b/wiki/reference/Macro-Index.md index 0b4bec513..ee52501b7 100644 --- a/wiki/reference/Macro-Index.md +++ b/wiki/reference/Macro-Index.md @@ -85,7 +85,7 @@ | `ALuint` | alias | SparkEngine | [OpenALAudioEngine.cpp:L31](../../SparkEngine/Source/Audio/OpenALAudioEngine.cpp#L31) | | | `AnimationHandle` | alias | SparkEngine | [OpaqueHandle.h:L109](../../SparkEngine/Source/Utils/OpaqueHandle.h#L109) | Handle to an AnimationInstance managed by the AnimationUpdateSystem. | | `AnimationSystem` | alias | SparkEngine | [AnimationSystem.h:L564](../../SparkEngine/Source/Engine/Animation/AnimationSystem.h#L564) | Type alias so EngineContext/EngineSetup can reference "AnimationSystem" | -| `AnimationSystem` | alias | SparkSDK | [IEngineContext.h:L41](../../SparkSDK/Include/Spark/IEngineContext.h#L41) | | +| `AnimationSystem` | alias | SparkSDK | [IEngineContext.h:L42](../../SparkSDK/Include/Spark/IEngineContext.h#L42) | | | `AnimS` | alias | SparkEngine | [EngineSettings.cpp:L361](../../SparkEngine/Source/Core/EngineSettings.cpp#L361) | | | `APIENTRY` | macro | SparkEngine | [PlatformTypes.h:L201](../../SparkEngine/Source/Core/PlatformTypes.h#L201) | | | `ARCH_SET_GS` | macro | tools | [gvisor-wine-shim.c:L134](../../tools/gvisor-wine-shim.c#L134) | | @@ -700,7 +700,7 @@ | `LoadCompletionCallback` | alias | SparkEngine | [DirectStorageLoader.h:L69](../../SparkEngine/Source/Engine/Streaming/DirectStorageLoader.h#L69) | Callback invoked when a load completes | | `LocalShotHook` | alias | GameModules | [TFWeaponSystem.h:L104](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L104) | | | `LockChangedCallback` | alias | SparkEditor | [CollaborativeEditSession.h:L198](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L198) | | -| `LockLoaderLock` | alias | Tests | [TestEditorCrashHandlerFilterReal.cpp:L505](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L505) | | +| `LockLoaderLock` | alias | Tests | [TestEditorCrashHandlerFilterReal.cpp:L507](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L507) | | | `LocS` | alias | SparkEngine | [EngineSettings.cpp:L531](../../SparkEngine/Source/Core/EngineSettings.cpp#L531) | | | `LOG_ERROR` | macro | SparkEngine | [D3D12Device.cpp:L43](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.cpp#L43) | | | `LOG_INFO` | macro | SparkEngine | [D3D12Device.cpp:L45](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.cpp#L45) | | @@ -756,7 +756,7 @@ | `NavQueryHandle` | alias | SparkEngine | [OpaqueHandle.h:L115](../../SparkEngine/Source/Utils/OpaqueHandle.h#L115) | Handle to a NavMeshQuery managed by the AISystem. | | `NDEBUG` | macro | Tests | [RemoteDebugSecurityBoundaryProbe.cpp:L16](../../Tests/Tools/RemoteDebugSecurityBoundaryProbe.cpp#L16) | | | `NetworkEntityID` | alias | SparkEngine | [EntityReplicator.h:L30](../../SparkEngine/Source/Engine/Networking/EntityReplicator.h#L30) | | -| `NetworkManager` | alias | SparkSDK | [IEngineContext.h:L86](../../SparkSDK/Include/Spark/IEngineContext.h#L86) | | +| `NetworkManager` | alias | SparkSDK | [IEngineContext.h:L87](../../SparkSDK/Include/Spark/IEngineContext.h#L87) | | | `NetworkTime` | alias | SparkEngine | [NetworkManager.h:L93](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L93) | | | `NOMINMAX` | macro | GameModules | [TFSavePaths.h:L29](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFSavePaths.h#L29) | | | `NOMINMAX` | macro | SparkAssetPipelineCore | [AssetCooker.cpp:L22](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L22) | | @@ -803,8 +803,8 @@ | `NotifyCallback` | alias | SparkEngine | [AnimNotify.h:L142](../../SparkEngine/Source/Engine/Animation/AnimNotify.h#L142) | Manages animation notifies across all clips | | `NotifyReboundFn` | alias | SparkEngine | [Reflection.h:L300](../../SparkEngine/Source/Core/Reflection.h#L300) | | | `NS` | alias | SparkEngine | [EngineSettings.cpp:L214](../../SparkEngine/Source/Core/EngineSettings.cpp#L214) | | -| `NtCreateFileFn` | alias | SparkEngine | [CrashHandler.cpp:L232](../../SparkEngine/Source/Utils/CrashHandler.cpp#L232) | | -| `NtSetInformationFileFn` | alias | SparkEngine | [CrashHandler.cpp:L648](../../SparkEngine/Source/Utils/CrashHandler.cpp#L648) | | +| `NtCreateFileFn` | alias | SparkEngine | [CrashHandler.cpp:L233](../../SparkEngine/Source/Utils/CrashHandler.cpp#L233) | | +| `NtSetInformationFileFn` | alias | SparkEngine | [CrashHandler.cpp:L649](../../SparkEngine/Source/Utils/CrashHandler.cpp#L649) | | | `ObjectID` | alias | SparkEditor | [SceneFileTypes.h:L38](../../SparkEditor/Source/SceneSystem/SceneFileTypes.h#L38) | Unique identifier for scene objects | | `ObjectKeys` | alias | GameModules | [TFSocialSystemStore.cpp:L43](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystemStore.cpp#L43) | | | `ObjectType` | alias | SparkEngine | [JsonUtils.h:L103](../../SparkEngine/Source/Utils/JsonUtils.h#L103) | A JSON value that can be null, bool, number, string, array, or object. | @@ -895,7 +895,7 @@ | `ProfilingDataCallback` | alias | SparkEditor | [SparkEngineIntegration.h:L171](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L171) | Callback function types | | `ProjectCallback` | alias | SparkEditor | [ProjectManager.h:L193](../../SparkEditor/Source/Core/ProjectManager.h#L193) | | | `ProjectileExpiredCallback` | alias | SparkEngine | [ECSystems.h:L600](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L600) | Callback invoked when a projectile expires or impacts. | -| `Properties` | alias | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L507](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L507) | | +| `Properties` | alias | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L550](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L550) | | | `PropertyValue` | alias | SparkEditor | [EditorCommand.h:L73](../../SparkEditor/Source/UndoRedo/EditorCommand.h#L73) | Property value variant type for generic property changes | | `PropertyValue` | alias | Tests | [TestEditorCommands.cpp:L23](../../Tests/TestEditorCommands.cpp#L23) | | | `PS` | alias | SparkEngine | [EngineSettings.cpp:L66](../../SparkEngine/Source/Core/EngineSettings.cpp#L66) | | @@ -935,7 +935,7 @@ | `RHIShaderHandle` | alias | SparkEngine | [RHITypes.h:L452](../../SparkEngine/Source/Graphics/RHI/RHITypes.h#L452) | | | `RHITextureHandle` | alias | SparkEngine | [RHITypes.h:L451](../../SparkEngine/Source/Graphics/RHI/RHITypes.h#L451) | | | `RS` | alias | SparkEngine | [EngineSettings.cpp:L105](../../SparkEngine/Source/Core/EngineSettings.cpp#L105) | | -| `RtlDllShutdownInProgressFn` | alias | SparkEngine | [CrashHandler.cpp:L849](../../SparkEngine/Source/Utils/CrashHandler.cpp#L849) | | +| `RtlDllShutdownInProgressFn` | alias | SparkEngine | [CrashHandler.cpp:L850](../../SparkEngine/Source/Utils/CrashHandler.cpp#L850) | | | `S_FALSE` | macro | SparkEngine | [PlatformTypes.h:L62](../../SparkEngine/Source/Core/PlatformTypes.h#L62) | | | `S_OK` | macro | SparkEngine | [PlatformTypes.h:L59](../../SparkEngine/Source/Core/PlatformTypes.h#L59) | | | `SamplerHandle` | alias | SparkEngine | [RHIHandlePool.h:L100](../../SparkEngine/Source/Graphics/RHI/RHIHandlePool.h#L100) | | @@ -1090,7 +1090,7 @@ | `SPARK_EDITOR_HAS_DX_PROGRAMMABLE_CAPTURE` | macro | SparkEditor | [PerformanceProfiler.cpp:L21](../../SparkEditor/Source/Profiler/PerformanceProfiler.cpp#L21) | | | `SPARK_EDITOR_HAS_DX_PROGRAMMABLE_CAPTURE` | macro | SparkEditor | [PerformanceProfiler.cpp:L23](../../SparkEditor/Source/Profiler/PerformanceProfiler.cpp#L23) | | | `SPARK_ENABLE_BITMASK_OPERATORS` | macro | SparkEngine | [BitFlags.h:L53](../../SparkEngine/Source/Utils/BitFlags.h#L53) | Enable \|, &, ^, ~ operators for a scoped enum. | -| `SPARK_ENGINE_VERSION_PACKED` | macro | SparkSDK | [Version.h:L43](../../SparkSDK/Include/Spark/Version.h#L43) | | +| `SPARK_ENGINE_VERSION_PACKED` | macro | SparkSDK | [Version.h:L47](../../SparkSDK/Include/Spark/Version.h#L47) | | | `SPARK_ENSURE` | macro | SparkEngine | [Validate.h:L340](../../SparkEngine/Source/Utils/Validate.h#L340) | Postcondition check: logs fatal error and aborts if expr is false | | `SPARK_ENSURE_MSG` | macro | SparkEngine | [Validate.h:L355](../../SparkEngine/Source/Utils/Validate.h#L355) | Postcondition check with a diagnostic message | | `SPARK_ENSURES` | macro | SparkEngine | [Contracts.h:L51](../../SparkEngine/Source/Core/Contracts.h#L51) | | @@ -1307,7 +1307,7 @@ | `SPARK_SCOPED_CONTEXT` | macro | SparkEngine | [SparkError.h:L420](../../SparkEngine/Source/Utils/SparkError.h#L420) | | | `SPARK_SCOPED_TIMER` | macro | SparkEngine | [ScopedTimer.h:L103](../../SparkEngine/Source/Utils/ScopedTimer.h#L103) | Convenience macro: creates a ScopedTimer that prints to stdout. | | `SPARK_SCREENCAP_PNG` | macro | SparkEngine | [ScreenCapture.h:L39](../../SparkEngine/Source/Graphics/ScreenCapture.h#L39) | | -| `SPARK_SDK_VERSION` | macro | SparkSDK | [Version.h:L40](../../SparkSDK/Include/Spark/Version.h#L40) | | +| `SPARK_SDK_VERSION` | macro | SparkSDK | [Version.h:L44](../../SparkSDK/Include/Spark/Version.h#L44) | | | `SPARK_SERVICE_TESTS_NOINLINE` | macro | SparkDaemon | [ServiceTests.cpp:L44](../../SparkDaemon/tests/ServiceTests.cpp#L44) | | | `SPARK_SERVICE_TESTS_NOINLINE` | macro | SparkDaemon | [ServiceTests.cpp:L46](../../SparkDaemon/tests/ServiceTests.cpp#L46) | | | `SPARK_SHARED_EXT` | macro | SparkBuild | [Platform.h:L35](../../SparkBuild/src/Platform.h#L35) | | @@ -1365,7 +1365,7 @@ | `SPARK_TRACK_THREAD_START` | macro | SparkEngine | [ThreadDebugger.h:L490](../../SparkEngine/Source/Utils/ThreadDebugger.h#L490) | Print thread debugger summary | | `SPARK_TRACKED_LOCK` | macro | SparkEngine | [DeadlockDetector.h:L195](../../SparkEngine/Source/Utils/DeadlockDetector.h#L195) | | | `SPARK_TRACKED_LOCK` | macro | SparkEngine | [DeadlockDetector.h:L197](../../SparkEngine/Source/Utils/DeadlockDetector.h#L197) | | -| `SPARK_TYPEID_DEFINED` | macro | SparkEngine | [EngineContext.h:L60](../../SparkEngine/Source/Core/EngineContext.h#L60) | Unique type identifier that does not require complete types | +| `SPARK_TYPEID_DEFINED` | macro | SparkEngine | [EngineContext.h:L61](../../SparkEngine/Source/Core/EngineContext.h#L61) | Unique type identifier that does not require complete types | | `SPARK_UNREACHABLE` | macro | SparkEngine | [Validate.h:L375](../../SparkEngine/Source/Utils/Validate.h#L375) | Marks code paths that should never be reached — aborts in Debug, UB hint in Release | | `SPARK_UNREACHABLE` | macro | SparkEngine | [Validate.h:L377](../../SparkEngine/Source/Utils/Validate.h#L377) | | | `SPARK_VALIDATE` | macro | SparkEngine | [Validate.h:L160](../../SparkEngine/Source/Utils/Validate.h#L160) | Soft validation: logs an error and returns (void) if expr is false | @@ -1452,7 +1452,7 @@ | `Type` | alias | SparkDaemon | [BoundedWireCodec.h:L19](../../SparkDaemon/src/BoundedWireCodec.h#L19) | | | `Type` | alias | SparkDaemon | [BoundedWireCodec.h:L24](../../SparkDaemon/src/BoundedWireCodec.h#L24) | | | `type` | alias | SparkEngine | [TypeTraits.h:L213](../../SparkEngine/Source/Utils/TypeTraits.h#L213) | | -| `TypeId` | alias | SparkEngine | [EngineContext.h:L61](../../SparkEngine/Source/Core/EngineContext.h#L61) | Unique type identifier that does not require complete types | +| `TypeId` | alias | SparkEngine | [EngineContext.h:L62](../../SparkEngine/Source/Core/EngineContext.h#L62) | Unique type identifier that does not require complete types | | `TypeId` | alias | Tests | [TestReflection.cpp:L22](../../Tests/TestReflection.cpp#L22) | | | `UIBoolBinding` | alias | SparkEngine | [UIFactory.h:L93](../../SparkEngine/Source/Engine/UI/UIFactory.h#L93) | | | `UIFloatBinding` | alias | SparkEngine | [UIFactory.h:L91](../../SparkEngine/Source/Engine/UI/UIFactory.h#L91) | | @@ -1463,9 +1463,9 @@ | `ULONG` | alias | SparkEngine | [PlatformTypes.h:L38](../../SparkEngine/Source/Core/PlatformTypes.h#L38) | | | `Underlying` | alias | SparkEngine | [BitFlags.h:L100](../../SparkEngine/Source/Utils/BitFlags.h#L100) | | | `UnderlyingType` | alias | SparkEngine | [EnumUtils.h:L206](../../SparkEngine/Source/Enums/EnumUtils.h#L206) | Type-safe enum flag operations | -| `UniqueHandle` | alias | SparkEngine | [SceneManager.cpp:L235](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L235) | | +| `UniqueHandle` | alias | SparkEngine | [SceneManager.cpp:L255](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L255) | | | `UnloadCallback` | alias | SparkEngine | [ModuleHotReload.h:L84](../../SparkEngine/Source/Engine/HotReload/ModuleHotReload.h#L84) | Callback signature for module lifecycle during hot-reload | -| `UnlockLoaderLock` | alias | Tests | [TestEditorCrashHandlerFilterReal.cpp:L506](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L506) | | +| `UnlockLoaderLock` | alias | Tests | [TestEditorCrashHandlerFilterReal.cpp:L508](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L508) | | | `Unsigned` | alias | SparkDaemon | [BoundedWireCodec.h:L34](../../SparkDaemon/src/BoundedWireCodec.h#L34) | | | `Unsigned` | alias | SparkDaemon | [BoundedWireCodec.h:L73](../../SparkDaemon/src/BoundedWireCodec.h#L73) | | | `UnsubscribeFn` | alias | SparkEngine | [EntityEventBus.h:L99](../../SparkEngine/Source/Utils/EntityEventBus.h#L99) | | @@ -1580,7 +1580,7 @@ | `WIN32_LEAN_AND_MEAN` | macro | SparkInstaller | [main.cpp:L16](../../SparkInstaller/src/main.cpp#L16) | | | `WIN32_LEAN_AND_MEAN` | macro | SparkLauncher | [LauncherPaths.cpp:L10](../../SparkLauncher/src/LauncherPaths.cpp#L10) | | | `WIN32_LEAN_AND_MEAN` | macro | SparkLauncher | [LauncherProcess.cpp:L21](../../SparkLauncher/src/LauncherProcess.cpp#L21) | | -| `WIN32_LEAN_AND_MEAN` | macro | SparkLauncher | [main.cpp:L50](../../SparkLauncher/src/main.cpp#L50) | | +| `WIN32_LEAN_AND_MEAN` | macro | SparkLauncher | [main.cpp:L52](../../SparkLauncher/src/main.cpp#L52) | | | `WIN32_LEAN_AND_MEAN` | macro | SparkSDK | [ModuleDllMain.h:L35](../../SparkSDK/Include/Spark/ModuleDllMain.h#L35) | | | `WIN32_LEAN_AND_MEAN` | macro | SparkServer | [ServerHealth.cpp:L21](../../SparkServer/src/ServerHealth.cpp#L21) | | | `WIN32_LEAN_AND_MEAN` | macro | Tests | [LifecycleLoopGuards.h:L29](../../Tests/LifecycleLoopGuards.h#L29) | | diff --git a/wiki/reference/Symbol-Index.md b/wiki/reference/Symbol-Index.md index fa2fe44da..87a4f850c 100644 --- a/wiki/reference/Symbol-Index.md +++ b/wiki/reference/Symbol-Index.md @@ -2,7 +2,7 @@ > Every indexed first-party declaration. > -> **Total:** 54406 symbols. Auto-generated by `docs/generate-symbol-index.sh`. +> **Total:** 54533 symbols. Auto-generated by `docs/generate-symbol-index.sh`. | Symbol | Kind | Module | Source | Brief | |--------|------|--------|--------|-------| @@ -31,7 +31,7 @@ | `_Inout_` | macro | SparkEngine | [PlatformTypes.h:L221](../../SparkEngine/Source/Core/PlatformTypes.h#L221) | | | `_open` | function | Tests | [TestSparkError.cpp:L29](../../Tests/TestSparkError.cpp#L29) | | | `_Out_` | macro | SparkEngine | [PlatformTypes.h:L218](../../SparkEngine/Source/Core/PlatformTypes.h#L218) | | -| `_putenv_s` | function | SparkBuild | [ProcessRunnerTests.cpp:L598](../../SparkBuild/tests/ProcessRunnerTests.cpp#L598) | | +| `_putenv_s` | function | SparkBuild | [ProcessRunnerTests.cpp:L591](../../SparkBuild/tests/ProcessRunnerTests.cpp#L591) | | | `_putenv_s` | function | Tests | [TestSaveInterruptionReal.cpp:L169](../../Tests/TestSaveInterruptionReal.cpp#L169) | | | `_tfPerf` | function | GameModules | [TFBotSystem.cpp:L207](../../GameModules/SparkGameMMOFPS/Source/Game/TFBotSystem.cpp#L207) | | | `_tfPerf` | function | GameModules | [TFRegionSystem.cpp:L113](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.cpp#L113) | | @@ -56,12 +56,12 @@ | `A` | alias | GameModules | [TFBotSystemInternal.h:L189](../../GameModules/SparkGameMMOFPS/Source/Game/TFBotSystemInternal.h#L189) | | | `A` | alias | GameModules | [TFBotSystemInternal.h:L206](../../GameModules/SparkGameMMOFPS/Source/Game/TFBotSystemInternal.h#L206) | | | `a` | function | GameModules | [TFVehicleHUD.cpp:L204](../../GameModules/SparkGameMMOFPS/Source/UI/TFVehicleHUD.cpp#L204) | | -| `a` | struct | SparkEngine | [SceneManager.cpp:L404](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L404) | | +| `a` | struct | SparkEngine | [SceneManager.cpp:L448](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L448) | | | `a` | function | Tests | [TestBitFlags.cpp:L85](../../Tests/TestBitFlags.cpp#L85) | | | `a` | function | Tests | [TestEditorAutomation.cpp:L77](../../Tests/TestEditorAutomation.cpp#L77) | | | `a` | function | Tests | [TestEditorSubsystems.cpp:L2895](../../Tests/TestEditorSubsystems.cpp#L2895) | | | `a` | function | Tests | [TestEditorSubsystems.cpp:L2905](../../Tests/TestEditorSubsystems.cpp#L2905) | | -| `a` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L71](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L71) | | +| `a` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L72](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L72) | | | `a` | function | Tests | [TestServerMockClient.cpp:L557](../../Tests/TestServerMockClient.cpp#L557) | | | `a` | function | Tests | [TestServerMockClient.cpp:L1023](../../Tests/TestServerMockClient.cpp#L1023) | | | `a` | function | Tests | [TestServerMockClient.cpp:L1040](../../Tests/TestServerMockClient.cpp#L1040) | | @@ -125,7 +125,7 @@ | `AbilityState::Reset` | method | GameModules | [ClassAbilityState.cpp:L54](../../GameModules/SparkGameFPS/Source/Game/ClassAbilityState.cpp#L54) | | | `AbilityState::Update` | method | GameModules | [ClassAbilityState.cpp:L14](../../GameModules/SparkGameFPS/Source/Game/ClassAbilityState.cpp#L14) | | | `AbilitySystem` | class | SparkEngine | [AbilitySystem.h:L280](../../SparkEngine/Source/Engine/Gameplay/AbilitySystem.h#L280) | | -| `AbilitySystem` | class | SparkSDK | [IEngineContext.h:L56](../../SparkSDK/Include/Spark/IEngineContext.h#L56) | | +| `AbilitySystem` | class | SparkSDK | [IEngineContext.h:L57](../../SparkSDK/Include/Spark/IEngineContext.h#L57) | | | `AbilitySystem` | struct | Tests | [TestAbilitySystem.cpp:L103](../../Tests/TestAbilitySystem.cpp#L103) | | | `AbilitySystem` | struct | Tests | [TestGameplayStress.cpp:L355](../../Tests/TestGameplayStress.cpp#L355) | | | `AbilitySystem::ApplyAura` | method | SparkEngine | [AbilityAuras.cpp:L26](../../SparkEngine/Source/Engine/Gameplay/AbilityAuras.cpp#L26) | | @@ -167,9 +167,9 @@ | `AbortCoroutineSequence` | function | GameModules | [GameplayShowcase.h:L153](../../GameModules/SparkGame/Source/Core/GameplayShowcase.h#L153) | | | `AbortMigration` | function | GameModules | [TFDatabase.h:L313](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFDatabase.h#L313) | | | `About` | function | SparkEngine | [SparkEngineWindowsInternal.h:L105](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L105) | Run the engine in headless/dedicated server mode (Windows). | -| `About` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L482](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L482) | | +| `About` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L511](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L511) | | | `Absolute` | function | Tests | [TestRuntimePackageContentRoots.cpp:L23](../../Tests/TestRuntimePackageContentRoots.cpp#L23) | | -| `absolute` | function | Tests | [TestTFDataTables.cpp:L605](../../Tests/TestTFDataTables.cpp#L605) | | +| `absolute` | function | Tests | [TestTFDataTables.cpp:L596](../../Tests/TestTFDataTables.cpp#L596) | | | `absolutePath` | function | SparkEngine | [DaemonFraming.h:L178](../../SparkEngine/Source/Utils/DaemonFraming.h#L178) | | | `AbsoluteToLocal` | function | SparkEngine | [WorldOriginSystem.h:L156](../../SparkEngine/Source/Engine/World/WorldOriginSystem.h#L156) | Convert an absolute world position to local (rebased) space | | `Accept` | function | SparkEngine | [NetworkEncryption.h:L185](../../SparkEngine/Source/Engine/Networking/NetworkEncryption.h#L185) | Record a sequence if it is fresh | @@ -248,7 +248,7 @@ | `AcknowledgeRecovery` | function | Tests | [TestFreezeDetector.cpp:L99](../../Tests/TestFreezeDetector.cpp#L99) | | | `AcknowledgeSequence` | function | SparkEngine | [DeltaSnapshotManager.h:L144](../../SparkEngine/Source/Engine/Networking/DeltaSnapshotManager.h#L144) | | | `AcknowledgeSequence` | function | Tests | [TestNetworkManagerOrchestration.cpp:L275](../../Tests/TestNetworkManagerOrchestration.cpp#L275) | | -| `ackPayload` | function | Tests | [TestReliableChannel.cpp:L760](../../Tests/TestReliableChannel.cpp#L760) | | +| `ackPayload` | function | Tests | [TestReliableChannel.cpp:L763](../../Tests/TestReliableChannel.cpp#L763) | | | `AckState` | struct | Tests | [TestReliableChannel.cpp:L20](../../Tests/TestReliableChannel.cpp#L20) | | | `AclFixtureError` | function | Tests | [TestGatewaySecurity.cpp:L55](../../Tests/TestGatewaySecurity.cpp#L55) | | | `AclFixtureError` | function | Tests | [TestGatewaySecurity.cpp:L111](../../Tests/TestGatewaySecurity.cpp#L111) | | @@ -353,12 +353,15 @@ | `ActiveVolume` | struct | SparkEngine | [VolumeSystem.h:L430](../../SparkEngine/Source/Graphics/VolumeSystem.h#L430) | | | `ActiveWeaponDefLocal` | function | GameModules | [TFWeaponSystem.h:L72](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L72) | | | `ActiveWeaponModel` | function | GameModules | [TFWeaponSystem.h:L63](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L63) | | +| `activeWorker` | function | Tests | [TestFPSWeatherPort.cpp:L146](../../Tests/TestFPSWeatherPort.cpp#L146) | | | `ActiveWorldEvent` | struct | GameModules | [OWDynamicEventSystem.h:L41](../../GameModules/SparkGameOpenWorld/Source/Events/OWDynamicEventSystem.h#L41) | Runtime state for an active world event | | `actual` | function | Tests | [TestGoldenImageTest.cpp:L154](../../Tests/TestGoldenImageTest.cpp#L154) | | | `actual` | function | Tests | [TestGoldenImageTest.cpp:L189](../../Tests/TestGoldenImageTest.cpp#L189) | | | `AdamConfig` | struct | SparkEngine | [CpuNeuralTraining.h:L84](../../SparkEngine/Source/Graphics/Neural/CpuNeuralTraining.h#L84) | Adam optimizer configuration (Kingma & Ba 2014). | -| `adapter` | function | Tests | [TestFPSWeatherPort.cpp:L53](../../Tests/TestFPSWeatherPort.cpp#L53) | | -| `adapter` | function | Tests | [TestFPSWeatherPort.cpp:L63](../../Tests/TestFPSWeatherPort.cpp#L63) | | +| `adapter` | function | Tests | [TestFPSWeatherPort.cpp:L73](../../Tests/TestFPSWeatherPort.cpp#L73) | | +| `adapter` | function | Tests | [TestFPSWeatherPort.cpp:L94](../../Tests/TestFPSWeatherPort.cpp#L94) | | +| `adapter` | function | Tests | [TestFPSWeatherPort.cpp:L102](../../Tests/TestFPSWeatherPort.cpp#L102) | | +| `adapter` | function | Tests | [TestFPSWeatherPort.cpp:L109](../../Tests/TestFPSWeatherPort.cpp#L109) | | | `Adapter` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L120](../../Tests/TestRHI225D3D12ParityReal.cpp#L120) | | | `Adapter` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L139](../../Tests/TestRHI225D3D12ParityReal.cpp#L139) | | | `Adapter` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L212](../../Tests/TestRHI225D3D12ParityReal.cpp#L212) | | @@ -477,7 +480,7 @@ | `AddEventTrack` | function | SparkEngine | [Sequencer.h:L268](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L268) | | | `AddFadeTrack` | function | SparkEngine | [Sequencer.h:L270](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L270) | | | `AddFile` | function | SparkEngine | [SparkPakWriter.h:L41](../../SparkEngine/Source/Core/SparkPakWriter.h#L41) | Add a file from a raw byte buffer. | -| `AddFile` | function | Tests | [TestSparkPak.cpp:L65](../../Tests/TestSparkPak.cpp#L65) | | +| `AddFile` | function | Tests | [TestSparkPak.cpp:L71](../../Tests/TestSparkPak.cpp#L71) | | | `AddFloat` | function | SparkEngine | [ProfileProperties.h:L67](../../SparkEngine/Source/Utils/ProfileProperties.h#L67) | Add to a property's float value | | `AddFloat` | function | Tests | [TestExtendedSystems.cpp:L552](../../Tests/TestExtendedSystems.cpp#L552) | | | `AddFloat4Parameter` | function | SparkEngine | [MaterialDefinition.h:L172](../../SparkEngine/Source/Graphics/MaterialDefinition.h#L172) | Add a float4 parameter (color, vector). | @@ -533,7 +536,7 @@ | `AddNewRule` | function | SparkEditor | [EventResponsePanel.h:L81](../../SparkEditor/Source/Panels/EventResponsePanel.h#L81) | | | `AddNode` | function | SparkEngine | [DialogueSystem.h:L136](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L136) | Add a node to the tree. | | `AddNode` | function | SparkEngine | [FastNoise2SIMD.h:L720](../../SparkEngine/Source/Graphics/FastNoise2SIMD.h#L720) | Add a node to the graph (takes ownership) | -| `AddNode` | function | SparkEngine | [SceneManager.h:L245](../../SparkEngine/Source/SceneManager/SceneManager.h#L245) | | +| `AddNode` | function | SparkEngine | [SceneManager.h:L247](../../SparkEngine/Source/SceneManager/SceneManager.h#L247) | | | `AddNode` | function | Tests | [TestAIStress.cpp:L352](../../Tests/TestAIStress.cpp#L352) | | | `AddNode` | function | Tests | [TestSceneManager.cpp:L50](../../Tests/TestSceneManager.cpp#L50) | | | `AddNodeAtPosition` | function | SparkEditor | [VisualScriptPanel.h:L141](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L141) | | @@ -627,7 +630,7 @@ | `AddSystem` | function | SparkEngine | [PhaseSystemManager.h:L100](../../SparkEngine/Source/Engine/ECS/Systems/PhaseSystemManager.h#L100) | Construct and register a system in a specific execution phase. | | `AddSystem` | function | SparkEngine | [PhaseSystemManager.h:L113](../../SparkEngine/Source/Engine/ECS/Systems/PhaseSystemManager.h#L113) | Legacy: register a system in the flat (unphased) list. | | `AddSystem` | function | Tests | [TestECSystemOrdering.cpp:L206](../../Tests/TestECSystemOrdering.cpp#L206) | | -| `AddSystem` | function | Tests | [TestECSystemsReal.cpp:L77](../../Tests/TestECSystemsReal.cpp#L77) | | +| `AddSystem` | function | Tests | [TestECSystemsReal.cpp:L67](../../Tests/TestECSystemsReal.cpp#L67) | | | `AddTag` | function | SparkEngine | [GameplayComponents.h:L34](../../SparkEngine/Source/Engine/ECS/Components/GameplayComponents.h#L34) | | | `AddTag` | function | SparkEngine | [GameplayTags.h:L79](../../SparkEngine/Source/Engine/Gameplay/GameplayTags.h#L79) | Add a tag to this container | | `AddTag` | function | Tests | [TestECSStress.cpp:L64](../../Tests/TestECSStress.cpp#L64) | | @@ -642,7 +645,7 @@ | `AddTextureLayer` | function | SparkEditor | [TerrainData.h:L156](../../SparkEditor/Source/Terrain/TerrainData.h#L156) | | | `AddTextureSlot` | function | SparkEngine | [MaterialDefinition.h:L189](../../SparkEngine/Source/Graphics/MaterialDefinition.h#L189) | Add a texture slot declaration. | | `AddTile` | function | SparkEditor | [LevelStreamingSystem.h:L117](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.h#L117) | Add tile to world | -| `AddToHistory` | function | SparkConsole | [ConsoleApp.h:L119](../../SparkConsole/src/ConsoleApp.h#L119) | | +| `AddToHistory` | function | SparkConsole | [ConsoleApp.h:L120](../../SparkConsole/src/ConsoleApp.h#L120) | | | `AddToRecentProjects` | function | SparkEditor | [ProjectManager.h:L234](../../SparkEditor/Source/Core/ProjectManager.h#L234) | | | `AddToRecentSearches` | function | SparkEditor | [SearchPanel.h:L135](../../SparkEditor/Source/Panels/SearchPanel.h#L135) | | | `AddToSelection` | function | GameModules | [RTSCommandSystem.h:L65](../../GameModules/SparkGameRTS/Source/Command/RTSCommandSystem.h#L65) | | @@ -776,6 +779,7 @@ | `after` | struct | SparkEngine | [EventResponseSystem.cpp:L145](../../SparkEngine/Source/Engine/Gameplay/EventResponseSystem.cpp#L145) | | | `after` | struct | Tests | [TestCrashHandlerGatingReal.cpp:L472](../../Tests/TestCrashHandlerGatingReal.cpp#L472) | | | `after` | function | Tests | [TestEditorSubsystems.cpp:L844](../../Tests/TestEditorSubsystems.cpp#L844) | | +| `after` | function | Tests | [TestEditorSubsystemsReal.cpp:L822](../../Tests/TestEditorSubsystemsReal.cpp#L822) | | | `afterRepeat` | function | SparkCrashReporter | [CrashReporterManifestTests.cpp:L788](../../SparkCrashReporter/tests/CrashReporterManifestTests.cpp#L788) | | | `Agent` | struct | Tests | [TestCollisionAvoidance.cpp:L27](../../Tests/TestCollisionAvoidance.cpp#L27) | | | `AgentBudgetEntry` | struct | SparkEngine | [AIBudgetTypes.h:L37](../../SparkEngine/Source/Engine/AI/AIBudgetTypes.h#L37) | Tracking data for a single AI agent within the budget system. | @@ -870,10 +874,10 @@ | `AIS` | alias | SparkEngine | [EngineSettings.cpp:L159](../../SparkEngine/Source/Core/EngineSettings.cpp#L159) | | | `AISettings` | struct | SparkEngine | [EngineSettings.h:L353](../../SparkEngine/Source/Core/EngineSettings.h#L353) | | | `AISystem` | class | SparkEngine | [AISystem.h:L254](../../SparkEngine/Source/Engine/AI/AISystem.h#L254) | | -| `AISystem` | class | SparkSDK | [IEngineContext.h:L46](../../SparkSDK/Include/Spark/IEngineContext.h#L46) | | +| `AISystem` | class | SparkSDK | [IEngineContext.h:L47](../../SparkSDK/Include/Spark/IEngineContext.h#L47) | | | `AISystem::ClearBehaviors` | method | SparkEngine | [AISystem.cpp:L254](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L254) | | -| `AISystem::Console_GetAgentInfo` | method | SparkEngine | [AISystem.cpp:L685](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L685) | | -| `AISystem::Console_ListAgents` | method | SparkEngine | [AISystem.cpp:L643](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L643) | | +| `AISystem::Console_GetAgentInfo` | method | SparkEngine | [AISystem.cpp:L686](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L686) | | +| `AISystem::Console_ListAgents` | method | SparkEngine | [AISystem.cpp:L644](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L644) | | | `AISystem::CreateBehaviorInstance` | method | SparkEngine | [AISystem.cpp:L205](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L205) | | | `AISystem::RegisterBehavior` | method | SparkEngine | [AISystem.cpp:L197](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L197) | | | `AISystem::Update` | method | SparkEngine | [AISystem.cpp:L82](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L82) | | @@ -1051,11 +1055,11 @@ | `AnchorWorkingDirectory` | function | SparkEngine | [RuntimePackage.cpp:L54](../../SparkEngine/Source/Core/RuntimePackage.cpp#L54) | | | `AnchorWorkingDirectory` | function | SparkEngine | [RuntimePackage.h:L33](../../SparkEngine/Source/Core/RuntimePackage.h#L33) | Anchor a spark-cli package to its executable directory. | | `AngelScriptEngine` | class | GameModules | [VisualScriptDemoWorld.h:L21](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.h#L21) | | -| `AngelScriptEngine` | class | SparkEngine | [EngineContext.h:L45](../../SparkEngine/Source/Core/EngineContext.h#L45) | | +| `AngelScriptEngine` | class | SparkEngine | [EngineContext.h:L46](../../SparkEngine/Source/Core/EngineContext.h#L46) | | | `AngelScriptEngine` | class | SparkEngine | [EngineSetup.h:L19](../../SparkEngine/Source/Core/EngineSetup.h#L19) | | | `AngelScriptEngine` | class | SparkEngine | [ECSystems.h:L74](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L74) | | | `AngelScriptEngine` | class | SparkEngine | [AngelScriptEngine.h:L104](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L104) | | -| `AngelScriptEngine` | class | SparkSDK | [IEngineContext.h:L28](../../SparkSDK/Include/Spark/IEngineContext.h#L28) | | +| `AngelScriptEngine` | class | SparkSDK | [IEngineContext.h:L29](../../SparkSDK/Include/Spark/IEngineContext.h#L29) | | | `AngelScriptEngine` | class | Tests | [TestAngelScriptEngine.cpp:L72](../../Tests/TestAngelScriptEngine.cpp#L72) | | | `AngelScriptEngine::AttachScript` | method | SparkEngine | [AngelScriptEngine.cpp:L929](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.cpp#L929) | | | `AngelScriptEngine::AttachScript` | method | SparkEngine | [AngelScriptEngine.cpp:L1642](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.cpp#L1642) | | @@ -1188,7 +1192,7 @@ | `AnimationLayer` | struct | SparkEngine | [AnimationTypes.h:L243](../../SparkEngine/Source/Engine/Animation/AnimationTypes.h#L243) | | | `AnimationLayer` | struct | Tests | [TestAnimationSystem.cpp:L266](../../Tests/TestAnimationSystem.cpp#L266) | | | `AnimationManager` | class | SparkEngine | [AnimationSystem.h:L374](../../SparkEngine/Source/Engine/Animation/AnimationSystem.h#L374) | | -| `AnimationManager` | class | SparkSDK | [IEngineContext.h:L40](../../SparkSDK/Include/Spark/IEngineContext.h#L40) | | +| `AnimationManager` | class | SparkSDK | [IEngineContext.h:L41](../../SparkSDK/Include/Spark/IEngineContext.h#L41) | | | `AnimationManager` | class | Tests | [TestAnimationSystem.cpp:L386](../../Tests/TestAnimationSystem.cpp#L386) | | | `AnimationManager::Clear` | method | SparkEngine | [AnimationSystem.cpp:L222](../../SparkEngine/Source/Engine/Animation/AnimationSystem.cpp#L222) | | | `AnimationManager::Console_ListAnimations` | method | SparkEngine | [AnimationSystem.cpp:L228](../../SparkEngine/Source/Engine/Animation/AnimationSystem.cpp#L228) | | @@ -1219,7 +1223,7 @@ | `AnimationStateMachine::SetDefaultState` | method | SparkEngine | [AnimationStateMachine.cpp:L36](../../SparkEngine/Source/Engine/Animation/AnimationStateMachine.cpp#L36) | | | `AnimationStateMachine::Update` | method | SparkEngine | [AnimationStateMachine.cpp:L43](../../SparkEngine/Source/Engine/Animation/AnimationStateMachine.cpp#L43) | | | `AnimationSystem` | alias | SparkEngine | [AnimationSystem.h:L564](../../SparkEngine/Source/Engine/Animation/AnimationSystem.h#L564) | Type alias so EngineContext/EngineSetup can reference "AnimationSystem" | -| `AnimationSystem` | alias | SparkSDK | [IEngineContext.h:L41](../../SparkSDK/Include/Spark/IEngineContext.h#L41) | | +| `AnimationSystem` | alias | SparkSDK | [IEngineContext.h:L42](../../SparkSDK/Include/Spark/IEngineContext.h#L42) | | | `AnimationTrack` | struct | SparkEngine | [AssetPipeline.h:L148](../../SparkEngine/Source/Graphics/AssetPipeline.h#L148) | | | `AnimationTransition` | struct | SparkEngine | [AnimationTypes.h:L317](../../SparkEngine/Source/Engine/Animation/AnimationTypes.h#L317) | Defines a transition from one animation state to another. | | `AnimationTransition` | struct | Tests | [TestAnimationStress.cpp:L249](../../Tests/TestAnimationStress.cpp#L249) | | @@ -1445,7 +1449,7 @@ | `ApplyDifficulty` | function | SparkEngine | [AIDirector.h:L190](../../SparkEngine/Source/Engine/AI/AIDirector.h#L190) | Set intensity manually (console integration / debugging). | | `ApplyDirtyObstacles` | function | SparkEngine | [NavMeshObstacles.h:L268](../../SparkEngine/Source/Engine/AI/NavMeshObstacles.h#L268) | Re-carve all obstacles marked dirty since the last apply. | | `ApplyDot` | function | GameModules | [ARPGCombatSystem.h:L81](../../GameModules/SparkGameARPG/Source/Combat/ARPGCombatSystem.h#L81) | | -| `ApplyDueTimedKeyReleases` | function | SparkEngine | [InputManager.h:L376](../../SparkEngine/Source/Input/InputManager.h#L376) | Release every console-simulated key whose hold duration has elapsed | +| `ApplyDueTimedKeyReleases` | function | SparkEngine | [InputManager.h:L383](../../SparkEngine/Source/Input/InputManager.h#L383) | Release every console-simulated key whose hold duration has elapsed | | `ApplyEase` | function | SparkEngine | [TweenSystem.cpp:L19](../../SparkEngine/Source/Engine/Tween/TweenSystem.cpp#L19) | | | `ApplyEase` | function | SparkEngine | [TweenSystem.h:L73](../../SparkEngine/Source/Engine/Tween/TweenSystem.h#L73) | Apply the given ease function to a linear t value in [0, 1]. | | `ApplyEffect` | function | SparkEngine | [AbilitySystem.h:L327](../../SparkEngine/Source/Engine/Gameplay/AbilitySystem.h#L327) | | @@ -1496,7 +1500,7 @@ | `ApplyPlatformCarry` | function | GameModules | [PlatformerPlayerController.h:L168](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L168) | | | `ApplyPlayerDrive` | function | GameModules | [RacingRaceFlow.cpp:L193](../../GameModules/SparkGameRacing/Source/Core/RacingRaceFlow.cpp#L193) | | | `ApplyPose` | function | GameModules | [ARPGActorPresentation.cpp:L98](../../GameModules/SparkGameARPG/Source/Demo/ARPGActorPresentation.cpp#L98) | | -| `ApplyPosixCoreDumpPolicy` | function | SparkEngine | [CrashHandler.cpp:L2148](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2148) | | +| `ApplyPosixCoreDumpPolicy` | function | SparkEngine | [CrashHandler.cpp:L2179](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2179) | | | `ApplyPowerUp` | function | GameModules | [PlatformerPlayerController.h:L135](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L135) | Apply a temporary power-up effect | | `ApplyPrediction` | function | SparkEngine | [ClientPrediction.h:L130](../../SparkEngine/Source/Engine/Networking/ClientPrediction.h#L130) | Apply predicted movement locally. | | `ApplyPrefabToInstances` | function | SparkEditor | [PrefabManager.h:L203](../../SparkEditor/Source/Prefabs/PrefabManager.h#L203) | | @@ -1682,12 +1686,12 @@ | `AreTypesCompatible` | function | SparkEditor | [VisualScriptPanel.h:L147](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L147) | | | `arg` | function | SparkEditor | [main.cpp:L696](../../SparkEditor/Source/main.cpp#L696) | | | `Arg` | function | SparkEngine | [Process.h:L66](../../SparkEngine/Source/Utils/Process.h#L66) | | -| `args` | function | SparkEditor | [EditorUI.cpp:L1469](../../SparkEditor/Source/Core/EditorUI.cpp#L1469) | | +| `args` | function | SparkEditor | [EditorUI.cpp:L1489](../../SparkEditor/Source/Core/EditorUI.cpp#L1489) | | | `args` | function | SparkEditor | [ConsolePanel.cpp:L790](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L790) | | | `args` | function | SparkEditor | [EditorAutomation.h:L268](../../SparkEditor/Source/Panels/EditorAutomation.h#L268) | | | `args` | function | SparkEngine | [InGameConsole.h:L317](../../SparkEngine/Source/Utils/InGameConsole.h#L317) | | | `argument` | function | SparkConsole | [main.cpp:L32](../../SparkConsole/src/main.cpp#L32) | | -| `argument` | function | SparkLauncher | [main.cpp:L60](../../SparkLauncher/src/main.cpp#L60) | | +| `argument` | function | SparkLauncher | [main.cpp:L63](../../SparkLauncher/src/main.cpp#L63) | | | `ArgumentValue` | function | SparkEngine | [SparkEngineLinuxInit.cpp:L75](../../SparkEngine/Source/Core/SparkEngineLinuxInit.cpp#L75) | | | `ArgumentValue` | function | SparkEngine | [StartupSplash.cpp:L69](../../SparkEngine/Source/Core/StartupSplash.cpp#L69) | | | `ArithmeticShiftRight` | function | SparkEngine | [FastNoise2SIMD.h:L98](../../SparkEngine/Source/Graphics/FastNoise2SIMD.h#L98) | Defined arithmetic right shift for a 32-bit two's-complement bit pattern | @@ -1698,7 +1702,7 @@ | `ArmCrashAt` | function | Tests | [TestDATA120BackupRestore.cpp:L475](../../Tests/TestDATA120BackupRestore.cpp#L475) | | | `Armed` | function | GameModules | [TFChaosHarness.h:L76](../../GameModules/SparkGameMMOFPS/Source/Game/TFChaosHarness.h#L76) | | | `ArmRespawn` | function | GameModules | [GameMechanics.h:L227](../../GameModules/SparkGameFPS/Source/Game/GameMechanics.h#L227) | Arm the respawn countdown without scoring a death. | -| `ArmSignalReportWatchdog` | function | SparkEngine | [CrashHandler.cpp:L2183](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2183) | | +| `ArmSignalReportWatchdog` | function | SparkEngine | [CrashHandler.cpp:L2214](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2214) | | | `ARPGAbilityCatalog` | struct | GameModules | [ARPGAbilityCatalog.h:L15](../../GameModules/SparkGameARPG/Source/Core/ARPGAbilityCatalog.h#L15) | Stable IDs and registration routine for the ARPG engine ability bridge. | | `ARPGActorPresentation` | class | GameModules | [SparkGameARPG.h:L34](../../GameModules/SparkGameARPG/Source/Core/SparkGameARPG.h#L34) | | | `ARPGActorPresentation` | class | GameModules | [ARPGActorPresentation.h:L43](../../GameModules/SparkGameARPG/Source/Demo/ARPGActorPresentation.h#L43) | Keeps one ECS actor per hero and live monster in the engine World. | @@ -1895,7 +1899,7 @@ | `artifact` | function | Tests | [TestCrashHandlerGatingReal.cpp:L305](../../Tests/TestCrashHandlerGatingReal.cpp#L305) | | | `Artifact` | function | Tests | [TestTelemetrySpool.cpp:L47](../../Tests/TestTelemetrySpool.cpp#L47) | | | `ArtifactIdentity` | struct | SparkCrashReporter | [CrashReporterApp.h:L33](../../SparkCrashReporter/src/CrashReporterApp.h#L33) | | -| `ArtifactNameInPinnedRoot` | function | SparkEngine | [CrashHandler.cpp:L208](../../SparkEngine/Source/Utils/CrashHandler.cpp#L208) | | +| `ArtifactNameInPinnedRoot` | function | SparkEngine | [CrashHandler.cpp:L209](../../SparkEngine/Source/Utils/CrashHandler.cpp#L209) | | | `ArtifactNameInRoot` | function | SparkCrashReporter | [CrashReporterApp.cpp:L839](../../SparkCrashReporter/src/CrashReporterApp.cpp#L839) | | | `as` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L327](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L327) | | | `AS` | alias | SparkEngine | [EngineSettings.cpp:L45](../../SparkEngine/Source/Core/EngineSettings.cpp#L45) | | @@ -1949,7 +1953,7 @@ | `ASPlaySound` | function | SparkEngine | [AngelScriptEngine.h:L872](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L872) | | | `ASPrint` | function | SparkEngine | [AngelScriptEngine.cpp:L63](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.cpp#L63) | | | `ASPrint` | function | SparkEngine | [AngelScriptEngine.h:L738](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L738) | Print a message to the debug console (callable from AngelScript as `print()`) | -| `Assemble` | function | Tests | [TestEditorCookPackageReal.cpp:L396](../../Tests/TestEditorCookPackageReal.cpp#L396) | | +| `Assemble` | function | Tests | [TestEditorCookPackageReal.cpp:L407](../../Tests/TestEditorCookPackageReal.cpp#L407) | | | `Assemble` | function | Tests | [TestEditorSubsystems.cpp:L2460](../../Tests/TestEditorSubsystems.cpp#L2460) | | | `AssembleNativePackage` | function | SparkEditor | [BuildPipeline.h:L145](../../SparkEditor/Source/Panels/BuildPipeline.h#L145) | | | `AssembleNativePackageContents` | function | SparkEditor | [BuildPipeline.h:L153](../../SparkEditor/Source/Panels/BuildPipeline.h#L153) | | @@ -2010,24 +2014,25 @@ | `asset` | function | Tests | [TestGLTFAnimationImport.cpp:L552](../../Tests/TestGLTFAnimationImport.cpp#L552) | | | `asset` | function | Tests | [TestMMOAssetImport.cpp:L59](../../Tests/TestMMOAssetImport.cpp#L59) | | | `AssetAuditGraph` | class | SparkEditor | [AssetAuditGraph.h:L121](../../SparkEditor/Source/Panels/AssetAuditGraph.h#L121) | | -| `AssetBrowserPanel` | class | SparkEditor | [AssetBrowserPanel.h:L26](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L26) | Asset browser panel | -| `AssetBrowserPanel::ClearProject` | method | SparkEditor | [AssetBrowserPanel.cpp:L325](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L325) | | -| `AssetBrowserPanel::HandleEvent` | method | SparkEditor | [AssetBrowserPanel.cpp:L300](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L300) | | -| `AssetBrowserPanel::HasValidProjectRoot` | method | SparkEditor | [AssetBrowserPanel.cpp:L751](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L751) | | -| `AssetBrowserPanel::ImportAsset` | method | SparkEditor | [AssetBrowserPanel.cpp:L633](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L633) | | -| `AssetBrowserPanel::Initialize` | method | SparkEditor | [AssetBrowserPanel.cpp:L111](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L111) | | -| `AssetBrowserPanel::IsContainedByProject` | method | SparkEditor | [AssetBrowserPanel.cpp:L760](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L760) | | -| `AssetBrowserPanel::NavigateToFolder` | method | SparkEditor | [AssetBrowserPanel.cpp:L336](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L336) | | -| `AssetBrowserPanel::RefreshAssets` | method | SparkEditor | [AssetBrowserPanel.cpp:L592](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L592) | | -| `AssetBrowserPanel::Render` | method | SparkEditor | [AssetBrowserPanel.cpp:L164](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L164) | | -| `AssetBrowserPanel::RenderAssetDetails` | method | SparkEditor | [AssetBrowserPanel.cpp:L558](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L558) | | -| `AssetBrowserPanel::RenderAssetGrid` | method | SparkEditor | [AssetBrowserPanel.cpp:L410](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L410) | | -| `AssetBrowserPanel::RenderFolderNode` | method | SparkEditor | [AssetBrowserPanel.cpp:L382](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L382) | | -| `AssetBrowserPanel::RenderFolderTree` | method | SparkEditor | [AssetBrowserPanel.cpp:L353](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L353) | | -| `AssetBrowserPanel::SetOperationResult` | method | SparkEditor | [AssetBrowserPanel.cpp:L765](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L765) | | -| `AssetBrowserPanel::SetProjectPath` | method | SparkEditor | [AssetBrowserPanel.cpp:L305](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L305) | | -| `AssetBrowserPanel::Shutdown` | method | SparkEditor | [AssetBrowserPanel.cpp:L295](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L295) | | -| `AssetBrowserPanel::Update` | method | SparkEditor | [AssetBrowserPanel.cpp:L118](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L118) | | +| `AssetBrowserPanel` | class | SparkEditor | [AssetBrowserPanel.h:L27](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L27) | Asset browser panel | +| `AssetBrowserPanel::ClearProject` | method | SparkEditor | [AssetBrowserPanel.cpp:L152](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L152) | | +| `AssetBrowserPanel::HandleEvent` | method | SparkEditor | [AssetBrowserPanel.cpp:L105](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L105) | | +| `AssetBrowserPanel::HasValidProjectRoot` | method | SparkEditor | [AssetBrowserPanel.cpp:L396](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L396) | | +| `AssetBrowserPanel::ImportAsset` | method | SparkEditor | [AssetBrowserPanel.cpp:L278](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L278) | | +| `AssetBrowserPanel::Initialize` | method | SparkEditor | [AssetBrowserPanel.cpp:L88](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L88) | | +| `AssetBrowserPanel::IsContainedByProject` | method | SparkEditor | [AssetBrowserPanel.cpp:L405](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L405) | | +| `AssetBrowserPanel::NavigateToFolder` | method | SparkEditor | [AssetBrowserPanel.cpp:L163](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L163) | | +| `AssetBrowserPanel::OpenAsset` | method | SparkEditor | [AssetBrowserPanel.cpp:L110](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L110) | | +| `AssetBrowserPanel::RefreshAssets` | method | SparkEditor | [AssetBrowserPanel.cpp:L237](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L237) | | +| `AssetBrowserPanel::Render` | method | SparkEditor | [AssetBrowserGrid.cpp:L59](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L59) | | +| `AssetBrowserPanel::RenderAssetDetails` | method | SparkEditor | [AssetBrowserGrid.cpp:L342](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L342) | | +| `AssetBrowserPanel::RenderAssetGrid` | method | SparkEditor | [AssetBrowserGrid.cpp:L190](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L190) | | +| `AssetBrowserPanel::RenderFolderNode` | method | SparkEditor | [AssetBrowserPanel.cpp:L209](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L209) | | +| `AssetBrowserPanel::RenderFolderTree` | method | SparkEditor | [AssetBrowserPanel.cpp:L180](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L180) | | +| `AssetBrowserPanel::SetOperationResult` | method | SparkEditor | [AssetBrowserPanel.cpp:L410](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L410) | | +| `AssetBrowserPanel::SetProjectPath` | method | SparkEditor | [AssetBrowserPanel.cpp:L132](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L132) | | +| `AssetBrowserPanel::Shutdown` | method | SparkEditor | [AssetBrowserPanel.cpp:L100](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L100) | | +| `AssetBrowserPanel::Update` | method | SparkEditor | [AssetBrowserPanel.cpp:L95](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L95) | | | `AssetCache` | class | SparkEngine | [AssetPipeline.h:L332](../../SparkEngine/Source/Graphics/AssetPipeline.h#L332) | Asset cache with LRU eviction | | `AssetCache` | class | Tests | [TestAssetPipelineCache.cpp:L85](../../Tests/TestAssetPipelineCache.cpp#L85) | | | `AssetCache::AddAsset` | method | SparkEngine | [AssetTypesLinuxMedia.cpp:L184](../../SparkEngine/Source/Graphics/AssetTypesLinuxMedia.cpp#L184) | | @@ -2071,7 +2076,7 @@ | `assetDir` | function | SparkEditor | [AdvancedAssetPipelineUI.cpp:L608](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipelineUI.cpp#L608) | | | `AssetDropResult` | enum | SparkEditor | [InspectorWorldAssetDrop.h:L31](../../SparkEditor/Source/Panels/InspectorWorldAssetDrop.h#L31) | | | `AssetEntry` | struct | SparkEngine | [AssetIntegration.h:L242](../../SparkEngine/Source/Core/AssetIntegration.h#L242) | | -| `AssetExists` | function | Tests | [TestTFDataTables.cpp:L75](../../Tests/TestTFDataTables.cpp#L75) | | +| `AssetExists` | function | Tests | [TestTFDataTables.cpp:L66](../../Tests/TestTFDataTables.cpp#L66) | | | `AssetFileFor` | function | Tests | [TestSecDaemonCacheHardening.cpp:L209](../../Tests/TestSecDaemonCacheHardening.cpp#L209) | | | `AssetFileHeader` | struct | SparkEngine | [AssetMigration.h:L96](../../SparkEngine/Source/Core/AssetMigration.h#L96) | Fixed-size header at the start of every SparkEngine binary asset. | | `AssetGet` | function | Tests | [TestDaemonLRU.cpp:L85](../../Tests/TestDaemonLRU.cpp#L85) | | @@ -2101,12 +2106,12 @@ | `AssetMigrationRegistry` | class | SparkEngine | [AssetMigration.h:L196](../../SparkEngine/Source/Core/AssetMigration.h#L196) | Singleton registry that chains migration steps to upgrade assets. | | `AssetName` | function | Tests | [TestSecDaemonCacheHardening.cpp:L84](../../Tests/TestSecDaemonCacheHardening.cpp#L84) | | | `AssetNode` | struct | SparkEditor | [AssetAuditGraph.h:L73](../../SparkEditor/Source/Panels/AssetAuditGraph.h#L73) | Information about a single asset in the graph | -| `AssetPipeline` | class | SparkEngine | [EngineContext.h:L46](../../SparkEngine/Source/Core/EngineContext.h#L46) | | +| `AssetPipeline` | class | SparkEngine | [EngineContext.h:L47](../../SparkEngine/Source/Core/EngineContext.h#L47) | | | `AssetPipeline` | class | SparkEngine | [AssetPipeline.h:L381](../../SparkEngine/Source/Graphics/AssetPipeline.h#L381) | Asset pipeline system | | `AssetPipeline` | class | SparkEngine | [FoliageRenderer.h:L45](../../SparkEngine/Source/Graphics/FoliageRenderer.h#L45) | | | `AssetPipeline` | class | SparkEngine | [GraphicsEngine.h:L88](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L88) | | | `AssetPipeline` | class | SparkEngine | [RTSceneFeeder.h:L32](../../SparkEngine/Source/Graphics/HybridRT/RTSceneFeeder.h#L32) | | -| `AssetPipeline` | class | SparkSDK | [IEngineContext.h:L29](../../SparkSDK/Include/Spark/IEngineContext.h#L29) | | +| `AssetPipeline` | class | SparkSDK | [IEngineContext.h:L30](../../SparkSDK/Include/Spark/IEngineContext.h#L30) | | | `AssetPipeline::BindMaterial` | method | SparkEngine | [ModelLoading.cpp:L131](../../SparkEngine/Source/Graphics/ModelLoading.cpp#L131) | | | `AssetPipeline::BindMesh` | method | SparkEngine | [ModelLoading.cpp:L28](../../SparkEngine/Source/Graphics/ModelLoading.cpp#L28) | | | `AssetPipeline::BuildRHIBuffersForMesh` | method | SparkEngine | [AssetPipelineLinuxStreaming.cpp:L164](../../SparkEngine/Source/Graphics/AssetPipelineLinuxStreaming.cpp#L164) | | @@ -2215,11 +2220,13 @@ | `AssetReference` | struct | SparkEditor | [SceneFileTypes.h:L1074](../../SparkEditor/Source/SceneSystem/SceneFileTypes.h#L1074) | Asset reference for dependency tracking | | `AssetRegistry` | class | SparkEngine | [AssetIntegration.h:L74](../../SparkEngine/Source/Core/AssetIntegration.h#L74) | | | `AssetRegistry` | class | SparkEngine | [EngineRuntime.h:L38](../../SparkEngine/Source/Core/EngineRuntime.h#L38) | | -| `AssetRegistry` | class | SparkSDK | [IEngineContext.h:L90](../../SparkSDK/Include/Spark/IEngineContext.h#L90) | | +| `AssetRegistry` | class | SparkSDK | [IEngineContext.h:L91](../../SparkSDK/Include/Spark/IEngineContext.h#L91) | | | `ASSetRotation` | function | SparkEngine | [AngelScriptEngine.cpp:L308](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.cpp#L308) | | | `ASSetRotation` | function | SparkEngine | [AngelScriptEngine.h:L834](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L834) | Set entity rotation from euler angles (callable as `setRotation()`) | | `Assets` | function | Tests | [TestSEC4NarrowPathsReal.cpp:L155](../../Tests/TestSEC4NarrowPathsReal.cpp#L155) | | -| `AssetSecDir` | function | Tests | [TestAssetParserHardening.cpp:L39](../../Tests/TestAssetParserHardening.cpp#L39) | | +| `AssetSecDir` | function | Tests | [TestAssetParserHardening.cpp:L55](../../Tests/TestAssetParserHardening.cpp#L55) | | +| `AssetSecRoot` | function | Tests | [TestAssetParserHardening.cpp:L45](../../Tests/TestAssetParserHardening.cpp#L45) | | +| `AssetSecTempPath` | function | Tests | [TestThirdPartyIntegration.cpp:L63](../../Tests/TestThirdPartyIntegration.cpp#L63) | | | `AssetService` | class | SparkDaemon | [AssetService.h:L53](../../SparkDaemon/src/AssetService.h#L53) | | | `AssetService::BlobPath` | method | SparkDaemon | [AssetService.cpp:L318](../../SparkDaemon/src/AssetService.cpp#L318) | | | `AssetService::DeleteAllBlobFiles` | method | SparkDaemon | [AssetService.cpp:L443](../../SparkDaemon/src/AssetService.cpp#L443) | | @@ -2295,7 +2302,7 @@ | `AssetVersion` | struct | SparkEngine | [AssetMigration.h:L78](../../SparkEngine/Source/Core/AssetMigration.h#L78) | Semantic version triplet for asset file formats. | | `AssignAlternateOwnerOnlyAcl` | function | Tests | [TestGatewaySecurity.cpp:L197](../../Tests/TestGatewaySecurity.cpp#L197) | | | `AssignChampionAffixes` | function | GameModules | [ARPGMonsterSystem.h:L117](../../GameModules/SparkGameARPG/Source/Monster/ARPGMonsterSystem.h#L117) | | -| `AssignCrashConfig` | function | SparkEngine | [CrashHandler.cpp:L100](../../SparkEngine/Source/Utils/CrashHandler.cpp#L100) | | +| `AssignCrashConfig` | function | SparkEngine | [CrashHandler.cpp:L101](../../SparkEngine/Source/Utils/CrashHandler.cpp#L101) | | | `assigned` | function | GameModules | [TFDataTablesParseWorld.cpp:L187](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTablesParseWorld.cpp#L187) | | | `AssignEntity` | function | SparkEngine | [HLODSystem.h:L250](../../SparkEngine/Source/Engine/HLOD/HLODSystem.h#L250) | Place an entity into the cell containing the given position | | `AssignLightsToCluster` | function | Tests | [TestGPUClusterCulling.cpp:L44](../../Tests/TestGPUClusterCulling.cpp#L44) | | @@ -2431,12 +2438,12 @@ | `AudioEngine` | class | SparkEngine | [AudioEngine.h:L115](../../SparkEngine/Source/Audio/AudioEngine.h#L115) | | | `AudioEngine` | class | SparkEngine | [XAudio2AudioBackend.h:L18](../../SparkEngine/Source/Audio/XAudio2AudioBackend.h#L18) | | | `AudioEngine` | class | SparkEngine | [EngineConsoleCommands.h:L11](../../SparkEngine/Source/Core/EngineConsoleCommands.h#L11) | Registers engine-wide console commands (modules, physics, audio, save, architecture) | -| `AudioEngine` | class | SparkEngine | [EngineContext.h:L42](../../SparkEngine/Source/Core/EngineContext.h#L42) | | +| `AudioEngine` | class | SparkEngine | [EngineContext.h:L43](../../SparkEngine/Source/Core/EngineContext.h#L43) | | | `AudioEngine` | class | SparkEngine | [EngineRuntime.h:L31](../../SparkEngine/Source/Core/EngineRuntime.h#L31) | | | `AudioEngine` | class | SparkEngine | [EngineSetup.h:L22](../../SparkEngine/Source/Core/EngineSetup.h#L22) | | | `AudioEngine` | class | SparkEngine | [ECSIntegration.h:L31](../../SparkEngine/Source/Engine/ECS/ECSIntegration.h#L31) | | | `AudioEngine` | class | SparkEngine | [ECSystems.h:L73](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L73) | | -| `AudioEngine` | class | SparkSDK | [IEngineContext.h:L25](../../SparkSDK/Include/Spark/IEngineContext.h#L25) | | +| `AudioEngine` | class | SparkSDK | [IEngineContext.h:L26](../../SparkSDK/Include/Spark/IEngineContext.h#L26) | | | `AudioEngine` | class | Tests | [TestAudioEngine.cpp:L50](../../Tests/TestAudioEngine.cpp#L50) | | | `AudioEngine::Apply3DAudioToSource` | method | SparkEngine | [AudioEngine.cpp:L927](../../SparkEngine/Source/Audio/AudioEngine.cpp#L927) | | | `AudioEngine::ApplySourceGain` | method | SparkEngine | [AudioEngine.cpp:L1069](../../SparkEngine/Source/Audio/AudioEngine.cpp#L1069) | | @@ -2613,15 +2620,16 @@ | `authenticator` | function | Tests | [TestGatewaySecurity.cpp:L358](../../Tests/TestGatewaySecurity.cpp#L358) | | | `AuthErrText` | function | GameModules | [TFLoginFlow.cpp:L31](../../GameModules/SparkGameMMOFPS/Source/UI/TFLoginFlow.cpp#L31) | | | `AuthNetContext` | class | Tests | [TestMMOAuthNetwork.cpp:L48](../../Tests/TestMMOAuthNetwork.cpp#L48) | | -| `Author` | function | Tests | [TestEditorCookPackageReal.cpp:L283](../../Tests/TestEditorCookPackageReal.cpp#L283) | | -| `AuthorCookAndPackage` | function | Tests | [TestEditorCookPackageReal.cpp:L165](../../Tests/TestEditorCookPackageReal.cpp#L165) | | +| `Author` | function | Tests | [TestEditorCookPackageReal.cpp:L294](../../Tests/TestEditorCookPackageReal.cpp#L294) | | +| `AuthorCookAndPackage` | function | Tests | [TestEditorCookPackageReal.cpp:L167](../../Tests/TestEditorCookPackageReal.cpp#L167) | | +| `authored` | function | Tests | [TestEditorSubsystemsReal.cpp:L815](../../Tests/TestEditorSubsystemsReal.cpp#L815) | | | `Authority` | struct | Tests | [TestTF120Migration.cpp:L46](../../Tests/TestTF120Migration.cpp#L46) | | -| `authority` | function | Tests | [TestTF120Travel.cpp:L362](../../Tests/TestTF120Travel.cpp#L362) | | -| `authority` | function | Tests | [TestTF120Travel.cpp:L430](../../Tests/TestTF120Travel.cpp#L430) | | +| `authority` | function | Tests | [TestTF120Travel.cpp:L349](../../Tests/TestTF120Travel.cpp#L349) | | +| `authority` | function | Tests | [TestTF120Travel.cpp:L417](../../Tests/TestTF120Travel.cpp#L417) | | | `AuthorityActive` | function | GameModules | [TFAlertSystem.h:L187](../../GameModules/SparkGameMMOFPS/Source/World/TFAlertSystem.h#L187) | | | `AuthorityLockTarget` | function | GameModules | [TFDatabase.h:L383](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFDatabase.h#L383) | | | `AuthorizationResult` | struct | SparkEngine | [RemoteDebugAccessControl.h:L164](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugAccessControl.h#L164) | | -| `AuthorTerrain` | function | Tests | [TestEditorSubsystemsReal.cpp:L69](../../Tests/TestEditorSubsystemsReal.cpp#L69) | Build a small authored terrain in the editor: heights, a bound texture layer, a detail mesh. | +| `AuthorTerrain` | function | Tests | [TestEditorSubsystemsReal.cpp:L92](../../Tests/TestEditorSubsystemsReal.cpp#L92) | Build a small authored terrain in the editor: heights, a bound texture layer, a detail mesh. | | `AuthResult` | struct | GameModules | [MMOAccountSystem.h:L94](../../GameModules/SparkGameMMO/Source/Account/MMOAccountSystem.h#L94) | Result of a login or registration attempt | | `AutoComplete` | function | SparkEngine | [InGameConsole.h:L411](../../SparkEngine/Source/Utils/InGameConsole.h#L411) | | | `AutoDiscoverCodeRegions` | function | SparkEngine | [MemoryIntegrity.h:L223](../../SparkEngine/Source/Engine/Security/MemoryIntegrity.h#L223) | | @@ -2676,11 +2684,11 @@ | `AxisIntersectResult` | struct | Tests | [TestGizmoMath.cpp:L69](../../Tests/TestGizmoMath.cpp#L69) | | | `B` | function | GameModules | [RTSPersistenceCodec.cpp:L57](../../GameModules/SparkGameRTS/Source/Core/RTSPersistenceCodec.cpp#L57) | | | `B` | function | GameModules | [RTSPersistenceCodec.cpp:L118](../../GameModules/SparkGameRTS/Source/Core/RTSPersistenceCodec.cpp#L118) | | -| `b` | struct | SparkEngine | [SceneManager.cpp:L405](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L405) | | +| `b` | struct | SparkEngine | [SceneManager.cpp:L449](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L449) | | | `b` | function | Tests | [TestBitFlags.cpp:L86](../../Tests/TestBitFlags.cpp#L86) | | | `b` | function | Tests | [TestEditorSubsystems.cpp:L2896](../../Tests/TestEditorSubsystems.cpp#L2896) | | | `b` | function | Tests | [TestEditorSubsystems.cpp:L2906](../../Tests/TestEditorSubsystems.cpp#L2906) | | -| `b` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L72](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L72) | | +| `b` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L73](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L73) | | | `b` | function | Tests | [TestUUID.cpp:L42](../../Tests/TestUUID.cpp#L42) | | | `b` | function | Tests | [TestUUID.cpp:L54](../../Tests/TestUUID.cpp#L54) | | | `b` | function | Tests | [TestUUID.cpp:L115](../../Tests/TestUUID.cpp#L115) | | @@ -2808,6 +2816,7 @@ | `BeerLambert` | function | SparkEngine | [FogSystem.h:L179](../../SparkEngine/Source/Graphics/FogSystem.h#L179) | | | `before` | struct | SparkAssetPipelineCore | [AssetCooker.cpp:L1229](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L1229) | | | `before` | struct | Tests | [TestCrashHandlerGatingReal.cpp:L457](../../Tests/TestCrashHandlerGatingReal.cpp#L457) | | +| `before` | function | Tests | [TestEditorSubsystemsReal.cpp:L814](../../Tests/TestEditorSubsystemsReal.cpp#L814) | | | `Begin` | function | SparkEngine | [MovieRenderPipeline.h:L158](../../SparkEngine/Source/Engine/Rendering/MovieRenderPipeline.h#L158) | Begin local fixed-time tracking | | `begin` | function | SparkEngine | [EnumUtils.h:L190](../../SparkEngine/Source/Enums/EnumUtils.h#L190) | | | `Begin` | function | SparkEngine | [SpriteBatch.h:L84](../../SparkEngine/Source/Graphics/2D/SpriteBatch.h#L84) | | @@ -2890,6 +2899,7 @@ | `BeginGPUSample` | function | SparkEditor | [PerformanceProfiler.h:L136](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L136) | Begin GPU profiling sample | | `BeginGPUTimer` | function | SparkEngine | [Profiler.h:L223](../../SparkEngine/Source/Utils/Profiler.h#L223) | Begin a GPU timing query | | `BeginHandshake` | function | Tests | [TestNetTransportSecurity.cpp:L166](../../Tests/TestNetTransportSecurity.cpp#L166) | | +| `BeginInputObservation` | function | GameModules | [Game.h:L649](../../GameModules/SparkGameFPS/Source/Game/Game.h#L649) | Process input and translate to game actions | | `BeginLine` | function | SparkEngine | [CrashSymbolication.h:L117](../../SparkEngine/Source/Utils/CrashSymbolication.h#L117) | | | `BeginLoading` | function | SparkEngine | [LoadingScreen.h:L117](../../SparkEngine/Source/Engine/Loading/LoadingScreen.h#L117) | Begin a new loading session. | | `BeginLogin` | function | GameModules | [TFAccountSystem.h:L114](../../GameModules/SparkGameMMOFPS/Source/Account/TFAccountSystem.h#L114) | | @@ -2933,7 +2943,7 @@ | `big` | function | Tests | [TestAdversarialEngine.cpp:L453](../../Tests/TestAdversarialEngine.cpp#L453) | | | `big` | function | Tests | [TestAdversarialEngine.cpp:L1677](../../Tests/TestAdversarialEngine.cpp#L1677) | | | `big` | function | Tests | [TestNetworkStress.cpp:L391](../../Tests/TestNetworkStress.cpp#L391) | | -| `bigData` | function | Tests | [TestSparkPak.cpp:L425](../../Tests/TestSparkPak.cpp#L425) | | +| `bigData` | function | Tests | [TestSparkPak.cpp:L441](../../Tests/TestSparkPak.cpp#L441) | | | `BigEvent` | struct | Tests | [TestAdversarialEngine.cpp:L235](../../Tests/TestAdversarialEngine.cpp#L235) | | | `bigPayload` | function | Tests | [TestAdversarialEngine.cpp:L240](../../Tests/TestAdversarialEngine.cpp#L240) | | | `BigRing` | alias | Tests | [TestLockFreeRingAllocatorReal.cpp:L134](../../Tests/TestLockFreeRingAllocatorReal.cpp#L134) | | @@ -2945,7 +2955,7 @@ | `binary` | function | Tests | [TestDATA120PersistenceReal.cpp:L491](../../Tests/TestDATA120PersistenceReal.cpp#L491) | | | `binary` | function | Tests | [TestPluginABI.cpp:L362](../../Tests/TestPluginABI.cpp#L362) | | | `BinaryOutputMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L187](../../SparkBuild/tests/ProcessRunnerTests.cpp#L187) | | -| `BinaryOutputMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L743](../../SparkBuild/tests/ProcessRunnerTests.cpp#L743) | | +| `BinaryOutputMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L734](../../SparkBuild/tests/ProcessRunnerTests.cpp#L734) | | | `BinaryReader` | class | SparkEngine | [AssetMigration.h:L49](../../SparkEngine/Source/Core/AssetMigration.h#L49) | | | `BinaryReader` | class | SparkEngine | [Serializer.h:L217](../../SparkEngine/Source/Utils/Serializer.h#L217) | Sequential binary deserializer that reads from a byte buffer. | | `BinaryReader` | function | SparkEngine | [Serializer.h:L237](../../SparkEngine/Source/Utils/Serializer.h#L237) | Construct a reader from a `std::vector`. | @@ -3132,8 +3142,8 @@ | `Blue` | function | SparkEngine | [ColorUtils.h:L58](../../SparkEngine/Source/Utils/ColorUtils.h#L58) | | | `Blue` | function | SparkEngine | [DebugDraw.h:L57](../../SparkEngine/Source/Utils/DebugDraw.h#L57) | RGBA color for debug shapes | | `BluishGray` | function | SparkEngine | [FogSystem.h:L70](../../SparkEngine/Source/Graphics/FogSystem.h#L70) | | -| `bmp` | function | Tests | [TestAssetParserHardening.cpp:L288](../../Tests/TestAssetParserHardening.cpp#L288) | | -| `bmp` | function | Tests | [TestThirdPartyIntegration.cpp:L65](../../Tests/TestThirdPartyIntegration.cpp#L65) | | +| `bmp` | function | Tests | [TestAssetParserHardening.cpp:L304](../../Tests/TestAssetParserHardening.cpp#L304) | | +| `bmp` | function | Tests | [TestThirdPartyIntegration.cpp:L81](../../Tests/TestThirdPartyIntegration.cpp#L81) | | | `BMPHeader` | struct | SparkEngine | [RenderTargetWindows.cpp:L341](../../SparkEngine/Source/Graphics/RenderTargetWindows.cpp#L341) | | | `bob` | function | Tests | [TestServerMockClient.cpp:L538](../../Tests/TestServerMockClient.cpp#L538) | | | `bodies` | function | Tests | [TestECSIntegration.cpp:L299](../../Tests/TestECSIntegration.cpp#L299) | | @@ -3260,6 +3270,7 @@ | `bottomUp` | function | Tests | [TestRHI240LinuxForwardPassReal.cpp:L320](../../Tests/TestRHI240LinuxForwardPassReal.cpp#L320) | | | `bottomUp` | function | Tests | [TestRHI240OpenGLGoldenReal.cpp:L186](../../Tests/TestRHI240OpenGLGoldenReal.cpp#L186) | | | `bound` | function | GameModules | [VisualScriptDemoRuntime.h:L154](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoRuntime.h#L154) | | +| `boundary` | function | Tests | [TestSceneManagerReflectedReal.cpp:L239](../../Tests/TestSceneManagerReflectedReal.cpp#L239) | | | `BoundaryHandling` | enum | SparkEditor | [LevelStreamingEnums.h:L127](../../SparkEditor/Source/Enums/LevelStreamingEnums.h#L127) | Tile boundary handling | | `BoundChar` | struct | GameModules | [TFOutfitSystem.h:L189](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L189) | | | `BoundCharOf` | function | GameModules | [TFOutfitSystem.h:L209](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L209) | | @@ -3418,8 +3429,8 @@ | `Buffer` | function | SparkEngine | [MakeDesc.h:L319](../../SparkEngine/Source/Graphics/MakeDesc.h#L319) | Constant buffer descriptor | | `buffer` | function | SparkEngine | [RHIBridge.cpp:L124](../../SparkEngine/Source/Graphics/RHI/RHIBridge.cpp#L124) | | | `buffer` | function | SparkEngine | [TextureSystemWindowsTexture.cpp:L83](../../SparkEngine/Source/Graphics/TextureSystemWindowsTexture.cpp#L83) | | -| `buffer` | function | SparkEngine | [SceneManager.cpp:L256](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L256) | | -| `buffer` | function | SparkEngine | [SceneManager.cpp:L351](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L351) | | +| `buffer` | function | SparkEngine | [SceneManager.cpp:L280](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L280) | | +| `buffer` | function | SparkEngine | [SceneManager.cpp:L391](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L391) | | | `buffer` | function | SparkGateway | [GatewayAreaControl.cpp:L1374](../../SparkGateway/src/GatewayAreaControl.cpp#L1374) | | | `buffer` | function | SparkInstaller | [GitBootstrap.cpp:L110](../../SparkInstaller/src/GitBootstrap.cpp#L110) | | | `buffer` | function | SparkLauncher | [LauncherPaths.cpp:L23](../../SparkLauncher/src/LauncherPaths.cpp#L23) | | @@ -3535,7 +3546,7 @@ | `builder` | function | Tests | [TF120PeerProcess.h:L152](../../Tests/TF120PeerProcess.h#L152) | | | `builder` | function | Tests | [TF120PeerProcess.h:L155](../../Tests/TF120PeerProcess.h#L155) | | | `builder` | function | Tests | [TestCrashHandlerGatingReal.cpp:L412](../../Tests/TestCrashHandlerGatingReal.cpp#L412) | | -| `builder` | function | Tests | [TestEditorCookPackageReal.cpp:L197](../../Tests/TestEditorCookPackageReal.cpp#L197) | | +| `builder` | function | Tests | [TestEditorCookPackageReal.cpp:L199](../../Tests/TestEditorCookPackageReal.cpp#L199) | | | `builder` | function | Tests | [TestFPSLANLoopback.cpp:L155](../../Tests/TestFPSLANLoopback.cpp#L155) | | | `BuildFilteredRgbPng` | function | Tests | [TestGoldenImageTest.cpp:L445](../../Tests/TestGoldenImageTest.cpp#L445) | | | `BuildFromBoneNames` | function | SparkEngine | [AnimationRetargeting.h:L65](../../SparkEngine/Source/Engine/Animation/AnimationRetargeting.h#L65) | | @@ -3723,6 +3734,7 @@ | `bytes` | function | SparkLauncher | [LauncherProcess.cpp:L535](../../SparkLauncher/src/LauncherProcess.cpp#L535) | | | `bytes` | function | Tests | [TestAssetMigration.cpp:L325](../../Tests/TestAssetMigration.cpp#L325) | | | `bytes` | function | Tests | [TestFBXImporter.cpp:L28](../../Tests/TestFBXImporter.cpp#L28) | | +| `bytes` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L61](../../Tests/TestFPSOwnedSaveDecode.cpp#L61) | | | `Bytes` | function | Tests | [TestNET100TransportReal.cpp:L40](../../Tests/TestNET100TransportReal.cpp#L40) | | | `Bytes` | function | Tests | [TestSecureTransportWired.cpp:L53](../../Tests/TestSecureTransportWired.cpp#L53) | | | `bytes` | function | Tests | [TestSecureTransportWired.cpp:L701](../../Tests/TestSecureTransportWired.cpp#L701) | | @@ -3941,15 +3953,15 @@ | `CanInstall` | function | GameModules | [TFHandoffParticipant.h:L28](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.h#L28) | Game-thread pawn operations supplied by the live authoritative simulation. | | `CanInstall` | function | GameModules | [TFServerSim.h:L140](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L140) | Game-thread handoff callbacks; the host dispatcher serializes control requests with simulation. | | `CanInstall` | function | Tests | [TestTF120Migration.cpp:L82](../../Tests/TestTF120Migration.cpp#L82) | | -| `CanInstall` | function | Tests | [TestTF120Travel.cpp:L222](../../Tests/TestTF120Travel.cpp#L222) | | -| `CanInstall` | function | Tests | [TestTF120Travel.cpp:L252](../../Tests/TestTF120Travel.cpp#L252) | | +| `CanInstall` | function | Tests | [TestTF120Travel.cpp:L209](../../Tests/TestTF120Travel.cpp#L209) | | +| `CanInstall` | function | Tests | [TestTF120Travel.cpp:L239](../../Tests/TestTF120Travel.cpp#L239) | | | `CanInteract` | function | SparkEngine | [FPSComponents.h:L262](../../SparkEngine/Source/Engine/ECS/Components/FPSComponents.h#L262) | Check if the interaction can be triggered. | | `CanLoad` | function | SparkEditor | [SaveSystemPanel.h:L67](../../SparkEditor/Source/Panels/SaveSystemPanel.h#L67) | Whether a load is possible: at least one enumerated slot plus a live game World. | | `CanMerge` | function | SparkEditor | [VersionControlTypes.h:L239](../../SparkEditor/Source/VersionControl/VersionControlTypes.h#L239) | Check if handler can merge file | | `CanMerge` | function | SparkEditor | [VersionControlTypes.h:L270](../../SparkEditor/Source/VersionControl/VersionControlTypes.h#L270) | Scene merge handler | | `CanMerge` | function | SparkEditor | [VersionControlTypes.h:L283](../../SparkEditor/Source/VersionControl/VersionControlTypes.h#L283) | Material merge handler | | `CanMutateCharacterProfile` | function | GameModules | [TFOnboardingSessionRules.h:L28](../../GameModules/SparkGameMMOFPS/Source/Net/TFOnboardingSessionRules.h#L28) | | -| `CanonicalDirectoryString` | function | SparkEditor | [AssetBrowserPanel.cpp:L57](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L57) | | +| `CanonicalDirectoryString` | function | SparkEditor | [AssetBrowserPanel.cpp:L34](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L34) | | | `CanonicalizeFilesystemPath` | function | SparkEngine | [ProjectAssetPath.cpp:L125](../../SparkEngine/Source/Graphics/ProjectAssetPath.cpp#L125) | | | `CanonicalizeFilesystemPath` | function | SparkEngine | [ProjectAssetPath.h:L29](../../SparkEngine/Source/Graphics/ProjectAssetPath.h#L29) | Canonicalize a UTF-8 filesystem path without requiring its leaf to exist. | | `CanonicalModel` | function | Tests | [TestENG220ObjImportReal.cpp:L188](../../Tests/TestENG220ObjImportReal.cpp#L188) | | @@ -3989,7 +4001,7 @@ | `CanShutdownEngine` | function | SparkEngine | [SparkEngineLinuxInternal.h:L35](../../SparkEngine/Source/Core/SparkEngineLinuxInternal.h#L35) | | | `CanShutdownEngine` | function | SparkEngine | [SparkEngineWindowsInternal.h:L51](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L51) | | | `CanSpawnAt` | function | GameModules | [TFRegionSystem.h:L97](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.h#L97) | | -| `CanSpawnAt` | function | Tests | [TestTFRegionLattice.cpp:L156](../../Tests/TestTFRegionLattice.cpp#L156) | | +| `CanSpawnAt` | function | Tests | [TestTFRegionLattice.cpp:L149](../../Tests/TestTFRegionLattice.cpp#L149) | | | `CanStart` | function | SparkEngine | [GameplaySystemExtension.h:L75](../../SparkEngine/Source/Engine/Gameplay/GameplaySystemExtension.h#L75) | Check whether the quest can be started in the given context | | `CanStart` | function | Tests | [TestGameplayExtensionRegistry.cpp:L35](../../Tests/TestGameplayExtensionRegistry.cpp#L35) | | | `CanStart` | function | Tests | [TestGameplayExtensionRegistry.cpp:L120](../../Tests/TestGameplayExtensionRegistry.cpp#L120) | | @@ -4032,8 +4044,8 @@ | `capture` | function | Tests | [TestMetalRayTracingLive.mm:L334](../../Tests/TestMetalRayTracingLive.mm#L334) | | | `Capture` | function | Tests | [TestRHI210D3D11DeferredResolveReal.cpp:L76](../../Tests/TestRHI210D3D11DeferredResolveReal.cpp#L76) | | | `Capture` | function | Tests | [TestTF120Migration.cpp:L65](../../Tests/TestTF120Migration.cpp#L65) | | -| `Capture` | function | Tests | [TestTF120Travel.cpp:L206](../../Tests/TestTF120Travel.cpp#L206) | | -| `Capture` | function | Tests | [TestTF120Travel.cpp:L250](../../Tests/TestTF120Travel.cpp#L250) | | +| `Capture` | function | Tests | [TestTF120Travel.cpp:L193](../../Tests/TestTF120Travel.cpp#L193) | | +| `Capture` | function | Tests | [TestTF120Travel.cpp:L237](../../Tests/TestTF120Travel.cpp#L237) | | | `Capture` | function | Tests | [TestTelemetrySpool.cpp:L62](../../Tests/TestTelemetrySpool.cpp#L62) | | | `CaptureAuthoredScene` | function | Templates | [GameModule.h:L263](../../Templates/PlatformerKit/Source/GameModule.h#L263) | | | `CaptureAuthoredScene` | function | Templates | [GameModule.h:L435](../../Templates/RPGStarter/Source/GameModule.h#L435) | | @@ -4058,7 +4070,7 @@ | `CaptureHud` | function | Tests | [TestMOD330ARPGDungeonReal.cpp:L570](../../Tests/TestMOD330ARPGDungeonReal.cpp#L570) | | | `CaptureLocalProfile` | function | GameModules | [Game.h:L414](../../GameModules/SparkGameFPS/Source/Game/Game.h#L414) | Snapshot the declared local profile (progression, class, loadout, score). | | `CaptureMode` | enum | SparkEditor | [ProfilerEnums.h:L105](../../SparkEditor/Source/Enums/ProfilerEnums.h#L105) | Profiler capture modes | -| `CaptureMouse` | function | SparkEngine | [InputManager.h:L258](../../SparkEngine/Source/Input/InputManager.h#L258) | Capture or release the mouse cursor | +| `CaptureMouse` | function | SparkEngine | [InputManager.h:L265](../../SparkEngine/Source/Input/InputManager.h#L265) | Capture or release the mouse cursor | | `capturePath` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L325](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L325) | | | `capturePath` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L378](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L378) | | | `capturePath` | function | SparkCrashReporter | [CrashReporterManifestTests.cpp:L710](../../SparkCrashReporter/tests/CrashReporterManifestTests.cpp#L710) | | @@ -4092,15 +4104,15 @@ | `CaptureSnapshot` | function | GameModules | [OWEngineSystems.h:L68](../../GameModules/SparkGameOpenWorld/Source/Core/OWEngineSystems.h#L68) | | | `CaptureSnapshot` | function | SparkEngine | [FrameInspector.h:L294](../../SparkEngine/Source/Utils/FrameInspector.h#L294) | Capture a snapshot of current state | | `CaptureSpawnState` | function | Templates | [GameModule.h:L785](../../Templates/FPSStarter/Source/GameModule.h#L785) | | -| `CaptureStackTraceString` | function | SparkEngine | [CrashHandler.cpp:L1635](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1635) | | -| `CaptureStackTraceString` | function | SparkEngine | [CrashHandler.cpp:L2763](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2763) | | +| `CaptureStackTraceString` | function | SparkEngine | [CrashHandler.cpp:L1636](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1636) | | +| `CaptureStackTraceString` | function | SparkEngine | [CrashHandler.cpp:L2809](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2809) | | | `CaptureState` | function | GameModules | [RPGNPCSystem.h:L174](../../GameModules/SparkGameRPG/Source/NPC/RPGNPCSystem.h#L174) | Capture the world clock and every NPC's mutable state, sorted by NPC id | | `CaptureState` | function | GameModules | [RTSMatchSystem.h:L77](../../GameModules/SparkGameRTS/Source/Match/RTSMatchSystem.h#L77) | | | `CaptureState` | function | GameModules | [RacingRaceManager.h:L140](../../GameModules/SparkGameRacing/Source/Race/RacingRaceManager.h#L140) | | | `CaptureStderr` | function | SparkEngine | [Process.h:L76](../../SparkEngine/Source/Utils/Process.h#L76) | | | `CaptureStdin` | function | SparkEngine | [Process.h:L85](../../SparkEngine/Source/Utils/Process.h#L85) | | | `CaptureStdout` | function | SparkEngine | [Process.h:L73](../../SparkEngine/Source/Utils/Process.h#L73) | | -| `CaptureSymbolicFrames` | function | SparkEngine | [CrashHandler.cpp:L1906](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1906) | | +| `CaptureSymbolicFrames` | function | SparkEngine | [CrashHandler.cpp:L1907](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1907) | | | `CaptureTestDirectory` | function | Tests | [TestScreenCapture.cpp:L11](../../Tests/TestScreenCapture.cpp#L11) | | | `CaptureTrace` | function | Tests | [TestENG200ScriptBindingsReal.cpp:L47](../../Tests/TestENG200ScriptBindingsReal.cpp#L47) | | | `CaptureTrace` | function | Tests | [TestENG200ScriptHotReloadReal.cpp:L36](../../Tests/TestENG200ScriptHotReloadReal.cpp#L36) | | @@ -4113,7 +4125,7 @@ | `Case` | struct | SparkCrashReporter | [CrashReporterConsentTests.cpp:L385](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L385) | | | `Case` | struct | Tests | [TestCoverageScripting.cpp:L271](../../Tests/TestCoverageScripting.cpp#L271) | | | `Case` | struct | Tests | [TestEditorAssetDropWorldReal.cpp:L222](../../Tests/TestEditorAssetDropWorldReal.cpp#L222) | | -| `Case` | struct | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L260](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L260) | | +| `Case` | struct | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L261](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L261) | | | `Case` | struct | Tests | [TestModuleABI.cpp:L1189](../../Tests/TestModuleABI.cpp#L1189) | | | `Case` | struct | Tests | [TestSDK240ModuleDiagnostics.cpp:L151](../../Tests/TestSDK240ModuleDiagnostics.cpp#L151) | | | `CaseInsensitiveEqual` | function | SparkEngine | [AnimationRetargeting.h:L183](../../SparkEngine/Source/Engine/Animation/AnimationRetargeting.h#L183) | | @@ -4367,7 +4379,7 @@ | `CheckpointGate` | struct | GameModules | [RacingTrackSystem.h:L248](../../GameModules/SparkGameRacing/Source/Track/RacingTrackSystem.h#L248) | | | `CheckpointPersistenceBeforeTeardown` | function | GameModules | [TFShutdownOrder.h:L7](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFShutdownOrder.h#L7) | Pins the data-loss-sensitive shutdown dependency. | | `CheckpointProgress` | struct | GameModules | [PlatformerCheckpointSystem.h:L39](../../GameModules/SparkGamePlatformer/Source/Checkpoint/PlatformerCheckpointSystem.h#L39) | Persistent checkpoint state: which flags are raised and which one respawns the player | -| `CheckProjectDocument` | function | SparkEditor | [ProjectDocument.cpp:L394](../../SparkEditor/Source/Core/ProjectDocument.cpp#L394) | | +| `CheckProjectDocument` | function | SparkEditor | [ProjectDocument.cpp:L395](../../SparkEditor/Source/Core/ProjectDocument.cpp#L395) | | | `CheckProjectDocument` | function | SparkEditor | [ProjectDocument.h:L72](../../SparkEditor/Source/Core/ProjectDocument.h#L72) | Structural and version gate for a project document. | | `CheckRegularFile` | function | SparkEngine | [NetworkTrustStore.cpp:L108](../../SparkEngine/Source/Engine/Networking/NetworkTrustStore.cpp#L108) | | | `CheckSavior` | function | GameModules | [TFMedalSystem.h:L252](../../GameModules/SparkGameMMOFPS/Source/Game/TFMedalSystem.h#L252) | | @@ -4389,14 +4401,14 @@ | `ChildCount` | function | Tests | [TestAIStress.cpp:L86](../../Tests/TestAIStress.cpp#L86) | | | `ChildCount` | function | Tests | [TestAIStress.cpp:L108](../../Tests/TestAIStress.cpp#L108) | | | `ChildDescriptors` | struct | SparkBuild | [Downloader.cpp:L265](../../SparkBuild/src/Downloader.cpp#L265) | | -| `ChildDirectories` | function | SparkEditor | [AssetBrowserPanel.cpp:L91](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L91) | | +| `ChildDirectories` | function | SparkEditor | [AssetBrowserPanel.cpp:L68](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L68) | | | `ChildrenOf` | function | Tests | [TestEditorUndoHierarchyReal.cpp:L32](../../Tests/TestEditorUndoHierarchyReal.cpp#L32) | | | `ChromaticAberrationSettings` | struct | SparkEngine | [PostProcessingTypes.h:L131](../../SparkEngine/Source/Graphics/PostProcessingTypes.h#L131) | Chromatic aberration settings | | `ChromeTracing` | class | SparkEngine | [ChromeTracing.h:L41](../../SparkEngine/Source/Utils/ChromeTracing.h#L41) | | | `chunk` | function | SparkEngine | [ReflectedScenePersistence.cpp:L68](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L68) | | | `chunk` | function | SparkEngine | [GoldenImagePng.h:L215](../../SparkEngine/Source/Utils/GoldenImagePng.h#L215) | | | `chunk` | function | SparkEngine | [SaveFileDurability.cpp:L424](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L424) | | -| `Cindral` | function | Tests | [TestTF120Travel.cpp:L133](../../Tests/TestTF120Travel.cpp#L133) | | +| `Cindral` | function | Tests | [TestTF120Travel.cpp:L120](../../Tests/TestTF120Travel.cpp#L120) | | | `CinematicKeyframe` | struct | SparkEditor | [CinematicSequencerPanel.h:L18](../../SparkEditor/Source/Panels/CinematicSequencerPanel.h#L18) | Keyframe data for a single property at a point in time | | `CinematicSequence` | struct | SparkEditor | [CinematicSequencerPanel.h:L41](../../SparkEditor/Source/Panels/CinematicSequencerPanel.h#L41) | A complete cinematic sequence with tracks and metadata | | `CinematicSequencerPanel` | class | SparkEditor | [CinematicSequencerPanel.h:L55](../../SparkEditor/Source/Panels/CinematicSequencerPanel.h#L55) | Panel for authoring cinematic sequences (cutscenes, cameras, events) | @@ -4461,7 +4473,7 @@ | `ClassLoadout` | struct | GameModules | [ClassSystem.h:L48](../../GameModules/SparkGameFPS/Source/Game/ClassSystem.h#L48) | Full class loadout (weapons + equipment) | | `ClassName` | function | GameModules | [TFCommands.cpp:L140](../../GameModules/SparkGameMMOFPS/Source/Console/TFCommands.cpp#L140) | | | `className` | function | GameModules | [VisualScriptDemoWorld.cpp:L155](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.cpp#L155) | | -| `className` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L147](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L147) | | +| `className` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L148](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L148) | | | `ClassShortTag` | function | GameModules | [TFScoreboard.cpp:L257](../../GameModules/SparkGameMMOFPS/Source/UI/TFScoreboard.cpp#L257) | | | `ClassSystem` | class | GameModules | [ClassSystem.h:L152](../../GameModules/SparkGameFPS/Source/Game/ClassSystem.h#L152) | Main class system manager | | `ClassSystem::ActivatePrimaryAbility` | method | GameModules | [ClassSystem.cpp:L449](../../GameModules/SparkGameFPS/Source/Game/ClassSystem.cpp#L449) | | @@ -4510,7 +4522,7 @@ | `Cleanup` | struct | Tests | [TestLIFE200ModuleReloadReal.cpp:L407](../../Tests/TestLIFE200ModuleReloadReal.cpp#L407) | | | `Cleanup` | struct | Tests | [TestSEC2RenderingHardeningReal.cpp:L174](../../Tests/TestSEC2RenderingHardeningReal.cpp#L174) | | | `Cleanup` | function | Tests | [TestSequencerAudioWiring.cpp:L78](../../Tests/TestSequencerAudioWiring.cpp#L78) | | -| `Cleanup` | function | Tests | [TestSparkPak.cpp:L265](../../Tests/TestSparkPak.cpp#L265) | | +| `Cleanup` | function | Tests | [TestSparkPak.cpp:L281](../../Tests/TestSparkPak.cpp#L281) | | | `CleanupCacheTestDir` | function | Tests | [TestLocalFileCache.cpp:L14](../../Tests/TestLocalFileCache.cpp#L14) | | | `CleanupDir` | function | Tests | [TestGamePackager.cpp:L21](../../Tests/TestGamePackager.cpp#L21) | | | `CleanupFinished` | function | GameModules | [QuestSystem.h:L381](../../GameModules/SparkGameFPS/Source/Game/QuestSystem.h#L381) | Remove completed and failed quests from the active list | @@ -4522,9 +4534,10 @@ | `CleanupScriptInstance` | function | SparkEngine | [AngelScriptEngine.h:L714](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L714) | Release all resources held by a script instance | | `CleanupTempDir` | function | Tests | [TestFileWatcher.cpp:L18](../../Tests/TestFileWatcher.cpp#L18) | | | `CleanupTempShaderDir` | function | Tests | [TestShaderHotReload.cpp:L38](../../Tests/TestShaderHotReload.cpp#L38) | | -| `Clear` | function | GameModules | [FPSWeatherIntegration.h:L39](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L39) | | +| `Clear` | function | GameModules | [FPSWeatherIntegration.h:L41](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L41) | | | `Clear` | function | GameModules | [InventorySystem.h:L356](../../GameModules/SparkGameFPS/Source/Game/InventorySystem.h#L356) | Clear the entire inventory | | `Clear` | function | GameModules | [TFEvents.h:L132](../../GameModules/SparkGameMMOFPS/Source/Core/TFEvents.h#L132) | | +| `Clear` | function | GameModules | [TFReplicationRefresh.h:L41](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L41) | | | `Clear` | function | GameModules | [TFScramWire.h:L72](../../GameModules/SparkGameMMOFPS/Source/Net/TFScramWire.h#L72) | | | `Clear` | function | GameModules | [TFPlayerMeta.h:L105](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFPlayerMeta.h#L105) | | | `Clear` | function | SparkEditor | [CommandHistory.h:L162](../../SparkEditor/Source/CommandHistory.h#L162) | Clear all history (e.g., when opening a new scene). | @@ -4575,7 +4588,7 @@ | `Clear` | function | SparkEngine | [TemporalTypes.h:L254](../../SparkEngine/Source/Graphics/TemporalTypes.h#L254) | Clear all stored history | | `Clear` | function | SparkEngine | [VoxelConeTracing.h:L107](../../SparkEngine/Source/Graphics/VoxelConeTracing.h#L107) | | | `Clear` | function | SparkEngine | [PhysicsDebugRenderer.h:L63](../../SparkEngine/Source/Physics/PhysicsDebugRenderer.h#L63) | Clear all collected debug data. | -| `Clear` | function | SparkEngine | [SceneManager.h:L345](../../SparkEngine/Source/SceneManager/SceneManager.h#L345) | Destroy all GameObjects and clear the node list without resetting metadata. | +| `Clear` | function | SparkEngine | [SceneManager.h:L347](../../SparkEngine/Source/SceneManager/SceneManager.h#L347) | Destroy all GameObjects and clear the node list without resetting metadata. | | `Clear` | function | SparkEngine | [BitFlags.h:L117](../../SparkEngine/Source/Utils/BitFlags.h#L117) | Clear one or more flags. | | `Clear` | function | SparkEngine | [ChromeTracing.h:L149](../../SparkEngine/Source/Utils/ChromeTracing.h#L149) | | | `Clear` | function | SparkEngine | [ColorUtils.h:L64](../../SparkEngine/Source/Utils/ColorUtils.h#L64) | | @@ -4728,7 +4741,7 @@ | `clearPrepared` | function | GameModules | [TFCrypto.cpp:L133](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.cpp#L133) | | | `clearPrepared` | function | GameModules | [TFCrypto.cpp:L153](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.cpp#L153) | | | `ClearProfilingData` | function | SparkEditor | [PerformanceProfiler.h:L249](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L249) | Clear all profiling data | -| `ClearProject` | function | SparkEditor | [AssetBrowserPanel.h:L81](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L81) | Forget the active project and every path/selection derived from it. | +| `ClearProject` | function | SparkEditor | [AssetBrowserPanel.h:L82](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L82) | Forget the active project and every path/selection derived from it. | | `ClearRecentProjects` | function | SparkEditor | [ProjectManager.h:L182](../../SparkEditor/Source/Core/ProjectManager.h#L182) | | | `ClearReferences` | function | SparkEngine | [TemplateRuntime.h:L440](../../SparkEngine/Source/Game/TemplateRuntime.h#L440) | | | `ClearRenderTarget` | function | SparkEngine | [D3D11Device.h:L257](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L257) | | @@ -4812,7 +4825,7 @@ | `client` | function | Tests | [TestServerMockClient.cpp:L1166](../../Tests/TestServerMockClient.cpp#L1166) | | | `client` | function | Tests | [TestServerMockClient.cpp:L1179](../../Tests/TestServerMockClient.cpp#L1179) | | | `client` | function | Tests | [TestServerMockClient.cpp:L1207](../../Tests/TestServerMockClient.cpp#L1207) | | -| `ClientActive` | function | GameModules | [TFReplication.h:L105](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L105) | | +| `ClientActive` | function | GameModules | [TFReplication.h:L109](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L109) | | | `ClientAdvance` | function | GameModules | [TFGrenadeSystem.h:L253](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L253) | | | `ClientAdvance` | function | GameModules | [TFPingSystem.h:L258](../../GameModules/SparkGameMMOFPS/Source/Game/TFPingSystem.h#L258) | | | `ClientAdvanceSmoke` | function | GameModules | [TFGrenadeSystem.h:L236](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L236) | | @@ -4822,7 +4835,7 @@ | `ClientDropMirror` | function | GameModules | [TFVehicleSystem.h:L242](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L242) | | | `ClientEnsureHandlers` | function | GameModules | [TFDeployableSystem.h:L214](../../GameModules/SparkGameMMOFPS/Source/Game/TFDeployableSystem.h#L214) | | | `ClientEnsureHandlers` | function | GameModules | [TFVehicleSystem.h:L231](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L231) | | -| `ClientEnsureHandlers` | function | GameModules | [TFReplication.h:L106](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L106) | | +| `ClientEnsureHandlers` | function | GameModules | [TFReplication.h:L110](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L110) | | | `ClientEnsureHandlers` | function | GameModules | [TFDirectivePanel.h:L120](../../GameModules/SparkGameMMOFPS/Source/UI/TFDirectivePanel.h#L120) | | | `ClientEnsureNetHandlers` | function | GameModules | [TFTravelSystem.h:L185](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L185) | | | `ClientGrenade` | struct | GameModules | [TFGrenadeSystem.h:L188](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L188) | | @@ -4906,7 +4919,7 @@ | `ClientRecord` | struct | Tests | [TestServerMockClient.cpp:L167](../../Tests/TestServerMockClient.cpp#L167) | | | `ClientReleaseHandlers` | function | GameModules | [TFDeployableSystem.h:L215](../../GameModules/SparkGameMMOFPS/Source/Game/TFDeployableSystem.h#L215) | | | `ClientReleaseHandlers` | function | GameModules | [TFVehicleSystem.h:L232](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L232) | | -| `ClientReleaseHandlers` | function | GameModules | [TFReplication.h:L107](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L107) | | +| `ClientReleaseHandlers` | function | GameModules | [TFReplication.h:L111](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L111) | | | `ClientReleaseHandlers` | function | GameModules | [TFDirectivePanel.h:L121](../../GameModules/SparkGameMMOFPS/Source/UI/TFDirectivePanel.h#L121) | | | `ClientReleaseNetHandlers` | function | GameModules | [TFTravelSystem.h:L186](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L186) | | | `ClientRequestAccept` | function | GameModules | [TFOutfitSystem.h:L120](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L120) | | @@ -5256,7 +5269,7 @@ | `CollectBodyIds` | function | SparkEngine | [PhysicsSystem.cpp:L515](../../SparkEngine/Source/Physics/PhysicsSystem.cpp#L515) | | | `CollectCoin` | function | Templates | [GameModule.h:L142](../../Templates/PlatformerKit/Source/GameModule.h#L142) | | | `CollectCoin` | function | Tests | [TestMOD390VisualScriptHotReloadReal.cpp:L142](../../Tests/TestMOD390VisualScriptHotReloadReal.cpp#L142) | | -| `CollectCrashModuleIdentity` | function | SparkEngine | [CrashHandler.cpp:L1847](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1847) | | +| `CollectCrashModuleIdentity` | function | SparkEngine | [CrashHandler.cpp:L1848](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1848) | | | `CollectDataFiles` | function | SparkEngine | [GamePackager.h:L474](../../SparkEngine/Source/Engine/Build/GamePackager.h#L474) | | | `CollectDirectory` | function | SparkEngine | [GamePackager.h:L480](../../SparkEngine/Source/Engine/Build/GamePackager.h#L480) | | | `CollectDrop` | function | GameModules | [LootSystem.h:L153](../../GameModules/SparkGameFPS/Source/Game/LootSystem.h#L153) | | @@ -5458,7 +5471,7 @@ | `CommandResult` | struct | SparkEditor | [SparkEngineIntegration.h:L156](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L156) | Command execution result | | `CommandResult` | function | Tests | [TestSparkGameShowcase.cpp:L220](../../Tests/TestSparkGameShowcase.cpp#L220) | | | `CommandResult` | function | Tests | [TestSparkGameShowcase.cpp:L634](../../Tests/TestSparkGameShowcase.cpp#L634) | | -| `commFile` | function | SparkEngine | [CrashHandler.cpp:L1773](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1773) | | +| `commFile` | function | SparkEngine | [CrashHandler.cpp:L1774](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1774) | | | `Commit` | function | GameModules | [TFHandoffParticipant.h:L40](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.h#L40) | | | `Commit` | function | SparkEditor | [VersionControlSystem.h:L148](../../SparkEditor/Source/VersionControl/VersionControlSystem.h#L148) | Commit staged changes | | `Commit` | function | Tests | [TestEDT210InspectorEditCommitReal.cpp:L100](../../Tests/TestEDT210InspectorEditCommitReal.cpp#L100) | | @@ -5537,8 +5550,8 @@ | `CompileComputeShader` | function | SparkEngine | [UpscalingSystemWindows.cpp:L265](../../SparkEngine/Source/Graphics/UpscalingSystemWindows.cpp#L265) | | | `CompileCSFromFile` | function | SparkEngine | [GPUParticleSystemWindows.cpp:L40](../../SparkEngine/Source/Graphics/GPUParticleSystemWindows.cpp#L40) | | | `CompileCullShader` | function | Tests | [TestGPUDrivenRendererD3D11.cpp:L46](../../Tests/TestGPUDrivenRendererD3D11.cpp#L46) | | -| `CompiledGraphRun` | struct | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L554](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L554) | | -| `CompiledGraphRun` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L563](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L563) | | +| `CompiledGraphRun` | struct | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L597](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L597) | | +| `CompiledGraphRun` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L606](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L606) | | | `CompiledShaderBlob` | struct | SparkEngine | [ShaderCrossCompiler.h:L71](../../SparkEngine/Source/Graphics/ShaderCrossCompiler.h#L71) | | | `CompiledVariant` | struct | SparkEngine | [ShaderVariantSystem.h:L113](../../SparkEngine/Source/Graphics/ShaderVariantSystem.h#L113) | | | `CompileEffectShaders` | function | SparkEngine | [PostProcessingPipeline.h:L345](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L345) | | @@ -5622,7 +5635,7 @@ | `ComponentSerializerEntry` | struct | SparkEngine | [SceneSnapshotSerializer.h:L97](../../SparkEngine/Source/Engine/Editor/SceneSnapshotSerializer.h#L97) | Type-erased serialization functions for a single component type. | | `ComponentSerializerRegistry` | class | SparkEngine | [SceneSnapshotSerializer.h:L118](../../SparkEngine/Source/Engine/Editor/SceneSnapshotSerializer.h#L118) | Registry of component serializers | | `ComponentSerializerRegistry` | class | SparkEngine | [SaveSystem.h:L174](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L174) | | -| `ComponentSerializerRegistry` | class | SparkSDK | [IEngineContext.h:L100](../../SparkSDK/Include/Spark/IEngineContext.h#L100) | | +| `ComponentSerializerRegistry` | class | SparkSDK | [IEngineContext.h:L101](../../SparkSDK/Include/Spark/IEngineContext.h#L101) | | | `ComponentSerializerRegistry::Deserialize` | method | SparkEngine | [SaveSystem.cpp:L332](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.cpp#L332) | | | `ComponentSerializerRegistry::GetInstance` | method | SparkEngine | [SaveSystem.cpp:L179](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.cpp#L179) | | | `ComponentSerializerRegistry::GetSerializerOwner` | method | SparkEngine | [SaveSystem.cpp:L282](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.cpp#L282) | | @@ -5678,7 +5691,7 @@ | `CompressedTexture` | struct | SparkEngine | [TextureCompressor.h:L56](../../SparkEngine/Source/Graphics/TextureCompressor.h#L56) | Result of texture compression including all mip levels. | | `CompressedVec3` | struct | Tests | [TestAnimationCompression.cpp:L38](../../Tests/TestAnimationCompression.cpp#L38) | | | `CompressedVectorTrack` | struct | SparkEngine | [AnimationCompression.h:L45](../../SparkEngine/Source/Engine/Animation/AnimationCompression.h#L45) | Compressed track of position/scale keyframes with quantization range. | -| `Compression` | enum | Tests | [TestSparkPak.cpp:L29](../../Tests/TestSparkPak.cpp#L29) | | +| `Compression` | enum | Tests | [TestSparkPak.cpp:L35](../../Tests/TestSparkPak.cpp#L35) | | | `CompressionMethod` | enum | SparkEngine | [CompressionUtils.h:L19](../../SparkEngine/Source/Utils/CompressionUtils.h#L19) | Compression algorithm selection. | | `CompressionOptions` | struct | SparkEngine | [TextureCompressor.h:L45](../../SparkEngine/Source/Graphics/TextureCompressor.h#L45) | Compression quality/speed tradeoff. | | `CompressTexture` | function | SparkEditor | [AdvancedAssetPipeline.h:L109](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L109) | | @@ -5807,7 +5820,7 @@ | `ConditionSet` | struct | SparkEngine | [ConditionSystem.h:L95](../../SparkEngine/Source/Engine/Gameplay/ConditionSystem.h#L95) | | | `ConditionSet` | struct | Tests | [TestConditionSystem.cpp:L58](../../Tests/TestConditionSystem.cpp#L58) | | | `ConditionSystem` | class | SparkEngine | [ConditionSystem.h:L112](../../SparkEngine/Source/Engine/Gameplay/ConditionSystem.h#L112) | Universal condition evaluator used by all gameplay systems | -| `ConditionSystem` | class | SparkSDK | [IEngineContext.h:L58](../../SparkSDK/Include/Spark/IEngineContext.h#L58) | | +| `ConditionSystem` | class | SparkSDK | [IEngineContext.h:L59](../../SparkSDK/Include/Spark/IEngineContext.h#L59) | | | `ConditionSystem` | class | Tests | [TestConditionSystem.cpp:L67](../../Tests/TestConditionSystem.cpp#L67) | | | `ConditionSystem::Evaluate` | method | SparkEngine | [ConditionSystem.cpp:L55](../../SparkEngine/Source/Engine/Gameplay/ConditionSystem.cpp#L55) | | | `ConditionSystem::EvaluateCondition` | method | SparkEngine | [ConditionSystem.cpp:L73](../../SparkEngine/Source/Engine/Gameplay/ConditionSystem.cpp#L73) | | @@ -5887,8 +5900,8 @@ | `ConfigureAcceptedSocket` | function | SparkGateway | [GatewayAreaControl.cpp:L255](../../SparkGateway/src/GatewayAreaControl.cpp#L255) | | | `ConfigureAndBuild` | function | SparkInstaller | [Installer.cpp:L175](../../SparkInstaller/src/Installer.cpp#L175) | | | `ConfigureController` | function | SparkEditor | [ServiceTopologyPanel.h:L27](../../SparkEditor/Source/Panels/ServiceTopologyPanel.h#L27) | | -| `configuredPrefix` | function | SparkEngine | [CrashHandler.cpp:L511](../../SparkEngine/Source/Utils/CrashHandler.cpp#L511) | | -| `configuredPrefix` | function | SparkEngine | [CrashHandler.cpp:L513](../../SparkEngine/Source/Utils/CrashHandler.cpp#L513) | | +| `configuredPrefix` | function | SparkEngine | [CrashHandler.cpp:L512](../../SparkEngine/Source/Utils/CrashHandler.cpp#L512) | | +| `configuredPrefix` | function | SparkEngine | [CrashHandler.cpp:L514](../../SparkEngine/Source/Utils/CrashHandler.cpp#L514) | | | `ConfigureExecScriptArgs` | function | SparkEngine | [SparkEngineLinux.cpp:L141](../../SparkEngine/Source/Core/SparkEngineLinux.cpp#L141) | | | `ConfigureIdentity` | function | Tests | [TestVersionControlSystemGitReal.cpp:L62](../../Tests/TestVersionControlSystemGitReal.cpp#L62) | Give the repo a local identity so commits do not depend on the machine's global git config. | | `ConfigureLocalPlayer` | function | GameModules | [MMOPlayerSystem.h:L108](../../GameModules/SparkGameMMO/Source/Player/MMOPlayerSystem.h#L108) | | @@ -5974,7 +5987,7 @@ | `ConsistentGeneration` | function | Tests | [TestSaveInterruptionReal.cpp:L227](../../Tests/TestSaveInterruptionReal.cpp#L227) | | | `ConsistentGeneration` | function | Tests | [TestSaveInterruptionReal.cpp:L280](../../Tests/TestSaveInterruptionReal.cpp#L280) | | | `console` | function | GameModules | [AdvancedConsoleCommands.cpp:L81](../../GameModules/SparkGameFPS/Source/Console/AdvancedConsoleCommands.cpp#L81) | | -| `console` | function | GameModules | [Main.cpp:L397](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L397) | | +| `console` | function | GameModules | [Main.cpp:L400](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L400) | | | `Console_AddZone` | function | GameModules | [GravitySystem.h:L214](../../GameModules/SparkGameFPS/Source/Game/GravitySystem.h#L214) | Create a radial gravity zone (pulls toward center) | | `Console_ApplyForce` | function | SparkEngine | [PhysicsBody.h:L156](../../SparkEngine/Source/Physics/PhysicsBody.h#L156) | | | `Console_ApplyForce` | function | SparkEngine | [PhysicsSystem.h:L476](../../SparkEngine/Source/Physics/PhysicsSystem.h#L476) | | @@ -5982,13 +5995,13 @@ | `Console_ApplyPhysicsSettings` | function | GameModules | [Player.h:L587](../../GameModules/SparkGameFPS/Source/Game/Player.h#L587) | Apply physics settings from console | | `Console_ApplySettings` | function | SparkEngine | [AudioEngine.h:L588](../../SparkEngine/Source/Audio/AudioEngine.h#L588) | Apply audio settings from console | | `Console_ApplySettings` | function | SparkEngine | [GraphicsEngine.h:L728](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L728) | | -| `Console_ApplySettings` | function | SparkEngine | [InputManager.h:L418](../../SparkEngine/Source/Input/InputManager.h#L418) | Apply input settings from console | +| `Console_ApplySettings` | function | SparkEngine | [InputManager.h:L425](../../SparkEngine/Source/Input/InputManager.h#L425) | Apply input settings from console | | `Console_Benchmark` | function | SparkEngine | [GraphicsEngine.h:L716](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L716) | | -| `Console_BindKey` | function | SparkEngine | [InputManager.h:L346](../../SparkEngine/Source/Input/InputManager.h#L346) | Bind a key to an action via console | +| `Console_BindKey` | function | SparkEngine | [InputManager.h:L353](../../SparkEngine/Source/Input/InputManager.h#L353) | Bind a key to an action via console | | `Console_ChangeWeapon` | function | GameModules | [Player.h:L555](../../GameModules/SparkGameFPS/Source/Game/Player.h#L555) | Force weapon change (console integration) | | `Console_ClearCache` | function | SparkEngine | [MaterialSystem.h:L420](../../SparkEngine/Source/Graphics/MaterialSystem.h#L420) | Clear material cache | | `Console_ClearCache` | function | SparkEngine | [Shader.h:L496](../../SparkEngine/Source/Graphics/Shader.h#L496) | Clear shader cache via console | -| `Console_ClearInputStates` | function | SparkEngine | [InputManager.h:L386](../../SparkEngine/Source/Input/InputManager.h#L386) | Clear all input states via console | +| `Console_ClearInputStates` | function | SparkEngine | [InputManager.h:L393](../../SparkEngine/Source/Input/InputManager.h#L393) | Clear all input states via console | | `Console_CreateBody` | function | SparkEngine | [PhysicsSystem.h:L472](../../SparkEngine/Source/Physics/PhysicsSystem.h#L472) | | | `Console_CreateLight` | function | SparkEngine | [LightingSystem.h:L382](../../SparkEngine/Source/Graphics/LightingSystem.h#L382) | Create light via console | | `Console_CreateRenderTarget` | function | SparkEngine | [RenderTarget.h:L318](../../SparkEngine/Source/Graphics/RenderTarget.h#L318) | Create render target via console | @@ -6030,13 +6043,13 @@ | `Console_GetMetrics` | function | SparkEngine | [RenderTarget.h:L298](../../SparkEngine/Source/Graphics/RenderTarget.h#L298) | Get render target metrics | | `Console_GetMetrics` | function | SparkEngine | [Shader.h:L448](../../SparkEngine/Source/Graphics/Shader.h#L448) | Get shader compilation metrics | | `Console_GetMetrics` | function | SparkEngine | [TextureSystem.h:L354](../../SparkEngine/Source/Graphics/TextureSystem.h#L354) | | -| `Console_GetMetrics` | function | SparkEngine | [InputManager.h:L406](../../SparkEngine/Source/Input/InputManager.h#L406) | Get comprehensive input metrics (console integration) | +| `Console_GetMetrics` | function | SparkEngine | [InputManager.h:L413](../../SparkEngine/Source/Input/InputManager.h#L413) | Get comprehensive input metrics (console integration) | | `Console_GetMetrics` | function | SparkEngine | [PhysicsSystem.h:L469](../../SparkEngine/Source/Physics/PhysicsSystem.h#L469) | | | `Console_GetMixerInfo` | function | SparkEngine | [MusicManager.h:L81](../../SparkEngine/Source/Audio/MusicManager.h#L81) | | | `Console_GetNavMeshInfo` | function | SparkEngine | [NavMesh.h:L499](../../SparkEngine/Source/Engine/AI/NavMesh.h#L499) | Get detailed information about a specific NavMesh (console integration). | -| `Console_GetNodeInfo` | function | SparkEngine | [SceneManager.h:L444](../../SparkEngine/Source/SceneManager/SceneManager.h#L444) | Return detailed information about a specific node (console integration). | +| `Console_GetNodeInfo` | function | SparkEngine | [SceneManager.h:L446](../../SparkEngine/Source/SceneManager/SceneManager.h#L446) | Return detailed information about a specific node (console integration). | | `Console_GetPipelineStats` | function | SparkEngine | [RenderPipeline.h:L156](../../SparkEngine/Source/Graphics/RenderPipeline.h#L156) | Get pipeline statistics from the last frame. | -| `Console_GetRecentEvents` | function | SparkEngine | [InputManager.h:L393](../../SparkEngine/Source/Input/InputManager.h#L393) | Get recent input events via console | +| `Console_GetRecentEvents` | function | SparkEngine | [InputManager.h:L400](../../SparkEngine/Source/Input/InputManager.h#L400) | Get recent input events via console | | `Console_GetRenderTargetInfo` | function | SparkEngine | [RenderTarget.h:L308](../../SparkEngine/Source/Graphics/RenderTarget.h#L308) | Get detailed render target information | | `Console_GetReport` | function | SparkEngine | [ConstantBufferDiff.h:L122](../../SparkEngine/Source/Graphics/ConstantBufferDiff.h#L122) | | | `Console_GetReport` | function | SparkEngine | [VulkanDescriptorCache.h:L104](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDescriptorCache.h#L104) | Get diagnostic report. | @@ -6050,7 +6063,7 @@ | `Console_GetScoreboard` | function | GameModules | [GameMechanics.h:L270](../../GameModules/SparkGameFPS/Source/Game/GameMechanics.h#L270) | Register a kill for scoring | | `Console_GetSequenceInfo` | function | SparkEngine | [Sequencer.h:L377](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L377) | Deliver queued cues to the attached audio service exactly once. | | `Console_GetSettings` | function | SparkEngine | [AudioEngine.h:L582](../../SparkEngine/Source/Audio/AudioEngine.h#L582) | Get current audio settings (console integration) | -| `Console_GetSettings` | function | SparkEngine | [InputManager.h:L412](../../SparkEngine/Source/Input/InputManager.h#L412) | Get current input settings (console integration) | +| `Console_GetSettings` | function | SparkEngine | [InputManager.h:L419](../../SparkEngine/Source/Input/InputManager.h#L419) | Get current input settings (console integration) | | `Console_GetShaderInfo` | function | SparkEngine | [Shader.h:L479](../../SparkEngine/Source/Graphics/Shader.h#L479) | Get detailed shader information via console | | `Console_GetSourceInfo` | function | SparkEngine | [AudioEngine.h:L658](../../SparkEngine/Source/Audio/AudioEngine.h#L658) | Get audio source information via console | | `Console_GetState` | function | GameModules | [Player.h:L563](../../GameModules/SparkGameFPS/Source/Game/Player.h#L563) | Get complete player state (console integration) | @@ -6186,7 +6199,7 @@ | `Console_GetTextureMemoryInfo` | function | SparkEngine | [MaterialSystem.h:L435](../../SparkEngine/Source/Graphics/MaterialSystem.h#L435) | Get texture memory usage | | `Console_GetVRAMUsage` | function | SparkEngine | [GraphicsEngine.h:L732](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L732) | | | `Console_GiveAmmo` | function | GameModules | [Player.h:L549](../../GameModules/SparkGameFPS/Source/Game/Player.h#L549) | Give ammunition to current weapon (console integration) | -| `Console_IsActionActive` | function | SparkEngine | [InputManager.h:L400](../../SparkEngine/Source/Input/InputManager.h#L400) | Check if a specific action is currently active via console | +| `Console_IsActionActive` | function | SparkEngine | [InputManager.h:L407](../../SparkEngine/Source/Input/InputManager.h#L407) | Check if a specific action is currently active via console | | `Console_ListAgents` | function | SparkEngine | [AISystem.h:L343](../../SparkEngine/Source/Engine/AI/AISystem.h#L343) | Return a formatted list of all active AI agents (console integration). | | `Console_ListAnimations` | function | SparkEngine | [AnimationSystem.h:L445](../../SparkEngine/Source/Engine/Animation/AnimationSystem.h#L445) | List all registered clip names (console integration). | | `Console_ListAssets` | function | SparkEngine | [AssetIntegration.h:L220](../../SparkEngine/Source/Core/AssetIntegration.h#L220) | Console integration: list all registered assets. | @@ -6197,7 +6210,7 @@ | `Console_ListClients` | function | SparkEngine | [NetworkManager.h:L891](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L891) | | | `Console_ListEffects` | function | SparkEngine | [PostProcessingPipeline.h:L229](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L229) | | | `Console_ListEmitters` | function | SparkEngine | [ParticleSystem.h:L255](../../SparkEngine/Source/Graphics/ParticleSystem.h#L255) | | -| `Console_ListKeyBindings` | function | SparkEngine | [InputManager.h:L358](../../SparkEngine/Source/Input/InputManager.h#L358) | Get list of current key bindings via console | +| `Console_ListKeyBindings` | function | SparkEngine | [InputManager.h:L365](../../SparkEngine/Source/Input/InputManager.h#L365) | Get list of current key bindings via console | | `Console_ListKeys` | function | SparkEngine | [LocalizationSystem.h:L192](../../SparkEngine/Source/Engine/Localization/LocalizationSystem.h#L192) | List all keys for the current language (console integration). | | `Console_ListLights` | function | SparkEngine | [LightingSystem.h:L372](../../SparkEngine/Source/Graphics/LightingSystem.h#L372) | List all lights | | `Console_ListLODChains` | function | SparkEngine | [MeshLOD.h:L146](../../SparkEngine/Source/Graphics/MeshLOD.h#L146) | | @@ -6205,7 +6218,7 @@ | `Console_ListMaterialVariants` | function | SparkEngine | [MaterialSystem.h:L460](../../SparkEngine/Source/Graphics/MaterialSystem.h#L460) | List material variants | | `Console_ListMods` | function | SparkEngine | [ModSystem.h:L208](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L208) | List all mods (console integration). | | `Console_ListNavMeshes` | function | SparkEngine | [NavMesh.h:L491](../../SparkEngine/Source/Engine/AI/NavMesh.h#L491) | List all registered NavMesh names (console integration). | -| `Console_ListNodes` | function | SparkEngine | [SceneManager.h:L433](../../SparkEngine/Source/SceneManager/SceneManager.h#L433) | Return a formatted list of all nodes in the scene (console integration). | +| `Console_ListNodes` | function | SparkEngine | [SceneManager.h:L435](../../SparkEngine/Source/SceneManager/SceneManager.h#L435) | Return a formatted list of all nodes in the scene (console integration). | | `Console_ListObjects` | function | GameModules | [InteractiveObject.h:L496](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L496) | Spawn a destructible object | | `Console_ListObstacles` | function | SparkEngine | [NavMeshObstacles.h:L310](../../SparkEngine/Source/Engine/AI/NavMeshObstacles.h#L310) | List all active obstacles (console integration). | | `Console_ListPlaylists` | function | SparkEngine | [MusicManager.h:L268](../../SparkEngine/Source/Audio/MusicManager.h#L268) | | @@ -6230,20 +6243,20 @@ | `Console_ListZones` | function | GameModules | [GravitySystem.h:L213](../../GameModules/SparkGameFPS/Source/Game/GravitySystem.h#L213) | Create a radial gravity zone (pulls toward center) | | `Console_LoadAsset` | function | SparkEngine | [AssetPipeline.h:L513](../../SparkEngine/Source/Graphics/AssetPipeline.h#L513) | Load asset via console | | `Console_LookAt` | function | SparkEngine | [SparkEngineCamera.h:L360](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L360) | Look at a specific point (console integration) | -| `Console_MoveNode` | function | SparkEngine | [SceneManager.h:L458](../../SparkEngine/Source/SceneManager/SceneManager.h#L458) | | +| `Console_MoveNode` | function | SparkEngine | [SceneManager.h:L460](../../SparkEngine/Source/SceneManager/SceneManager.h#L460) | | | `Console_PausePhysics` | function | SparkEngine | [PhysicsSystem.h:L479](../../SparkEngine/Source/Physics/PhysicsSystem.h#L479) | | | `Console_PlayTestSound` | function | SparkEngine | [AudioEngine.h:L553](../../SparkEngine/Source/Audio/AudioEngine.h#L553) | Play a test sound via console | | `Console_PreloadDirectory` | function | SparkEngine | [AssetPipeline.h:L553](../../SparkEngine/Source/Graphics/AssetPipeline.h#L553) | Preload assets from directory | | `Console_Raycast` | function | SparkEngine | [PhysicsSystem.h:L481](../../SparkEngine/Source/Physics/PhysicsSystem.h#L481) | | | `Console_RecompileAll` | function | SparkEngine | [Shader.h:L453](../../SparkEngine/Source/Graphics/Shader.h#L453) | Force recompilation of all shaders via console | | `Console_RefreshAudio` | function | SparkEngine | [AudioEngine.h:L651](../../SparkEngine/Source/Audio/AudioEngine.h#L651) | Force audio system refresh via console | -| `Console_RefreshInput` | function | SparkEngine | [InputManager.h:L434](../../SparkEngine/Source/Input/InputManager.h#L434) | Force input system refresh via console | +| `Console_RefreshInput` | function | SparkEngine | [InputManager.h:L441](../../SparkEngine/Source/Input/InputManager.h#L441) | Force input system refresh via console | | `Console_RegisterStateCallback` | function | GameModules | [Player.h:L569](../../GameModules/SparkGameFPS/Source/Game/Player.h#L569) | Register console state change callback | | `Console_RegisterStateCallback` | function | SparkEngine | [AudioEngine.h:L599](../../SparkEngine/Source/Audio/AudioEngine.h#L599) | Register console state change callback | | `Console_RegisterStateCallback` | function | SparkEngine | [SparkEngineCamera.h:L352](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L352) | Register console state change callback | | `Console_RegisterStateCallback` | function | SparkEngine | [GraphicsEngine.h:L730](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L730) | | | `Console_RegisterStateCallback` | function | SparkEngine | [Shader.h:L485](../../SparkEngine/Source/Graphics/Shader.h#L485) | Register console state change callback | -| `Console_RegisterStateCallback` | function | SparkEngine | [InputManager.h:L429](../../SparkEngine/Source/Input/InputManager.h#L429) | Register console state change callback | +| `Console_RegisterStateCallback` | function | SparkEngine | [InputManager.h:L436](../../SparkEngine/Source/Input/InputManager.h#L436) | Register console state change callback | | `Console_ReloadAllAssets` | function | SparkEngine | [AssetPipeline.h:L558](../../SparkEngine/Source/Graphics/AssetPipeline.h#L558) | Reload all assets | | `Console_ReloadAllTextures` | function | SparkEngine | [TextureSystem.h:L361](../../SparkEngine/Source/Graphics/TextureSystem.h#L361) | | | `Console_ReloadIBL` | function | SparkEngine | [LightingSystem.h:L422](../../SparkEngine/Source/Graphics/LightingSystem.h#L422) | Reload IBL textures | @@ -6251,14 +6264,14 @@ | `Console_ReloadTexture` | function | SparkEngine | [TextureSystem.h:L360](../../SparkEngine/Source/Graphics/TextureSystem.h#L360) | | | `Console_RemoveBody` | function | SparkEngine | [PhysicsSystem.h:L473](../../SparkEngine/Source/Physics/PhysicsSystem.h#L473) | | | `Console_RemoveZone` | function | GameModules | [GravitySystem.h:L216](../../GameModules/SparkGameFPS/Source/Game/GravitySystem.h#L216) | | -| `Console_RenameNode` | function | SparkEngine | [SceneManager.h:L472](../../SparkEngine/Source/SceneManager/SceneManager.h#L472) | | +| `Console_RenameNode` | function | SparkEngine | [SceneManager.h:L474](../../SparkEngine/Source/SceneManager/SceneManager.h#L474) | | | `Console_RenderTargetPoolStatus` | function | SparkEngine | [PostProcessingPipeline.h:L248](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L248) | Console-friendly render-target pool status. | | `Console_Reset` | function | SparkEngine | [PhysicsSystem.h:L483](../../SparkEngine/Source/Physics/PhysicsSystem.h#L483) | | | `Console_ResetDevice` | function | SparkEngine | [GraphicsEngine.h:L726](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L726) | | | `Console_ResetToDefaults` | function | SparkEngine | [AudioEngine.h:L593](../../SparkEngine/Source/Audio/AudioEngine.h#L593) | Reset audio settings to defaults via console | | `Console_ResetToDefaults` | function | SparkEngine | [SparkEngineCamera.h:L340](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L340) | Reset camera to default settings (console integration) | | `Console_ResetToDefaults` | function | SparkEngine | [GraphicsEngine.h:L729](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L729) | | -| `Console_ResetToDefaults` | function | SparkEngine | [InputManager.h:L423](../../SparkEngine/Source/Input/InputManager.h#L423) | Reset input settings to defaults via console | +| `Console_ResetToDefaults` | function | SparkEngine | [InputManager.h:L430](../../SparkEngine/Source/Input/InputManager.h#L430) | Reset input settings to defaults via console | | `Console_ResizeRenderTarget` | function | SparkEngine | [RenderTarget.h:L324](../../SparkEngine/Source/Graphics/RenderTarget.h#L324) | Resize specific render target | | `Console_SaveRenderTarget` | function | SparkEngine | [RenderTarget.h:L313](../../SparkEngine/Source/Graphics/RenderTarget.h#L313) | Save render target to file | | `Console_ScanDirectory` | function | SparkEngine | [AssetPipeline.h:L543](../../SparkEngine/Source/Graphics/AssetPipeline.h#L543) | Scan directory for assets | @@ -6286,9 +6299,9 @@ | `Console_SetHealth` | function | GameModules | [Player.h:L493](../../GameModules/SparkGameFPS/Source/Game/Player.h#L493) | Set player health directly (console integration) | | `Console_SetHotReload` | function | SparkEngine | [Shader.h:L459](../../SparkEngine/Source/Graphics/Shader.h#L459) | Enable/disable hot reloading via console | | `Console_SetInfiniteAmmo` | function | GameModules | [Player.h:L543](../../GameModules/SparkGameFPS/Source/Game/Player.h#L543) | Enable/disable infinite ammo (console integration) | -| `Console_SetInputLogging` | function | SparkEngine | [InputManager.h:L338](../../SparkEngine/Source/Input/InputManager.h#L338) | Enable/disable input logging via console | +| `Console_SetInputLogging` | function | SparkEngine | [InputManager.h:L345](../../SparkEngine/Source/Input/InputManager.h#L345) | Enable/disable input logging via console | | `Console_SetIntensity` | function | SparkEngine | [AIDirector.h:L185](../../SparkEngine/Source/Engine/AI/AIDirector.h#L185) | Set intensity manually (console integration / debugging). | -| `Console_SetInvertMouseY` | function | SparkEngine | [InputManager.h:L326](../../SparkEngine/Source/Input/InputManager.h#L326) | Enable/disable Y-axis inversion via console | +| `Console_SetInvertMouseY` | function | SparkEngine | [InputManager.h:L333](../../SparkEngine/Source/Input/InputManager.h#L333) | Enable/disable Y-axis inversion via console | | `Console_SetInvertY` | function | SparkEngine | [SparkEngineCamera.h:L300](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L300) | Set Y-axis inversion (console integration) | | `Console_SetJumpHeight` | function | GameModules | [Player.h:L517](../../GameModules/SparkGameFPS/Source/Game/Player.h#L517) | Set player jump height (console integration) | | `Console_SetLightColor` | function | SparkEngine | [LightingSystem.h:L397](../../SparkEngine/Source/Graphics/LightingSystem.h#L397) | Set light color via console | @@ -6303,10 +6316,10 @@ | `Console_SetMaxHealth` | function | GameModules | [Player.h:L505](../../GameModules/SparkGameFPS/Source/Game/Player.h#L505) | Set player maximum health (console integration) | | `Console_SetMemoryBudget` | function | SparkEngine | [TextureSystem.h:L358](../../SparkEngine/Source/Graphics/TextureSystem.h#L358) | | | `Console_SetMode` | function | SparkEngine | [UpscalingSystem.h:L485](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L485) | Console command to set upscaling mode by name | -| `Console_SetMouseAcceleration` | function | SparkEngine | [InputManager.h:L320](../../SparkEngine/Source/Input/InputManager.h#L320) | Enable/disable mouse acceleration via console | -| `Console_SetMouseDeadZone` | function | SparkEngine | [InputManager.h:L314](../../SparkEngine/Source/Input/InputManager.h#L314) | Set mouse dead zone via console | +| `Console_SetMouseAcceleration` | function | SparkEngine | [InputManager.h:L327](../../SparkEngine/Source/Input/InputManager.h#L327) | Enable/disable mouse acceleration via console | +| `Console_SetMouseDeadZone` | function | SparkEngine | [InputManager.h:L321](../../SparkEngine/Source/Input/InputManager.h#L321) | Set mouse dead zone via console | | `Console_SetMouseSensitivity` | function | SparkEngine | [SparkEngineCamera.h:L294](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L294) | Set mouse sensitivity (console integration) | -| `Console_SetMouseSensitivity` | function | SparkEngine | [InputManager.h:L308](../../SparkEngine/Source/Input/InputManager.h#L308) | Set mouse sensitivity via console | +| `Console_SetMouseSensitivity` | function | SparkEngine | [InputManager.h:L315](../../SparkEngine/Source/Input/InputManager.h#L315) | Set mouse sensitivity via console | | `Console_SetMoveSpeed` | function | SparkEngine | [SparkEngineCamera.h:L306](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L306) | Set movement speed (console integration) | | `Console_SetMusicVolume` | function | SparkEngine | [AudioEngine.h:L507](../../SparkEngine/Source/Audio/AudioEngine.h#L507) | Set music volume via console | | `Console_SetNoclip` | function | GameModules | [Player.h:L537](../../GameModules/SparkGameFPS/Source/Game/Player.h#L537) | Enable/disable noclip mode (console integration) | @@ -6319,7 +6332,7 @@ | `Console_SetQuality` | function | SparkEngine | [DXRSupport.h:L242](../../SparkEngine/Source/Graphics/RHI/DXRSupport.h#L242) | | | `Console_SetQuality` | function | SparkEngine | [TextureSystem.h:L357](../../SparkEngine/Source/Graphics/TextureSystem.h#L357) | | | `Console_SetQuality` | function | SparkEngine | [UpscalingSystem.h:L514](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L514) | Console command to set quality preset by name | -| `Console_SetRawMouseInput` | function | SparkEngine | [InputManager.h:L332](../../SparkEngine/Source/Input/InputManager.h#L332) | Enable/disable raw mouse input via console | +| `Console_SetRawMouseInput` | function | SparkEngine | [InputManager.h:L339](../../SparkEngine/Source/Input/InputManager.h#L339) | Enable/disable raw mouse input via console | | `Console_SetRenderingPipeline` | function | SparkEngine | [GraphicsEngine.h:L719](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L719) | | | `Console_SetRenderPath` | function | SparkEngine | [GraphicsEngine.h:L709](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L709) | | | `Console_SetRenderScale` | function | SparkEngine | [GraphicsEngine.h:L723](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L723) | | @@ -6337,7 +6350,7 @@ | `Console_SetVSync` | function | SparkEngine | [GraphicsEngine.h:L718](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L718) | | | `Console_SetWireframe` | function | SparkEngine | [GraphicsEngine.h:L717](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L717) | | | `Console_SetWorldGravity` | function | GameModules | [GravitySystem.h:L217](../../GameModules/SparkGameFPS/Source/Game/GravitySystem.h#L217) | | -| `Console_SimulateKeyPress` | function | SparkEngine | [InputManager.h:L368](../../SparkEngine/Source/Input/InputManager.h#L368) | Simulate a key press via console | +| `Console_SimulateKeyPress` | function | SparkEngine | [InputManager.h:L375](../../SparkEngine/Source/Input/InputManager.h#L375) | Simulate a key press via console | | `Console_SmoothMoveTo` | function | SparkEngine | [SparkEngineCamera.h:L369](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L369) | Smooth transition to position (console integration) | | `Console_SpawnEffect` | function | SparkEngine | [ParticleSystem.h:L257](../../SparkEngine/Source/Graphics/ParticleSystem.h#L257) | | | `Console_SpawnTestDecal` | function | SparkEngine | [DecalSystem.h:L152](../../SparkEngine/Source/Graphics/DecalSystem.h#L152) | | @@ -6345,7 +6358,7 @@ | `Console_StopAllSounds` | function | SparkEngine | [AudioEngine.h:L564](../../SparkEngine/Source/Audio/AudioEngine.h#L564) | Stop all playing sounds via console | | `Console_StopSound` | function | SparkEngine | [AudioEngine.h:L559](../../SparkEngine/Source/Audio/AudioEngine.h#L559) | Stop a specific sound source via console | | `Console_ToggleVisualization` | function | SparkEngine | [RenderTarget.h:L329](../../SparkEngine/Source/Graphics/RenderTarget.h#L329) | Toggle render target visualization | -| `Console_UnbindKey` | function | SparkEngine | [InputManager.h:L352](../../SparkEngine/Source/Input/InputManager.h#L352) | Unbind a key action via console | +| `Console_UnbindKey` | function | SparkEngine | [InputManager.h:L359](../../SparkEngine/Source/Input/InputManager.h#L359) | Unbind a key action via console | | `Console_UnloadAsset` | function | SparkEngine | [AssetPipeline.h:L518](../../SparkEngine/Source/Graphics/AssetPipeline.h#L518) | Unload asset via console | | `Console_UnloadTextureFromSlot` | function | SparkEngine | [MaterialSystem.h:L455](../../SparkEngine/Source/Graphics/MaterialSystem.h#L455) | Unload texture from material slot | | `Console_ValidateMaterials` | function | SparkEngine | [MaterialSystem.h:L440](../../SparkEngine/Source/Graphics/MaterialSystem.h#L440) | Validate all loaded materials | @@ -6353,36 +6366,37 @@ | `Console_ValidateShaders` | function | SparkEngine | [Shader.h:L491](../../SparkEngine/Source/Graphics/Shader.h#L491) | Validate all loaded shaders via console | | `ConsoleApp` | class | SparkConsole | [ConsoleApp.h:L39](../../SparkConsole/src/ConsoleApp.h#L39) | The SparkConsole subprocess application. | | `ConsoleApp` | function | SparkConsole | [ConsoleApp.h:L42](../../SparkConsole/src/ConsoleApp.h#L42) | | -| `ConsoleApp::AddToHistory` | method | SparkConsole | [ConsoleApp.cpp:L1162](../../SparkConsole/src/ConsoleApp.cpp#L1162) | | +| `ConsoleApp::AddToHistory` | method | SparkConsole | [ConsoleApp.cpp:L1166](../../SparkConsole/src/ConsoleApp.cpp#L1166) | | | `ConsoleApp::ClearDisplay` | method | SparkConsole | [ConsoleApp.cpp:L125](../../SparkConsole/src/ConsoleApp.cpp#L125) | | | `ConsoleApp::DetectPipeMode` | method | SparkConsole | [ConsoleApp.cpp:L198](../../SparkConsole/src/ConsoleApp.cpp#L198) | | | `ConsoleApp::DisplayHandle` | method | SparkConsole | [ConsoleApp.cpp:L100](../../SparkConsole/src/ConsoleApp.cpp#L100) | | -| `ConsoleApp::ExecuteCommand` | method | SparkConsole | [ConsoleApp.cpp:L819](../../SparkConsole/src/ConsoleApp.cpp#L819) | | -| `ConsoleApp::HandleBackspaceKey` | method | SparkConsole | [ConsoleApp.cpp:L606](../../SparkConsole/src/ConsoleApp.cpp#L606) | | -| `ConsoleApp::HandlePrintableChar` | method | SparkConsole | [ConsoleApp.cpp:L620](../../SparkConsole/src/ConsoleApp.cpp#L620) | | -| `ConsoleApp::OnEnginePipeClosed` | method | SparkConsole | [ConsoleApp.cpp:L579](../../SparkConsole/src/ConsoleApp.cpp#L579) | | -| `ConsoleApp::PipeKeyboardThreadFunc` | method | SparkConsole | [ConsoleApp.cpp:L292](../../SparkConsole/src/ConsoleApp.cpp#L292) | | -| `ConsoleApp::PollPipeModeInput` | method | SparkConsole | [ConsoleApp.cpp:L218](../../SparkConsole/src/ConsoleApp.cpp#L218) | | -| `ConsoleApp::PollStandaloneInput` | method | SparkConsole | [ConsoleApp.cpp:L253](../../SparkConsole/src/ConsoleApp.cpp#L253) | | -| `ConsoleApp::PollWindowsPipeData` | method | SparkConsole | [ConsoleApp.cpp:L443](../../SparkConsole/src/ConsoleApp.cpp#L443) | | +| `ConsoleApp::ExecuteCommand` | method | SparkConsole | [ConsoleApp.cpp:L823](../../SparkConsole/src/ConsoleApp.cpp#L823) | | +| `ConsoleApp::HandleBackspaceKey` | method | SparkConsole | [ConsoleApp.cpp:L610](../../SparkConsole/src/ConsoleApp.cpp#L610) | | +| `ConsoleApp::HandlePrintableChar` | method | SparkConsole | [ConsoleApp.cpp:L624](../../SparkConsole/src/ConsoleApp.cpp#L624) | | +| `ConsoleApp::OnEnginePipeClosed` | method | SparkConsole | [ConsoleApp.cpp:L583](../../SparkConsole/src/ConsoleApp.cpp#L583) | | +| `ConsoleApp::PipeKeyboardThreadFunc` | method | SparkConsole | [ConsoleApp.cpp:L294](../../SparkConsole/src/ConsoleApp.cpp#L294) | | +| `ConsoleApp::PollPipeModeInput` | method | SparkConsole | [ConsoleApp.cpp:L233](../../SparkConsole/src/ConsoleApp.cpp#L233) | | +| `ConsoleApp::PollStandaloneInput` | method | SparkConsole | [ConsoleApp.cpp:L255](../../SparkConsole/src/ConsoleApp.cpp#L255) | | +| `ConsoleApp::PollWindowsPipeData` | method | SparkConsole | [ConsoleApp.cpp:L447](../../SparkConsole/src/ConsoleApp.cpp#L447) | | | `ConsoleApp::PrintBanner` | method | SparkConsole | [ConsoleApp.cpp:L173](../../SparkConsole/src/ConsoleApp.cpp#L173) | | -| `ConsoleApp::PrintDuplicateSkipNotice` | method | SparkConsole | [ConsoleApp.cpp:L694](../../SparkConsole/src/ConsoleApp.cpp#L694) | | -| `ConsoleApp::PrintEngineLog` | method | SparkConsole | [ConsoleApp.cpp:L717](../../SparkConsole/src/ConsoleApp.cpp#L717) | | -| `ConsoleApp::PrintLog` | method | SparkConsole | [ConsoleApp.cpp:L648](../../SparkConsole/src/ConsoleApp.cpp#L648) | | -| `ConsoleApp::PrintResult` | method | SparkConsole | [ConsoleApp.cpp:L773](../../SparkConsole/src/ConsoleApp.cpp#L773) | | -| `ConsoleApp::ProcessPipeMessages` | method | SparkConsole | [ConsoleApp.cpp:L419](../../SparkConsole/src/ConsoleApp.cpp#L419) | | -| `ConsoleApp::ReadEngineInput` | method | SparkConsole | [ConsoleApp.cpp:L597](../../SparkConsole/src/ConsoleApp.cpp#L597) | | -| `ConsoleApp::ReadEngineInputPosix` | method | SparkConsole | [ConsoleApp.cpp:L527](../../SparkConsole/src/ConsoleApp.cpp#L527) | | -| `ConsoleApp::ReadEngineInputWindows` | method | SparkConsole | [ConsoleApp.cpp:L496](../../SparkConsole/src/ConsoleApp.cpp#L496) | | -| `ConsoleApp::RegisterAliasCommands` | method | SparkConsole | [ConsoleApp.cpp:L1089](../../SparkConsole/src/ConsoleApp.cpp#L1089) | | -| `ConsoleApp::RegisterCoreCommands` | method | SparkConsole | [ConsoleApp.cpp:L848](../../SparkConsole/src/ConsoleApp.cpp#L848) | | -| `ConsoleApp::RegisterDefaultCommands` | method | SparkConsole | [ConsoleApp.cpp:L841](../../SparkConsole/src/ConsoleApp.cpp#L841) | | -| `ConsoleApp::RegisterDiagnosticCommands` | method | SparkConsole | [ConsoleApp.cpp:L938](../../SparkConsole/src/ConsoleApp.cpp#L938) | | -| `ConsoleApp::ResolveAlias` | method | SparkConsole | [ConsoleApp.cpp:L632](../../SparkConsole/src/ConsoleApp.cpp#L632) | | -| `ConsoleApp::Run` | method | SparkConsole | [ConsoleApp.cpp:L357](../../SparkConsole/src/ConsoleApp.cpp#L357) | | -| `ConsoleApp::RunBatch` | method | SparkConsole | [ConsoleApp.cpp:L400](../../SparkConsole/src/ConsoleApp.cpp#L400) | | -| `ConsoleApp::SetConsoleColor` | method | SparkConsole | [ConsoleApp.cpp:L807](../../SparkConsole/src/ConsoleApp.cpp#L807) | | -| `ConsoleApp::SetConsoleColor` | method | SparkConsole | [ConsoleApp.cpp:L812](../../SparkConsole/src/ConsoleApp.cpp#L812) | | +| `ConsoleApp::PrintDuplicateSkipNotice` | method | SparkConsole | [ConsoleApp.cpp:L698](../../SparkConsole/src/ConsoleApp.cpp#L698) | | +| `ConsoleApp::PrintEngineLog` | method | SparkConsole | [ConsoleApp.cpp:L721](../../SparkConsole/src/ConsoleApp.cpp#L721) | | +| `ConsoleApp::PrintLog` | method | SparkConsole | [ConsoleApp.cpp:L652](../../SparkConsole/src/ConsoleApp.cpp#L652) | | +| `ConsoleApp::PrintPipePrompt` | method | SparkConsole | [ConsoleApp.cpp:L218](../../SparkConsole/src/ConsoleApp.cpp#L218) | | +| `ConsoleApp::PrintResult` | method | SparkConsole | [ConsoleApp.cpp:L777](../../SparkConsole/src/ConsoleApp.cpp#L777) | | +| `ConsoleApp::ProcessPipeMessages` | method | SparkConsole | [ConsoleApp.cpp:L423](../../SparkConsole/src/ConsoleApp.cpp#L423) | | +| `ConsoleApp::ReadEngineInput` | method | SparkConsole | [ConsoleApp.cpp:L601](../../SparkConsole/src/ConsoleApp.cpp#L601) | | +| `ConsoleApp::ReadEngineInputPosix` | method | SparkConsole | [ConsoleApp.cpp:L531](../../SparkConsole/src/ConsoleApp.cpp#L531) | | +| `ConsoleApp::ReadEngineInputWindows` | method | SparkConsole | [ConsoleApp.cpp:L500](../../SparkConsole/src/ConsoleApp.cpp#L500) | | +| `ConsoleApp::RegisterAliasCommands` | method | SparkConsole | [ConsoleApp.cpp:L1093](../../SparkConsole/src/ConsoleApp.cpp#L1093) | | +| `ConsoleApp::RegisterCoreCommands` | method | SparkConsole | [ConsoleApp.cpp:L852](../../SparkConsole/src/ConsoleApp.cpp#L852) | | +| `ConsoleApp::RegisterDefaultCommands` | method | SparkConsole | [ConsoleApp.cpp:L845](../../SparkConsole/src/ConsoleApp.cpp#L845) | | +| `ConsoleApp::RegisterDiagnosticCommands` | method | SparkConsole | [ConsoleApp.cpp:L942](../../SparkConsole/src/ConsoleApp.cpp#L942) | | +| `ConsoleApp::ResolveAlias` | method | SparkConsole | [ConsoleApp.cpp:L636](../../SparkConsole/src/ConsoleApp.cpp#L636) | | +| `ConsoleApp::Run` | method | SparkConsole | [ConsoleApp.cpp:L360](../../SparkConsole/src/ConsoleApp.cpp#L360) | | +| `ConsoleApp::RunBatch` | method | SparkConsole | [ConsoleApp.cpp:L404](../../SparkConsole/src/ConsoleApp.cpp#L404) | | +| `ConsoleApp::SetConsoleColor` | method | SparkConsole | [ConsoleApp.cpp:L811](../../SparkConsole/src/ConsoleApp.cpp#L811) | | +| `ConsoleApp::SetConsoleColor` | method | SparkConsole | [ConsoleApp.cpp:L816](../../SparkConsole/src/ConsoleApp.cpp#L816) | | | `ConsoleApp::WriteDisplay` | method | SparkConsole | [ConsoleApp.cpp:L119](../../SparkConsole/src/ConsoleApp.cpp#L119) | | | `ConsoleCommand` | struct | SparkEditor | [ConsolePanel.h:L33](../../SparkEditor/Source/Panels/ConsolePanel.h#L33) | Console command structure | | `ConsoleCommandHandler` | alias | SparkEngine | [InGameConsole.h:L88](../../SparkEngine/Source/Utils/InGameConsole.h#L88) | Console command handler — receives args, returns output string | @@ -6392,7 +6406,7 @@ | `ConsoleLifecycleGuard` | struct | Tests | [TestConsoleProcessPipeReal.cpp:L116](../../Tests/TestConsoleProcessPipeReal.cpp#L116) | | | `ConsoleLifecycleGuard` | function | Tests | [TestConsoleProcessPipeReal.cpp:L122](../../Tests/TestConsoleProcessPipeReal.cpp#L122) | | | `ConsoleLine` | struct | SparkEngine | [InGameConsole.h:L72](../../SparkEngine/Source/Utils/InGameConsole.h#L72) | A single line in the console output | -| `ConsoleLogContains` | function | Tests | [TestFPSMultiplayer.cpp:L1400](../../Tests/TestFPSMultiplayer.cpp#L1400) | | +| `ConsoleLogContains` | function | Tests | [TestFPSMultiplayer.cpp:L1411](../../Tests/TestFPSMultiplayer.cpp#L1411) | | | `ConsoleLogLevel` | enum | SparkEngine | [InGameConsole.h:L62](../../SparkEngine/Source/Utils/InGameConsole.h#L62) | Log level for console messages | | `ConsoleLogTarget` | class | SparkEditor | [EditorLogger.h:L127](../../SparkEditor/Source/Core/EditorLogger.h#L127) | Console output target | | `ConsoleLogTarget::WriteLog` | method | SparkEditor | [EditorLogger.cpp:L18](../../SparkEditor/Source/Core/EditorLogger.cpp#L18) | | @@ -6617,7 +6631,7 @@ | `Consume` | function | Tests | [TestRenderCommandRing.cpp:L49](../../Tests/TestRenderCommandRing.cpp#L49) | | | `ConsumeDedicatedServerRequest` | function | SparkEngine | [PlayModeManager.h:L400](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L400) | Check if a PIE dedicated server was requested and consume the flag. | | `ConsumeProjectSelectorChoice` | function | SparkEngine | [SparkEngineWindowsInternal.h:L87](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L87) | Consume a project-selector pick: load + init the chosen module. | -| `ConsumeProjectSelectorChoice` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L188](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L188) | Consume a project-selector pick: load + init the chosen module. | +| `ConsumeProjectSelectorChoice` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L189](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L189) | Consume a project-selector pick: load + init the chosen module. | | `consumer` | function | Tests | [TestRenderCommandRing.cpp:L144](../../Tests/TestRenderCommandRing.cpp#L144) | | | `consumer` | function | Tests | [TestThreadSafeQueue.cpp:L117](../../Tests/TestThreadSafeQueue.cpp#L117) | | | `consumer` | function | Tests | [TestWorkSema.cpp:L50](../../Tests/TestWorkSema.cpp#L50) | | @@ -6669,7 +6683,7 @@ | `ContainsPoint` | function | SparkEditor | [LevelStreamingTypes.h:L146](../../SparkEditor/Source/LevelStreaming/LevelStreamingTypes.h#L146) | Check if point is inside volume | | `ContainsSecret` | function | Tests | [TestDATA120SecretsAtRest.cpp:L72](../../Tests/TestDATA120SecretsAtRest.cpp#L72) | | | `content` | function | SparkBuild | [Config.cpp:L764](../../SparkBuild/src/Config.cpp#L764) | | -| `content` | function | SparkEditor | [EditorUI.cpp:L1986](../../SparkEditor/Source/Core/EditorUI.cpp#L1986) | | +| `content` | function | SparkEditor | [EditorUI.cpp:L2006](../../SparkEditor/Source/Core/EditorUI.cpp#L2006) | | | `content` | function | SparkEditor | [ProjectManager.cpp:L1284](../../SparkEditor/Source/Core/ProjectManager.cpp#L1284) | | | `content` | function | SparkEditor | [BuildPipeline.cpp:L615](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L615) | | | `content` | function | SparkEditor | [BuildPipeline.cpp:L649](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L649) | | @@ -6678,7 +6692,7 @@ | `content` | function | SparkEngine | [DataTableSystem.h:L868](../../SparkEngine/Source/Engine/DataTable/DataTableSystem.h#L868) | | | `content` | function | SparkEngine | [DialogueTreeLoader.cpp:L66](../../SparkEngine/Source/Engine/Dialogue/DialogueTreeLoader.cpp#L66) | | | `content` | function | SparkEngine | [StringTable.cpp:L86](../../SparkEngine/Source/Engine/Localization/StringTable.cpp#L86) | | -| `content` | function | SparkEngine | [SceneManager.cpp:L1087](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1087) | | +| `content` | function | SparkEngine | [SceneManager.cpp:L1203](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1203) | | | `content` | function | SparkEngine | [BenchmarkFrameworkBaseline.cpp:L292](../../SparkEngine/Source/Utils/BenchmarkFrameworkBaseline.cpp#L292) | | | `content` | function | SparkEngine | [ConfigParser.h:L72](../../SparkEngine/Source/Utils/ConfigParser.h#L72) | | | `content` | function | Tests | [TestCrashArtifactRetention.cpp:L83](../../Tests/TestCrashArtifactRetention.cpp#L83) | | @@ -6694,8 +6708,10 @@ | `ContentionStats` | struct | SparkEngine | [ThreadDebugger.h:L59](../../SparkEngine/Source/Utils/ThreadDebugger.h#L59) | Aggregated contention statistics for a named mutex | | `ContentRoot` | function | GameModules | [TFWorldSetup.h:L141](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetup.h#L141) | | | `contents` | function | SparkCrashReporter | [CrashReporterManifestTests.cpp:L447](../../SparkCrashReporter/tests/CrashReporterManifestTests.cpp#L447) | | +| `contents` | function | SparkEditor | [MaterialEditorFiles.cpp:L45](../../SparkEditor/Source/Panels/MaterialEditorFiles.cpp#L45) | | | `contents` | function | SparkEngine | [NetworkTrustStore.cpp:L142](../../SparkEngine/Source/Engine/Networking/NetworkTrustStore.cpp#L142) | | | `contents` | function | SparkInstaller | [InstallState.cpp:L477](../../SparkInstaller/src/InstallState.cpp#L477) | | +| `contents` | function | Tests | [TestEditorSubsystemsReal.cpp:L800](../../Tests/TestEditorSubsystemsReal.cpp#L800) | | | `contents` | function | Tests | [TestEditorWindowManager.cpp:L256](../../Tests/TestEditorWindowManager.cpp#L256) | | | `contents` | function | Tests | [TestEditorWindowManager.cpp:L338](../../Tests/TestEditorWindowManager.cpp#L338) | | | `Contents` | function | Tests | [TestModuleVersion.cpp:L167](../../Tests/TestModuleVersion.cpp#L167) | | @@ -6718,7 +6734,7 @@ | `context` | function | Tests | [TestModuleABI.cpp:L812](../../Tests/TestModuleABI.cpp#L812) | | | `context` | function | Tests | [TestModuleABI.cpp:L908](../../Tests/TestModuleABI.cpp#L908) | | | `context` | function | Tests | [TestOpenWorldModule.cpp:L954](../../Tests/TestOpenWorldModule.cpp#L954) | | -| `context` | function | Tests | [TestPrototypeModuleKitReal.cpp:L494](../../Tests/TestPrototypeModuleKitReal.cpp#L494) | | +| `context` | function | Tests | [TestPrototypeModuleKitReal.cpp:L500](../../Tests/TestPrototypeModuleKitReal.cpp#L500) | | | `context` | function | Tests | [TestSparkGameShowcase.cpp:L343](../../Tests/TestSparkGameShowcase.cpp#L343) | | | `context` | function | Tests | [TestSparkGameShowcase.cpp:L406](../../Tests/TestSparkGameShowcase.cpp#L406) | | | `context` | function | Tests | [TestSparkGameShowcase.cpp:L449](../../Tests/TestSparkGameShowcase.cpp#L449) | | @@ -6732,15 +6748,16 @@ | `ContextEventBusScope` | struct | Tests | [TestENG200ScriptBindingsReal.cpp:L93](../../Tests/TestENG200ScriptBindingsReal.cpp#L93) | | | `ContextEventBusScope` | function | Tests | [TestENG200ScriptBindingsReal.cpp:L98](../../Tests/TestENG200ScriptBindingsReal.cpp#L98) | | | `ContextJoltSystem` | function | SparkEngine | [PhysicsBody.h:L171](../../SparkEngine/Source/Physics/PhysicsBody.h#L171) | | -| `ContextProgramCounter` | function | SparkEngine | [CrashHandler.cpp:L1888](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1888) | | +| `ContextProgramCounter` | function | SparkEngine | [CrashHandler.cpp:L1889](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1889) | | | `Continent` | struct | SparkEditor | [RegionMapEditorPanel.h:L60](../../SparkEditor/Source/Panels/RegionMapEditorPanel.h#L60) | | | `ContinentDef` | struct | GameModules | [TFDataTables.h:L131](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTables.h#L131) | | | `ContinentFile` | function | GameModules | [TFSavePaths.h:L283](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFSavePaths.h#L283) | | -| `ContinentGround` | struct | Tests | [TestTF120Travel.cpp:L101](../../Tests/TestTF120Travel.cpp#L101) | | +| `ContinentGround` | struct | Tests | [TestTF120Travel.cpp:L88](../../Tests/TestTF120Travel.cpp#L88) | | | `ContinentMeta` | struct | GameModules | [TFTravelSystem.h:L73](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L73) | | | `ContinentSelection` | struct | GameModules | [TFDataTables.cpp:L95](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTables.cpp#L95) | | | `continuation` | function | GameModules | [TFChatRules.h:L37](../../GameModules/SparkGameMMOFPS/Source/Net/TFChatRules.h#L37) | | | `Continue` | function | SparkEditor | [ScriptDebugPanel.h:L91](../../SparkEditor/Source/Panels/ScriptDebugPanel.h#L91) | | +| `control` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L278](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L278) | | | `control` | function | Tests | [TestAssetMigration.cpp:L296](../../Tests/TestAssetMigration.cpp#L296) | | | `control` | function | Tests | [TestGatewayAreaControl.cpp:L875](../../Tests/TestGatewayAreaControl.cpp#L875) | | | `control` | function | Tests | [TestGatewayAreaControl.cpp:L888](../../Tests/TestGatewayAreaControl.cpp#L888) | | @@ -6803,15 +6820,15 @@ | `ConvertVertexFormat` | function | SparkEngine | [D3D12Device.h:L224](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L224) | | | `ConvertVertexFormat` | function | SparkEngine | [MetalDevice.h:L525](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L525) | | | `ConvertVertexFormat` | function | SparkEngine | [VulkanDevice.h:L528](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L528) | | -| `Cook` | function | Tests | [TestEditorCookPackageReal.cpp:L372](../../Tests/TestEditorCookPackageReal.cpp#L372) | | +| `Cook` | function | Tests | [TestEditorCookPackageReal.cpp:L383](../../Tests/TestEditorCookPackageReal.cpp#L383) | | | `Cook` | function | Tests | [TestEditorUntrustedProject.cpp:L91](../../Tests/TestEditorUntrustedProject.cpp#L91) | | | `CookAssets` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L1309](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L1309) | | | `cookColor` | function | SparkEditor | [DedicatedServerPanel.cpp:L486](../../SparkEditor/Source/Panels/DedicatedServerPanel.cpp#L486) | | | `CookFile` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L1294](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L1294) | | | `CookLogEntry` | struct | SparkEditor | [DedicatedServerPanel.h:L194](../../SparkEditor/Source/Panels/DedicatedServerPanel.h#L194) | | | `CookOutputLock` | class | SparkAssetPipelineCore | [AssetCooker.cpp:L725](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L725) | | -| `CookPackageScenario` | class | Tests | [TestEditorCookPackageReal.cpp:L129](../../Tests/TestEditorCookPackageReal.cpp#L129) | | -| `CookPackageScenario` | function | Tests | [TestEditorCookPackageReal.cpp:L132](../../Tests/TestEditorCookPackageReal.cpp#L132) | | +| `CookPackageScenario` | class | Tests | [TestEditorCookPackageReal.cpp:L131](../../Tests/TestEditorCookPackageReal.cpp#L131) | | +| `CookPackageScenario` | function | Tests | [TestEditorCookPackageReal.cpp:L134](../../Tests/TestEditorCookPackageReal.cpp#L134) | | | `CookRecord` | struct | SparkAssetPipelineCore | [AssetCooker.h:L12](../../SparkAssetPipelineCore/include/SparkAssetPipelineCore/AssetCooker.h#L12) | | | `CookRequest` | struct | SparkAssetPipelineCore | [AssetCooker.h:L20](../../SparkAssetPipelineCore/include/SparkAssetPipelineCore/AssetCooker.h#L20) | | | `CookResult` | struct | SparkAssetPipelineCore | [AssetCooker.h:L29](../../SparkAssetPipelineCore/include/SparkAssetPipelineCore/AssetCooker.h#L29) | | @@ -6827,7 +6844,7 @@ | `copy` | function | Tests | [Test_persistence_SaveSystem.cpp:L391](../../Tests/harden/Test_persistence_SaveSystem.cpp#L391) | | | `CopyCompatibleFixture` | function | Tests | [TestModuleDiscovery.cpp:L103](../../Tests/TestModuleDiscovery.cpp#L103) | | | `CopyCompatibleFixtureToTemp` | function | Tests | [TestModuleABI.cpp:L156](../../Tests/TestModuleABI.cpp#L156) | | -| `CopyCrashModuleName` | function | SparkEngine | [CrashHandler.cpp:L1831](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1831) | | +| `CopyCrashModuleName` | function | SparkEngine | [CrashHandler.cpp:L1832](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1832) | | | `CopyDirectoryContents` | function | SparkEditor | [BuildPipeline.cpp:L382](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L382) | | | `CopyExceptionContext` | function | SparkEngine | [MiniDumpWithoutStacks.cpp:L136](../../SparkEngine/Source/Utils/MiniDumpWithoutStacks.cpp#L136) | | | `CopyExceptionInformation` | function | SparkEngine | [MiniDumpWithoutStacks.cpp:L179](../../SparkEngine/Source/Utils/MiniDumpWithoutStacks.cpp#L179) | | @@ -6857,7 +6874,7 @@ | `CopyTexture` | function | SparkEngine | [VulkanDevice.h:L363](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L363) | | | `CopyToBuf` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L149](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L149) | Copy a std::string into a fixed char buffer with truncation. | | `CopyWhole` | function | SparkLauncher | [LauncherApp.cpp:L47](../../SparkLauncher/src/LauncherApp.cpp#L47) | | -| `core` | function | SparkEngine | [CrashHandler.cpp:L2358](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2358) | | +| `core` | function | SparkEngine | [CrashHandler.cpp:L2396](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2396) | | | `corner` | function | GameModules | [TFHUDDraw.cpp:L294](../../GameModules/SparkGameMMOFPS/Source/UI/TFHUDDraw.cpp#L294) | | | `Corner` | alias | Tests | [TestENG220ObjImportReal.cpp:L52](../../Tests/TestENG220ObjImportReal.cpp#L52) | | | `Coroutine` | class | SparkEngine | [CoroutineTypes.h:L332](../../SparkEngine/Source/Engine/Coroutine/CoroutineTypes.h#L332) | A single coroutine: a named sequence of action steps separated by yields. | @@ -6877,7 +6894,7 @@ | `CoroutineInfo` | struct | SparkEditor | [CoroutineDebugPanel.h:L43](../../SparkEditor/Source/Panels/CoroutineDebugPanel.h#L43) | | | `CoroutineScheduler` | class | GameModules | [Game.h:L50](../../GameModules/SparkGameFPS/Source/Game/Game.h#L50) | | | `CoroutineScheduler` | class | SparkEngine | [CoroutineScheduler.h:L65](../../SparkEngine/Source/Engine/Coroutine/CoroutineScheduler.h#L65) | Central scheduler that ticks all active coroutines each frame. | -| `CoroutineScheduler` | class | SparkSDK | [IEngineContext.h:L88](../../SparkSDK/Include/Spark/IEngineContext.h#L88) | | +| `CoroutineScheduler` | class | SparkSDK | [IEngineContext.h:L89](../../SparkSDK/Include/Spark/IEngineContext.h#L89) | | | `CoroutineScheduler::GetInstance` | method | SparkEngine | [CoroutineScheduler.h:L259](../../SparkEngine/Source/Engine/Coroutine/CoroutineScheduler.h#L259) | Shorthand to start a builder-pattern coroutine on the global scheduler. | | `CoroutineStatus` | enum | SparkEditor | [CoroutineDebugPanel.h:L35](../../SparkEditor/Source/Panels/CoroutineDebugPanel.h#L35) | | | `CoroutineStatusLine` | function | Tests | [TestSparkGameShowcase.cpp:L214](../../Tests/TestSparkGameShowcase.cpp#L214) | | @@ -6942,10 +6959,10 @@ | `CountLiveObjects` | function | Tests | [TestRHI210D3D11ValidationReal.cpp:L51](../../Tests/TestRHI210D3D11ValidationReal.cpp#L51) | | | `CountMissingRestorePrepare` | function | Tests | [Test_persistence_SaveSystem.cpp:L501](../../Tests/harden/Test_persistence_SaveSystem.cpp#L501) | | | `CountNamed` | function | Tests | [TestMOD330ARPGWorldActors.cpp:L138](../../Tests/TestMOD330ARPGWorldActors.cpp#L138) | | -| `CountOccurrences` | function | Tests | [TestEditorCookPackageReal.cpp:L114](../../Tests/TestEditorCookPackageReal.cpp#L114) | | -| `CountOccurrences` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L133](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L133) | | +| `CountOccurrences` | function | Tests | [TestEditorCookPackageReal.cpp:L116](../../Tests/TestEditorCookPackageReal.cpp#L116) | | +| `CountOccurrences` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L134](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L134) | | | `CountOutput` | function | Tests | [VisualScriptGameplayHarness.h:L204](../../Tests/VisualScriptGameplayHarness.h#L204) | | -| `CountPendingCrashManifests` | function | SparkEngine | [CrashHandler.cpp:L565](../../SparkEngine/Source/Utils/CrashHandler.cpp#L565) | | +| `CountPendingCrashManifests` | function | SparkEngine | [CrashHandler.cpp:L566](../../SparkEngine/Source/Utils/CrashHandler.cpp#L566) | | | `CountPixels` | function | Tests | [TestRHI230VulkanValidationReal.cpp:L677](../../Tests/TestRHI230VulkanValidationReal.cpp#L677) | | | `CountProcessHandles` | function | Tests | [LifecycleLoopGuards.h:L55](../../Tests/LifecycleLoopGuards.h#L55) | | | `CountProcessThreads` | function | Tests | [LifecycleLoopGuards.h:L80](../../Tests/LifecycleLoopGuards.h#L80) | | @@ -6956,7 +6973,7 @@ | `CountStagedModuleImages` | function | Tests | [TestModuleABI.cpp:L279](../../Tests/TestModuleABI.cpp#L279) | | | `CountStateSwitches` | function | SparkEngine | [DrawSortKey.h:L299](../../SparkEngine/Source/Graphics/DrawSortKey.h#L299) | Count the number of unique shader+material combinations in a sorted list. | | `CountTag` | function | Tests | [TestReliableOrderedSequenceReal.cpp:L194](../../Tests/TestReliableOrderedSequenceReal.cpp#L194) | | -| `CountTerrainEntities` | function | Tests | [TestEditorSubsystemsReal.cpp:L321](../../Tests/TestEditorSubsystemsReal.cpp#L321) | | +| `CountTerrainEntities` | function | Tests | [TestEditorSubsystemsReal.cpp:L344](../../Tests/TestEditorSubsystemsReal.cpp#L344) | | | `CountTrace` | function | Tests | [TestENG200ScriptFaultsReal.cpp:L28](../../Tests/TestENG200ScriptFaultsReal.cpp#L28) | | | `CountTransientCandidatePrepare` | function | Tests | [Test_persistence_SaveSystem.cpp:L533](../../Tests/harden/Test_persistence_SaveSystem.cpp#L533) | | | `CountValidationMessage` | function | Tests | [VulkanTestSupport.h:L39](../../Tests/VulkanTestSupport.h#L39) | | @@ -7027,20 +7044,20 @@ | `CrashDumpType` | function | SparkEditor | [EditorCrashHandler.h:L109](../../SparkEditor/Source/Core/EditorCrashHandler.h#L109) | | | `crashedSource` | function | Tests | [TestTF120Migration.cpp:L287](../../Tests/TestTF120Migration.cpp#L287) | | | `CrashExceptionFilter` | function | Tests | [TestMain.cpp:L195](../../Tests/TestMain.cpp#L195) | | -| `CrashFilter` | function | SparkEngine | [CrashHandler.cpp:L819](../../SparkEngine/Source/Utils/CrashHandler.cpp#L819) | | -| `CrashFilter` | function | SparkEngine | [CrashHandler.cpp:L1052](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1052) | | +| `CrashFilter` | function | SparkEngine | [CrashHandler.cpp:L820](../../SparkEngine/Source/Utils/CrashHandler.cpp#L820) | | +| `CrashFilter` | function | SparkEngine | [CrashHandler.cpp:L1053](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1053) | | | `CrashInfo` | struct | SparkEditor | [EditorCrashHandler.h:L29](../../SparkEditor/Source/Core/EditorCrashHandler.h#L29) | Crash information structure | | `CrashManifest` | struct | SparkCrashReporter | [CrashReporterApp.h:L41](../../SparkCrashReporter/src/CrashReporterApp.h#L41) | | | `CrashManifestCountOrFull` | function | SparkEngine | [CrashHandlerSupport.h:L48](../../SparkEngine/Source/Utils/CrashHandlerSupport.h#L48) | | | `CrashManifestReadyName` | function | SparkEngine | [CrashHandlerSupport.h:L219](../../SparkEngine/Source/Utils/CrashHandlerSupport.h#L219) | Build the only filename shape accepted for a ready crash manifest. | | `CrashModuleIdentity` | struct | SparkEngine | [CrashSymbolication.h:L29](../../SparkEngine/Source/Utils/CrashSymbolication.h#L29) | Identity of one loaded ELF module, precomputed before any crash. | -| `CrashModuleScan` | struct | SparkEngine | [CrashHandler.cpp:L1824](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1824) | | -| `CrashModuleTable` | struct | SparkEngine | [CrashHandler.cpp:L1809](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1809) | | +| `CrashModuleScan` | struct | SparkEngine | [CrashHandler.cpp:L1825](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1825) | | +| `CrashModuleTable` | struct | SparkEngine | [CrashHandler.cpp:L1810](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1810) | | | `CrashPolicyTestBinary` | function | Tests | [TestCrashHandlerGatingReal.cpp:L398](../../Tests/TestCrashHandlerGatingReal.cpp#L398) | | | `CrashReceiptKey` | function | SparkCrashReporter | [CrashAutoIssues.cpp:L631](../../SparkCrashReporter/src/CrashAutoIssues.cpp#L631) | | | `CrashReceiptKey` | function | SparkCrashReporter | [CrashAutoIssues.h:L15](../../SparkCrashReporter/src/CrashAutoIssues.h#L15) | | | `CrashRedactionContext` | struct | SparkEngine | [CrashRedaction.h:L27](../../SparkEngine/Source/Utils/CrashRedaction.h#L27) | What a crash report must not carry off the user's machine | -| `CrashReportDelivery` | enum | SparkEngine | [CrashHandler.cpp:L502](../../SparkEngine/Source/Utils/CrashHandler.cpp#L502) | | +| `CrashReportDelivery` | enum | SparkEngine | [CrashHandler.cpp:L503](../../SparkEngine/Source/Utils/CrashHandler.cpp#L503) | | | `CrashReporting` | function | SparkEngine | [EngineSettings.h:L982](../../SparkEngine/Source/Core/EngineSettings.h#L982) | | | `CrashReporting` | function | SparkEngine | [EngineSettings.h:L983](../../SparkEngine/Source/Core/EngineSettings.h#L983) | | | `CrashReportingSettings` | struct | SparkEngine | [EngineSettings.h:L527](../../SparkEngine/Source/Core/EngineSettings.h#L527) | [CrashReporting] settings. Crash reports stay local: there is deliberately no | @@ -7148,7 +7165,7 @@ | `CreateColorPalette` | function | SparkEditor | [EditorTheme.h:L304](../../SparkEditor/Source/Core/EditorTheme.h#L304) | | | `CreateColorTarget` | function | Tests | [TestPostProcessingPipelineD3D11.cpp:L45](../../Tests/TestPostProcessingPipelineD3D11.cpp#L45) | | | `CreateCombatArena` | function | GameModules | [Game.h:L323](../../GameModules/SparkGameFPS/Source/Game/Game.h#L323) | Create the enhanced combat arena level | -| `CreateCombatBehavior` | function | SparkEngine | [AISystem.cpp:L800](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L800) | | +| `CreateCombatBehavior` | function | SparkEngine | [AISystem.cpp:L801](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L801) | | | `CreateCombatBehavior` | function | SparkEngine | [BehaviorTree.h:L291](../../SparkEngine/Source/Engine/AI/BehaviorTree.h#L291) | | | `CreateCommandPool` | function | SparkEngine | [VulkanDevice.h:L506](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L506) | | | `CreateCommandQueues` | function | SparkEngine | [D3D12Device.h:L210](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L210) | | @@ -7166,7 +7183,7 @@ | `CreateContext` | function | SparkEngine | [InputActionSystem.h:L277](../../SparkEngine/Source/Input/InputActionSystem.h#L277) | Create a named input context | | `CreateConvexHullShape` | function | SparkEngine | [PhysicsSystem.h:L804](../../SparkEngine/Source/Physics/PhysicsSystem.h#L804) | | | `CreateCookArguments` | function | SparkEditor | [BuildPipeline.h:L103](../../SparkEditor/Source/Panels/BuildPipeline.h#L103) | Construct SparkCooker's deterministic argument vector. | -| `CreateCorePanels` | function | SparkEditor | [EditorUI.h:L508](../../SparkEditor/Source/Core/EditorUI.h#L508) | | +| `CreateCorePanels` | function | SparkEditor | [EditorUI.h:L506](../../SparkEditor/Source/Core/EditorUI.h#L506) | | | `CreateCube` | function | SparkEngine | [Primitives.h:L54](../../SparkEngine/Source/Game/Primitives.h#L54) | | | `CreateCube` | function | SparkEngine | [Mesh.h:L82](../../SparkEngine/Source/Graphics/Mesh.h#L82) | Generate a procedural cube mesh | | `CreateCylinderMesh` | function | SparkEngine | [WorldBasicRenderer.cpp:L139](../../SparkEngine/Source/Graphics/WorldBasicRenderer.cpp#L139) | | @@ -7225,14 +7242,14 @@ | `CreateEntity` | function | Tests | [TestECSIntegration.cpp:L99](../../Tests/TestECSIntegration.cpp#L99) | | | `CreateEntity` | function | Tests | [TestECSystemOrdering.cpp:L38](../../Tests/TestECSystemOrdering.cpp#L38) | | | `CreateEntity` | function | Tests | [TestECSystemSpecialized.cpp:L148](../../Tests/TestECSystemSpecialized.cpp#L148) | | -| `CreateExclusiveOutputFile` | function | SparkEngine | [CrashHandler.cpp:L375](../../SparkEngine/Source/Utils/CrashHandler.cpp#L375) | | +| `CreateExclusiveOutputFile` | function | SparkEngine | [CrashHandler.cpp:L376](../../SparkEngine/Source/Utils/CrashHandler.cpp#L376) | | | `CreateExplosion` | function | SparkEngine | [SoundEffect.h:L266](../../SparkEngine/Source/Audio/SoundEffect.h#L266) | Create an explosion sound effect | | `CreateFakeCheckout` | function | SparkInstaller | [InstallerTransactionTests.cpp:L407](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L407) | | | `CreateFakeGit` | function | SparkInstaller | [InstallerTransactionTests.cpp:L380](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L380) | | | `CreateFigure8Track` | function | GameModules | [RacingTrackSystem.h:L226](../../GameModules/SparkGameRacing/Source/Track/RacingTrackSystem.h#L226) | | | `CreateFixedConstraint` | function | SparkEngine | [PhysicsSystem.h:L250](../../SparkEngine/Source/Physics/PhysicsSystem.h#L250) | | | `CreateFixture` | function | Tests | [TestPostProcessingPipelineD3D11.cpp:L27](../../Tests/TestPostProcessingPipelineD3D11.cpp#L27) | | -| `CreateFleeBehavior` | function | SparkEngine | [AISystem.cpp:L917](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L917) | | +| `CreateFleeBehavior` | function | SparkEngine | [AISystem.cpp:L918](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L918) | | | `CreateFleeBehavior` | function | SparkEngine | [BehaviorTree.h:L314](../../SparkEngine/Source/Engine/AI/BehaviorTree.h#L314) | Create a flee behavior tree for injured or non-combatant agents. | | `CreateFootstep` | function | SparkEngine | [SoundEffect.h:L275](../../SparkEngine/Source/Audio/SoundEffect.h#L275) | Create a footstep sound effect | | `CreateFormation` | function | SparkEngine | [FormationSystem.h:L148](../../SparkEngine/Source/Engine/AI/FormationSystem.h#L148) | Create a new formation. | @@ -7281,7 +7298,7 @@ | `CreateGroup` | function | SparkEngine | [GroupAI.h:L160](../../SparkEngine/Source/Engine/AI/GroupAI.h#L160) | Create a new AI group with a leader. | | `CreateGroup` | function | Tests | [TestGroupAI.cpp:L52](../../Tests/TestGroupAI.cpp#L52) | | | `CreateGroupFilterTable` | function | SparkEngine | [PhysicsSystem.h:L565](../../SparkEngine/Source/Physics/PhysicsSystem.h#L565) | Create a GroupFilterTable for sub-group-based collision filtering. | -| `CreateGuardBehavior` | function | SparkEngine | [AISystem.cpp:L865](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L865) | | +| `CreateGuardBehavior` | function | SparkEngine | [AISystem.cpp:L866](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L866) | | | `CreateGuardBehavior` | function | SparkEngine | [BehaviorTree.h:L303](../../SparkEngine/Source/Engine/AI/BehaviorTree.h#L303) | | | `CreateGuild` | function | GameModules | [MMOGuildSystem.h:L77](../../GameModules/SparkGameMMO/Source/Guild/MMOGuildSystem.h#L77) | | | `CreateGunshot` | function | SparkEngine | [SoundEffect.h:L256](../../SparkEngine/Source/Audio/SoundEffect.h#L256) | Create a gunshot sound effect | @@ -7353,7 +7370,7 @@ | `CreateMetalView` | function | SparkEngine | [SparkEngineMacOS.h:L39](../../SparkEngine/Source/Core/SparkEngineMacOS.h#L39) | Create an NSView-wrapped Metal view for an SDL_Window. | | `CreateModule` | function | GameModules | [SparkGame.h:L65](../../GameModules/SparkGame/Source/Core/SparkGame.h#L65) | | | `CreateModule` | function | GameModules | [SparkGameARPG.h:L98](../../GameModules/SparkGameARPG/Source/Core/SparkGameARPG.h#L98) | | -| `CreateModule` | function | GameModules | [Main.cpp:L1378](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1378) | | +| `CreateModule` | function | GameModules | [Main.cpp:L1381](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1381) | | | `CreateModule` | function | GameModules | [SparkGameFPS.h:L125](../../GameModules/SparkGameFPS/Source/Core/SparkGameFPS.h#L125) | | | `CreateModule` | function | GameModules | [SparkGameMMO.h:L125](../../GameModules/SparkGameMMO/Source/Core/SparkGameMMO.h#L125) | | | `CreateModule` | function | GameModules | [SparkGameOpenWorld.h:L87](../../GameModules/SparkGameOpenWorld/Source/Core/SparkGameOpenWorld.h#L87) | | @@ -7382,12 +7399,12 @@ | `CreateOwnedStagingDirectory` | function | SparkEditor | [ProjectManager.cpp:L572](../../SparkEditor/Source/Core/ProjectManager.cpp#L572) | | | `CreatePanel` | function | SparkEngine | [UISystem.h:L326](../../SparkEngine/Source/Engine/UI/UISystem.h#L326) | | | `CreatePanel` | function | SparkEngine | [UISystem.h:L377](../../SparkEngine/Source/Engine/UI/UISystem.h#L377) | Create a top-level panel. | -| `CreatePanels` | function | SparkEditor | [EditorUI.h:L507](../../SparkEditor/Source/Core/EditorUI.h#L507) | | +| `CreatePanels` | function | SparkEditor | [EditorUI.h:L505](../../SparkEditor/Source/Core/EditorUI.h#L505) | | | `CreateParallel` | function | SparkEngine | [TweenSystem.h:L190](../../SparkEngine/Source/Engine/Tween/TweenSystem.h#L190) | | | `CreateParty` | function | GameModules | [MMOPartySystem.h:L76](../../GameModules/SparkGameMMO/Source/Party/MMOPartySystem.h#L76) | | | `CreatePassResources` | function | SparkEngine | [FoliageRenderer.h:L477](../../SparkEngine/Source/Graphics/FoliageRenderer.h#L477) | | | `CreatePathConstraint` | function | SparkEngine | [PhysicsSystem.h:L311](../../SparkEngine/Source/Physics/PhysicsSystem.h#L311) | Create a path constraint — body follows a spline path. | -| `CreatePatrolBehavior` | function | SparkEngine | [AISystem.cpp:L744](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L744) | | +| `CreatePatrolBehavior` | function | SparkEngine | [AISystem.cpp:L745](../../SparkEngine/Source/Engine/AI/AISystem.cpp#L745) | | | `CreatePatrolBehavior` | function | SparkEngine | [BehaviorTree.h:L279](../../SparkEngine/Source/Engine/AI/BehaviorTree.h#L279) | Create a patrol behavior tree that walks between waypoints. | | `CreatePawnEntity` | function | GameModules | [TFPlayerSystem.h:L113](../../GameModules/SparkGameMMOFPS/Source/Game/TFPlayerSystem.h#L113) | | | `CreatePayload` | function | SparkDaemon | [ServiceTests.cpp:L109](../../SparkDaemon/tests/ServiceTests.cpp#L109) | | @@ -7547,8 +7564,8 @@ | `CreateTemporalTargets` | function | SparkEngine | [RenderTarget.h:L285](../../SparkEngine/Source/Graphics/RenderTarget.h#L285) | | | `CreateTemporalUpscalingShader` | function | SparkEngine | [UpscalingSystemWindows.cpp:L240](../../SparkEngine/Source/Graphics/UpscalingSystemWindows.cpp#L240) | Compile and create the temporal upscaling compute shader | | `CreateTempShaderDir` | function | Tests | [TestShaderHotReload.cpp:L11](../../Tests/TestShaderHotReload.cpp#L11) | | -| `CreateTestDevice` | function | Tests | [TestAssetParserHardening.cpp:L67](../../Tests/TestAssetParserHardening.cpp#L67) | | -| `CreateTestObjects` | function | GameModules | [Game.h:L657](../../GameModules/SparkGameFPS/Source/Game/Game.h#L657) | Create initial test objects for the scene | +| `CreateTestDevice` | function | Tests | [TestAssetParserHardening.cpp:L83](../../Tests/TestAssetParserHardening.cpp#L83) | | +| `CreateTestObjects` | function | GameModules | [Game.h:L681](../../GameModules/SparkGameFPS/Source/Game/Game.h#L681) | Create initial test objects for the scene | | `CreateTestScene` | function | GameModules | [Game.h:L563](../../GameModules/SparkGameFPS/Source/Game/Game.h#L563) | Create a test scene with predefined objects | | `CreateTexture` | function | SparkEngine | [D3D11Device.h:L325](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L325) | | | `CreateTexture` | function | SparkEngine | [D3D12Device.h:L104](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L104) | | @@ -7564,7 +7581,7 @@ | `CreateTexture2D` | function | SparkEngine | [RHIAdapter.h:L298](../../SparkEngine/Source/Graphics/RHI/RHIAdapter.h#L298) | Create a 2D texture. | | `CreateTexture2D` | function | SparkEngine | [RHIBridge.h:L180](../../SparkEngine/Source/Graphics/RHI/RHIBridge.h#L180) | Create a 2D texture with optional initial data | | `CreateTonemapPass` | function | SparkEngine | [GraphicsEngineRHI.h:L215](../../SparkEngine/Source/Graphics/GraphicsEngineRHI.h#L215) | | -| `CreateToolAndContentPanels` | function | SparkEditor | [EditorUI.h:L510](../../SparkEditor/Source/Core/EditorUI.h#L510) | | +| `CreateToolAndContentPanels` | function | SparkEditor | [EditorUI.h:L508](../../SparkEditor/Source/Core/EditorUI.h#L508) | | | `CreateTriangle` | function | SparkEngine | [Mesh.h:L92](../../SparkEngine/Source/Graphics/Mesh.h#L92) | Generate a simple triangle mesh | | `CreateTrigger` | function | Tests | [TestProximityTriggerSystem.cpp:L49](../../Tests/TestProximityTriggerSystem.cpp#L49) | | | `CreateUniqueSiblingPath` | function | SparkEditor | [BuildPipeline.cpp:L208](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L208) | | @@ -8090,7 +8107,7 @@ | `data` | function | Tests | [TestRHI240OpenGLReal.cpp:L505](../../Tests/TestRHI240OpenGLReal.cpp#L505) | | | `data` | function | Tests | [TestRHI240OpenGLReal.cpp:L567](../../Tests/TestRHI240OpenGLReal.cpp#L567) | | | `data` | function | Tests | [TestSecDaemonCacheHardening.cpp:L79](../../Tests/TestSecDaemonCacheHardening.cpp#L79) | | -| `data` | function | Tests | [TestSparkPak.cpp:L232](../../Tests/TestSparkPak.cpp#L232) | | +| `data` | function | Tests | [TestSparkPak.cpp:L238](../../Tests/TestSparkPak.cpp#L238) | | | `Datablock` | struct | SparkEngine | [DatablockRegistry.h:L60](../../SparkEngine/Source/Engine/Networking/DatablockRegistry.h#L60) | An immutable set of named properties describing a game object template. | | `DatablockID` | alias | SparkEngine | [DatablockRegistry.h:L50](../../SparkEngine/Source/Engine/Networking/DatablockRegistry.h#L50) | Unique identifier for a datablock (assigned at registration time) | | `DatablockRegistry` | class | SparkEngine | [DatablockRegistry.h:L118](../../SparkEngine/Source/Engine/Networking/DatablockRegistry.h#L118) | Central registry for immutable datablock definitions. | @@ -8544,11 +8561,11 @@ | `DedicatedServerProcessState` | enum | SparkEditor | [DedicatedServerProcessController.h:L36](../../SparkEditor/Source/Panels/DedicatedServerProcessController.h#L36) | | | `DeduceFieldType` | function | SparkEngine | [Reflection.h:L263](../../SparkEngine/Source/Core/Reflection.h#L263) | | | `DeduceFieldType` | function | Tests | [TestReflection.cpp:L136](../../Tests/TestReflection.cpp#L136) | | -| `defaultAction` | struct | SparkEngine | [CrashHandler.cpp:L2134](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2134) | | +| `defaultAction` | struct | SparkEngine | [CrashHandler.cpp:L2165](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2165) | | | `defaultAction` | struct | Tests | [TestPLT210ProcessPosixReal.cpp:L101](../../Tests/TestPLT210ProcessPosixReal.cpp#L101) | | | `DefaultFramebufferColorBuffer` | function | SparkEngine | [OpenGLDevice.cpp:L115](../../SparkEngine/Source/Graphics/RHI/OpenGL/OpenGLDevice.cpp#L115) | | | `DefaultLiteral` | function | SparkEngine | [VisualScriptCodegen.cpp:L158](../../SparkEngine/Source/Engine/Scripting/VisualScriptCodegen.cpp#L158) | | -| `DefaultLiteral` | function | SparkEngine | [VisualScriptEmitter.cpp:L330](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L330) | | +| `DefaultLiteral` | function | SparkEngine | [VisualScriptEmitter.cpp:L343](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L343) | | | `DefaultLiteral` | function | SparkEngine | [VisualScriptEmitter.h:L68](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L68) | | | `DefaultMinFreeBytes` | function | SparkInstaller | [InstallerPreflight.cpp:L162](../../SparkInstaller/src/InstallerPreflight.cpp#L162) | | | `DefaultMinFreeBytes` | function | SparkInstaller | [InstallerPreflight.h:L28](../../SparkInstaller/src/InstallerPreflight.h#L28) | | @@ -8556,7 +8573,7 @@ | `DefaultNetworkSecurityDirectory` | function | SparkEngine | [NetworkTrustStore.cpp:L556](../../SparkEngine/Source/Engine/Networking/NetworkTrustStore.cpp#L556) | | | `DefaultNewProjectLocation` | function | SparkLauncher | [LauncherApp.h:L41](../../SparkLauncher/src/LauncherApp.h#L41) | | | `DefaultOrchestratorIdentityPath` | function | SparkDaemon | [OrchestratorIdentity.cpp:L371](../../SparkDaemon/src/OrchestratorIdentity.cpp#L371) | | -| `DefaultSearchBases` | function | GameModules | [FPSAssetPaths.cpp:L54](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L54) | | +| `DefaultSearchBases` | function | GameModules | [FPSAssetPaths.cpp:L62](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L62) | | | `DefaultSearchBases` | function | GameModules | [FPSAssetPaths.h:L41](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L41) | The bases probed by Root(): the host executable directory and | | `DefaultSocketPath` | function | SparkDaemon | [main.cpp:L83](../../SparkDaemon/src/main.cpp#L83) | | | `DefaultTerrainPath` | function | SparkEditor | [TerrainEditor.h:L42](../../SparkEditor/Source/Terrain/TerrainEditor.h#L42) | Project-relative default location for a terrain of the given name. | @@ -8584,7 +8601,7 @@ | `DefineWorldAreas` | function | GameModules | [RPGWorldSetup.h:L74](../../GameModules/SparkGameRPG/Source/World/RPGWorldSetup.h#L74) | | | `DefOf` | function | GameModules | [TFVehicleSystem.h:L155](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L155) | | | `DefWindowProcW` | function | SparkEditor | [EditorApplicationWindows.cpp:L474](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp#L474) | | -| `DefWindowProcW` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L479](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L479) | | +| `DefWindowProcW` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L508](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L508) | | | `DefWindowProcW` | function | SparkInstaller | [BackendWindows.cpp:L72](../../SparkInstaller/src/gui/BackendWindows.cpp#L72) | | | `DefWindowProcW` | function | SparkLauncher | [LauncherBackendWindows.cpp:L79](../../SparkLauncher/src/LauncherBackendWindows.cpp#L79) | | | `DegreesToRadians` | function | SparkEngine | [MathUtils.h:L140](../../SparkEngine/Source/Utils/MathUtils.h#L140) | | @@ -8722,7 +8739,7 @@ | `DeriveScramKeysFromSaltedPassword` | function | GameModules | [TFCrypto.h:L72](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.h#L72) | | | `Desaturate` | function | SparkEditor | [EditorTheme.h:L69](../../SparkEditor/Source/Core/EditorTheme.h#L69) | Create a desaturated version of this color | | `DescendantSpawnerMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L330](../../SparkBuild/tests/ProcessRunnerTests.cpp#L330) | | -| `DescendantSpawnerMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L735](../../SparkBuild/tests/ProcessRunnerTests.cpp#L735) | | +| `DescendantSpawnerMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L726](../../SparkBuild/tests/ProcessRunnerTests.cpp#L726) | | | `DescendToNextFloor` | function | GameModules | [ARPGDungeonSystem.h:L70](../../GameModules/SparkGameARPG/Source/Dungeon/ARPGDungeonSystem.h#L70) | | | `DescribeDependencyGraphError` | function | SparkEngine | [ModuleManager.cpp:L248](../../SparkEngine/Source/Core/ModuleManager.cpp#L248) | | | `DescribeEntity` | function | SparkEngine | [ReflectedSceneValidation.cpp:L113](../../SparkEngine/Source/SceneManager/ReflectedSceneValidation.cpp#L113) | | @@ -8790,17 +8807,17 @@ | `DespawnBot` | function | GameModules | [TFBotSystem.h:L206](../../GameModules/SparkGameMMOFPS/Source/Game/TFBotSystem.h#L206) | | | `destination` | function | GameModules | [TFDatabaseResidency.cpp:L269](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFDatabaseResidency.cpp#L269) | | | `destination` | function | SparkEditor | [JSONSceneSerializer.cpp:L471](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L471) | | -| `destination` | function | SparkEngine | [SceneManager.cpp:L945](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L945) | | +| `destination` | function | SparkEngine | [SceneManager.cpp:L1045](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1045) | | | `destination` | function | Tests | [TestTF120Migration.cpp:L166](../../Tests/TestTF120Migration.cpp#L166) | | | `destination` | function | Tests | [TestTF120Migration.cpp:L210](../../Tests/TestTF120Migration.cpp#L210) | | | `destination` | function | Tests | [TestTF120Migration.cpp:L248](../../Tests/TestTF120Migration.cpp#L248) | | | `destination` | function | Tests | [TestTF120Migration.cpp:L308](../../Tests/TestTF120Migration.cpp#L308) | | | `destination` | function | Tests | [TestTF120Migration.cpp:L367](../../Tests/TestTF120Migration.cpp#L367) | | -| `destination` | function | Tests | [TestTF120Travel.cpp:L431](../../Tests/TestTF120Travel.cpp#L431) | | -| `destination` | function | Tests | [TestTF120Travel.cpp:L552](../../Tests/TestTF120Travel.cpp#L552) | | -| `DestinationAuthority` | struct | Tests | [TestTF120Travel.cpp:L244](../../Tests/TestTF120Travel.cpp#L244) | | -| `DestinationAuthority` | function | Tests | [TestTF120Travel.cpp:L246](../../Tests/TestTF120Travel.cpp#L246) | | -| `destinationAuthority` | function | Tests | [TestTF120Travel.cpp:L550](../../Tests/TestTF120Travel.cpp#L550) | | +| `destination` | function | Tests | [TestTF120Travel.cpp:L418](../../Tests/TestTF120Travel.cpp#L418) | | +| `destination` | function | Tests | [TestTF120Travel.cpp:L539](../../Tests/TestTF120Travel.cpp#L539) | | +| `DestinationAuthority` | struct | Tests | [TestTF120Travel.cpp:L231](../../Tests/TestTF120Travel.cpp#L231) | | +| `DestinationAuthority` | function | Tests | [TestTF120Travel.cpp:L233](../../Tests/TestTF120Travel.cpp#L233) | | +| `destinationAuthority` | function | Tests | [TestTF120Travel.cpp:L537](../../Tests/TestTF120Travel.cpp#L537) | | | `DestinationForPass` | function | SparkEngine | [PostProcessingTypes.h:L72](../../SparkEngine/Source/Graphics/PostProcessingTypes.h#L72) | | | `DestinationLock` | class | SparkInstaller | [Installer.cpp:L51](../../SparkInstaller/src/Installer.cpp#L51) | | | `DestinationLock` | function | SparkInstaller | [Installer.cpp:L54](../../SparkInstaller/src/Installer.cpp#L54) | | @@ -8837,7 +8854,7 @@ | `DestroyMetalView` | function | SparkEngine | [SparkEngineMacOS.h:L44](../../SparkEngine/Source/Core/SparkEngineMacOS.h#L44) | Destroy a view previously returned by CreateMetalView(). No-op on non-macOS. | | `DestroyModule` | function | GameModules | [SparkGame.h:L66](../../GameModules/SparkGame/Source/Core/SparkGame.h#L66) | | | `DestroyModule` | function | GameModules | [SparkGameARPG.h:L99](../../GameModules/SparkGameARPG/Source/Core/SparkGameARPG.h#L99) | | -| `DestroyModule` | function | GameModules | [Main.cpp:L1383](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1383) | | +| `DestroyModule` | function | GameModules | [Main.cpp:L1386](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1386) | | | `DestroyModule` | function | GameModules | [SparkGameFPS.h:L126](../../GameModules/SparkGameFPS/Source/Core/SparkGameFPS.h#L126) | | | `DestroyModule` | function | GameModules | [SparkGameMMO.h:L126](../../GameModules/SparkGameMMO/Source/Core/SparkGameMMO.h#L126) | | | `DestroyModule` | function | GameModules | [SparkGameOpenWorld.h:L88](../../GameModules/SparkGameOpenWorld/Source/Core/SparkGameOpenWorld.h#L88) | | @@ -8892,7 +8909,7 @@ | `DestructionSettings` | struct | Tests | [TestEngineSettingsEdgeCases.cpp:L460](../../Tests/TestEngineSettingsEdgeCases.cpp#L460) | | | `DestructionSystem` | class | GameModules | [Game.h:L46](../../GameModules/SparkGameFPS/Source/Game/Game.h#L46) | | | `DestructionSystem` | class | SparkEngine | [DestructionSystem.h:L181](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L181) | Manages destructible objects, fracturing, and debris. | -| `DestructionSystem` | class | SparkSDK | [IEngineContext.h:L98](../../SparkSDK/Include/Spark/IEngineContext.h#L98) | | +| `DestructionSystem` | class | SparkSDK | [IEngineContext.h:L99](../../SparkSDK/Include/Spark/IEngineContext.h#L99) | | | `DestructionSystem::ApplyDamage` | method | SparkEngine | [DestructionSystem.cpp:L134](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.cpp#L134) | | | `DestructionSystem::Console_GetStatus` | method | SparkEngine | [DestructionSystem.cpp:L271](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.cpp#L271) | | | `DestructionSystem::ForceDestroy` | method | SparkEngine | [DestructionSystem.cpp:L245](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.cpp#L245) | | @@ -9065,7 +9082,7 @@ | `DialogueSystem` | class | GameModules | [Game.h:L45](../../GameModules/SparkGameFPS/Source/Game/Game.h#L45) | | | `DialogueSystem` | class | SparkEngine | [SparkEngineWindowsInternal.h:L29](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L29) | | | `DialogueSystem` | class | SparkEngine | [DialogueSystem.h:L196](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L196) | Manages dialogue trees and active conversations. | -| `DialogueSystem` | class | SparkSDK | [IEngineContext.h:L93](../../SparkSDK/Include/Spark/IEngineContext.h#L93) | | +| `DialogueSystem` | class | SparkSDK | [IEngineContext.h:L94](../../SparkSDK/Include/Spark/IEngineContext.h#L94) | | | `DialogueSystem::AdvanceNode` | method | SparkEngine | [DialogueSystem.cpp:L157](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.cpp#L157) | | | `DialogueSystem::Console_GetStatus` | method | SparkEngine | [DialogueSystem.cpp:L356](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.cpp#L356) | | | `DialogueSystem::Console_ListTrees` | method | SparkEngine | [DialogueSystem.cpp:L377](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.cpp#L377) | | @@ -9107,8 +9124,8 @@ | `Dim` | function | SparkBuild | [Terminal.h:L16](../../SparkBuild/src/Terminal.h#L16) | | | `Dim` | function | SparkInstaller | [WizardTui.cpp:L30](../../SparkInstaller/src/tui/WizardTui.cpp#L30) | | | `dir` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L329](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L329) | | -| `dir` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L445](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L445) | | -| `dir` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L521](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L521) | | +| `dir` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L447](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L447) | | +| `dir` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L523](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L523) | | | `dir` | function | Tests | [TestModuleDiscovery.cpp:L168](../../Tests/TestModuleDiscovery.cpp#L168) | | | `dir` | function | Tests | [TestModuleDiscovery.cpp:L200](../../Tests/TestModuleDiscovery.cpp#L200) | | | `dir` | function | Tests | [TestModuleDiscovery.cpp:L242](../../Tests/TestModuleDiscovery.cpp#L242) | | @@ -9139,16 +9156,18 @@ | `DirectionScorer` | class | SparkEngine | [EnvironmentQuery.h:L383](../../SparkEngine/Source/Engine/AI/EnvironmentQuery.h#L383) | Scores by dot product with a preferred direction (alignment) | | `DirectiveIndexOfId` | function | GameModules | [TFDirectivePanel.cpp:L45](../../GameModules/SparkGameMMOFPS/Source/UI/TFDirectivePanel.cpp#L45) | | | `DirectorPhase` | enum | SparkEngine | [AIDirector.h:L59](../../SparkEngine/Source/Engine/AI/AIDirector.h#L59) | Phases of the AI Director's intensity cycle. | -| `directory` | function | GameModules | [GameConsoleOps.cpp:L606](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L606) | | +| `directory` | function | GameModules | [GameConsoleOps.cpp:L614](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L614) | | | `directory` | function | SparkBuild | [PathSecurity.cpp:L137](../../SparkBuild/src/PathSecurity.cpp#L137) | | | `directory` | function | SparkCrashReporter | [CrashAutoIssues.cpp:L215](../../SparkCrashReporter/src/CrashAutoIssues.cpp#L215) | | | `directory` | function | SparkEngine | [ModSystem.cpp:L199](../../SparkEngine/Source/Engine/Modding/ModSystem.cpp#L199) | | | `Directory` | function | Tests | [TestEditorStateCompatibility.cpp:L128](../../Tests/TestEditorStateCompatibility.cpp#L128) | | +| `directory` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L80](../../Tests/TestFPSOwnedSaveDecode.cpp#L80) | | | `Directory` | function | Tests | [TestMOD380RacingCompleteRaceReal.cpp:L518](../../Tests/TestMOD380RacingCompleteRaceReal.cpp#L518) | | | `DirectoryNames` | function | SparkBuild | [DownloaderTests.cpp:L266](../../SparkBuild/tests/DownloaderTests.cpp#L266) | | | `DirectoryNames` | function | SparkBuild | [DownloaderTests.cpp:L507](../../SparkBuild/tests/DownloaderTests.cpp#L507) | | | `DirectoryNames` | function | SparkBuild | [DownloaderTests.cpp:L737](../../SparkBuild/tests/DownloaderTests.cpp#L737) | | | `DirectoryQuery` | alias | SparkBuild | [PathSecurity.cpp:L59](../../SparkBuild/src/PathSecurity.cpp#L59) | | +| `directoryText` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L76](../../Tests/TestFPSOwnedSaveDecode.cpp#L76) | | | `DirectStorageLoader` | class | SparkEngine | [DirectStorageLoader.h:L129](../../SparkEngine/Source/Engine/Streaming/DirectStorageLoader.h#L129) | | | `DirectStorageLoader::Cancel` | method | SparkEngine | [DirectStorageLoader.cpp:L161](../../SparkEngine/Source/Engine/Streaming/DirectStorageLoader.cpp#L161) | | | `DirectStorageLoader::Console_GetStatus` | method | SparkEngine | [DirectStorageLoader.cpp:L394](../../SparkEngine/Source/Engine/Streaming/DirectStorageLoader.cpp#L394) | | @@ -9623,7 +9642,7 @@ | `DrawPerceptionCone` | function | SparkEngine | [AIDebugRenderer.h:L133](../../SparkEngine/Source/Engine/AI/AIDebugRenderer.h#L133) | Render a perception cone for an AI agent | | `DrawPhysicsHeatmap` | function | SparkEngine | [DebugDraw.h:L374](../../SparkEngine/Source/Utils/DebugDraw.h#L374) | | | `DrawProjectSelectorPanel` | function | SparkEngine | [SparkEngineWindowsInternal.h:L83](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L83) | ImGui panel listing discovered game modules (bare-launch flow). | -| `DrawProjectSelectorPanel` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L153](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L153) | ImGui panel listing discovered game modules (bare-launch flow). | +| `DrawProjectSelectorPanel` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L154](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L154) | ImGui panel listing discovered game modules (bare-launch flow). | | `DrawProjectsTab` | function | SparkLauncher | [LauncherApp.h:L38](../../SparkLauncher/src/LauncherApp.h#L38) | | | `DrawRay` | function | SparkEngine | [DebugDraw.h:L150](../../SparkEngine/Source/Utils/DebugDraw.h#L150) | Draw a ray from origin along direction for given length | | `DrawRecentTab` | function | GameModules | [TFSocialPanel.h:L50](../../GameModules/SparkGameMMOFPS/Source/UI/TFSocialPanel.h#L50) | | @@ -9857,7 +9876,7 @@ | `EditorApplication::InitializeImGui` | method | SparkEditor | [EditorApplicationLinux.cpp:L94](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L94) | | | `EditorApplication::InitializeImGui` | method | SparkEditor | [EditorApplicationWindows.cpp:L155](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp#L155) | | | `EditorApplication::OnShutdownRequested` | method | SparkEditor | [EditorApplication.cpp:L285](../../SparkEditor/Source/Core/EditorApplication.cpp#L285) | | -| `EditorApplication::OnWindowResize` | method | SparkEditor | [EditorApplicationLinux.cpp:L264](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L264) | | +| `EditorApplication::OnWindowResize` | method | SparkEditor | [EditorApplicationLinux.cpp:L265](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L265) | | | `EditorApplication::OnWindowResize` | method | SparkEditor | [EditorApplicationWindows.cpp:L324](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp#L324) | | | `EditorApplication::ProcessMessages` | method | SparkEditor | [EditorApplicationLinux.cpp:L204](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L204) | | | `EditorApplication::ProcessMessages` | method | SparkEditor | [EditorApplicationWindows.cpp:L267](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp#L267) | | @@ -9867,9 +9886,9 @@ | `EditorApplication::Run` | method | SparkEditor | [EditorApplicationLinux.cpp:L143](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L143) | | | `EditorApplication::Run` | method | SparkEditor | [EditorApplicationWindows.cpp:L203](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp#L203) | | | `EditorApplication::SaveProjectForShutdown` | method | SparkEditor | [EditorApplication.cpp:L303](../../SparkEditor/Source/Core/EditorApplication.cpp#L303) | | -| `EditorApplication::SetWindowTitle` | method | SparkEditor | [EditorApplicationLinux.cpp:L274](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L274) | | +| `EditorApplication::SetWindowTitle` | method | SparkEditor | [EditorApplicationLinux.cpp:L275](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L275) | | | `EditorApplication::SetWindowTitle` | method | SparkEditor | [EditorApplicationWindows.cpp:L349](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp#L349) | | -| `EditorApplication::Shutdown` | method | SparkEditor | [EditorApplicationLinux.cpp:L282](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L282) | | +| `EditorApplication::Shutdown` | method | SparkEditor | [EditorApplicationLinux.cpp:L283](../../SparkEditor/Source/Core/EditorApplicationLinux.cpp#L283) | | | `EditorApplication::Shutdown` | method | SparkEditor | [EditorApplicationWindows.cpp:L358](../../SparkEditor/Source/Core/EditorApplicationWindows.cpp#L358) | | | `EditorApplication::Update` | method | SparkEditor | [EditorApplication.cpp:L220](../../SparkEditor/Source/Core/EditorApplication.cpp#L220) | | | `EditorApplication::UpdatePerformanceMetrics` | method | SparkEditor | [EditorApplication.cpp:L249](../../SparkEditor/Source/Core/EditorApplication.cpp#L249) | | @@ -9989,9 +10008,9 @@ | `EditorPanel` | class | SparkEditor | [EditorPanel.h:L44](../../SparkEditor/Source/Core/EditorPanel.h#L44) | Base class for all editor panels | | `EditorPanel` | class | SparkEditor | [EditorUI.h:L109](../../SparkEditor/Source/Core/EditorUI.h#L109) | | | `EditorPanel::BeginPanel` | method | SparkEditor | [EditorPanel.cpp:L22](../../SparkEditor/Source/Core/EditorPanel.cpp#L22) | | -| `EditorPanel::EndPanel` | method | SparkEditor | [EditorPanel.cpp:L73](../../SparkEditor/Source/Core/EditorPanel.cpp#L73) | | +| `EditorPanel::EndPanel` | method | SparkEditor | [EditorPanel.cpp:L74](../../SparkEditor/Source/Core/EditorPanel.cpp#L74) | | | `EditorPanel::HandleEvent` | method | SparkEditor | [ConsolePanel.cpp:L235](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L235) | | -| `EditorPanel::NotifyStateChange` | method | SparkEditor | [EditorPanel.cpp:L78](../../SparkEditor/Source/Core/EditorPanel.cpp#L78) | | +| `EditorPanel::NotifyStateChange` | method | SparkEditor | [EditorPanel.cpp:L79](../../SparkEditor/Source/Core/EditorPanel.cpp#L79) | | | `EditorPeer` | struct | SparkEditor | [CollaborativeEditSession.h:L121](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L121) | Information about a connected editor peer | | `EditorPluginManager` | class | SparkEditor | [EditorPluginManager.h:L59](../../SparkEditor/Source/Core/EditorPluginManager.h#L59) | Manages editor plugin lifecycle | | `EditorPluginManager` | class | SparkEditor | [EditorUI.h:L110](../../SparkEditor/Source/Core/EditorUI.h#L110) | | @@ -10080,46 +10099,46 @@ | `EditorUI` | class | SparkEditor | [SceneViewPanel.h:L29](../../SparkEditor/Source/Panels/SceneViewPanel.h#L29) | | | `EditorUI` | class | SparkEditor | [WorkflowPanel.h:L17](../../SparkEditor/Source/Panels/WorkflowPanel.h#L17) | | | `EditorUI` | class | SparkEditor | [EditorWorkflow.h:L22](../../SparkEditor/Source/Workflow/EditorWorkflow.h#L22) | | -| `EditorUI::ApplyTheme` | method | SparkEditor | [EditorUI.cpp:L1417](../../SparkEditor/Source/Core/EditorUI.cpp#L1417) | | -| `EditorUI::CaptureRecoveryIfDue` | method | SparkEditor | [EditorUI.cpp:L1632](../../SparkEditor/Source/Core/EditorUI.cpp#L1632) | | -| `EditorUI::ClearMatchingRecoveryAfterSuccessfulSave` | method | SparkEditor | [EditorUI.cpp:L1879](../../SparkEditor/Source/Core/EditorUI.cpp#L1879) | | -| `EditorUI::ClearPendingProjectTransition` | method | SparkEditor | [EditorUI.cpp:L2174](../../SparkEditor/Source/Core/EditorUI.cpp#L2174) | | -| `EditorUI::ClearPendingRecoveryOffer` | method | SparkEditor | [EditorUI.cpp:L1724](../../SparkEditor/Source/Core/EditorUI.cpp#L1724) | | +| `EditorUI::ApplyTheme` | method | SparkEditor | [EditorUI.cpp:L1437](../../SparkEditor/Source/Core/EditorUI.cpp#L1437) | | +| `EditorUI::CaptureRecoveryIfDue` | method | SparkEditor | [EditorUI.cpp:L1652](../../SparkEditor/Source/Core/EditorUI.cpp#L1652) | | +| `EditorUI::ClearMatchingRecoveryAfterSuccessfulSave` | method | SparkEditor | [EditorUI.cpp:L1899](../../SparkEditor/Source/Core/EditorUI.cpp#L1899) | | +| `EditorUI::ClearPendingProjectTransition` | method | SparkEditor | [EditorUI.cpp:L2194](../../SparkEditor/Source/Core/EditorUI.cpp#L2194) | | +| `EditorUI::ClearPendingRecoveryOffer` | method | SparkEditor | [EditorUI.cpp:L1744](../../SparkEditor/Source/Core/EditorUI.cpp#L1744) | | | `EditorUI::CreateCorePanels` | method | SparkEditor | [EditorPanelFactory.cpp:L93](../../SparkEditor/Source/Core/EditorPanelFactory.cpp#L93) | | | `EditorUI::CreatePanels` | method | SparkEditor | [EditorPanelFactory.cpp:L240](../../SparkEditor/Source/Core/EditorPanelFactory.cpp#L240) | | | `EditorUI::CreateToolAndContentPanels` | method | SparkEditor | [EditorPanelFactory.cpp:L142](../../SparkEditor/Source/Core/EditorPanelFactory.cpp#L142) | | -| `EditorUI::DiscardPendingRecovery` | method | SparkEditor | [EditorUI.cpp:L1849](../../SparkEditor/Source/Core/EditorUI.cpp#L1849) | | -| `EditorUI::ExecuteCommand` | method | SparkEditor | [EditorUI.cpp:L1436](../../SparkEditor/Source/Core/EditorUI.cpp#L1436) | | -| `EditorUI::ExecuteDocumentTransition` | method | SparkEditor | [EditorUI.cpp:L2122](../../SparkEditor/Source/Core/EditorUI.cpp#L2122) | | -| `EditorUI::ExportLayout` | method | SparkEditor | [EditorUI.cpp:L2016](../../SparkEditor/Source/Core/EditorUI.cpp#L2016) | | -| `EditorUI::GetCanonicalActiveProjectIdentity` | method | SparkEditor | [EditorUI.cpp:L1517](../../SparkEditor/Source/Core/EditorUI.cpp#L1517) | | -| `EditorUI::GetProjectRelativeCurrentScenePath` | method | SparkEditor | [EditorUI.cpp:L1546](../../SparkEditor/Source/Core/EditorUI.cpp#L1546) | | -| `EditorUI::GetStats` | method | SparkEditor | [EditorUI.cpp:L1490](../../SparkEditor/Source/Core/EditorUI.cpp#L1490) | | -| `EditorUI::HandleKeyboardShortcuts` | method | SparkEditor | [EditorUI.cpp:L2664](../../SparkEditor/Source/Core/EditorUI.cpp#L2664) | | -| `EditorUI::HasRecoveryData` | method | SparkEditor | [EditorUI.cpp:L1512](../../SparkEditor/Source/Core/EditorUI.cpp#L1512) | | -| `EditorUI::ImportLayout` | method | SparkEditor | [EditorUI.cpp:L1978](../../SparkEditor/Source/Core/EditorUI.cpp#L1978) | | +| `EditorUI::DiscardPendingRecovery` | method | SparkEditor | [EditorUI.cpp:L1869](../../SparkEditor/Source/Core/EditorUI.cpp#L1869) | | +| `EditorUI::ExecuteCommand` | method | SparkEditor | [EditorUI.cpp:L1456](../../SparkEditor/Source/Core/EditorUI.cpp#L1456) | | +| `EditorUI::ExecuteDocumentTransition` | method | SparkEditor | [EditorUI.cpp:L2142](../../SparkEditor/Source/Core/EditorUI.cpp#L2142) | | +| `EditorUI::ExportLayout` | method | SparkEditor | [EditorUI.cpp:L2036](../../SparkEditor/Source/Core/EditorUI.cpp#L2036) | | +| `EditorUI::GetCanonicalActiveProjectIdentity` | method | SparkEditor | [EditorUI.cpp:L1537](../../SparkEditor/Source/Core/EditorUI.cpp#L1537) | | +| `EditorUI::GetProjectRelativeCurrentScenePath` | method | SparkEditor | [EditorUI.cpp:L1566](../../SparkEditor/Source/Core/EditorUI.cpp#L1566) | | +| `EditorUI::GetStats` | method | SparkEditor | [EditorUI.cpp:L1510](../../SparkEditor/Source/Core/EditorUI.cpp#L1510) | | +| `EditorUI::HandleKeyboardShortcuts` | method | SparkEditor | [EditorUI.cpp:L2666](../../SparkEditor/Source/Core/EditorUI.cpp#L2666) | | +| `EditorUI::HasRecoveryData` | method | SparkEditor | [EditorUI.cpp:L1532](../../SparkEditor/Source/Core/EditorUI.cpp#L1532) | | +| `EditorUI::ImportLayout` | method | SparkEditor | [EditorUI.cpp:L1998](../../SparkEditor/Source/Core/EditorUI.cpp#L1998) | | | `EditorUI::Initialize` | method | SparkEditor | [EditorUI.cpp:L172](../../SparkEditor/Source/Core/EditorUI.cpp#L172) | | | `EditorUI::InitializeCommandPalette` | method | SparkEditor | [EditorCommandRegistry.cpp:L22](../../SparkEditor/Source/Core/EditorCommandRegistry.cpp#L22) | | | `EditorUI::InitializeManagers` | method | SparkEditor | [EditorUI.cpp:L290](../../SparkEditor/Source/Core/EditorUI.cpp#L290) | | | `EditorUI::InitializePanelCategories` | method | SparkEditor | [EditorPanelFactoryMetadata.cpp:L93](../../SparkEditor/Source/Core/EditorPanelFactoryMetadata.cpp#L93) | | | `EditorUI::InitializePanelIcons` | method | SparkEditor | [EditorPanelFactoryMetadata.cpp:L16](../../SparkEditor/Source/Core/EditorPanelFactoryMetadata.cpp#L16) | | -| `EditorUI::IsPanelVisible` | method | SparkEditor | [EditorUI.cpp:L1290](../../SparkEditor/Source/Core/EditorUI.cpp#L1290) | | -| `EditorUI::LoadLayout` | method | SparkEditor | [EditorUI.cpp:L1362](../../SparkEditor/Source/Core/EditorUI.cpp#L1362) | | -| `EditorUI::NewScene` | method | SparkEditor | [EditorUI.cpp:L2190](../../SparkEditor/Source/Core/EditorUI.cpp#L2190) | | -| `EditorUI::NewSceneNow` | method | SparkEditor | [EditorUI.cpp:L2195](../../SparkEditor/Source/Core/EditorUI.cpp#L2195) | | -| `EditorUI::ObserveDocumentHistoryForRecovery` | method | SparkEditor | [EditorUI.cpp:L1602](../../SparkEditor/Source/Core/EditorUI.cpp#L1602) | | -| `EditorUI::OfferMatchingRecoveryForCurrentProject` | method | SparkEditor | [EditorUI.cpp:L1699](../../SparkEditor/Source/Core/EditorUI.cpp#L1699) | | -| `EditorUI::OpenScene` | method | SparkEditor | [EditorUI.cpp:L2483](../../SparkEditor/Source/Core/EditorUI.cpp#L2483) | | -| `EditorUI::PersistRecoverySnapshotOnUiThread` | method | SparkEditor | [EditorUI.cpp:L1652](../../SparkEditor/Source/Core/EditorUI.cpp#L1652) | | -| `EditorUI::ProcessGlobalHotkeys` | method | SparkEditor | [EditorUI.cpp:L636](../../SparkEditor/Source/Core/EditorUI.cpp#L636) | | -| `EditorUI::ProcessSceneShortcuts` | method | SparkEditor | [EditorUI.cpp:L614](../../SparkEditor/Source/Core/EditorUI.cpp#L614) | | -| `EditorUI::RecordRecoveryOperation` | method | SparkEditor | [EditorUI.cpp:L1576](../../SparkEditor/Source/Core/EditorUI.cpp#L1576) | | -| `EditorUI::RegisterCommand` | method | SparkEditor | [EditorUI.cpp:L1476](../../SparkEditor/Source/Core/EditorUI.cpp#L1476) | | +| `EditorUI::IsPanelVisible` | method | SparkEditor | [EditorUI.cpp:L1310](../../SparkEditor/Source/Core/EditorUI.cpp#L1310) | | +| `EditorUI::LoadLayout` | method | SparkEditor | [EditorUI.cpp:L1382](../../SparkEditor/Source/Core/EditorUI.cpp#L1382) | | +| `EditorUI::NewScene` | method | SparkEditor | [EditorUI.cpp:L2210](../../SparkEditor/Source/Core/EditorUI.cpp#L2210) | | +| `EditorUI::NewSceneNow` | method | SparkEditor | [EditorUI.cpp:L2215](../../SparkEditor/Source/Core/EditorUI.cpp#L2215) | | +| `EditorUI::ObserveDocumentHistoryForRecovery` | method | SparkEditor | [EditorUI.cpp:L1622](../../SparkEditor/Source/Core/EditorUI.cpp#L1622) | | +| `EditorUI::OfferMatchingRecoveryForCurrentProject` | method | SparkEditor | [EditorUI.cpp:L1719](../../SparkEditor/Source/Core/EditorUI.cpp#L1719) | | +| `EditorUI::OpenScene` | method | SparkEditor | [EditorUI.cpp:L2515](../../SparkEditor/Source/Core/EditorUI.cpp#L2515) | | +| `EditorUI::PersistRecoverySnapshotOnUiThread` | method | SparkEditor | [EditorUI.cpp:L1672](../../SparkEditor/Source/Core/EditorUI.cpp#L1672) | | +| `EditorUI::ProcessGlobalHotkeys` | method | SparkEditor | [EditorUI.cpp:L656](../../SparkEditor/Source/Core/EditorUI.cpp#L656) | | +| `EditorUI::ProcessSceneShortcuts` | method | SparkEditor | [EditorUI.cpp:L634](../../SparkEditor/Source/Core/EditorUI.cpp#L634) | | +| `EditorUI::RecordRecoveryOperation` | method | SparkEditor | [EditorUI.cpp:L1596](../../SparkEditor/Source/Core/EditorUI.cpp#L1596) | | +| `EditorUI::RegisterCommand` | method | SparkEditor | [EditorUI.cpp:L1496](../../SparkEditor/Source/Core/EditorUI.cpp#L1496) | | | `EditorUI::RegisterEditCommands` | method | SparkEditor | [EditorCommandRegistry.cpp:L82](../../SparkEditor/Source/Core/EditorCommandRegistry.cpp#L82) | | | `EditorUI::RegisterPanelToggleCommands` | method | SparkEditor | [EditorCommandRegistry.cpp:L35](../../SparkEditor/Source/Core/EditorCommandRegistry.cpp#L35) | | | `EditorUI::RegisterSceneCommands` | method | SparkEditor | [EditorCommandRegistry.cpp:L128](../../SparkEditor/Source/Core/EditorCommandRegistry.cpp#L128) | | | `EditorUI::RegisterToolCommands` | method | SparkEditor | [EditorCommandRegistry.cpp:L155](../../SparkEditor/Source/Core/EditorCommandRegistry.cpp#L155) | | -| `EditorUI::Render` | method | SparkEditor | [EditorUI.cpp:L701](../../SparkEditor/Source/Core/EditorUI.cpp#L701) | | +| `EditorUI::Render` | method | SparkEditor | [EditorUI.cpp:L721](../../SparkEditor/Source/Core/EditorUI.cpp#L721) | | | `EditorUI::RenderBuildMenu` | method | SparkEditor | [EditorMenuBar.cpp:L635](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L635) | | | `EditorUI::RenderEditMenu` | method | SparkEditor | [EditorMenuBar.cpp:L228](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L228) | | | `EditorUI::RenderFileMenu` | method | SparkEditor | [EditorMenuBar.cpp:L198](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L198) | | @@ -10133,51 +10152,51 @@ | `EditorUI::RenderGameObjectVolumeSubMenu` | method | SparkEditor | [EditorMenuBar.cpp:L339](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L339) | | | `EditorUI::RenderHelpMenu` | method | SparkEditor | [EditorMenuBar.cpp:L670](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L670) | | | `EditorUI::RenderMainMenuBar` | method | SparkEditor | [EditorMenuBar.cpp:L113](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L113) | | -| `EditorUI::RenderModalDialogs` | method | SparkEditor | [EditorUI.cpp:L1119](../../SparkEditor/Source/Core/EditorUI.cpp#L1119) | | -| `EditorUI::RenderPanels` | method | SparkEditor | [EditorUI.cpp:L1076](../../SparkEditor/Source/Core/EditorUI.cpp#L1076) | | -| `EditorUI::RenderRecoveryModal` | method | SparkEditor | [EditorUI.cpp:L1904](../../SparkEditor/Source/Core/EditorUI.cpp#L1904) | | -| `EditorUI::RenderStatusBar` | method | SparkEditor | [EditorUI.cpp:L939](../../SparkEditor/Source/Core/EditorUI.cpp#L939) | | +| `EditorUI::RenderModalDialogs` | method | SparkEditor | [EditorUI.cpp:L1139](../../SparkEditor/Source/Core/EditorUI.cpp#L1139) | | +| `EditorUI::RenderPanels` | method | SparkEditor | [EditorUI.cpp:L1096](../../SparkEditor/Source/Core/EditorUI.cpp#L1096) | | +| `EditorUI::RenderRecoveryModal` | method | SparkEditor | [EditorUI.cpp:L1924](../../SparkEditor/Source/Core/EditorUI.cpp#L1924) | | +| `EditorUI::RenderStatusBar` | method | SparkEditor | [EditorUI.cpp:L959](../../SparkEditor/Source/Core/EditorUI.cpp#L959) | | | `EditorUI::RenderToolbar` | method | SparkEditor | [EditorMenuBar.cpp:L830](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L830) | | | `EditorUI::RenderToolbarPlayControls` | method | SparkEditor | [EditorMenuBar.cpp:L775](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L775) | | | `EditorUI::RenderToolbarSnapControls` | method | SparkEditor | [EditorMenuBar.cpp:L817](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L817) | | | `EditorUI::RenderToolbarTransformTools` | method | SparkEditor | [EditorMenuBar.cpp:L713](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L713) | | -| `EditorUI::RenderUnsavedChangesDialog` | method | SparkEditor | [EditorUI.cpp:L1152](../../SparkEditor/Source/Core/EditorUI.cpp#L1152) | | -| `EditorUI::RenderWelcomeScreen` | method | SparkEditor | [EditorUI.cpp:L1201](../../SparkEditor/Source/Core/EditorUI.cpp#L1201) | | +| `EditorUI::RenderUnsavedChangesDialog` | method | SparkEditor | [EditorUI.cpp:L1172](../../SparkEditor/Source/Core/EditorUI.cpp#L1172) | | +| `EditorUI::RenderWelcomeScreen` | method | SparkEditor | [EditorUI.cpp:L1221](../../SparkEditor/Source/Core/EditorUI.cpp#L1221) | | | `EditorUI::RenderWindowMenu` | method | SparkEditor | [EditorMenuBar.cpp:L502](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L502) | | -| `EditorUI::RequestCreateProject` | method | SparkEditor | [EditorUI.cpp:L2100](../../SparkEditor/Source/Core/EditorUI.cpp#L2100) | | -| `EditorUI::RequestDocumentTransition` | method | SparkEditor | [EditorUI.cpp:L2115](../../SparkEditor/Source/Core/EditorUI.cpp#L2115) | | -| `EditorUI::RequestExitWithConfirmation` | method | SparkEditor | [EditorUI.cpp:L2183](../../SparkEditor/Source/Core/EditorUI.cpp#L2183) | | -| `EditorUI::RequestOpenProject` | method | SparkEditor | [EditorUI.cpp:L2089](../../SparkEditor/Source/Core/EditorUI.cpp#L2089) | | -| `EditorUI::ResetRecoveryCaptureTracking` | method | SparkEditor | [EditorUI.cpp:L1589](../../SparkEditor/Source/Core/EditorUI.cpp#L1589) | | -| `EditorUI::ResetToDefaultLayout` | method | SparkEditor | [EditorUI.cpp:L1403](../../SparkEditor/Source/Core/EditorUI.cpp#L1403) | | -| `EditorUI::ResetWorldAfterProjectClose` | method | SparkEditor | [EditorUI.cpp:L2228](../../SparkEditor/Source/Core/EditorUI.cpp#L2228) | | -| `EditorUI::RestorePendingRecovery` | method | SparkEditor | [EditorUI.cpp:L1756](../../SparkEditor/Source/Core/EditorUI.cpp#L1756) | | -| `EditorUI::RewirePanelsToWorld` | method | SparkEditor | [EditorUI.cpp:L2314](../../SparkEditor/Source/Core/EditorUI.cpp#L2314) | | -| `EditorUI::SaveCurrentScene` | method | SparkEditor | [EditorUI.cpp:L2395](../../SparkEditor/Source/Core/EditorUI.cpp#L2395) | | -| `EditorUI::SaveLayout` | method | SparkEditor | [EditorUI.cpp:L1305](../../SparkEditor/Source/Core/EditorUI.cpp#L1305) | | -| `EditorUI::SaveScene` | method | SparkEditor | [EditorUI.cpp:L2237](../../SparkEditor/Source/Core/EditorUI.cpp#L2237) | | +| `EditorUI::RequestCreateProject` | method | SparkEditor | [EditorUI.cpp:L2120](../../SparkEditor/Source/Core/EditorUI.cpp#L2120) | | +| `EditorUI::RequestDocumentTransition` | method | SparkEditor | [EditorUI.cpp:L2135](../../SparkEditor/Source/Core/EditorUI.cpp#L2135) | | +| `EditorUI::RequestExitWithConfirmation` | method | SparkEditor | [EditorUI.cpp:L2203](../../SparkEditor/Source/Core/EditorUI.cpp#L2203) | | +| `EditorUI::RequestOpenProject` | method | SparkEditor | [EditorUI.cpp:L2109](../../SparkEditor/Source/Core/EditorUI.cpp#L2109) | | +| `EditorUI::ResetRecoveryCaptureTracking` | method | SparkEditor | [EditorUI.cpp:L1609](../../SparkEditor/Source/Core/EditorUI.cpp#L1609) | | +| `EditorUI::ResetToDefaultLayout` | method | SparkEditor | [EditorUI.cpp:L1423](../../SparkEditor/Source/Core/EditorUI.cpp#L1423) | | +| `EditorUI::ResetWorldAfterProjectClose` | method | SparkEditor | [EditorUI.cpp:L2248](../../SparkEditor/Source/Core/EditorUI.cpp#L2248) | | +| `EditorUI::RestorePendingRecovery` | method | SparkEditor | [EditorUI.cpp:L1776](../../SparkEditor/Source/Core/EditorUI.cpp#L1776) | | +| `EditorUI::RewirePanelsToWorld` | method | SparkEditor | [EditorUI.cpp:L2334](../../SparkEditor/Source/Core/EditorUI.cpp#L2334) | | +| `EditorUI::SaveCurrentScene` | method | SparkEditor | [EditorUI.cpp:L2427](../../SparkEditor/Source/Core/EditorUI.cpp#L2427) | | +| `EditorUI::SaveLayout` | method | SparkEditor | [EditorUI.cpp:L1325](../../SparkEditor/Source/Core/EditorUI.cpp#L1325) | | +| `EditorUI::SaveScene` | method | SparkEditor | [EditorUI.cpp:L2257](../../SparkEditor/Source/Core/EditorUI.cpp#L2257) | | | `EditorUI::SetDefaultPanelVisibility` | method | SparkEditor | [EditorPanelFactoryMetadata.cpp:L186](../../SparkEditor/Source/Core/EditorPanelFactoryMetadata.cpp#L186) | | -| `EditorUI::SetEngineConnected` | method | SparkEditor | [EditorUI.cpp:L1495](../../SparkEditor/Source/Core/EditorUI.cpp#L1495) | | -| `EditorUI::SetFrameNumber` | method | SparkEditor | [EditorUI.cpp:L1485](../../SparkEditor/Source/Core/EditorUI.cpp#L1485) | | -| `EditorUI::SetGraphicsDevice` | method | SparkEditor | [EditorUI.cpp:L2530](../../SparkEditor/Source/Core/EditorUI.cpp#L2530) | | -| `EditorUI::SetPanelVisible` | method | SparkEditor | [EditorUI.cpp:L1296](../../SparkEditor/Source/Core/EditorUI.cpp#L1296) | | -| `EditorUI::SetTransformTool` | method | SparkEditor | [EditorUI.cpp:L2287](../../SparkEditor/Source/Core/EditorUI.cpp#L2287) | | -| `EditorUI::SetupDefaultDockLayout` | method | SparkEditor | [EditorUI.cpp:L784](../../SparkEditor/Source/Core/EditorUI.cpp#L784) | | -| `EditorUI::ShowModalDialog` | method | SparkEditor | [EditorUI.cpp:L2053](../../SparkEditor/Source/Core/EditorUI.cpp#L2053) | | -| `EditorUI::ShowNewProjectDialog` | method | SparkEditor | [EditorUI.cpp:L2065](../../SparkEditor/Source/Core/EditorUI.cpp#L2065) | | -| `EditorUI::ShowNotification` | method | SparkEditor | [EditorUI.cpp:L1431](../../SparkEditor/Source/Core/EditorUI.cpp#L1431) | | -| `EditorUI::ShowOpenProjectDialog` | method | SparkEditor | [EditorUI.cpp:L2073](../../SparkEditor/Source/Core/EditorUI.cpp#L2073) | | +| `EditorUI::SetEngineConnected` | method | SparkEditor | [EditorUI.cpp:L1515](../../SparkEditor/Source/Core/EditorUI.cpp#L1515) | | +| `EditorUI::SetFrameNumber` | method | SparkEditor | [EditorUI.cpp:L1505](../../SparkEditor/Source/Core/EditorUI.cpp#L1505) | | +| `EditorUI::SetGraphicsDevice` | method | SparkEditor | [EditorUI.cpp:L2562](../../SparkEditor/Source/Core/EditorUI.cpp#L2562) | | +| `EditorUI::SetPanelVisible` | method | SparkEditor | [EditorUI.cpp:L1316](../../SparkEditor/Source/Core/EditorUI.cpp#L1316) | | +| `EditorUI::SetTransformTool` | method | SparkEditor | [EditorUI.cpp:L2307](../../SparkEditor/Source/Core/EditorUI.cpp#L2307) | | +| `EditorUI::SetupDefaultDockLayout` | method | SparkEditor | [EditorUI.cpp:L804](../../SparkEditor/Source/Core/EditorUI.cpp#L804) | | +| `EditorUI::ShowModalDialog` | method | SparkEditor | [EditorUI.cpp:L2073](../../SparkEditor/Source/Core/EditorUI.cpp#L2073) | | +| `EditorUI::ShowNewProjectDialog` | method | SparkEditor | [EditorUI.cpp:L2085](../../SparkEditor/Source/Core/EditorUI.cpp#L2085) | | +| `EditorUI::ShowNotification` | method | SparkEditor | [EditorUI.cpp:L1451](../../SparkEditor/Source/Core/EditorUI.cpp#L1451) | | +| `EditorUI::ShowOpenProjectDialog` | method | SparkEditor | [EditorUI.cpp:L2093](../../SparkEditor/Source/Core/EditorUI.cpp#L2093) | | | `EditorUI::ShowOpenSceneDialog` | method | SparkEditor | [EditorMenuBar.cpp:L86](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L86) | | | `EditorUI::ShowOpenSceneDialogNow` | method | SparkEditor | [EditorMenuBar.cpp:L91](../../SparkEditor/Source/Core/EditorMenuBar.cpp#L91) | | -| `EditorUI::ShowProjectBrowser` | method | SparkEditor | [EditorUI.cpp:L2081](../../SparkEditor/Source/Core/EditorUI.cpp#L2081) | | -| `EditorUI::Shutdown` | method | SparkEditor | [EditorUI.cpp:L812](../../SparkEditor/Source/Core/EditorUI.cpp#L812) | | -| `EditorUI::StopPlayModeForDocumentTransition` | method | SparkEditor | [EditorUI.cpp:L2257](../../SparkEditor/Source/Core/EditorUI.cpp#L2257) | | -| `EditorUI::SuppressRecoveryAfterExplicitDocumentDiscard` | method | SparkEditor | [EditorUI.cpp:L1733](../../SparkEditor/Source/Core/EditorUI.cpp#L1733) | | -| `EditorUI::SwapWorld` | method | SparkEditor | [EditorUI.cpp:L2263](../../SparkEditor/Source/Core/EditorUI.cpp#L2263) | | -| `EditorUI::Update` | method | SparkEditor | [EditorUI.cpp:L569](../../SparkEditor/Source/Core/EditorUI.cpp#L569) | | -| `EditorUI::UpdateAssetDatabaseInfo` | method | SparkEditor | [EditorUI.cpp:L1500](../../SparkEditor/Source/Core/EditorUI.cpp#L1500) | | -| `EditorUI::UpdateSceneInfo` | method | SparkEditor | [EditorUI.cpp:L1506](../../SparkEditor/Source/Core/EditorUI.cpp#L1506) | | -| `EditorUI::UpdateStats` | method | SparkEditor | [EditorUI.cpp:L1265](../../SparkEditor/Source/Core/EditorUI.cpp#L1265) | | +| `EditorUI::ShowProjectBrowser` | method | SparkEditor | [EditorUI.cpp:L2101](../../SparkEditor/Source/Core/EditorUI.cpp#L2101) | | +| `EditorUI::Shutdown` | method | SparkEditor | [EditorUI.cpp:L832](../../SparkEditor/Source/Core/EditorUI.cpp#L832) | | +| `EditorUI::StopPlayModeForDocumentTransition` | method | SparkEditor | [EditorUI.cpp:L2277](../../SparkEditor/Source/Core/EditorUI.cpp#L2277) | | +| `EditorUI::SuppressRecoveryAfterExplicitDocumentDiscard` | method | SparkEditor | [EditorUI.cpp:L1753](../../SparkEditor/Source/Core/EditorUI.cpp#L1753) | | +| `EditorUI::SwapWorld` | method | SparkEditor | [EditorUI.cpp:L2283](../../SparkEditor/Source/Core/EditorUI.cpp#L2283) | | +| `EditorUI::Update` | method | SparkEditor | [EditorUI.cpp:L589](../../SparkEditor/Source/Core/EditorUI.cpp#L589) | | +| `EditorUI::UpdateAssetDatabaseInfo` | method | SparkEditor | [EditorUI.cpp:L1520](../../SparkEditor/Source/Core/EditorUI.cpp#L1520) | | +| `EditorUI::UpdateSceneInfo` | method | SparkEditor | [EditorUI.cpp:L1526](../../SparkEditor/Source/Core/EditorUI.cpp#L1526) | | +| `EditorUI::UpdateStats` | method | SparkEditor | [EditorUI.cpp:L1285](../../SparkEditor/Source/Core/EditorUI.cpp#L1285) | | | `EditorUI::WireCallbacks` | method | SparkEditor | [EditorUI.cpp:L408](../../SparkEditor/Source/Core/EditorUI.cpp#L408) | | | `EditorWindowManager` | class | SparkEditor | [EditorWindowManager.h:L71](../../SparkEditor/Source/Core/EditorWindowManager.h#L71) | Manages multi-monitor floating windows and layout persistence | | `EditorWindowManager` | class | Tests | [TestEditorWindowManager.cpp:L30](../../Tests/TestEditorWindowManager.cpp#L30) | | @@ -10218,7 +10237,7 @@ | `ElevatorObject::Interact` | method | GameModules | [InteractiveObject.cpp:L365](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.cpp#L365) | | | `ElevatorObject::Update` | method | GameModules | [InteractiveObject.cpp:L344](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.cpp#L344) | | | `ElevatorState` | enum | GameModules | [InteractiveObject.h:L240](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L240) | Elevator/lift platform | -| `ElfW` | function | SparkEngine | [CrashHandler.cpp:L1861](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1861) | | +| `ElfW` | function | SparkEngine | [CrashHandler.cpp:L1862](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1862) | | | `embedded` | function | Tests | [TestEditorAssetReference.cpp:L28](../../Tests/TestEditorAssetReference.cpp#L28) | | | `EmbeddedSnapshot` | enum | GameModules | [OWPersistence.inl:L106](../../GameModules/SparkGameOpenWorld/Source/Persistence/OWPersistence.inl#L106) | | | `Emit` | function | SparkInstaller | [Installer.cpp:L40](../../SparkInstaller/src/Installer.cpp#L40) | | @@ -10240,9 +10259,11 @@ | `EmitStep` | function | SparkEngine | [VisualScriptEmitter.h:L119](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L119) | | | `emitted` | function | SparkEngine | [MeshOptimizer.h:L128](../../SparkEngine/Source/Graphics/MeshOptimizer.h#L128) | | | `emitter` | function | SparkEngine | [VisualScriptCompiler.cpp:L210](../../SparkEngine/Source/Engine/Scripting/VisualScriptCompiler.cpp#L210) | | +| `emitter` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L478](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L478) | | | `EmitterShape` | enum | SparkEngine | [GPUParticleTypes.h:L22](../../SparkEngine/Source/Graphics/GPUParticleTypes.h#L22) | Emitter shape types for particle spawning | | `EmitterShape` | enum | SparkEngine | [ParticleSystem.h:L31](../../SparkEngine/Source/Graphics/ParticleSystem.h#L31) | Emitter shape types for particle spawning | | `EmplaceOrReplace` | function | SparkEngine | [CoreComponentSerializersInternal.h:L47](../../SparkEngine/Source/Engine/Editor/CoreComponentSerializersInternal.h#L47) | | +| `Empty` | function | GameModules | [TFReplicationRefresh.h:L42](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L42) | | | `empty` | function | SparkEngine | [AlignedHeapArray.h:L191](../../SparkEngine/Source/Utils/AlignedHeapArray.h#L191) | | | `Empty` | function | SparkEngine | [Octree.h:L160](../../SparkEngine/Source/Utils/Octree.h#L160) | Check if the tree is empty. | | `empty` | function | Tests | [TestAlignedHeapArray.cpp:L99](../../Tests/TestAlignedHeapArray.cpp#L99) | | @@ -10420,6 +10441,7 @@ | `EndFrame` | function | Tests | [TestTransientBufferAllocatorPhaseX.cpp:L137](../../Tests/TestTransientBufferAllocatorPhaseX.cpp#L137) | | | `EndGPUSample` | function | SparkEditor | [PerformanceProfiler.h:L142](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L142) | End GPU profiling sample | | `EndGPUTimer` | function | SparkEngine | [Profiler.h:L228](../../SparkEngine/Source/Utils/Profiler.h#L228) | End a GPU timing query | +| `EndInputObservation` | function | GameModules | [Game.h:L651](../../GameModules/SparkGameFPS/Source/Game/Game.h#L651) | Process input and translate to game actions | | `endless` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L242](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L242) | | | `EndlessAnswerBuffer` | class | SparkCrashReporter | [CrashReporterConsentTests.cpp:L214](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L214) | | | `EndlessAnswerBuffer` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L217](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L217) | | @@ -10492,8 +10514,9 @@ | `EngineBootstrap::TopologicalSort` | method | SparkEngine | [EngineBootstrap.cpp:L296](../../SparkEngine/Source/Core/EngineBootstrap.cpp#L296) | | | `EngineConnectionStatus` | enum | SparkEditor | [IntegrationTypes.h:L27](../../SparkEditor/Source/Integration/IntegrationTypes.h#L27) | Engine connection status | | `EngineConnectionStatus` | enum | SparkEditor | [SparkEngineIntegration.h:L37](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L37) | Engine connection status | -| `EngineContext` | class | SparkEngine | [EngineContext.h:L95](../../SparkEngine/Source/Core/EngineContext.h#L95) | | +| `EngineContext` | class | SparkEngine | [EngineContext.h:L96](../../SparkEngine/Source/Core/EngineContext.h#L96) | | | `EngineContext` | class | SparkEngine | [EngineRuntime.h:L34](../../SparkEngine/Source/Core/EngineRuntime.h#L34) | | +| `EngineContext` | class | SparkEngine | [EngineSdkWeather.h:L8](../../SparkEngine/Source/Core/EngineSdkWeather.h#L8) | Context-owned implementation of the public weather command service. | | `engineContext` | function | Tests | [TestLegacyGameObjectMaterial.cpp:L49](../../Tests/TestLegacyGameObjectMaterial.cpp#L49) | | | `EngineContext::Get` | method | SparkEngine | [EngineContext.cpp:L26](../../SparkEngine/Source/Core/EngineContext.cpp#L26) | | | `EngineContext::Get` | method | SparkEngine | [EngineDiagnostics.cpp:L85](../../SparkEngine/Source/Core/EngineDiagnostics.cpp#L85) | | @@ -10527,6 +10550,9 @@ | `EngineSdkStateValidation` | class | SparkEngine | [EngineSdkStateValidation.h:L25](../../SparkEngine/Source/Core/EngineSdkStateValidation.h#L25) | | | `EngineSdkStateValidation::AddRule` | method | SparkEngine | [EngineSdkStateValidation.cpp:L13](../../SparkEngine/Source/Core/EngineSdkStateValidation.cpp#L13) | | | `EngineSdkStateValidation::RemoveRulesByCategory` | method | SparkEngine | [EngineSdkStateValidation.cpp:L33](../../SparkEngine/Source/Core/EngineSdkStateValidation.cpp#L33) | | +| `EngineSdkWeather` | class | SparkEngine | [EngineSdkWeather.h:L10](../../SparkEngine/Source/Core/EngineSdkWeather.h#L10) | Context-owned implementation of the public weather command service. | +| `EngineSdkWeather` | function | SparkEngine | [EngineSdkWeather.h:L13](../../SparkEngine/Source/Core/EngineSdkWeather.h#L13) | | +| `EngineSdkWeather::SetWeather` | method | SparkEngine | [EngineSdkWeather.cpp:L8](../../SparkEngine/Source/Core/EngineSdkWeather.cpp#L8) | | | `EngineSettings` | class | SparkEngine | [EngineSettings.h:L96](../../SparkEngine/Source/Core/EngineSettings.h#L96) | | | `EngineSettings` | class | SparkEngine | [InstabilitySimulator.h:L30](../../SparkEngine/Source/Engine/Networking/InstabilitySimulator.h#L30) | | | `EngineSettings` | class | Tests | [TestEngineSettingsParser.cpp:L166](../../Tests/TestEngineSettingsParser.cpp#L166) | | @@ -10750,6 +10776,8 @@ | `EntityTransformTrack::EvaluateScale` | method | SparkEngine | [Sequencer.cpp:L232](../../SparkEngine/Source/Engine/Cinematic/Sequencer.cpp#L232) | | | `EntityTransformTrack::GetDuration` | method | SparkEngine | [Sequencer.cpp:L189](../../SparkEngine/Source/Engine/Cinematic/Sequencer.cpp#L189) | | | `EntityVisitor` | alias | SparkEngine | [SpatialGrid.h:L91](../../SparkEngine/Source/Engine/World/SpatialGrid.h#L91) | | +| `Entries` | function | GameModules | [TFReplicationRefresh.h:L44](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L44) | | +| `Entry` | struct | GameModules | [TFReplicationRefresh.h:L47](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L47) | | | `Entry` | struct | GameModules | [TFTerrainModel.cpp:L45](../../GameModules/SparkGameMMOFPS/Source/World/TFTerrainModel.cpp#L45) | | | `Entry` | struct | SparkDaemon | [AssetService.h:L105](../../SparkDaemon/src/AssetService.h#L105) | | | `Entry` | struct | SparkDaemon | [ShaderService.h:L118](../../SparkDaemon/src/ShaderService.h#L118) | | @@ -10761,7 +10789,7 @@ | `Entry` | struct | SparkEngine | [ScheduledCallback.h:L176](../../SparkEngine/Source/Utils/ScheduledCallback.h#L176) | Cancel all pending callbacks. | | `Entry` | struct | Tests | [TestAdversarialEngine.cpp:L1246](../../Tests/TestAdversarialEngine.cpp#L1246) | | | `Entry` | struct | Tests | [TestScheduledCallback.cpp:L74](../../Tests/TestScheduledCallback.cpp#L74) | | -| `Entry` | struct | Tests | [TestSparkPak.cpp:L142](../../Tests/TestSparkPak.cpp#L142) | | +| `Entry` | struct | Tests | [TestSparkPak.cpp:L148](../../Tests/TestSparkPak.cpp#L148) | | | `EntryIter` | alias | SparkDaemon | [AssetService.h:L111](../../SparkDaemon/src/AssetService.h#L111) | | | `EntryIter` | alias | SparkDaemon | [ShaderService.h:L124](../../SparkDaemon/src/ShaderService.h#L124) | | | `EntryJson` | function | Tests | [TestGoldenImageTest.cpp:L101](../../Tests/TestGoldenImageTest.cpp#L101) | | @@ -10802,7 +10830,7 @@ | `EQSResult` | struct | SparkEngine | [EnvironmentQuery.h:L443](../../SparkEngine/Source/Engine/AI/EnvironmentQuery.h#L443) | | | `EQSScorer` | class | SparkEngine | [EnvironmentQuery.h:L335](../../SparkEngine/Source/Engine/AI/EnvironmentQuery.h#L335) | Base class for EQS scorers that assign weighted scores | | `EQSTest` | class | SparkEngine | [EnvironmentQuery.h:L217](../../SparkEngine/Source/Engine/AI/EnvironmentQuery.h#L217) | Base class for EQS tests that filter candidate positions | -| `EqualsIgnoringCase` | function | SparkEngine | [SceneManager.cpp:L272](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L272) | | +| `EqualsIgnoringCase` | function | SparkEngine | [SceneManager.cpp:L298](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L298) | | | `EqualsNoCase` | function | GameModules | [TFOutfitSystemInternal.h:L28](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystemInternal.h#L28) | | | `EqualsNoCase` | function | GameModules | [TFOutfitStore.cpp:L34](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFOutfitStore.cpp#L34) | | | `Equip` | function | GameModules | [RPGCharacterSystem.h:L134](../../GameModules/SparkGameRPG/Source/Character/RPGCharacterSystem.h#L134) | | @@ -10813,6 +10841,7 @@ | `EquipStarterGear` | function | GameModules | [RPGDemoSession.h:L55](../../GameModules/SparkGameRPG/Source/Gameplay/RPGDemoSession.h#L55) | | | `EquipTool` | function | GameModules | [Player.h:L406](../../GameModules/SparkGameFPS/Source/Game/Player.h#L406) | Switch to class tool | | `equivalent` | function | Tests | [TestShaderHotReload.cpp:L134](../../Tests/TestShaderHotReload.cpp#L134) | | +| `Erase` | function | GameModules | [TFReplicationRefresh.h:L40](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L40) | | | `Erase` | function | GameModules | [TFPlayerMeta.h:L104](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFPlayerMeta.h#L104) | | | `EraseByIterator` | function | SparkDaemon | [AssetService.h:L124](../../SparkDaemon/src/AssetService.h#L124) | | | `EraseIf` | function | SparkEngine | [ContainerUtils.h:L106](../../SparkEngine/Source/Utils/ContainerUtils.h#L106) | Erase all elements matching a predicate. | @@ -10831,7 +10860,7 @@ | `Err` | function | SparkEngine | [LocalFileCache.h:L256](../../SparkEngine/Source/Utils/LocalFileCache.h#L256) | | | `Err` | function | SparkEngine | [Result.h:L146](../../SparkEngine/Source/Utils/Result.h#L146) | | | `err` | function | Tests | [TestResult.cpp:L35](../../Tests/TestResult.cpp#L35) | | -| `error` | function | SparkEditor | [EditorUI.cpp:L1955](../../SparkEditor/Source/Core/EditorUI.cpp#L1955) | | +| `error` | function | SparkEditor | [EditorUI.cpp:L1975](../../SparkEditor/Source/Core/EditorUI.cpp#L1975) | | | `Error` | function | SparkEngine | [EngineSdkLogger.h:L29](../../SparkEngine/Source/Core/EngineSdkLogger.h#L29) | | | `error` | function | SparkEngine | [Expected.h:L40](../../SparkEngine/Source/Utils/Expected.h#L40) | | | `error` | function | SparkEngine | [Expected.h:L41](../../SparkEngine/Source/Utils/Expected.h#L41) | | @@ -10911,18 +10940,8 @@ | `EscapeJsonString` | function | SparkEditor | [EditorLayoutManager.cpp:L274](../../SparkEditor/Source/Core/EditorLayoutManager.cpp#L274) | | | `EscapeJsonString` | function | SparkEditor | [EditorLayoutManager.h:L242](../../SparkEditor/Source/Core/EditorLayoutManager.h#L242) | | | `EscapeKVField` | function | SparkEngine | [AsyncDatabase.cpp:L170](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.cpp#L170) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L336](../../SparkEditor/Source/Core/ProjectDocument.cpp#L336) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L346](../../SparkEditor/Source/Core/ProjectDocument.cpp#L346) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L486](../../SparkEditor/Source/Core/ProjectDocument.cpp#L486) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L487](../../SparkEditor/Source/Core/ProjectDocument.cpp#L487) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L488](../../SparkEditor/Source/Core/ProjectDocument.cpp#L488) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L489](../../SparkEditor/Source/Core/ProjectDocument.cpp#L489) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L492](../../SparkEditor/Source/Core/ProjectDocument.cpp#L492) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L494](../../SparkEditor/Source/Core/ProjectDocument.cpp#L494) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L495](../../SparkEditor/Source/Core/ProjectDocument.cpp#L495) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L565](../../SparkEditor/Source/Core/ProjectDocument.cpp#L565) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L566](../../SparkEditor/Source/Core/ProjectDocument.cpp#L566) | | -| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L567](../../SparkEditor/Source/Core/ProjectDocument.cpp#L567) | | +| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L337](../../SparkEditor/Source/Core/ProjectDocument.cpp#L337) | | +| `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.cpp:L347](../../SparkEditor/Source/Core/ProjectDocument.cpp#L347) | | | `EscapeProjectJsonString` | function | SparkEditor | [ProjectDocument.h:L62](../../SparkEditor/Source/Core/ProjectDocument.h#L62) | Escape a string for a JSON string literal (quotes, backslash, control bytes). | | `EscapeRemoteTextForLog` | function | SparkEngine | [DedicatedServer.h:L373](../../SparkEngine/Source/Engine/Networking/DedicatedServer.h#L373) | | | `EscapeSaslName` | function | GameModules | [TFAccountSystem.cpp:L172](../../GameModules/SparkGameMMOFPS/Source/Account/TFAccountSystem.cpp#L172) | | @@ -11033,7 +11052,7 @@ | `EventBus` | class | SparkEngine | [PhysicsSystem.h:L38](../../SparkEngine/Source/Physics/PhysicsSystem.h#L38) | | | `EventBus` | class | SparkEngine | [EventBus.h:L67](../../SparkEngine/Source/Utils/EventBus.h#L67) | | | `EventBus` | class | SparkEngine | [EventBus.h:L154](../../SparkEngine/Source/Utils/EventBus.h#L154) | Type-safe publish/subscribe event bus. | -| `EventBus` | class | SparkSDK | [IEngineContext.h:L36](../../SparkSDK/Include/Spark/IEngineContext.h#L36) | | +| `EventBus` | class | SparkSDK | [IEngineContext.h:L37](../../SparkSDK/Include/Spark/IEngineContext.h#L37) | | | `EventBus` | class | SparkServer | [ServerApplication.h:L29](../../SparkServer/src/ServerApplication.h#L29) | | | `EventBus` | class | Tests | [TestEventSystem.cpp:L19](../../Tests/TestEventSystem.cpp#L19) | | | `EventCallback` | alias | SparkEngine | [Sequencer.h:L254](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L254) | | @@ -11214,7 +11233,7 @@ | `ExecuteActions` | function | Tests | [TestEventResponseSystem.cpp:L159](../../Tests/TestEventResponseSystem.cpp#L159) | | | `ExecuteCallback` | alias | SparkEngine | [RenderGraphPass.h:L44](../../SparkEngine/Source/Graphics/RenderGraphPass.h#L44) | | | `ExecuteCommand` | function | SparkConsole | [CommandRegistry.h:L62](../../SparkConsole/src/CommandRegistry.h#L62) | Execute a registered command by name. | -| `ExecuteCommand` | function | SparkConsole | [ConsoleApp.h:L110](../../SparkConsole/src/ConsoleApp.h#L110) | | +| `ExecuteCommand` | function | SparkConsole | [ConsoleApp.h:L111](../../SparkConsole/src/ConsoleApp.h#L111) | | | `ExecuteCommand` | function | SparkEditor | [EditorUI.h:L234](../../SparkEditor/Source/Core/EditorUI.h#L234) | | | `ExecuteCommand` | function | SparkEditor | [ConsolePanel.h:L125](../../SparkEditor/Source/Panels/ConsolePanel.h#L125) | Execute a command | | `ExecuteCommand` | function | SparkEditor | [EditorAutomation.h:L233](../../SparkEditor/Source/Panels/EditorAutomation.h#L233) | Execute a command by name with arguments | @@ -11236,9 +11255,9 @@ | `ExecuteConsoleCommand` | function | SparkEditor | [SparkEngineIntegration.h:L458](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L458) | Execute console command in engine | | `ExecuteConsoleCommand` | function | SparkEngine | [RemoteDebugSystem.h:L612](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugSystem.h#L612) | Execute a console command on the remote game. | | `ExecuteDLSS` | function | SparkEngine | [UpscalingSystem.h:L198](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L198) | | -| `ExecuteDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2097](../../SparkEditor/Source/Core/EditorUI.cpp#L2097) | | -| `ExecuteDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2112](../../SparkEditor/Source/Core/EditorUI.cpp#L2112) | | -| `ExecuteDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2119](../../SparkEditor/Source/Core/EditorUI.cpp#L2119) | | +| `ExecuteDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2117](../../SparkEditor/Source/Core/EditorUI.cpp#L2117) | | +| `ExecuteDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2132](../../SparkEditor/Source/Core/EditorUI.cpp#L2132) | | +| `ExecuteDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2139](../../SparkEditor/Source/Core/EditorUI.cpp#L2139) | | | `ExecuteDocumentTransition` | function | SparkEditor | [EditorUI.h:L450](../../SparkEditor/Source/Core/EditorUI.h#L450) | | | `ExecuteFn` | alias | SparkEngine | [RenderGraphBuilder.h:L178](../../SparkEngine/Source/Graphics/RenderGraph/RenderGraphBuilder.h#L178) | User-supplied rendering callbacks for each standard pass. | | `ExecuteFrame` | function | SparkEngine | [RenderPipeline.h:L125](../../SparkEngine/Source/Graphics/RenderPipeline.h#L125) | | @@ -11274,7 +11293,7 @@ | `ExeRelative` | function | SparkInstaller | [PortableGitCacheTests.cpp:L39](../../SparkInstaller/tests/PortableGitCacheTests.cpp#L39) | | | `ExhibitProp` | struct | GameModules | [GameplayShowcase.cpp:L586](../../GameModules/SparkGame/Source/Core/GameplayShowcase.cpp#L586) | | | `existing` | struct | SparkDaemon | [DaemonServer.cpp:L381](../../SparkDaemon/src/DaemonServer.cpp#L381) | | -| `existing` | struct | SparkEngine | [SceneManager.cpp:L423](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L423) | | +| `existing` | struct | SparkEngine | [SceneManager.cpp:L471](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L471) | | | `existing` | struct | SparkGateway | [GatewayAreaControl.cpp:L287](../../SparkGateway/src/GatewayAreaControl.cpp#L287) | | | `ExistingDefaultAudio` | function | SparkEngine | [StartupSplash.cpp:L375](../../SparkEngine/Source/Core/StartupSplash.cpp#L375) | | | `Exists` | function | SparkEngine | [SparkPak.h:L138](../../SparkEngine/Source/Core/SparkPak.h#L138) | Check whether a virtual path exists in this archive. | @@ -11283,7 +11302,7 @@ | `Exists` | function | SparkEngine | [VirtualFileSystem.h:L131](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L131) | Construct a provider rooted at the given directory. | | `Exists` | function | SparkEngine | [VirtualFileSystem.h:L208](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L208) | Check whether any mount contains the given file. | | `Exists` | function | SparkInstaller | [InstallState.h:L46](../../SparkInstaller/src/InstallState.h#L46) | | -| `Exists` | function | Tests | [TestSparkPak.cpp:L223](../../Tests/TestSparkPak.cpp#L223) | | +| `Exists` | function | Tests | [TestSparkPak.cpp:L229](../../Tests/TestSparkPak.cpp#L229) | | | `ExistsWithExactCase` | function | Tests | [TestAssetManifestReal.cpp:L283](../../Tests/TestAssetManifestReal.cpp#L283) | | | `ExistsWithExactCase` | function | Tests | [TestGameModuleMMO.cpp:L82](../../Tests/TestGameModuleMMO.cpp#L82) | | | `ExitFn` | alias | SparkSDK | [StateMachine.h:L83](../../SparkSDK/Include/Spark/StateMachine.h#L83) | | @@ -11321,6 +11340,7 @@ | `Expectation` | struct | Tests | [TestShaderCompilerReal.cpp:L424](../../Tests/TestShaderCompilerReal.cpp#L424) | | | `ExpectBackendsAgree` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L1126](../../Tests/TestRHI225D3D12ParityReal.cpp#L1126) | | | `ExpectBinding` | function | Tests | [TestGPUDrivenRendererD3D11.cpp:L58](../../Tests/TestGPUDrivenRendererD3D11.cpp#L58) | | +| `ExpectCamera` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L42](../../Tests/TestFPSGameCameraReloadReal.cpp#L42) | | | `ExpectClean` | function | Tests | [TestRHI225D3D12ValidationReal.cpp:L132](../../Tests/TestRHI225D3D12ValidationReal.cpp#L132) | | | `ExpectClean` | function | Tests | [VulkanTestSupport.h:L131](../../Tests/VulkanTestSupport.h#L131) | | | `ExpectCleanProbe` | function | Tests | [TestAngelScriptStackAlignmentReal.cpp:L429](../../Tests/TestAngelScriptStackAlignmentReal.cpp#L429) | | @@ -11334,7 +11354,7 @@ | `expected` | function | Tests | [TestGoldenImageTest.cpp:L481](../../Tests/TestGoldenImageTest.cpp#L481) | | | `expected` | function | Tests | [TestRHI230VulkanGoldenReal.cpp:L521](../../Tests/TestRHI230VulkanGoldenReal.cpp#L521) | | | `expected` | function | Tests | [TestRHI240OpenGLGoldenReal.cpp:L716](../../Tests/TestRHI240OpenGLGoldenReal.cpp#L716) | | -| `expected` | function | Tests | [TestReliableChannel.cpp:L883](../../Tests/TestReliableChannel.cpp#L883) | | +| `expected` | function | Tests | [TestReliableChannel.cpp:L889](../../Tests/TestReliableChannel.cpp#L889) | | | `ExpectedBinaryOutput` | function | SparkBuild | [ProcessRunnerTests.cpp:L177](../../SparkBuild/tests/ProcessRunnerTests.cpp#L177) | | | `ExpectedFieldDiagnostic` | function | Tests | [TestModuleABIDiagnostics.cpp:L88](../../Tests/TestModuleABIDiagnostics.cpp#L88) | | | `expectedImage` | function | Tests | [RHI210D3D11GoldenSupport.h:L897](../../Tests/RHI210D3D11GoldenSupport.h#L897) | | @@ -11348,18 +11368,19 @@ | `ExpectFailureReported` | function | Tests | [TestOnlineServices.cpp:L226](../../Tests/TestOnlineServices.cpp#L226) | | | `ExpectFixtureRegistrations` | function | Tests | [TestLIFE200ModuleReloadLoopReal.cpp:L142](../../Tests/TestLIFE200ModuleReloadLoopReal.cpp#L142) | | | `ExpectIndexedInstanced` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L889](../../Tests/TestRHI225D3D12ParityReal.cpp#L889) | | -| `ExpectInstalledHost` | function | Tests | [TestEditorCookPackageReal.cpp:L256](../../Tests/TestEditorCookPackageReal.cpp#L256) | | +| `ExpectInstalledHost` | function | Tests | [TestEditorCookPackageReal.cpp:L267](../../Tests/TestEditorCookPackageReal.cpp#L267) | | | `ExpectLatchedFailure` | function | Tests | [TestLifecycleCompositionRootFailure.cpp:L156](../../Tests/TestLifecycleCompositionRootFailure.cpp#L156) | | | `ExpectMatricesNear` | function | Tests | [TestQuaternionStubsReal.cpp:L67](../../Tests/TestQuaternionStubsReal.cpp#L67) | | | `ExpectMonsterActorsMatch` | function | Tests | [TestMOD330ARPGWorldActors.cpp:L147](../../Tests/TestMOD330ARPGWorldActors.cpp#L147) | | | `ExpectMRTClearAndDraw` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L955](../../Tests/TestRHI225D3D12ParityReal.cpp#L955) | | +| `ExpectNear` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L29](../../Tests/TestFPSGameCameraReloadReal.cpp#L29) | | | `ExpectNothingLeftBehind` | function | Tests | [TestMOD390VisualScriptDiagnosticsReal.cpp:L147](../../Tests/TestMOD390VisualScriptDiagnosticsReal.cpp#L147) | | | `ExpectNoThreadGrowth` | function | Tests | [TestLIFE200ModuleReloadLoopReal.cpp:L151](../../Tests/TestLIFE200ModuleReloadLoopReal.cpp#L151) | | | `ExpectOutfitDocumentRejected` | function | Tests | [TestTFOutfitStore.cpp:L53](../../Tests/TestTFOutfitStore.cpp#L53) | | | `ExpectPost` | function | Tests | [TestFPSLANLoopback.cpp:L283](../../Tests/TestFPSLANLoopback.cpp#L283) | | | `ExpectQuaternionNear` | function | Tests | [TestQuaternionStubsReal.cpp:L58](../../Tests/TestQuaternionStubsReal.cpp#L58) | | | `ExpectRejected` | function | Tests | [TestSessionCompatibilityReal.cpp:L70](../../Tests/TestSessionCompatibilityReal.cpp#L70) | | -| `ExpectRejectedWithRollback` | function | Tests | [TestSceneManagerReflectedReal.cpp:L51](../../Tests/TestSceneManagerReflectedReal.cpp#L51) | | +| `ExpectRejectedWithRollback` | function | Tests | [TestSceneManagerReflectedReal.cpp:L76](../../Tests/TestSceneManagerReflectedReal.cpp#L76) | | | `ExpectRenderToTextureThenSample` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L997](../../Tests/TestRHI225D3D12ParityReal.cpp#L997) | | | `ExpectResult` | function | Tests | [TestHandoffParticipant.cpp:L61](../../Tests/TestHandoffParticipant.cpp#L61) | | | `ExpectRetiredFixtureFailsClosed` | function | Tests | [Test_persistence_SaveSystem.cpp:L2420](../../Tests/harden/Test_persistence_SaveSystem.cpp#L2420) | | @@ -11370,7 +11391,7 @@ | `ExpectSameItem` | function | Tests | [TestMOD330ARPGDungeonReal.cpp:L131](../../Tests/TestMOD330ARPGDungeonReal.cpp#L131) | | | `ExpectSameMonster` | function | Tests | [TestMOD330ARPGDungeonReal.cpp:L116](../../Tests/TestMOD330ARPGDungeonReal.cpp#L116) | | | `ExpectSameView` | function | Tests | [TestFPSLANLoopback.cpp:L289](../../Tests/TestFPSLANLoopback.cpp#L289) | | -| `ExpectSceneRecords` | function | Tests | [TestEditorCookPackageReal.cpp:L441](../../Tests/TestEditorCookPackageReal.cpp#L441) | | +| `ExpectSceneRecords` | function | Tests | [TestEditorCookPackageReal.cpp:L452](../../Tests/TestEditorCookPackageReal.cpp#L452) | | | `ExpectShippedBloomExtract` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L1044](../../Tests/TestRHI225D3D12ParityReal.cpp#L1044) | | | `ExpectSolidTriangle` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L683](../../Tests/TestRHI225D3D12ParityReal.cpp#L683) | | | `ExpectStderrRestored` | function | Tests | [TestSparkError.cpp:L150](../../Tests/TestSparkError.cpp#L150) | | @@ -11380,6 +11401,7 @@ | `ExpectTexturedQuadPoint` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L769](../../Tests/TestRHI225D3D12ParityReal.cpp#L769) | | | `ExpectTonemappedCubeFrame` | function | Tests | [TestRHI240LinuxForwardPassReal.cpp:L466](../../Tests/TestRHI240LinuxForwardPassReal.cpp#L466) | | | `ExpectValidResults` | function | Tests | [TestMOD380RacingCompleteRaceReal.cpp:L109](../../Tests/TestMOD380RacingCompleteRaceReal.cpp#L109) | | +| `ExpectVector` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L35](../../Tests/TestFPSGameCameraReloadReal.cpp#L35) | | | `ExpectVertexColorInterpolation` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L713](../../Tests/TestRHI225D3D12ParityReal.cpp#L713) | | | `ExpectViewportScissor` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L927](../../Tests/TestRHI225D3D12ParityReal.cpp#L927) | | | `ExpectWikiMatrixInStep` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L1149](../../Tests/TestRHI225D3D12ParityReal.cpp#L1149) | | @@ -11493,11 +11515,11 @@ | `f` | function | Tests | [TestGLSLPipelineIntegration.cpp:L326](../../Tests/TestGLSLPipelineIntegration.cpp#L326) | | | `f` | function | Tests | [TestGLSLPipelineIntegration.cpp:L356](../../Tests/TestGLSLPipelineIntegration.cpp#L356) | | | `f` | function | Tests | [TestGLSLPipelineIntegration.cpp:L503](../../Tests/TestGLSLPipelineIntegration.cpp#L503) | | -| `f` | function | Tests | [TestTFDataTables.cpp:L67](../../Tests/TestTFDataTables.cpp#L67) | | +| `f` | function | Tests | [TestTFDataTables.cpp:L58](../../Tests/TestTFDataTables.cpp#L58) | | | `f` | function | Tests | [TestTFOutfitStore.cpp:L353](../../Tests/TestTFOutfitStore.cpp#L353) | | | `f` | function | Tests | [TestTFOutfitStore.cpp:L610](../../Tests/TestTFOutfitStore.cpp#L610) | | | `f` | function | Tests | [TestTFOutfitStore.cpp:L647](../../Tests/TestTFOutfitStore.cpp#L647) | | -| `f` | function | Tests | [TestTFRegionLattice.cpp:L77](../../Tests/TestTFRegionLattice.cpp#L77) | | +| `f` | function | Tests | [TestTFRegionLattice.cpp:L70](../../Tests/TestTFRegionLattice.cpp#L70) | | | `F32` | function | GameModules | [RTSSkirmishSimulation.cpp:L51](../../GameModules/SparkGameRTS/Source/Simulation/RTSSkirmishSimulation.cpp#L51) | | | `Face` | struct | GameModules | [TFWorldSetupDraw.cpp:L178](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetupDraw.cpp#L178) | | | `faceData` | function | SparkEngine | [LightingSystemInternalWindowsIBL.cpp:L53](../../SparkEngine/Source/Graphics/LightingSystemInternalWindowsIBL.cpp#L53) | | @@ -11951,7 +11973,7 @@ | `fakeServer` | function | Tests | [TestNetTransportSecurity.cpp:L552](../../Tests/TestNetTransportSecurity.cpp#L552) | | | `fakeServer` | function | Tests | [TestNetTransportSecurity.cpp:L676](../../Tests/TestNetTransportSecurity.cpp#L676) | | | `FakeStore` | struct | Tests | [TestTFOnboarding.cpp:L1068](../../Tests/TestTFOnboarding.cpp#L1068) | | -| `FakeWeatherPort` | class | Tests | [TestFPSWeatherPort.cpp:L10](../../Tests/TestFPSWeatherPort.cpp#L10) | | +| `FakeWeatherPort` | class | Tests | [TestFPSWeatherPort.cpp:L12](../../Tests/TestFPSWeatherPort.cpp#L12) | | | `FakeWindowHandle` | function | Tests | [TestD3D11DeviceContractsReal.cpp:L73](../../Tests/TestD3D11DeviceContractsReal.cpp#L73) | | | `FallbackAsyncLoad` | function | SparkEngine | [DirectStorageLoader.h:L204](../../SparkEngine/Source/Engine/Streaming/DirectStorageLoader.h#L204) | Fallback: queue the request for the bounded I/O worker pool | | `FallbackLabel` | function | GameModules | [TFNameplates.cpp:L167](../../GameModules/SparkGameMMOFPS/Source/UI/TFNameplates.cpp#L167) | | @@ -11999,7 +12021,7 @@ | `FBXMeshData` | struct | SparkEngine | [FBXImporter.h:L59](../../SparkEngine/Source/Graphics/FBXImporter.h#L59) | Mesh geometry extracted from an FBX Geometry node. | | `fcntl` | function | SparkEngine | [ProcessLinux.cpp:L90](../../SparkEngine/Source/Utils/ProcessLinux.cpp#L90) | | | `fcol` | function | GameModules | [TFScoreboard.cpp:L363](../../GameModules/SparkGameMMOFPS/Source/UI/TFScoreboard.cpp#L363) | | -| `FdCloser` | struct | SparkEngine | [SceneManager.cpp:L376](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L376) | | +| `FdCloser` | struct | SparkEngine | [SceneManager.cpp:L416](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L416) | | | `FdCloser` | struct | SparkLauncher | [LauncherProcess.cpp:L519](../../SparkLauncher/src/LauncherProcess.cpp#L519) | | | `featureName` | function | SparkEngine | [GraphicsConsoleOpsWindows.cpp:L119](../../SparkEngine/Source/Graphics/GraphicsConsoleOpsWindows.cpp#L119) | | | `FeedbackEntry` | struct | SparkEngine | [VirtualTexture.h:L57](../../SparkEngine/Source/Graphics/VirtualTexture.h#L57) | A single entry from the GPU feedback buffer. | @@ -12043,7 +12065,7 @@ | `fields` | function | SparkDaemon | [OrchestrationService.cpp:L1282](../../SparkDaemon/src/OrchestrationService.cpp#L1282) | | | `fields` | function | SparkEditor | [PrefabTextFormat.cpp:L288](../../SparkEditor/Source/Prefabs/PrefabTextFormat.cpp#L288) | | | `Fields` | alias | Tests | [TestFPSLANLoopback.cpp:L51](../../Tests/TestFPSLANLoopback.cpp#L51) | | -| `fields` | function | Tests | [TestTF120Travel.cpp:L328](../../Tests/TestTF120Travel.cpp#L328) | | +| `fields` | function | Tests | [TestTF120Travel.cpp:L315](../../Tests/TestTF120Travel.cpp#L315) | | | `FieldSerializer` | alias | SparkEngine | [EntityReplicator.h:L41](../../SparkEngine/Source/Engine/Networking/EntityReplicator.h#L41) | Callback to serialize a single field into a byte buffer. | | `FieldSnapshot` | struct | SparkEngine | [DeltaSnapshotManager.h:L35](../../SparkEngine/Source/Engine/Networking/DeltaSnapshotManager.h#L35) | Snapshot of a single replicated field's serialized state. | | `FieldSnapshot` | struct | SparkEngine | [AngelScriptEngine.h:L516](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L516) | | @@ -12080,8 +12102,8 @@ | `file` | function | SparkEditor | [EditorCrashHandler.cpp:L837](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L837) | | | `file` | function | SparkEditor | [EditorLogger.cpp:L247](../../SparkEditor/Source/Core/EditorLogger.cpp#L247) | | | `file` | function | SparkEditor | [EditorTheme.cpp:L1408](../../SparkEditor/Source/Core/EditorTheme.cpp#L1408) | | -| `file` | function | SparkEditor | [EditorUI.cpp:L1982](../../SparkEditor/Source/Core/EditorUI.cpp#L1982) | | -| `file` | function | SparkEditor | [EditorUI.cpp:L2020](../../SparkEditor/Source/Core/EditorUI.cpp#L2020) | | +| `file` | function | SparkEditor | [EditorUI.cpp:L2002](../../SparkEditor/Source/Core/EditorUI.cpp#L2002) | | +| `file` | function | SparkEditor | [EditorUI.cpp:L2040](../../SparkEditor/Source/Core/EditorUI.cpp#L2040) | | | `file` | function | SparkEditor | [ProjectManager.cpp:L663](../../SparkEditor/Source/Core/ProjectManager.cpp#L663) | | | `file` | function | SparkEditor | [ProjectManager.cpp:L2189](../../SparkEditor/Source/Core/ProjectManager.cpp#L2189) | | | `file` | function | SparkEditor | [ProjectManager.cpp:L2309](../../SparkEditor/Source/Core/ProjectManager.cpp#L2309) | | @@ -12096,8 +12118,9 @@ | `file` | function | SparkEditor | [ConsolePanel.cpp:L337](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L337) | | | `file` | function | SparkEditor | [DecorLayoutEditorIO.cpp:L174](../../SparkEditor/Source/Panels/DecorLayoutEditorIO.cpp#L174) | | | `file` | function | SparkEditor | [GameModuleSelectorPanel.cpp:L487](../../SparkEditor/Source/Panels/GameModuleSelectorPanel.cpp#L487) | | -| `file` | function | SparkEditor | [MaterialEditorPanel.cpp:L337](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L337) | | -| `file` | function | SparkEditor | [PlayControlLaunch.cpp:L322](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L322) | | +| `file` | function | SparkEditor | [MaterialEditorFiles.cpp:L44](../../SparkEditor/Source/Panels/MaterialEditorFiles.cpp#L44) | | +| `file` | function | SparkEditor | [MaterialEditorFiles.cpp:L120](../../SparkEditor/Source/Panels/MaterialEditorFiles.cpp#L120) | | +| `file` | function | SparkEditor | [PlayControlLaunch.cpp:L324](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L324) | | | `file` | function | SparkEditor | [RegionMapEditorIO.cpp:L242](../../SparkEditor/Source/Panels/RegionMapEditorIO.cpp#L242) | | | `file` | function | SparkEditor | [VisualScriptPanel.cpp:L1274](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L1274) | | | `file` | function | SparkEditor | [PerformanceProfiler.cpp:L495](../../SparkEditor/Source/Profiler/PerformanceProfiler.cpp#L495) | | @@ -12164,8 +12187,8 @@ | `file` | function | SparkEngine | [TextureCompressor.cpp:L229](../../SparkEngine/Source/Graphics/TextureCompressor.cpp#L229) | | | `file` | function | SparkEngine | [TextureCompressor.cpp:L275](../../SparkEngine/Source/Graphics/TextureCompressor.cpp#L275) | | | `file` | function | SparkEngine | [TextureSystemLinuxTexture.cpp:L59](../../SparkEngine/Source/Graphics/TextureSystemLinuxTexture.cpp#L59) | | -| `file` | function | SparkEngine | [SceneManager.cpp:L311](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L311) | | -| `file` | function | SparkEngine | [SceneManager.cpp:L901](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L901) | | +| `file` | function | SparkEngine | [SceneManager.cpp:L345](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L345) | | +| `file` | function | SparkEngine | [SceneManager.cpp:L995](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L995) | | | `file` | function | SparkEngine | [ChromeTracing.h:L122](../../SparkEngine/Source/Utils/ChromeTracing.h#L122) | | | `file` | function | SparkEngine | [ConfigParser.h:L69](../../SparkEngine/Source/Utils/ConfigParser.h#L69) | | | `file` | function | SparkEngine | [ConfigParser.h:L152](../../SparkEngine/Source/Utils/ConfigParser.h#L152) | | @@ -12189,13 +12212,13 @@ | `file` | function | Tests | [TestDialogueSystem.cpp:L72](../../Tests/TestDialogueSystem.cpp#L72) | | | `file` | function | Tests | [TestDialogueSystem.cpp:L87](../../Tests/TestDialogueSystem.cpp#L87) | | | `file` | function | Tests | [TestENG220ObjImportReal.cpp:L66](../../Tests/TestENG220ObjImportReal.cpp#L66) | | -| `file` | function | Tests | [TestEditorCookPackageReal.cpp:L110](../../Tests/TestEditorCookPackageReal.cpp#L110) | | +| `file` | function | Tests | [TestEditorCookPackageReal.cpp:L112](../../Tests/TestEditorCookPackageReal.cpp#L112) | | | `file` | function | Tests | [TestEditorProjectMaterializationReal.cpp:L53](../../Tests/TestEditorProjectMaterializationReal.cpp#L53) | | | `file` | function | Tests | [TestEditorProjectMaterializationReal.cpp:L59](../../Tests/TestEditorProjectMaterializationReal.cpp#L59) | | | `file` | function | Tests | [TestEditorSubsystems.cpp:L1384](../../Tests/TestEditorSubsystems.cpp#L1384) | | | `file` | function | Tests | [TestEditorSubsystems.cpp:L2350](../../Tests/TestEditorSubsystems.cpp#L2350) | | | `file` | function | Tests | [TestEditorSubsystems.cpp:L2399](../../Tests/TestEditorSubsystems.cpp#L2399) | | -| `File` | function | Tests | [TestEditorSubsystemsReal.cpp:L61](../../Tests/TestEditorSubsystemsReal.cpp#L61) | | +| `File` | function | Tests | [TestEditorSubsystemsReal.cpp:L64](../../Tests/TestEditorSubsystemsReal.cpp#L64) | | | `file` | function | Tests | [TestEngineSettingsReal.cpp:L240](../../Tests/TestEngineSettingsReal.cpp#L240) | | | `file` | function | Tests | [TestEngineSettingsReal.cpp:L249](../../Tests/TestEngineSettingsReal.cpp#L249) | | | `file` | function | Tests | [TestEngineSettingsReal.cpp:L299](../../Tests/TestEngineSettingsReal.cpp#L299) | | @@ -12246,7 +12269,7 @@ | `file` | function | Tests | [TestSparkGameFPSLoopReal.cpp:L672](../../Tests/TestSparkGameFPSLoopReal.cpp#L672) | | | `file` | function | Tests | [TestSparkGameFPSLoopReal.cpp:L695](../../Tests/TestSparkGameFPSLoopReal.cpp#L695) | | | `file` | function | Tests | [TestSparkGameFPSLoopReal.cpp:L737](../../Tests/TestSparkGameFPSLoopReal.cpp#L737) | | -| `file` | function | Tests | [TestTF120Travel.cpp:L119](../../Tests/TestTF120Travel.cpp#L119) | | +| `file` | function | Tests | [TestTF120Travel.cpp:L106](../../Tests/TestTF120Travel.cpp#L106) | | | `FileChange` | struct | SparkEditor | [VersionControlTypes.h:L64](../../SparkEditor/Source/VersionControl/VersionControlTypes.h#L64) | File change information | | `FileChangeCallback` | alias | SparkEngine | [FileWatcher.h:L63](../../SparkEngine/Source/Utils/FileWatcher/FileWatcher.h#L63) | Callback for file change events | | `FileChangeEvent` | struct | SparkEngine | [ScriptHotReload.h:L48](../../SparkEngine/Source/Engine/Scripting/ScriptHotReload.h#L48) | | @@ -12341,7 +12364,7 @@ | `Finalize` | function | Tests | [TestMovementSystem.cpp:L41](../../Tests/TestMovementSystem.cpp#L41) | | | `FinalizeDeviceCapabilities` | function | SparkEngine | [RHITypes.h:L395](../../SparkEngine/Source/Graphics/RHI/RHITypes.h#L395) | Normalizes capability state across backends. | | `FinalizeJob` | function | SparkEngine | [MovieRenderPipeline.h:L420](../../SparkEngine/Source/Engine/Rendering/MovieRenderPipeline.h#L420) | | -| `FinalPath` | function | SparkEngine | [SceneManager.cpp:L254](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L254) | | +| `FinalPath` | function | SparkEngine | [SceneManager.cpp:L278](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L278) | | | `finalPathBuffer` | function | SparkEditor | [ProjectManager.cpp:L393](../../SparkEditor/Source/Core/ProjectManager.cpp#L393) | | | `FinalPathOf` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L263](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L263) | | | `FinalPathOf` | function | SparkEngine | [HeldHandles.h:L65](../../SparkEngine/Source/Engine/Modding/HeldHandles.h#L65) | | @@ -12366,7 +12389,7 @@ | `FindAccount` | function | GameModules | [MMOAccountSystem.h:L133](../../GameModules/SparkGameMMO/Source/Account/MMOAccountSystem.h#L133) | | | `FindAccountByUsername` | function | GameModules | [TFDatabase.h:L266](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFDatabase.h#L266) | | | `FindAreaId` | function | GameModules | [MMOWorldSetup.h:L127](../../GameModules/SparkGameMMO/Source/World/MMOWorldSetup.h#L127) | | -| `FindAssetRoot` | function | GameModules | [FPSAssetPaths.cpp:L40](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L40) | | +| `FindAssetRoot` | function | GameModules | [FPSAssetPaths.cpp:L44](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L44) | | | `FindAssetRoot` | function | GameModules | [FPSAssetPaths.h:L35](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L35) | Pick the first search base that holds a usable asset tree. | | `FindBestPoint` | function | SparkEngine | [TacticalPointSystem.h:L136](../../SparkEngine/Source/Engine/AI/TacticalPointSystem.h#L136) | Find the single best tactical point matching a query. | | `FindBestPoint` | function | Tests | [TestTacticalPointSystem.cpp:L57](../../Tests/TestTacticalPointSystem.cpp#L57) | | @@ -12494,17 +12517,17 @@ | `FindNearestVehicle` | function | GameModules | [VehicleSystem.h:L327](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L327) | Find nearest vehicle to a position within range | | `FindNewCrashArtifactDirectory` | function | Tests | [TestCrashHandlerGatingReal.cpp:L232](../../Tests/TestCrashHandlerGatingReal.cpp#L232) | | | `FindNode` | function | SparkEngine | [VisualScriptEmitter.h:L98](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L98) | | -| `FindNode` | function | SparkEngine | [SceneManager.h:L315](../../SparkEngine/Source/SceneManager/SceneManager.h#L315) | Find the first node with the given name and return its index. | +| `FindNode` | function | SparkEngine | [SceneManager.h:L317](../../SparkEngine/Source/SceneManager/SceneManager.h#L317) | Find the first node with the given name and return its index. | | `FindNode` | function | Tests | [TestSceneManager.cpp:L149](../../Tests/TestSceneManager.cpp#L149) | | | `FindNode` | function | Tests | [TestVisualScriptCompiler.cpp:L128](../../Tests/TestVisualScriptCompiler.cpp#L128) | | | `FindNumberValue` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L108](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L108) | Extract a scalar numeric value for @p key. Returns false if absent or non-numeric. | | `FindObject` | function | SparkEditor | [SceneFile.h:L43](../../SparkEditor/Source/SceneSystem/SceneFile.h#L43) | Find object by ID | -| `FindObject` | function | Tests | [TestEditorSubsystemsReal.cpp:L377](../../Tests/TestEditorSubsystemsReal.cpp#L377) | | +| `FindObject` | function | Tests | [TestEditorSubsystemsReal.cpp:L400](../../Tests/TestEditorSubsystemsReal.cpp#L400) | | | `FindObjectsByName` | function | SparkEditor | [SceneFile.h:L50](../../SparkEditor/Source/SceneSystem/SceneFile.h#L50) | Find objects by name | | `FindOnlinePlayerByCharName` | function | GameModules | [TFOutfitSystem.h:L211](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L211) | | | `FindOrCreateDecl` | function | SparkEngine | [ParallelSystemExecutor.h:L256](../../SparkEngine/Source/Engine/ECS/Systems/ParallelSystemExecutor.h#L256) | | | `FindOrCreateLifecycleRecord` | function | SparkEngine | [ModuleManager.h:L393](../../SparkEngine/Source/Core/ModuleManager.h#L393) | Remove host registry callbacks before an image can be unmapped. | -| `FindOutsideString` | function | SparkEditor | [ProjectDocument.cpp:L302](../../SparkEditor/Source/Core/ProjectDocument.cpp#L302) | | +| `FindOutsideString` | function | SparkEditor | [ProjectDocument.cpp:L303](../../SparkEditor/Source/Core/ProjectDocument.cpp#L303) | | | `FindPackagedDefaultScene` | function | SparkEditor | [BuildPipeline.cpp:L593](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L593) | | | `FindParameter` | function | SparkEditor | [MaterialEditorPanel.h:L143](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L143) | Find a parameter by name. | | `FindParameter` | function | SparkEngine | [MaterialDefinition.h:L199](../../SparkEngine/Source/Graphics/MaterialDefinition.h#L199) | Find a parameter declaration by name. | @@ -12594,10 +12617,10 @@ | `Finish` | function | SparkCrashReporter | [CrashReporterApp.cpp:L151](../../SparkCrashReporter/src/CrashReporterApp.cpp#L151) | | | `Finish` | function | SparkCrashReporter | [CrashReporterApp.cpp:L163](../../SparkCrashReporter/src/CrashReporterApp.cpp#L163) | | | `Finish` | function | Tests | [GLTFSkinningReference.h:L103](../../Tests/GLTFSkinningReference.h#L103) | | -| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L220](../../Tests/TestEditorCookPackageReal.cpp#L220) | | -| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L234](../../Tests/TestEditorCookPackageReal.cpp#L234) | | -| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L243](../../Tests/TestEditorCookPackageReal.cpp#L243) | | -| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L250](../../Tests/TestEditorCookPackageReal.cpp#L250) | | +| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L231](../../Tests/TestEditorCookPackageReal.cpp#L231) | | +| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L245](../../Tests/TestEditorCookPackageReal.cpp#L245) | | +| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L254](../../Tests/TestEditorCookPackageReal.cpp#L254) | | +| `finish` | function | Tests | [TestEditorCookPackageReal.cpp:L261](../../Tests/TestEditorCookPackageReal.cpp#L261) | | | `FinishAclFixtureSetup` | function | Tests | [TestGatewaySecurity.cpp:L61](../../Tests/TestGatewaySecurity.cpp#L61) | | | `FinishAndPark` | function | Tests | [TestMOD380RacingCompleteRaceReal.cpp:L588](../../Tests/TestMOD380RacingCompleteRaceReal.cpp#L588) | | | `FinishConvergedRound` | function | Tests | [TestFPSLANLoopback.cpp:L351](../../Tests/TestFPSLANLoopback.cpp#L351) | | @@ -12611,7 +12634,7 @@ | `FinishLoad` | function | Tests | [TestAssetStallDetector.cpp:L120](../../Tests/TestAssetStallDetector.cpp#L120) | | | `FinishReload` | function | Templates | [GameModule.h:L816](../../Templates/FPSStarter/Source/GameModule.h#L816) | | | `FinishRun` | function | Tests | [TestMOD330ARPGDungeonReal.cpp:L105](../../Tests/TestMOD330ARPGDungeonReal.cpp#L105) | | -| `FinishSignalArtifact` | function | SparkEngine | [CrashHandler.cpp:L2324](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2324) | | +| `FinishSignalArtifact` | function | SparkEngine | [CrashHandler.cpp:L2362](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2362) | | | `FinishTutorial` | function | GameModules | [TFTutorial.h:L119](../../GameModules/SparkGameMMOFPS/Source/Game/TFTutorial.h#L119) | | | `FinishUnload` | function | SparkEngine | [DynamicPluginHost.h:L92](../../SparkEngine/Source/Core/DynamicPluginHost.h#L92) | | | `Finite` | function | GameModules | [RTSPersistenceValidation.cpp:L26](../../GameModules/SparkGameRTS/Source/Core/RTSPersistenceValidation.cpp#L26) | | @@ -12645,11 +12668,11 @@ | `first` | function | Tests | [TestEditorSubsystems.cpp:L831](../../Tests/TestEditorSubsystems.cpp#L831) | | | `first` | function | Tests | [TestGatewayAreaControl.cpp:L1186](../../Tests/TestGatewayAreaControl.cpp#L1186) | | | `first` | function | Tests | [TestServiceTopologyController.cpp:L206](../../Tests/TestServiceTopologyController.cpp#L206) | | -| `first` | function | Tests | [TestSparkPak.cpp:L677](../../Tests/TestSparkPak.cpp#L677) | | +| `first` | function | Tests | [TestSparkPak.cpp:L693](../../Tests/TestSparkPak.cpp#L693) | | | `first` | function | Tests | [Test_scripting_hardening.cpp:L324](../../Tests/harden/Test_scripting_hardening.cpp#L324) | | | `FirstDataOutput` | function | SparkEngine | [VisualScriptCodegen.cpp:L288](../../SparkEngine/Source/Engine/Scripting/VisualScriptCodegen.cpp#L288) | | | `FirstDataOutput` | function | SparkEngine | [VisualScriptEmitter.h:L80](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L80) | | -| `FirstDifference` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L69](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L69) | | +| `FirstDifference` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L70](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L70) | | | `FirstDivergence` | function | Tests | [TestMOD370SkirmishDeterminismReal.cpp:L131](../../Tests/TestMOD370SkirmishDeterminismReal.cpp#L131) | | | `FirstEntityName` | function | Tests | [TestSerializationHardening.cpp:L100](../../Tests/TestSerializationHardening.cpp#L100) | | | `firstInitializer` | function | Tests | [TestMemoryIntegrity.cpp:L471](../../Tests/TestMemoryIntegrity.cpp#L471) | | @@ -12704,7 +12727,7 @@ | `FixedUpdate` | function | GameModules | [TFVehicleTerminal.h:L43](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleTerminal.h#L43) | | | `FixedUpdate` | function | GameModules | [TFWeaponSystem.h:L48](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L48) | | | `FixedUpdate` | function | GameModules | [TFClientNet.h:L78](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L78) | | -| `FixedUpdate` | function | GameModules | [TFReplication.h:L61](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L61) | | +| `FixedUpdate` | function | GameModules | [TFReplication.h:L65](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L65) | | | `FixedUpdate` | function | GameModules | [TFServerSim.h:L62](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L62) | | | `FixedUpdate` | function | GameModules | [TFChatWindow.h:L47](../../GameModules/SparkGameMMOFPS/Source/UI/TFChatWindow.h#L47) | | | `FixedUpdate` | function | GameModules | [TFDeathRecap.h:L67](../../GameModules/SparkGameMMOFPS/Source/UI/TFDeathRecap.h#L67) | | @@ -12850,8 +12873,8 @@ | `FlushEvents` | function | SparkEngine | [Telemetry.h:L544](../../SparkEngine/Source/Utils/Telemetry.h#L544) | Flush all queued events to the registered backend. | | `FlushFileDurably` | function | SparkEngine | [ReflectedScenePersistence.cpp:L100](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L100) | | | `FlushFileDurably` | function | SparkEngine | [ReflectedScenePersistence.cpp:L188](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L188) | | -| `FlushFileDurably` | function | SparkEngine | [SceneManager.cpp:L76](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L76) | | -| `FlushFileDurably` | function | SparkEngine | [SceneManager.cpp:L184](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L184) | | +| `FlushFileDurably` | function | SparkEngine | [SceneManager.cpp:L80](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L80) | | +| `FlushFileDurably` | function | SparkEngine | [SceneManager.cpp:L198](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L198) | | | `FlushOutgoingQueue` | function | SparkEngine | [NetworkManager.h:L915](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L915) | | | `FlushPendingWorldEdit` | function | SparkEditor | [InspectorPanel.h:L181](../../SparkEditor/Source/Panels/InspectorPanel.h#L181) | | | `FlushPendingWrite` | function | SparkEngine | [ConsoleProcessManager.h:L137](../../SparkEngine/Source/Utils/ConsoleProcessManager.h#L137) | | @@ -12866,7 +12889,7 @@ | `Fmt` | alias | Tests | [TestTextureCompressorPhaseGG.cpp:L41](../../Tests/TestTextureCompressorPhaseGG.cpp#L41) | | | `Fmt` | alias | Tests | [TestTextureCompressorPhaseGG.cpp:L52](../../Tests/TestTextureCompressorPhaseGG.cpp#L52) | | | `FNV1a` | function | SparkEngine | [AssetHandle.h:L66](../../SparkEngine/Source/Core/AssetHandle.h#L66) | | -| `FNV1a` | function | Tests | [TestSparkPak.cpp:L48](../../Tests/TestSparkPak.cpp#L48) | | +| `FNV1a` | function | Tests | [TestSparkPak.cpp:L54](../../Tests/TestSparkPak.cpp#L54) | | | `FNV1a32` | function | SparkEngine | [HashFNV1a.h:L191](../../SparkEngine/Source/Utils/HashFNV1a.h#L191) | | | `FNV1a64` | function | SparkEngine | [HashFNV1a.h:L178](../../SparkEngine/Source/Utils/HashFNV1a.h#L178) | | | `FnvHash` | function | Tests | [TestExtendedSystems.cpp:L32](../../Tests/TestExtendedSystems.cpp#L32) | | @@ -13010,7 +13033,7 @@ | `ForEachInAABB` | function | SparkEngine | [Octree.h:L144](../../SparkEngine/Source/Utils/Octree.h#L144) | Execute a callback for each object whose AABB intersects the query box. | | `ForEachInAABBRecursive` | function | SparkEngine | [Octree.h:L453](../../SparkEngine/Source/Utils/Octree.h#L453) | | | `ForEachRecipient` | function | GameModules | [TFPingSystem.h:L254](../../GameModules/SparkGameMMOFPS/Source/Game/TFPingSystem.h#L254) | | -| `ForEachRemotePawn` | function | GameModules | [TFReplication.h:L67](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L67) | | +| `ForEachRemotePawn` | function | GameModules | [TFReplication.h:L71](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L71) | | | `ForEachScoreRow` | function | GameModules | [TFMedalSystem.h:L203](../../GameModules/SparkGameMMOFPS/Source/Game/TFMedalSystem.h#L203) | | | `ForEachSetBit` | function | SparkEngine | [BitUtils.h:L101](../../SparkEngine/Source/Utils/BitUtils.h#L101) | Invoke a callable for each set bit index, LSB-first. | | `ForEachSetBit` | function | Tests | [TestBitUtils.cpp:L48](../../Tests/TestBitUtils.cpp#L48) | | @@ -13109,7 +13132,7 @@ | `FormatSize` | function | SparkEditor | [AssetAuditGraph.h:L475](../../SparkEditor/Source/Panels/AssetAuditGraph.h#L475) | | | `FormatSize` | function | SparkEngine | [GamePackager.h:L542](../../SparkEngine/Source/Engine/Build/GamePackager.h#L542) | | | `FormatSymbolicCrashFrames` | function | SparkEngine | [CrashSymbolication.h:L212](../../SparkEngine/Source/Utils/CrashSymbolication.h#L212) | | -| `FormatSymbolicSection` | function | SparkEngine | [CrashHandler.cpp:L1986](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1986) | | +| `FormatSymbolicSection` | function | SparkEngine | [CrashHandler.cpp:L1988](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1988) | | | `FormatTimestamp` | function | SparkEditor | [ConsolePanel.cpp:L349](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L349) | | | `FormatTimestamp` | function | SparkEditor | [ConsolePanel.cpp:L357](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L357) | | | `FormatTimestamp` | function | SparkEditor | [ConsolePanel.cpp:L362](../../SparkEditor/Source/Panels/ConsolePanel.cpp#L362) | | @@ -13348,7 +13371,7 @@ | `FreshResidencyDb` | function | Tests | [TestTF120Residency.cpp:L42](../../Tests/TestTF120Residency.cpp#L42) | | | `FreshSequence` | function | Tests | [TestSequencerAudioWiring.cpp:L70](../../Tests/TestSequencerAudioWiring.cpp#L70) | | | `FreshSharedDb` | function | Tests | [TestTF120SharedSaveRoot.cpp:L38](../../Tests/TestTF120SharedSaveRoot.cpp#L38) | | -| `FreshTravelDb` | function | Tests | [TestTF120Travel.cpp:L284](../../Tests/TestTF120Travel.cpp#L284) | | +| `FreshTravelDb` | function | Tests | [TestTF120Travel.cpp:L271](../../Tests/TestTF120Travel.cpp#L271) | | | `FriendInfo` | struct | SparkEngine | [OnlineServices.h:L113](../../SparkEngine/Source/Engine/OnlineServices/OnlineServices.h#L113) | Friend list entry | | `Friends` | function | GameModules | [TFSocialSystem.h:L98](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L98) | | | `From` | function | GameModules | [TFFireFxProtocol.h:L105](../../GameModules/SparkGameMMOFPS/Source/Net/TFFireFxProtocol.h#L105) | | @@ -13427,7 +13450,9 @@ | `fs::exists` | method | SparkInstaller | [Installer.cpp:L170](../../SparkInstaller/src/Installer.cpp#L170) | | | `fs::exists` | method | SparkInstaller | [InstallerPreflight.cpp:L35](../../SparkInstaller/src/InstallerPreflight.cpp#L35) | | | `fs::exists` | method | Tests | [TestAdvancedAssetPipeline.cpp:L105](../../Tests/TestAdvancedAssetPipeline.cpp#L105) | | -| `fs::exists` | method | Tests | [TestTFDataTables.cpp:L77](../../Tests/TestTFDataTables.cpp#L77) | | +| `fs::exists` | method | Tests | [TestTF120Travel.cpp:L82](../../Tests/TestTF120Travel.cpp#L82) | | +| `fs::exists` | method | Tests | [TestTFDataTables.cpp:L48](../../Tests/TestTFDataTables.cpp#L48) | | +| `fs::exists` | method | Tests | [TestTFDataTables.cpp:L68](../../Tests/TestTFDataTables.cpp#L68) | | | `fs::is_directory` | method | SparkEngine | [FileUtils.h:L339](../../SparkEngine/Source/Utils/FileUtils.h#L339) | | | `fs::is_directory` | method | Tests | [TestAssetManifestReal.cpp:L331](../../Tests/TestAssetManifestReal.cpp#L331) | | | `fs::is_regular_file` | method | SparkBuild | [PathSecurity.cpp:L74](../../SparkBuild/src/PathSecurity.cpp#L74) | | @@ -13442,7 +13467,7 @@ | `fs::path` | method | SparkEditor | [ProjectManager.cpp:L170](../../SparkEditor/Source/Core/ProjectManager.cpp#L170) | | | `fs::path` | method | SparkEditor | [ProjectManager.cpp:L190](../../SparkEditor/Source/Core/ProjectManager.cpp#L190) | | | `fs::path` | method | SparkEditor | [ProjectManager.cpp:L192](../../SparkEditor/Source/Core/ProjectManager.cpp#L192) | | -| `fs::path` | method | SparkEditor | [AssetBrowserPanel.cpp:L49](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L49) | | +| `fs::path` | method | SparkEditor | [AssetBrowserPathUtils.h:L29](../../SparkEditor/Source/Panels/AssetBrowserPathUtils.h#L29) | | | `fs::path` | method | SparkEditor | [BasicMaterialEditorDrawing.cpp:L35](../../SparkEditor/Source/Panels/BasicMaterialEditorDrawing.cpp#L35) | | | `fs::path` | method | SparkEditor | [BasicMaterialEditorPanel.cpp:L48](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L48) | | | `fs::path` | method | SparkEditor | [BuildPipeline.cpp:L76](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L76) | | @@ -13547,7 +13572,7 @@ | `FxQuad` | struct | GameModules | [TFVehicleFx.h:L100](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleFx.h#L100) | | | `g_deltaSmoother` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L49](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L49) | | | `g_real_syscall` | function | tools | [gvisor-wine-shim.c:L917](../../tools/gvisor-wine-shim.c#L917) | | -| `g_rtlDllShutdownInProgress` | function | SparkEngine | [CrashHandler.cpp:L858](../../SparkEngine/Source/Utils/CrashHandler.cpp#L858) | | +| `g_rtlDllShutdownInProgress` | function | SparkEngine | [CrashHandler.cpp:L859](../../SparkEngine/Source/Utils/CrashHandler.cpp#L859) | | | `GainExperience` | function | GameModules | [ARPGHeroSystem.h:L94](../../GameModules/SparkGameARPG/Source/Hero/ARPGHeroSystem.h#L94) | | | `Game` | class | GameModules | [AdvancedConsoleCommands.h:L14](../../GameModules/SparkGameFPS/Source/Console/AdvancedConsoleCommands.h#L14) | | | `Game` | class | GameModules | [SparkGameFPS.h:L36](../../GameModules/SparkGameFPS/Source/Core/SparkGameFPS.h#L36) | | @@ -13559,69 +13584,72 @@ | `Game::ApplyCameraSettings` | method | GameModules | [GameConsoleOps.cpp:L79](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L79) | | | `Game::ApplyDebugSettings` | method | GameModules | [GameConsoleOps.cpp:L102](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L102) | | | `Game::ApplyGraphicsSettings` | method | GameModules | [GameConsoleOps.cpp:L321](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L321) | | -| `Game::ApplyLocalProfile` | method | GameModules | [GameEngineSystems.cpp:L328](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L328) | | +| `Game::ApplyLocalProfile` | method | GameModules | [GameEngineSystems.cpp:L336](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L336) | | | `Game::ApplyPhysicsSettings` | method | GameModules | [GameConsoleOps.cpp:L52](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L52) | | -| `Game::BindSceneMaterialRoots` | method | GameModules | [Game.cpp:L381](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L381) | | -| `Game::CaptureLocalProfile` | method | GameModules | [GameEngineSystems.cpp:L299](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L299) | | +| `Game::BeginInputObservation` | method | GameModules | [GameEngineSystems.cpp:L521](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L521) | | +| `Game::BindSceneMaterialRoots` | method | GameModules | [Game.cpp:L397](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L397) | | +| `Game::CaptureLocalProfile` | method | GameModules | [GameEngineSystems.cpp:L307](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L307) | | | `Game::ClearScene` | method | GameModules | [GameConsoleOps.cpp:L276](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L276) | | -| `Game::ConnectToServer` | method | GameModules | [GameConsoleOps.cpp:L1048](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1048) | | -| `Game::CreateCombatArena` | method | GameModules | [GameConsoleOps.cpp:L751](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L751) | | -| `Game::CreateTestObjects` | method | GameModules | [Game.cpp:L980](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L980) | | -| `Game::CreateTestScene` | method | GameModules | [GameConsoleOps.cpp:L920](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L920) | | -| `Game::CycleNextClass` | method | GameModules | [GameConsoleOps.cpp:L670](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L670) | | -| `Game::CyclePrevClass` | method | GameModules | [GameConsoleOps.cpp:L677](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L677) | | +| `Game::ConnectToServer` | method | GameModules | [GameConsoleOps.cpp:L1056](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1056) | | +| `Game::CreateCombatArena` | method | GameModules | [GameConsoleOps.cpp:L759](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L759) | | +| `Game::CreateTestObjects` | method | GameModules | [Game.cpp:L1107](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L1107) | | +| `Game::CreateTestScene` | method | GameModules | [GameConsoleOps.cpp:L928](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L928) | | +| `Game::CycleNextClass` | method | GameModules | [GameConsoleOps.cpp:L678](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L678) | | +| `Game::CyclePrevClass` | method | GameModules | [GameConsoleOps.cpp:L685](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L685) | | | `Game::DeleteObject` | method | GameModules | [GameConsoleOps.cpp:L258](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L258) | | -| `Game::DisconnectNetwork` | method | GameModules | [GameConsoleOps.cpp:L1066](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1066) | | +| `Game::DisconnectNetwork` | method | GameModules | [GameConsoleOps.cpp:L1074](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1074) | | +| `Game::EndInputObservation` | method | GameModules | [GameEngineSystems.cpp:L610](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L610) | | | `Game::GetAliveEnemyCount` | method | GameModules | [GameSetup.cpp:L368](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L368) | | -| `Game::GetAvailableScenes` | method | GameModules | [GameConsoleOps.cpp:L592](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L592) | | +| `Game::GetAvailableScenes` | method | GameModules | [GameConsoleOps.cpp:L600](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L600) | | | `Game::GetGraphicsPerformance` | method | GameModules | [GameConsoleOps.cpp:L350](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L350) | | -| `Game::GetNetworkStats` | method | GameModules | [GameConsoleOps.cpp:L1134](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1134) | | -| `Game::GetNetworkStatus` | method | GameModules | [GameConsoleOps.cpp:L1126](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1126) | | +| `Game::GetNetworkStats` | method | GameModules | [GameConsoleOps.cpp:L1142](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1142) | | +| `Game::GetNetworkStatus` | method | GameModules | [GameConsoleOps.cpp:L1134](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1134) | | | `Game::GetPerformanceStats` | method | GameModules | [GameConsoleOps.cpp:L122](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L122) | | -| `Game::GetPlayerClass` | method | GameModules | [GameConsoleOps.cpp:L663](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L663) | | +| `Game::GetPlayerClass` | method | GameModules | [GameConsoleOps.cpp:L671](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L671) | | | `Game::GetStatusString` | method | GameModules | [GameDebugUI.cpp:L65](../../GameModules/SparkGameFPS/Source/Game/GameDebugUI.cpp#L65) | | -| `Game::HandleInput` | method | GameModules | [Game.cpp:L893](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L893) | | -| `Game::Initialize` | method | GameModules | [Game.cpp:L78](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L78) | | +| `Game::HandleInput` | method | GameModules | [Game.cpp:L985](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L985) | | +| `Game::Initialize` | method | GameModules | [Game.cpp:L80](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L80) | | | `Game::InitializeEnemies` | method | GameModules | [GameSetup.cpp:L379](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L379) | | -| `Game::InitializeEngineSystems` | method | GameModules | [GameEngineSystems.cpp:L55](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L55) | | +| `Game::InitializeEngineSystems` | method | GameModules | [GameEngineSystems.cpp:L63](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L63) | | | `Game::InitializeGameModeAndHUD` | method | GameModules | [GameSetup.cpp:L163](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L163) | | | `Game::InitializeGameplaySystems` | method | GameModules | [GameSetup.cpp:L424](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L424) | | | `Game::InitializeInteractionObjects` | method | GameModules | [GameSetup.cpp:L45](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L45) | | | `Game::InitializeInventorySystem` | method | GameModules | [GameSetup.cpp:L257](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L257) | | | `Game::InitializeQuestSystem` | method | GameModules | [GameSetup.cpp:L305](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L305) | | | `Game::InitializeRespawnAndVehicles` | method | GameModules | [GameSetup.cpp:L110](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L110) | | -| `Game::InvalidateSceneBasicMaterials` | method | GameModules | [Game.cpp:L408](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L408) | | -| `Game::IsNetworkActive` | method | GameModules | [GameConsoleOps.cpp:L1121](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1121) | | -| `Game::LoadScene` | method | GameModules | [GameConsoleOps.cpp:L468](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L468) | | -| `Game::LogSceneIdentity` | method | GameModules | [Game.cpp:L354](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L354) | | +| `Game::InvalidateSceneBasicMaterials` | method | GameModules | [Game.cpp:L430](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L430) | | +| `Game::IsNetworkActive` | method | GameModules | [GameConsoleOps.cpp:L1129](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1129) | | +| `Game::LoadScene` | method | GameModules | [GameConsoleOps.cpp:L476](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L476) | | +| `Game::LogSceneIdentity` | method | GameModules | [Game.cpp:L370](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L370) | | | `Game::ParseAuthoredFiniteFloat` | method | GameModules | [Game.cpp:L50](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L50) | | -| `Game::PlayerEnterNearestVehicle` | method | GameModules | [GameConsoleOps.cpp:L998](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L998) | | -| `Game::PlayerExitVehicle` | method | GameModules | [GameConsoleOps.cpp:L1015](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1015) | | -| `Game::QuickLoadProfile` | method | GameModules | [GameEngineSystems.cpp:L412](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L412) | | -| `Game::QuickSaveProfile` | method | GameModules | [GameEngineSystems.cpp:L368](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L368) | | +| `Game::PlayerEnterNearestVehicle` | method | GameModules | [GameConsoleOps.cpp:L1006](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1006) | | +| `Game::PlayerExitVehicle` | method | GameModules | [GameConsoleOps.cpp:L1023](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1023) | | +| `Game::QuickLoadProfile` | method | GameModules | [GameEngineSystems.cpp:L429](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L429) | | +| `Game::QuickSaveProfile` | method | GameModules | [GameEngineSystems.cpp:L380](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L380) | | +| `Game::RecordInputObservation` | method | GameModules | [GameEngineSystems.cpp:L563](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L563) | | | `Game::RefreshAuthoredSceneRuntimeState` | method | GameModules | [GameConsoleOps.cpp:L399](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L399) | | | `Game::RefreshGraphicsSettings` | method | GameModules | [GameConsoleOps.cpp:L372](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L372) | | -| `Game::Render` | method | GameModules | [Game.cpp:L771](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L771) | | +| `Game::Render` | method | GameModules | [Game.cpp:L855](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L855) | | | `Game::RenderDebugUI` | method | GameModules | [GameDebugUI.cpp:L172](../../GameModules/SparkGameFPS/Source/Game/GameDebugUI.cpp#L172) | | -| `Game::SaveScene` | method | GameModules | [GameConsoleOps.cpp:L542](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L542) | | +| `Game::SaveScene` | method | GameModules | [GameConsoleOps.cpp:L550](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L550) | | | `Game::SetArenaAutopilot` | method | GameModules | [GameDebugUI.cpp:L122](../../GameModules/SparkGameFPS/Source/Game/GameDebugUI.cpp#L122) | | -| `Game::SetEngineContext` | method | GameModules | [GameEngineSystems.cpp:L38](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L38) | | -| `Game::SetEventBus` | method | GameModules | [Game.cpp:L504](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L504) | | -| `Game::SetPhysicsSystem` | method | GameModules | [Game.cpp:L492](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L492) | | -| `Game::SetPlayerClass` | method | GameModules | [GameConsoleOps.cpp:L644](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L644) | | +| `Game::SetEngineContext` | method | GameModules | [GameEngineSystems.cpp:L46](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L46) | | +| `Game::SetEventBus` | method | GameModules | [Game.cpp:L543](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L543) | | +| `Game::SetPhysicsSystem` | method | GameModules | [Game.cpp:L527](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L527) | | +| `Game::SetPlayerClass` | method | GameModules | [GameConsoleOps.cpp:L652](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L652) | | | `Game::SetTimeScale` | method | GameModules | [GameConsoleOps.cpp:L296](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L296) | | -| `Game::Shutdown` | method | GameModules | [Game.cpp:L438](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L438) | | +| `Game::Shutdown` | method | GameModules | [Game.cpp:L470](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L470) | | | `Game::SpawnEnemy` | method | GameModules | [GameSetup.cpp:L345](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L345) | | | `Game::SpawnObject` | method | GameModules | [GameConsoleOps.cpp:L204](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L204) | | -| `Game::SpawnVehicle` | method | GameModules | [GameConsoleOps.cpp:L979](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L979) | | -| `Game::StartServer` | method | GameModules | [GameConsoleOps.cpp:L1028](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1028) | | +| `Game::SpawnVehicle` | method | GameModules | [GameConsoleOps.cpp:L987](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L987) | | +| `Game::StartServer` | method | GameModules | [GameConsoleOps.cpp:L1036](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1036) | | | `Game::StartWaves` | method | GameModules | [GameSetup.cpp:L525](../../GameModules/SparkGameFPS/Source/Game/GameSetup.cpp#L525) | | | `Game::TeleportPlayer` | method | GameModules | [GameConsoleOps.cpp:L180](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L180) | | -| `Game::Update` | method | GameModules | [Game.cpp:L617](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L617) | | +| `Game::Update` | method | GameModules | [Game.cpp:L666](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L666) | | | `Game::UpdateArenaAutopilot` | method | GameModules | [GameDebugUI.cpp:L139](../../GameModules/SparkGameFPS/Source/Game/GameDebugUI.cpp#L139) | | -| `Game::UpdateCamera` | method | GameModules | [Game.cpp:L872](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L872) | | -| `Game::UpdateGameObjects` | method | GameModules | [Game.cpp:L881](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L881) | | -| `Game::UpdateMultiplayer` | method | GameModules | [GameConsoleOps.cpp:L1077](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1077) | | +| `Game::UpdateCamera` | method | GameModules | [Game.cpp:L958](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L958) | | +| `Game::UpdateGameObjects` | method | GameModules | [Game.cpp:L969](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L969) | | +| `Game::UpdateMultiplayer` | method | GameModules | [GameConsoleOps.cpp:L1085](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1085) | | | `GameCoroutine` | class | SparkEngine | [CoroutineTypes.h:L173](../../SparkEngine/Source/Engine/Coroutine/CoroutineTypes.h#L173) | Return type for C++20 coroutine functions that yield to the scheduler. | | `GameCoroutine` | function | SparkEngine | [CoroutineTypes.h:L212](../../SparkEngine/Source/Engine/Coroutine/CoroutineTypes.h#L212) | | | `gameKind` | function | Tests | [TestModuleABI.cpp:L338](../../Tests/TestModuleABI.cpp#L338) | | @@ -14039,7 +14067,7 @@ | `Get` | function | GameModules | [OWGatheringSystem.h:L66](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.h#L66) | Player resource inventory (raw material counts) | | `Get` | function | SparkCrashReporter | [CrashReporterApp.cpp:L715](../../SparkCrashReporter/src/CrashReporterApp.cpp#L715) | | | `Get` | function | SparkEngine | [AssetIntegration.h:L118](../../SparkEngine/Source/Core/AssetIntegration.h#L118) | Retrieve a loaded asset by handle. | -| `Get` | function | SparkEngine | [EngineContext.h:L106](../../SparkEngine/Source/Core/EngineContext.h#L106) | Global accessor for the singleton EngineContext instance | +| `Get` | function | SparkEngine | [EngineContext.h:L107](../../SparkEngine/Source/Core/EngineContext.h#L107) | Global accessor for the singleton EngineContext instance | | `Get` | function | SparkEngine | [LifecycleCompositionRoot.h:L70](../../SparkEngine/Source/Core/Lifecycle/LifecycleCompositionRoot.h#L70) | The process-wide root built from the production engine stages. | | `Get` | function | SparkEngine | [NonNull.h:L64](../../SparkEngine/Source/Core/NonNull.h#L64) | | | `Get` | function | SparkEngine | [PlatformD3DStubs.h:L115](../../SparkEngine/Source/Core/PlatformD3DStubs.h#L115) | | @@ -14078,10 +14106,10 @@ | `GET_X_LPARAM` | macro | SparkEngine | [PlatformTypes.h:L195](../../SparkEngine/Source/Core/PlatformTypes.h#L195) | | | `GET_Y_LPARAM` | macro | SparkEngine | [PlatformTypes.h:L196](../../SparkEngine/Source/Core/PlatformTypes.h#L196) | | | `GetAbilities` | function | GameModules | [PlatformerPlayerController.h:L118](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L118) | Unlocked abilities | -| `GetAbilities` | function | SparkEngine | [EngineContext.h:L220](../../SparkEngine/Source/Core/EngineContext.h#L220) | | | `GetAbilities` | function | SparkEngine | [EngineContext.h:L221](../../SparkEngine/Source/Core/EngineContext.h#L221) | | -| `GetAbilities` | function | SparkSDK | [IEngineContext.h:L258](../../SparkSDK/Include/Spark/IEngineContext.h#L258) | Get the ability system (spells, auras, procs) | +| `GetAbilities` | function | SparkEngine | [EngineContext.h:L222](../../SparkEngine/Source/Core/EngineContext.h#L222) | | | `GetAbilities` | function | SparkSDK | [IEngineContext.h:L259](../../SparkSDK/Include/Spark/IEngineContext.h#L259) | Get the ability system (spells, auras, procs) | +| `GetAbilities` | function | SparkSDK | [IEngineContext.h:L260](../../SparkSDK/Include/Spark/IEngineContext.h#L260) | Get the ability system (spells, auras, procs) | | `GetAbilities` | function | Tests | [TestGameModulePlatformerARPG.cpp:L322](../../Tests/TestGameModulePlatformerARPG.cpp#L322) | | | `GetAbilities` | function | Tests | [TestGameModulePlatformerARPG.cpp:L326](../../Tests/TestGameModulePlatformerARPG.cpp#L326) | | | `GetAbility` | function | Tests | [TestAbilitySystem.cpp:L118](../../Tests/TestAbilitySystem.cpp#L118) | | @@ -14188,10 +14216,10 @@ | `GetAffectedAssets` | function | SparkEditor | [AdvancedAssetPipeline.h:L216](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L216) | Get all assets that would be affected by changing an asset | | `GetAffixPoolSize` | function | GameModules | [ARPGLootSystem.h:L65](../../GameModules/SparkGameARPG/Source/Loot/ARPGLootSystem.h#L65) | | | `GetAgentCount` | function | SparkEngine | [CollisionAvoidance.h:L154](../../SparkEngine/Source/Engine/AI/CollisionAvoidance.h#L154) | Get the number of registered agents. | -| `GetAI` | function | SparkEngine | [EngineContext.h:L168](../../SparkEngine/Source/Core/EngineContext.h#L168) | | | `GetAI` | function | SparkEngine | [EngineContext.h:L169](../../SparkEngine/Source/Core/EngineContext.h#L169) | | -| `GetAI` | function | SparkSDK | [IEngineContext.h:L163](../../SparkSDK/Include/Spark/IEngineContext.h#L163) | Get the AI system (owned by AIIntegratedSystem; registered by the gameplay lifecycle) | +| `GetAI` | function | SparkEngine | [EngineContext.h:L170](../../SparkEngine/Source/Core/EngineContext.h#L170) | | | `GetAI` | function | SparkSDK | [IEngineContext.h:L164](../../SparkSDK/Include/Spark/IEngineContext.h#L164) | Get the AI system (owned by AIIntegratedSystem; registered by the gameplay lifecycle) | +| `GetAI` | function | SparkSDK | [IEngineContext.h:L165](../../SparkSDK/Include/Spark/IEngineContext.h#L165) | Get the AI system (owned by AIIntegratedSystem; registered by the gameplay lifecycle) | | `GetAI` | function | Tests | [TestMOD370SkirmishDeterminismReal.cpp:L677](../../Tests/TestMOD370SkirmishDeterminismReal.cpp#L677) | | | `GetAI` | function | Tests | [TestMOD370SkirmishDeterminismReal.cpp:L678](../../Tests/TestMOD370SkirmishDeterminismReal.cpp#L678) | | | `GetAISystem` | function | SparkEngine | [AIIntegration.h:L239](../../SparkEngine/Source/Engine/AI/AIIntegration.h#L239) | | @@ -14254,10 +14282,10 @@ | `GetAngleSteps` | function | SparkEngine | [FoliageImpostorBaker.h:L305](../../SparkEngine/Source/Graphics/FoliageImpostorBaker.h#L305) | Angle steps per species used for the most recent bake. | | `GetAngularVelocity` | function | SparkEngine | [JoltPhysicsInterface.h:L293](../../SparkEngine/Source/Engine/Physics/JoltPhysicsInterface.h#L293) | | | `GetAngularVelocity` | function | SparkEngine | [PhysicsBody.h:L86](../../SparkEngine/Source/Physics/PhysicsBody.h#L86) | | -| `GetAnimation` | function | SparkEngine | [EngineContext.h:L160](../../SparkEngine/Source/Core/EngineContext.h#L160) | | -| `GetAnimation` | function | SparkEngine | [EngineContext.h:L164](../../SparkEngine/Source/Core/EngineContext.h#L164) | | -| `GetAnimation` | function | SparkSDK | [IEngineContext.h:L159](../../SparkSDK/Include/Spark/IEngineContext.h#L159) | Get the animation system (the engine's AnimationManager; registered by the gameplay lifecycle) | +| `GetAnimation` | function | SparkEngine | [EngineContext.h:L161](../../SparkEngine/Source/Core/EngineContext.h#L161) | | +| `GetAnimation` | function | SparkEngine | [EngineContext.h:L165](../../SparkEngine/Source/Core/EngineContext.h#L165) | | | `GetAnimation` | function | SparkSDK | [IEngineContext.h:L160](../../SparkSDK/Include/Spark/IEngineContext.h#L160) | Get the animation system (the engine's AnimationManager; registered by the gameplay lifecycle) | +| `GetAnimation` | function | SparkSDK | [IEngineContext.h:L161](../../SparkSDK/Include/Spark/IEngineContext.h#L161) | Get the animation system (the engine's AnimationManager; registered by the gameplay lifecycle) | | `GetAnimation` | function | Tests | [TestGameModulePlatformerARPG.cpp:L306](../../Tests/TestGameModulePlatformerARPG.cpp#L306) | | | `GetAnimation` | function | Tests | [TestGameModulePlatformerARPG.cpp:L310](../../Tests/TestGameModulePlatformerARPG.cpp#L310) | | | `GetAOBuffer` | function | SparkEngine | [GTAOEffect.h:L363](../../SparkEngine/Source/Graphics/GTAOEffect.h#L363) | Get the raw (non-denoised) AO buffer | @@ -14282,10 +14310,10 @@ | `GetAreas` | function | GameModules | [RPGWorldSetup.h:L69](../../GameModules/SparkGameRPG/Source/World/RPGWorldSetup.h#L69) | | | `GetAreaState` | function | SparkEngine | [SeamlessAreaManager.h:L140](../../SparkEngine/Source/Engine/Streaming/SeamlessAreaManager.h#L140) | | | `GetAreaState` | function | Tests | [TestSeamlessAreaManager.cpp:L110](../../Tests/TestSeamlessAreaManager.cpp#L110) | | -| `GetAreaStreaming` | function | SparkEngine | [EngineContext.h:L256](../../SparkEngine/Source/Core/EngineContext.h#L256) | | -| `GetAreaStreaming` | function | SparkEngine | [EngineContext.h:L260](../../SparkEngine/Source/Core/EngineContext.h#L260) | | -| `GetAreaStreaming` | function | SparkSDK | [IEngineContext.h:L290](../../SparkSDK/Include/Spark/IEngineContext.h#L290) | Get the seamless area streaming manager | +| `GetAreaStreaming` | function | SparkEngine | [EngineContext.h:L257](../../SparkEngine/Source/Core/EngineContext.h#L257) | | +| `GetAreaStreaming` | function | SparkEngine | [EngineContext.h:L261](../../SparkEngine/Source/Core/EngineContext.h#L261) | | | `GetAreaStreaming` | function | SparkSDK | [IEngineContext.h:L291](../../SparkSDK/Include/Spark/IEngineContext.h#L291) | Get the seamless area streaming manager | +| `GetAreaStreaming` | function | SparkSDK | [IEngineContext.h:L292](../../SparkSDK/Include/Spark/IEngineContext.h#L292) | Get the seamless area streaming manager | | `GetAreaStreaming` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L437](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L437) | | | `GetAreaStreaming` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L441](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L441) | | | `GetAreaStreaming` | function | Tests | [TestOpenWorldModule.cpp:L280](../../Tests/TestOpenWorldModule.cpp#L280) | | @@ -14307,17 +14335,17 @@ | `GetAssetLoader` | function | SparkEngine | [SeamlessAreaManager.h:L154](../../SparkEngine/Source/Engine/Streaming/SeamlessAreaManager.h#L154) | Get the area asset loader (for diagnostics or direct access) | | `GetAssetMetadata` | function | SparkEditor | [AdvancedAssetPipeline.h:L326](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L326) | Get asset metadata | | `GetAssetMetadata` | function | SparkEngine | [AssetPipeline.h:L480](../../SparkEngine/Source/Graphics/AssetPipeline.h#L480) | | -| `GetAssetPipeline` | function | SparkEngine | [EngineContext.h:L191](../../SparkEngine/Source/Core/EngineContext.h#L191) | | +| `GetAssetPipeline` | function | SparkEngine | [EngineContext.h:L192](../../SparkEngine/Source/Core/EngineContext.h#L192) | | | `GetAssetPipeline` | function | SparkEngine | [GraphicsEngine.h:L379](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L379) | | -| `GetAssetPipeline` | function | SparkSDK | [IEngineContext.h:L205](../../SparkSDK/Include/Spark/IEngineContext.h#L205) | Get the asset pipeline for model/texture/audio loading | | `GetAssetPipeline` | function | SparkSDK | [IEngineContext.h:L206](../../SparkSDK/Include/Spark/IEngineContext.h#L206) | Get the asset pipeline for model/texture/audio loading | -| `GetAssetRegistry` | function | SparkEngine | [EngineContext.h:L201](../../SparkEngine/Source/Core/EngineContext.h#L201) | | +| `GetAssetPipeline` | function | SparkSDK | [IEngineContext.h:L207](../../SparkSDK/Include/Spark/IEngineContext.h#L207) | Get the asset pipeline for model/texture/audio loading | | `GetAssetRegistry` | function | SparkEngine | [EngineContext.h:L202](../../SparkEngine/Source/Core/EngineContext.h#L202) | | -| `GetAssetRegistry` | function | SparkSDK | [IEngineContext.h:L217](../../SparkSDK/Include/Spark/IEngineContext.h#L217) | Get the asset registry for handle-based asset lookups | +| `GetAssetRegistry` | function | SparkEngine | [EngineContext.h:L203](../../SparkEngine/Source/Core/EngineContext.h#L203) | | | `GetAssetRegistry` | function | SparkSDK | [IEngineContext.h:L218](../../SparkSDK/Include/Spark/IEngineContext.h#L218) | Get the asset registry for handle-based asset lookups | +| `GetAssetRegistry` | function | SparkSDK | [IEngineContext.h:L219](../../SparkSDK/Include/Spark/IEngineContext.h#L219) | Get the asset registry for handle-based asset lookups | | `GetAssetRequest` | struct | SparkEngine | [AssetServiceProtocol.h:L58](../../SparkEngine/Source/Utils/AssetServiceProtocol.h#L58) | | | `GetAssetResponse` | struct | SparkEngine | [AssetServiceProtocol.h:L63](../../SparkEngine/Source/Utils/AssetServiceProtocol.h#L63) | | -| `GetAssets` | function | SparkEditor | [AssetBrowserPanel.h:L100](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L100) | Wire live basic-path cache invalidation after an import. | +| `GetAssets` | function | SparkEditor | [AssetBrowserPanel.h:L110](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L110) | Wire live basic-path cache invalidation after an import. | | `GetAssetScanError` | function | SparkEditor | [SearchPanel.h:L108](../../SparkEditor/Source/Panels/SearchPanel.h#L108) | Message describing the last asset-scan failure, empty when the scan was clean. | | `GetAssetsExceedingBudget` | function | Tests | [TestAssetDependencyGraph.cpp:L101](../../Tests/TestAssetDependencyGraph.cpp#L101) | | | `GetAssetType` | function | SparkEditor | [AdvancedAssetPipeline.h:L59](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L59) | Get asset type this processor handles | @@ -14335,10 +14363,10 @@ | `GetAttempts` | function | Tests | [TestSelfRecovery.cpp:L216](../../Tests/TestSelfRecovery.cpp#L216) | | | `GetAttenuation` | function | SparkEngine | [LightingSystem.h:L118](../../SparkEngine/Source/Graphics/LightingSystem.h#L118) | | | `GetAuctionListString` | function | GameModules | [MMOTradingSystem.h:L108](../../GameModules/SparkGameMMO/Source/Trading/MMOTradingSystem.h#L108) | | -| `GetAudio` | function | SparkEngine | [EngineContext.h:L155](../../SparkEngine/Source/Core/EngineContext.h#L155) | | | `GetAudio` | function | SparkEngine | [EngineContext.h:L156](../../SparkEngine/Source/Core/EngineContext.h#L156) | | -| `GetAudio` | function | SparkSDK | [IEngineContext.h:L151](../../SparkSDK/Include/Spark/IEngineContext.h#L151) | Get the audio engine | +| `GetAudio` | function | SparkEngine | [EngineContext.h:L157](../../SparkEngine/Source/Core/EngineContext.h#L157) | | | `GetAudio` | function | SparkSDK | [IEngineContext.h:L152](../../SparkSDK/Include/Spark/IEngineContext.h#L152) | Get the audio engine | +| `GetAudio` | function | SparkSDK | [IEngineContext.h:L153](../../SparkSDK/Include/Spark/IEngineContext.h#L153) | Get the audio engine | | `GetAudio` | function | Tests | [module_logging_context.h:L40](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L40) | | | `GetAudio` | function | Tests | [module_logging_context.h:L41](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L41) | | | `GetAudio` | function | Tests | [TestGameModuleMMO.cpp:L73](../../Tests/TestGameModuleMMO.cpp#L73) | | @@ -14394,7 +14422,7 @@ | `GetAvailableRecipes` | function | GameModules | [MMOCraftingSystem.h:L87](../../GameModules/SparkGameMMO/Source/Crafting/MMOCraftingSystem.h#L87) | | | `GetAvailableRewards` | function | GameModules | [MMOReputationSystem.h:L82](../../GameModules/SparkGameMMO/Source/Reputation/MMOReputationSystem.h#L82) | | | `GetAvailableScenes` | function | GameModules | [Game.h:L557](../../GameModules/SparkGameFPS/Source/Game/Game.h#L557) | Get list of available scenes | -| `GetAvailableScenes` | function | SparkEngine | [SceneManager.h:L418](../../SparkEngine/Source/SceneManager/SceneManager.h#L418) | Enumerate all scene files found in a directory. | +| `GetAvailableScenes` | function | SparkEngine | [SceneManager.h:L420](../../SparkEngine/Source/SceneManager/SceneManager.h#L420) | Enumerate all scene files found in a directory. | | `GetAvailableSkills` | function | GameModules | [ARPGSkillSystem.h:L66](../../GameModules/SparkGameARPG/Source/Skill/ARPGSkillSystem.h#L66) | | | `GetAvailableSource` | function | SparkEngine | [AudioEngine.h:L688](../../SparkEngine/Source/Audio/AudioEngine.h#L688) | Get an available audio source from the pool | | `GetAvailableSource` | function | SparkEngine | [OpenALAudioEngine.h:L191](../../SparkEngine/Source/Audio/OpenALAudioEngine.h#L191) | Get an available source from the pool | @@ -14620,10 +14648,10 @@ | `GetCallbacks` | function | GameModules | [WaveSpawner.h:L123](../../GameModules/SparkGameFPS/Source/Game/WaveSpawner.h#L123) | | | `GetCamera` | function | GameModules | [Game.h:L274](../../GameModules/SparkGameFPS/Source/Game/Game.h#L274) | Get camera instance for console integration | | `GetCamera` | function | GameModules | [TFWorldSetup.h:L117](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetup.h#L117) | | -| `GetCamera` | function | SparkEngine | [EngineContext.h:L238](../../SparkEngine/Source/Core/EngineContext.h#L238) | | | `GetCamera` | function | SparkEngine | [EngineContext.h:L239](../../SparkEngine/Source/Core/EngineContext.h#L239) | | -| `GetCamera` | function | SparkSDK | [IEngineContext.h:L274](../../SparkSDK/Include/Spark/IEngineContext.h#L274) | Get the active camera | +| `GetCamera` | function | SparkEngine | [EngineContext.h:L240](../../SparkEngine/Source/Core/EngineContext.h#L240) | | | `GetCamera` | function | SparkSDK | [IEngineContext.h:L275](../../SparkSDK/Include/Spark/IEngineContext.h#L275) | Get the active camera | +| `GetCamera` | function | SparkSDK | [IEngineContext.h:L276](../../SparkSDK/Include/Spark/IEngineContext.h#L276) | Get the active camera | | `GetCameraCell` | function | SparkEngine | [PortalCulling.h:L215](../../SparkEngine/Source/Graphics/PortalCulling.h#L215) | Get the cell the camera is currently in (kInvalidCell if outside all cells). | | `GetCameraCell` | function | Tests | [TestPortalCulling.cpp:L182](../../Tests/TestPortalCulling.cpp#L182) | | | `GetCameraMode` | function | SparkEngine | [PlayModeManager.h:L251](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L251) | | @@ -14709,10 +14737,10 @@ | `GetChildren` | function | SparkEngine | [SceneGraph2D.h:L203](../../SparkEngine/Source/Engine/2D/SceneGraph2D.h#L203) | | | `GetChromaticAberrationSettings` | function | SparkEngine | [PostProcessingPipeline.h:L138](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L138) | | | `GetChromaticAberrationSettings` | function | SparkEngine | [PostProcessingPipeline.h:L139](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L139) | | -| `GetCinematic` | function | SparkEngine | [EngineContext.h:L227](../../SparkEngine/Source/Core/EngineContext.h#L227) | | -| `GetCinematic` | function | SparkEngine | [EngineContext.h:L231](../../SparkEngine/Source/Core/EngineContext.h#L231) | | -| `GetCinematic` | function | SparkSDK | [IEngineContext.h:L266](../../SparkSDK/Include/Spark/IEngineContext.h#L266) | Get the cinematic sequencer manager | +| `GetCinematic` | function | SparkEngine | [EngineContext.h:L228](../../SparkEngine/Source/Core/EngineContext.h#L228) | | +| `GetCinematic` | function | SparkEngine | [EngineContext.h:L232](../../SparkEngine/Source/Core/EngineContext.h#L232) | | | `GetCinematic` | function | SparkSDK | [IEngineContext.h:L267](../../SparkSDK/Include/Spark/IEngineContext.h#L267) | Get the cinematic sequencer manager | +| `GetCinematic` | function | SparkSDK | [IEngineContext.h:L268](../../SparkSDK/Include/Spark/IEngineContext.h#L268) | Get the cinematic sequencer manager | | `GetCinematicList` | function | GameModules | [MMOEngineSystems.h:L86](../../GameModules/SparkGameMMO/Source/Core/MMOEngineSystems.h#L86) | Unsubscribe events and release references | | `GetClass` | function | GameModules | [Player.h:L314](../../GameModules/SparkGameFPS/Source/Game/Player.h#L314) | Get the player's current class type | | `GetClass` | function | GameModules | [MMOCharacterSystem.h:L160](../../GameModules/SparkGameMMO/Source/Character/MMOCharacterSystem.h#L160) | | @@ -14831,10 +14859,10 @@ | `GetComponentRaw` | function | SparkEngine | [Reflection.h:L391](../../SparkEngine/Source/Core/Reflection.h#L391) | Get a raw pointer to a component by type name. Returns nullptr if not found. | | `GetComponents` | function | SparkEditor | [PrefabAsset.h:L99](../../SparkEditor/Source/Prefabs/PrefabAsset.h#L99) | Get all serialized components | | `GetComponents` | function | SparkEditor | [PrefabAsset.h:L105](../../SparkEditor/Source/Prefabs/PrefabAsset.h#L105) | Get mutable reference to components for editing | -| `GetComponentSerializers` | function | SparkEngine | [EngineContext.h:L273](../../SparkEngine/Source/Core/EngineContext.h#L273) | | -| `GetComponentSerializers` | function | SparkEngine | [EngineContext.h:L277](../../SparkEngine/Source/Core/EngineContext.h#L277) | | -| `GetComponentSerializers` | function | SparkSDK | [IEngineContext.h:L348](../../SparkSDK/Include/Spark/IEngineContext.h#L348) | Get the host's component serializer registry | +| `GetComponentSerializers` | function | SparkEngine | [EngineContext.h:L274](../../SparkEngine/Source/Core/EngineContext.h#L274) | | +| `GetComponentSerializers` | function | SparkEngine | [EngineContext.h:L278](../../SparkEngine/Source/Core/EngineContext.h#L278) | | | `GetComponentSerializers` | function | SparkSDK | [IEngineContext.h:L349](../../SparkSDK/Include/Spark/IEngineContext.h#L349) | Get the host's component serializer registry | +| `GetComponentSerializers` | function | SparkSDK | [IEngineContext.h:L350](../../SparkSDK/Include/Spark/IEngineContext.h#L350) | Get the host's component serializer registry | | `GetComponentSerializers` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L63](../../Tests/TestLIFE200ModuleReloadReal.cpp#L63) | | | `GetComponentSerializers` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L67](../../Tests/TestLIFE200ModuleReloadReal.cpp#L67) | | | `GetComponentSerializers` | function | Tests | [TestModuleABI.cpp:L101](../../Tests/TestModuleABI.cpp#L101) | | @@ -14851,10 +14879,10 @@ | `GetComputeEncoder` | function | SparkEngine | [MetalDevice.h:L402](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L402) | | | `GetComputeQueue` | function | SparkEngine | [D3D12Device.h:L166](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L166) | Returns ID3D12Device5 when DXR is supported, nullptr otherwise. | | `GetComputeShader` | function | SparkEngine | [D3D11Device.h:L138](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L138) | | -| `GetConditions` | function | SparkEngine | [EngineContext.h:L245](../../SparkEngine/Source/Core/EngineContext.h#L245) | | | `GetConditions` | function | SparkEngine | [EngineContext.h:L246](../../SparkEngine/Source/Core/EngineContext.h#L246) | | -| `GetConditions` | function | SparkSDK | [IEngineContext.h:L282](../../SparkSDK/Include/Spark/IEngineContext.h#L282) | Get the condition system (universal gameplay conditions) | +| `GetConditions` | function | SparkEngine | [EngineContext.h:L247](../../SparkEngine/Source/Core/EngineContext.h#L247) | | | `GetConditions` | function | SparkSDK | [IEngineContext.h:L283](../../SparkSDK/Include/Spark/IEngineContext.h#L283) | Get the condition system (universal gameplay conditions) | +| `GetConditions` | function | SparkSDK | [IEngineContext.h:L284](../../SparkSDK/Include/Spark/IEngineContext.h#L284) | Get the condition system (universal gameplay conditions) | | `GetConfig` | function | GameModules | [HUDSystem.h:L259](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L259) | Get mutable HUD configuration | | `GetConfig` | function | GameModules | [HUDSystem.h:L265](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L265) | Get read-only HUD configuration | | `GetConfig` | function | SparkEngine | [PlayModeManager.h:L301](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L301) | | @@ -14888,8 +14916,8 @@ | `GetConnectionState` | function | SparkEngine | [NetworkManager.h:L1265](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L1265) | | | `GetConnectionState` | function | Tests | [TestNetworkManagerOrchestration.cpp:L331](../../Tests/TestNetworkManagerOrchestration.cpp#L331) | | | `GetConnectionStatus` | function | SparkEditor | [SparkEngineIntegration.h:L232](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L232) | Get connection status | -| `GetConsole` | function | SparkEngine | [EngineContext.h:L288](../../SparkEngine/Source/Core/EngineContext.h#L288) | | -| `GetConsole` | function | SparkSDK | [IEngineContext.h:L367](../../SparkSDK/Include/Spark/IEngineContext.h#L367) | Get the host's console command registry | +| `GetConsole` | function | SparkEngine | [EngineContext.h:L289](../../SparkEngine/Source/Core/EngineContext.h#L289) | | +| `GetConsole` | function | SparkSDK | [IEngineContext.h:L368](../../SparkSDK/Include/Spark/IEngineContext.h#L368) | Get the host's console command registry | | `GetConsole` | function | Tests | [module_logging_context.h:L47](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L47) | | | `GetConsole` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L73](../../Tests/TestLIFE200ModuleReloadReal.cpp#L73) | | | `GetConsole` | function | Tests | [TestModuleABI.cpp:L119](../../Tests/TestModuleABI.cpp#L119) | | @@ -14915,10 +14943,10 @@ | `GetCooldownProgress` | function | GameModules | [ClassAbilityState.h:L35](../../GameModules/SparkGameFPS/Source/Game/ClassAbilityState.h#L35) | Return cooldown completion; nonpositive cooldown maxima return one. | | `GetCooldowns` | function | GameModules | [ARPGSkillSystem.h:L77](../../GameModules/SparkGameARPG/Source/Skill/ARPGSkillSystem.h#L77) | Active cooldowns for @p heroId (skills whose remaining cooldown is above zero). | | `GetCopyQueue` | function | SparkEngine | [D3D12Device.h:L165](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L165) | Returns ID3D12Device5 when DXR is supported, nullptr otherwise. | -| `GetCoroutineScheduler` | function | SparkEngine | [EngineContext.h:L194](../../SparkEngine/Source/Core/EngineContext.h#L194) | | | `GetCoroutineScheduler` | function | SparkEngine | [EngineContext.h:L195](../../SparkEngine/Source/Core/EngineContext.h#L195) | | -| `GetCoroutineScheduler` | function | SparkSDK | [IEngineContext.h:L209](../../SparkSDK/Include/Spark/IEngineContext.h#L209) | Get the coroutine scheduler for async tasks | +| `GetCoroutineScheduler` | function | SparkEngine | [EngineContext.h:L196](../../SparkEngine/Source/Core/EngineContext.h#L196) | | | `GetCoroutineScheduler` | function | SparkSDK | [IEngineContext.h:L210](../../SparkSDK/Include/Spark/IEngineContext.h#L210) | Get the coroutine scheduler for async tasks | +| `GetCoroutineScheduler` | function | SparkSDK | [IEngineContext.h:L211](../../SparkSDK/Include/Spark/IEngineContext.h#L211) | Get the coroutine scheduler for async tasks | | `GetCoroutineScheduler` | function | Tests | [TestGameModulePlatformerARPG.cpp:L314](../../Tests/TestGameModulePlatformerARPG.cpp#L314) | | | `GetCoroutineScheduler` | function | Tests | [TestGameModulePlatformerARPG.cpp:L318](../../Tests/TestGameModulePlatformerARPG.cpp#L318) | | | `GetCoroutineScheduler` | function | Tests | [TestSparkGameShowcase.cpp:L82](../../Tests/TestSparkGameShowcase.cpp#L82) | | @@ -14941,7 +14969,7 @@ | `GetCoverCount` | function | SparkEngine | [CoverSystem.h:L139](../../SparkEngine/Source/Engine/AI/CoverSystem.h#L139) | Get the total number of registered cover points. | | `GetCpuPointer` | function | SparkEngine | [NullRHIResources.h:L86](../../SparkEngine/Source/Graphics/RHI/NullRHIResources.h#L86) | CPU pointer used by NullRHIDevice::MapBuffer. | | `GetCpuPointer` | function | Tests | [TestTransientBufferAllocatorPhaseX.cpp:L65](../../Tests/TestTransientBufferAllocatorPhaseX.cpp#L65) | | -| `GetCrashArtifactPrefix` | function | SparkEngine | [CrashHandler.cpp:L508](../../SparkEngine/Source/Utils/CrashHandler.cpp#L508) | | +| `GetCrashArtifactPrefix` | function | SparkEngine | [CrashHandler.cpp:L509](../../SparkEngine/Source/Utils/CrashHandler.cpp#L509) | | | `GetCrashHandler` | function | SparkEditor | [EditorUI.h:L151](../../SparkEditor/Source/Core/EditorUI.h#L151) | | | `GetCreatedEntities` | function | Tests | [TestSystemManagerIntegration.cpp:L71](../../Tests/TestSystemManagerIntegration.cpp#L71) | | | `GetCreates` | function | SparkEngine | [RenderGraphPass.h:L67](../../SparkEngine/Source/Graphics/RenderGraphPass.h#L67) | | @@ -14975,14 +15003,14 @@ | `GetCurrentExecutablePath` | function | SparkEditor | [EditorProcessLaunch.cpp:L26](../../SparkEditor/Source/Utils/EditorProcessLaunch.cpp#L26) | | | `GetCurrentExposure` | function | SparkEngine | [TonemapColorGrading.h:L143](../../SparkEngine/Source/Graphics/TonemapColorGrading.h#L143) | Get the current adapted exposure value | | `GetCurrentFade` | function | SparkEngine | [Sequencer.h:L304](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L304) | | -| `GetCurrentFilePath` | function | SparkEngine | [SceneManager.h:L385](../../SparkEngine/Source/SceneManager/SceneManager.h#L385) | Return the file path from which the current scene was last loaded or saved. | +| `GetCurrentFilePath` | function | SparkEngine | [SceneManager.h:L387](../../SparkEngine/Source/SceneManager/SceneManager.h#L387) | Return the file path from which the current scene was last loaded or saved. | | `GetCurrentFilePath` | function | SparkEngine | [FileLogger.h:L188](../../SparkEngine/Source/Utils/FileLogger.h#L188) | Get the current log file path | | `GetCurrentFilePath` | function | SparkEngine | [Logger.h:L351](../../SparkEngine/Source/Utils/Logger.h#L351) | | | `GetCurrentFileSize` | function | SparkEngine | [FileLogger.h:L198](../../SparkEngine/Source/Utils/FileLogger.h#L198) | Get current file size in bytes | | `GetCurrentFileSize` | function | SparkEngine | [Logger.h:L352](../../SparkEngine/Source/Utils/Logger.h#L352) | | | `GetCurrentFloor` | function | GameModules | [ARPGDungeonSystem.h:L69](../../GameModules/SparkGameARPG/Source/Dungeon/ARPGDungeonSystem.h#L69) | | | `GetCurrentFloorNumber` | function | GameModules | [ARPGDungeonSystem.h:L76](../../GameModules/SparkGameARPG/Source/Dungeon/ARPGDungeonSystem.h#L76) | | -| `GetCurrentFolder` | function | SparkEditor | [AssetBrowserPanel.h:L99](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L99) | Wire live basic-path cache invalidation after an import. | +| `GetCurrentFolder` | function | SparkEditor | [AssetBrowserPanel.h:L109](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L109) | Wire live basic-path cache invalidation after an import. | | `GetCurrentFOV` | function | GameModules | [RacingCameraSystem.h:L89](../../GameModules/SparkGameRacing/Source/Camera/RacingCameraSystem.h#L89) | | | `GetCurrentFov` | function | Tests | [TestCameraTransforms.cpp:L231](../../Tests/TestCameraTransforms.cpp#L231) | | | `GetCurrentFps` | function | SparkEditor | [SceneStatisticsPanel.h:L63](../../SparkEditor/Source/Panels/SceneStatisticsPanel.h#L63) | Frames per second derived from the measured frame delta. | @@ -15023,7 +15051,7 @@ | `GetCurrentPlaybackTime` | function | SparkEngine | [Sequencer.h:L295](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L295) | | | `GetCurrentPlaybackTime` | function | Tests | [TestAnimationSystem.cpp:L353](../../Tests/TestAnimationSystem.cpp#L353) | | | `GetCurrentPosixThreadId` | function | SparkEditor | [EditorCrashHandler.cpp:L159](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L159) | | -| `GetCurrentProcessId` | function | SparkEngine | [CrashHandler.cpp:L1094](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1094) | | +| `GetCurrentProcessId` | function | SparkEngine | [CrashHandler.cpp:L1095](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1095) | | | `GetCurrentProject` | function | SparkEditor | [ProjectManager.h:L157](../../SparkEditor/Source/Core/ProjectManager.h#L157) | Persist a successfully opened/saved scene as project-relative state. | | `GetCurrentPrompt` | function | GameModules | [InteractiveObject.h:L451](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L451) | Get interaction prompt for HUD | | `GetCurrentRenderScale` | function | SparkEngine | [UpscalingSystem.h:L139](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L139) | Get the current render scale factor | @@ -15059,7 +15087,7 @@ | `GetCurrentThemeData` | function | SparkEditor | [EditorTheme.h:L234](../../SparkEditor/Source/Core/EditorTheme.h#L234) | Get current theme name | | `GetCurrentThemeName` | function | SparkEditor | [EditorTheme.h:L232](../../SparkEditor/Source/Core/EditorTheme.h#L232) | Get current theme name | | `GetCurrentThreadId` | macro | SparkEngine | [PlatformAudioStubs.h:L364](../../SparkEngine/Source/Core/PlatformAudioStubs.h#L364) | | -| `GetCurrentThreadId` | function | SparkEngine | [CrashHandler.cpp:L1095](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1095) | | +| `GetCurrentThreadId` | function | SparkEngine | [CrashHandler.cpp:L1096](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1096) | | | `GetCurrentThreadId` | function | SparkEngine | [ThreadDebugger.h:L425](../../SparkEngine/Source/Utils/ThreadDebugger.h#L425) | Utility to get a stable uint64_t thread ID from std::this_thread | | `GetCurrentTime` | function | SparkEngine | [VideoPlayer.h:L320](../../SparkEngine/Source/Engine/Cinematic/VideoPlayer.h#L320) | Get current playback time | | `GetCurrentTimestamp` | function | SparkEditor | [ProjectManager.cpp:L70](../../SparkEditor/Source/Core/ProjectManager.cpp#L70) | | @@ -15094,12 +15122,12 @@ | `GetD3D12Resource` | function | SparkEngine | [D3D12Types.h:L402](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L402) | | | `GetD3D12Resource` | function | SparkEngine | [D3D12Types.h:L486](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L486) | | | `GetD3DContext` | function | SparkEngine | [RenderDevice.h:L113](../../SparkEngine/Source/Graphics/RenderDevice.h#L113) | | -| `GetD3DContext` | function | SparkEngine | [CrashHandler.cpp:L816](../../SparkEngine/Source/Utils/CrashHandler.cpp#L816) | | +| `GetD3DContext` | function | SparkEngine | [CrashHandler.cpp:L817](../../SparkEngine/Source/Utils/CrashHandler.cpp#L817) | | | `GetD3DContext` | function | SparkEngine | [D3DUtils.cpp:L45](../../SparkEngine/Source/Utils/D3DUtils.cpp#L45) | | | `GetD3DContext` | function | SparkEngine | [D3DUtils.cpp:L84](../../SparkEngine/Source/Utils/D3DUtils.cpp#L84) | | | `GetD3DContext` | function | SparkEngine | [D3DUtils.h:L70](../../SparkEngine/Source/Utils/D3DUtils.h#L70) | Get the DirectX 11 immediate device context @return Pointer to the context, or nullptr if not initialized | | `GetD3DDevice` | function | SparkEngine | [RenderDevice.h:L112](../../SparkEngine/Source/Graphics/RenderDevice.h#L112) | | -| `GetD3DDevice` | function | SparkEngine | [CrashHandler.cpp:L815](../../SparkEngine/Source/Utils/CrashHandler.cpp#L815) | | +| `GetD3DDevice` | function | SparkEngine | [CrashHandler.cpp:L816](../../SparkEngine/Source/Utils/CrashHandler.cpp#L816) | | | `GetD3DDevice` | function | SparkEngine | [D3DUtils.cpp:L38](../../SparkEngine/Source/Utils/D3DUtils.cpp#L38) | | | `GetD3DDevice` | function | SparkEngine | [D3DUtils.cpp:L80](../../SparkEngine/Source/Utils/D3DUtils.cpp#L80) | | | `GetD3DDevice` | function | SparkEngine | [D3DUtils.h:L67](../../SparkEngine/Source/Utils/D3DUtils.h#L67) | Get the DirectX 11 device @return Pointer to the device, or nullptr if not initialized | @@ -15308,10 +15336,10 @@ | `GetDescriptorTables` | function | SparkEngine | [D3D12Device.h:L196](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L196) | | | `GetDesiredTileSize` | function | SparkEngine | [CachedShadowAtlas.h:L313](../../SparkEngine/Source/Graphics/CachedShadowAtlas.h#L313) | Determine tile size based on priority | | `GetDestination` | function | GameModules | [InteractiveObject.h:L320](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L320) | | -| `GetDestruction` | function | SparkEngine | [EngineContext.h:L225](../../SparkEngine/Source/Core/EngineContext.h#L225) | | | `GetDestruction` | function | SparkEngine | [EngineContext.h:L226](../../SparkEngine/Source/Core/EngineContext.h#L226) | | -| `GetDestruction` | function | SparkSDK | [IEngineContext.h:L262](../../SparkSDK/Include/Spark/IEngineContext.h#L262) | Get the destruction system for destructible objects | +| `GetDestruction` | function | SparkEngine | [EngineContext.h:L227](../../SparkEngine/Source/Core/EngineContext.h#L227) | | | `GetDestruction` | function | SparkSDK | [IEngineContext.h:L263](../../SparkSDK/Include/Spark/IEngineContext.h#L263) | Get the destruction system for destructible objects | +| `GetDestruction` | function | SparkSDK | [IEngineContext.h:L264](../../SparkSDK/Include/Spark/IEngineContext.h#L264) | Get the destruction system for destructible objects | | `GetDestructionSound` | function | SparkEngine | [DestructionSystem.h:L90](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L90) | Set the destruction sound effect. | | `GetDetailedInfo` | function | SparkEngine | [MaterialSystem.h:L264](../../SparkEngine/Source/Graphics/MaterialSystem.h#L264) | | | `GetDetailNoiseTexture` | function | SparkEngine | [VolumetricClouds.h:L178](../../SparkEngine/Source/Graphics/VolumetricClouds.h#L178) | Upload latest CPU-generated noise/weather to the GPU textures | @@ -15329,10 +15357,10 @@ | `GetDeviceInfo` | function | SparkEngine | [RHIDevice.h:L186](../../SparkEngine/Source/Graphics/RHI/RHIDevice.h#L186) | | | `GetDeviceInfo` | function | SparkEngine | [VulkanDevice.h:L473](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L473) | | | `GetDeviceInfo` | function | Tests | [TestTransientBufferAllocatorPhaseX.cpp:L144](../../Tests/TestTransientBufferAllocatorPhaseX.cpp#L144) | | -| `GetDialogue` | function | SparkEngine | [EngineContext.h:L209](../../SparkEngine/Source/Core/EngineContext.h#L209) | | | `GetDialogue` | function | SparkEngine | [EngineContext.h:L210](../../SparkEngine/Source/Core/EngineContext.h#L210) | | -| `GetDialogue` | function | SparkSDK | [IEngineContext.h:L233](../../SparkSDK/Include/Spark/IEngineContext.h#L233) | Get the dialogue system | +| `GetDialogue` | function | SparkEngine | [EngineContext.h:L211](../../SparkEngine/Source/Core/EngineContext.h#L211) | | | `GetDialogue` | function | SparkSDK | [IEngineContext.h:L234](../../SparkSDK/Include/Spark/IEngineContext.h#L234) | Get the dialogue system | +| `GetDialogue` | function | SparkSDK | [IEngineContext.h:L235](../../SparkSDK/Include/Spark/IEngineContext.h#L235) | Get the dialogue system | | `GetDialogue` | function | Tests | [TestMOD350RPGQuestSliceReal.cpp:L91](../../Tests/TestMOD350RPGQuestSliceReal.cpp#L91) | | | `GetDialogue` | function | Tests | [TestMOD350RPGQuestSliceReal.cpp:L92](../../Tests/TestMOD350RPGQuestSliceReal.cpp#L92) | | | `GetDialogue` | function | Tests | [TestModuleABI.cpp:L113](../../Tests/TestModuleABI.cpp#L113) | | @@ -15456,7 +15484,7 @@ | `GetElapsedMs` | function | SparkEngine | [AIBudgetLimiterCore.h:L181](../../SparkEngine/Source/Engine/AI/AIBudgetLimiterCore.h#L181) | Get elapsed time since BeginFrame() in milliseconds. | | `GetElapsedTime` | function | SparkEngine | [InstanceManager.h:L91](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L91) | | | `GetElapsedTime` | function | SparkEngine | [TimerManager.h:L273](../../SparkEngine/Source/Utils/TimerManager.h#L273) | Get elapsed time since last fire | -| `GetElapsedTime` | function | SparkSDK | [IEngineContext.h:L318](../../SparkSDK/Include/Spark/IEngineContext.h#L318) | Get elapsed time since engine start in seconds | +| `GetElapsedTime` | function | SparkSDK | [IEngineContext.h:L319](../../SparkSDK/Include/Spark/IEngineContext.h#L319) | Get elapsed time since engine start in seconds | | `GetEmitter` | function | SparkEngine | [ParticleSystem.h:L239](../../SparkEngine/Source/Graphics/ParticleSystem.h#L239) | | | `GetEmitterCount` | function | SparkEngine | [ParticleSystem.h:L252](../../SparkEngine/Source/Graphics/ParticleSystem.h#L252) | | | `GetEnabledCategoryCount` | function | SparkEngine | [GameplayDebugger.h:L371](../../SparkEngine/Source/Utils/GameplayDebugger.h#L371) | Get count of enabled categories | @@ -15468,16 +15496,16 @@ | `GetEnemiesKilledThisWave` | function | GameModules | [WaveSpawner.h:L111](../../GameModules/SparkGameFPS/Source/Game/WaveSpawner.h#L111) | | | `GetEnergy` | function | GameModules | [Player.h:L338](../../GameModules/SparkGameFPS/Source/Game/Player.h#L338) | Get the ability energy pool | | `GetEngineContext` | function | GameModules | [Game.h:L343](../../GameModules/SparkGameFPS/Source/Game/Game.h#L343) | Get the engine context | -| `GetEnginePID` | function | SparkEngine | [CrashHandler.cpp:L524](../../SparkEngine/Source/Utils/CrashHandler.cpp#L524) | | -| `GetEnginePID` | function | SparkEngine | [CrashHandler.cpp:L716](../../SparkEngine/Source/Utils/CrashHandler.cpp#L716) | | +| `GetEnginePID` | function | SparkEngine | [CrashHandler.cpp:L525](../../SparkEngine/Source/Utils/CrashHandler.cpp#L525) | | +| `GetEnginePID` | function | SparkEngine | [CrashHandler.cpp:L717](../../SparkEngine/Source/Utils/CrashHandler.cpp#L717) | | | `GetEngineRPM` | function | SparkEngine | [VehiclePhysics.h:L90](../../SparkEngine/Source/Physics/VehiclePhysics.h#L90) | Get current engine RPM. | | `GetEngineRuntime` | function | SparkEngine | [EngineRuntime.cpp:L87](../../SparkEngine/Source/Core/EngineRuntime.cpp#L87) | | | `GetEngineRuntime` | function | SparkEngine | [EngineRuntime.h:L153](../../SparkEngine/Source/Core/EngineRuntime.h#L153) | Access the process-wide EngineRuntime instance. | | `GetEngineRuntime` | function | SparkEngine | [SparkEngineWindowsHeadless.cpp:L264](../../SparkEngine/Source/Core/SparkEngineWindowsHeadless.cpp#L264) | | | `GetEngineState` | function | SparkEditor | [SparkEngineIntegration.h:L422](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L422) | Get current engine state | -| `GetEngineVersion` | function | SparkEngine | [EngineContext.h:L418](../../SparkEngine/Source/Core/EngineContext.h#L418) | | -| `GetEngineVersion` | function | SparkSDK | [IEngineContext.h:L309](../../SparkSDK/Include/Spark/IEngineContext.h#L309) | Get the packed engine version (0xMMmmpp) | -| `GetEngineVersion` | function | SparkSDK | [Version.h:L50](../../SparkSDK/Include/Spark/Version.h#L50) | Get the packed engine version at runtime | +| `GetEngineVersion` | function | SparkEngine | [EngineContext.h:L421](../../SparkEngine/Source/Core/EngineContext.h#L421) | | +| `GetEngineVersion` | function | SparkSDK | [IEngineContext.h:L310](../../SparkSDK/Include/Spark/IEngineContext.h#L310) | Get the packed engine version (0xMMmmpp) | +| `GetEngineVersion` | function | SparkSDK | [Version.h:L54](../../SparkSDK/Include/Spark/Version.h#L54) | Get the packed engine version at runtime | | `GetEngineVersion` | function | Tests | [module_logging_context.h:L44](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L44) | | | `GetEngineVersion` | function | Tests | [TestGameModuleMMO.cpp:L76](../../Tests/TestGameModuleMMO.cpp#L76) | | | `GetEngineVersion` | function | Tests | [TestGameModuleMMO.cpp:L735](../../Tests/TestGameModuleMMO.cpp#L735) | | @@ -15534,7 +15562,7 @@ | `GetEntryCount` | function | SparkEngine | [SceneConfigDatabase.h:L130](../../SparkEngine/Source/SceneManager/SceneConfigDatabase.h#L130) | | | `GetEntryCount` | function | SparkEngine | [LocalFileCache.h:L331](../../SparkEngine/Source/Utils/LocalFileCache.h#L331) | Number of entries currently in cache | | `GetEntryCount` | function | Tests | [TestShaderDiskCache.cpp:L39](../../Tests/TestShaderDiskCache.cpp#L39) | | -| `GetEntryCount` | function | Tests | [TestSparkPak.cpp:L238](../../Tests/TestSparkPak.cpp#L238) | | +| `GetEntryCount` | function | Tests | [TestSparkPak.cpp:L244](../../Tests/TestSparkPak.cpp#L244) | | | `GetEntryPoint` | function | SparkEngine | [D3D11Device.h:L128](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L128) | | | `GetEntryPoint` | function | SparkEngine | [D3D12Types.h:L530](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L530) | | | `GetEntryPoint` | function | SparkEngine | [MetalDevice.h:L197](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L197) | | @@ -15556,10 +15584,10 @@ | `GetEstimatedMemoryUsage` | function | SparkEngine | [TransientResourcePool.h:L129](../../SparkEngine/Source/Graphics/RenderGraph/TransientResourcePool.h#L129) | Estimated total memory usage in bytes. | | `GetEstimatedRTT` | function | SparkEngine | [NetworkManager.h:L807](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L807) | | | `GetEstimatedRTT` | function | Tests | [TestNetworkManagerOrchestration.cpp:L335](../../Tests/TestNetworkManagerOrchestration.cpp#L335) | | -| `GetEventBus` | function | SparkEngine | [EngineContext.h:L153](../../SparkEngine/Source/Core/EngineContext.h#L153) | | | `GetEventBus` | function | SparkEngine | [EngineContext.h:L154](../../SparkEngine/Source/Core/EngineContext.h#L154) | | -| `GetEventBus` | function | SparkSDK | [IEngineContext.h:L143](../../SparkSDK/Include/Spark/IEngineContext.h#L143) | Get the event bus for publish/subscribe messaging | +| `GetEventBus` | function | SparkEngine | [EngineContext.h:L155](../../SparkEngine/Source/Core/EngineContext.h#L155) | | | `GetEventBus` | function | SparkSDK | [IEngineContext.h:L144](../../SparkSDK/Include/Spark/IEngineContext.h#L144) | Get the event bus for publish/subscribe messaging | +| `GetEventBus` | function | SparkSDK | [IEngineContext.h:L145](../../SparkSDK/Include/Spark/IEngineContext.h#L145) | Get the event bus for publish/subscribe messaging | | `GetEventBus` | function | Tests | [module_logging_context.h:L38](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L38) | | | `GetEventBus` | function | Tests | [module_logging_context.h:L39](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L39) | | | `GetEventBus` | function | Tests | [TestGameModuleMMO.cpp:L70](../../Tests/TestGameModuleMMO.cpp#L70) | | @@ -15656,10 +15684,10 @@ | `GetFieldCount` | function | Tests | [TestReplicationFields.cpp:L149](../../Tests/TestReplicationFields.cpp#L149) | | | `GetFieldIndex` | function | SparkEngine | [ReplicationFields.h:L84](../../SparkEngine/Source/Engine/Networking/ReplicationFields.h#L84) | Implicit read-only conversion for convenience | | `GetFieldSet` | function | SparkEngine | [EntityReplicator.h:L113](../../SparkEngine/Source/Engine/Networking/EntityReplicator.h#L113) | Get mutable access to an entity's field set (for marking dirty) | -| `GetFileCache` | function | SparkEngine | [EngineContext.h:L199](../../SparkEngine/Source/Core/EngineContext.h#L199) | | | `GetFileCache` | function | SparkEngine | [EngineContext.h:L200](../../SparkEngine/Source/Core/EngineContext.h#L200) | | -| `GetFileCache` | function | SparkSDK | [IEngineContext.h:L213](../../SparkSDK/Include/Spark/IEngineContext.h#L213) | Get the local file cache | +| `GetFileCache` | function | SparkEngine | [EngineContext.h:L201](../../SparkEngine/Source/Core/EngineContext.h#L201) | | | `GetFileCache` | function | SparkSDK | [IEngineContext.h:L214](../../SparkSDK/Include/Spark/IEngineContext.h#L214) | Get the local file cache | +| `GetFileCache` | function | SparkSDK | [IEngineContext.h:L215](../../SparkSDK/Include/Spark/IEngineContext.h#L215) | Get the local file cache | | `GetFileCount` | function | SparkEngine | [SparkPakWriter.h:L54](../../SparkEngine/Source/Core/SparkPakWriter.h#L54) | Number of files staged for writing. | | `GetFileDiff` | function | SparkEditor | [VersionControlSystem.h:L222](../../SparkEditor/Source/VersionControl/VersionControlSystem.h#L222) | Get file differences | | `GetFileModTime` | function | SparkEngine | [ShaderCompilationLinux.cpp:L37](../../SparkEngine/Source/Graphics/ShaderCompilationLinux.cpp#L37) | | @@ -15674,8 +15702,8 @@ | `GetFileStatus` | function | SparkEditor | [VersionControlSystem.h:L301](../../SparkEditor/Source/VersionControl/VersionControlSystem.h#L301) | Get file status | | `GetFilesWritten` | function | SparkEngine | [Telemetry.h:L228](../../SparkEngine/Source/Utils/Telemetry.h#L228) | Number of files successfully written since creation. | | `GetFileTimestamp` | function | SparkEngine | [AssetPipeline.h:L602](../../SparkEngine/Source/Graphics/AssetPipeline.h#L602) | | -| `GetFileTypeColor` | function | SparkEditor | [AssetBrowserPanel.cpp:L149](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L149) | | -| `GetFileTypeIcon` | function | SparkEditor | [AssetBrowserPanel.cpp:L124](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L124) | | +| `GetFileTypeColor` | function | SparkEditor | [AssetBrowserGrid.cpp:L44](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L44) | | +| `GetFileTypeIcon` | function | SparkEditor | [AssetBrowserGrid.cpp:L19](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L19) | | | `GetFilmGrainSettings` | function | SparkEngine | [PostProcessingPipeline.h:L141](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L141) | | | `GetFilmGrainSettings` | function | SparkEngine | [PostProcessingPipeline.h:L142](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L142) | | | `GetFilmGrainSettings` | function | Tests | [TestPostProcessingPipeline.cpp:L225](../../Tests/TestPostProcessingPipeline.cpp#L225) | | @@ -15710,7 +15738,7 @@ | `GetFogStatusString` | function | GameModules | [RTSFogOfWarSystem.h:L82](../../GameModules/SparkGameRTS/Source/FogOfWar/RTSFogOfWarSystem.h#L82) | | | `GetFogVolumeTexture` | function | SparkEngine | [FroxelVolumetricFog.h:L203](../../SparkEngine/Source/Graphics/FroxelVolumetricFog.h#L203) | Get the 3D fog volume texture | | `GetFolderFunction` | alias | SparkEngine | [CrashArtifactDirectory.h:L183](../../SparkEngine/Source/Utils/CrashArtifactDirectory.h#L183) | | -| `GetFolders` | function | SparkEditor | [AssetBrowserPanel.h:L101](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L101) | Wire live basic-path cache invalidation after an import. | +| `GetFolders` | function | SparkEditor | [AssetBrowserPanel.h:L111](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L111) | Wire live basic-path cache invalidation after an import. | | `GetFontCount` | function | SparkEngine | [FontSystem.h:L412](../../SparkEngine/Source/Engine/Text/FontSystem.h#L412) | Get the number of loaded fonts | | `GetFontInfo` | function | SparkEngine | [FontSystem.h:L398](../../SparkEngine/Source/Engine/Text/FontSystem.h#L398) | Get information about a loaded font | | `GetFormat` | function | SparkEngine | [SoundEffect.h:L103](../../SparkEngine/Source/Audio/SoundEffect.h#L103) | Get the audio format structure | @@ -15761,7 +15789,7 @@ | `GetFrameHistory` | function | SparkEngine | [Profiler.h:L258](../../SparkEngine/Source/Utils/Profiler.h#L258) | | | `GetFrameIndex` | function | SparkEngine | [TemporalEffects.h:L368](../../SparkEngine/Source/Graphics/TemporalEffects.h#L368) | Get the current frame index | | `GetFrameNumber` | function | SparkEngine | [FrameInspector.h:L265](../../SparkEngine/Source/Utils/FrameInspector.h#L265) | | -| `GetFrameNumber` | function | SparkSDK | [IEngineContext.h:L324](../../SparkSDK/Include/Spark/IEngineContext.h#L324) | Get the current frame number (monotonically increasing) | +| `GetFrameNumber` | function | SparkSDK | [IEngineContext.h:L325](../../SparkSDK/Include/Spark/IEngineContext.h#L325) | Get the current frame number (monotonically increasing) | | `GetFrameProjectionMatrix` | function | SparkEngine | [GraphicsEngine.h:L962](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L962) | Get the projection matrix from the most recent frame. | | `GetFrames` | function | SparkEngine | [StackTrace.h:L120](../../SparkEngine/Source/Utils/StackTrace.h#L120) | Get the resolved stack frames | | `GetFrameStatistics` | function | SparkEngine | [RHIBridge.h:L263](../../SparkEngine/Source/Graphics/RHI/RHIBridge.h#L263) | | @@ -15798,10 +15826,10 @@ | `GetGameplayFrameCount` | function | SparkEngine | [GameplaySystemLifecycle.h:L74](../../SparkEngine/Source/Core/GameplaySystemLifecycle.h#L74) | Get the current gameplay frame counter (debug hooks at shutdown, fault records) | | `GetGameplayFrameCountImpl` | function | SparkEngine | [GameplayLifecycleShared.cpp:L1395](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L1395) | | | `GetGameplayFrameCountImpl` | function | SparkEngine | [GameplayLifecycleShared.h:L66](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.h#L66) | | -| `GetGameplayTagService` | function | SparkEngine | [EngineContext.h:L179](../../SparkEngine/Source/Core/EngineContext.h#L179) | | | `GetGameplayTagService` | function | SparkEngine | [EngineContext.h:L180](../../SparkEngine/Source/Core/EngineContext.h#L180) | | -| `GetGameplayTagService` | function | SparkSDK | [IEngineContext.h:L179](../../SparkSDK/Include/Spark/IEngineContext.h#L179) | Get the gameplay tag lifecycle interface (DI-friendly). | +| `GetGameplayTagService` | function | SparkEngine | [EngineContext.h:L181](../../SparkEngine/Source/Core/EngineContext.h#L181) | | | `GetGameplayTagService` | function | SparkSDK | [IEngineContext.h:L180](../../SparkSDK/Include/Spark/IEngineContext.h#L180) | Get the gameplay tag lifecycle interface (DI-friendly). | +| `GetGameplayTagService` | function | SparkSDK | [IEngineContext.h:L181](../../SparkSDK/Include/Spark/IEngineContext.h#L181) | Get the gameplay tag lifecycle interface (DI-friendly). | | `GetGameVersion` | function | SparkEngine | [IGameModule.h:L39](../../SparkEngine/Source/Core/IGameModule.h#L39) | Get the version string of this game module | | `GetGameVersion` | function | Tests | [LegacyModule.cpp:L12](../../Tests/Fixtures/ModuleABI/LegacyModule.cpp#L12) | | | `GetGatherTimer` | function | GameModules | [RTSResourceSystem.h:L87](../../GameModules/SparkGameRTS/Source/Resource/RTSResourceSystem.h#L87) | Seconds accumulated toward the next harvest trip, in [0, GATHER_INTERVAL). | @@ -15838,10 +15866,10 @@ | `GetGPUVirtualAddress` | function | SparkEngine | [D3D12Types.h:L405](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L405) | | | `GetGradients` | function | SparkEngine | [CpuNeuralTraining.h:L185](../../SparkEngine/Source/Graphics/Neural/CpuNeuralTraining.h#L185) | Access to raw gradient buffer (for diagnostics / custom updates). | | `GetGraphics` | function | SparkEditor | [EditorUI.h:L268](../../SparkEditor/Source/Core/EditorUI.h#L268) | Get the editor's GraphicsEngine, attached to the editor's own | -| `GetGraphics` | function | SparkEngine | [EngineContext.h:L147](../../SparkEngine/Source/Core/EngineContext.h#L147) | Reset the global EngineContext (shutdown only) | -| `GetGraphics` | function | SparkEngine | [EngineContext.h:L148](../../SparkEngine/Source/Core/EngineContext.h#L148) | | -| `GetGraphics` | function | SparkSDK | [IEngineContext.h:L131](../../SparkSDK/Include/Spark/IEngineContext.h#L131) | Get the graphics/rendering engine | +| `GetGraphics` | function | SparkEngine | [EngineContext.h:L148](../../SparkEngine/Source/Core/EngineContext.h#L148) | Reset the global EngineContext (shutdown only) | +| `GetGraphics` | function | SparkEngine | [EngineContext.h:L149](../../SparkEngine/Source/Core/EngineContext.h#L149) | | | `GetGraphics` | function | SparkSDK | [IEngineContext.h:L132](../../SparkSDK/Include/Spark/IEngineContext.h#L132) | Get the graphics/rendering engine | +| `GetGraphics` | function | SparkSDK | [IEngineContext.h:L133](../../SparkSDK/Include/Spark/IEngineContext.h#L133) | Get the graphics/rendering engine | | `GetGraphics` | function | Tests | [module_logging_context.h:L32](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L32) | | | `GetGraphics` | function | Tests | [module_logging_context.h:L33](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L33) | | | `GetGraphics` | function | Tests | [TestGameModuleMMO.cpp:L64](../../Tests/TestGameModuleMMO.cpp#L64) | | @@ -15890,7 +15918,7 @@ | `GetGraphics` | function | Tests | [TestSparkGameShowcase.cpp:L69](../../Tests/TestSparkGameShowcase.cpp#L69) | | | `GetGraphics` | function | Tests | [Test_gamemodules_mmochat_di.cpp:L38](../../Tests/harden/Test_gamemodules_mmochat_di.cpp#L38) | | | `GetGraphics` | function | Tests | [Test_gamemodules_mmochat_di.cpp:L39](../../Tests/harden/Test_gamemodules_mmochat_di.cpp#L39) | | -| `GetGraphicsBackend` | function | SparkEditor | [EditorApplication.h:L92](../../SparkEditor/Source/Core/EditorApplication.h#L92) | Number of main-loop Present calls that did not return S_OK. | +| `GetGraphicsBackend` | function | SparkEditor | [EditorApplication.h:L92](../../SparkEditor/Source/Core/EditorApplication.h#L92) | Number of frame presentation failures reported by the active graphics backend. | | `GetGraphicsFromContext` | function | SparkEngine | [D3DUtils.cpp:L21](../../SparkEngine/Source/Utils/D3DUtils.cpp#L21) | | | `GetGraphicsPerformance` | function | GameModules | [Game.h:L528](../../GameModules/SparkGameFPS/Source/Game/Game.h#L528) | Get current graphics performance metrics | | `GetGraphicsQueue` | function | SparkEngine | [VulkanDevice.h:L488](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L488) | | @@ -15936,7 +15964,7 @@ | `GetHandlerCount` | function | SparkEngine | [ScriptHookManager.h:L238](../../SparkEngine/Source/Engine/Scripting/ScriptHookManager.h#L238) | Number of registered handlers for a specific hook type. | | `GetHandlerCount` | function | Tests | [TestScriptHookManager.cpp:L131](../../Tests/TestScriptHookManager.cpp#L131) | | | `GetHazardCount` | function | GameModules | [PlatformerHazardSystem.h:L113](../../GameModules/SparkGamePlatformer/Source/Hazard/PlatformerHazardSystem.h#L113) | Total hazards placed in the current level | -| `GetHeader` | function | Tests | [TestSparkPak.cpp:L239](../../Tests/TestSparkPak.cpp#L239) | | +| `GetHeader` | function | Tests | [TestSparkPak.cpp:L245](../../Tests/TestSparkPak.cpp#L245) | | | `GetHeadOrientation` | function | SparkEngine | [VRSystem.h:L149](../../SparkEngine/Source/Engine/VR/VRSystem.h#L149) | Get head orientation as quaternion. | | `GetHeadOrientation` | function | Tests | [TestVRSystem.cpp:L111](../../Tests/TestVRSystem.cpp#L111) | | | `GetHeadPosition` | function | SparkEngine | [VRSystem.h:L146](../../SparkEngine/Source/Engine/VR/VRSystem.h#L146) | Get head position in world space. | @@ -16049,10 +16077,10 @@ | `GetInjectionData` | function | SparkEngine | [GameImGuiLayer.cpp:L115](../../SparkEngine/Source/Core/GameImGuiLayer.cpp#L115) | | | `GetInjectionData` | function | SparkEngine | [GameImGuiLayer.cpp:L169](../../SparkEngine/Source/Core/GameImGuiLayer.cpp#L169) | | | `GetInjectionData` | function | SparkEngine | [GameImGuiLayer.h:L55](../../SparkEngine/Source/Core/GameImGuiLayer.h#L55) | | -| `GetInput` | function | SparkEngine | [EngineContext.h:L149](../../SparkEngine/Source/Core/EngineContext.h#L149) | | | `GetInput` | function | SparkEngine | [EngineContext.h:L150](../../SparkEngine/Source/Core/EngineContext.h#L150) | | -| `GetInput` | function | SparkSDK | [IEngineContext.h:L135](../../SparkSDK/Include/Spark/IEngineContext.h#L135) | Get the input manager | +| `GetInput` | function | SparkEngine | [EngineContext.h:L151](../../SparkEngine/Source/Core/EngineContext.h#L151) | | | `GetInput` | function | SparkSDK | [IEngineContext.h:L136](../../SparkSDK/Include/Spark/IEngineContext.h#L136) | Get the input manager | +| `GetInput` | function | SparkSDK | [IEngineContext.h:L137](../../SparkSDK/Include/Spark/IEngineContext.h#L137) | Get the input manager | | `GetInput` | function | Tests | [module_logging_context.h:L34](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L34) | | | `GetInput` | function | Tests | [module_logging_context.h:L35](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L35) | | | `GetInput` | function | Tests | [TestGameModuleMMO.cpp:L66](../../Tests/TestGameModuleMMO.cpp#L66) | | @@ -16103,6 +16131,7 @@ | `GetInput` | function | Tests | [Test_gamemodules_mmochat_di.cpp:L41](../../Tests/harden/Test_gamemodules_mmochat_di.cpp#L41) | | | `GetInputBuffer` | function | SparkEngine | [InGameConsole.h:L293](../../SparkEngine/Source/Utils/InGameConsole.h#L293) | Get the current input buffer text | | `GetInputCaptureHint` | function | SparkEditor | [GameViewPanel.h:L83](../../SparkEditor/Source/Panels/GameViewPanel.h#L83) | | +| `GetInputFrameSequence` | function | SparkEngine | [InputManager.h:L171](../../SparkEngine/Source/Input/InputManager.h#L171) | | | `GetInputLayout` | function | SparkEngine | [D3D11Device.h:L184](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L184) | | | `GetInputSize` | function | SparkEngine | [CpuNeuralInference.h:L62](../../SparkEngine/Source/Graphics/Neural/CpuNeuralInference.h#L62) | Input size of the first layer. | | `GetInputSize` | function | SparkEngine | [NeuralFunctionApproximator.h:L116](../../SparkEngine/Source/Graphics/Neural/NeuralFunctionApproximator.h#L116) | Input dimensionality (0 if not configured). | @@ -16276,11 +16305,11 @@ | `GetInstanceData` | function | SparkEngine | [InstanceManager.h:L199](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L199) | | | `GetInstanceInfoString` | function | GameModules | [MMODungeonSystem.h:L133](../../GameModules/SparkGameMMO/Source/Dungeon/MMODungeonSystem.h#L133) | | | `GetInstances` | function | SparkEditor | [PrefabManager.h:L189](../../SparkEditor/Source/Prefabs/PrefabManager.h#L189) | Get all instances of a specific prefab | -| `GetInstances` | function | SparkEngine | [EngineContext.h:L250](../../SparkEngine/Source/Core/EngineContext.h#L250) | | | `GetInstances` | function | SparkEngine | [EngineContext.h:L251](../../SparkEngine/Source/Core/EngineContext.h#L251) | | +| `GetInstances` | function | SparkEngine | [EngineContext.h:L252](../../SparkEngine/Source/Core/EngineContext.h#L252) | | | `GetInstances` | function | SparkEngine | [FoliageSystem.h:L209](../../SparkEngine/Source/Graphics/FoliageSystem.h#L209) | Immutable view of the instances for a specific volume. | -| `GetInstances` | function | SparkSDK | [IEngineContext.h:L286](../../SparkSDK/Include/Spark/IEngineContext.h#L286) | Get the instance manager (encounters, lockouts) | | `GetInstances` | function | SparkSDK | [IEngineContext.h:L287](../../SparkSDK/Include/Spark/IEngineContext.h#L287) | Get the instance manager (encounters, lockouts) | +| `GetInstances` | function | SparkSDK | [IEngineContext.h:L288](../../SparkSDK/Include/Spark/IEngineContext.h#L288) | Get the instance manager (encounters, lockouts) | | `GetInt` | function | GameModules | [TFDataTablesInternal.h:L32](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTablesInternal.h#L32) | | | `GetInt` | function | SparkEditor | [RegionMapEditorIO.cpp:L123](../../SparkEditor/Source/Panels/RegionMapEditorIO.cpp#L123) | | | `GetInt` | function | SparkEngine | [DataTableSystem.h:L55](../../SparkEngine/Source/Engine/DataTable/DataTableSystem.h#L55) | Get int value, or 0 if absent/unparseable. | @@ -16314,10 +16343,10 @@ | `GetInterpolationDelay` | function | SparkEngine | [NetworkInterpolation.h:L95](../../SparkEngine/Source/Engine/Networking/NetworkInterpolation.h#L95) | Get the current interpolation delay. | | `GetInterpolationDelay` | function | Tests | [TestNetworkInterpolation.cpp:L91](../../Tests/TestNetworkInterpolation.cpp#L91) | | | `GetInterval` | function | SparkEngine | [Cooldown.h:L176](../../SparkEngine/Source/Utils/Cooldown.h#L176) | Get the configured interval. | -| `GetInvalidStateDetector` | function | SparkEngine | [EngineContext.h:L268](../../SparkEngine/Source/Core/EngineContext.h#L268) | | | `GetInvalidStateDetector` | function | SparkEngine | [EngineContext.h:L269](../../SparkEngine/Source/Core/EngineContext.h#L269) | | -| `GetInvalidStateDetector` | function | SparkSDK | [IEngineContext.h:L338](../../SparkSDK/Include/Spark/IEngineContext.h#L338) | Get the host's invalid-state detector | +| `GetInvalidStateDetector` | function | SparkEngine | [EngineContext.h:L270](../../SparkEngine/Source/Core/EngineContext.h#L270) | | | `GetInvalidStateDetector` | function | SparkSDK | [IEngineContext.h:L339](../../SparkSDK/Include/Spark/IEngineContext.h#L339) | Get the host's invalid-state detector | +| `GetInvalidStateDetector` | function | SparkSDK | [IEngineContext.h:L340](../../SparkSDK/Include/Spark/IEngineContext.h#L340) | Get the host's invalid-state detector | | `GetInventory` | function | GameModules | [OWGatheringSystem.h:L115](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.h#L115) | | | `GetInventoryString` | function | GameModules | [MMOInventorySystem.h:L100](../../GameModules/SparkGameMMO/Source/Inventory/MMOInventorySystem.h#L100) | | | `GetInventoryString` | function | GameModules | [OWGatheringSystem.h:L138](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.h#L138) | Craft an item, consuming resources | @@ -16379,7 +16408,7 @@ | `GetLastConnectionError` | function | SparkEngine | [NetworkManager.h:L1266](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L1266) | | | `GetLastConnectRejectReason` | function | SparkEngine | [NetworkManager.h:L706](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L706) | | | `GetLastCorrectionMagnitude` | function | SparkEngine | [ClientPrediction.h:L165](../../SparkEngine/Source/Engine/Networking/ClientPrediction.h#L165) | Get the position correction magnitude from last reconciliation. | -| `GetLastDeltaTime` | function | Tests | [TestECSystemsReal.cpp:L60](../../Tests/TestECSystemsReal.cpp#L60) | | +| `GetLastDeltaTime` | function | Tests | [TestECSystemsReal.cpp:L50](../../Tests/TestECSystemsReal.cpp#L50) | | | `GetLastError` | function | GameModules | [VisualScriptDemoWorld.h:L104](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.h#L104) | | | `GetLastError` | function | SparkEditor | [EditorLayoutManager.h:L194](../../SparkEditor/Source/Core/EditorLayoutManager.h#L194) | Actionable reason the last SaveCurrentLayout or LoadLayout failed; empty after a success. | | `GetLastError` | function | SparkEngine | [OnlineServices.h:L153](../../SparkEngine/Source/Engine/OnlineServices/OnlineServices.h#L153) | Last human-readable failure reason from this backend (empty if none). | @@ -16409,7 +16438,7 @@ | `GetLastLoadError` | function | SparkEngine | [ModuleManager.h:L328](../../SparkEngine/Source/Core/ModuleManager.h#L328) | Detailed reason from the most recent load operation. | | `GetLastMesh` | function | SparkEditor | [CSGEditorPanel.h:L151](../../SparkEditor/Source/Panels/CSGEditorPanel.h#L151) | Last-built mesh snapshot (vertex / triangle counts). | | `GetLastMesh` | function | Tests | [TestCSGEditorPanel.cpp:L90](../../Tests/TestCSGEditorPanel.cpp#L90) | | -| `GetLastOperationMessage` | function | SparkEditor | [AssetBrowserPanel.h:L102](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L102) | Wire live basic-path cache invalidation after an import. | +| `GetLastOperationMessage` | function | SparkEditor | [AssetBrowserPanel.h:L112](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L112) | Wire live basic-path cache invalidation after an import. | | `GetLastPassTimestamps` | function | SparkEngine | [GPUPerfCounters.h:L169](../../SparkEngine/Source/Utils/GPUPerfCounters.h#L169) | | | `GetLastPipelineStats` | function | SparkEngine | [GPUPerfCounters.h:L170](../../SparkEngine/Source/Utils/GPUPerfCounters.h#L170) | | | `GetLastRenderStats` | function | SparkEditor | [SceneViewPanel.h:L154](../../SparkEditor/Source/Panels/SceneViewPanel.h#L154) | Counts measured by the last RenderWorldBasic() call in this viewport. | @@ -16427,7 +16456,7 @@ | `GetLastVisionCellWork` | function | GameModules | [RTSSkirmishSimulation.h:L117](../../GameModules/SparkGameRTS/Source/Simulation/RTSSkirmishSimulation.h#L117) | Fog cells the most recent vision refresh visited, summed over factions. | | `GetLastWireChannel` | function | Tests | [TestReliableChannel.cpp:L621](../../Tests/TestReliableChannel.cpp#L621) | | | `GetLastWireSize` | function | Tests | [TestReliableChannel.cpp:L622](../../Tests/TestReliableChannel.cpp#L622) | | -| `GetLatestMoveState` | function | GameModules | [TFReplication.h:L71](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L71) | | +| `GetLatestMoveState` | function | GameModules | [TFReplication.h:L75](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L75) | | | `GetLatestTimestamp` | function | SparkEngine | [InterpolationBuffer.h:L172](../../SparkEngine/Source/Engine/Networking/InterpolationBuffer.h#L172) | Get the timestamp of the newest sample, or 0 if empty | | `GetLauncherExecutablePath` | function | SparkLauncher | [LauncherPaths.cpp:L20](../../SparkLauncher/src/LauncherPaths.cpp#L20) | | | `GetLauncherExecutablePath` | function | SparkLauncher | [LauncherPaths.h:L9](../../SparkLauncher/src/LauncherPaths.h#L9) | Return the absolute path of the running SparkLauncher executable. | @@ -16517,10 +16546,10 @@ | `GetLocaleStatus` | function | GameModules | [MMOEngineSystems.h:L87](../../GameModules/SparkGameMMO/Source/Core/MMOEngineSystems.h#L87) | Unsubscribe events and release references | | `GetLocalGrenadeCount` | function | GameModules | [TFGrenadeSystem.h:L133](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L133) | | | `GetLocalHudView` | function | GameModules | [TFAbilitySystem.h:L146](../../GameModules/SparkGameMMOFPS/Source/Game/TFAbilitySystem.h#L146) | | -| `GetLocalization` | function | SparkEngine | [EngineContext.h:L216](../../SparkEngine/Source/Core/EngineContext.h#L216) | | | `GetLocalization` | function | SparkEngine | [EngineContext.h:L217](../../SparkEngine/Source/Core/EngineContext.h#L217) | | -| `GetLocalization` | function | SparkSDK | [IEngineContext.h:L250](../../SparkSDK/Include/Spark/IEngineContext.h#L250) | Get the localization/i18n system | +| `GetLocalization` | function | SparkEngine | [EngineContext.h:L218](../../SparkEngine/Source/Core/EngineContext.h#L218) | | | `GetLocalization` | function | SparkSDK | [IEngineContext.h:L251](../../SparkSDK/Include/Spark/IEngineContext.h#L251) | Get the localization/i18n system | +| `GetLocalization` | function | SparkSDK | [IEngineContext.h:L252](../../SparkSDK/Include/Spark/IEngineContext.h#L252) | Get the localization/i18n system | | `GetLocalization` | function | Tests | [TestSparkGameShowcase.cpp:L86](../../Tests/TestSparkGameShowcase.cpp#L86) | | | `GetLocalization` | function | Tests | [TestSparkGameShowcase.cpp:L87](../../Tests/TestSparkGameShowcase.cpp#L87) | | | `GetLocalMatrix` | function | SparkEngine | [CoreComponents.cpp:L68](../../SparkEngine/Source/Engine/ECS/Components/CoreComponents.cpp#L68) | | @@ -16543,8 +16572,8 @@ | `GetLODLevelCount` | function | SparkEngine | [MeshClusterSystem.h:L266](../../SparkEngine/Source/Graphics/MeshClusterSystem.h#L266) | Get the total number of LOD levels | | `GetLODProfile` | function | SparkEditor | [AssetProcessors.cpp:L70](../../SparkEditor/Source/AssetPipeline/AssetProcessors.cpp#L70) | | | `GetLogger` | function | SparkEditor | [EditorUI.h:L150](../../SparkEditor/Source/Core/EditorUI.h#L150) | | -| `GetLogger` | function | SparkEngine | [EngineContext.h:L285](../../SparkEngine/Source/Core/EngineContext.h#L285) | | -| `GetLogger` | function | SparkSDK | [IEngineContext.h:L358](../../SparkSDK/Include/Spark/IEngineContext.h#L358) | Get the host's logger | +| `GetLogger` | function | SparkEngine | [EngineContext.h:L286](../../SparkEngine/Source/Core/EngineContext.h#L286) | | +| `GetLogger` | function | SparkSDK | [IEngineContext.h:L359](../../SparkSDK/Include/Spark/IEngineContext.h#L359) | Get the host's logger | | `GetLogger` | function | Tests | [module_logging_context.h:L46](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L46) | | | `GetLogger` | function | Tests | [TestPrototypeModuleKitReal.cpp:L150](../../Tests/TestPrototypeModuleKitReal.cpp#L150) | | | `GetLogHistory` | function | SparkEngine | [SparkConsole.h:L235](../../SparkEngine/Source/Utils/SparkConsole.h#L235) | | @@ -16555,7 +16584,7 @@ | `GetLootRNG` | function | GameModules | [ARPGLootSystem.cpp:L23](../../GameModules/SparkGameARPG/Source/Loot/ARPGLootSystem.cpp#L23) | | | `GetLootSystem` | function | GameModules | [Game.h:L477](../../GameModules/SparkGameFPS/Source/Game/Game.h#L477) | Get the loot drop/power-up system | | `GetLowHealthVignetteIntensity` | function | GameModules | [HUDSystem.h:L337](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L337) | | -| `GetMainSwapChain` | function | SparkEngine | [CrashHandler.cpp:L814](../../SparkEngine/Source/Utils/CrashHandler.cpp#L814) | | +| `GetMainSwapChain` | function | SparkEngine | [CrashHandler.cpp:L815](../../SparkEngine/Source/Utils/CrashHandler.cpp#L815) | | | `GetMainSwapChain` | function | SparkEngine | [D3DUtils.cpp:L31](../../SparkEngine/Source/Utils/D3DUtils.cpp#L31) | | | `GetMainSwapChain` | function | SparkEngine | [D3DUtils.cpp:L76](../../SparkEngine/Source/Utils/D3DUtils.cpp#L76) | | | `GetMainSwapChain` | function | SparkEngine | [D3DUtils.h:L64](../../SparkEngine/Source/Utils/D3DUtils.h#L64) | Get the primary DXGI swap chain @return Pointer to the swap chain, or nullptr if not initialized | @@ -16649,8 +16678,8 @@ | `GetMeshVertices` | function | SparkEngine | [WaterRenderer.h:L194](../../SparkEngine/Source/Graphics/WaterRenderer.h#L194) | Get the animated vertex data for a water plane. | | `GetMessageCount` | function | SparkEngine | [FileLogger.h:L193](../../SparkEngine/Source/Utils/FileLogger.h#L193) | Get the number of messages written | | `GetMetadata` | function | SparkEngine | [AssetPipeline.h:L204](../../SparkEngine/Source/Graphics/AssetPipeline.h#L204) | | -| `GetMetadata` | function | SparkEngine | [SceneManager.h:L369](../../SparkEngine/Source/SceneManager/SceneManager.h#L369) | Return a const reference to the scene's global metadata. | -| `GetMetadata` | function | SparkEngine | [SceneManager.h:L377](../../SparkEngine/Source/SceneManager/SceneManager.h#L377) | Return a mutable reference to the scene's global metadata. | +| `GetMetadata` | function | SparkEngine | [SceneManager.h:L371](../../SparkEngine/Source/SceneManager/SceneManager.h#L371) | Return a const reference to the scene's global metadata. | +| `GetMetadata` | function | SparkEngine | [SceneManager.h:L379](../../SparkEngine/Source/SceneManager/SceneManager.h#L379) | Return a mutable reference to the scene's global metadata. | | `GetMetadata` | function | Tests | [TestSceneManager.cpp:L161](../../Tests/TestSceneManager.cpp#L161) | | | `GetMetadata` | function | Tests | [TestSceneManager.cpp:L162](../../Tests/TestSceneManager.cpp#L162) | | | `GetMetalFeatures` | function | SparkEngine | [MetalDevice.h:L502](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L502) | | @@ -16684,8 +16713,8 @@ | `GetMetricsThreadSafe` | function | SparkEngine | [Shader.h:L589](../../SparkEngine/Source/Graphics/Shader.h#L589) | Thread-safe metrics access | | `GetMetricsThreadSafe` | function | SparkEngine | [ShaderConsoleOps.cpp:L23](../../SparkEngine/Source/Graphics/ShaderConsoleOps.cpp#L23) | | | `GetMetricsThreadSafe` | function | SparkEngine | [ShaderConsoleOps.cpp:L289](../../SparkEngine/Source/Graphics/ShaderConsoleOps.cpp#L289) | | -| `GetMetricsThreadSafe` | function | SparkEngine | [InputManager.cpp:L608](../../SparkEngine/Source/Input/InputManager.cpp#L608) | | -| `GetMetricsThreadSafe` | function | SparkEngine | [InputManager.h:L511](../../SparkEngine/Source/Input/InputManager.h#L511) | Thread-safe metrics access helper | +| `GetMetricsThreadSafe` | function | SparkEngine | [InputManager.cpp:L631](../../SparkEngine/Source/Input/InputManager.cpp#L631) | | +| `GetMetricsThreadSafe` | function | SparkEngine | [InputManager.h:L518](../../SparkEngine/Source/Input/InputManager.h#L518) | Thread-safe metrics access helper | | `GetMigrationPath` | function | SparkEngine | [AssetMigration.h:L299](../../SparkEngine/Source/Core/AssetMigration.h#L299) | Compute the ordered chain of steps to migrate between versions. | | `GetMin` | function | SparkEngine | [PerformanceStats.h:L76](../../SparkEngine/Source/Utils/PerformanceStats.h#L76) | | | `GetMin` | function | Tests | [TestPerformanceStats.cpp:L40](../../Tests/TestPerformanceStats.cpp#L40) | | @@ -16714,10 +16743,10 @@ | `GetModInfo` | function | SparkEngine | [ModSystem.h:L157](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L157) | Get mod info by ID. | | `GetMods` | function | SparkEditor | [ModdingPanel.h:L45](../../SparkEditor/Source/Panels/ModdingPanel.h#L45) | Mods currently mirrored from the ModSystem, ordered by load order. | | `GetModState` | function | SparkEngine | [ModSystem.h:L160](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L160) | Get mod state. | -| `GetModSystem` | function | SparkEngine | [EngineContext.h:L211](../../SparkEngine/Source/Core/EngineContext.h#L211) | | | `GetModSystem` | function | SparkEngine | [EngineContext.h:L212](../../SparkEngine/Source/Core/EngineContext.h#L212) | | -| `GetModSystem` | function | SparkSDK | [IEngineContext.h:L237](../../SparkSDK/Include/Spark/IEngineContext.h#L237) | Get the modding system | +| `GetModSystem` | function | SparkEngine | [EngineContext.h:L213](../../SparkEngine/Source/Core/EngineContext.h#L213) | | | `GetModSystem` | function | SparkSDK | [IEngineContext.h:L238](../../SparkSDK/Include/Spark/IEngineContext.h#L238) | Get the modding system | +| `GetModSystem` | function | SparkSDK | [IEngineContext.h:L239](../../SparkSDK/Include/Spark/IEngineContext.h#L239) | Get the modding system | | `GetModSystem` | function | Tests | [TestModuleABI.cpp:L115](../../Tests/TestModuleABI.cpp#L115) | | | `GetModSystem` | function | Tests | [TestModuleABI.cpp:L116](../../Tests/TestModuleABI.cpp#L116) | | | `GetModule` | function | SparkEngine | [GameModuleLoader.h:L57](../../SparkEngine/Source/Core/GameModuleLoader.h#L57) | Get the loaded game module instance | @@ -16773,10 +16802,10 @@ | `GetMotionBlurSettings` | function | SparkEngine | [TemporalEffects.h:L358](../../SparkEngine/Source/Graphics/TemporalEffects.h#L358) | Get the maximum blur radius in pixels | | `GetMotionBlurSettings` | function | SparkEngine | [TemporalEffects.h:L359](../../SparkEngine/Source/Graphics/TemporalEffects.h#L359) | | | `GetMountCount` | function | SparkEngine | [VirtualFileSystem.h:L223](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L223) | Number of active mount points. | -| `GetMouseDelta` | function | SparkEngine | [InputManager.h:L237](../../SparkEngine/Source/Input/InputManager.h#L237) | Get mouse movement delta since last frame | +| `GetMouseDelta` | function | SparkEngine | [InputManager.h:L244](../../SparkEngine/Source/Input/InputManager.h#L244) | Get mouse movement delta since last frame | | `GetMouseDelta` | function | SparkEngine | [PlatformInput.h:L227](../../SparkEngine/Source/Input/PlatformInput.h#L227) | Get mouse movement since last poll. | | `GetMouseDelta` | function | SparkEngine | [PlatformInput.h:L265](../../SparkEngine/Source/Input/PlatformInput.h#L265) | | -| `GetMousePosition` | function | SparkEngine | [InputManager.h:L247](../../SparkEngine/Source/Input/InputManager.h#L247) | Get current mouse cursor position | +| `GetMousePosition` | function | SparkEngine | [InputManager.h:L254](../../SparkEngine/Source/Input/InputManager.h#L254) | Get current mouse cursor position | | `GetMousePosition` | function | SparkEngine | [PlatformInput.h:L220](../../SparkEngine/Source/Input/PlatformInput.h#L220) | Get the current mouse cursor position. | | `GetMousePosition` | function | SparkEngine | [PlatformInput.h:L260](../../SparkEngine/Source/Input/PlatformInput.h#L260) | | | `GetMouseSensitivity` | function | Tests | [TestCameraTransforms.cpp:L238](../../Tests/TestCameraTransforms.cpp#L238) | | @@ -16797,10 +16826,10 @@ | `GetMTLSampler` | function | SparkEngine | [MetalDevice.h:L224](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L224) | | | `GetMTLTexture` | function | SparkEngine | [MetalDevice.h:L177](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L177) | | | `GetMultiStepRemaining` | function | SparkEngine | [PlayModeManager.h:L215](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L215) | | -| `GetMusic` | function | SparkEngine | [EngineContext.h:L264](../../SparkEngine/Source/Core/EngineContext.h#L264) | | | `GetMusic` | function | SparkEngine | [EngineContext.h:L265](../../SparkEngine/Source/Core/EngineContext.h#L265) | | -| `GetMusic` | function | SparkSDK | [IEngineContext.h:L294](../../SparkSDK/Include/Spark/IEngineContext.h#L294) | Get the music manager (crossfading, playlists, combat intensity) | +| `GetMusic` | function | SparkEngine | [EngineContext.h:L266](../../SparkEngine/Source/Core/EngineContext.h#L266) | | | `GetMusic` | function | SparkSDK | [IEngineContext.h:L295](../../SparkSDK/Include/Spark/IEngineContext.h#L295) | Get the music manager (crossfading, playlists, combat intensity) | +| `GetMusic` | function | SparkSDK | [IEngineContext.h:L296](../../SparkSDK/Include/Spark/IEngineContext.h#L296) | Get the music manager (crossfading, playlists, combat intensity) | | `GetMusic` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L445](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L445) | | | `GetMusic` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L446](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L446) | | | `GetMusicVolume` | function | SparkEngine | [AudioEngine.h:L634](../../SparkEngine/Source/Audio/AudioEngine.h#L634) | Get the music volume level | @@ -16912,9 +16941,9 @@ | `GetName` | function | Tests | [TestECSystemOrdering.cpp:L145](../../Tests/TestECSystemOrdering.cpp#L145) | | | `GetName` | function | Tests | [TestECSystemOrdering.cpp:L171](../../Tests/TestECSystemOrdering.cpp#L171) | | | `GetName` | function | Tests | [TestECSystemOrdering.cpp:L193](../../Tests/TestECSystemOrdering.cpp#L193) | | -| `GetName` | function | Tests | [TestECSystemsReal.cpp:L44](../../Tests/TestECSystemsReal.cpp#L44) | | -| `GetName` | function | Tests | [TestECSystemsReal.cpp:L59](../../Tests/TestECSystemsReal.cpp#L59) | | -| `GetName` | function | Tests | [TestECSystemsReal.cpp:L70](../../Tests/TestECSystemsReal.cpp#L70) | | +| `GetName` | function | Tests | [TestECSystemsReal.cpp:L34](../../Tests/TestECSystemsReal.cpp#L34) | | +| `GetName` | function | Tests | [TestECSystemsReal.cpp:L49](../../Tests/TestECSystemsReal.cpp#L49) | | +| `GetName` | function | Tests | [TestECSystemsReal.cpp:L60](../../Tests/TestECSystemsReal.cpp#L60) | | | `GetName` | function | Tests | [TestEditorSubsystems.cpp:L68](../../Tests/TestEditorSubsystems.cpp#L68) | | | `GetName` | function | Tests | [TestEditorSubsystems.cpp:L83](../../Tests/TestEditorSubsystems.cpp#L83) | | | `GetName` | function | Tests | [TestGameObjectTransforms.cpp:L138](../../Tests/TestGameObjectTransforms.cpp#L138) | | @@ -16975,10 +17004,10 @@ | `GetNearPlane` | function | SparkEngine | [GraphicsEngine.h:L984](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L984) | Get near clip plane distance. | | `GetNearPlane` | function | Tests | [TestCameraTransforms.cpp:L233](../../Tests/TestCameraTransforms.cpp#L233) | | | `GetNeighborhood` | function | Tests | [TestSpatialGrid.cpp:L191](../../Tests/TestSpatialGrid.cpp#L191) | | -| `GetNetwork` | function | SparkEngine | [EngineContext.h:L170](../../SparkEngine/Source/Core/EngineContext.h#L170) | | | `GetNetwork` | function | SparkEngine | [EngineContext.h:L171](../../SparkEngine/Source/Core/EngineContext.h#L171) | | -| `GetNetwork` | function | SparkSDK | [IEngineContext.h:L167](../../SparkSDK/Include/Spark/IEngineContext.h#L167) | Get the network manager (requires ENABLE_NETWORKING) | +| `GetNetwork` | function | SparkEngine | [EngineContext.h:L172](../../SparkEngine/Source/Core/EngineContext.h#L172) | | | `GetNetwork` | function | SparkSDK | [IEngineContext.h:L168](../../SparkSDK/Include/Spark/IEngineContext.h#L168) | Get the network manager (requires ENABLE_NETWORKING) | +| `GetNetwork` | function | SparkSDK | [IEngineContext.h:L169](../../SparkSDK/Include/Spark/IEngineContext.h#L169) | Get the network manager (requires ENABLE_NETWORKING) | | `GetNetwork` | function | Tests | [TestGameModuleMMO.cpp:L732](../../Tests/TestGameModuleMMO.cpp#L732) | | | `GetNetwork` | function | Tests | [TestGameModuleMMO.cpp:L733](../../Tests/TestGameModuleMMO.cpp#L733) | | | `GetNetwork` | function | Tests | [TestMMOAuthNetwork.cpp:L63](../../Tests/TestMMOAuthNetwork.cpp#L63) | | @@ -16989,10 +17018,10 @@ | `GetNetwork` | function | Tests | [Test_gamemodules_mmochat_di.cpp:L53](../../Tests/harden/Test_gamemodules_mmochat_di.cpp#L53) | | | `GetNetworkCalls` | function | Tests | [Test_gamemodules_mmochat_di.cpp:L59](../../Tests/harden/Test_gamemodules_mmochat_di.cpp#L59) | | | `GetNetworkDesc` | function | SparkEngine | [NeuralInference.h:L139](../../SparkEngine/Source/Graphics/Neural/NeuralInference.h#L139) | Get the network descriptor for a handle. | -| `GetNetworkService` | function | SparkEngine | [EngineContext.h:L172](../../SparkEngine/Source/Core/EngineContext.h#L172) | | | `GetNetworkService` | function | SparkEngine | [EngineContext.h:L173](../../SparkEngine/Source/Core/EngineContext.h#L173) | | -| `GetNetworkService` | function | SparkSDK | [IEngineContext.h:L171](../../SparkSDK/Include/Spark/IEngineContext.h#L171) | Get the network lifecycle interface (DI-friendly). | +| `GetNetworkService` | function | SparkEngine | [EngineContext.h:L174](../../SparkEngine/Source/Core/EngineContext.h#L174) | | | `GetNetworkService` | function | SparkSDK | [IEngineContext.h:L172](../../SparkSDK/Include/Spark/IEngineContext.h#L172) | Get the network lifecycle interface (DI-friendly). | +| `GetNetworkService` | function | SparkSDK | [IEngineContext.h:L173](../../SparkSDK/Include/Spark/IEngineContext.h#L173) | Get the network lifecycle interface (DI-friendly). | | `GetNetworkStats` | function | GameModules | [Game.h:L604](../../GameModules/SparkGameFPS/Source/Game/Game.h#L604) | Get network statistics (ping, packet loss, etc.) | | `GetNetworkStatus` | function | GameModules | [Game.h:L599](../../GameModules/SparkGameFPS/Source/Game/Game.h#L599) | Get network role description string | | `GetNewPos` | function | Tests | [TestEditorCommands.cpp:L136](../../Tests/TestEditorCommands.cpp#L136) | | @@ -17006,8 +17035,8 @@ | `GetNextTrack` | function | SparkEngine | [MusicManager.h:L129](../../SparkEngine/Source/Audio/MusicManager.h#L129) | | | `GetNextUnitId` | function | GameModules | [RTSUnitSystem.h:L95](../../GameModules/SparkGameRTS/Source/Unit/RTSUnitSystem.h#L95) | Id the next spawned unit receives (ids are never reused, so this is persistent state). | | `GetNode` | function | SparkEngine | [DialogueSystem.h:L143](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L143) | Get a node by ID. | -| `GetNode` | function | SparkEngine | [SceneManager.h:L293](../../SparkEngine/Source/SceneManager/SceneManager.h#L293) | Return a const pointer to the node at `index`, or `nullptr` if out of range. | -| `GetNode` | function | SparkEngine | [SceneManager.h:L304](../../SparkEngine/Source/SceneManager/SceneManager.h#L304) | Return a mutable pointer to the node at `index`, or `nullptr` if out of range. | +| `GetNode` | function | SparkEngine | [SceneManager.h:L295](../../SparkEngine/Source/SceneManager/SceneManager.h#L295) | Return a const pointer to the node at `index`, or `nullptr` if out of range. | +| `GetNode` | function | SparkEngine | [SceneManager.h:L306](../../SparkEngine/Source/SceneManager/SceneManager.h#L306) | Return a mutable pointer to the node at `index`, or `nullptr` if out of range. | | `GetNode` | function | Tests | [TestSceneManager.cpp:L135](../../Tests/TestSceneManager.cpp#L135) | | | `GetNode` | function | Tests | [TestSceneManager.cpp:L142](../../Tests/TestSceneManager.cpp#L142) | | | `GetNodeCategory` | function | SparkEngine | [VisualScriptCompiler.h:L68](../../SparkEngine/Source/Engine/Scripting/VisualScriptCompiler.h#L68) | | @@ -17017,7 +17046,7 @@ | `GetNodeCount` | function | SparkEngine | [DialogueSystem.h:L156](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L156) | Get node count. | | `GetNodeCount` | function | SparkEngine | [BVHAccelerator.h:L142](../../SparkEngine/Source/Graphics/BVHAccelerator.h#L142) | Get the total node count (for profiling). | | `GetNodeCount` | function | SparkEngine | [FastNoise2SIMD.h:L754](../../SparkEngine/Source/Graphics/FastNoise2SIMD.h#L754) | Get the number of nodes in the graph | -| `GetNodeCount` | function | SparkEngine | [SceneManager.h:L322](../../SparkEngine/Source/SceneManager/SceneManager.h#L322) | Return the total number of nodes currently in the scene. | +| `GetNodeCount` | function | SparkEngine | [SceneManager.h:L324](../../SparkEngine/Source/SceneManager/SceneManager.h#L324) | Return the total number of nodes currently in the scene. | | `GetNodeCount` | function | Tests | [TestSceneManager.cpp:L155](../../Tests/TestSceneManager.cpp#L155) | | | `GetNodeDisplayName` | function | SparkEngine | [VisualScriptCompiler.h:L65](../../SparkEngine/Source/Engine/Scripting/VisualScriptCompiler.h#L65) | | | `GetNodeIds` | function | SparkEngine | [DialogueSystem.h:L153](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L153) | Get all node IDs. | @@ -17051,7 +17080,7 @@ | `GetObjectIcon` | function | SparkEditor | [HierarchyPanel.h:L307](../../SparkEditor/Source/Panels/HierarchyPanel.h#L307) | Get object icon based on components | | `GetObjectives` | function | GameModules | [HUDSystem.h:L304](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L304) | | | `GetObjects` | function | GameModules | [InteractiveObject.h:L441](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L441) | Get all interactive objects | -| `GetObjects` | function | SparkEngine | [SceneManager.h:L399](../../SparkEngine/Source/SceneManager/SceneManager.h#L399) | Return the instantiated `GameObject` list for this scene. | +| `GetObjects` | function | SparkEngine | [SceneManager.h:L401](../../SparkEngine/Source/SceneManager/SceneManager.h#L401) | Return the instantiated `GameObject` list for this scene. | | `GetObjectType` | function | GameModules | [InteractiveObject.h:L78](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L78) | Get the interaction prompt text for HUD display | | `GetObstacleCount` | function | SparkEngine | [NavMeshObstacles.h:L286](../../SparkEngine/Source/Engine/AI/NavMeshObstacles.h#L286) | Get the number of active obstacles. | | `GetObstacleDesc` | function | SparkEngine | [NavMeshObstacles.h:L295](../../SparkEngine/Source/Engine/AI/NavMeshObstacles.h#L295) | Get the descriptor for an active obstacle. | @@ -17122,7 +17151,7 @@ | `GetOverallCompletion` | function | GameModules | [OWExplorationSystem.cpp:L307](../../GameModules/SparkGameOpenWorld/Source/Exploration/OWExplorationSystem.cpp#L307) | | | `GetOverallCompletion` | function | GameModules | [OWExplorationSystem.h:L86](../../GameModules/SparkGameOpenWorld/Source/Exploration/OWExplorationSystem.h#L86) | | | `GetOverallHitRate` | function | SparkEngine | [CacheDebugger.h:L243](../../SparkEngine/Source/Utils/CacheDebugger.h#L243) | Get aggregate hit rate across all caches | -| `GetOwned` | function | SparkEngine | [EngineContext.h:L130](../../SparkEngine/Source/Core/EngineContext.h#L130) | Access the owning unique_ptr (read-only) | +| `GetOwned` | function | SparkEngine | [EngineContext.h:L131](../../SparkEngine/Source/Core/EngineContext.h#L131) | Access the owning unique_ptr (read-only) | | `GetP50FrameTimeMs` | function | SparkEditor | [PerformanceProfiler.h:L198](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L198) | 50th/95th/99th percentile frame time (ms) over the analysis window. | | `GetP95FrameTimeMs` | function | SparkEditor | [PerformanceProfiler.h:L199](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L199) | 50th/95th/99th percentile frame time (ms) over the analysis window. | | `GetP99FrameTimeMs` | function | SparkEditor | [PerformanceProfiler.h:L200](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L200) | 50th/95th/99th percentile frame time (ms) over the analysis window. | @@ -17188,7 +17217,7 @@ | `GetPendingPageCount` | function | SparkEngine | [VirtualTexture.h:L124](../../SparkEngine/Source/Graphics/VirtualTexture.h#L124) | Get the number of pages pending load | | `GetPendingQueryCount` | function | SparkEngine | [AsyncDatabase.h:L282](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L282) | Dispatch completed async callbacks on the calling (main) thread. | | `GetPendingReleaseCount` | function | SparkEngine | [D3D12Device.h:L119](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L119) | | -| `GetPendingTimedKeyReleaseCount` | function | SparkEngine | [InputManager.h:L381](../../SparkEngine/Source/Input/InputManager.h#L381) | Number of console-simulated presses still waiting for their release deadline | +| `GetPendingTimedKeyReleaseCount` | function | SparkEngine | [InputManager.h:L388](../../SparkEngine/Source/Input/InputManager.h#L388) | Number of console-simulated presses still waiting for their release deadline | | `GetPendingWriteCount` | function | SparkEngine | [VulkanDescriptorCache.h:L101](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDescriptorCache.h#L101) | Number of pending writes. | | `GetPendingWrites` | function | GameModules | [MMOPersistenceSystem.cpp:L1391](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.cpp#L1391) | | | `GetPendingWrites` | function | GameModules | [MMOPersistenceSystem.h:L257](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.h#L257) | | @@ -17200,10 +17229,10 @@ | `GetPhase` | function | GameModules | [FPSArenaAutopilot.h:L94](../../GameModules/SparkGameFPS/Source/Game/FPSArenaAutopilot.h#L94) | Stop driving and release any key it holds on @p input. | | `GetPhaseSystemManagerImpl` | function | SparkEngine | [GameplayLifecycleShared.cpp:L898](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L898) | | | `GetPhaseSystemManagerImpl` | function | SparkEngine | [GameplayLifecycleShared.h:L61](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.h#L61) | | -| `GetPhysics` | function | SparkEngine | [EngineContext.h:L157](../../SparkEngine/Source/Core/EngineContext.h#L157) | | | `GetPhysics` | function | SparkEngine | [EngineContext.h:L158](../../SparkEngine/Source/Core/EngineContext.h#L158) | | -| `GetPhysics` | function | SparkSDK | [IEngineContext.h:L155](../../SparkSDK/Include/Spark/IEngineContext.h#L155) | Get the physics system | +| `GetPhysics` | function | SparkEngine | [EngineContext.h:L159](../../SparkEngine/Source/Core/EngineContext.h#L159) | | | `GetPhysics` | function | SparkSDK | [IEngineContext.h:L156](../../SparkSDK/Include/Spark/IEngineContext.h#L156) | Get the physics system | +| `GetPhysics` | function | SparkSDK | [IEngineContext.h:L157](../../SparkSDK/Include/Spark/IEngineContext.h#L157) | Get the physics system | | `GetPhysics` | function | Tests | [module_logging_context.h:L42](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L42) | | | `GetPhysics` | function | Tests | [module_logging_context.h:L43](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L43) | | | `GetPhysics` | function | Tests | [TestGameModuleMMO.cpp:L74](../../Tests/TestGameModuleMMO.cpp#L74) | | @@ -17255,7 +17284,7 @@ | `GetPhysicsBodyCount` | function | SparkEngine | [PerformanceStats.h:L260](../../SparkEngine/Source/Utils/PerformanceStats.h#L260) | Get all system timings | | `GetPhysicsSystem` | function | SparkEngine | [FixedTimestepPhysics.h:L126](../../SparkEngine/Source/Engine/ECS/Systems/FixedTimestepPhysics.h#L126) | Get the raw physics system pointer. | | `GetPhysicsSystem` | function | SparkEngine | [PhysicsBodyImpl.cpp:L34](../../SparkEngine/Source/Physics/PhysicsBodyImpl.cpp#L34) | | -| `getpid` | function | SparkEngine | [CrashHandler.cpp:L2756](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2756) | | +| `getpid` | function | SparkEngine | [CrashHandler.cpp:L2802](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2802) | | | `GetPieces` | function | SparkEngine | [DestructionSystem.h:L86](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L86) | Get all pieces. | | `GetPIEConfig` | function | SparkEditor | [DedicatedServerPanel.h:L138](../../SparkEditor/Source/Panels/DedicatedServerPanel.h#L138) | Connect to PlayModeManager for PIE integration. | | `GetPinColor` | function | SparkEditor | [VisualScriptPanel.cpp:L86](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L86) | | @@ -17372,7 +17401,7 @@ | `GetPrefabNames` | function | SparkEditor | [PrefabManager.h:L163](../../SparkEditor/Source/Prefabs/PrefabManager.h#L163) | Get all prefab names | | `GetPrefabs` | function | SparkEditor | [PrefabManager.h:L157](../../SparkEditor/Source/Prefabs/PrefabManager.h#L157) | Get all loaded prefabs | | `GetPresentation` | function | GameModules | [TFDataTables.h:L248](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTables.h#L248) | | -| `GetPresentFailureCount` | function | SparkEditor | [EditorApplication.h:L91](../../SparkEditor/Source/Core/EditorApplication.h#L91) | Number of main-loop Present calls that did not return S_OK. | +| `GetPresentFailureCount` | function | SparkEditor | [EditorApplication.h:L91](../../SparkEditor/Source/Core/EditorApplication.h#L91) | Number of frame presentation failures reported by the active graphics backend. | | `GetPresentQueue` | function | SparkEngine | [VulkanDevice.h:L489](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L489) | | | `GetPreset` | function | GameModules | [GameMode.h:L126](../../GameModules/SparkGameFPS/Source/Game/GameMode.h#L126) | | | `GetPreset` | function | Tests | [TestWeatherSystem.cpp:L35](../../Tests/TestWeatherSystem.cpp#L35) | | @@ -17443,7 +17472,7 @@ | `GetProjectionMatrix` | function | SparkEngine | [SparkEngineCamera.h:L226](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L226) | Get the current projection transformation matrix | | `GetProjectionMatrix` | function | Tests | [TestCameraTransforms.cpp:L240](../../Tests/TestCameraTransforms.cpp#L240) | | | `GetProjectManager` | function | SparkEditor | [EditorUI.h:L152](../../SparkEditor/Source/Core/EditorUI.h#L152) | | -| `GetProjectPath` | function | SparkEditor | [AssetBrowserPanel.h:L98](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L98) | Wire live basic-path cache invalidation after an import. | +| `GetProjectPath` | function | SparkEditor | [AssetBrowserPanel.h:L108](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L108) | Wire live basic-path cache invalidation after an import. | | `GetProjectRelativeCurrentScenePath` | function | SparkEditor | [EditorUI.h:L457](../../SparkEditor/Source/Core/EditorUI.h#L457) | | | `GetProjectScenesPath` | function | SparkEditor | [ProjectManager.h:L186](../../SparkEditor/Source/Core/ProjectManager.h#L186) | | | `GetProjectScriptsPath` | function | SparkEditor | [ProjectManager.h:L187](../../SparkEditor/Source/Core/ProjectManager.h#L187) | | @@ -17581,12 +17610,12 @@ | `GetRemainingPlayerCount` | function | GameModules | [RTSMatchSystem.h:L90](../../GameModules/SparkGameRTS/Source/Match/RTSMatchSystem.h#L90) | | | `GetRemainingStackBytes` | function | SparkEngine | [MemoryMonitor.h:L228](../../SparkEngine/Source/Utils/MemoryMonitor.h#L228) | Platform-specific: get remaining stack bytes, or 0 if unavailable | | `GetRemainingTime` | function | SparkEngine | [TimerManager.h:L263](../../SparkEngine/Source/Utils/TimerManager.h#L263) | Get remaining time until next fire | -| `GetRemotePawn` | function | GameModules | [TFReplication.h:L66](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L66) | | +| `GetRemotePawn` | function | GameModules | [TFReplication.h:L70](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L70) | | | `GetRenderDimensions` | function | SparkEngine | [DynamicQualityScaler.h:L99](../../SparkEngine/Source/Graphics/DynamicQualityScaler.h#L99) | Compute scaled render dimensions from native resolution | | `GetRenderedCount` | function | SparkEngine | [Systems2D.h:L119](../../SparkEngine/Source/Engine/ECS/Systems/Systems2D.h#L119) | | | `GetRenderedEntityCount` | function | SparkEngine | [ECSystems.h:L143](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L143) | Return the number of entities submitted for rendering in the last frame. | | `GetRenderedEntityCount` | function | Tests | [TestECSystemOrdering.cpp:L195](../../Tests/TestECSystemOrdering.cpp#L195) | | -| `GetRenderedFrameCount` | function | SparkEditor | [EditorApplication.h:L89](../../SparkEditor/Source/Core/EditorApplication.h#L89) | Number of main-loop frames whose swap-chain Present returned S_OK. | +| `GetRenderedFrameCount` | function | SparkEditor | [EditorApplication.h:L89](../../SparkEditor/Source/Core/EditorApplication.h#L89) | Number of completed frame presentation calls (D3D11 success or OpenGL swap completion). | | `GetRenderEncoder` | function | SparkEngine | [MetalDevice.h:L401](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L401) | | | `GetRenderGraph` | function | SparkEngine | [RenderPipeline.h:L151](../../SparkEngine/Source/Graphics/RenderPipeline.h#L151) | Get the underlying render graph for diagnostics. | | `GetRenderingPipeline` | function | SparkEngine | [GraphicsEngine.h:L589](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L589) | Get the current rendering pipeline | @@ -17612,10 +17641,10 @@ | `GetRenderTargetView` | function | SparkEngine | [VulkanDevice.h:L159](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L159) | | | `GetRenderTargetView` | function | SparkEngine | [RenderTarget.h:L149](../../SparkEngine/Source/Graphics/RenderTarget.h#L149) | Generate mipmaps (if supported) | | `GetRep` | function | GameModules | [MMOReputationSystem.h:L58](../../GameModules/SparkGameMMO/Source/Reputation/MMOReputationSystem.h#L58) | Per-player reputation state | -| `GetReplay` | function | SparkEngine | [EngineContext.h:L214](../../SparkEngine/Source/Core/EngineContext.h#L214) | | | `GetReplay` | function | SparkEngine | [EngineContext.h:L215](../../SparkEngine/Source/Core/EngineContext.h#L215) | | -| `GetReplay` | function | SparkSDK | [IEngineContext.h:L241](../../SparkSDK/Include/Spark/IEngineContext.h#L241) | Get the replay recording/playback system | +| `GetReplay` | function | SparkEngine | [EngineContext.h:L216](../../SparkEngine/Source/Core/EngineContext.h#L216) | | | `GetReplay` | function | SparkSDK | [IEngineContext.h:L242](../../SparkSDK/Include/Spark/IEngineContext.h#L242) | Get the replay recording/playback system | +| `GetReplay` | function | SparkSDK | [IEngineContext.h:L243](../../SparkSDK/Include/Spark/IEngineContext.h#L243) | Get the replay recording/playback system | | `GetReplicatedEntityCount` | function | SparkEditor | [NetworkDebugPanel.h:L262](../../SparkEditor/Source/Panels/NetworkDebugPanel.h#L262) | Get number of tracked replicated entities | | `GetReplicatedFieldCount` | function | SparkEngine | [Reflection.h:L166](../../SparkEngine/Source/Core/Reflection.h#L166) | Get the count of fields that are marked for replication. | | `GetReportedPlayerCount` | function | SparkEditor | [DedicatedServerPanel.h:L171](../../SparkEditor/Source/Panels/DedicatedServerPanel.h#L171) | Player count read from the server's health JSON. | @@ -17681,7 +17710,7 @@ | `GetRole` | function | Tests | [TestNetworkManagerOrchestration.cpp:L330](../../Tests/TestNetworkManagerOrchestration.cpp#L330) | | | `GetRoot` | function | SparkEngine | [BehaviorTree.h:L122](../../SparkEngine/Source/Engine/AI/BehaviorTree.h#L122) | Get a non-owning pointer to the root node. | | `GetRootBounds` | function | SparkEngine | [BVHAccelerator.h:L152](../../SparkEngine/Source/Graphics/BVHAccelerator.h#L152) | Get the root bounding box of the entire scene. | -| `GetRootNodes` | function | SparkEngine | [SceneManager.h:L285](../../SparkEngine/Source/SceneManager/SceneManager.h#L285) | Return the indices of all root nodes (nodes with no parent). | +| `GetRootNodes` | function | SparkEngine | [SceneManager.h:L287](../../SparkEngine/Source/SceneManager/SceneManager.h#L287) | Return the indices of all root nodes (nodes with no parent). | | `GetRootNodes` | function | Tests | [TestSceneManager.cpp:L124](../../Tests/TestSceneManager.cpp#L124) | | | `GetRootSignature` | function | SparkEngine | [D3D12Types.h:L593](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L593) | | | `GetRotation` | function | SparkEngine | [SparkEngineCamera.h:L252](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L252) | Get the current camera rotation (pitch, yaw, roll) | @@ -17747,10 +17776,10 @@ | `GetSaveMetadata` | function | SparkEngine | [SaveSystem.h:L671](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L671) | | | `GetSavePath` | function | SparkEngine | [SaveSystem.h:L898](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L898) | | | `GetSaveSlots` | function | SparkEngine | [SaveSystem.h:L658](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L658) | | -| `GetSaveSystem` | function | SparkEngine | [EngineContext.h:L192](../../SparkEngine/Source/Core/EngineContext.h#L192) | | | `GetSaveSystem` | function | SparkEngine | [EngineContext.h:L193](../../SparkEngine/Source/Core/EngineContext.h#L193) | | -| `GetSaveSystem` | function | SparkSDK | [IEngineContext.h:L201](../../SparkSDK/Include/Spark/IEngineContext.h#L201) | Get the save system | +| `GetSaveSystem` | function | SparkEngine | [EngineContext.h:L194](../../SparkEngine/Source/Core/EngineContext.h#L194) | | | `GetSaveSystem` | function | SparkSDK | [IEngineContext.h:L202](../../SparkSDK/Include/Spark/IEngineContext.h#L202) | Get the save system | +| `GetSaveSystem` | function | SparkSDK | [IEngineContext.h:L203](../../SparkSDK/Include/Spark/IEngineContext.h#L203) | Get the save system | | `GetSaveSystem` | function | Tests | [TestLIFE200ModuleReloadLoopReal.cpp:L65](../../Tests/TestLIFE200ModuleReloadLoopReal.cpp#L65) | | | `GetSaveSystem` | function | Tests | [TestLIFE200ModuleReloadLoopReal.cpp:L66](../../Tests/TestLIFE200ModuleReloadLoopReal.cpp#L66) | | | `GetSaveSystem` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L58](../../Tests/TestLIFE200ModuleReloadReal.cpp#L58) | | @@ -17780,10 +17809,10 @@ | `GetSceneComponentPayloadTypes` | function | SparkEditor | [SceneComponentCodec.cpp:L765](../../SparkEditor/Source/SceneSystem/SceneComponentCodec.cpp#L765) | | | `GetSceneData` | function | SparkEditor | [SparkEngineIntegration.h:L279](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L279) | Get current scene data from engine | | `GetSceneManager` | function | GameModules | [Game.h:L280](../../GameModules/SparkGameFPS/Source/Game/Game.h#L280) | Get scene manager instance for console integration | -| `GetSceneManager` | function | SparkEngine | [EngineContext.h:L186](../../SparkEngine/Source/Core/EngineContext.h#L186) | | | `GetSceneManager` | function | SparkEngine | [EngineContext.h:L187](../../SparkEngine/Source/Core/EngineContext.h#L187) | | -| `GetSceneManager` | function | SparkSDK | [IEngineContext.h:L193](../../SparkSDK/Include/Spark/IEngineContext.h#L193) | Get the scene manager | +| `GetSceneManager` | function | SparkEngine | [EngineContext.h:L188](../../SparkEngine/Source/Core/EngineContext.h#L188) | | | `GetSceneManager` | function | SparkSDK | [IEngineContext.h:L194](../../SparkSDK/Include/Spark/IEngineContext.h#L194) | Get the scene manager | +| `GetSceneManager` | function | SparkSDK | [IEngineContext.h:L195](../../SparkSDK/Include/Spark/IEngineContext.h#L195) | Get the scene manager | | `GetSceneObjectCount` | function | GameModules | [Game.h:L498](../../GameModules/SparkGameFPS/Source/Game/Game.h#L498) | Get current scene object count | | `GetSceneObjects` | function | SparkEditor | [HierarchyPanel.h:L126](../../SparkEditor/Source/Panels/HierarchyPanel.h#L126) | Get all scene object names (for serialization compatibility). | | `GetScopeCount` | function | SparkEngine | [ConnectionScope.h:L237](../../SparkEngine/Source/Engine/Networking/ConnectionScope.h#L237) | Get the number of entities currently in scope for a client. | @@ -17801,18 +17830,18 @@ | `GetScreenSpaceEffects` | function | SparkEngine | [GraphicsEngine.h:L377](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L377) | | | `GetScriptContext` | function | SparkEngine | [AngelScriptEngine.h:L668](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L668) | Get the current execution context | | `GetScriptContext` | function | Tests | [TestAngelScriptEngine.cpp:L199](../../Tests/TestAngelScriptEngine.cpp#L199) | | -| `GetScriptEngine` | function | SparkEngine | [EngineContext.h:L188](../../SparkEngine/Source/Core/EngineContext.h#L188) | | | `GetScriptEngine` | function | SparkEngine | [EngineContext.h:L189](../../SparkEngine/Source/Core/EngineContext.h#L189) | | -| `GetScriptEngine` | function | SparkSDK | [IEngineContext.h:L197](../../SparkSDK/Include/Spark/IEngineContext.h#L197) | Get the AngelScript engine (requires scripting enabled) | +| `GetScriptEngine` | function | SparkEngine | [EngineContext.h:L190](../../SparkEngine/Source/Core/EngineContext.h#L190) | | | `GetScriptEngine` | function | SparkSDK | [IEngineContext.h:L198](../../SparkSDK/Include/Spark/IEngineContext.h#L198) | Get the AngelScript engine (requires scripting enabled) | +| `GetScriptEngine` | function | SparkSDK | [IEngineContext.h:L199](../../SparkSDK/Include/Spark/IEngineContext.h#L199) | Get the AngelScript engine (requires scripting enabled) | | `GetScriptGeneration` | function | SparkEngine | [AngelScriptEngine.h:L291](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L291) | Return the current attached-instance generation, or zero when absent. | | `GetScriptInstance` | function | SparkEngine | [AngelScriptEngine.h:L702](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L702) | Look up a script instance by entity ID | | `GetScriptInstance` | function | Tests | [TestAngelScriptEngine.cpp:L135](../../Tests/TestAngelScriptEngine.cpp#L135) | | | `GetScriptRoot` | function | GameModules | [VisualScriptDemoWorld.h:L101](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.h#L101) | | | `GetScrollOffset` | function | SparkEngine | [InGameConsole.h:L296](../../SparkEngine/Source/Utils/InGameConsole.h#L296) | Get the scroll offset for the output | -| `GetSDKVersion` | function | SparkEngine | [EngineContext.h:L419](../../SparkEngine/Source/Core/EngineContext.h#L419) | | -| `GetSDKVersion` | function | SparkSDK | [IEngineContext.h:L312](../../SparkSDK/Include/Spark/IEngineContext.h#L312) | Get the SDK ABI version | -| `GetSDKVersion` | function | SparkSDK | [Version.h:L56](../../SparkSDK/Include/Spark/Version.h#L56) | Get the SDK ABI version at runtime | +| `GetSDKVersion` | function | SparkEngine | [EngineContext.h:L422](../../SparkEngine/Source/Core/EngineContext.h#L422) | | +| `GetSDKVersion` | function | SparkSDK | [IEngineContext.h:L313](../../SparkSDK/Include/Spark/IEngineContext.h#L313) | Get the SDK ABI version | +| `GetSDKVersion` | function | SparkSDK | [Version.h:L60](../../SparkSDK/Include/Spark/Version.h#L60) | Get the SDK ABI version at runtime | | `GetSDKVersion` | function | Tests | [module_logging_context.h:L45](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L45) | | | `GetSDKVersion` | function | Tests | [TestGameModuleMMO.cpp:L77](../../Tests/TestGameModuleMMO.cpp#L77) | | | `GetSDKVersion` | function | Tests | [TestGameModuleMMO.cpp:L736](../../Tests/TestGameModuleMMO.cpp#L736) | | @@ -18126,8 +18155,8 @@ | `GetStateThreadSafe` | function | GameModules | [PlayerConsole.cpp:L171](../../GameModules/SparkGameFPS/Source/Game/PlayerConsole.cpp#L171) | | | `GetStateThreadSafe` | function | SparkEngine | [SparkEngineCamera.h:L407](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L407) | Thread-safe state access helper | | `GetStateThreadSafe` | function | SparkEngine | [SparkEngineCameraConsoleOps.cpp:L201](../../SparkEngine/Source/Camera/SparkEngineCameraConsoleOps.cpp#L201) | | -| `GetStateValidation` | function | SparkEngine | [EngineContext.h:L291](../../SparkEngine/Source/Core/EngineContext.h#L291) | | -| `GetStateValidation` | function | SparkSDK | [IEngineContext.h:L376](../../SparkSDK/Include/Spark/IEngineContext.h#L376) | Get the host's ECS state-invariant rule registry | +| `GetStateValidation` | function | SparkEngine | [EngineContext.h:L292](../../SparkEngine/Source/Core/EngineContext.h#L292) | | +| `GetStateValidation` | function | SparkSDK | [IEngineContext.h:L377](../../SparkSDK/Include/Spark/IEngineContext.h#L377) | Get the host's ECS state-invariant rule registry | | `GetStateValidation` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L74](../../Tests/TestLIFE200ModuleReloadReal.cpp#L74) | | | `GetStateValidation` | function | Tests | [TestModuleABI.cpp:L120](../../Tests/TestModuleABI.cpp#L120) | | | `GetStateValidation` | function | Tests | [TestSparkGameShowcase.cpp:L95](../../Tests/TestSparkGameShowcase.cpp#L95) | | @@ -18262,19 +18291,19 @@ | `GetSwapChain` | function | SparkEngine | [GraphicsEngine.h:L678](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L678) | Get the DXGI swap chain | | `GetSwapChain` | function | SparkEngine | [RHIBridge.h:L139](../../SparkEngine/Source/Graphics/RHI/RHIBridge.h#L139) | | | `GetSwapChain` | function | SparkEngine | [RenderDevice.h:L114](../../SparkEngine/Source/Graphics/RenderDevice.h#L114) | | -| `GetSystem` | function | SparkEngine | [EngineContext.h:L376](../../SparkEngine/Source/Core/EngineContext.h#L376) | Retrieve a previously registered subsystem by type | +| `GetSystem` | function | SparkEngine | [EngineContext.h:L379](../../SparkEngine/Source/Core/EngineContext.h#L379) | Retrieve a previously registered subsystem by type | | `GetSystem` | function | SparkEngine | [ECSystems.h:L810](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L810) | | | `GetSystem` | function | SparkEngine | [ECSystems.h:L820](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L820) | | | `GetSystem` | function | SparkEngine | [PhaseSystemManager.h:L157](../../SparkEngine/Source/Engine/ECS/Systems/PhaseSystemManager.h#L157) | Find a system by its name (searches both phased and flat lists). | | `GetSystem` | function | SparkEngine | [PhaseSystemManager.h:L175](../../SparkEngine/Source/Engine/ECS/Systems/PhaseSystemManager.h#L175) | | | `GetSystem` | function | Tests | [TestECSystemOrdering.cpp:L238](../../Tests/TestECSystemOrdering.cpp#L238) | | -| `GetSystem` | function | Tests | [TestECSystemsReal.cpp:L94](../../Tests/TestECSystemsReal.cpp#L94) | | +| `GetSystem` | function | Tests | [TestECSystemsReal.cpp:L84](../../Tests/TestECSystemsReal.cpp#L84) | | | `GetSystemAccentColor` | function | SparkEditor | [EditorTheme.h:L302](../../SparkEditor/Source/Core/EditorTheme.h#L302) | | -| `GetSystemChecked` | function | SparkEngine | [EngineContext.h:L398](../../SparkEngine/Source/Core/EngineContext.h#L398) | | +| `GetSystemChecked` | function | SparkEngine | [EngineContext.h:L401](../../SparkEngine/Source/Core/EngineContext.h#L401) | | | `GetSystemCount` | function | SparkEngine | [ECSystems.h:L834](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L834) | Return the total number of registered systems (enabled and disabled). | | `GetSystemCount` | function | SparkEngine | [PhaseSystemManager.h:L196](../../SparkEngine/Source/Engine/ECS/Systems/PhaseSystemManager.h#L196) | Return the total number of registered systems (phased + flat). | | `GetSystemCount` | function | Tests | [TestECSystemOrdering.cpp:L248](../../Tests/TestECSystemOrdering.cpp#L248) | | -| `GetSystemCount` | function | Tests | [TestECSystemsReal.cpp:L104](../../Tests/TestECSystemsReal.cpp#L104) | | +| `GetSystemCount` | function | Tests | [TestECSystemsReal.cpp:L94](../../Tests/TestECSystemsReal.cpp#L94) | | | `GetSystemInfo` | function | SparkEditor | [EditorCrashHandler.h:L129](../../SparkEditor/Source/Core/EditorCrashHandler.h#L129) | | | `GetSystems` | function | Tests | [TestPerformanceStats.cpp:L132](../../Tests/TestPerformanceStats.cpp#L132) | | | `GetSystemTimings` | function | SparkEngine | [PerformanceStats.h:L256](../../SparkEngine/Source/Utils/PerformanceStats.h#L256) | Get all system timings | @@ -18308,10 +18337,10 @@ | `GetTargetVersion` | function | Tests | [TestAssetMigration.cpp:L322](../../Tests/TestAssetMigration.cpp#L322) | | | `GetTeamScore` | function | GameModules | [GameMode.h:L116](../../GameModules/SparkGameFPS/Source/Game/GameMode.h#L116) | | | `GetTeamScoreboard` | function | GameModules | [GameMode.h:L115](../../GameModules/SparkGameFPS/Source/Game/GameMode.h#L115) | | -| `GetTelemetryService` | function | SparkEngine | [EngineContext.h:L174](../../SparkEngine/Source/Core/EngineContext.h#L174) | | | `GetTelemetryService` | function | SparkEngine | [EngineContext.h:L175](../../SparkEngine/Source/Core/EngineContext.h#L175) | | -| `GetTelemetryService` | function | SparkSDK | [IEngineContext.h:L175](../../SparkSDK/Include/Spark/IEngineContext.h#L175) | Get the telemetry lifecycle interface (DI-friendly). | +| `GetTelemetryService` | function | SparkEngine | [EngineContext.h:L176](../../SparkEngine/Source/Core/EngineContext.h#L176) | | | `GetTelemetryService` | function | SparkSDK | [IEngineContext.h:L176](../../SparkSDK/Include/Spark/IEngineContext.h#L176) | Get the telemetry lifecycle interface (DI-friendly). | +| `GetTelemetryService` | function | SparkSDK | [IEngineContext.h:L177](../../SparkSDK/Include/Spark/IEngineContext.h#L177) | Get the telemetry lifecycle interface (DI-friendly). | | `GetTempAllocator` | function | SparkEngine | [PhysicsSystem.h:L509](../../SparkEngine/Source/Physics/PhysicsSystem.h#L509) | Get the temp allocator (used by CharacterController). | | `GetTempAllocator` | function | SparkEngine | [PhysicsSystem.h:L514](../../SparkEngine/Source/Physics/PhysicsSystem.h#L514) | Get the temp allocator (used by CharacterController). | | `GetTempDir` | function | SparkBuild | [Downloader.h:L61](../../SparkBuild/src/Downloader.h#L61) | | @@ -18380,19 +18409,19 @@ | `GetTilesY` | function | SparkEngine | [LightManager.h:L331](../../SparkEngine/Source/Graphics/LightManager.h#L331) | | | `GetTileUV` | function | SparkEngine | [Sprite2DComponents.h:L334](../../SparkEngine/Source/Engine/ECS/Components/Sprite2DComponents.h#L334) | | | `GetTime` | function | SparkEngine | [VolumetricClouds.h:L165](../../SparkEngine/Source/Graphics/VolumetricClouds.h#L165) | Number of seconds accumulated since Initialize | -| `GetTimeOfDay` | function | SparkEngine | [EngineContext.h:L205](../../SparkEngine/Source/Core/EngineContext.h#L205) | | | `GetTimeOfDay` | function | SparkEngine | [EngineContext.h:L206](../../SparkEngine/Source/Core/EngineContext.h#L206) | | +| `GetTimeOfDay` | function | SparkEngine | [EngineContext.h:L207](../../SparkEngine/Source/Core/EngineContext.h#L207) | | | `GetTimeOfDay` | function | SparkEngine | [TimeOfDaySystem.h:L88](../../SparkEngine/Source/Engine/World/TimeOfDaySystem.h#L88) | Get the current time of day in hours [0, 24) | -| `GetTimeOfDay` | function | SparkSDK | [IEngineContext.h:L225](../../SparkSDK/Include/Spark/IEngineContext.h#L225) | Get the time-of-day system (day/night cycle) | | `GetTimeOfDay` | function | SparkSDK | [IEngineContext.h:L226](../../SparkSDK/Include/Spark/IEngineContext.h#L226) | Get the time-of-day system (day/night cycle) | +| `GetTimeOfDay` | function | SparkSDK | [IEngineContext.h:L227](../../SparkSDK/Include/Spark/IEngineContext.h#L227) | Get the time-of-day system (day/night cycle) | | `GetTimeOfDay` | function | Tests | [TestDayNightCycle.cpp:L63](../../Tests/TestDayNightCycle.cpp#L63) | | | `GetTimeOfDay` | function | Tests | [TestSparkGameShowcase.cpp:L90](../../Tests/TestSparkGameShowcase.cpp#L90) | | | `GetTimeOfDay` | function | Tests | [TestSparkGameShowcase.cpp:L91](../../Tests/TestSparkGameShowcase.cpp#L91) | | | `GetTimeOfDay` | function | Tests | [TestTimeOfDaySystem.cpp:L63](../../Tests/TestTimeOfDaySystem.cpp#L63) | | -| `GetTimer` | function | SparkEngine | [EngineContext.h:L151](../../SparkEngine/Source/Core/EngineContext.h#L151) | | | `GetTimer` | function | SparkEngine | [EngineContext.h:L152](../../SparkEngine/Source/Core/EngineContext.h#L152) | | -| `GetTimer` | function | SparkSDK | [IEngineContext.h:L139](../../SparkSDK/Include/Spark/IEngineContext.h#L139) | Get the frame timer | +| `GetTimer` | function | SparkEngine | [EngineContext.h:L153](../../SparkEngine/Source/Core/EngineContext.h#L153) | | | `GetTimer` | function | SparkSDK | [IEngineContext.h:L140](../../SparkSDK/Include/Spark/IEngineContext.h#L140) | Get the frame timer | +| `GetTimer` | function | SparkSDK | [IEngineContext.h:L141](../../SparkSDK/Include/Spark/IEngineContext.h#L141) | Get the frame timer | | `GetTimer` | function | Tests | [module_logging_context.h:L36](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L36) | | | `GetTimer` | function | Tests | [module_logging_context.h:L37](../../Tests/PackageSmoke/FPSProgression/module_logging_context.h#L37) | | | `GetTimer` | function | Tests | [TestGameModuleMMO.cpp:L68](../../Tests/TestGameModuleMMO.cpp#L68) | | @@ -18573,10 +18602,10 @@ | `GetTriggeredCues` | function | SparkEngine | [Sequencer.h:L203](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L203) | | | `GetTriggeredCues` | function | SparkEngine | [Sequencer.h:L217](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L217) | | | `GetTriggeredEvents` | function | Tests | [TestSequencer.cpp:L78](../../Tests/TestSequencer.cpp#L78) | | -| `GetTween` | function | SparkEngine | [EngineContext.h:L218](../../SparkEngine/Source/Core/EngineContext.h#L218) | | | `GetTween` | function | SparkEngine | [EngineContext.h:L219](../../SparkEngine/Source/Core/EngineContext.h#L219) | | -| `GetTween` | function | SparkSDK | [IEngineContext.h:L254](../../SparkSDK/Include/Spark/IEngineContext.h#L254) | Get the tween/interpolation system | +| `GetTween` | function | SparkEngine | [EngineContext.h:L220](../../SparkEngine/Source/Core/EngineContext.h#L220) | | | `GetTween` | function | SparkSDK | [IEngineContext.h:L255](../../SparkSDK/Include/Spark/IEngineContext.h#L255) | Get the tween/interpolation system | +| `GetTween` | function | SparkSDK | [IEngineContext.h:L256](../../SparkSDK/Include/Spark/IEngineContext.h#L256) | Get the tween/interpolation system | | `GetType` | function | GameModules | [Enemy.h:L96](../../GameModules/SparkGameFPS/Source/Game/Enemy.h#L96) | Get the enemy type | | `GetType` | function | SparkEngine | [MovementSystem.h:L115](../../SparkEngine/Source/Engine/AI/MovementSystem.h#L115) | | | `GetType` | function | SparkEngine | [MovementSystem.h:L142](../../SparkEngine/Source/Engine/AI/MovementSystem.h#L142) | Does nothing -- entity stands still. | @@ -18625,7 +18654,7 @@ | `GetTypeCount` | function | Tests | [TestReflection.cpp:L115](../../Tests/TestReflection.cpp#L115) | | | `GetTypeId` | function | SparkEditor | [CommandHistory.h:L92](../../SparkEditor/Source/CommandHistory.h#L92) | Unique ID for this command type (used by MergeWith). | | `GetTypeId` | function | SparkEditor | [CommandHistory.h:L321](../../SparkEditor/Source/CommandHistory.h#L321) | | -| `GetTypeId` | function | SparkEngine | [EngineContext.h:L63](../../SparkEngine/Source/Core/EngineContext.h#L63) | | +| `GetTypeId` | function | SparkEngine | [EngineContext.h:L64](../../SparkEngine/Source/Core/EngineContext.h#L64) | | | `GetTypeId` | function | Tests | [TestCommandHistory.cpp:L27](../../Tests/TestCommandHistory.cpp#L27) | | | `GetTypeId` | function | Tests | [TestCommandHistory.cpp:L116](../../Tests/TestCommandHistory.cpp#L116) | | | `GetTypeId` | function | Tests | [TestReflection.cpp:L24](../../Tests/TestReflection.cpp#L24) | | @@ -18660,10 +18689,10 @@ | `GetUAV` | function | SparkEngine | [TextureSystem.h:L154](../../SparkEngine/Source/Graphics/TextureSystem.h#L154) | | | `GetUAVDescriptor` | function | SparkEngine | [D3D12Types.h:L491](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L491) | | | `GetUI` | function | SparkEditor | [EditorApplication.h:L110](../../SparkEditor/Source/Core/EditorApplication.h#L110) | Access the editor's UI/document layer (owns the live ECS | -| `GetUI` | function | SparkEngine | [EngineContext.h:L207](../../SparkEngine/Source/Core/EngineContext.h#L207) | | | `GetUI` | function | SparkEngine | [EngineContext.h:L208](../../SparkEngine/Source/Core/EngineContext.h#L208) | | -| `GetUI` | function | SparkSDK | [IEngineContext.h:L229](../../SparkSDK/Include/Spark/IEngineContext.h#L229) | Get the UI system | +| `GetUI` | function | SparkEngine | [EngineContext.h:L209](../../SparkEngine/Source/Core/EngineContext.h#L209) | | | `GetUI` | function | SparkSDK | [IEngineContext.h:L230](../../SparkSDK/Include/Spark/IEngineContext.h#L230) | Get the UI system | +| `GetUI` | function | SparkSDK | [IEngineContext.h:L231](../../SparkSDK/Include/Spark/IEngineContext.h#L231) | Get the UI system | | `GetUI` | function | Tests | [TestModuleABI.cpp:L111](../../Tests/TestModuleABI.cpp#L111) | | | `GetUI` | function | Tests | [TestModuleABI.cpp:L112](../../Tests/TestModuleABI.cpp#L112) | | | `GetUInt` | function | SparkEngine | [ProfileProperties.h:L79](../../SparkEngine/Source/Utils/ProfileProperties.h#L79) | Read back a property as unsigned integer | @@ -18694,7 +18723,7 @@ | `GetUpdateCount` | function | Tests | [TestECSystemOrdering.cpp:L115](../../Tests/TestECSystemOrdering.cpp#L115) | | | `GetUpdateCount` | function | Tests | [TestECSystemOrdering.cpp:L131](../../Tests/TestECSystemOrdering.cpp#L131) | | | `GetUpdateCount` | function | Tests | [TestECSystemOrdering.cpp:L147](../../Tests/TestECSystemOrdering.cpp#L147) | | -| `GetUpdateCount` | function | Tests | [TestECSystemsReal.cpp:L45](../../Tests/TestECSystemsReal.cpp#L45) | | +| `GetUpdateCount` | function | Tests | [TestECSystemsReal.cpp:L35](../../Tests/TestECSystemsReal.cpp#L35) | | | `GetUpdateCount` | function | Tests | [TestSystemManagerIntegration.cpp:L51](../../Tests/TestSystemManagerIntegration.cpp#L51) | | | `GetUpdates` | function | Tests | [TestConstantBufferDiff.cpp:L35](../../Tests/TestConstantBufferDiff.cpp#L35) | | | `GetUploadResource` | function | SparkEngine | [D3D12Types.h:L403](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L403) | | @@ -18787,10 +18816,10 @@ | `GetVertexShader` | function | SparkEngine | [D3D11Device.h:L188](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L188) | | | `GetVertexShader` | function | SparkEngine | [MetalDevice.h:L251](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L251) | | | `GetVertices` | function | SparkEngine | [SpriteBatch.h:L210](../../SparkEngine/Source/Graphics/2D/SpriteBatch.h#L210) | | -| `GetVFS` | function | SparkEngine | [EngineContext.h:L266](../../SparkEngine/Source/Core/EngineContext.h#L266) | | | `GetVFS` | function | SparkEngine | [EngineContext.h:L267](../../SparkEngine/Source/Core/EngineContext.h#L267) | | -| `GetVFS` | function | SparkSDK | [IEngineContext.h:L298](../../SparkSDK/Include/Spark/IEngineContext.h#L298) | Get the virtual file system (mount-priority layered filesystem) | +| `GetVFS` | function | SparkEngine | [EngineContext.h:L268](../../SparkEngine/Source/Core/EngineContext.h#L268) | | | `GetVFS` | function | SparkSDK | [IEngineContext.h:L299](../../SparkSDK/Include/Spark/IEngineContext.h#L299) | Get the virtual file system (mount-priority layered filesystem) | +| `GetVFS` | function | SparkSDK | [IEngineContext.h:L300](../../SparkSDK/Include/Spark/IEngineContext.h#L300) | Get the virtual file system (mount-priority layered filesystem) | | `GetVibrationLeft` | function | Tests | [TestGamepadInputProcessing.cpp:L271](../../Tests/TestGamepadInputProcessing.cpp#L271) | | | `GetVibrationRight` | function | Tests | [TestGamepadInputProcessing.cpp:L276](../../Tests/TestGamepadInputProcessing.cpp#L276) | | | `GetVideoInfo` | function | SparkEngine | [VideoPlayer.h:L309](../../SparkEngine/Source/Engine/Cinematic/VideoPlayer.h#L309) | Get video info/metadata | @@ -18848,10 +18877,10 @@ | `GetVolumeManager` | function | SparkEngine | [PostProcessingPipeline.h:L181](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L181) | | | `GetVolumetricSettings` | function | SparkEngine | [FogSystem.h:L238](../../SparkEngine/Source/Graphics/FogSystem.h#L238) | | | `GetVoxelSize` | function | SparkEngine | [VoxelConeTracing.h:L236](../../SparkEngine/Source/Graphics/VoxelConeTracing.h#L236) | | -| `GetVR` | function | SparkEngine | [EngineContext.h:L235](../../SparkEngine/Source/Core/EngineContext.h#L235) | | | `GetVR` | function | SparkEngine | [EngineContext.h:L236](../../SparkEngine/Source/Core/EngineContext.h#L236) | | -| `GetVR` | function | SparkSDK | [IEngineContext.h:L270](../../SparkSDK/Include/Spark/IEngineContext.h#L270) | Get the VR system (requires ENABLE_VR) | +| `GetVR` | function | SparkEngine | [EngineContext.h:L237](../../SparkEngine/Source/Core/EngineContext.h#L237) | | | `GetVR` | function | SparkSDK | [IEngineContext.h:L271](../../SparkSDK/Include/Spark/IEngineContext.h#L271) | Get the VR system (requires ENABLE_VR) | +| `GetVR` | function | SparkSDK | [IEngineContext.h:L272](../../SparkSDK/Include/Spark/IEngineContext.h#L272) | Get the VR system (requires ENABLE_VR) | | `GetVRAMBudgetMonitor` | function | SparkEngine | [GraphicsEngine.h:L381](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L381) | | | `GetVRAMUsage` | function | SparkEngine | [RenderDevice.h:L94](../../SparkEngine/Source/Graphics/RenderDevice.h#L94) | Get estimated VRAM usage in bytes. | | `GetWaiters` | function | SparkEngine | [WorkSema.h:L111](../../SparkEngine/Source/Utils/WorkSema.h#L111) | | @@ -18873,24 +18902,26 @@ | `GetWeaponByName` | function | SparkEngine | [WeaponManager.h:L230](../../SparkEngine/Source/Engine/Gameplay/WeaponManager.h#L230) | Look up a weapon definition by name | | `GetWeapons` | function | SparkEditor | [WeaponEditorPanel.h:L54](../../SparkEditor/Source/Panels/WeaponEditorPanel.h#L54) | The current (possibly edited) weapon table. | | `GetWeapons` | function | SparkEditor | [WeaponEditorPanel.h:L55](../../SparkEditor/Source/Panels/WeaponEditorPanel.h#L55) | The current (possibly edited) weapon table. | -| `GetWeapons` | function | SparkEngine | [EngineContext.h:L240](../../SparkEngine/Source/Core/EngineContext.h#L240) | | | `GetWeapons` | function | SparkEngine | [EngineContext.h:L241](../../SparkEngine/Source/Core/EngineContext.h#L241) | | -| `GetWeapons` | function | SparkSDK | [IEngineContext.h:L278](../../SparkSDK/Include/Spark/IEngineContext.h#L278) | Get the weapon system (weapon definitions, fire modes, recoil) | +| `GetWeapons` | function | SparkEngine | [EngineContext.h:L242](../../SparkEngine/Source/Core/EngineContext.h#L242) | | | `GetWeapons` | function | SparkSDK | [IEngineContext.h:L279](../../SparkSDK/Include/Spark/IEngineContext.h#L279) | Get the weapon system (weapon definitions, fire modes, recoil) | +| `GetWeapons` | function | SparkSDK | [IEngineContext.h:L280](../../SparkSDK/Include/Spark/IEngineContext.h#L280) | Get the weapon system (weapon definitions, fire modes, recoil) | | `GetWeaponStats` | function | GameModules | [Player.h:L783](../../GameModules/SparkGameFPS/Source/Game/Player.h#L783) | Get weapon statistics for a specific weapon type | | `GetWeaponSwitchAlpha` | function | GameModules | [HUDSystem.h:L346](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L346) | | | `GetWeaponSwitchName` | function | GameModules | [HUDSystem.h:L344](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L344) | | | `GetWeaponSwitchSlot` | function | GameModules | [HUDSystem.h:L345](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L345) | | -| `GetWeather` | function | SparkEngine | [EngineContext.h:L203](../../SparkEngine/Source/Core/EngineContext.h#L203) | | | `GetWeather` | function | SparkEngine | [EngineContext.h:L204](../../SparkEngine/Source/Core/EngineContext.h#L204) | | -| `GetWeather` | function | SparkSDK | [IEngineContext.h:L221](../../SparkSDK/Include/Spark/IEngineContext.h#L221) | Get the weather system | +| `GetWeather` | function | SparkEngine | [EngineContext.h:L205](../../SparkEngine/Source/Core/EngineContext.h#L205) | | | `GetWeather` | function | SparkSDK | [IEngineContext.h:L222](../../SparkSDK/Include/Spark/IEngineContext.h#L222) | Get the weather system | +| `GetWeather` | function | SparkSDK | [IEngineContext.h:L223](../../SparkSDK/Include/Spark/IEngineContext.h#L223) | Get the weather system | | `GetWeather` | function | Tests | [TestModuleABI.cpp:L109](../../Tests/TestModuleABI.cpp#L109) | | | `GetWeather` | function | Tests | [TestModuleABI.cpp:L110](../../Tests/TestModuleABI.cpp#L110) | | | `GetWeather` | function | Tests | [TestSparkGameShowcase.cpp:L88](../../Tests/TestSparkGameShowcase.cpp#L88) | | | `GetWeather` | function | Tests | [TestSparkGameShowcase.cpp:L89](../../Tests/TestSparkGameShowcase.cpp#L89) | | | `GetWeatherMapTexture` | function | SparkEngine | [VolumetricClouds.h:L179](../../SparkEngine/Source/Graphics/VolumetricClouds.h#L179) | Upload latest CPU-generated noise/weather to the GPU textures | | `GetWeatherPreset` | function | SparkEngine | [WeatherSystem.h:L128](../../SparkEngine/Source/Graphics/WeatherSystem.h#L128) | Get a default weather state for a given weather type | +| `GetWeatherService` | function | SparkEngine | [EngineContext.h:L294](../../SparkEngine/Source/Core/EngineContext.h#L294) | | +| `GetWeatherService` | function | SparkSDK | [IEngineContext.h:L381](../../SparkSDK/Include/Spark/IEngineContext.h#L381) | | | `GetWeatherStatus` | function | GameModules | [MMOEngineSystems.h:L85](../../GameModules/SparkGameMMO/Source/Core/MMOEngineSystems.h#L85) | Unsubscribe events and release references | | `GetWeatherStatus` | function | GameModules | [OWEngineSystems.h:L54](../../GameModules/SparkGameOpenWorld/Source/Core/OWEngineSystems.h#L54) | Validate the slot's gameplay snapshot, then restore the world and gameplay state from it. | | `GetWeatherTypeName` | function | SparkEngine | [WeatherSystem.h:L399](../../SparkEngine/Source/Graphics/WeatherSystem.h#L399) | Get a string name for a weather type. | @@ -18938,9 +18969,9 @@ | `GetWorkerCount` | function | SparkEngine | [JobSystem.h:L319](../../SparkEngine/Source/Utils/JobSystem.h#L319) | Get number of worker threads | | `GetWorkerCount` | function | Tests | [TestJobSystem.cpp:L57](../../Tests/TestJobSystem.cpp#L57) | | | `GetWorld` | function | SparkEditor | [EditorUI.h:L169](../../SparkEditor/Source/Core/EditorUI.h#L169) | The single live ECS World being edited (the document). Owned by | -| `GetWorld` | function | SparkEngine | [EngineContext.h:L185](../../SparkEngine/Source/Core/EngineContext.h#L185) | | -| `GetWorld` | function | SparkSDK | [IEngineContext.h:L183](../../SparkSDK/Include/Spark/IEngineContext.h#L183) | Get the ECS world for entity/component access | +| `GetWorld` | function | SparkEngine | [EngineContext.h:L186](../../SparkEngine/Source/Core/EngineContext.h#L186) | | | `GetWorld` | function | SparkSDK | [IEngineContext.h:L184](../../SparkSDK/Include/Spark/IEngineContext.h#L184) | Get the ECS world for entity/component access | +| `GetWorld` | function | SparkSDK | [IEngineContext.h:L185](../../SparkSDK/Include/Spark/IEngineContext.h#L185) | Get the ECS world for entity/component access | | `GetWorld` | function | Tests | [TestMOD330ARPGWorldActors.cpp:L61](../../Tests/TestMOD330ARPGWorldActors.cpp#L61) | | | `GetWorld` | function | Tests | [TestMOD340PlatformerProgressReal.cpp:L119](../../Tests/TestMOD340PlatformerProgressReal.cpp#L119) | | | `GetWorld` | function | Tests | [TestMOD350RPGQuestSliceReal.cpp:L94](../../Tests/TestMOD350RPGQuestSliceReal.cpp#L94) | | @@ -19191,7 +19222,7 @@ | `GPUDrivenRenderer::Initialize` | method | SparkEngine | [GPUDrivenRenderer.cpp:L34](../../SparkEngine/Source/Graphics/GPUDrivenRenderer.cpp#L34) | | | `GPUDrivenRenderer::Shutdown` | method | SparkEngine | [GPUDrivenRenderer.cpp:L440](../../SparkEngine/Source/Graphics/GPUDrivenRenderer.cpp#L440) | | | `gpuEvent` | function | SparkEngine | [PostProcessingPipelineWindowsPasses.cpp:L288](../../SparkEngine/Source/Graphics/PostProcessingPipelineWindowsPasses.cpp#L288) | | -| `gpuFile` | function | SparkEngine | [CrashHandler.cpp:L1720](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1720) | | +| `gpuFile` | function | SparkEngine | [CrashHandler.cpp:L1721](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1721) | | | `GPUFrameCounters` | struct | SparkEngine | [GPUPerfCounters.h:L44](../../SparkEngine/Source/Utils/GPUPerfCounters.h#L44) | Per-frame GPU performance counter state. | | `GPUInstanceData` | struct | SparkEngine | [GPUSceneBuffer.h:L70](../../SparkEngine/Source/Graphics/GPUSceneBuffer.h#L70) | | | `GPULightData` | struct | SparkEngine | [ClusteredLightGPU.h:L42](../../SparkEngine/Source/Graphics/ClusteredLightGPU.h#L42) | GPU-aligned light data matching the HLSL StructuredBuffer layout. | @@ -19368,11 +19399,11 @@ | `GraphicsEngine` | class | GameModules | [TFViewModel.h:L42](../../GameModules/SparkGameMMOFPS/Source/Game/TFViewModel.h#L42) | | | `GraphicsEngine` | class | GameModules | [TFRegionDecor.h:L61](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionDecor.h#L61) | | | `GraphicsEngine` | class | GameModules | [TFWeatherFx.h:L71](../../GameModules/SparkGameMMOFPS/Source/World/TFWeatherFx.h#L71) | | -| `GraphicsEngine` | class | SparkEditor | [AssetBrowserPanel.h:L16](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L16) | | +| `GraphicsEngine` | class | SparkEditor | [AssetBrowserPanel.h:L17](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L17) | | | `GraphicsEngine` | class | SparkEditor | [BasicMaterialEditorPanel.h:L29](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L29) | | | `GraphicsEngine` | class | SparkEditor | [GameViewPanel.h:L23](../../SparkEditor/Source/Panels/GameViewPanel.h#L23) | | | `GraphicsEngine` | class | SparkEditor | [SceneViewPanel.h:L24](../../SparkEditor/Source/Panels/SceneViewPanel.h#L24) | | -| `GraphicsEngine` | class | SparkEngine | [EngineContext.h:L39](../../SparkEngine/Source/Core/EngineContext.h#L39) | | +| `GraphicsEngine` | class | SparkEngine | [EngineContext.h:L40](../../SparkEngine/Source/Core/EngineContext.h#L40) | | | `GraphicsEngine` | class | SparkEngine | [EngineRuntime.h:L28](../../SparkEngine/Source/Core/EngineRuntime.h#L28) | | | `GraphicsEngine` | class | SparkEngine | [EngineSetup.h:L20](../../SparkEngine/Source/Core/EngineSetup.h#L20) | | | `GraphicsEngine` | class | SparkEngine | [IGameModule.h:L19](../../SparkEngine/Source/Core/IGameModule.h#L19) | | @@ -19388,7 +19419,7 @@ | `GraphicsEngine` | class | SparkEngine | [RenderPipeline.h:L28](../../SparkEngine/Source/Graphics/RenderPipeline.h#L28) | | | `GraphicsEngine` | class | SparkEngine | [WorldBasicRenderer.h:L15](../../SparkEngine/Source/Graphics/WorldBasicRenderer.h#L15) | | | `GraphicsEngine` | class | SparkEngine | [SceneManager.h:L83](../../SparkEngine/Source/SceneManager/SceneManager.h#L83) | | -| `GraphicsEngine` | class | SparkSDK | [IEngineContext.h:L22](../../SparkSDK/Include/Spark/IEngineContext.h#L22) | | +| `GraphicsEngine` | class | SparkSDK | [IEngineContext.h:L23](../../SparkSDK/Include/Spark/IEngineContext.h#L23) | | | `GraphicsEngine::AccumulateValidationMessages` | method | SparkEngine | [GraphicsEngineWindowsDeviceLost.cpp:L53](../../SparkEngine/Source/Graphics/GraphicsEngineWindowsDeviceLost.cpp#L53) | | | `GraphicsEngine::AcquireHybridRTBindings` | method | SparkEngine | [GraphicsEngineLinuxFrame.cpp:L290](../../SparkEngine/Source/Graphics/GraphicsEngineLinuxFrame.cpp#L290) | | | `GraphicsEngine::AcquireHybridRTBindings` | method | SparkEngine | [GraphicsEngineWindowsFrame.cpp:L372](../../SparkEngine/Source/Graphics/GraphicsEngineWindowsFrame.cpp#L372) | | @@ -19759,7 +19790,7 @@ | `guard` | function | SparkEngine | [GraphicsEngineSubmit.cpp:L62](../../SparkEngine/Source/Graphics/GraphicsEngineSubmit.cpp#L62) | | | `guard` | function | SparkEngine | [GraphicsEngineSubmit.cpp:L145](../../SparkEngine/Source/Graphics/GraphicsEngineSubmit.cpp#L145) | | | `guard` | function | SparkEngine | [GraphicsEngineWindowsDrawList.cpp:L55](../../SparkEngine/Source/Graphics/GraphicsEngineWindowsDrawList.cpp#L55) | | -| `guard` | function | SparkEngine | [CrashHandler.cpp:L1069](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1069) | | +| `guard` | function | SparkEngine | [CrashHandler.cpp:L1070](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1070) | | | `guard` | function | SparkEngine | [JsonUtils.h:L824](../../SparkEngine/Source/Utils/JsonUtils.h#L824) | | | `guard` | function | SparkEngine | [JsonUtils.h:L862](../../SparkEngine/Source/Utils/JsonUtils.h#L862) | | | `guard` | function | Tests | [TestConsoleProcessPipeReal.cpp:L145](../../Tests/TestConsoleProcessPipeReal.cpp#L145) | | @@ -19842,7 +19873,7 @@ | `HANDLE` | alias | SparkEngine | [PlatformTypes.h:L48](../../SparkEngine/Source/Core/PlatformTypes.h#L48) | | | `handle` | function | SparkEngine | [HeldHandles.h:L113](../../SparkEngine/Source/Engine/Modding/HeldHandles.h#L113) | | | `Handle` | alias | SparkEngine | [RHIHandlePool.h:L116](../../SparkEngine/Source/Graphics/RHI/RHIHandlePool.h#L116) | | -| `handle` | function | SparkEngine | [SceneManager.cpp:L243](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L243) | | +| `handle` | function | SparkEngine | [SceneManager.cpp:L263](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L263) | | | `handle` | function | Tests | [TestOpaqueHandle.cpp:L17](../../Tests/TestOpaqueHandle.cpp#L17) | | | `handle` | function | Tests | [TestOpaqueHandle.cpp:L26](../../Tests/TestOpaqueHandle.cpp#L26) | | | `handle` | function | Tests | [TestOpaqueHandle.cpp:L35](../../Tests/TestOpaqueHandle.cpp#L35) | | @@ -19858,7 +19889,7 @@ | `HandleAllocator` | class | Tests | [TestVersionedHandle.cpp:L19](../../Tests/TestVersionedHandle.cpp#L19) | | | `HandleAllocator` | function | Tests | [TestVersionedHandle.cpp:L22](../../Tests/TestVersionedHandle.cpp#L22) | | | `HandleAssertion` | function | SparkEditor | [EditorCrashHandler.h:L74](../../SparkEditor/Source/Core/EditorCrashHandler.h#L74) | | -| `HandleBackspaceKey` | function | SparkConsole | [ConsoleApp.h:L95](../../SparkConsole/src/ConsoleApp.h#L95) | | +| `HandleBackspaceKey` | function | SparkConsole | [ConsoleApp.h:L96](../../SparkConsole/src/ConsoleApp.h#L96) | | | `HandleCanvasInput` | function | SparkEditor | [VisualScriptPanel.h:L140](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L140) | | | `HandleCharCreate` | function | GameModules | [TFServerSim.h:L218](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L218) | | | `HandleCharDelete` | function | GameModules | [TFServerSim.h:L219](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L219) | | @@ -19876,7 +19907,7 @@ | `HandleClientInput` | function | GameModules | [TFServerSim.h:L195](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L195) | | | `HandleClientSocket` | function | SparkEditor | [CollaborativeEditSession.h:L428](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L428) | Moves every queued message out under the queue lock, resetting its byte count. | | `HandleCloser` | struct | SparkEditor | [ProjectManager.cpp:L375](../../SparkEditor/Source/Core/ProjectManager.cpp#L375) | | -| `HandleCloser` | struct | SparkEngine | [SceneManager.cpp:L227](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L227) | | +| `HandleCloser` | struct | SparkEngine | [SceneManager.cpp:L245](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L245) | | | `HandleCloser` | struct | SparkLauncher | [LauncherProcess.cpp:L468](../../SparkLauncher/src/LauncherProcess.cpp#L468) | | | `HandleCollisions` | function | SparkEngine | [ClothSimulation.h:L260](../../SparkEngine/Source/Physics/ClothSimulation.h#L260) | Get simulation status (console integration). | | `HandleCommandInputCallback` | function | SparkEditor | [ConsolePanel.h:L277](../../SparkEditor/Source/Panels/ConsolePanel.h#L277) | Handle Up/Down history recall and Tab completion for the input box | @@ -19888,8 +19919,8 @@ | `HandleConsoleControl` | function | SparkServer | [main.cpp:L40](../../SparkServer/src/main.cpp#L40) | | | `HandleContinentHopRequest` | function | GameModules | [TFServerSim.h:L235](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L235) | | | `HandleCrashInternal` | function | SparkEditor | [EditorCrashHandler.h:L122](../../SparkEditor/Source/Core/EditorCrashHandler.h#L122) | | -| `HandleCrashInternal` | function | SparkEngine | [CrashHandler.cpp:L820](../../SparkEngine/Source/Utils/CrashHandler.cpp#L820) | | -| `HandleCrashInternal` | function | SparkEngine | [CrashHandler.cpp:L1058](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1058) | | +| `HandleCrashInternal` | function | SparkEngine | [CrashHandler.cpp:L821](../../SparkEngine/Source/Utils/CrashHandler.cpp#L821) | | +| `HandleCrashInternal` | function | SparkEngine | [CrashHandler.cpp:L1059](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1059) | | | `HandleDash` | function | GameModules | [PlatformerPlayerController.h:L179](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L179) | | | `handleDecodeFailure` | function | SparkEngine | [GraphicsDeviceResourcesWindowsTextures.cpp:L357](../../SparkEngine/Source/Graphics/GraphicsDeviceResourcesWindowsTextures.cpp#L357) | | | `handleDecodeFailure` | function | SparkEngine | [GraphicsDeviceResourcesWindowsTextures.cpp:L363](../../SparkEngine/Source/Graphics/GraphicsDeviceResourcesWindowsTextures.cpp#L363) | | @@ -19905,7 +19936,7 @@ | `HandleEvent` | function | SparkEditor | [AdvancedAssetPipeline.h:L279](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L279) | Handle panel events | | `HandleEvent` | function | SparkEditor | [EditorPanel.h:L87](../../SparkEditor/Source/Core/EditorPanel.h#L87) | Handle panel-specific events | | `HandleEvent` | function | SparkEditor | [LevelStreamingSystem.h:L89](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.h#L89) | Handle panel events | -| `HandleEvent` | function | SparkEditor | [AssetBrowserPanel.h:L67](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L67) | Handle panel events | +| `HandleEvent` | function | SparkEditor | [AssetBrowserPanel.h:L68](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L68) | Handle panel events | | `HandleEvent` | function | SparkEditor | [BuildCookPanel.h:L113](../../SparkEditor/Source/Panels/BuildCookPanel.h#L113) | | | `HandleEvent` | function | SparkEditor | [ConsolePanel.h:L106](../../SparkEditor/Source/Panels/ConsolePanel.h#L106) | | | `HandleEvent` | function | SparkEditor | [DebugVisualizerPanel.h:L34](../../SparkEditor/Source/Panels/DebugVisualizerPanel.h#L34) | | @@ -19943,9 +19974,9 @@ | `HandleInvalidateAsset` | function | SparkDaemon | [AssetService.cpp:L82](../../SparkDaemon/src/AssetService.cpp#L82) | | | `HandleInvalidateAsset` | function | SparkDaemon | [AssetService.h:L115](../../SparkDaemon/src/AssetService.h#L115) | | | `HandleJump` | function | GameModules | [PlatformerPlayerController.h:L177](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L177) | | -| `HandleKeyboardShortcuts` | function | SparkEditor | [EditorUI.h:L516](../../SparkEditor/Source/Core/EditorUI.h#L516) | | +| `HandleKeyboardShortcuts` | function | SparkEditor | [EditorUI.h:L514](../../SparkEditor/Source/Core/EditorUI.h#L514) | | | `HandleKillPlane` | function | GameModules | [PlatformerPlayerController.h:L173](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L173) | | -| `HandleLinuxCrash` | function | SparkEngine | [CrashHandler.cpp:L2570](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2570) | | +| `HandleLinuxCrash` | function | SparkEngine | [CrashHandler.cpp:L2616](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2616) | | | `HandleLogin` | function | GameModules | [TFServerSim.h:L213](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L213) | | | `HandleLoginProof` | function | GameModules | [TFServerSim.h:L214](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L214) | | | `HandleMessage` | function | SparkDaemon | [AssetService.h:L79](../../SparkDaemon/src/AssetService.h#L79) | Cap total cached bytes; oldest entries are evicted on overflow. | @@ -19953,8 +19984,8 @@ | `HandleMessage` | function | SparkDaemon | [ControlService.h:L43](../../SparkDaemon/src/ControlService.h#L43) | | | `HandleMessage` | function | SparkDaemon | [ServiceBase.h:L57](../../SparkDaemon/src/ServiceBase.h#L57) | Handle an incoming request frame. | | `HandleMessage` | function | SparkDaemon | [ShaderService.h:L87](../../SparkDaemon/src/ShaderService.h#L87) | | -| `HandleMessage` | function | SparkEngine | [InputManager.h:L155](../../SparkEngine/Source/Input/InputManager.h#L155) | | -| `HandleMouseButtonMessage` | function | SparkEngine | [InputManager.h:L446](../../SparkEngine/Source/Input/InputManager.h#L446) | Consolidated handler for mouse button down/up messages. | +| `HandleMessage` | function | SparkEngine | [InputManager.h:L157](../../SparkEngine/Source/Input/InputManager.h#L157) | | +| `HandleMouseButtonMessage` | function | SparkEngine | [InputManager.h:L453](../../SparkEngine/Source/Input/InputManager.h#L453) | Consolidated handler for mouse button down/up messages. | | `HandleNetworkChat` | function | GameModules | [MMOChatSystem.h:L180](../../GameModules/SparkGameMMO/Source/Chat/MMOChatSystem.h#L180) | | | `HandleObjectDragDrop` | function | SparkEditor | [HierarchyPanel.h:L300](../../SparkEditor/Source/Panels/HierarchyPanel.h#L300) | Handle object drag and drop | | `HandlePeerDisconnected` | function | GameModules | [MultiplayerSystem.h:L353](../../GameModules/SparkGameFPS/Source/Game/MultiplayerSystem.h#L353) | | @@ -19964,7 +19995,7 @@ | `HandlePlayerConnectToArea` | function | SparkEngine | [WorldServer.h:L237](../../SparkEngine/Source/Engine/Networking/WorldServer.h#L237) | Handle a new player connection placed by an external policy | | `HandlePlayerDisconnect` | function | SparkEngine | [WorldServer.h:L244](../../SparkEngine/Source/Engine/Networking/WorldServer.h#L244) | Handle player disconnection | | `HandlePlayerDisconnect` | function | Tests | [TestWorldServerRouting.cpp:L202](../../Tests/TestWorldServerRouting.cpp#L202) | | -| `HandlePrintableChar` | function | SparkConsole | [ConsoleApp.h:L96](../../SparkConsole/src/ConsoleApp.h#L96) | | +| `HandlePrintableChar` | function | SparkConsole | [ConsoleApp.h:L97](../../SparkConsole/src/ConsoleApp.h#L97) | | | `HandlePutAsset` | function | SparkDaemon | [AssetService.cpp:L80](../../SparkDaemon/src/AssetService.cpp#L80) | | | `HandlePutAsset` | function | SparkDaemon | [AssetService.h:L114](../../SparkDaemon/src/AssetService.h#L114) | | | `HandlePutCacheEntry` | function | SparkDaemon | [ShaderService.cpp:L91](../../SparkDaemon/src/ShaderService.cpp#L91) | | @@ -19983,7 +20014,7 @@ | `HandlerId` | alias | Tests | [TestCrossSystemIntegration.cpp:L130](../../Tests/TestCrossSystemIntegration.cpp#L130) | | | `HandlerID` | alias | Tests | [TestDelegate.cpp:L16](../../Tests/TestDelegate.cpp#L16) | | | `HandlerID` | alias | Tests | [TestWeaponMechanicsReal.cpp:L197](../../Tests/TestWeaponMechanicsReal.cpp#L197) | | -| `HandleSDLEvent` | function | SparkEngine | [SparkEngineLinuxSDL2Events.cpp:L100](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2Events.cpp#L100) | Dispatch a single SDL event to the appropriate engine subsystem. | +| `HandleSDLEvent` | function | SparkEngine | [SparkEngineLinuxSDL2Events.cpp:L102](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2Events.cpp#L102) | Dispatch a single SDL event to the appropriate engine subsystem. | | `HandleSet` | struct | SparkEngine | [TelemetrySpool.cpp:L70](../../SparkEngine/Source/Utils/TelemetrySpool.cpp#L70) | | | `HandleSignal` | function | SparkDaemon | [CollabServerMain.cpp:L36](../../SparkDaemon/src/CollabServerMain.cpp#L36) | | | `HandleSignal` | function | SparkDaemon | [main.cpp:L76](../../SparkDaemon/src/main.cpp#L76) | | @@ -20090,7 +20121,7 @@ | `HasFlag` | function | Tests | [TestConsoleVariables.cpp:L39](../../Tests/TestConsoleVariables.cpp#L39) | | | `HasFn` | alias | SparkEngine | [Reflection.h:L295](../../SparkEngine/Source/Core/Reflection.h#L295) | | | `HasFrameSample` | function | SparkEditor | [PerformanceProfiler.h:L192](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L192) | Whether at least one frame with a non-zero delta has been recorded | -| `HasFreshMoveState` | function | GameModules | [TFReplication.h:L72](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L72) | | +| `HasFreshMoveState` | function | GameModules | [TFReplication.h:L76](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L76) | | | `HasFullEngineBindings` | function | Tests | [TestFullEngineDiagnostics.cpp:L67](../../Tests/TestFullEngineDiagnostics.cpp#L67) | | | `HasGivenUp` | function | Tests | [TestSelfRecovery.cpp:L217](../../Tests/TestSelfRecovery.cpp#L217) | | | `HasGPUBuffers` | function | SparkEngine | [WaterRenderer.h:L215](../../SparkEngine/Source/Graphics/WaterRenderer.h#L215) | Check whether GPU buffers have been created. | @@ -20205,7 +20236,7 @@ | `HasSideEffects` | function | SparkEngine | [RenderGraphPass.h:L62](../../SparkEngine/Source/Graphics/RenderGraphPass.h#L62) | | | `HasSnapshot` | function | SparkEngine | [PlayModeManager.h:L371](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L371) | | | `HasSound` | function | Tests | [TestAudioEngine.cpp:L114](../../Tests/TestAudioEngine.cpp#L114) | | -| `HasStagedSibling` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L58](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L58) | | +| `HasStagedSibling` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L60](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L60) | | | `HasStagingSibling` | function | SparkInstaller | [InstallerTransactionTests.cpp:L476](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L476) | | | `HasStagingSibling` | function | SparkInstaller | [InstallerTransactionTests.cpp:L1089](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L1089) | | | `HasStencilComponent` | function | SparkEngine | [VulkanCommandList.cpp:L29](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanCommandList.cpp#L29) | | @@ -20227,8 +20258,8 @@ | `HasValidData` | function | SparkEngine | [DynamicQualityScaler.h:L87](../../SparkEngine/Source/Graphics/DynamicQualityScaler.h#L87) | Check if the scaler has enough data for a valid reading | | `HasValidItem` | function | SparkEngine | [EnvironmentQuery.h:L450](../../SparkEngine/Source/Engine/AI/EnvironmentQuery.h#L450) | | | `HasValidJoltBody` | function | SparkEngine | [PhysicsBodyImpl.cpp:L65](../../SparkEngine/Source/Physics/PhysicsBodyImpl.cpp#L65) | | -| `HasValidProjectRoot` | function | SparkEditor | [AssetBrowserPanel.cpp:L762](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L762) | | -| `HasValidProjectRoot` | function | SparkEditor | [AssetBrowserPanel.h:L111](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L111) | | +| `HasValidProjectRoot` | function | SparkEditor | [AssetBrowserPanel.cpp:L407](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L407) | | +| `HasValidProjectRoot` | function | SparkEditor | [AssetBrowserPanel.h:L121](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L121) | | | `HasValidV4Checksum` | function | Tests | [Test_persistence_SaveSystem.cpp:L230](../../Tests/harden/Test_persistence_SaveSystem.cpp#L230) | | | `HasValue` | function | Tests | [TestScriptHookManager.cpp:L48](../../Tests/TestScriptHookManager.cpp#L48) | | | `HasVertexSpace` | function | SparkEngine | [TransientBufferAllocator.h:L197](../../SparkEngine/Source/Graphics/RHI/TransientBufferAllocator.h#L197) | Check if there's room for a vertex allocation without actually allocating. | @@ -20252,10 +20283,10 @@ | `HdrTile` | function | Tests | [TestRHI240OpenGLGoldenReal.cpp:L257](../../Tests/TestRHI240OpenGLGoldenReal.cpp#L257) | | | `HeadCommit` | function | SparkInstaller | [GitRunner.h:L38](../../SparkInstaller/src/GitRunner.h#L38) | | | `header` | function | SparkDaemon | [OrchestrationJournal.cpp:L374](../../SparkDaemon/src/OrchestrationJournal.cpp#L374) | | -| `header` | function | Tests | [TestAssetParserHardening.cpp:L83](../../Tests/TestAssetParserHardening.cpp#L83) | | +| `header` | function | Tests | [TestAssetParserHardening.cpp:L99](../../Tests/TestAssetParserHardening.cpp#L99) | | | `header` | function | Tests | [TestD3D11DeviceContractsReal.cpp:L600](../../Tests/TestD3D11DeviceContractsReal.cpp#L600) | | | `header` | function | Tests | [TestGoldenImageTest.cpp:L388](../../Tests/TestGoldenImageTest.cpp#L388) | | -| `Header` | struct | Tests | [TestSparkPak.cpp:L36](../../Tests/TestSparkPak.cpp#L36) | | +| `Header` | struct | Tests | [TestSparkPak.cpp:L42](../../Tests/TestSparkPak.cpp#L42) | | | `headerBytes` | function | SparkDaemon | [OrchestrationJournal.cpp:L372](../../SparkDaemon/src/OrchestrationJournal.cpp#L372) | | | `HeaderCrc` | function | Tests | [TestRHI210TextureDecode.cpp:L74](../../Tests/TestRHI210TextureDecode.cpp#L74) | | | `headerInput` | function | Tests | [TestEditorSubsystems.cpp:L1011](../../Tests/TestEditorSubsystems.cpp#L1011) | | @@ -20305,7 +20336,7 @@ | `Heartbeat` | function | Tests | [TestFreezeDetector.cpp:L85](../../Tests/TestFreezeDetector.cpp#L85) | | | `HeavyFrame` | function | Tests | [TestEngineLoadTest.cpp:L266](../../Tests/TestEngineLoadTest.cpp#L266) | | | `Height` | enum | SparkEngine | [PlacementComponents.h:L138](../../SparkEngine/Source/Engine/ECS/Components/PlacementComponents.h#L138) | Marks an entity position as a cover point for AI combat. | -| `Height` | function | Tests | [TestTF120Travel.cpp:L107](../../Tests/TestTF120Travel.cpp#L107) | | +| `Height` | function | Tests | [TestTF120Travel.cpp:L94](../../Tests/TestTF120Travel.cpp#L94) | | | `HeightDensity` | function | SparkEngine | [FogSystem.h:L146](../../SparkEngine/Source/Graphics/FogSystem.h#L146) | | | `HeightFogSettings` | struct | SparkEngine | [FogSystem.h:L94](../../SparkEngine/Source/Graphics/FogSystem.h#L94) | | | `HeightGradient` | function | SparkEngine | [VolumetricClouds.h:L196](../../SparkEngine/Source/Graphics/VolumetricClouds.h#L196) | | @@ -20393,7 +20424,7 @@ | `hintPos` | function | SparkEditor | [GameViewPanel.cpp:L825](../../SparkEditor/Source/Panels/GameViewPanel.cpp#L825) | | | `hintPos` | function | SparkEditor | [GameViewPanel.cpp:L833](../../SparkEditor/Source/Panels/GameViewPanel.cpp#L833) | | | `History` | function | Tests | [TestEditorAssetDropWorldReal.cpp:L47](../../Tests/TestEditorAssetDropWorldReal.cpp#L47) | | -| `History` | function | Tests | [TestEditorCookPackageReal.cpp:L96](../../Tests/TestEditorCookPackageReal.cpp#L96) | | +| `History` | function | Tests | [TestEditorCookPackageReal.cpp:L98](../../Tests/TestEditorCookPackageReal.cpp#L98) | | | `History` | function | Tests | [TestEditorDocumentReal.cpp:L25](../../Tests/TestEditorDocumentReal.cpp#L25) | | | `History` | function | Tests | [TestEditorUndoWorldMatrixReal.cpp:L37](../../Tests/TestEditorUndoWorldMatrixReal.cpp#L37) | | | `HistoryContains` | function | Tests | [TestMMOAuthNetwork.cpp:L236](../../Tests/TestMMOAuthNetwork.cpp#L236) | | @@ -20492,7 +20523,7 @@ | `Host` | function | SparkEditor | [CollaborativeEditSession.cpp:L434](../../SparkEditor/Source/Communication/CollaborativeEditSession.cpp#L434) | | | `Host` | function | SparkEditor | [CollaborativeEditSession.h:L286](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L286) | Host a new collaborative session on a TCP port | | `Host` | function | SparkEditor | [CollaborativeEditSession.h:L287](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L287) | Host a new collaborative session on a TCP port | -| `host` | function | Tests | [TestEditorCookPackageReal.cpp:L172](../../Tests/TestEditorCookPackageReal.cpp#L172) | | +| `host` | function | Tests | [TestEditorCookPackageReal.cpp:L174](../../Tests/TestEditorCookPackageReal.cpp#L174) | | | `host` | function | Tests | [TestRHI240LinuxForwardPassReal.cpp:L544](../../Tests/TestRHI240LinuxForwardPassReal.cpp#L544) | | | `host` | function | Tests | [TestRHI240LinuxForwardPassReal.cpp:L613](../../Tests/TestRHI240LinuxForwardPassReal.cpp#L613) | | | `HostAllocate` | function | SparkEngine | [DynamicPluginHost.cpp:L56](../../SparkEngine/Source/Core/DynamicPluginHost.cpp#L56) | | @@ -20509,7 +20540,7 @@ | `HostPlatform` | function | Tests | [TestENG200VisualScriptRuntimeReal.cpp:L102](../../Tests/TestENG200VisualScriptRuntimeReal.cpp#L102) | | | `HostPrepareUnload` | function | Tests | [TestPluginABI.cpp:L116](../../Tests/TestPluginABI.cpp#L116) | | | `HostRegistryScope` | struct | Tests | [TestLIFE200ModuleReloadLoopReal.cpp:L89](../../Tests/TestLIFE200ModuleReloadLoopReal.cpp#L89) | | -| `HostRun` | struct | Tests | [TestEditorCookPackageReal.cpp:L122](../../Tests/TestEditorCookPackageReal.cpp#L122) | | +| `HostRun` | struct | Tests | [TestEditorCookPackageReal.cpp:L124](../../Tests/TestEditorCookPackageReal.cpp#L124) | | | `HostSceneLoadReport` | struct | SparkEngine | [HostScenePreview.h:L32](../../SparkEngine/Source/Core/HostScenePreview.h#L32) | Outcome of LoadHostScene. | | `HostStandaloneBroker` | function | SparkEditor | [CollaborativeEditSession.h:L308](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L308) | Create and join a session hosted by SparkCollabServer. | | `HostStart` | function | Tests | [TestPluginABI.cpp:L97](../../Tests/TestPluginABI.cpp#L97) | | @@ -20790,10 +20821,10 @@ | `ICON_FA_WIND` | macro | SparkEditor | [EditorIcons.h:L186](../../SparkEditor/Source/Core/EditorIcons.h#L186) | | | `ICON_FA_WINDOW_MAXIMIZE` | macro | SparkEditor | [EditorIcons.h:L124](../../SparkEditor/Source/Core/EditorIcons.h#L124) | | | `iconPos` | function | SparkEditor | [EditorNotificationManager.cpp:L135](../../SparkEditor/Source/Core/EditorNotificationManager.cpp#L135) | | -| `iconRenderPos` | function | SparkEditor | [AssetBrowserPanel.cpp:L485](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L485) | | +| `iconRenderPos` | function | SparkEditor | [AssetBrowserGrid.cpp:L265](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L265) | | | `IConsole` | class | GameModules | [AdvancedConsoleCommands.h:L19](../../GameModules/SparkGameFPS/Source/Console/AdvancedConsoleCommands.h#L19) | | | `IConsole` | class | SparkSDK | [IConsole.h:L62](../../SparkSDK/Include/Spark/IConsole.h#L62) | Abstract console command registry for game modules | -| `IConsole` | class | SparkSDK | [IEngineContext.h:L79](../../SparkSDK/Include/Spark/IEngineContext.h#L79) | | +| `IConsole` | class | SparkSDK | [IEngineContext.h:L80](../../SparkSDK/Include/Spark/IEngineContext.h#L80) | | | `IContactListener` | class | SparkEngine | [JoltPhysicsInterface.h:L184](../../SparkEngine/Source/Engine/Physics/JoltPhysicsInterface.h#L184) | Interface for receiving collision callbacks | | `ICVar` | class | SparkEngine | [ConsoleVariable.h:L105](../../SparkEngine/Source/Utils/ConsoleVariable.h#L105) | | | `ICVar` | class | Tests | [TestConsoleVariables.cpp:L54](../../Tests/TestConsoleVariables.cpp#L54) | | @@ -20919,7 +20950,7 @@ | `IEngineContext` | class | GameModules | [RacingRaceFlow.h:L12](../../GameModules/SparkGameRacing/Source/Core/RacingRaceFlow.h#L12) | | | `IEngineContext` | class | GameModules | [VisualScriptDemoWorld.h:L25](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.h#L25) | | | `IEngineContext` | class | SparkEngine | [ModuleHotReload.h:L19](../../SparkEngine/Source/Core/ModuleHotReload.h#L19) | | -| `IEngineContext` | class | SparkSDK | [IEngineContext.h:L121](../../SparkSDK/Include/Spark/IEngineContext.h#L121) | | +| `IEngineContext` | class | SparkSDK | [IEngineContext.h:L122](../../SparkSDK/Include/Spark/IEngineContext.h#L122) | | | `ieq` | function | SparkEngine | [RHIBridge.cpp:L43](../../SparkEngine/Source/Graphics/RHI/RHIBridge.cpp#L43) | | | `IFPSWeatherPort` | class | GameModules | [FPSWeatherPort.h:L21](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherPort.h#L21) | | | `IFreezable` | class | SparkEngine | [FreezeSystem.h:L186](../../SparkEngine/Source/Engine/SaveSystem/FreezeSystem.h#L186) | Interface for subsystems that participate in save state serialization. | @@ -20946,7 +20977,7 @@ | `IKChain` | struct | SparkEngine | [IKSolver.h:L44](../../SparkEngine/Source/Engine/Animation/IKSolver.h#L44) | | | `IKType` | enum | SparkEngine | [AnimationTypes.h:L386](../../SparkEngine/Source/Engine/Animation/AnimationTypes.h#L386) | IK solver algorithm variants. | | `IKType` | enum | SparkEngine | [IKSolver.h:L25](../../SparkEngine/Source/Engine/Animation/IKSolver.h#L25) | IK solver algorithm variants. | -| `ILogger` | class | SparkSDK | [IEngineContext.h:L78](../../SparkSDK/Include/Spark/IEngineContext.h#L78) | | +| `ILogger` | class | SparkSDK | [IEngineContext.h:L79](../../SparkSDK/Include/Spark/IEngineContext.h#L79) | | | `ILogger` | class | SparkSDK | [ILogger.h:L39](../../SparkSDK/Include/Spark/ILogger.h#L39) | Abstract logging interface for game modules | | `ILogSink` | class | SparkEngine | [Logger.h:L300](../../SparkEngine/Source/Utils/Logger.h#L300) | Interface for log output destinations | | `IM_COL32` | function | GameModules | [TFSquadHUD.cpp:L133](../../GameModules/SparkGameMMOFPS/Source/UI/TFSquadHUD.cpp#L133) | | @@ -20962,12 +20993,12 @@ | `IM_COL32` | function | GameModules | [RTSDemoPresentation.cpp:L64](../../GameModules/SparkGameRTS/Source/Demo/RTSDemoPresentation.cpp#L64) | | | `IM_COL32` | function | GameModules | [RTSDemoPresentation.cpp:L66](../../GameModules/SparkGameRTS/Source/Demo/RTSDemoPresentation.cpp#L66) | | | `IM_COL32` | function | SparkEditor | [EditorTheme.cpp:L1259](../../SparkEditor/Source/Core/EditorTheme.cpp#L1259) | | -| `IM_COL32` | function | SparkEditor | [AssetBrowserPanel.cpp:L152](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L152) | | -| `IM_COL32` | function | SparkEditor | [AssetBrowserPanel.cpp:L154](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L154) | | -| `IM_COL32` | function | SparkEditor | [AssetBrowserPanel.cpp:L156](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L156) | | -| `IM_COL32` | function | SparkEditor | [AssetBrowserPanel.cpp:L158](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L158) | | -| `IM_COL32` | function | SparkEditor | [AssetBrowserPanel.cpp:L160](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L160) | | -| `IM_COL32` | function | SparkEditor | [AssetBrowserPanel.cpp:L161](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L161) | | +| `IM_COL32` | function | SparkEditor | [AssetBrowserGrid.cpp:L47](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L47) | | +| `IM_COL32` | function | SparkEditor | [AssetBrowserGrid.cpp:L49](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L49) | | +| `IM_COL32` | function | SparkEditor | [AssetBrowserGrid.cpp:L51](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L51) | | +| `IM_COL32` | function | SparkEditor | [AssetBrowserGrid.cpp:L53](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L53) | | +| `IM_COL32` | function | SparkEditor | [AssetBrowserGrid.cpp:L55](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L55) | | +| `IM_COL32` | function | SparkEditor | [AssetBrowserGrid.cpp:L56](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L56) | | | `IM_COL32` | function | SparkEditor | [RegionMapEditorCanvas.cpp:L35](../../SparkEditor/Source/Panels/RegionMapEditorCanvas.cpp#L35) | | | `IM_COL32` | function | SparkEditor | [RegionMapEditorCanvas.cpp:L37](../../SparkEditor/Source/Panels/RegionMapEditorCanvas.cpp#L37) | | | `IM_COL32` | function | SparkEditor | [RegionMapEditorCanvas.cpp:L39](../../SparkEditor/Source/Panels/RegionMapEditorCanvas.cpp#L39) | | @@ -21036,7 +21067,7 @@ | `Impl` | struct | SparkEngine | [Process.h:L174](../../SparkEngine/Source/Utils/Process.h#L174) | | | `Import` | function | SparkEngine | [RenderGraph.h:L181](../../SparkEngine/Source/Graphics/RenderGraph.h#L181) | | | `ImportAnimation` | function | SparkEngine | [GLTFAnimationLoader.cpp:L299](../../SparkEngine/Source/Graphics/GLTFAnimationLoader.cpp#L299) | | -| `ImportAsset` | function | SparkEditor | [AssetBrowserPanel.h:L93](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L93) | Import a file into the current folder of the active project. | +| `ImportAsset` | function | SparkEditor | [AssetBrowserPanel.h:L94](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L94) | Import a file into the current folder of the active project. | | `ImportAssetDatabase` | function | SparkEditor | [AdvancedAssetPipeline.h:L412](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L412) | Import asset database | | `ImportChannel` | function | SparkEngine | [GLTFAnimationLoader.cpp:L211](../../SparkEngine/Source/Graphics/GLTFAnimationLoader.cpp#L211) | | | `ImportedCorners` | function | Tests | [TestENG220ObjImportReal.cpp:L156](../../Tests/TestENG220ObjImportReal.cpp#L156) | | @@ -21061,8 +21092,8 @@ | `ImVec2` | function | GameModules | [RTSDemoPresentation.cpp:L382](../../GameModules/SparkGameRTS/Source/Demo/RTSDemoPresentation.cpp#L382) | | | `ImVec2` | function | SparkEditor | [GameViewPanel.cpp:L547](../../SparkEditor/Source/Panels/GameViewPanel.cpp#L547) | | | `ImVec2` | function | SparkEditor | [GameViewPanel.cpp:L557](../../SparkEditor/Source/Panels/GameViewPanel.cpp#L557) | | -| `ImVec2` | function | SparkEditor | [MaterialEditorPreview.cpp:L166](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L166) | | -| `ImVec2` | function | SparkEditor | [MaterialEditorPreview.cpp:L168](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L168) | | +| `ImVec2` | function | SparkEditor | [MaterialEditorPreview.cpp:L167](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L167) | | +| `ImVec2` | function | SparkEditor | [MaterialEditorPreview.cpp:L169](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L169) | | | `ImVec2` | function | SparkEditor | [TimeOfDayPanel.cpp:L199](../../SparkEditor/Source/Panels/TimeOfDayPanel.cpp#L199) | | | `ImVec2` | function | SparkEditor | [TimeOfDayPanel.cpp:L206](../../SparkEditor/Source/Panels/TimeOfDayPanel.cpp#L206) | | | `ImVec2` | function | SparkEditor | [WeaponEditorPanel.cpp:L411](../../SparkEditor/Source/Panels/WeaponEditorPanel.cpp#L411) | | @@ -21118,10 +21149,10 @@ | `in` | function | Tests | [TestDATA120SecretsAtRest.cpp:L52](../../Tests/TestDATA120SecretsAtRest.cpp#L52) | | | `in` | function | Tests | [TestDATA120SecretsAtRest.cpp:L92](../../Tests/TestDATA120SecretsAtRest.cpp#L92) | | | `in` | function | Tests | [TestDATA120SecretsAtRest.cpp:L163](../../Tests/TestDATA120SecretsAtRest.cpp#L163) | | -| `in` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L370](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L370) | | -| `in` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L465](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L465) | | +| `in` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L372](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L372) | | +| `in` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L467](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L467) | | | `in` | function | Tests | [TestEditorSubsystems.cpp:L1636](../../Tests/TestEditorSubsystems.cpp#L1636) | | -| `in` | function | Tests | [TestEditorSubsystemsReal.cpp:L205](../../Tests/TestEditorSubsystemsReal.cpp#L205) | | +| `in` | function | Tests | [TestEditorSubsystemsReal.cpp:L228](../../Tests/TestEditorSubsystemsReal.cpp#L228) | | | `in` | function | Tests | [TestGameModuleMMO.cpp:L115](../../Tests/TestGameModuleMMO.cpp#L115) | | | `in` | function | Tests | [TestGoldenImageTest.cpp:L387](../../Tests/TestGoldenImageTest.cpp#L387) | | | `in` | function | Tests | [TestMOD320MMOPersistenceReal.cpp:L47](../../Tests/TestMOD320MMOPersistenceReal.cpp#L47) | | @@ -21131,7 +21162,7 @@ | `in` | function | Tests | [TestMOD390VisualScriptHotReloadReal.cpp:L111](../../Tests/TestMOD390VisualScriptHotReloadReal.cpp#L111) | | | `in` | function | Tests | [TestSEC100ChatAuditLogReal.cpp:L86](../../Tests/TestSEC100ChatAuditLogReal.cpp#L86) | | | `in` | function | Tests | [TestSEC4NarrowPathsReal.cpp:L120](../../Tests/TestSEC4NarrowPathsReal.cpp#L120) | | -| `in` | function | Tests | [TestSparkPak.cpp:L772](../../Tests/TestSparkPak.cpp#L772) | | +| `in` | function | Tests | [TestSparkPak.cpp:L788](../../Tests/TestSparkPak.cpp#L788) | | | `in` | function | Tests | [TestSparkServerHealth.cpp:L365](../../Tests/TestSparkServerHealth.cpp#L365) | | | `in` | function | Tests | [TestTF120Residency.cpp:L53](../../Tests/TestTF120Residency.cpp#L53) | | | `in` | function | Tests | [TestTF120SharedSaveRoot.cpp:L49](../../Tests/TestTF120SharedSaveRoot.cpp#L49) | | @@ -21160,10 +21191,11 @@ | `indent` | function | SparkEditor | [PerformanceProfiler.cpp:L882](../../SparkEditor/Source/Profiler/PerformanceProfiler.cpp#L882) | | | `indent` | function | SparkEditor | [PerformanceProfiler.cpp:L1586](../../SparkEditor/Source/Profiler/PerformanceProfiler.cpp#L1586) | | | `Indent` | function | SparkEditor | [JSONSceneSerializer.cpp:L281](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L281) | | -| `indent` | function | SparkEngine | [SceneManager.cpp:L1194](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1194) | | +| `indent` | function | SparkEngine | [SceneManager.cpp:L1332](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1332) | | | `Index` | function | SparkEditor | [ServiceTopologyController.h:L87](../../SparkEditor/Source/Panels/ServiceTopologyController.h#L87) | | | `IndexBuffer` | function | SparkEngine | [MakeDesc.h:L311](../../SparkEngine/Source/Graphics/MakeDesc.h#L311) | Index buffer descriptor | | `indexDist` | function | GameModules | [ARPGLootSystem.cpp:L175](../../GameModules/SparkGameARPG/Source/Loot/ARPGLootSystem.cpp#L175) | | +| `IndexedNode` | struct | SparkEngine | [VisualScriptEmitter.h:L149](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L149) | | | `IndexOf` | function | Tests | [TestENG200ScriptBindingsReal.cpp:L234](../../Tests/TestENG200ScriptBindingsReal.cpp#L234) | | | `IndexOfId` | function | GameModules | [TFDirectiveSystem.h:L112](../../GameModules/SparkGameMMOFPS/Source/Game/TFDirectiveSystem.h#L112) | | | `indices` | function | GameModules | [RacingRaceManager.cpp:L396](../../GameModules/SparkGameRacing/Source/Race/RacingRaceManager.cpp#L396) | | @@ -21187,9 +21219,9 @@ | `info` | struct | SparkEngine | [VirtualFileSystem.cpp:L307](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L307) | | | `info` | struct | SparkEngine | [CrashArtifactDirectory.h:L293](../../SparkEngine/Source/Utils/CrashArtifactDirectory.h#L293) | | | `info` | struct | SparkEngine | [CrashArtifactRetention.h:L183](../../SparkEngine/Source/Utils/CrashArtifactRetention.h#L183) | | -| `info` | struct | SparkEngine | [CrashHandler.cpp:L191](../../SparkEngine/Source/Utils/CrashHandler.cpp#L191) | | -| `info` | struct | SparkEngine | [CrashHandler.cpp:L353](../../SparkEngine/Source/Utils/CrashHandler.cpp#L353) | | -| `info` | struct | SparkEngine | [CrashHandler.cpp:L418](../../SparkEngine/Source/Utils/CrashHandler.cpp#L418) | | +| `info` | struct | SparkEngine | [CrashHandler.cpp:L192](../../SparkEngine/Source/Utils/CrashHandler.cpp#L192) | | +| `info` | struct | SparkEngine | [CrashHandler.cpp:L354](../../SparkEngine/Source/Utils/CrashHandler.cpp#L354) | | +| `info` | struct | SparkEngine | [CrashHandler.cpp:L419](../../SparkEngine/Source/Utils/CrashHandler.cpp#L419) | | | `info` | struct | SparkEngine | [SaveFileDurability.cpp:L114](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L114) | | | `info` | struct | SparkGateway | [GatewaySecurity.cpp:L310](../../SparkGateway/src/GatewaySecurity.cpp#L310) | | | `info` | struct | SparkInstaller | [Installer.cpp:L72](../../SparkInstaller/src/Installer.cpp#L72) | | @@ -21333,7 +21365,7 @@ | `Initialize` | function | GameModules | [TFVehicleTerminal.h:L41](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleTerminal.h#L41) | | | `Initialize` | function | GameModules | [TFWeaponSystem.h:L46](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L46) | | | `Initialize` | function | GameModules | [TFClientNet.h:L76](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L76) | | -| `Initialize` | function | GameModules | [TFReplication.h:L59](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L59) | | +| `Initialize` | function | GameModules | [TFReplication.h:L63](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L63) | | | `Initialize` | function | GameModules | [TFServerSim.h:L60](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L60) | | | `Initialize` | function | GameModules | [TFChatWindow.h:L45](../../GameModules/SparkGameMMOFPS/Source/UI/TFChatWindow.h#L45) | | | `Initialize` | function | GameModules | [TFDeathRecap.h:L65](../../GameModules/SparkGameMMOFPS/Source/UI/TFDeathRecap.h#L65) | | @@ -21418,7 +21450,7 @@ | `Initialize` | function | SparkEditor | [AIEditorPanel.h:L28](../../SparkEditor/Source/Panels/AIEditorPanel.h#L28) | | | `Initialize` | function | SparkEditor | [AbilityEditorPanel.h:L29](../../SparkEditor/Source/Panels/AbilityEditorPanel.h#L29) | | | `Initialize` | function | SparkEditor | [AssetAuditGraph.h:L131](../../SparkEditor/Source/Panels/AssetAuditGraph.h#L131) | Initialize the dependency graph | -| `Initialize` | function | SparkEditor | [AssetBrowserPanel.h:L43](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L43) | Initialize the asset browser panel | +| `Initialize` | function | SparkEditor | [AssetBrowserPanel.h:L44](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L44) | Initialize the asset browser panel | | `Initialize` | function | SparkEditor | [AudioMixerPanel.h:L28](../../SparkEditor/Source/Panels/AudioMixerPanel.h#L28) | | | `Initialize` | function | SparkEditor | [BasicMaterialEditorPanel.h:L47](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L47) | | | `Initialize` | function | SparkEditor | [BuildCookPanel.h:L109](../../SparkEditor/Source/Panels/BuildCookPanel.h#L109) | | @@ -21707,7 +21739,7 @@ | `Initialize` | function | SparkEngine | [VoxelConeTracing.h:L325](../../SparkEngine/Source/Graphics/VoxelConeTracing.h#L325) | | | `Initialize` | function | SparkEngine | [WaterRenderer.h:L145](../../SparkEngine/Source/Graphics/WaterRenderer.h#L145) | Initialize the water renderer and generate default wave components. | | `Initialize` | function | SparkEngine | [InputActionSystem.h:L139](../../SparkEngine/Source/Input/InputActionSystem.h#L139) | Initialize the input action system | -| `Initialize` | function | SparkEngine | [InputManager.h:L131](../../SparkEngine/Source/Input/InputManager.h#L131) | Initialize the input manager with window handle | +| `Initialize` | function | SparkEngine | [InputManager.h:L133](../../SparkEngine/Source/Input/InputManager.h#L133) | Initialize the input manager with window handle | | `Initialize` | function | SparkEngine | [PlatformInput.h:L194](../../SparkEngine/Source/Input/PlatformInput.h#L194) | Initialize the backend. @return true on success. | | `Initialize` | function | SparkEngine | [PlatformInput.h:L249](../../SparkEngine/Source/Input/PlatformInput.h#L249) | No-op input backend for headless mode and unit tests. | | `Initialize` | function | SparkEngine | [IPhysicsBackend.h:L93](../../SparkEngine/Source/Physics/IPhysicsBackend.h#L93) | | @@ -21782,8 +21814,8 @@ | `InitializeAll` | function | SparkEngine | [PluginRegistry.h:L50](../../SparkEngine/Source/Core/PluginRegistry.h#L50) | Initialize all registered plugins (calls each initFn) | | `InitializeAll` | function | Tests | [TestECSystemOrdering.cpp:L217](../../Tests/TestECSystemOrdering.cpp#L217) | | | `InitializeBasicShaders` | function | SparkEngine | [GraphicsEngine.h:L1336](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L1336) | | -| `InitializeCommandPalette` | function | SparkEditor | [EditorUI.h:L515](../../SparkEditor/Source/Core/EditorUI.h#L515) | | -| `InitializeCrashArtifactDirectory` | function | SparkEngine | [CrashHandler.cpp:L533](../../SparkEngine/Source/Utils/CrashHandler.cpp#L533) | | +| `InitializeCommandPalette` | function | SparkEditor | [EditorUI.h:L513](../../SparkEditor/Source/Core/EditorUI.h#L513) | | +| `InitializeCrashArtifactDirectory` | function | SparkEngine | [CrashHandler.cpp:L534](../../SparkEngine/Source/Utils/CrashHandler.cpp#L534) | | | `InitializeDaemonLifecycle` | function | SparkEngine | [DaemonLifecycle.cpp:L296](../../SparkEngine/Source/Utils/DaemonLifecycle.cpp#L296) | | | `InitializeDaemonLifecycle` | function | SparkEngine | [DaemonLifecycle.h:L34](../../SparkEngine/Source/Utils/DaemonLifecycle.h#L34) | Called during engine startup (after InitGameplaySystems). | | `InitializeDebugSystemsImpl` | function | SparkEngine | [GameplayLifecycleShared.cpp:L361](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L361) | | @@ -21797,12 +21829,12 @@ | `InitializeDeferredLighting` | function | SparkEngine | [GraphicsEngine.h:L1348](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L1348) | | | `InitializeEcsPhaseSystemsImpl` | function | SparkEngine | [GameplayLifecycleShared.cpp:L904](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L904) | | | `InitializeEcsPhaseSystemsImpl` | function | SparkEngine | [GameplayLifecycleShared.h:L56](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.h#L56) | | -| `InitializeEnemies` | function | GameModules | [Game.h:L675](../../GameModules/SparkGameFPS/Source/Game/Game.h#L675) | Spawn enemy waves in the arena | -| `InitializeEngineSystems` | function | GameModules | [Game.h:L681](../../GameModules/SparkGameFPS/Source/Game/Game.h#L681) | Wire audio, weather, destruction, dialogue, and save systems | +| `InitializeEnemies` | function | GameModules | [Game.h:L699](../../GameModules/SparkGameFPS/Source/Game/Game.h#L699) | Spawn enemy waves in the arena | +| `InitializeEngineSystems` | function | GameModules | [Game.h:L705](../../GameModules/SparkGameFPS/Source/Game/Game.h#L705) | Wire audio, weather, destruction, dialogue, and save systems | | `InitializeFromContext` | function | GameModules | [SparkGameFPS.h:L66](../../GameModules/SparkGameFPS/Source/Core/SparkGameFPS.h#L66) | | | `InitializeFromDevice` | function | SparkEngine | [GraphicsEngine.h:L222](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L222) | | -| `InitializeGameModeAndHUD` | function | GameModules | [Game.h:L663](../../GameModules/SparkGameFPS/Source/Game/Game.h#L663) | Initialize GameMode, HUD, and wire event callbacks | -| `InitializeGameplaySystems` | function | GameModules | [Game.h:L678](../../GameModules/SparkGameFPS/Source/Game/Game.h#L678) | Initialize wave spawner, progression, and loot systems | +| `InitializeGameModeAndHUD` | function | GameModules | [Game.h:L687](../../GameModules/SparkGameFPS/Source/Game/Game.h#L687) | Initialize GameMode, HUD, and wire event callbacks | +| `InitializeGameplaySystems` | function | GameModules | [Game.h:L702](../../GameModules/SparkGameFPS/Source/Game/Game.h#L702) | Initialize wave spawner, progression, and loot systems | | `InitializeGameplaySystemsImpl` | function | SparkEngine | [GameplayLifecycleShared.cpp:L921](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L921) | | | `InitializeGameplaySystemsImpl` | function | SparkEngine | [GameplayLifecycleShared.h:L50](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.h#L50) | | | `InitializeGPU` | function | SparkEngine | [TemporalEffects.h:L185](../../SparkEngine/Source/Graphics/TemporalEffects.h#L185) | Initialize GPU resources for temporal effects | @@ -21810,40 +21842,42 @@ | `InitializeGraphicsForWindow` | function | SparkEngine | [SparkEngineLinuxSDL2.cpp:L80](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2.cpp#L80) | Construct and initialize GraphicsEngine against the given window / | | `InitializeHeadlessAssetServices` | function | SparkEngine | [EngineRuntime.h:L128](../../SparkEngine/Source/Core/EngineRuntime.h#L128) | Create and register the CPU-only asset services required by modules. | | `InitializeImGui` | function | SparkEditor | [EditorApplication.h:L125](../../SparkEditor/Source/Core/EditorApplication.h#L125) | | -| `InitializeInteractionObjects` | function | GameModules | [Game.h:L660](../../GameModules/SparkGameFPS/Source/Game/Game.h#L660) | Initialize interactive objects (doors, pickups, jump pads, etc.) | -| `InitializeInventorySystem` | function | GameModules | [Game.h:L666](../../GameModules/SparkGameFPS/Source/Game/Game.h#L666) | Register item definitions and configure player inventory | +| `InitializeInteractionObjects` | function | GameModules | [Game.h:L684](../../GameModules/SparkGameFPS/Source/Game/Game.h#L684) | Initialize interactive objects (doors, pickups, jump pads, etc.) | +| `InitializeInventorySystem` | function | GameModules | [Game.h:L690](../../GameModules/SparkGameFPS/Source/Game/Game.h#L690) | Register item definitions and configure player inventory | | `InitializeJobSystem` | function | SparkEngine | [EngineSetup.h:L94](../../SparkEngine/Source/Core/EngineSetup.h#L94) | Initialize the JobSystem with optimal thread count. | | `InitializeLFS` | function | SparkEditor | [VersionControlSystem.h:L463](../../SparkEditor/Source/VersionControl/VersionControlSystem.h#L463) | Initialize LFS if needed | | `InitializeLifecycleTestSystem` | function | Tests | [TestMemoryIntegrityLifecycle.cpp:L17](../../Tests/TestMemoryIntegrityLifecycle.cpp#L17) | | -| `InitializeManagers` | function | SparkEditor | [EditorUI.h:L519](../../SparkEditor/Source/Core/EditorUI.h#L519) | | +| `InitializeManagers` | function | SparkEditor | [EditorUI.h:L517](../../SparkEditor/Source/Core/EditorUI.h#L517) | | | `InitializeNetworkingSystemsImpl` | function | SparkEngine | [GameplayLifecycleShared.cpp:L883](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L883) | | | `InitializeNetworkingSystemsImpl` | function | SparkEngine | [GameplayLifecycleShared.h:L31](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.h#L31) | | | `InitializeOnLayoutFixtures` | function | Tests | [TestEditorStateCompatibility.cpp:L331](../../Tests/TestEditorStateCompatibility.cpp#L331) | | | `InitializeOnly` | function | SparkEngine | [DedicatedServer.h:L248](../../SparkEngine/Source/Engine/Networking/DedicatedServer.h#L248) | Initialize the server without starting the background | -| `InitializePanelCategories` | function | SparkEditor | [EditorUI.h:L513](../../SparkEditor/Source/Core/EditorUI.h#L513) | | -| `InitializePanelIcons` | function | SparkEditor | [EditorUI.h:L512](../../SparkEditor/Source/Core/EditorUI.h#L512) | | +| `InitializePanelCategories` | function | SparkEditor | [EditorUI.h:L511](../../SparkEditor/Source/Core/EditorUI.h#L511) | | +| `InitializePanelIcons` | function | SparkEditor | [EditorUI.h:L510](../../SparkEditor/Source/Core/EditorUI.h#L510) | | | `InitializePhysicsAndEcs` | function | Tests | [TestSubsystemIntegrationScenarios.cpp:L40](../../Tests/Integration/TestSubsystemIntegrationScenarios.cpp#L40) | | | `InitializePlayer` | function | GameModules | [RTSResourceSystem.h:L64](../../GameModules/SparkGameRTS/Source/Resource/RTSResourceSystem.h#L64) | | | `InitializePlayerProgress` | function | GameModules | [MMOGameplaySession.h:L69](../../GameModules/SparkGameMMO/Source/Gameplay/MMOGameplaySession.h#L69) | | | `InitializePlayerRep` | function | GameModules | [MMOReputationSystem.h:L80](../../GameModules/SparkGameMMO/Source/Reputation/MMOReputationSystem.h#L80) | | | `InitializePlayerState` | function | GameModules | [MMOAchievementSystem.h:L98](../../GameModules/SparkGameMMO/Source/Achievement/MMOAchievementSystem.h#L98) | | | `InitializeProductionLifecycle` | function | Tests | [TestEngineWiringReal.cpp:L81](../../Tests/TestEngineWiringReal.cpp#L81) | | -| `InitializeQuestSystem` | function | GameModules | [Game.h:L669](../../GameModules/SparkGameFPS/Source/Game/Game.h#L669) | Register quest definitions and start initial quests | +| `InitializeQuestSystem` | function | GameModules | [Game.h:L693](../../GameModules/SparkGameFPS/Source/Game/Game.h#L693) | Register quest definitions and start initial quests | | `InitializeRandom` | function | SparkEngine | [MathUtilsExtended.h:L60](../../SparkEngine/Source/Utils/MathUtilsExtended.h#L60) | Seed the random number generator from the system clock. | | `InitializeRayTracing` | function | SparkEngine | [MetalInterop.h:L19](../../SparkEngine/Source/Graphics/RHI/Metal/MetalInterop.h#L19) | | | `InitializeRayTracing` | function | SparkEngine | [MetalInterop.mm:L20](../../SparkEngine/Source/Graphics/RHI/Metal/MetalInterop.mm#L20) | | | `InitializeRepository` | function | SparkEditor | [VersionControlSystem.h:L92](../../SparkEditor/Source/VersionControl/VersionControlSystem.h#L92) | Initialize repository in directory | -| `InitializeRespawnAndVehicles` | function | GameModules | [Game.h:L672](../../GameModules/SparkGameFPS/Source/Game/Game.h#L672) | Initialize respawn points and spawn vehicles | +| `InitializeRespawnAndVehicles` | function | GameModules | [Game.h:L696](../../GameModules/SparkGameFPS/Source/Game/Game.h#L696) | Initialize respawn points and spawn vehicles | | `InitializeScriptingServiceImpl` | function | SparkEngine | [GameplayLifecycleShared.cpp:L784](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L784) | | | `InitializeScriptingServiceImpl` | function | SparkEngine | [GameplayLifecycleShared.h:L41](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.h#L41) | | | `InitializeSDL2Subsystems` | function | SparkEngine | [SparkEngineLinuxSDL2.cpp:L110](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2.cpp#L110) | | | `InitializeStage` | function | SparkEngine | [LifecycleCompositionRoot.h:L125](../../SparkEngine/Source/Core/Lifecycle/LifecycleCompositionRoot.h#L125) | | +| `InitializeStandardPBRParameters` | function | SparkEditor | [MaterialEditorDefaults.cpp:L9](../../SparkEditor/Source/Panels/MaterialEditorDefaults.cpp#L9) | Shared standard PBR schema used by authoring, decoding, and fuzzing. | +| `InitializeStandardPBRParameters` | function | SparkEditor | [MaterialEditorMaterialParser.h:L13](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.h#L13) | Append the editor's standard PBR parameters and texture slots. | | `InitializeSystems` | function | Tests | [SessionGatePeer.cpp:L230](../../Tests/Fixtures/SessionGatePeer.cpp#L230) | | | `InitializeValidated` | function | Tests | [TestRHI225D3D12ValidationReal.cpp:L103](../../Tests/TestRHI225D3D12ValidationReal.cpp#L103) | | | `InitializeWeightsXavier` | function | SparkEngine | [CpuNeuralTraining.h:L127](../../SparkEngine/Source/Graphics/Neural/CpuNeuralTraining.h#L127) | Fill @p weights with Xavier/Glorot-normal init, biases zero. | | `InitializeWindowedSubsystems` | function | SparkEngine | [SparkEngineWindowsInit.cpp:L211](../../SparkEngine/Source/Core/SparkEngineWindowsInit.cpp#L211) | | | `InitializeWindowedSubsystems` | function | SparkEngine | [SparkEngineWindowsInternal.h:L91](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L91) | Initialize windowed-mode subsystems, load modules, register commands. | -| `InitialLattice` | function | Tests | [TestTFRegionLattice.cpp:L134](../../Tests/TestTFRegionLattice.cpp#L134) | | +| `InitialLattice` | function | Tests | [TestTFRegionLattice.cpp:L127](../../Tests/TestTFRegionLattice.cpp#L127) | | | `InitInstance` | function | SparkEngine | [SparkEngineWindowsInternal.h:L103](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L103) | Run the engine in headless/dedicated server mode (Windows). | | `InitInstance` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L336](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L336) | | | `InitJet` | function | GameModules | [VehicleSystem.h:L352](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L352) | | @@ -21915,11 +21949,12 @@ | `input` | function | SparkDaemon | [OrchestrationJournal.cpp:L135](../../SparkDaemon/src/OrchestrationJournal.cpp#L135) | | | `input` | function | SparkDaemon | [OrchestrationJournal.cpp:L155](../../SparkDaemon/src/OrchestrationJournal.cpp#L155) | | | `input` | function | SparkDaemon | [ServiceTests.cpp:L519](../../SparkDaemon/tests/ServiceTests.cpp#L519) | | +| `input` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L234](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L234) | | | `input` | function | SparkEditor | [RegionMapDataSource.cpp:L46](../../SparkEditor/Source/Panels/RegionMapDataSource.cpp#L46) | | | `input` | function | SparkEditor | [PrefabAsset.cpp:L67](../../SparkEditor/Source/Prefabs/PrefabAsset.cpp#L67) | | | `input` | function | SparkEngine | [ExecScript.cpp:L58](../../SparkEngine/Source/Core/ExecScript.cpp#L58) | | | `input` | function | SparkEngine | [ReflectedScenePersistence.cpp:L58](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L58) | | -| `input` | function | SparkEngine | [SceneManagerReflected.cpp:L24](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L24) | | +| `input` | function | SparkEngine | [SceneManagerReflected.cpp:L36](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L36) | | | `input` | function | SparkEngine | [SaveFileDurability.cpp:L410](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L410) | | | `input` | function | SparkGateway | [GatewayAreaControl.cpp:L1272](../../SparkGateway/src/GatewayAreaControl.cpp#L1272) | | | `input` | function | SparkGateway | [GatewayAreaControl.cpp:L1375](../../SparkGateway/src/GatewayAreaControl.cpp#L1375) | | @@ -21942,8 +21977,10 @@ | `input` | function | Tests | [TestEditorSubsystems.cpp:L1334](../../Tests/TestEditorSubsystems.cpp#L1334) | | | `input` | function | Tests | [TestEditorSubsystems.cpp:L1357](../../Tests/TestEditorSubsystems.cpp#L1357) | | | `input` | function | Tests | [TestExecScript.cpp:L56](../../Tests/TestExecScript.cpp#L56) | | +| `input` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L62](../../Tests/TestFPSOwnedSaveDecode.cpp#L62) | | | `input` | function | Tests | [TestFileUtils.cpp:L531](../../Tests/TestFileUtils.cpp#L531) | | | `input` | function | Tests | [TestGamePackager.cpp:L242](../../Tests/TestGamePackager.cpp#L242) | | +| `input` | function | Tests | [TestInputFrameEdgesReal.cpp:L44](../../Tests/TestInputFrameEdgesReal.cpp#L44) | | | `input` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L272](../../Tests/TestLIFE200ModuleReloadReal.cpp#L272) | | | `input` | function | Tests | [TestLauncherProcess.cpp:L81](../../Tests/TestLauncherProcess.cpp#L81) | | | `input` | function | Tests | [TestMOD300ShowcaseLocalizationReal.cpp:L64](../../Tests/TestMOD300ShowcaseLocalizationReal.cpp#L64) | | @@ -21988,7 +22025,7 @@ | `InputActionEvent` | struct | SparkEngine | [EventSystem.h:L235](../../SparkEngine/Source/Engine/Events/EventSystem.h#L235) | Fired when a named input action is pressed or released. | | `InputActionMap` | class | SparkEngine | [PlatformInput.h:L283](../../SparkEngine/Source/Input/PlatformInput.h#L283) | Maps named actions to physical key bindings with frame-edge detection. | | `InputActionSystem` | class | SparkEngine | [InputActionSystem.h:L129](../../SparkEngine/Source/Input/InputActionSystem.h#L129) | Data-driven input action system with rebindable controls | -| `InputAt` | function | Tests | [TestTF120Travel.cpp:L145](../../Tests/TestTF120Travel.cpp#L145) | | +| `InputAt` | function | Tests | [TestTF120Travel.cpp:L132](../../Tests/TestTF120Travel.cpp#L132) | | | `inputBatch` | function | SparkEngine | [NeuralTextureCompressor.cpp:L167](../../SparkEngine/Source/Graphics/Neural/NeuralTextureCompressor.cpp#L167) | | | `InputBinding` | struct | SparkEngine | [InputActionSystem.h:L76](../../SparkEngine/Source/Input/InputActionSystem.h#L76) | A single key/button binding to an action | | `InputBinding` | struct | SparkEngine | [InputBindings.h:L44](../../SparkEngine/Source/Input/InputBindings.h#L44) | Represents a single input binding — a key or button mapped to an action. | @@ -22014,69 +22051,70 @@ | `InputManager` | class | GameModules | [FPSArenaAutopilot.h:L37](../../GameModules/SparkGameFPS/Source/Game/FPSArenaAutopilot.h#L37) | | | `InputManager` | class | GameModules | [Game.h:L55](../../GameModules/SparkGameFPS/Source/Game/Game.h#L55) | | | `InputManager` | class | GameModules | [VehicleSystem.h:L32](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L32) | | -| `InputManager` | class | SparkEngine | [EngineContext.h:L40](../../SparkEngine/Source/Core/EngineContext.h#L40) | | +| `InputManager` | class | SparkEngine | [EngineContext.h:L41](../../SparkEngine/Source/Core/EngineContext.h#L41) | | | `InputManager` | class | SparkEngine | [EngineRuntime.h:L29](../../SparkEngine/Source/Core/EngineRuntime.h#L29) | | | `InputManager` | class | SparkEngine | [IGameModule.h:L20](../../SparkEngine/Source/Core/IGameModule.h#L20) | | | `InputManager` | class | SparkEngine | [SparkEngine.h:L25](../../SparkEngine/Source/Core/SparkEngine.h#L25) | | | `InputManager` | class | SparkEngine | [InputManager.h:L49](../../SparkEngine/Source/Input/InputManager.h#L49) | | | `InputManager` | class | SparkEngine | [SceneManager.h:L84](../../SparkEngine/Source/SceneManager/SceneManager.h#L84) | | -| `InputManager` | class | SparkSDK | [IEngineContext.h:L23](../../SparkSDK/Include/Spark/IEngineContext.h#L23) | | -| `InputManager::ApplyDueTimedKeyReleases` | method | SparkEngine | [InputManager.cpp:L492](../../SparkEngine/Source/Input/InputManager.cpp#L492) | | -| `InputManager::CaptureMouse` | method | SparkEngine | [InputManager.cpp:L873](../../SparkEngine/Source/Input/InputManager.cpp#L873) | | -| `InputManager::CaptureMouse` | method | SparkEngine | [InputManager.cpp:L1006](../../SparkEngine/Source/Input/InputManager.cpp#L1006) | | -| `InputManager::Console_ApplySettings` | method | SparkEngine | [InputManager.cpp:L627](../../SparkEngine/Source/Input/InputManager.cpp#L627) | | -| `InputManager::Console_BindKey` | method | SparkEngine | [InputManager.cpp:L398](../../SparkEngine/Source/Input/InputManager.cpp#L398) | | -| `InputManager::Console_ClearInputStates` | method | SparkEngine | [InputManager.cpp:L526](../../SparkEngine/Source/Input/InputManager.cpp#L526) | | -| `InputManager::Console_GetMetrics` | method | SparkEngine | [InputManager.cpp:L606](../../SparkEngine/Source/Input/InputManager.cpp#L606) | | -| `InputManager::Console_GetRecentEvents` | method | SparkEngine | [InputManager.cpp:L540](../../SparkEngine/Source/Input/InputManager.cpp#L540) | | -| `InputManager::Console_GetSettings` | method | SparkEngine | [InputManager.cpp:L611](../../SparkEngine/Source/Input/InputManager.cpp#L611) | | -| `InputManager::Console_IsActionActive` | method | SparkEngine | [InputManager.cpp:L562](../../SparkEngine/Source/Input/InputManager.cpp#L562) | | -| `InputManager::Console_ListKeyBindings` | method | SparkEngine | [InputManager.cpp:L445](../../SparkEngine/Source/Input/InputManager.cpp#L445) | | -| `InputManager::Console_RefreshInput` | method | SparkEngine | [InputManager.cpp:L672](../../SparkEngine/Source/Input/InputManager.cpp#L672) | | -| `InputManager::Console_RegisterStateCallback` | method | SparkEngine | [InputManager.cpp:L665](../../SparkEngine/Source/Input/InputManager.cpp#L665) | | -| `InputManager::Console_ResetToDefaults` | method | SparkEngine | [InputManager.cpp:L647](../../SparkEngine/Source/Input/InputManager.cpp#L647) | | -| `InputManager::Console_SetInputLogging` | method | SparkEngine | [InputManager.cpp:L387](../../SparkEngine/Source/Input/InputManager.cpp#L387) | | -| `InputManager::Console_SetInvertMouseY` | method | SparkEngine | [InputManager.cpp:L369](../../SparkEngine/Source/Input/InputManager.cpp#L369) | | -| `InputManager::Console_SetMouseAcceleration` | method | SparkEngine | [InputManager.cpp:L360](../../SparkEngine/Source/Input/InputManager.cpp#L360) | | -| `InputManager::Console_SetMouseDeadZone` | method | SparkEngine | [InputManager.cpp:L344](../../SparkEngine/Source/Input/InputManager.cpp#L344) | | -| `InputManager::Console_SetMouseSensitivity` | method | SparkEngine | [InputManager.cpp:L328](../../SparkEngine/Source/Input/InputManager.cpp#L328) | | -| `InputManager::Console_SetRawMouseInput` | method | SparkEngine | [InputManager.cpp:L378](../../SparkEngine/Source/Input/InputManager.cpp#L378) | | -| `InputManager::Console_SimulateKeyPress` | method | SparkEngine | [InputManager.cpp:L462](../../SparkEngine/Source/Input/InputManager.cpp#L462) | | -| `InputManager::Console_UnbindKey` | method | SparkEngine | [InputManager.cpp:L427](../../SparkEngine/Source/Input/InputManager.cpp#L427) | | -| `InputManager::GetMetricsThreadSafe` | method | SparkEngine | [InputManager.cpp:L571](../../SparkEngine/Source/Input/InputManager.cpp#L571) | | -| `InputManager::GetMouseDelta` | method | SparkEngine | [InputManager.cpp:L263](../../SparkEngine/Source/Input/InputManager.cpp#L263) | | -| `InputManager::GetMousePosition` | method | SparkEngine | [InputManager.cpp:L268](../../SparkEngine/Source/Input/InputManager.cpp#L268) | | -| `InputManager::GetPendingTimedKeyReleaseCount` | method | SparkEngine | [InputManager.cpp:L520](../../SparkEngine/Source/Input/InputManager.cpp#L520) | | -| `InputManager::HandleMessage` | method | SparkEngine | [InputManager.cpp:L821](../../SparkEngine/Source/Input/InputManager.cpp#L821) | | -| `InputManager::HandleMessage` | method | SparkEngine | [InputManager.cpp:L961](../../SparkEngine/Source/Input/InputManager.cpp#L961) | | -| `InputManager::HandleMouseButtonMessage` | method | SparkEngine | [InputManager.cpp:L812](../../SparkEngine/Source/Input/InputManager.cpp#L812) | | -| `InputManager::Initialize` | method | SparkEngine | [InputManager.cpp:L706](../../SparkEngine/Source/Input/InputManager.cpp#L706) | | -| `InputManager::Initialize` | method | SparkEngine | [InputManager.cpp:L944](../../SparkEngine/Source/Input/InputManager.cpp#L944) | | -| `InputManager::IsKeyDown` | method | SparkEngine | [InputManager.cpp:L198](../../SparkEngine/Source/Input/InputManager.cpp#L198) | | -| `InputManager::IsKeyUp` | method | SparkEngine | [InputManager.cpp:L205](../../SparkEngine/Source/Input/InputManager.cpp#L205) | | -| `InputManager::IsMouseButtonDown` | method | SparkEngine | [InputManager.cpp:L228](../../SparkEngine/Source/Input/InputManager.cpp#L228) | | +| `InputManager` | class | SparkSDK | [IEngineContext.h:L24](../../SparkSDK/Include/Spark/IEngineContext.h#L24) | | +| `InputManager::ApplyDueTimedKeyReleases` | method | SparkEngine | [InputManager.cpp:L515](../../SparkEngine/Source/Input/InputManager.cpp#L515) | | +| `InputManager::CaptureMouse` | method | SparkEngine | [InputManager.cpp:L896](../../SparkEngine/Source/Input/InputManager.cpp#L896) | | +| `InputManager::CaptureMouse` | method | SparkEngine | [InputManager.cpp:L1029](../../SparkEngine/Source/Input/InputManager.cpp#L1029) | | +| `InputManager::Console_ApplySettings` | method | SparkEngine | [InputManager.cpp:L650](../../SparkEngine/Source/Input/InputManager.cpp#L650) | | +| `InputManager::Console_BindKey` | method | SparkEngine | [InputManager.cpp:L421](../../SparkEngine/Source/Input/InputManager.cpp#L421) | | +| `InputManager::Console_ClearInputStates` | method | SparkEngine | [InputManager.cpp:L549](../../SparkEngine/Source/Input/InputManager.cpp#L549) | | +| `InputManager::Console_GetMetrics` | method | SparkEngine | [InputManager.cpp:L629](../../SparkEngine/Source/Input/InputManager.cpp#L629) | | +| `InputManager::Console_GetRecentEvents` | method | SparkEngine | [InputManager.cpp:L563](../../SparkEngine/Source/Input/InputManager.cpp#L563) | | +| `InputManager::Console_GetSettings` | method | SparkEngine | [InputManager.cpp:L634](../../SparkEngine/Source/Input/InputManager.cpp#L634) | | +| `InputManager::Console_IsActionActive` | method | SparkEngine | [InputManager.cpp:L585](../../SparkEngine/Source/Input/InputManager.cpp#L585) | | +| `InputManager::Console_ListKeyBindings` | method | SparkEngine | [InputManager.cpp:L468](../../SparkEngine/Source/Input/InputManager.cpp#L468) | | +| `InputManager::Console_RefreshInput` | method | SparkEngine | [InputManager.cpp:L695](../../SparkEngine/Source/Input/InputManager.cpp#L695) | | +| `InputManager::Console_RegisterStateCallback` | method | SparkEngine | [InputManager.cpp:L688](../../SparkEngine/Source/Input/InputManager.cpp#L688) | | +| `InputManager::Console_ResetToDefaults` | method | SparkEngine | [InputManager.cpp:L670](../../SparkEngine/Source/Input/InputManager.cpp#L670) | | +| `InputManager::Console_SetInputLogging` | method | SparkEngine | [InputManager.cpp:L410](../../SparkEngine/Source/Input/InputManager.cpp#L410) | | +| `InputManager::Console_SetInvertMouseY` | method | SparkEngine | [InputManager.cpp:L392](../../SparkEngine/Source/Input/InputManager.cpp#L392) | | +| `InputManager::Console_SetMouseAcceleration` | method | SparkEngine | [InputManager.cpp:L383](../../SparkEngine/Source/Input/InputManager.cpp#L383) | | +| `InputManager::Console_SetMouseDeadZone` | method | SparkEngine | [InputManager.cpp:L367](../../SparkEngine/Source/Input/InputManager.cpp#L367) | | +| `InputManager::Console_SetMouseSensitivity` | method | SparkEngine | [InputManager.cpp:L351](../../SparkEngine/Source/Input/InputManager.cpp#L351) | | +| `InputManager::Console_SetRawMouseInput` | method | SparkEngine | [InputManager.cpp:L401](../../SparkEngine/Source/Input/InputManager.cpp#L401) | | +| `InputManager::Console_SimulateKeyPress` | method | SparkEngine | [InputManager.cpp:L485](../../SparkEngine/Source/Input/InputManager.cpp#L485) | | +| `InputManager::Console_UnbindKey` | method | SparkEngine | [InputManager.cpp:L450](../../SparkEngine/Source/Input/InputManager.cpp#L450) | | +| `InputManager::GetMetricsThreadSafe` | method | SparkEngine | [InputManager.cpp:L594](../../SparkEngine/Source/Input/InputManager.cpp#L594) | | +| `InputManager::GetMouseDelta` | method | SparkEngine | [InputManager.cpp:L286](../../SparkEngine/Source/Input/InputManager.cpp#L286) | | +| `InputManager::GetMousePosition` | method | SparkEngine | [InputManager.cpp:L291](../../SparkEngine/Source/Input/InputManager.cpp#L291) | | +| `InputManager::GetPendingTimedKeyReleaseCount` | method | SparkEngine | [InputManager.cpp:L543](../../SparkEngine/Source/Input/InputManager.cpp#L543) | | +| `InputManager::HandleMessage` | method | SparkEngine | [InputManager.cpp:L844](../../SparkEngine/Source/Input/InputManager.cpp#L844) | | +| `InputManager::HandleMessage` | method | SparkEngine | [InputManager.cpp:L984](../../SparkEngine/Source/Input/InputManager.cpp#L984) | | +| `InputManager::HandleMouseButtonMessage` | method | SparkEngine | [InputManager.cpp:L835](../../SparkEngine/Source/Input/InputManager.cpp#L835) | | +| `InputManager::Initialize` | method | SparkEngine | [InputManager.cpp:L729](../../SparkEngine/Source/Input/InputManager.cpp#L729) | | +| `InputManager::Initialize` | method | SparkEngine | [InputManager.cpp:L967](../../SparkEngine/Source/Input/InputManager.cpp#L967) | | +| `InputManager::IsFrameKeyDown` | method | SparkEngine | [InputManager.cpp:L233](../../SparkEngine/Source/Input/InputManager.cpp#L233) | | +| `InputManager::IsKeyDown` | method | SparkEngine | [InputManager.cpp:L222](../../SparkEngine/Source/Input/InputManager.cpp#L222) | | +| `InputManager::IsKeyUp` | method | SparkEngine | [InputManager.cpp:L228](../../SparkEngine/Source/Input/InputManager.cpp#L228) | | +| `InputManager::IsMouseButtonDown` | method | SparkEngine | [InputManager.cpp:L250](../../SparkEngine/Source/Input/InputManager.cpp#L250) | | | `InputManager::KeyNameToVirtualKey` | method | SparkEngine | [InputManager.cpp:L182](../../SparkEngine/Source/Input/InputManager.cpp#L182) | | -| `InputManager::LatchFrameEdges` | method | SparkEngine | [InputManager.cpp:L246](../../SparkEngine/Source/Input/InputManager.cpp#L246) | | -| `InputManager::LogInputEvent` | method | SparkEngine | [InputManager.cpp:L308](../../SparkEngine/Source/Input/InputManager.cpp#L308) | | -| `InputManager::NotifyStateChange` | method | SparkEngine | [InputManager.cpp:L318](../../SparkEngine/Source/Input/InputManager.cpp#L318) | | -| `InputManager::ProcessMouseDelta` | method | SparkEngine | [InputManager.cpp:L285](../../SparkEngine/Source/Input/InputManager.cpp#L285) | | -| `InputManager::Update` | method | SparkEngine | [InputManager.cpp:L728](../../SparkEngine/Source/Input/InputManager.cpp#L728) | | -| `InputManager::Update` | method | SparkEngine | [InputManager.cpp:L952](../../SparkEngine/Source/Input/InputManager.cpp#L952) | | -| `InputManager::UpdateKeyState` | method | SparkEngine | [InputManager.cpp:L865](../../SparkEngine/Source/Input/InputManager.cpp#L865) | | -| `InputManager::UpdateKeyState` | method | SparkEngine | [InputManager.cpp:L995](../../SparkEngine/Source/Input/InputManager.cpp#L995) | | -| `InputManager::UpdateMouseButton` | method | SparkEngine | [InputManager.cpp:L273](../../SparkEngine/Source/Input/InputManager.cpp#L273) | | -| `InputManager::UpdateMousePosition` | method | SparkEngine | [InputManager.cpp:L279](../../SparkEngine/Source/Input/InputManager.cpp#L279) | | +| `InputManager::LatchFrameEdges` | method | SparkEngine | [InputManager.cpp:L268](../../SparkEngine/Source/Input/InputManager.cpp#L268) | | +| `InputManager::LogInputEvent` | method | SparkEngine | [InputManager.cpp:L331](../../SparkEngine/Source/Input/InputManager.cpp#L331) | | +| `InputManager::NotifyStateChange` | method | SparkEngine | [InputManager.cpp:L341](../../SparkEngine/Source/Input/InputManager.cpp#L341) | | +| `InputManager::ProcessMouseDelta` | method | SparkEngine | [InputManager.cpp:L308](../../SparkEngine/Source/Input/InputManager.cpp#L308) | | +| `InputManager::Update` | method | SparkEngine | [InputManager.cpp:L751](../../SparkEngine/Source/Input/InputManager.cpp#L751) | | +| `InputManager::Update` | method | SparkEngine | [InputManager.cpp:L975](../../SparkEngine/Source/Input/InputManager.cpp#L975) | | +| `InputManager::UpdateKeyState` | method | SparkEngine | [InputManager.cpp:L888](../../SparkEngine/Source/Input/InputManager.cpp#L888) | | +| `InputManager::UpdateKeyState` | method | SparkEngine | [InputManager.cpp:L1018](../../SparkEngine/Source/Input/InputManager.cpp#L1018) | | +| `InputManager::UpdateMouseButton` | method | SparkEngine | [InputManager.cpp:L296](../../SparkEngine/Source/Input/InputManager.cpp#L296) | | +| `InputManager::UpdateMousePosition` | method | SparkEngine | [InputManager.cpp:L302](../../SparkEngine/Source/Input/InputManager.cpp#L302) | | | `InputManager::VirtualKeyToKeyName` | method | SparkEngine | [InputManager.cpp:L191](../../SparkEngine/Source/Input/InputManager.cpp#L191) | | -| `InputManager::WasKeyPressed` | method | SparkEngine | [InputManager.cpp:L216](../../SparkEngine/Source/Input/InputManager.cpp#L216) | | -| `InputManager::WasKeyReleased` | method | SparkEngine | [InputManager.cpp:L222](../../SparkEngine/Source/Input/InputManager.cpp#L222) | | -| `InputManager::WasMouseButtonPressed` | method | SparkEngine | [InputManager.cpp:L234](../../SparkEngine/Source/Input/InputManager.cpp#L234) | | -| `InputManager::WasMouseButtonReleased` | method | SparkEngine | [InputManager.cpp:L240](../../SparkEngine/Source/Input/InputManager.cpp#L240) | | -| `InputMetrics` | struct | SparkEngine | [InputManager.h:L273](../../SparkEngine/Source/Input/InputManager.h#L273) | Input metrics structure for console integration | +| `InputManager::WasKeyPressed` | method | SparkEngine | [InputManager.cpp:L238](../../SparkEngine/Source/Input/InputManager.cpp#L238) | | +| `InputManager::WasKeyReleased` | method | SparkEngine | [InputManager.cpp:L244](../../SparkEngine/Source/Input/InputManager.cpp#L244) | | +| `InputManager::WasMouseButtonPressed` | method | SparkEngine | [InputManager.cpp:L256](../../SparkEngine/Source/Input/InputManager.cpp#L256) | | +| `InputManager::WasMouseButtonReleased` | method | SparkEngine | [InputManager.cpp:L262](../../SparkEngine/Source/Input/InputManager.cpp#L262) | | +| `InputMetrics` | struct | SparkEngine | [InputManager.h:L280](../../SparkEngine/Source/Input/InputManager.h#L280) | Input metrics structure for console integration | | `inputPatch` | function | SparkEngine | [NeuralPostProcessing.cpp:L396](../../SparkEngine/Source/Graphics/Neural/NeuralPostProcessing.cpp#L396) | | | `InputPreset` | struct | SparkEngine | [InputBindings.h:L97](../../SparkEngine/Source/Input/InputBindings.h#L97) | A named preset containing a full set of input bindings. | | `inputs` | function | SparkEngine | [NeuralTextureCompressor.cpp:L81](../../SparkEngine/Source/Graphics/Neural/NeuralTextureCompressor.cpp#L81) | | | `inputs` | function | Tests | [TestFPSMultiplayer.cpp:L1005](../../Tests/TestFPSMultiplayer.cpp#L1005) | | -| `InputSettings` | struct | SparkEngine | [InputManager.h:L293](../../SparkEngine/Source/Input/InputManager.h#L293) | Input settings structure for console control | +| `InputSettings` | struct | SparkEngine | [InputManager.h:L300](../../SparkEngine/Source/Input/InputManager.h#L300) | Input settings structure for console control | | `InputsReceived` | function | Tests | [TestFPSMultiplayer.cpp:L484](../../Tests/TestFPSMultiplayer.cpp#L484) | | | `InputState` | struct | Tests | [TestServerMockClient.cpp:L404](../../Tests/TestServerMockClient.cpp#L404) | | | `InputTexel` | function | Tests | [TestRHI210D3D11PassGoldenReal.cpp:L126](../../Tests/TestRHI210D3D11PassGoldenReal.cpp#L126) | | @@ -22115,8 +22153,8 @@ | `InsertOrReplace` | function | SparkDaemon | [ShaderService.h:L135](../../SparkDaemon/src/ShaderService.h#L135) | | | `InsertOrUpdate` | function | SparkEngine | [LocalFileCache.h:L367](../../SparkEngine/Source/Utils/LocalFileCache.h#L367) | | | `InsertPoint` | function | SparkEngine | [SplinePath.h:L69](../../SparkEngine/Source/Utils/SplinePath.h#L69) | Insert a control point at the given index. | -| `InSet` | function | Tests | [TestTFDataTables.cpp:L90](../../Tests/TestTFDataTables.cpp#L90) | | -| `InSet` | function | Tests | [TestTFDataTables.cpp:L95](../../Tests/TestTFDataTables.cpp#L95) | | +| `InSet` | function | Tests | [TestTFDataTables.cpp:L81](../../Tests/TestTFDataTables.cpp#L81) | | +| `InSet` | function | Tests | [TestTFDataTables.cpp:L86](../../Tests/TestTFDataTables.cpp#L86) | | | `Inside` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L569](../../Tests/TestRHI225D3D12ParityReal.cpp#L569) | | | `Inside` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L689](../../Tests/TestRHI225D3D12ParityReal.cpp#L689) | | | `inside` | function | Tests | [TestSecurityParsersReal.cpp:L426](../../Tests/TestSecurityParsersReal.cpp#L426) | | @@ -22206,12 +22244,12 @@ | `Install` | function | GameModules | [TFHandoffParticipant.h:L30](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.h#L30) | | | `Install` | function | GameModules | [TFServerSim.h:L142](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L142) | Game-thread handoff callbacks; the host dispatcher serializes control requests with simulation. | | `Install` | function | Tests | [TestTF120Migration.cpp:L90](../../Tests/TestTF120Migration.cpp#L90) | | -| `Install` | function | Tests | [TestTF120Travel.cpp:L230](../../Tests/TestTF120Travel.cpp#L230) | | -| `Install` | function | Tests | [TestTF120Travel.cpp:L259](../../Tests/TestTF120Travel.cpp#L259) | | +| `Install` | function | Tests | [TestTF120Travel.cpp:L217](../../Tests/TestTF120Travel.cpp#L217) | | +| `Install` | function | Tests | [TestTF120Travel.cpp:L246](../../Tests/TestTF120Travel.cpp#L246) | | | `InstallAssetPipelineLoader` | function | SparkEngine | [FoliageRenderer.h:L197](../../SparkEngine/Source/Graphics/FoliageRenderer.h#L197) | | -| `InstallCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L925](../../SparkEngine/Source/Utils/CrashHandler.cpp#L925) | | -| `InstallCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2646](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2646) | | -| `InstallCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2829](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2829) | | +| `InstallCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L926](../../SparkEngine/Source/Utils/CrashHandler.cpp#L926) | | +| `InstallCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2692](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2692) | | +| `InstallCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2875](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2875) | | | `InstallCrashHandler` | function | SparkEngine | [CrashHandler.h:L81](../../SparkEngine/Source/Utils/CrashHandler.h#L81) | | | `InstallCrashHandler` | function | SparkEngine | [CrashHandlerStub.cpp:L14](../../SparkEngine/Source/Utils/CrashHandlerStub.cpp#L14) | | | `InstallCrashHandlers` | function | Tests | [TestMain.cpp:L279](../../Tests/TestMain.cpp#L279) | | @@ -22240,7 +22278,7 @@ | `Instance` | function | SparkEngine | [SceneSnapshotSerializer.h:L121](../../SparkEngine/Source/Engine/Editor/SceneSnapshotSerializer.h#L121) | | | `Instance` | function | SparkEngine | [DaemonConnection.h:L45](../../SparkEngine/Source/Utils/DaemonConnection.h#L45) | | | `Instance` | struct | Tests | [RHI210D3D11GoldenSupport.h:L579](../../Tests/RHI210D3D11GoldenSupport.h#L579) | | -| `Instance` | function | Tests | [TestEditorSubsystemsReal.cpp:L310](../../Tests/TestEditorSubsystemsReal.cpp#L310) | | +| `Instance` | function | Tests | [TestEditorSubsystemsReal.cpp:L333](../../Tests/TestEditorSubsystemsReal.cpp#L333) | | | `instance` | function | Tests | [TestMaterialDefinition.cpp:L96](../../Tests/TestMaterialDefinition.cpp#L96) | | | `instance` | function | Tests | [TestMaterialDefinition.cpp:L125](../../Tests/TestMaterialDefinition.cpp#L125) | | | `instance` | function | Tests | [TestMaterialDefinition.cpp:L147](../../Tests/TestMaterialDefinition.cpp#L147) | | @@ -22257,7 +22295,7 @@ | `InstanceLockout` | struct | SparkEngine | [InstanceManager.h:L156](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L156) | Lockout tracking -- prevents re-running cleared instances | | `InstanceLockout::IsExpired` | method | SparkEngine | [InstanceManager.cpp:L76](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.cpp#L76) | | | `InstanceManager` | class | SparkEngine | [InstanceManager.h:L179](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L179) | Manages creation, lifecycle, and cleanup of instanced content | -| `InstanceManager` | class | SparkSDK | [IEngineContext.h:L59](../../SparkSDK/Include/Spark/IEngineContext.h#L59) | | +| `InstanceManager` | class | SparkSDK | [IEngineContext.h:L60](../../SparkSDK/Include/Spark/IEngineContext.h#L60) | | | `InstanceManager` | class | Tests | [TestInstanceManager.cpp:L62](../../Tests/TestInstanceManager.cpp#L62) | | | `InstanceManager::AddLockout` | method | SparkEngine | [InstanceEncounters.cpp:L207](../../SparkEngine/Source/Engine/Gameplay/InstanceEncounters.cpp#L207) | | | `InstanceManager::AddPlayer` | method | SparkEngine | [InstanceManager.cpp:L247](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.cpp#L247) | | @@ -22286,7 +22324,7 @@ | `InstanceTemplate` | struct | SparkEngine | [InstanceManager.h:L119](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L119) | Blueprint for an instance type (dungeon, raid, arena, etc.) | | `InstanceTemplate` | struct | Tests | [TestInstanceManager.cpp:L37](../../Tests/TestInstanceManager.cpp#L37) | | | `InstantEvent` | function | SparkEngine | [ChromeTracing.h:L102](../../SparkEngine/Source/Utils/ChromeTracing.h#L102) | | -| `InstantiateNodes` | function | SparkEngine | [SceneManager.h:L529](../../SparkEngine/Source/SceneManager/SceneManager.h#L529) | Create `GameObject` instances for all nodes in `m_sceneNodes`. | +| `InstantiateNodes` | function | SparkEngine | [SceneManager.h:L531](../../SparkEngine/Source/SceneManager/SceneManager.h#L531) | Create `GameObject` instances for all nodes in `m_sceneNodes`. | | `InstantiatePrefab` | function | SparkEditor | [PrefabManager.h:L83](../../SparkEditor/Source/Prefabs/PrefabManager.h#L83) | Instantiate a prefab into the scene | | `InSymbolOperation` | function | SparkEngine | [StackTrace.h:L237](../../SparkEngine/Source/Utils/StackTrace.h#L237) | | | `INT` | alias | SparkEngine | [PlatformTypes.h:L36](../../SparkEngine/Source/Core/PlatformTypes.h#L36) | | @@ -22419,8 +22457,9 @@ | `InvalidateProbe` | function | SparkEngine | [ReflectionProbeCache.h:L212](../../SparkEngine/Source/Graphics/ReflectionProbeCache.h#L212) | Invalidate a probe's cache (e.g., scene changed near it) | | `InvalidateSceneBasicMaterials` | function | GameModules | [Game.h:L623](../../GameModules/SparkGameFPS/Source/Game/Game.h#L623) | | | `InvalidateShadow` | function | SparkEngine | [CachedShadowAtlas.h:L223](../../SparkEngine/Source/Graphics/CachedShadowAtlas.h#L223) | Invalidate a cached shadow (e.g., scene geometry changed near light) | +| `invalidFile` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L286](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L286) | | | `InvalidStateDetector` | class | SparkEngine | [InvalidStateDetector.h:L96](../../SparkEngine/Source/Utils/InvalidStateDetector.h#L96) | Singleton runtime detector for impossible ECS state combinations. | -| `InvalidStateDetector` | class | SparkSDK | [IEngineContext.h:L99](../../SparkSDK/Include/Spark/IEngineContext.h#L99) | | +| `InvalidStateDetector` | class | SparkSDK | [IEngineContext.h:L100](../../SparkSDK/Include/Spark/IEngineContext.h#L100) | | | `InvalidStateDetector` | class | SparkSDK | [ModuleDllMain.h:L54](../../SparkSDK/Include/Spark/ModuleDllMain.h#L54) | | | `InvalidStateDetector::AddRule` | method | SparkEngine | [InvalidStateDetector.cpp:L124](../../SparkEngine/Source/Utils/InvalidStateDetector.cpp#L124) | | | `InvalidStateDetector::ClearRules` | method | SparkEngine | [InvalidStateDetector.cpp:L165](../../SparkEngine/Source/Utils/InvalidStateDetector.cpp#L165) | | @@ -22560,7 +22599,7 @@ | `IsActionNode` | function | SparkEngine | [VisualScriptCodegen.cpp:L24](../../SparkEngine/Source/Engine/Scripting/VisualScriptCodegen.cpp#L24) | | | `IsActionPressed` | function | SparkEngine | [PlatformInput.h:L329](../../SparkEngine/Source/Input/PlatformInput.h#L329) | Check if an action is currently held. | | `IsActionTriggered` | function | SparkEngine | [InputActionSystem.h:L453](../../SparkEngine/Source/Input/InputActionSystem.h#L453) | Check if a button action was triggered this frame | -| `IsActive` | function | GameModules | [FPSWeatherIntegration.h:L48](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L48) | | +| `IsActive` | function | GameModules | [FPSWeatherIntegration.h:L50](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L50) | | | `IsActive` | function | GameModules | [MultiplayerSystem.h:L284](../../GameModules/SparkGameFPS/Source/Game/MultiplayerSystem.h#L284) | Check if a session is open: hosting (server), or connecting or connected (client). | | `IsActive` | function | GameModules | [Projectile.h:L139](../../GameModules/SparkGameFPS/Source/Projectiles/Projectile.h#L139) | Check if projectile is currently active | | `IsActive` | function | GameModules | [TFSpectator.h:L125](../../GameModules/SparkGameMMOFPS/Source/Game/TFSpectator.h#L125) | | @@ -22590,7 +22629,7 @@ | `IsAreaLoadComplete` | function | SparkEngine | [AreaAssetLoader.h:L127](../../SparkEngine/Source/Engine/Streaming/AreaAssetLoader.h#L127) | Check if an area's load is fully complete | | `IsAreaLoadComplete` | function | Tests | [TestAreaAssetLoader.cpp:L123](../../Tests/TestAreaAssetLoader.cpp#L123) | | | `IsAssetLoaded` | function | SparkEngine | [AssetPipeline.h:L434](../../SparkEngine/Source/Graphics/AssetPipeline.h#L434) | | -| `IsAsyncLoading` | function | SparkEngine | [SceneManager.h:L407](../../SparkEngine/Source/SceneManager/SceneManager.h#L407) | Check if an asynchronous scene load is in progress. | +| `IsAsyncLoading` | function | SparkEngine | [SceneManager.h:L409](../../SparkEngine/Source/SceneManager/SceneManager.h#L409) | Check if an asynchronous scene load is in progress. | | `IsAudibleUnderSolo` | function | SparkEngine | [AudioMixer.h:L375](../../SparkEngine/Source/Audio/AudioMixer.h#L375) | Whether a bus survives the current solo selection. | | `IsAudioBackendAvailable` | function | SparkEngine | [AudioEngine.h:L141](../../SparkEngine/Source/Audio/AudioEngine.h#L141) | Check whether a real audio backend is available on this platform | | `IsAuditRecordLine` | function | Tests | [TestSEC100ChatAuditLogReal.cpp:L101](../../Tests/TestSEC100ChatAuditLogReal.cpp#L101) | | @@ -22647,7 +22686,7 @@ | `IsCanonicalEndpoint` | function | SparkEngine | [NetworkTrustStore.cpp:L177](../../SparkEngine/Source/Engine/Networking/NetworkTrustStore.cpp#L177) | | | `IsCanonicalJsonNumber` | function | SparkEngine | [DataTableSystem.h:L716](../../SparkEngine/Source/Engine/DataTable/DataTableSystem.h#L716) | | | `IsCapturable` | function | GameModules | [TFRegionSystem.h:L92](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.h#L92) | | -| `IsCapturable` | function | Tests | [TestTFRegionLattice.cpp:L142](../../Tests/TestTFRegionLattice.cpp#L142) | | +| `IsCapturable` | function | Tests | [TestTFRegionLattice.cpp:L135](../../Tests/TestTFRegionLattice.cpp#L135) | | | `IsCaptureReason` | function | GameModules | [TFDirectiveSystem.cpp:L36](../../GameModules/SparkGameMMOFPS/Source/Game/TFDirectiveSystem.cpp#L36) | | | `IsCategoryEnabled` | function | SparkEditor | [EditorLogger.h:L215](../../SparkEditor/Source/Core/EditorLogger.h#L215) | | | `IsCategoryEnabled` | function | SparkEngine | [GameplayDebugger.h:L180](../../SparkEngine/Source/Utils/GameplayDebugger.h#L180) | Check if a category is enabled | @@ -22695,7 +22734,7 @@ | `IsConfigLikeFile` | function | Tests | [TestDATA120SecretsAtRest.cpp:L143](../../Tests/TestDATA120SecretsAtRest.cpp#L143) | | | `IsConfigurationValid` | function | SparkEngine | [LifecycleCompositionRoot.h:L121](../../SparkEngine/Source/Core/Lifecycle/LifecycleCompositionRoot.h#L121) | | | `IsConfigured` | function | SparkEngine | [NeuralFunctionApproximator.h:L113](../../SparkEngine/Source/Graphics/Neural/NeuralFunctionApproximator.h#L113) | Check if the approximator has a valid architecture. | -| `IsConfinedRelativeScenePath` | function | SparkEngine | [SceneManager.cpp:L205](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L205) | | +| `IsConfinedRelativeScenePath` | function | SparkEngine | [SceneManager.cpp:L219](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L219) | | | `IsConnected` | function | GameModules | [MultiplayerSystem.h:L292](../../GameModules/SparkGameFPS/Source/Game/MultiplayerSystem.h#L292) | Check if the session is live: hosting (server), or admitted with an assigned id (client). | | `IsConnected` | function | GameModules | [TFClientNet.h:L83](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L83) | | | `IsConnected` | function | SparkEditor | [CollaborativeEditSession.h:L323](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L323) | Check if connected to a session | @@ -22717,10 +22756,10 @@ | `IsContained` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L1548](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L1548) | | | `IsContained` | function | SparkCooker | [main.cpp:L75](../../SparkCooker/src/main.cpp#L75) | | | `IsContainedBy` | function | SparkEngine | [ProjectAssetPath.cpp:L102](../../SparkEngine/Source/Graphics/ProjectAssetPath.cpp#L102) | | -| `IsContainedByProject` | function | SparkEditor | [AssetBrowserPanel.h:L112](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L112) | | +| `IsContainedByProject` | function | SparkEditor | [AssetBrowserPanel.h:L122](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L122) | | | `IsContainedIn` | function | SparkEngine | [VirtualFileSystem.cpp:L60](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L60) | | | `IsContainedLinkTarget` | function | SparkBuild | [ArchiveExtraction.cpp:L257](../../SparkBuild/src/ArchiveExtraction.cpp#L257) | | -| `IsContainedPath` | function | SparkEditor | [AssetBrowserPanel.cpp:L68](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L68) | | +| `IsContainedPath` | function | SparkEditor | [AssetBrowserPanel.cpp:L45](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L45) | | | `IsContainedRegularFile` | function | SparkInstaller | [GitBootstrap.cpp:L75](../../SparkInstaller/src/GitBootstrap.cpp#L75) | | | `IsContention` | function | GameModules | [TFSavePaths.h:L162](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFSavePaths.h#L162) | | | `IsConversationActive` | function | SparkEngine | [DialogueSystem.h:L250](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L250) | Check if a conversation is active. | @@ -22778,7 +22817,7 @@ | `IsDirty` | function | SparkEngine | [DirtyRectTracker.h:L133](../../SparkEngine/Source/Graphics/DirtyRectTracker.h#L133) | Clear all dirty regions (texture is now clean). | | `IsDirty` | function | SparkEngine | [LightingSystem.h:L145](../../SparkEngine/Source/Graphics/LightingSystem.h#L145) | | | `IsDirty` | function | SparkEngine | [PipelineStateCache.h:L328](../../SparkEngine/Source/Graphics/PipelineStateCache.h#L328) | Check if a state category is dirty. | -| `IsDirty` | function | SparkEngine | [SceneManager.h:L353](../../SparkEngine/Source/SceneManager/SceneManager.h#L353) | Return `true` if the scene has modifications that have not been saved. | +| `IsDirty` | function | SparkEngine | [SceneManager.h:L355](../../SparkEngine/Source/SceneManager/SceneManager.h#L355) | Return `true` if the scene has modifications that have not been saved. | | `IsDirty` | function | Tests | [TestDirtyRectTracker.cpp:L61](../../Tests/TestDirtyRectTracker.cpp#L61) | | | `IsDirty` | function | Tests | [TestReplicationFields.cpp:L44](../../Tests/TestReplicationFields.cpp#L44) | | | `IsDirty` | function | Tests | [TestSceneManager.cpp:L157](../../Tests/TestSceneManager.cpp#L157) | | @@ -22894,6 +22933,7 @@ | `IsFPSHUDPreviewAvailable` | function | SparkEditor | [GameViewPanel.h:L69](../../SparkEditor/Source/Panels/GameViewPanel.h#L69) | Enable the editor's legacy FPS HUD simulator for an FPS project. | | `IsFPSHUDPreviewEnabled` | function | SparkEditor | [GameViewPanel.h:L70](../../SparkEditor/Source/Panels/GameViewPanel.h#L70) | | | `IsFrameActive` | function | SparkEngine | [ConstantBufferRing.h:L319](../../SparkEngine/Source/Graphics/ConstantBufferRing.h#L319) | Check if currently mapped for a frame | +| `IsFrameKeyDown` | function | SparkEngine | [InputManager.h:L170](../../SparkEngine/Source/Input/InputManager.h#L170) | | | `IsFriendName` | function | GameModules | [TFSocialSystem.h:L96](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L96) | | | `IsFSR1Available` | function | SparkEngine | [UpscalingSystem.h:L376](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L376) | Check if FSR 1.0 is available (engine-owned EASU/RCAS compute shaders) | | `IsFSR2Available` | function | SparkEngine | [UpscalingSystem.h:L379](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L379) | Check if FSR 2.0 is available (false until the FidelityFX SDK is linked) | @@ -22918,9 +22958,9 @@ | `IsGrounded` | function | GameModules | [PlatformerPlayerController.h:L108](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L108) | True while the player stands on a level platform | | `IsHalfRes` | function | SparkEngine | [ScreenSpaceEffects.h:L94](../../SparkEngine/Source/Graphics/ScreenSpaceEffects.h#L94) | | | `IsHardwareAvailable` | function | SparkEngine | [DirectStorageLoader.h:L176](../../SparkEngine/Source/Engine/Streaming/DirectStorageLoader.h#L176) | Check if hardware DirectStorage is available | -| `IsHeadless` | function | SparkEngine | [EngineContext.h:L282](../../SparkEngine/Source/Core/EngineContext.h#L282) | | +| `IsHeadless` | function | SparkEngine | [EngineContext.h:L283](../../SparkEngine/Source/Core/EngineContext.h#L283) | | | `IsHeadless` | function | SparkEngine | [RHIBridge.h:L146](../../SparkEngine/Source/Graphics/RHI/RHIBridge.h#L146) | True when running on NullRHIDevice (no GPU / headless). | -| `IsHeadless` | function | SparkSDK | [IEngineContext.h:L306](../../SparkSDK/Include/Spark/IEngineContext.h#L306) | Check if the engine is running in headless/dedicated server mode | +| `IsHeadless` | function | SparkSDK | [IEngineContext.h:L307](../../SparkSDK/Include/Spark/IEngineContext.h#L307) | Check if the engine is running in headless/dedicated server mode | | `IsHeadless` | function | Tests | [TestGameModuleMMO.cpp:L734](../../Tests/TestGameModuleMMO.cpp#L734) | | | `IsHeadless` | function | Tests | [TestMMOAuthNetwork.cpp:L65](../../Tests/TestMMOAuthNetwork.cpp#L65) | | | `IsHealthy` | function | SparkEngine | [MemoryMonitor.h:L192](../../SparkEngine/Source/Utils/MemoryMonitor.h#L192) | Check if the monitor considers memory healthy | @@ -23024,12 +23064,12 @@ | `IsIPv4LoopbackAddress` | function | SparkEngine | [NetworkBindPolicy.h:L88](../../SparkEngine/Source/Engine/Networking/NetworkBindPolicy.h#L88) | Whether an address is a concrete host in the fixed 127/8 loopback block. | | `IsIPv4PrivateAddress` | function | SparkEngine | [NetworkBindPolicy.h:L131](../../SparkEngine/Source/Engine/Networking/NetworkBindPolicy.h#L131) | | | `IsIssueUrl` | function | SparkCrashReporter | [CrashAutoIssues.cpp:L149](../../SparkCrashReporter/src/CrashAutoIssues.cpp#L149) | | -| `IsKeyDown` | function | SparkEngine | [InputManager.cpp:L568](../../SparkEngine/Source/Input/InputManager.cpp#L568) | | -| `IsKeyDown` | function | SparkEngine | [InputManager.h:L165](../../SparkEngine/Source/Input/InputManager.h#L165) | Check if a key is currently pressed | +| `IsKeyDown` | function | SparkEngine | [InputManager.cpp:L591](../../SparkEngine/Source/Input/InputManager.cpp#L591) | | +| `IsKeyDown` | function | SparkEngine | [InputManager.h:L167](../../SparkEngine/Source/Input/InputManager.h#L167) | Check if a key is currently pressed | | `IsKeyDown` | function | SparkEngine | [PlatformInput.h:L206](../../SparkEngine/Source/Input/PlatformInput.h#L206) | Check if a key/button is currently held. | | `IsKeyDown` | function | SparkEngine | [PlatformInput.h:L252](../../SparkEngine/Source/Input/PlatformInput.h#L252) | No-op input backend for headless mode and unit tests. | | `IsKeyDown` | function | Tests | [TestInputSystem.cpp:L24](../../Tests/TestInputSystem.cpp#L24) | | -| `IsKeyUp` | function | SparkEngine | [InputManager.h:L175](../../SparkEngine/Source/Input/InputManager.h#L175) | Check if a key is currently released | +| `IsKeyUp` | function | SparkEngine | [InputManager.h:L182](../../SparkEngine/Source/Input/InputManager.h#L182) | Check if a key is currently released | | `IsKinematic` | function | SparkEngine | [PhysicsBody.h:L115](../../SparkEngine/Source/Physics/PhysicsBody.h#L115) | | | `IsKnownSoftwareGLRenderer` | function | Tests | [TestRHI240OpenGLReal.cpp:L117](../../Tests/TestRHI240OpenGLReal.cpp#L117) | | | `IsLanBroadcastActive` | function | SparkEngine | [DedicatedServer.h:L315](../../SparkEngine/Source/Engine/Networking/DedicatedServer.h#L315) | Whether the LAN broadcast worker is currently active. | @@ -23096,8 +23136,8 @@ | `IsModified` | function | Tests | [TestConsoleVariables.cpp:L66](../../Tests/TestConsoleVariables.cpp#L66) | | | `IsModified` | function | Tests | [TestConsoleVariables.cpp:L175](../../Tests/TestConsoleVariables.cpp#L175) | | | `IsMotionBlurActive` | function | SparkEngine | [TemporalEffects.h:L345](../../SparkEngine/Source/Graphics/TemporalEffects.h#L345) | Check if motion blur is active | -| `IsMouseButtonDown` | function | SparkEngine | [InputManager.h:L207](../../SparkEngine/Source/Input/InputManager.h#L207) | Check if a mouse button is currently pressed | -| `IsMouseCaptured` | function | SparkEngine | [InputManager.h:L264](../../SparkEngine/Source/Input/InputManager.h#L264) | Check if the mouse is currently captured | +| `IsMouseButtonDown` | function | SparkEngine | [InputManager.h:L214](../../SparkEngine/Source/Input/InputManager.h#L214) | Check if a mouse button is currently pressed | +| `IsMouseCaptured` | function | SparkEngine | [InputManager.h:L271](../../SparkEngine/Source/Input/InputManager.h#L271) | Check if the mouse is currently captured | | `IsMultisampled` | function | SparkEngine | [RenderTarget.h:L156](../../SparkEngine/Source/Graphics/RenderTarget.h#L156) | | | `IsNameAvailable` | function | GameModules | [MMOCharacterSystem.h:L172](../../GameModules/SparkGameMMO/Source/Character/MMOCharacterSystem.h#L172) | Check the server-owned account-to-character index without allocating a character list. | | `IsNativeTargetPlatform` | function | SparkEditor | [BuildPipeline.h:L133](../../SparkEditor/Source/Panels/BuildPipeline.h#L133) | Return the only target that this editor host can package and execute natively. | @@ -23214,7 +23254,7 @@ | `IsPrintableAscii` | function | SparkGateway | [GatewayLocalAdapters.cpp:L24](../../SparkGateway/src/GatewayLocalAdapters.cpp#L24) | | | `IsPrintableAscii` | function | Tests | [TestSEC100ChatAuditLogReal.cpp:L107](../../Tests/TestSEC100ChatAuditLogReal.cpp#L107) | | | `IsProcessAlive` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1886](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1886) | | -| `IsProcessTeardown` | function | SparkEngine | [CrashHandler.cpp:L852](../../SparkEngine/Source/Utils/CrashHandler.cpp#L852) | | +| `IsProcessTeardown` | function | SparkEngine | [CrashHandler.cpp:L853](../../SparkEngine/Source/Utils/CrashHandler.cpp#L853) | | | `IsProfiling` | function | SparkEditor | [PerformanceProfiler.h:L115](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L115) | Check if profiling is active | | `IsProgressCommitted` | function | GameModules | [TFCharacterSystem.h:L71](../../GameModules/SparkGameMMOFPS/Source/Account/TFCharacterSystem.h#L71) | | | `IsPureNode` | function | SparkEngine | [VisualScriptCodegen.cpp:L267](../../SparkEngine/Source/Engine/Scripting/VisualScriptCodegen.cpp#L267) | | @@ -23299,7 +23339,7 @@ | `IsRunningUnderWine` | function | SparkEngine | [WineDetection.cpp:L188](../../SparkEngine/Source/Utils/WineDetection.cpp#L188) | | | `IsRunningUnderWine` | function | SparkEngine | [WineDetection.cpp:L226](../../SparkEngine/Source/Utils/WineDetection.cpp#L226) | | | `IsRunningUnderWine` | function | SparkEngine | [WineDetection.h:L55](../../SparkEngine/Source/Utils/WineDetection.h#L55) | True if the process is running under Wine (any version). | -| `iss` | function | SparkConsole | [ConsoleApp.cpp:L634](../../SparkConsole/src/ConsoleApp.cpp#L634) | | +| `iss` | function | SparkConsole | [ConsoleApp.cpp:L638](../../SparkConsole/src/ConsoleApp.cpp#L638) | | | `iss` | function | SparkEditor | [AdvancedAssetPipeline.cpp:L962](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.cpp#L962) | | | `iss` | function | SparkEditor | [AssetProcessors.cpp:L133](../../SparkEditor/Source/AssetPipeline/AssetProcessors.cpp#L133) | | | `iss` | function | SparkEditor | [EditorTheme.cpp:L55](../../SparkEditor/Source/Core/EditorTheme.cpp#L55) | | @@ -23334,7 +23374,7 @@ | `IsSceneModified` | function | SparkEditor | [EditorUI.h:L282](../../SparkEditor/Source/Core/EditorUI.h#L282) | Load a reflected scene JSON (as written by SaveCurrentScene) | | `IsScriptFaulted` | function | SparkEngine | [AngelScriptEngine.h:L288](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L288) | | | `IsScriptStarted` | function | SparkEngine | [AngelScriptEngine.h:L294](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L294) | Return whether the attached instance has already received Start(). | -| `IsSDKCompatible` | function | SparkSDK | [Version.h:L66](../../SparkSDK/Include/Spark/Version.h#L66) | Check if a module's SDK version is compatible with this engine | +| `IsSDKCompatible` | function | SparkSDK | [Version.h:L70](../../SparkSDK/Include/Spark/Version.h#L70) | Check if a module's SDK version is compatible with this engine | | `IsSealedCurrentVersionSave` | function | Tests | [TestSAVE230NewerFormatSlotReal.cpp:L83](../../Tests/TestSAVE230NewerFormatSlotReal.cpp#L83) | | | `IsSeated` | function | GameModules | [TFVehicleSystem.h:L71](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L71) | | | `IsSecondaryAbilityActive` | function | GameModules | [Player.h:L371](../../GameModules/SparkGameFPS/Source/Game/Player.h#L371) | Check if secondary ability is currently active | @@ -23346,7 +23386,7 @@ | `IsSeparator` | function | GameModules | [PlatformerProgress.cpp:L84](../../GameModules/SparkGamePlatformer/Source/Core/PlatformerProgress.cpp#L84) | | | `IsServer` | function | GameModules | [MultiplayerSystem.h:L276](../../GameModules/SparkGameFPS/Source/Game/MultiplayerSystem.h#L276) | Check if this instance is the server. | | `IsServerInstance` | function | GameModules | [TFCommandsHarness.cpp:L341](../../GameModules/SparkGameMMOFPS/Source/Console/TFCommandsHarness.cpp#L341) | | -| `IsSet` | function | SparkBuild | [ProcessRunnerTests.cpp:L591](../../SparkBuild/tests/ProcessRunnerTests.cpp#L591) | | +| `IsSet` | function | SparkBuild | [ProcessRunnerTests.cpp:L584](../../SparkBuild/tests/ProcessRunnerTests.cpp#L584) | | | `IsSet` | function | SparkInstaller | [InstallerTransactionTests.cpp:L354](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L354) | | | `IsSettlementVisited` | function | GameModules | [OWSettlementSystem.h:L103](../../GameModules/SparkGameOpenWorld/Source/Settlement/OWSettlementSystem.h#L103) | Record that the player entered and interacted with a settlement. | | `IsSha256Hex` | function | SparkInstaller | [GitBootstrap.cpp:L30](../../SparkInstaller/src/GitBootstrap.cpp#L30) | | @@ -23391,7 +23431,7 @@ | `IsTagChildOf` | function | SparkEngine | [GameplayTags.h:L257](../../SparkEngine/Source/Engine/Gameplay/GameplayTags.h#L257) | Check if @p tagId equals @p parentTagId or is its descendant. | | `IsTagChildOfUnlocked` | function | SparkEngine | [GameplayTags.h:L260](../../SparkEngine/Source/Engine/Gameplay/GameplayTags.h#L260) | Check if @p tagId equals @p parentTagId or is its descendant. | | `IsTagChildOfUnlocked` | function | SparkEngine | [GameplayTags.h:L363](../../SparkEngine/Source/Engine/Gameplay/GameplayTags.h#L363) | | -| `IStateValidation` | class | SparkSDK | [IEngineContext.h:L80](../../SparkSDK/Include/Spark/IEngineContext.h#L80) | | +| `IStateValidation` | class | SparkSDK | [IEngineContext.h:L81](../../SparkSDK/Include/Spark/IEngineContext.h#L81) | | | `IStateValidation` | class | SparkSDK | [IStateValidation.h:L93](../../SparkSDK/Include/Spark/IStateValidation.h#L93) | Abstract registry of ECS state-invariant rules for game modules | | `IsTemporalMode` | function | SparkEngine | [UpscalingSystem.cpp:L326](../../SparkEngine/Source/Graphics/UpscalingSystem.cpp#L326) | Check if a given upscaling mode requires temporal inputs | | `IsTerminalMode` | function | GameModules | [TFSpawnScreen.h:L63](../../GameModules/SparkGameMMOFPS/Source/UI/TFSpawnScreen.h#L63) | | @@ -23585,7 +23625,7 @@ | `it` | function | SparkBuild | [ArchiveExtraction.cpp:L467](../../SparkBuild/src/ArchiveExtraction.cpp#L467) | | | `it` | function | SparkBuild | [ArchiveExtraction.cpp:L496](../../SparkBuild/src/ArchiveExtraction.cpp#L496) | | | `it` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L219](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L219) | | -| `it` | function | SparkEditor | [MaterialEditorPanel.cpp:L69](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L69) | | +| `it` | function | SparkEditor | [MaterialEditorPanel.cpp:L73](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L73) | | | `it` | function | SparkEditor | [SceneImportPanel.cpp:L93](../../SparkEditor/Source/Panels/SceneImportPanel.cpp#L93) | | | `it` | function | SparkEditor | [SearchPanelSearch.cpp:L52](../../SparkEditor/Source/Panels/SearchPanelSearch.cpp#L52) | | | `it` | function | SparkEngine | [ModSystem.cpp:L442](../../SparkEngine/Source/Engine/Modding/ModSystem.cpp#L442) | | @@ -23631,6 +23671,8 @@ | `ITransport` | class | SparkEngine | [ITransport.h:L31](../../SparkEngine/Source/Engine/Networking/ITransport.h#L31) | Abstract transport interface for sending and receiving raw packets. | | `IUndoCommand` | class | Tests | [TestUndoRedoManager.cpp:L22](../../Tests/TestUndoRedoManager.cpp#L22) | | | `IUnknown` | struct | SparkEngine | [PlatformD3DStubs.h:L33](../../SparkEngine/Source/Core/PlatformD3DStubs.h#L33) | | +| `IWeatherService` | class | GameModules | [EngineWeatherAdapter.h:L7](../../GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.h#L7) | | +| `IWeatherService` | class | SparkSDK | [IWeatherService.h:L26](../../SparkSDK/Include/Spark/IWeatherService.h#L26) | | | `IXAudio2` | struct | SparkEngine | [PlatformAudioStubs.h:L154](../../SparkEngine/Source/Core/PlatformAudioStubs.h#L154) | | | `IXAudio2MasteringVoice` | struct | SparkEngine | [PlatformAudioStubs.h:L107](../../SparkEngine/Source/Core/PlatformAudioStubs.h#L107) | | | `IXAudio2SourceVoice` | struct | SparkEngine | [PlatformAudioStubs.h:L74](../../SparkEngine/Source/Core/PlatformAudioStubs.h#L74) | | @@ -23682,12 +23724,12 @@ | `json` | function | Tests | [TestSceneSerializerReal.cpp:L566](../../Tests/TestSceneSerializerReal.cpp#L566) | | | `Json::StringifyPretty` | method | SparkEngine | [ModSystemIO.cpp:L128](../../SparkEngine/Source/Engine/Modding/ModSystemIO.cpp#L128) | | | `JsonBool` | function | SparkServer | [ServerHealth.cpp:L69](../../SparkServer/src/ServerHealth.cpp#L69) | | -| `jsonEsc` | function | SparkEngine | [CrashHandler.cpp:L717](../../SparkEngine/Source/Utils/CrashHandler.cpp#L717) | | | `jsonEsc` | function | SparkEngine | [CrashHandler.cpp:L718](../../SparkEngine/Source/Utils/CrashHandler.cpp#L718) | | | `jsonEsc` | function | SparkEngine | [CrashHandler.cpp:L719](../../SparkEngine/Source/Utils/CrashHandler.cpp#L719) | | | `jsonEsc` | function | SparkEngine | [CrashHandler.cpp:L720](../../SparkEngine/Source/Utils/CrashHandler.cpp#L720) | | | `jsonEsc` | function | SparkEngine | [CrashHandler.cpp:L721](../../SparkEngine/Source/Utils/CrashHandler.cpp#L721) | | | `jsonEsc` | function | SparkEngine | [CrashHandler.cpp:L722](../../SparkEngine/Source/Utils/CrashHandler.cpp#L722) | | +| `jsonEsc` | function | SparkEngine | [CrashHandler.cpp:L723](../../SparkEngine/Source/Utils/CrashHandler.cpp#L723) | | | `JsonEscape` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1296](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1296) | | | `JsonField` | function | Tests | [TestSparkServerHealth.cpp:L30](../../Tests/TestSparkServerHealth.cpp#L30) | | | `JsonFieldValueToString` | function | SparkEngine | [ReflectedSceneSerializer.cpp:L159](../../SparkEngine/Source/SceneManager/ReflectedSceneSerializer.cpp#L159) | | @@ -23778,7 +23820,7 @@ | `KeyHash` | struct | SparkDaemon | [AssetService.h:L97](../../SparkDaemon/src/AssetService.h#L97) | | | `KeyHash` | struct | SparkDaemon | [ShaderService.h:L106](../../SparkDaemon/src/ShaderService.h#L106) | | | `KeyModifier` | enum | SparkEngine | [InputEnums.h:L78](../../SparkEngine/Source/Enums/InputEnums.h#L78) | Key modifier flags | -| `KeyNameToVirtualKey` | function | SparkEngine | [InputManager.h:L486](../../SparkEngine/Source/Input/InputManager.h#L486) | Convert key name to virtual key code | +| `KeyNameToVirtualKey` | function | SparkEngine | [InputManager.h:L493](../../SparkEngine/Source/Input/InputManager.h#L493) | Convert key name to virtual key code | | `KeyPressedProvider` | alias | SparkEngine | [InputActionSystem.h:L117](../../SparkEngine/Source/Input/InputActionSystem.h#L117) | Callback for action state queries (used by external key state provider) | | `KeyReleasedProvider` | alias | SparkEngine | [InputActionSystem.h:L118](../../SparkEngine/Source/Input/InputActionSystem.h#L118) | Callback for action state queries (used by external key state provider) | | `KeySet` | alias | GameModules | [MMOPersistenceSystem.h:L267](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.h#L267) | | @@ -23824,7 +23866,7 @@ | `KindOfKey` | function | GameModules | [TFAbilitySystemServer.cpp:L351](../../GameModules/SparkGameMMOFPS/Source/Game/TFAbilitySystemServer.cpp#L351) | | | `KineticEnergy` | function | Tests | [TestPhysicsComponents.cpp:L145](../../Tests/TestPhysicsComponents.cpp#L145) | | | `KineticEnergy` | function | Tests | [TestPhysicsStress.cpp:L60](../../Tests/TestPhysicsStress.cpp#L60) | | -| `KitPlacement` | struct | GameModules | [GameConsoleOps.cpp:L880](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L880) | | +| `KitPlacement` | struct | GameModules | [GameConsoleOps.cpp:L888](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L888) | | | `KitPlacement` | struct | GameModules | [RTSDemoPresentation.cpp:L46](../../GameModules/SparkGameRTS/Source/Demo/RTSDemoPresentation.cpp#L46) | | | `KitPlacement` | struct | GameModules | [VisualScriptDemoWorld.cpp:L376](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.cpp#L376) | | | `KitProp` | struct | GameModules | [ARPGDungeonSystem.cpp:L65](../../GameModules/SparkGameARPG/Source/Dungeon/ARPGDungeonSystem.cpp#L65) | | @@ -23876,13 +23918,13 @@ | `LastHapticWasLeft` | function | Tests | [TestVRSystem.cpp:L151](../../Tests/TestVRSystem.cpp#L151) | | | `LastKiller` | struct | GameModules | [TFMedalSystem.h:L228](../../GameModules/SparkGameMMOFPS/Source/Game/TFMedalSystem.h#L228) | | | `LastLines` | function | SparkEditor | [BuiltinWorkflows.cpp:L20](../../SparkEditor/Source/Workflow/BuiltinWorkflows.cpp#L20) | | -| `LastOperationSucceeded` | function | SparkEditor | [AssetBrowserPanel.h:L103](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L103) | Wire live basic-path cache invalidation after an import. | +| `LastOperationSucceeded` | function | SparkEditor | [AssetBrowserPanel.h:L113](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L113) | Wire live basic-path cache invalidation after an import. | | `LastOpFeedback` | function | GameModules | [TFSocialSystem.h:L104](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L104) | | | `LastPosixError` | function | SparkEngine | [SaveFileDurability.cpp:L48](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L48) | | | `LastSentInput` | function | Tests | [TestFPSMultiplayer.cpp:L80](../../Tests/TestFPSMultiplayer.cpp#L80) | | | `LastStatus` | function | GameModules | [TFDatabase.h:L250](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFDatabase.h#L250) | | | `LastWindowsError` | function | SparkEngine | [SaveFileDurability.cpp:L43](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L43) | | -| `LatchFrameEdges` | function | SparkEngine | [InputManager.h:L518](../../SparkEngine/Source/Input/InputManager.h#L518) | Latch this frame's key/button snapshot and shift the old one to "previous" | +| `LatchFrameEdges` | function | SparkEngine | [InputManager.h:L525](../../SparkEngine/Source/Input/InputManager.h#L525) | Latch this frame's key/button snapshot and shift the old one to "previous" | | `Lattice` | struct | Tests | [TestTFRegionLattice.cpp:L43](../../Tests/TestTFRegionLattice.cpp#L43) | | | `Launch` | function | SparkEngine | [Process.h:L97](../../SparkEngine/Source/Utils/Process.h#L97) | | | `LaunchClient` | function | SparkEditor | [PlayControlPanel.h:L86](../../SparkEditor/Source/Panels/PlayControlPanel.h#L86) | | @@ -23891,10 +23933,10 @@ | `LaunchContext::CanonicalPath` | method | SparkEditor | [EditorPluginDiscovery.h:L33](../../SparkEditor/Source/Core/EditorPluginDiscovery.h#L33) | | | `LaunchContext::PathFromUtf8` | method | SparkEditor | [GameModuleSelectorPanel.cpp:L130](../../SparkEditor/Source/Panels/GameModuleSelectorPanel.cpp#L130) | | | `LaunchContext::PathFromUtf8` | method | SparkEditor | [GameModuleSelectorPanel.cpp:L181](../../SparkEditor/Source/Panels/GameModuleSelectorPanel.cpp#L181) | | -| `LaunchContext::PathToUtf8` | method | SparkEditor | [PlayControlLaunch.cpp:L373](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L373) | | -| `LaunchContext::PathToUtf8` | method | SparkEditor | [PlayControlLaunch.cpp:L406](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L406) | | +| `LaunchContext::PathToUtf8` | method | SparkEditor | [PlayControlLaunch.cpp:L375](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L375) | | +| `LaunchContext::PathToUtf8` | method | SparkEditor | [PlayControlLaunch.cpp:L408](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L408) | | | `LaunchContext::PathToUtf8` | method | SparkEditor | [EditorProcessLaunch.cpp:L129](../../SparkEditor/Source/Utils/EditorProcessLaunch.cpp#L129) | | -| `LaunchCrashReporter` | function | SparkEngine | [CrashHandler.cpp:L762](../../SparkEngine/Source/Utils/CrashHandler.cpp#L762) | | +| `LaunchCrashReporter` | function | SparkEngine | [CrashHandler.cpp:L763](../../SparkEngine/Source/Utils/CrashHandler.cpp#L763) | | | `LaunchDedicatedWithBots` | function | SparkEditor | [PlayControlPanel.h:L85](../../SparkEditor/Source/Panels/PlayControlPanel.h#L85) | | | `LaunchDetached` | function | SparkLauncher | [LauncherProcess.cpp:L620](../../SparkLauncher/src/LauncherProcess.cpp#L620) | | | `LaunchDetachedProcess` | function | SparkBuild | [SparkBuild.cpp:L36](../../SparkBuild/src/SparkBuild.cpp#L36) | | @@ -24171,9 +24213,9 @@ | `LevelUp` | function | GameModules | [ARPGHeroSystem.h:L105](../../GameModules/SparkGameARPG/Source/Hero/ARPGHeroSystem.h#L105) | | | `LevelUp` | function | GameModules | [RPGCharacterSystem.h:L139](../../GameModules/SparkGameRPG/Source/Character/RPGCharacterSystem.h#L139) | | | `LevenshteinDistance` | function | SparkEngine | [SparkConsole.cpp:L95](../../SparkEngine/Source/Utils/SparkConsole.cpp#L95) | | -| `lib` | function | Tests | [TestAssetParserHardening.cpp:L357](../../Tests/TestAssetParserHardening.cpp#L357) | | -| `lib` | function | Tests | [TestAssetParserHardening.cpp:L392](../../Tests/TestAssetParserHardening.cpp#L392) | | -| `lib` | function | Tests | [TestAssetParserHardening.cpp:L418](../../Tests/TestAssetParserHardening.cpp#L418) | | +| `lib` | function | Tests | [TestAssetParserHardening.cpp:L373](../../Tests/TestAssetParserHardening.cpp#L373) | | +| `lib` | function | Tests | [TestAssetParserHardening.cpp:L408](../../Tests/TestAssetParserHardening.cpp#L408) | | +| `lib` | function | Tests | [TestAssetParserHardening.cpp:L434](../../Tests/TestAssetParserHardening.cpp#L434) | | | `LibraryTargetName` | function | SparkEngine | [ModuleManager.h:L309](../../SparkEngine/Source/Core/ModuleManager.h#L309) | Build-target name of a module image: its filename stem without the | | `Life200EngineContext` | class | Tests | [TestLIFE200ModuleReloadReal.cpp:L41](../../Tests/TestLIFE200ModuleReloadReal.cpp#L41) | | | `Life200EngineContext` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L44](../../Tests/TestLIFE200ModuleReloadReal.cpp#L44) | | @@ -24368,7 +24410,7 @@ | `Lines` | function | SparkEngine | [VisualScriptGraphWriter.cpp:L178](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphWriter.cpp#L178) | | | `lines` | function | Tests | [TestMOD380RacingCompleteRaceReal.cpp:L551](../../Tests/TestMOD380RacingCompleteRaceReal.cpp#L551) | | | `Lines` | function | Tests | [TestPrototypeModuleKitReal.cpp:L91](../../Tests/TestPrototypeModuleKitReal.cpp#L91) | | -| `lines` | function | Tests | [TestTF120Travel.cpp:L320](../../Tests/TestTF120Travel.cpp#L320) | | +| `lines` | function | Tests | [TestTF120Travel.cpp:L307](../../Tests/TestTF120Travel.cpp#L307) | | | `Lines` | function | Tests | [TestTFObservation.cpp:L24](../../Tests/TestTFObservation.cpp#L24) | | | `lineStream` | function | SparkEditor | [VersionControlConflicts.cpp:L168](../../SparkEditor/Source/VersionControl/VersionControlConflicts.cpp#L168) | | | `LinkCount` | function | GameModules | [TFSecondaryMotion.h:L75](../../GameModules/SparkGameMMOFPS/Source/Game/TFSecondaryMotion.h#L75) | | @@ -24380,9 +24422,9 @@ | `LinuxIsStdinPipe` | function | SparkConsole | [ConsoleApp.cpp:L77](../../SparkConsole/src/ConsoleApp.cpp#L77) | | | `LinuxKbhit` | function | SparkConsole | [ConsoleApp.cpp:L48](../../SparkConsole/src/ConsoleApp.cpp#L48) | | | `LinuxRHIState` | struct | SparkEngine | [GraphicsEngineRHI.h:L152](../../SparkEngine/Source/Graphics/GraphicsEngineRHI.h#L152) | | -| `LinuxSystemInfo` | function | SparkEngine | [CrashHandler.cpp:L1678](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1678) | | -| `LinuxSystemInfo` | function | SparkEngine | [CrashHandler.cpp:L2772](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2772) | | -| `LinuxThreadStacks` | function | SparkEngine | [CrashHandler.cpp:L1758](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1758) | | +| `LinuxSystemInfo` | function | SparkEngine | [CrashHandler.cpp:L1679](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1679) | | +| `LinuxSystemInfo` | function | SparkEngine | [CrashHandler.cpp:L2818](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2818) | | +| `LinuxThreadStacks` | function | SparkEngine | [CrashHandler.cpp:L1759](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1759) | | | `List` | function | GameModules | [TFCharacterSystem.h:L48](../../GameModules/SparkGameMMOFPS/Source/Account/TFCharacterSystem.h#L48) | | | `List` | alias | Tests | [TestTypeTraits.cpp:L102](../../Tests/TestTypeTraits.cpp#L102) | | | `List` | alias | Tests | [TestTypeTraits.cpp:L114](../../Tests/TestTypeTraits.cpp#L114) | | @@ -24410,7 +24452,7 @@ | `ListFiles` | function | SparkEngine | [VirtualFileSystem.h:L134](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L134) | Construct a provider rooted at the given directory. | | `ListFiles` | function | SparkEngine | [VirtualFileSystem.h:L217](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L217) | List files across all mounts, merging results (no duplicates). | | `ListFiles` | function | SparkEngine | [FileUtils.h:L397](../../SparkEngine/Source/Utils/FileUtils.h#L397) | | -| `ListFiles` | function | Tests | [TestSparkPak.cpp:L241](../../Tests/TestSparkPak.cpp#L241) | | +| `ListFiles` | function | Tests | [TestSparkPak.cpp:L247](../../Tests/TestSparkPak.cpp#L247) | | | `ListFilesRecursive` | function | SparkEngine | [FileUtils.h:L403](../../SparkEngine/Source/Utils/FileUtils.h#L403) | | | `ListFilesWith` | function | SparkEngine | [FileUtils.h:L367](../../SparkEngine/Source/Utils/FileUtils.h#L367) | | | `listing` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L458](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L458) | | @@ -24530,7 +24572,7 @@ | `LoadContinentMeta` | function | GameModules | [TFTravelSystem.h:L198](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L198) | | | `LoadCraftingState` | function | GameModules | [MMOPersistenceSystem.h:L295](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.h#L295) | | | `LoadCube` | function | Tests | [RHI210D3D11EngineFixture.h:L106](../../Tests/RHI210D3D11EngineFixture.h#L106) | | -| `LoadCustom` | function | SparkEngine | [SceneManager.h:L490](../../SparkEngine/Source/SceneManager/SceneManager.h#L490) | Load an authored INI or legacy `.scene` text file. | +| `LoadCustom` | function | SparkEngine | [SceneManager.h:L492](../../SparkEngine/Source/SceneManager/SceneManager.h#L492) | Load an authored INI or legacy `.scene` text file. | | `LoadDefaultMaterials` | function | SparkEditor | [MaterialEditorPanel.h:L224](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L224) | | | `LoadDemoTrack` | function | GameModules | [RacingTrackSystem.h:L172](../../GameModules/SparkGameRacing/Source/Track/RacingTrackSystem.h#L172) | | | `LoadDestination` | enum | SparkEngine | [DirectStorageLoader.h:L45](../../SparkEngine/Source/Engine/Streaming/DirectStorageLoader.h#L45) | Destination for loaded data | @@ -24593,7 +24635,7 @@ | `LoadGame` | function | GameModules | [OWEngineSystems.h:L51](../../GameModules/SparkGameOpenWorld/Source/Core/OWEngineSystems.h#L51) | Validate the slot's gameplay snapshot, then restore the world and gameplay state from it. | | `LoadGame` | function | GameModules | [RPGEngineSystems.h:L53](../../GameModules/SparkGameRPG/Source/Core/RPGEngineSystems.h#L53) | Load from a named slot | | `LoadGameModules` | function | SparkEngine | [SparkEngineWindowsInternal.h:L79](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L79) | Find the module manifest or fall back to the project selector. | -| `LoadGameModules` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L69](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L69) | | +| `LoadGameModules` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L70](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L70) | | | `LoadGameModulesLinux` | function | SparkEngine | [SparkEngineLinuxInit.cpp:L83](../../SparkEngine/Source/Core/SparkEngineLinuxInit.cpp#L83) | | | `LoadGeneration` | function | Tests | [TestSaveInterruptionReal.cpp:L272](../../Tests/TestSaveInterruptionReal.cpp#L272) | | | `LoadGLTF` | function | SparkEngine | [AssetPipeline.h:L613](../../SparkEngine/Source/Graphics/AssetPipeline.h#L613) | | @@ -24604,7 +24646,7 @@ | `LoadGLTFStaticMesh` | function | SparkEngine | [GLTFStaticMeshLoader.cpp:L241](../../SparkEngine/Source/Graphics/GLTFStaticMeshLoader.cpp#L241) | | | `LoadGLTFStaticMesh` | function | SparkEngine | [GLTFStaticMeshLoader.h:L49](../../SparkEngine/Source/Graphics/GLTFStaticMeshLoader.h#L49) | | | `LoadGraph` | function | SparkEditor | [VisualScriptPanel.h:L156](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L156) | | -| `LoadGround` | function | Tests | [TestTF120Travel.cpp:L116](../../Tests/TestTF120Travel.cpp#L116) | | +| `LoadGround` | function | Tests | [TestTF120Travel.cpp:L103](../../Tests/TestTF120Travel.cpp#L103) | | | `LoadGuilds` | function | GameModules | [MMOPersistenceSystem.h:L283](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.h#L283) | | | `LoadHeadlessArena` | function | GameModules | [SparkGameFPS.h:L78](../../GameModules/SparkGameFPS/Source/Core/SparkGameFPS.h#L78) | Load the authored arena for the no-render headless lifecycle. | | `LoadHeadlessModules` | function | SparkEngine | [SparkEngineWindowsHeadless.cpp:L212](../../SparkEngine/Source/Core/SparkEngineWindowsHeadless.cpp#L212) | Load modules and register console commands for headless mode. | @@ -24634,8 +24676,8 @@ | `LoadIni` | function | SparkEngine | [StartupSplash.cpp:L174](../../SparkEngine/Source/Core/StartupSplash.cpp#L174) | | | `LoadInventory` | function | GameModules | [MMOPersistenceSystem.h:L288](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.h#L288) | | | `LoadJSON` | function | SparkEditor | [SceneSerializer.h:L200](../../SparkEditor/Source/SceneSystem/SceneSerializer.h#L200) | Load scene from JSON format | -| `LoadJSON` | function | SparkEngine | [SceneManager.cpp:L1093](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1093) | | -| `LoadJSON` | function | SparkEngine | [SceneManager.h:L501](../../SparkEngine/Source/SceneManager/SceneManager.h#L501) | Deserialize versioned line-oriented scene text into metadata and nodes. | +| `LoadJSON` | function | SparkEngine | [SceneManager.cpp:L1209](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1209) | | +| `LoadJSON` | function | SparkEngine | [SceneManager.h:L503](../../SparkEngine/Source/SceneManager/SceneManager.h#L503) | Deserialize versioned line-oriented scene text into metadata and nodes. | | `LoadJsonFile` | function | GameModules | [TFDataTables.cpp:L62](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTables.cpp#L62) | | | `LoadKnownHosts` | function | SparkEngine | [NetworkTrustStore.cpp:L450](../../SparkEngine/Source/Engine/Networking/NetworkTrustStore.cpp#L450) | | | `LoadLanguage` | function | SparkEngine | [LocalizationSystem.h:L120](../../SparkEngine/Source/Engine/Localization/LocalizationSystem.h#L120) | Load a language from a JSON file. | @@ -24708,7 +24750,7 @@ | `LoadProjectTexture` | function | GameModules | [TFWorldSetupRender.cpp:L43](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetupRender.cpp#L43) | | | `LoadRaceData` | function | GameModules | [RacingEngineSystems.h:L72](../../GameModules/SparkGameRacing/Source/Core/RacingEngineSystems.h#L72) | Load race progress from a named slot. | | `LoadRecentProjectsList` | function | SparkEditor | [ProjectManager.h:L232](../../SparkEditor/Source/Core/ProjectManager.h#L232) | | -| `LoadReflected` | function | SparkEngine | [SceneManager.h:L479](../../SparkEngine/Source/SceneManager/SceneManager.h#L479) | Set the file cache for scene I/O (non-owning). | +| `LoadReflected` | function | SparkEngine | [SceneManager.h:L481](../../SparkEngine/Source/SceneManager/SceneManager.h#L481) | Set the file cache for scene I/O (non-owning). | | `LoadRegionMapDataSources` | function | SparkEditor | [RegionMapDataSource.cpp:L129](../../SparkEditor/Source/Panels/RegionMapDataSource.cpp#L129) | | | `LoadRegionMapDataSources` | function | SparkEditor | [RegionMapDataSource.h:L30](../../SparkEditor/Source/Panels/RegionMapDataSource.h#L30) | | | `LoadRejected` | function | Tests | [TestGLTFSkinnedMeshLoader.cpp:L237](../../Tests/TestGLTFSkinnedMeshLoader.cpp#L237) | | @@ -24728,9 +24770,9 @@ | `LoadScene` | function | SparkEditor | [SceneManager.h:L43](../../SparkEditor/Source/SceneSystem/SceneManager.h#L43) | Load a scene from disk (auto-detects format). | | `LoadScene` | function | SparkEditor | [SceneSerializer.cpp:L136](../../SparkEditor/Source/SceneSystem/SceneSerializer.cpp#L136) | | | `LoadScene` | function | SparkEditor | [SceneSerializer.h:L97](../../SparkEditor/Source/SceneSystem/SceneSerializer.h#L97) | | -| `LoadScene` | function | SparkEngine | [SceneManager.h:L179](../../SparkEngine/Source/SceneManager/SceneManager.h#L179) | | +| `LoadScene` | function | SparkEngine | [SceneManager.h:L181](../../SparkEngine/Source/SceneManager/SceneManager.h#L181) | | | `LoadSceneAndTerrain` | function | GameModules | [TFWorldSetup.h:L144](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetup.h#L144) | | -| `LoadSceneAsync` | function | SparkEngine | [SceneManager.h:L228](../../SparkEngine/Source/SceneManager/SceneManager.h#L228) | | +| `LoadSceneAsync` | function | SparkEngine | [SceneManager.h:L230](../../SparkEngine/Source/SceneManager/SceneManager.h#L230) | | | `LoadSceneTag` | function | Tests | [TestDocumentInterruptionReal.cpp:L263](../../Tests/TestDocumentInterruptionReal.cpp#L263) | | | `LoadScripts` | function | GameModules | [VisualScriptDemoWorld.h:L60](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.h#L60) | Select the first search root holding the complete manifest, then compile and validate every script. | | `LoadSentinelReplay` | function | Tests | [TestSEC3GameplayHardening.cpp:L169](../../Tests/TestSEC3GameplayHardening.cpp#L169) | | @@ -24768,7 +24810,7 @@ | `LoadStoreFromPath` | function | GameModules | [TFSocialSystem.h:L193](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L193) | | | `LoadSuitTable` | function | GameModules | [TFProgressionSystem.h:L265](../../GameModules/SparkGameMMOFPS/Source/Game/TFProgressionSystem.h#L265) | | | `LoadSystemFunction` | function | SparkEngine | [CrashArtifactDirectory.h:L145](../../SparkEngine/Source/Utils/CrashArtifactDirectory.h#L145) | | -| `LoadTable` | function | Tests | [TestTFDataTables.cpp:L63](../../Tests/TestTFDataTables.cpp#L63) | | +| `LoadTable` | function | Tests | [TestTFDataTables.cpp:L54](../../Tests/TestTFDataTables.cpp#L54) | | | `LoadTableFromFile` | function | SparkEngine | [DataTableSystem.h:L849](../../SparkEngine/Source/Engine/DataTable/DataTableSystem.h#L849) | Load a table from file, auto-detecting CSV vs JSON by extension. | | `LoadTemplates` | function | GameModules | [TFRegionDecor.h:L169](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionDecor.h#L169) | | | `LoadTemplates` | function | SparkLauncher | [LauncherApp.h:L40](../../SparkLauncher/src/LauncherApp.h#L40) | | @@ -24786,7 +24828,7 @@ | `LoadTileSync` | function | SparkEditor | [LevelStreamingSystem.h:L373](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.h#L373) | Load tile synchronously | | `LoadTree` | function | SparkEngine | [DialogueSystem.h:L208](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L208) | Load a dialogue tree from a JSON file. | | `LoadVertexShader` | function | SparkEngine | [Shader.h:L308](../../SparkEngine/Source/Graphics/Shader.h#L308) | Load and compile a vertex shader from file | -| `LoadViaFile` | function | Tests | [TestThirdPartyIntegration.cpp:L79](../../Tests/TestThirdPartyIntegration.cpp#L79) | | +| `LoadViaFile` | function | Tests | [TestThirdPartyIntegration.cpp:L95](../../Tests/TestThirdPartyIntegration.cpp#L95) | | | `LoadWAVFile` | function | SparkEngine | [OpenALAudioEngine.h:L188](../../SparkEngine/Source/Audio/OpenALAudioEngine.h#L188) | Load a WAV file and create an OpenAL buffer | | `LoadWeights` | function | SparkEngine | [NeuralPostProcessing.h:L74](../../SparkEngine/Source/Graphics/Neural/NeuralPostProcessing.h#L74) | Load pre-trained denoiser weights. | | `LoadWeights` | function | SparkEngine | [NeuralPostProcessing.h:L133](../../SparkEngine/Source/Graphics/Neural/NeuralPostProcessing.h#L133) | Load pre-trained SR weights. | @@ -24842,7 +24884,7 @@ | `LocalFileCache` | class | SparkEngine | [ConfigParser.h:L55](../../SparkEngine/Source/Utils/ConfigParser.h#L55) | | | `LocalFileCache` | class | SparkEngine | [LocalFileCache.h:L69](../../SparkEngine/Source/Utils/LocalFileCache.h#L69) | In-memory file cache with LRU eviction | | `LocalFileCache` | function | SparkEngine | [LocalFileCache.h:L75](../../SparkEngine/Source/Utils/LocalFileCache.h#L75) | | -| `LocalFileCache` | class | SparkSDK | [IEngineContext.h:L89](../../SparkSDK/Include/Spark/IEngineContext.h#L89) | | +| `LocalFileCache` | class | SparkSDK | [IEngineContext.h:L90](../../SparkSDK/Include/Spark/IEngineContext.h#L90) | | | `LocalFileProvider` | class | SparkEngine | [VirtualFileSystem.h:L125](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L125) | Filesystem-backed resource provider. | | `LocalFileProvider` | function | SparkEngine | [VirtualFileSystem.h:L129](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L129) | Construct a provider rooted at the given directory. | | `LocalFileProvider::Exists` | method | SparkEngine | [VirtualFileSystem.cpp:L183](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L183) | | @@ -24885,7 +24927,7 @@ | `LocalizationSettings` | struct | SparkEngine | [EngineSettings.h:L769](../../SparkEngine/Source/Core/EngineSettings.h#L769) | | | `LocalizationSystem` | class | GameModules | [ShowcaseLocalization.h:L20](../../GameModules/SparkGame/Source/Core/ShowcaseLocalization.h#L20) | | | `LocalizationSystem` | class | SparkEngine | [LocalizationSystem.h:L108](../../SparkEngine/Source/Engine/Localization/LocalizationSystem.h#L108) | Central localization manager — singleton accessible via Get(). | -| `LocalizationSystem` | class | SparkSDK | [IEngineContext.h:L96](../../SparkSDK/Include/Spark/IEngineContext.h#L96) | | +| `LocalizationSystem` | class | SparkSDK | [IEngineContext.h:L97](../../SparkSDK/Include/Spark/IEngineContext.h#L97) | | | `LocalizationSystem::Console_GetStatus` | method | SparkEngine | [LocalizationSystem.cpp:L158](../../SparkEngine/Source/Engine/Localization/LocalizationSystem.cpp#L158) | | | `LocalizationSystem::Console_ListKeys` | method | SparkEngine | [LocalizationSystem.cpp:L178](../../SparkEngine/Source/Engine/Localization/LocalizationSystem.cpp#L178) | | | `LocalizationSystem::FormatImpl` | method | SparkEngine | [LocalizationSystem.cpp:L109](../../SparkEngine/Source/Engine/Localization/LocalizationSystem.cpp#L109) | | @@ -24988,25 +25030,25 @@ | `lock` | function | SparkBuild | [ProcessRunner.cpp:L497](../../SparkBuild/src/ProcessRunner.cpp#L497) | | | `lock` | function | SparkBuild | [ProcessRunner.cpp:L696](../../SparkBuild/src/ProcessRunner.cpp#L696) | | | `lock` | function | SparkBuild | [ProcessRunner.cpp:L721](../../SparkBuild/src/ProcessRunner.cpp#L721) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L384](../../SparkBuild/tests/ProcessRunnerTests.cpp#L384) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L400](../../SparkBuild/tests/ProcessRunnerTests.cpp#L400) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L412](../../SparkBuild/tests/ProcessRunnerTests.cpp#L412) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L443](../../SparkBuild/tests/ProcessRunnerTests.cpp#L443) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L453](../../SparkBuild/tests/ProcessRunnerTests.cpp#L453) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L469](../../SparkBuild/tests/ProcessRunnerTests.cpp#L469) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L483](../../SparkBuild/tests/ProcessRunnerTests.cpp#L483) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L508](../../SparkBuild/tests/ProcessRunnerTests.cpp#L508) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L519](../../SparkBuild/tests/ProcessRunnerTests.cpp#L519) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L691](../../SparkBuild/tests/ProcessRunnerTests.cpp#L691) | | -| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L698](../../SparkBuild/tests/ProcessRunnerTests.cpp#L698) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L433](../../SparkConsole/src/ConsoleApp.cpp#L433) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L656](../../SparkConsole/src/ConsoleApp.cpp#L656) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L719](../../SparkConsole/src/ConsoleApp.cpp#L719) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L775](../../SparkConsole/src/ConsoleApp.cpp#L775) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L951](../../SparkConsole/src/ConsoleApp.cpp#L951) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L977](../../SparkConsole/src/ConsoleApp.cpp#L977) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L1094](../../SparkConsole/src/ConsoleApp.cpp#L1094) | | -| `lock` | function | SparkConsole | [ConsoleApp.cpp:L1176](../../SparkConsole/src/ConsoleApp.cpp#L1176) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L383](../../SparkBuild/tests/ProcessRunnerTests.cpp#L383) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L398](../../SparkBuild/tests/ProcessRunnerTests.cpp#L398) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L410](../../SparkBuild/tests/ProcessRunnerTests.cpp#L410) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L442](../../SparkBuild/tests/ProcessRunnerTests.cpp#L442) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L464](../../SparkBuild/tests/ProcessRunnerTests.cpp#L464) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L478](../../SparkBuild/tests/ProcessRunnerTests.cpp#L478) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L500](../../SparkBuild/tests/ProcessRunnerTests.cpp#L500) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L512](../../SparkBuild/tests/ProcessRunnerTests.cpp#L512) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L683](../../SparkBuild/tests/ProcessRunnerTests.cpp#L683) | | +| `lock` | function | SparkBuild | [ProcessRunnerTests.cpp:L689](../../SparkBuild/tests/ProcessRunnerTests.cpp#L689) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L220](../../SparkConsole/src/ConsoleApp.cpp#L220) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L437](../../SparkConsole/src/ConsoleApp.cpp#L437) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L660](../../SparkConsole/src/ConsoleApp.cpp#L660) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L723](../../SparkConsole/src/ConsoleApp.cpp#L723) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L779](../../SparkConsole/src/ConsoleApp.cpp#L779) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L955](../../SparkConsole/src/ConsoleApp.cpp#L955) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L981](../../SparkConsole/src/ConsoleApp.cpp#L981) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L1098](../../SparkConsole/src/ConsoleApp.cpp#L1098) | | +| `lock` | function | SparkConsole | [ConsoleApp.cpp:L1180](../../SparkConsole/src/ConsoleApp.cpp#L1180) | | | `lock` | function | SparkDaemon | [AssetService.cpp:L32](../../SparkDaemon/src/AssetService.cpp#L32) | | | `lock` | function | SparkDaemon | [AssetService.cpp:L67](../../SparkDaemon/src/AssetService.cpp#L67) | | | `lock` | function | SparkDaemon | [AssetService.cpp:L94](../../SparkDaemon/src/AssetService.cpp#L94) | | @@ -25300,8 +25342,8 @@ | `lock` | function | SparkEngine | [DynamicPluginHost.cpp:L567](../../SparkEngine/Source/Core/DynamicPluginHost.cpp#L567) | | | `lock` | function | SparkEngine | [DynamicPluginHost.cpp:L578](../../SparkEngine/Source/Core/DynamicPluginHost.cpp#L578) | | | `lock` | function | SparkEngine | [DynamicPluginHost.cpp:L583](../../SparkEngine/Source/Core/DynamicPluginHost.cpp#L583) | | -| `lock` | function | SparkEngine | [EngineContext.h:L361](../../SparkEngine/Source/Core/EngineContext.h#L361) | | -| `lock` | function | SparkEngine | [EngineContext.h:L379](../../SparkEngine/Source/Core/EngineContext.h#L379) | Retrieve a previously registered subsystem by type | +| `lock` | function | SparkEngine | [EngineContext.h:L364](../../SparkEngine/Source/Core/EngineContext.h#L364) | | +| `lock` | function | SparkEngine | [EngineContext.h:L382](../../SparkEngine/Source/Core/EngineContext.h#L382) | Retrieve a previously registered subsystem by type | | `lock` | function | SparkEngine | [FaultIsolation.cpp:L27](../../SparkEngine/Source/Core/FaultIsolation.cpp#L27) | | | `lock` | function | SparkEngine | [FaultIsolation.cpp:L86](../../SparkEngine/Source/Core/FaultIsolation.cpp#L86) | | | `lock` | function | SparkEngine | [FaultIsolation.cpp:L139](../../SparkEngine/Source/Core/FaultIsolation.cpp#L139) | | @@ -25861,26 +25903,26 @@ | `lock` | function | SparkEngine | [TextureSystemWindows.cpp:L201](../../SparkEngine/Source/Graphics/TextureSystemWindows.cpp#L201) | | | `lock` | function | SparkEngine | [TextureSystemWindows.cpp:L215](../../SparkEngine/Source/Graphics/TextureSystemWindows.cpp#L215) | | | `lock` | function | SparkEngine | [TextureSystemWindows.cpp:L221](../../SparkEngine/Source/Graphics/TextureSystemWindows.cpp#L221) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L330](../../SparkEngine/Source/Input/InputManager.cpp#L330) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L346](../../SparkEngine/Source/Input/InputManager.cpp#L346) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L362](../../SparkEngine/Source/Input/InputManager.cpp#L362) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L371](../../SparkEngine/Source/Input/InputManager.cpp#L371) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L380](../../SparkEngine/Source/Input/InputManager.cpp#L380) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L389](../../SparkEngine/Source/Input/InputManager.cpp#L389) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L400](../../SparkEngine/Source/Input/InputManager.cpp#L400) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L429](../../SparkEngine/Source/Input/InputManager.cpp#L429) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L447](../../SparkEngine/Source/Input/InputManager.cpp#L447) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L487](../../SparkEngine/Source/Input/InputManager.cpp#L487) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L496](../../SparkEngine/Source/Input/InputManager.cpp#L496) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L522](../../SparkEngine/Source/Input/InputManager.cpp#L522) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L528](../../SparkEngine/Source/Input/InputManager.cpp#L528) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L542](../../SparkEngine/Source/Input/InputManager.cpp#L542) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L564](../../SparkEngine/Source/Input/InputManager.cpp#L564) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L573](../../SparkEngine/Source/Input/InputManager.cpp#L573) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L613](../../SparkEngine/Source/Input/InputManager.cpp#L613) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L629](../../SparkEngine/Source/Input/InputManager.cpp#L629) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L657](../../SparkEngine/Source/Input/InputManager.cpp#L657) | | -| `lock` | function | SparkEngine | [InputManager.cpp:L667](../../SparkEngine/Source/Input/InputManager.cpp#L667) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L353](../../SparkEngine/Source/Input/InputManager.cpp#L353) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L369](../../SparkEngine/Source/Input/InputManager.cpp#L369) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L385](../../SparkEngine/Source/Input/InputManager.cpp#L385) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L394](../../SparkEngine/Source/Input/InputManager.cpp#L394) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L403](../../SparkEngine/Source/Input/InputManager.cpp#L403) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L412](../../SparkEngine/Source/Input/InputManager.cpp#L412) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L423](../../SparkEngine/Source/Input/InputManager.cpp#L423) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L452](../../SparkEngine/Source/Input/InputManager.cpp#L452) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L470](../../SparkEngine/Source/Input/InputManager.cpp#L470) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L510](../../SparkEngine/Source/Input/InputManager.cpp#L510) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L519](../../SparkEngine/Source/Input/InputManager.cpp#L519) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L545](../../SparkEngine/Source/Input/InputManager.cpp#L545) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L551](../../SparkEngine/Source/Input/InputManager.cpp#L551) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L565](../../SparkEngine/Source/Input/InputManager.cpp#L565) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L587](../../SparkEngine/Source/Input/InputManager.cpp#L587) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L596](../../SparkEngine/Source/Input/InputManager.cpp#L596) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L636](../../SparkEngine/Source/Input/InputManager.cpp#L636) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L652](../../SparkEngine/Source/Input/InputManager.cpp#L652) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L680](../../SparkEngine/Source/Input/InputManager.cpp#L680) | | +| `lock` | function | SparkEngine | [InputManager.cpp:L690](../../SparkEngine/Source/Input/InputManager.cpp#L690) | | | `lock` | function | SparkEngine | [PhysicsConsoleOps.cpp:L87](../../SparkEngine/Source/Physics/PhysicsConsoleOps.cpp#L87) | | | `lock` | function | SparkEngine | [PhysicsSpatialQueries.cpp:L46](../../SparkEngine/Source/Physics/PhysicsSpatialQueries.cpp#L46) | | | `lock` | function | SparkEngine | [PhysicsSpatialQueries.cpp:L107](../../SparkEngine/Source/Physics/PhysicsSpatialQueries.cpp#L107) | | @@ -25901,7 +25943,7 @@ | `lock` | function | SparkEngine | [PhysicsSystemQueries.cpp:L369](../../SparkEngine/Source/Physics/PhysicsSystemQueries.cpp#L369) | | | `lock` | function | SparkEngine | [PhysicsSystemStub.cpp:L714](../../SparkEngine/Source/Physics/PhysicsSystemStub.cpp#L714) | | | `lock` | function | SparkEngine | [PhysicsSystemStub.cpp:L848](../../SparkEngine/Source/Physics/PhysicsSystemStub.cpp#L848) | | -| `lock` | function | SparkEngine | [SceneManager.cpp:L701](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L701) | | +| `lock` | function | SparkEngine | [SceneManager.cpp:L773](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L773) | | | `lock` | function | SparkEngine | [Assert.cpp:L76](../../SparkEngine/Source/Utils/Assert.cpp#L76) | | | `lock` | function | SparkEngine | [AtomicSharedPtr.h:L51](../../SparkEngine/Source/Utils/AtomicSharedPtr.h#L51) | Atomically load the current pointer. | | `lock` | function | SparkEngine | [AtomicSharedPtr.h:L62](../../SparkEngine/Source/Utils/AtomicSharedPtr.h#L62) | Atomically store a new pointer. | @@ -25953,9 +25995,9 @@ | `lock` | function | SparkEngine | [CpuDebugger.h:L226](../../SparkEngine/Source/Utils/CpuDebugger.h#L226) | Get the number of tracked sections | | `lock` | function | SparkEngine | [CpuDebugger.h:L276](../../SparkEngine/Source/Utils/CpuDebugger.h#L276) | Print a compact summary to stderr | | `lock` | function | SparkEngine | [CpuDebugger.h:L299](../../SparkEngine/Source/Utils/CpuDebugger.h#L299) | Reset all tracking data | -| `lock` | function | SparkEngine | [CrashHandler.cpp:L1027](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1027) | | -| `lock` | function | SparkEngine | [CrashHandler.cpp:L2001](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2001) | | -| `lock` | function | SparkEngine | [CrashHandler.cpp:L2807](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2807) | | +| `lock` | function | SparkEngine | [CrashHandler.cpp:L1028](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1028) | | +| `lock` | function | SparkEngine | [CrashHandler.cpp:L2003](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2003) | | +| `lock` | function | SparkEngine | [CrashHandler.cpp:L2853](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2853) | | | `lock` | function | SparkEngine | [DaemonClient.cpp:L54](../../SparkEngine/Source/Utils/DaemonClient.cpp#L54) | | | `lock` | function | SparkEngine | [DaemonClient.cpp:L68](../../SparkEngine/Source/Utils/DaemonClient.cpp#L68) | | | `lock` | function | SparkEngine | [DaemonClient.cpp:L152](../../SparkEngine/Source/Utils/DaemonClient.cpp#L152) | | @@ -26230,7 +26272,7 @@ | `lockFile` | function | Tests | [TestTF120Residency.cpp:L594](../../Tests/TestTF120Residency.cpp#L594) | | | `LockFreeRingAllocator` | class | SparkEngine | [LockFreeRingAllocator.h:L31](../../SparkEngine/Source/Utils/LockFreeRingAllocator.h#L31) | Fixed-size ring buffer allocator with lock-free operation. | | `LockFunctionPolicy` | function | SparkEngine | [ScriptSandbox.h:L130](../../SparkEngine/Source/Engine/Scripting/ScriptSandbox.h#L130) | Freeze the level and the allow/block lists | -| `LockLoaderLock` | alias | Tests | [TestEditorCrashHandlerFilterReal.cpp:L505](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L505) | | +| `LockLoaderLock` | alias | Tests | [TestEditorCrashHandlerFilterReal.cpp:L507](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L507) | | | `lockLock` | function | SparkEditor | [CollaborativeEditSessionBroker.cpp:L119](../../SparkEditor/Source/Communication/CollaborativeEditSessionBroker.cpp#L119) | | | `LockoutEntry` | struct | Tests | [TestInstanceManager.cpp:L56](../../Tests/TestInstanceManager.cpp#L56) | | | `LockoutVerifier` | function | Tests | [TestMMOAuthHardening.cpp:L45](../../Tests/TestMMOAuthHardening.cpp#L45) | | @@ -26388,7 +26430,7 @@ | `LogInfo` | function | SparkEngine | [SparkConsole.h:L155](../../SparkEngine/Source/Utils/SparkConsole.h#L155) | | | `LoginOverWire` | function | Tests | [TestTFOnboarding.cpp:L1370](../../Tests/TestTFOnboarding.cpp#L1370) | | | `LoginPacket` | function | Tests | [TestSessionGateProtocol.cpp:L25](../../Tests/TestSessionGateProtocol.cpp#L25) | | -| `LogInputEvent` | function | SparkEngine | [InputManager.h:L500](../../SparkEngine/Source/Input/InputManager.h#L500) | Add input event to recent events log | +| `LogInputEvent` | function | SparkEngine | [InputManager.h:L507](../../SparkEngine/Source/Input/InputManager.h#L507) | Add input event to recent events log | | `LoginRecord` | struct | GameModules | [MMOAccountSystem.h:L52](../../GameModules/SparkGameMMO/Source/Account/MMOAccountSystem.h#L52) | A single login history entry | | `LoginTranscript` | struct | Tests | [TestTFOnboarding.cpp:L1362](../../Tests/TestTFOnboarding.cpp#L1362) | | | `LoginUIState` | enum | GameModules | [MMOLoginUI.h:L33](../../GameModules/SparkGameMMO/Source/UI/MMOLoginUI.h#L33) | UI flow state machine | @@ -26459,10 +26501,17 @@ | `Lookup` | function | Tests | [TestShaderDiskCache.cpp:L31](../../Tests/TestShaderDiskCache.cpp#L31) | | | `LookupCharacterStat` | function | GameModules | [RPGGameplayBridge.cpp:L290](../../GameModules/SparkGameRPG/Source/Gameplay/RPGGameplayBridge.cpp#L290) | | | `LookupContinentEndpoint` | function | GameModules | [TFTravelSystem.h:L141](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L141) | | +| `LookupExactKeyState` | function | SparkEngine | [InputManager.cpp:L198](../../SparkEngine/Source/Input/InputManager.cpp#L198) | | +| `LookupExactKeyState` | function | SparkEngine | [InputManager.cpp:L209](../../SparkEngine/Source/Input/InputManager.cpp#L209) | | +| `LookupExactKeyState` | function | SparkEngine | [InputManager.cpp:L212](../../SparkEngine/Source/Input/InputManager.cpp#L212) | | +| `LookupExactKeyState` | function | SparkEngine | [InputManager.cpp:L215](../../SparkEngine/Source/Input/InputManager.cpp#L215) | | +| `LookupExactKeyState` | function | SparkEngine | [InputManager.cpp:L218](../../SparkEngine/Source/Input/InputManager.cpp#L218) | | | `LookupFeatures` | function | SparkEngine | [NeuralRadianceCache.h:L159](../../SparkEngine/Source/Graphics/Neural/NeuralRadianceCache.h#L159) | Look up features from hash grid for a position. | | `LookupHandoffContinent` | function | GameModules | [TFTravelSystem.h:L144](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L144) | Resolve an explicit, unique gatewayAreaId to its durable continent key (never infer from mapId). | -| `LookupKeyState` | function | SparkEngine | [InputManager.cpp:L210](../../SparkEngine/Source/Input/InputManager.cpp#L210) | | -| `LookupKeyState` | function | SparkEngine | [InputManager.cpp:L219](../../SparkEngine/Source/Input/InputManager.cpp#L219) | | +| `LookupKeyState` | function | SparkEngine | [InputManager.cpp:L204](../../SparkEngine/Source/Input/InputManager.cpp#L204) | | +| `LookupKeyState` | function | SparkEngine | [InputManager.cpp:L225](../../SparkEngine/Source/Input/InputManager.cpp#L225) | | +| `LookupKeyState` | function | SparkEngine | [InputManager.cpp:L235](../../SparkEngine/Source/Input/InputManager.cpp#L235) | | +| `LookupKeyState` | function | SparkEngine | [InputManager.cpp:L241](../../SparkEngine/Source/Input/InputManager.cpp#L241) | | | `loopbackMode` | function | Tests | [TestNetworkManagerIntegration.cpp:L1222](../../Tests/TestNetworkManagerIntegration.cpp#L1222) | | | `LoopbackPeer` | class | Tests | [TestFPSMultiplayer.cpp:L312](../../Tests/TestFPSMultiplayer.cpp#L312) | | | `LoopbackServerOptions` | function | Tests | [TestSparkServerHealth.cpp:L114](../../Tests/TestSparkServerHealth.cpp#L114) | | @@ -26549,11 +26598,11 @@ | `Magenta` | function | SparkBuild | [Terminal.h:L22](../../SparkBuild/src/Terminal.h#L22) | | | `Magenta` | function | SparkEngine | [ColorUtils.h:L61](../../SparkEngine/Source/Utils/ColorUtils.h#L61) | | | `Magenta` | function | SparkEngine | [DebugDraw.h:L60](../../SparkEngine/Source/Utils/DebugDraw.h#L60) | | -| `main` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L72](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L72) | | +| `main` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L74](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L74) | | | `main` | function | SparkAutomation | [main.cpp:L493](../../SparkAutomation/src/main.cpp#L493) | | | `main` | function | SparkBuild | [main.cpp:L175](../../SparkBuild/src/main.cpp#L175) | | | `main` | function | SparkBuild | [DownloaderTests.cpp:L959](../../SparkBuild/tests/DownloaderTests.cpp#L959) | | -| `main` | function | SparkBuild | [ProcessRunnerTests.cpp:L726](../../SparkBuild/tests/ProcessRunnerTests.cpp#L726) | | +| `main` | function | SparkBuild | [ProcessRunnerTests.cpp:L717](../../SparkBuild/tests/ProcessRunnerTests.cpp#L717) | | | `main` | function | SparkConsole | [main.cpp:L26](../../SparkConsole/src/main.cpp#L26) | | | `main` | function | SparkCooker | [main.cpp:L324](../../SparkCooker/src/main.cpp#L324) | | | `main` | function | SparkCrashReporter | [main.cpp:L50](../../SparkCrashReporter/src/main.cpp#L50) | | @@ -26580,7 +26629,7 @@ | `main` | function | SparkInstaller | [GitContractTests.cpp:L181](../../SparkInstaller/tests/GitContractTests.cpp#L181) | | | `main` | function | SparkInstaller | [InstallStateTests.cpp:L379](../../SparkInstaller/tests/InstallStateTests.cpp#L379) | | | `main` | function | SparkInstaller | [InstallerTransactionTests.cpp:L1368](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L1368) | | -| `main` | function | SparkLauncher | [main.cpp:L104](../../SparkLauncher/src/main.cpp#L104) | | +| `main` | function | SparkLauncher | [main.cpp:L107](../../SparkLauncher/src/main.cpp#L107) | | | `main` | function | SparkServer | [main.cpp:L60](../../SparkServer/src/main.cpp#L60) | | | `main` | function | SparkShaderCompiler | [main.cpp:L650](../../SparkShaderCompiler/src/main.cpp#L650) | | | `main` | function | SparkWorker | [main.cpp:L7](../../SparkWorker/src/main.cpp#L7) | | @@ -26602,6 +26651,7 @@ | `main` | function | Tests | [weapons.cpp:L87](../../Tests/PackageSmoke/FPSProgression/weapons.cpp#L87) | | | `main` | function | Tests | [main.cpp:L30](../../Tests/PackageSmoke/main.cpp#L30) | | | `main` | function | Tests | [DebugHookTeardownProbe.cpp:L8](../../Tests/Teardown/DebugHookTeardownProbe.cpp#L8) | Process-boundary regression probe for debug-hook static lifetime. | +| `main` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L84](../../Tests/TestFPSGameCameraReloadReal.cpp#L84) | | | `main` | function | Tests | [TestMain.cpp:L596](../../Tests/TestMain.cpp#L596) | | | `main` | function | Tests | [RemoteDebugSecurityBoundaryProbe.cpp:L314](../../Tests/Tools/RemoteDebugSecurityBoundaryProbe.cpp#L314) | | | `mainFile` | function | Tests | [TestEngineSettingsReal.cpp:L258](../../Tests/TestEngineSettingsReal.cpp#L258) | | @@ -26629,7 +26679,7 @@ | `MakeBlockoutName` | function | SparkEditor | [PrototypingSystem.h:L137](../../SparkEditor/Source/Prototyping/PrototypingSystem.h#L137) | | | `MakeBlurInput` | function | Tests | [TestRHI230VulkanGoldenReal.cpp:L256](../../Tests/TestRHI230VulkanGoldenReal.cpp#L256) | | | `MakeBlurInput` | function | Tests | [TestRHI240OpenGLGoldenReal.cpp:L288](../../Tests/TestRHI240OpenGLGoldenReal.cpp#L288) | | -| `MakeBmp` | function | Tests | [TestThirdPartyIntegration.cpp:L63](../../Tests/TestThirdPartyIntegration.cpp#L63) | | +| `MakeBmp` | function | Tests | [TestThirdPartyIntegration.cpp:L79](../../Tests/TestThirdPartyIntegration.cpp#L79) | | | `MakeBody` | function | Tests | [TestENG200ScriptBindingsReal.cpp:L411](../../Tests/TestENG200ScriptBindingsReal.cpp#L411) | | | `MakeBuffer` | function | Tests | [TestDenoiserInterface.cpp:L109](../../Tests/TestDenoiserInterface.cpp#L109) | | | `MakeBuffer` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L431](../../Tests/TestRHI225D3D12ParityReal.cpp#L431) | | @@ -26657,9 +26707,9 @@ | `MakeCoverPoint` | function | Tests | [TestCoverageAI.cpp:L69](../../Tests/TestCoverageAI.cpp#L69) | | | `MakeCrashCanary` | function | Tests | [TestCrashHandlerGatingReal.cpp:L272](../../Tests/TestCrashHandlerGatingReal.cpp#L272) | | | `MakeCrashRedactionContext` | function | SparkEngine | [CrashRedactionContext.h:L129](../../SparkEngine/Source/Utils/CrashRedactionContext.h#L129) | | -| `MakeCrashReportId` | function | SparkEngine | [CrashHandler.cpp:L115](../../SparkEngine/Source/Utils/CrashHandler.cpp#L115) | | +| `MakeCrashReportId` | function | SparkEngine | [CrashHandler.cpp:L116](../../SparkEngine/Source/Utils/CrashHandler.cpp#L116) | | | `MakeCrate` | function | Tests | [TestPrefabPersistence.cpp:L84](../../Tests/TestPrefabPersistence.cpp#L84) | | -| `MakeCreate` | function | GameModules | [TFReplication.h:L96](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L96) | | +| `MakeCreate` | function | GameModules | [TFReplication.h:L101](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L101) | | | `MakeCube` | function | Tests | [TestLODGenerator.cpp:L161](../../Tests/TestLODGenerator.cpp#L161) | | | `MakeCube` | function | Tests | [TestLODGeneratorPhaseGG.cpp:L20](../../Tests/TestLODGeneratorPhaseGG.cpp#L20) | | | `MakeD3D11Options` | function | Tests | [TestShaderCompilerReal.cpp:L44](../../Tests/TestShaderCompilerReal.cpp#L44) | | @@ -26769,7 +26819,7 @@ | `MakeLinearTree` | function | Tests | [TestDialogueStress.cpp:L13](../../Tests/TestDialogueStress.cpp#L13) | | | `MakeLink` | function | Tests | [TestNavMeshLink.cpp:L17](../../Tests/TestNavMeshLink.cpp#L17) | | | `MakeLoginChallenge` | function | GameModules | [TFScramWire.cpp:L180](../../GameModules/SparkGameMMOFPS/Source/Net/TFScramWire.cpp#L180) | | -| `MakeManifestJson` | function | SparkEngine | [CrashHandler.cpp:L678](../../SparkEngine/Source/Utils/CrashHandler.cpp#L678) | | +| `MakeManifestJson` | function | SparkEngine | [CrashHandler.cpp:L679](../../SparkEngine/Source/Utils/CrashHandler.cpp#L679) | | | `MakeMinimalMesh` | function | Tests | [TestFBXImportValidation.cpp:L13](../../Tests/TestFBXImportValidation.cpp#L13) | | | `MakeMismatchedDescriptor` | function | Tests | [MismatchedModule.cpp:L23](../../Tests/Fixtures/ModuleABI/MismatchedModule.cpp#L23) | | | `MakeMod310TempDir` | function | Tests | [TestMOD310FPSSceneReloadRespawnReal.cpp:L40](../../Tests/TestMOD310FPSSceneReloadRespawnReal.cpp#L40) | | @@ -26838,7 +26888,7 @@ | `MakeTempDir` | function | Tests | [TestShaderHotReloadPhaseU.cpp:L35](../../Tests/TestShaderHotReloadPhaseU.cpp#L35) | | | `MakeTempDir` | function | Tests | [TestSparkGameFPSLoopReal.cpp:L49](../../Tests/TestSparkGameFPSLoopReal.cpp#L49) | | | `MakeTempModsDir` | function | Tests | [Test_persistence_ModSystem.cpp:L20](../../Tests/harden/Test_persistence_ModSystem.cpp#L20) | | -| `MakeTemporaryName` | function | SparkEngine | [SceneManager.cpp:L218](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L218) | | +| `MakeTemporaryName` | function | SparkEngine | [SceneManager.cpp:L236](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L236) | | | `MakeTemporarySibling` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L57](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L57) | | | `MakeTemporarySibling` | function | SparkEditor | [JSONSceneSerializer.cpp:L95](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L95) | | | `MakeTempSaveDir` | function | Tests | [Test_persistence_SaveSystem.cpp:L95](../../Tests/harden/Test_persistence_SaveSystem.cpp#L95) | | @@ -26852,9 +26902,9 @@ | `MakeTexture` | function | Tests | [OpenGLTestSupport.h:L133](../../Tests/OpenGLTestSupport.h#L133) | | | `MakeTexture` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L454](../../Tests/TestRHI225D3D12ParityReal.cpp#L454) | | | `MakeTexture` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L470](../../Tests/TestRHI225D3D12ParityReal.cpp#L470) | | -| `MakeTimeStamp` | function | SparkEngine | [CrashHandler.cpp:L822](../../SparkEngine/Source/Utils/CrashHandler.cpp#L822) | | -| `MakeTimeStamp` | function | SparkEngine | [CrashHandler.cpp:L1331](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1331) | | -| `MakeTimeStampUtf8` | function | SparkEngine | [CrashHandler.cpp:L123](../../SparkEngine/Source/Utils/CrashHandler.cpp#L123) | | +| `MakeTimeStamp` | function | SparkEngine | [CrashHandler.cpp:L823](../../SparkEngine/Source/Utils/CrashHandler.cpp#L823) | | +| `MakeTimeStamp` | function | SparkEngine | [CrashHandler.cpp:L1332](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1332) | | +| `MakeTimeStampUtf8` | function | SparkEngine | [CrashHandler.cpp:L124](../../SparkEngine/Source/Utils/CrashHandler.cpp#L124) | | | `MakeTone` | function | Tests | [TestHRTFProcessor.cpp:L22](../../Tests/TestHRTFProcessor.cpp#L22) | | | `MakeTouch` | function | Tests | [Test_engine-misc_MobileGestures.cpp:L17](../../Tests/harden/Test_engine-misc_MobileGestures.cpp#L17) | | | `MakeTransformRecord` | function | Tests | [TestSaveSystemRoundTripReal.cpp:L53](../../Tests/TestSaveSystemRoundTripReal.cpp#L53) | | @@ -26866,7 +26916,7 @@ | `MakeUnicodeCacheDir` | function | Tests | [TestShaderDiskCachePhaseV.cpp:L80](../../Tests/TestShaderDiskCachePhaseV.cpp#L80) | | | `MakeUniqueDirectory` | function | Tests | [TestConsoleProcessPipeReal.cpp:L16](../../Tests/TestConsoleProcessPipeReal.cpp#L16) | | | `MakeUniqueLogDirectory` | function | Tests | [TestLoggerSinksReal.cpp:L18](../../Tests/TestLoggerSinksReal.cpp#L18) | | -| `MakeUniqueTemporaryPath` | function | SparkEngine | [SceneManager.cpp:L158](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L158) | | +| `MakeUniqueTemporaryPath` | function | SparkEngine | [SceneManager.cpp:L166](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L166) | | | `MakeUnitPrimitive` | function | Tests | [TestBVHAccelerator.cpp:L39](../../Tests/TestBVHAccelerator.cpp#L39) | | | `MakeVolume` | function | Tests | [TestFoliageSystem.cpp:L38](../../Tests/TestFoliageSystem.cpp#L38) | | | `MakeWallDepth` | function | Tests | [TestGTAOEffect.cpp:L37](../../Tests/TestGTAOEffect.cpp#L37) | | @@ -26886,10 +26936,10 @@ | `ManagedTimer` | struct | SparkEngine | [TimerManager.h:L66](../../SparkEngine/Source/Utils/TimerManager.h#L66) | A single managed timer | | `manager` | function | Tests | [TestEditorSubsystems.cpp:L1486](../../Tests/TestEditorSubsystems.cpp#L1486) | | | `manager` | function | Tests | [TestEditorSubsystems.cpp:L1536](../../Tests/TestEditorSubsystems.cpp#L1536) | | -| `manager` | function | Tests | [TestSceneManagerReflectedReal.cpp:L53](../../Tests/TestSceneManagerReflectedReal.cpp#L53) | | +| `manager` | function | Tests | [TestSceneManagerReflectedReal.cpp:L78](../../Tests/TestSceneManagerReflectedReal.cpp#L78) | | | `ManagerScope` | struct | Tests | [TestLIFE200ModuleReloadLoopReal.cpp:L117](../../Tests/TestLIFE200ModuleReloadLoopReal.cpp#L117) | | | `ManagerScope` | struct | Tests | [TestLIFE200ModuleReloadReal.cpp:L114](../../Tests/TestLIFE200ModuleReloadReal.cpp#L114) | | -| `manifest` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L225](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L225) | | +| `manifest` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L226](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L226) | | | `manifest` | function | Tests | [TestEditorPanelsRealBackends.cpp:L233](../../Tests/TestEditorPanelsRealBackends.cpp#L233) | | | `manifest` | function | Tests | [TestModuleABI.cpp:L401](../../Tests/TestModuleABI.cpp#L401) | | | `manifest` | function | Tests | [TestModuleABI.cpp:L422](../../Tests/TestModuleABI.cpp#L422) | | @@ -26938,7 +26988,7 @@ | `MarkDirty` | function | SparkEngine | [UIDirtyTracking.h:L167](../../SparkEngine/Source/Engine/UI/UIDirtyTracking.h#L167) | Mark screen region as dirty | | `MarkDirty` | function | SparkEngine | [PipelineStateCache.h:L323](../../SparkEngine/Source/Graphics/PipelineStateCache.h#L323) | Mark specific state categories as dirty. | | `MarkDirty` | function | SparkEngine | [TerrainRenderer.h:L123](../../SparkEngine/Source/Graphics/TerrainRenderer.h#L123) | Mark a terrain as needing mesh rebuild (e.g., after sculpting). | -| `MarkDirty` | function | SparkEngine | [SceneManager.h:L362](../../SparkEngine/Source/SceneManager/SceneManager.h#L362) | Explicitly mark the scene as having unsaved changes. | +| `MarkDirty` | function | SparkEngine | [SceneManager.h:L364](../../SparkEngine/Source/SceneManager/SceneManager.h#L364) | Explicitly mark the scene as having unsaved changes. | | `MarkDirty` | function | SparkEngine | [SplinePath.h:L150](../../SparkEngine/Source/Utils/SplinePath.h#L150) | | | `MarkDirty` | function | Tests | [TestReplicationFields.cpp:L131](../../Tests/TestReplicationFields.cpp#L131) | | | `MarkDirty` | function | Tests | [TestSceneManager.cpp:L158](../../Tests/TestSceneManager.cpp#L158) | | @@ -27068,38 +27118,39 @@ | `MaterialCBSlot` | struct | SparkEngine | [PersistentMaterialCB.h:L35](../../SparkEngine/Source/Graphics/PersistentMaterialCB.h#L35) | | | `MaterialChangeReactiveSystem` | class | SparkEngine | [ReactiveSystem.h:L184](../../SparkEngine/Source/Engine/ECS/ReactiveSystem.h#L184) | Concrete reactive system for MeshRenderer material changes. | | `MaterialConstants` | struct | SparkEngine | [MaterialSystem.h:L40](../../SparkEngine/Source/Graphics/MaterialSystem.h#L40) | GPU-aligned constant buffer matching HLSL material layout | +| `MaterialDefinition` | struct | SparkEditor | [MaterialEditorMaterialParser.h:L10](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.h#L10) | Shared material schema and production text-parser entry for editor files and fuzzing. | | `MaterialDefinition` | struct | SparkEditor | [MaterialEditorPanel.h:L129](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L129) | Complete material definition. | | `MaterialDefinition` | struct | SparkEngine | [MaterialDefinition.h:L150](../../SparkEngine/Source/Graphics/MaterialDefinition.h#L150) | A complete declarative material definition. | | `MaterialDefinitionRegistry` | class | SparkEngine | [MaterialDefinition.h:L475](../../SparkEngine/Source/Graphics/MaterialDefinition.h#L475) | Registry of material definitions, keyed by name. | | `MaterialDoc` | struct | SparkEditor | [BasicMaterialEditorPanel.h:L60](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L60) | One material JSON document loaded into editable fields. | | `MaterialEditorPanel` | class | SparkEditor | [MaterialEditorPanel.h:L185](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L185) | | -| `MaterialEditorPanel::CreateMaterial` | method | SparkEditor | [MaterialEditorPanel.cpp:L301](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L301) | | -| `MaterialEditorPanel::GetSelectedMaterial` | method | SparkEditor | [MaterialEditorPanel.cpp:L684](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L684) | | -| `MaterialEditorPanel::HandleEvent` | method | SparkEditor | [MaterialEditorPanel.cpp:L210](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L210) | | -| `MaterialEditorPanel::HasUnsavedChanges` | method | SparkEditor | [MaterialEditorPanel.cpp:L430](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L430) | | -| `MaterialEditorPanel::Initialize` | method | SparkEditor | [MaterialEditorPanel.cpp:L38](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L38) | | -| `MaterialEditorPanel::LoadDefaultMaterials` | method | SparkEditor | [MaterialEditorPreview.cpp:L332](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L332) | | -| `MaterialEditorPanel::OpenMaterial` | method | SparkEditor | [MaterialEditorPanel.cpp:L256](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L256) | | -| `MaterialEditorPanel::PopulateAvailableShaders` | method | SparkEditor | [MaterialEditorPanel.cpp:L53](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L53) | | -| `MaterialEditorPanel::PopulateDefaultPBRParameters` | method | SparkEditor | [MaterialEditorPreview.cpp:L588](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L588) | | -| `MaterialEditorPanel::Render` | method | SparkEditor | [MaterialEditorPanel.cpp:L124](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L124) | | +| `MaterialEditorPanel::CreateMaterial` | method | SparkEditor | [MaterialEditorFiles.cpp:L66](../../SparkEditor/Source/Panels/MaterialEditorFiles.cpp#L66) | | +| `MaterialEditorPanel::GetSelectedMaterial` | method | SparkEditor | [MaterialEditorPanel.cpp:L514](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L514) | | +| `MaterialEditorPanel::HandleEvent` | method | SparkEditor | [MaterialEditorPanel.cpp:L214](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L214) | | +| `MaterialEditorPanel::HasUnsavedChanges` | method | SparkEditor | [MaterialEditorPanel.cpp:L260](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L260) | | +| `MaterialEditorPanel::Initialize` | method | SparkEditor | [MaterialEditorPanel.cpp:L42](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L42) | | +| `MaterialEditorPanel::LoadDefaultMaterials` | method | SparkEditor | [MaterialEditorPreview.cpp:L333](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L333) | | +| `MaterialEditorPanel::OpenMaterial` | method | SparkEditor | [MaterialEditorFiles.cpp:L23](../../SparkEditor/Source/Panels/MaterialEditorFiles.cpp#L23) | | +| `MaterialEditorPanel::PopulateAvailableShaders` | method | SparkEditor | [MaterialEditorPanel.cpp:L57](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L57) | | +| `MaterialEditorPanel::PopulateDefaultPBRParameters` | method | SparkEditor | [MaterialEditorPreview.cpp:L589](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L589) | | +| `MaterialEditorPanel::Render` | method | SparkEditor | [MaterialEditorPanel.cpp:L128](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L128) | | | `MaterialEditorPanel::RenderBoolParam` | method | SparkEditor | [MaterialEditorParameters.cpp:L265](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L265) | | | `MaterialEditorPanel::RenderColorParam` | method | SparkEditor | [MaterialEditorParameters.cpp:L244](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L244) | | | `MaterialEditorPanel::RenderFloatParam` | method | SparkEditor | [MaterialEditorParameters.cpp:L199](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L199) | | -| `MaterialEditorPanel::RenderMaterialList` | method | SparkEditor | [MaterialEditorPanel.cpp:L574](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L574) | | +| `MaterialEditorPanel::RenderMaterialList` | method | SparkEditor | [MaterialEditorPanel.cpp:L404](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L404) | | | `MaterialEditorPanel::RenderParameterEditor` | method | SparkEditor | [MaterialEditorParameters.cpp:L92](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L92) | | | `MaterialEditorPanel::RenderParameterGroup` | method | SparkEditor | [MaterialEditorParameters.cpp:L127](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L127) | | -| `MaterialEditorPanel::RenderPreview` | method | SparkEditor | [MaterialEditorPreview.cpp:L149](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L149) | | -| `MaterialEditorPanel::RenderRenderStateEditor` | method | SparkEditor | [MaterialEditorPreview.cpp:L26](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L26) | | +| `MaterialEditorPanel::RenderPreview` | method | SparkEditor | [MaterialEditorPreview.cpp:L150](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L150) | | +| `MaterialEditorPanel::RenderRenderStateEditor` | method | SparkEditor | [MaterialEditorPreview.cpp:L27](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L27) | | | `MaterialEditorPanel::RenderShaderSelector` | method | SparkEditor | [MaterialEditorParameters.cpp:L27](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L27) | | | `MaterialEditorPanel::RenderTextureParam` | method | SparkEditor | [MaterialEditorParameters.cpp:L279](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L279) | | | `MaterialEditorPanel::RenderTextureSlotEditor` | method | SparkEditor | [MaterialEditorParameters.cpp:L408](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L408) | | | `MaterialEditorPanel::RenderTextureSlots` | method | SparkEditor | [MaterialEditorParameters.cpp:L377](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L377) | | -| `MaterialEditorPanel::RenderToolbar` | method | SparkEditor | [MaterialEditorPanel.cpp:L446](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L446) | | +| `MaterialEditorPanel::RenderToolbar` | method | SparkEditor | [MaterialEditorPanel.cpp:L276](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L276) | | | `MaterialEditorPanel::RenderVectorParam` | method | SparkEditor | [MaterialEditorParameters.cpp:L214](../../SparkEditor/Source/Panels/MaterialEditorParameters.cpp#L214) | | -| `MaterialEditorPanel::SaveMaterial` | method | SparkEditor | [MaterialEditorPanel.cpp:L320](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L320) | | -| `MaterialEditorPanel::Shutdown` | method | SparkEditor | [MaterialEditorPanel.cpp:L201](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L201) | | -| `MaterialEditorPanel::Update` | method | SparkEditor | [MaterialEditorPanel.cpp:L116](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L116) | | +| `MaterialEditorPanel::SaveMaterial` | method | SparkEditor | [MaterialEditorFiles.cpp:L85](../../SparkEditor/Source/Panels/MaterialEditorFiles.cpp#L85) | | +| `MaterialEditorPanel::Shutdown` | method | SparkEditor | [MaterialEditorPanel.cpp:L205](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L205) | | +| `MaterialEditorPanel::Update` | method | SparkEditor | [MaterialEditorPanel.cpp:L120](../../SparkEditor/Source/Panels/MaterialEditorPanel.cpp#L120) | | | `MaterialEffect` | struct | SparkEngine | [MaterialEffects.h:L66](../../SparkEngine/Source/Engine/Gameplay/MaterialEffects.h#L66) | Describes the particle, sound, and decal effects for a material interaction. | | `MaterialEffect` | struct | Tests | [TestMaterialEffects.cpp:L33](../../Tests/TestMaterialEffects.cpp#L33) | | | `MaterialEffectSystem` | class | SparkEngine | [MaterialEffects.h:L89](../../SparkEngine/Source/Engine/Gameplay/MaterialEffects.h#L89) | Resolves and triggers material interaction effects. | @@ -27218,6 +27269,8 @@ | `MaterialTextureValidator::GetRuleName` | method | SparkEngine | [AssetValidator.cpp:L79](../../SparkEngine/Source/Core/AssetValidator.cpp#L79) | | | `MaterialTextureValidator::ValidateAsset` | method | SparkEngine | [AssetValidator.cpp:L42](../../SparkEngine/Source/Core/AssetValidator.cpp#L42) | | | `MaterialValues` | struct | Tests | [TestRHI210D3D11SceneGoldenReal.cpp:L91](../../Tests/TestRHI210D3D11SceneGoldenReal.cpp#L91) | | +| `MaterialWorkingDirectoryGuard` | class | Tests | [TestEditorSubsystemsReal.cpp:L71](../../Tests/TestEditorSubsystemsReal.cpp#L71) | | +| `MaterialWorkingDirectoryGuard` | function | Tests | [TestEditorSubsystemsReal.cpp:L74](../../Tests/TestEditorSubsystemsReal.cpp#L74) | | | `MatHandle` | struct | Tests | [TestExtendedSystems.cpp:L769](../../Tests/TestExtendedSystems.cpp#L769) | | | `MathUtils` | class | SparkEngine | [MathUtils.h:L68](../../SparkEngine/Source/Utils/MathUtils.h#L68) | | | `MathUtils::Add` | method | SparkEngine | [MathUtils.cpp:L152](../../SparkEngine/Source/Utils/MathUtils.cpp#L152) | | @@ -27448,7 +27501,7 @@ | `meshletVertexMap` | function | SparkEngine | [MeshOptimizer.h:L319](../../SparkEngine/Source/Graphics/MeshOptimizer.h#L319) | | | `MeshOf` | function | Tests | [TestMOD330ARPGWorldActors.cpp:L132](../../Tests/TestMOD330ARPGWorldActors.cpp#L132) | | | `MeshOptimizer` | class | SparkEngine | [MeshOptimizer.h:L80](../../SparkEngine/Source/Graphics/MeshOptimizer.h#L80) | Static mesh optimization utility | -| `meshPath` | function | SparkEngine | [SceneManagerReflected.cpp:L131](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L131) | | +| `meshPath` | function | SparkEngine | [SceneManagerReflected.cpp:L196](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L196) | | | `MeshPath` | function | Tests | [TestEditorAssetDropWorldReal.cpp:L143](../../Tests/TestEditorAssetDropWorldReal.cpp#L143) | | | `MeshProcessor` | class | SparkEditor | [AdvancedAssetPipeline.h:L116](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L116) | Mesh asset processor | | `MeshProcessor::GenerateAutoLODs` | method | SparkEditor | [AssetProcessors.cpp:L504](../../SparkEditor/Source/AssetPipeline/AssetProcessors.cpp#L504) | | @@ -27478,7 +27531,7 @@ | `MeshSimplifier::SimplifyByRatio` | method | SparkEngine | [MeshLODWindows.cpp:L189](../../SparkEngine/Source/Graphics/MeshLODWindows.cpp#L189) | | | `MeshSubmesh` | struct | SparkEngine | [MeshTypes.h:L77](../../SparkEngine/Source/Graphics/MeshTypes.h#L77) | Per-material index range within a mesh loaded from an OBJ file. | | `MeshTopology` | enum | SparkEngine | [GraphicsEnums.h:L53](../../SparkEngine/Source/Enums/GraphicsEnums.h#L53) | Mesh topology types | -| `message` | function | SparkConsole | [ConsoleApp.cpp:L473](../../SparkConsole/src/ConsoleApp.cpp#L473) | | +| `message` | function | SparkConsole | [ConsoleApp.cpp:L477](../../SparkConsole/src/ConsoleApp.cpp#L477) | | | `message` | function | Tests | [TestNetworkMMOIntegration.cpp:L88](../../Tests/TestNetworkMMOIntegration.cpp#L88) | | | `MessageBoxA` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1583](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1583) | | | `MessageBoxA` | function | SparkEngine | [PlatformTypes.h:L387](../../SparkEngine/Source/Core/PlatformTypes.h#L387) | | @@ -27497,10 +27550,10 @@ | `Meta` | struct | GameModules | [TFPlayerMeta.h:L85](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFPlayerMeta.h#L85) | | | `metadata` | struct | SparkDaemon | [OrchestratorIdentity.cpp:L156](../../SparkDaemon/src/OrchestratorIdentity.cpp#L156) | | | `metadata` | struct | SparkDaemon | [OrchestratorIdentity.cpp:L180](../../SparkDaemon/src/OrchestratorIdentity.cpp#L180) | | -| `metadata` | struct | SparkEngine | [CrashHandler.cpp:L2326](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2326) | | +| `metadata` | struct | SparkEngine | [CrashHandler.cpp:L2364](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2364) | | | `metadata` | function | Tests | [TestPluginABI.cpp:L375](../../Tests/TestPluginABI.cpp#L375) | | | `MetadataPath` | function | SparkEngine | [PluginMetadata.cpp:L35](../../SparkEngine/Source/Core/PluginMetadata.cpp#L35) | | -| `metaFile` | function | SparkEditor | [EditorUI.cpp:L1344](../../SparkEditor/Source/Core/EditorUI.cpp#L1344) | | +| `metaFile` | function | SparkEditor | [EditorUI.cpp:L1364](../../SparkEditor/Source/Core/EditorUI.cpp#L1364) | | | `MetalArgumentBuffer` | class | SparkEngine | [MetalDevice.h:L293](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L293) | Wraps a Metal argument buffer for bindless resource binding. | | `MetalArgumentBuffer` | function | SparkEngine | [MetalDevice.mm:L1310](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.mm#L1310) | | | `MetalArgumentBuffer::SetBuffer` | method | SparkEngine | [MetalDevice.mm:L90](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.mm#L90) | | @@ -28190,6 +28243,7 @@ | `ModeName` | function | SparkEngine | [UpscalingSystem.h:L387](../../SparkEngine/Source/Graphics/UpscalingSystem.h#L387) | Human-readable name of an upscaling mode. | | `modes` | function | SparkEngine | [VulkanSwapChain.cpp:L122](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanSwapChain.cpp#L122) | | | `ModeToString` | function | GameModules | [RacingCameraSystem.h:L91](../../GameModules/SparkGameRacing/Source/Camera/RacingCameraSystem.h#L91) | | +| `ModifierKeys` | struct | Tests | [TestInputFrameEdgesReal.cpp:L173](../../Tests/TestInputFrameEdgesReal.cpp#L173) | | | `ModifyTerrainHeight` | function | SparkEditor | [TerrainEditor.h:L106](../../SparkEditor/Source/Terrain/TerrainEditor.h#L106) | | | `ModInfo` | struct | SparkEngine | [ModSystem.h:L42](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L42) | Metadata for a single mod. | | `ModManifest` | struct | Tests | [TestModSystem.cpp:L54](../../Tests/TestModSystem.cpp#L54) | | @@ -28202,7 +28256,7 @@ | `ModState` | enum | SparkEngine | [ModSystem.h:L61](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L61) | | | `ModSystem` | class | SparkEngine | [SparkEngineWindowsInternal.h:L30](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L30) | | | `ModSystem` | class | SparkEngine | [ModSystem.h:L78](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L78) | Discovers, loads, and manages game modifications. | -| `ModSystem` | class | SparkSDK | [IEngineContext.h:L94](../../SparkSDK/Include/Spark/IEngineContext.h#L94) | | +| `ModSystem` | class | SparkSDK | [IEngineContext.h:L95](../../SparkSDK/Include/Spark/IEngineContext.h#L95) | | | `ModSystem::AreDependenciesMet` | method | SparkEngine | [ModSystem.cpp:L564](../../SparkEngine/Source/Engine/Modding/ModSystem.cpp#L564) | | | `ModSystem::Console_GetStatus` | method | SparkEngine | [ModSystemIO.cpp:L287](../../SparkEngine/Source/Engine/Modding/ModSystemIO.cpp#L287) | | | `ModSystem::Console_ListMods` | method | SparkEngine | [ModSystemIO.cpp:L305](../../SparkEngine/Source/Engine/Modding/ModSystemIO.cpp#L305) | | @@ -28502,7 +28556,7 @@ | `MultiplyWouldOverflow` | function | SparkEngine | [GLTFValidation.cpp:L166](../../SparkEngine/Source/Graphics/GLTFValidation.cpp#L166) | | | `MusicManager` | class | GameModules | [Game.h:L49](../../GameModules/SparkGameFPS/Source/Game/Game.h#L49) | | | `MusicManager` | class | SparkEngine | [MusicManager.h:L221](../../SparkEngine/Source/Audio/MusicManager.h#L221) | | -| `MusicManager` | class | SparkSDK | [IEngineContext.h:L74](../../SparkSDK/Include/Spark/IEngineContext.h#L74) | | +| `MusicManager` | class | SparkSDK | [IEngineContext.h:L75](../../SparkSDK/Include/Spark/IEngineContext.h#L75) | | | `MusicManager::AddReverbZone` | method | SparkEngine | [MusicManager.cpp:L396](../../SparkEngine/Source/Audio/MusicManager.cpp#L396) | | | `MusicManager::ComputeOcclusion` | method | SparkEngine | [MusicManager.cpp:L441](../../SparkEngine/Source/Audio/MusicManager.cpp#L441) | | | `MusicManager::Console_GetStatus` | method | SparkEngine | [MusicManager.cpp:L488](../../SparkEngine/Source/Audio/MusicManager.cpp#L488) | | @@ -28592,25 +28646,25 @@ | `NameOf` | function | Tests | [TestMOD330ARPGWorldActors.cpp:L126](../../Tests/TestMOD330ARPGWorldActors.cpp#L126) | | | `NameOfPlayer` | function | GameModules | [TFSocialSystem.h:L85](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L85) | | | `namePos` | function | GameModules | [TFNameplates.cpp:L327](../../GameModules/SparkGameMMOFPS/Source/UI/TFNameplates.cpp#L327) | | -| `narrow` | function | SparkConsole | [ConsoleApp.cpp:L652](../../SparkConsole/src/ConsoleApp.cpp#L652) | | +| `narrow` | function | SparkConsole | [ConsoleApp.cpp:L656](../../SparkConsole/src/ConsoleApp.cpp#L656) | | | `Narrow` | function | Tests | [TestRHI225D3D12ParityReal.cpp:L88](../../Tests/TestRHI225D3D12ParityReal.cpp#L88) | | | `NarrowCast` | function | SparkEngine | [SafeCast.h:L42](../../SparkEngine/Source/Core/SafeCast.h#L42) | | | `narrowFile` | function | SparkEngine | [ShaderCompilationWindowsFileLoad.cpp:L96](../../SparkEngine/Source/Graphics/ShaderCompilationWindowsFileLoad.cpp#L96) | | | `narrowFile` | function | SparkEngine | [ShaderCompilationWindowsFileLoad.cpp:L162](../../SparkEngine/Source/Graphics/ShaderCompilationWindowsFileLoad.cpp#L162) | | | `narrowFilename` | function | SparkEngine | [SoundEffect.cpp:L44](../../SparkEngine/Source/Audio/SoundEffect.cpp#L44) | | -| `narrowMsg` | function | SparkConsole | [ConsoleApp.cpp:L681](../../SparkConsole/src/ConsoleApp.cpp#L681) | | -| `narrowMsg` | function | SparkConsole | [ConsoleApp.cpp:L764](../../SparkConsole/src/ConsoleApp.cpp#L764) | | -| `narrowName` | function | SparkEngine | [SceneManager.cpp:L514](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L514) | | +| `narrowMsg` | function | SparkConsole | [ConsoleApp.cpp:L685](../../SparkConsole/src/ConsoleApp.cpp#L685) | | +| `narrowMsg` | function | SparkConsole | [ConsoleApp.cpp:L768](../../SparkConsole/src/ConsoleApp.cpp#L768) | | +| `narrowName` | function | SparkEngine | [SceneManager.cpp:L572](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L572) | | | `narrowPath` | function | SparkEngine | [GraphicsDeviceResourcesLinuxShaders.cpp:L131](../../SparkEngine/Source/Graphics/GraphicsDeviceResourcesLinuxShaders.cpp#L131) | | | `narrowPath` | function | SparkEngine | [MeshLinux.cpp:L284](../../SparkEngine/Source/Graphics/MeshLinux.cpp#L284) | | | `narrowPath` | function | SparkEngine | [ShaderConsoleOps.cpp:L34](../../SparkEngine/Source/Graphics/ShaderConsoleOps.cpp#L34) | | | `narrowPath` | function | SparkEngine | [ShaderConsoleOps.cpp:L108](../../SparkEngine/Source/Graphics/ShaderConsoleOps.cpp#L108) | | | `narrowPath` | function | SparkEngine | [ShaderHotReload.cpp:L127](../../SparkEngine/Source/Graphics/ShaderHotReload.cpp#L127) | | -| `narrowPath` | function | SparkEngine | [SceneManager.cpp:L616](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L616) | | -| `narrowPath` | function | SparkEngine | [SceneManager.cpp:L846](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L846) | | +| `narrowPath` | function | SparkEngine | [SceneManager.cpp:L684](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L684) | | +| `narrowPath` | function | SparkEngine | [SceneManager.cpp:L934](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L934) | | | `narrowPath` | function | Tests | [TestGLSLPipelineIntegration.cpp:L386](../../Tests/TestGLSLPipelineIntegration.cpp#L386) | | | `NarrowPathFixture` | struct | Tests | [TestSEC4NarrowPathsReal.cpp:L84](../../Tests/TestSEC4NarrowPathsReal.cpp#L84) | | -| `NarrowPathIfRoundTrips` | function | SparkEngine | [SceneManager.cpp:L60](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L60) | | +| `NarrowPathIfRoundTrips` | function | SparkEngine | [SceneManager.cpp:L62](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L62) | | | `NarrowSafeDirectory` | function | SparkEngine | [EngineSettings.cpp:L909](../../SparkEngine/Source/Core/EngineSettings.cpp#L909) | | | `NarrowSafeDirectory` | function | SparkEngine | [EngineSettings.h:L70](../../SparkEngine/Source/Core/EngineSettings.h#L70) | | | `Native` | function | Tests | [TestPrefabPersistence.cpp:L59](../../Tests/TestPrefabPersistence.cpp#L59) | | @@ -28621,9 +28675,9 @@ | `NativeModuleExtension` | function | SparkEditor | [BuildPipeline.cpp:L197](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L197) | | | `NativeModuleExtension` | function | SparkLauncher | [LauncherProcess.cpp:L74](../../SparkLauncher/src/LauncherProcess.cpp#L74) | | | `nativePath` | function | SparkEngine | [WorldBasicRenderer.cpp:L329](../../SparkEngine/Source/Graphics/WorldBasicRenderer.cpp#L329) | | -| `nativePath` | function | SparkEngine | [SceneManager.cpp:L887](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L887) | | +| `nativePath` | function | SparkEngine | [SceneManager.cpp:L979](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L979) | | | `nativeRoot` | function | SparkEngine | [GameObject.cpp:L158](../../SparkEngine/Source/Game/GameObject.cpp#L158) | | -| `nativeScenePath` | function | SparkEngine | [SceneManager.cpp:L519](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L519) | | +| `nativeScenePath` | function | SparkEngine | [SceneManager.cpp:L577](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L577) | | | `NativeServerPlatform` | function | SparkEditor | [DedicatedServerPanel.cpp:L81](../../SparkEditor/Source/Panels/DedicatedServerPanel.cpp#L81) | | | `NativeSocket` | alias | SparkEditor | [CollaborativeEditSession.cpp:L46](../../SparkEditor/Source/Communication/CollaborativeEditSession.cpp#L46) | | | `NativeSocket` | alias | SparkEditor | [CollaborativeEditSession.cpp:L58](../../SparkEditor/Source/Communication/CollaborativeEditSession.cpp#L58) | | @@ -28634,7 +28688,7 @@ | `NativeWindowHandle` | alias | SparkEngine | [Platform.h:L220](../../SparkEngine/Source/Core/Platform.h#L220) | | | `NavGraph` | struct | Tests | [TestAIStress.cpp:L348](../../Tests/TestAIStress.cpp#L348) | | | `NavigateHistory` | function | SparkEngine | [InGameConsole.h:L224](../../SparkEngine/Source/Utils/InGameConsole.h#L224) | Navigate command history (up = -1, down = +1) | -| `NavigateToFolder` | function | SparkEditor | [AssetBrowserPanel.h:L87](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L87) | Navigate to a directory contained by the active asset root. | +| `NavigateToFolder` | function | SparkEditor | [AssetBrowserPanel.h:L88](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L88) | Navigate to a directory contained by the active asset root. | | `NavigateToResult` | function | SparkEditor | [SearchPanel.h:L126](../../SparkEditor/Source/Panels/SearchPanel.h#L126) | Act on a result: select the entity, or report the asset path. | | `NavLink` | struct | SparkEngine | [NavMeshLink.h:L43](../../SparkEngine/Source/Engine/AI/NavMeshLink.h#L43) | An off-mesh navigation link between two world positions. | | `NavLinkComponent` | struct | SparkEngine | [AdvancedPlacementComponents.h:L100](../../SparkEngine/Source/Engine/ECS/Components/AdvancedPlacementComponents.h#L100) | Defines an off-mesh link between two NavMesh positions. | @@ -28715,7 +28769,7 @@ | `Near` | function | Tests | [TestAnimationSystem.cpp:L50](../../Tests/TestAnimationSystem.cpp#L50) | | | `Near` | function | Tests | [TestAnimationSystem.cpp:L92](../../Tests/TestAnimationSystem.cpp#L92) | | | `Near` | function | Tests | [TestNavMesh.cpp:L38](../../Tests/TestNavMesh.cpp#L38) | | -| `Near` | function | Tests | [TestTF120Travel.cpp:L382](../../Tests/TestTF120Travel.cpp#L382) | | +| `Near` | function | Tests | [TestTF120Travel.cpp:L369](../../Tests/TestTF120Travel.cpp#L369) | | | `NearByte` | function | Tests | [TestPostProcessingPipelineD3D11.cpp:L111](../../Tests/TestPostProcessingPipelineD3D11.cpp#L111) | | | `NearestEnemy` | function | GameModules | [TFCommandsHarness.cpp:L314](../../GameModules/SparkGameMMOFPS/Source/Console/TFCommandsHarness.cpp#L314) | | | `NearestExistingAncestor` | function | SparkInstaller | [InstallerPreflight.cpp:L38](../../SparkInstaller/src/InstallerPreflight.cpp#L38) | | @@ -28818,8 +28872,8 @@ | `NetworkInterpolationBuffer::Sample` | method | SparkEngine | [NetworkInterpolation.cpp:L33](../../SparkEngine/Source/Engine/Networking/NetworkInterpolation.cpp#L33) | | | `NetworkInterpolationBuffer::SetInterpolationDelay` | method | SparkEngine | [NetworkInterpolation.cpp:L94](../../SparkEngine/Source/Engine/Networking/NetworkInterpolation.cpp#L94) | | | `NetworkManager` | class | SparkEngine | [NetworkManager.h:L522](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L522) | | -| `NetworkManager` | class | SparkSDK | [IEngineContext.h:L84](../../SparkSDK/Include/Spark/IEngineContext.h#L84) | | -| `NetworkManager` | alias | SparkSDK | [IEngineContext.h:L86](../../SparkSDK/Include/Spark/IEngineContext.h#L86) | | +| `NetworkManager` | class | SparkSDK | [IEngineContext.h:L85](../../SparkSDK/Include/Spark/IEngineContext.h#L85) | | +| `NetworkManager` | alias | SparkSDK | [IEngineContext.h:L87](../../SparkSDK/Include/Spark/IEngineContext.h#L87) | | | `NetworkManager` | class | Tests | [TestNetworkManagerOrchestration.cpp:L99](../../Tests/TestNetworkManagerOrchestration.cpp#L99) | | | `NetworkManager::AbandonClientHandshake` | method | SparkEngine | [NetworkConnection.cpp:L1256](../../SparkEngine/Source/Engine/Networking/NetworkConnection.cpp#L1256) | | | `NetworkManager::BroadcastMessage` | method | SparkEngine | [NetworkConnection.cpp:L963](../../SparkEngine/Source/Engine/Networking/NetworkConnection.cpp#L963) | | @@ -29031,7 +29085,7 @@ | `NewGame` | function | Templates | [GameModule.h:L237](../../Templates/RPGStarter/Source/GameModule.h#L237) | | | `newHeights` | function | SparkEditor | [TerrainData.cpp:L94](../../SparkEditor/Source/Terrain/TerrainData.cpp#L94) | | | `NewScene` | function | SparkEditor | [EditorUI.h:L210](../../SparkEditor/Source/Core/EditorUI.h#L210) | Select the transform tool and push it to the Scene View gizmo. | -| `NewScene` | function | SparkEngine | [SceneManager.h:L337](../../SparkEngine/Source/SceneManager/SceneManager.h#L337) | Clear the current scene and start a new, empty scene. | +| `NewScene` | function | SparkEngine | [SceneManager.h:L339](../../SparkEngine/Source/SceneManager/SceneManager.h#L339) | Clear the current scene and start a new, empty scene. | | `NewScene` | function | Tests | [TestSceneManager.cpp:L41](../../Tests/TestSceneManager.cpp#L41) | | | `NewSceneNow` | function | SparkEditor | [EditorUI.h:L452](../../SparkEditor/Source/Core/EditorUI.h#L452) | | | `NewStruct` | struct | Tests | [TestFreezeSystem.cpp:L140](../../Tests/TestFreezeSystem.cpp#L140) | | @@ -29078,10 +29132,10 @@ | `node` | function | Tests | [TestBehaviorTreeNodes.cpp:L77](../../Tests/TestBehaviorTreeNodes.cpp#L77) | | | `node` | function | Tests | [TestBehaviorTreeNodes.cpp:L90](../../Tests/TestBehaviorTreeNodes.cpp#L90) | | | `node` | function | Tests | [TestBehaviorTreeNodes.cpp:L98](../../Tests/TestBehaviorTreeNodes.cpp#L98) | | -| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L96](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L96) | | -| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L713](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L713) | | -| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L752](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L752) | | -| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L757](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L757) | | +| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L97](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L97) | | +| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L756](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L756) | | +| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L795](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L795) | | +| `Node` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L800](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L800) | | | `node` | function | Tests | [TestSceneGraph2D.cpp:L10](../../Tests/TestSceneGraph2D.cpp#L10) | | | `node` | function | Tests | [TestSceneGraph2D.cpp:L17](../../Tests/TestSceneGraph2D.cpp#L17) | | | `node` | function | Tests | [TestSceneGraph2D.cpp:L25](../../Tests/TestSceneGraph2D.cpp#L25) | | @@ -29100,6 +29154,7 @@ | `NodeStatus` | enum | Tests | [TestAIBehaviorTree.cpp:L15](../../Tests/TestAIBehaviorTree.cpp#L15) | | | `NodeStatus` | enum | Tests | [TestAIStress.cpp:L20](../../Tests/TestAIStress.cpp#L20) | | | `NodeText` | function | SparkEngine | [VisualScriptGraphWriter.cpp:L121](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphWriter.cpp#L121) | | +| `NodeTopology` | struct | SparkEngine | [VisualScriptEmitter.h:L154](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L154) | | | `NodeType` | enum | SparkEditor | [DialogueEditorPanel.h:L35](../../SparkEditor/Source/Panels/DialogueEditorPanel.h#L35) | | | `NodeType` | enum | Tests | [TestShaderGraphCompiler.cpp:L17](../../Tests/TestShaderGraphCompiler.cpp#L17) | | | `NodeTypeEntry` | struct | SparkEngine | [VisualScriptNodePalette.cpp:L15](../../SparkEngine/Source/Engine/Scripting/VisualScriptNodePalette.cpp#L15) | | @@ -29218,7 +29273,7 @@ | `NormalizeDirection` | function | SparkEngine | [SkyAtmosphere.h:L204](../../SparkEngine/Source/Graphics/SkyAtmosphere.h#L204) | Normalize a 3D direction vector in place. | | `NormalizedManifest` | function | Tests | [TestGamePackager.cpp:L240](../../Tests/TestGamePackager.cpp#L240) | | | `NormalizedTime` | function | SparkEngine | [Sequencer.cpp:L57](../../SparkEngine/Source/Engine/Cinematic/Sequencer.cpp#L57) | | -| `normalizedU8` | function | GameModules | [FPSAssetPaths.cpp:L184](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L184) | | +| `normalizedU8` | function | GameModules | [FPSAssetPaths.cpp:L198](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L198) | | | `NormalizeKey` | function | SparkEngine | [LocalFileCache.h:L345](../../SparkEngine/Source/Utils/LocalFileCache.h#L345) | | | `NormalizeLocalEndpoint` | function | SparkGateway | [GatewayAreaControl.cpp:L43](../../SparkGateway/src/GatewayAreaControl.cpp#L43) | | | `NormalizeManifestArtifacts` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1044](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1044) | | @@ -29228,6 +29283,7 @@ | `NormalizeProjectPath` | function | SparkEditor | [ProjectManager.cpp:L1655](../../SparkEditor/Source/Core/ProjectManager.cpp#L1655) | | | `NormalizeTrigger` | function | SparkEngine | [GamepadInput.h:L453](../../SparkEngine/Source/Input/GamepadInput.h#L453) | Normalize a raw trigger BYTE value to [0.0, 1.0] | | `NormalizeTrustedRootAlias` | function | SparkEngine | [TelemetrySpool.cpp:L33](../../SparkEngine/Source/Utils/TelemetrySpool.cpp#L33) | | +| `NormalizeWin32ModifierVirtualKey` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L414](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L414) | | | `normalPatch` | function | SparkEngine | [NeuralPostProcessing.cpp:L173](../../SparkEngine/Source/Graphics/Neural/NeuralPostProcessing.cpp#L173) | | | `normals` | function | SparkEngine | [LODGenerator.cpp:L87](../../SparkEngine/Source/Graphics/LODGenerator.cpp#L87) | | | `normals` | function | Tests | [RHI210D3D11GoldenSupport.h:L528](../../Tests/RHI210D3D11GoldenSupport.h#L528) | | @@ -29267,7 +29323,7 @@ | `NotifyStateChange` | function | SparkEngine | [SparkEngineCamera.h:L401](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L401) | Notify console of state change | | `NotifyStateChange` | function | SparkEngine | [GraphicsEngine.h:L1316](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L1316) | | | `NotifyStateChange` | function | SparkEngine | [Shader.h:L584](../../SparkEngine/Source/Graphics/Shader.h#L584) | Notify console of shader state changes | -| `NotifyStateChange` | function | SparkEngine | [InputManager.h:L505](../../SparkEngine/Source/Input/InputManager.h#L505) | Notify console of state changes | +| `NotifyStateChange` | function | SparkEngine | [InputManager.h:L512](../../SparkEngine/Source/Input/InputManager.h#L512) | Notify console of state changes | | `NotifyStepChanged` | function | SparkEditor | [TutorialSystem.h:L373](../../SparkEditor/Source/Core/TutorialSystem.h#L373) | Notify all step-changed callbacks. | | `NotifyUnlock` | function | SparkEngine | [AchievementSystem.h:L494](../../SparkEngine/Source/Engine/Gameplay/AchievementSystem.h#L494) | Fire unlock callbacks for an achievement | | `Now` | function | GameModules | [TFBotSystem.h:L204](../../GameModules/SparkGameMMOFPS/Source/Game/TFBotSystem.h#L204) | | @@ -29302,14 +29358,14 @@ | `NPCSystemSnapshot` | struct | GameModules | [RPGNPCSystem.h:L115](../../GameModules/SparkGameRPG/Source/NPC/RPGNPCSystem.h#L115) | World clock plus every registered NPC's mutable state, ordered by NPC id | | `NS` | alias | SparkEngine | [EngineSettings.cpp:L214](../../SparkEngine/Source/Core/EngineSettings.cpp#L214) | | | `NTCOptions` | struct | SparkEngine | [NeuralTextureCompressor.h:L42](../../SparkEngine/Source/Graphics/Neural/NeuralTextureCompressor.h#L42) | Compression quality/speed options for NTC. | -| `NtCreateFileFn` | alias | SparkEngine | [CrashHandler.cpp:L232](../../SparkEngine/Source/Utils/CrashHandler.cpp#L232) | | +| `NtCreateFileFn` | alias | SparkEngine | [CrashHandler.cpp:L233](../../SparkEngine/Source/Utils/CrashHandler.cpp#L233) | | | `NTEXHeader` | struct | SparkEngine | [NeuralTextureFormat.h:L37](../../SparkEngine/Source/Graphics/Neural/NeuralTextureFormat.h#L37) | Binary header for .ntex files. | | `ntohs` | function | SparkEngine | [NetworkConnection.cpp:L2399](../../SparkEngine/Source/Engine/Networking/NetworkConnection.cpp#L2399) | | | `ntohs` | function | Tests | [SecureTestPeer.cpp:L381](../../Tests/Fixtures/SecureTestPeer.cpp#L381) | | | `ntohs` | function | Tests | [TestFPSMultiplayer.cpp:L374](../../Tests/TestFPSMultiplayer.cpp#L374) | | | `ntohs` | function | Tests | [TestNetTransportSecurity.cpp:L288](../../Tests/TestNetTransportSecurity.cpp#L288) | | | `ntohs` | function | Tests | [TestNetworkManagerIntegration.cpp:L270](../../Tests/TestNetworkManagerIntegration.cpp#L270) | | -| `NtSetInformationFileFn` | alias | SparkEngine | [CrashHandler.cpp:L648](../../SparkEngine/Source/Utils/CrashHandler.cpp#L648) | | +| `NtSetInformationFileFn` | alias | SparkEngine | [CrashHandler.cpp:L649](../../SparkEngine/Source/Utils/CrashHandler.cpp#L649) | | | `nul` | function | Tests | [TestLauncherProcess.cpp:L410](../../Tests/TestLauncherProcess.cpp#L410) | | | `Null` | function | SparkEngine | [UUID.h:L66](../../SparkEngine/Source/Utils/UUID.h#L66) | | | `Null` | function | SparkEngine | [UUID.h:L86](../../SparkEngine/Source/Utils/UUID.h#L86) | | @@ -29342,7 +29398,7 @@ | `NullSwapChain` | function | SparkEngine | [NullRHIDevice.h:L122](../../SparkEngine/Source/Graphics/RHI/NullRHIDevice.h#L122) | CPU-only swap chain with a stable NullTexture back buffer. | | `NullTexture` | class | SparkEngine | [NullRHIResources.h:L106](../../SparkEngine/Source/Graphics/RHI/NullRHIResources.h#L106) | Interface-only stub texture. No backing memory. | | `NullTexture` | function | SparkEngine | [NullRHIResources.h:L109](../../SparkEngine/Source/Graphics/RHI/NullRHIResources.h#L109) | Interface-only stub texture. No backing memory. | -| `Num` | function | Tests | [TestTFDataTables.cpp:L85](../../Tests/TestTFDataTables.cpp#L85) | | +| `Num` | function | Tests | [TestTFDataTables.cpp:L76](../../Tests/TestTFDataTables.cpp#L76) | | | `number` | function | GameModules | [TFHandoffParticipant.cpp:L24](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.cpp#L24) | | | `Number` | function | GameModules | [PlatformerProgress.cpp:L64](../../GameModules/SparkGamePlatformer/Source/Core/PlatformerProgress.cpp#L64) | | | `Number` | function | GameModules | [RTSPersistenceCodec.cpp:L93](../../GameModules/SparkGameRTS/Source/Core/RTSPersistenceCodec.cpp#L93) | | @@ -29392,6 +29448,9 @@ | `OBJStaticSubmesh` | struct | SparkEngine | [OBJStaticMeshLoader.h:L33](../../SparkEngine/Source/Graphics/OBJStaticMeshLoader.h#L33) | | | `OBJStaticVertex` | struct | SparkEngine | [OBJStaticMeshLoader.h:L25](../../SparkEngine/Source/Graphics/OBJStaticMeshLoader.h#L25) | | | `objStream` | function | SparkEngine | [OBJStaticMeshLoader.cpp:L402](../../SparkEngine/Source/Graphics/OBJStaticMeshLoader.cpp#L402) | | +| `ObservationHex` | function | GameModules | [GameEngineSystems.cpp:L488](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L488) | | +| `ObservationHex` | function | GameModules | [GameEngineSystems.cpp:L517](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L517) | | +| `ObservationProfile` | function | GameModules | [GameEngineSystems.cpp:L500](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L500) | | | `Observe` | function | Tests | [FPSLANLoopbackPeer.cpp:L534](../../Tests/Fixtures/FPSLANLoopbackPeer.cpp#L534) | | | `Observe` | function | Tests | [TestAngelScriptStackAlignmentReal.cpp:L127](../../Tests/TestAngelScriptStackAlignmentReal.cpp#L127) | | | `ObserveDocumentHistoryForRecovery` | function | SparkEditor | [EditorUI.h:L460](../../SparkEditor/Source/Core/EditorUI.h#L460) | | @@ -29444,7 +29503,7 @@ | `offset` | function | GameModules | [WaveSpawner.cpp:L224](../../GameModules/SparkGameFPS/Source/Game/WaveSpawner.cpp#L224) | | | `offsetSettings` | function | SparkEngine | [PhysicsShapeFactory.cpp:L207](../../SparkEngine/Source/Physics/PhysicsShapeFactory.cpp#L207) | | | `ofs` | function | SparkEngine | [ShaderDiskCache.cpp:L187](../../SparkEngine/Source/Graphics/ShaderDiskCache.cpp#L187) | | -| `ofs` | function | Tests | [TestSparkPak.cpp:L409](../../Tests/TestSparkPak.cpp#L409) | | +| `ofs` | function | Tests | [TestSparkPak.cpp:L425](../../Tests/TestSparkPak.cpp#L425) | | | `Ok` | function | SparkEngine | [UDPTransport.h:L85](../../SparkEngine/Source/Engine/Networking/UDPTransport.h#L85) | | | `Ok` | function | SparkEngine | [LocalFileCache.h:L106](../../SparkEngine/Source/Utils/LocalFileCache.h#L106) | | | `Ok` | function | SparkEngine | [LocalFileCache.h:L120](../../SparkEngine/Source/Utils/LocalFileCache.h#L120) | | @@ -29537,7 +29596,7 @@ | `One` | alias | Tests | [TestTypeTraits.cpp:L88](../../Tests/TestTypeTraits.cpp#L88) | | | `OneClipAnimation` | function | Tests | [Test_ai-anim_animation.cpp:L77](../../Tests/harden/Test_ai-anim_animation.cpp#L77) | | | `OneHandedMode` | enum | SparkEngine | [AccessibilitySystem.h:L56](../../SparkEngine/Source/Engine/Accessibility/AccessibilitySystem.h#L56) | One-handed input mode selection. | -| `OnEnginePipeClosed` | function | SparkConsole | [ConsoleApp.h:L92](../../SparkConsole/src/ConsoleApp.h#L92) | | +| `OnEnginePipeClosed` | function | SparkConsole | [ConsoleApp.h:L93](../../SparkConsole/src/ConsoleApp.h#L93) | | | `OnEnteredWorld` | function | GameModules | [TFLoginFlow.h:L131](../../GameModules/SparkGameMMOFPS/Source/UI/TFLoginFlow.h#L131) | | | `OnEntitySelected` | function | SparkEditor | [IEditorPlugin.h:L92](../../SparkEditor/Source/Core/IEditorPlugin.h#L92) | Called when the user selects an entity | | `OneRecord` | function | Tests | [TestTFSocialStore.cpp:L67](../../Tests/TestTFSocialStore.cpp#L67) | | @@ -29558,7 +29617,7 @@ | `OnFixedUpdate` | function | GameModules | [SparkGameVisualScript.h:L49](../../GameModules/SparkGameVisualScript/Source/Core/SparkGameVisualScript.h#L49) | | | `OnFixedUpdate` | function | SparkSDK | [IModule.h:L162](../../SparkSDK/Include/Spark/IModule.h#L162) | Called at a fixed timestep for deterministic simulation | | `OnFrameEnd` | function | SparkEngine | [FrameInspector.h:L226](../../SparkEngine/Source/Utils/FrameInspector.h#L226) | Call at the end of each processed frame | -| `OnGameThread` | function | GameModules | [FPSWeatherIntegration.h:L51](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L51) | | +| `OnGameThread` | function | GameModules | [FPSWeatherIntegration.h:L53](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L53) | | | `OnGesture` | function | SparkEngine | [MobilePlatform.h:L180](../../SparkEngine/Source/Engine/Mobile/MobilePlatform.h#L180) | Register a gesture callback. | | `OnGUI` | function | SparkEditor | [IEditorPlugin.h:L72](../../SparkEditor/Source/Core/IEditorPlugin.h#L72) | Render plugin UI via ImGui | | `OnGUI` | function | Tests | [TestEditorSubsystems.cpp:L77](../../Tests/TestEditorSubsystems.cpp#L77) | | @@ -29725,7 +29784,7 @@ | `OnPlayerKilled` | function | GameModules | [TFMedalSystem.h:L247](../../GameModules/SparkGameMMOFPS/Source/Game/TFMedalSystem.h#L247) | | | `OnPlayerKilled` | function | GameModules | [TFProgressionSystem.h:L252](../../GameModules/SparkGameMMOFPS/Source/Game/TFProgressionSystem.h#L252) | | | `OnPlayerKilled` | function | GameModules | [TFVehicleSystem.h:L201](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L201) | | -| `OnPlayerKilled` | function | GameModules | [TFReplication.h:L91](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L91) | | +| `OnPlayerKilled` | function | GameModules | [TFReplication.h:L96](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L96) | | | `OnPlayerKilled` | function | GameModules | [TFServerSim.h:L176](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L176) | | | `OnPlayerKilled` | function | GameModules | [TFScoreboard.h:L93](../../GameModules/SparkGameMMOFPS/Source/UI/TFScoreboard.h#L93) | | | `OnPlayerKilledBus` | function | GameModules | [TFHUD.h:L136](../../GameModules/SparkGameMMOFPS/Source/UI/TFHUD.h#L136) | | @@ -29735,7 +29794,7 @@ | `OnPlayerSpawned` | function | GameModules | [TFGrenadeSystem.h:L244](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L244) | | | `OnPlayerSpawned` | function | GameModules | [TFOutfitSystem.h:L244](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L244) | | | `OnPlayerSpawned` | function | GameModules | [TFProgressionSystem.h:L253](../../GameModules/SparkGameMMOFPS/Source/Game/TFProgressionSystem.h#L253) | | -| `OnPlayerSpawned` | function | GameModules | [TFReplication.h:L90](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L90) | | +| `OnPlayerSpawned` | function | GameModules | [TFReplication.h:L95](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L95) | | | `OnPlayerSpawned` | function | GameModules | [TFServerSim.h:L175](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L175) | | | `OnPlayerSpawned` | function | GameModules | [TFTravelSystem.h:L154](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L154) | Keep a restored sanctuary checkpoint; discard the ordinary spawn-pad teleport queued by spawn. | | `OnProcessingPassEnd` | function | SparkEngine | [AudioEngine.h:L758](../../SparkEngine/Source/Audio/AudioEngine.h#L758) | | @@ -29777,10 +29836,10 @@ | `OnRender` | function | Templates | [GameModule.h:L131](../../Templates/RPGStarter/Source/GameModule.h#L131) | | | `OnRender` | function | Templates | [GameModule.h:L113](../../Templates/ThirdPersonStarter/Source/GameModule.h#L113) | | | `OnRender` | function | Templates | [GameModule.h:L132](../../Templates/TopDownStarter/Source/GameModule.h#L132) | | -| `OnRepCreate` | function | GameModules | [TFReplication.h:L108](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L108) | | -| `OnRepDestroy` | function | GameModules | [TFReplication.h:L110](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L110) | | -| `OnRepMoveState` | function | GameModules | [TFReplication.h:L111](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L111) | | -| `OnRepUpdate` | function | GameModules | [TFReplication.h:L109](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L109) | | +| `OnRepCreate` | function | GameModules | [TFReplication.h:L112](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L112) | | +| `OnRepDestroy` | function | GameModules | [TFReplication.h:L114](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L114) | | +| `OnRepMoveState` | function | GameModules | [TFReplication.h:L115](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L115) | | +| `OnRepUpdate` | function | GameModules | [TFReplication.h:L113](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L113) | | | `OnReset` | function | SparkEngine | [InstanceManager.h:L86](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L86) | | | `OnResize` | function | GameModules | [SparkGame.h:L45](../../GameModules/SparkGame/Source/Core/SparkGame.h#L45) | | | `OnResize` | function | GameModules | [SparkGameARPG.h:L62](../../GameModules/SparkGameARPG/Source/Core/SparkGameARPG.h#L62) | | @@ -29837,7 +29896,7 @@ | `OnSettingsChanged` | function | Tests | [TestEngineSettingsParser.cpp:L230](../../Tests/TestEngineSettingsParser.cpp#L230) | | | `OnShaderReloaded` | function | SparkEngine | [ShaderHotReload.h:L297](../../SparkEngine/Source/Graphics/ShaderHotReload.h#L297) | Register a callback invoked after each shader reload attempt. | | `OnShutdownRequested` | function | SparkEditor | [EditorApplication.h:L102](../../SparkEditor/Source/Core/EditorApplication.h#L102) | | -| `OnSignalReportTimeout` | function | SparkEngine | [CrashHandler.cpp:L2176](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2176) | | +| `OnSignalReportTimeout` | function | SparkEngine | [CrashHandler.cpp:L2207](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2207) | | | `OnSpawnReply` | function | GameModules | [TFClientNet.h:L213](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L213) | | | `onStack` | function | Tests | [TestMSanCanary.cpp:L53](../../Tests/TestMSanCanary.cpp#L53) | | | `OnStart` | function | SparkEngine | [InstanceManager.h:L81](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L81) | | @@ -29945,7 +30004,7 @@ | `Open` | function | Tests | [TestReliableChannel.cpp:L446](../../Tests/TestReliableChannel.cpp#L446) | | | `open` | function | Tests | [TestSparkError.cpp:L62](../../Tests/TestSparkError.cpp#L62) | | | `open` | function | Tests | [TestSparkError.cpp:L64](../../Tests/TestSparkError.cpp#L64) | | -| `Open` | function | Tests | [TestSparkPak.cpp:L174](../../Tests/TestSparkPak.cpp#L174) | | +| `Open` | function | Tests | [TestSparkPak.cpp:L180](../../Tests/TestSparkPak.cpp#L180) | | | `OpenAfter` | struct | GameModules | [RTSGridPathfinder.cpp:L45](../../GameModules/SparkGameRTS/Source/Navigation/RTSGridPathfinder.cpp#L45) | | | `OpenALAudioBackend` | class | SparkEngine | [OpenALAudioBackend.h:L32](../../SparkEngine/Source/Audio/OpenALAudioBackend.h#L32) | OpenAL Soft backend adapter for Linux/macOS | | `OpenALAudioBackend::GetMasterVolume` | method | SparkEngine | [OpenALAudioBackend.cpp:L118](../../SparkEngine/Source/Audio/OpenALAudioBackend.cpp#L118) | | @@ -30002,13 +30061,14 @@ | `OpenALSource` | struct | SparkEngine | [OpenALAudioEngine.h:L55](../../SparkEngine/Source/Audio/OpenALAudioEngine.h#L55) | Audio source for the OpenAL backend | | `OpenArtifact` | function | SparkCrashReporter | [CrashReporterApp.cpp:L867](../../SparkCrashReporter/src/CrashReporterApp.cpp#L867) | | | `OpenArtifact` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1093](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1093) | | -| `OpenArtifactRelativeToPinnedRoot` | function | SparkEngine | [CrashHandler.cpp:L226](../../SparkEngine/Source/Utils/CrashHandler.cpp#L226) | | -| `openat` | function | SparkEngine | [CrashHandler.cpp:L2240](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2240) | | -| `openat` | function | SparkEngine | [CrashHandler.cpp:L2320](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2320) | | +| `OpenArtifactRelativeToPinnedRoot` | function | SparkEngine | [CrashHandler.cpp:L227](../../SparkEngine/Source/Utils/CrashHandler.cpp#L227) | | +| `OpenAsset` | function | SparkEditor | [AssetBrowserPanel.h:L97](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L97) | Request the editor for a .spkmat file inside the active asset root. | +| `openat` | function | SparkEngine | [CrashHandler.cpp:L2278](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2278) | | +| `openat` | function | SparkEngine | [CrashHandler.cpp:L2358](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2358) | | | `OpenBuildFolder` | function | SparkBuild | [SparkBuild.h:L53](../../SparkBuild/src/SparkBuild.h#L53) | | | `OpenChatInput` | function | GameModules | [TFChatWindow.h:L57](../../GameModules/SparkGameMMOFPS/Source/UI/TFChatWindow.h#L57) | | | `OpenClassTerminal` | function | GameModules | [TFSpawnScreen.h:L60](../../GameModules/SparkGameMMOFPS/Source/UI/TFSpawnScreen.h#L60) | | -| `OpenDirectoryBelow` | function | SparkEngine | [SceneManager.cpp:L388](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L388) | | +| `OpenDirectoryBelow` | function | SparkEngine | [SceneManager.cpp:L430](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L430) | | | `opened` | function | Tests | [TestNET100Libsodium.cpp:L58](../../Tests/TestNET100Libsodium.cpp#L58) | | | `OpenedProject` | struct | Tests | [TestDocumentInterruptionReal.cpp:L365](../../Tests/TestDocumentInterruptionReal.cpp#L365) | | | `OpenedProject` | function | Tests | [TestDocumentInterruptionReal.cpp:L367](../../Tests/TestDocumentInterruptionReal.cpp#L367) | | @@ -30026,8 +30086,8 @@ | `OpenNullDescriptor` | function | Tests | [TestSparkError.cpp:L59](../../Tests/TestSparkError.cpp#L59) | | | `OpenPinnedDirectory` | function | SparkCrashReporter | [CrashReporterApp.cpp:L801](../../SparkCrashReporter/src/CrashReporterApp.cpp#L801) | | | `OpenPinnedDirectory` | function | SparkEngine | [HeldHandles.h:L110](../../SparkEngine/Source/Engine/Modding/HeldHandles.h#L110) | | -| `OpenPinnedDirectory` | function | SparkEngine | [SceneManager.cpp:L240](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L240) | | -| `OpenPinnedInputFile` | function | SparkEngine | [CrashHandler.cpp:L307](../../SparkEngine/Source/Utils/CrashHandler.cpp#L307) | | +| `OpenPinnedDirectory` | function | SparkEngine | [SceneManager.cpp:L260](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L260) | | +| `OpenPinnedInputFile` | function | SparkEngine | [CrashHandler.cpp:L308](../../SparkEngine/Source/Utils/CrashHandler.cpp#L308) | | | `OpenPrefabWriter` | function | Tests | [TestDocumentInterruptionReal.cpp:L299](../../Tests/TestDocumentInterruptionReal.cpp#L299) | | | `OpenProject` | function | SparkEditor | [ProjectManager.h:L142](../../SparkEditor/Source/Core/ProjectManager.h#L142) | Open a .sparkproject (or a directory containing one) as the current project. | | `OpenProjectRequestHandler` | alias | SparkEditor | [ProjectBrowserPanel.h:L54](../../SparkEditor/Source/Panels/ProjectBrowserPanel.h#L54) | | @@ -30037,8 +30097,8 @@ | `OpenResult` | enum | SparkEngine | [NetworkEncryption.h:L207](../../SparkEngine/Source/Engine/Networking/NetworkEncryption.h#L207) | Outcome of SecureChannel::Open. Every value other than Ok means the packet was dropped. | | `OpenScene` | function | SparkEditor | [EditorUI.h:L279](../../SparkEditor/Source/Core/EditorUI.h#L279) | Load a reflected scene JSON (as written by SaveCurrentScene) | | `OpenSceneWriter` | function | Tests | [TestDocumentInterruptionReal.cpp:L238](../../Tests/TestDocumentInterruptionReal.cpp#L238) | | -| `OpenSignalArtifact` | function | SparkEngine | [CrashHandler.cpp:L2314](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2314) | | -| `OpenSignalReportLog` | function | SparkEngine | [CrashHandler.cpp:L2202](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2202) | | +| `OpenSignalArtifact` | function | SparkEngine | [CrashHandler.cpp:L2352](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2352) | | +| `OpenSignalReportLog` | function | SparkEngine | [CrashHandler.cpp:L2240](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2240) | | | `OpenWith` | function | Tests | [SecureTestPeer.cpp:L53](../../Tests/Fixtures/SecureTestPeer.cpp#L53) | | | `OpenWith` | function | Tests | [SecureTestPeer.cpp:L488](../../Tests/Fixtures/SecureTestPeer.cpp#L488) | | | `OpenWith` | function | Tests | [SecureTestPeer.cpp:L585](../../Tests/Fixtures/SecureTestPeer.cpp#L585) | | @@ -30059,7 +30119,7 @@ | `operator` | function | SparkDaemon | [ShaderService.h:L108](../../SparkDaemon/src/ShaderService.h#L108) | | | `operator` | function | SparkEditor | [EditorPluginManager.h:L29](../../SparkEditor/Source/Core/EditorPluginManager.h#L29) | | | `operator` | function | SparkEngine | [AssetHandle.h:L84](../../SparkEngine/Source/Core/AssetHandle.h#L84) | | -| `operator` | function | SparkEngine | [EngineContext.h:L82](../../SparkEngine/Source/Core/EngineContext.h#L82) | | +| `operator` | function | SparkEngine | [EngineContext.h:L83](../../SparkEngine/Source/Core/EngineContext.h#L83) | | | `operator` | function | SparkEngine | [CoverSystem.h:L175](../../SparkEngine/Source/Engine/AI/CoverSystem.h#L175) | | | `operator` | function | SparkEngine | [TacticalPointSystem.h:L201](../../SparkEngine/Source/Engine/AI/TacticalPointSystem.h#L201) | | | `operator` | function | SparkEngine | [SpatialGrid.h:L56](../../SparkEngine/Source/Engine/World/SpatialGrid.h#L56) | | @@ -30069,7 +30129,7 @@ | `operator` | function | SparkEngine | [RenderGraphTypes.h:L65](../../SparkEngine/Source/Graphics/RenderGraphTypes.h#L65) | Hash support for RenderGraphResource so it can be used in | | `operator` | function | SparkEngine | [ShaderCrossCompiler.h:L119](../../SparkEngine/Source/Graphics/ShaderCrossCompiler.h#L119) | | | `operator` | function | SparkEngine | [ShaderVariantSystem.h:L106](../../SparkEngine/Source/Graphics/ShaderVariantSystem.h#L106) | | -| `operator` | function | SparkEngine | [SceneManager.cpp:L229](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L229) | | +| `operator` | function | SparkEngine | [SceneManager.cpp:L247](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L247) | | | `operator` | function | SparkEngine | [StringPool.h:L159](../../SparkEngine/Source/Utils/StringPool.h#L159) | | | `operator` | function | SparkEngine | [UUID.h:L120](../../SparkEngine/Source/Utils/UUID.h#L120) | | | `operator` | function | Tests | [TestCrossSystemIntegration.cpp:L77](../../Tests/TestCrossSystemIntegration.cpp#L77) | | @@ -30126,10 +30186,11 @@ | `Order` | function | Tests | [TestLIFE200LifecycleLoopReal.cpp:L105](../../Tests/TestLIFE200LifecycleLoopReal.cpp#L105) | | | `Order` | function | Tests | [TestLifecycleCompositionRootFailure.cpp:L78](../../Tests/TestLifecycleCompositionRootFailure.cpp#L78) | | | `order` | function | Tests | [TestReliableOrderedSequenceReal.cpp:L172](../../Tests/TestReliableOrderedSequenceReal.cpp#L172) | | +| `ordered` | function | GameModules | [GameEngineSystems.cpp:L508](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L508) | | | `OrderedBuffer` | struct | Tests | [TestReliableChannel.cpp:L78](../../Tests/TestReliableChannel.cpp#L78) | | | `OrderedTags` | function | Tests | [TestReliableOrderedSequenceReal.cpp:L181](../../Tests/TestReliableOrderedSequenceReal.cpp#L181) | | | `OrderTrackingSystem` | class | Tests | [TestSystemManagerIntegration.cpp:L24](../../Tests/TestSystemManagerIntegration.cpp#L24) | | -| `ordinary` | function | Tests | [TestSparkPak.cpp:L639](../../Tests/TestSparkPak.cpp#L639) | | +| `ordinary` | function | Tests | [TestSparkPak.cpp:L655](../../Tests/TestSparkPak.cpp#L655) | | | `original` | function | Tests | [TestCompressionUtils.cpp:L50](../../Tests/TestCompressionUtils.cpp#L50) | | | `original` | function | Tests | [TestRenderGraph.cpp:L31](../../Tests/TestRenderGraph.cpp#L31) | | | `original` | function | Tests | [TestReplicationFields.cpp:L239](../../Tests/TestReplicationFields.cpp#L239) | | @@ -30149,11 +30210,11 @@ | `osRelease` | function | SparkEditor | [EditorCrashHandler.cpp:L763](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L763) | | | `otherClient` | function | Tests | [TestNET100TransportReal.cpp:L145](../../Tests/TestNET100TransportReal.cpp#L145) | | | `OtherDerived` | struct | Tests | [TestSafetyCoreUtils.cpp:L148](../../Tests/TestSafetyCoreUtils.cpp#L148) | | -| `ours` | struct | SparkEngine | [SceneManager.cpp:L464](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L464) | | +| `ours` | struct | SparkEngine | [SceneManager.cpp:L520](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L520) | | | `out` | function | SparkDaemon | [AssetService.cpp:L333](../../SparkDaemon/src/AssetService.cpp#L333) | | | `out` | function | SparkDaemon | [ShaderService.cpp:L341](../../SparkDaemon/src/ShaderService.cpp#L341) | | -| `out` | function | SparkEditor | [PlayControlLaunch.cpp:L365](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L365) | | -| `out` | function | SparkEditor | [PlayControlLaunch.cpp:L399](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L399) | | +| `out` | function | SparkEditor | [PlayControlLaunch.cpp:L367](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L367) | | +| `out` | function | SparkEditor | [PlayControlLaunch.cpp:L401](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L401) | | | `out` | function | SparkEditor | [VersionControlConflicts.cpp:L177](../../SparkEditor/Source/VersionControl/VersionControlConflicts.cpp#L177) | | | `out` | function | SparkEditor | [VersionControlConflicts.cpp:L222](../../SparkEditor/Source/VersionControl/VersionControlConflicts.cpp#L222) | | | `out` | function | SparkEngine | [SparkEngineCameraInternal.h:L33](../../SparkEngine/Source/Camera/SparkEngineCameraInternal.h#L33) | | @@ -30167,9 +30228,9 @@ | `out` | function | SparkInstaller | [InstallerTransactionTests.cpp:L56](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L56) | | | `out` | function | SparkInstaller | [PortableGitCacheTests.cpp:L52](../../SparkInstaller/tests/PortableGitCacheTests.cpp#L52) | | | `out` | function | Tests | [TestASSET220GamePackagerReal.cpp:L18](../../Tests/TestASSET220GamePackagerReal.cpp#L18) | | -| `out` | function | Tests | [TestAssetParserHardening.cpp:L50](../../Tests/TestAssetParserHardening.cpp#L50) | | -| `out` | function | Tests | [TestAssetParserHardening.cpp:L331](../../Tests/TestAssetParserHardening.cpp#L331) | | -| `out` | function | Tests | [TestAssetParserHardening.cpp:L383](../../Tests/TestAssetParserHardening.cpp#L383) | | +| `out` | function | Tests | [TestAssetParserHardening.cpp:L66](../../Tests/TestAssetParserHardening.cpp#L66) | | +| `out` | function | Tests | [TestAssetParserHardening.cpp:L347](../../Tests/TestAssetParserHardening.cpp#L347) | | +| `out` | function | Tests | [TestAssetParserHardening.cpp:L399](../../Tests/TestAssetParserHardening.cpp#L399) | | | `out` | function | Tests | [TestAudioECSBindingReal.cpp:L85](../../Tests/TestAudioECSBindingReal.cpp#L85) | | | `out` | function | Tests | [TestAudioEngineReal.cpp:L108](../../Tests/TestAudioEngineReal.cpp#L108) | | | `out` | function | Tests | [TestD3D11DeviceContractsReal.cpp:L137](../../Tests/TestD3D11DeviceContractsReal.cpp#L137) | | @@ -30185,8 +30246,8 @@ | `out` | function | Tests | [TestENG220ObjImportReal.cpp:L199](../../Tests/TestENG220ObjImportReal.cpp#L199) | | | `out` | function | Tests | [TestEditorPanelsRealBackends.cpp:L207](../../Tests/TestEditorPanelsRealBackends.cpp#L207) | | | `out` | function | Tests | [TestEditorPanelsRealBackends.cpp:L211](../../Tests/TestEditorPanelsRealBackends.cpp#L211) | | -| `out` | function | Tests | [TestEditorSubsystemsReal.cpp:L210](../../Tests/TestEditorSubsystemsReal.cpp#L210) | | -| `out` | function | Tests | [TestEditorSubsystemsReal.cpp:L230](../../Tests/TestEditorSubsystemsReal.cpp#L230) | | +| `out` | function | Tests | [TestEditorSubsystemsReal.cpp:L233](../../Tests/TestEditorSubsystemsReal.cpp#L233) | | +| `out` | function | Tests | [TestEditorSubsystemsReal.cpp:L253](../../Tests/TestEditorSubsystemsReal.cpp#L253) | | | `out` | function | Tests | [TestGamePackager.cpp:L16](../../Tests/TestGamePackager.cpp#L16) | | | `out` | function | Tests | [TestGoldenImageTest.cpp:L411](../../Tests/TestGoldenImageTest.cpp#L411) | | | `out` | function | Tests | [TestGoldenImageTest.cpp:L469](../../Tests/TestGoldenImageTest.cpp#L469) | | @@ -30213,15 +30274,15 @@ | `out` | function | Tests | [TestShaderServiceClient.cpp:L410](../../Tests/TestShaderServiceClient.cpp#L410) | | | `out` | function | Tests | [TestShaderServiceClient.cpp:L416](../../Tests/TestShaderServiceClient.cpp#L416) | | | `out` | function | Tests | [TestShaderServiceClient.cpp:L421](../../Tests/TestShaderServiceClient.cpp#L421) | | -| `out` | function | Tests | [TestSparkPak.cpp:L520](../../Tests/TestSparkPak.cpp#L520) | | -| `out` | function | Tests | [TestSparkPak.cpp:L565](../../Tests/TestSparkPak.cpp#L565) | | -| `out` | function | Tests | [TestSparkPak.cpp:L617](../../Tests/TestSparkPak.cpp#L617) | | -| `out` | function | Tests | [TestSparkPak.cpp:L782](../../Tests/TestSparkPak.cpp#L782) | | -| `out` | function | Tests | [TestSparkPak.cpp:L860](../../Tests/TestSparkPak.cpp#L860) | | +| `out` | function | Tests | [TestSparkPak.cpp:L536](../../Tests/TestSparkPak.cpp#L536) | | +| `out` | function | Tests | [TestSparkPak.cpp:L581](../../Tests/TestSparkPak.cpp#L581) | | +| `out` | function | Tests | [TestSparkPak.cpp:L633](../../Tests/TestSparkPak.cpp#L633) | | +| `out` | function | Tests | [TestSparkPak.cpp:L798](../../Tests/TestSparkPak.cpp#L798) | | +| `out` | function | Tests | [TestSparkPak.cpp:L876](../../Tests/TestSparkPak.cpp#L876) | | | `out` | function | Tests | [TestSparkTerrainFormatReal.cpp:L90](../../Tests/TestSparkTerrainFormatReal.cpp#L90) | | | `out` | function | Tests | [TestTF120Residency.cpp:L61](../../Tests/TestTF120Residency.cpp#L61) | | | `out` | function | Tests | [TestTF120SharedSaveRoot.cpp:L57](../../Tests/TestTF120SharedSaveRoot.cpp#L57) | | -| `out` | function | Tests | [TestTF120Travel.cpp:L600](../../Tests/TestTF120Travel.cpp#L600) | | +| `out` | function | Tests | [TestTF120Travel.cpp:L587](../../Tests/TestTF120Travel.cpp#L587) | | | `out` | function | Tests | [TestTFOnboarding.cpp:L554](../../Tests/TestTFOnboarding.cpp#L554) | | | `out` | function | Tests | [TestTFOnboarding.cpp:L655](../../Tests/TestTFOnboarding.cpp#L655) | | | `out` | function | Tests | [TestTFOnboarding.cpp:L698](../../Tests/TestTFOnboarding.cpp#L698) | | @@ -30237,7 +30298,7 @@ | `out` | function | Tests | [TestTFOutfitStore.cpp:L58](../../Tests/TestTFOutfitStore.cpp#L58) | | | `out` | function | Tests | [TestTFOutfitStore.cpp:L724](../../Tests/TestTFOutfitStore.cpp#L724) | | | `out` | function | Tests | [TestTextureStexBoundsReal.cpp:L72](../../Tests/TestTextureStexBoundsReal.cpp#L72) | | -| `out` | function | Tests | [TestThirdPartyIntegration.cpp:L83](../../Tests/TestThirdPartyIntegration.cpp#L83) | | +| `out` | function | Tests | [TestThirdPartyIntegration.cpp:L99](../../Tests/TestThirdPartyIntegration.cpp#L99) | | | `out` | function | Tests | [TestVersionControlSystemGitReal.cpp:L57](../../Tests/TestVersionControlSystemGitReal.cpp#L57) | | | `out` | function | Tests | [TestVersionControlSystemGitReal.cpp:L68](../../Tests/TestVersionControlSystemGitReal.cpp#L68) | Give the repo a local identity so commits do not depend on the machine's global git config. | | `out` | function | Tests | [Test_ai-anim_animation.cpp:L59](../../Tests/harden/Test_ai-anim_animation.cpp#L59) | | @@ -30275,7 +30336,7 @@ | `output` | function | SparkEditor | [EditorRecoveryFiles.h:L114](../../SparkEditor/Source/Core/EditorRecoveryFiles.h#L114) | | | `output` | function | SparkEditor | [RegionMapDataSource.cpp:L60](../../SparkEditor/Source/Panels/RegionMapDataSource.cpp#L60) | | | `output` | function | SparkEngine | [ReflectedScenePersistence.cpp:L181](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L181) | | -| `output` | function | SparkEngine | [SceneManager.cpp:L176](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L176) | | +| `output` | function | SparkEngine | [SceneManager.cpp:L186](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L186) | | | `output` | function | SparkEngine | [CompressionUtils.cpp:L33](../../SparkEngine/Source/Utils/CompressionUtils.cpp#L33) | | | `output` | function | SparkEngine | [CompressionUtils.cpp:L49](../../SparkEngine/Source/Utils/CompressionUtils.cpp#L49) | | | `output` | function | SparkEngine | [CompressionUtils.cpp:L79](../../SparkEngine/Source/Utils/CompressionUtils.cpp#L79) | | @@ -30496,12 +30557,15 @@ | `OWGatheringSystem::Shutdown` | method | GameModules | [OWGatheringSystem.cpp:L513](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.cpp#L513) | | | `OWGatheringSystem::Update` | method | GameModules | [OWGatheringSystem.cpp:L285](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.cpp#L285) | | | `OWGatheringSystem::UpdateNodeRespawns` | method | GameModules | [OWGatheringSystem.cpp:L293](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.cpp#L293) | | +| `owned` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L100](../../Tests/TestFPSGameCameraReloadReal.cpp#L100) | | | `OwnedEditorProcess` | class | SparkEditor | [EditorProcessLaunch.h:L117](../../SparkEditor/Source/Utils/EditorProcessLaunch.h#L117) | Single-process-tree RAII owner for editor-launched children. | | `OwnedEditorProcess` | function | SparkEditor | [EditorProcessLaunch.h:L120](../../SparkEditor/Source/Utils/EditorProcessLaunch.h#L120) | | | `OwnedEditorProcess::Adopt` | method | SparkEditor | [EditorProcessLaunch.cpp:L64](../../SparkEditor/Source/Utils/EditorProcessLaunch.cpp#L64) | | | `OwnedEditorProcess::Clear` | method | SparkEditor | [EditorProcessLaunch.cpp:L103](../../SparkEditor/Source/Utils/EditorProcessLaunch.cpp#L103) | | | `OwnedEditorProcess::Poll` | method | SparkEditor | [EditorProcessLaunch.cpp:L82](../../SparkEditor/Source/Utils/EditorProcessLaunch.cpp#L82) | | | `OwnedEditorProcess::Stop` | method | SparkEditor | [EditorProcessLaunch.cpp:L92](../../SparkEditor/Source/Utils/EditorProcessLaunch.cpp#L92) | | +| `OwnedSceneDirectory` | class | Tests | [TestFPSGameCameraReloadReal.cpp:L53](../../Tests/TestFPSGameCameraReloadReal.cpp#L53) | | +| `OwnedSceneDirectory` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L56](../../Tests/TestFPSGameCameraReloadReal.cpp#L56) | | | `owner` | function | Tests | [TestEditorSubsystems.cpp:L2062](../../Tests/TestEditorSubsystems.cpp#L2062) | | | `owner` | function | Tests | [TestEditorSubsystems.cpp:L2117](../../Tests/TestEditorSubsystems.cpp#L2117) | | | `owner` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L361](../../Tests/TestLIFE200ModuleReloadReal.cpp#L361) | | @@ -30510,8 +30574,8 @@ | `owner` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L383](../../Tests/TestLIFE200ModuleReloadReal.cpp#L383) | | | `owner` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L424](../../Tests/TestLIFE200ModuleReloadReal.cpp#L424) | | | `owner` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L438](../../Tests/TestLIFE200ModuleReloadReal.cpp#L438) | | -| `owner` | function | Tests | [TestPrototypeModuleKitReal.cpp:L467](../../Tests/TestPrototypeModuleKitReal.cpp#L467) | | -| `owner` | function | Tests | [TestPrototypeModuleKitReal.cpp:L472](../../Tests/TestPrototypeModuleKitReal.cpp#L472) | | +| `owner` | function | Tests | [TestPrototypeModuleKitReal.cpp:L473](../../Tests/TestPrototypeModuleKitReal.cpp#L473) | | +| `owner` | function | Tests | [TestPrototypeModuleKitReal.cpp:L478](../../Tests/TestPrototypeModuleKitReal.cpp#L478) | | | `OwnerColor` | function | SparkEditor | [RegionMapEditorCanvas.cpp:L45](../../SparkEditor/Source/Panels/RegionMapEditorCanvas.cpp#L45) | | | `OwnerMatchesCurrentProcessUser` | function | SparkGateway | [GatewaySecurity.cpp:L112](../../SparkGateway/src/GatewaySecurity.cpp#L112) | | | `OwnerOf` | function | GameModules | [TFRegionSystem.h:L89](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.h#L89) | | @@ -30643,7 +30707,7 @@ | `P99Us` | function | Tests | [TestEngineMonitor.cpp:L142](../../Tests/TestEngineMonitor.cpp#L142) | | | `Package` | function | SparkEngine | [GamePackager.h:L72](../../SparkEngine/Source/Core/GamePackager.h#L72) | | | `Package` | function | SparkEngine | [GamePackager.h:L161](../../SparkEngine/Source/Engine/Build/GamePackager.h#L161) | Package a game build into a distributable directory | -| `Package` | function | Tests | [TestEditorCookPackageReal.cpp:L162](../../Tests/TestEditorCookPackageReal.cpp#L162) | | +| `Package` | function | Tests | [TestEditorCookPackageReal.cpp:L164](../../Tests/TestEditorCookPackageReal.cpp#L164) | | | `Package` | function | Tests | [TestSEC4NarrowPathsReal.cpp:L158](../../Tests/TestSEC4NarrowPathsReal.cpp#L158) | | | `PackageBuildConfig` | enum | SparkEngine | [GamePackager.h:L28](../../SparkEngine/Source/Core/GamePackager.h#L28) | | | `PackageCompiledGraphs` | function | Tests | [TestENG200VisualScriptRuntimeReal.cpp:L128](../../Tests/TestENG200VisualScriptRuntimeReal.cpp#L128) | | @@ -30655,7 +30719,7 @@ | `PackagePlatform` | enum | SparkEngine | [GamePackager.h:L48](../../SparkEngine/Source/Engine/Build/GamePackager.h#L48) | Target platform for the package | | `PackageResult` | struct | SparkEngine | [GamePackager.h:L45](../../SparkEngine/Source/Core/GamePackager.h#L45) | | | `PackageResult` | struct | SparkEngine | [GamePackager.h:L89](../../SparkEngine/Source/Engine/Build/GamePackager.h#L89) | Result of a packaging operation | -| `PackageSettings` | function | Tests | [TestEditorCookPackageReal.cpp:L422](../../Tests/TestEditorCookPackageReal.cpp#L422) | | +| `PackageSettings` | function | Tests | [TestEditorCookPackageReal.cpp:L433](../../Tests/TestEditorCookPackageReal.cpp#L433) | | | `PackageSupportsConfiguration` | function | SparkEditor | [BuildPipeline.cpp:L137](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L137) | | | `PackageTestReadText` | function | Tests | [TestEditorSubsystems.cpp:L2397](../../Tests/TestEditorSubsystems.cpp#L2397) | | | `PackageTestUtf8` | function | Tests | [TestEditorSubsystems.cpp:L2391](../../Tests/TestEditorSubsystems.cpp#L2391) | | @@ -30744,7 +30808,7 @@ | `PanelIcon` | struct | SparkEditor | [EditorPanelFactoryMetadata.cpp:L18](../../SparkEditor/Source/Core/EditorPanelFactoryMetadata.cpp#L18) | | | `PanelState` | struct | Tests | [TestEditorLayoutManager.cpp:L31](../../Tests/TestEditorLayoutManager.cpp#L31) | | | `PanelType` | enum | SparkEditor | [CoreEditorEnums.h:L33](../../SparkEditor/Source/Enums/CoreEditorEnums.h#L33) | Editor panel types | -| `panelVector` | function | SparkEditor | [EditorUI.cpp:L830](../../SparkEditor/Source/Core/EditorUI.cpp#L830) | | +| `panelVector` | function | SparkEditor | [EditorUI.cpp:L850](../../SparkEditor/Source/Core/EditorUI.cpp#L850) | | | `PanelWindowState` | struct | SparkEditor | [EditorWindowManager.h:L38](../../SparkEditor/Source/Core/EditorWindowManager.h#L38) | Serializable state for a single editor panel | | `PanelWindowState` | struct | Tests | [TestEditorWindowManager.cpp:L14](../../Tests/TestEditorWindowManager.cpp#L14) | | | `ParallaxBackground` | struct | SparkEngine | [Sprite2DComponents.h:L225](../../SparkEngine/Source/Engine/ECS/Components/Sprite2DComponents.h#L225) | | @@ -30776,7 +30840,7 @@ | `ParamType` | enum | SparkEngine | [MaterialDefinition.h:L70](../../SparkEngine/Source/Graphics/MaterialDefinition.h#L70) | Parameter types supported in material definitions | | `ParamValue` | alias | SparkEngine | [MaterialDefinition.h:L95](../../SparkEngine/Source/Graphics/MaterialDefinition.h#L95) | A typed parameter value (matches ParamType) | | `parent` | function | GameModules | [RTSGridPathfinder.cpp:L254](../../GameModules/SparkGameRTS/Source/Navigation/RTSGridPathfinder.cpp#L254) | | -| `parent` | function | Tests | [TestEditorCookPackageReal.cpp:L141](../../Tests/TestEditorCookPackageReal.cpp#L141) | | +| `parent` | function | Tests | [TestEditorCookPackageReal.cpp:L143](../../Tests/TestEditorCookPackageReal.cpp#L143) | | | `parent` | function | Tests | [TestRuntimePrefab.cpp:L131](../../Tests/TestRuntimePrefab.cpp#L131) | | | `parent` | function | Tests | [TestSceneGraph2D.cpp:L56](../../Tests/TestSceneGraph2D.cpp#L56) | | | `parent` | function | Tests | [TestSceneGraph2D.cpp:L65](../../Tests/TestSceneGraph2D.cpp#L65) | | @@ -30935,6 +30999,8 @@ | `ParseManifestJsonPayload` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1096](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1096) | | | `ParseManifestJsonPayload` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1293](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1293) | | | `ParseManifestMember` | function | SparkCrashReporter | [CrashReporterApp.cpp:L560](../../SparkCrashReporter/src/CrashReporterApp.cpp#L560) | | +| `ParseMaterialText` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L334](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L334) | | +| `ParseMaterialText` | function | SparkEditor | [MaterialEditorMaterialParser.h:L15](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.h#L15) | Parse into a temporary definition; rejection preserves output, acceptance preserves filePath. | | `ParseMetadataBlock` | function | SparkEngine | [SaveFileCodec.cpp:L191](../../SparkEngine/Source/Engine/SaveSystem/SaveFileCodec.cpp#L191) | | | `ParseModJson` | function | SparkEngine | [ModSystem.h:L230](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L230) | | | `ParseNull` | function | SparkEngine | [JsonUtils.h:L592](../../SparkEngine/Source/Utils/JsonUtils.h#L592) | | @@ -30967,7 +31033,7 @@ | `ParseRconCommandLine` | function | Tests | [TestDedicatedServer.cpp:L107](../../Tests/TestDedicatedServer.cpp#L107) | | | `ParseRecoveryJson` | function | SparkEditor | [EditorRecoveryFiles.h:L139](../../SparkEditor/Source/Core/EditorRecoveryFiles.h#L139) | | | `ParseRecoveryJson` | function | SparkEditor | [EditorRecoveryJson.h:L36](../../SparkEditor/Source/Core/EditorRecoveryJson.h#L36) | | -| `ParseReference` | function | Tests | [TestTF120Travel.cpp:L317](../../Tests/TestTF120Travel.cpp#L317) | | +| `ParseReference` | function | Tests | [TestTF120Travel.cpp:L304](../../Tests/TestTF120Travel.cpp#L304) | | | `ParseRegions` | function | GameModules | [TFDataTablesInternal.h:L75](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTablesInternal.h#L75) | | | `ParseRegions` | function | GameModules | [TFDataTablesParseWorld.cpp:L26](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTablesParseWorld.cpp#L26) | | | `ParseResponse` | function | SparkEditor | [SparkEngineIntegration.h:L571](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L571) | Parse engine response | @@ -31192,12 +31258,12 @@ | `PasswordBuffer` | alias | Tests | [TestMMOCredentialSecurity.cpp:L13](../../Tests/TestMMOCredentialSecurity.cpp#L13) | | | `passwordBytes` | function | Tests | [TestTFOnboarding.cpp:L1426](../../Tests/TestTFOnboarding.cpp#L1426) | | | `PasswordVerifier` | alias | GameModules | [MMOAccountSystem.h:L150](../../GameModules/SparkGameMMO/Source/Account/MMOAccountSystem.h#L150) | | -| `path` | function | GameModules | [Game.cpp:L363](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L363) | | -| `path` | function | GameModules | [GameConsoleOps.cpp:L696](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L696) | | +| `path` | function | GameModules | [Game.cpp:L379](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L379) | | +| `path` | function | GameModules | [GameConsoleOps.cpp:L704](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L704) | | | `path` | function | SparkBuild | [Config.cpp:L718](../../SparkBuild/src/Config.cpp#L718) | | | `path` | function | SparkBuild | [Downloader.cpp:L246](../../SparkBuild/src/Downloader.cpp#L246) | | -| `path` | function | SparkBuild | [ProcessRunnerTests.cpp:L670](../../SparkBuild/tests/ProcessRunnerTests.cpp#L670) | | -| `path` | function | SparkBuild | [ProcessRunnerTests.cpp:L711](../../SparkBuild/tests/ProcessRunnerTests.cpp#L711) | | +| `path` | function | SparkBuild | [ProcessRunnerTests.cpp:L663](../../SparkBuild/tests/ProcessRunnerTests.cpp#L663) | | +| `path` | function | SparkBuild | [ProcessRunnerTests.cpp:L702](../../SparkBuild/tests/ProcessRunnerTests.cpp#L702) | | | `path` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L324](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L324) | | | `path` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L377](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L377) | | | `path` | function | SparkCrashReporter | [CrashReporterManifestTests.cpp:L709](../../SparkCrashReporter/tests/CrashReporterManifestTests.cpp#L709) | | @@ -31208,12 +31274,13 @@ | `path` | function | SparkEditor | [EditorRecoveryJson.h:L48](../../SparkEditor/Source/Core/EditorRecoveryJson.h#L48) | | | `path` | function | SparkEngine | [AsyncDatabase.cpp:L769](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.cpp#L769) | | | `path` | function | SparkEngine | [AngelScriptEngine.cpp:L756](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.cpp#L756) | | -| `path` | function | SparkEngine | [SceneManagerReflected.cpp:L23](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L23) | | +| `path` | function | SparkEngine | [SceneManagerReflected.cpp:L35](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L35) | | | `Path` | function | Tests | [TestDocumentDurableWrite.cpp:L57](../../Tests/TestDocumentDurableWrite.cpp#L57) | | | `Path` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L61](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L61) | | | `Path` | function | Tests | [TestEditorPanelsRealBackends.cpp:L71](../../Tests/TestEditorPanelsRealBackends.cpp#L71) | | | `Path` | function | Tests | [TestEditorRecovery.cpp:L37](../../Tests/TestEditorRecovery.cpp#L37) | | -| `Path` | function | Tests | [TestEditorSubsystemsReal.cpp:L62](../../Tests/TestEditorSubsystemsReal.cpp#L62) | | +| `Path` | function | Tests | [TestEditorSubsystemsReal.cpp:L65](../../Tests/TestEditorSubsystemsReal.cpp#L65) | | +| `Path` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L69](../../Tests/TestFPSGameCameraReloadReal.cpp#L69) | | | `Path` | function | Tests | [TestMOD300ShowcaseLocalizationReal.cpp:L58](../../Tests/TestMOD300ShowcaseLocalizationReal.cpp#L58) | | | `Path` | function | Tests | [TestMOD330ARPGDungeonReal.cpp:L197](../../Tests/TestMOD330ARPGDungeonReal.cpp#L197) | | | `Path` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L160](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L160) | | @@ -31236,7 +31303,7 @@ | `PathFromUtf8` | function | SparkCrashReporter | [CrashReporterApp.cpp:L663](../../SparkCrashReporter/src/CrashReporterApp.cpp#L663) | | | `PathFromUtf8` | function | SparkEditor | [EditorUI.cpp:L85](../../SparkEditor/Source/Core/EditorUI.cpp#L85) | | | `PathFromUtf8` | function | SparkEditor | [ProjectManager.cpp:L174](../../SparkEditor/Source/Core/ProjectManager.cpp#L174) | | -| `PathFromUtf8` | function | SparkEditor | [AssetBrowserPanel.cpp:L44](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L44) | | +| `PathFromUtf8` | function | SparkEditor | [AssetBrowserPathUtils.h:L24](../../SparkEditor/Source/Panels/AssetBrowserPathUtils.h#L24) | | | `PathFromUtf8` | function | SparkEditor | [BasicMaterialEditorDrawing.cpp:L32](../../SparkEditor/Source/Panels/BasicMaterialEditorDrawing.cpp#L32) | | | `PathFromUtf8` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L45](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L45) | | | `PathFromUtf8` | function | SparkEditor | [PrefabAsset.cpp:L29](../../SparkEditor/Source/Prefabs/PrefabAsset.cpp#L29) | | @@ -31308,8 +31375,8 @@ | `PathToTestUtf8` | function | Tests | [TestFileUtils.cpp:L34](../../Tests/TestFileUtils.cpp#L34) | | | `PathToUtf8` | function | SparkCrashReporter | [CrashReporterApp.cpp:L672](../../SparkCrashReporter/src/CrashReporterApp.cpp#L672) | | | `PathToUtf8` | function | SparkEditor | [EditorUI.cpp:L107](../../SparkEditor/Source/Core/EditorUI.cpp#L107) | | -| `PathToUtf8` | function | SparkEditor | [EditorUI.cpp:L1536](../../SparkEditor/Source/Core/EditorUI.cpp#L1536) | | -| `PathToUtf8` | function | SparkEditor | [EditorUI.cpp:L1568](../../SparkEditor/Source/Core/EditorUI.cpp#L1568) | | +| `PathToUtf8` | function | SparkEditor | [EditorUI.cpp:L1556](../../SparkEditor/Source/Core/EditorUI.cpp#L1556) | | +| `PathToUtf8` | function | SparkEditor | [EditorUI.cpp:L1588](../../SparkEditor/Source/Core/EditorUI.cpp#L1588) | | | `PathToUtf8` | function | SparkEditor | [ProjectManager.cpp:L196](../../SparkEditor/Source/Core/ProjectManager.cpp#L196) | | | `PathToUtf8` | function | SparkEditor | [ProjectManager.cpp:L274](../../SparkEditor/Source/Core/ProjectManager.cpp#L274) | | | `PathToUtf8` | function | SparkEditor | [ProjectManager.cpp:L328](../../SparkEditor/Source/Core/ProjectManager.cpp#L328) | | @@ -31324,7 +31391,7 @@ | `PathToUtf8` | function | SparkEditor | [ProjectManager.cpp:L1647](../../SparkEditor/Source/Core/ProjectManager.cpp#L1647) | | | `PathToUtf8` | function | SparkEditor | [ProjectManager.cpp:L2226](../../SparkEditor/Source/Core/ProjectManager.cpp#L2226) | | | `PathToUtf8` | function | SparkEditor | [ProjectManager.cpp:L2241](../../SparkEditor/Source/Core/ProjectManager.cpp#L2241) | | -| `PathToUtf8` | function | SparkEditor | [AssetBrowserPanel.cpp:L31](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L31) | | +| `PathToUtf8` | function | SparkEditor | [AssetBrowserPathUtils.h:L11](../../SparkEditor/Source/Panels/AssetBrowserPathUtils.h#L11) | | | `PathToUtf8` | function | SparkEditor | [BasicMaterialEditorDrawing.cpp:L38](../../SparkEditor/Source/Panels/BasicMaterialEditorDrawing.cpp#L38) | | | `PathToUtf8` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L51](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L51) | | | `PathToUtf8` | function | SparkEditor | [PrefabManager.cpp:L32](../../SparkEditor/Source/Prefabs/PrefabManager.cpp#L32) | | @@ -31334,8 +31401,8 @@ | `PathToUtf8` | function | SparkEngine | [ModuleManager.cpp:L155](../../SparkEngine/Source/Core/ModuleManager.cpp#L155) | | | `PathToUtf8` | function | SparkEngine | [ModuleSidecar.cpp:L28](../../SparkEngine/Source/Core/ModuleSidecar.cpp#L28) | | | `PathToUtf8` | function | SparkEngine | [PluginMetadata.cpp:L29](../../SparkEngine/Source/Core/PluginMetadata.cpp#L29) | | -| `PathToUtf8` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L36](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L36) | | -| `PathToUtf8` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L230](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L230) | | +| `PathToUtf8` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L37](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L37) | | +| `PathToUtf8` | function | SparkEngine | [SparkEngineWindowsModules.cpp:L231](../../SparkEngine/Source/Core/SparkEngineWindowsModules.cpp#L231) | | | `PathToUtf8` | function | SparkEngine | [StartupSplash.cpp:L110](../../SparkEngine/Source/Core/StartupSplash.cpp#L110) | | | `PathToUtf8` | function | SparkEngine | [ModSystem.cpp:L262](../../SparkEngine/Source/Engine/Modding/ModSystem.cpp#L262) | | | `PathToUtf8` | function | SparkEngine | [ProjectAssetPath.cpp:L51](../../SparkEngine/Source/Graphics/ProjectAssetPath.cpp#L51) | | @@ -31397,11 +31464,12 @@ | `PawnInfo` | struct | GameModules | [TFPlayerSystem.h:L27](../../GameModules/SparkGameMMOFPS/Source/Game/TFPlayerSystem.h#L27) | | | `PawnInfo` | alias | GameModules | [TFPlayerSystem.h:L42](../../GameModules/SparkGameMMOFPS/Source/Game/TFPlayerSystem.h#L42) | | | `PawnInfo` | struct | GameModules | [TFWeaponSystem.h:L38](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L38) | | -| `PawnInfo` | struct | GameModules | [TFReplication.h:L37](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L37) | | +| `PawnInfo` | struct | GameModules | [TFReplication.h:L39](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L39) | | +| `PawnState` | struct | Tests | [TestTFReplicationRefresh.cpp:L12](../../Tests/TestTFReplicationRefresh.cpp#L12) | | | `PawnView` | struct | GameModules | [TFHUD.h:L94](../../GameModules/SparkGameMMOFPS/Source/UI/TFHUD.h#L94) | | | `payload` | function | GameModules | [MMOSessionGate.cpp:L109](../../GameModules/SparkGameMMO/Source/Session/MMOSessionGate.cpp#L109) | | | `payload` | function | GameModules | [TFVehicleNet.cpp:L249](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleNet.cpp#L249) | | -| `payload` | function | GameModules | [TFReplication.cpp:L298](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L298) | | +| `payload` | function | GameModules | [TFReplication.cpp:L310](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L310) | | | `payload` | function | GameModules | [OWPersistence.inl:L159](../../GameModules/SparkGameOpenWorld/Source/Persistence/OWPersistence.inl#L159) | | | `payload` | function | SparkDaemon | [OrchestrationJournal.cpp:L386](../../SparkDaemon/src/OrchestrationJournal.cpp#L386) | | | `payload` | function | SparkEditor | [CollaborativeEditSessionBroker.cpp:L298](../../SparkEditor/Source/Communication/CollaborativeEditSessionBroker.cpp#L298) | | @@ -31416,8 +31484,8 @@ | `payload` | function | Tests | [TestSEC2ConsoleIpcReal.cpp:L171](../../Tests/TestSEC2ConsoleIpcReal.cpp#L171) | | | `payload` | function | Tests | [TestShaderCompilerReal.cpp:L249](../../Tests/TestShaderCompilerReal.cpp#L249) | | | `payload` | function | Tests | [TestShaderCompilerReal.cpp:L299](../../Tests/TestShaderCompilerReal.cpp#L299) | | -| `payload` | function | Tests | [TestSparkPak.cpp:L619](../../Tests/TestSparkPak.cpp#L619) | | -| `payload` | function | Tests | [TestSparkPak.cpp:L660](../../Tests/TestSparkPak.cpp#L660) | | +| `payload` | function | Tests | [TestSparkPak.cpp:L635](../../Tests/TestSparkPak.cpp#L635) | | +| `payload` | function | Tests | [TestSparkPak.cpp:L676](../../Tests/TestSparkPak.cpp#L676) | | | `PayloadStorage` | alias | SparkEngine | [ComponentReflection.cpp:L306](../../SparkEngine/Source/Core/ComponentReflection.cpp#L306) | | | `PayloadStorage` | alias | Tests | [Test_persistence_SaveSystem.cpp:L487](../../Tests/harden/Test_persistence_SaveSystem.cpp#L487) | | | `payloadWriter` | function | SparkEditor | [JSONSceneSerializer.cpp:L566](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L566) | | @@ -31813,7 +31881,7 @@ | `PhysicsSystem` | class | GameModules | [RacingTrackSystem.h:L24](../../GameModules/SparkGameRacing/Source/Track/RacingTrackSystem.h#L24) | | | `PhysicsSystem` | class | GameModules | [RacingVehicleSystem.h:L40](../../GameModules/SparkGameRacing/Source/Vehicle/RacingVehicleSystem.h#L40) | | | `PhysicsSystem` | class | SparkEngine | [AudioMixer.h:L41](../../SparkEngine/Source/Audio/AudioMixer.h#L41) | | -| `PhysicsSystem` | class | SparkEngine | [EngineContext.h:L43](../../SparkEngine/Source/Core/EngineContext.h#L43) | | +| `PhysicsSystem` | class | SparkEngine | [EngineContext.h:L44](../../SparkEngine/Source/Core/EngineContext.h#L44) | | | `PhysicsSystem` | class | SparkEngine | [EngineRuntime.h:L33](../../SparkEngine/Source/Core/EngineRuntime.h#L33) | | | `PhysicsSystem` | class | SparkEngine | [EngineSetup.h:L21](../../SparkEngine/Source/Core/EngineSetup.h#L21) | | | `PhysicsSystem` | class | SparkEngine | [ECSIntegration.h:L30](../../SparkEngine/Source/Engine/ECS/ECSIntegration.h#L30) | | @@ -31827,7 +31895,7 @@ | `PhysicsSystem` | class | SparkEngine | [RagdollSystem.h:L28](../../SparkEngine/Source/Physics/RagdollSystem.h#L28) | | | `PhysicsSystem` | class | SparkEngine | [SoftBodyPhysics.h:L27](../../SparkEngine/Source/Physics/SoftBodyPhysics.h#L27) | | | `PhysicsSystem` | class | SparkEngine | [VehiclePhysics.h:L26](../../SparkEngine/Source/Physics/VehiclePhysics.h#L26) | | -| `PhysicsSystem` | class | SparkSDK | [IEngineContext.h:L26](../../SparkSDK/Include/Spark/IEngineContext.h#L26) | | +| `PhysicsSystem` | class | SparkSDK | [IEngineContext.h:L27](../../SparkSDK/Include/Spark/IEngineContext.h#L27) | | | `PhysicsSystem` | class | Tests | [TestPhysicsSystem.cpp:L97](../../Tests/TestPhysicsSystem.cpp#L97) | | | `PhysicsSystem::AddSubShape` | method | SparkEngine | [PhysicsSystemQueries.cpp:L669](../../SparkEngine/Source/Physics/PhysicsSystemQueries.cpp#L669) | | | `PhysicsSystem::AddSubShape` | method | SparkEngine | [PhysicsSystemStub.cpp:L682](../../SparkEngine/Source/Physics/PhysicsSystemStub.cpp#L682) | | @@ -32035,10 +32103,10 @@ | `pilot` | function | GameModules | [VehicleSystem.cpp:L959](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.cpp#L959) | | | `pilot` | function | GameModules | [VehicleSystem.cpp:L1005](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.cpp#L1005) | | | `Pin` | function | Tests | [TestCoverageScripting.cpp:L58](../../Tests/TestCoverageScripting.cpp#L58) | | -| `Pin` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L87](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L87) | | +| `Pin` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L88](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L88) | | | `Pin` | function | Tests | [TestSEC3ScriptingHardening.cpp:L43](../../Tests/TestSEC3ScriptingHardening.cpp#L43) | | | `PinArtifactPath` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1021](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1021) | | -| `PinArtifactRoot` | function | SparkEngine | [CrashHandler.cpp:L159](../../SparkEngine/Source/Utils/CrashHandler.cpp#L159) | | +| `PinArtifactRoot` | function | SparkEngine | [CrashHandler.cpp:L160](../../SparkEngine/Source/Utils/CrashHandler.cpp#L160) | | | `PinDescriptor` | struct | Tests | [TestShaderGraphCompiler.cpp:L211](../../Tests/TestShaderGraphCompiler.cpp#L211) | | | `Ping` | function | SparkEngine | [DaemonClient.h:L102](../../SparkEngine/Source/Utils/DaemonClient.h#L102) | | | `PingCol32` | function | GameModules | [TFPingUIDraw.cpp:L61](../../GameModules/SparkGameMMOFPS/Source/UI/TFPingUIDraw.cpp#L61) | | @@ -32052,7 +32120,7 @@ | `PinKindName` | function | SparkEngine | [VisualScriptGraphIO.h:L120](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphIO.h#L120) | | | `PinListText` | function | SparkEngine | [VisualScriptGraphWriter.cpp:L111](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphWriter.cpp#L111) | | | `PinnedDirectory` | struct | SparkCrashReporter | [CrashReporterApp.cpp:L741](../../SparkCrashReporter/src/CrashReporterApp.cpp#L741) | | -| `PinnedFile` | struct | SparkEngine | [CrashHandler.cpp:L265](../../SparkEngine/Source/Utils/CrashHandler.cpp#L265) | | +| `PinnedFile` | struct | SparkEngine | [CrashHandler.cpp:L266](../../SparkEngine/Source/Utils/CrashHandler.cpp#L266) | | | `PinParticle` | function | SparkEngine | [ClothSimulation.h:L205](../../SparkEngine/Source/Physics/ClothSimulation.h#L205) | Pin a particle to a fixed position. | | `pinPos` | function | SparkEditor | [VisualScriptPanel.cpp:L382](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L382) | | | `pinPos` | function | SparkEditor | [VisualScriptPanel.cpp:L415](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L415) | | @@ -32065,7 +32133,7 @@ | `PinTypeString` | function | SparkEngine | [VisualScriptCompiler.cpp:L143](../../SparkEngine/Source/Engine/Scripting/VisualScriptCompiler.cpp#L143) | | | `PinTypeString` | function | SparkEngine | [VisualScriptEmitter.h:L65](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L65) | | | `PinVertex` | function | SparkEngine | [SoftBodyPhysics.h:L154](../../SparkEngine/Source/Physics/SoftBodyPhysics.h#L154) | Pin a vertex to a fixed world position (make it kinematic). | -| `PipeKeyboardThreadFunc` | function | SparkConsole | [ConsoleApp.h:L78](../../SparkConsole/src/ConsoleApp.h#L78) | | +| `PipeKeyboardThreadFunc` | function | SparkConsole | [ConsoleApp.h:L79](../../SparkConsole/src/ConsoleApp.h#L79) | | | `Pipeline` | struct | Tests | [TestRHI225D3D12ParityReal.cpp:L375](../../Tests/TestRHI225D3D12ParityReal.cpp#L375) | | | `Pipeline` | function | Tests | [TestRHI240OpenGLGoldenReal.cpp:L441](../../Tests/TestRHI240OpenGLGoldenReal.cpp#L441) | | | `PipelineCacheMetrics` | struct | SparkEngine | [PipelineStateCache.h:L103](../../SparkEngine/Source/Graphics/PipelineStateCache.h#L103) | Cache metrics for profiling state object reuse. | @@ -32144,7 +32212,7 @@ | `PlaceContextPing` | function | GameModules | [TFPingUI.h:L88](../../GameModules/SparkGameMMOFPS/Source/UI/TFPingUI.h#L88) | | | `PlaceCryptKit` | function | GameModules | [ARPGDungeonSystem.h:L97](../../GameModules/SparkGameARPG/Source/Dungeon/ARPGDungeonSystem.h#L97) | | | `placed` | function | SparkEngine | [GLTFSkinSkeleton.cpp:L223](../../SparkEngine/Source/Graphics/GLTFSkinSkeleton.cpp#L223) | | -| `placed` | struct | SparkEngine | [SceneManager.cpp:L463](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L463) | | +| `placed` | struct | SparkEngine | [SceneManager.cpp:L519](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L519) | | | `PlaceDeployable` | function | GameModules | [ClassSystem.h:L230](../../GameModules/SparkGameFPS/Source/Game/ClassSystem.h#L230) | Place a deployable object in the world | | `PlaceDetailMeshes` | function | SparkEditor | [TerrainEditor.h:L67](../../SparkEditor/Source/Terrain/TerrainEditor.h#L67) | | | `placeholderHash` | function | Tests | [TestModuleVersion.cpp:L298](../../Tests/TestModuleVersion.cpp#L298) | | @@ -32155,8 +32223,8 @@ | `PlacementBrush` | struct | SparkEditor | [ObjectPlacementPanel.h:L40](../../SparkEditor/Source/Panels/ObjectPlacementPanel.h#L40) | | | `PlacementMode` | enum | SparkEditor | [ObjectPlacementPanel.h:L22](../../SparkEditor/Source/Panels/ObjectPlacementPanel.h#L22) | Editor panel for placing, scattering, and snapping objects in the scene. | | `PlacementRequest` | struct | SparkGateway | [GatewayCoordinator.h:L43](../../SparkGateway/src/GatewayCoordinator.h#L43) | | -| `PlaceModel` | function | GameModules | [GameConsoleOps.cpp:L718](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L718) | | -| `PlaceModelsAt` | function | GameModules | [GameConsoleOps.cpp:L738](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L738) | | +| `PlaceModel` | function | GameModules | [GameConsoleOps.cpp:L726](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L726) | | +| `PlaceModelsAt` | function | GameModules | [GameConsoleOps.cpp:L746](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L746) | | | `PlacePreviewHud` | function | Templates | [GameModule.h:L120](../../Templates/EmptyProject/Source/GameModule.h#L120) | | | `PlaceSpikeTiles` | function | GameModules | [PlatformerHazardSystem.h:L129](../../GameModules/SparkGamePlatformer/Source/Hazard/PlatformerHazardSystem.h#L129) | | | `PlaceTemplate` | function | SparkEditor | [ObjectPlacementPanel.h:L91](../../SparkEditor/Source/Panels/ObjectPlacementPanel.h#L91) | Create one entity from an entity template; false when unconnected or unsupported. | @@ -32401,18 +32469,18 @@ | `PlayControlPanel::LaunchDedicatedWithBots` | method | SparkEditor | [PlayControlLaunch.cpp:L99](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L99) | | | `PlayControlPanel::LaunchGame` | method | SparkEditor | [PlayControlLaunch.cpp:L34](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L34) | | | `PlayControlPanel::PollInstances` | method | SparkEditor | [PlayControlLaunch.cpp:L272](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L272) | | -| `PlayControlPanel::RefreshLogTail` | method | SparkEditor | [PlayControlLaunch.cpp:L306](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L306) | | +| `PlayControlPanel::RefreshLogTail` | method | SparkEditor | [PlayControlLaunch.cpp:L308](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L308) | | | `PlayControlPanel::Render` | method | SparkEditor | [PlayControlPanel.cpp:L74](../../SparkEditor/Source/Panels/PlayControlPanel.cpp#L74) | | | `PlayControlPanel::RenderPlayBar` | method | SparkEditor | [PlayControlPanel.cpp:L127](../../SparkEditor/Source/Panels/PlayControlPanel.cpp#L127) | | | `PlayControlPanel::RenderQuickConnect` | method | SparkEditor | [PlayControlPanel.cpp:L172](../../SparkEditor/Source/Panels/PlayControlPanel.cpp#L172) | | | `PlayControlPanel::RenderStatus` | method | SparkEditor | [PlayControlPanel.cpp:L189](../../SparkEditor/Source/Panels/PlayControlPanel.cpp#L189) | | | `PlayControlPanel::RoleLabel` | method | SparkEditor | [PlayControlPanel.cpp:L108](../../SparkEditor/Source/Panels/PlayControlPanel.cpp#L108) | | -| `PlayControlPanel::SetLaunchContextDirectory` | method | SparkEditor | [PlayControlLaunch.cpp:L295](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L295) | | +| `PlayControlPanel::SetLaunchContextDirectory` | method | SparkEditor | [PlayControlLaunch.cpp:L297](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L297) | | | `PlayControlPanel::Shutdown` | method | SparkEditor | [PlayControlPanel.cpp:L95](../../SparkEditor/Source/Panels/PlayControlPanel.cpp#L95) | | | `PlayControlPanel::StopAll` | method | SparkEditor | [PlayControlLaunch.cpp:L252](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L252) | | | `PlayControlPanel::Update` | method | SparkEditor | [PlayControlPanel.cpp:L40](../../SparkEditor/Source/Panels/PlayControlPanel.cpp#L40) | | -| `PlayControlPanel::WriteConnectCfg` | method | SparkEditor | [PlayControlLaunch.cpp:L376](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L376) | | -| `PlayControlPanel::WriteDedicatedBotsCfg` | method | SparkEditor | [PlayControlLaunch.cpp:L341](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L341) | | +| `PlayControlPanel::WriteConnectCfg` | method | SparkEditor | [PlayControlLaunch.cpp:L378](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L378) | | +| `PlayControlPanel::WriteDedicatedBotsCfg` | method | SparkEditor | [PlayControlLaunch.cpp:L343](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L343) | | | `PlayEngineCue` | function | GameModules | [TFVehicleFx.h:L125](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleFx.h#L125) | | | `Player` | class | GameModules | [Enemy.h:L28](../../GameModules/SparkGameFPS/Source/Game/Enemy.h#L28) | | | `Player` | class | GameModules | [Game.h:L58](../../GameModules/SparkGameFPS/Source/Game/Game.h#L58) | | @@ -32646,7 +32714,7 @@ | `PollJoinsLeaves` | function | GameModules | [TFMedalSystem.h:L268](../../GameModules/SparkGameMMOFPS/Source/Game/TFMedalSystem.h#L268) | | | `PollLaunchedProcess` | function | SparkEditor | [GameModuleSelectorPanel.h:L60](../../SparkEditor/Source/Panels/GameModuleSelectorPanel.h#L60) | | | `PollPingKey` | function | GameModules | [TFPingUI.h:L80](../../GameModules/SparkGameMMOFPS/Source/UI/TFPingUI.h#L80) | | -| `PollPipeModeInput` | function | SparkConsole | [ConsoleApp.h:L80](../../SparkConsole/src/ConsoleApp.h#L80) | | +| `PollPipeModeInput` | function | SparkConsole | [ConsoleApp.h:L81](../../SparkConsole/src/ConsoleApp.h#L81) | | | `PollPosixProcess` | function | SparkEditor | [EditorProcessLaunchPosix.cpp:L174](../../SparkEditor/Source/Utils/EditorProcessLaunchPosix.cpp#L174) | | | `PollPosixProcess` | function | SparkEditor | [EditorProcessLaunchPosixInternal.h:L148](../../SparkEditor/Source/Utils/EditorProcessLaunchPosixInternal.h#L148) | | | `PollProcessExited` | function | SparkEditor | [EditorProcessLaunch.h:L75](../../SparkEditor/Source/Utils/EditorProcessLaunch.h#L75) | Non-blocking poll of a handle from LaunchEditorProcess. Returns true | @@ -32655,9 +32723,9 @@ | `PollRaceControlEdges` | function | GameModules | [RacingRaceFlow.cpp:L249](../../GameModules/SparkGameRacing/Source/Core/RacingRaceFlow.cpp#L249) | | | `PollRaceControlEdges` | function | GameModules | [RacingRaceFlow.h:L50](../../GameModules/SparkGameRacing/Source/Core/RacingRaceFlow.h#L50) | | | `PollResponses` | function | SparkEngine | [RemoteDebugSystem.h:L598](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugSystem.h#L598) | Drain all received responses since the last poll | -| `PollStandaloneInput` | function | SparkConsole | [ConsoleApp.h:L82](../../SparkConsole/src/ConsoleApp.h#L82) | | +| `PollStandaloneInput` | function | SparkConsole | [ConsoleApp.h:L83](../../SparkConsole/src/ConsoleApp.h#L83) | | | `PollWheelSelection` | function | GameModules | [TFPingUI.h:L81](../../GameModules/SparkGameMMOFPS/Source/UI/TFPingUI.h#L81) | | -| `PollWindowsPipeData` | function | SparkConsole | [ConsoleApp.h:L87](../../SparkConsole/src/ConsoleApp.h#L87) | | +| `PollWindowsPipeData` | function | SparkConsole | [ConsoleApp.h:L88](../../SparkConsole/src/ConsoleApp.h#L88) | | | `pool` | function | Tests | [TestAdversarialEngine.cpp:L1186](../../Tests/TestAdversarialEngine.cpp#L1186) | | | `pool` | function | Tests | [TestGPUParticleSystem.cpp:L97](../../Tests/TestGPUParticleSystem.cpp#L97) | | | `pool` | function | Tests | [TestGPUParticleSystem.cpp:L183](../../Tests/TestGPUParticleSystem.cpp#L183) | | @@ -32917,7 +32985,7 @@ | `PrepareContext` | function | Tests | [TestLIFE200LifecycleLoopReal.cpp:L164](../../Tests/TestLIFE200LifecycleLoopReal.cpp#L164) | | | `PreparedAutoIssue` | struct | SparkCrashReporter | [CrashAutoIssues.h:L26](../../SparkCrashReporter/src/CrashAutoIssues.h#L26) | | | `PrepareDraw` | function | SparkEngine | [D3D12Types.h:L779](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L779) | | -| `PreparedSignalArtifacts` | struct | SparkEngine | [CrashHandler.cpp:L2305](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2305) | | +| `PreparedSignalArtifacts` | struct | SparkEngine | [CrashHandler.cpp:L2343](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2343) | | | `PreparedStatementData` | struct | SparkEngine | [AsyncDatabase.h:L85](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L85) | Prepared statement handle with bindable parameters. | | `PreparedStatementData::ClearParams` | method | SparkEngine | [AsyncDatabase.cpp:L146](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.cpp#L146) | | | `PreparedStatementData::SetDouble` | method | SparkEngine | [AsyncDatabase.cpp:L119](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.cpp#L119) | | @@ -32934,7 +33002,7 @@ | `PrepareNetworkStop` | function | GameModules | [TFServerSim.h:L127](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L127) | | | `PrepareNextClientID` | function | SparkEngine | [NetworkManager.h:L925](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L925) | | | `PrepareReloadPlugin` | function | Tests | [TestPluginABI.cpp:L284](../../Tests/TestPluginABI.cpp#L284) | | -| `PrepareSignalReport` | function | SparkEngine | [CrashHandler.cpp:L2502](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2502) | | +| `PrepareSignalReport` | function | SparkEngine | [CrashHandler.cpp:L2540](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2540) | | | `PrepareStatement` | function | SparkEngine | [AsyncDatabase.h:L125](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L125) | | | `PrepareStatement` | function | SparkEngine | [AsyncDatabase.h:L187](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L187) | | | `PrepareStatement` | function | SparkEngine | [AsyncDatabase.h:L256](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L256) | Register a prepared statement SQL string by ID. | @@ -32966,9 +33034,9 @@ | `PrettyImpl` | function | SparkEngine | [JsonUtils.h:L1260](../../SparkEngine/Source/Utils/JsonUtils.h#L1260) | | | `prev` | function | SparkEngine | [SparkConsole.cpp:L100](../../SparkEngine/Source/Utils/SparkConsole.cpp#L100) | | | `PreviewLighting` | enum | SparkEditor | [MaterialEditorPanel.h:L265](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L265) | | -| `previewRegion` | function | SparkEditor | [MaterialEditorPreview.cpp:L161](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L161) | | +| `previewRegion` | function | SparkEditor | [MaterialEditorPreview.cpp:L162](../../SparkEditor/Source/Panels/MaterialEditorPreview.cpp#L162) | | | `PreviewShape` | enum | SparkEditor | [MaterialEditorPanel.h:L255](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L255) | | -| `Previous` | function | SparkBuild | [ProcessRunnerTests.cpp:L592](../../SparkBuild/tests/ProcessRunnerTests.cpp#L592) | | +| `Previous` | function | SparkBuild | [ProcessRunnerTests.cpp:L585](../../SparkBuild/tests/ProcessRunnerTests.cpp#L585) | | | `Previous` | function | SparkEngine | [RTHandleSystem.h:L257](../../SparkEngine/Source/Graphics/RTHandleSystem.h#L257) | | | `previousAction` | struct | SparkEditor | [EditorCrashHandler.cpp:L56](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L56) | | | `previousAction` | struct | Tests | [TestPLT210ProcessPosixReal.cpp:L98](../../Tests/TestPLT210ProcessPosixReal.cpp#L98) | | @@ -32995,8 +33063,8 @@ | `PrintContentionReport` | function | SparkEngine | [ThreadDebugger.h:L366](../../SparkEngine/Source/Utils/ThreadDebugger.h#L366) | | | `PrintDivider` | function | SparkBuild | [Terminal.cpp:L100](../../SparkBuild/src/Terminal.cpp#L100) | | | `PrintDivider` | function | SparkBuild | [Terminal.h:L29](../../SparkBuild/src/Terminal.h#L29) | | -| `PrintDuplicateSkipNotice` | function | SparkConsole | [ConsoleApp.h:L101](../../SparkConsole/src/ConsoleApp.h#L101) | | -| `PrintEngineLog` | function | SparkConsole | [ConsoleApp.h:L100](../../SparkConsole/src/ConsoleApp.h#L100) | | +| `PrintDuplicateSkipNotice` | function | SparkConsole | [ConsoleApp.h:L102](../../SparkConsole/src/ConsoleApp.h#L102) | | +| `PrintEngineLog` | function | SparkConsole | [ConsoleApp.h:L101](../../SparkConsole/src/ConsoleApp.h#L101) | | | `PrintError` | function | SparkEngine | [InGameConsole.h:L186](../../SparkEngine/Source/Utils/InGameConsole.h#L186) | Print an error message | | `PrintHeader` | function | SparkBuild | [Terminal.cpp:L109](../../SparkBuild/src/Terminal.cpp#L109) | | | `PrintHeader` | function | SparkBuild | [Terminal.h:L32](../../SparkBuild/src/Terminal.h#L32) | | @@ -33006,12 +33074,13 @@ | `PrintHotSpotReport` | function | SparkEngine | [CpuDebugger.h:L255](../../SparkEngine/Source/Utils/CpuDebugger.h#L255) | Print top N hotspots to stderr | | `PrintIOReport` | function | SparkEngine | [IODebugger.h:L264](../../SparkEngine/Source/Utils/IODebugger.h#L264) | | | `PrintLeakReport` | function | SparkEngine | [MemoryDebugger.h:L260](../../SparkEngine/Source/Utils/MemoryDebugger.h#L260) | Print a formatted leak report to stderr | -| `PrintLog` | function | SparkConsole | [ConsoleApp.h:L99](../../SparkConsole/src/ConsoleApp.h#L99) | | +| `PrintLog` | function | SparkConsole | [ConsoleApp.h:L100](../../SparkConsole/src/ConsoleApp.h#L100) | | +| `PrintPipePrompt` | function | SparkConsole | [ConsoleApp.h:L78](../../SparkConsole/src/ConsoleApp.h#L78) | | | `PrintProgress` | function | SparkBuild | [Terminal.cpp:L172](../../SparkBuild/src/Terminal.cpp#L172) | | | `PrintProgress` | function | SparkBuild | [Terminal.h:L50](../../SparkBuild/src/Terminal.h#L50) | | | `PrintProgress` | function | Tests | [TestMain.cpp:L400](../../Tests/TestMain.cpp#L400) | | | `PrintReport` | function | Tests | [FPSLANLoopbackPeer.cpp:L300](../../Tests/Fixtures/FPSLANLoopbackPeer.cpp#L300) | | -| `PrintResult` | function | SparkConsole | [ConsoleApp.h:L102](../../SparkConsole/src/ConsoleApp.h#L102) | | +| `PrintResult` | function | SparkConsole | [ConsoleApp.h:L103](../../SparkConsole/src/ConsoleApp.h#L103) | | | `PrintSectionHeader` | function | SparkBuild | [Terminal.cpp:L129](../../SparkBuild/src/Terminal.cpp#L129) | | | `PrintSectionHeader` | function | SparkBuild | [Terminal.h:L35](../../SparkBuild/src/Terminal.h#L35) | | | `PrintSectionReport` | function | SparkEngine | [CpuDebugger.h:L233](../../SparkEngine/Source/Utils/CpuDebugger.h#L233) | Print a formatted report of all section timings to stderr | @@ -33073,7 +33142,7 @@ | `ProcDefinition` | struct | SparkEngine | [AbilitySystem.h:L211](../../SparkEngine/Source/Engine/Gameplay/AbilitySystem.h#L211) | | | `ProceduralCube` | function | Tests | [RHI210D3D11GoldenSupport.h:L444](../../Tests/RHI210D3D11GoldenSupport.h#L444) | | | `ProceduralGenerator` | class | SparkEngine | [ProceduralGenerator.h:L161](../../SparkEngine/Source/Engine/Procedural/ProceduralGenerator.h#L161) | Procedural content generation system | -| `ProceduralMaterialFor` | function | GameModules | [GameConsoleOps.cpp:L691](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L691) | | +| `ProceduralMaterialFor` | function | GameModules | [GameConsoleOps.cpp:L699](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L699) | | | `ProceduralPlane` | function | Tests | [RHI210D3D11GoldenSupport.h:L480](../../Tests/RHI210D3D11GoldenSupport.h#L480) | | | `ProceduralSphere` | function | Tests | [RHI210D3D11GoldenSupport.h:L500](../../Tests/RHI210D3D11GoldenSupport.h#L500) | | | `ProcEntry` | struct | SparkEditor | [AbilityEditorPanel.h:L72](../../SparkEditor/Source/Panels/AbilityEditorPanel.h#L72) | | @@ -33175,7 +33244,7 @@ | `ProcessEffects` | function | SparkEngine | [AbilitySystem.h:L325](../../SparkEngine/Source/Engine/Gameplay/AbilitySystem.h#L325) | | | `ProcessEntityMigrations` | function | SparkEngine | [WorldServer.h:L329](../../SparkEngine/Source/Engine/Networking/WorldServer.h#L329) | | | `ProcessFeedback` | function | SparkEngine | [VirtualTexture.h:L100](../../SparkEngine/Source/Graphics/VirtualTexture.h#L100) | Analyze feedback buffer and schedule page loads/evictions. | -| `ProcessGlobalHotkeys` | function | SparkEditor | [EditorUI.h:L530](../../SparkEditor/Source/Core/EditorUI.h#L530) | | +| `ProcessGlobalHotkeys` | function | SparkEditor | [EditorUI.h:L528](../../SparkEditor/Source/Core/EditorUI.h#L528) | | | `ProcessGPUQueries` | function | SparkEditor | [PerformanceProfiler.h:L355](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L355) | Process GPU timing queries | | `ProcessGroupExists` | function | SparkBuild | [ProcessRunner.cpp:L150](../../SparkBuild/src/ProcessRunner.cpp#L150) | | | `ProcessHealth` | enum | SparkDaemon | [OrchestrationProtocol.h:L67](../../SparkDaemon/src/OrchestrationProtocol.h#L67) | | @@ -33201,7 +33270,7 @@ | `processLock` | function | SparkEditor | [BuildPipeline.cpp:L916](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L916) | | | `ProcessMayBeRunning` | function | SparkEngine | [CrashArtifactRetention.h:L110](../../SparkEngine/Source/Utils/CrashArtifactRetention.h#L110) | | | `ProcessMessages` | function | SparkEditor | [EditorApplication.h:L126](../../SparkEditor/Source/Core/EditorApplication.h#L126) | | -| `ProcessMouseDelta` | function | SparkEngine | [InputManager.h:L479](../../SparkEngine/Source/Input/InputManager.h#L479) | Apply mouse processing settings | +| `ProcessMouseDelta` | function | SparkEngine | [InputManager.h:L486](../../SparkEngine/Source/Input/InputManager.h#L486) | Apply mouse processing settings | | `ProcessNextJob` | function | SparkEditor | [AdvancedAssetPipeline.h:L464](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L464) | Process next job in queue | | `ProcessNode` | function | GameModules | [RPGDialogueSystem.h:L123](../../GameModules/SparkGameRPG/Source/Dialogue/RPGDialogueSystem.h#L123) | | | `ProcessNode` | function | SparkEngine | [DialogueSystem.h:L317](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L317) | List loaded dialogue trees (console integration). | @@ -33211,7 +33280,7 @@ | `ProcessOutgoing` | function | SparkEngine | [NetworkManager.h:L914](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L914) | | | `ProcessPass` | function | SparkEngine | [PostProcessingPipeline.h:L350](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L350) | | | `ProcessPendingLogEntries` | function | SparkEditor | [ConsolePanel.h:L267](../../SparkEditor/Source/Panels/ConsolePanel.h#L267) | Process pending log entries from logger | -| `ProcessPipeMessages` | function | SparkConsole | [ConsoleApp.h:L85](../../SparkConsole/src/ConsoleApp.h#L85) | | +| `ProcessPipeMessages` | function | SparkConsole | [ConsoleApp.h:L86](../../SparkConsole/src/ConsoleApp.h#L86) | | | `ProcessProcs` | function | SparkEngine | [AbilitySystem.h:L326](../../SparkEngine/Source/Engine/Gameplay/AbilitySystem.h#L326) | | | `ProcessQueue` | function | SparkEngine | [DeferredDeletionQueue.h:L62](../../SparkEngine/Source/Graphics/RHI/DeferredDeletionQueue.h#L62) | Process the queue, deleting resources whose defer period has elapsed. | | `ProcessQueuedMessages` | function | SparkEngine | [ConsoleProcessManager.h:L140](../../SparkEngine/Source/Utils/ConsoleProcessManager.h#L140) | | @@ -33226,7 +33295,7 @@ | `ProcessRunner::RunSync` | method | SparkBuild | [ProcessRunner.cpp:L319](../../SparkBuild/src/ProcessRunner.cpp#L319) | | | `ProcessRunner::RunSync` | method | SparkBuild | [ProcessRunner.cpp:L551](../../SparkBuild/src/ProcessRunner.cpp#L551) | | | `ProcessRunsAsCurrentUser` | function | SparkEngine | [DaemonFraming.h:L85](../../SparkEngine/Source/Utils/DaemonFraming.h#L85) | True only when process @p processId runs as the same user SID as this process. | -| `ProcessSceneShortcuts` | function | SparkEditor | [EditorUI.h:L529](../../SparkEditor/Source/Core/EditorUI.h#L529) | | +| `ProcessSceneShortcuts` | function | SparkEditor | [EditorUI.h:L527](../../SparkEditor/Source/Core/EditorUI.h#L527) | | | `ProcessScratchRoot` | function | Tests | [TestModuleABI.cpp:L142](../../Tests/TestModuleABI.cpp#L142) | This process's scratch root under the system temp directory. | | `ProcessServerMessages` | function | SparkEngine | [DedicatedServer.h:L345](../../SparkEngine/Source/Engine/Networking/DedicatedServer.h#L345) | Process server-specific incoming messages. | | `ProcessStatus` | struct | SparkDaemon | [OrchestrationProtocol.h:L84](../../SparkDaemon/src/OrchestrationProtocol.h#L84) | | @@ -33467,7 +33536,7 @@ | `ProjectPortalToScreen` | function | SparkEngine | [PortalCulling.h:L255](../../SparkEngine/Source/Graphics/PortalCulling.h#L255) | Project a portal polygon to screen space and compute its bounding rect. | | `ProjectProfile` | function | Tests | [TestDocumentInterruptionReal.cpp:L358](../../Tests/TestDocumentInterruptionReal.cpp#L358) | | | `ProjectRoot` | function | SparkEditor | [EditorPluginDiscovery.h:L30](../../SparkEditor/Source/Core/EditorPluginDiscovery.h#L30) | | -| `projectRoot` | function | SparkEngine | [SceneManagerReflected.cpp:L57](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L57) | | +| `projectRoot` | function | SparkEngine | [SceneManagerReflected.cpp:L81](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L81) | | | `projectRoot` | function | Tests | [TestTemplatesCompile.cpp:L165](../../Tests/TestTemplatesCompile.cpp#L165) | | | `projectRoot` | function | Tests | [TestTemplatesCompile.cpp:L218](../../Tests/TestTemplatesCompile.cpp#L218) | | | `projectRoot` | function | Tests | [TestTemplatesCompile.cpp:L254](../../Tests/TestTemplatesCompile.cpp#L254) | | @@ -33486,8 +33555,8 @@ | `projectRoot` | function | Tests | [TestTemplatesCompile.cpp:L931](../../Tests/TestTemplatesCompile.cpp#L931) | | | `projectRoot` | function | Tests | [TestTemplatesCompile.cpp:L976](../../Tests/TestTemplatesCompile.cpp#L976) | | | `projectRoot` | function | Tests | [TestTemplatesCompile.cpp:L1016](../../Tests/TestTemplatesCompile.cpp#L1016) | | -| `projectRootUtf8` | function | GameModules | [Game.cpp:L388](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L388) | | -| `projectRootUtf8` | function | GameModules | [Game.cpp:L415](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L415) | | +| `projectRootUtf8` | function | GameModules | [Game.cpp:L406](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L406) | | +| `projectRootUtf8` | function | GameModules | [Game.cpp:L439](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L439) | | | `ProjectScene` | function | Tests | [TestDocumentInterruptionReal.cpp:L352](../../Tests/TestDocumentInterruptionReal.cpp#L352) | | | `ProjectScene` | function | Tests | [TestDocumentInterruptionReal.cpp:L388](../../Tests/TestDocumentInterruptionReal.cpp#L388) | | | `ProjectScratch` | class | Tests | [TestEditorStateCompatibility.cpp:L98](../../Tests/TestEditorStateCompatibility.cpp#L98) | | @@ -33541,7 +33610,7 @@ | `Prop` | struct | Tests | [TestExtendedSystems.cpp:L562](../../Tests/TestExtendedSystems.cpp#L562) | | | `Propagate` | function | SparkEngine | [ProceduralGenerator.h:L496](../../SparkEngine/Source/Engine/Procedural/ProceduralGenerator.h#L496) | Propagate WFC constraints — remove impossible tiles from a cell | | `properties` | function | SparkEngine | [SceneTextFormat.cpp:L686](../../SparkEngine/Source/SceneManager/SceneTextFormat.cpp#L686) | | -| `Properties` | alias | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L507](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L507) | | +| `Properties` | alias | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L550](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L550) | | | `PropertyChangeCommand` | class | Tests | [TestEditorCommands.cpp:L145](../../Tests/TestEditorCommands.cpp#L145) | | | `PropertyKeyframe` | struct | SparkEngine | [Sequencer.h:L82](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L82) | | | `PropertyOr` | function | SparkEngine | [VisualScriptCodegen.cpp:L305](../../SparkEngine/Source/Engine/Scripting/VisualScriptCodegen.cpp#L305) | | @@ -33644,8 +33713,8 @@ | `Publish` | function | SparkEngine | [SaveFileDurability.cpp:L488](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L488) | | | `Publish` | function | Tests | [TestCrossSystemIntegration.cpp:L140](../../Tests/TestCrossSystemIntegration.cpp#L140) | | | `Publish` | function | Tests | [TestEventSystem.cpp:L45](../../Tests/TestEventSystem.cpp#L45) | | -| `PublishCrashManifest` | function | SparkEngine | [CrashHandler.cpp:L612](../../SparkEngine/Source/Utils/CrashHandler.cpp#L612) | | -| `PublishCrashManifest` | function | SparkEngine | [CrashHandler.cpp:L758](../../SparkEngine/Source/Utils/CrashHandler.cpp#L758) | | +| `PublishCrashManifest` | function | SparkEngine | [CrashHandler.cpp:L613](../../SparkEngine/Source/Utils/CrashHandler.cpp#L613) | | +| `PublishCrashManifest` | function | SparkEngine | [CrashHandler.cpp:L759](../../SparkEngine/Source/Utils/CrashHandler.cpp#L759) | | | `PublishFileAtomically` | function | SparkEngine | [SaveFileDurability.cpp:L510](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L510) | | | `PublishGeneration` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L979](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L979) | | | `PublishHealth` | function | SparkGateway | [GatewayApplication.h:L97](../../SparkGateway/src/GatewayApplication.h#L97) | | @@ -33726,7 +33795,7 @@ | `PutCacheEntry` | function | SparkEngine | [ShaderServiceClient.h:L58](../../SparkEngine/Source/Utils/ShaderServiceClient.h#L58) | Store a compiled shader blob under the given key. | | `PutCacheEntryRequest` | struct | SparkEngine | [ShaderServiceProtocol.h:L69](../../SparkEngine/Source/Utils/ShaderServiceProtocol.h#L69) | | | `PutFloat` | function | GameModules | [MMOSessionGateProtocol.cpp:L87](../../GameModules/SparkGameMMO/Source/Session/MMOSessionGateProtocol.cpp#L87) | | -| `PutLE32` | function | Tests | [TestThirdPartyIntegration.cpp:L57](../../Tests/TestThirdPartyIntegration.cpp#L57) | | +| `PutLE32` | function | Tests | [TestThirdPartyIntegration.cpp:L73](../../Tests/TestThirdPartyIntegration.cpp#L73) | | | `PutSnapshot` | function | GameModules | [MMOSessionGateProtocol.cpp:L137](../../GameModules/SparkGameMMO/Source/Session/MMOSessionGateProtocol.cpp#L137) | | | `PutString` | function | GameModules | [MMOSessionGateProtocol.cpp:L131](../../GameModules/SparkGameMMO/Source/Session/MMOSessionGateProtocol.cpp#L131) | | | `PutString` | function | Tests | [TestSparkTerrainFormatReal.cpp:L34](../../Tests/TestSparkTerrainFormatReal.cpp#L34) | | @@ -33753,13 +33822,13 @@ | `QuantAngle` | function | GameModules | [TFVehicleNet.cpp:L46](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleNet.cpp#L46) | | | `QuantCoord` | function | GameModules | [TFFireFxProtocol.h:L85](../../GameModules/SparkGameMMOFPS/Source/Net/TFFireFxProtocol.h#L85) | | | `QuantHP` | function | GameModules | [TFVehicleNet.cpp:L41](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleNet.cpp#L41) | | -| `QuantHP` | function | GameModules | [TFReplication.cpp:L33](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L33) | | +| `QuantHP` | function | GameModules | [TFReplication.cpp:L35](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L35) | | | `Quantize` | function | Tests | [TestRHI210D3D11WorldGoldenReal.cpp:L163](../../Tests/TestRHI210D3D11WorldGoldenReal.cpp#L163) | | | `QuantizeAxis` | function | SparkEngine | [Quantization.cpp:L34](../../SparkEngine/Source/Utils/Quantization.cpp#L34) | | | `QuantizedQuat` | struct | SparkEngine | [AnimationCompression.h:L27](../../SparkEngine/Source/Engine/Animation/AnimationCompression.h#L27) | Quaternion packed into 48 bits via smallest-three encoding. | | `QuantizedVector` | struct | SparkEngine | [AnimationCompression.h:L33](../../SparkEngine/Source/Engine/Animation/AnimationCompression.h#L33) | 3D vector quantized to 16 bits per component (48 bits total). | | `QuantizeObservedMeters` | function | GameModules | [TFObservation.h:L69](../../GameModules/SparkGameMMOFPS/Source/Game/TFObservation.h#L69) | | -| `QuantizePawn` | function | GameModules | [TFReplication.h:L88](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L88) | | +| `QuantizePawn` | function | GameModules | [TFReplication.h:L93](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L93) | | | `QuantizeQuatComponent` | function | SparkEngine | [Quantization.cpp:L20](../../SparkEngine/Source/Utils/Quantization.cpp#L20) | | | `QuantizeQuaternion` | function | SparkEngine | [AnimationCompression.h:L121](../../SparkEngine/Source/Engine/Animation/AnimationCompression.h#L121) | | | `QuantizeQuaternion` | function | Tests | [TestAnimationCompression.cpp:L70](../../Tests/TestAnimationCompression.cpp#L70) | | @@ -33966,7 +34035,7 @@ | `QuoteMode` | enum | SparkEditor | [EditorProcessLaunchPosixInternal.h:L70](../../SparkEditor/Source/Utils/EditorProcessLaunchPosixInternal.h#L70) | | | `QuoteNativeArgument` | function | SparkBuild | [ProcessRunnerTests.cpp:L86](../../SparkBuild/tests/ProcessRunnerTests.cpp#L86) | | | `QuotePosixArgument` | function | SparkEditor | [EditorProcessLaunchText.h:L117](../../SparkEditor/Source/Utils/EditorProcessLaunchText.h#L117) | | -| `QuoteShellArgument` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L28](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L28) | | +| `QuoteShellArgument` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L30](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L30) | | | `QuoteShellArgument` | function | SparkBuild | [ProcessRunnerTests.cpp:L129](../../SparkBuild/tests/ProcessRunnerTests.cpp#L129) | | | `QuoteShellArgument` | function | SparkBuild | [ProcessRunnerTests.cpp:L149](../../SparkBuild/tests/ProcessRunnerTests.cpp#L149) | | | `QuoteShellArgument` | function | SparkBuild | [ProcessRunnerTests.cpp:L154](../../SparkBuild/tests/ProcessRunnerTests.cpp#L154) | | @@ -34295,7 +34364,7 @@ | `RawReceive` | alias | Tests | [SecureTestPeer.h:L254](../../Tests/Fixtures/SecureTestPeer.h#L254) | | | `RawSend` | alias | Tests | [SecureTestPeer.h:L253](../../Tests/Fixtures/SecureTestPeer.h#L253) | | | `rawTabConnection` | function | Tests | [TestSEC2PersistenceHardening.cpp:L458](../../Tests/TestSEC2PersistenceHardening.cpp#L458) | | -| `RawTocEntry` | struct | Tests | [TestSparkPak.cpp:L817](../../Tests/TestSparkPak.cpp#L817) | | +| `RawTocEntry` | struct | Tests | [TestSparkPak.cpp:L833](../../Tests/TestSparkPak.cpp#L833) | | | `RawUdpClient` | class | Tests | [TestReliableChannel.cpp:L441](../../Tests/TestReliableChannel.cpp#L441) | | | `RawUDPSender` | class | Tests | [TestNetworkStress.cpp:L41](../../Tests/TestNetworkStress.cpp#L41) | | | `ray` | function | SparkEngine | [CollisionSystem.cpp:L581](../../SparkEngine/Source/Physics/CollisionSystem.cpp#L581) | | @@ -34435,6 +34504,7 @@ | `ReadBone` | function | SparkEngine | [AnimationBinaryFormat.cpp:L114](../../SparkEngine/Source/Engine/Animation/AnimationBinaryFormat.cpp#L114) | | | `ReadBool` | function | GameModules | [OWPersistence.inl:L34](../../GameModules/SparkGameOpenWorld/Source/Persistence/OWPersistence.inl#L34) | | | `ReadBool` | function | SparkEditor | [EditorLayoutManager.cpp:L429](../../SparkEditor/Source/Core/EditorLayoutManager.cpp#L429) | | +| `ReadBool` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L41](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L41) | | | `ReadBool` | function | SparkEditor | [SceneComponentCodec.h:L64](../../SparkEditor/Source/SceneSystem/SceneComponentCodec.h#L64) | | | `ReadBool` | function | SparkEngine | [SceneSnapshotSerializer.h:L73](../../SparkEngine/Source/Engine/Editor/SceneSnapshotSerializer.h#L73) | | | `ReadBool` | function | SparkInstaller | [InstallState.cpp:L285](../../SparkInstaller/src/InstallState.cpp#L285) | | @@ -34455,7 +34525,7 @@ | `ReadBytes` | function | SparkInstaller | [InstallerTransactionTests.cpp:L74](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L74) | | | `ReadBytes` | function | Tests | [TestDocumentDurableWrite.cpp:L63](../../Tests/TestDocumentDurableWrite.cpp#L63) | | | `ReadBytes` | function | Tests | [TestEditorStateCompatibility.cpp:L54](../../Tests/TestEditorStateCompatibility.cpp#L54) | | -| `ReadBytes` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L60](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L60) | | +| `ReadBytes` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L61](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L61) | | | `ReadBytes` | function | Tests | [TestNetBuffer.cpp:L137](../../Tests/TestNetBuffer.cpp#L137) | | | `ReadBytes` | function | Tests | [TestPrefabCompatibility.cpp:L55](../../Tests/TestPrefabCompatibility.cpp#L55) | | | `ReadBytes` | function | Tests | [TestPrefabPersistence.cpp:L72](../../Tests/TestPrefabPersistence.cpp#L72) | | @@ -34479,8 +34549,8 @@ | `ReadEditMessage` | function | SparkEditor | [CollaborativeWireCodec.cpp:L129](../../SparkEditor/Source/Communication/CollaborativeWireCodec.cpp#L129) | | | `ReadEditorPeer` | function | SparkEditor | [CollaborativeWireCodec.cpp:L164](../../SparkEditor/Source/Communication/CollaborativeWireCodec.cpp#L164) | | | `ReadEngineInput` | function | SparkConsole | [ConsoleApp.h:L73](../../SparkConsole/src/ConsoleApp.h#L73) | Clear the display console buffer (replaces a `system("cls")`). | -| `ReadEngineInputPosix` | function | SparkConsole | [ConsoleApp.h:L90](../../SparkConsole/src/ConsoleApp.h#L90) | | -| `ReadEngineInputWindows` | function | SparkConsole | [ConsoleApp.h:L88](../../SparkConsole/src/ConsoleApp.h#L88) | | +| `ReadEngineInputPosix` | function | SparkConsole | [ConsoleApp.h:L91](../../SparkConsole/src/ConsoleApp.h#L91) | | +| `ReadEngineInputWindows` | function | SparkConsole | [ConsoleApp.h:L89](../../SparkConsole/src/ConsoleApp.h#L89) | | | `ReadEntityId` | function | SparkEngine | [EventResponseRules.cpp:L234](../../SparkEngine/Source/Engine/Gameplay/EventResponseRules.cpp#L234) | | | `ReadEnum` | function | GameModules | [OWPersistence.inl:L43](../../GameModules/SparkGameOpenWorld/Source/Persistence/OWPersistence.inl#L43) | | | `reader` | function | GameModules | [PlatformerProgress.cpp:L221](../../GameModules/SparkGamePlatformer/Source/Core/PlatformerProgress.cpp#L221) | | @@ -34554,7 +34624,7 @@ | `reader` | function | Tests | [Test_persistence_ReplaySystem.cpp:L57](../../Tests/harden/Test_persistence_ReplaySystem.cpp#L57) | | | `ReadF32` | function | SparkEngine | [TerrainAssetFormat.h:L119](../../SparkEngine/Source/Graphics/TerrainAssetFormat.h#L119) | | | `ReadField` | function | GameModules | [FPSLocalProfile.cpp:L60](../../GameModules/SparkGameFPS/Source/Game/FPSLocalProfile.cpp#L60) | Parse one required field; reports the key that failed. | -| `ReadFile` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L21](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L21) | | +| `ReadFile` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L23](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L23) | | | `ReadFile` | function | SparkEditor | [EditorRecoveryFiles.h:L60](../../SparkEditor/Source/Core/EditorRecoveryFiles.h#L60) | | | `ReadFile` | function | SparkEngine | [SparkPak.h:L141](../../SparkEngine/Source/Core/SparkPak.h#L141) | Read a file's contents as a binary blob. | | `ReadFile` | function | SparkEngine | [ArchiveResourceProvider.h:L50](../../SparkEngine/Source/Engine/Modding/ArchiveResourceProvider.h#L50) | Whether the archive was opened successfully. | @@ -34569,7 +34639,7 @@ | `ReadFile` | function | Tests | [TestDATA120Idempotency.cpp:L70](../../Tests/TestDATA120Idempotency.cpp#L70) | | | `ReadFile` | function | Tests | [TestDATA120PersistenceReal.cpp:L50](../../Tests/TestDATA120PersistenceReal.cpp#L50) | | | `ReadFile` | function | Tests | [TestDATA120SecretsAtRest.cpp:L50](../../Tests/TestDATA120SecretsAtRest.cpp#L50) | | -| `ReadFile` | function | Tests | [TestSparkPak.cpp:L225](../../Tests/TestSparkPak.cpp#L225) | | +| `ReadFile` | function | Tests | [TestSparkPak.cpp:L231](../../Tests/TestSparkPak.cpp#L231) | | | `ReadFile` | function | Tests | [TestTF120Residency.cpp:L51](../../Tests/TestTF120Residency.cpp#L51) | | | `ReadFile` | function | Tests | [TestTF120SharedSaveRoot.cpp:L47](../../Tests/TestTF120SharedSaveRoot.cpp#L47) | | | `ReadFile` | function | Tests | [TestTFScramAuth.cpp:L38](../../Tests/TestTFScramAuth.cpp#L38) | | @@ -34654,6 +34724,7 @@ | `ReadLittleEndian32` | function | Tests | [Test_persistence_SaveSystem.cpp:L202](../../Tests/harden/Test_persistence_SaveSystem.cpp#L202) | | | `ReadLittleEndian32` | function | Tests | [Test_persistence_SaveSystem.cpp:L240](../../Tests/harden/Test_persistence_SaveSystem.cpp#L240) | | | `ReadMagic` | function | SparkEngine | [AnimationBinaryFormat.cpp:L59](../../SparkEngine/Source/Engine/Animation/AnimationBinaryFormat.cpp#L59) | | +| `ReadMaterial` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L222](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L222) | | | `ReadMaterial` | function | Tests | [TestRHI210D3D11SceneGoldenReal.cpp:L128](../../Tests/TestRHI210D3D11SceneGoldenReal.cpp#L128) | | | `ReadMeshBuffers` | function | Tests | [RHI210D3D11GoldenSupport.h:L291](../../Tests/RHI210D3D11GoldenSupport.h#L291) | | | `ReadMetadataOnly` | function | SparkEngine | [SaveSystem.h:L886](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L886) | | @@ -34677,6 +34748,7 @@ | `ReadOwnedFile` | function | SparkEngine | [TelemetrySpoolIO.cpp:L116](../../SparkEngine/Source/Utils/TelemetrySpoolIO.cpp#L116) | | | `ReadOwnedFile` | function | SparkEngine | [TelemetrySpoolInternal.h:L55](../../SparkEngine/Source/Utils/TelemetrySpoolInternal.h#L55) | | | `ReadOwnPeakRssKib` | function | SparkEngine | [SparkEngineLinuxHeadless.cpp:L64](../../SparkEngine/Source/Core/SparkEngineLinuxHeadless.cpp#L64) | This process's own peak resident set in KiB, or 0 when not measurable. | +| `ReadParameter` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L52](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L52) | | | `ReadParameters` | function | SparkEngine | [VisualScriptGraphIO.cpp:L400](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphIO.cpp#L400) | | | `ReadPendingMarker` | function | SparkInstaller | [InstallState.h:L52](../../SparkInstaller/src/InstallState.h#L52) | | | `ReadPin` | function | SparkEngine | [VisualScriptGraphIO.cpp:L186](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphIO.cpp#L186) | | @@ -34687,14 +34759,15 @@ | `ReadPixelRGBA8` | function | Tests | [TestRHI240OpenGLReal.cpp:L44](../../Tests/TestRHI240OpenGLReal.cpp#L44) | | | `ReadPositiveId` | function | GameModules | [TFSocialSystemStore.cpp:L128](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystemStore.cpp#L128) | | | `ReadPrefabFile` | function | SparkEditor | [PrefabAsset.cpp:L34](../../SparkEditor/Source/Prefabs/PrefabAsset.cpp#L34) | | -| `ReadProjectDocumentFields` | function | SparkEditor | [ProjectDocument.cpp:L452](../../SparkEditor/Source/Core/ProjectDocument.cpp#L452) | | +| `ReadPrimary` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L57](../../Tests/TestFPSOwnedSaveDecode.cpp#L57) | | +| `ReadProjectDocumentFields` | function | SparkEditor | [ProjectDocument.cpp:L453](../../SparkEditor/Source/Core/ProjectDocument.cpp#L453) | | | `ReadProjectDocumentFields` | function | SparkEditor | [ProjectDocument.h:L80](../../SparkEditor/Source/Core/ProjectDocument.h#L80) | Extract the project fields from a document CheckProjectDocument accepted. | | `ReadProjectDocumentFields` | function | SparkEditor | [ProjectManager.cpp:L1789](../../SparkEditor/Source/Core/ProjectManager.cpp#L1789) | | | `ReadQuat48` | function | SparkEngine | [NetQuantize.cpp:L18](../../SparkEngine/Source/Engine/Networking/NetQuantize.cpp#L18) | | | `ReadQuat48` | function | SparkEngine | [NetQuantize.h:L34](../../SparkEngine/Source/Engine/Networking/NetQuantize.h#L34) | Read a smallest-three 48-bit quaternion from @p buf (consumes 6 bytes). | | `ReadRaw` | function | Tests | [TestCrossSystemIntegration.cpp:L217](../../Tests/TestCrossSystemIntegration.cpp#L217) | | | `ReadRaw` | function | Tests | [TestReplicationFields.cpp:L100](../../Tests/TestReplicationFields.cpp#L100) | | -| `ReadRecentProjectsDocument` | function | SparkEditor | [ProjectDocument.cpp:L510](../../SparkEditor/Source/Core/ProjectDocument.cpp#L510) | | +| `ReadRecentProjectsDocument` | function | SparkEditor | [ProjectDocument.cpp:L511](../../SparkEditor/Source/Core/ProjectDocument.cpp#L511) | | | `ReadRecentProjectsDocument` | function | SparkEditor | [ProjectDocument.h:L92](../../SparkEditor/Source/Core/ProjectDocument.h#L92) | Extract every entry with a non-empty path from a recent-projects document. | | `ReadRecoveryFile` | function | SparkEditor | [EditorRecoveryFiles.h:L151](../../SparkEditor/Source/Core/EditorRecoveryFiles.h#L151) | | | `ReadReflectedConfig` | function | SparkEngine | [EngineSettings.cpp:L629](../../SparkEngine/Source/Core/EngineSettings.cpp#L629) | | @@ -34753,7 +34826,7 @@ | `ReadTemplateEntry` | function | SparkLauncher | [LauncherTemplates.cpp:L30](../../SparkLauncher/src/LauncherTemplates.cpp#L30) | | | `ReadText` | function | SparkEngine | [LocalFileCache.h:L94](../../SparkEngine/Source/Utils/LocalFileCache.h#L94) | Read a text file, returning cached content on subsequent calls | | `ReadText` | function | SparkInstaller | [PortableGitCacheTests.cpp:L58](../../SparkInstaller/tests/PortableGitCacheTests.cpp#L58) | | -| `ReadText` | function | Tests | [TestEditorCookPackageReal.cpp:L108](../../Tests/TestEditorCookPackageReal.cpp#L108) | | +| `ReadText` | function | Tests | [TestEditorCookPackageReal.cpp:L110](../../Tests/TestEditorCookPackageReal.cpp#L110) | | | `ReadText` | function | Tests | [TestNET100TrustStore.cpp:L58](../../Tests/TestNET100TrustStore.cpp#L58) | | | `ReadText` | function | Tests | [TestRegionMapDataSource.cpp:L39](../../Tests/TestRegionMapDataSource.cpp#L39) | | | `ReadText` | function | Tests | [TestTFSocialStore.cpp:L34](../../Tests/TestTFSocialStore.cpp#L34) | | @@ -34767,6 +34840,7 @@ | `ReadTextFile` | function | Tests | [TestEditorProjectMaterializationReal.cpp:L57](../../Tests/TestEditorProjectMaterializationReal.cpp#L57) | | | `ReadTextFile` | function | Tests | [Test_persistence_SaveSystem.cpp:L107](../../Tests/harden/Test_persistence_SaveSystem.cpp#L107) | | | `ReadTexture` | function | Tests | [TestRHI210D3D11PrimaryGoldenReal.cpp:L78](../../Tests/TestRHI210D3D11PrimaryGoldenReal.cpp#L78) | | +| `ReadTextureSlot` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L146](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L146) | | | `ReadTimestamp` | function | GameModules | [TFSocialSystemStore.cpp:L142](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystemStore.cpp#L142) | | | `ReadTOC` | function | SparkEngine | [SparkPak.h:L157](../../SparkEngine/Source/Core/SparkPak.h#L157) | The file path this archive was opened from. | | `ReadTokenFacts` | function | Tests | [CrashArtifactSandboxProbe.cpp:L77](../../Tests/Fixtures/CrashArtifactSandboxProbe.cpp#L77) | | @@ -34819,6 +34893,7 @@ | `ReadUntilEof` | function | SparkEngine | [ProcessWin32Internal.h:L113](../../SparkEngine/Source/Utils/ProcessWin32Internal.h#L113) | | | `ReadValidatedPrivateFile` | function | SparkGateway | [GatewaySecurity.cpp:L227](../../SparkGateway/src/GatewaySecurity.cpp#L227) | | | `ReadValidatedPrivateFile` | function | SparkGateway | [GatewaySecurity.cpp:L298](../../SparkGateway/src/GatewaySecurity.cpp#L298) | | +| `ReadValues` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L31](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L31) | | | `ReadVec16` | function | SparkEngine | [NetQuantize.cpp:L38](../../SparkEngine/Source/Engine/Networking/NetQuantize.cpp#L38) | | | `ReadVec16` | function | SparkEngine | [NetQuantize.h:L41](../../SparkEngine/Source/Engine/Networking/NetQuantize.h#L41) | Read a 16-bit-per-component bounded position from @p buf (consumes 6 bytes). | | `ReadVector3` | function | SparkEngine | [NetworkManager.h:L291](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L291) | | @@ -34831,10 +34906,11 @@ | `ReadWholeFile` | function | Tests | [TestExecScript.cpp:L40](../../Tests/TestExecScript.cpp#L40) | | | `ReadWholeFile` | function | Tests | [TestSEC4NarrowPathsReal.cpp:L118](../../Tests/TestSEC4NarrowPathsReal.cpp#L118) | | | `ReadWholeFile` | function | Tests | [TestSceneSerializerReal.cpp:L846](../../Tests/TestSceneSerializerReal.cpp#L846) | | +| `ReadWin32InputHostSource` | function | Tests | [TestInputFrameEdgesReal.cpp:L40](../../Tests/TestInputFrameEdgesReal.cpp#L40) | | | `ReadXZList` | function | SparkEditor | [RegionMapEditorIO.cpp:L128](../../SparkEditor/Source/Panels/RegionMapEditorIO.cpp#L128) | | | `Ready` | function | GameModules | [TFSecondaryMotion.h:L76](../../GameModules/SparkGameMMOFPS/Source/Game/TFSecondaryMotion.h#L76) | | | `Ready` | function | SparkEngine | [AssetTypesWindowsMedia.cpp:L144](../../SparkEngine/Source/Graphics/AssetTypesWindowsMedia.cpp#L144) | | -| `ready` | function | SparkEngine | [CrashHandler.cpp:L2377](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2377) | | +| `ready` | function | SparkEngine | [CrashHandler.cpp:L2415](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2415) | | | `Ready` | function | Tests | [RHI210D3D11EngineFixture.h:L215](../../Tests/RHI210D3D11EngineFixture.h#L215) | | | `Ready` | function | Tests | [TestAssetServiceClient.cpp:L85](../../Tests/TestAssetServiceClient.cpp#L85) | | | `Ready` | function | Tests | [TestSceneSaveConfinedReal.cpp:L81](../../Tests/TestSceneSaveConfinedReal.cpp#L81) | | @@ -34998,8 +35074,10 @@ | `RecordingStage` | class | Tests | [TestLifecycleCompositionRootFailure.cpp:L72](../../Tests/TestLifecycleCompositionRootFailure.cpp#L72) | | | `RecordingSystem` | class | Tests | [Test_tests_ecsystemordering_real.cpp:L29](../../Tests/harden/Test_tests_ecsystemordering_real.cpp#L29) | | | `RecordingVerifier` | function | Tests | [TestMMOAuthHardening.cpp:L35](../../Tests/TestMMOAuthHardening.cpp#L35) | | +| `RecordingWeatherService` | class | Tests | [TestFPSWeatherPort.cpp:L30](../../Tests/TestFPSWeatherPort.cpp#L30) | | | `RecordInput` | function | SparkEngine | [ClientPrediction.h:L122](../../SparkEngine/Source/Engine/Networking/ClientPrediction.h#L122) | Record a new input and add to pending buffer. | | `RecordInput` | function | SparkEngine | [SubTickInput.h:L72](../../SparkEngine/Source/Engine/Networking/SubTickInput.h#L72) | Record an input sample into the buffer | +| `RecordInputObservation` | function | GameModules | [Game.h:L650](../../GameModules/SparkGameFPS/Source/Game/Game.h#L650) | Process input and translate to game actions | | `RecordInsertion` | function | SparkEngine | [CacheDebugger.h:L154](../../SparkEngine/Source/Utils/CacheDebugger.h#L154) | | | `RecordKill` | function | GameModules | [GameMechanics.h:L266](../../GameModules/SparkGameFPS/Source/Game/GameMechanics.h#L266) | Register a kill for scoring | | `RecordKill` | function | GameModules | [GameMode.h:L78](../../GameModules/SparkGameFPS/Source/Game/GameMode.h#L78) | | @@ -35116,7 +35194,7 @@ | `ReflAttr_TestStruct` | struct | Tests | [TestReflectionReal.cpp:L35](../../Tests/TestReflectionReal.cpp#L35) | | | `ReflAttrMetadataFixture` | enum | Tests | [TestReflectionReal.cpp:L45](../../Tests/TestReflectionReal.cpp#L45) | | | `ReflectedFixture` | function | Tests | [TestReflectedSceneCompatibility.cpp:L33](../../Tests/TestReflectedSceneCompatibility.cpp#L33) | | -| `ReflectedGameplayFixture` | struct | Tests | [TestSceneManagerReflectedReal.cpp:L13](../../Tests/TestSceneManagerReflectedReal.cpp#L13) | | +| `ReflectedGameplayFixture` | struct | Tests | [TestSceneManagerReflectedReal.cpp:L18](../../Tests/TestSceneManagerReflectedReal.cpp#L18) | | | `ReflectionProbe` | struct | SparkEngine | [ReflectionProbeCache.h:L35](../../SparkEngine/Source/Graphics/ReflectionProbeCache.h#L35) | | | `ReflectionProbeCache` | class | SparkEngine | [ReflectionProbeCache.h:L82](../../SparkEngine/Source/Graphics/ReflectionProbeCache.h#L82) | Manages cached reflection probe cubemaps | | `ReflectionProbeComponent` | struct | SparkEngine | [VolumeComponents.h:L105](../../SparkEngine/Source/Engine/ECS/Components/VolumeComponents.h#L105) | Defines a reflection probe capture point. | @@ -35130,15 +35208,15 @@ | `RefreshAssetIndex` | function | SparkEditor | [SearchPanel.h:L102](../../SparkEditor/Source/Panels/SearchPanel.h#L102) | Walk the asset root once and cache every regular file found. | | `RefreshAssetMetadata` | function | SparkEditor | [AdvancedAssetPipeline.h:L333](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L333) | Refresh asset metadata | | `RefreshAssetMetadata` | function | SparkEngine | [AssetPipeline.h:L481](../../SparkEngine/Source/Graphics/AssetPipeline.h#L481) | | -| `RefreshAssets` | function | SparkEditor | [AssetBrowserPanel.h:L110](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L110) | | +| `RefreshAssets` | function | SparkEditor | [AssetBrowserPanel.h:L120](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L120) | | | `RefreshAuthoredSceneRuntimeState` | function | GameModules | [Game.h:L628](../../GameModules/SparkGameFPS/Source/Game/Game.h#L628) | | | `RefreshBroadcastTargets` | function | GameModules | [TFLanDiscovery.h:L154](../../GameModules/SparkGameMMOFPS/Source/Game/TFLanDiscovery.h#L154) | | | `RefreshCaptureAvailability` | function | SparkEditor | [PerformanceProfiler.h:L382](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L382) | Render performance graph | | `RefreshClassSpeeds` | function | GameModules | [TFClientNet.h:L199](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L199) | | -| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L1047](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1047) | | -| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L1999](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1999) | | -| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L2019](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2019) | | -| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L2858](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2858) | | +| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L1048](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1048) | | +| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L2001](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2001) | | +| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L2021](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2021) | | +| `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.cpp:L2904](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2904) | | | `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandler.h:L148](../../SparkEngine/Source/Utils/CrashHandler.h#L148) | | | `RefreshCrashModuleIdentities` | function | SparkEngine | [CrashHandlerStub.cpp:L36](../../SparkEngine/Source/Utils/CrashHandlerStub.cpp#L36) | | | `RefreshEndpointConfiguration` | function | GameModules | [TFLanDiscovery.h:L155](../../GameModules/SparkGameMMOFPS/Source/Game/TFLanDiscovery.h#L155) | | @@ -35270,7 +35348,7 @@ | `RegisterAgent` | function | SparkEngine | [CollisionAvoidance.h:L123](../../SparkEngine/Source/Engine/AI/CollisionAvoidance.h#L123) | Register an agent for collision avoidance. | | `RegisterAgent` | function | Tests | [TestCollisionAvoidance.cpp:L42](../../Tests/TestCollisionAvoidance.cpp#L42) | | | `RegisterAICommands` | function | SparkEngine | [SubsystemConsoleCommands.cpp:L422](../../SparkEngine/Source/Core/SubsystemConsoleCommands.cpp#L422) | | -| `RegisterAliasCommands` | function | SparkConsole | [ConsoleApp.h:L114](../../SparkConsole/src/ConsoleApp.h#L114) | | +| `RegisterAliasCommands` | function | SparkConsole | [ConsoleApp.h:L115](../../SparkConsole/src/ConsoleApp.h#L115) | | | `RegisterAll` | function | SparkEngine | [EngineBootstrap.h:L122](../../SparkEngine/Source/Core/EngineBootstrap.h#L122) | Register multiple descriptors at once | | `RegisterAnimationCommands` | function | SparkEngine | [SubsystemConsoleCommands.cpp:L469](../../SparkEngine/Source/Core/SubsystemConsoleCommands.cpp#L469) | | | `RegisterAnimationStateMachines` | function | GameModules | [MMOEngineSystems.h:L95](../../GameModules/SparkGameMMO/Source/Core/MMOEngineSystems.h#L95) | | @@ -35392,7 +35470,7 @@ | `RegisterConsoleCommandsHarness` | function | GameModules | [TFCommandsHarness.cpp:L724](../../GameModules/SparkGameMMOFPS/Source/Console/TFCommandsHarness.cpp#L724) | | | `RegisterConsoleCommandsHarness` | function | GameModules | [TFCommandsInternal.h:L59](../../GameModules/SparkGameMMOFPS/Source/Console/TFCommandsInternal.h#L59) | | | `RegisterConsoleCommandsNet` | function | GameModules | [SparkGameMMOFPS.h:L68](../../GameModules/SparkGameMMOFPS/Source/Core/SparkGameMMOFPS.h#L68) | | -| `RegisterCoreCommands` | function | SparkConsole | [ConsoleApp.h:L112](../../SparkConsole/src/ConsoleApp.h#L112) | | +| `RegisterCoreCommands` | function | SparkConsole | [ConsoleApp.h:L113](../../SparkConsole/src/ConsoleApp.h#L113) | | | `RegisterCoreComponentSerializers` | function | SparkEngine | [CoreComponentSerializers.cpp:L335](../../SparkEngine/Source/Engine/Editor/CoreComponentSerializers.cpp#L335) | | | `RegisterCoreComponentSerializers` | function | SparkEngine | [CoreComponentSerializers.h:L21](../../SparkEngine/Source/Engine/Editor/CoreComponentSerializers.h#L21) | Register snapshot serializers for all core ECS component types. | | `RegisterCoreSerializers` | function | SparkEngine | [SaveSystem.cpp:L415](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.cpp#L415) | | @@ -35408,7 +35486,7 @@ | `RegisterDefaultBosses` | function | GameModules | [MMOWorldBossSystem.h:L125](../../GameModules/SparkGameMMO/Source/WorldBoss/MMOWorldBossSystem.h#L125) | | | `RegisterDefaultClasses` | function | GameModules | [MMOCharacterSystem.h:L183](../../GameModules/SparkGameMMO/Source/Character/MMOCharacterSystem.h#L183) | | | `RegisterDefaultClasses` | function | GameModules | [RPGCharacterSystem.h:L138](../../GameModules/SparkGameRPG/Source/Character/RPGCharacterSystem.h#L138) | | -| `RegisterDefaultCommands` | function | SparkConsole | [ConsoleApp.h:L111](../../SparkConsole/src/ConsoleApp.h#L111) | | +| `RegisterDefaultCommands` | function | SparkConsole | [ConsoleApp.h:L112](../../SparkConsole/src/ConsoleApp.h#L112) | | | `RegisterDefaultDungeons` | function | GameModules | [MMODungeonSystem.h:L136](../../GameModules/SparkGameMMO/Source/Dungeon/MMODungeonSystem.h#L136) | | | `RegisterDefaultEditorCommands` | function | SparkEditor | [EditorConsoleBridge.h:L122](../../SparkEditor/Source/Utils/EditorConsoleBridge.h#L122) | | | `RegisterDefaultFactions` | function | GameModules | [MMOReputationSystem.h:L90](../../GameModules/SparkGameMMO/Source/Reputation/MMOReputationSystem.h#L90) | | @@ -35426,7 +35504,7 @@ | `RegisterDefaultTutorials` | function | SparkEditor | [TutorialSystem.h:L387](../../SparkEditor/Source/Core/TutorialSystem.h#L387) | Register the built-in default tutorials. | | `RegisterDefinition` | function | SparkEngine | [RagdollSystem.h:L209](../../SparkEngine/Source/Engine/Animation/RagdollSystem.h#L209) | Register a ragdoll definition. | | `RegisterDestructionCommands` | function | SparkEngine | [SubsystemConsoleCommandsExt.cpp:L311](../../SparkEngine/Source/Core/SubsystemConsoleCommandsExt.cpp#L311) | | -| `RegisterDiagnosticCommands` | function | SparkConsole | [ConsoleApp.h:L113](../../SparkConsole/src/ConsoleApp.h#L113) | | +| `RegisterDiagnosticCommands` | function | SparkConsole | [ConsoleApp.h:L114](../../SparkConsole/src/ConsoleApp.h#L114) | | | `RegisterDiagnosticCommands` | function | SparkEngine | [EngineDiagnostics.cpp:L926](../../SparkEngine/Source/Core/EngineDiagnostics.cpp#L926) | | | `RegisterDiagnosticCommands` | function | SparkEngine | [EngineDiagnostics.h:L92](../../SparkEngine/Source/Core/EngineDiagnostics.h#L92) | Register all diag_ | | `RegisterDialogueCommands` | function | SparkEngine | [SubsystemConsoleCommandsExt.cpp:L329](../../SparkEngine/Source/Core/SubsystemConsoleCommandsExt.cpp#L329) | | @@ -35435,7 +35513,7 @@ | `RegisterDialogueHooks` | function | GameModules | [RPGGameplayBridge.h:L34](../../GameModules/SparkGameRPG/Source/Gameplay/RPGGameplayBridge.h#L34) | | | `RegisterDialogueTrees` | function | GameModules | [MMOEngineSystems.h:L92](../../GameModules/SparkGameMMO/Source/Core/MMOEngineSystems.h#L92) | | | `RegisterDungeon` | function | GameModules | [MMODungeonSystem.h:L113](../../GameModules/SparkGameMMO/Source/Dungeon/MMODungeonSystem.h#L113) | | -| `RegisterEditCommands` | function | SparkEditor | [EditorUI.h:L524](../../SparkEditor/Source/Core/EditorUI.h#L524) | | +| `RegisterEditCommands` | function | SparkEditor | [EditorUI.h:L522](../../SparkEditor/Source/Core/EditorUI.h#L522) | | | `RegisterEditorCommand` | function | SparkEditor | [EditorConsoleBridge.h:L100](../../SparkEditor/Source/Utils/EditorConsoleBridge.h#L100) | Register an editor command on the engine console. | | `RegisteredMusicTrackNames` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L455](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L455) | | | `RegisteredPanel` | function | Tests | [TestEditorStateCompatibility.cpp:L320](../../Tests/TestEditorStateCompatibility.cpp#L320) | | @@ -35529,7 +35607,7 @@ | `RegisterPanel` | function | SparkEditor | [EditorLayoutManager.h:L119](../../SparkEditor/Source/Core/EditorLayoutManager.h#L119) | Register a panel and its default configuration. | | `RegisterPanel` | function | SparkEditor | [EditorPluginManager.h:L206](../../SparkEditor/Source/Core/EditorPluginManager.h#L206) | Register an EditorPanel from a plugin | | `RegisterPanel` | function | Tests | [TestEditorLayoutManager.cpp:L57](../../Tests/TestEditorLayoutManager.cpp#L57) | | -| `RegisterPanelToggleCommands` | function | SparkEditor | [EditorUI.h:L523](../../SparkEditor/Source/Core/EditorUI.h#L523) | | +| `RegisterPanelToggleCommands` | function | SparkEditor | [EditorUI.h:L521](../../SparkEditor/Source/Core/EditorUI.h#L521) | | | `RegisterParticleCommands` | function | SparkEngine | [SubsystemConsoleCommandsExt.cpp:L695](../../SparkEngine/Source/Core/SubsystemConsoleCommandsExt.cpp#L695) | | | `RegisterPass` | function | SparkEngine | [RenderPipeline.h:L136](../../SparkEngine/Source/Graphics/RenderPipeline.h#L136) | Register a custom render pass. | | `RegisterPattern` | function | SparkEngine | [DestructionSystem.h:L222](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L222) | Register a fracture pattern. | @@ -35582,7 +35660,7 @@ | `RegisterSaveSystemCommands` | function | SparkEngine | [SubsystemConsoleCommandsExt.cpp:L722](../../SparkEngine/Source/Core/SubsystemConsoleCommandsExt.cpp#L722) | | | `RegisterScenario` | function | SparkEngine | [BenchmarkFramework.h:L78](../../SparkEngine/Source/Utils/BenchmarkFramework.h#L78) | | | `RegisterScene` | function | SparkEngine | [SceneConfigDatabase.h:L98](../../SparkEngine/Source/SceneManager/SceneConfigDatabase.h#L98) | Register a scene configuration entry. | -| `RegisterSceneCommands` | function | SparkEditor | [EditorUI.h:L525](../../SparkEditor/Source/Core/EditorUI.h#L525) | | +| `RegisterSceneCommands` | function | SparkEditor | [EditorUI.h:L523](../../SparkEditor/Source/Core/EditorUI.h#L523) | | | `RegisterSceneMigrationToV2` | function | Tests | [TestAssetMigration.cpp:L369](../../Tests/TestAssetMigration.cpp#L369) | | | `RegisterSchema` | function | SparkEngine | [PacketValidator.h:L128](../../SparkEngine/Source/Engine/Networking/PacketValidator.h#L128) | | | `RegisterScriptingCommands` | function | SparkEngine | [SubsystemConsoleCommandsExt.cpp:L212](../../SparkEngine/Source/Core/SubsystemConsoleCommandsExt.cpp#L212) | | @@ -35606,7 +35684,7 @@ | `RegisterSubsystemConsoleCommands` | function | SparkEngine | [SubsystemConsoleCommands.cpp:L736](../../SparkEngine/Source/Core/SubsystemConsoleCommands.cpp#L736) | | | `RegisterSubsystemConsoleCommands` | function | SparkEngine | [SubsystemConsoleCommands.h:L22](../../SparkEngine/Source/Core/SubsystemConsoleCommands.h#L22) | Register console commands for all engine subsystems | | `RegisterSurfaceMapping` | function | SparkEngine | [DecalSystem.h:L139](../../SparkEngine/Source/Graphics/DecalSystem.h#L139) | | -| `RegisterSystem` | function | SparkEngine | [EngineContext.h:L358](../../SparkEngine/Source/Core/EngineContext.h#L358) | Register an arbitrary subsystem by type | +| `RegisterSystem` | function | SparkEngine | [EngineContext.h:L361](../../SparkEngine/Source/Core/EngineContext.h#L361) | Register an arbitrary subsystem by type | | `RegisterTable` | function | SparkEngine | [LootAndCraftingSystem.h:L116](../../SparkEngine/Source/Engine/Crafting/LootAndCraftingSystem.h#L116) | Register a loot table by name | | `RegisterTable` | function | SparkEngine | [DataTableSystem.h:L830](../../SparkEngine/Source/Engine/DataTable/DataTableSystem.h#L830) | Register a pre-built table under a name. | | `RegisterTag` | function | SparkEngine | [GameplayTags.h:L194](../../SparkEngine/Source/Engine/Gameplay/GameplayTags.h#L194) | Register a tag by string view. | @@ -35621,7 +35699,7 @@ | `RegisterTheme` | function | SparkEditor | [EditorTheme.h:L227](../../SparkEditor/Source/Core/EditorTheme.h#L227) | Register a new theme | | `RegisterTierConfigs` | function | GameModules | [ARPGDungeonSystem.h:L96](../../GameModules/SparkGameARPG/Source/Dungeon/ARPGDungeonSystem.h#L96) | Re-place the crypt kit after SaveSystem replaced the World's entities. | | `RegisterTimeOfDayCommands` | function | SparkEngine | [EngineConsoleCommands.cpp:L773](../../SparkEngine/Source/Core/EngineConsoleCommands.cpp#L773) | | -| `RegisterToolCommands` | function | SparkEditor | [EditorUI.h:L526](../../SparkEditor/Source/Core/EditorUI.h#L526) | | +| `RegisterToolCommands` | function | SparkEditor | [EditorUI.h:L524](../../SparkEditor/Source/Core/EditorUI.h#L524) | | | `RegisterTrack` | function | SparkEngine | [MusicManager.h:L231](../../SparkEngine/Source/Audio/MusicManager.h#L231) | | | `RegisterTree` | function | GameModules | [RPGDialogueSystem.h:L102](../../GameModules/SparkGameRPG/Source/Dialogue/RPGDialogueSystem.h#L102) | | | `RegisterTree` | function | SparkEngine | [DialogueSystem.h:L215](../../SparkEngine/Source/Engine/Dialogue/DialogueSystem.h#L215) | Register a dialogue tree directly. | @@ -35710,20 +35788,21 @@ | `Reject` | function | SparkEngine | [ReflectedSceneValidation.cpp:L280](../../SparkEngine/Source/SceneManager/ReflectedSceneValidation.cpp#L280) | | | `Reject` | function | SparkEngine | [ReflectedSceneValidation.cpp:L293](../../SparkEngine/Source/SceneManager/ReflectedSceneValidation.cpp#L293) | | | `Reject` | function | SparkEngine | [ReflectedSceneValidation.h:L28](../../SparkEngine/Source/SceneManager/ReflectedSceneValidation.h#L28) | Store @p message in @p error (when non-null) and return false. | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L26](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L26) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L29](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L29) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L34](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L34) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L41](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L41) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L49](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L49) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L69](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L69) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L71](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L71) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L73](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L73) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L83](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L83) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L88](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L88) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L99](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L99) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L111](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L111) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L124](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L124) | | -| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L134](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L134) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L39](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L39) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L44](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L44) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L51](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L51) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L60](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L60) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L70](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L70) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L97](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L97) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L101](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L101) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L107](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L107) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L119](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L119) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L126](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L126) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L140](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L140) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L162](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L162) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L173](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L173) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L188](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L188) | | +| `reject` | function | SparkEngine | [SceneManagerReflected.cpp:L200](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L200) | | | `RejectArchive` | function | SparkBuild | [Downloader.cpp:L444](../../SparkBuild/src/Downloader.cpp#L444) | | | `RejectArchive` | function | SparkBuild | [Downloader.cpp:L516](../../SparkBuild/src/Downloader.cpp#L516) | | | `RejectArchive` | function | SparkBuild | [Downloader.cpp:L519](../../SparkBuild/src/Downloader.cpp#L519) | | @@ -35739,13 +35818,14 @@ | `RejectIfOpen` | function | SparkEngine | [OnlineServices.h:L887](../../SparkEngine/Source/Engine/OnlineServices/OnlineServices.h#L887) | | | `RejectPendingConnect` | function | SparkEngine | [NetworkManager.h:L928](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L928) | | | `RejectRemoteAdministrationKeys` | function | SparkServer | [ServerApplication.cpp:L129](../../SparkServer/src/ServerApplication.cpp#L129) | | -| `relative` | function | GameModules | [FPSAssetPaths.cpp:L155](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L155) | | -| `relative` | function | GameModules | [GameConsoleOps.cpp:L572](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L572) | | +| `relative` | function | GameModules | [FPSAssetPaths.cpp:L169](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L169) | | +| `relative` | function | GameModules | [GameConsoleOps.cpp:L580](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L580) | | | `relative` | function | SparkEngine | [OBJStaticMeshLoader.cpp:L151](../../SparkEngine/Source/Graphics/OBJStaticMeshLoader.cpp#L151) | | | `relative` | function | Tests | [TestGameModuleMMO.cpp:L84](../../Tests/TestGameModuleMMO.cpp#L84) | | | `relativeBytes` | function | Tests | [TestLegacyGameObjectMaterial.cpp:L146](../../Tests/TestLegacyGameObjectMaterial.cpp#L146) | | | `RelativeFiles` | function | Tests | [TestGamePackager.cpp:L228](../../Tests/TestGamePackager.cpp#L228) | | -| `relativeU8` | function | GameModules | [FPSAssetPaths.cpp:L205](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L205) | | +| `relativeRoot` | function | Tests | [TestLegacyGameObjectMaterial.cpp:L141](../../Tests/TestLegacyGameObjectMaterial.cpp#L141) | | +| `relativeU8` | function | GameModules | [FPSAssetPaths.cpp:L223](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L223) | | | `relativeUtf8` | function | Tests | [assets.cpp:L39](../../Tests/PackageSmoke/FPSProgression/assets.cpp#L39) | | | `Release` | function | GameModules | [TFCrypto.cpp:L55](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.cpp#L55) | | | `Release` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L860](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L860) | | @@ -35851,6 +35931,7 @@ | `remap` | function | SparkEngine | [LODGenerator.cpp:L396](../../SparkEngine/Source/Graphics/LODGenerator.cpp#L396) | | | `remap` | function | SparkEngine | [MeshOptimizer.h:L259](../../SparkEngine/Source/Graphics/MeshOptimizer.h#L259) | | | `remap` | function | SparkEngine | [SceneTextFormat.cpp:L621](../../SparkEngine/Source/SceneManager/SceneTextFormat.cpp#L621) | | +| `Remember` | function | GameModules | [TFReplicationRefresh.h:L35](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L35) | | | `Remember` | function | SparkEngine | [PerceptionSystem.h:L113](../../SparkEngine/Source/Engine/AI/PerceptionSystem.h#L113) | | | `Remember` | function | Tests | [TestDocumentInterruptionReal.cpp:L187](../../Tests/TestDocumentInterruptionReal.cpp#L187) | | | `Remember` | function | Tests | [TestPerceptionSystemMath.cpp:L88](../../Tests/TestPerceptionSystemMath.cpp#L88) | | @@ -35876,7 +35957,7 @@ | `RemoteDebugServer` | class | SparkEngine | [RemoteDebugSystem.h:L251](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugSystem.h#L251) | Owns logical server state and dispatches authenticated incoming commands. | | `RemoteDebugSystem` | class | SparkEngine | [RemoteDebugSystem.h:L668](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugSystem.h#L668) | Top-level singleton owning both server and client instances. | | `RemoteFireHeat` | function | GameModules | [TFWeaponSystem.h:L93](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L93) | | -| `RemotePawn` | struct | GameModules | [TFReplication.h:L41](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L41) | | +| `RemotePawn` | struct | GameModules | [TFReplication.h:L43](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L43) | | | `RemoteSession` | class | SparkEngine | [RemoteDebugSystem.h:L67](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugSystem.h#L67) | Mutable state of a single remote debug connection (thread-safe queues). | | `Remove` | function | GameModules | [TFSquadSystemInternal.h:L26](../../GameModules/SparkGameMMOFPS/Source/Game/TFSquadSystemInternal.h#L26) | | | `Remove` | function | SparkEngine | [BehaviorTreeTypes.h:L150](../../SparkEngine/Source/Engine/AI/BehaviorTreeTypes.h#L150) | Remove a key and its associated value. | @@ -35895,7 +35976,7 @@ | `RemoveAsset` | function | SparkEditor | [AssetAuditGraph.h:L188](../../SparkEditor/Source/Panels/AssetAuditGraph.h#L188) | Remove an asset and all its edges | | `RemoveAsset` | function | SparkEngine | [AssetPipeline.h:L344](../../SparkEngine/Source/Graphics/AssetPipeline.h#L344) | | | `RemoveAsset` | function | Tests | [TestAssetPipelineCache.cpp:L120](../../Tests/TestAssetPipelineCache.cpp#L120) | | -| `RemoveAssetSecDir` | function | Tests | [TestAssetParserHardening.cpp:L60](../../Tests/TestAssetParserHardening.cpp#L60) | | +| `RemoveAssetSecDir` | function | Tests | [TestAssetParserHardening.cpp:L76](../../Tests/TestAssetParserHardening.cpp#L76) | | | `RemoveAura` | function | SparkEngine | [AbilitySystem.h:L307](../../SparkEngine/Source/Engine/Gameplay/AbilitySystem.h#L307) | | | `RemoveAura` | function | Tests | [TestAbilitySystem.cpp:L186](../../Tests/TestAbilitySystem.cpp#L186) | | | `RemoveBinding` | function | SparkEngine | [InputBindings.h:L141](../../SparkEngine/Source/Input/InputBindings.h#L141) | Remove a binding for an action. | @@ -35951,7 +36032,7 @@ | `RemoveEntity` | function | Tests | [TestSpatialGrid.cpp:L75](../../Tests/TestSpatialGrid.cpp#L75) | | | `RemoveEntry` | function | SparkEngine | [LocalFileCache.h:L400](../../SparkEngine/Source/Utils/LocalFileCache.h#L400) | | | `RemoveFileNoThrow` | function | SparkEngine | [ReflectedScenePersistence.cpp:L191](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L191) | | -| `RemoveFileNoThrow` | function | SparkEngine | [SceneManager.cpp:L187](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L187) | | +| `RemoveFileNoThrow` | function | SparkEngine | [SceneManager.cpp:L201](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L201) | | | `RemoveFn` | alias | SparkEngine | [Reflection.h:L296](../../SparkEngine/Source/Core/Reflection.h#L296) | | | `RemoveFromFormation` | function | SparkEngine | [FormationSystem.h:L169](../../SparkEngine/Source/Engine/AI/FormationSystem.h#L169) | Remove an entity from a formation. | | `RemoveFromLayer` | function | SparkEngine | [CollisionMaskComponents.h:L65](../../SparkEngine/Source/Engine/ECS/Components/CollisionMaskComponents.h#L65) | Remove layers from the FROM mask | @@ -35990,7 +36071,7 @@ | `RemoveModuleFiles` | function | Tests | [TestModuleVersion.cpp:L126](../../Tests/TestModuleVersion.cpp#L126) | | | `RemoveNavMesh` | function | SparkEngine | [NavMesh.h:L473](../../SparkEngine/Source/Engine/AI/NavMesh.h#L473) | Unregister and free a single NavMesh by name. | | `RemoveNavMesh` | function | Tests | [TestNavMesh.cpp:L458](../../Tests/TestNavMesh.cpp#L458) | | -| `RemoveNode` | function | SparkEngine | [SceneManager.h:L260](../../SparkEngine/Source/SceneManager/SceneManager.h#L260) | | +| `RemoveNode` | function | SparkEngine | [SceneManager.h:L262](../../SparkEngine/Source/SceneManager/SceneManager.h#L262) | | | `RemoveNode` | function | Tests | [TestSceneManager.cpp:L66](../../Tests/TestSceneManager.cpp#L66) | | | `RemoveNodeCommand` | class | SparkEditor | [VisualScriptPanel.h:L48](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L48) | Undo command for removing a node from the visual script graph | | `RemoveNodeCommand::Execute` | method | SparkEditor | [VisualScriptPanel.cpp:L1592](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L1592) | | @@ -36079,7 +36160,7 @@ | `RenameNoReplace` | function | SparkBuild | [ArchiveExtraction.cpp:L107](../../SparkBuild/src/ArchiveExtraction.cpp#L107) | | | `RenameObject` | function | SparkEditor | [HierarchyPanel.h:L348](../../SparkEditor/Source/Panels/HierarchyPanel.h#L348) | Rename object | | `RenameSlot` | function | SparkEditor | [SaveSystemPanel.h:L61](../../SparkEditor/Source/Panels/SaveSystemPanel.h#L61) | Rename a save file on disk; returns false if the target exists or I/O fails. | -| `renameStorage` | function | SparkEngine | [CrashHandler.cpp:L639](../../SparkEngine/Source/Utils/CrashHandler.cpp#L639) | | +| `renameStorage` | function | SparkEngine | [CrashHandler.cpp:L640](../../SparkEngine/Source/Utils/CrashHandler.cpp#L640) | | | `RenameWorldEntity` | function | SparkEditor | [HierarchyPanel.h:L239](../../SparkEditor/Source/Panels/HierarchyPanel.h#L239) | Apply an undoable rename to a World entity's NameComponent. | | `Render` | function | GameModules | [Enemy.h:L75](../../GameModules/SparkGameFPS/Source/Game/Enemy.h#L75) | | | `Render` | function | GameModules | [Game.h:L151](../../GameModules/SparkGameFPS/Source/Game/Game.h#L151) | Render the current frame using unified graphics system | @@ -36109,7 +36190,7 @@ | `Render` | function | SparkEditor | [AIDebugPanel.h:L38](../../SparkEditor/Source/Panels/AIDebugPanel.h#L38) | | | `Render` | function | SparkEditor | [AIEditorPanel.h:L30](../../SparkEditor/Source/Panels/AIEditorPanel.h#L30) | | | `Render` | function | SparkEditor | [AbilityEditorPanel.h:L31](../../SparkEditor/Source/Panels/AbilityEditorPanel.h#L31) | | -| `Render` | function | SparkEditor | [AssetBrowserPanel.h:L54](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L54) | Render asset browser panel | +| `Render` | function | SparkEditor | [AssetBrowserPanel.h:L55](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L55) | Render asset browser panel | | `Render` | function | SparkEditor | [AudioMixerPanel.h:L30](../../SparkEditor/Source/Panels/AudioMixerPanel.h#L30) | | | `Render` | function | SparkEditor | [BasicMaterialEditorPanel.h:L49](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L49) | | | `Render` | function | SparkEditor | [BuildCookPanel.h:L111](../../SparkEditor/Source/Panels/BuildCookPanel.h#L111) | | @@ -36226,8 +36307,8 @@ | `RenderAppearanceSettings` | function | SparkEditor | [ParticleEditorPanel.h:L40](../../SparkEditor/Source/Panels/ParticleEditorPanel.h#L40) | | | `RenderAreaList` | function | SparkEditor | [StreamingPanel.h:L60](../../SparkEditor/Source/Panels/StreamingPanel.h#L60) | | | `RenderAssetCooking` | function | SparkEditor | [BuildCookPanel.h:L122](../../SparkEditor/Source/Panels/BuildCookPanel.h#L122) | | -| `RenderAssetDetails` | function | SparkEditor | [AssetBrowserPanel.h:L109](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L109) | | -| `RenderAssetGrid` | function | SparkEditor | [AssetBrowserPanel.h:L108](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L108) | | +| `RenderAssetDetails` | function | SparkEditor | [AssetBrowserPanel.h:L119](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L119) | | +| `RenderAssetGrid` | function | SparkEditor | [AssetBrowserPanel.h:L118](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L118) | | | `RenderAssetInspector` | function | SparkEditor | [AdvancedAssetPipeline.h:L433](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L433) | Render asset inspector | | `RenderAssetList` | function | SparkEditor | [AdvancedAssetPipeline.h:L418](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L418) | Render asset list | | `RenderAudioDebug` | function | SparkEditor | [DebugVisualizerPanel.h:L55](../../SparkEditor/Source/Panels/DebugVisualizerPanel.h#L55) | | @@ -36263,7 +36344,7 @@ | `RenderBuildActions` | function | SparkEditor | [BuildCookPanel.h:L124](../../SparkEditor/Source/Panels/BuildCookPanel.h#L124) | | | `RenderBuildControls` | function | SparkEditor | [CSGEditorPanel.h:L174](../../SparkEditor/Source/Panels/CSGEditorPanel.h#L174) | Default operation used by the ImGui "Create" button. | | `RenderBuildLog` | function | SparkEditor | [BuildCookPanel.h:L125](../../SparkEditor/Source/Panels/BuildCookPanel.h#L125) | | -| `RenderBuildMenu` | function | SparkEditor | [EditorUI.h:L492](../../SparkEditor/Source/Core/EditorUI.h#L492) | | +| `RenderBuildMenu` | function | SparkEditor | [EditorUI.h:L490](../../SparkEditor/Source/Core/EditorUI.h#L490) | | | `RenderBuildOptions` | function | SparkEditor | [BuildCookPanel.h:L120](../../SparkEditor/Source/Panels/BuildCookPanel.h#L120) | | | `RenderCallStack` | function | SparkEditor | [ScriptDebugPanel.h:L98](../../SparkEditor/Source/Panels/ScriptDebugPanel.h#L98) | | | `RenderCamera2DComponent` | function | SparkEditor | [InspectorPanel.h:L104](../../SparkEditor/Source/Panels/InspectorPanel.h#L104) | | @@ -36381,7 +36462,7 @@ | `RenderDebugUI` | function | GameModules | [TFVehicleTerminal.h:L45](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleTerminal.h#L45) | | | `RenderDebugUI` | function | GameModules | [TFWeaponSystem.h:L50](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L50) | | | `RenderDebugUI` | function | GameModules | [TFClientNet.h:L80](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L80) | | -| `RenderDebugUI` | function | GameModules | [TFReplication.h:L63](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L63) | | +| `RenderDebugUI` | function | GameModules | [TFReplication.h:L67](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L67) | | | `RenderDebugUI` | function | GameModules | [TFServerSim.h:L64](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L64) | | | `RenderDebugUI` | function | GameModules | [TFChatWindow.h:L49](../../GameModules/SparkGameMMOFPS/Source/UI/TFChatWindow.h#L49) | | | `RenderDebugUI` | function | GameModules | [TFDeathRecap.h:L70](../../GameModules/SparkGameMMOFPS/Source/UI/TFDeathRecap.h#L70) | | @@ -36458,7 +36539,7 @@ | `RenderDeviceStatus` | function | SparkEditor | [VRConfigPanel.h:L32](../../SparkEditor/Source/Panels/VRConfigPanel.h#L32) | | | `RenderDPSChart` | function | SparkEditor | [WeaponEditorPanel.h:L61](../../SparkEditor/Source/Panels/WeaponEditorPanel.h#L61) | The current (possibly edited) weapon table. | | `RenderEditLog` | function | SparkEditor | [CollaborationPanel.h:L37](../../SparkEditor/Source/Panels/CollaborationPanel.h#L37) | | -| `RenderEditMenu` | function | SparkEditor | [EditorUI.h:L482](../../SparkEditor/Source/Core/EditorUI.h#L482) | | +| `RenderEditMenu` | function | SparkEditor | [EditorUI.h:L480](../../SparkEditor/Source/Core/EditorUI.h#L480) | | | `RenderEditorTab` | function | SparkEditor | [ProjectSettingsPanel.h:L47](../../SparkEditor/Source/Panels/ProjectSettingsPanel.h#L47) | | | `RenderEmissionSettings` | function | SparkEditor | [ParticleEditorPanel.h:L38](../../SparkEditor/Source/Panels/ParticleEditorPanel.h#L38) | | | `RenderEmptyContextMenu` | function | SparkEditor | [HierarchyPanel.h:L292](../../SparkEditor/Source/Panels/HierarchyPanel.h#L292) | Render empty space context menu | @@ -36470,22 +36551,22 @@ | `RenderEventLog` | function | SparkEditor | [EventMonitorPanel.h:L56](../../SparkEditor/Source/Panels/EventMonitorPanel.h#L56) | | | `RenderEventLog` | function | SparkEditor | [StreamingPanel.h:L64](../../SparkEditor/Source/Panels/StreamingPanel.h#L64) | | | `RenderFileList` | function | SparkEditor | [SceneImportPanel.h:L111](../../SparkEditor/Source/Panels/SceneImportPanel.h#L111) | Execute the import of @p parsed into the current World as ONE | -| `RenderFileMenu` | function | SparkEditor | [EditorUI.h:L479](../../SparkEditor/Source/Core/EditorUI.h#L479) | Re-point the panels that cache a raw ::World | -| `RenderFileProjectItems` | function | SparkEditor | [EditorUI.h:L481](../../SparkEditor/Source/Core/EditorUI.h#L481) | | -| `RenderFileSceneItems` | function | SparkEditor | [EditorUI.h:L480](../../SparkEditor/Source/Core/EditorUI.h#L480) | | +| `RenderFileMenu` | function | SparkEditor | [EditorUI.h:L477](../../SparkEditor/Source/Core/EditorUI.h#L477) | Wire document-backed panels to the current World and EditorUI. | +| `RenderFileProjectItems` | function | SparkEditor | [EditorUI.h:L479](../../SparkEditor/Source/Core/EditorUI.h#L479) | Wire document-backed panels to the current World and EditorUI. | +| `RenderFileSceneItems` | function | SparkEditor | [EditorUI.h:L478](../../SparkEditor/Source/Core/EditorUI.h#L478) | Wire document-backed panels to the current World and EditorUI. | | `RenderFilterBar` | function | SparkEditor | [CoroutineDebugPanel.h:L52](../../SparkEditor/Source/Panels/CoroutineDebugPanel.h#L52) | | | `RenderFilterButtons` | function | SparkEditor | [SearchPanel.h:L131](../../SparkEditor/Source/Panels/SearchPanel.h#L131) | | | `RenderFilterControls` | function | SparkEditor | [ConsolePanel.h:L200](../../SparkEditor/Source/Panels/ConsolePanel.h#L200) | Render filter controls | | `RenderFlashOverlay` | function | GameModules | [TFGrenadeSystem.h:L155](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L155) | | | `RenderFloatParam` | function | SparkEditor | [MaterialEditorPanel.h:L214](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L214) | Check if the material has unsaved changes. | | `RenderFogVolumeComponent` | function | SparkEditor | [InspectorPanel.h:L135](../../SparkEditor/Source/Panels/InspectorPanel.h#L135) | | -| `RenderFolderNode` | function | SparkEditor | [AssetBrowserPanel.h:L107](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L107) | | -| `RenderFolderTree` | function | SparkEditor | [AssetBrowserPanel.h:L106](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L106) | | +| `RenderFolderNode` | function | SparkEditor | [AssetBrowserPanel.h:L117](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L117) | | +| `RenderFolderTree` | function | SparkEditor | [AssetBrowserPanel.h:L116](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L116) | | | `RenderFoliagePass` | function | SparkEngine | [FoliageRenderer.h:L439](../../SparkEngine/Source/Graphics/FoliageRenderer.h#L439) | | | `RenderForward` | function | SparkEngine | [GraphicsEngine.h:L1321](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L1321) | | | `RenderForwardPlus` | function | SparkEngine | [GraphicsEngine.h:L1324](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L1324) | | | `RenderFPSHUD` | function | SparkEditor | [GameViewPanel.h:L93](../../SparkEditor/Source/Panels/GameViewPanel.h#L93) | | -| `RenderFPSToolsMenu` | function | SparkEditor | [EditorUI.h:L491](../../SparkEditor/Source/Core/EditorUI.h#L491) | | +| `RenderFPSToolsMenu` | function | SparkEditor | [EditorUI.h:L489](../../SparkEditor/Source/Core/EditorUI.h#L489) | | | `RenderFrame` | function | Tests | [TestRHI210D3D11FrameGoldenReal.cpp:L117](../../Tests/TestRHI210D3D11FrameGoldenReal.cpp#L117) | | | `RenderFrame` | function | Tests | [TestRHI225D3D12ValidationReal.cpp:L235](../../Tests/TestRHI225D3D12ValidationReal.cpp#L235) | | | `RenderFrameProperties` | function | SparkEditor | [SpriteAnimationEditorPanel.h:L50](../../SparkEditor/Source/Panels/SpriteAnimationEditorPanel.h#L50) | | @@ -36504,11 +36585,11 @@ | `RenderFullscreen` | function | Tests | [TestRHI230VulkanValidationReal.cpp:L650](../../Tests/TestRHI230VulkanValidationReal.cpp#L650) | | | `RenderGameContent` | function | SparkEditor | [GameViewPanel.h:L92](../../SparkEditor/Source/Panels/GameViewPanel.h#L92) | | | `RenderGameModeConfig` | function | SparkEditor | [FPSToolsPanel.h:L31](../../SparkEditor/Source/Panels/FPSToolsPanel.h#L31) | | -| `RenderGameObject2DSubMenu` | function | SparkEditor | [EditorUI.h:L485](../../SparkEditor/Source/Core/EditorUI.h#L485) | | -| `RenderGameObject3DSubMenu` | function | SparkEditor | [EditorUI.h:L484](../../SparkEditor/Source/Core/EditorUI.h#L484) | | -| `RenderGameObjectMenu` | function | SparkEditor | [EditorUI.h:L483](../../SparkEditor/Source/Core/EditorUI.h#L483) | | -| `RenderGameObjectSpecializedSubMenus` | function | SparkEditor | [EditorUI.h:L487](../../SparkEditor/Source/Core/EditorUI.h#L487) | | -| `RenderGameObjectVolumeSubMenu` | function | SparkEditor | [EditorUI.h:L486](../../SparkEditor/Source/Core/EditorUI.h#L486) | | +| `RenderGameObject2DSubMenu` | function | SparkEditor | [EditorUI.h:L483](../../SparkEditor/Source/Core/EditorUI.h#L483) | | +| `RenderGameObject3DSubMenu` | function | SparkEditor | [EditorUI.h:L482](../../SparkEditor/Source/Core/EditorUI.h#L482) | | +| `RenderGameObjectMenu` | function | SparkEditor | [EditorUI.h:L481](../../SparkEditor/Source/Core/EditorUI.h#L481) | | +| `RenderGameObjectSpecializedSubMenus` | function | SparkEditor | [EditorUI.h:L485](../../SparkEditor/Source/Core/EditorUI.h#L485) | | +| `RenderGameObjectVolumeSubMenu` | function | SparkEditor | [EditorUI.h:L484](../../SparkEditor/Source/Core/EditorUI.h#L484) | | | `RenderGameplayTab` | function | SparkEditor | [ProjectSettingsPanel.h:L42](../../SparkEditor/Source/Panels/ProjectSettingsPanel.h#L42) | | | `RenderGenerationTools` | function | SparkEditor | [TerrainEditor.h:L95](../../SparkEditor/Source/Terrain/TerrainEditor.h#L95) | | | `RenderGPU` | function | SparkEngine | [SkyAtmosphere.h:L174](../../SparkEngine/Source/Graphics/SkyAtmosphere.h#L174) | | @@ -36545,7 +36626,7 @@ | `RenderHealthArmorBars` | function | SparkEditor | [GameViewPanel.h:L97](../../SparkEditor/Source/Panels/GameViewPanel.h#L97) | | | `RenderHealthComponent` | function | SparkEditor | [InspectorPanel.h:L118](../../SparkEditor/Source/Panels/InspectorPanel.h#L118) | | | `RenderHeightmapTools` | function | SparkEditor | [TerrainEditor.h:L89](../../SparkEditor/Source/Terrain/TerrainEditor.h#L89) | | -| `RenderHelpMenu` | function | SparkEditor | [EditorUI.h:L493](../../SparkEditor/Source/Core/EditorUI.h#L493) | | +| `RenderHelpMenu` | function | SparkEditor | [EditorUI.h:L491](../../SparkEditor/Source/Core/EditorUI.h#L491) | | | `RenderHierarchyTree` | function | SparkEditor | [HierarchyPanel.h:L228](../../SparkEditor/Source/Panels/HierarchyPanel.h#L228) | Render the main hierarchy tree | | `RenderHistoryList` | function | SparkEditor | [UndoHistoryPanel.h:L45](../../SparkEditor/Source/Panels/UndoHistoryPanel.h#L45) | | | `RenderHistoryPanel` | function | SparkEditor | [VersionControlSystem.h:L357](../../SparkEditor/Source/VersionControl/VersionControlSystem.h#L357) | Render history panel | @@ -36586,7 +36667,7 @@ | `RenderLoginScreen` | function | GameModules | [TFLoginFlow.h:L136](../../GameModules/SparkGameMMOFPS/Source/UI/TFLoginFlow.h#L136) | | | `RenderLogOutput` | function | SparkEditor | [WorkflowPanel.h:L42](../../SparkEditor/Source/Panels/WorkflowPanel.h#L42) | Set the EditorUI pointer for workflow context access. | | `RenderLowHealthVignette` | function | SparkEditor | [GameViewPanel.h:L106](../../SparkEditor/Source/Panels/GameViewPanel.h#L106) | | -| `RenderMainMenuBar` | function | SparkEditor | [EditorUI.h:L478](../../SparkEditor/Source/Core/EditorUI.h#L478) | Re-point the panels that cache a raw ::World | +| `RenderMainMenuBar` | function | SparkEditor | [EditorUI.h:L476](../../SparkEditor/Source/Core/EditorUI.h#L476) | Wire document-backed panels to the current World and EditorUI. | | `RenderManifestControls` | function | SparkEditor | [GameModuleSelectorPanel.h:L57](../../SparkEditor/Source/Panels/GameModuleSelectorPanel.h#L57) | | | `RenderMapCanvas` | function | SparkEditor | [TilemapEditorPanel.h:L60](../../SparkEditor/Source/Panels/TilemapEditorPanel.h#L60) | | | `RenderMapProperties` | function | SparkEditor | [TilemapEditorPanel.h:L61](../../SparkEditor/Source/Panels/TilemapEditorPanel.h#L61) | | @@ -36608,7 +36689,7 @@ | `RenderMinimap` | function | SparkEditor | [GameViewPanel.h:L99](../../SparkEditor/Source/Panels/GameViewPanel.h#L99) | | | `RenderMixBuses` | function | SparkEditor | [AudioMixerPanel.h:L67](../../SparkEditor/Source/Panels/AudioMixerPanel.h#L67) | | | `RenderModal` | function | SparkEditor | [ProjectBrowserPanel.h:L73](../../SparkEditor/Source/Panels/ProjectBrowserPanel.h#L73) | | -| `RenderModalDialogs` | function | SparkEditor | [EditorUI.h:L503](../../SparkEditor/Source/Core/EditorUI.h#L503) | | +| `RenderModalDialogs` | function | SparkEditor | [EditorUI.h:L501](../../SparkEditor/Source/Core/EditorUI.h#L501) | | | `RenderModDetails` | function | SparkEditor | [ModdingPanel.h:L55](../../SparkEditor/Source/Panels/ModdingPanel.h#L55) | Re-read the mod list from the ModSystem into m_mods. | | `RenderModdingLocalizationTab` | function | SparkEditor | [ProjectSettingsPanel.h:L52](../../SparkEditor/Source/Panels/ProjectSettingsPanel.h#L52) | | | `RenderMode` | enum | SparkEditor | [SceneViewPanel.h:L226](../../SparkEditor/Source/Panels/SceneViewPanel.h#L226) | | @@ -36649,7 +36730,7 @@ | `RenderPackagingOptions` | function | SparkEditor | [BuildCookPanel.h:L123](../../SparkEditor/Source/Panels/BuildCookPanel.h#L123) | | | `RenderPacketLog` | function | SparkEditor | [NetworkDebugPanel.h:L388](../../SparkEditor/Source/Panels/NetworkDebugPanel.h#L388) | | | `RenderPacketLog` | function | SparkEditor | [NetworkDebugPanel.h:L482](../../SparkEditor/Source/Panels/NetworkDebugPanel.h#L482) | | -| `RenderPanels` | function | SparkEditor | [EditorUI.h:L502](../../SparkEditor/Source/Core/EditorUI.h#L502) | | +| `RenderPanels` | function | SparkEditor | [EditorUI.h:L500](../../SparkEditor/Source/Core/EditorUI.h#L500) | | | `RenderParallaxBGComponent` | function | SparkEditor | [InspectorPanel.h:L107](../../SparkEditor/Source/Panels/InspectorPanel.h#L107) | | | `RenderParameterEditor` | function | SparkEditor | [MaterialEditorPanel.h:L212](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L212) | Check if the material has unsaved changes. | | `RenderParameterGroup` | function | SparkEditor | [MaterialEditorPanel.h:L213](../../SparkEditor/Source/Panels/MaterialEditorPanel.h#L213) | Check if the material has unsaved changes. | @@ -36817,7 +36898,7 @@ | `RenderStats` | function | SparkEditor | [DebugVisualizerPanel.h:L57](../../SparkEditor/Source/Panels/DebugVisualizerPanel.h#L57) | | | `RenderStats` | function | SparkEditor | [EventMonitorPanel.h:L57](../../SparkEditor/Source/Panels/EventMonitorPanel.h#L57) | | | `RenderStatus` | function | SparkEditor | [PlayControlPanel.h:L79](../../SparkEditor/Source/Panels/PlayControlPanel.h#L79) | | -| `RenderStatusBar` | function | SparkEditor | [EditorUI.h:L501](../../SparkEditor/Source/Core/EditorUI.h#L501) | | +| `RenderStatusBar` | function | SparkEditor | [EditorUI.h:L499](../../SparkEditor/Source/Core/EditorUI.h#L499) | | | `RenderStatusDisplay` | function | SparkEditor | [PlayModeToolbarPanel.h:L63](../../SparkEditor/Source/Panels/PlayModeToolbarPanel.h#L63) | | | `RenderStreamingSettings` | function | SparkEditor | [StreamingPanel.h:L61](../../SparkEditor/Source/Panels/StreamingPanel.h#L61) | | | `RenderStreamingStatistics` | function | SparkEditor | [LevelStreamingSystem.h:L316](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.h#L316) | Render streaming statistics | @@ -36960,7 +37041,7 @@ | `RenderTimeline` | function | SparkEditor | [CinematicSequencerPanel.h:L68](../../SparkEditor/Source/Panels/CinematicSequencerPanel.h#L68) | | | `RenderTimeline` | function | SparkEditor | [SpriteAnimationEditorPanel.h:L48](../../SparkEditor/Source/Panels/SpriteAnimationEditorPanel.h#L48) | | | `RenderTimeScaleControls` | function | SparkEditor | [PlayModeToolbarPanel.h:L59](../../SparkEditor/Source/Panels/PlayModeToolbarPanel.h#L59) | Connect to the engine's PlayModeManager. | -| `RenderToolbar` | function | SparkEditor | [EditorUI.h:L494](../../SparkEditor/Source/Core/EditorUI.h#L494) | | +| `RenderToolbar` | function | SparkEditor | [EditorUI.h:L492](../../SparkEditor/Source/Core/EditorUI.h#L492) | | | `RenderToolbar` | function | SparkEditor | [BasicMaterialEditorPanel.h:L93](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L93) | | | `RenderToolbar` | function | SparkEditor | [CinematicSequencerPanel.h:L67](../../SparkEditor/Source/Panels/CinematicSequencerPanel.h#L67) | | | `RenderToolbar` | function | SparkEditor | [DecorLayoutEditorPanel.h:L129](../../SparkEditor/Source/Panels/DecorLayoutEditorPanel.h#L129) | | @@ -36978,9 +37059,9 @@ | `RenderToolbar` | function | SparkEditor | [SpriteAnimationEditorPanel.h:L46](../../SparkEditor/Source/Panels/SpriteAnimationEditorPanel.h#L46) | | | `RenderToolbar` | function | SparkEditor | [TilemapEditorPanel.h:L58](../../SparkEditor/Source/Panels/TilemapEditorPanel.h#L58) | | | `RenderToolbar` | function | SparkEditor | [UndoHistoryPanel.h:L46](../../SparkEditor/Source/Panels/UndoHistoryPanel.h#L46) | | -| `RenderToolbarPlayControls` | function | SparkEditor | [EditorUI.h:L497](../../SparkEditor/Source/Core/EditorUI.h#L497) | | -| `RenderToolbarSnapControls` | function | SparkEditor | [EditorUI.h:L500](../../SparkEditor/Source/Core/EditorUI.h#L500) | | -| `RenderToolbarTransformTools` | function | SparkEditor | [EditorUI.h:L495](../../SparkEditor/Source/Core/EditorUI.h#L495) | | +| `RenderToolbarPlayControls` | function | SparkEditor | [EditorUI.h:L495](../../SparkEditor/Source/Core/EditorUI.h#L495) | | +| `RenderToolbarSnapControls` | function | SparkEditor | [EditorUI.h:L498](../../SparkEditor/Source/Core/EditorUI.h#L498) | | +| `RenderToolbarTransformTools` | function | SparkEditor | [EditorUI.h:L493](../../SparkEditor/Source/Core/EditorUI.h#L493) | | | `RenderToolPalette` | function | SparkEditor | [TerrainEditor.h:L87](../../SparkEditor/Source/Terrain/TerrainEditor.h#L87) | | | `RenderTraceLog` | function | SparkEditor | [ScriptDebugPanel.h:L96](../../SparkEditor/Source/Panels/ScriptDebugPanel.h#L96) | | | `RenderTrackingInfo` | function | SparkEditor | [VRConfigPanel.h:L33](../../SparkEditor/Source/Panels/VRConfigPanel.h#L33) | | @@ -37037,10 +37118,10 @@ | `RenderWeaponPreview` | function | SparkEditor | [WeaponEditorPanel.h:L60](../../SparkEditor/Source/Panels/WeaponEditorPanel.h#L60) | The current (possibly edited) weapon table. | | `RenderWeaponProperties` | function | SparkEditor | [WeaponEditorPanel.h:L59](../../SparkEditor/Source/Panels/WeaponEditorPanel.h#L59) | The current (possibly edited) weapon table. | | `RenderWeatherComponent` | function | SparkEditor | [InspectorPanel.h:L125](../../SparkEditor/Source/Panels/InspectorPanel.h#L125) | | -| `RenderWelcomeScreen` | function | SparkEditor | [EditorUI.h:L504](../../SparkEditor/Source/Core/EditorUI.h#L504) | | +| `RenderWelcomeScreen` | function | SparkEditor | [EditorUI.h:L502](../../SparkEditor/Source/Core/EditorUI.h#L502) | | | `RenderWidgetInspector` | function | SparkEditor | [UIDesignerPanel.h:L40](../../SparkEditor/Source/Panels/UIDesignerPanel.h#L40) | | | `RenderWidgetTree` | function | SparkEditor | [UIDesignerPanel.h:L39](../../SparkEditor/Source/Panels/UIDesignerPanel.h#L39) | | -| `RenderWindowMenu` | function | SparkEditor | [EditorUI.h:L490](../../SparkEditor/Source/Core/EditorUI.h#L490) | | +| `RenderWindowMenu` | function | SparkEditor | [EditorUI.h:L488](../../SparkEditor/Source/Core/EditorUI.h#L488) | | | `RenderWindZoneComponent` | function | SparkEditor | [InspectorPanel.h:L139](../../SparkEditor/Source/Panels/InspectorPanel.h#L139) | | | `RenderWorkflowList` | function | SparkEditor | [WorkflowPanel.h:L40](../../SparkEditor/Source/Panels/WorkflowPanel.h#L40) | Set the EditorUI pointer for workflow context access. | | `RenderWorld` | function | GameModules | [TFWorldSetup.h:L111](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetup.h#L111) | | @@ -37058,6 +37139,7 @@ | `RenderWorldToolbar` | function | SparkEditor | [HierarchyPanel.h:L233](../../SparkEditor/Source/Panels/HierarchyPanel.h#L233) | Render the Create/Delete toolbar for World-backed mode (Unit C2). | | `RenderWorldToTexture` | function | SparkEditor | [GameViewPanel.h:L111](../../SparkEditor/Source/Panels/GameViewPanel.h#L111) | | | `RenderWorldVariables` | function | SparkEditor | [ConditionEditorPanel.h:L63](../../SparkEditor/Source/Panels/ConditionEditorPanel.h#L63) | | +| `reopened` | function | Tests | [TestEditorSubsystemsReal.cpp:L823](../../Tests/TestEditorSubsystemsReal.cpp#L823) | | | `reopened` | function | Tests | [TestSEC2PersistenceHardening.cpp:L416](../../Tests/TestSEC2PersistenceHardening.cpp#L416) | | | `Repair` | function | GameModules | [VehicleSystem.h:L218](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L218) | Repair the vehicle | | `RepairRequiredFileName` | function | SparkInstaller | [InstallState.h:L40](../../SparkInstaller/src/InstallState.h#L40) | | @@ -37076,7 +37158,7 @@ | `ReplaceFileAtomically` | function | SparkEditor | [BasicMaterialEditorPanel.cpp:L71](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.cpp#L71) | | | `ReplaceFileAtomically` | function | SparkEditor | [JSONSceneSerializer.cpp:L103](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L103) | | | `ReplaceFileAtomically` | function | SparkEngine | [ReflectedScenePersistence.cpp:L140](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L140) | | -| `ReplaceFileAtomically` | function | SparkEngine | [SceneManager.cpp:L114](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L114) | | +| `ReplaceFileAtomically` | function | SparkEngine | [SceneManager.cpp:L118](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L118) | | | `ReplaceFileAtomically` | function | SparkEngine | [SaveFileDurability.cpp:L357](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L357) | | | `ReplaceFirstAscii` | function | Tests | [Test_persistence_SaveSystem.cpp:L149](../../Tests/harden/Test_persistence_SaveSystem.cpp#L149) | | | `ReplaceLengthPrefixedString` | function | Tests | [Test_persistence_SaveSystem.cpp:L160](../../Tests/harden/Test_persistence_SaveSystem.cpp#L160) | | @@ -37117,7 +37199,7 @@ | `ReplayProtection::Reset` | method | SparkEngine | [NetworkEncryption.cpp:L398](../../SparkEngine/Source/Engine/Networking/NetworkEncryption.cpp#L398) | | | `ReplaySettings` | struct | SparkEngine | [EngineSettings.h:L797](../../SparkEngine/Source/Core/EngineSettings.h#L797) | | | `ReplaySystem` | class | SparkEditor | [ReplayPanel.h:L15](../../SparkEditor/Source/Panels/ReplayPanel.h#L15) | | -| `ReplaySystem` | class | SparkSDK | [IEngineContext.h:L95](../../SparkSDK/Include/Spark/IEngineContext.h#L95) | | +| `ReplaySystem` | class | SparkSDK | [IEngineContext.h:L96](../../SparkSDK/Include/Spark/IEngineContext.h#L96) | | | `ReplaySystem::Console_GetStatus` | method | SparkEngine | [ReplaySystem.cpp:L671](../../SparkEngine/Source/Engine/Replay/ReplaySystem.cpp#L671) | | | `ReplaySystem::FindFrameIndex` | method | SparkEngine | [ReplaySystem.cpp:L712](../../SparkEngine/Source/Engine/Replay/ReplaySystem.cpp#L712) | | | `ReplaySystem::GetCamera` | method | SparkEngine | [ReplaySystem.cpp:L303](../../SparkEngine/Source/Engine/Replay/ReplaySystem.cpp#L303) | | @@ -37225,7 +37307,7 @@ | `RequestCreateProject` | function | SparkEditor | [ProjectBrowserPanel.h:L79](../../SparkEditor/Source/Panels/ProjectBrowserPanel.h#L79) | | | `RequestDash` | function | GameModules | [PlatformerPlayerController.h:L150](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L150) | Queue a dash for the next fixed update. | | `RequestDedicatedServer` | function | SparkEngine | [PlayModeManager.h:L390](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L390) | Request a dedicated server to be spawned alongside PIE. | -| `RequestDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2187](../../SparkEditor/Source/Core/EditorUI.cpp#L2187) | | +| `RequestDocumentTransition` | function | SparkEditor | [EditorUI.cpp:L2207](../../SparkEditor/Source/Core/EditorUI.cpp#L2207) | | | `RequestDocumentTransition` | function | SparkEditor | [EditorUI.h:L449](../../SparkEditor/Source/Core/EditorUI.h#L449) | Atomically replace the edited document World. Clears the | | `requested` | function | SparkEditor | [BuildPipeline.cpp:L156](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L156) | | | `RequestExit` | function | SparkEditor | [EditorApplication.h:L85](../../SparkEditor/Source/Core/EditorApplication.h#L85) | Absolute path of the persisted window layout | @@ -37248,6 +37330,7 @@ | `RequestTileLoad` | function | SparkEditor | [LevelStreamingSystem.h:L178](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.h#L178) | Request tile loading | | `RequestTileUnload` | function | SparkEditor | [LevelStreamingSystem.h:L186](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.h#L186) | Request tile unloading | | `Require` | function | Tests | [TestAngelScriptStackAlignmentReal.cpp:L79](../../Tests/TestAngelScriptStackAlignmentReal.cpp#L79) | | +| `Require` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L23](../../Tests/TestFPSGameCameraReloadReal.cpp#L23) | | | `RequireActiveBackend` | function | Tests | [TestRHI240LinuxForwardPassReal.cpp:L521](../../Tests/TestRHI240LinuxForwardPassReal.cpp#L521) | | | `RequireBool` | function | SparkEngine | [SaveSystem.cpp:L385](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.cpp#L385) | | | `required` | function | SparkEngine | [GamePackager.h:L441](../../SparkEngine/Source/Engine/Build/GamePackager.h#L441) | | @@ -37259,6 +37342,8 @@ | `RequireKeys` | function | SparkEngine | [VisualScriptGraphIO.cpp:L55](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphIO.cpp#L55) | | | `RequireLavapipe` | function | Tests | [TestRHI230VulkanGoldenReal.cpp:L93](../../Tests/TestRHI230VulkanGoldenReal.cpp#L93) | | | `RequireLlvmpipe` | function | Tests | [TestRHI240OpenGLGoldenReal.cpp:L96](../../Tests/TestRHI240OpenGLGoldenReal.cpp#L96) | | +| `RequirePlainPath` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L28](../../Tests/TestFPSOwnedSaveDecode.cpp#L28) | | +| `RequirePrimaryOnly` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L44](../../Tests/TestFPSOwnedSaveDecode.cpp#L44) | | | `RequiresConfirmation` | function | SparkEditor | [EditorWorkflow.h:L101](../../SparkEditor/Source/Workflow/EditorWorkflow.h#L101) | True when the workflow performs destructive work (deleting directories). | | `RequireSodium` | function | GameModules | [TFCrypto.cpp:L66](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.cpp#L66) | | | `RequireSodium` | function | SparkEngine | [PasswordHash.cpp:L41](../../SparkEngine/Source/Utils/PasswordHash.cpp#L41) | | @@ -37436,9 +37521,9 @@ | `ResetNM` | function | Tests | [TestNetworkManagerEdgeCases.cpp:L166](../../Tests/TestNetworkManagerEdgeCases.cpp#L166) | | | `ResetNullStats` | function | SparkEngine | [NullRHIDevice.h:L360](../../SparkEngine/Source/Graphics/RHI/NullRHIDevice.h#L360) | | | `ResetOptimizerState` | function | SparkEngine | [CpuNeuralTraining.h:L188](../../SparkEngine/Source/Graphics/Neural/CpuNeuralTraining.h#L188) | Reset Adam step counter + moment buffers (e.g. after LR change). | -| `ResetOwned` | function | SparkEngine | [EngineContext.h:L141](../../SparkEngine/Source/Core/EngineContext.h#L141) | Reset the global EngineContext (shutdown only) | +| `ResetOwned` | function | SparkEngine | [EngineContext.h:L142](../../SparkEngine/Source/Core/EngineContext.h#L142) | Reset the global EngineContext (shutdown only) | | `ResetPassHistory` | function | SparkEngine | [GPUTimestampQuery.h:L361](../../SparkEngine/Source/Graphics/GPUTimestampQuery.h#L361) | Drop all completed samples for one named pass. | -| `ResetPinnedArtifactRoot` | function | SparkEngine | [CrashHandler.cpp:L145](../../SparkEngine/Source/Utils/CrashHandler.cpp#L145) | | +| `ResetPinnedArtifactRoot` | function | SparkEngine | [CrashHandler.cpp:L146](../../SparkEngine/Source/Utils/CrashHandler.cpp#L146) | | | `ResetPlatformRuntime` | function | GameModules | [PlatformerLevelSystem.h:L231](../../GameModules/SparkGamePlatformer/Source/Level/PlatformerLevelSystem.h#L231) | | | `ResetPlayerTransform` | function | Templates | [GameModule.h:L298](../../Templates/MMOStarter/Source/GameModule.h#L298) | | | `ResetPlayerTransform` | function | Templates | [GameModule.h:L362](../../Templates/MultiplayerArena/Source/GameModule.h#L362) | | @@ -37465,7 +37550,7 @@ | `ResetSequencer` | function | Tests | [TestSequencerReal.cpp:L13](../../Tests/TestSequencerReal.cpp#L13) | | | `ResetSession` | function | Templates | [GameModule.h:L207](../../Templates/MMOStarter/Source/GameModule.h#L207) | | | `ResetSessionState` | function | GameModules | [TFClientNet.h:L189](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L189) | | -| `ResetSingleton` | function | Tests | [TestAIIntegratedSystem.cpp:L29](../../Tests/TestAIIntegratedSystem.cpp#L29) | | +| `ResetSingleton` | function | Tests | [TestAIIntegratedSystem.cpp:L36](../../Tests/TestAIIntegratedSystem.cpp#L36) | | | `ResetSingleton` | function | Tests | [TestShaderHotReloadPhaseU.cpp:L64](../../Tests/TestShaderHotReloadPhaseU.cpp#L64) | | | `ResetState` | function | Tests | [TestConnectionScopeWiring.cpp:L30](../../Tests/TestConnectionScopeWiring.cpp#L30) | | | `ResetStatistics` | function | SparkEngine | [PacketValidator.h:L189](../../SparkEngine/Source/Engine/Networking/PacketValidator.h#L189) | | @@ -37543,19 +37628,19 @@ | `Resolution` | enum | SparkEditor | [GameViewPanel.h:L115](../../SparkEditor/Source/Panels/GameViewPanel.h#L115) | | | `Resolution` | struct | SparkEngine | [DynamicQualityTypes.h:L30](../../SparkEngine/Source/Graphics/DynamicQualityTypes.h#L30) | Resolution as a width/height pair, enabling structured bindings | | `Resolution` | struct | SparkEngine | [UpscalingTypes.h:L29](../../SparkEngine/Source/Graphics/UpscalingTypes.h#L29) | Resolution as a width/height pair, enabling structured bindings | -| `Resolve` | function | GameModules | [FPSAssetPaths.cpp:L141](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L141) | | +| `Resolve` | function | GameModules | [FPSAssetPaths.cpp:L155](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L155) | | | `Resolve` | function | GameModules | [FPSAssetPaths.h:L68](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L68) | Resolve a path expressed relative to the asset root. | | `Resolve` | function | SparkEditor | [EditorUI.h:L84](../../SparkEditor/Source/Core/EditorUI.h#L84) | | | `Resolve` | function | SparkEngine | [AngelScriptEngine.h:L789](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L789) | | | `Resolve` | function | SparkEngine | [OBJStaticMeshLoader.cpp:L141](../../SparkEngine/Source/Graphics/OBJStaticMeshLoader.cpp#L141) | | | `Resolve` | function | Tests | [TestAdversarialEngine.cpp:L101](../../Tests/TestAdversarialEngine.cpp#L101) | | | `Resolve` | function | Tests | [TestDocumentInterruptionReal.cpp:L539](../../Tests/TestDocumentInterruptionReal.cpp#L539) | | -| `Resolve` | function | Tests | [TestTF120Travel.cpp:L110](../../Tests/TestTF120Travel.cpp#L110) | | -| `ResolveAlias` | function | SparkConsole | [ConsoleApp.h:L122](../../SparkConsole/src/ConsoleApp.h#L122) | | +| `Resolve` | function | Tests | [TestTF120Travel.cpp:L97](../../Tests/TestTF120Travel.cpp#L97) | | +| `ResolveAlias` | function | SparkConsole | [ConsoleApp.h:L123](../../SparkConsole/src/ConsoleApp.h#L123) | | | `ResolveAlias` | function | Tests | [TestAdversarialEngine.cpp:L1233](../../Tests/TestAdversarialEngine.cpp#L1233) | | | `ResolveAlias` | function | Tests | [TestAdversarialEngine.cpp:L1240](../../Tests/TestAdversarialEngine.cpp#L1240) | | | `ResolveAliases` | function | SparkEngine | [SparkConsole.h:L269](../../SparkEngine/Source/Utils/SparkConsole.h#L269) | | -| `ResolveArea` | function | Tests | [TestTF120Travel.cpp:L174](../../Tests/TestTF120Travel.cpp#L174) | | +| `ResolveArea` | function | Tests | [TestTF120Travel.cpp:L161](../../Tests/TestTF120Travel.cpp#L161) | | | `ResolveAsset` | function | SparkEngine | [WorldBasicRenderer.h:L44](../../SparkEngine/Source/Graphics/WorldBasicRenderer.h#L44) | | | `ResolveAssetDiskPath` | function | SparkEditor | [BasicMaterialEditorPanel.h:L101](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L101) | Map an asset-relative texture path ("Textures/x.png" or "Assets/Textures/x.png") | | `ResolveAttack` | function | GameModules | [ARPGDemoEncounter.cpp:L338](../../GameModules/SparkGameARPG/Source/Demo/ARPGDemoEncounter.cpp#L338) | | @@ -37573,8 +37658,8 @@ | `ResolveContinent` | function | GameModules | [TFHandoffParticipant.h:L26](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.h#L26) | Game-thread pawn operations supplied by the live authoritative simulation. | | `ResolveContinent` | function | GameModules | [TFServerSim.h:L138](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L138) | Game-thread handoff callbacks; the host dispatcher serializes control requests with simulation. | | `ResolveContinent` | function | Tests | [TestTF120Migration.cpp:L48](../../Tests/TestTF120Migration.cpp#L48) | | -| `ResolveContinent` | function | Tests | [TestTF120Travel.cpp:L204](../../Tests/TestTF120Travel.cpp#L204) | | -| `ResolveContinent` | function | Tests | [TestTF120Travel.cpp:L248](../../Tests/TestTF120Travel.cpp#L248) | | +| `ResolveContinent` | function | Tests | [TestTF120Travel.cpp:L191](../../Tests/TestTF120Travel.cpp#L191) | | +| `ResolveContinent` | function | Tests | [TestTF120Travel.cpp:L235](../../Tests/TestTF120Travel.cpp#L235) | | | `ResolveContinentSelection` | function | GameModules | [TFDataTables.cpp:L101](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTables.cpp#L101) | | | `ResolveCrashArtifactBaseDirectory` | function | SparkEngine | [CrashArtifactDirectory.h:L320](../../SparkEngine/Source/Utils/CrashArtifactDirectory.h#L320) | | | `ResolveCrashReporterExecutable` | function | SparkEngine | [CrashHandlerSupport.h:L264](../../SparkEngine/Source/Utils/CrashHandlerSupport.h#L264) | Resolve the crash reporter from the trusted executable tree. | @@ -37657,14 +37742,14 @@ | `ResolveSaveDirectory` | function | SparkEngine | [EngineSettings.cpp:L961](../../SparkEngine/Source/Core/EngineSettings.cpp#L961) | | | `ResolveSaveDirectory` | function | SparkEngine | [EngineSettings.h:L83](../../SparkEngine/Source/Core/EngineSettings.h#L83) | | | `ResolveScene` | struct | Tests | [TestRHI210D3D11DeferredResolveReal.cpp:L45](../../Tests/TestRHI210D3D11DeferredResolveReal.cpp#L45) | | -| `ResolveScenePath` | function | GameModules | [FPSAssetPaths.cpp:L165](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L165) | | +| `ResolveScenePath` | function | GameModules | [FPSAssetPaths.cpp:L179](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L179) | | | `ResolveScenePath` | function | GameModules | [FPSAssetPaths.h:L86](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L86) | Resolve a user-provided scene name inside the trusted scene tree. | | `ResolveSenderLabel` | function | GameModules | [TFChatWindow.h:L73](../../GameModules/SparkGameMMOFPS/Source/UI/TFChatWindow.h#L73) | | | `ResolveSlotForModel` | function | GameModules | [TFViewModel.h:L102](../../GameModules/SparkGameMMOFPS/Source/Game/TFViewModel.h#L102) | | | `ResolveSpawnPos` | function | GameModules | [TFRedeployRules.cpp:L61](../../GameModules/SparkGameMMOFPS/Source/Game/TFRedeployRules.cpp#L61) | | | `ResolveSpawnPos` | function | GameModules | [TFRedeployRules.h:L56](../../GameModules/SparkGameMMOFPS/Source/Game/TFRedeployRules.h#L56) | | | `ResolveSpriteDraw` | function | SparkEngine | [WorldBasicRenderer.cpp:L52](../../SparkEngine/Source/Graphics/WorldBasicRenderer.cpp#L52) | | -| `ResolveStartupScene` | function | GameModules | [FPSAssetPaths.cpp:L102](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L102) | | +| `ResolveStartupScene` | function | GameModules | [FPSAssetPaths.cpp:L114](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L114) | | | `ResolveStartupScene` | function | GameModules | [FPSAssetPaths.h:L62](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L62) | Select the packaged startup scene beside the host executable. | | `ResolveStartupSplashConfig` | function | SparkEngine | [StartupSplash.cpp:L393](../../SparkEngine/Source/Core/StartupSplash.cpp#L393) | | | `ResolveSymbols` | function | SparkEngine | [StackTrace.h:L333](../../SparkEngine/Source/Utils/StackTrace.h#L333) | | @@ -37676,7 +37761,7 @@ | `ResolveTimeOfDay` | function | SparkEditor | [TimeOfDayPanel.cpp:L84](../../SparkEditor/Source/Panels/TimeOfDayPanel.cpp#L84) | | | `ResolveTimeOfDay` | function | SparkEditor | [TimeOfDayPanel.cpp:L89](../../SparkEditor/Source/Panels/TimeOfDayPanel.cpp#L89) | | | `ResolveUserDataPath` | function | SparkEngine | [GameplayLifecycleShared.cpp:L192](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L192) | | -| `ResolveUtf8` | function | GameModules | [FPSAssetPaths.cpp:L148](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L148) | | +| `ResolveUtf8` | function | GameModules | [FPSAssetPaths.cpp:L162](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L162) | | | `ResolveUtf8` | function | GameModules | [FPSAssetPaths.h:L75](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L75) | UTF-8 form of Resolve(), for APIs that take std::string paths. | | `ResolveVariantKey` | function | SparkEngine | [ShaderVariantSystem.h:L243](../../SparkEngine/Source/Graphics/ShaderVariantSystem.h#L243) | Resolve a material's keyword overrides into a final variant key | | `ResolveVelocity` | function | SparkEngine | [Physics2D.h:L387](../../SparkEngine/Source/Engine/2D/Physics2D.h#L387) | | @@ -37883,8 +37968,8 @@ | `Retire` | function | GameModules | [TFServerSim.h:L143](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L143) | Game-thread handoff callbacks; the host dispatcher serializes control requests with simulation. | | `Retire` | function | SparkEngine | [D3D12Types.h:L317](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L317) | | | `Retire` | function | Tests | [TestTF120Migration.cpp:L105](../../Tests/TestTF120Migration.cpp#L105) | | -| `Retire` | function | Tests | [TestTF120Travel.cpp:L232](../../Tests/TestTF120Travel.cpp#L232) | | -| `Retire` | function | Tests | [TestTF120Travel.cpp:L274](../../Tests/TestTF120Travel.cpp#L274) | | +| `Retire` | function | Tests | [TestTF120Travel.cpp:L219](../../Tests/TestTF120Travel.cpp#L219) | | +| `Retire` | function | Tests | [TestTF120Travel.cpp:L261](../../Tests/TestTF120Travel.cpp#L261) | | | `RetireDescriptorPages` | function | SparkEngine | [D3D12Types.h:L762](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L762) | Hands every descriptor page this list filled to the pool, reusable once | | `RetiredPage` | struct | SparkEngine | [D3D12Types.h:L329](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L329) | | | `RetirementPlanProbe` | struct | Tests | [Test_persistence_SaveSystem.cpp:L458](../../Tests/harden/Test_persistence_SaveSystem.cpp#L458) | | @@ -37923,7 +38008,7 @@ | `RewindToTime` | function | SparkEngine | [NetworkManager.h:L430](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L430) | | | `RewindToTime` | function | Tests | [TestAdversarialEngine.cpp:L1712](../../Tests/TestAdversarialEngine.cpp#L1712) | | | `RewindToTime` | function | Tests | [TestLagCompensationIntegration.cpp:L54](../../Tests/TestLagCompensationIntegration.cpp#L54) | | -| `RewirePanelsToWorld` | function | SparkEditor | [EditorUI.h:L477](../../SparkEditor/Source/Core/EditorUI.h#L477) | Re-point the panels that cache a raw ::World | +| `RewirePanelsToWorld` | function | SparkEditor | [EditorUI.h:L475](../../SparkEditor/Source/Core/EditorUI.h#L475) | Wire document-backed panels to the current World and EditorUI. | | `Rewrite` | function | Tests | [TestMOD300ShowcaseLocalizationReal.cpp:L61](../../Tests/TestMOD300ShowcaseLocalizationReal.cpp#L61) | | | `Rewrite` | function | Tests | [TestMOD390VisualScriptDiagnosticsReal.cpp:L98](../../Tests/TestMOD390VisualScriptDiagnosticsReal.cpp#L98) | | | `Rewrite` | function | Tests | [TestMOD390VisualScriptHotReloadReal.cpp:L96](../../Tests/TestMOD390VisualScriptHotReloadReal.cpp#L96) | | @@ -37932,7 +38017,7 @@ | `rgba` | function | SparkEngine | [GraphicsConsoleOpsWindowsDiagnostics.cpp:L166](../../SparkEngine/Source/Graphics/GraphicsConsoleOpsWindowsDiagnostics.cpp#L166) | | | `rgba` | function | SparkEngine | [TextureCompressor.cpp:L223](../../SparkEngine/Source/Graphics/TextureCompressor.cpp#L223) | | | `rgba` | function | SparkEngine | [GoldenImagePng.h:L275](../../SparkEngine/Source/Utils/GoldenImagePng.h#L275) | | -| `rgba` | function | Tests | [TestAssetParserHardening.cpp:L211](../../Tests/TestAssetParserHardening.cpp#L211) | | +| `rgba` | function | Tests | [TestAssetParserHardening.cpp:L227](../../Tests/TestAssetParserHardening.cpp#L227) | | | `rgba` | function | Tests | [TestGoldenImageTest.cpp:L415](../../Tests/TestGoldenImageTest.cpp#L415) | | | `Rgba` | struct | Tests | [TestRHI225D3D12ParityReal.cpp:L68](../../Tests/TestRHI225D3D12ParityReal.cpp#L68) | | | `rgba` | function | Tests | [TestTextureCompressorPhaseGG.cpp:L69](../../Tests/TestTextureCompressorPhaseGG.cpp#L69) | | @@ -38223,7 +38308,7 @@ | `RolloverIfNeeded` | function | GameModules | [TFOutfitSystem.h:L220](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L220) | | | `RolloverWeek` | function | GameModules | [TFOutfitStore.h:L144](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFOutfitStore.h#L144) | | | `RollRarity` | function | GameModules | [ARPGLootSystem.h:L91](../../GameModules/SparkGameARPG/Source/Loot/ARPGLootSystem.h#L91) | Keep future item IDs above @p itemId so a restored item never shares an ID with a new drop. | -| `Root` | function | GameModules | [FPSAssetPaths.cpp:L75](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L75) | | +| `Root` | function | GameModules | [FPSAssetPaths.cpp:L83](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L83) | | | `Root` | function | GameModules | [FPSAssetPaths.h:L49](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L49) | The resolved asset root, computed once per process. A packaged | | `Root` | function | GameModules | [TFSavePaths.h:L233](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFSavePaths.h#L233) | | | `root` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L371](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L371) | | @@ -38250,6 +38335,7 @@ | `root` | function | Tests | [TestLifecycleCompositionRootFailure.cpp:L420](../../Tests/TestLifecycleCompositionRootFailure.cpp#L420) | | | `root` | function | Tests | [TestMOD300ShowcaseLocalizationReal.cpp:L121](../../Tests/TestMOD300ShowcaseLocalizationReal.cpp#L121) | | | `Root` | function | Tests | [TestSceneSaveConfinedReal.cpp:L82](../../Tests/TestSceneSaveConfinedReal.cpp#L82) | | +| `root` | function | Tests | [TestTFRegionLattice.cpp:L69](../../Tests/TestTFRegionLattice.cpp#L69) | | | `Root` | function | Tests | [TestTelemetrySpool.cpp:L46](../../Tests/TestTelemetrySpool.cpp#L46) | | | `root` | function | Tests | [TestUILayoutExtensions.cpp:L359](../../Tests/TestUILayoutExtensions.cpp#L359) | | | `root` | function | Tests | [TestUILayoutExtensions.cpp:L387](../../Tests/TestUILayoutExtensions.cpp#L387) | | @@ -38257,10 +38343,10 @@ | `root` | function | Tests | [TestUILayoutExtensions.cpp:L404](../../Tests/TestUILayoutExtensions.cpp#L404) | | | `root` | function | Tests | [TestUILayoutExtensions.cpp:L414](../../Tests/TestUILayoutExtensions.cpp#L414) | | | `root` | function | Tests | [TestUILayoutExtensions.cpp:L427](../../Tests/TestUILayoutExtensions.cpp#L427) | | -| `RootExists` | function | GameModules | [FPSAssetPaths.cpp:L96](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L96) | | +| `RootExists` | function | GameModules | [FPSAssetPaths.cpp:L108](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L108) | | | `RootExists` | function | GameModules | [FPSAssetPaths.h:L52](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.h#L52) | True when Root() actually exists on disk. | | `RootUtf8` | function | Tests | [TestRHI210D3D11FrameGoldenReal.cpp:L253](../../Tests/TestRHI210D3D11FrameGoldenReal.cpp#L253) | | -| `rootUtf8` | function | Tests | [TestTFDataTables.cpp:L596](../../Tests/TestTFDataTables.cpp#L596) | | +| `rootUtf8` | function | Tests | [TestTFDataTables.cpp:L587](../../Tests/TestTFDataTables.cpp#L587) | | | `Roster` | function | GameModules | [TFSocialSystem.h:L101](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L101) | | | `RosterFactionOf` | function | GameModules | [TFSocialSystem.h:L92](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L92) | | | `RosterNameOf` | function | GameModules | [TFSocialPanel.h:L54](../../GameModules/SparkGameMMOFPS/Source/UI/TFSocialPanel.h#L54) | | @@ -38516,7 +38602,7 @@ | `RTGISettings` | struct | SparkEngine | [DXRSupport.h:L166](../../SparkEngine/Source/Graphics/RHI/DXRSupport.h#L166) | | | `RTHandle` | struct | SparkEngine | [RTHandleSystem.h:L41](../../SparkEngine/Source/Graphics/RTHandleSystem.h#L41) | Handle to a scale-based render texture | | `RTHandleSystem` | class | SparkEngine | [RTHandleSystem.h:L81](../../SparkEngine/Source/Graphics/RTHandleSystem.h#L81) | Manages scale-based render texture allocation | -| `RtlDllShutdownInProgressFn` | alias | SparkEngine | [CrashHandler.cpp:L849](../../SparkEngine/Source/Utils/CrashHandler.cpp#L849) | | +| `RtlDllShutdownInProgressFn` | alias | SparkEngine | [CrashHandler.cpp:L850](../../SparkEngine/Source/Utils/CrashHandler.cpp#L850) | | | `RTQualityParams` | struct | SparkEngine | [HybridRTTypes.h:L88](../../SparkEngine/Source/Graphics/HybridRT/HybridRTTypes.h#L88) | | | `RTReflectionSettings` | struct | SparkEngine | [DXRSupport.h:L139](../../SparkEngine/Source/Graphics/RHI/DXRSupport.h#L139) | | | `RTSAIContext` | class | Tests | [TestMOD370SkirmishDeterminismReal.cpp:L660](../../Tests/TestMOD370SkirmishDeterminismReal.cpp#L660) | | @@ -38801,11 +38887,11 @@ | `Run` | function | Tests | [TestBenchmarkFramework.cpp:L34](../../Tests/TestBenchmarkFramework.cpp#L34) | | | `Run` | function | Tests | [TestFramework.h:L160](../../Tests/TestFramework.h#L160) | | | `Run` | function | Tests | [TestMOD340PlatformerCompletionReal.cpp:L73](../../Tests/TestMOD340PlatformerCompletionReal.cpp#L73) | | -| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L629](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L629) | | -| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L668](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L668) | | -| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L733](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L733) | | -| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L778](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L778) | | -| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L815](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L815) | | +| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L672](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L672) | | +| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L711](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L711) | | +| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L776](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L776) | | +| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L821](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L821) | | +| `run` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L858](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L858) | | | `Run` | function | Tests | [TestNetImpairmentWiring.cpp:L55](../../Tests/TestNetImpairmentWiring.cpp#L55) | | | `run` | function | Tests | [TestSecDaemonPipeIdentity.cpp:L185](../../Tests/TestSecDaemonPipeIdentity.cpp#L185) | | | `run` | function | Tests | [TestSecDaemonPipeIdentity.cpp:L204](../../Tests/TestSecDaemonPipeIdentity.cpp#L204) | | @@ -38832,9 +38918,9 @@ | `RunCollabServer` | function | SparkEditor | [main.cpp:L164](../../SparkEditor/Source/main.cpp#L164) | Run as a headless collaborative editing server (no GUI). | | `RunCollabServer` | function | SparkEditor | [main.cpp:L357](../../SparkEditor/Source/main.cpp#L357) | | | `RunCommand` | function | SparkEditor | [BuildPipeline.h:L166](../../SparkEditor/Source/Panels/BuildPipeline.h#L166) | | -| `RunCompletionOwnedDestructionTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L493](../../SparkBuild/tests/ProcessRunnerTests.cpp#L493) | | -| `RunCompletionReentryTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L427](../../SparkBuild/tests/ProcessRunnerTests.cpp#L427) | | -| `RunCookChild` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L44](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L44) | | +| `RunCompletionOwnedDestructionTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L488](../../SparkBuild/tests/ProcessRunnerTests.cpp#L488) | | +| `RunCompletionReentryTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L425](../../SparkBuild/tests/ProcessRunnerTests.cpp#L425) | | +| `RunCookChild` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L46](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L46) | | | `RunCrashChild` | function | Tests | [TestDATA120BackupRestore.cpp:L539](../../Tests/TestDATA120BackupRestore.cpp#L539) | | | `RunCrashPolicyProbe` | function | Tests | [TestCrashHandlerGatingReal.cpp:L405](../../Tests/TestCrashHandlerGatingReal.cpp#L405) | | | `RunCrashReporter` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1607](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1607) | | @@ -38858,7 +38944,7 @@ | `RunFolderPicker` | function | SparkEditor | [FolderDialog.cpp:L28](../../SparkEditor/Source/Utils/FolderDialog.cpp#L28) | | | `RunFolderPicker` | function | SparkEditor | [VersionControlRender.cpp:L25](../../SparkEditor/Source/VersionControl/VersionControlRender.cpp#L25) | | | `RunFrame` | function | Tests | [Test_ecs_ai_pathfollow.cpp:L66](../../Tests/harden/Test_ecs_ai_pathfollow.cpp#L66) | | -| `RunFrameInputStep` | function | Tests | [TestInputFrameEdgesReal.cpp:L31](../../Tests/TestInputFrameEdgesReal.cpp#L31) | | +| `RunFrameInputStep` | function | Tests | [TestInputFrameEdgesReal.cpp:L35](../../Tests/TestInputFrameEdgesReal.cpp#L35) | | | `RunFrames` | function | Tests | [TestServerLiveMockClient.cpp:L87](../../Tests/TestServerLiveMockClient.cpp#L87) | | | `RunFreshInstallBuildFailureResumeTest` | function | SparkInstaller | [InstallerTransactionTests.cpp:L1134](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L1134) | | | `RunFreshInstallCloneFailureTest` | function | SparkInstaller | [InstallerTransactionTests.cpp:L1105](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L1105) | | @@ -38902,13 +38988,13 @@ | `RunOpenGLEngine` | function | Tests | [TestRHI240LinuxForwardPassReal.cpp:L539](../../Tests/TestRHI240LinuxForwardPassReal.cpp#L539) | | | `RunOrchestrator` | function | SparkEditor | [ServiceTopologyPanel.h:L28](../../SparkEditor/Source/Panels/ServiceTopologyPanel.h#L28) | | | `RunOversizedMarkerRejectedBeforeParsingTest` | function | SparkInstaller | [InstallStateTests.cpp:L158](../../SparkInstaller/tests/InstallStateTests.cpp#L158) | | -| `RunPackagedScene` | function | Tests | [TestEditorCookPackageReal.cpp:L194](../../Tests/TestEditorCookPackageReal.cpp#L194) | | +| `RunPackagedScene` | function | Tests | [TestEditorCookPackageReal.cpp:L196](../../Tests/TestEditorCookPackageReal.cpp#L196) | | | `RunPathPinTest` | function | SparkBuild | [DownloaderTests.cpp:L368](../../SparkBuild/tests/DownloaderTests.cpp#L368) | | | `RunPendingMarkerRoundTripAndBoundTest` | function | SparkInstaller | [InstallStateTests.cpp:L327](../../SparkInstaller/tests/InstallStateTests.cpp#L327) | | | `RunPlan` | function | SparkBuild | [main.cpp:L91](../../SparkBuild/src/main.cpp#L91) | | | `RunPlan` | function | SparkBuild | [main.cpp:L198](../../SparkBuild/src/main.cpp#L198) | | | `RunPlantedLinkTest` | function | SparkInstaller | [PortableGitCacheTests.cpp:L301](../../SparkInstaller/tests/PortableGitCacheTests.cpp#L301) | | -| `RunPlantedToolSearchTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L615](../../SparkBuild/tests/ProcessRunnerTests.cpp#L615) | | +| `RunPlantedToolSearchTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L608](../../SparkBuild/tests/ProcessRunnerTests.cpp#L608) | | | `RunPortableGitCacheTests` | function | SparkInstaller | [GitContractTests.cpp:L23](../../SparkInstaller/tests/GitContractTests.cpp#L23) | | | `RunPortableGitCacheTests` | function | SparkInstaller | [PortableGitCacheTests.cpp:L351](../../SparkInstaller/tests/PortableGitCacheTests.cpp#L351) | | | `RunPortableZipExtractionTest` | function | SparkBuild | [DownloaderTests.cpp:L452](../../SparkBuild/tests/DownloaderTests.cpp#L452) | | @@ -38939,7 +39025,7 @@ | `RunScriptedDrive` | function | Tests | [TestMOD380VehiclePhysicsReal.cpp:L232](../../Tests/TestMOD380VehiclePhysicsReal.cpp#L232) | | | `RunScriptedSkirmish` | function | Tests | [TestMOD370SkirmishDeterminismReal.cpp:L115](../../Tests/TestMOD370SkirmishDeterminismReal.cpp#L115) | | | `RunSDL2MainLoop` | function | SparkEngine | [SparkEngineLinuxInternal.h:L85](../../SparkEngine/Source/Core/SparkEngineLinuxInternal.h#L85) | Run the SDL2 event pump and per-frame engine tick loop. | -| `RunSDL2MainLoop` | function | SparkEngine | [SparkEngineLinuxSDL2Events.cpp:L171](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2Events.cpp#L171) | | +| `RunSDL2MainLoop` | function | SparkEngine | [SparkEngineLinuxSDL2Events.cpp:L173](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2Events.cpp#L173) | | | `RunSDL2Windowed` | function | SparkEngine | [SparkEngineLinuxInternal.h:L88](../../SparkEngine/Source/Core/SparkEngineLinuxInternal.h#L88) | Run the engine in SDL2 windowed mode (Linux). | | `RunSDL2Windowed` | function | SparkEngine | [SparkEngineLinuxSDL2.cpp:L166](../../SparkEngine/Source/Core/SparkEngineLinuxSDL2.cpp#L166) | Run the engine in SDL2 windowed mode (Linux). | | `RunServer` | function | Tests | [FPSLANLoopbackPeer.cpp:L579](../../Tests/Fixtures/FPSLANLoopbackPeer.cpp#L579) | | @@ -38957,7 +39043,7 @@ | `RunStateSizeAndEncodingBoundTest` | function | SparkInstaller | [InstallStateTests.cpp:L273](../../SparkInstaller/tests/InstallStateTests.cpp#L273) | | | `RunStatsCommand` | function | SparkEngine | [DaemonLifecycle.cpp:L85](../../SparkEngine/Source/Utils/DaemonLifecycle.cpp#L85) | | | `RunSync` | function | SparkBuild | [ProcessRunner.h:L34](../../SparkBuild/src/ProcessRunner.h#L34) | | -| `RunSyncBinaryOutputTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L533](../../SparkBuild/tests/ProcessRunnerTests.cpp#L533) | | +| `RunSyncBinaryOutputTest` | function | SparkBuild | [ProcessRunnerTests.cpp:L526](../../SparkBuild/tests/ProcessRunnerTests.cpp#L526) | | | `RunTeardown` | function | SparkEngine | [LifecycleCompositionRoot.h:L126](../../SparkEngine/Source/Core/Lifecycle/LifecycleCompositionRoot.h#L126) | | | `RuntimeAbiMismatchDiagnostic` | function | Tests | [TestModuleVersion.cpp:L100](../../Tests/TestModuleVersion.cpp#L100) | | | `runtimeAdapter` | function | SparkEngine | [DedicatedServer.cpp:L41](../../SparkEngine/Source/Engine/Networking/DedicatedServer.cpp#L41) | | @@ -38971,7 +39057,7 @@ | `RuntimeSupportMessage` | function | GameModules | [VisualScriptDemoRuntime.h:L51](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoRuntime.h#L51) | | | `RuntimeTerrain` | struct | SparkEngine | [TerrainAssetFormat.h:L152](../../SparkEngine/Source/Graphics/TerrainAssetFormat.h#L152) | The runtime's view of a .sparkterrain asset: the fields TerrainRenderer publishes on a | | `RunToResults` | function | Tests | [TestMOD380RacingCompleteRaceReal.cpp:L86](../../Tests/TestMOD380RacingCompleteRaceReal.cpp#L86) | | -| `RunTravelSourcePeer` | function | Tests | [TestTF120Travel.cpp:L347](../../Tests/TestTF120Travel.cpp#L347) | | +| `RunTravelSourcePeer` | function | Tests | [TestTF120Travel.cpp:L334](../../Tests/TestTF120Travel.cpp#L334) | | | `RunUniqueReservationTest` | function | SparkBuild | [DownloaderTests.cpp:L68](../../SparkBuild/tests/DownloaderTests.cpp#L68) | | | `RunUnverifiedTreeRepairTest` | function | SparkInstaller | [PortableGitCacheTests.cpp:L161](../../SparkInstaller/tests/PortableGitCacheTests.cpp#L161) | | | `RunUpdate` | function | SparkEngine | [LifecycleCompositionRoot.h:L95](../../SparkEngine/Source/Core/Lifecycle/LifecycleCompositionRoot.h#L95) | Update every stage; a no-op once the root is Failed or shut down. | @@ -39019,7 +39105,7 @@ | `s_rng` | function | SparkEngine | [ParticleSystemLinuxEmitter.cpp:L14](../../SparkEngine/Source/Graphics/ParticleSystemLinuxEmitter.cpp#L14) | | | `s_rng` | function | SparkEngine | [ParticleSystemWindowsEmitter.cpp:L24](../../SparkEngine/Source/Graphics/ParticleSystemWindowsEmitter.cpp#L24) | | | `sa` | struct | SparkEditor | [EditorCrashHandler.cpp:L254](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L254) | | -| `sa` | struct | SparkEngine | [CrashHandler.cpp:L2682](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2682) | | +| `sa` | struct | SparkEngine | [CrashHandler.cpp:L2728](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2728) | | | `SafeArea` | struct | SparkEngine | [MobilePlatform.h:L137](../../SparkEngine/Source/Engine/Mobile/MobilePlatform.h#L137) | Screen safe area (avoiding notches, home indicators). | | `SafeBatchRelativePath` | function | SparkShaderCompiler | [BatchOutputPath.h:L31](../../SparkShaderCompiler/src/BatchOutputPath.h#L31) | | | `SafeConfigRoot` | function | SparkCrashReporter | [CrashAutoIssues.cpp:L129](../../SparkCrashReporter/src/CrashAutoIssues.cpp#L129) | | @@ -39039,10 +39125,10 @@ | `SameFloat` | function | Tests | [TestPrefabCompatibility.cpp:L113](../../Tests/TestPrefabCompatibility.cpp#L113) | | | `SameFloat` | function | Tests | [TestPrefabCompatibility.cpp:L119](../../Tests/TestPrefabCompatibility.cpp#L119) | | | `SameFloat` | function | Tests | [TestPrefabCompatibility.cpp:L124](../../Tests/TestPrefabCompatibility.cpp#L124) | | -| `SameGraph` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L120](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L120) | | +| `SameGraph` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L121](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L121) | | | `SameIdentity` | function | SparkCrashReporter | [CrashReporterApp.cpp:L682](../../SparkCrashReporter/src/CrashReporterApp.cpp#L682) | | | `SameIdentity` | function | SparkCrashReporter | [CrashReporterApp.cpp:L917](../../SparkCrashReporter/src/CrashReporterApp.cpp#L917) | | -| `SameInode` | function | SparkEngine | [SceneManager.cpp:L402](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L402) | | +| `SameInode` | function | SparkEngine | [SceneManager.cpp:L446](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L446) | | | `SamePath` | function | SparkEditor | [EditorLaunchContext.h:L66](../../SparkEditor/Source/Utils/EditorLaunchContext.h#L66) | | | `SamePluginFile` | function | SparkEngine | [DynamicPluginHost.cpp:L322](../../SparkEngine/Source/Core/DynamicPluginHost.cpp#L322) | | | `SamePrefab` | function | Tests | [TestPrefabCompatibility.cpp:L133](../../Tests/TestPrefabCompatibility.cpp#L133) | | @@ -39059,7 +39145,7 @@ | `Sample` | struct | SparkEngine | [PCSSshadows.h:L58](../../SparkEngine/Source/Graphics/PCSSshadows.h#L58) | Pre-computed Poisson disk sample points for PCSS filtering | | `Sample` | struct | Tests | [TestExtendedSystems.cpp:L191](../../Tests/TestExtendedSystems.cpp#L191) | | | `Sample` | function | Tests | [TestNetworkInterpolation.cpp:L45](../../Tests/TestNetworkInterpolation.cpp#L45) | | -| `Sample` | struct | Tests | [TestTF120Travel.cpp:L309](../../Tests/TestTF120Travel.cpp#L309) | | +| `Sample` | struct | Tests | [TestTF120Travel.cpp:L296](../../Tests/TestTF120Travel.cpp#L296) | | | `SampleAlongRay` | function | SparkEngine | [VolumetricClouds.h:L161](../../SparkEngine/Source/Graphics/VolumetricClouds.h#L161) | Integrate the cloud layer along a ray. | | `SampleBaseNoise` | function | SparkEngine | [VolumetricClouds.h:L192](../../SparkEngine/Source/Graphics/VolumetricClouds.h#L192) | | | `SampleBilinear` | function | SparkEngine | [SSAOTemporal.h:L204](../../SparkEngine/Source/Graphics/SSAOTemporal.h#L204) | | @@ -39160,6 +39246,7 @@ | `SaveCurrentLayoutToFile` | function | SparkEditor | [EditorWindowManager.h:L127](../../SparkEditor/Source/Core/EditorWindowManager.h#L127) | Save the current layout to a file path | | `SaveCurrentScene` | function | SparkEditor | [EditorUI.h:L272](../../SparkEditor/Source/Core/EditorUI.h#L272) | Get the editor's GraphicsEngine, attached to the editor's own | | `saved` | function | SparkEngine | [GraphicsDeferredLightingWindows.cpp:L210](../../SparkEngine/Source/Graphics/GraphicsDeferredLightingWindows.cpp#L210) | | +| `saved` | function | Tests | [TestEditorSubsystemsReal.cpp:L799](../../Tests/TestEditorSubsystemsReal.cpp#L799) | | | `SaveData` | struct | SparkEngine | [SaveSystemTypes.h:L189](../../SparkEngine/Source/Engine/SaveSystem/SaveSystemTypes.h#L189) | | | `SaveData` | struct | Tests | [TestAdversarialEngine.cpp:L85](../../Tests/TestAdversarialEngine.cpp#L85) | | | `SavedBinding` | struct | SparkEngine | [AngelScriptEngineHotReload.cpp:L227](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngineHotReload.cpp#L227) | | @@ -39177,7 +39264,7 @@ | `SaveInstallState` | function | SparkInstaller | [InstallerTransactionTests.cpp:L417](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L417) | | | `SaveInventory` | function | GameModules | [MMOPersistenceSystem.h:L287](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.h#L287) | | | `SaveJSON` | function | SparkEditor | [SceneSerializer.h:L184](../../SparkEditor/Source/SceneSystem/SceneSerializer.h#L184) | Save scene in JSON format | -| `SaveJSON` | function | SparkEngine | [SceneManager.h:L512](../../SparkEngine/Source/SceneManager/SceneManager.h#L512) | Serialize the current scene to versioned line-oriented text. | +| `SaveJSON` | function | SparkEngine | [SceneManager.h:L514](../../SparkEngine/Source/SceneManager/SceneManager.h#L514) | Serialize the current scene to versioned line-oriented text. | | `SaveLayout` | function | SparkEditor | [EditorUI.h:L222](../../SparkEditor/Source/Core/EditorUI.h#L222) | | | `SaveLayout` | function | SparkEditor | [EditorWindowManager.h:L113](../../SparkEditor/Source/Core/EditorWindowManager.h#L113) | Save the current layout under a name | | `SaveLayout` | function | Tests | [TestEditorWindowManager.cpp:L46](../../Tests/TestEditorWindowManager.cpp#L46) | | @@ -39230,11 +39317,11 @@ | `SaveScene` | function | SparkEditor | [SceneManager.h:L46](../../SparkEditor/Source/SceneSystem/SceneManager.h#L46) | Save the current scene to disk. | | `SaveScene` | function | SparkEditor | [SceneSerializer.cpp:L148](../../SparkEditor/Source/SceneSystem/SceneSerializer.cpp#L148) | | | `SaveScene` | function | SparkEditor | [SceneSerializer.h:L84](../../SparkEditor/Source/SceneSystem/SceneSerializer.h#L84) | | -| `SaveScene` | function | SparkEngine | [SceneManager.h:L190](../../SparkEngine/Source/SceneManager/SceneManager.h#L190) | Serialize the current scene to the versioned text format. | -| `SaveSceneWithinRoot` | function | SparkEngine | [SceneManager.h:L212](../../SparkEngine/Source/SceneManager/SceneManager.h#L212) | | +| `SaveScene` | function | SparkEngine | [SceneManager.h:L192](../../SparkEngine/Source/SceneManager/SceneManager.h#L192) | Serialize the current scene to the versioned text format. | +| `SaveSceneWithinRoot` | function | SparkEngine | [SceneManager.h:L214](../../SparkEngine/Source/SceneManager/SceneManager.h#L214) | | | `SaveScreenshot` | function | SparkEngine | [GraphicsEngine.h:L699](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L699) | Save screenshot | -| `SaveScreenshot` | function | SparkEngine | [CrashHandler.cpp:L827](../../SparkEngine/Source/Utils/CrashHandler.cpp#L827) | | -| `SaveScreenshot` | function | SparkEngine | [CrashHandler.cpp:L1540](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1540) | | +| `SaveScreenshot` | function | SparkEngine | [CrashHandler.cpp:L828](../../SparkEngine/Source/Utils/CrashHandler.cpp#L828) | | +| `SaveScreenshot` | function | SparkEngine | [CrashHandler.cpp:L1541](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1541) | | | `SaveSelectionGroup` | function | SparkEditor | [SelectionManager.h:L461](../../SparkEditor/Source/Panels/SelectionManager.h#L461) | Save current selection as a named group | | `SaveSlot` | function | Tests | [TestMOD350RPGQuestSliceReal.cpp:L217](../../Tests/TestMOD350RPGQuestSliceReal.cpp#L217) | | | `SaveSlotInfo` | struct | SparkEditor | [SaveSystemPanel.h:L33](../../SparkEditor/Source/Panels/SaveSystemPanel.h#L33) | | @@ -39250,7 +39337,7 @@ | `SaveSystem` | function | SparkEngine | [EngineSettings.h:L1027](../../SparkEngine/Source/Core/EngineSettings.h#L1027) | | | `SaveSystem` | function | SparkEngine | [EngineSettings.h:L1028](../../SparkEngine/Source/Core/EngineSettings.h#L1028) | | | `SaveSystem` | class | SparkEngine | [SaveSystem.h:L471](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L471) | | -| `SaveSystem` | class | SparkSDK | [IEngineContext.h:L87](../../SparkSDK/Include/Spark/IEngineContext.h#L87) | | +| `SaveSystem` | class | SparkSDK | [IEngineContext.h:L88](../../SparkSDK/Include/Spark/IEngineContext.h#L88) | | | `SaveSystem::AutoSave` | method | SparkEngine | [SaveSystem.cpp:L1020](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.cpp#L1020) | | | `SaveSystem::Console_GetSaveInfo` | method | SparkEngine | [SaveSystem.cpp:L1828](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.cpp#L1828) | | | `SaveSystem::Console_ListSaves` | method | SparkEngine | [SaveSystem.cpp:L1815](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.cpp#L1815) | | @@ -39298,8 +39385,8 @@ | `SaveSystemSettings` | struct | SparkEngine | [EngineSettings.h:L782](../../SparkEngine/Source/Core/EngineSettings.h#L782) | | | `SaveSystemSettings` | struct | Tests | [TestEngineSettingsEdgeCases.cpp:L470](../../Tests/TestEngineSettingsEdgeCases.cpp#L470) | | | `SaveTerrain` | function | SparkEditor | [TerrainEditor.h:L34](../../SparkEditor/Source/Terrain/TerrainEditor.h#L34) | | -| `SaveTextWithinRoot` | function | SparkEngine | [SceneManager.cpp:L278](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L278) | | -| `SaveTextWithinRoot` | function | SparkEngine | [SceneManager.cpp:L409](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L409) | | +| `SaveTextWithinRoot` | function | SparkEngine | [SceneManager.cpp:L304](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L304) | | +| `SaveTextWithinRoot` | function | SparkEngine | [SceneManager.cpp:L453](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L453) | | | `SaveToCloud` | function | SparkEngine | [OnlineServices.h:L178](../../SparkEngine/Source/Engine/OnlineServices/OnlineServices.h#L178) | | | `SaveToCloud` | function | SparkEngine | [OnlineServices.h:L334](../../SparkEngine/Source/Engine/OnlineServices/OnlineServices.h#L334) | | | `SaveToCloud` | function | SparkEngine | [OnlineServices.h:L498](../../SparkEngine/Source/Engine/OnlineServices/OnlineServices.h#L498) | | @@ -39369,12 +39456,12 @@ | `ScatterLight` | function | SparkEngine | [FroxelVolumetricFog.h:L154](../../SparkEngine/Source/Graphics/FroxelVolumetricFog.h#L154) | Pass 2: Evaluate light scattering per froxel | | `ScatterSpec` | struct | GameModules | [TFRegionDecor.h:L140](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionDecor.h#L140) | | | `scenario` | function | Tests | [assets.cpp:L14](../../Tests/PackageSmoke/FPSProgression/assets.cpp#L14) | | -| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L467](../../Tests/TestEditorCookPackageReal.cpp#L467) | | -| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L474](../../Tests/TestEditorCookPackageReal.cpp#L474) | | -| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L484](../../Tests/TestEditorCookPackageReal.cpp#L484) | | -| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L501](../../Tests/TestEditorCookPackageReal.cpp#L501) | | -| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L515](../../Tests/TestEditorCookPackageReal.cpp#L515) | | -| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L527](../../Tests/TestEditorCookPackageReal.cpp#L527) | | +| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L478](../../Tests/TestEditorCookPackageReal.cpp#L478) | | +| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L485](../../Tests/TestEditorCookPackageReal.cpp#L485) | | +| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L495](../../Tests/TestEditorCookPackageReal.cpp#L495) | | +| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L525](../../Tests/TestEditorCookPackageReal.cpp#L525) | | +| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L540](../../Tests/TestEditorCookPackageReal.cpp#L540) | | +| `scenario` | function | Tests | [TestEditorCookPackageReal.cpp:L552](../../Tests/TestEditorCookPackageReal.cpp#L552) | | | `scene` | function | GameModules | [HeadlessArena.cpp:L39](../../GameModules/SparkGameFPS/Source/Core/HeadlessArena.cpp#L39) | | | `scene` | function | Tests | [TestAssetManifestReal.cpp:L259](../../Tests/TestAssetManifestReal.cpp#L259) | | | `scene` | function | Tests | [TestMOD310FPSSceneReloadRespawnReal.cpp:L73](../../Tests/TestMOD310FPSSceneReloadRespawnReal.cpp#L73) | | @@ -39385,8 +39472,9 @@ | `scene` | function | Tests | [TestRHI225D3D12ValidationReal.cpp:L308](../../Tests/TestRHI225D3D12ValidationReal.cpp#L308) | | | `scene` | function | Tests | [TestRHI225D3D12ValidationReal.cpp:L328](../../Tests/TestRHI225D3D12ValidationReal.cpp#L328) | | | `scene` | function | Tests | [TestRHI225D3D12ValidationReal.cpp:L362](../../Tests/TestRHI225D3D12ValidationReal.cpp#L362) | | -| `scene` | function | Tests | [TestSceneManagerReflectedReal.cpp:L71](../../Tests/TestSceneManagerReflectedReal.cpp#L71) | | -| `scene` | function | Tests | [TestSceneManagerReflectedReal.cpp:L103](../../Tests/TestSceneManagerReflectedReal.cpp#L103) | | +| `scene` | function | Tests | [TestSceneManagerReflectedReal.cpp:L96](../../Tests/TestSceneManagerReflectedReal.cpp#L96) | | +| `scene` | function | Tests | [TestSceneManagerReflectedReal.cpp:L128](../../Tests/TestSceneManagerReflectedReal.cpp#L128) | | +| `scene` | function | Tests | [TestSceneManagerReflectedReal.cpp:L160](../../Tests/TestSceneManagerReflectedReal.cpp#L160) | | | `scene` | function | Tests | [TestSceneManagerUnicodeReal.cpp:L90](../../Tests/TestSceneManagerUnicodeReal.cpp#L90) | | | `scene` | function | Tests | [TestSceneSaveConfinedReal.cpp:L117](../../Tests/TestSceneSaveConfinedReal.cpp#L117) | | | `scene` | function | Tests | [TestSceneSaveConfinedReal.cpp:L148](../../Tests/TestSceneSaveConfinedReal.cpp#L148) | | @@ -39447,39 +39535,39 @@ | `SceneManager` | class | GameModules | [GameMechanics.h:L28](../../GameModules/SparkGameFPS/Source/Game/GameMechanics.h#L28) | | | `SceneManager` | class | GameModules | [TFWorldSetup.h:L51](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetup.h#L51) | | | `SceneManager` | class | SparkEditor | [SceneManager.h:L29](../../SparkEditor/Source/SceneSystem/SceneManager.h#L29) | Scene management system | -| `SceneManager` | class | SparkEngine | [EngineContext.h:L44](../../SparkEngine/Source/Core/EngineContext.h#L44) | | +| `SceneManager` | class | SparkEngine | [EngineContext.h:L45](../../SparkEngine/Source/Core/EngineContext.h#L45) | | | `SceneManager` | class | SparkEngine | [SceneManager.h:L130](../../SparkEngine/Source/SceneManager/SceneManager.h#L130) | | -| `SceneManager` | class | SparkSDK | [IEngineContext.h:L27](../../SparkSDK/Include/Spark/IEngineContext.h#L27) | | +| `SceneManager` | class | SparkSDK | [IEngineContext.h:L28](../../SparkSDK/Include/Spark/IEngineContext.h#L28) | | | `SceneManager` | class | Tests | [TestSceneManager.cpp:L38](../../Tests/TestSceneManager.cpp#L38) | | -| `SceneManager::AddNode` | method | SparkEngine | [SceneManager.cpp:L714](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L714) | | -| `SceneManager::Clear` | method | SparkEngine | [SceneManager.cpp:L837](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L837) | | -| `SceneManager::Console_GetNodeInfo` | method | SparkEngine | [SceneManager.cpp:L1201](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1201) | | -| `SceneManager::Console_ListNodes` | method | SparkEngine | [SceneManager.cpp:L1182](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1182) | | -| `SceneManager::Console_MoveNode` | method | SparkEngine | [SceneManager.cpp:L1219](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1219) | | -| `SceneManager::Console_RenameNode` | method | SparkEngine | [SceneManager.cpp:L1229](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1229) | | +| `SceneManager::AddNode` | method | SparkEngine | [SceneManager.cpp:L788](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L788) | | +| `SceneManager::Clear` | method | SparkEngine | [SceneManager.cpp:L925](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L925) | | +| `SceneManager::Console_GetNodeInfo` | method | SparkEngine | [SceneManager.cpp:L1339](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1339) | | +| `SceneManager::Console_ListNodes` | method | SparkEngine | [SceneManager.cpp:L1318](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1318) | | +| `SceneManager::Console_MoveNode` | method | SparkEngine | [SceneManager.cpp:L1359](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1359) | | +| `SceneManager::Console_RenameNode` | method | SparkEngine | [SceneManager.cpp:L1371](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1371) | | | `SceneManager::CreateNewScene` | method | SparkEditor | [SceneManager.cpp:L40](../../SparkEditor/Source/SceneSystem/SceneManager.cpp#L40) | | -| `SceneManager::FindNode` | method | SparkEngine | [SceneManager.cpp:L816](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L816) | | -| `SceneManager::GetAvailableScenes` | method | SparkEngine | [SceneManager.cpp:L858](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L858) | | -| `SceneManager::GetNode` | method | SparkEngine | [SceneManager.cpp:L802](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L802) | | -| `SceneManager::GetNode` | method | SparkEngine | [SceneManager.cpp:L809](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L809) | | -| `SceneManager::GetObjects` | method | SparkEngine | [SceneManager.cpp:L500](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L500) | | -| `SceneManager::GetRootNodes` | method | SparkEngine | [SceneManager.cpp:L791](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L791) | | +| `SceneManager::FindNode` | method | SparkEngine | [SceneManager.cpp:L902](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L902) | | +| `SceneManager::GetAvailableScenes` | method | SparkEngine | [SceneManager.cpp:L946](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L946) | | +| `SceneManager::GetNode` | method | SparkEngine | [SceneManager.cpp:L884](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L884) | | +| `SceneManager::GetNode` | method | SparkEngine | [SceneManager.cpp:L893](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L893) | | +| `SceneManager::GetObjects` | method | SparkEngine | [SceneManager.cpp:L558](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L558) | | +| `SceneManager::GetRootNodes` | method | SparkEngine | [SceneManager.cpp:L871](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L871) | | | `SceneManager::Initialize` | method | SparkEditor | [SceneManager.cpp:L22](../../SparkEditor/Source/SceneSystem/SceneManager.cpp#L22) | | -| `SceneManager::InstantiateNodes` | method | SparkEngine | [SceneManager.cpp:L970](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L970) | | -| `SceneManager::LoadCustom` | method | SparkEngine | [SceneManager.cpp:L1076](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1076) | | -| `SceneManager::LoadJSON` | method | SparkEngine | [SceneManager.cpp:L884](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L884) | | -| `SceneManager::LoadReflected` | method | SparkEngine | [SceneManagerReflected.cpp:L16](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L16) | | +| `SceneManager::InstantiateNodes` | method | SparkEngine | [SceneManager.cpp:L1072](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1072) | | +| `SceneManager::LoadCustom` | method | SparkEngine | [SceneManager.cpp:L1192](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1192) | | +| `SceneManager::LoadJSON` | method | SparkEngine | [SceneManager.cpp:L976](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L976) | | +| `SceneManager::LoadReflected` | method | SparkEngine | [SceneManagerReflected.cpp:L18](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L18) | | | `SceneManager::LoadScene` | method | SparkEditor | [SceneManager.cpp:L126](../../SparkEditor/Source/SceneSystem/SceneManager.cpp#L126) | | -| `SceneManager::LoadScene` | method | SparkEngine | [SceneManager.cpp:L509](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L509) | | -| `SceneManager::LoadSceneAsync` | method | SparkEngine | [SceneManager.cpp:L683](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L683) | | -| `SceneManager::NewScene` | method | SparkEngine | [SceneManager.cpp:L829](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L829) | | -| `SceneManager::RemoveNode` | method | SparkEngine | [SceneManager.cpp:L737](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L737) | | -| `SceneManager::SaveJSON` | method | SparkEngine | [SceneManager.cpp:L939](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L939) | | +| `SceneManager::LoadScene` | method | SparkEngine | [SceneManager.cpp:L567](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L567) | | +| `SceneManager::LoadSceneAsync` | method | SparkEngine | [SceneManager.cpp:L755](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L755) | | +| `SceneManager::NewScene` | method | SparkEngine | [SceneManager.cpp:L917](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L917) | | +| `SceneManager::RemoveNode` | method | SparkEngine | [SceneManager.cpp:L811](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L811) | | +| `SceneManager::SaveJSON` | method | SparkEngine | [SceneManager.cpp:L1037](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1037) | | | `SceneManager::SaveScene` | method | SparkEditor | [SceneManager.cpp:L150](../../SparkEditor/Source/SceneSystem/SceneManager.cpp#L150) | | -| `SceneManager::SaveScene` | method | SparkEngine | [SceneManager.cpp:L624](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L624) | | -| `SceneManager::SaveSceneWithinRoot` | method | SparkEngine | [SceneManager.cpp:L639](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L639) | | -| `SceneManager::SerializeSceneText` | method | SparkEngine | [SceneManager.cpp:L929](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L929) | | -| `SceneManager::SetParent` | method | SparkEngine | [SceneManager.cpp:L766](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L766) | | +| `SceneManager::SaveScene` | method | SparkEngine | [SceneManager.cpp:L692](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L692) | | +| `SceneManager::SaveSceneWithinRoot` | method | SparkEngine | [SceneManager.cpp:L707](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L707) | | +| `SceneManager::SerializeSceneText` | method | SparkEngine | [SceneManager.cpp:L1027](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L1027) | | +| `SceneManager::SetParent` | method | SparkEngine | [SceneManager.cpp:L844](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L844) | | | `SceneManager::Shutdown` | method | SparkEditor | [SceneManager.cpp:L33](../../SparkEditor/Source/SceneSystem/SceneManager.cpp#L33) | | | `SceneManager::Update` | method | SparkEditor | [SceneManager.cpp:L31](../../SparkEditor/Source/SceneSystem/SceneManager.cpp#L31) | | | `SceneManifest` | struct | SparkEngine | [SceneManifest.h:L51](../../SparkEngine/Source/Engine/Streaming/SceneManifest.h#L51) | Asset manifest describing all resources needed for a scene/area | @@ -39502,7 +39590,7 @@ | `ScenePackageFixture` | struct | Tests | [TestEditorSubsystems.cpp:L2405](../../Tests/TestEditorSubsystems.cpp#L2405) | | | `ScenePackageFixture` | function | Tests | [TestEditorSubsystems.cpp:L2413](../../Tests/TestEditorSubsystems.cpp#L2413) | | | `ScenePath` | function | Tests | [TestEditorAssetDropWorldReal.cpp:L179](../../Tests/TestEditorAssetDropWorldReal.cpp#L179) | | -| `scenePathUtf8` | function | GameModules | [GameConsoleOps.cpp:L490](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L490) | | +| `scenePathUtf8` | function | GameModules | [GameConsoleOps.cpp:L498](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L498) | | | `ScenePhysicsOverrides` | struct | SparkEngine | [SceneConfigDatabase.h:L39](../../SparkEngine/Source/SceneManager/SceneConfigDatabase.h#L39) | Physics setting overrides for a specific scene. | | `SceneReferenceValidator` | class | SparkEngine | [AssetValidator.h:L61](../../SparkEngine/Source/Core/AssetValidator.h#L61) | | | `SceneReferenceValidator::GetRuleName` | method | SparkEngine | [AssetValidator.cpp:L113](../../SparkEngine/Source/Core/AssetValidator.cpp#L113) | | @@ -39622,7 +39710,7 @@ | `ScopedClearedEnvironmentVariable` | function | Tests | [TestCrashHandlerGatingReal.cpp:L100](../../Tests/TestCrashHandlerGatingReal.cpp#L100) | | | `ScopedComInitialization` | class | Tests | [TestFileUtils.cpp:L85](../../Tests/TestFileUtils.cpp#L85) | | | `ScopedContext` | class | SparkEngine | [SparkError.h:L179](../../SparkEngine/Source/Utils/SparkError.h#L179) | | -| `ScopedContextWorld` | class | Tests | [TestEditorSubsystemsReal.cpp:L294](../../Tests/TestEditorSubsystemsReal.cpp#L294) | | +| `ScopedContextWorld` | class | Tests | [TestEditorSubsystemsReal.cpp:L317](../../Tests/TestEditorSubsystemsReal.cpp#L317) | | | `ScopedContradictInfoSdk` | class | Tests | [TestModuleABIDiagnostics.cpp:L137](../../Tests/TestModuleABIDiagnostics.cpp#L137) | Makes the compatible fixture contradict its descriptor for one scope. | | `ScopedCpuSection` | class | SparkEngine | [CpuDebugger.h:L402](../../SparkEngine/Source/Utils/CpuDebugger.h#L402) | RAII scope guard for automatic CPU section timing | | `ScopedCrashSignalDispositions` | class | Tests | [TestCrashHandlerGatingReal.cpp:L182](../../Tests/TestCrashHandlerGatingReal.cpp#L182) | | @@ -39668,7 +39756,7 @@ | `ScopedHandle` | function | SparkEngine | [HeldHandles.h:L41](../../SparkEngine/Source/Engine/Modding/HeldHandles.h#L41) | | | `ScopedHandle` | function | SparkEngine | [HeldHandles.h:L117](../../SparkEngine/Source/Engine/Modding/HeldHandles.h#L117) | | | `ScopedHandle` | function | SparkEngine | [HeldHandles.h:L124](../../SparkEngine/Source/Engine/Modding/HeldHandles.h#L124) | | -| `ScopedHostConsoleBinding` | struct | Tests | [TestFPSMultiplayer.cpp:L1390](../../Tests/TestFPSMultiplayer.cpp#L1390) | | +| `ScopedHostConsoleBinding` | struct | Tests | [TestFPSMultiplayer.cpp:L1401](../../Tests/TestFPSMultiplayer.cpp#L1401) | | | `ScopedImageCom` | class | SparkEngine | [AssetTypesWindowsMedia.cpp:L131](../../SparkEngine/Source/Graphics/AssetTypesWindowsMedia.cpp#L131) | | | `ScopedInjectedContext` | class | Tests | [TestEditorPanelsRealBackends.cpp:L83](../../Tests/TestEditorPanelsRealBackends.cpp#L83) | Installs an injected EngineContext for one scope and clears it on exit. | | `ScopedInjectedContext` | function | Tests | [TestEditorPanelsRealBackends.cpp:L86](../../Tests/TestEditorPanelsRealBackends.cpp#L86) | Installs an injected EngineContext for one scope and clears it on exit. | @@ -39700,8 +39788,8 @@ | `ScopedNoGPUBackends` | class | Tests | [TestD3D11DeviceContractsReal.cpp:L47](../../Tests/TestD3D11DeviceContractsReal.cpp#L47) | | | `ScopedPathPrefix` | class | SparkInstaller | [InstallerTransactionTests.cpp:L300](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L300) | | | `ScopedPathPrefix` | function | SparkInstaller | [InstallerTransactionTests.cpp:L303](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L303) | | -| `ScopedPathVariable` | class | SparkBuild | [ProcessRunnerTests.cpp:L560](../../SparkBuild/tests/ProcessRunnerTests.cpp#L560) | | -| `ScopedPathVariable` | function | SparkBuild | [ProcessRunnerTests.cpp:L563](../../SparkBuild/tests/ProcessRunnerTests.cpp#L563) | | +| `ScopedPathVariable` | class | SparkBuild | [ProcessRunnerTests.cpp:L553](../../SparkBuild/tests/ProcessRunnerTests.cpp#L553) | | +| `ScopedPathVariable` | function | SparkBuild | [ProcessRunnerTests.cpp:L556](../../SparkBuild/tests/ProcessRunnerTests.cpp#L556) | | | `ScopedProfileTimer` | class | SparkEngine | [Profiler.h:L153](../../SparkEngine/Source/Utils/Profiler.h#L153) | Scoped CPU timer - automatically records start/end | | `ScopedRecoveryDirectory` | class | Tests | [TestEditorRecovery.cpp:L19](../../Tests/TestEditorRecovery.cpp#L19) | | | `ScopedRegistrationOwner` | class | SparkEngine | [NetworkManager.h:L633](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L633) | | @@ -39785,20 +39873,30 @@ | `scratch` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L191](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L191) | | | `scratch` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L211](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L211) | | | `scratch` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L260](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L260) | | -| `scratch` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L566](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L566) | | +| `scratch` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L568](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L568) | | | `scratch` | function | Tests | [TestEditorStateCompatibility.cpp:L145](../../Tests/TestEditorStateCompatibility.cpp#L145) | | | `scratch` | function | Tests | [TestEditorStateCompatibility.cpp:L177](../../Tests/TestEditorStateCompatibility.cpp#L177) | | | `scratch` | function | Tests | [TestEditorStateCompatibility.cpp:L206](../../Tests/TestEditorStateCompatibility.cpp#L206) | | | `scratch` | function | Tests | [TestEditorStateCompatibility.cpp:L233](../../Tests/TestEditorStateCompatibility.cpp#L233) | | | `scratch` | function | Tests | [TestEditorStateCompatibility.cpp:L271](../../Tests/TestEditorStateCompatibility.cpp#L271) | | | `scratch` | function | Tests | [TestEditorStateCompatibility.cpp:L383](../../Tests/TestEditorStateCompatibility.cpp#L383) | | -| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L113](../../Tests/TestEditorSubsystemsReal.cpp#L113) | | -| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L145](../../Tests/TestEditorSubsystemsReal.cpp#L145) | | -| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L163](../../Tests/TestEditorSubsystemsReal.cpp#L163) | | -| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L195](../../Tests/TestEditorSubsystemsReal.cpp#L195) | | -| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L225](../../Tests/TestEditorSubsystemsReal.cpp#L225) | | -| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L274](../../Tests/TestEditorSubsystemsReal.cpp#L274) | | -| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L561](../../Tests/TestEditorSubsystemsReal.cpp#L561) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L136](../../Tests/TestEditorSubsystemsReal.cpp#L136) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L168](../../Tests/TestEditorSubsystemsReal.cpp#L168) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L186](../../Tests/TestEditorSubsystemsReal.cpp#L186) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L218](../../Tests/TestEditorSubsystemsReal.cpp#L218) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L248](../../Tests/TestEditorSubsystemsReal.cpp#L248) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L297](../../Tests/TestEditorSubsystemsReal.cpp#L297) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L584](../../Tests/TestEditorSubsystemsReal.cpp#L584) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L635](../../Tests/TestEditorSubsystemsReal.cpp#L635) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L649](../../Tests/TestEditorSubsystemsReal.cpp#L649) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L662](../../Tests/TestEditorSubsystemsReal.cpp#L662) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L675](../../Tests/TestEditorSubsystemsReal.cpp#L675) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L690](../../Tests/TestEditorSubsystemsReal.cpp#L690) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L737](../../Tests/TestEditorSubsystemsReal.cpp#L737) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L750](../../Tests/TestEditorSubsystemsReal.cpp#L750) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L773](../../Tests/TestEditorSubsystemsReal.cpp#L773) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L808](../../Tests/TestEditorSubsystemsReal.cpp#L808) | | +| `scratch` | function | Tests | [TestEditorSubsystemsReal.cpp:L829](../../Tests/TestEditorSubsystemsReal.cpp#L829) | | | `Scratch` | class | Tests | [TestEditorUntrustedProject.cpp:L36](../../Tests/TestEditorUntrustedProject.cpp#L36) | | | `Scratch` | function | Tests | [TestEditorUntrustedProject.cpp:L39](../../Tests/TestEditorUntrustedProject.cpp#L39) | | | `scratch` | function | Tests | [TestEditorUntrustedProject.cpp:L132](../../Tests/TestEditorUntrustedProject.cpp#L132) | | @@ -39806,6 +39904,7 @@ | `scratch` | function | Tests | [TestEditorUntrustedProject.cpp:L177](../../Tests/TestEditorUntrustedProject.cpp#L177) | | | `scratch` | function | Tests | [TestEditorUntrustedProject.cpp:L200](../../Tests/TestEditorUntrustedProject.cpp#L200) | | | `scratch` | function | Tests | [TestEditorUntrustedProject.cpp:L231](../../Tests/TestEditorUntrustedProject.cpp#L231) | | +| `scratch` | function | Tests | [TestFPSOwnedSaveDecode.cpp:L97](../../Tests/TestFPSOwnedSaveDecode.cpp#L97) | | | `scratch` | function | Tests | [TestFilesystemLinks.cpp:L193](../../Tests/TestFilesystemLinks.cpp#L193) | | | `scratch` | function | Tests | [TestFilesystemLinks.cpp:L229](../../Tests/TestFilesystemLinks.cpp#L229) | | | `scratch` | function | Tests | [TestGoldenImageTest.cpp:L381](../../Tests/TestGoldenImageTest.cpp#L381) | | @@ -39853,8 +39952,8 @@ | `scratch` | function | Tests | [TestSerializationHardening.cpp:L422](../../Tests/TestSerializationHardening.cpp#L422) | | | `ScratchCrashDir` | class | Tests | [TestEditorCrashHandlerFilterReal.cpp:L41](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L41) | Unique scratch directory removed on scope exit. | | `ScratchCrashDir` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L44](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L44) | Unique scratch directory removed on scope exit. | -| `ScratchDir` | class | Tests | [TestEditorSubsystemsReal.cpp:L39](../../Tests/TestEditorSubsystemsReal.cpp#L39) | Unique scratch directory for one test, removed by the destructor. | -| `ScratchDir` | function | Tests | [TestEditorSubsystemsReal.cpp:L42](../../Tests/TestEditorSubsystemsReal.cpp#L42) | Unique scratch directory for one test, removed by the destructor. | +| `ScratchDir` | class | Tests | [TestEditorSubsystemsReal.cpp:L42](../../Tests/TestEditorSubsystemsReal.cpp#L42) | Unique scratch directory for one test, removed by the destructor. | +| `ScratchDir` | function | Tests | [TestEditorSubsystemsReal.cpp:L45](../../Tests/TestEditorSubsystemsReal.cpp#L45) | Unique scratch directory for one test, removed by the destructor. | | `ScratchDir` | struct | Tests | [TestSEC3GameplayHardening.cpp:L50](../../Tests/TestSEC3GameplayHardening.cpp#L50) | | | `ScratchDir` | function | Tests | [TestSEC3GameplayHardening.cpp:L54](../../Tests/TestSEC3GameplayHardening.cpp#L54) | | | `ScratchDirectory` | class | SparkCooker | [main.cpp:L41](../../SparkCooker/src/main.cpp#L41) | | @@ -40087,7 +40186,7 @@ | `SealWith` | function | Tests | [SecureTestPeer.cpp:L477](../../Tests/Fixtures/SecureTestPeer.cpp#L477) | | | `SealWith` | function | Tests | [SecureTestPeer.cpp:L574](../../Tests/Fixtures/SecureTestPeer.cpp#L574) | | | `SeamlessAreaManager` | class | SparkEngine | [SeamlessAreaManager.h:L77](../../SparkEngine/Source/Engine/Streaming/SeamlessAreaManager.h#L77) | | -| `SeamlessAreaManager` | class | SparkSDK | [IEngineContext.h:L69](../../SparkSDK/Include/Spark/IEngineContext.h#L69) | | +| `SeamlessAreaManager` | class | SparkSDK | [IEngineContext.h:L70](../../SparkSDK/Include/Spark/IEngineContext.h#L70) | | | `SeamlessAreaManager` | class | Tests | [TestSeamlessAreaManager.cpp:L63](../../Tests/TestSeamlessAreaManager.cpp#L63) | | | `SeamlessAreaManager::Console_GetStatus` | method | SparkEngine | [SeamlessAreaManager.cpp:L232](../../SparkEngine/Source/Engine/Streaming/SeamlessAreaManager.cpp#L232) | | | `SeamlessAreaManager::DirectionalEffectiveDistance` | method | SparkEngine | [SeamlessAreaManagerStreaming.cpp:L80](../../SparkEngine/Source/Engine/Streaming/SeamlessAreaManagerStreaming.cpp#L80) | | @@ -40161,7 +40260,7 @@ | `second` | function | Tests | [TestEditorSubsystems.cpp:L832](../../Tests/TestEditorSubsystems.cpp#L832) | | | `second` | function | Tests | [TestGatewayAreaControl.cpp:L1187](../../Tests/TestGatewayAreaControl.cpp#L1187) | | | `second` | function | Tests | [TestServiceTopologyController.cpp:L211](../../Tests/TestServiceTopologyController.cpp#L211) | | -| `second` | function | Tests | [TestSparkPak.cpp:L678](../../Tests/TestSparkPak.cpp#L678) | | +| `second` | function | Tests | [TestSparkPak.cpp:L694](../../Tests/TestSparkPak.cpp#L694) | | | `second` | function | Tests | [Test_scripting_hardening.cpp:L329](../../Tests/harden/Test_scripting_hardening.cpp#L329) | | | `secondClient` | function | Tests | [TestGatewayAreaControl.cpp:L285](../../Tests/TestGatewayAreaControl.cpp#L285) | | | `secondInitializer` | function | Tests | [TestMemoryIntegrity.cpp:L477](../../Tests/TestMemoryIntegrity.cpp#L477) | | @@ -40171,7 +40270,7 @@ | `secret` | function | Tests | [TestSecureTransportWired.cpp:L580](../../Tests/TestSecureTransportWired.cpp#L580) | | | `secret` | function | Tests | [TestSecurityParsersReal.cpp:L428](../../Tests/TestSecurityParsersReal.cpp#L428) | | | `secret` | function | Tests | [TestSecurityParsersReal.cpp:L474](../../Tests/TestSecurityParsersReal.cpp#L474) | | -| `section` | function | SparkEngine | [CrashHandler.cpp:L2766](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2766) | | +| `section` | function | SparkEngine | [CrashHandler.cpp:L2812](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2812) | | | `section` | function | Tests | [TestDebugUtilities.cpp:L91](../../Tests/TestDebugUtilities.cpp#L91) | | | `SectionData` | struct | SparkEngine | [CpuDebugger.h:L321](../../SparkEngine/Source/Utils/CpuDebugger.h#L321) | | | `SectionTimerFixed` | class | Tests | [Test_core_hardening.cpp:L95](../../Tests/harden/Test_core_hardening.cpp#L95) | | @@ -40229,7 +40328,7 @@ | `SeedOutfitStore` | function | Tests | [TestDATA120BackupRestore.cpp:L766](../../Tests/TestDATA120BackupRestore.cpp#L766) | | | `SeedPredictionAt` | function | GameModules | [TFClientNet.h:L197](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L197) | | | `SeedQuadMeshData` | function | Tests | [TestProcessDrawListLinux.cpp:L84](../../Tests/TestProcessDrawListLinux.cpp#L84) | | -| `SeedTraveller` | function | Tests | [TestTF120Travel.cpp:L296](../../Tests/TestTF120Travel.cpp#L296) | | +| `SeedTraveller` | function | Tests | [TestTF120Travel.cpp:L283](../../Tests/TestTF120Travel.cpp#L283) | | | `Seek` | function | SparkEngine | [SteeringBehaviors.h:L126](../../SparkEngine/Source/Engine/AI/SteeringBehaviors.h#L126) | | | `Seek` | function | SparkEngine | [SteeringBehaviors.h:L207](../../SparkEngine/Source/Engine/AI/SteeringBehaviors.h#L207) | | | `Seek` | function | SparkEngine | [VideoPlayer.h:L207](../../SparkEngine/Source/Engine/Cinematic/VideoPlayer.h#L207) | Seek to a specific time | @@ -40400,7 +40499,7 @@ | `SendRegionState` | function | GameModules | [TFRegionSystem.h:L178](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.h#L178) | | | `SendRegister` | function | GameModules | [TFLoginFlow.h:L149](../../GameModules/SparkGameMMOFPS/Source/UI/TFLoginFlow.h#L149) | | | `SendRep` | function | GameModules | [TFDeployableSystem.h:L213](../../GameModules/SparkGameMMOFPS/Source/Game/TFDeployableSystem.h#L213) | | -| `SendRep` | function | GameModules | [TFReplication.h:L101](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L101) | | +| `SendRep` | function | GameModules | [TFReplication.h:L106](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L106) | | | `SendReply` | function | GameModules | [TFOutfitSystem.h:L227](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L227) | | | `SendRequest` | function | GameModules | [TFAbilitySystem.h:L192](../../GameModules/SparkGameMMOFPS/Source/Game/TFAbilitySystem.h#L192) | | | `SendRequest` | function | GameModules | [TFOutfitSystem.h:L235](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L235) | | @@ -40484,11 +40583,11 @@ | `sentinel` | function | Tests | [TestPrefabPersistence.cpp:L113](../../Tests/TestPrefabPersistence.cpp#L113) | | | `SentinelBlob` | function | Tests | [TestSEC2RenderingHardeningReal.cpp:L77](../../Tests/TestSEC2RenderingHardeningReal.cpp#L77) | | | `SentinelMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L316](../../SparkBuild/tests/ProcessRunnerTests.cpp#L316) | | -| `SentinelMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L731](../../SparkBuild/tests/ProcessRunnerTests.cpp#L731) | | +| `SentinelMain` | function | SparkBuild | [ProcessRunnerTests.cpp:L722](../../SparkBuild/tests/ProcessRunnerTests.cpp#L722) | | | `sentinelSwitch` | function | Tests | [TestModuleABI.cpp:L905](../../Tests/TestModuleABI.cpp#L905) | | | `SentState` | alias | GameModules | [TFVehicleSystem.h:L148](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L148) | | | `SentState` | struct | GameModules | [TFVehicleSystemRecords.h:L165](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystemRecords.h#L165) | | -| `SentState` | struct | GameModules | [TFReplication.h:L79](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L79) | | +| `SentState` | struct | GameModules | [TFReplication.h:L83](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L83) | | | `Sep` | function | SparkEditor | [JSONSceneSerializer.cpp:L272](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L272) | | | `Separate` | function | GameModules | [RTSPersistenceCodec.cpp:L66](../../GameModules/SparkGameRTS/Source/Core/RTSPersistenceCodec.cpp#L66) | | | `Separation` | function | SparkEngine | [SteeringBehaviors.h:L398](../../SparkEngine/Source/Engine/AI/SteeringBehaviors.h#L398) | | @@ -40529,7 +40628,7 @@ | `SequenceNumber` | alias | Tests | [TestReliableChannel.cpp:L18](../../Tests/TestReliableChannel.cpp#L18) | | | `SequencePlayState` | enum | SparkEngine | [Sequencer.h:L54](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L54) | | | `SequencerManager` | class | SparkEngine | [Sequencer.h:L334](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L334) | | -| `SequencerManager` | class | SparkSDK | [IEngineContext.h:L51](../../SparkSDK/Include/Spark/IEngineContext.h#L51) | | +| `SequencerManager` | class | SparkSDK | [IEngineContext.h:L52](../../SparkSDK/Include/Spark/IEngineContext.h#L52) | | | `SequencerManager::ClearSequences` | method | SparkEngine | [Sequencer.cpp:L741](../../SparkEngine/Source/Engine/Cinematic/Sequencer.cpp#L741) | | | `SequencerManager::Console_GetSequenceInfo` | method | SparkEngine | [Sequencer.cpp:L843](../../SparkEngine/Source/Engine/Cinematic/Sequencer.cpp#L843) | | | `SequencerManager::Console_ListSequences` | method | SparkEngine | [Sequencer.cpp:L822](../../SparkEngine/Source/Engine/Cinematic/Sequencer.cpp#L822) | | @@ -40606,7 +40705,7 @@ | `SerializeRigidBody` | function | SparkEngine | [CoreComponentSerializersPhysicsAudio.cpp:L88](../../SparkEngine/Source/Engine/Editor/CoreComponentSerializersPhysicsAudio.cpp#L88) | | | `SerializerScope` | struct | Tests | [TestLIFE200ModuleReloadReal.cpp:L160](../../Tests/TestLIFE200ModuleReloadReal.cpp#L160) | | | `SerializerStateGuard` | struct | Tests | [TestModuleABI.cpp:L795](../../Tests/TestModuleABI.cpp#L795) | | -| `SerializeSceneText` | function | SparkEngine | [SceneManager.h:L520](../../SparkEngine/Source/SceneManager/SceneManager.h#L520) | Validate the live graph and render it as versioned scene text. | +| `SerializeSceneText` | function | SparkEngine | [SceneManager.h:L522](../../SparkEngine/Source/SceneManager/SceneManager.h#L522) | Validate the live graph and render it as versioned scene text. | | `SerializeSnapshot` | function | GameModules | [OWEngineSystems.h:L58](../../GameModules/SparkGameOpenWorld/Source/Core/OWEngineSystems.h#L58) | Deterministic text codec used by disk persistence and regression tests. | | `SerializeTagThroughRegistry` | function | Tests | [TestLIFE200ModuleReloadReal.cpp:L125](../../Tests/TestLIFE200ModuleReloadReal.cpp#L125) | | | `SerializeToBinary` | function | SparkEngine | [ReflectionSerializer.h:L129](../../SparkEngine/Source/Core/ReflectionSerializer.h#L129) | | @@ -40683,7 +40782,7 @@ | `ServerAccept` | function | GameModules | [TFSquadSystem.h:L221](../../GameModules/SparkGameMMOFPS/Source/Game/TFSquadSystem.h#L221) | | | `ServerActivate` | function | GameModules | [TFAbilitySystem.h:L182](../../GameModules/SparkGameMMOFPS/Source/Game/TFAbilitySystem.h#L182) | | | `ServerActivate` | function | GameModules | [TFAbilitySystemServer.cpp:L118](../../GameModules/SparkGameMMOFPS/Source/Game/TFAbilitySystemServer.cpp#L118) | | -| `ServerActive` | function | GameModules | [TFReplication.h:L95](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L95) | | +| `ServerActive` | function | GameModules | [TFReplication.h:L100](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L100) | | | `ServerAddOutfitScore` | function | GameModules | [TFOutfitSystem.h:L221](../../GameModules/SparkGameMMOFPS/Source/Game/TFOutfitSystem.h#L221) | | | `ServerAdoptHandoff` | function | GameModules | [TFTravelSystem.h:L147](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L147) | Keep a restored sanctuary checkpoint; discard the ordinary spawn-pad teleport queued by spawn. | | `ServerAdvancePhase` | function | GameModules | [TFAbilitySystem.h:L184](../../GameModules/SparkGameMMOFPS/Source/Game/TFAbilitySystem.h#L184) | | @@ -40709,14 +40808,14 @@ | `ServerBounce` | function | GameModules | [TFGrenadeSystem.h:L241](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L241) | | | `ServerBroadcast` | function | GameModules | [TFGrenadeSystem.h:L243](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L243) | | | `ServerBroadcastAim` | function | GameModules | [TFVehicleSystem.h:L228](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L228) | | -| `ServerBroadcastDestroy` | function | GameModules | [TFReplication.h:L99](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L99) | | +| `ServerBroadcastDestroy` | function | GameModules | [TFReplication.h:L104](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L104) | | | `ServerBroadcastImpactFx` | function | GameModules | [TFWeaponSystem.h:L228](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L228) | | | `ServerBroadcastInfo` | struct | SparkEngine | [DedicatedServer.h:L178](../../SparkEngine/Source/Engine/Networking/DedicatedServer.h#L178) | Information broadcast on LAN for server discovery | | `ServerBroadcastInfo` | struct | Tests | [TestDedicatedServer.cpp:L87](../../Tests/TestDedicatedServer.cpp#L87) | | | `ServerBroadcastRemoteFireFx` | function | GameModules | [TFWeaponSystem.h:L218](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L218) | | | `ServerBroadcastState` | function | GameModules | [TFAbilitySystem.h:L188](../../GameModules/SparkGameMMOFPS/Source/Game/TFAbilitySystem.h#L188) | | | `ServerBroadcastUpdates` | function | GameModules | [TFVehicleSystem.h:L224](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L224) | | -| `ServerBroadcastUpdates` | function | GameModules | [TFReplication.h:L98](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L98) | | +| `ServerBroadcastUpdates` | function | GameModules | [TFReplication.h:L103](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L103) | | | `ServerBuildContinentInfo` | function | GameModules | [TFTravelSystem.h:L160](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L160) | | | `ServerBuildProfile` | enum | SparkEditor | [DedicatedServerPanel.h:L56](../../SparkEditor/Source/Panels/DedicatedServerPanel.h#L56) | | | `ServerCallbacks` | struct | SparkEngine | [DedicatedServer.h:L115](../../SparkEngine/Source/Engine/Networking/DedicatedServer.h#L115) | Callbacks fired by the dedicated server during its lifecycle | @@ -40804,7 +40903,7 @@ | `ServerPollEnteredPlayers` | function | GameModules | [TFSocialSystem.h:L168](../../GameModules/SparkGameMMOFPS/Source/Game/TFSocialSystem.h#L168) | | | `ServerPollNewClients` | function | GameModules | [TFDeployableSystem.h:L209](../../GameModules/SparkGameMMOFPS/Source/Game/TFDeployableSystem.h#L209) | | | `ServerPollNewClients` | function | GameModules | [TFVehicleSystem.h:L223](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L223) | | -| `ServerPollNewClients` | function | GameModules | [TFReplication.h:L97](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L97) | | +| `ServerPollNewClients` | function | GameModules | [TFReplication.h:L102](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L102) | | | `ServerPollNewClients` | function | GameModules | [TFRegionSystem.h:L175](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.h#L175) | | | `ServerProjectile` | struct | GameModules | [TFWeaponSystem.h:L157](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L157) | | | `ServerPromote` | function | GameModules | [TFSquadSystem.h:L223](../../GameModules/SparkGameMMOFPS/Source/Game/TFSquadSystem.h#L223) | | @@ -40936,7 +41035,7 @@ | `SessionState` | enum | SparkEngine | [RemoteDebugSystem.h:L59](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugSystem.h#L59) | Connection lifecycle states | | `SessionState` | enum | SparkGateway | [GatewayCoordinator.h:L110](../../SparkGateway/src/GatewayCoordinator.h#L110) | | | `SessionStats` | struct | SparkEditor | [CollaborativeEditSession.h:L370](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L370) | | -| `Set` | function | SparkBuild | [ProcessRunnerTests.cpp:L595](../../SparkBuild/tests/ProcessRunnerTests.cpp#L595) | | +| `Set` | function | SparkBuild | [ProcessRunnerTests.cpp:L588](../../SparkBuild/tests/ProcessRunnerTests.cpp#L588) | | | `Set` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L88](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L88) | | | `Set` | function | SparkCrashReporter | [CrashReporterManifestTests.cpp:L93](../../SparkCrashReporter/tests/CrashReporterManifestTests.cpp#L93) | | | `Set` | function | SparkEngine | [ModuleManager.cpp:L332](../../SparkEngine/Source/Core/ModuleManager.cpp#L332) | | @@ -40960,7 +41059,7 @@ | `Set3DEnabled` | function | SparkEngine | [XAudio2AudioBackend.h:L69](../../SparkEngine/Source/Audio/XAudio2AudioBackend.h#L69) | | | `Set3DEnabled` | function | Tests | [TestSequencerAudioWiring.cpp:L61](../../Tests/TestSequencerAudioWiring.cpp#L61) | | | `setA` | function | Tests | [TestAnimationSystem.cpp:L868](../../Tests/TestAnimationSystem.cpp#L868) | | -| `SetAbilities` | function | SparkEngine | [EngineContext.h:L325](../../SparkEngine/Source/Core/EngineContext.h#L325) | | +| `SetAbilities` | function | SparkEngine | [EngineContext.h:L328](../../SparkEngine/Source/Core/EngineContext.h#L328) | | | `SetAbilitySeamPresent` | function | GameModules | [TFChaosHarness.h:L82](../../GameModules/SparkGameMMOFPS/Source/Game/TFChaosHarness.h#L82) | | | `SetAccessibility` | function | SparkEngine | [InputBindings.h:L187](../../SparkEngine/Source/Input/InputBindings.h#L187) | Set accessibility flags. | | `SetAccountStatus` | function | GameModules | [MMOAccountSystem.h:L135](../../GameModules/SparkGameMMO/Source/Account/MMOAccountSystem.h#L135) | | @@ -40983,7 +41082,7 @@ | `SetActiveVariant` | function | Tests | [TestMaterialSystemValidation.cpp:L156](../../Tests/TestMaterialSystemValidation.cpp#L156) | | | `SetAdamConfig` | function | SparkEngine | [NeuralFunctionApproximator.h:L107](../../SparkEngine/Source/Graphics/Neural/NeuralFunctionApproximator.h#L107) | Override the Adam optimizer config used by training calls. | | `SetAdvancedProperties` | function | SparkEngine | [MaterialSystem.h:L238](../../SparkEngine/Source/Graphics/MaterialSystem.h#L238) | | -| `SetAI` | function | SparkEngine | [EngineContext.h:L304](../../SparkEngine/Source/Core/EngineContext.h#L304) | | +| `SetAI` | function | SparkEngine | [EngineContext.h:L307](../../SparkEngine/Source/Core/EngineContext.h#L307) | | | `SetAlbedoGuide` | function | SparkEngine | [DenoiserInterface.h:L100](../../SparkEngine/Source/Graphics/DenoiserInterface.h#L100) | | | `SetAlbedoGuide` | function | SparkEngine | [DenoiserInterface.h:L145](../../SparkEngine/Source/Graphics/DenoiserInterface.h#L145) | | | `SetAlbedoGuide` | function | SparkEngine | [NeuralPostProcessing.h:L62](../../SparkEngine/Source/Graphics/Neural/NeuralPostProcessing.h#L62) | | @@ -40998,27 +41097,27 @@ | `SetAnchor` | function | SparkEngine | [UISystem.h:L148](../../SparkEngine/Source/Engine/UI/UISystem.h#L148) | Set anchor point. | | `SetAngularVelocity` | function | SparkEngine | [JoltPhysicsInterface.h:L292](../../SparkEngine/Source/Engine/Physics/JoltPhysicsInterface.h#L292) | | | `SetAngularVelocity` | function | SparkEngine | [PhysicsBody.h:L87](../../SparkEngine/Source/Physics/PhysicsBody.h#L87) | | -| `SetAnimation` | function | SparkEngine | [EngineContext.h:L303](../../SparkEngine/Source/Core/EngineContext.h#L303) | | +| `SetAnimation` | function | SparkEngine | [EngineContext.h:L306](../../SparkEngine/Source/Core/EngineContext.h#L306) | | | `SetAreaLoad` | function | Tests | [TestWorldServerRouting.cpp:L283](../../Tests/TestWorldServerRouting.cpp#L283) | | | `SetAreaOnline` | function | SparkEngine | [WorldServer.h:L181](../../SparkEngine/Source/Engine/Networking/WorldServer.h#L181) | Run a single world server tick (for external driving) | | `SetAreaOnline` | function | Tests | [TestWorldServerRouting.cpp:L289](../../Tests/TestWorldServerRouting.cpp#L289) | | | `SetAreaResolver` | function | GameModules | [MMOPlayerSystem.h:L117](../../GameModules/SparkGameMMO/Source/Player/MMOPlayerSystem.h#L117) | | -| `SetAreaStreaming` | function | SparkEngine | [EngineContext.h:L333](../../SparkEngine/Source/Core/EngineContext.h#L333) | | +| `SetAreaStreaming` | function | SparkEngine | [EngineContext.h:L336](../../SparkEngine/Source/Core/EngineContext.h#L336) | | | `SetAreaTransitionCallback` | function | GameModules | [MMOPlayerSystem.h:L118](../../GameModules/SparkGameMMO/Source/Player/MMOPlayerSystem.h#L118) | | | `SetArenaAutopilot` | function | GameModules | [Game.h:L492](../../GameModules/SparkGameFPS/Source/Game/Game.h#L492) | Start or stop the arena autopilot (developer command `fps_autoplay`). | | `SetArgumentBuffer` | function | SparkEngine | [MetalDevice.h:L405](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L405) | | | `SetAssertCallback` | function | SparkEditor | [EditorCrashHandler.h:L72](../../SparkEditor/Source/Core/EditorCrashHandler.h#L72) | | -| `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandler.cpp:L1025](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1025) | | -| `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandler.cpp:L2805](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2805) | | -| `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandler.cpp:L2853](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2853) | | +| `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandler.cpp:L1026](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1026) | | +| `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandler.cpp:L2851](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2851) | | +| `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandler.cpp:L2899](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2899) | | | `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandler.h:L132](../../SparkEngine/Source/Utils/CrashHandler.h#L132) | Toggle whether assertion failures generate crash reports at runtime | | `SetAssertCrashBehavior` | function | SparkEngine | [CrashHandlerStub.cpp:L31](../../SparkEngine/Source/Utils/CrashHandlerStub.cpp#L31) | | | `SetAssetChangedCallback` | function | SparkEditor | [SparkEngineIntegration.h:L490](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L490) | Set asset changed callback | -| `SetAssetPipeline` | function | SparkEngine | [EngineContext.h:L312](../../SparkEngine/Source/Core/EngineContext.h#L312) | | -| `SetAssetRegistry` | function | SparkEngine | [EngineContext.h:L316](../../SparkEngine/Source/Core/EngineContext.h#L316) | | +| `SetAssetPipeline` | function | SparkEngine | [EngineContext.h:L315](../../SparkEngine/Source/Core/EngineContext.h#L315) | | +| `SetAssetRegistry` | function | SparkEngine | [EngineContext.h:L319](../../SparkEngine/Source/Core/EngineContext.h#L319) | | | `SetAssetRoot` | function | SparkEditor | [SearchPanel.h:L85](../../SparkEditor/Source/Panels/SearchPanel.h#L85) | Directory searched for asset results (empty = no project asset root). | | `SetAttenuation` | function | SparkEngine | [LightingSystem.h:L119](../../SparkEngine/Source/Graphics/LightingSystem.h#L119) | | -| `SetAudio` | function | SparkEngine | [EngineContext.h:L301](../../SparkEngine/Source/Core/EngineContext.h#L301) | | +| `SetAudio` | function | SparkEngine | [EngineContext.h:L304](../../SparkEngine/Source/Core/EngineContext.h#L304) | | | `SetAudioBackend` | function | SparkEngine | [Sequencer.h:L366](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L366) | Attach the non-owning runtime audio service. | | `SetAudioCallback` | function | SparkEngine | [Sequencer.h:L291](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L291) | | | `SetAudioChannels` | function | SparkEngine | [DebugOverlay.h:L221](../../SparkEngine/Source/Utils/DebugOverlay.h#L221) | | @@ -41086,7 +41185,7 @@ | `SetCallbacks` | function | SparkEngine | [ModuleHotReload.h:L179](../../SparkEngine/Source/Engine/HotReload/ModuleHotReload.h#L179) | Set callbacks for the actual unload/reload operations | | `SetCallbacks` | function | SparkEngine | [DedicatedServer.h:L333](../../SparkEngine/Source/Engine/Networking/DedicatedServer.h#L333) | Capture an owned, internally consistent server statistics snapshot. | | `SetCallbacks` | function | SparkEngine | [RenderGraphBuilder.h:L260](../../SparkEngine/Source/Graphics/RenderGraph/RenderGraphBuilder.h#L260) | Register callbacks that perform the actual GPU work. | -| `SetCamera` | function | SparkEngine | [EngineContext.h:L329](../../SparkEngine/Source/Core/EngineContext.h#L329) | | +| `SetCamera` | function | SparkEngine | [EngineContext.h:L332](../../SparkEngine/Source/Core/EngineContext.h#L332) | | | `SetCameraMode` | function | SparkEngine | [PlayModeManager.h:L244](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L244) | | | `SetCameraPosition` | function | SparkEngine | [TerrainSystem.h:L39](../../SparkEngine/Source/Engine/ECS/Systems/TerrainSystem.h#L39) | | | `SetCameraPosition` | function | SparkEngine | [PostProcessingPipeline.h:L191](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L191) | Set the camera world position used by the volume manager. | @@ -41114,7 +41213,7 @@ | `SetCheatsEnabled` | function | SparkEngine | [ConsoleVariable.h:L217](../../SparkEngine/Source/Utils/ConsoleVariable.h#L217) | Check if cheats are enabled (controls Cheat-flagged cvars) | | `SetCheatsEnabled` | function | Tests | [TestConsoleVariables.cpp:L236](../../Tests/TestConsoleVariables.cpp#L236) | | | `SetCheckInterval` | function | SparkEngine | [MemoryMonitor.h:L153](../../SparkEngine/Source/Utils/MemoryMonitor.h#L153) | Set interval between full health checks (seconds) | -| `SetCinematic` | function | SparkEngine | [EngineContext.h:L327](../../SparkEngine/Source/Core/EngineContext.h#L327) | | +| `SetCinematic` | function | SparkEngine | [EngineContext.h:L330](../../SparkEngine/Source/Core/EngineContext.h#L330) | | | `SetCircuitPolicy` | function | SparkEngine | [OnlineServices.h:L1127](../../SparkEngine/Source/Engine/OnlineServices/OnlineServices.h#L1127) | Replace the circuit-breaker budget (defaults match the spec: 5 failures, 30 s) | | `SetClass` | function | GameModules | [Player.h:L308](../../GameModules/SparkGameFPS/Source/Game/Player.h#L308) | Set the player's class and apply class stats/loadout | | `SetClassSystem` | function | GameModules | [InteractiveObject.h:L192](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L192) | | @@ -41148,10 +41247,10 @@ | `SetColumns` | function | SparkEngine | [UILayoutExtensions.h:L70](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L70) | | | `SetCombatIntensity` | function | SparkEngine | [MusicManager.h:L253](../../SparkEngine/Source/Audio/MusicManager.h#L253) | | | `SetCompactMode` | function | SparkEngine | [DebugOverlay.h:L207](../../SparkEngine/Source/Utils/DebugOverlay.h#L207) | Toggle between compact (FPS only) and expanded modes | -| `SetComponentSerializers` | function | SparkEngine | [EngineContext.h:L340](../../SparkEngine/Source/Core/EngineContext.h#L340) | | +| `SetComponentSerializers` | function | SparkEngine | [EngineContext.h:L343](../../SparkEngine/Source/Core/EngineContext.h#L343) | | | `SetCompressionLevel` | function | SparkEditor | [SceneSerializer.h:L149](../../SparkEditor/Source/SceneSystem/SceneSerializer.h#L149) | Set compression level for binary format | | `SetComputePipelineState` | function | SparkEngine | [MetalDevice.h:L404](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L404) | | -| `SetConditions` | function | SparkEngine | [EngineContext.h:L331](../../SparkEngine/Source/Core/EngineContext.h#L331) | | +| `SetConditions` | function | SparkEngine | [EngineContext.h:L334](../../SparkEngine/Source/Core/EngineContext.h#L334) | | | `SetConfig` | function | SparkEngine | [PlayModeManager.h:L300](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L300) | | | `SetConfig` | function | SparkEngine | [SeamlessAreaManager.h:L135](../../SparkEngine/Source/Engine/Streaming/SeamlessAreaManager.h#L135) | | | `SetConfig` | function | Tests | [TestSeamlessAreaManager.cpp:L108](../../Tests/TestSeamlessAreaManager.cpp#L108) | | @@ -41159,8 +41258,8 @@ | `SetConfiguration` | function | SparkEditor | [PerformanceProfiler.h:L255](../../SparkEditor/Source/Profiler/PerformanceProfiler.h#L255) | Set profiler configuration | | `SetConnected` | function | Tests | [TestGamepadInputProcessing.cpp:L127](../../Tests/TestGamepadInputProcessing.cpp#L127) | | | `SetConsent` | function | SparkEngine | [Telemetry.h:L697](../../SparkEngine/Source/Utils/Telemetry.h#L697) | Set user consent for telemetry collection. | -| `SetConsoleColor` | function | SparkConsole | [ConsoleApp.h:L104](../../SparkConsole/src/ConsoleApp.h#L104) | | -| `SetConsoleColor` | function | SparkConsole | [ConsoleApp.h:L106](../../SparkConsole/src/ConsoleApp.h#L106) | | +| `SetConsoleColor` | function | SparkConsole | [ConsoleApp.h:L105](../../SparkConsole/src/ConsoleApp.h#L105) | | +| `SetConsoleColor` | function | SparkConsole | [ConsoleApp.h:L107](../../SparkConsole/src/ConsoleApp.h#L107) | | | `SetConsoleMessageCallback` | function | SparkEditor | [SparkEngineIntegration.h:L508](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L508) | Set console message callback | | `SetConstantBuffer` | function | SparkEngine | [D3D11Device.h:L268](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L268) | | | `SetConstantBuffer` | function | SparkEngine | [D3D12Types.h:L704](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L704) | | @@ -41176,7 +41275,7 @@ | `SetContentSize` | function | SparkEngine | [UILayoutExtensions.h:L88](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L88) | | | `SetCooldown` | function | GameModules | [InteractiveObject.h:L294](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L294) | | | `SetCooldown` | function | Tests | [TestSelfRecovery.cpp:L145](../../Tests/TestSelfRecovery.cpp#L145) | | -| `SetCoroutineScheduler` | function | SparkEngine | [EngineContext.h:L314](../../SparkEngine/Source/Core/EngineContext.h#L314) | | +| `SetCoroutineScheduler` | function | SparkEngine | [EngineContext.h:L317](../../SparkEngine/Source/Core/EngineContext.h#L317) | | | `SetCrashCallback` | function | SparkEditor | [EditorCrashHandler.h:L71](../../SparkEditor/Source/Core/EditorCrashHandler.h#L71) | | | `SetCreateProjectRequestHandler` | function | SparkEditor | [ProjectBrowserPanel.h:L61](../../SparkEditor/Source/Panels/ProjectBrowserPanel.h#L61) | | | `SetCrosshairSpread` | function | GameModules | [HUDSystem.h:L325](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L325) | | @@ -41268,7 +41367,7 @@ | `SetDefaultFadeDuration` | function | SparkEngine | [DecalSystem.h:L144](../../SparkEngine/Source/Graphics/DecalSystem.h#L144) | | | `SetDefaultFadeTime` | function | SparkEngine | [DecalSystem.h:L143](../../SparkEngine/Source/Graphics/DecalSystem.h#L143) | | | `SetDefaultMaterial` | function | SparkEngine | [PhysicsSystem.h:L457](../../SparkEngine/Source/Physics/PhysicsSystem.h#L457) | | -| `SetDefaultPanelVisibility` | function | SparkEditor | [EditorUI.h:L514](../../SparkEditor/Source/Core/EditorUI.h#L514) | | +| `SetDefaultPanelVisibility` | function | SparkEditor | [EditorUI.h:L512](../../SparkEditor/Source/Core/EditorUI.h#L512) | | | `SetDefaultPermissions` | function | GameModules | [MMOGuildSystem.h:L115](../../GameModules/SparkGameMMO/Source/Guild/MMOGuildSystem.h#L115) | | | `SetDefaultState` | function | SparkEngine | [AnimationSystem.h:L125](../../SparkEngine/Source/Engine/Animation/AnimationSystem.h#L125) | Set the initial state entered when the machine first runs. | | `SetDefaultState` | function | Tests | [TestAnimationStress.cpp:L272](../../Tests/TestAnimationStress.cpp#L272) | | @@ -41286,7 +41385,7 @@ | `SetDescriptor` | function | SparkEngine | [D3D12Types.h:L411](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L411) | | | `SetDesiredIntensityRange` | function | SparkEngine | [AIDirector.h:L136](../../SparkEngine/Source/Engine/AI/AIDirector.h#L136) | Set the desired intensity range. | | `SetDestination` | function | GameModules | [InteractiveObject.h:L319](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L319) | | -| `SetDestruction` | function | SparkEngine | [EngineContext.h:L326](../../SparkEngine/Source/Core/EngineContext.h#L326) | | +| `SetDestruction` | function | SparkEngine | [EngineContext.h:L329](../../SparkEngine/Source/Core/EngineContext.h#L329) | | | `SetDestructionCallback` | function | GameModules | [VehicleSystem.h:L239](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L239) | Set destruction callback | | `SetDestructionSound` | function | SparkEngine | [DestructionSystem.h:L89](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L89) | Set the destruction sound effect. | | `SetDeterministicSimulation` | function | SparkEngine | [PhysicsSystem.h:L205](../../SparkEngine/Source/Physics/PhysicsSystem.h#L205) | | @@ -41296,7 +41395,7 @@ | `SetDevice` | function | SparkEngine | [PostProcessingPipeline.h:L307](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L307) | Set the D3D11 device and context for GPU execution | | `SetDevice` | function | SparkEngine | [TemporalEffects.h:L166](../../SparkEngine/Source/Graphics/TemporalEffects.h#L166) | Set D3D11 device and context for GPU execution | | `SetDeviceContext` | function | SparkEngine | [AsyncComputeScheduler.h:L130](../../SparkEngine/Source/Graphics/AsyncComputeScheduler.h#L130) | Set the D3D11 device context used for immediate dispatch. | -| `SetDialogue` | function | SparkEngine | [EngineContext.h:L320](../../SparkEngine/Source/Core/EngineContext.h#L320) | | +| `SetDialogue` | function | SparkEngine | [EngineContext.h:L323](../../SparkEngine/Source/Core/EngineContext.h#L323) | | | `SetDifficultyScale` | function | GameModules | [WaveSpawner.h:L122](../../GameModules/SparkGameFPS/Source/Game/WaveSpawner.h#L122) | | | `SetDirection` | function | SparkEngine | [UILayoutExtensions.h:L43](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L43) | | | `SetDirection` | function | SparkEngine | [LightingSystem.h:L94](../../SparkEngine/Source/Graphics/LightingSystem.h#L94) | | @@ -41379,7 +41478,7 @@ | `SetErrorCallback` | function | Tests | [TestScriptHotReload.cpp:L55](../../Tests/TestScriptHotReload.cpp#L55) | | | `SetEventBus` | function | GameModules | [Game.h:L349](../../GameModules/SparkGameFPS/Source/Game/Game.h#L349) | Connect the engine's event bus for cross-system communication | | `SetEventBus` | function | GameModules | [GameMechanics.h:L165](../../GameModules/SparkGameFPS/Source/Game/GameMechanics.h#L165) | Connect the engine event bus so respawns publish PlayerRespawnEvent. | -| `SetEventBus` | function | SparkEngine | [EngineContext.h:L300](../../SparkEngine/Source/Core/EngineContext.h#L300) | | +| `SetEventBus` | function | SparkEngine | [EngineContext.h:L303](../../SparkEngine/Source/Core/EngineContext.h#L303) | | | `SetEventBus` | function | SparkEngine | [WeatherSystem.h:L393](../../SparkEngine/Source/Graphics/WeatherSystem.h#L393) | Set an EventBus for publishing WeatherChangedEvent. | | `SetEventBus` | function | SparkEngine | [PhysicsSystem.h:L440](../../SparkEngine/Source/Physics/PhysicsSystem.h#L440) | | | `SetEventCallback` | function | SparkEngine | [Sequencer.h:L288](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L288) | | @@ -41407,10 +41506,10 @@ | `SetFieldFromString` | function | SparkEngine | [Reflection.h:L439](../../SparkEngine/Source/Core/Reflection.h#L439) | | | `SetFieldFromString` | function | Tests | [TestReflection.cpp:L328](../../Tests/TestReflection.cpp#L328) | | | `SetFileCache` | function | SparkEditor | [ProjectManager.h:L172](../../SparkEditor/Source/Core/ProjectManager.h#L172) | | -| `SetFileCache` | function | SparkEngine | [EngineContext.h:L315](../../SparkEngine/Source/Core/EngineContext.h#L315) | | +| `SetFileCache` | function | SparkEngine | [EngineContext.h:L318](../../SparkEngine/Source/Core/EngineContext.h#L318) | | | `SetFileCache` | function | SparkEngine | [SaveSystem.h:L815](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L815) | Set the file cache for save I/O (non-owning). | | `SetFileCache` | function | SparkEngine | [Shader.h:L364](../../SparkEngine/Source/Graphics/Shader.h#L364) | Set the file cache used for shader source loading | -| `SetFileCache` | function | SparkEngine | [SceneManager.h:L475](../../SparkEngine/Source/SceneManager/SceneManager.h#L475) | Set the file cache for scene I/O (non-owning). | +| `SetFileCache` | function | SparkEngine | [SceneManager.h:L477](../../SparkEngine/Source/SceneManager/SceneManager.h#L477) | Set the file cache for scene I/O (non-owning). | | `SetFileInformationByHandle` | function | SparkCrashReporter | [CrashReporterApp.cpp:L903](../../SparkCrashReporter/src/CrashReporterApp.cpp#L903) | | | `SetFilePath` | function | SparkEditor | [PrefabAsset.h:L93](../../SparkEditor/Source/Prefabs/PrefabAsset.h#L93) | Set the file path | | `SetFileSystemMonitoring` | function | SparkEditor | [AdvancedAssetPipeline.h:L368](../../SparkEditor/Source/AssetPipeline/AdvancedAssetPipeline.h#L368) | Enable/disable file system monitoring | @@ -41463,7 +41562,7 @@ | `SetFromString` | function | Tests | [TestConsoleVariables.cpp:L64](../../Tests/TestConsoleVariables.cpp#L64) | | | `SetFromString` | function | Tests | [TestConsoleVariables.cpp:L153](../../Tests/TestConsoleVariables.cpp#L153) | | | `SetGameModuleSelector` | function | SparkEditor | [PlayControlPanel.h:L57](../../SparkEditor/Source/Panels/PlayControlPanel.h#L57) | Wire the Game Module Selector panel so the play bar launches | -| `SetGameplayTagService` | function | SparkEngine | [EngineContext.h:L308](../../SparkEngine/Source/Core/EngineContext.h#L308) | | +| `SetGameplayTagService` | function | SparkEngine | [EngineContext.h:L311](../../SparkEngine/Source/Core/EngineContext.h#L311) | | | `SetGenerator` | function | SparkEngine | [MovementSystem.h:L344](../../SparkEngine/Source/Engine/AI/MovementSystem.h#L344) | Place a generator into its declared slot, replacing any existing one. | | `SetGenerator` | function | Tests | [TestMovementSystem.cpp:L138](../../Tests/TestMovementSystem.cpp#L138) | | | `SetGizmoMode` | function | SparkEditor | [SceneViewPanel.h:L136](../../SparkEditor/Source/Panels/SceneViewPanel.h#L136) | Select the active viewport transform tool. Cancels any in-flight drag | @@ -41478,11 +41577,11 @@ | `SetGlobalMaxRetries` | function | SparkEngine | [FaultIsolation.h:L73](../../SparkEngine/Source/Core/FaultIsolation.h#L73) | | | `SetGlobalMaxRetries` | function | Tests | [TestFaultIsolation.cpp:L75](../../Tests/TestFaultIsolation.cpp#L75) | | | `SetGlobalShadowQuality` | function | SparkEngine | [LightingSystem.h:L347](../../SparkEngine/Source/Graphics/LightingSystem.h#L347) | | -| `SetGraphics` | function | SparkEditor | [AssetBrowserPanel.h:L96](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L96) | Wire live basic-path cache invalidation after an import. | +| `SetGraphics` | function | SparkEditor | [AssetBrowserPanel.h:L106](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L106) | Wire live basic-path cache invalidation after an import. | | `SetGraphics` | function | SparkEditor | [BasicMaterialEditorPanel.h:L56](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L56) | Give the panel access to the editor's attach-mode GraphicsEngine | | `SetGraphics` | function | SparkEditor | [GameViewPanel.h:L44](../../SparkEditor/Source/Panels/GameViewPanel.h#L44) | | | `SetGraphics` | function | SparkEditor | [SceneViewPanel.h:L99](../../SparkEditor/Source/Panels/SceneViewPanel.h#L99) | Give the panel access to the editor's attach-mode GraphicsEngine | -| `SetGraphics` | function | SparkEngine | [EngineContext.h:L297](../../SparkEngine/Source/Core/EngineContext.h#L297) | | +| `SetGraphics` | function | SparkEngine | [EngineContext.h:L300](../../SparkEngine/Source/Core/EngineContext.h#L300) | | | `SetGraphicsDevice` | function | SparkEditor | [EditorUI.h:L262](../../SparkEditor/Source/Core/EditorUI.h#L262) | | | `SetGraphicsEngine` | function | GameModules | [ModelObject.h:L69](../../GameModules/SparkGameFPS/Source/Game/ModelObject.h#L69) | Set graphics engine for rendering | | `SetGraphicsEngine` | function | GameModules | [Player.h:L483](../../GameModules/SparkGameFPS/Source/Game/Player.h#L483) | Set the graphics engine for weapon rendering shader setup | @@ -41529,8 +41628,8 @@ | `SetIndexBuffer` | function | SparkEngine | [RHIDevice.h:L96](../../SparkEngine/Source/Graphics/RHI/RHIDevice.h#L96) | | | `SetIndexBuffer` | function | SparkEngine | [VulkanDevice.h:L345](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L345) | | | `SetInitializeRollbackPrelude` | function | SparkEngine | [LifecycleCompositionRoot.h:L115](../../SparkEngine/Source/Core/Lifecycle/LifecycleCompositionRoot.h#L115) | | -| `SetInjected` | function | SparkEngine | [EngineContext.h:L121](../../SparkEngine/Source/Core/EngineContext.h#L121) | | -| `SetInput` | function | SparkEngine | [EngineContext.h:L298](../../SparkEngine/Source/Core/EngineContext.h#L298) | | +| `SetInjected` | function | SparkEngine | [EngineContext.h:L122](../../SparkEngine/Source/Core/EngineContext.h#L122) | | +| `SetInput` | function | SparkEngine | [EngineContext.h:L301](../../SparkEngine/Source/Core/EngineContext.h#L301) | | | `SetInput` | function | SparkEngine | [VehiclePhysics.h:L80](../../SparkEngine/Source/Physics/VehiclePhysics.h#L80) | | | `SetInputSRV` | function | SparkEngine | [PostProcessingPipeline.h:L313](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L313) | Set the borrowed input scene texture SRV for this frame | | `SetInputTextures` | function | SparkEngine | [MetalRayTracing.h:L196](../../SparkEngine/Source/Graphics/RHI/Metal/MetalRayTracing.h#L196) | Set GBuffer inputs (depth + normals). Passed textures | @@ -41540,7 +41639,7 @@ | `SetInspectedObject` | function | SparkEditor | [TilemapEditorPanel.h:L44](../../SparkEditor/Source/Panels/TilemapEditorPanel.h#L44) | | | `SetInspectedObjectByID` | function | SparkEditor | [InspectorPanel.h:L63](../../SparkEditor/Source/Panels/InspectorPanel.h#L63) | Set the selected object by its ObjectID | | `SetInstanceOverride` | function | SparkEditor | [PrefabManager.h:L217](../../SparkEditor/Source/Prefabs/PrefabManager.h#L217) | | -| `SetInstances` | function | SparkEngine | [EngineContext.h:L332](../../SparkEngine/Source/Core/EngineContext.h#L332) | | +| `SetInstances` | function | SparkEngine | [EngineContext.h:L335](../../SparkEngine/Source/Core/EngineContext.h#L335) | | | `SetInstructionLimit` | function | SparkEngine | [ScriptSandbox.h:L104](../../SparkEngine/Source/Engine/Scripting/ScriptSandbox.h#L104) | | | `SetInt` | function | SparkEngine | [AsyncDatabase.h:L90](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L90) | Prepared statement handle with bindable parameters. | | `SetInt` | function | SparkEngine | [ConfigParser.h:L262](../../SparkEngine/Source/Utils/ConfigParser.h#L262) | | @@ -41558,7 +41657,7 @@ | `SetInterpolationEnabled` | function | Tests | [TestPhysicsSystem.cpp:L131](../../Tests/TestPhysicsSystem.cpp#L131) | | | `SetInterval` | function | SparkEngine | [Cooldown.h:L182](../../SparkEngine/Source/Utils/Cooldown.h#L182) | Set a new interval. | | `SetIntoLayers` | function | SparkEngine | [CollisionMaskComponents.h:L56](../../SparkEngine/Source/Engine/ECS/Components/CollisionMaskComponents.h#L56) | Set the INTO mask to exactly the given layers | -| `SetInvalidStateDetector` | function | SparkEngine | [EngineContext.h:L339](../../SparkEngine/Source/Core/EngineContext.h#L339) | | +| `SetInvalidStateDetector` | function | SparkEngine | [EngineContext.h:L342](../../SparkEngine/Source/Core/EngineContext.h#L342) | | | `SetInvertY` | function | Tests | [TestCameraTransforms.cpp:L194](../../Tests/TestCameraTransforms.cpp#L194) | | | `SetJumpInput` | function | GameModules | [PlatformerPlayerController.h:L141](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L141) | Set jump-button state; a rising edge queues a buffered jump. | | `SetKeepChangesOnStop` | function | SparkEngine | [PlayModeManager.h:L258](../../SparkEngine/Source/Engine/Editor/PlayModeManager.h#L258) | | @@ -41619,7 +41718,7 @@ | `SetLoadOrder` | function | SparkEngine | [ModSystem.h:L171](../../SparkEngine/Source/Engine/Modding/ModSystem.h#L171) | Set the load order for enabled mods. | | `SetLoadRadius` | function | SparkEngine | [HLODSystem.h:L438](../../SparkEngine/Source/Engine/HLOD/HLODSystem.h#L438) | Get the world partition grid for cell management | | `SetLocalFileCache` | function | SparkEngine | [ShaderCrossCompiler.h:L279](../../SparkEngine/Source/Graphics/ShaderCrossCompiler.h#L279) | Set a disk cache for persistent shader caching across sessions. | -| `SetLocalization` | function | SparkEngine | [EngineContext.h:L323](../../SparkEngine/Source/Core/EngineContext.h#L323) | | +| `SetLocalization` | function | SparkEngine | [EngineContext.h:L326](../../SparkEngine/Source/Core/EngineContext.h#L326) | | | `SetLocalSelection` | function | SparkEditor | [CollaborativeEditSession.h:L343](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L343) | | | `SetLocalShotHook` | function | GameModules | [TFWeaponSystem.h:L105](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L105) | | | `SetLocalViewportCamera` | function | SparkEditor | [CollaborativeEditSession.h:L344](../../SparkEditor/Source/Communication/CollaborativeEditSession.h#L344) | | @@ -41729,7 +41828,7 @@ | `SetModEnabled` | function | SparkEditor | [ModdingPanel.h:L39](../../SparkEditor/Source/Panels/ModdingPanel.h#L39) | Enable or disable a discovered mod; returns false if the id is unknown. | | `SetModified` | function | SparkEditor | [EditorPanel.h:L145](../../SparkEditor/Source/Core/EditorPanel.h#L145) | Set modified state | | `SetModified` | function | SparkEditor | [PrefabAsset.h:L192](../../SparkEditor/Source/Prefabs/PrefabAsset.h#L192) | Mark the prefab as modified or saved | -| `SetModSystem` | function | SparkEngine | [EngineContext.h:L321](../../SparkEngine/Source/Core/EngineContext.h#L321) | | +| `SetModSystem` | function | SparkEngine | [EngineContext.h:L324](../../SparkEngine/Source/Core/EngineContext.h#L324) | | | `SetMotd` | function | GameModules | [MMOGuildSystem.h:L89](../../GameModules/SparkGameMMO/Source/Guild/MMOGuildSystem.h#L89) | | | `SetMotionBlurEnabled` | function | SparkEngine | [TemporalEffects.h:L362](../../SparkEngine/Source/Graphics/TemporalEffects.h#L362) | | | `SetMotionVectorsSRV` | function | SparkEngine | [TemporalEffects.h:L179](../../SparkEngine/Source/Graphics/TemporalEffects.h#L179) | Set the motion vectors SRV (RG16F) | @@ -41743,7 +41842,7 @@ | `SetMoveSpeed` | function | Tests | [TestCameraTransforms.cpp:L192](../../Tests/TestCameraTransforms.cpp#L192) | | | `SetMSAALevel` | function | SparkEngine | [GraphicsEngine.h:L617](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L617) | Set multi-sampling anti-aliasing level | | `SetMTLTexture` | function | SparkEngine | [MetalDevice.h:L179](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L179) | | -| `SetMusic` | function | SparkEngine | [EngineContext.h:L337](../../SparkEngine/Source/Core/EngineContext.h#L337) | | +| `SetMusic` | function | SparkEngine | [EngineContext.h:L340](../../SparkEngine/Source/Core/EngineContext.h#L340) | | | `SetMusicVolume` | function | SparkEngine | [AudioEngine.h:L308](../../SparkEngine/Source/Audio/AudioEngine.h#L308) | Set the music volume level | | `SetMusicVolume` | function | SparkEngine | [IAudioBackend.h:L129](../../SparkEngine/Source/Audio/IAudioBackend.h#L129) | Set music volume (0.0 - 1.0) | | `SetMusicVolume` | function | SparkEngine | [NullAudioBackend.h:L85](../../SparkEngine/Source/Audio/NullAudioBackend.h#L85) | | @@ -41756,8 +41855,8 @@ | `SetName` | function | SparkEngine | [GameObject.h:L243](../../SparkEngine/Source/Game/GameObject.h#L243) | Set the name of the object | | `SetName` | function | Tests | [TestGameObjectTransforms.cpp:L139](../../Tests/TestGameObjectTransforms.cpp#L139) | | | `SetNavMesh` | function | SparkEngine | [NavMeshObstacles.h:L200](../../SparkEngine/Source/Engine/AI/NavMeshObstacles.h#L200) | | -| `SetNetwork` | function | SparkEngine | [EngineContext.h:L305](../../SparkEngine/Source/Core/EngineContext.h#L305) | | -| `SetNetworkService` | function | SparkEngine | [EngineContext.h:L306](../../SparkEngine/Source/Core/EngineContext.h#L306) | | +| `SetNetwork` | function | SparkEngine | [EngineContext.h:L308](../../SparkEngine/Source/Core/EngineContext.h#L308) | | +| `SetNetworkService` | function | SparkEngine | [EngineContext.h:L309](../../SparkEngine/Source/Core/EngineContext.h#L309) | | | `SetNoiseType` | function | SparkEngine | [FastNoiseLite.h:L97](../../SparkEngine/Source/Graphics/FastNoiseLite.h#L97) | | | `SetNonBlocking` | function | GameModules | [TFLanDiscoveryInternal.h:L50](../../GameModules/SparkGameMMOFPS/Source/Game/TFLanDiscoveryInternal.h#L50) | | | `SetNonBlocking` | function | GameModules | [TFLanDiscoveryInternal.h:L82](../../GameModules/SparkGameMMOFPS/Source/Game/TFLanDiscoveryInternal.h#L82) | | @@ -41771,6 +41870,7 @@ | `SetOcclusionEnabled` | function | SparkEngine | [AudioMixer.h:L319](../../SparkEngine/Source/Audio/AudioMixer.h#L319) | Enable or disable audio occlusion globally. | | `SetOcclusionSettings` | function | SparkEngine | [MusicManager.h:L262](../../SparkEngine/Source/Audio/MusicManager.h#L262) | | | `SetOn` | function | GameModules | [InteractiveObject.h:L219](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L219) | | +| `SetOnMaterialOpened` | function | SparkEditor | [AssetBrowserPanel.h:L100](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L100) | Connect material activation to the persistent material editor panel. | | `SetOnPrefabsChanged` | function | SparkEditor | [PrefabManager.h:L245](../../SparkEditor/Source/Prefabs/PrefabManager.h#L245) | Set callback for when prefab list changes | | `SetOnProjectClosed` | function | SparkEditor | [ProjectManager.h:L195](../../SparkEditor/Source/Core/ProjectManager.h#L195) | | | `SetOnProjectOpened` | function | SparkEditor | [ProjectManager.h:L194](../../SparkEditor/Source/Core/ProjectManager.h#L194) | | @@ -41786,7 +41886,7 @@ | `SetOpenProbeForTesting` | function | SparkEngine | [VirtualFileSystem.h:L146](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L146) | Test seam: called with the resolved path after every containment check passed | | `SetOpenProjectRequestHandler` | function | SparkEditor | [ProjectBrowserPanel.h:L57](../../SparkEditor/Source/Panels/ProjectBrowserPanel.h#L57) | | | `SetOpenSpeed` | function | GameModules | [InteractiveObject.h:L144](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L144) | | -| `SetOperationResult` | function | SparkEditor | [AssetBrowserPanel.h:L113](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L113) | | +| `SetOperationResult` | function | SparkEditor | [AssetBrowserPanel.h:L123](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L123) | | | `SetOptions` | function | SparkEngine | [AIDebugRenderer.h:L192](../../SparkEngine/Source/Engine/AI/AIDebugRenderer.h#L192) | Set debug draw options | | `SetOptions` | function | Tests | [TestAIDebugRenderer.cpp:L61](../../Tests/TestAIDebugRenderer.cpp#L61) | | | `SetOrbitAngles` | function | GameModules | [RacingCameraSystem.h:L85](../../GameModules/SparkGameRacing/Source/Camera/RacingCameraSystem.h#L85) | | @@ -41798,7 +41898,7 @@ | `SetOutputRTV` | function | SparkEngine | [PostProcessingPipeline.h:L316](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L316) | Set the borrowed final output RTV for this frame | | `SetOutputTextures` | function | SparkEngine | [MetalRayTracing.h:L200](../../SparkEngine/Source/Graphics/RHI/Metal/MetalRayTracing.h#L200) | Set per-effect output render targets. Passing nullptr | | `SetOverlayVisible` | function | SparkEngine | [Profiler.h:L272](../../SparkEngine/Source/Utils/Profiler.h#L272) | | -| `SetOwned` | function | SparkEngine | [EngineContext.h:L136](../../SparkEngine/Source/Core/EngineContext.h#L136) | Set the global EngineContext (initialization only) | +| `SetOwned` | function | SparkEngine | [EngineContext.h:L137](../../SparkEngine/Source/Core/EngineContext.h#L137) | Set the global EngineContext (initialization only) | | `SetPadding` | function | SparkEngine | [UILayoutExtensions.h:L50](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L50) | | | `SetPadding` | function | SparkEngine | [UISystem.h:L315](../../SparkEngine/Source/Engine/UI/UISystem.h#L315) | Set padding inside the panel. | | `SetPanelCategory` | function | SparkEditor | [EditorPanel.h:L298](../../SparkEditor/Source/Core/EditorPanel.h#L298) | Set panel category (called by EditorPanelFactory at creation) | @@ -41811,7 +41911,7 @@ | `SetPanelVisible` | function | Tests | [TestEditorLayoutManager.cpp:L64](../../Tests/TestEditorLayoutManager.cpp#L64) | | | `SetParent` | function | SparkEngine | [Components.h:L117](../../SparkEngine/Source/Engine/ECS/Components.h#L117) | | | `SetParent` | function | SparkEngine | [RuntimePrefab.h:L156](../../SparkEngine/Source/Engine/ECS/RuntimePrefab.h#L156) | Set a parent prefab for inheritance / nesting. | -| `SetParent` | function | SparkEngine | [SceneManager.h:L275](../../SparkEngine/Source/SceneManager/SceneManager.h#L275) | | +| `SetParent` | function | SparkEngine | [SceneManager.h:L277](../../SparkEngine/Source/SceneManager/SceneManager.h#L277) | | | `SetParent` | function | Tests | [TestSceneManager.cpp:L101](../../Tests/TestSceneManager.cpp#L101) | | | `SetParticipant` | function | SparkEngine | [AreaHandoffDispatcher.h:L37](../../SparkEngine/Source/Engine/Networking/AreaHandoffDispatcher.h#L37) | | | `SetParticleEffect` | function | SparkEngine | [DestructionSystem.h:L93](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L93) | Set the particle effect name for destruction. | @@ -41836,7 +41936,7 @@ | `SetPersistence` | function | GameModules | [MMOCharacterSystem.h:L156](../../GameModules/SparkGameMMO/Source/Character/MMOCharacterSystem.h#L156) | | | `SetPhase` | function | SparkEngine | [InstanceManager.h:L96](../../SparkEngine/Source/Engine/Gameplay/InstanceManager.h#L96) | | | `SetPhysics` | function | SparkEngine | [AudioMixer.h:L228](../../SparkEngine/Source/Audio/AudioMixer.h#L228) | Attach the physics system used for occlusion traces. | -| `SetPhysics` | function | SparkEngine | [EngineContext.h:L302](../../SparkEngine/Source/Core/EngineContext.h#L302) | | +| `SetPhysics` | function | SparkEngine | [EngineContext.h:L305](../../SparkEngine/Source/Core/EngineContext.h#L305) | | | `SetPhysicsBodies` | function | SparkEngine | [DebugOverlay.h:L220](../../SparkEngine/Source/Utils/DebugOverlay.h#L220) | | | `SetPhysicsBodyCount` | function | SparkEngine | [PerformanceStats.h:L222](../../SparkEngine/Source/Utils/PerformanceStats.h#L222) | Set the current physics body count | | `SetPhysicsSystem` | function | GameModules | [Game.h:L346](../../GameModules/SparkGameFPS/Source/Game/Game.h#L346) | Set physics system on all projectile pools | @@ -41932,7 +42032,7 @@ | `SetProjectilePool` | function | GameModules | [Player.h:L209](../../GameModules/SparkGameFPS/Source/Game/Player.h#L209) | Set the projectile pool for weapon projectiles | | `SetProjectilePool` | function | GameModules | [VehicleSystem.h:L161](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L161) | Set the projectile pool used for vehicle weapon firing | | `SetProjectilePool` | function | GameModules | [VehicleSystem.h:L337](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L337) | Set projectile pool for all current and future vehicles | -| `SetProjectPath` | function | SparkEditor | [AssetBrowserPanel.h:L73](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L73) | Set project path | +| `SetProjectPath` | function | SparkEditor | [AssetBrowserPanel.h:L74](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L74) | Set project path | | `SetProjectPrefabDirectory` | function | SparkEditor | [PrefabManager.h:L98](../../SparkEditor/Source/Prefabs/PrefabManager.h#L98) | Set the open project's prefab directory (`/Prefabs`); empty when no project is open | | `SetProperty` | function | SparkEngine | [RemoteDebugSystem.h:L637](../../SparkEngine/Source/Engine/RemoteDebug/RemoteDebugSystem.h#L637) | Set the value of a named property. | | `SetQuality` | function | SparkEngine | [HybridRTManager.h:L178](../../SparkEngine/Source/Graphics/HybridRT/HybridRTManager.h#L178) | | @@ -41976,7 +42076,7 @@ | `SetRenderTargets` | function | SparkEngine | [RHIAdapter.h:L156](../../SparkEngine/Source/Graphics/RHI/RHIAdapter.h#L156) | Set one or more render targets with an optional depth buffer. | | `SetRenderTargets` | function | SparkEngine | [RHIDevice.h:L81](../../SparkEngine/Source/Graphics/RHI/RHIDevice.h#L81) | | | `SetRenderTargets` | function | SparkEngine | [VulkanDevice.h:L333](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L333) | | -| `SetReplay` | function | SparkEngine | [EngineContext.h:L322](../../SparkEngine/Source/Core/EngineContext.h#L322) | | +| `SetReplay` | function | SparkEngine | [EngineContext.h:L325](../../SparkEngine/Source/Core/EngineContext.h#L325) | | | `SetReputation` | function | GameModules | [MMOReputationSystem.h:L79](../../GameModules/SparkGameMMO/Source/Reputation/MMOReputationSystem.h#L79) | | | `SetRequiresConfirmation` | function | SparkEditor | [EditorWorkflow.h:L102](../../SparkEditor/Source/Workflow/EditorWorkflow.h#L102) | True when the workflow performs destructive work (deleting directories). | | `SetResourceResolver` | function | SparkEngine | [DynamicPluginHost.h:L42](../../SparkEngine/Source/Core/DynamicPluginHost.h#L42) | | @@ -42023,7 +42123,7 @@ | `SetSampler` | function | SparkEngine | [VulkanDevice.h:L348](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L348) | | | `SetSaveDirectory` | function | SparkEditor | [SaveSystemPanel.h:L55](../../SparkEditor/Source/Panels/SaveSystemPanel.h#L55) | Point the panel and the SaveSystem at @p directory and re-enumerate. | | `SetSaveDirectory` | function | SparkEngine | [SaveSystem.h:L800](../../SparkEngine/Source/Engine/SaveSystem/SaveSystem.h#L800) | Override the directory used to store save files at runtime. | -| `SetSaveSystem` | function | SparkEngine | [EngineContext.h:L313](../../SparkEngine/Source/Core/EngineContext.h#L313) | | +| `SetSaveSystem` | function | SparkEngine | [EngineContext.h:L316](../../SparkEngine/Source/Core/EngineContext.h#L316) | | | `SetSaveVersion` | function | SparkEngine | [FreezeSystem.h:L293](../../SparkEngine/Source/Engine/SaveSystem/FreezeSystem.h#L293) | | | `SetScale` | function | SparkEngine | [SceneGraph2D.h:L105](../../SparkEngine/Source/Engine/2D/SceneGraph2D.h#L105) | | | `SetScale` | function | SparkEngine | [AngelScriptEngine.h:L783](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.h#L783) | | @@ -42038,7 +42138,7 @@ | `SetScene` | function | SparkEditor | [TilemapEditorPanel.h:L43](../../SparkEditor/Source/Panels/TilemapEditorPanel.h#L43) | | | `SetScene` | function | SparkEditor | [PrefabManager.h:L248](../../SparkEditor/Source/Prefabs/PrefabManager.h#L248) | Set the active scene for entity queries and instantiation. | | `SetSceneChangedCallback` | function | SparkEditor | [SparkEngineIntegration.h:L496](../../SparkEditor/Source/Integration/SparkEngineIntegration.h#L496) | Set scene changed callback | -| `SetSceneManager` | function | SparkEngine | [EngineContext.h:L310](../../SparkEngine/Source/Core/EngineContext.h#L310) | | +| `SetSceneManager` | function | SparkEngine | [EngineContext.h:L313](../../SparkEngine/Source/Core/EngineContext.h#L313) | | | `SetScissorRect` | function | SparkEngine | [D3D11Device.h:L261](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L261) | | | `SetScissorRect` | function | SparkEngine | [D3D12Types.h:L697](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L697) | | | `SetScissorRect` | function | SparkEngine | [MetalDevice.h:L369](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L369) | | @@ -42056,7 +42156,7 @@ | `SetScriptContext` | function | Tests | [TestAngelScriptEngine.cpp:L198](../../Tests/TestAngelScriptEngine.cpp#L198) | | | `SetScriptedCommander` | function | GameModules | [RTSSkirmishSimulation.h:L89](../../GameModules/SparkGameRTS/Source/Simulation/RTSSkirmishSimulation.h#L89) | Bind (or clear with nullptr) the commander that issues Human orders at the start of every tick. | | `SetScriptedMove` | function | GameModules | [TFClientNet.h:L112](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L112) | | -| `SetScriptEngine` | function | SparkEngine | [EngineContext.h:L311](../../SparkEngine/Source/Core/EngineContext.h#L311) | | +| `SetScriptEngine` | function | SparkEngine | [EngineContext.h:L314](../../SparkEngine/Source/Core/EngineContext.h#L314) | | | `SetScrollOffset` | function | SparkEngine | [UILayoutExtensions.h:L90](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L90) | | | `SetSearchFilter` | function | SparkEditor | [HierarchyPanel.h:L200](../../SparkEditor/Source/Panels/HierarchyPanel.h#L200) | Set search filter | | `SetSection` | function | SparkEngine | [DebugOverlay.h:L196](../../SparkEngine/Source/Utils/DebugOverlay.h#L196) | | @@ -42114,7 +42214,7 @@ | `SetShowInactiveObjects` | function | SparkEditor | [HierarchyPanel.h:L206](../../SparkEditor/Source/Panels/HierarchyPanel.h#L206) | Set whether to show inactive objects | | `SetShowObjectIDs` | function | SparkEditor | [HierarchyPanel.h:L212](../../SparkEditor/Source/Panels/HierarchyPanel.h#L212) | Set whether to show object IDs | | `SetShutdownRequestHandler` | function | SparkEngine | [ConsoleProcessManager.h:L100](../../SparkEngine/Source/Utils/ConsoleProcessManager.h#L100) | | -| `SetSignalReportStallForTesting` | function | SparkEngine | [CrashHandler.cpp:L2564](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2564) | | +| `SetSignalReportStallForTesting` | function | SparkEngine | [CrashHandler.cpp:L2610](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2610) | | | `SetSignalReportStallForTesting` | function | SparkEngine | [CrashHandler.h:L161](../../SparkEngine/Source/Utils/CrashHandler.h#L161) | Test seam: make the fatal-signal handler's best-effort stage block. | | `SetSimulation` | function | SparkEngine | [AreaServer.h:L124](../../SparkEngine/Source/Engine/Networking/AreaServer.h#L124) | | | `SetSimulationSettings` | function | SparkEditor | [NetworkDebugPanel.h:L222](../../SparkEditor/Source/Panels/NetworkDebugPanel.h#L222) | Set simulation settings (from external systems) | @@ -42201,7 +42301,7 @@ | `SetTargetBackend` | function | SparkEngine | [ShaderHotReload.h:L286](../../SparkEngine/Source/Graphics/ShaderHotReload.h#L286) | Graphics backend reloads are compiled for. | | `SetTargetPosition` | function | SparkEngine | [PoseModifier.h:L122](../../SparkEngine/Source/Engine/Animation/PoseModifier.h#L122) | | | `SetTargetPosition` | function | SparkEngine | [PoseModifier.h:L152](../../SparkEngine/Source/Engine/Animation/PoseModifier.h#L152) | | -| `SetTelemetryService` | function | SparkEngine | [EngineContext.h:L307](../../SparkEngine/Source/Core/EngineContext.h#L307) | | +| `SetTelemetryService` | function | SparkEngine | [EngineContext.h:L310](../../SparkEngine/Source/Core/EngineContext.h#L310) | | | `SetTemporalBlend` | function | SparkEngine | [RTCompositor.h:L69](../../SparkEngine/Source/Graphics/HybridRT/RTCompositor.h#L69) | | | `SetTestEnvironment` | function | Tests | [TestModuleABI.cpp:L179](../../Tests/TestModuleABI.cpp#L179) | | | `SetTestSecondsLimit` | function | SparkEngine | [ExecScript.h:L91](../../SparkEngine/Source/Core/ExecScript.h#L91) | `-test-seconds N`: wall-clock limit after which the loop should exit (<= 0 disables). | @@ -42228,14 +42328,14 @@ | `SetTime` | function | GameModules | [RPGEngineSystems.h:L60](../../GameModules/SparkGameRPG/Source/Core/RPGEngineSystems.h#L60) | Set time of day (0-24 hours) | | `SetTime` | function | SparkEngine | [Sequencer.h:L280](../../SparkEngine/Source/Engine/Cinematic/Sequencer.h#L280) | | | `SetTimeOfDay` | function | GameModules | [RTSEngineSystems.h:L83](../../GameModules/SparkGameRTS/Source/Core/RTSEngineSystems.h#L83) | Set the time of day (0-24 hour). | -| `SetTimeOfDay` | function | SparkEngine | [EngineContext.h:L318](../../SparkEngine/Source/Core/EngineContext.h#L318) | | +| `SetTimeOfDay` | function | SparkEngine | [EngineContext.h:L321](../../SparkEngine/Source/Core/EngineContext.h#L321) | | | `SetTimeOfDay` | function | SparkEngine | [TimeOfDaySystem.h:L85](../../SparkEngine/Source/Engine/World/TimeOfDaySystem.h#L85) | Set the current time of day | | `SetTimeOfDay` | function | Tests | [TestDayNightCycle.cpp:L57](../../Tests/TestDayNightCycle.cpp#L57) | | | `SetTimeOfDay` | function | Tests | [TestTimeOfDaySystem.cpp:L54](../../Tests/TestTimeOfDaySystem.cpp#L54) | | | `SetTimeoutDuration` | function | Tests | [TestNetworkManagerOrchestration.cpp:L327](../../Tests/TestNetworkManagerOrchestration.cpp#L327) | | | `SetTimeoutHandler` | function | SparkEngine | [NetworkManager.h:L804](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L804) | Remove a client's visibility scope, reverting to "see everything". | | `SetTimeoutHandler` | function | Tests | [TestNetworkManagerOrchestration.cpp:L326](../../Tests/TestNetworkManagerOrchestration.cpp#L326) | | -| `SetTimer` | function | SparkEngine | [EngineContext.h:L299](../../SparkEngine/Source/Core/EngineContext.h#L299) | | +| `SetTimer` | function | SparkEngine | [EngineContext.h:L302](../../SparkEngine/Source/Core/EngineContext.h#L302) | | | `SetTimer` | function | SparkEngine | [TimerManager.h:L118](../../SparkEngine/Source/Utils/TimerManager.h#L118) | Set (create or replace) a named timer | | `SetTimerRate` | function | SparkEngine | [TimerManager.h:L178](../../SparkEngine/Source/Utils/TimerManager.h#L178) | Change the rate of an existing timer | | `SetTimeScale` | function | GameModules | [Game.h:L246](../../GameModules/SparkGameFPS/Source/Game/Game.h#L246) | Set time scale for the entire game simulation | @@ -42297,10 +42397,10 @@ | `SetTriggerThreshold` | function | Tests | [TestGamepadInputProcessing.cpp:L257](../../Tests/TestGamepadInputProcessing.cpp#L257) | | | `SetTurbidity` | function | SparkEngine | [SkyAtmosphere.h:L133](../../SparkEngine/Source/Graphics/SkyAtmosphere.h#L133) | | | `SetTurnInput` | function | GameModules | [OWPlayerController.h:L66](../../GameModules/SparkGameOpenWorld/Source/Player/OWPlayerController.h#L66) | Turn rate in degrees per second (+ is clockwise, toward east from north) | -| `SetTween` | function | SparkEngine | [EngineContext.h:L324](../../SparkEngine/Source/Core/EngineContext.h#L324) | | +| `SetTween` | function | SparkEngine | [EngineContext.h:L327](../../SparkEngine/Source/Core/EngineContext.h#L327) | | | `SetType` | function | SparkEngine | [LightingSystem.h:L83](../../SparkEngine/Source/Graphics/LightingSystem.h#L83) | | | `SetUAVDescriptor` | function | SparkEngine | [D3D12Types.h:L496](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Types.h#L496) | | -| `SetUI` | function | SparkEngine | [EngineContext.h:L319](../../SparkEngine/Source/Core/EngineContext.h#L319) | | +| `SetUI` | function | SparkEngine | [EngineContext.h:L322](../../SparkEngine/Source/Core/EngineContext.h#L322) | | | `SetUInt` | function | SparkEngine | [ProfileProperties.h:L70](../../SparkEngine/Source/Utils/ProfileProperties.h#L70) | Set a property's value as unsigned integer (stored in float) | | `SetUint32` | function | Tests | [TestNeuralWeightsValidation.cpp:L32](../../Tests/TestNeuralWeightsValidation.cpp#L32) | | | `SetUndoRedoManager` | function | SparkEditor | [VisualScriptPanel.h:L214](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L214) | | @@ -42333,7 +42433,7 @@ | `SetupCrashHandler` | function | SparkEngine | [SparkEngineLinuxInternal.h:L38](../../SparkEngine/Source/Core/SparkEngineLinuxInternal.h#L38) | | | `SetupCrashHandler` | function | SparkEngine | [SparkEngineWindowsInternal.h:L54](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L54) | | | `SetupCustomDrawCallbacks` | function | SparkEditor | [EditorTheme.h:L298](../../SparkEditor/Source/Core/EditorTheme.h#L298) | Create custom orange accent theme | -| `SetupDefaultDockLayout` | function | SparkEditor | [EditorUI.h:L505](../../SparkEditor/Source/Core/EditorUI.h#L505) | | +| `SetupDefaultDockLayout` | function | SparkEditor | [EditorUI.h:L503](../../SparkEditor/Source/Core/EditorUI.h#L503) | | | `SetupDefaultRaceRoster` | function | GameModules | [SparkGameRacing.h:L65](../../GameModules/SparkGameRacing/Source/Core/SparkGameRacing.h#L65) | | | `SetupDeferredPipeline` | function | SparkEngine | [GraphicsEngine.h:L1317](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L1317) | | | `SetupDestruction` | function | GameModules | [ARPGEngineSystems.h:L112](../../GameModules/SparkGameARPG/Source/Core/ARPGEngineSystems.h#L112) | | @@ -42393,7 +42493,7 @@ | `SetVertexBuffer` | function | SparkEngine | [RHIDevice.h:L95](../../SparkEngine/Source/Graphics/RHI/RHIDevice.h#L95) | | | `SetVertexBuffer` | function | SparkEngine | [VulkanDevice.h:L344](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L344) | | | `SetVerticalThrust` | function | GameModules | [VehicleSystem.h:L150](../../GameModules/SparkGameFPS/Source/Game/VehicleSystem.h#L150) | Apply vertical thrust (aerial vehicles) | -| `SetVFS` | function | SparkEngine | [EngineContext.h:L338](../../SparkEngine/Source/Core/EngineContext.h#L338) | | +| `SetVFS` | function | SparkEngine | [EngineContext.h:L341](../../SparkEngine/Source/Core/EngineContext.h#L341) | | | `SetVibration` | function | SparkEngine | [GamepadInput.h:L306](../../SparkEngine/Source/Input/GamepadInput.h#L306) | | | `SetVibration` | function | Tests | [TestGamepadInputProcessing.cpp:L223](../../Tests/TestGamepadInputProcessing.cpp#L223) | | | `SetViewAngles` | function | GameModules | [TFClientNet.h:L116](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L116) | | @@ -42426,27 +42526,30 @@ | `SetVolumeBlendEnabled` | function | SparkEngine | [PostProcessingPipeline.h:L202](../../SparkEngine/Source/Graphics/PostProcessingPipeline.h#L202) | Whether `Process()` should push the blended volume stack | | `SetVolumetricSettings` | function | SparkEngine | [FogSystem.h:L237](../../SparkEngine/Source/Graphics/FogSystem.h#L237) | | | `SetVolumetricSettings` | function | SparkEngine | [GraphicsEngine.h:L641](../../SparkEngine/Source/Graphics/GraphicsEngine.h#L641) | Configure volumetric lighting | -| `SetVR` | function | SparkEngine | [EngineContext.h:L328](../../SparkEngine/Source/Core/EngineContext.h#L328) | | +| `SetVR` | function | SparkEngine | [EngineContext.h:L331](../../SparkEngine/Source/Core/EngineContext.h#L331) | | | `SetVRAMBudgetMonitor` | function | SparkEngine | [TextureSystem.h:L282](../../SparkEngine/Source/Graphics/TextureSystem.h#L282) | Set the VRAM budget monitor for pressure-driven eviction | | `SetVRAMUsageMB` | function | SparkEngine | [DebugOverlay.h:L219](../../SparkEngine/Source/Utils/DebugOverlay.h#L219) | | | `SetWaitTime` | function | GameModules | [InteractiveObject.h:L259](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L259) | | | `SetWatchDirectory` | function | SparkEngine | [ModuleHotReload.h:L139](../../SparkEngine/Source/Engine/HotReload/ModuleHotReload.h#L139) | Set the base directory to watch for DLL changes | | `SetWatchExtensions` | function | SparkEngine | [ScriptHotReload.h:L96](../../SparkEngine/Source/Engine/Scripting/ScriptHotReload.h#L96) | Set file extensions to watch (default: .as, .angelscript) | | `SetWatchExtensions` | function | Tests | [TestScriptHotReload.cpp:L53](../../Tests/TestScriptHotReload.cpp#L53) | | -| `SetWeapons` | function | SparkEngine | [EngineContext.h:L330](../../SparkEngine/Source/Core/EngineContext.h#L330) | | +| `SetWeapons` | function | SparkEngine | [EngineContext.h:L333](../../SparkEngine/Source/Core/EngineContext.h#L333) | | | `SetWeaponStatus` | function | GameModules | [TFHUD.h:L79](../../GameModules/SparkGameMMOFPS/Source/UI/TFHUD.h#L79) | | | `SetWeaponType` | function | GameModules | [InteractiveObject.h:L350](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.h#L350) | | | `SetWeather` | function | GameModules | [EngineWeatherAdapter.h:L20](../../GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.h#L20) | | -| `SetWeather` | function | GameModules | [FPSWeatherIntegration.h:L32](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L32) | | +| `SetWeather` | function | GameModules | [FPSWeatherIntegration.h:L34](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherIntegration.h#L34) | | | `SetWeather` | function | GameModules | [FPSWeatherPort.h:L28](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherPort.h#L28) | | | `SetWeather` | function | GameModules | [OWEngineSystems.h:L52](../../GameModules/SparkGameOpenWorld/Source/Core/OWEngineSystems.h#L52) | Validate the slot's gameplay snapshot, then restore the world and gameplay state from it. | | `SetWeather` | function | GameModules | [RPGEngineSystems.h:L57](../../GameModules/SparkGameRPG/Source/Core/RPGEngineSystems.h#L57) | Set weather type by name (clear/rain/snow/fog/storm) | | `SetWeather` | function | GameModules | [RTSEngineSystems.h:L80](../../GameModules/SparkGameRTS/Source/Core/RTSEngineSystems.h#L80) | Set the weather type by name ("clear", "rain", "fog", "storm", "snow"). | | `SetWeather` | function | GameModules | [RacingEngineSystems.h:L84](../../GameModules/SparkGameRacing/Source/Core/RacingEngineSystems.h#L84) | Set weather type by name (clear/rain/storm). | -| `SetWeather` | function | SparkEngine | [EngineContext.h:L317](../../SparkEngine/Source/Core/EngineContext.h#L317) | | +| `SetWeather` | function | SparkEngine | [EngineContext.h:L320](../../SparkEngine/Source/Core/EngineContext.h#L320) | | +| `SetWeather` | function | SparkEngine | [EngineSdkWeather.h:L14](../../SparkEngine/Source/Core/EngineSdkWeather.h#L14) | | | `SetWeather` | function | SparkEngine | [VolumetricClouds.h:L145](../../SparkEngine/Source/Graphics/VolumetricClouds.h#L145) | Set coverage/type/rain from the weather system | | `SetWeather` | function | SparkEngine | [WeatherSystem.h:L243](../../SparkEngine/Source/Graphics/WeatherSystem.h#L243) | Set a new weather condition with transition | -| `SetWeather` | function | Tests | [TestFPSWeatherPort.cpp:L13](../../Tests/TestFPSWeatherPort.cpp#L13) | | +| `SetWeather` | function | SparkSDK | [IWeatherService.h:L38](../../SparkSDK/Include/Spark/IWeatherService.h#L38) | | +| `SetWeather` | function | Tests | [TestFPSWeatherPort.cpp:L15](../../Tests/TestFPSWeatherPort.cpp#L15) | | +| `SetWeather` | function | Tests | [TestFPSWeatherPort.cpp:L33](../../Tests/TestFPSWeatherPort.cpp#L33) | | | `SetWeather` | function | Tests | [TestWeatherSystem.cpp:L93](../../Tests/TestWeatherSystem.cpp#L93) | | | `SetWeatherPort` | function | GameModules | [Game.h:L335](../../GameModules/SparkGameFPS/Source/Game/Game.h#L335) | Set the engine context for SDK v2 subsystem access | | `SetWeatherPreset` | function | GameModules | [Game.h:L337](../../GameModules/SparkGameFPS/Source/Game/Game.h#L337) | Set the engine context for SDK v2 subsystem access | @@ -42467,7 +42570,7 @@ | `SetWorld` | function | SparkEditor | [SceneStatisticsPanel.h:L44](../../SparkEditor/Source/Panels/SceneStatisticsPanel.h#L44) | Point the panel at the document World whose entities it counts. | | `SetWorld` | function | SparkEditor | [SceneViewPanel.h:L107](../../SparkEditor/Source/Panels/SceneViewPanel.h#L107) | Inject the shared ECS World to render (owned by EditorUI; the | | `SetWorld` | function | SparkEditor | [SearchPanel.h:L78](../../SparkEditor/Source/Panels/SearchPanel.h#L78) | Point the panel at the document World whose entities it searches. | -| `SetWorld` | function | SparkEngine | [EngineContext.h:L309](../../SparkEngine/Source/Core/EngineContext.h#L309) | | +| `SetWorld` | function | SparkEngine | [EngineContext.h:L312](../../SparkEngine/Source/Core/EngineContext.h#L312) | | | `SetWorld` | function | SparkEngine | [DestructionSystem.h:L207](../../SparkEngine/Source/Engine/Destruction/DestructionSystem.h#L207) | Set the ECS World pointer for entity creation. Must be called before ApplyDamage. | | `SetWorld` | function | SparkEngine | [InvalidStateDetector.h:L124](../../SparkEngine/Source/Utils/InvalidStateDetector.h#L124) | | | `SetWorldGravity` | function | GameModules | [GravitySystem.h:L173](../../GameModules/SparkGameFPS/Source/Game/GravitySystem.h#L173) | Set the world default gravity | @@ -42785,6 +42888,7 @@ | `ShouldRender` | function | SparkEngine | [InGameConsole.h:L281](../../SparkEngine/Source/Utils/InGameConsole.h#L281) | Check if the console overlay should be rendered | | `ShouldReorder` | function | SparkEngine | [InstabilitySimulator.h:L127](../../SparkEngine/Source/Engine/Networking/InstabilitySimulator.h#L127) | Check if a packet should be reordered based on reorderPercent | | `ShouldRunScript` | function | Tests | [TestAngelScriptEngine.cpp:L201](../../Tests/TestAngelScriptEngine.cpp#L201) | | +| `ShouldSend` | function | GameModules | [TFReplicationRefresh.h:L23](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L23) | | | `ShouldShowInputCaptureHint` | function | SparkEditor | [GameViewPanel.h:L87](../../SparkEditor/Source/Panels/GameViewPanel.h#L87) | | | `ShouldShowInputReleaseHint` | function | SparkEditor | [GameViewPanel.h:L88](../../SparkEditor/Source/Panels/GameViewPanel.h#L88) | | | `ShouldShowStartupSplash` | function | SparkEngine | [StartupSplash.cpp:L423](../../SparkEngine/Source/Core/StartupSplash.cpp#L423) | | @@ -42906,7 +43010,7 @@ | `Shutdown` | function | GameModules | [TFVehicleTerminal.h:L44](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleTerminal.h#L44) | | | `Shutdown` | function | GameModules | [TFWeaponSystem.h:L49](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L49) | | | `Shutdown` | function | GameModules | [TFClientNet.h:L79](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L79) | | -| `Shutdown` | function | GameModules | [TFReplication.h:L62](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L62) | | +| `Shutdown` | function | GameModules | [TFReplication.h:L66](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L66) | | | `Shutdown` | function | GameModules | [TFServerSim.h:L63](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L63) | | | `Shutdown` | function | GameModules | [TFChatWindow.h:L48](../../GameModules/SparkGameMMOFPS/Source/UI/TFChatWindow.h#L48) | | | `Shutdown` | function | GameModules | [TFDeathRecap.h:L68](../../GameModules/SparkGameMMOFPS/Source/UI/TFDeathRecap.h#L68) | | @@ -42990,7 +43094,7 @@ | `Shutdown` | function | SparkEditor | [AIEditorPanel.h:L31](../../SparkEditor/Source/Panels/AIEditorPanel.h#L31) | | | `Shutdown` | function | SparkEditor | [AbilityEditorPanel.h:L32](../../SparkEditor/Source/Panels/AbilityEditorPanel.h#L32) | | | `Shutdown` | function | SparkEditor | [AssetAuditGraph.h:L139](../../SparkEditor/Source/Panels/AssetAuditGraph.h#L139) | Shut down and clear all data | -| `Shutdown` | function | SparkEditor | [AssetBrowserPanel.h:L59](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L59) | Shutdown the asset browser panel | +| `Shutdown` | function | SparkEditor | [AssetBrowserPanel.h:L60](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L60) | Shutdown the asset browser panel | | `Shutdown` | function | SparkEditor | [AudioMixerPanel.h:L31](../../SparkEditor/Source/Panels/AudioMixerPanel.h#L31) | | | `Shutdown` | function | SparkEditor | [BasicMaterialEditorPanel.h:L50](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L50) | | | `Shutdown` | function | SparkEditor | [BuildCookPanel.h:L112](../../SparkEditor/Source/Panels/BuildCookPanel.h#L112) | | @@ -43352,7 +43456,7 @@ | `ShutdownStageContained` | function | SparkEngine | [GameplaySystemLifecycle.cpp:L59](../../SparkEngine/Source/Core/GameplaySystemLifecycle.cpp#L59) | | | `ShutdownSystems` | function | GameModules | [SparkGameMMO.h:L86](../../GameModules/SparkGameMMO/Source/Core/SparkGameMMO.h#L86) | | | `si` | struct | SparkEditor | [EditorCrashHandler.cpp:L802](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L802) | | -| `si` | struct | SparkEngine | [CrashHandler.cpp:L1690](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1690) | | +| `si` | struct | SparkEngine | [CrashHandler.cpp:L1691](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1691) | | | `Sibling` | function | Tests | [TestReflectedScene.cpp:L59](../../Tests/TestReflectedScene.cpp#L59) | | | `SiblingDependentModule` | class | Tests | [SiblingDependentModule.cpp:L9](../../Tests/Fixtures/ModuleABI/SiblingDependentModule.cpp#L9) | | | `Sid` | function | GameModules | [MMOPersistenceSystem.cpp:L38](../../GameModules/SparkGameMMO/Source/Persistence/MMOPersistenceSystem.cpp#L38) | | @@ -43381,10 +43485,10 @@ | `SignalHandler` | function | SparkEditor | [EditorCrashHandler.h:L126](../../SparkEditor/Source/Core/EditorCrashHandler.h#L126) | | | `SignalHandler` | function | SparkEngine | [SparkEngineLinux.cpp:L66](../../SparkEngine/Source/Core/SparkEngineLinux.cpp#L66) | | | `SignalPosixProcess` | function | SparkEditor | [EditorProcessLaunchPosixInternal.h:L171](../../SparkEditor/Source/Utils/EditorProcessLaunchPosixInternal.h#L171) | | -| `SignalSafeLength` | function | SparkEngine | [CrashHandler.cpp:L2071](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2071) | | -| `SignalSafeWrite` | function | SparkEngine | [CrashHandler.cpp:L2079](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2079) | | -| `SignalSafeWrite` | function | SparkEngine | [CrashHandler.cpp:L2100](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2100) | | -| `SignalSafeWriteNumber` | function | SparkEngine | [CrashHandler.cpp:L2106](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2106) | | +| `SignalSafeLength` | function | SparkEngine | [CrashHandler.cpp:L2077](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2077) | | +| `SignalSafeWrite` | function | SparkEngine | [CrashHandler.cpp:L2085](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2085) | | +| `SignalSafeWrite` | function | SparkEngine | [CrashHandler.cpp:L2106](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2106) | | +| `SignalSafeWriteNumber` | function | SparkEngine | [CrashHandler.cpp:L2137](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2137) | | | `SignedBody` | function | SparkGateway | [GatewayAreaControl.cpp:L552](../../SparkGateway/src/GatewayAreaControl.cpp#L552) | | | `SignedDistance` | function | SparkEngine | [D3D11FrustumCulling.h:L84](../../SparkEngine/Source/Graphics/D3D11FrustumCulling.h#L84) | | | `silent` | function | Tests | [TestNetTransportSecurity.cpp:L412](../../Tests/TestNetTransportSecurity.cpp#L412) | | @@ -43510,8 +43614,9 @@ | `SingleValue3D` | function | SparkEngine | [FastNoiseLite.h:L268](../../SparkEngine/Source/Graphics/FastNoiseLite.h#L268) | | | `SingleValue3D` | function | SparkEngine | [FastNoiseLite.h:L500](../../SparkEngine/Source/Graphics/FastNoiseLite.h#L500) | | | `SinkSetup` | struct | SparkEngine | [Logger.h:L455](../../SparkEngine/Source/Utils/Logger.h#L455) | Which destinations InstallDefaultSinks() should install | -| `size` | function | SparkEditor | [AssetBrowserPanel.cpp:L432](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L432) | | -| `size` | function | SparkEditor | [AssetBrowserPanel.cpp:L474](../../SparkEditor/Source/Panels/AssetBrowserPanel.cpp#L474) | | +| `Size` | function | GameModules | [TFReplicationRefresh.h:L43](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationRefresh.h#L43) | | +| `size` | function | SparkEditor | [AssetBrowserGrid.cpp:L212](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L212) | | +| `size` | function | SparkEditor | [AssetBrowserGrid.cpp:L254](../../SparkEditor/Source/Panels/AssetBrowserGrid.cpp#L254) | | | `size` | function | SparkEditor | [WeaponEditorPanel.cpp:L384](../../SparkEditor/Source/Panels/WeaponEditorPanel.cpp#L384) | | | `Size` | function | SparkEngine | [SceneSnapshotSerializer.h:L57](../../SparkEngine/Source/Engine/Editor/SceneSnapshotSerializer.h#L57) | | | `Size` | function | SparkEngine | [AsyncDatabase.h:L107](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.h#L107) | A batch of queries executed atomically (all-or-nothing). | @@ -43803,11 +43908,13 @@ | `source` | function | Tests | [TestTF120Migration.cpp:L247](../../Tests/TestTF120Migration.cpp#L247) | | | `source` | function | Tests | [TestTF120Migration.cpp:L307](../../Tests/TestTF120Migration.cpp#L307) | | | `source` | function | Tests | [TestTF120Migration.cpp:L366](../../Tests/TestTF120Migration.cpp#L366) | | -| `source` | function | Tests | [TestTF120Travel.cpp:L363](../../Tests/TestTF120Travel.cpp#L363) | | -| `source` | function | Tests | [TestTF120Travel.cpp:L551](../../Tests/TestTF120Travel.cpp#L551) | | -| `SourceAuthority` | struct | Tests | [TestTF120Travel.cpp:L200](../../Tests/TestTF120Travel.cpp#L200) | | -| `SourceAuthority` | function | Tests | [TestTF120Travel.cpp:L202](../../Tests/TestTF120Travel.cpp#L202) | | -| `sourceAuthority` | function | Tests | [TestTF120Travel.cpp:L549](../../Tests/TestTF120Travel.cpp#L549) | | +| `source` | function | Tests | [TestTF120Travel.cpp:L81](../../Tests/TestTF120Travel.cpp#L81) | | +| `source` | function | Tests | [TestTF120Travel.cpp:L350](../../Tests/TestTF120Travel.cpp#L350) | | +| `source` | function | Tests | [TestTF120Travel.cpp:L538](../../Tests/TestTF120Travel.cpp#L538) | | +| `source` | function | Tests | [TestTFDataTables.cpp:L47](../../Tests/TestTFDataTables.cpp#L47) | | +| `SourceAuthority` | struct | Tests | [TestTF120Travel.cpp:L187](../../Tests/TestTF120Travel.cpp#L187) | | +| `SourceAuthority` | function | Tests | [TestTF120Travel.cpp:L189](../../Tests/TestTF120Travel.cpp#L189) | | +| `sourceAuthority` | function | Tests | [TestTF120Travel.cpp:L536](../../Tests/TestTF120Travel.cpp#L536) | | | `SourceDataDirectory` | function | Tests | [TestRegionMapDataSource.cpp:L24](../../Tests/TestRegionMapDataSource.cpp#L24) | | | `sourceDir` | function | Tests | [TestEditorStateCompatibility.cpp:L40](../../Tests/TestEditorStateCompatibility.cpp#L40) | | | `sourceDir` | function | Tests | [TestEditorStateCompatibility.cpp:L42](../../Tests/TestEditorStateCompatibility.cpp#L42) | | @@ -43832,8 +43939,8 @@ | `sp` | function | Tests | [TestGameModeReal.cpp:L83](../../Tests/TestGameModeReal.cpp#L83) | | | `SpacedNumber` | function | SparkEditor | [PrefabTextFormat.cpp:L138](../../SparkEditor/Source/Prefabs/PrefabTextFormat.cpp#L138) | | | `spaces` | function | Tests | [TestLauncherProcess.cpp:L240](../../Tests/TestLauncherProcess.cpp#L240) | | -| `Spark::AssetPipeline::CookAssets` | method | SparkAssetPipelineCore | [AssetCookerTests.cpp:L86](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L86) | | -| `Spark::Cinematic::SequencerManager::GetInstance` | method | GameModules | [Main.cpp:L950](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L950) | | +| `Spark::AssetPipeline::CookAssets` | method | SparkAssetPipelineCore | [AssetCookerTests.cpp:L88](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L88) | | +| `Spark::Cinematic::SequencerManager::GetInstance` | method | GameModules | [Main.cpp:L953](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L953) | | | `Spark::ComponentFactory::Get` | method | SparkEngine | [AngelScriptEngine.cpp:L1475](../../SparkEngine/Source/Engine/Scripting/AngelScriptEngine.cpp#L1475) | | | `Spark::ContainerUtils::Contains` | method | GameModules | [MMOCharacterSystem.cpp:L200](../../GameModules/SparkGameMMO/Source/Character/MMOCharacterSystem.cpp#L200) | | | `Spark::ContainerUtils::Contains` | method | GameModules | [MMOCraftingSystem.cpp:L329](../../GameModules/SparkGameMMO/Source/Crafting/MMOCraftingSystem.cpp#L329) | | @@ -43847,16 +43954,16 @@ | `Spark::ContainerUtils::Contains` | method | SparkEngine | [LocalFileCache.h:L297](../../SparkEngine/Source/Utils/LocalFileCache.h#L297) | Check if a path is currently cached | | `Spark::Core::Lifecycle::GetGameplayFrameCountImpl` | method | SparkEngine | [GameplaySystemLifecycle.cpp:L341](../../SparkEngine/Source/Core/GameplaySystemLifecycle.cpp#L341) | | | `Spark::Core::Lifecycle::GetPhaseSystemManagerImpl` | method | Tests | [TestLIFE200LifecycleLoopReal.cpp:L225](../../Tests/TestLIFE200LifecycleLoopReal.cpp#L225) | | -| `Spark::CrashHandlerDetail::FormatSymbolicCrashFrames` | method | SparkEngine | [CrashHandler.cpp:L1993](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1993) | | -| `Spark::CrashHandlerDetail::PathFromUtf8` | method | SparkEngine | [CrashHandler.cpp:L521](../../SparkEngine/Source/Utils/CrashHandler.cpp#L521) | | -| `Spark::CrashHandlerDetail::WideToUtf8` | method | SparkEngine | [CrashHandler.cpp:L112](../../SparkEngine/Source/Utils/CrashHandler.cpp#L112) | | +| `Spark::CrashHandlerDetail::FormatSymbolicCrashFrames` | method | SparkEngine | [CrashHandler.cpp:L1995](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1995) | | +| `Spark::CrashHandlerDetail::PathFromUtf8` | method | SparkEngine | [CrashHandler.cpp:L522](../../SparkEngine/Source/Utils/CrashHandler.cpp#L522) | | +| `Spark::CrashHandlerDetail::WideToUtf8` | method | SparkEngine | [CrashHandler.cpp:L113](../../SparkEngine/Source/Utils/CrashHandler.cpp#L113) | | | `Spark::Daemon::FormatDaemonStats` | method | SparkEngine | [DaemonLifecycle.cpp:L92](../../SparkEngine/Source/Utils/DaemonLifecycle.cpp#L92) | | | `Spark::Daemon::FormatDaemonStats` | method | SparkEngine | [DaemonLifecycle.cpp:L142](../../SparkEngine/Source/Utils/DaemonLifecycle.cpp#L142) | | | `Spark::Editor::CommandHistory::GetInstance` | method | SparkEditor | [EditorUI.cpp:L196](../../SparkEditor/Source/Core/EditorUI.cpp#L196) | | | `Spark::Editor::CommandHistory::GetInstance` | method | Tests | [TestEDT210InspectorEditCommitReal.cpp:L109](../../Tests/TestEDT210InspectorEditCommitReal.cpp#L109) | | | `Spark::Editor::CommandHistory::GetInstance` | method | Tests | [TestEDT210InspectorEditCommitReal.cpp:L114](../../Tests/TestEDT210InspectorEditCommitReal.cpp#L114) | | | `Spark::Editor::CommandHistory::GetInstance` | method | Tests | [TestEditorAssetDropWorldReal.cpp:L49](../../Tests/TestEditorAssetDropWorldReal.cpp#L49) | | -| `Spark::Editor::CommandHistory::GetInstance` | method | Tests | [TestEditorCookPackageReal.cpp:L98](../../Tests/TestEditorCookPackageReal.cpp#L98) | | +| `Spark::Editor::CommandHistory::GetInstance` | method | Tests | [TestEditorCookPackageReal.cpp:L100](../../Tests/TestEditorCookPackageReal.cpp#L100) | | | `Spark::Editor::CommandHistory::GetInstance` | method | Tests | [TestEditorDocumentReal.cpp:L27](../../Tests/TestEditorDocumentReal.cpp#L27) | | | `Spark::Editor::CommandHistory::GetInstance` | method | Tests | [TestEditorUndoWorldMatrixReal.cpp:L39](../../Tests/TestEditorUndoWorldMatrixReal.cpp#L39) | | | `Spark::FileIntegrity::ComputeSha256` | method | Tests | [TestGoldenImageTest.cpp:L79](../../Tests/TestGoldenImageTest.cpp#L79) | | @@ -43875,14 +43982,14 @@ | `Spark::HeadlessTickStats::ParseVmHwmKib` | method | SparkEngine | [SparkEngineLinuxHeadless.cpp:L71](../../SparkEngine/Source/Core/SparkEngineLinuxHeadless.cpp#L71) | | | `Spark::IsSDKCompatible` | method | Tests | [module_api.cpp:L12](../../Tests/PackageSmoke/FPSProgression/module_api.cpp#L12) | | | `Spark::JobSystem::ParseWorkerCount` | method | SparkEngine | [SparkEngineLinux.cpp:L243](../../SparkEngine/Source/Core/SparkEngineLinux.cpp#L243) | | -| `Spark::Json::Parse` | method | Tests | [TestTFDataTables.cpp:L72](../../Tests/TestTFDataTables.cpp#L72) | | +| `Spark::Json::Parse` | method | Tests | [TestTFDataTables.cpp:L63](../../Tests/TestTFDataTables.cpp#L63) | | | `Spark::Json::ParseBounded` | method | SparkEditor | [EditorRecoveryJson.h:L38](../../SparkEditor/Source/Core/EditorRecoveryJson.h#L38) | | | `Spark::Json::ParseStrict` | method | SparkEditor | [RegionMapDataSource.cpp:L107](../../SparkEditor/Source/Panels/RegionMapDataSource.cpp#L107) | | | `Spark::Json::StringifyPretty` | method | SparkLauncher | [LauncherProcess.cpp:L381](../../SparkLauncher/src/LauncherProcess.cpp#L381) | | | `Spark::Json::Value` | method | Tests | [TestDATA120SecretsAtRest.cpp:L120](../../Tests/TestDATA120SecretsAtRest.cpp#L120) | | | `Spark::Net::InstabilitySimulator::GetInstance` | method | SparkEngine | [SubsystemConsoleCommands.cpp:L354](../../SparkEngine/Source/Core/SubsystemConsoleCommands.cpp#L354) | | | `Spark::Net::InstabilitySimulator::GetInstance` | method | SparkEngine | [SubsystemConsoleCommands.cpp:L408](../../SparkEngine/Source/Core/SubsystemConsoleCommands.cpp#L408) | | -| `Spark::Net::NetworkManager::GetInstance` | method | GameModules | [GameConsoleOps.cpp:L1138](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1138) | | +| `Spark::Net::NetworkManager::GetInstance` | method | GameModules | [GameConsoleOps.cpp:L1146](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1146) | | | `Spark::Net::NetworkManager::GetInstance` | method | Tests | [DebugHookTeardownProbe.cpp:L14](../../Tests/Teardown/DebugHookTeardownProbe.cpp#L14) | | | `Spark::ParseExecScript` | method | Tests | [TestExecScript.cpp:L57](../../Tests/TestExecScript.cpp#L57) | | | `Spark::PasswordHash::ComputeHmacSha256` | method | SparkGateway | [GatewaySecurity.cpp:L64](../../SparkGateway/src/GatewaySecurity.cpp#L64) | | @@ -44009,7 +44116,7 @@ | `SPARK_EDITOR_HAS_DX_PROGRAMMABLE_CAPTURE` | macro | SparkEditor | [PerformanceProfiler.cpp:L21](../../SparkEditor/Source/Profiler/PerformanceProfiler.cpp#L21) | | | `SPARK_EDITOR_HAS_DX_PROGRAMMABLE_CAPTURE` | macro | SparkEditor | [PerformanceProfiler.cpp:L23](../../SparkEditor/Source/Profiler/PerformanceProfiler.cpp#L23) | | | `SPARK_ENABLE_BITMASK_OPERATORS` | macro | SparkEngine | [BitFlags.h:L53](../../SparkEngine/Source/Utils/BitFlags.h#L53) | Enable \|, &, ^, ~ operators for a scoped enum. | -| `SPARK_ENGINE_VERSION_PACKED` | macro | SparkSDK | [Version.h:L43](../../SparkSDK/Include/Spark/Version.h#L43) | | +| `SPARK_ENGINE_VERSION_PACKED` | macro | SparkSDK | [Version.h:L47](../../SparkSDK/Include/Spark/Version.h#L47) | | | `SPARK_ENSURE` | macro | SparkEngine | [Validate.h:L340](../../SparkEngine/Source/Utils/Validate.h#L340) | Postcondition check: logs fatal error and aborts if expr is false | | `SPARK_ENSURE_MSG` | macro | SparkEngine | [Validate.h:L355](../../SparkEngine/Source/Utils/Validate.h#L355) | Postcondition check with a diagnostic message | | `SPARK_ENSURES` | macro | SparkEngine | [Contracts.h:L51](../../SparkEngine/Source/Core/Contracts.h#L51) | | @@ -44226,7 +44333,7 @@ | `SPARK_SCOPED_CONTEXT` | macro | SparkEngine | [SparkError.h:L420](../../SparkEngine/Source/Utils/SparkError.h#L420) | | | `SPARK_SCOPED_TIMER` | macro | SparkEngine | [ScopedTimer.h:L103](../../SparkEngine/Source/Utils/ScopedTimer.h#L103) | Convenience macro: creates a ScopedTimer that prints to stdout. | | `SPARK_SCREENCAP_PNG` | macro | SparkEngine | [ScreenCapture.h:L39](../../SparkEngine/Source/Graphics/ScreenCapture.h#L39) | | -| `SPARK_SDK_VERSION` | macro | SparkSDK | [Version.h:L40](../../SparkSDK/Include/Spark/Version.h#L40) | | +| `SPARK_SDK_VERSION` | macro | SparkSDK | [Version.h:L44](../../SparkSDK/Include/Spark/Version.h#L44) | | | `SPARK_SERVICE_TESTS_NOINLINE` | macro | SparkDaemon | [ServiceTests.cpp:L44](../../SparkDaemon/tests/ServiceTests.cpp#L44) | | | `SPARK_SERVICE_TESTS_NOINLINE` | macro | SparkDaemon | [ServiceTests.cpp:L46](../../SparkDaemon/tests/ServiceTests.cpp#L46) | | | `SPARK_SHARED_EXT` | macro | SparkBuild | [Platform.h:L35](../../SparkBuild/src/Platform.h#L35) | | @@ -44284,7 +44391,7 @@ | `SPARK_TRACK_THREAD_START` | macro | SparkEngine | [ThreadDebugger.h:L490](../../SparkEngine/Source/Utils/ThreadDebugger.h#L490) | Print thread debugger summary | | `SPARK_TRACKED_LOCK` | macro | SparkEngine | [DeadlockDetector.h:L195](../../SparkEngine/Source/Utils/DeadlockDetector.h#L195) | | | `SPARK_TRACKED_LOCK` | macro | SparkEngine | [DeadlockDetector.h:L197](../../SparkEngine/Source/Utils/DeadlockDetector.h#L197) | | -| `SPARK_TYPEID_DEFINED` | macro | SparkEngine | [EngineContext.h:L60](../../SparkEngine/Source/Core/EngineContext.h#L60) | Unique type identifier that does not require complete types | +| `SPARK_TYPEID_DEFINED` | macro | SparkEngine | [EngineContext.h:L61](../../SparkEngine/Source/Core/EngineContext.h#L61) | Unique type identifier that does not require complete types | | `SPARK_UNREACHABLE` | macro | SparkEngine | [Validate.h:L375](../../SparkEngine/Source/Utils/Validate.h#L375) | Marks code paths that should never be reached — aborts in Debug, UB hint in Release | | `SPARK_UNREACHABLE` | macro | SparkEngine | [Validate.h:L377](../../SparkEngine/Source/Utils/Validate.h#L377) | | | `SPARK_VALIDATE` | macro | SparkEngine | [Validate.h:L160](../../SparkEngine/Source/Utils/Validate.h#L160) | Soft validation: logs an error and returns (void) if expr is false | @@ -44352,7 +44459,7 @@ | `SparkEngineCamera` | class | GameModules | [TFWorldSetup.h:L50](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetup.h#L50) | | | `SparkEngineCamera` | class | SparkEngine | [SparkEngineCamera.h:L53](../../SparkEngine/Source/Camera/SparkEngineCamera.h#L53) | | | `SparkEngineCamera` | class | SparkEngine | [SparkEngine.h:L27](../../SparkEngine/Source/Core/SparkEngine.h#L27) | | -| `SparkEngineCamera` | class | SparkSDK | [IEngineContext.h:L31](../../SparkSDK/Include/Spark/IEngineContext.h#L31) | | +| `SparkEngineCamera` | class | SparkSDK | [IEngineContext.h:L32](../../SparkSDK/Include/Spark/IEngineContext.h#L32) | | | `SparkEngineCamera` | class | Tests | [TestCameraTransforms.cpp:L95](../../Tests/TestCameraTransforms.cpp#L95) | | | `SparkEngineCamera::Console_GetState` | method | SparkEngine | [SparkEngineCameraConsoleOps.cpp:L199](../../SparkEngine/Source/Camera/SparkEngineCameraConsoleOps.cpp#L199) | | | `SparkEngineCamera::Console_LookAt` | method | SparkEngine | [SparkEngineCameraConsoleOps.cpp:L213](../../SparkEngine/Source/Camera/SparkEngineCameraConsoleOps.cpp#L213) | | @@ -44437,8 +44544,8 @@ | `SparkEngineIntegration::UpdateEntityTransform` | method | SparkEditor | [SparkEngineIntegration.cpp:L377](../../SparkEditor/Source/Integration/SparkEngineIntegration.cpp#L377) | | | `SparkError::HResultFailed` | method | SparkEngine | [SparkError.h:L326](../../SparkEngine/Source/Utils/SparkError.h#L326) | | | `SparkError::HResultFailed` | method | SparkEngine | [SparkError.h:L336](../../SparkEngine/Source/Utils/SparkError.h#L336) | | -| `SparkFPS::FPSMultiplayerSystem::GetInstance` | method | GameModules | [GameConsoleOps.cpp:L1123](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1123) | | -| `SparkFPS::FPSMultiplayerSystem::GetInstance` | method | GameModules | [GameConsoleOps.cpp:L1130](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1130) | | +| `SparkFPS::FPSMultiplayerSystem::GetInstance` | method | GameModules | [GameConsoleOps.cpp:L1131](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1131) | | +| `SparkFPS::FPSMultiplayerSystem::GetInstance` | method | GameModules | [GameConsoleOps.cpp:L1138](../../GameModules/SparkGameFPS/Source/Game/GameConsoleOps.cpp#L1138) | | | `SparkGameARPGModule` | class | GameModules | [SparkGameARPG.h:L49](../../GameModules/SparkGameARPG/Source/Core/SparkGameARPG.h#L49) | | | `SparkGameARPGModule::GetModuleInfo` | method | GameModules | [Main.cpp:L54](../../GameModules/SparkGameARPG/Source/Core/Main.cpp#L54) | | | `SparkGameARPGModule::OnFixedUpdate` | method | GameModules | [Main.cpp:L316](../../GameModules/SparkGameARPG/Source/Core/Main.cpp#L316) | | @@ -44482,7 +44589,7 @@ | `SparkGameMMOModule::RegisterStateValidationRules` | method | GameModules | [Main.cpp:L343](../../GameModules/SparkGameMMO/Source/Core/Main.cpp#L343) | | | `SparkGameMMOModule::ShutdownSystems` | method | GameModules | [Main.cpp:L427](../../GameModules/SparkGameMMO/Source/Core/Main.cpp#L427) | | | `SparkGameMMOModule::UnregisterConsoleCommands` | method | GameModules | [Main.cpp:L971](../../GameModules/SparkGameMMO/Source/Core/Main.cpp#L971) | | -| `SparkGameModule` | function | GameModules | [Main.cpp:L1380](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1380) | | +| `SparkGameModule` | function | GameModules | [Main.cpp:L1383](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1383) | | | `SparkGameModule` | class | GameModules | [SparkGameFPS.h:L48](../../GameModules/SparkGameFPS/Source/Core/SparkGameFPS.h#L48) | Game module implementation for SparkGame | | `SparkGameModule::GetModuleInfo` | method | GameModules | [Main.cpp:L95](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L95) | | | `SparkGameModule::HeadlessQuickLoad` | method | GameModules | [HeadlessPersistence.cpp:L143](../../GameModules/SparkGameFPS/Source/Core/HeadlessPersistence.cpp#L143) | | @@ -44494,13 +44601,13 @@ | `SparkGameModule::OnLoad` | method | GameModules | [Main.cpp:L105](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L105) | | | `SparkGameModule::OnPause` | method | GameModules | [Main.cpp:L231](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L231) | | | `SparkGameModule::OnRender` | method | GameModules | [Main.cpp:L225](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L225) | | -| `SparkGameModule::OnResize` | method | GameModules | [Main.cpp:L379](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L379) | | +| `SparkGameModule::OnResize` | method | GameModules | [Main.cpp:L382](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L382) | | | `SparkGameModule::OnResume` | method | GameModules | [Main.cpp:L237](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L237) | | | `SparkGameModule::OnUnload` | method | GameModules | [Main.cpp:L195](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L195) | | | `SparkGameModule::OnUpdate` | method | GameModules | [Main.cpp:L200](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L200) | | -| `SparkGameModule::RegisterGameConsoleCommands` | method | GameModules | [Main.cpp:L390](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L390) | | +| `SparkGameModule::RegisterGameConsoleCommands` | method | GameModules | [Main.cpp:L393](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L393) | | | `SparkGameModule::RegisterHeadlessPersistenceCommands` | method | GameModules | [HeadlessPersistence.cpp:L39](../../GameModules/SparkGameFPS/Source/Core/HeadlessPersistence.cpp#L39) | | -| `SparkGameModule::Shutdown` | method | GameModules | [Main.cpp:L341](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L341) | | +| `SparkGameModule::Shutdown` | method | GameModules | [Main.cpp:L346](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L346) | | | `SparkGameModule::ShutdownHeadlessArena` | method | GameModules | [HeadlessArena.cpp:L90](../../GameModules/SparkGameFPS/Source/Core/HeadlessArena.cpp#L90) | | | `SparkGameOpenWorldModule` | class | GameModules | [SparkGameOpenWorld.h:L42](../../GameModules/SparkGameOpenWorld/Source/Core/SparkGameOpenWorld.h#L42) | Game module showcasing open-world gameplay on SparkEngine | | `SparkGameOpenWorldModule::GetModuleInfo` | method | GameModules | [Main.cpp:L48](../../GameModules/SparkGameOpenWorld/Source/Core/Main.cpp#L48) | | @@ -45040,7 +45147,7 @@ | `StandardPipelineBuilder::MakeShadowDesc` | method | SparkEngine | [RenderGraphBuilder.cpp:L71](../../SparkEngine/Source/Graphics/RenderGraph/RenderGraphBuilder.cpp#L71) | | | `StandardPipelineBuilder::SetCallbacks` | method | SparkEngine | [RenderGraphBuilder.cpp:L31](../../SparkEngine/Source/Graphics/RenderGraph/RenderGraphBuilder.cpp#L31) | | | `StandardPipelineBuilder::SetFrameData` | method | SparkEngine | [RenderGraphBuilder.cpp:L26](../../SparkEngine/Source/Graphics/RenderGraph/RenderGraphBuilder.cpp#L26) | | -| `StandOnSpawnPad` | function | Tests | [TestTF120Travel.cpp:L164](../../Tests/TestTF120Travel.cpp#L164) | | +| `StandOnSpawnPad` | function | Tests | [TestTF120Travel.cpp:L151](../../Tests/TestTF120Travel.cpp#L151) | | | `Start` | function | GameModules | [WaveSpawner.h:L82](../../GameModules/SparkGameFPS/Source/Game/WaveSpawner.h#L82) | Start wave progression from wave 1 | | `Start` | function | SparkEngine | [DynamicPluginHost.h:L52](../../SparkEngine/Source/Core/DynamicPluginHost.h#L52) | | | `Start` | function | SparkEngine | [ModuleHotReload.h:L80](../../SparkEngine/Source/Core/ModuleHotReload.h#L80) | Start watching for changes | @@ -45176,6 +45283,7 @@ | `State` | function | Tests | [TestEditorAssetDropWorldReal.cpp:L61](../../Tests/TestEditorAssetDropWorldReal.cpp#L61) | | | `State` | enum | Tests | [TestServerMockClient.cpp:L332](../../Tests/TestServerMockClient.cpp#L332) | | | `State` | enum | Tests | [TestStateMachine.cpp:L9](../../Tests/TestStateMachine.cpp#L9) | | +| `StateAt` | function | Tests | [TestTFReplicationRefresh.cpp:L19](../../Tests/TestTFReplicationRefresh.cpp#L19) | | | `StateCheckFn` | alias | SparkSDK | [IStateValidation.h:L86](../../SparkSDK/Include/Spark/IStateValidation.h#L86) | | | `StateDocument` | function | SparkInstaller | [InstallStateTests.cpp:L224](../../SparkInstaller/tests/InstallStateTests.cpp#L224) | | | `StateHasher` | struct | GameModules | [RTSSkirmishSimulation.cpp:L35](../../GameModules/SparkGameRTS/Source/Simulation/RTSSkirmishSimulation.cpp#L35) | | @@ -45236,11 +45344,11 @@ | `status` | function | Tests | [TestEngineLoadTest.cpp:L119](../../Tests/TestEngineLoadTest.cpp#L119) | | | `Status` | alias | Tests | [TestSDK240ModuleDiagnostics.cpp:L157](../../Tests/TestSDK240ModuleDiagnostics.cpp#L157) | | | `status` | struct | Tests | [TestSecDaemonPipeIdentity.cpp:L87](../../Tests/TestSecDaemonPipeIdentity.cpp#L87) | | -| `statusBarPos` | function | SparkEditor | [EditorUI.cpp:L945](../../SparkEditor/Source/Core/EditorUI.cpp#L945) | | -| `statusBarSize` | function | SparkEditor | [EditorUI.cpp:L946](../../SparkEditor/Source/Core/EditorUI.cpp#L946) | | +| `statusBarPos` | function | SparkEditor | [EditorUI.cpp:L965](../../SparkEditor/Source/Core/EditorUI.cpp#L965) | | +| `statusBarSize` | function | SparkEditor | [EditorUI.cpp:L966](../../SparkEditor/Source/Core/EditorUI.cpp#L966) | | | `statusColor` | function | SparkEditor | [WorkflowPanel.cpp:L193](../../SparkEditor/Source/Panels/WorkflowPanel.cpp#L193) | | | `statusColor` | function | SparkEditor | [VersionControlRender.cpp:L163](../../SparkEditor/Source/VersionControl/VersionControlRender.cpp#L163) | | -| `statusFile` | function | SparkEngine | [CrashHandler.cpp:L1739](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1739) | | +| `statusFile` | function | SparkEngine | [CrashHandler.cpp:L1740](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1740) | | | `StatusLine` | function | Tests | [TestSparkGameShowcase.cpp:L197](../../Tests/TestSparkGameShowcase.cpp#L197) | | | `StatusLine` | function | Tests | [TestSparkGameShowcase.cpp:L216](../../Tests/TestSparkGameShowcase.cpp#L216) | | | `StatusString` | function | GameModules | [TFAlertSystem.cpp:L76](../../GameModules/SparkGameMMOFPS/Source/World/TFAlertSystem.cpp#L76) | | @@ -45289,7 +45397,7 @@ | `std::any_of` | method | SparkEngine | [EnvironmentQuery.h:L452](../../SparkEngine/Source/Engine/AI/EnvironmentQuery.h#L452) | | | `std::any_of` | method | SparkEngine | [RuntimePrefab.h:L138](../../SparkEngine/Source/Engine/ECS/RuntimePrefab.h#L138) | Check whether the prefab contains a component of the given type. | | `std::any_of` | method | SparkEngine | [AbilityAuras.cpp:L131](../../SparkEngine/Source/Engine/Gameplay/AbilityAuras.cpp#L131) | | -| `std::any_of` | method | SparkEngine | [VisualScriptEmitter.cpp:L440](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L440) | | +| `std::any_of` | method | SparkEngine | [VisualScriptEmitter.cpp:L465](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L465) | | | `std::any_of` | method | SparkEngine | [FoliageSystem.cpp:L269](../../SparkEngine/Source/Graphics/FoliageSystem.cpp#L269) | | | `std::any_of` | method | SparkEngine | [InvalidStateDetector.h:L162](../../SparkEngine/Source/Utils/InvalidStateDetector.h#L162) | Remove all registered rules (including the engine defaults). | | `std::any_of` | method | Tests | [TestENG220ObjImportReal.cpp:L152](../../Tests/TestENG220ObjImportReal.cpp#L152) | | @@ -45345,7 +45453,7 @@ | `std::exp` | method | SparkEngine | [FogSystem.h:L181](../../SparkEngine/Source/Graphics/FogSystem.h#L181) | | | `std::fabs` | method | Tests | [TestNetQuantize.cpp:L38](../../Tests/TestNetQuantize.cpp#L38) | | | `std::fabs` | method | Tests | [TestSEC3ScriptingHardening.cpp:L336](../../Tests/TestSEC3ScriptingHardening.cpp#L336) | | -| `std::fabs` | method | Tests | [TestTF120Travel.cpp:L384](../../Tests/TestTF120Travel.cpp#L384) | | +| `std::fabs` | method | Tests | [TestTF120Travel.cpp:L371](../../Tests/TestTF120Travel.cpp#L371) | | | `std::fclose` | method | SparkEngine | [NeuralWeights.cpp:L294](../../SparkEngine/Source/Graphics/Neural/NeuralWeights.cpp#L294) | | | `std::filesystem::current_path` | method | SparkEngine | [SparkEngineLinuxInit.cpp:L64](../../SparkEngine/Source/Core/SparkEngineLinuxInit.cpp#L64) | | | `std::filesystem::current_path` | method | SparkEngine | [SparkEngineMacOS.cpp:L102](../../SparkEngine/Source/Core/SparkEngineMacOS.cpp#L102) | | @@ -45358,14 +45466,14 @@ | `std::filesystem::exists` | method | SparkEditor | [VersionControlSystem.cpp:L89](../../SparkEditor/Source/VersionControl/VersionControlSystem.cpp#L89) | | | `std::filesystem::exists` | method | SparkEditor | [VersionControlSystem.cpp:L160](../../SparkEditor/Source/VersionControl/VersionControlSystem.cpp#L160) | | | `std::filesystem::exists` | method | Tests | [TestReflectedSceneCompatibility.cpp:L66](../../Tests/TestReflectedSceneCompatibility.cpp#L66) | | -| `std::filesystem::is_directory` | method | GameModules | [FPSAssetPaths.cpp:L99](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L99) | | +| `std::filesystem::is_directory` | method | GameModules | [FPSAssetPaths.cpp:L111](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L111) | | | `std::filesystem::is_directory` | method | SparkEditor | [EditorLaunchContext.h:L174](../../SparkEditor/Source/Utils/EditorLaunchContext.h#L174) | | | `std::filesystem::is_regular_file` | method | GameModules | [VisualScriptDemoWorld.cpp:L90](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.cpp#L90) | | | `std::filesystem::is_regular_file` | method | SparkAssetPipelineCore | [AssetCooker.cpp:L218](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L218) | | | `std::filesystem::is_regular_file` | method | SparkLauncher | [LauncherProcess.cpp:L117](../../SparkLauncher/src/LauncherProcess.cpp#L117) | | | `std::filesystem::is_regular_file` | method | Tests | [TestGameModuleMMO.cpp:L109](../../Tests/TestGameModuleMMO.cpp#L109) | | | `std::filesystem::is_symlink` | method | SparkLauncher | [LauncherProcess.cpp:L123](../../SparkLauncher/src/LauncherProcess.cpp#L123) | | -| `std::filesystem::path` | method | GameModules | [FPSAssetPaths.cpp:L29](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L29) | | +| `std::filesystem::path` | method | GameModules | [FPSAssetPaths.cpp:L31](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L31) | | | `std::filesystem::path` | method | GameModules | [TFSavePaths.h:L534](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFSavePaths.h#L534) | | | `std::filesystem::path` | method | GameModules | [OWPersistence.inl:L351](../../GameModules/SparkGameOpenWorld/Source/Persistence/OWPersistence.inl#L351) | | | `std::filesystem::path` | method | SparkAssetPipelineCore | [AssetCooker.cpp:L171](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L171) | | @@ -45404,12 +45512,15 @@ | `std::filesystem::temp_directory_path` | method | SparkBuild | [ProcessRunnerTests.cpp:L57](../../SparkBuild/tests/ProcessRunnerTests.cpp#L57) | | | `std::filesystem::temp_directory_path` | method | SparkDaemon | [OrchestratorIdentity.cpp:L384](../../SparkDaemon/src/OrchestratorIdentity.cpp#L384) | | | `std::filesystem::temp_directory_path` | method | SparkInstaller | [InstallStateTests.cpp:L14](../../SparkInstaller/tests/InstallStateTests.cpp#L14) | | +| `std::filesystem::temp_directory_path` | method | Tests | [TestAssetParserHardening.cpp:L52](../../Tests/TestAssetParserHardening.cpp#L52) | | | `std::filesystem::temp_directory_path` | method | Tests | [TestExecScript.cpp:L50](../../Tests/TestExecScript.cpp#L50) | | | `std::filesystem::temp_directory_path` | method | Tests | [TestFileUtils.cpp:L29](../../Tests/TestFileUtils.cpp#L29) | | | `std::filesystem::temp_directory_path` | method | Tests | [TestLoggerSinksReal.cpp:L21](../../Tests/TestLoggerSinksReal.cpp#L21) | | | `std::filesystem::temp_directory_path` | method | Tests | [TestOnlineServicesLocalStack.cpp:L214](../../Tests/TestOnlineServicesLocalStack.cpp#L214) | | | `std::filesystem::temp_directory_path` | method | Tests | [TestScreenCapture.cpp:L15](../../Tests/TestScreenCapture.cpp#L15) | | +| `std::filesystem::temp_directory_path` | method | Tests | [TestSparkPak.cpp:L271](../../Tests/TestSparkPak.cpp#L271) | | | `std::filesystem::temp_directory_path` | method | Tests | [TestStartupSplash.cpp:L19](../../Tests/TestStartupSplash.cpp#L19) | | +| `std::filesystem::temp_directory_path` | method | Tests | [TestThirdPartyIntegration.cpp:L70](../../Tests/TestThirdPartyIntegration.cpp#L70) | | | `std::filesystem::u8path` | method | SparkCrashReporter | [CrashReporterApp.cpp:L666](../../SparkCrashReporter/src/CrashReporterApp.cpp#L666) | | | `std::filesystem::u8path` | method | SparkEditor | [EditorLaunchContext.h:L25](../../SparkEditor/Source/Utils/EditorLaunchContext.h#L25) | | | `std::filesystem::u8path` | method | SparkEngine | [ModuleManager.cpp:L149](../../SparkEngine/Source/Core/ModuleManager.cpp#L149) | | @@ -45428,7 +45539,7 @@ | `std::find` | method | Tests | [TestContainerUtils.cpp:L63](../../Tests/TestContainerUtils.cpp#L63) | | | `std::find` | method | Tests | [TestCrashHandlerGatingReal.cpp:L237](../../Tests/TestCrashHandlerGatingReal.cpp#L237) | | | `std::find` | method | Tests | [TestPrototypeModuleKitReal.cpp:L110](../../Tests/TestPrototypeModuleKitReal.cpp#L110) | | -| `std::find` | method | Tests | [TestTFDataTables.cpp:L98](../../Tests/TestTFDataTables.cpp#L98) | | +| `std::find` | method | Tests | [TestTFDataTables.cpp:L89](../../Tests/TestTFDataTables.cpp#L89) | | | `std::find_if` | method | SparkEditor | [EditorPluginManager.cpp:L473](../../SparkEditor/Source/Core/EditorPluginManager.cpp#L473) | | | `std::find_if` | method | SparkEditor | [EditorPluginManager.cpp:L479](../../SparkEditor/Source/Core/EditorPluginManager.cpp#L479) | | | `std::find_if` | method | SparkEditor | [EditorPluginManager.cpp:L485](../../SparkEditor/Source/Core/EditorPluginManager.cpp#L485) | | @@ -45592,13 +45703,13 @@ | `std::min` | method | SparkEngine | [ConnectRateLimiter.cpp:L28](../../SparkEngine/Source/Engine/Networking/ConnectRateLimiter.cpp#L28) | | | `std::min` | method | SparkEngine | [FastNoise2SIMD.h:L642](../../SparkEngine/Source/Graphics/FastNoise2SIMD.h#L642) | | | `std::min` | method | SparkEngine | [GraphicsEngineSubmit.cpp:L131](../../SparkEngine/Source/Graphics/GraphicsEngineSubmit.cpp#L131) | | -| `std::min` | method | SparkEngine | [InputManager.cpp:L545](../../SparkEngine/Source/Input/InputManager.cpp#L545) | | +| `std::min` | method | SparkEngine | [InputManager.cpp:L568](../../SparkEngine/Source/Input/InputManager.cpp#L568) | | | `std::min` | method | SparkEngine | [ProcessPipeBuffer.h:L21](../../SparkEngine/Source/Utils/ProcessPipeBuffer.h#L21) | | | `std::min` | method | SparkServer | [ServerHealth.cpp:L114](../../SparkServer/src/ServerHealth.cpp#L114) | | | `std::min` | method | Tests | [TestNetQuantize.cpp:L33](../../Tests/TestNetQuantize.cpp#L33) | | | `std::min_element` | method | SparkEngine | [VisualScriptEmitNode.cpp:L29](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitNode.cpp#L29) | | | `std::move` | method | SparkEditor | [StandaloneCollaborationClient.cpp:L69](../../SparkEditor/Source/Communication/StandaloneCollaborationClient.cpp#L69) | | -| `std::move` | method | SparkEngine | [CrashHandler.cpp:L913](../../SparkEngine/Source/Utils/CrashHandler.cpp#L913) | | +| `std::move` | method | SparkEngine | [CrashHandler.cpp:L914](../../SparkEngine/Source/Utils/CrashHandler.cpp#L914) | | | `std::move` | method | Tests | [TestFPSLANLoopback.cpp:L165](../../Tests/TestFPSLANLoopback.cpp#L165) | | | `std::mt19937_64` | method | SparkEngine | [UUID.h:L48](../../SparkEngine/Source/Utils/UUID.h#L48) | | | `std::none_of` | method | SparkEditor | [EditorLayoutManager.cpp:L75](../../SparkEditor/Source/Core/EditorLayoutManager.cpp#L75) | | @@ -45616,12 +45727,12 @@ | `std::pow` | method | SparkEngine | [TweenSystem.cpp:L54](../../SparkEngine/Source/Engine/Tween/TweenSystem.cpp#L54) | | | `std::pow` | method | SparkEngine | [Tween.h:L202](../../SparkEngine/Source/Utils/Tween.h#L202) | | | `std::pow` | method | Tests | [TestRHI210D3D11PassGoldenReal.cpp:L284](../../Tests/TestRHI210D3D11PassGoldenReal.cpp#L284) | | -| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L667](../../SparkConsole/src/ConsoleApp.cpp#L667) | | -| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L679](../../SparkConsole/src/ConsoleApp.cpp#L679) | | -| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L703](../../SparkConsole/src/ConsoleApp.cpp#L703) | | -| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L711](../../SparkConsole/src/ConsoleApp.cpp#L711) | | -| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L755](../../SparkConsole/src/ConsoleApp.cpp#L755) | | -| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L766](../../SparkConsole/src/ConsoleApp.cpp#L766) | | +| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L671](../../SparkConsole/src/ConsoleApp.cpp#L671) | | +| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L683](../../SparkConsole/src/ConsoleApp.cpp#L683) | | +| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L707](../../SparkConsole/src/ConsoleApp.cpp#L707) | | +| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L715](../../SparkConsole/src/ConsoleApp.cpp#L715) | | +| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L759](../../SparkConsole/src/ConsoleApp.cpp#L759) | | +| `std::put_time` | method | SparkConsole | [ConsoleApp.cpp:L770](../../SparkConsole/src/ConsoleApp.cpp#L770) | | | `std::put_time` | method | SparkEditor | [EditorLogger.cpp:L44](../../SparkEditor/Source/Core/EditorLogger.cpp#L44) | | | `std::put_time` | method | SparkEditor | [EditorLogger.cpp:L316](../../SparkEditor/Source/Core/EditorLogger.cpp#L316) | | | `std::put_time` | method | SparkEditor | [ExternalConsoleIntegration.cpp:L934](../../SparkEditor/Source/Integration/ExternalConsoleIntegration.cpp#L934) | | @@ -45646,6 +45757,7 @@ | `std::remainder` | method | GameModules | [FPSArenaAutopilot.cpp:L32](../../GameModules/SparkGameFPS/Source/Game/FPSArenaAutopilot.cpp#L32) | | | `std::remainder` | method | GameModules | [TFRepProtocol.h:L85](../../GameModules/SparkGameMMOFPS/Source/Net/TFRepProtocol.h#L85) | | | `std::rename` | method | SparkBuild | [ArchiveExtraction.cpp:L128](../../SparkBuild/src/ArchiveExtraction.cpp#L128) | | +| `std::runtime_error` | method | GameModules | [GameEngineSystems.cpp:L504](../../GameModules/SparkGameFPS/Source/Game/GameEngineSystems.cpp#L504) | | | `std::runtime_error` | method | GameModules | [TFCrypto.cpp:L70](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.cpp#L70) | | | `std::runtime_error` | method | GameModules | [TFCrypto.cpp:L92](../../GameModules/SparkGameMMOFPS/Source/Account/TFCrypto.cpp#L92) | | | `std::runtime_error` | method | SparkEditor | [EditorUI.cpp:L91](../../SparkEditor/Source/Core/EditorUI.cpp#L91) | | @@ -45693,6 +45805,7 @@ | `std::runtime_error` | method | Tests | [TestAngelScriptStackAlignmentReal.cpp:L197](../../Tests/TestAngelScriptStackAlignmentReal.cpp#L197) | | | `std::runtime_error` | method | Tests | [TestEditorSubsystems.cpp:L1806](../../Tests/TestEditorSubsystems.cpp#L1806) | | | `std::runtime_error` | method | Tests | [TestEditorSubsystems.cpp:L1812](../../Tests/TestEditorSubsystems.cpp#L1812) | | +| `std::runtime_error` | method | Tests | [TestFPSGameCameraReloadReal.cpp:L26](../../Tests/TestFPSGameCameraReloadReal.cpp#L26) | | | `std::runtime_error` | method | Tests | [TestFaultIsolation.cpp:L342](../../Tests/TestFaultIsolation.cpp#L342) | | | `std::runtime_error` | method | Tests | [TestGatewayAreaControl.cpp:L1264](../../Tests/TestGatewayAreaControl.cpp#L1264) | | | `std::runtime_error` | method | Tests | [TestLIFE200LifecycleLoopReal.cpp:L128](../../Tests/TestLIFE200LifecycleLoopReal.cpp#L128) | | @@ -45811,7 +45924,7 @@ | `std::setprecision` | method | Tests | [TestFullEngineDiagnostics.cpp:L360](../../Tests/TestFullEngineDiagnostics.cpp#L360) | | | `std::setw` | method | SparkEngine | [AudioEngine.cpp:L725](../../SparkEngine/Source/Audio/AudioEngine.cpp#L725) | | | `std::setw` | method | SparkEngine | [DedicatedServer.cpp:L1086](../../SparkEngine/Source/Engine/Networking/DedicatedServer.cpp#L1086) | | -| `std::setw` | method | SparkEngine | [InputManager.cpp:L454](../../SparkEngine/Source/Input/InputManager.cpp#L454) | | +| `std::setw` | method | SparkEngine | [InputManager.cpp:L477](../../SparkEngine/Source/Input/InputManager.cpp#L477) | | | `std::setw` | method | SparkGateway | [GatewayApplication.cpp:L61](../../SparkGateway/src/GatewayApplication.cpp#L61) | | | `std::setw` | method | SparkServer | [ServerHealth.cpp:L60](../../SparkServer/src/ServerHealth.cpp#L60) | | | `std::sin` | method | SparkEngine | [SoundEffect.cpp:L364](../../SparkEngine/Source/Audio/SoundEffect.cpp#L364) | | @@ -45888,10 +46001,10 @@ | `std::string` | method | GameModules | [HeadlessPersistence.cpp:L140](../../GameModules/SparkGameFPS/Source/Core/HeadlessPersistence.cpp#L140) | | | `std::string` | method | GameModules | [HeadlessPersistence.cpp:L153](../../GameModules/SparkGameFPS/Source/Core/HeadlessPersistence.cpp#L153) | | | `std::string` | method | GameModules | [HeadlessPersistence.cpp:L167](../../GameModules/SparkGameFPS/Source/Core/HeadlessPersistence.cpp#L167) | | -| `std::string` | method | GameModules | [Main.cpp:L684](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L684) | | -| `std::string` | method | GameModules | [Main.cpp:L746](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L746) | | -| `std::string` | method | GameModules | [Main.cpp:L1270](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1270) | | -| `std::string` | method | GameModules | [FPSAssetPaths.cpp:L162](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L162) | | +| `std::string` | method | GameModules | [Main.cpp:L687](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L687) | | +| `std::string` | method | GameModules | [Main.cpp:L749](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L749) | | +| `std::string` | method | GameModules | [Main.cpp:L1273](../../GameModules/SparkGameFPS/Source/Core/Main.cpp#L1273) | | +| `std::string` | method | GameModules | [FPSAssetPaths.cpp:L176](../../GameModules/SparkGameFPS/Source/Game/FPSAssetPaths.cpp#L176) | | | `std::string` | method | GameModules | [FPSLocalProfile.cpp:L22](../../GameModules/SparkGameFPS/Source/Game/FPSLocalProfile.cpp#L22) | | | `std::string` | method | GameModules | [InteractiveObject.cpp:L237](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.cpp#L237) | | | `std::string` | method | GameModules | [TFCommands.cpp:L348](../../GameModules/SparkGameMMOFPS/Source/Console/TFCommands.cpp#L348) | | @@ -45923,7 +46036,7 @@ | `std::string` | method | GameModules | [OWPersistence.inl:L94](../../GameModules/SparkGameOpenWorld/Source/Persistence/OWPersistence.inl#L94) | | | `std::string` | method | SparkBuild | [ProcessRunner.cpp:L108](../../SparkBuild/src/ProcessRunner.cpp#L108) | | | `std::string` | method | SparkBuild | [DownloaderTests.cpp:L263](../../SparkBuild/tests/DownloaderTests.cpp#L263) | | -| `std::string` | method | SparkConsole | [ConsoleApp.cpp:L932](../../SparkConsole/src/ConsoleApp.cpp#L932) | | +| `std::string` | method | SparkConsole | [ConsoleApp.cpp:L936](../../SparkConsole/src/ConsoleApp.cpp#L936) | | | `std::string` | method | SparkCrashReporter | [CrashReporterApp.cpp:L676](../../SparkCrashReporter/src/CrashReporterApp.cpp#L676) | | | `std::string` | method | SparkCrashReporter | [CrashReporterConsentTests.cpp:L128](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L128) | | | `std::string` | method | SparkDaemon | [OrchestratorIdentity.cpp:L72](../../SparkDaemon/src/OrchestratorIdentity.cpp#L72) | | @@ -46006,8 +46119,8 @@ | `std::string` | method | Tests | [TestDialogueSystem.cpp:L73](../../Tests/TestDialogueSystem.cpp#L73) | | | `std::string` | method | Tests | [TestDocumentInterruptionReal.cpp:L296](../../Tests/TestDocumentInterruptionReal.cpp#L296) | | | `std::string` | method | Tests | [TestENG200ScriptBindingsReal.cpp:L249](../../Tests/TestENG200ScriptBindingsReal.cpp#L249) | | -| `std::string` | method | Tests | [TestEditorCrashHandlerFilterReal.cpp:L371](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L371) | | -| `std::string` | method | Tests | [TestEditorCrashHandlerFilterReal.cpp:L466](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L466) | | +| `std::string` | method | Tests | [TestEditorCrashHandlerFilterReal.cpp:L373](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L373) | | +| `std::string` | method | Tests | [TestEditorCrashHandlerFilterReal.cpp:L468](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L468) | | | `std::string` | method | Tests | [TestEditorSubsystems.cpp:L1637](../../Tests/TestEditorSubsystems.cpp#L1637) | | | `std::string` | method | Tests | [TestEditorSubsystems.cpp:L2351](../../Tests/TestEditorSubsystems.cpp#L2351) | | | `std::string` | method | Tests | [TestEditorSubsystems.cpp:L2400](../../Tests/TestEditorSubsystems.cpp#L2400) | | @@ -46046,7 +46159,7 @@ | `std::string_view` | method | SparkInstaller | [GitContractTests.cpp:L146](../../SparkInstaller/tests/GitContractTests.cpp#L146) | | | `std::string_view` | method | SparkInstaller | [GitContractTests.cpp:L173](../../SparkInstaller/tests/GitContractTests.cpp#L173) | | | `std::string_view` | method | SparkInstaller | [InstallerTransactionTests.cpp:L96](../../SparkInstaller/tests/InstallerTransactionTests.cpp#L96) | | -| `std::system` | method | SparkAssetPipelineCore | [AssetCookerTests.cpp:L54](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L54) | | +| `std::system` | method | SparkAssetPipelineCore | [AssetCookerTests.cpp:L56](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L56) | | | `std::system_error` | method | Tests | [TestJobSystem.cpp:L320](../../Tests/TestJobSystem.cpp#L320) | | | `std::tan` | method | GameModules | [RacingTrackColliders.cpp:L315](../../GameModules/SparkGameRacing/Source/Track/RacingTrackColliders.cpp#L315) | | | `std::tanh` | method | SparkEngine | [CpuNeuralInference.cpp:L55](../../SparkEngine/Source/Graphics/Neural/CpuNeuralInference.cpp#L55) | | @@ -46503,12 +46616,12 @@ | `StormEvent` | struct | Tests | [TestEngineLoadTest.cpp:L954](../../Tests/TestEngineLoadTest.cpp#L954) | | | `StormIntensity01` | function | GameModules | [TFWeatherFx.h:L142](../../GameModules/SparkGameMMOFPS/Source/World/TFWeatherFx.h#L142) | | | `str` | function | SparkEngine | [DatablockRegistry.h:L331](../../SparkEngine/Source/Engine/Networking/DatablockRegistry.h#L331) | | -| `Str` | function | Tests | [TestTFDataTables.cpp:L80](../../Tests/TestTFDataTables.cpp#L80) | | +| `Str` | function | Tests | [TestTFDataTables.cpp:L71](../../Tests/TestTFDataTables.cpp#L71) | | | `StrapParams` | function | GameModules | [TFViewModelInternal.h:L164](../../GameModules/SparkGameMMOFPS/Source/Game/TFViewModelInternal.h#L164) | | -| `stream` | function | GameModules | [Game.cpp:L56](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L56) | | +| `stream` | function | GameModules | [Game.cpp:L58](../../GameModules/SparkGameFPS/Source/Game/Game.cpp#L58) | | | `stream` | function | GameModules | [VisualScriptDemoWorld.cpp:L134](../../GameModules/SparkGameVisualScript/Source/Core/VisualScriptDemoWorld.cpp#L134) | | | `stream` | function | SparkAssetPipelineCore | [AssetCooker.cpp:L955](../../SparkAssetPipelineCore/src/AssetCooker.cpp#L955) | | -| `stream` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L23](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L23) | | +| `stream` | function | SparkAssetPipelineCore | [AssetCookerTests.cpp:L25](../../SparkAssetPipelineCore/tests/AssetCookerTests.cpp#L25) | | | `stream` | function | SparkBuild | [SparkBuild.cpp:L349](../../SparkBuild/src/SparkBuild.cpp#L349) | | | `stream` | function | SparkEditor | [SparkEngineIntegration.cpp:L925](../../SparkEditor/Source/Integration/SparkEngineIntegration.cpp#L925) | | | `stream` | function | SparkEditor | [BuildPipeline.cpp:L1688](../../SparkEditor/Source/Panels/BuildPipeline.cpp#L1688) | | @@ -46544,11 +46657,12 @@ | `stream` | function | Tests | [TestENG220ObjImportReal.cpp:L73](../../Tests/TestENG220ObjImportReal.cpp#L73) | | | `stream` | function | Tests | [TestEngineSettingsParser.cpp:L34](../../Tests/TestEngineSettingsParser.cpp#L34) | | | `stream` | function | Tests | [TestEngineWiringReal.cpp:L75](../../Tests/TestEngineWiringReal.cpp#L75) | | +| `stream` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L77](../../Tests/TestFPSGameCameraReloadReal.cpp#L77) | | | `stream` | function | Tests | [TestGameModuleRTS.cpp:L552](../../Tests/TestGameModuleRTS.cpp#L552) | | | `stream` | function | Tests | [TestMOD330ARPGDungeonReal.cpp:L213](../../Tests/TestMOD330ARPGDungeonReal.cpp#L213) | | | `stream` | function | Tests | [TestMOD350RPGQuestSliceReal.cpp:L278](../../Tests/TestMOD350RPGQuestSliceReal.cpp#L278) | | | `stream` | function | Tests | [TestMOD370SkirmishDeterminismReal.cpp:L328](../../Tests/TestMOD370SkirmishDeterminismReal.cpp#L328) | | -| `stream` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L62](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L62) | | +| `stream` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L63](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L63) | | | `stream` | function | Tests | [TestMain.cpp:L776](../../Tests/TestMain.cpp#L776) | | | `stream` | function | Tests | [TestModuleABI.cpp:L712](../../Tests/TestModuleABI.cpp#L712) | | | `stream` | function | Tests | [TestNET100TrustStore.cpp:L54](../../Tests/TestNET100TrustStore.cpp#L54) | | @@ -46669,9 +46783,9 @@ | `StubBenchmarkScenario` | class | Tests | [TestBenchmarkFramework.cpp:L24](../../Tests/TestBenchmarkFramework.cpp#L24) | | | `StubBenchmarkScenario` | function | Tests | [TestBenchmarkFramework.cpp:L27](../../Tests/TestBenchmarkFramework.cpp#L27) | | | `StubMigrationStep` | class | Tests | [TestAssetMigration.cpp:L147](../../Tests/TestAssetMigration.cpp#L147) | | -| `StubSystemA` | class | Tests | [TestECSystemsReal.cpp:L36](../../Tests/TestECSystemsReal.cpp#L36) | | -| `StubSystemB` | class | Tests | [TestECSystemsReal.cpp:L51](../../Tests/TestECSystemsReal.cpp#L51) | | -| `StubSystemC` | class | Tests | [TestECSystemsReal.cpp:L66](../../Tests/TestECSystemsReal.cpp#L66) | | +| `StubSystemA` | class | Tests | [TestECSystemsReal.cpp:L26](../../Tests/TestECSystemsReal.cpp#L26) | | +| `StubSystemB` | class | Tests | [TestECSystemsReal.cpp:L41](../../Tests/TestECSystemsReal.cpp#L41) | | +| `StubSystemC` | class | Tests | [TestECSystemsReal.cpp:L56](../../Tests/TestECSystemsReal.cpp#L56) | | | `sub` | function | SparkEditor | [EditorLayoutManager.cpp:L544](../../SparkEditor/Source/Core/EditorLayoutManager.cpp#L544) | | | `Sub` | function | SparkEngine | [HRTFProcessor.cpp:L18](../../SparkEngine/Source/Audio/HRTFProcessor.cpp#L18) | | | `Sub` | function | SparkEngine | [PerceptionSystem.h:L186](../../SparkEngine/Source/Engine/AI/PerceptionSystem.h#L186) | | @@ -46783,7 +46897,7 @@ | `SUCCEEDED` | function | SparkEngine | [TonemapColorGrading.cpp:L276](../../SparkEngine/Source/Graphics/TonemapColorGrading.cpp#L276) | | | `SUCCEEDED` | function | SparkEngine | [TonemapColorGrading.cpp:L279](../../SparkEngine/Source/Graphics/TonemapColorGrading.cpp#L279) | | | `SUCCEEDED` | function | SparkEngine | [UpscalingSystemWindows.cpp:L190](../../SparkEngine/Source/Graphics/UpscalingSystemWindows.cpp#L190) | | -| `SUCCEEDED` | function | Tests | [TestAssetParserHardening.cpp:L78](../../Tests/TestAssetParserHardening.cpp#L78) | | +| `SUCCEEDED` | function | Tests | [TestAssetParserHardening.cpp:L94](../../Tests/TestAssetParserHardening.cpp#L94) | | | `SUCCEEDED` | function | Tests | [TestGPUDrivenRendererD3D11.cpp:L55](../../Tests/TestGPUDrivenRendererD3D11.cpp#L55) | | | `SUCCEEDED` | function | Tests | [TestGPUDrivenRendererD3D11.cpp:L69](../../Tests/TestGPUDrivenRendererD3D11.cpp#L69) | | | `SUCCEEDED` | function | Tests | [TestPostProcessingPipelineD3D11.cpp:L57](../../Tests/TestPostProcessingPipelineD3D11.cpp#L57) | | @@ -46862,8 +46976,8 @@ | `Suspend` | function | GameModules | [TFHandoffParticipant.h:L29](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.h#L29) | Game-thread pawn operations supplied by the live authoritative simulation. | | `Suspend` | function | GameModules | [TFServerSim.h:L141](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L141) | Game-thread handoff callbacks; the host dispatcher serializes control requests with simulation. | | `Suspend` | function | Tests | [TestTF120Migration.cpp:L84](../../Tests/TestTF120Migration.cpp#L84) | | -| `Suspend` | function | Tests | [TestTF120Travel.cpp:L224](../../Tests/TestTF120Travel.cpp#L224) | | -| `Suspend` | function | Tests | [TestTF120Travel.cpp:L257](../../Tests/TestTF120Travel.cpp#L257) | | +| `Suspend` | function | Tests | [TestTF120Travel.cpp:L211](../../Tests/TestTF120Travel.cpp#L211) | | +| `Suspend` | function | Tests | [TestTF120Travel.cpp:L244](../../Tests/TestTF120Travel.cpp#L244) | | | `SuspendPoint` | function | Tests | [TestAngelScriptStackAlignmentReal.cpp:L165](../../Tests/TestAngelScriptStackAlignmentReal.cpp#L165) | | | `SuspendRendering` | function | SparkEngine | [VulkanDevice.h:L391](../../SparkEngine/Source/Graphics/RHI/Vulkan/VulkanDevice.h#L391) | | | `Swap` | function | SparkEngine | [RTHandleSystem.h:L251](../../SparkEngine/Source/Graphics/RTHandleSystem.h#L251) | | @@ -46891,22 +47005,22 @@ | `SwitchObject::Update` | method | GameModules | [InteractiveObject.cpp:L260](../../GameModules/SparkGameFPS/Source/Game/InteractiveObject.cpp#L260) | | | `SwitchSlot` | function | GameModules | [TFWeaponSystem.h:L178](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L178) | | | `swprintf_s` | macro | SparkEngine | [PlatformTypes.h:L245](../../SparkEngine/Source/Core/PlatformTypes.h#L245) | | -| `sym` | function | SparkEngine | [CrashHandler.cpp:L1649](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1649) | | +| `sym` | function | SparkEngine | [CrashHandler.cpp:L1650](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1650) | | | `symbolLock` | function | SparkEditor | [EditorCrashHandler.cpp:L536](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L536) | | | `symbolLock` | function | SparkEditor | [EditorCrashHandler.cpp:L673](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L673) | | -| `symbolLock` | function | SparkEngine | [CrashHandler.cpp:L1273](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1273) | | -| `symbolLock` | function | SparkEngine | [CrashHandler.cpp:L1345](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1345) | | -| `symbolLock` | function | SparkEngine | [CrashHandler.cpp:L1462](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1462) | | +| `symbolLock` | function | SparkEngine | [CrashHandler.cpp:L1274](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1274) | | +| `symbolLock` | function | SparkEngine | [CrashHandler.cpp:L1346](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1346) | | +| `symbolLock` | function | SparkEngine | [CrashHandler.cpp:L1463](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1463) | | | `SymbolLock` | function | SparkEngine | [StackTrace.h:L173](../../SparkEngine/Source/Utils/StackTrace.h#L173) | | | `symbolLock` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L339](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L339) | | -| `symbolLock` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L457](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L457) | | -| `symbolLock` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L535](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L535) | | +| `symbolLock` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L459](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L459) | | +| `symbolLock` | function | Tests | [TestEditorCrashHandlerFilterReal.cpp:L537](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L537) | | | `SymbolLockLease` | class | SparkEngine | [StackTrace.h:L181](../../SparkEngine/Source/Utils/StackTrace.h#L181) | | | `SymbolLockLease` | function | SparkEngine | [StackTrace.h:L184](../../SparkEngine/Source/Utils/StackTrace.h#L184) | | | `symlinked` | function | Tests | [TestTelemetrySpool.cpp:L952](../../Tests/TestTelemetrySpool.cpp#L952) | | -| `SymStackTrace` | function | SparkEngine | [CrashHandler.cpp:L823](../../SparkEngine/Source/Utils/CrashHandler.cpp#L823) | | -| `SymStackTrace` | function | SparkEngine | [CrashHandler.cpp:L1173](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1173) | | -| `SymStackTrace` | function | SparkEngine | [CrashHandler.cpp:L1340](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1340) | | +| `SymStackTrace` | function | SparkEngine | [CrashHandler.cpp:L824](../../SparkEngine/Source/Utils/CrashHandler.cpp#L824) | | +| `SymStackTrace` | function | SparkEngine | [CrashHandler.cpp:L1174](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1174) | | +| `SymStackTrace` | function | SparkEngine | [CrashHandler.cpp:L1341](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1341) | | | `SyncActors` | function | GameModules | [ARPGActorPresentation.h:L64](../../GameModules/SparkGameARPG/Source/Demo/ARPGActorPresentation.h#L64) | Create, move or remove actor entities so the World matches the gameplay state. | | `SyncAllBindings` | function | SparkEngine | [UIFactory.h:L139](../../SparkEngine/Source/Engine/UI/UIFactory.h#L139) | Pull all widget values back to data | | `SyncClientRecords` | function | GameModules | [TFPlayerSystem.h:L108](../../GameModules/SparkGameMMOFPS/Source/Game/TFPlayerSystem.h#L108) | | @@ -46961,9 +47075,9 @@ | `SystemEntry` | struct | Tests | [TestECSIntegration.cpp:L448](../../Tests/TestECSIntegration.cpp#L448) | | | `systemError` | function | SparkGateway | [GatewayAreaControl.cpp:L906](../../SparkGateway/src/GatewayAreaControl.cpp#L906) | | | `systemError` | function | SparkGateway | [GatewayAreaControl.cpp:L968](../../SparkGateway/src/GatewayAreaControl.cpp#L968) | | -| `SystemInfo` | function | SparkEngine | [CrashHandler.cpp:L824](../../SparkEngine/Source/Utils/CrashHandler.cpp#L824) | | -| `SystemInfo` | function | SparkEngine | [CrashHandler.cpp:L1175](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1175) | | -| `SystemInfo` | function | SparkEngine | [CrashHandler.cpp:L1412](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1412) | | +| `SystemInfo` | function | SparkEngine | [CrashHandler.cpp:L825](../../SparkEngine/Source/Utils/CrashHandler.cpp#L825) | | +| `SystemInfo` | function | SparkEngine | [CrashHandler.cpp:L1176](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1176) | | +| `SystemInfo` | function | SparkEngine | [CrashHandler.cpp:L1413](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1413) | | | `SystemManager` | class | SparkEngine | [ECSystems.h:L741](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L741) | | | `SystemManager` | class | Tests | [TestECSystemOrdering.cpp:L203](../../Tests/TestECSystemOrdering.cpp#L203) | | | `SystemManager::Console_ListSystems` | method | SparkEngine | [ECSystems.cpp:L853](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.cpp#L853) | | @@ -46979,7 +47093,7 @@ | `T` | function | SparkEngine | [NonNull.h:L55](../../SparkEngine/Source/Core/NonNull.h#L55) | | | `T` | alias | SparkEngine | [EventResponseRules.cpp:L397](../../SparkEngine/Source/Engine/Gameplay/EventResponseRules.cpp#L397) | | | `T` | alias | SparkEngine | [AsyncDatabase.cpp:L423](../../SparkEngine/Source/Engine/Persistence/AsyncDatabase.cpp#L423) | | -| `t` | struct | SparkEngine | [CrashHandler.cpp:L126](../../SparkEngine/Source/Utils/CrashHandler.cpp#L126) | | +| `t` | struct | SparkEngine | [CrashHandler.cpp:L127](../../SparkEngine/Source/Utils/CrashHandler.cpp#L127) | | | `T` | alias | SparkEngine | [JsonUtils.h:L132](../../SparkEngine/Source/Utils/JsonUtils.h#L132) | | | `t` | function | Tests | [TestTween.cpp:L258](../../Tests/TestTween.cpp#L258) | | | `t` | function | Tests | [TestTween.cpp:L271](../../Tests/TestTween.cpp#L271) | | @@ -47162,8 +47276,8 @@ | `TempAllocator` | class | SparkEngine | [PhysicsSystem.h:L47](../../SparkEngine/Source/Physics/PhysicsSystem.h#L47) | | | `TempAssets` | struct | Tests | [TestAdvancedAssetPipeline.cpp:L24](../../Tests/TestAdvancedAssetPipeline.cpp#L24) | | | `tempCounts` | function | SparkEngine | [MeshOptimizer.h:L114](../../SparkEngine/Source/Graphics/MeshOptimizer.h#L114) | | -| `tempDir` | function | SparkEditor | [PlayControlLaunch.cpp:L351](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L351) | | -| `tempDir` | function | SparkEditor | [PlayControlLaunch.cpp:L385](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L385) | | +| `tempDir` | function | SparkEditor | [PlayControlLaunch.cpp:L353](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L353) | | +| `tempDir` | function | SparkEditor | [PlayControlLaunch.cpp:L387](../../SparkEditor/Source/Panels/PlayControlLaunch.cpp#L387) | | | `TempDir` | class | Tests | [TestNET100TrustStore.cpp:L29](../../Tests/TestNET100TrustStore.cpp#L29) | | | `tempDirectory` | function | SparkBuild | [Downloader.cpp:L455](../../SparkBuild/src/Downloader.cpp#L455) | | | `tempDirectory` | function | SparkBuild | [DownloaderTests.cpp:L42](../../SparkBuild/tests/DownloaderTests.cpp#L42) | | @@ -47181,7 +47295,7 @@ | `TemporalFilter` | function | SparkEngine | [FroxelVolumetricFog.h:L161](../../SparkEngine/Source/Graphics/FroxelVolumetricFog.h#L161) | Pass 3: Temporal reprojection and filtering | | `TemporalUpscaleConstants` | struct | SparkEngine | [DynamicQualityTypes.h:L241](../../SparkEngine/Source/Graphics/DynamicQualityTypes.h#L241) | Constant buffer shared by DLSS/XeSS fallback path | | `TemporalUpscaleConstants` | struct | SparkEngine | [UpscalingTypes.h:L239](../../SparkEngine/Source/Graphics/UpscalingTypes.h#L239) | Constant buffer shared by DLSS/XeSS fallback path | -| `temporary` | function | SparkEngine | [CrashHandler.cpp:L2382](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2382) | | +| `temporary` | function | SparkEngine | [CrashHandler.cpp:L2420](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2420) | | | `temporaryCleanup` | function | SparkEditor | [JSONSceneSerializer.cpp:L473](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L473) | | | `TemporaryDirectory` | struct | Tests | [TestGLTFStaticMeshLoader.cpp:L23](../../Tests/TestGLTFStaticMeshLoader.cpp#L23) | | | `TemporaryDirectory` | function | Tests | [TestGLTFStaticMeshLoader.cpp:L25](../../Tests/TestGLTFStaticMeshLoader.cpp#L25) | | @@ -47201,7 +47315,8 @@ | `TemporarySibling` | function | SparkEditor | [RegionMapDataSource.cpp:L34](../../SparkEditor/Source/Panels/RegionMapDataSource.cpp#L34) | | | `TemporarySibling` | function | SparkEngine | [NetworkTrustStore.cpp:L159](../../SparkEngine/Source/Engine/Networking/NetworkTrustStore.cpp#L159) | | | `TempPath` | function | Tests | [TestBenchmarkFramework.cpp:L14](../../Tests/TestBenchmarkFramework.cpp#L14) | Get a cross-platform temporary file path for tests | -| `TempPath` | function | Tests | [TestSparkPak.cpp:L258](../../Tests/TestSparkPak.cpp#L258) | | +| `TempPath` | function | Tests | [TestSparkPak.cpp:L274](../../Tests/TestSparkPak.cpp#L274) | | +| `TempRoot` | function | Tests | [TestSparkPak.cpp:L264](../../Tests/TestSparkPak.cpp#L264) | | | `TempScriptTree` | class | Tests | [TestCoverageScripting.cpp:L25](../../Tests/TestCoverageScripting.cpp#L25) | | | `TempScriptTree` | function | Tests | [TestCoverageScripting.cpp:L28](../../Tests/TestCoverageScripting.cpp#L28) | | | `TempStorePath` | function | Tests | [TestTFOutfitStore.cpp:L32](../../Tests/TestTFOutfitStore.cpp#L32) | | @@ -47572,8 +47687,8 @@ | `TestOutcome` | enum | Tests | [TestFramework.h:L113](../../Tests/TestFramework.h#L113) | | | `TestOutcomeInputs` | struct | Tests | [TestFramework.h:L122](../../Tests/TestFramework.h#L122) | | | `TestOutput` | struct | Tests | [TestMain.cpp:L363](../../Tests/TestMain.cpp#L363) | | -| `TestPakReader` | class | Tests | [TestSparkPak.cpp:L151](../../Tests/TestSparkPak.cpp#L151) | | -| `TestPakWriter` | class | Tests | [TestSparkPak.cpp:L62](../../Tests/TestSparkPak.cpp#L62) | | +| `TestPakReader` | class | Tests | [TestSparkPak.cpp:L157](../../Tests/TestSparkPak.cpp#L157) | | +| `TestPakWriter` | class | Tests | [TestSparkPak.cpp:L68](../../Tests/TestSparkPak.cpp#L68) | | | `TestParallaxLayer` | struct | Tests | [TestSprite2DComponents.cpp:L617](../../Tests/TestSprite2DComponents.cpp#L617) | | | `TestPathUtf8` | function | Tests | [TestEditorSubsystems.cpp:L54](../../Tests/TestEditorSubsystems.cpp#L54) | | | `TestPersistentOrchestratorIdentity` | function | SparkDaemon | [ServiceTests.cpp:L555](../../SparkDaemon/tests/ServiceTests.cpp#L555) | | @@ -47622,7 +47737,7 @@ | `TestState` | enum | Tests | [TestStateMachineReal.cpp:L11](../../Tests/TestStateMachineReal.cpp#L11) | Real-class tests for Spark::StateMachine | | `TestStrictProcessCodec` | function | SparkDaemon | [ServiceTests.cpp:L122](../../SparkDaemon/tests/ServiceTests.cpp#L122) | | | `TestStruct` | struct | Tests | [TestReflection.cpp:L445](../../Tests/TestReflection.cpp#L445) | | -| `TestSystemManager` | class | Tests | [TestECSystemsReal.cpp:L74](../../Tests/TestECSystemsReal.cpp#L74) | | +| `TestSystemManager` | class | Tests | [TestECSystemsReal.cpp:L64](../../Tests/TestECSystemsReal.cpp#L64) | | | `TestTagComponent` | struct | Tests | [TestECSWorld.cpp:L115](../../Tests/TestECSWorld.cpp#L115) | | | `TestTerminalSafeRendering` | function | SparkCrashReporter | [CrashReporterConsentTests.cpp:L250](../../SparkCrashReporter/tests/CrashReporterConsentTests.cpp#L250) | | | `TestThrashTracker` | struct | Tests | [TestTextureZombiePool.cpp:L68](../../Tests/TestTextureZombiePool.cpp#L68) | | @@ -47657,7 +47772,7 @@ | `text` | function | SparkEngine | [EventResponseSystem.cpp:L110](../../SparkEngine/Source/Engine/Gameplay/EventResponseSystem.cpp#L110) | | | `text` | function | SparkEngine | [VirtualFileSystem.cpp:L381](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L381) | | | `text` | function | SparkEngine | [RHIFactory.cpp:L328](../../SparkEngine/Source/Graphics/RHI/RHIFactory.cpp#L328) | | -| `text` | function | SparkEngine | [SceneManagerReflected.cpp:L30](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L30) | | +| `text` | function | SparkEngine | [SceneManagerReflected.cpp:L46](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L46) | | | `text` | function | SparkEngine | [CrashHandlerSupport.h:L165](../../SparkEngine/Source/Utils/CrashHandlerSupport.h#L165) | | | `Text` | function | SparkEngine | [CrashSymbolication.h:L119](../../SparkEngine/Source/Utils/CrashSymbolication.h#L119) | | | `text` | function | SparkGateway | [GatewayAreaControl.cpp:L599](../../SparkGateway/src/GatewayAreaControl.cpp#L599) | | @@ -47683,14 +47798,14 @@ | `TextStyle` | struct | SparkEngine | [FontSystem.h:L64](../../SparkEngine/Source/Engine/Text/FontSystem.h#L64) | Text style parameters | | `Texture` | class | SparkEngine | [FoliageRenderer.h:L46](../../SparkEngine/Source/Graphics/FoliageRenderer.h#L46) | | | `Texture` | class | SparkEngine | [TextureSystem.h:L142](../../SparkEngine/Source/Graphics/TextureSystem.h#L142) | Texture resource | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L164](../../Tests/TestAssetParserHardening.cpp#L164) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L176](../../Tests/TestAssetParserHardening.cpp#L176) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L189](../../Tests/TestAssetParserHardening.cpp#L189) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L234](../../Tests/TestAssetParserHardening.cpp#L234) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L245](../../Tests/TestAssetParserHardening.cpp#L245) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L274](../../Tests/TestAssetParserHardening.cpp#L274) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L282](../../Tests/TestAssetParserHardening.cpp#L282) | | -| `texture` | function | Tests | [TestAssetParserHardening.cpp:L300](../../Tests/TestAssetParserHardening.cpp#L300) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L180](../../Tests/TestAssetParserHardening.cpp#L180) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L192](../../Tests/TestAssetParserHardening.cpp#L192) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L205](../../Tests/TestAssetParserHardening.cpp#L205) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L250](../../Tests/TestAssetParserHardening.cpp#L250) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L261](../../Tests/TestAssetParserHardening.cpp#L261) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L290](../../Tests/TestAssetParserHardening.cpp#L290) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L298](../../Tests/TestAssetParserHardening.cpp#L298) | | +| `texture` | function | Tests | [TestAssetParserHardening.cpp:L316](../../Tests/TestAssetParserHardening.cpp#L316) | | | `texture` | function | Tests | [TestRHI210TextureDecode.cpp:L96](../../Tests/TestRHI210TextureDecode.cpp#L96) | | | `texture` | function | Tests | [TestRHI210TextureDecode.cpp:L141](../../Tests/TestRHI210TextureDecode.cpp#L141) | | | `Texture` | function | Tests | [TestRHI230VulkanGoldenReal.cpp:L398](../../Tests/TestRHI230VulkanGoldenReal.cpp#L398) | | @@ -48498,7 +48613,7 @@ | `TFHandoff_Arrive` | function | GameModules | [TFHandoffContinuity.h:L38](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffContinuity.h#L38) | | | `TFHandoff_CanCarry` | function | GameModules | [TFHandoffContinuity.h:L21](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffContinuity.h#L21) | | | `TFHandoff_CanCarry` | function | GameModules | [TFServerSimHandoff.cpp:L56](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSimHandoff.cpp#L56) | | -| `TFHandoff_CanCarry` | function | Tests | [TestTF120Travel.cpp:L219](../../Tests/TestTF120Travel.cpp#L219) | | +| `TFHandoff_CanCarry` | function | Tests | [TestTF120Travel.cpp:L206](../../Tests/TestTF120Travel.cpp#L206) | | | `TFHandoffArrival` | struct | GameModules | [TFHandoffContinuity.h:L27](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffContinuity.h#L27) | | | `TFHandoffParticipant` | class | GameModules | [TFHandoffParticipant.h:L18](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.h#L18) | | | `TFHandoffParticipant::Abort` | method | GameModules | [TFHandoffParticipant.cpp:L154](../../GameModules/SparkGameMMOFPS/Source/Net/TFHandoffParticipant.cpp#L154) | | @@ -49075,31 +49190,31 @@ | `TFRegionSystem::Update` | method | GameModules | [TFRegionSystem.cpp:L76](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.cpp#L76) | | | `TFRegionSystem::UpdateCaptureVisuals` | method | GameModules | [TFRegionSystemUi.cpp:L37](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystemUi.cpp#L37) | | | `TFReplication` | class | GameModules | [TFTypes.h:L109](../../GameModules/SparkGameMMOFPS/Source/Core/TFTypes.h#L109) | | -| `TFReplication` | class | GameModules | [TFReplication.h:L54](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L54) | | +| `TFReplication` | class | GameModules | [TFReplication.h:L57](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L57) | | | `TFReplication::ClientActive` | method | GameModules | [TFReplicationClient.cpp:L59](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L59) | | | `TFReplication::ClientEnsureHandlers` | method | GameModules | [TFReplicationClient.cpp:L65](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L65) | | | `TFReplication::ClientReleaseHandlers` | method | GameModules | [TFReplicationClient.cpp:L84](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L84) | | -| `TFReplication::FixedUpdate` | method | GameModules | [TFReplication.cpp:L76](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L76) | | +| `TFReplication::FixedUpdate` | method | GameModules | [TFReplication.cpp:L82](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L82) | | | `TFReplication::ForEachRemotePawn` | method | GameModules | [TFReplicationClient.cpp:L38](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L38) | | | `TFReplication::GetLatestMoveState` | method | GameModules | [TFReplicationClient.cpp:L44](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L44) | | | `TFReplication::GetRemotePawn` | method | GameModules | [TFReplicationClient.cpp:L29](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L29) | | -| `TFReplication::Initialize` | method | GameModules | [TFReplication.cpp:L43](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L43) | | -| `TFReplication::MakeCreate` | method | GameModules | [TFReplication.cpp:L200](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L200) | | -| `TFReplication::OnPlayerKilled` | method | GameModules | [TFReplication.cpp:L173](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L173) | | -| `TFReplication::OnPlayerSpawned` | method | GameModules | [TFReplication.cpp:L150](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L150) | | +| `TFReplication::Initialize` | method | GameModules | [TFReplication.cpp:L49](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L49) | | +| `TFReplication::MakeCreate` | method | GameModules | [TFReplication.cpp:L204](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L204) | | +| `TFReplication::OnPlayerKilled` | method | GameModules | [TFReplication.cpp:L179](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L179) | | +| `TFReplication::OnPlayerSpawned` | method | GameModules | [TFReplication.cpp:L156](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L156) | | | `TFReplication::OnRepCreate` | method | GameModules | [TFReplicationClient.cpp:L102](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L102) | | | `TFReplication::OnRepDestroy` | method | GameModules | [TFReplicationClient.cpp:L193](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L193) | | | `TFReplication::OnRepMoveState` | method | GameModules | [TFReplicationClient.cpp:L208](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L208) | | | `TFReplication::OnRepUpdate` | method | GameModules | [TFReplicationClient.cpp:L132](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L132) | | -| `TFReplication::QuantizePawn` | method | GameModules | [TFReplication.cpp:L139](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L139) | | +| `TFReplication::QuantizePawn` | method | GameModules | [TFReplication.cpp:L145](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L145) | | | `TFReplication::RenderDebugUI` | method | GameModules | [TFReplicationClient.cpp:L229](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplicationClient.cpp#L229) | | -| `TFReplication::SendRep` | method | GameModules | [TFReplication.cpp:L314](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L314) | | -| `TFReplication::ServerActive` | method | GameModules | [TFReplication.cpp:L192](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L192) | | -| `TFReplication::ServerBroadcastDestroy` | method | GameModules | [TFReplication.cpp:L307](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L307) | | -| `TFReplication::ServerBroadcastUpdates` | method | GameModules | [TFReplication.cpp:L251](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L251) | | -| `TFReplication::ServerPollNewClients` | method | GameModules | [TFReplication.cpp:L214](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L214) | | -| `TFReplication::Shutdown` | method | GameModules | [TFReplication.cpp:L119](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L119) | | -| `TFReplication::Update` | method | GameModules | [TFReplication.cpp:L56](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L56) | | +| `TFReplication::SendRep` | method | GameModules | [TFReplication.cpp:L325](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L325) | | +| `TFReplication::ServerActive` | method | GameModules | [TFReplication.cpp:L198](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L198) | | +| `TFReplication::ServerBroadcastDestroy` | method | GameModules | [TFReplication.cpp:L318](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L318) | | +| `TFReplication::ServerBroadcastUpdates` | method | GameModules | [TFReplication.cpp:L260](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L260) | | +| `TFReplication::ServerPollNewClients` | method | GameModules | [TFReplication.cpp:L222](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L222) | | +| `TFReplication::Shutdown` | method | GameModules | [TFReplication.cpp:L125](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L125) | | +| `TFReplication::Update` | method | GameModules | [TFReplication.cpp:L62](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.cpp#L62) | | | `TFSanctuaryDecor` | class | GameModules | [TFSanctuaryDecor.h:L42](../../GameModules/SparkGameMMOFPS/Source/World/TFSanctuaryDecor.h#L42) | | | `TFSanctuaryDecor` | class | GameModules | [TFTravelSystem.h:L58](../../GameModules/SparkGameMMOFPS/Source/World/TFTravelSystem.h#L58) | | | `TFSanctuaryDecor::Initialize` | method | GameModules | [TFSanctuaryDecor.cpp:L187](../../GameModules/SparkGameMMOFPS/Source/World/TFSanctuaryDecor.cpp#L187) | | @@ -49725,8 +49840,8 @@ | `TFWorldSetup::StopNetworking` | method | GameModules | [TFWorldSetupNet.cpp:L227](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetupNet.cpp#L227) | | | `TFWorldSetup::TerrainHeightAt` | method | GameModules | [TFWorldSetup.cpp:L186](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetup.cpp#L186) | | | `TFWorldSetup::Update` | method | GameModules | [TFWorldSetupUpdate.cpp:L42](../../GameModules/SparkGameMMOFPS/Source/World/TFWorldSetupUpdate.cpp#L42) | | -| `tga` | function | Tests | [TestThirdPartyIntegration.cpp:L149](../../Tests/TestThirdPartyIntegration.cpp#L149) | | -| `TgaHeader` | function | Tests | [TestAssetParserHardening.cpp:L81](../../Tests/TestAssetParserHardening.cpp#L81) | | +| `tga` | function | Tests | [TestThirdPartyIntegration.cpp:L165](../../Tests/TestThirdPartyIntegration.cpp#L165) | | +| `TgaHeader` | function | Tests | [TestAssetParserHardening.cpp:L97](../../Tests/TestAssetParserHardening.cpp#L97) | | | `ThawAll` | function | SparkEngine | [FreezeSystem.h:L266](../../SparkEngine/Source/Engine/SaveSystem/FreezeSystem.h#L266) | Restore all registered subsystems from a binary buffer. | | `ThemeColor` | function | SparkEditor | [EditorTheme.cpp:L45](../../SparkEditor/Source/Core/EditorTheme.cpp#L45) | | | `ThemeColor` | function | SparkEditor | [EditorTheme.cpp:L60](../../SparkEditor/Source/Core/EditorTheme.cpp#L60) | | @@ -49781,13 +49896,13 @@ | `ThreadSafeQueue` | function | SparkEngine | [ThreadSafeQueue.h:L57](../../SparkEngine/Source/Utils/ThreadSafeQueue.h#L57) | Construct a queue with an optional maximum size. | | `ThreadSafeRandomEngine` | class | SparkEngine | [RandomEngine.h:L216](../../SparkEngine/Source/Utils/RandomEngine.h#L216) | Mutex-protected wrapper around RandomEngine for shared use. | | `ThreadSafeRandomEngine` | function | SparkEngine | [RandomEngine.h:L220](../../SparkEngine/Source/Utils/RandomEngine.h#L220) | | -| `ThreadStacks` | function | SparkEngine | [CrashHandler.cpp:L825](../../SparkEngine/Source/Utils/CrashHandler.cpp#L825) | | -| `ThreadStacks` | function | SparkEngine | [CrashHandler.cpp:L1450](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1450) | | -| `ThreadStacksBounded` | function | SparkEngine | [CrashHandler.cpp:L826](../../SparkEngine/Source/Utils/CrashHandler.cpp#L826) | | -| `ThreadStacksBounded` | function | SparkEngine | [CrashHandler.cpp:L886](../../SparkEngine/Source/Utils/CrashHandler.cpp#L886) | | -| `ThreadStacksBounded` | function | SparkEngine | [CrashHandler.cpp:L1178](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1178) | | -| `ThreadStacksCapture` | struct | SparkEngine | [CrashHandler.cpp:L867](../../SparkEngine/Source/Utils/CrashHandler.cpp#L867) | | -| `ThreadStacksThreadProc` | function | SparkEngine | [CrashHandler.cpp:L875](../../SparkEngine/Source/Utils/CrashHandler.cpp#L875) | | +| `ThreadStacks` | function | SparkEngine | [CrashHandler.cpp:L826](../../SparkEngine/Source/Utils/CrashHandler.cpp#L826) | | +| `ThreadStacks` | function | SparkEngine | [CrashHandler.cpp:L1451](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1451) | | +| `ThreadStacksBounded` | function | SparkEngine | [CrashHandler.cpp:L827](../../SparkEngine/Source/Utils/CrashHandler.cpp#L827) | | +| `ThreadStacksBounded` | function | SparkEngine | [CrashHandler.cpp:L887](../../SparkEngine/Source/Utils/CrashHandler.cpp#L887) | | +| `ThreadStacksBounded` | function | SparkEngine | [CrashHandler.cpp:L1179](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1179) | | +| `ThreadStacksCapture` | struct | SparkEngine | [CrashHandler.cpp:L868](../../SparkEngine/Source/Utils/CrashHandler.cpp#L868) | | +| `ThreadStacksThreadProc` | function | SparkEngine | [CrashHandler.cpp:L876](../../SparkEngine/Source/Utils/CrashHandler.cpp#L876) | | | `ThreadState` | struct | SparkEngine | [DeadlockDetector.h:L123](../../SparkEngine/Source/Utils/DeadlockDetector.h#L123) | | | `ThreadState` | struct | Tests | [TestDeadlockDetector.cpp:L112](../../Tests/TestDeadlockDetector.cpp#L112) | | | `ThreatInfo` | struct | SparkEngine | [GroupAI.h:L103](../../SparkEngine/Source/Engine/AI/GroupAI.h#L103) | Information about a known threat shared across the group. | @@ -49838,7 +49953,7 @@ | `Tick` | function | Tests | [TestAIStress.cpp:L97](../../Tests/TestAIStress.cpp#L97) | | | `Tick` | function | Tests | [TestAIStress.cpp:L118](../../Tests/TestAIStress.cpp#L118) | | | `Tick` | function | Tests | [TestEngineWiringReal.cpp:L556](../../Tests/TestEngineWiringReal.cpp#L556) | | -| `Tick` | function | Tests | [TestTF120Travel.cpp:L156](../../Tests/TestTF120Travel.cpp#L156) | | +| `Tick` | function | Tests | [TestTF120Travel.cpp:L143](../../Tests/TestTF120Travel.cpp#L143) | | | `Tick` | function | Tests | [TestWorldServerRouting.cpp:L99](../../Tests/TestWorldServerRouting.cpp#L99) | | | `Tick` | function | Tests | [VisualScriptGameplayHarness.h:L159](../../Tests/VisualScriptGameplayHarness.h#L159) | | | `Tick` | function | Tests | [Test_scripting_hardening.cpp:L210](../../Tests/harden/Test_scripting_hardening.cpp#L210) | | @@ -49902,7 +50017,7 @@ | `TileType` | enum | SparkEditor | [LevelStreamingEnums.h:L67](../../SparkEditor/Source/Enums/LevelStreamingEnums.h#L67) | Tile types | | `tiling` | function | SparkEngine | [WorldBasicRenderer.cpp:L376](../../SparkEngine/Source/Graphics/WorldBasicRenderer.cpp#L376) | | | `tilt` | function | Tests | [TestRHI210D3D11FrameGoldenReal.cpp:L223](../../Tests/TestRHI210D3D11FrameGoldenReal.cpp#L223) | | -| `TimedKeyRelease` | struct | SparkEngine | [InputManager.h:L93](../../SparkEngine/Source/Input/InputManager.h#L93) | A console-simulated key press waiting for its release deadline. | +| `TimedKeyRelease` | struct | SparkEngine | [InputManager.h:L95](../../SparkEngine/Source/Input/InputManager.h#L95) | A console-simulated key press waiting for its release deadline. | | `TimeOfDay` | function | SparkEngine | [EngineSettings.h:L991](../../SparkEngine/Source/Core/EngineSettings.h#L991) | | | `TimeOfDay` | function | SparkEngine | [EngineSettings.h:L992](../../SparkEngine/Source/Core/EngineSettings.h#L992) | | | `TimeOfDayChangedEvent` | struct | SparkEngine | [EventSystem.h:L105](../../SparkEngine/Source/Engine/Events/EventSystem.h#L105) | Fired when the time of day changes significantly (e.g. dawn, dusk). | @@ -49925,7 +50040,7 @@ | `TimeOfDaySettings` | struct | SparkEngine | [EngineSettings.h:L570](../../SparkEngine/Source/Core/EngineSettings.h#L570) | | | `TimeOfDaySettings` | struct | Tests | [TestSubsystemConsoleCommands.cpp:L45](../../Tests/TestSubsystemConsoleCommands.cpp#L45) | | | `TimeOfDaySystem` | class | SparkEngine | [TimeOfDaySystem.h:L64](../../SparkEngine/Source/Engine/World/TimeOfDaySystem.h#L64) | | -| `TimeOfDaySystem` | class | SparkSDK | [IEngineContext.h:L92](../../SparkSDK/Include/Spark/IEngineContext.h#L92) | | +| `TimeOfDaySystem` | class | SparkSDK | [IEngineContext.h:L93](../../SparkSDK/Include/Spark/IEngineContext.h#L93) | | | `TimeOfDaySystem` | class | Tests | [TestTimeOfDaySystem.cpp:L32](../../Tests/TestTimeOfDaySystem.cpp#L32) | | | `TimeOfDaySystem::GetDayPeriod` | method | SparkEngine | [TimeOfDaySystem.cpp:L56](../../SparkEngine/Source/Engine/World/TimeOfDaySystem.cpp#L56) | | | `TimeOfDaySystem::GetInstance` | method | SparkEngine | [TimeOfDaySystem.cpp:L21](../../SparkEngine/Source/Engine/World/TimeOfDaySystem.cpp#L21) | | @@ -49934,18 +50049,18 @@ | `TimeOfDaySystem::SetTimeOfDay` | method | SparkEngine | [TimeOfDaySystem.cpp:L48](../../SparkEngine/Source/Engine/World/TimeOfDaySystem.cpp#L48) | | | `TimeOfDaySystem::Update` | method | SparkEngine | [TimeOfDaySystem.cpp:L27](../../SparkEngine/Source/Engine/World/TimeOfDaySystem.cpp#L27) | | | `TimeOfDaySystem::UpdateSunState` | method | SparkEngine | [TimeOfDaySystem.cpp:L88](../../SparkEngine/Source/Engine/World/TimeOfDaySystem.cpp#L88) | | -| `timeoutAction` | struct | SparkEngine | [CrashHandler.cpp:L2186](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2186) | | +| `timeoutAction` | struct | SparkEngine | [CrashHandler.cpp:L2222](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2222) | | | `TimeoutHandler` | alias | SparkEngine | [NetworkManager.h:L1161](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L1161) | | | `timeoutMode` | function | SparkCrashReporter | [CrashReporterManifestTests.cpp:L804](../../SparkCrashReporter/tests/CrashReporterManifestTests.cpp#L804) | | | `TimePoint` | alias | GameModules | [FPSLog.h:L49](../../GameModules/SparkGameFPS/Source/Core/FPSLog.h#L49) | | | `TimePoint` | alias | SparkEngine | [PerformanceStats.h:L304](../../SparkEngine/Source/Utils/PerformanceStats.h#L304) | | | `TimePoint` | alias | Tests | [TestScriptHotReload.cpp:L17](../../Tests/TestScriptHotReload.cpp#L17) | | -| `Timer` | class | SparkEngine | [EngineContext.h:L41](../../SparkEngine/Source/Core/EngineContext.h#L41) | | +| `Timer` | class | SparkEngine | [EngineContext.h:L42](../../SparkEngine/Source/Core/EngineContext.h#L42) | | | `Timer` | class | SparkEngine | [EngineRuntime.h:L30](../../SparkEngine/Source/Core/EngineRuntime.h#L30) | | | `Timer` | class | SparkEngine | [IGameModule.h:L21](../../SparkEngine/Source/Core/IGameModule.h#L21) | | | `Timer` | class | SparkEngine | [SparkEngine.h:L26](../../SparkEngine/Source/Core/SparkEngine.h#L26) | | | `Timer` | class | SparkEngine | [Timer.h:L35](../../SparkEngine/Source/Utils/Timer.h#L35) | | -| `Timer` | class | SparkSDK | [IEngineContext.h:L24](../../SparkSDK/Include/Spark/IEngineContext.h#L24) | | +| `Timer` | class | SparkSDK | [IEngineContext.h:L25](../../SparkSDK/Include/Spark/IEngineContext.h#L25) | | | `Timer` | class | SparkServer | [ServerApplication.h:L24](../../SparkServer/src/ServerApplication.h#L24) | | | `timer` | function | Tests | [TestCooldown.cpp:L74](../../Tests/TestCooldown.cpp#L74) | | | `timer` | function | Tests | [TestCooldown.cpp:L80](../../Tests/TestCooldown.cpp#L80) | | @@ -49991,16 +50106,16 @@ | `Toast` | struct | GameModules | [TFMedalSystem.h:L235](../../GameModules/SparkGameMMOFPS/Source/Game/TFMedalSystem.h#L235) | | | `ToBucket` | function | SparkEngine | [CoverSystem.h:L183](../../SparkEngine/Source/Engine/AI/CoverSystem.h#L183) | | | `ToBucket` | function | SparkEngine | [TacticalPointSystem.h:L210](../../SparkEngine/Source/Engine/AI/TacticalPointSystem.h#L210) | Convert a world position to a bucket key. | -| `toc` | function | Tests | [TestSparkPak.cpp:L498](../../Tests/TestSparkPak.cpp#L498) | | -| `toc` | function | Tests | [TestSparkPak.cpp:L543](../../Tests/TestSparkPak.cpp#L543) | | -| `toc` | function | Tests | [TestSparkPak.cpp:L595](../../Tests/TestSparkPak.cpp#L595) | | +| `toc` | function | Tests | [TestSparkPak.cpp:L514](../../Tests/TestSparkPak.cpp#L514) | | +| `toc` | function | Tests | [TestSparkPak.cpp:L559](../../Tests/TestSparkPak.cpp#L559) | | +| `toc` | function | Tests | [TestSparkPak.cpp:L611](../../Tests/TestSparkPak.cpp#L611) | | | `ToCacheStage` | function | SparkEngine | [ShaderCompilationWindows.cpp:L67](../../SparkEngine/Source/Graphics/ShaderCompilationWindows.cpp#L67) | | | `tocCompressed` | function | SparkEngine | [SparkPak.cpp:L287](../../SparkEngine/Source/Core/SparkPak.cpp#L287) | | | `tocCompressed` | function | SparkEngine | [SparkPakWriter.cpp:L307](../../SparkEngine/Source/Core/SparkPakWriter.cpp#L307) | | -| `TOCEntry` | struct | Tests | [TestSparkPak.cpp:L80](../../Tests/TestSparkPak.cpp#L80) | | -| `TOCEntry` | struct | Tests | [TestSparkPak.cpp:L154](../../Tests/TestSparkPak.cpp#L154) | | +| `TOCEntry` | struct | Tests | [TestSparkPak.cpp:L86](../../Tests/TestSparkPak.cpp#L86) | | +| `TOCEntry` | struct | Tests | [TestSparkPak.cpp:L160](../../Tests/TestSparkPak.cpp#L160) | | | `ToCompactString` | function | SparkEngine | [StackTrace.h:L145](../../SparkEngine/Source/Utils/StackTrace.h#L145) | Get a compact single-line summary (top N frames) | -| `tocRaw` | function | Tests | [TestSparkPak.cpp:L192](../../Tests/TestSparkPak.cpp#L192) | | +| `tocRaw` | function | Tests | [TestSparkPak.cpp:L198](../../Tests/TestSparkPak.cpp#L198) | | | `ToDigest` | function | GameModules | [TFAccountSystem.cpp:L91](../../GameModules/SparkGameMMOFPS/Source/Account/TFAccountSystem.cpp#L91) | | | `TODS` | alias | SparkEngine | [EngineSettings.cpp:L406](../../SparkEngine/Source/Core/EngineSettings.cpp#L406) | | | `ToFloat4` | function | Tests | [TestQuaternionStubsReal.cpp:L34](../../Tests/TestQuaternionStubsReal.cpp#L34) | | @@ -50025,7 +50140,7 @@ | `ToggleDebugUI` | function | GameModules | [TFProgressionSystem.h:L147](../../GameModules/SparkGameMMOFPS/Source/Game/TFProgressionSystem.h#L147) | | | `ToggleDebugUI` | function | GameModules | [TFVehicleSystem.h:L138](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L138) | | | `ToggleDebugUI` | function | GameModules | [TFClientNet.h:L103](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L103) | | -| `ToggleDebugUI` | function | GameModules | [TFReplication.h:L75](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L75) | | +| `ToggleDebugUI` | function | GameModules | [TFReplication.h:L79](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L79) | | | `ToggleDebugUI` | function | GameModules | [TFServerSim.h:L154](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L154) | | | `ToggleDebugUI` | function | GameModules | [TFLoginFlow.h:L88](../../GameModules/SparkGameMMOFPS/Source/UI/TFLoginFlow.h#L88) | | | `ToggleDebugUI` | function | GameModules | [TFRegionSystem.h:L113](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.h#L113) | | @@ -50348,7 +50463,7 @@ | `TransportType` | enum | SparkEngine | [NetworkIntegration.h:L55](../../SparkEngine/Source/Engine/Networking/NetworkIntegration.h#L55) | Configuration for the integrated network stack. | | `Travel` | function | GameModules | [MMOGameplaySession.h:L48](../../GameModules/SparkGameMMO/Source/Gameplay/MMOGameplaySession.h#L48) | | | `Travel` | function | GameModules | [RPGDemoSession.h:L37](../../GameModules/SparkGameRPG/Source/Gameplay/RPGDemoSession.h#L37) | | -| `TravelRequest` | function | Tests | [TestTF120Travel.cpp:L189](../../Tests/TestTF120Travel.cpp#L189) | | +| `TravelRequest` | function | Tests | [TestTF120Travel.cpp:L176](../../Tests/TestTF120Travel.cpp#L176) | | | `traversalReload` | function | Tests | [TestSceneManagerUnicodeReal.cpp:L118](../../Tests/TestSceneManagerUnicodeReal.cpp#L118) | | | `TraversalSession` | struct | Tests | [TestMOD360OpenWorldTraversalReal.cpp:L38](../../Tests/TestMOD360OpenWorldTraversalReal.cpp#L38) | | | `TraversalType` | enum | SparkEngine | [AdvancedPlacementComponents.h:L102](../../SparkEngine/Source/Engine/ECS/Components/AdvancedPlacementComponents.h#L102) | Defines an off-mesh link between two NavMesh positions. | @@ -50368,22 +50483,22 @@ | `TriggerCaptureFn` | alias | SparkEditor | [PerformanceProfiler.cpp:L909](../../SparkEditor/Source/Profiler/PerformanceProfiler.cpp#L909) | | | `TriggerCaptureFn` | alias | SparkEngine | [GPUDebugMarkers.h:L270](../../SparkEngine/Source/Graphics/GPUDebugMarkers.h#L270) | | | `TriggerCrashHandler` | function | SparkEngine | [Assert.h:L104](../../SparkEngine/Source/Utils/Assert.h#L104) | | -| `TriggerCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L969](../../SparkEngine/Source/Utils/CrashHandler.cpp#L969) | | -| `TriggerCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2702](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2702) | | -| `TriggerCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2836](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2836) | | +| `TriggerCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L970](../../SparkEngine/Source/Utils/CrashHandler.cpp#L970) | | +| `TriggerCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2748](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2748) | | +| `TriggerCrashHandler` | function | SparkEngine | [CrashHandler.cpp:L2882](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2882) | | | `TriggerCrashHandler` | function | SparkEngine | [CrashHandler.h:L92](../../SparkEngine/Source/Utils/CrashHandler.h#L92) | Called by Assert::Fail to optionally trigger a crash report | | `TriggerCrashHandler` | function | SparkEngine | [CrashHandlerStub.cpp:L19](../../SparkEngine/Source/Utils/CrashHandlerStub.cpp#L19) | | | `TriggerCrashReport` | function | SparkEngine | [Assert.h:L105](../../SparkEngine/Source/Utils/Assert.h#L105) | | -| `TriggerCrashReport` | function | SparkEngine | [CrashHandler.cpp:L1015](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1015) | | -| `TriggerCrashReport` | function | SparkEngine | [CrashHandler.cpp:L2729](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2729) | | -| `TriggerCrashReport` | function | SparkEngine | [CrashHandler.cpp:L2842](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2842) | | +| `TriggerCrashReport` | function | SparkEngine | [CrashHandler.cpp:L1016](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1016) | | +| `TriggerCrashReport` | function | SparkEngine | [CrashHandler.cpp:L2775](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2775) | | +| `TriggerCrashReport` | function | SparkEngine | [CrashHandler.cpp:L2888](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2888) | | | `TriggerCrashReport` | function | SparkEngine | [CrashHandler.h:L105](../../SparkEngine/Source/Utils/CrashHandler.h#L105) | | | `TriggerCrashReport` | function | SparkEngine | [CrashHandlerStub.cpp:L25](../../SparkEngine/Source/Utils/CrashHandlerStub.cpp#L25) | | -| `TriggerCrashReportUnattended` | function | SparkEngine | [CrashHandler.cpp:L1020](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1020) | | -| `TriggerCrashReportUnattended` | function | SparkEngine | [CrashHandler.cpp:L2798](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2798) | | -| `TriggerCrashReportUnattended` | function | SparkEngine | [CrashHandler.cpp:L2848](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2848) | | +| `TriggerCrashReportUnattended` | function | SparkEngine | [CrashHandler.cpp:L1021](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1021) | | +| `TriggerCrashReportUnattended` | function | SparkEngine | [CrashHandler.cpp:L2844](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2844) | | +| `TriggerCrashReportUnattended` | function | SparkEngine | [CrashHandler.cpp:L2894](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2894) | | | `TriggerCrashReportUnattended` | function | SparkEngine | [CrashHandler.h:L122](../../SparkEngine/Source/Utils/CrashHandler.h#L122) | | -| `TriggerCrashReportWithDelivery` | function | SparkEngine | [CrashHandler.cpp:L996](../../SparkEngine/Source/Utils/CrashHandler.cpp#L996) | | +| `TriggerCrashReportWithDelivery` | function | SparkEngine | [CrashHandler.cpp:L997](../../SparkEngine/Source/Utils/CrashHandler.cpp#L997) | | | `TriggerEditorPanel` | class | SparkEditor | [TriggerEditorPanel.h:L23](../../SparkEditor/Source/Panels/TriggerEditorPanel.h#L23) | Panel for managing ProximityTriggerSystem trigger volumes | | `TriggerEditorPanel::Initialize` | method | SparkEditor | [TriggerEditorPanel.cpp:L19](../../SparkEditor/Source/Panels/TriggerEditorPanel.cpp#L19) | | | `TriggerEditorPanel::Render` | method | SparkEditor | [TriggerEditorPanel.cpp:L27](../../SparkEditor/Source/Panels/TriggerEditorPanel.cpp#L27) | | @@ -50412,6 +50527,7 @@ | `TriggerVolumeComponent` | struct | SparkEngine | [VolumeComponents.h:L30](../../SparkEngine/Source/Engine/ECS/Components/VolumeComponents.h#L30) | Spatial trigger that fires events when entities enter or exit. | | `TriggerVolumeData` | struct | SparkEditor | [SceneFileTypes.h:L537](../../SparkEditor/Source/SceneSystem/SceneFileTypes.h#L537) | Trigger volume scene data (sphere or AABB proximity trigger) | | `Trim` | function | SparkBuild | [Config.cpp:L431](../../SparkBuild/src/Config.cpp#L431) | | +| `Trim` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L18](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L18) | | | `Trim` | function | SparkEngine | [StartupSplash.cpp:L49](../../SparkEngine/Source/Core/StartupSplash.cpp#L49) | | | `Trim` | function | SparkEngine | [EntityArchetypeLoader.cpp:L28](../../SparkEngine/Source/Engine/ECS/EntityArchetypeLoader.cpp#L28) | | | `Trim` | function | SparkEngine | [EntityArchetypeParse.cpp:L22](../../SparkEngine/Source/Engine/ECS/EntityArchetypeParse.cpp#L22) | | @@ -50515,7 +50631,7 @@ | `TutorialStepType` | enum | SparkEditor | [TutorialSystem.h:L55](../../SparkEditor/Source/Core/TutorialSystem.h#L55) | The kind of action a tutorial step performs. | | `TutorialSystem` | class | SparkEditor | [TutorialSystem.h:L121](../../SparkEditor/Source/Core/TutorialSystem.h#L121) | Singleton that manages interactive editor tutorials. | | `tv` | struct | SparkConsole | [ConsoleApp.cpp:L50](../../SparkConsole/src/ConsoleApp.cpp#L50) | | -| `tv` | struct | SparkConsole | [ConsoleApp.cpp:L543](../../SparkConsole/src/ConsoleApp.cpp#L543) | | +| `tv` | struct | SparkConsole | [ConsoleApp.cpp:L547](../../SparkConsole/src/ConsoleApp.cpp#L547) | | | `tw` | function | Tests | [TestExtendedSystems.cpp:L992](../../Tests/TestExtendedSystems.cpp#L992) | | | `Tween` | class | SparkEngine | [Tween.h:L261](../../SparkEngine/Source/Utils/Tween.h#L261) | A single tween that interpolates a float | | `Tween` | class | Tests | [TestTween.cpp:L112](../../Tests/TestTween.cpp#L112) | | @@ -50535,7 +50651,7 @@ | `TweenManager` | class | SparkEngine | [Tween.h:L410](../../SparkEngine/Source/Utils/Tween.h#L410) | Central manager for all active tweens. Call Update() once per frame. | | `TweenState` | enum | SparkEngine | [TweenSystem.h:L56](../../SparkEngine/Source/Engine/Tween/TweenSystem.h#L56) | Current state of a tween. | | `TweenSystem` | class | SparkEngine | [TweenSystem.h:L147](../../SparkEngine/Source/Engine/Tween/TweenSystem.h#L147) | | -| `TweenSystem` | class | SparkSDK | [IEngineContext.h:L97](../../SparkSDK/Include/Spark/IEngineContext.h#L97) | | +| `TweenSystem` | class | SparkSDK | [IEngineContext.h:L98](../../SparkSDK/Include/Spark/IEngineContext.h#L98) | | | `TweenSystem::Cancel` | method | SparkEngine | [TweenSystem.cpp:L238](../../SparkEngine/Source/Engine/Tween/TweenSystem.cpp#L238) | | | `TweenSystem::CancelAll` | method | SparkEngine | [TweenSystem.cpp:L248](../../SparkEngine/Source/Engine/Tween/TweenSystem.cpp#L248) | | | `TweenSystem::Console_GetStatus` | method | SparkEngine | [TweenSystem.cpp:L363](../../SparkEngine/Source/Engine/Tween/TweenSystem.cpp#L363) | | @@ -50591,10 +50707,10 @@ | `TypedHandle` | function | Tests | [TestRHIHandlePool.cpp:L17](../../Tests/TestRHIHandlePool.cpp#L17) | | | `TypedHandle` | function | Tests | [TestRHIHandlePool.cpp:L18](../../Tests/TestRHIHandlePool.cpp#L18) | | | `TypedNode` | struct | Tests | [TestShaderGraphCompiler.cpp:L217](../../Tests/TestShaderGraphCompiler.cpp#L217) | | -| `TypeId` | alias | SparkEngine | [EngineContext.h:L61](../../SparkEngine/Source/Core/EngineContext.h#L61) | Unique type identifier that does not require complete types | +| `TypeId` | alias | SparkEngine | [EngineContext.h:L62](../../SparkEngine/Source/Core/EngineContext.h#L62) | Unique type identifier that does not require complete types | | `TypeId` | function | SparkEngine | [CoreComponentSerializersInternal.h:L29](../../SparkEngine/Source/Engine/Editor/CoreComponentSerializersInternal.h#L29) | | | `TypeId` | alias | Tests | [TestReflection.cpp:L22](../../Tests/TestReflection.cpp#L22) | | -| `TypeIdHash` | struct | SparkEngine | [EngineContext.h:L80](../../SparkEngine/Source/Core/EngineContext.h#L80) | | +| `TypeIdHash` | struct | SparkEngine | [EngineContext.h:L81](../../SparkEngine/Source/Core/EngineContext.h#L81) | | | `TypeInfo` | struct | SparkEngine | [Reflection.h:L111](../../SparkEngine/Source/Core/Reflection.h#L111) | Runtime metadata for a registered type. | | `TypeInfo` | struct | Tests | [TestReflection.cpp:L59](../../Tests/TestReflection.cpp#L59) | | | `TypeRegistry` | class | SparkEngine | [Reflection.h:L188](../../SparkEngine/Source/Core/Reflection.h#L188) | Central registry of all reflected types. | @@ -50614,8 +50730,8 @@ | `UI` | function | SparkEngine | [EngineSettings.h:L1004](../../SparkEngine/Source/Core/EngineSettings.h#L1004) | | | `UIBoolBinding` | alias | SparkEngine | [UIFactory.h:L93](../../SparkEngine/Source/Engine/UI/UIFactory.h#L93) | | | `UIButton` | class | SparkEngine | [UISystem.h:L219](../../SparkEngine/Source/Engine/UI/UISystem.h#L219) | Clickable button widget. | -| `UIButton::HandleClick` | method | SparkEngine | [UIWidgets.cpp:L62](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L62) | | -| `UIButton::Render` | method | SparkEngine | [UIWidgets.cpp:L79](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L79) | | +| `UIButton::HandleClick` | method | SparkEngine | [UIWidgets.cpp:L64](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L64) | | +| `UIButton::Render` | method | SparkEngine | [UIWidgets.cpp:L81](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L81) | | | `UICanvas` | class | SparkEngine | [UISystem.h:L359](../../SparkEngine/Source/Engine/UI/UISystem.h#L359) | Root UI canvas -- one per viewport. | | `UICanvas::CreatePanel` | method | SparkEngine | [UISystem.cpp:L28](../../SparkEngine/Source/Engine/UI/UISystem.cpp#L28) | | | `UICanvas::FindWidget` | method | SparkEngine | [UISystem.cpp:L36](../../SparkEngine/Source/Engine/UI/UISystem.cpp#L36) | | @@ -50704,11 +50820,11 @@ | `UIGridLayout::SetColumns` | method | SparkEngine | [UILayoutExtensions.cpp:L135](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L135) | | | `UIGridLayout::SetRows` | method | SparkEngine | [UILayoutExtensions.cpp:L139](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L139) | | | `UIImageWidget` | class | SparkEngine | [UISystem.h:L279](../../SparkEngine/Source/Engine/UI/UISystem.h#L279) | Image display widget. | -| `UIImageWidget::Render` | method | SparkEngine | [UIWidgets.cpp:L113](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L113) | | +| `UIImageWidget::Render` | method | SparkEngine | [UIWidgets.cpp:L115](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L115) | | | `UIIntBinding` | alias | SparkEngine | [UIFactory.h:L94](../../SparkEngine/Source/Engine/UI/UIFactory.h#L94) | | | `UILabel` | class | GameModules | [ARPGHud.h:L26](../../GameModules/SparkGameARPG/Source/UI/ARPGHud.h#L26) | | | `UILabel` | class | SparkEngine | [UISystem.h:L193](../../SparkEngine/Source/Engine/UI/UISystem.h#L193) | Text label widget. | -| `UILabel::Render` | method | SparkEngine | [UIWidgets.cpp:L46](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L46) | | +| `UILabel::Render` | method | SparkEngine | [UIWidgets.cpp:L48](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L48) | | | `UILayoutLoader` | class | SparkEngine | [UILayoutExtensions.h:L249](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L249) | Builds widgets under a panel from a hand-written JSON layout. | | `UILayoutLoader::ExtractFloat` | method | SparkEngine | [UILayoutExtensions.cpp:L699](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L699) | | | `UILayoutLoader::ExtractString` | method | SparkEngine | [UILayoutExtensions.cpp:L634](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L634) | | @@ -50721,20 +50837,20 @@ | `UINT` | alias | SparkEngine | [PlatformTypes.h:L35](../../SparkEngine/Source/Core/PlatformTypes.h#L35) | | | `uint64_t` | function | SparkEngine | [UUID.h:L107](../../SparkEngine/Source/Utils/UUID.h#L107) | | | `UIPanel` | class | SparkEngine | [UISystem.h:L303](../../SparkEngine/Source/Engine/UI/UISystem.h#L303) | Container widget that holds child widgets with layout. | -| `UIPanel::CreateButton` | method | SparkEngine | [UIWidgets.cpp:L136](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L136) | | -| `UIPanel::CreateImage` | method | SparkEngine | [UIWidgets.cpp:L152](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L152) | | -| `UIPanel::CreateLabel` | method | SparkEngine | [UIWidgets.cpp:L128](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L128) | | -| `UIPanel::CreatePanel` | method | SparkEngine | [UIWidgets.cpp:L160](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L160) | | -| `UIPanel::CreateProgressBar` | method | SparkEngine | [UIWidgets.cpp:L144](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L144) | | -| `UIPanel::FindWidget` | method | SparkEngine | [UIWidgets.cpp:L168](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L168) | | -| `UIPanel::HandleClick` | method | SparkEngine | [UIWidgets.cpp:L250](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L250) | | -| `UIPanel::RemoveWidget` | method | SparkEngine | [UIWidgets.cpp:L187](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L187) | | -| `UIPanel::Render` | method | SparkEngine | [UIWidgets.cpp:L235](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L235) | | -| `UIPanel::Update` | method | SparkEngine | [UIWidgets.cpp:L194](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L194) | | +| `UIPanel::CreateButton` | method | SparkEngine | [UIWidgets.cpp:L138](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L138) | | +| `UIPanel::CreateImage` | method | SparkEngine | [UIWidgets.cpp:L154](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L154) | | +| `UIPanel::CreateLabel` | method | SparkEngine | [UIWidgets.cpp:L130](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L130) | | +| `UIPanel::CreatePanel` | method | SparkEngine | [UIWidgets.cpp:L162](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L162) | | +| `UIPanel::CreateProgressBar` | method | SparkEngine | [UIWidgets.cpp:L146](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L146) | | +| `UIPanel::FindWidget` | method | SparkEngine | [UIWidgets.cpp:L170](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L170) | | +| `UIPanel::HandleClick` | method | SparkEngine | [UIWidgets.cpp:L252](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L252) | | +| `UIPanel::RemoveWidget` | method | SparkEngine | [UIWidgets.cpp:L189](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L189) | | +| `UIPanel::Render` | method | SparkEngine | [UIWidgets.cpp:L237](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L237) | | +| `UIPanel::Update` | method | SparkEngine | [UIWidgets.cpp:L196](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L196) | | | `UIPassData` | struct | SparkEngine | [RenderGraphBuilder.h:L161](../../SparkEngine/Source/Graphics/RenderGraph/RenderGraphBuilder.h#L161) | UI pass outputs placed on the blackboard. | | `UIProgressBar` | class | GameModules | [ARPGHud.h:L27](../../GameModules/SparkGameARPG/Source/UI/ARPGHud.h#L27) | | | `UIProgressBar` | class | SparkEngine | [UISystem.h:L253](../../SparkEngine/Source/Engine/UI/UISystem.h#L253) | Progress bar widget (e.g. health bar, loading bar). | -| `UIProgressBar::Render` | method | SparkEngine | [UIWidgets.cpp:L95](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L95) | | +| `UIProgressBar::Render` | method | SparkEngine | [UIWidgets.cpp:L97](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L97) | | | `UiRequestPing` | function | GameModules | [TFPingSystem.h:L209](../../GameModules/SparkGameMMOFPS/Source/Game/TFPingSystem.h#L209) | | | `UIS` | alias | SparkEngine | [EngineSettings.cpp:L450](../../SparkEngine/Source/Core/EngineSettings.cpp#L450) | | | `UIScrollView` | class | SparkEngine | [UILayoutExtensions.h:L83](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.h#L83) | | @@ -50765,7 +50881,7 @@ | `UISystem` | class | GameModules | [ARPGHud.h:L28](../../GameModules/SparkGameARPG/Source/UI/ARPGHud.h#L28) | | | `UISystem` | class | SparkEngine | [SparkEngineWindowsInternal.h:L33](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L33) | | | `UISystem` | class | SparkEngine | [UISystem.h:L419](../../SparkEngine/Source/Engine/UI/UISystem.h#L419) | Top-level UI management system. | -| `UISystem` | class | SparkSDK | [IEngineContext.h:L104](../../SparkSDK/Include/Spark/IEngineContext.h#L104) | | +| `UISystem` | class | SparkSDK | [IEngineContext.h:L105](../../SparkSDK/Include/Spark/IEngineContext.h#L105) | | | `UISystem::Console_GetStatus` | method | SparkEngine | [UISystem.cpp:L168](../../SparkEngine/Source/Engine/UI/UISystem.cpp#L168) | | | `UISystem::HandleClick` | method | SparkEngine | [UISystem.cpp:L159](../../SparkEngine/Source/Engine/UI/UISystem.cpp#L159) | | | `UISystem::Initialize` | method | SparkEngine | [UISystem.cpp:L99](../../SparkEngine/Source/Engine/UI/UISystem.cpp#L99) | | @@ -50787,12 +50903,12 @@ | `UITextInput::SetText` | method | SparkEngine | [UILayoutExtensions.cpp:L236](../../SparkEngine/Source/Engine/UI/UILayoutExtensions.cpp#L236) | | | `UITypedBinding` | function | SparkEngine | [UIFactory.h:L43](../../SparkEngine/Source/Engine/UI/UIFactory.h#L43) | Templated bidirectional data binding — replaces per-type classes | | `UIWidget` | class | SparkEngine | [UISystem.h:L124](../../SparkEngine/Source/Engine/UI/UISystem.h#L124) | Base class for all UI widgets. | -| `UIWidget::HandleClick` | method | SparkEngine | [UIWidgets.cpp:L33](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L33) | | -| `UIWidget::Render` | method | SparkEngine | [UIWidgets.cpp:L28](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L28) | | -| `UIWidget::Update` | method | SparkEngine | [UIWidgets.cpp:L23](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L23) | | +| `UIWidget::HandleClick` | method | SparkEngine | [UIWidgets.cpp:L35](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L35) | | +| `UIWidget::Render` | method | SparkEngine | [UIWidgets.cpp:L30](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L30) | | +| `UIWidget::Update` | method | SparkEngine | [UIWidgets.cpp:L25](../../SparkEngine/Source/Engine/UI/UIWidgets.cpp#L25) | | | `UIWidgetConfig` | struct | SparkEngine | [UIFactory.h:L97](../../SparkEngine/Source/Engine/UI/UIFactory.h#L97) | Simple config node for UI widget definition | | `ULONG` | alias | SparkEngine | [PlatformTypes.h:L38](../../SparkEngine/Source/Core/PlatformTypes.h#L38) | | -| `un` | struct | SparkEngine | [CrashHandler.cpp:L1683](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1683) | | +| `un` | struct | SparkEngine | [CrashHandler.cpp:L1684](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1684) | | | `UnackedMessagesWithPayload` | function | Tests | [TestNetworkManagerIntegration.cpp:L84](../../Tests/TestNetworkManagerIntegration.cpp#L84) | | | `UnackedTracker` | struct | Tests | [TestReliableChannel.cpp:L57](../../Tests/TestReliableChannel.cpp#L57) | | | `UnassignWorker` | function | GameModules | [RTSResourceSystem.h:L77](../../GameModules/SparkGameRTS/Source/Resource/RTSResourceSystem.h#L77) | | @@ -50916,9 +51032,9 @@ | `UniqueEndpoint` | function | SparkDaemon | [CollabProcessSmoke.cpp:L37](../../SparkDaemon/tests/CollabProcessSmoke.cpp#L37) | | | `UniqueEndpoint` | function | Tests | [TestSecDaemonPipeIdentity.cpp:L53](../../Tests/TestSecDaemonPipeIdentity.cpp#L53) | | | `UniqueEndpoint` | function | Tests | [TestSecDaemonPipeIdentity.cpp:L73](../../Tests/TestSecDaemonPipeIdentity.cpp#L73) | | -| `UniqueHandle` | alias | SparkEngine | [SceneManager.cpp:L235](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L235) | | -| `UniqueHandle` | function | SparkEngine | [SceneManager.cpp:L246](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L246) | | -| `UniqueHandle` | function | SparkEngine | [SceneManager.cpp:L250](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L250) | | +| `UniqueHandle` | alias | SparkEngine | [SceneManager.cpp:L255](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L255) | | +| `UniqueHandle` | function | SparkEngine | [SceneManager.cpp:L267](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L267) | | +| `UniqueHandle` | function | SparkEngine | [SceneManager.cpp:L273](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L273) | | | `UniqueLifecycleCacheDir` | function | Tests | [TestDaemonLifecycle.cpp:L56](../../Tests/TestDaemonLifecycle.cpp#L56) | | | `UniqueLifecyclePath` | function | Tests | [TestDaemonLifecycle.cpp:L45](../../Tests/TestDaemonLifecycle.cpp#L45) | | | `UniqueLocalCache` | function | Tests | [TestShaderDiskCacheDaemon.cpp:L48](../../Tests/TestShaderDiskCacheDaemon.cpp#L48) | | @@ -51002,7 +51118,7 @@ | `UnlockEntity` | function | Tests | [TestSelectionManager.cpp:L102](../../Tests/TestSelectionManager.cpp#L102) | | | `UnlockFastTravel` | function | GameModules | [OWPlayerSystem.h:L108](../../GameModules/SparkGameOpenWorld/Source/Player/OWPlayerSystem.h#L108) | Record the ground speed (m/s) and sprint flag the controller moved at this step; | | `UnlockFile` | function | SparkEditor | [VersionControlSystem.h:L244](../../SparkEditor/Source/VersionControl/VersionControlSystem.h#L244) | Unlock file | -| `UnlockLoaderLock` | alias | Tests | [TestEditorCrashHandlerFilterReal.cpp:L506](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L506) | | +| `UnlockLoaderLock` | alias | Tests | [TestEditorCrashHandlerFilterReal.cpp:L508](../../Tests/TestEditorCrashHandlerFilterReal.cpp#L508) | | | `UnmapBuffer` | function | SparkEngine | [D3D11Device.h:L334](../../SparkEngine/Source/Graphics/RHI/D3D11/D3D11Device.h#L334) | | | `UnmapBuffer` | function | SparkEngine | [D3D12Device.h:L133](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.h#L133) | | | `UnmapBuffer` | function | SparkEngine | [MetalDevice.h:L480](../../SparkEngine/Source/Graphics/RHI/Metal/MetalDevice.h#L480) | | @@ -51190,7 +51306,7 @@ | `Update` | function | GameModules | [TFVehicleTerminal.h:L42](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleTerminal.h#L42) | | | `Update` | function | GameModules | [TFWeaponSystem.h:L47](../../GameModules/SparkGameMMOFPS/Source/Game/TFWeaponSystem.h#L47) | | | `Update` | function | GameModules | [TFClientNet.h:L77](../../GameModules/SparkGameMMOFPS/Source/Net/TFClientNet.h#L77) | | -| `Update` | function | GameModules | [TFReplication.h:L60](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L60) | | +| `Update` | function | GameModules | [TFReplication.h:L64](../../GameModules/SparkGameMMOFPS/Source/Net/TFReplication.h#L64) | | | `Update` | function | GameModules | [TFServerSim.h:L61](../../GameModules/SparkGameMMOFPS/Source/Net/TFServerSim.h#L61) | | | `Update` | function | GameModules | [TFChatWindow.h:L46](../../GameModules/SparkGameMMOFPS/Source/UI/TFChatWindow.h#L46) | | | `Update` | function | GameModules | [TFDeathRecap.h:L66](../../GameModules/SparkGameMMOFPS/Source/UI/TFDeathRecap.h#L66) | | @@ -51263,7 +51379,7 @@ | `Update` | function | SparkEditor | [AIDebugPanel.h:L37](../../SparkEditor/Source/Panels/AIDebugPanel.h#L37) | | | `Update` | function | SparkEditor | [AIEditorPanel.h:L29](../../SparkEditor/Source/Panels/AIEditorPanel.h#L29) | | | `Update` | function | SparkEditor | [AbilityEditorPanel.h:L30](../../SparkEditor/Source/Panels/AbilityEditorPanel.h#L30) | | -| `Update` | function | SparkEditor | [AssetBrowserPanel.h:L49](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L49) | Update asset browser panel | +| `Update` | function | SparkEditor | [AssetBrowserPanel.h:L50](../../SparkEditor/Source/Panels/AssetBrowserPanel.h#L50) | Update asset browser panel | | `Update` | function | SparkEditor | [AudioMixerPanel.h:L29](../../SparkEditor/Source/Panels/AudioMixerPanel.h#L29) | | | `Update` | function | SparkEditor | [BasicMaterialEditorPanel.h:L48](../../SparkEditor/Source/Panels/BasicMaterialEditorPanel.h#L48) | | | `Update` | function | SparkEditor | [BuildCookPanel.h:L110](../../SparkEditor/Source/Panels/BuildCookPanel.h#L110) | | @@ -51468,7 +51584,7 @@ | `Update` | function | SparkEngine | [WeatherSystem.h:L268](../../SparkEngine/Source/Graphics/WeatherSystem.h#L268) | Update the weather system | | `Update` | function | SparkEngine | [GamepadInput.h:L178](../../SparkEngine/Source/Input/GamepadInput.h#L178) | | | `Update` | function | SparkEngine | [InputActionSystem.h:L335](../../SparkEngine/Source/Input/InputActionSystem.h#L335) | Update all action states (call once per frame) | -| `Update` | function | SparkEngine | [InputManager.h:L142](../../SparkEngine/Source/Input/InputManager.h#L142) | Update input states for the current frame | +| `Update` | function | SparkEngine | [InputManager.h:L144](../../SparkEngine/Source/Input/InputManager.h#L144) | Update input states for the current frame | | `Update` | function | SparkEngine | [CharacterController.h:L111](../../SparkEngine/Source/Physics/CharacterController.h#L111) | Update the character controller position based on velocity and gravity. | | `Update` | function | SparkEngine | [ClothSimulation.h:L232](../../SparkEngine/Source/Physics/ClothSimulation.h#L232) | Update all cloth simulations. | | `Update` | function | SparkEngine | [PhysicsSystem.h:L145](../../SparkEngine/Source/Physics/PhysicsSystem.h#L145) | | @@ -51520,9 +51636,9 @@ | `Update` | function | Tests | [TestECSystemSpecialized.cpp:L350](../../Tests/TestECSystemSpecialized.cpp#L350) | | | `Update` | function | Tests | [TestECSystemSpecialized.cpp:L824](../../Tests/TestECSystemSpecialized.cpp#L824) | | | `Update` | function | Tests | [TestECSystemSpecialized.cpp:L848](../../Tests/TestECSystemSpecialized.cpp#L848) | | -| `Update` | function | Tests | [TestECSystemsReal.cpp:L39](../../Tests/TestECSystemsReal.cpp#L39) | | -| `Update` | function | Tests | [TestECSystemsReal.cpp:L54](../../Tests/TestECSystemsReal.cpp#L54) | | -| `Update` | function | Tests | [TestECSystemsReal.cpp:L69](../../Tests/TestECSystemsReal.cpp#L69) | | +| `Update` | function | Tests | [TestECSystemsReal.cpp:L29](../../Tests/TestECSystemsReal.cpp#L29) | | +| `Update` | function | Tests | [TestECSystemsReal.cpp:L44](../../Tests/TestECSystemsReal.cpp#L44) | | +| `Update` | function | Tests | [TestECSystemsReal.cpp:L59](../../Tests/TestECSystemsReal.cpp#L59) | | | `Update` | function | Tests | [TestEditorSubsystems.cpp:L76](../../Tests/TestEditorSubsystems.cpp#L76) | | | `Update` | function | Tests | [TestEditorSubsystems.cpp:L91](../../Tests/TestEditorSubsystems.cpp#L91) | | | `Update` | function | Tests | [TestExtendedSystems.cpp:L973](../../Tests/TestExtendedSystems.cpp#L973) | | @@ -51569,7 +51685,7 @@ | `UpdateAll` | function | SparkEngine | [ECSystems.h:L783](../../SparkEngine/Source/Engine/ECS/Systems/ECSystems.h#L783) | | | `UpdateAll` | function | SparkEngine | [PhaseSystemManager.h:L137](../../SparkEngine/Source/Engine/ECS/Systems/PhaseSystemManager.h#L137) | | | `UpdateAll` | function | Tests | [TestECSystemOrdering.cpp:L224](../../Tests/TestECSystemOrdering.cpp#L224) | | -| `UpdateAll` | function | Tests | [TestECSystemsReal.cpp:L85](../../Tests/TestECSystemsReal.cpp#L85) | | +| `UpdateAll` | function | Tests | [TestECSystemsReal.cpp:L75](../../Tests/TestECSystemsReal.cpp#L75) | | | `UpdateAllAgents` | function | SparkEngine | [ParallelPerception.h:L177](../../SparkEngine/Source/Engine/AI/ParallelPerception.h#L177) | | | `UpdateAllBindings` | function | SparkEngine | [UIFactory.h:L136](../../SparkEngine/Source/Engine/UI/UIFactory.h#L136) | Push all data values to widgets | | `UpdateAndDrawFlakes` | function | GameModules | [TFWeatherFx.h:L174](../../GameModules/SparkGameMMOFPS/Source/World/TFWeatherFx.h#L174) | | @@ -51579,7 +51695,7 @@ | `UpdateAndRender` | function | GameModules | [TFVehicleFx.h:L86](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleFx.h#L86) | | | `UpdateAnimation` | function | GameModules | [Player.h:L725](../../GameModules/SparkGameFPS/Source/Game/Player.h#L725) | Update animation timers and effects | | `UpdateAreaDistances` | function | SparkEngine | [SeamlessAreaManager.h:L193](../../SparkEngine/Source/Engine/Streaming/SeamlessAreaManager.h#L193) | Compute a distance biased by alignment with the player's movement direction. | -| `UpdateArenaAutopilot` | function | GameModules | [Game.h:L649](../../GameModules/SparkGameFPS/Source/Game/Game.h#L649) | Step the arena autopilot when enabled and fire when it is on target. | +| `UpdateArenaAutopilot` | function | GameModules | [Game.h:L673](../../GameModules/SparkGameFPS/Source/Game/Game.h#L673) | Step the arena autopilot when enabled and fire when it is on target. | | `UpdateAssetDatabaseInfo` | function | SparkEditor | [EditorUI.h:L246](../../SparkEditor/Source/Core/EditorUI.h#L246) | | | `UpdateAudio` | function | SparkEngine | [WeatherGameplayIntegration.h:L108](../../SparkEngine/Source/Engine/Gameplay/WeatherGameplayIntegration.h#L108) | | | `UpdateAuras` | function | SparkEngine | [AbilitySystem.h:L324](../../SparkEngine/Source/Engine/Gameplay/AbilitySystem.h#L324) | | @@ -51695,7 +51811,7 @@ | `UpdateIsolated` | function | SparkEngine | [PhaseSystemManager.h:L256](../../SparkEngine/Source/Engine/ECS/Systems/PhaseSystemManager.h#L256) | | | `UpdateJetpack` | function | GameModules | [Player.h:L759](../../GameModules/SparkGameFPS/Source/Game/Player.h#L759) | Handle jetpack mechanics for Scout | | `UpdateJumpBuffer` | function | GameModules | [PlatformerPlayerController.h:L182](../../GameModules/SparkGamePlatformer/Source/Player/PlatformerPlayerController.h#L182) | | -| `UpdateKeyState` | function | SparkEngine | [InputManager.h:L448](../../SparkEngine/Source/Input/InputManager.h#L448) | Consolidated handler for mouse button down/up messages. | +| `UpdateKeyState` | function | SparkEngine | [InputManager.h:L455](../../SparkEngine/Source/Input/InputManager.h#L455) | Consolidated handler for mouse button down/up messages. | | `UpdateKillFeed` | function | GameModules | [HUDSystem.h:L439](../../GameModules/SparkGameFPS/Source/Game/HUDSystem.h#L439) | | | `UpdateLasers` | function | GameModules | [PlatformerHazardSystem.h:L127](../../GameModules/SparkGamePlatformer/Source/Hazard/PlatformerHazardSystem.h#L127) | Get wind force at a given position (for wind zones) | | `UpdateLayers` | function | SparkEngine | [AnimationSystem.h:L316](../../SparkEngine/Source/Engine/Animation/AnimationSystem.h#L316) | Advance layer playback times and sample/blend all layers. | @@ -51721,11 +51837,11 @@ | `UpdateMetrics` | function | SparkEngine | [RenderTarget.h:L381](../../SparkEngine/Source/Graphics/RenderTarget.h#L381) | | | `UpdateMetrics` | function | SparkEngine | [TextureSystem.h:L438](../../SparkEngine/Source/Graphics/TextureSystem.h#L438) | | | `UpdateMetrics` | function | SparkEngine | [PhysicsSystem.h:L807](../../SparkEngine/Source/Physics/PhysicsSystem.h#L807) | | -| `UpdateMouseButton` | function | SparkEngine | [InputManager.h:L458](../../SparkEngine/Source/Input/InputManager.h#L458) | Update the state of a specific mouse button | -| `UpdateMousePosition` | function | SparkEngine | [InputManager.h:L469](../../SparkEngine/Source/Input/InputManager.h#L469) | Update mouse position and calculate delta | +| `UpdateMouseButton` | function | SparkEngine | [InputManager.h:L465](../../SparkEngine/Source/Input/InputManager.h#L465) | Update the state of a specific mouse button | +| `UpdateMousePosition` | function | SparkEngine | [InputManager.h:L476](../../SparkEngine/Source/Input/InputManager.h#L476) | Update mouse position and calculate delta | | `UpdateMovement` | function | GameModules | [Player.h:L707](../../GameModules/SparkGameFPS/Source/Game/Player.h#L707) | Update movement based on input and physics | | `UpdateMovement` | function | SparkEngine | [AISystem.h:L394](../../SparkEngine/Source/Engine/AI/AISystem.h#L394) | | -| `UpdateMultiplayer` | function | GameModules | [Game.h:L724](../../GameModules/SparkGameFPS/Source/Game/Game.h#L724) | Tick the FPS multiplayer session and send local input at its fixed 60 Hz step. | +| `UpdateMultiplayer` | function | GameModules | [Game.h:L748](../../GameModules/SparkGameFPS/Source/Game/Game.h#L748) | Tick the FPS multiplayer session and send local input at its fixed 60 Hz step. | | `UpdateNodeRespawns` | function | GameModules | [OWGatheringSystem.h:L143](../../GameModules/SparkGameOpenWorld/Source/Gathering/OWGatheringSystem.h#L143) | | | `UpdateNonECSSystems` | function | SparkEngine | [GameplayLifecycleShared.cpp:L968](../../SparkEngine/Source/Core/Lifecycle/GameplayLifecycleShared.cpp#L968) | | | `UpdateObjectGravity` | function | GameModules | [GravitySystem.h:L156](../../GameModules/SparkGameFPS/Source/Game/GravitySystem.h#L156) | Get gravity state for an object (with transitions) | @@ -51816,7 +51932,7 @@ | `UpdateStatistics` | function | SparkEditor | [EditorLogger.h:L229](../../SparkEditor/Source/Core/EditorLogger.h#L229) | | | `UpdateStatistics` | function | SparkEditor | [LevelStreamingSystem.h:L406](../../SparkEditor/Source/LevelStreaming/LevelStreamingSystem.h#L406) | Update streaming statistics | | `UpdateStats` | function | SparkEditor | [EditorCrashHandler.h:L132](../../SparkEditor/Source/Core/EditorCrashHandler.h#L132) | | -| `UpdateStats` | function | SparkEditor | [EditorUI.h:L506](../../SparkEditor/Source/Core/EditorUI.h#L506) | | +| `UpdateStats` | function | SparkEditor | [EditorUI.h:L504](../../SparkEditor/Source/Core/EditorUI.h#L504) | | | `UpdateStats` | function | SparkEditor | [ConsolePanel.h:L262](../../SparkEditor/Source/Panels/ConsolePanel.h#L262) | Update statistics | | `UpdateStats` | function | SparkEngine | [RenderGraph.h:L1301](../../SparkEngine/Source/Graphics/RenderGraph.h#L1301) | Update aggregate statistics after compilation. | | `UpdateStreaming` | function | SparkEngine | [HLODSystem.h:L291](../../SparkEngine/Source/Engine/HLOD/HLODSystem.h#L291) | Update streaming: load nearby cells, unload distant ones | @@ -51948,9 +52064,9 @@ | `Utf8` | function | Tests | [ScopedEditorProfile.h:L33](../../Tests/Fixtures/ScopedEditorProfile.h#L33) | | | `Utf8` | function | Tests | [TF120PeerProcess.h:L123](../../Tests/TF120PeerProcess.h#L123) | | | `Utf8` | function | Tests | [TestDocumentInterruptionReal.cpp:L114](../../Tests/TestDocumentInterruptionReal.cpp#L114) | | -| `Utf8` | function | Tests | [TestEditorCookPackageReal.cpp:L102](../../Tests/TestEditorCookPackageReal.cpp#L102) | | -| `Utf8` | function | Tests | [TestEditorCookPackageReal.cpp:L269](../../Tests/TestEditorCookPackageReal.cpp#L269) | | -| `Utf8` | function | Tests | [TestEditorCookPackageReal.cpp:L276](../../Tests/TestEditorCookPackageReal.cpp#L276) | | +| `Utf8` | function | Tests | [TestEditorCookPackageReal.cpp:L104](../../Tests/TestEditorCookPackageReal.cpp#L104) | | +| `Utf8` | function | Tests | [TestEditorCookPackageReal.cpp:L280](../../Tests/TestEditorCookPackageReal.cpp#L280) | | +| `Utf8` | function | Tests | [TestEditorCookPackageReal.cpp:L287](../../Tests/TestEditorCookPackageReal.cpp#L287) | | | `Utf8` | function | Tests | [TestEditorStateCompatibility.cpp:L48](../../Tests/TestEditorStateCompatibility.cpp#L48) | | | `Utf8` | function | Tests | [TestEditorUntrustedProject.cpp:L67](../../Tests/TestEditorUntrustedProject.cpp#L67) | | | `Utf8` | function | Tests | [TestModuleDiscovery.cpp:L84](../../Tests/TestModuleDiscovery.cpp#L84) | | @@ -52063,8 +52179,8 @@ | `ValidateHit` | function | SparkEngine | [NetworkManager.h:L882](../../SparkEngine/Source/Engine/Networking/NetworkManager.h#L882) | | | `ValidateHit` | function | Tests | [TestLagCompensationIntegration.cpp:L156](../../Tests/TestLagCompensationIntegration.cpp#L156) | | | `ValidateInverseBind` | function | SparkEngine | [GLTFSkinSkeleton.cpp:L190](../../SparkEngine/Source/Graphics/GLTFSkinSkeleton.cpp#L190) | | -| `ValidateLaunchRequest` | function | SparkLauncher | [main.cpp:L28](../../SparkLauncher/src/main.cpp#L28) | | -| `ValidateLaunchRequest` | function | SparkLauncher | [main.cpp:L126](../../SparkLauncher/src/main.cpp#L126) | | +| `ValidateLaunchRequest` | function | SparkLauncher | [main.cpp:L30](../../SparkLauncher/src/main.cpp#L30) | | +| `ValidateLaunchRequest` | function | SparkLauncher | [main.cpp:L130](../../SparkLauncher/src/main.cpp#L130) | | | `ValidateLexemes` | function | GameModules | [TFJsonStrict.h:L22](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFJsonStrict.h#L22) | | | `ValidateMatchAndFog` | function | GameModules | [RTSPersistenceValidation.cpp:L175](../../GameModules/SparkGameRTS/Source/Core/RTSPersistenceValidation.cpp#L175) | | | `ValidateMemberNames` | function | SparkBuild | [ArchiveExtraction.cpp:L315](../../SparkBuild/src/ArchiveExtraction.cpp#L315) | | @@ -52194,7 +52310,7 @@ | `ValidBc1_4x4` | function | Tests | [TestTextureStexBoundsReal.cpp:L87](../../Tests/TestTextureStexBoundsReal.cpp#L87) | | | `ValidBeacon` | function | Tests | [TestTFLanBeaconCodec.cpp:L22](../../Tests/TestTFLanBeaconCodec.cpp#L22) | | | `validData` | function | Tests | [TestFBXImporter.cpp:L79](../../Tests/TestFBXImporter.cpp#L79) | | -| `ValidDocument` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L109](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L109) | | +| `ValidDocument` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L110](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L110) | | | `ValidFloat` | function | GameModules | [MMOSessionGateProtocol.cpp:L126](../../GameModules/SparkGameMMO/Source/Session/MMOSessionGateProtocol.cpp#L126) | | | `ValidGrenadeChoiceKey` | function | GameModules | [TFProgressionSystem.h:L235](../../GameModules/SparkGameMMOFPS/Source/Game/TFProgressionSystem.h#L235) | | | `ValidLoadoutSlotKey` | function | GameModules | [TFProgressionSystem.h:L262](../../GameModules/SparkGameMMOFPS/Source/Game/TFProgressionSystem.h#L262) | | @@ -52206,6 +52322,7 @@ | `Value` | alias | SparkCrashReporter | [CrashReporterApp.cpp:L691](../../SparkCrashReporter/src/CrashReporterApp.cpp#L691) | | | `Value` | alias | SparkCrashReporter | [CrashReporterApp.cpp:L694](../../SparkCrashReporter/src/CrashReporterApp.cpp#L694) | | | `value` | function | SparkEditor | [CollaborativeWireCodec.cpp:L111](../../SparkEditor/Source/Communication/CollaborativeWireCodec.cpp#L111) | | +| `value` | function | SparkEditor | [MaterialEditorMaterialParser.cpp:L192](../../SparkEditor/Source/Panels/MaterialEditorMaterialParser.cpp#L192) | | | `Value` | function | SparkEditor | [JSONSceneSerializer.cpp:L194](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L194) | | | `Value` | function | SparkEditor | [JSONSceneSerializer.cpp:L195](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L195) | | | `Value` | function | SparkEditor | [JSONSceneSerializer.cpp:L196](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L196) | | @@ -52237,7 +52354,7 @@ | `Value` | function | SparkEngine | [Result.h:L75](../../SparkEngine/Source/Utils/Result.h#L75) | | | `Value` | function | SparkEngine | [Result.h:L76](../../SparkEngine/Source/Utils/Result.h#L76) | | | `value` | function | Tests | [TestCrashHandlerGatingReal.cpp:L276](../../Tests/TestCrashHandlerGatingReal.cpp#L276) | | -| `value` | function | Tests | [TestTFDataTables.cpp:L97](../../Tests/TestTFDataTables.cpp#L97) | | +| `value` | function | Tests | [TestTFDataTables.cpp:L88](../../Tests/TestTFDataTables.cpp#L88) | | | `value_type` | alias | SparkEngine | [Expected.h:L51](../../SparkEngine/Source/Utils/Expected.h#L51) | | | `value_type` | alias | SparkEngine | [Expected.h:L91](../../SparkEngine/Source/Utils/Expected.h#L91) | | | `valueDist` | function | GameModules | [ARPGLootSystem.cpp:L182](../../GameModules/SparkGameARPG/Source/Loot/ARPGLootSystem.cpp#L182) | | @@ -52254,7 +52371,7 @@ | `VarianceClip` | function | SparkEngine | [TemporalTypes.h:L331](../../SparkEngine/Source/Graphics/TemporalTypes.h#L331) | Variance-based clip (more accurate than AABB clamp) | | `VariantKey` | struct | Tests | [TestGraphicsIntegration.cpp:L497](../../Tests/TestGraphicsIntegration.cpp#L497) | | | `VarName` | function | SparkEngine | [VisualScriptCodegen.cpp:L132](../../SparkEngine/Source/Engine/Scripting/VisualScriptCodegen.cpp#L132) | | -| `VarName` | function | SparkEngine | [VisualScriptEmitter.cpp:L325](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L325) | | +| `VarName` | function | SparkEngine | [VisualScriptEmitter.cpp:L338](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L338) | | | `VarName` | function | SparkEngine | [VisualScriptEmitter.h:L62](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L62) | | | `VarName` | function | SparkEngine | [ShaderGraphCompiler.cpp:L38](../../SparkEngine/Source/Graphics/ShaderGraph/ShaderGraphCompiler.cpp#L38) | | | `VarName` | function | SparkEngine | [ShaderGraphCompiler.cpp:L219](../../SparkEngine/Source/Graphics/ShaderGraph/ShaderGraphCompiler.cpp#L219) | | @@ -52337,7 +52454,7 @@ | `Vector3LengthSquared` | function | SparkEngine | [CollisionSystem.h:L317](../../SparkEngine/Source/Physics/CollisionSystem.h#L317) | Calculate the squared length of a 3D vector | | `Vector3Lerp` | function | SparkEngine | [CollisionSystem.h:L357](../../SparkEngine/Source/Physics/CollisionSystem.h#L357) | Linear interpolation between two 3D vectors | | `Vector3Normalize` | function | SparkEngine | [CollisionSystem.h:L324](../../SparkEngine/Source/Physics/CollisionSystem.h#L324) | Normalize a 3D vector to unit length | -| `Vector3Pin` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L125](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L125) | | +| `Vector3Pin` | function | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L126](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L126) | | | `Vector3Reflect` | function | SparkEngine | [CollisionSystem.h:L348](../../SparkEngine/Source/Physics/CollisionSystem.h#L348) | Reflect a vector off a surface normal | | `VectorFixture` | struct | Tests | [TestFixtures.cpp:L32](../../Tests/TestFixtures.cpp#L32) | | | `VectorKey` | struct | SparkEngine | [AnimationClip.h:L29](../../SparkEngine/Source/Engine/Animation/AnimationClip.h#L29) | A single position or scale keyframe in an animation channel. | @@ -52552,7 +52669,7 @@ | `vetoUnload` | function | Tests | [TestModuleABI.cpp:L609](../../Tests/TestModuleABI.cpp#L609) | | | `vetoUnload` | function | Tests | [TestModuleABI.cpp:L661](../../Tests/TestModuleABI.cpp#L661) | | | `vetoUnload` | function | Tests | [TestModuleABI.cpp:L680](../../Tests/TestModuleABI.cpp#L680) | | -| `Veyra` | function | Tests | [TestTF120Travel.cpp:L139](../../Tests/TestTF120Travel.cpp#L139) | | +| `Veyra` | function | Tests | [TestTF120Travel.cpp:L126](../../Tests/TestTF120Travel.cpp#L126) | | | `victim` | function | Tests | [TestSecurityParsersReal.cpp:L472](../../Tests/TestSecurityParsersReal.cpp#L472) | | | `VideoFrame` | struct | SparkEngine | [VideoPlayer.h:L63](../../SparkEngine/Source/Engine/Cinematic/VideoPlayer.h#L63) | A decoded video frame | | `VideoHandle` | alias | SparkEngine | [VideoPlayer.h:L44](../../SparkEngine/Source/Engine/Cinematic/VideoPlayer.h#L44) | Opaque handle to a loaded video | @@ -52577,7 +52694,7 @@ | `ViolationSeverity` | enum | SparkEngine | [MemoryIntegrity.h:L69](../../SparkEngine/Source/Engine/Security/MemoryIntegrity.h#L69) | Severity of an integrity violation | | `ViolationType` | enum | SparkEngine | [MemoryIntegrity.h:L60](../../SparkEngine/Source/Engine/Security/MemoryIntegrity.h#L60) | Type of integrity violation detected | | `VirtualFileSystem` | class | SparkEngine | [VirtualFileSystem.h:L186](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.h#L186) | Singleton mount-priority virtual filesystem. | -| `VirtualFileSystem` | class | SparkSDK | [IEngineContext.h:L77](../../SparkSDK/Include/Spark/IEngineContext.h#L77) | | +| `VirtualFileSystem` | class | SparkSDK | [IEngineContext.h:L78](../../SparkSDK/Include/Spark/IEngineContext.h#L78) | | | `VirtualFileSystem::Console_GetStatus` | method | SparkEngine | [VirtualFileSystem.cpp:L628](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L628) | | | `VirtualFileSystem::Exists` | method | SparkEngine | [VirtualFileSystem.cpp:L523](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L523) | | | `VirtualFileSystem::GetInstance` | method | SparkEngine | [VirtualFileSystem.cpp:L460](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L460) | | @@ -52591,7 +52708,7 @@ | `VirtualFileSystem::ResolveProvider` | method | SparkEngine | [VirtualFileSystem.cpp:L606](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L606) | | | `VirtualFileSystem::Shutdown` | method | SparkEngine | [VirtualFileSystem.cpp:L479](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L479) | | | `VirtualFileSystem::Unmount` | method | SparkEngine | [VirtualFileSystem.cpp:L501](../../SparkEngine/Source/Engine/Modding/VirtualFileSystem.cpp#L501) | | -| `VirtualKeyToKeyName` | function | SparkEngine | [InputManager.h:L493](../../SparkEngine/Source/Input/InputManager.h#L493) | Convert virtual key code to key name | +| `VirtualKeyToKeyName` | function | SparkEngine | [InputManager.h:L500](../../SparkEngine/Source/Input/InputManager.h#L500) | Convert virtual key code to key name | | `VirtualTextureManager` | class | SparkEngine | [VirtualTexture.h:L77](../../SparkEngine/Source/Graphics/VirtualTexture.h#L77) | | | `VirtualTextureManager::Console_GetStatus` | method | SparkEngine | [VirtualTexture.cpp:L232](../../SparkEngine/Source/Graphics/VirtualTexture.cpp#L232) | | | `VirtualTextureManager::EvictStalePages` | method | SparkEngine | [VirtualTexture.cpp:L179](../../SparkEngine/Source/Graphics/VirtualTexture.cpp#L179) | | @@ -52612,8 +52729,8 @@ | `VisitCellNeighborhood` | function | SparkEngine | [SpatialGrid.h:L151](../../SparkEngine/Source/Engine/World/SpatialGrid.h#L151) | Visit all entities in a cell and its neighbors | | `visited` | function | GameModules | [TFRegionSystem.cpp:L302](../../GameModules/SparkGameMMOFPS/Source/World/TFRegionSystem.cpp#L302) | | | `visited` | function | SparkEngine | [NavMesh.cpp:L208](../../SparkEngine/Source/Engine/AI/NavMesh.cpp#L208) | | -| `visited` | function | Tests | [TestTFRegionLattice.cpp:L164](../../Tests/TestTFRegionLattice.cpp#L164) | | -| `visited` | function | Tests | [TestTFRegionLattice.cpp:L223](../../Tests/TestTFRegionLattice.cpp#L223) | | +| `visited` | function | Tests | [TestTFRegionLattice.cpp:L157](../../Tests/TestTFRegionLattice.cpp#L157) | | +| `visited` | function | Tests | [TestTFRegionLattice.cpp:L216](../../Tests/TestTFRegionLattice.cpp#L216) | | | `VisitNearby` | function | SparkEngine | [SpatialGrid.h:L143](../../SparkEngine/Source/Engine/World/SpatialGrid.h#L143) | | | `VisitSettlement` | function | GameModules | [OWSettlementSystem.h:L102](../../GameModules/SparkGameOpenWorld/Source/Settlement/OWSettlementSystem.h#L102) | Record that the player entered and interacted with a settlement. | | `VisMask` | struct | Tests | [TestExtendedSystems.cpp:L325](../../Tests/TestExtendedSystems.cpp#L325) | | @@ -52625,23 +52742,23 @@ | `VisualScriptCompiler::GetNodeDisplayName` | method | SparkEngine | [VisualScriptNodePalette.cpp:L177](../../SparkEngine/Source/Engine/Scripting/VisualScriptNodePalette.cpp#L177) | | | `VisualScriptCompiler::GetNodePalette` | method | SparkEngine | [VisualScriptNodePalette.cpp:L172](../../SparkEngine/Source/Engine/Scripting/VisualScriptNodePalette.cpp#L172) | | | `VisualScriptEmitter` | class | SparkEngine | [VisualScriptEmitter.h:L91](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.h#L91) | Emits the statements of one graph (an event graph or a function sub-graph) | -| `VisualScriptEmitter::CollectPure` | method | SparkEngine | [VisualScriptEmitter.cpp:L345](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L345) | | -| `VisualScriptEmitter::EmitChain` | method | SparkEngine | [VisualScriptEmitter.cpp:L445](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L445) | | -| `VisualScriptEmitter::EmitControlFlow` | method | SparkEngine | [VisualScriptEmitter.cpp:L392](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L392) | | -| `VisualScriptEmitter::EmitEntryChains` | method | SparkEngine | [VisualScriptEmitter.cpp:L100](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L100) | | +| `VisualScriptEmitter::CollectPure` | method | SparkEngine | [VisualScriptEmitter.cpp:L362](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L362) | | +| `VisualScriptEmitter::EmitChain` | method | SparkEngine | [VisualScriptEmitter.cpp:L470](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L470) | | +| `VisualScriptEmitter::EmitControlFlow` | method | SparkEngine | [VisualScriptEmitter.cpp:L409](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L409) | | +| `VisualScriptEmitter::EmitEntryChains` | method | SparkEngine | [VisualScriptEmitter.cpp:L114](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L114) | | | `VisualScriptEmitter::EmitNode` | method | SparkEngine | [VisualScriptEmitNode.cpp:L36](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitNode.cpp#L36) | | -| `VisualScriptEmitter::EmitPinChains` | method | SparkEngine | [VisualScriptEmitter.cpp:L84](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L84) | | -| `VisualScriptEmitter::EmitStep` | method | SparkEngine | [VisualScriptEmitter.cpp:L155](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L155) | | -| `VisualScriptEmitter::ExecOutputPins` | method | SparkEngine | [VisualScriptEmitter.cpp:L58](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L58) | | -| `VisualScriptEmitter::FindConnectionToInput` | method | SparkEngine | [VisualScriptEmitter.cpp:L287](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L287) | | -| `VisualScriptEmitter::FindNode` | method | SparkEngine | [VisualScriptEmitter.cpp:L50](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L50) | | -| `VisualScriptEmitter::Halt` | method | SparkEngine | [VisualScriptEmitter.cpp:L145](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L145) | | -| `VisualScriptEmitter::HasExecTarget` | method | SparkEngine | [VisualScriptEmitter.cpp:L437](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L437) | | -| `VisualScriptEmitter::IsExecConnection` | method | SparkEngine | [VisualScriptEmitter.cpp:L272](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L272) | | -| `VisualScriptEmitter::Lookup` | method | SparkEngine | [VisualScriptEmitter.cpp:L261](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L261) | | -| `VisualScriptEmitter::PureDependencies` | method | SparkEngine | [VisualScriptEmitter.cpp:L336](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L336) | | -| `VisualScriptEmitter::ResolveInput` | method | SparkEngine | [VisualScriptEmitter.cpp:L301](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L301) | | -| `VisualScriptEmitter::StepLimitReached` | method | SparkEngine | [VisualScriptEmitter.cpp:L140](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L140) | | +| `VisualScriptEmitter::EmitPinChains` | method | SparkEngine | [VisualScriptEmitter.cpp:L98](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L98) | | +| `VisualScriptEmitter::EmitStep` | method | SparkEngine | [VisualScriptEmitter.cpp:L169](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L169) | | +| `VisualScriptEmitter::ExecOutputPins` | method | SparkEngine | [VisualScriptEmitter.cpp:L68](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L68) | | +| `VisualScriptEmitter::FindConnectionToInput` | method | SparkEngine | [VisualScriptEmitter.cpp:L300](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L300) | | +| `VisualScriptEmitter::FindNode` | method | SparkEngine | [VisualScriptEmitter.cpp:L60](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L60) | | +| `VisualScriptEmitter::Halt` | method | SparkEngine | [VisualScriptEmitter.cpp:L159](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L159) | | +| `VisualScriptEmitter::HasExecTarget` | method | SparkEngine | [VisualScriptEmitter.cpp:L462](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L462) | | +| `VisualScriptEmitter::IsExecConnection` | method | SparkEngine | [VisualScriptEmitter.cpp:L285](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L285) | | +| `VisualScriptEmitter::Lookup` | method | SparkEngine | [VisualScriptEmitter.cpp:L274](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L274) | | +| `VisualScriptEmitter::PureDependencies` | method | SparkEngine | [VisualScriptEmitter.cpp:L349](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L349) | | +| `VisualScriptEmitter::ResolveInput` | method | SparkEngine | [VisualScriptEmitter.cpp:L314](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L314) | | +| `VisualScriptEmitter::StepLimitReached` | method | SparkEngine | [VisualScriptEmitter.cpp:L154](../../SparkEngine/Source/Engine/Scripting/VisualScriptEmitter.cpp#L154) | | | `VisualScriptGraph` | struct | SparkEngine | [VisualScriptGraphTypes.h:L112](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphTypes.h#L112) | Complete visual script graph | | `VisualScriptGraph` | struct | Tests | [TestVisualScriptCompiler.cpp:L103](../../Tests/TestVisualScriptCompiler.cpp#L103) | | | `VisualScriptGraphIO` | class | SparkEngine | [VisualScriptGraphIO.h:L56](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphIO.h#L56) | Reads and writes visual script graphs in the .vscript format | @@ -52656,7 +52773,7 @@ | `VisualScriptGraphIO::SaveFile` | method | SparkEngine | [VisualScriptGraphWriter.cpp:L247](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphWriter.cpp#L247) | | | `VisualScriptGraphIO::ScriptFilePath` | method | SparkEngine | [VisualScriptGraphIO.cpp:L553](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphIO.cpp#L553) | | | `VisualScriptGraphIO::Serialize` | method | SparkEngine | [VisualScriptGraphWriter.cpp:L190](../../SparkEngine/Source/Engine/Scripting/VisualScriptGraphWriter.cpp#L190) | | -| `VisualScriptGraphIO::Serialize` | method | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L122](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L122) | | +| `VisualScriptGraphIO::Serialize` | method | Tests | [TestMOD390VisualScriptGraphsReal.cpp:L123](../../Tests/TestMOD390VisualScriptGraphsReal.cpp#L123) | | | `VisualScriptPanel` | class | SparkEditor | [VisualScriptPanel.h:L26](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L26) | | | `VisualScriptPanel` | class | SparkEditor | [VisualScriptPanel.h:L91](../../SparkEditor/Source/Panels/VisualScriptPanel.h#L91) | Visual scripting editor with node graph canvas | | `VisualScriptPanel::AddConnectionDirect` | method | SparkEditor | [VisualScriptPanel.cpp:L1651](../../SparkEditor/Source/Panels/VisualScriptPanel.cpp#L1651) | | @@ -52838,7 +52955,7 @@ | `VRSMode` | enum | SparkEngine | [GraphicsEngineTypes.h:L40](../../SparkEngine/Source/Graphics/GraphicsEngineTypes.h#L40) | Variable Rate Shading mode | | `VRSShadingRate` | enum | SparkEngine | [GraphicsEngineTypes.h:L50](../../SparkEngine/Source/Graphics/GraphicsEngineTypes.h#L50) | Variable Rate Shading quality/rate | | `VRSystem` | class | SparkEngine | [VRSystem.h:L120](../../SparkEngine/Source/Engine/VR/VRSystem.h#L120) | Manages VR hardware initialization, tracking, and rendering. | -| `VRSystem` | class | SparkSDK | [IEngineContext.h:L64](../../SparkSDK/Include/Spark/IEngineContext.h#L64) | | +| `VRSystem` | class | SparkSDK | [IEngineContext.h:L65](../../SparkSDK/Include/Spark/IEngineContext.h#L65) | | | `VRSystem` | class | Tests | [TestVRSystem.cpp:L66](../../Tests/TestVRSystem.cpp#L66) | | | `VRSystem::Console_GetStatus` | method | SparkEngine | [VRSystem.cpp:L99](../../SparkEngine/Source/Engine/VR/VRSystem.cpp#L99) | | | `VRSystem::GetRecommendedRenderSize` | method | SparkEngine | [VRSystem.cpp:L62](../../SparkEngine/Source/Engine/VR/VRSystem.cpp#L62) | | @@ -53105,10 +53222,10 @@ | `WasButtonPressed` | function | Tests | [TestGamepadInputProcessing.cpp:L181](../../Tests/TestGamepadInputProcessing.cpp#L181) | | | `WasButtonReleased` | function | SparkEngine | [GamepadInput.h:L229](../../SparkEngine/Source/Input/GamepadInput.h#L229) | Check if a button was released this frame (falling edge) | | `WasButtonReleased` | function | Tests | [TestGamepadInputProcessing.cpp:L189](../../Tests/TestGamepadInputProcessing.cpp#L189) | | -| `WasKeyPressed` | function | SparkEngine | [InputManager.h:L186](../../SparkEngine/Source/Input/InputManager.h#L186) | Check if a key was just pressed this frame | -| `WasKeyReleased` | function | SparkEngine | [InputManager.h:L197](../../SparkEngine/Source/Input/InputManager.h#L197) | Check if a key was just released this frame | -| `WasMouseButtonPressed` | function | SparkEngine | [InputManager.h:L217](../../SparkEngine/Source/Input/InputManager.h#L217) | Check if a mouse button was just pressed this frame | -| `WasMouseButtonReleased` | function | SparkEngine | [InputManager.h:L227](../../SparkEngine/Source/Input/InputManager.h#L227) | Check if a mouse button was just released this frame | +| `WasKeyPressed` | function | SparkEngine | [InputManager.h:L193](../../SparkEngine/Source/Input/InputManager.h#L193) | Check if a key was just pressed this frame | +| `WasKeyReleased` | function | SparkEngine | [InputManager.h:L204](../../SparkEngine/Source/Input/InputManager.h#L204) | Check if a key was just released this frame | +| `WasMouseButtonPressed` | function | SparkEngine | [InputManager.h:L224](../../SparkEngine/Source/Input/InputManager.h#L224) | Check if a mouse button was just pressed this frame | +| `WasMouseButtonReleased` | function | SparkEngine | [InputManager.h:L234](../../SparkEngine/Source/Input/InputManager.h#L234) | Check if a mouse button was just released this frame | | `Watch` | function | SparkEngine | [FileWatcher.h:L134](../../SparkEngine/Source/Utils/FileWatcher/FileWatcher.h#L134) | Watch a directory for changes | | `WatchAllLoadedModules` | function | SparkEngine | [ModuleHotReload.h:L77](../../SparkEngine/Source/Core/ModuleHotReload.h#L77) | Auto-detect all loaded modules from ModuleManager and watch their DLLs | | `WatchAndReport` | function | SparkCrashReporter | [CrashReporterApp.cpp:L1925](../../SparkCrashReporter/src/CrashReporterApp.cpp#L1925) | | @@ -53182,7 +53299,7 @@ | `WaypointGenerator::Update` | method | SparkEngine | [MovementSystem.cpp:L319](../../SparkEngine/Source/Engine/AI/MovementSystem.cpp#L319) | | | `WaypointRequest` | struct | GameModules | [TFSquadSystem.h:L123](../../GameModules/SparkGameMMOFPS/Source/Game/TFSquadSystem.h#L123) | | | `WCHAR` | alias | SparkEngine | [PlatformTypes.h:L41](../../SparkEngine/Source/Core/PlatformTypes.h#L41) | | -| `wCodeName` | function | SparkEngine | [CrashHandler.cpp:L1126](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1126) | | +| `wCodeName` | function | SparkEngine | [CrashHandler.cpp:L1127](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1127) | | | `wcscpy_s` | function | SparkEngine | [PlatformTypes.h:L234](../../SparkEngine/Source/Core/PlatformTypes.h#L234) | | | `WeaponDef` | struct | GameModules | [TFDataTables.h:L39](../../GameModules/SparkGameMMOFPS/Source/Data/TFDataTables.h#L39) | | | `WeaponDef` | struct | GameModules | [TFGrenadeSystem.h:L90](../../GameModules/SparkGameMMOFPS/Source/Game/TFGrenadeSystem.h#L90) | | @@ -53246,7 +53363,7 @@ | `WeaponStats` | struct | GameModules | [WeaponStats.h:L23](../../GameModules/SparkGameFPS/Source/Projectiles/WeaponStats.h#L23) | Weapon statistics and configuration structure | | `WeaponSystem` | class | SparkEngine | [EngineRuntime.h:L52](../../SparkEngine/Source/Core/EngineRuntime.h#L52) | | | `WeaponSystem` | class | SparkEngine | [WeaponManager.h:L277](../../SparkEngine/Source/Engine/Gameplay/WeaponManager.h#L277) | Processes all entities with WeaponInventoryComponent | -| `WeaponSystem` | class | SparkSDK | [IEngineContext.h:L57](../../SparkSDK/Include/Spark/IEngineContext.h#L57) | | +| `WeaponSystem` | class | SparkSDK | [IEngineContext.h:L58](../../SparkSDK/Include/Spark/IEngineContext.h#L58) | | | `WeaponSystem::CalculateSpread` | method | SparkEngine | [WeaponManager.cpp:L458](../../SparkEngine/Source/Engine/Gameplay/WeaponManager.cpp#L458) | | | `WeaponSystem::EmitFireEvent` | method | SparkEngine | [WeaponManager.cpp:L478](../../SparkEngine/Source/Engine/Gameplay/WeaponManager.cpp#L478) | | | `WeaponSystem::HandleFiring` | method | SparkEngine | [WeaponManager.cpp:L324](../../SparkEngine/Source/Engine/Gameplay/WeaponManager.cpp#L324) | | @@ -53289,14 +53406,14 @@ | `WeatherPerceptionModifier` | struct | SparkEngine | [WeatherGameplayIntegration.h:L39](../../SparkEngine/Source/Engine/Gameplay/WeatherGameplayIntegration.h#L39) | Modifier that adjusts AI perception based on weather conditions. | | `WeatherPerceptionModifier::GetVisibilityMultiplier` | method | SparkEngine | [WeatherGameplayIntegration.cpp:L23](../../SparkEngine/Source/Engine/Gameplay/WeatherGameplayIntegration.cpp#L23) | | | `WeatherPreset` | enum | GameModules | [FPSWeatherPort.h:L12](../../GameModules/SparkGameFPS/Source/Game/FPSWeatherPort.h#L12) | | +| `WeatherPreset` | enum | SparkSDK | [IWeatherService.h:L12](../../SparkSDK/Include/Spark/IWeatherService.h#L12) | | | `WeatherSettings` | struct | SparkEngine | [EngineSettings.h:L549](../../SparkEngine/Source/Core/EngineSettings.h#L549) | | | `WeatherSettings` | struct | Tests | [TestSubsystemConsoleCommands.cpp:L24](../../Tests/TestSubsystemConsoleCommands.cpp#L24) | | | `WeatherState` | struct | SparkEngine | [WeatherSystem.h:L87](../../SparkEngine/Source/Graphics/WeatherSystem.h#L87) | Complete weather state describing current atmospheric conditions | | `WeatherState` | struct | Tests | [TestWeatherSystem.cpp:L23](../../Tests/TestWeatherSystem.cpp#L23) | | -| `WeatherSystem` | class | GameModules | [EngineWeatherAdapter.h:L7](../../GameModules/SparkGameFPS/Source/Core/EngineWeatherAdapter.h#L7) | | | `WeatherSystem` | class | SparkEngine | [SparkEngineWindowsInternal.h:L28](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L28) | | | `WeatherSystem` | class | SparkEngine | [WeatherSystem.h:L225](../../SparkEngine/Source/Graphics/WeatherSystem.h#L225) | Manages weather state, transitions, and effect parameters | -| `WeatherSystem` | class | SparkSDK | [IEngineContext.h:L91](../../SparkSDK/Include/Spark/IEngineContext.h#L91) | | +| `WeatherSystem` | class | SparkSDK | [IEngineContext.h:L92](../../SparkSDK/Include/Spark/IEngineContext.h#L92) | | | `WeatherSystem` | class | Tests | [TestWeatherSystem.cpp:L84](../../Tests/TestWeatherSystem.cpp#L84) | | | `WeatherType` | enum | SparkEngine | [WeatherSystem.h:L51](../../SparkEngine/Source/Graphics/WeatherSystem.h#L51) | Available weather conditions | | `WeatherType` | enum | Tests | [TestWeatherSystem.cpp:L12](../../Tests/TestWeatherSystem.cpp#L12) | | @@ -53364,7 +53481,7 @@ | `WideToNarrow` | function | SparkEngine | [ShaderConsoleOps.cpp:L266](../../SparkEngine/Source/Graphics/ShaderConsoleOps.cpp#L266) | | | `WideToNarrow` | function | SparkEngine | [ShaderHotReload.cpp:L229](../../SparkEngine/Source/Graphics/ShaderHotReload.cpp#L229) | | | `WideToNarrow` | function | SparkEngine | [SceneManager.cpp:L48](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L48) | | -| `WideToUtf8` | function | SparkEngine | [CrashHandler.cpp:L110](../../SparkEngine/Source/Utils/CrashHandler.cpp#L110) | | +| `WideToUtf8` | function | SparkEngine | [CrashHandler.cpp:L111](../../SparkEngine/Source/Utils/CrashHandler.cpp#L111) | | | `WideToUtf8` | function | SparkEngine | [CrashRedactionContext.h:L36](../../SparkEngine/Source/Utils/CrashRedactionContext.h#L36) | Convert wide text to UTF-8 with an exactly sized Windows destination. | | `WideToUtf8` | function | SparkEngine | [CrashRedactionContext.h:L93](../../SparkEngine/Source/Utils/CrashRedactionContext.h#L93) | | | `WideToUtf8` | function | SparkEngine | [CrashRedactionContext.h:L102](../../SparkEngine/Source/Utils/CrashRedactionContext.h#L102) | | @@ -53419,7 +53536,7 @@ | `WIN32_LEAN_AND_MEAN` | macro | SparkInstaller | [main.cpp:L16](../../SparkInstaller/src/main.cpp#L16) | | | `WIN32_LEAN_AND_MEAN` | macro | SparkLauncher | [LauncherPaths.cpp:L10](../../SparkLauncher/src/LauncherPaths.cpp#L10) | | | `WIN32_LEAN_AND_MEAN` | macro | SparkLauncher | [LauncherProcess.cpp:L21](../../SparkLauncher/src/LauncherProcess.cpp#L21) | | -| `WIN32_LEAN_AND_MEAN` | macro | SparkLauncher | [main.cpp:L50](../../SparkLauncher/src/main.cpp#L50) | | +| `WIN32_LEAN_AND_MEAN` | macro | SparkLauncher | [main.cpp:L52](../../SparkLauncher/src/main.cpp#L52) | | | `WIN32_LEAN_AND_MEAN` | macro | SparkSDK | [ModuleDllMain.h:L35](../../SparkSDK/Include/Spark/ModuleDllMain.h#L35) | | | `WIN32_LEAN_AND_MEAN` | macro | SparkServer | [ServerHealth.cpp:L21](../../SparkServer/src/ServerHealth.cpp#L21) | | | `WIN32_LEAN_AND_MEAN` | macro | Tests | [LifecycleLoopGuards.h:L29](../../Tests/LifecycleLoopGuards.h#L29) | | @@ -53448,7 +53565,7 @@ | `WineGetVersionFn` | alias | SparkEngine | [WineDetection.cpp:L150](../../SparkEngine/Source/Utils/WineDetection.cpp#L150) | | | `WineState` | struct | SparkEngine | [WineDetection.cpp:L152](../../SparkEngine/Source/Utils/WineDetection.cpp#L152) | | | `WinMain` | function | SparkEditor | [main.cpp:L672](../../SparkEditor/Source/main.cpp#L672) | | -| `WinMain` | function | SparkLauncher | [main.cpp:L53](../../SparkLauncher/src/main.cpp#L53) | | +| `WinMain` | function | SparkLauncher | [main.cpp:L55](../../SparkLauncher/src/main.cpp#L55) | | | `WinsockInit` | struct | SparkEditor | [CollaborativeEditSession.cpp:L229](../../SparkEditor/Source/Communication/CollaborativeEditSession.cpp#L229) | | | `WinsockScope` | class | SparkEngine | [UDPTransport.h:L63](../../SparkEngine/Source/Engine/Networking/UDPTransport.h#L63) | Reference-counted Winsock initializer. | | `WINVER` | macro | SparkEngine | [targetver.h:L24](../../SparkEngine/Source/Core/targetver.h#L24) | | @@ -53471,7 +53588,7 @@ | `WireBytes` | function | Tests | [TestTFOnboarding.cpp:L1314](../../Tests/TestTFOnboarding.cpp#L1314) | | | `WireBytes` | function | Tests | [TestTFOnboarding.cpp:L1359](../../Tests/TestTFOnboarding.cpp#L1359) | | | `WireBytesEqual` | function | Tests | [TestTFNetProtocolLayout.cpp:L46](../../Tests/TestTFNetProtocolLayout.cpp#L46) | | -| `WireCallbacks` | function | SparkEditor | [EditorUI.h:L520](../../SparkEditor/Source/Core/EditorUI.h#L520) | | +| `WireCallbacks` | function | SparkEditor | [EditorUI.h:L518](../../SparkEditor/Source/Core/EditorUI.h#L518) | | | `WireContains` | function | Tests | [TestTFOnboarding.cpp:L1321](../../Tests/TestTFOnboarding.cpp#L1321) | | | `WireMessage` | function | Tests | [FPSLANLoopbackPeer.cpp:L680](../../Tests/Fixtures/FPSLANLoopbackPeer.cpp#L680) | | | `WireMessage` | struct | Tests | [SecureTestPeer.h:L49](../../Tests/Fixtures/SecureTestPeer.h#L49) | One decoded inner message (the plaintext of a frame). | @@ -53487,6 +53604,7 @@ | `withLogger` | function | Tests | [TestPrototypeModuleKitReal.cpp:L250](../../Tests/TestPrototypeModuleKitReal.cpp#L250) | | | `WithOpacity` | function | SparkEngine | [StartupSplash.cpp:L219](../../SparkEngine/Source/Core/StartupSplash.cpp#L219) | | | `WithServer` | function | Tests | [TestNetworkStress.cpp:L156](../../Tests/TestNetworkStress.cpp#L156) | | +| `WithSpawns` | function | Tests | [TestSceneManagerReflectedReal.cpp:L56](../../Tests/TestSceneManagerReflectedReal.cpp#L56) | | | `WithSuffix` | function | Tests | [TestDATA120BackupRestore.cpp:L86](../../Tests/TestDATA120BackupRestore.cpp#L86) | | | `WithSuffix` | function | Tests | [TestDocumentInterruptionReal.cpp:L120](../../Tests/TestDocumentInterruptionReal.cpp#L120) | | | `WithSuffix` | function | Tests | [TestEditorStateCompatibility.cpp:L66](../../Tests/TestEditorStateCompatibility.cpp#L66) | | @@ -53512,16 +53630,16 @@ | `WM_RBUTTONDOWN` | macro | SparkEngine | [PlatformTypes.h:L183](../../SparkEngine/Source/Core/PlatformTypes.h#L183) | | | `WM_RBUTTONUP` | macro | SparkEngine | [PlatformTypes.h:L184](../../SparkEngine/Source/Core/PlatformTypes.h#L184) | | | `WM_SIZE` | macro | SparkEngine | [PlatformTypes.h:L187](../../SparkEngine/Source/Core/PlatformTypes.h#L187) | | -| `wMessage` | function | SparkConsole | [ConsoleApp.cpp:L427](../../SparkConsole/src/ConsoleApp.cpp#L427) | | -| `wmsg` | function | SparkEngine | [CrashHandler.cpp:L1100](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1100) | | +| `wMessage` | function | SparkConsole | [ConsoleApp.cpp:L431](../../SparkConsole/src/ConsoleApp.cpp#L431) | | +| `wmsg` | function | SparkEngine | [CrashHandler.cpp:L1101](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1101) | | | `wname` | function | SparkEngine | [D3D12Device.cpp:L819](../../SparkEngine/Source/Graphics/RHI/D3D12/D3D12Device.cpp#L819) | | | `WndProc` | function | SparkEngine | [SparkEngineWindowsInternal.h:L104](../../SparkEngine/Source/Core/SparkEngineWindowsInternal.h#L104) | Run the engine in headless/dedicated server mode (Windows). | -| `WndProc` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L414](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L414) | | +| `WndProc` | function | SparkEngine | [SparkEngineWindowsWin32.cpp:L437](../../SparkEngine/Source/Core/SparkEngineWindowsWin32.cpp#L437) | | | `WndProc` | function | SparkInstaller | [BackendWindows.cpp:L49](../../SparkInstaller/src/gui/BackendWindows.cpp#L49) | | | `WndProc` | function | SparkLauncher | [LauncherBackendWindows.cpp:L56](../../SparkLauncher/src/LauncherBackendWindows.cpp#L56) | | | `Word` | function | SparkEditor | [PrefabTextFormat.cpp:L121](../../SparkEditor/Source/Prefabs/PrefabTextFormat.cpp#L121) | | | `WORD` | alias | SparkEngine | [PlatformTypes.h:L33](../../SparkEngine/Source/Core/PlatformTypes.h#L33) | | -| `worker` | function | Tests | [TestFPSWeatherPort.cpp:L90](../../Tests/TestFPSWeatherPort.cpp#L90) | | +| `worker` | function | Tests | [TestFPSWeatherPort.cpp:L136](../../Tests/TestFPSWeatherPort.cpp#L136) | | | `Worker` | function | Tests | [TestJobSystem.cpp:L60](../../Tests/TestJobSystem.cpp#L60) | | | `worker` | function | Tests | [TestSequencerAudioWiring.cpp:L108](../../Tests/TestSequencerAudioWiring.cpp#L108) | | | `worker` | function | Tests | [TestWorldBasicRender.cpp:L721](../../Tests/TestWorldBasicRender.cpp#L721) | | @@ -53551,6 +53669,14 @@ | `WorkflowStep` | struct | SparkEditor | [EditorWorkflow.h:L43](../../SparkEditor/Source/Workflow/EditorWorkflow.h#L43) | | | `WorkingDirectory` | function | SparkEngine | [Process.h:L70](../../SparkEngine/Source/Utils/Process.h#L70) | | | `workingDirectory` | function | Tests | [TestConsoleProcessPipeReal.cpp:L73](../../Tests/TestConsoleProcessPipeReal.cpp#L73) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L636](../../Tests/TestEditorSubsystemsReal.cpp#L636) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L650](../../Tests/TestEditorSubsystemsReal.cpp#L650) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L663](../../Tests/TestEditorSubsystemsReal.cpp#L663) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L676](../../Tests/TestEditorSubsystemsReal.cpp#L676) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L691](../../Tests/TestEditorSubsystemsReal.cpp#L691) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L738](../../Tests/TestEditorSubsystemsReal.cpp#L738) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L751](../../Tests/TestEditorSubsystemsReal.cpp#L751) | | +| `workingDirectory` | function | Tests | [TestEditorSubsystemsReal.cpp:L809](../../Tests/TestEditorSubsystemsReal.cpp#L809) | | | `workingDirectory` | function | Tests | [TestSparkGameShowcase.cpp:L575](../../Tests/TestSparkGameShowcase.cpp#L575) | | | `workingDirectory` | function | Tests | [TestSparkGameShowcase.cpp:L642](../../Tests/TestSparkGameShowcase.cpp#L642) | | | `WorkingDirectoryGuard` | struct | Tests | [TestConsoleProcessPipeReal.cpp:L35](../../Tests/TestConsoleProcessPipeReal.cpp#L35) | | @@ -53571,7 +53697,7 @@ | `World` | class | SparkEditor | [SceneStatisticsPanel.h:L22](../../SparkEditor/Source/Panels/SceneStatisticsPanel.h#L22) | | | `World` | class | SparkEditor | [SceneViewPanel.h:L25](../../SparkEditor/Source/Panels/SceneViewPanel.h#L25) | | | `World` | class | SparkEditor | [SearchPanel.h:L19](../../SparkEditor/Source/Panels/SearchPanel.h#L19) | | -| `World` | class | SparkEngine | [EngineContext.h:L47](../../SparkEngine/Source/Core/EngineContext.h#L47) | | +| `World` | class | SparkEngine | [EngineContext.h:L48](../../SparkEngine/Source/Core/EngineContext.h#L48) | | | `World` | class | SparkEngine | [HostScenePreview.h:L24](../../SparkEngine/Source/Core/HostScenePreview.h#L24) | | | `World` | class | SparkEngine | [AIBudgetTypes.h:L22](../../SparkEngine/Source/Engine/AI/AIBudgetTypes.h#L22) | | | `World` | class | SparkEngine | [AIIntegration.h:L57](../../SparkEngine/Source/Engine/AI/AIIntegration.h#L57) | | @@ -53588,14 +53714,13 @@ | `World` | class | SparkEngine | [RTSceneFeeder.h:L31](../../SparkEngine/Source/Graphics/HybridRT/RTSceneFeeder.h#L31) | | | `World` | class | SparkEngine | [WorldBasicRenderer.h:L14](../../SparkEngine/Source/Graphics/WorldBasicRenderer.h#L14) | | | `World` | class | SparkEngine | [ReflectedSceneSerializer.h:L10](../../SparkEngine/Source/SceneManager/ReflectedSceneSerializer.h#L10) | Reflection-driven JSON scene serialization for World objects. | -| `world` | function | SparkEngine | [SceneManagerReflected.cpp:L38](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L38) | | -| `World` | class | SparkSDK | [IEngineContext.h:L30](../../SparkSDK/Include/Spark/IEngineContext.h#L30) | | +| `world` | function | SparkEngine | [SceneManagerReflected.cpp:L56](../../SparkEngine/Source/SceneManager/SceneManagerReflected.cpp#L56) | | +| `World` | class | SparkSDK | [IEngineContext.h:L31](../../SparkSDK/Include/Spark/IEngineContext.h#L31) | | | `World` | class | SparkSDK | [IStateValidation.h:L62](../../SparkSDK/Include/Spark/IStateValidation.h#L62) | | | `World` | class | SparkServer | [ServerApplication.h:L25](../../SparkServer/src/ServerApplication.h#L25) | | | `World` | struct | Tests | [TestAngelScriptEngine.cpp:L15](../../Tests/TestAngelScriptEngine.cpp#L15) | | | `World` | struct | Tests | [TestECSystemOrdering.cpp:L26](../../Tests/TestECSystemOrdering.cpp#L26) | | | `World` | class | Tests | [TestECSystemSpecialized.cpp:L143](../../Tests/TestECSystemSpecialized.cpp#L143) | | -| `World` | class | Tests | [TestECSystemsReal.cpp:L24](../../Tests/TestECSystemsReal.cpp#L24) | | | `WorldAssetField` | struct | SparkEditor | [InspectorWorldAssetDrop.cpp:L21](../../SparkEditor/Source/Panels/InspectorWorldAssetDrop.cpp#L21) | | | `WorldBasicRenderStats` | struct | SparkEngine | [WorldBasicRenderer.h:L19](../../SparkEngine/Source/Graphics/WorldBasicRenderer.h#L19) | | | `WorldBossDef` | struct | GameModules | [MMOWorldBossSystem.h:L57](../../GameModules/SparkGameMMO/Source/WorldBoss/MMOWorldBossSystem.h#L57) | World boss definition | @@ -53744,7 +53869,7 @@ | `WrapRadians` | function | GameModules | [FPSArenaAutopilot.cpp:L30](../../GameModules/SparkGameFPS/Source/Game/FPSArenaAutopilot.cpp#L30) | | | `WreckRec` | alias | GameModules | [TFVehicleSystem.h:L150](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L150) | | | `WreckRec` | struct | GameModules | [TFVehicleSystemRecords.h:L183](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystemRecords.h#L183) | | -| `wResult` | function | SparkConsole | [ConsoleApp.cpp:L789](../../SparkConsole/src/ConsoleApp.cpp#L789) | | +| `wResult` | function | SparkConsole | [ConsoleApp.cpp:L793](../../SparkConsole/src/ConsoleApp.cpp#L793) | | | `wResult` | function | SparkEngine | [ConsoleProcessManagerIO.cpp:L293](../../SparkEngine/Source/Utils/ConsoleProcessManagerIO.cpp#L293) | | | `Write` | function | SparkDaemon | [BoundedWireCodec.h:L30](../../SparkDaemon/src/BoundedWireCodec.h#L30) | | | `Write` | function | SparkEditor | [SceneComponentCodec.h:L35](../../SparkEditor/Source/SceneSystem/SceneComponentCodec.h#L35) | | @@ -53774,9 +53899,9 @@ | `Write` | function | Tests | [TestENG200ScriptHotReloadReal.cpp:L78](../../Tests/TestENG200ScriptHotReloadReal.cpp#L78) | | | `Write` | function | Tests | [TestPrototypeModuleKitReal.cpp:L61](../../Tests/TestPrototypeModuleKitReal.cpp#L61) | | | `Write` | function | Tests | [TestRHI210TextureDecode.cpp:L46](../../Tests/TestRHI210TextureDecode.cpp#L46) | | -| `Write` | function | Tests | [TestSceneManagerReflectedReal.cpp:L49](../../Tests/TestSceneManagerReflectedReal.cpp#L49) | | +| `Write` | function | Tests | [TestSceneManagerReflectedReal.cpp:L54](../../Tests/TestSceneManagerReflectedReal.cpp#L54) | | | `write` | function | Tests | [TestSparkError.cpp:L77](../../Tests/TestSparkError.cpp#L77) | | -| `Write` | function | Tests | [TestSparkPak.cpp:L70](../../Tests/TestSparkPak.cpp#L70) | | +| `Write` | function | Tests | [TestSparkPak.cpp:L76](../../Tests/TestSparkPak.cpp#L76) | | | `Write` | function | Tests | [TestVisualScriptCompiler.cpp:L718](../../Tests/TestVisualScriptCompiler.cpp#L718) | | | `WriteActivationMarker` | function | SparkInstaller | [GitBootstrap.cpp:L123](../../SparkInstaller/src/GitBootstrap.cpp#L123) | | | `WriteActualRequested` | function | Tests | [RHI210D3D11GoldenSupport.h:L73](../../Tests/RHI210D3D11GoldenSupport.h#L73) | | @@ -53791,7 +53916,7 @@ | `WriteBackResults` | function | SparkEngine | [ParallelPerception.h:L224](../../SparkEngine/Source/Engine/AI/ParallelPerception.h#L224) | Write updated perception data back into ECS components. | | `WriteBackupWithDigest` | function | Tests | [TestDATA120BackupRestore.cpp:L94](../../Tests/TestDATA120BackupRestore.cpp#L94) | | | `WriteBaseline` | function | Tests | [TestGoldenImageTest.cpp:L70](../../Tests/TestGoldenImageTest.cpp#L70) | | -| `WriteBestEffortReport` | function | SparkEngine | [CrashHandler.cpp:L2446](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2446) | | +| `WriteBestEffortReport` | function | SparkEngine | [CrashHandler.cpp:L2484](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2484) | | | `WriteBinary` | function | SparkEngine | [LocalFileCache.h:L186](../../SparkEngine/Source/Utils/LocalFileCache.h#L186) | Write binary data to disk and update the cache | | `WriteBinaryFile` | function | SparkEngine | [FileUtils.h:L272](../../SparkEngine/Source/Utils/FileUtils.h#L272) | | | `WriteBinaryFile` | function | Tests | [TestModuleABI.cpp:L229](../../Tests/TestModuleABI.cpp#L229) | | @@ -53801,7 +53926,7 @@ | `WriteBool` | function | SparkEditor | [JSONSceneSerializer.cpp:L345](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L345) | | | `WriteBool` | function | SparkEditor | [SceneComponentCodec.h:L26](../../SparkEditor/Source/SceneSystem/SceneComponentCodec.h#L26) | | | `WriteBool` | function | SparkEngine | [SceneSnapshotSerializer.h:L45](../../SparkEngine/Source/Engine/Editor/SceneSnapshotSerializer.h#L45) | | -| `WriteBoundedSignalArtifacts` | function | SparkEngine | [CrashHandler.cpp:L2335](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2335) | | +| `WriteBoundedSignalArtifacts` | function | SparkEngine | [CrashHandler.cpp:L2373](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2373) | | | `WriteBytes` | function | SparkDaemon | [BoundedWireCodec.h:L49](../../SparkDaemon/src/BoundedWireCodec.h#L49) | | | `WriteBytes` | function | SparkEditor | [RegionMapDataSource.cpp:L57](../../SparkEditor/Source/Panels/RegionMapDataSource.cpp#L57) | | | `WriteBytes` | function | SparkEngine | [SceneSnapshotSerializer.h:L53](../../SparkEngine/Source/Engine/Editor/SceneSnapshotSerializer.h#L53) | | @@ -53825,7 +53950,7 @@ | `WriteCommandOutput` | function | SparkEngine | [SparkEngineWindows.cpp:L57](../../SparkEngine/Source/Core/SparkEngineWindows.cpp#L57) | | | `WriteConfigFixture` | function | Tests | [TestSparkBuildConfig.cpp:L21](../../Tests/TestSparkBuildConfig.cpp#L21) | | | `WriteConnectCfg` | function | SparkEditor | [PlayControlPanel.h:L94](../../SparkEditor/Source/Panels/PlayControlPanel.h#L94) | | -| `WriteCrashManifest` | function | SparkEngine | [CrashHandler.cpp:L733](../../SparkEngine/Source/Utils/CrashHandler.cpp#L733) | | +| `WriteCrashManifest` | function | SparkEngine | [CrashHandler.cpp:L734](../../SparkEngine/Source/Utils/CrashHandler.cpp#L734) | | | `WriteCreatePacket` | function | SparkEngine | [EntityReplicator.h:L126](../../SparkEngine/Source/Engine/Networking/EntityReplicator.h#L126) | Write full state for an entity (used when it first enters an observer's view). | | `WriteCSVHeader` | function | SparkEngine | [FileLogger.h:L307](../../SparkEngine/Source/Utils/FileLogger.h#L307) | | | `WriteCSVLine` | function | SparkEngine | [FileLogger.h:L357](../../SparkEngine/Source/Utils/FileLogger.h#L357) | | @@ -53834,18 +53959,19 @@ | `WriteDisplay` | function | SparkConsole | [ConsoleApp.h:L65](../../SparkConsole/src/ConsoleApp.h#L65) | Write human-facing text to DisplayHandle(). | | `WriteDurableReplace` | function | GameModules | [TFSavePaths.h:L373](../../GameModules/SparkGameMMOFPS/Source/Persistence/TFSavePaths.h#L373) | | | `WriteDurableText` | function | SparkEngine | [ReflectedScenePersistence.cpp:L179](../../SparkEngine/Source/SceneManager/ReflectedScenePersistence.cpp#L179) | | -| `WriteDurableText` | function | SparkEngine | [SceneManager.cpp:L174](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L174) | | +| `WriteDurableText` | function | SparkEngine | [SceneManager.cpp:L184](../../SparkEngine/Source/SceneManager/SceneManager.cpp#L184) | | | `WriteEditMessage` | function | SparkEditor | [CollaborativeWireCodec.cpp:L117](../../SparkEditor/Source/Communication/CollaborativeWireCodec.cpp#L117) | | | `WriteEditorPeer` | function | SparkEditor | [CollaborativeWireCodec.cpp:L147](../../SparkEditor/Source/Communication/CollaborativeWireCodec.cpp#L147) | | | `WriteEmergencySignalRecord` | function | SparkEditor | [EditorCrashHandler.cpp:L103](../../SparkEditor/Source/Core/EditorCrashHandler.cpp#L103) | | | `WriteEventResponseRules` | function | SparkEngine | [EventResponseRules.cpp:L360](../../SparkEngine/Source/Engine/Gameplay/EventResponseRules.cpp#L360) | | | `WriteEventResponseRules` | function | SparkEngine | [EventResponseSystem.h:L184](../../SparkEngine/Source/Engine/Gameplay/EventResponseSystem.h#L184) | | -| `WriteExclusiveFileUtf8` | function | SparkEngine | [CrashHandler.cpp:L439](../../SparkEngine/Source/Utils/CrashHandler.cpp#L439) | | +| `WriteExclusiveFileUtf8` | function | SparkEngine | [CrashHandler.cpp:L440](../../SparkEngine/Source/Utils/CrashHandler.cpp#L440) | | | `WriteF32` | function | SparkEditor | [TerrainEditor.cpp:L46](../../SparkEditor/Source/Terrain/TerrainEditor.cpp#L46) | | +| `WriteFatalStderr` | function | SparkEngine | [CrashHandler.cpp:L2112](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2112) | | | `WriteFile` | function | SparkEngine | [BenchmarkFramework.h:L119](../../SparkEngine/Source/Utils/BenchmarkFramework.h#L119) | | | `WriteFile` | function | Tests | [TestASSET220GamePackagerReal.cpp:L15](../../Tests/TestASSET220GamePackagerReal.cpp#L15) | | -| `WriteFile` | function | Tests | [TestAssetParserHardening.cpp:L47](../../Tests/TestAssetParserHardening.cpp#L47) | | -| `WriteFile` | function | Tests | [TestAssetParserHardening.cpp:L57](../../Tests/TestAssetParserHardening.cpp#L57) | | +| `WriteFile` | function | Tests | [TestAssetParserHardening.cpp:L63](../../Tests/TestAssetParserHardening.cpp#L63) | | +| `WriteFile` | function | Tests | [TestAssetParserHardening.cpp:L73](../../Tests/TestAssetParserHardening.cpp#L73) | | | `WriteFile` | function | Tests | [TestDATA120BackupRestore.cpp:L80](../../Tests/TestDATA120BackupRestore.cpp#L80) | | | `WriteFile` | function | Tests | [TestDATA120PersistenceReal.cpp:L58](../../Tests/TestDATA120PersistenceReal.cpp#L58) | | | `WriteFile` | function | Tests | [TestFileWatcher.cpp:L24](../../Tests/TestFileWatcher.cpp#L24) | | @@ -53910,8 +54036,8 @@ | `WriteManifest` | function | Tests | [TestModuleLifecycleReal.cpp:L202](../../Tests/TestModuleLifecycleReal.cpp#L202) | | | `WriteMarkerText` | function | SparkInstaller | [InstallStateTests.cpp:L184](../../SparkInstaller/tests/InstallStateTests.cpp#L184) | | | `WriteMetadata` | function | Tests | [TestPluginABI.cpp:L373](../../Tests/TestPluginABI.cpp#L373) | | -| `WriteMiniDump` | function | SparkEngine | [CrashHandler.cpp:L821](../../SparkEngine/Source/Utils/CrashHandler.cpp#L821) | | -| `WriteMiniDump` | function | SparkEngine | [CrashHandler.cpp:L1265](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1265) | | +| `WriteMiniDump` | function | SparkEngine | [CrashHandler.cpp:L822](../../SparkEngine/Source/Utils/CrashHandler.cpp#L822) | | +| `WriteMiniDump` | function | SparkEngine | [CrashHandler.cpp:L1266](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1266) | | | `WriteMod` | function | Tests | [Test_persistence_ModSystem.cpp:L28](../../Tests/harden/Test_persistence_ModSystem.cpp#L28) | | | `WriteMOD360File` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L169](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L169) | | | `WriteMOD360SlotState` | function | Tests | [TestMOD360OpenWorldPersistenceReal.cpp:L254](../../Tests/TestMOD360OpenWorldPersistenceReal.cpp#L254) | | @@ -53944,7 +54070,7 @@ | `WritePNG` | function | SparkEngine | [ScreenCapture.h:L263](../../SparkEngine/Source/Graphics/ScreenCapture.h#L263) | Write RGBA pixel data to a PNG file | | `WriteProcessStatus` | function | SparkDaemon | [OrchestrationProtocol.h:L190](../../SparkDaemon/src/OrchestrationProtocol.h#L190) | | | `WriteProject` | function | Tests | [TestEditorSubsystems.cpp:L2455](../../Tests/TestEditorSubsystems.cpp#L2455) | | -| `WriteProjectDocument` | function | SparkEditor | [ProjectDocument.cpp:L481](../../SparkEditor/Source/Core/ProjectDocument.cpp#L481) | | +| `WriteProjectDocument` | function | SparkEditor | [ProjectDocument.cpp:L482](../../SparkEditor/Source/Core/ProjectDocument.cpp#L482) | | | `WriteProjectDocument` | function | SparkEditor | [ProjectDocument.h:L83](../../SparkEditor/Source/Core/ProjectDocument.h#L83) | Render @p fields as the project document SaveProjectFile writes. | | `WriteProjectSeed` | function | Tests | [TestDocumentInterruptionReal.cpp:L376](../../Tests/TestDocumentInterruptionReal.cpp#L376) | | | `WriteQuat48` | function | SparkEngine | [NetQuantize.cpp:L12](../../SparkEngine/Source/Engine/Networking/NetQuantize.cpp#L12) | | @@ -53970,8 +54096,8 @@ | `WriteRawSlot` | function | Tests | [TestMOD340PlatformerProgressReal.cpp:L175](../../Tests/TestMOD340PlatformerProgressReal.cpp#L175) | | | `WriteRawSlot` | function | Tests | [TestMOD370RTSSaveReal.cpp:L256](../../Tests/TestMOD370RTSSaveReal.cpp#L256) | | | `WriteRawSlot` | function | Tests | [TestMOD380RacingCompleteRaceReal.cpp:L521](../../Tests/TestMOD380RacingCompleteRaceReal.cpp#L521) | | -| `WriteRawTocArchive` | function | Tests | [TestSparkPak.cpp:L825](../../Tests/TestSparkPak.cpp#L825) | | -| `WriteRecentProjectsDocument` | function | SparkEditor | [ProjectDocument.cpp:L555](../../SparkEditor/Source/Core/ProjectDocument.cpp#L555) | | +| `WriteRawTocArchive` | function | Tests | [TestSparkPak.cpp:L841](../../Tests/TestSparkPak.cpp#L841) | | +| `WriteRecentProjectsDocument` | function | SparkEditor | [ProjectDocument.cpp:L556](../../SparkEditor/Source/Core/ProjectDocument.cpp#L556) | | | `WriteRecentProjectsDocument` | function | SparkEditor | [ProjectDocument.h:L95](../../SparkEditor/Source/Core/ProjectDocument.h#L95) | Render the first kMaxRecentProjects entries as RecentProjects.json. | | `WriteRecentProjectsDocument` | function | SparkEditor | [ProjectManager.cpp:L2312](../../SparkEditor/Source/Core/ProjectManager.cpp#L2312) | | | `WriteReferenceImage` | function | Tests | [RHI210D3D11GoldenSupport.h:L871](../../Tests/RHI210D3D11GoldenSupport.h#L871) | | @@ -53985,13 +54111,14 @@ | `WriteSave230Bytes` | function | Tests | [TestSAVE230NewerFormatSlotReal.cpp:L57](../../Tests/TestSAVE230NewerFormatSlotReal.cpp#L57) | | | `WriteSaveFile` | function | Templates | [GameModule.h:L284](../../Templates/RPGStarter/Source/GameModule.h#L284) | | | `WriteSaveHeader` | function | Tests | [Test_persistence_SaveSystem.cpp:L85](../../Tests/harden/Test_persistence_SaveSystem.cpp#L85) | | +| `WriteScene` | function | Tests | [TestFPSGameCameraReloadReal.cpp:L75](../../Tests/TestFPSGameCameraReloadReal.cpp#L75) | | | `WriteScene` | function | Tests | [TestMOD310FPSSceneReloadRespawnReal.cpp:L56](../../Tests/TestMOD310FPSSceneReloadRespawnReal.cpp#L56) | | | `WriteScratch` | function | Tests | [TestSparkTerrainFormatReal.cpp:L85](../../Tests/TestSparkTerrainFormatReal.cpp#L85) | | | `WriteSeatComp` | function | GameModules | [TFVehicleSystem.h:L198](../../GameModules/SparkGameMMOFPS/Source/Game/TFVehicleSystem.h#L198) | | | `WriteShader` | function | Tests | [TestShaderHotReloadPhaseU.cpp:L45](../../Tests/TestShaderHotReloadPhaseU.cpp#L45) | | | `WriteSidecar` | function | Tests | [TestModuleABIDiagnostics.cpp:L95](../../Tests/TestModuleABIDiagnostics.cpp#L95) | | | `WriteSidecar` | function | Tests | [TestModuleVersion.cpp:L108](../../Tests/TestModuleVersion.cpp#L108) | | -| `WriteSignalSafeReport` | function | SparkEngine | [CrashHandler.cpp:L2244](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2244) | | +| `WriteSignalSafeReport` | function | SparkEngine | [CrashHandler.cpp:L2282](../../SparkEngine/Source/Utils/CrashHandler.cpp#L2282) | | | `WriteSigned` | function | SparkEditor | [JSONSceneSerializer.cpp:L302](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L302) | | | `WriteSigned` | function | SparkEditor | [JSONSceneSerializer.cpp:L346](../../SparkEditor/Source/SceneSystem/JSONSceneSerializer.cpp#L346) | | | `WriteSigned` | function | SparkEditor | [SceneComponentCodec.h:L27](../../SparkEditor/Source/SceneSystem/SceneComponentCodec.h#L27) | | @@ -54001,7 +54128,7 @@ | `WriteSmokeResult` | function | SparkEditor | [main.cpp:L98](../../SparkEditor/Source/main.cpp#L98) | | | `WriteSnav` | function | Tests | [Test_ai-anim_navmesh.cpp:L37](../../Tests/harden/Test_ai-anim_navmesh.cpp#L37) | | | `WriteStagingFile` | function | SparkEngine | [SaveFileDurability.cpp:L335](../../SparkEngine/Source/Utils/SaveFileDurability.cpp#L335) | | -| `WriteStderr` | function | SparkEngine | [CrashHandler.cpp:L1787](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1787) | | +| `WriteStderr` | function | SparkEngine | [CrashHandler.cpp:L1788](../../SparkEngine/Source/Utils/CrashHandler.cpp#L1788) | | | `WriteStdin` | function | SparkEngine | [Process.h:L142](../../SparkEngine/Source/Utils/Process.h#L142) | | | `WriteStdinFor` | function | SparkEngine | [Process.h:L156](../../SparkEngine/Source/Utils/Process.h#L156) | | | `WriteStoredZip` | function | SparkBuild | [DownloaderTests.cpp:L308](../../SparkBuild/tests/DownloaderTests.cpp#L308) | | @@ -54023,7 +54150,7 @@ | `WriteString` | function | Tests | [TestNetBuffer.cpp:L47](../../Tests/TestNetBuffer.cpp#L47) | | | `WriteString` | function | Tests | [TestReplicationFields.cpp:L64](../../Tests/TestReplicationFields.cpp#L64) | | | `WriteString` | function | Tests | [TestServerMockClient.cpp:L96](../../Tests/TestServerMockClient.cpp#L96) | | -| `WriteStringArray` | function | SparkEditor | [ProjectDocument.cpp:L332](../../SparkEditor/Source/Core/ProjectDocument.cpp#L332) | | +| `WriteStringArray` | function | SparkEditor | [ProjectDocument.cpp:L333](../../SparkEditor/Source/Core/ProjectDocument.cpp#L333) | | | `WriteTempFile` | function | Tests | [Test_ai-anim_animation.cpp:L65](../../Tests/harden/Test_ai-anim_animation.cpp#L65) | | | `WriteTempVertexShader` | function | Tests | [TestD3D11DeviceContractsReal.cpp:L134](../../Tests/TestD3D11DeviceContractsReal.cpp#L134) | | | `WriteText` | function | SparkCrashReporter | [CrashReporterManifestTests.cpp:L125](../../SparkCrashReporter/tests/CrashReporterManifestTests.cpp#L125) | | @@ -54403,7 +54530,7 @@ | `ZeroMemory` | macro | SparkEngine | [PlatformTypes.h:L404](../../SparkEngine/Source/Core/PlatformTypes.h#L404) | | | `ZeroMotion` | function | Tests | [TestSSAOTemporalFilter.cpp:L30](../../Tests/TestSSAOTemporalFilter.cpp#L30) | | | `zeros` | function | Tests | [TestNetworkStress.cpp:L667](../../Tests/TestNetworkStress.cpp#L667) | | -| `zeros` | function | Tests | [TestSparkPak.cpp:L638](../../Tests/TestSparkPak.cpp#L638) | | +| `zeros` | function | Tests | [TestSparkPak.cpp:L654](../../Tests/TestSparkPak.cpp#L654) | | | `ZipDirectoryLocation` | struct | SparkBuild | [ArchiveExtraction.cpp:L132](../../SparkBuild/src/ArchiveExtraction.cpp#L132) | | | `ZipFixtureEntry` | struct | SparkBuild | [DownloaderTests.cpp:L278](../../SparkBuild/tests/DownloaderTests.cpp#L278) | | | `ZombieEntry` | struct | SparkEngine | [TextureSystem.h:L407](../../SparkEngine/Source/Graphics/TextureSystem.h#L407) | | diff --git a/wiki/subsystems/Input-System.md b/wiki/subsystems/Input-System.md index c9334586e..ec5d3bdba 100644 --- a/wiki/subsystems/Input-System.md +++ b/wiki/subsystems/Input-System.md @@ -84,6 +84,12 @@ if (input.WasKeyPressed('W')) { /* W was pressed this frame */ } if (input.WasKeyReleased(VK_SHIFT)) { /* Shift was released this frame */ } ``` +Generic modifier queries (`VK_SHIFT`, `VK_CONTROL`, `VK_MENU`) include either physical side as well as +console-injected generic state. Side-specific queries retain their identity. The generic press edge occurs when +the first side goes down; releasing one side while the other remains held does not produce a generic release. +The Win32 host resolves left/right modifiers from scan-code and extended-key metadata and forwards Alt's +system-key messages through the same frame-latched input path. SDL retains its side-specific key translation. + ### Mouse Input ```cpp diff --git a/wiki/subsystems/Scene-Management.md b/wiki/subsystems/Scene-Management.md index 11e6ec1bf..8aaa0be02 100644 --- a/wiki/subsystems/Scene-Management.md +++ b/wiki/subsystems/Scene-Management.md @@ -16,8 +16,9 @@ not the working directory. Only a genuinely absent startup file permits the lega initialization. The host's separate `-scene` preview mode is unchanged. This is a deliberately bounded adapter, not complete ECS-to-FPS scene support. -It accepts root entities with unique nonempty names and Transform plus either an -OBJ MeshRenderer or one main Camera. Position/rotation/scale, camera FOV and clipping +It accepts root entities with unique nonempty names and Transform plus exactly one +OBJ MeshRenderer, the main Camera, or a supported SpawnPointComponent. A main Camera +and at least one mesh are required even when spawn points are present. Position/rotation/scale, camera FOV and clipping are transferred to gameplay state. Camera scale must be one, pitch must be within [-89,89] degrees, FOV within [10,170], near within [0.01,10], and far within [100,10000] with near below far. Hierarchy, other components, explicit materials, nondefault @@ -26,6 +27,31 @@ fail rather than silently lose authored state. Unicode and quoted names are acce the legacy node lookup requires unique names. Mesh references must resolve beneath the scene's project root and load as actual OBJ geometry, without placeholder fallback. +SpawnPointComponent support is limited to enabled neutral player points with +`spawnTag="default"`, `teamID=0`, `spawnRadius=0`, `respawnDelay=0`, and +`maxConcurrent=-1`. The adapter preserves priority, position and facing as an +existing FPS SpawnPoint node. Spawn transforms must have unit scale and pitch in +[-89,89]; hierarchy remains unsupported. More than 32 points rejects the whole +scene instead of silently truncating the FPS table. Mixed mesh/camera/spawn +components on one entity also reject the scene. The strict reflected schema +requires all authored fields and rejects unknown or runtime-only fields. + +The existing FPS selector uses highest priority and first-stored ties for F11 +match start and respawn. The component's reuse cooldown is distinct from the +player's independent death timer, which remains unchanged. The component defaults +`spawnRadius=1` and `respawnDelay=5` must be changed explicitly for this exact-point +subset. Disabled/team-specific/radius/cooldown/concurrency-limited points and +`wave_spawn` are rejected. WaveSpawner's separate jittered placement does not +implement these component semantics. No SpawnPoint-aware cook transformation is +needed: the existing cooker preserves the selected scene bytes. + +The direct reflected SceneManager family now contains ten source cases (six +existing plus four spawn regressions). Its real RespawnSystem/event test covers +selection and the death timer, not physical F11 input or a rendered match. The +installed two-entity camera/mesh lineage fixture remains separate and does not +prove packaged spawn consumption; that requires an explicit fixture/validator +extension and fresh native evidence. + The primary reflected document is read with the existing strict deserializer and size bound, without automatic `.bak` recovery. The existing LoadScene transaction retains the old nodes, object ownership, path and dirty state on failure. Successful