From e0304dbb8f1111c945f53ea5d69631d8f95573fd Mon Sep 17 00:00:00 2001 From: Kurtis Date: Mon, 28 Sep 2026 12:39:40 -0700 Subject: [PATCH 1/2] Add build docs tooling --- Tooling/generate-docs.ps1 | 143 +++++++++ org.mixedrealitytoolkit.core/CHANGELOG.md | 1 + .../Editor/DocTools.meta | 8 + .../Editor/DocTools/DocGen.cs | 273 ++++++++++++++++++ .../Editor/DocTools/DocGen.cs.meta | 11 + 5 files changed, 436 insertions(+) create mode 100644 Tooling/generate-docs.ps1 create mode 100644 org.mixedrealitytoolkit.core/Editor/DocTools.meta create mode 100644 org.mixedrealitytoolkit.core/Editor/DocTools/DocGen.cs create mode 100644 org.mixedrealitytoolkit.core/Editor/DocTools/DocGen.cs.meta diff --git a/Tooling/generate-docs.ps1 b/Tooling/generate-docs.ps1 new file mode 100644 index 000000000..7f5cd2d49 --- /dev/null +++ b/Tooling/generate-docs.ps1 @@ -0,0 +1,143 @@ +# Copyright (c) Mixed Reality Toolkit Contributors +# Licensed under the BSD 3-Clause + +<# +.SYNOPSIS + Generates XML documentation files and validates CS1591 across MRTK production assemblies locally. + +.DESCRIPTION + Runs Unity in batch mode to compile production assemblies with /doc and /warnaserror:1591, + surfacing any missing XML documentation on public APIs without requiring external CI tools. + +.PARAMETER ProjectPath + Path to the Unity project (defaults to UnityProjects/MRTKDevTemplate). + +.PARAMETER OutputDirectory + Directory where generated DLLs and XML files will be placed (defaults to artifacts/docs). + +.PARAMETER AssemblyFilter + Optional filter string to build only specific assemblies (e.g. "Input", "Core", "SpatialManipulation"). + +.PARAMETER WarnAsError + Treat CS1591 missing XML documentation warnings as build errors (default: $true). + +.PARAMETER IncludeEditor + Include Editor assemblies in documentation generation. + +.PARAMETER VerboseLog + Enable verbose compiler output. + +.EXAMPLE + .\Tooling\generate-docs.ps1 + # Generates and validates docs for all production assemblies + +.EXAMPLE + .\Tooling\generate-docs.ps1 -AssemblyFilter Input + # Validates only MixedReality.Toolkit.Input +#> +[CmdletBinding()] +param( + [Parameter(Position = 0)] + [string]$ProjectPath = "$PSScriptRoot/../UnityProjects/MRTKDevTemplate", + + [Parameter(Position = 1)] + [string]$OutputDirectory = "$PSScriptRoot/../artifacts/docs", + + [string]$AssemblyFilter = "", + + [bool]$WarnAsError = $true, + + [switch]$IncludeEditor, + + [switch]$VerboseLog +) + +$ErrorActionPreference = "Stop" + +$resolvedProject = Resolve-Path $ProjectPath +$resolvedOutput = [System.IO.Path]::GetFullPath($OutputDirectory) + +if (-not (Test-Path $resolvedOutput)) { + New-Item -ItemType Directory -Path $resolvedOutput -Force | Out-Null +} + +$commonArgs = @( + "-executeMethod", "MixedReality.Toolkit.Editor.DocGen.GenerateDocsBinariesBatchMode", + "-docOutput:$resolvedOutput" +) +if ($AssemblyFilter) { $commonArgs += "-docFilter:$AssemblyFilter" } +if ($WarnAsError) { $commonArgs += "-docWarnAsError:true" } else { $commonArgs += "-docWarnAsError:false" } +if ($IncludeEditor) { $commonArgs += "-docIncludeEditor" } +if ($VerboseLog) { $commonArgs += "-docVerbose" } + +Write-Host "========================================================" -ForegroundColor Cyan +Write-Host " MRTK Local Documentation Generator & CS1591 Validator" -ForegroundColor Cyan +Write-Host "========================================================" -ForegroundColor Cyan +Write-Host "Project: $resolvedProject" +Write-Host "Output: $resolvedOutput" +if ($AssemblyFilter) { Write-Host "Filter: $AssemblyFilter" } +Write-Host "WarnAsErr: $WarnAsError" +Write-Host "" + +# Check for 'unity' CLI in PATH +$unityCli = Get-Command "unity" -ErrorAction SilentlyContinue + +if ($null -ne $unityCli) { + Write-Host "Using Unity CLI: $($unityCli.Source)" -ForegroundColor Green + $logFile = Join-Path $resolvedOutput "docgen.log" + $cliArgs = @("run", "$resolvedProject", "--no-banner", "--no-tail", "-l", "$logFile", "--") + $commonArgs + & unity @cliArgs + $exitCode = $LASTEXITCODE + + if (Test-Path $logFile) { + $docGenLines = Get-Content $logFile | Where-Object { $_ -match "\[DocGen\]" } + if ($docGenLines) { + Write-Host "`n--- DocGen Output Summary ---" -ForegroundColor Cyan + foreach ($line in $docGenLines) { + if ($line -match "FAILED|error CS") { + Write-Host $line -ForegroundColor Red + } elseif ($line -match "warning CS") { + Write-Host $line -ForegroundColor Yellow + } elseif ($line -match "PASSED|SUCCEEDED|compiled successfully") { + Write-Host $line -ForegroundColor Green + } else { + Write-Host $line -ForegroundColor Gray + } + } + } + } +} else { + # Fallback to direct Unity.exe + $projectVersionPath = Join-Path $resolvedProject "ProjectSettings/ProjectVersion.txt" + $unityVersion = "2021.3.45f2" + if (Test-Path $projectVersionPath) { + $versionLine = Get-Content $projectVersionPath | Where-Object { $_ -match "^m_EditorVersion:\s*(.+)$" } | Select-Object -First 1 + if ($versionLine -match "^m_EditorVersion:\s*(.+)$") { + $unityVersion = $Matches[1].Trim() + } + } + + $unityExePath = "C:\Program Files\Unity\Hub\Editor\$unityVersion\Editor\Unity.exe" + if (-not (Test-Path $unityExePath)) { + Write-Error "Unity editor executable not found at '$unityExePath' and 'unity' CLI is not in PATH." + exit 1 + } + + Write-Host "Using Unity executable: $unityExePath" -ForegroundColor Green + $processArgs = @("-projectPath", "$resolvedProject", "-batchmode") + $commonArgs + @("-quit", "-logFile", "$logFile") + + $proc = Start-Process -FilePath $unityExePath -ArgumentList $processArgs -PassThru -Wait -NoNewWindow + $exitCode = $proc.ExitCode + + if (Test-Path $logFile) { + Get-Content $logFile | Select-String "\[DocGen\]" | ForEach-Object { Write-Host $_.Line } + } +} + +if ($exitCode -eq 0) { + Write-Host "`nDocumentation generation and CS1591 validation SUCCEEDED." -ForegroundColor Green +} else { + Write-Host "`nDocumentation generation or CS1591 validation FAILED (Exit code: $exitCode)." -ForegroundColor Red +} + +exit $exitCode diff --git a/org.mixedrealitytoolkit.core/CHANGELOG.md b/org.mixedrealitytoolkit.core/CHANGELOG.md index 95f237481..288c54334 100644 --- a/org.mixedrealitytoolkit.core/CHANGELOG.md +++ b/org.mixedrealitytoolkit.core/CHANGELOG.md @@ -14,6 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ### Added * Added edit mode tests for `AssemblyExtensions`, `SystemType`, and `SerializableDictionary`. [PR #1122](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1122) +* Added documentation generation and CS1591 validation tooling. [PR #1148](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1148) ### Fixed diff --git a/org.mixedrealitytoolkit.core/Editor/DocTools.meta b/org.mixedrealitytoolkit.core/Editor/DocTools.meta new file mode 100644 index 000000000..e3398b466 --- /dev/null +++ b/org.mixedrealitytoolkit.core/Editor/DocTools.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a784f8829c65467e88908efa541e39ac +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/org.mixedrealitytoolkit.core/Editor/DocTools/DocGen.cs b/org.mixedrealitytoolkit.core/Editor/DocTools/DocGen.cs new file mode 100644 index 000000000..6645595d8 --- /dev/null +++ b/org.mixedrealitytoolkit.core/Editor/DocTools/DocGen.cs @@ -0,0 +1,273 @@ +// Copyright (c) Mixed Reality Toolkit Contributors +// Licensed under the BSD 3-Clause + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEngine; + +namespace MixedReality.Toolkit.Editor +{ + /// + /// Generates XML documentation and compiled binaries for MRTK packages, + /// and validates that all publicly visible APIs have XML documentation (CS1591). + /// + public static class DocGen + { + private const string DefaultOutputFolder = "artifacts/docs"; + + /// + /// Menu item to generate XML documentation and validate CS1591 across all production MRTK assemblies. + /// + [MenuItem("Mixed Reality/MRTK3/Utilities/Documentation/Generate and Validate Docs")] + public static void GenerateDocsMenu() + { + GenerateDocsBinaries(outputFolder: DefaultOutputFolder, warnAsError: true, verbose: false); + } + + /// + /// Menu item to generate XML documentation without failing on missing doc warnings. + /// + [MenuItem("Mixed Reality/MRTK3/Utilities/Documentation/Generate Docs (No WarnAsError)")] + public static void GenerateDocsNoWarnAsErrorMenu() + { + GenerateDocsBinaries(outputFolder: DefaultOutputFolder, warnAsError: false, verbose: false); + } + + /// + /// Entry point for batch mode execution from command line or CI. + /// + /// + /// Command line arguments supported: + /// + /// -docOutput:<path>: Output folder for generated XML and DLL files. + /// -docFilter:<substring>: Filter to compile only matching assemblies (e.g. "Input"). + /// -docWarnAsError: Fail build if CS1591 doc warnings are encountered (default: true). + /// -docIncludeEditor: Include Editor assemblies in addition to runtime assemblies. + /// -docVerbose: Print verbose compiler diagnostic messages. + /// + /// + public static void GenerateDocsBinariesBatchMode() + { + string outputFolder = DefaultOutputFolder; + string filter = null; + bool warnAsError = true; + bool includeEditor = false; + bool verbose = false; + + string[] args = Environment.GetCommandLineArgs(); + for (int i = 0; i < args.Length; i++) + { + string arg = args[i]; + if (arg.StartsWith("-docOutput:", StringComparison.OrdinalIgnoreCase)) + { + outputFolder = arg["-docOutput:".Length..]; + } + else if (arg.StartsWith("-docFilter:", StringComparison.OrdinalIgnoreCase)) + { + filter = arg["-docFilter:".Length..]; + } + else if (arg.Equals("-docWarnAsError", StringComparison.OrdinalIgnoreCase) || + arg.Equals("-docWarnAsError:true", StringComparison.OrdinalIgnoreCase)) + { + warnAsError = true; + } + else if (arg.Equals("-docWarnAsError:false", StringComparison.OrdinalIgnoreCase)) + { + warnAsError = false; + } + else if (arg.Equals("-docIncludeEditor", StringComparison.OrdinalIgnoreCase)) + { + includeEditor = true; + } + else if (arg.Equals("-docVerbose", StringComparison.OrdinalIgnoreCase)) + { + verbose = true; + } + } + + bool success = GenerateDocsBinaries(outputFolder, warnAsError, verbose, filter, includeEditor); + + if (Application.isBatchMode) + { + // Ensure logs flush + Thread.Sleep(500); + EditorApplication.Exit(success ? 0 : 1); + } + } + + /// + /// Compiles assemblies with the /doc flag enabled and optionally enforces CS1591 as an error. + /// + /// Folder to write compiled DLLs and XML doc files to. + /// Whether to treat CS1591 missing XML comment warnings as errors. + /// Whether to log all compiler warnings and verbose progress. + /// Optional substring filter for assembly names. + /// Whether to include editor assemblies. + /// if all target assemblies compiled successfully without documentation errors, otherwise . + public static bool GenerateDocsBinaries( + string outputFolder = DefaultOutputFolder, + bool warnAsError = true, + bool verbose = false, + string assemblyFilter = null, + bool includeEditor = false) + { + Directory.CreateDirectory(outputFolder); + + Assembly[] allAssemblies = CompilationPipeline.GetAssemblies(); + var targetAssemblies = allAssemblies.Where(a => + a.name.StartsWith("MixedReality.Toolkit") && + !a.name.EndsWith(".Tests") && + !a.name.EndsWith("Tests") && + !a.name.Contains(".Tests.") && + !a.name.EndsWith("TestUtilities") && + (includeEditor || !a.flags.HasFlag(AssemblyFlags.EditorAssembly)) + ); + + if (!string.IsNullOrEmpty(assemblyFilter)) + { + targetAssemblies = targetAssemblies.Where(a => + a.name.IndexOf(assemblyFilter, StringComparison.OrdinalIgnoreCase) >= 0); + } + + List assemblyList = targetAssemblies.OrderBy(a => a.name).ToList(); + + if (assemblyList.Count == 0) + { + Debug.LogWarning($"[DocGen] No assemblies matched criteria (Filter: '{assemblyFilter ?? "None"}', IncludeEditor: {includeEditor})"); + return true; + } + + Debug.Log($"[DocGen] Starting documentation generation for {assemblyList.Count} assemblies into '{outputFolder}' (WarnAsError: {warnAsError})..."); + + int successCount = 0; + int failureCount = 0; + int totalCs1591 = 0; + + foreach (Assembly assembly in assemblyList) + { + string dllFileName = Path.GetFileName(assembly.outputPath); + string outputDllPath = Path.Combine(outputFolder, dllFileName); + string xmlFileName = Path.GetFileNameWithoutExtension(dllFileName) + ".xml"; + string outputXmlPath = Path.Combine(outputFolder, xmlFileName); + + AssemblyBuilder builder = new AssemblyBuilder(outputDllPath, assembly.sourceFiles) + { + additionalDefines = assembly.defines, + referencesOptions = ReferencesOptions.UseEngineModules + }; + + if (assembly.flags.HasFlag(AssemblyFlags.EditorAssembly)) + { + builder.flags = AssemblyBuilderFlags.EditorAssembly; + } + + builder.additionalReferences = assembly.allReferences; + builder.compilerOptions = assembly.compilerOptions; + builder.excludeReferences = builder.defaultReferences.Except(assembly.allReferences).ToArray(); + + // Add /doc compiler argument + var compilerArgs = new List(builder.compilerOptions.AdditionalCompilerArguments ?? Array.Empty()) + { + $"/doc:{outputXmlPath}" + }; + if (warnAsError) + { + compilerArgs.Add("/warnaserror:1591"); + } + builder.compilerOptions.AdditionalCompilerArguments = compilerArgs.ToArray(); + + List messages = new List(); + builder.buildFinished += (path, compilerMessages) => + { + if (compilerMessages != null) + { + messages.AddRange(compilerMessages); + } + }; + + Debug.Log($"[DocGen] Compiling {assembly.name} -> {xmlFileName}..."); + + if (!builder.Build()) + { + Debug.LogError($"[DocGen] Failed to initiate build for {assembly.name}!"); + failureCount++; + continue; + } + + int timeoutMs = 60000; + int elapsed = 0; + while (builder.status != AssemblyBuilderStatus.Finished && elapsed < timeoutMs) + { + Thread.Sleep(50); + elapsed += 50; + } + + if (builder.status != AssemblyBuilderStatus.Finished) + { + Debug.LogError($"[DocGen] Build timed out for assembly {assembly.name} after {timeoutMs / 1000}s!"); + failureCount++; + continue; + } + + int errorCount = 0; + int assemblyCs1591 = 0; + + foreach (CompilerMessage msg in messages) + { + bool isCs1591 = msg.message.Contains("CS1591"); + if (isCs1591) + { + assemblyCs1591++; + totalCs1591++; + } + + if (msg.type == CompilerMessageType.Error) + { + errorCount++; + Debug.LogError($"[DocGen] [{assembly.name}] {msg.file}({msg.line},{msg.column}): {msg.message}"); + } + else if (msg.type == CompilerMessageType.Warning) + { + if (verbose || isCs1591) + { + Debug.LogWarning($"[DocGen] [{assembly.name}] {msg.file}({msg.line},{msg.column}): {msg.message}"); + } + } + } + + if (errorCount > 0 || (warnAsError && assemblyCs1591 > 0)) + { + failureCount++; + Debug.LogError($"[DocGen] {assembly.name} FAILED: {errorCount} errors, {assemblyCs1591} missing XML doc comments (CS1591)."); + } + else + { + successCount++; + Debug.Log($"[DocGen] {assembly.name} PASSED. (XML: {outputXmlPath})"); + } + } + + Debug.Log($"[DocGen] ========================================================"); + Debug.Log($"[DocGen] Documentation Build Summary:"); + Debug.Log($"[DocGen] Total assemblies: {assemblyList.Count}, Succeeded: {successCount}, Failed: {failureCount}"); + Debug.Log($"[DocGen] Total CS1591 missing doc warnings: {totalCs1591}"); + Debug.Log($"[DocGen] ========================================================"); + + bool success = failureCount == 0; + + if (!Application.isBatchMode) + { + string title = success ? "Doc Generation Succeeded" : "Doc Generation Failed"; + string message = $"Assemblies: {assemblyList.Count}\nSucceeded: {successCount}\nFailed: {failureCount}\nCS1591 Warnings: {totalCs1591}\n\nOutput folder: {outputFolder}"; + EditorUtility.DisplayDialog(title, message, "OK"); + } + + return success; + } + } +} diff --git a/org.mixedrealitytoolkit.core/Editor/DocTools/DocGen.cs.meta b/org.mixedrealitytoolkit.core/Editor/DocTools/DocGen.cs.meta new file mode 100644 index 000000000..be0886bcf --- /dev/null +++ b/org.mixedrealitytoolkit.core/Editor/DocTools/DocGen.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 27b67b988a974593a6f3a34402f06250 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From b6d5e15fc6d30b579c20b01bfa8ebb7ee54d8405 Mon Sep 17 00:00:00 2001 From: Kurtis Date: Mon, 28 Sep 2026 13:03:46 -0700 Subject: [PATCH 2/2] Fix CS1591 missing XML documentation issues across packages --- org.mixedrealitytoolkit.core/CHANGELOG.md | 1 + .../Utilities/SerializableDictionary.cs | 14 ++++++++++++++ org.mixedrealitytoolkit.input/CHANGELOG.md | 1 + .../InteractionModes/ProximityEnteredEventArgs.cs | 3 +++ .../InteractionModes/ProximityExitedEventArgs.cs | 3 +++ .../LOSAngularOffsetHandRayPoseSource.cs | 3 +++ .../BoundsControl/BoundsHandleInteractable.cs | 11 ++++++++++- .../CHANGELOG.md | 1 + org.mixedrealitytoolkit.uxcore/CHANGELOG.md | 1 + .../Experimental/List/VirtualizedScrollRectList.cs | 5 ++++- .../SeeItSayIt/SeeItSayItLabelEnabler.cs | 14 ++++++++++++++ 11 files changed, 55 insertions(+), 2 deletions(-) diff --git a/org.mixedrealitytoolkit.core/CHANGELOG.md b/org.mixedrealitytoolkit.core/CHANGELOG.md index 288c54334..20d7b984f 100644 --- a/org.mixedrealitytoolkit.core/CHANGELOG.md +++ b/org.mixedrealitytoolkit.core/CHANGELOG.md @@ -20,6 +20,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). * Fixed "The type `MixedReality.Toolkit.Core MixedReality.Toolkit.Experimental.BubbleChildHoverEvents/TrickleChildHoverEvents/BubbleChildSelectEvents/TrickleChildSelectEvents` is being serialized by `[SerializeReference]`, but is missing the `[Serializable]` attribute." on Unity 6.3. [PR #1107](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1107) * Fixed object identity API usages and obsolete sorting warnings for Unity 6.4 and newer in `FindObjectUtility`. [PR #1136](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1136) +* Fixed missing XML documentation comments in `SerializableDictionary`. [PR #1148](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1148) ## Deprecated diff --git a/org.mixedrealitytoolkit.core/Utilities/SerializableDictionary.cs b/org.mixedrealitytoolkit.core/Utilities/SerializableDictionary.cs index 6b8317397..44186b07e 100644 --- a/org.mixedrealitytoolkit.core/Utilities/SerializableDictionary.cs +++ b/org.mixedrealitytoolkit.core/Utilities/SerializableDictionary.cs @@ -59,12 +59,21 @@ void ISerializationCallbackReceiver.OnAfterDeserialize() } #if UNITY_EDITOR + /// + /// Removes all keys and values from the . + /// public new void Clear() { entries.Clear(); base.Clear(); } + /// + /// Removes the value with the specified key from the , and copies the element to the value parameter. + /// + /// The key of the element to remove. + /// The value of the element that was removed, or the default value if key was not found. + /// if the element is successfully found and removed; otherwise, . public new bool Remove(TKey key, out TValue value) { if (base.Remove(key, out value)) @@ -80,6 +89,11 @@ void ISerializationCallbackReceiver.OnAfterDeserialize() return false; } + /// + /// Removes the value with the specified key from the . + /// + /// The key of the element to remove. + /// if the element is successfully found and removed; otherwise, . public new bool Remove(TKey key) { return Remove(key, out _); diff --git a/org.mixedrealitytoolkit.input/CHANGELOG.md b/org.mixedrealitytoolkit.input/CHANGELOG.md index 23b92079a..242fc0539 100644 --- a/org.mixedrealitytoolkit.input/CHANGELOG.md +++ b/org.mixedrealitytoolkit.input/CHANGELOG.md @@ -14,6 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). * Fixed "leaked managed shell" issue in `InteractionModeManager`. [PR #1096](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1096) * Fixed `EyeCalibrationChecker` build issue on UWP when the Mixed Reality OpenXR Plugin wasn't installed. [PR #1106](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1106) * Fixed object identity API usages for Unity 6.4 and newer in `InteractionModeManagerEditor`. [PR #1136](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1136) +* Fixed missing XML documentation comments in `ProximityEnteredEventArgs`, `ProximityExitedEventArgs`, and `LOSAngularOffsetHandRayPoseSource`. [PR #1148](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1148) ## [3.3.0] - 2025-11-12 diff --git a/org.mixedrealitytoolkit.input/InteractionModes/ProximityEnteredEventArgs.cs b/org.mixedrealitytoolkit.input/InteractionModes/ProximityEnteredEventArgs.cs index 1af15c03c..bd55122be 100644 --- a/org.mixedrealitytoolkit.input/InteractionModes/ProximityEnteredEventArgs.cs +++ b/org.mixedrealitytoolkit.input/InteractionModes/ProximityEnteredEventArgs.cs @@ -3,6 +3,9 @@ namespace MixedReality.Toolkit.Input { + /// + /// Event data associated with proximity entered events triggered by a . + /// public class ProximityEnteredEventArgs : BaseProximityEventArgs { /// diff --git a/org.mixedrealitytoolkit.input/InteractionModes/ProximityExitedEventArgs.cs b/org.mixedrealitytoolkit.input/InteractionModes/ProximityExitedEventArgs.cs index 75be94113..90f19d712 100644 --- a/org.mixedrealitytoolkit.input/InteractionModes/ProximityExitedEventArgs.cs +++ b/org.mixedrealitytoolkit.input/InteractionModes/ProximityExitedEventArgs.cs @@ -3,6 +3,9 @@ namespace MixedReality.Toolkit.Input { + /// + /// Event data associated with proximity exited events triggered by a . + /// public class ProximityExitedEventArgs : BaseProximityEventArgs { /// diff --git a/org.mixedrealitytoolkit.input/Utilities/PoseSource/LOSAngularOffsetHandRayPoseSource.cs b/org.mixedrealitytoolkit.input/Utilities/PoseSource/LOSAngularOffsetHandRayPoseSource.cs index f23220eae..d000f42d0 100644 --- a/org.mixedrealitytoolkit.input/Utilities/PoseSource/LOSAngularOffsetHandRayPoseSource.cs +++ b/org.mixedrealitytoolkit.input/Utilities/PoseSource/LOSAngularOffsetHandRayPoseSource.cs @@ -37,6 +37,9 @@ public class LOSAngularOffsetHandRayPoseSource : HandBasedPoseSource private readonly Vector2 MinMaxPitchAngleOffset = new Vector2(-24f, -85f); private const float MinMaxAngleAdjustHandProximity = .5f; + /// + /// Initializes a new instance of the class. + /// public LOSAngularOffsetHandRayPoseSource() { StabilizedHandRay = new Lazy(() => diff --git a/org.mixedrealitytoolkit.spatialmanipulation/BoundsControl/BoundsHandleInteractable.cs b/org.mixedrealitytoolkit.spatialmanipulation/BoundsControl/BoundsHandleInteractable.cs index a40709694..d65cc805e 100644 --- a/org.mixedrealitytoolkit.spatialmanipulation/BoundsControl/BoundsHandleInteractable.cs +++ b/org.mixedrealitytoolkit.spatialmanipulation/BoundsControl/BoundsHandleInteractable.cs @@ -78,8 +78,10 @@ public bool MaintainGlobalSize set => scaleMaintainType = value ? ScaleMaintainType.GlobalSize : ScaleMaintainType.FixedScale; } + /// public void OnBeforeSerialize() { } + /// public void OnAfterDeserialize() { // Only update the scaleMaintainType if it hasn't been set and the old property was not migrated yet @@ -184,6 +186,9 @@ protected virtual void LateUpdate() UpdateLocalScale(); } + /// + /// Maintains the aspect ratio/proportion of the handles based on . + /// protected virtual void UpdateLocalScale() { transform.localScale = Vector3.one; @@ -234,7 +239,11 @@ protected virtual void UpdateLocalScale() } } - // Returns the local scale this transform needs to have in order to have the desired lossy scale + /// + /// Returns the local scale this transform needs to have in order to have the desired lossy scale. + /// + /// The desired lossy scale. + /// The local scale vector to produce the target lossy scale. protected Vector3 GetLocalScale(float lossyScale) => new( transform.lossyScale.x == 0 ? transform.localScale.x : (lossyScale / transform.lossyScale.x), transform.lossyScale.y == 0 ? transform.localScale.y : (lossyScale / transform.lossyScale.y), diff --git a/org.mixedrealitytoolkit.spatialmanipulation/CHANGELOG.md b/org.mixedrealitytoolkit.spatialmanipulation/CHANGELOG.md index 627a89ce4..de1de0619 100644 --- a/org.mixedrealitytoolkit.spatialmanipulation/CHANGELOG.md +++ b/org.mixedrealitytoolkit.spatialmanipulation/CHANGELOG.md @@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). * Fixed "leaked managed shell" issue in `BoundsCalculator`. [PR #1096](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1096) * Fixed object identity API usages for Unity 6.4 and newer in `ConstraintManagerEditor`. [PR #1136](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1136) +* Fixed missing XML documentation comments in `BoundsHandleInteractable`. [PR #1148](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1148) ### Changed diff --git a/org.mixedrealitytoolkit.uxcore/CHANGELOG.md b/org.mixedrealitytoolkit.uxcore/CHANGELOG.md index f5b02e2d5..481665cc3 100644 --- a/org.mixedrealitytoolkit.uxcore/CHANGELOG.md +++ b/org.mixedrealitytoolkit.uxcore/CHANGELOG.md @@ -12,6 +12,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). * Fixed "leaked managed shell" issue in `UGUIInputAdapter`. [PR #1096](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1096) * Fixed "Attribute 'SerializeField' is not valid on this declaration type. It is only valid on 'field' declarations" error on `DialogButton` in Unity 6.3. [PR #1108](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1108) +* Fixed missing XML documentation comments in `VirtualizedScrollRectList` and `SeeItSayItLabelEnabler`. [PR #1148](https://github.com/MixedRealityToolkit/MixedRealityToolkit-Unity/pull/1148) ## [3.3.0] - 2025-11-12 diff --git a/org.mixedrealitytoolkit.uxcore/Experimental/List/VirtualizedScrollRectList.cs b/org.mixedrealitytoolkit.uxcore/Experimental/List/VirtualizedScrollRectList.cs index ae61c2105..f1f327a06 100644 --- a/org.mixedrealitytoolkit.uxcore/Experimental/List/VirtualizedScrollRectList.cs +++ b/org.mixedrealitytoolkit.uxcore/Experimental/List/VirtualizedScrollRectList.cs @@ -1,4 +1,4 @@ -// Copyright (c) Mixed Reality Toolkit Contributors +// Copyright (c) Mixed Reality Toolkit Contributors // Licensed under the BSD 3-Clause using System; @@ -361,6 +361,9 @@ protected void OnValidate() ResetLayout(); } + /// + /// A Unity event function that is called when the script component has been enabled. + /// protected void OnEnable() { // Check if reset was called while this script was disabled and ensure the layout is reset diff --git a/org.mixedrealitytoolkit.uxcore/SeeItSayIt/SeeItSayItLabelEnabler.cs b/org.mixedrealitytoolkit.uxcore/SeeItSayIt/SeeItSayItLabelEnabler.cs index 1b0c53a88..d1f5bd5e9 100644 --- a/org.mixedrealitytoolkit.uxcore/SeeItSayIt/SeeItSayItLabelEnabler.cs +++ b/org.mixedrealitytoolkit.uxcore/SeeItSayIt/SeeItSayItLabelEnabler.cs @@ -93,6 +93,9 @@ public Transform PositionControl private const float CanvasOffset = -10f; private const float NonCanvasOffset = -0.004f; + /// + /// A Unity event function that is called when the script instance is being loaded. + /// protected virtual void Awake() { pressableButton = GetComponent(); @@ -163,6 +166,9 @@ protected virtual void Start() } } + /// + /// A Unity event function that is called when the MonoBehaviour will be destroyed. + /// protected virtual void OnDestroy() { #if MRTK_INPUT_PRESENT && MRTK_SPEECH_PRESENT @@ -179,6 +185,10 @@ protected virtual void OnDestroy() #endif } + /// + /// Updates the See-It Say-It label text based on the specified speech recognition keyword. + /// + /// The speech recognition keyword to display. protected virtual void UpdateLabel(string keyword) { #if MRTK_INPUT_PRESENT && MRTK_SPEECH_PRESENT @@ -197,6 +207,10 @@ protected virtual void UpdateLabel(string keyword) } #if MRTK_INPUT_PRESENT && MRTK_SPEECH_PRESENT && UNITY_LOCALIZATION_PRESENT + /// + /// Callback invoked when the localized label pattern string changes. + /// + /// The updated localized string value. protected virtual void OnLocalizedPatternChanged(string value) { UpdateLabel(pressableButton.SpeechRecognitionKeyword);