Merge pull request #52830 from aaronfranke/3.x-cs-format-mini

[3.x] Some more C# formatting and style fixes
This commit is contained in:
Rémi Verschelde 2021-09-18 23:02:11 +02:00 committed by GitHub
commit 673612f1b7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
46 changed files with 899 additions and 874 deletions

View file

@ -12,12 +12,16 @@ namespace GodotTools.BuildLogger
public string Parameters { get; set; } public string Parameters { get; set; }
public LoggerVerbosity Verbosity { get; set; } public LoggerVerbosity Verbosity { get; set; }
private StreamWriter _logStreamWriter;
private StreamWriter _issuesStreamWriter;
private int _indent;
public void Initialize(IEventSource eventSource) public void Initialize(IEventSource eventSource)
{ {
if (null == Parameters) if (null == Parameters)
throw new LoggerException("Log directory parameter not specified."); throw new LoggerException("Log directory parameter not specified.");
var parameters = Parameters.Split(new[] {';'}); string[] parameters = Parameters.Split(new[] { ';' });
string logDir = parameters[0]; string logDir = parameters[0];
@ -35,8 +39,8 @@ namespace GodotTools.BuildLogger
if (!Directory.Exists(logDir)) if (!Directory.Exists(logDir))
Directory.CreateDirectory(logDir); Directory.CreateDirectory(logDir);
logStreamWriter = new StreamWriter(logFile); _logStreamWriter = new StreamWriter(logFile);
issuesStreamWriter = new StreamWriter(issuesFile); _issuesStreamWriter = new StreamWriter(issuesFile);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -66,12 +70,12 @@ namespace GodotTools.BuildLogger
private void eventSource_ProjectStarted(object sender, ProjectStartedEventArgs e) private void eventSource_ProjectStarted(object sender, ProjectStartedEventArgs e)
{ {
WriteLine(e.Message); WriteLine(e.Message);
indent++; _indent++;
} }
private void eventSource_ProjectFinished(object sender, ProjectFinishedEventArgs e) private void eventSource_ProjectFinished(object sender, ProjectFinishedEventArgs e)
{ {
indent--; _indent--;
WriteLine(e.Message); WriteLine(e.Message);
} }
@ -87,7 +91,7 @@ namespace GodotTools.BuildLogger
string errorLine = $@"error,{e.File.CsvEscape()},{e.LineNumber},{e.ColumnNumber}," + string errorLine = $@"error,{e.File.CsvEscape()},{e.LineNumber},{e.ColumnNumber}," +
$"{e.Code?.CsvEscape() ?? string.Empty},{e.Message.CsvEscape()}," + $"{e.Code?.CsvEscape() ?? string.Empty},{e.Message.CsvEscape()}," +
$"{e.ProjectFile?.CsvEscape() ?? string.Empty}"; $"{e.ProjectFile?.CsvEscape() ?? string.Empty}";
issuesStreamWriter.WriteLine(errorLine); _issuesStreamWriter.WriteLine(errorLine);
} }
private void eventSource_WarningRaised(object sender, BuildWarningEventArgs e) private void eventSource_WarningRaised(object sender, BuildWarningEventArgs e)
@ -102,7 +106,7 @@ namespace GodotTools.BuildLogger
string warningLine = $@"warning,{e.File.CsvEscape()},{e.LineNumber},{e.ColumnNumber}," + string warningLine = $@"warning,{e.File.CsvEscape()},{e.LineNumber},{e.ColumnNumber}," +
$"{e.Code?.CsvEscape() ?? string.Empty},{e.Message.CsvEscape()}," + $"{e.Code?.CsvEscape() ?? string.Empty},{e.Message.CsvEscape()}," +
$"{e.ProjectFile?.CsvEscape() ?? string.Empty}"; $"{e.ProjectFile?.CsvEscape() ?? string.Empty}";
issuesStreamWriter.WriteLine(warningLine); _issuesStreamWriter.WriteLine(warningLine);
} }
private void eventSource_MessageRaised(object sender, BuildMessageEventArgs e) private void eventSource_MessageRaised(object sender, BuildMessageEventArgs e)
@ -136,35 +140,31 @@ namespace GodotTools.BuildLogger
private void WriteLine(string line) private void WriteLine(string line)
{ {
for (int i = indent; i > 0; i--) for (int i = _indent; i > 0; i--)
{ {
logStreamWriter.Write("\t"); _logStreamWriter.Write("\t");
} }
logStreamWriter.WriteLine(line); _logStreamWriter.WriteLine(line);
} }
public void Shutdown() public void Shutdown()
{ {
logStreamWriter.Close(); _logStreamWriter.Close();
issuesStreamWriter.Close(); _issuesStreamWriter.Close();
} }
private bool IsVerbosityAtLeast(LoggerVerbosity checkVerbosity) private bool IsVerbosityAtLeast(LoggerVerbosity checkVerbosity)
{ {
return Verbosity >= checkVerbosity; return Verbosity >= checkVerbosity;
} }
private StreamWriter logStreamWriter;
private StreamWriter issuesStreamWriter;
private int indent;
} }
internal static class StringExtensions internal static class StringExtensions
{ {
public static string CsvEscape(this string value, char delimiter = ',') public static string CsvEscape(this string value, char delimiter = ',')
{ {
bool hasSpecialChar = value.IndexOfAny(new[] {'\"', '\n', '\r', delimiter}) != -1; bool hasSpecialChar = value.IndexOfAny(new[] { '\"', '\n', '\r', delimiter }) != -1;
if (hasSpecialChar) if (hasSpecialChar)
return "\"" + value.Replace("\"", "\"\"") + "\""; return "\"" + value.Replace("\"", "\"\"") + "\"";

View file

@ -7,6 +7,8 @@ namespace GodotTools.Core
{ {
public static class StringExtensions public static class StringExtensions
{ {
private static readonly string _driveRoot = Path.GetPathRoot(Environment.CurrentDirectory);
public static string RelativeToPath(this string path, string dir) public static string RelativeToPath(this string path, string dir)
{ {
// Make sure the directory ends with a path separator // Make sure the directory ends with a path separator
@ -49,13 +51,11 @@ namespace GodotTools.Core
return Path.DirectorySeparatorChar + path; return Path.DirectorySeparatorChar + path;
} }
private static readonly string DriveRoot = Path.GetPathRoot(Environment.CurrentDirectory);
public static bool IsAbsolutePath(this string path) public static bool IsAbsolutePath(this string path)
{ {
return path.StartsWith("/", StringComparison.Ordinal) || return path.StartsWith("/", StringComparison.Ordinal) ||
path.StartsWith("\\", StringComparison.Ordinal) || path.StartsWith("\\", StringComparison.Ordinal) ||
path.StartsWith(DriveRoot, StringComparison.Ordinal); path.StartsWith(_driveRoot, StringComparison.Ordinal);
} }
public static string ToSafeDirName(this string dirName, bool allowDirSeparator = false) public static string ToSafeDirName(this string dirName, bool allowDirSeparator = false)

View file

@ -9,95 +9,7 @@ namespace GodotTools.ProjectEditor
{ {
public class DotNetSolution public class DotNetSolution
{ {
private string directoryPath; private const string _solutionTemplate =
private readonly Dictionary<string, ProjectInfo> projects = new Dictionary<string, ProjectInfo>();
public string Name { get; }
public string DirectoryPath
{
get => directoryPath;
set => directoryPath = value.IsAbsolutePath() ? value : Path.GetFullPath(value);
}
public class ProjectInfo
{
public string Guid;
public string PathRelativeToSolution;
public List<string> Configs = new List<string>();
}
public void AddNewProject(string name, ProjectInfo projectInfo)
{
projects[name] = projectInfo;
}
public bool HasProject(string name)
{
return projects.ContainsKey(name);
}
public ProjectInfo GetProjectInfo(string name)
{
return projects[name];
}
public bool RemoveProject(string name)
{
return projects.Remove(name);
}
public void Save()
{
if (!Directory.Exists(DirectoryPath))
throw new FileNotFoundException("The solution directory does not exist.");
string projectsDecl = string.Empty;
string slnPlatformsCfg = string.Empty;
string projPlatformsCfg = string.Empty;
bool isFirstProject = true;
foreach (var pair in projects)
{
string name = pair.Key;
ProjectInfo projectInfo = pair.Value;
if (!isFirstProject)
projectsDecl += "\n";
projectsDecl += string.Format(ProjectDeclaration,
name, projectInfo.PathRelativeToSolution.Replace("/", "\\"), projectInfo.Guid);
for (int i = 0; i < projectInfo.Configs.Count; i++)
{
string config = projectInfo.Configs[i];
if (i != 0 || !isFirstProject)
{
slnPlatformsCfg += "\n";
projPlatformsCfg += "\n";
}
slnPlatformsCfg += string.Format(SolutionPlatformsConfig, config);
projPlatformsCfg += string.Format(ProjectPlatformsConfig, projectInfo.Guid, config);
}
isFirstProject = false;
}
string solutionPath = Path.Combine(DirectoryPath, Name + ".sln");
string content = string.Format(SolutionTemplate, projectsDecl, slnPlatformsCfg, projPlatformsCfg);
File.WriteAllText(solutionPath, content, Encoding.UTF8); // UTF-8 with BOM
}
public DotNetSolution(string name)
{
Name = name;
}
const string SolutionTemplate =
@"Microsoft Visual Studio Solution File, Format Version 12.00 @"Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2012 # Visual Studio 2012
{0} {0}
@ -111,23 +23,111 @@ Global
EndGlobal EndGlobal
"; ";
const string ProjectDeclaration = private const string _projectDeclaration =
@"Project(""{{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}}"") = ""{0}"", ""{1}"", ""{{{2}}}"" @"Project(""{{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}}"") = ""{0}"", ""{1}"", ""{{{2}}}""
EndProject"; EndProject";
const string SolutionPlatformsConfig = private const string _solutionPlatformsConfig =
@" {0}|Any CPU = {0}|Any CPU"; @" {0}|Any CPU = {0}|Any CPU";
const string ProjectPlatformsConfig = private const string _projectPlatformsConfig =
@" {{{0}}}.{1}|Any CPU.ActiveCfg = {1}|Any CPU @" {{{0}}}.{1}|Any CPU.ActiveCfg = {1}|Any CPU
{{{0}}}.{1}|Any CPU.Build.0 = {1}|Any CPU"; {{{0}}}.{1}|Any CPU.Build.0 = {1}|Any CPU";
private string _directoryPath;
private readonly Dictionary<string, ProjectInfo> _projects = new Dictionary<string, ProjectInfo>();
public string Name { get; }
public string DirectoryPath
{
get => _directoryPath;
set => _directoryPath = value.IsAbsolutePath() ? value : Path.GetFullPath(value);
}
public class ProjectInfo
{
public string Guid;
public string PathRelativeToSolution;
public List<string> Configs = new List<string>();
}
public void AddNewProject(string name, ProjectInfo projectInfo)
{
_projects[name] = projectInfo;
}
public bool HasProject(string name)
{
return _projects.ContainsKey(name);
}
public ProjectInfo GetProjectInfo(string name)
{
return _projects[name];
}
public bool RemoveProject(string name)
{
return _projects.Remove(name);
}
public void Save()
{
if (!Directory.Exists(DirectoryPath))
throw new FileNotFoundException("The solution directory does not exist.");
string projectsDecl = string.Empty;
string slnPlatformsCfg = string.Empty;
string projPlatformsCfg = string.Empty;
bool isFirstProject = true;
foreach (var pair in _projects)
{
string name = pair.Key;
ProjectInfo projectInfo = pair.Value;
if (!isFirstProject)
projectsDecl += "\n";
projectsDecl += string.Format(_projectDeclaration,
name, projectInfo.PathRelativeToSolution.Replace("/", "\\"), projectInfo.Guid);
for (int i = 0; i < projectInfo.Configs.Count; i++)
{
string config = projectInfo.Configs[i];
if (i != 0 || !isFirstProject)
{
slnPlatformsCfg += "\n";
projPlatformsCfg += "\n";
}
slnPlatformsCfg += string.Format(_solutionPlatformsConfig, config);
projPlatformsCfg += string.Format(_projectPlatformsConfig, projectInfo.Guid, config);
}
isFirstProject = false;
}
string solutionPath = Path.Combine(DirectoryPath, Name + ".sln");
string content = string.Format(_solutionTemplate, projectsDecl, slnPlatformsCfg, projPlatformsCfg);
File.WriteAllText(solutionPath, content, Encoding.UTF8); // UTF-8 with BOM
}
public DotNetSolution(string name)
{
Name = name;
}
public static void MigrateFromOldConfigNames(string slnPath) public static void MigrateFromOldConfigNames(string slnPath)
{ {
if (!File.Exists(slnPath)) if (!File.Exists(slnPath))
return; return;
var input = File.ReadAllText(slnPath); string input = File.ReadAllText(slnPath);
if (!Regex.IsMatch(input, Regex.Escape("Tools|Any CPU"))) if (!Regex.IsMatch(input, Regex.Escape("Tools|Any CPU")))
return; return;
@ -151,7 +151,7 @@ EndProject";
}; };
var regex = new Regex(string.Join("|", dict.Keys.Select(Regex.Escape))); var regex = new Regex(string.Join("|", dict.Keys.Select(Regex.Escape)));
var result = regex.Replace(input, m => dict[m.Value]); string result = regex.Replace(input, m => dict[m.Value]);
if (result != input) if (result != input)
{ {

View file

@ -91,7 +91,7 @@ namespace GodotTools.ProjectEditor
return identifier; return identifier;
} }
static bool IsKeyword(string value, bool anyDoubleUnderscore) private static bool IsKeyword(string value, bool anyDoubleUnderscore)
{ {
// Identifiers that start with double underscore are meant to be used for reserved keywords. // Identifiers that start with double underscore are meant to be used for reserved keywords.
// Only existing keywords are enforced, but it may be useful to forbid any identifier // Only existing keywords are enforced, but it may be useful to forbid any identifier
@ -103,14 +103,14 @@ namespace GodotTools.ProjectEditor
} }
else else
{ {
if (DoubleUnderscoreKeywords.Contains(value)) if (_doubleUnderscoreKeywords.Contains(value))
return true; return true;
} }
return Keywords.Contains(value); return _keywords.Contains(value);
} }
private static readonly HashSet<string> DoubleUnderscoreKeywords = new HashSet<string> private static readonly HashSet<string> _doubleUnderscoreKeywords = new HashSet<string>
{ {
"__arglist", "__arglist",
"__makeref", "__makeref",
@ -118,7 +118,7 @@ namespace GodotTools.ProjectEditor
"__refvalue", "__refvalue",
}; };
private static readonly HashSet<string> Keywords = new HashSet<string> private static readonly HashSet<string> _keywords = new HashSet<string>
{ {
"as", "as",
"do", "do",

View file

@ -13,7 +13,8 @@ namespace GodotTools.Build
public string[] Targets { get; } public string[] Targets { get; }
public string Configuration { get; } public string Configuration { get; }
public bool Restore { get; } public bool Restore { get; }
public Array<string> CustomProperties { get; } = new Array<string>(); // TODO Use List once we have proper serialization // TODO Use List once we have proper serialization
public Array<string> CustomProperties { get; } = new Array<string>();
public string LogsDirPath => Path.Combine(GodotSharpDirs.BuildLogsDirs, $"{Solution.MD5Text()}_{Configuration}"); public string LogsDirPath => Path.Combine(GodotSharpDirs.BuildLogsDirs, $"{Solution.MD5Text()}_{Configuration}");
@ -32,12 +33,12 @@ namespace GodotTools.Build
unchecked unchecked
{ {
int hash = 17; int hash = 17;
hash = hash * 29 + Solution.GetHashCode(); hash = (hash * 29) + Solution.GetHashCode();
hash = hash * 29 + Targets.GetHashCode(); hash = (hash * 29) + Targets.GetHashCode();
hash = hash * 29 + Configuration.GetHashCode(); hash = (hash * 29) + Configuration.GetHashCode();
hash = hash * 29 + Restore.GetHashCode(); hash = (hash * 29) + Restore.GetHashCode();
hash = hash * 29 + CustomProperties.GetHashCode(); hash = (hash * 29) + CustomProperties.GetHashCode();
hash = hash * 29 + LogsDirPath.GetHashCode(); hash = (hash * 29) + LogsDirPath.GetHashCode();
return hash; return hash;
} }
} }

View file

@ -33,7 +33,7 @@ namespace GodotTools.Build
private static void RemoveOldIssuesFile(BuildInfo buildInfo) private static void RemoveOldIssuesFile(BuildInfo buildInfo)
{ {
var issuesFile = GetIssuesFilePath(buildInfo); string issuesFile = GetIssuesFilePath(buildInfo);
if (!File.Exists(issuesFile)) if (!File.Exists(issuesFile))
return; return;

View file

@ -22,14 +22,6 @@ namespace GodotTools.Build
public string ProjectFile { get; set; } public string ProjectFile { get; set; }
} }
private readonly Array<BuildIssue> issues = new Array<BuildIssue>(); // TODO Use List once we have proper serialization
private ItemList issuesList;
private TextEdit buildLog;
private PopupMenu issuesListContextMenu;
private readonly object pendingBuildLogTextLock = new object();
[NotNull] private string pendingBuildLogText = string.Empty;
[Signal] [Signal]
public delegate void BuildStateChanged(); public delegate void BuildStateChanged();
@ -61,13 +53,21 @@ namespace GodotTools.Build
} }
} }
private BuildInfo BuildInfo { get; set; }
public bool LogVisible public bool LogVisible
{ {
set => buildLog.Visible = value; set => _buildLog.Visible = value;
} }
// TODO Use List once we have proper serialization.
private readonly Array<BuildIssue> _issues = new Array<BuildIssue>();
private ItemList _issuesList;
private PopupMenu _issuesListContextMenu;
private TextEdit _buildLog;
private BuildInfo _buildInfo;
private readonly object _pendingBuildLogTextLock = new object();
[NotNull] private string _pendingBuildLogText = string.Empty;
private void LoadIssuesFromFile(string csvFile) private void LoadIssuesFromFile(string csvFile)
{ {
using (var file = new Godot.File()) using (var file = new Godot.File())
@ -108,7 +108,7 @@ namespace GodotTools.Build
else else
ErrorCount += 1; ErrorCount += 1;
issues.Add(issue); _issues.Add(issue);
} }
} }
finally finally
@ -120,21 +120,21 @@ namespace GodotTools.Build
private void IssueActivated(int idx) private void IssueActivated(int idx)
{ {
if (idx < 0 || idx >= issuesList.GetItemCount()) if (idx < 0 || idx >= _issuesList.GetItemCount())
throw new IndexOutOfRangeException("Item list index out of range"); throw new IndexOutOfRangeException("Item list index out of range");
// Get correct issue idx from issue list // Get correct issue idx from issue list
int issueIndex = (int)issuesList.GetItemMetadata(idx); int issueIndex = (int)_issuesList.GetItemMetadata(idx);
if (issueIndex < 0 || issueIndex >= issues.Count) if (issueIndex < 0 || issueIndex >= _issues.Count)
throw new IndexOutOfRangeException("Issue index out of range"); throw new IndexOutOfRangeException("Issue index out of range");
BuildIssue issue = issues[issueIndex]; BuildIssue issue = _issues[issueIndex];
if (string.IsNullOrEmpty(issue.ProjectFile) && string.IsNullOrEmpty(issue.File)) if (string.IsNullOrEmpty(issue.ProjectFile) && string.IsNullOrEmpty(issue.File))
return; return;
string projectDir = issue.ProjectFile.Length > 0 ? issue.ProjectFile.GetBaseDir() : BuildInfo.Solution.GetBaseDir(); string projectDir = issue.ProjectFile.Length > 0 ? issue.ProjectFile.GetBaseDir() : _buildInfo.Solution.GetBaseDir();
string file = Path.Combine(projectDir.SimplifyGodotPath(), issue.File.SimplifyGodotPath()); string file = Path.Combine(projectDir.SimplifyGodotPath(), issue.File.SimplifyGodotPath());
@ -154,14 +154,14 @@ namespace GodotTools.Build
public void UpdateIssuesList() public void UpdateIssuesList()
{ {
issuesList.Clear(); _issuesList.Clear();
using (var warningIcon = GetIcon("Warning", "EditorIcons")) using (var warningIcon = GetIcon("Warning", "EditorIcons"))
using (var errorIcon = GetIcon("Error", "EditorIcons")) using (var errorIcon = GetIcon("Error", "EditorIcons"))
{ {
for (int i = 0; i < issues.Count; i++) for (int i = 0; i < _issues.Count; i++)
{ {
BuildIssue issue = issues[i]; BuildIssue issue = _issues[i];
if (!(issue.Warning ? WarningsVisible : ErrorsVisible)) if (!(issue.Warning ? WarningsVisible : ErrorsVisible))
continue; continue;
@ -192,11 +192,11 @@ namespace GodotTools.Build
int lineBreakIdx = text.IndexOf("\n", StringComparison.Ordinal); int lineBreakIdx = text.IndexOf("\n", StringComparison.Ordinal);
string itemText = lineBreakIdx == -1 ? text : text.Substring(0, lineBreakIdx); string itemText = lineBreakIdx == -1 ? text : text.Substring(0, lineBreakIdx);
issuesList.AddItem(itemText, issue.Warning ? warningIcon : errorIcon); _issuesList.AddItem(itemText, issue.Warning ? warningIcon : errorIcon);
int index = issuesList.GetItemCount() - 1; int index = _issuesList.GetItemCount() - 1;
issuesList.SetItemTooltip(index, tooltip); _issuesList.SetItemTooltip(index, tooltip);
issuesList.SetItemMetadata(index, i); _issuesList.SetItemMetadata(index, i);
} }
} }
} }
@ -206,12 +206,12 @@ namespace GodotTools.Build
HasBuildExited = true; HasBuildExited = true;
BuildResult = Build.BuildResult.Error; BuildResult = Build.BuildResult.Error;
issuesList.Clear(); _issuesList.Clear();
var issue = new BuildIssue {Message = cause, Warning = false}; var issue = new BuildIssue {Message = cause, Warning = false};
ErrorCount += 1; ErrorCount += 1;
issues.Add(issue); _issues.Add(issue);
UpdateIssuesList(); UpdateIssuesList();
@ -220,13 +220,13 @@ namespace GodotTools.Build
private void BuildStarted(BuildInfo buildInfo) private void BuildStarted(BuildInfo buildInfo)
{ {
BuildInfo = buildInfo; _buildInfo = buildInfo;
HasBuildExited = false; HasBuildExited = false;
issues.Clear(); _issues.Clear();
WarningCount = 0; WarningCount = 0;
ErrorCount = 0; ErrorCount = 0;
buildLog.Text = string.Empty; _buildLog.Text = string.Empty;
UpdateIssuesList(); UpdateIssuesList();
@ -238,7 +238,7 @@ namespace GodotTools.Build
HasBuildExited = true; HasBuildExited = true;
BuildResult = result; BuildResult = result;
LoadIssuesFromFile(Path.Combine(BuildInfo.LogsDirPath, BuildManager.MsBuildIssuesFileName)); LoadIssuesFromFile(Path.Combine(_buildInfo.LogsDirPath, BuildManager.MsBuildIssuesFileName));
UpdateIssuesList(); UpdateIssuesList();
@ -247,46 +247,46 @@ namespace GodotTools.Build
private void UpdateBuildLogText() private void UpdateBuildLogText()
{ {
lock (pendingBuildLogTextLock) lock (_pendingBuildLogTextLock)
{ {
buildLog.Text += pendingBuildLogText; _buildLog.Text += _pendingBuildLogText;
pendingBuildLogText = string.Empty; _pendingBuildLogText = string.Empty;
ScrollToLastNonEmptyLogLine(); ScrollToLastNonEmptyLogLine();
} }
} }
private void StdOutputReceived(string text) private void StdOutputReceived(string text)
{ {
lock (pendingBuildLogTextLock) lock (_pendingBuildLogTextLock)
{ {
if (pendingBuildLogText.Length == 0) if (_pendingBuildLogText.Length == 0)
CallDeferred(nameof(UpdateBuildLogText)); CallDeferred(nameof(UpdateBuildLogText));
pendingBuildLogText += text + "\n"; _pendingBuildLogText += text + "\n";
} }
} }
private void StdErrorReceived(string text) private void StdErrorReceived(string text)
{ {
lock (pendingBuildLogTextLock) lock (_pendingBuildLogTextLock)
{ {
if (pendingBuildLogText.Length == 0) if (_pendingBuildLogText.Length == 0)
CallDeferred(nameof(UpdateBuildLogText)); CallDeferred(nameof(UpdateBuildLogText));
pendingBuildLogText += text + "\n"; _pendingBuildLogText += text + "\n";
} }
} }
private void ScrollToLastNonEmptyLogLine() private void ScrollToLastNonEmptyLogLine()
{ {
int line; int line;
for (line = buildLog.GetLineCount(); line > 0; line--) for (line = _buildLog.GetLineCount(); line > 0; line--)
{ {
string lineText = buildLog.GetLine(line); string lineText = _buildLog.GetLine(line);
if (!string.IsNullOrEmpty(lineText) || !string.IsNullOrEmpty(lineText?.Trim())) if (!string.IsNullOrEmpty(lineText) || !string.IsNullOrEmpty(lineText?.Trim()))
break; break;
} }
buildLog.CursorSetLine(line); _buildLog.CursorSetLine(line);
} }
public void RestartBuild() public void RestartBuild()
@ -319,11 +319,11 @@ namespace GodotTools.Build
// We don't allow multi-selection but just in case that changes later... // We don't allow multi-selection but just in case that changes later...
string text = null; string text = null;
foreach (int issueIndex in issuesList.GetSelectedItems()) foreach (int issueIndex in _issuesList.GetSelectedItems())
{ {
if (text != null) if (text != null)
text += "\n"; text += "\n";
text += issuesList.GetItemText(issueIndex); text += _issuesList.GetItemText(issueIndex);
} }
if (text != null) if (text != null)
@ -339,20 +339,20 @@ namespace GodotTools.Build
{ {
_ = index; // Unused _ = index; // Unused
issuesListContextMenu.Clear(); _issuesListContextMenu.Clear();
issuesListContextMenu.SetSize(new Vector2(1, 1)); _issuesListContextMenu.SetSize(new Vector2(1, 1));
if (issuesList.IsAnythingSelected()) if (_issuesList.IsAnythingSelected())
{ {
// Add menu entries for the selected item // Add menu entries for the selected item
issuesListContextMenu.AddIconItem(GetIcon("ActionCopy", "EditorIcons"), _issuesListContextMenu.AddIconItem(GetIcon("ActionCopy", "EditorIcons"),
label: "Copy Error".TTR(), (int)IssuesContextMenuOption.Copy); label: "Copy Error".TTR(), (int)IssuesContextMenuOption.Copy);
} }
if (issuesListContextMenu.GetItemCount() > 0) if (_issuesListContextMenu.GetItemCount() > 0)
{ {
issuesListContextMenu.SetPosition(issuesList.RectGlobalPosition + atPosition); _issuesListContextMenu.SetPosition(_issuesList.RectGlobalPosition + atPosition);
issuesListContextMenu.Popup_(); _issuesListContextMenu.Popup_();
} }
} }
@ -369,27 +369,27 @@ namespace GodotTools.Build
}; };
AddChild(hsc); AddChild(hsc);
issuesList = new ItemList _issuesList = new ItemList
{ {
SizeFlagsVertical = (int)SizeFlags.ExpandFill, SizeFlagsVertical = (int)SizeFlags.ExpandFill,
SizeFlagsHorizontal = (int)SizeFlags.ExpandFill // Avoid being squashed by the build log SizeFlagsHorizontal = (int)SizeFlags.ExpandFill // Avoid being squashed by the build log
}; };
issuesList.Connect("item_activated", this, nameof(IssueActivated)); _issuesList.Connect("item_activated", this, nameof(IssueActivated));
issuesList.AllowRmbSelect = true; _issuesList.AllowRmbSelect = true;
issuesList.Connect("item_rmb_selected", this, nameof(IssuesListRmbSelected)); _issuesList.Connect("item_rmb_selected", this, nameof(IssuesListRmbSelected));
hsc.AddChild(issuesList); hsc.AddChild(_issuesList);
issuesListContextMenu = new PopupMenu(); _issuesListContextMenu = new PopupMenu();
issuesListContextMenu.Connect("id_pressed", this, nameof(IssuesListContextOptionPressed)); _issuesListContextMenu.Connect("id_pressed", this, nameof(IssuesListContextOptionPressed));
issuesList.AddChild(issuesListContextMenu); _issuesList.AddChild(_issuesListContextMenu);
buildLog = new TextEdit _buildLog = new TextEdit
{ {
Readonly = true, Readonly = true,
SizeFlagsVertical = (int)SizeFlags.ExpandFill, SizeFlagsVertical = (int)SizeFlags.ExpandFill,
SizeFlagsHorizontal = (int)SizeFlags.ExpandFill // Avoid being squashed by the issues list SizeFlagsHorizontal = (int)SizeFlags.ExpandFill // Avoid being squashed by the issues list
}; };
hsc.AddChild(buildLog); hsc.AddChild(_buildLog);
AddBuildEventListeners(); AddBuildEventListeners();
} }

View file

@ -11,10 +11,10 @@ namespace GodotTools.Build
{ {
public BuildOutputView BuildOutputView { get; private set; } public BuildOutputView BuildOutputView { get; private set; }
private MenuButton buildMenuBtn; private MenuButton _buildMenuBtn;
private Button errorsBtn; private Button _errorsBtn;
private Button warningsBtn; private Button _warningsBtn;
private Button viewLogBtn; private Button _viewLogBtn;
private void WarningsToggled(bool pressed) private void WarningsToggled(bool pressed)
{ {
@ -116,16 +116,16 @@ namespace GodotTools.Build
var toolBarHBox = new HBoxContainer { SizeFlagsHorizontal = (int)SizeFlags.ExpandFill }; var toolBarHBox = new HBoxContainer { SizeFlagsHorizontal = (int)SizeFlags.ExpandFill };
AddChild(toolBarHBox); AddChild(toolBarHBox);
buildMenuBtn = new MenuButton { Text = "Build", Icon = GetIcon("Play", "EditorIcons") }; _buildMenuBtn = new MenuButton { Text = "Build", Icon = GetIcon("Play", "EditorIcons") };
toolBarHBox.AddChild(buildMenuBtn); toolBarHBox.AddChild(_buildMenuBtn);
var buildMenu = buildMenuBtn.GetPopup(); var buildMenu = _buildMenuBtn.GetPopup();
buildMenu.AddItem("Build Solution".TTR(), (int)BuildMenuOptions.BuildSolution); buildMenu.AddItem("Build Solution".TTR(), (int)BuildMenuOptions.BuildSolution);
buildMenu.AddItem("Rebuild Solution".TTR(), (int)BuildMenuOptions.RebuildSolution); buildMenu.AddItem("Rebuild Solution".TTR(), (int)BuildMenuOptions.RebuildSolution);
buildMenu.AddItem("Clean Solution".TTR(), (int)BuildMenuOptions.CleanSolution); buildMenu.AddItem("Clean Solution".TTR(), (int)BuildMenuOptions.CleanSolution);
buildMenu.Connect("id_pressed", this, nameof(BuildMenuOptionPressed)); buildMenu.Connect("id_pressed", this, nameof(BuildMenuOptionPressed));
errorsBtn = new Button _errorsBtn = new Button
{ {
HintTooltip = "Show Errors".TTR(), HintTooltip = "Show Errors".TTR(),
Icon = GetIcon("StatusError", "EditorIcons"), Icon = GetIcon("StatusError", "EditorIcons"),
@ -134,10 +134,10 @@ namespace GodotTools.Build
Pressed = true, Pressed = true,
FocusMode = FocusModeEnum.None FocusMode = FocusModeEnum.None
}; };
errorsBtn.Connect("toggled", this, nameof(ErrorsToggled)); _errorsBtn.Connect("toggled", this, nameof(ErrorsToggled));
toolBarHBox.AddChild(errorsBtn); toolBarHBox.AddChild(_errorsBtn);
warningsBtn = new Button _warningsBtn = new Button
{ {
HintTooltip = "Show Warnings".TTR(), HintTooltip = "Show Warnings".TTR(),
Icon = GetIcon("NodeWarning", "EditorIcons"), Icon = GetIcon("NodeWarning", "EditorIcons"),
@ -146,18 +146,18 @@ namespace GodotTools.Build
Pressed = true, Pressed = true,
FocusMode = FocusModeEnum.None FocusMode = FocusModeEnum.None
}; };
warningsBtn.Connect("toggled", this, nameof(WarningsToggled)); _warningsBtn.Connect("toggled", this, nameof(WarningsToggled));
toolBarHBox.AddChild(warningsBtn); toolBarHBox.AddChild(_warningsBtn);
viewLogBtn = new Button _viewLogBtn = new Button
{ {
Text = "Show Output".TTR(), Text = "Show Output".TTR(),
ToggleMode = true, ToggleMode = true,
Pressed = true, Pressed = true,
FocusMode = FocusModeEnum.None FocusMode = FocusModeEnum.None
}; };
viewLogBtn.Connect("toggled", this, nameof(ViewLogToggled)); _viewLogBtn.Connect("toggled", this, nameof(ViewLogToggled));
toolBarHBox.AddChild(viewLogBtn); toolBarHBox.AddChild(_viewLogBtn);
BuildOutputView = new BuildOutputView(); BuildOutputView = new BuildOutputView();
AddChild(BuildOutputView); AddChild(BuildOutputView);
@ -169,12 +169,12 @@ namespace GodotTools.Build
if (what == NotificationThemeChanged) if (what == NotificationThemeChanged)
{ {
if (buildMenuBtn != null) if (_buildMenuBtn != null)
buildMenuBtn.Icon = GetIcon("Play", "EditorIcons"); _buildMenuBtn.Icon = GetIcon("Play", "EditorIcons");
if (errorsBtn != null) if (_errorsBtn != null)
errorsBtn.Icon = GetIcon("StatusError", "EditorIcons"); _errorsBtn.Icon = GetIcon("StatusError", "EditorIcons");
if (warningsBtn != null) if (_warningsBtn != null)
warningsBtn.Icon = GetIcon("NodeWarning", "EditorIcons"); _warningsBtn.Icon = GetIcon("NodeWarning", "EditorIcons");
} }
} }
} }

View file

@ -61,7 +61,7 @@ namespace GodotTools.Build
} }
case BuildTool.JetBrainsMsBuild: case BuildTool.JetBrainsMsBuild:
{ {
var editorPath = (string)editorSettings.GetSetting(RiderPathManager.EditorPathSettingName); string editorPath = (string)editorSettings.GetSetting(RiderPathManager.EditorPathSettingName);
if (!File.Exists(editorPath)) if (!File.Exists(editorPath))
throw new FileNotFoundException($"Cannot find Rider executable. Tried with path: {editorPath}"); throw new FileNotFoundException($"Cannot find Rider executable. Tried with path: {editorPath}");
@ -165,7 +165,9 @@ namespace GodotTools.Build
// Try to find 15.0 with vswhere // Try to find 15.0 with vswhere
var envNames = Internal.GodotIs32Bits() ? new[] {"ProgramFiles", "ProgramW6432"} : new[] {"ProgramFiles(x86)", "ProgramFiles"}; string[] envNames = Internal.GodotIs32Bits() ?
envNames = new[] { "ProgramFiles", "ProgramW6432" } :
envNames = new[] { "ProgramFiles(x86)", "ProgramFiles" };
string vsWherePath = null; string vsWherePath = null;
foreach (var envName in envNames) foreach (var envName in envNames)

View file

@ -73,12 +73,12 @@ namespace GodotTools.Export
if (platform == OS.Platforms.iOS) if (platform == OS.Platforms.iOS)
{ {
var architectures = GetEnablediOSArchs(features).ToArray(); string[] architectures = GetEnablediOSArchs(features).ToArray();
CompileAssembliesForiOS(exporter, isDebug, architectures, aotOpts, aotTempDir, assembliesPrepared, bclDir); CompileAssembliesForiOS(exporter, isDebug, architectures, aotOpts, aotTempDir, assembliesPrepared, bclDir);
} }
else if (platform == OS.Platforms.Android) else if (platform == OS.Platforms.Android)
{ {
var abis = GetEnabledAndroidAbis(features).ToArray(); string[] abis = GetEnabledAndroidAbis(features).ToArray();
CompileAssembliesForAndroid(exporter, isDebug, abis, aotOpts, aotTempDir, assembliesPrepared, bclDir); CompileAssembliesForAndroid(exporter, isDebug, abis, aotOpts, aotTempDir, assembliesPrepared, bclDir);
} }
else else
@ -114,7 +114,7 @@ namespace GodotTools.Export
ExecuteCompiler(FindCrossCompiler(compilerDirPath), compilerArgs, bclDir); ExecuteCompiler(FindCrossCompiler(compilerDirPath), compilerArgs, bclDir);
// The Godot exporter expects us to pass the abi in the tags parameter // The Godot exporter expects us to pass the abi in the tags parameter
exporter.AddSharedObject(soFilePath, tags: new[] {abi}); exporter.AddSharedObject(soFilePath, tags: new[] { abi });
} }
} }
} }
@ -145,7 +145,8 @@ namespace GodotTools.Export
} }
else else
{ {
string outputDataLibDir = Path.Combine(outputDataDir, "Mono", platform == OS.Platforms.Windows ? "bin" : "lib"); string libDir = platform == OS.Platforms.Windows ? "bin" : "lib";
string outputDataLibDir = Path.Combine(outputDataDir, "Mono", libDir);
File.Copy(tempOutputFilePath, Path.Combine(outputDataLibDir, outputFileName)); File.Copy(tempOutputFilePath, Path.Combine(outputDataLibDir, outputFileName));
} }
} }

View file

@ -20,7 +20,7 @@ namespace GodotTools.Export
public class ExportPlugin : EditorExportPlugin public class ExportPlugin : EditorExportPlugin
{ {
[Flags] [Flags]
enum I18NCodesets private enum I18NCodesets
{ {
None = 0, None = 0,
CJK = 1, CJK = 1,
@ -31,6 +31,8 @@ namespace GodotTools.Export
All = CJK | MidEast | Other | Rare | West All = CJK | MidEast | Other | Rare | West
} }
private string _maybeLastExportError;
private void AddI18NAssemblies(Godot.Collections.Dictionary<string, string> assemblies, string bclDir) private void AddI18NAssemblies(Godot.Collections.Dictionary<string, string> assemblies, string bclDir)
{ {
var codesets = (I18NCodesets)ProjectSettings.GetSetting("mono/export/i18n_codesets"); var codesets = (I18NCodesets)ProjectSettings.GetSetting("mono/export/i18n_codesets");
@ -83,8 +85,6 @@ namespace GodotTools.Export
GlobalDef("mono/export/aot/android_toolchain_path", ""); GlobalDef("mono/export/aot/android_toolchain_path", "");
} }
private string maybeLastExportError;
private void AddFile(string srcPath, string dstPath, bool remap = false) private void AddFile(string srcPath, string dstPath, bool remap = false)
{ {
// Add file to the PCK // Add file to the PCK
@ -129,14 +129,14 @@ namespace GodotTools.Export
} }
catch (Exception e) catch (Exception e)
{ {
maybeLastExportError = e.Message; _maybeLastExportError = e.Message;
// 'maybeLastExportError' cannot be null or empty if there was an error, so we // 'maybeLastExportError' cannot be null or empty if there was an error, so we
// must consider the possibility of exceptions being thrown without a message. // must consider the possibility of exceptions being thrown without a message.
if (string.IsNullOrEmpty(maybeLastExportError)) if (string.IsNullOrEmpty(_maybeLastExportError))
maybeLastExportError = $"Exception thrown: {e.GetType().Name}"; _maybeLastExportError = $"Exception thrown: {e.GetType().Name}";
GD.PushError($"Failed to export project: {maybeLastExportError}"); GD.PushError($"Failed to export project: {_maybeLastExportError}");
Console.Error.WriteLine(e); Console.Error.WriteLine(e);
// TODO: Do something on error once _ExportBegin supports failing. // TODO: Do something on error once _ExportBegin supports failing.
} }
@ -320,10 +320,10 @@ namespace GodotTools.Export
Directory.Delete(aotTempDir, recursive: true); Directory.Delete(aotTempDir, recursive: true);
// TODO: Just a workaround until the export plugins can be made to abort with errors // TODO: Just a workaround until the export plugins can be made to abort with errors
if (!string.IsNullOrEmpty(maybeLastExportError)) // Check empty as well, because it's set to empty after hot-reloading if (!string.IsNullOrEmpty(_maybeLastExportError)) // Check empty as well, because it's set to empty after hot-reloading
{ {
string lastExportError = maybeLastExportError; string lastExportError = _maybeLastExportError;
maybeLastExportError = null; _maybeLastExportError = null;
GodotSharpEditor.Instance.ShowErrorDialog(lastExportError, "Failed to export C# project"); GodotSharpEditor.Instance.ShowErrorDialog(lastExportError, "Failed to export C# project");
} }
@ -473,7 +473,7 @@ namespace GodotTools.Export
private static string DetermineDataDirNameForProject() private static string DetermineDataDirNameForProject()
{ {
var appName = (string)ProjectSettings.GetSetting("application/config/name"); string appName = (string)ProjectSettings.GetSetting("application/config/name");
string appNameSafe = appName.ToSafeDirName(); string appNameSafe = appName.ToSafeDirName();
return $"data_{appNameSafe}"; return $"data_{appNameSafe}";
} }

View file

@ -21,19 +21,20 @@ namespace GodotTools
{ {
public class GodotSharpEditor : EditorPlugin, ISerializationListener public class GodotSharpEditor : EditorPlugin, ISerializationListener
{ {
private EditorSettings editorSettings; private EditorSettings _editorSettings;
private PopupMenu menuPopup; private PopupMenu _menuPopup;
private AcceptDialog errorDialog; private AcceptDialog _errorDialog;
private ToolButton bottomPanelBtn; private ToolButton _bottomPanelBtn;
private ToolButton toolBarButton; private ToolButton _toolBarButton;
// TODO Use WeakReference once we have proper serialization.
private WeakRef _exportPluginWeak;
public GodotIdeManager GodotIdeManager { get; private set; } public GodotIdeManager GodotIdeManager { get; private set; }
private WeakRef exportPluginWeak; // TODO Use WeakReference once we have proper serialization
public MSBuildPanel MSBuildPanel { get; private set; } public MSBuildPanel MSBuildPanel { get; private set; }
public bool SkipBuildBeforePlaying { get; set; } = false; public bool SkipBuildBeforePlaying { get; set; } = false;
@ -42,7 +43,7 @@ namespace GodotTools
{ {
get get
{ {
var projectAssemblyName = (string)ProjectSettings.GetSetting("application/config/name"); string projectAssemblyName = (string)ProjectSettings.GetSetting("application/config/name");
projectAssemblyName = projectAssemblyName.ToSafeDirName(); projectAssemblyName = projectAssemblyName.ToSafeDirName();
if (string.IsNullOrEmpty(projectAssemblyName)) if (string.IsNullOrEmpty(projectAssemblyName))
projectAssemblyName = "UnnamedProject"; projectAssemblyName = "UnnamedProject";
@ -123,9 +124,9 @@ namespace GodotTools
private void _RemoveCreateSlnMenuOption() private void _RemoveCreateSlnMenuOption()
{ {
menuPopup.RemoveItem(menuPopup.GetItemIndex((int)MenuOptions.CreateSln)); _menuPopup.RemoveItem(_menuPopup.GetItemIndex((int)MenuOptions.CreateSln));
bottomPanelBtn.Show(); _bottomPanelBtn.Show();
toolBarButton.Show(); _toolBarButton.Show();
} }
private void _MenuOptionPressed(MenuOptions id) private void _MenuOptionPressed(MenuOptions id)
@ -201,9 +202,9 @@ namespace GodotTools
public void ShowErrorDialog(string message, string title = "Error") public void ShowErrorDialog(string message, string title = "Error")
{ {
errorDialog.WindowTitle = title; _errorDialog.WindowTitle = title;
errorDialog.DialogText = message; _errorDialog.DialogText = message;
errorDialog.PopupCenteredMinsize(); _errorDialog.PopupCenteredMinsize();
} }
private static string _vsCodePath = string.Empty; private static string _vsCodePath = string.Empty;
@ -216,7 +217,7 @@ namespace GodotTools
[UsedImplicitly] [UsedImplicitly]
public Error OpenInExternalEditor(Script script, int line, int col) public Error OpenInExternalEditor(Script script, int line, int col)
{ {
var editorId = (ExternalEditorId)editorSettings.GetSetting("mono/editor/external_editor"); var editorId = (ExternalEditorId)_editorSettings.GetSetting("mono/editor/external_editor");
switch (editorId) switch (editorId)
{ {
@ -272,7 +273,6 @@ namespace GodotTools
break; break;
} }
case ExternalEditorId.VsCode: case ExternalEditorId.VsCode:
{ {
if (string.IsNullOrEmpty(_vsCodePath) || !File.Exists(_vsCodePath)) if (string.IsNullOrEmpty(_vsCodePath) || !File.Exists(_vsCodePath))
@ -308,7 +308,7 @@ namespace GodotTools
} }
} }
var resourcePath = ProjectSettings.GlobalizePath("res://"); string resourcePath = ProjectSettings.GlobalizePath("res://");
args.Add(resourcePath); args.Add(resourcePath);
string scriptPath = ProjectSettings.GlobalizePath(script.ResourcePath); string scriptPath = ProjectSettings.GlobalizePath(script.ResourcePath);
@ -357,7 +357,6 @@ namespace GodotTools
break; break;
} }
default: default:
throw new ArgumentOutOfRangeException(); throw new ArgumentOutOfRangeException();
} }
@ -368,7 +367,7 @@ namespace GodotTools
[UsedImplicitly] [UsedImplicitly]
public bool OverridesExternalEditor() public bool OverridesExternalEditor()
{ {
return (ExternalEditorId)editorSettings.GetSetting("mono/editor/external_editor") != ExternalEditorId.None; return (ExternalEditorId)_editorSettings.GetSetting("mono/editor/external_editor") != ExternalEditorId.None;
} }
public override bool Build() public override bool Build()
@ -409,8 +408,8 @@ namespace GodotTools
private void BuildStateChanged() private void BuildStateChanged()
{ {
if (bottomPanelBtn != null) if (_bottomPanelBtn != null)
bottomPanelBtn.Icon = MSBuildPanel.BuildOutputView.BuildStateIcon; _bottomPanelBtn.Icon = MSBuildPanel.BuildOutputView.BuildStateIcon;
} }
public override void EnablePlugin() public override void EnablePlugin()
@ -424,25 +423,25 @@ namespace GodotTools
var editorInterface = GetEditorInterface(); var editorInterface = GetEditorInterface();
var editorBaseControl = editorInterface.GetBaseControl(); var editorBaseControl = editorInterface.GetBaseControl();
editorSettings = editorInterface.GetEditorSettings(); _editorSettings = editorInterface.GetEditorSettings();
errorDialog = new AcceptDialog(); _errorDialog = new AcceptDialog();
editorBaseControl.AddChild(errorDialog); editorBaseControl.AddChild(_errorDialog);
MSBuildPanel = new MSBuildPanel(); MSBuildPanel = new MSBuildPanel();
bottomPanelBtn = AddControlToBottomPanel(MSBuildPanel, "MSBuild".TTR()); _bottomPanelBtn = AddControlToBottomPanel(MSBuildPanel, "MSBuild".TTR());
AddChild(new HotReloadAssemblyWatcher {Name = "HotReloadAssemblyWatcher"}); AddChild(new HotReloadAssemblyWatcher {Name = "HotReloadAssemblyWatcher"});
menuPopup = new PopupMenu(); _menuPopup = new PopupMenu();
menuPopup.Hide(); _menuPopup.Hide();
menuPopup.SetAsToplevel(true); _menuPopup.SetAsToplevel(true);
AddToolSubmenuItem("C#", menuPopup); AddToolSubmenuItem("C#", _menuPopup);
var buildSolutionShortcut = (ShortCut)EditorShortcut("mono/build_solution"); var buildSolutionShortcut = (ShortCut)EditorShortcut("mono/build_solution");
toolBarButton = new ToolButton _toolBarButton = new ToolButton
{ {
Text = "Build", Text = "Build",
HintTooltip = "Build Solution".TTR(), HintTooltip = "Build Solution".TTR(),
@ -450,8 +449,8 @@ namespace GodotTools
Shortcut = buildSolutionShortcut, Shortcut = buildSolutionShortcut,
ShortcutInTooltip = true ShortcutInTooltip = true
}; };
toolBarButton.Connect("pressed", this, nameof(BuildSolutionPressed)); _toolBarButton.Connect("pressed", this, nameof(BuildSolutionPressed));
AddControlToContainer(CustomControlContainer.Toolbar, toolBarButton); AddControlToContainer(CustomControlContainer.Toolbar, _toolBarButton);
if (File.Exists(GodotSharpDirs.ProjectSlnPath) && File.Exists(GodotSharpDirs.ProjectCsProjPath)) if (File.Exists(GodotSharpDirs.ProjectSlnPath) && File.Exists(GodotSharpDirs.ProjectCsProjPath))
{ {
@ -459,12 +458,12 @@ namespace GodotTools
} }
else else
{ {
bottomPanelBtn.Hide(); _bottomPanelBtn.Hide();
toolBarButton.Hide(); _toolBarButton.Hide();
menuPopup.AddItem("Create C# solution".TTR(), (int)MenuOptions.CreateSln); _menuPopup.AddItem("Create C# solution".TTR(), (int)MenuOptions.CreateSln);
} }
menuPopup.Connect("id_pressed", this, nameof(_MenuOptionPressed)); _menuPopup.Connect("id_pressed", this, nameof(_MenuOptionPressed));
// External editor settings // External editor settings
EditorDef("mono/editor/external_editor", ExternalEditorId.None); EditorDef("mono/editor/external_editor", ExternalEditorId.None);
@ -492,7 +491,7 @@ namespace GodotTools
$",JetBrains Rider:{(int)ExternalEditorId.Rider}"; $",JetBrains Rider:{(int)ExternalEditorId.Rider}";
} }
editorSettings.AddPropertyInfo(new Godot.Collections.Dictionary _editorSettings.AddPropertyInfo(new Godot.Collections.Dictionary
{ {
["type"] = Variant.Type.Int, ["type"] = Variant.Type.Int,
["name"] = "mono/editor/external_editor", ["name"] = "mono/editor/external_editor",
@ -504,7 +503,7 @@ namespace GodotTools
var exportPlugin = new ExportPlugin(); var exportPlugin = new ExportPlugin();
AddExportPlugin(exportPlugin); AddExportPlugin(exportPlugin);
exportPlugin.RegisterExportSettings(); exportPlugin.RegisterExportSettings();
exportPluginWeak = WeakRef(exportPlugin); _exportPluginWeak = WeakRef(exportPlugin);
BuildManager.Initialize(); BuildManager.Initialize();
RiderPathManager.Initialize(); RiderPathManager.Initialize();
@ -517,15 +516,15 @@ namespace GodotTools
{ {
base.Dispose(disposing); base.Dispose(disposing);
if (exportPluginWeak != null) if (_exportPluginWeak != null)
{ {
// We need to dispose our export plugin before the editor destroys EditorSettings. // We need to dispose our export plugin before the editor destroys EditorSettings.
// Otherwise, if the GC disposes it at a later time, EditorExportPlatformAndroid // Otherwise, if the GC disposes it at a later time, EditorExportPlatformAndroid
// will be freed after EditorSettings already was, and its device polling thread // will be freed after EditorSettings already was, and its device polling thread
// will try to access the EditorSettings singleton, resulting in null dereferencing. // will try to access the EditorSettings singleton, resulting in null dereferencing.
(exportPluginWeak.GetRef() as ExportPlugin)?.Dispose(); (_exportPluginWeak.GetRef() as ExportPlugin)?.Dispose();
exportPluginWeak.Dispose(); _exportPluginWeak.Dispose();
} }
GodotIdeManager?.Dispose(); GodotIdeManager?.Dispose();

View file

@ -6,7 +6,7 @@ namespace GodotTools
{ {
public class HotReloadAssemblyWatcher : Node public class HotReloadAssemblyWatcher : Node
{ {
private Timer watchTimer; private Timer _watchTimer;
public override void _Notification(int what) public override void _Notification(int what)
{ {
@ -27,22 +27,22 @@ namespace GodotTools
public void RestartTimer() public void RestartTimer()
{ {
watchTimer.Stop(); _watchTimer.Stop();
watchTimer.Start(); _watchTimer.Start();
} }
public override void _Ready() public override void _Ready()
{ {
base._Ready(); base._Ready();
watchTimer = new Timer _watchTimer = new Timer
{ {
OneShot = false, OneShot = false,
WaitTime = (float)EditorDef("mono/assembly_watch_interval_sec", 0.5) WaitTime = (float)EditorDef("mono/assembly_watch_interval_sec", 0.5)
}; };
watchTimer.Connect("timeout", this, nameof(TimerTimeout)); _watchTimer.Connect("timeout", this, nameof(TimerTimeout));
AddChild(watchTimer); AddChild(_watchTimer);
watchTimer.Start(); _watchTimer.Start();
} }
} }
} }

View file

@ -10,22 +10,22 @@ namespace GodotTools.Ides
{ {
public sealed class GodotIdeManager : Node, ISerializationListener public sealed class GodotIdeManager : Node, ISerializationListener
{ {
private MessagingServer MessagingServer { get; set; } private MessagingServer _messagingServer;
private MonoDevelop.Instance monoDevelInstance; private MonoDevelop.Instance _monoDevelInstance;
private MonoDevelop.Instance vsForMacInstance; private MonoDevelop.Instance _vsForMacInstance;
private MessagingServer GetRunningOrNewServer() private MessagingServer GetRunningOrNewServer()
{ {
if (MessagingServer != null && !MessagingServer.IsDisposed) if (_messagingServer != null && !_messagingServer.IsDisposed)
return MessagingServer; return _messagingServer;
MessagingServer?.Dispose(); _messagingServer?.Dispose();
MessagingServer = new MessagingServer(OS.GetExecutablePath(), ProjectSettings.GlobalizePath(GodotSharpDirs.ResMetadataDir), new GodotLogger()); _messagingServer = new MessagingServer(OS.GetExecutablePath(), ProjectSettings.GlobalizePath(GodotSharpDirs.ResMetadataDir), new GodotLogger());
_ = MessagingServer.Listen(); _ = _messagingServer.Listen();
return MessagingServer; return _messagingServer;
} }
public override void _Ready() public override void _Ready()
@ -48,7 +48,7 @@ namespace GodotTools.Ides
if (disposing) if (disposing)
{ {
MessagingServer?.Dispose(); _messagingServer?.Dispose();
} }
} }
@ -113,14 +113,14 @@ namespace GodotTools.Ides
{ {
if (Utils.OS.IsOSX && editorId == ExternalEditorId.VisualStudioForMac) if (Utils.OS.IsOSX && editorId == ExternalEditorId.VisualStudioForMac)
{ {
vsForMacInstance = (vsForMacInstance?.IsDisposed ?? true ? null : vsForMacInstance) ?? _vsForMacInstance = (_vsForMacInstance?.IsDisposed ?? true ? null : _vsForMacInstance) ??
new MonoDevelop.Instance(solutionPath, MonoDevelop.EditorId.VisualStudioForMac); new MonoDevelop.Instance(solutionPath, MonoDevelop.EditorId.VisualStudioForMac);
return vsForMacInstance; return _vsForMacInstance;
} }
monoDevelInstance = (monoDevelInstance?.IsDisposed ?? true ? null : monoDevelInstance) ?? _monoDevelInstance = (_monoDevelInstance?.IsDisposed ?? true ? null : _monoDevelInstance) ??
new MonoDevelop.Instance(solutionPath, MonoDevelop.EditorId.MonoDevelop); new MonoDevelop.Instance(solutionPath, MonoDevelop.EditorId.MonoDevelop);
return monoDevelInstance; return _monoDevelInstance;
} }
try try
@ -157,17 +157,17 @@ namespace GodotTools.Ides
} }
} }
public struct EditorPick public readonly struct EditorPick
{ {
private readonly string identity; private readonly string _identity;
public EditorPick(string identity) public EditorPick(string identity)
{ {
this.identity = identity; _identity = identity;
} }
public bool IsAnyConnected() => public bool IsAnyConnected() =>
GodotSharpEditor.Instance.GodotIdeManager.GetRunningOrNewServer().IsAnyConnected(identity); GodotSharpEditor.Instance.GodotIdeManager.GetRunningOrNewServer().IsAnyConnected(_identity);
private void SendRequest<TResponse>(Request request) private void SendRequest<TResponse>(Request request)
where TResponse : Response, new() where TResponse : Response, new()
@ -175,7 +175,7 @@ namespace GodotTools.Ides
// Logs an error if no client is connected with the specified identity // Logs an error if no client is connected with the specified identity
GodotSharpEditor.Instance.GodotIdeManager GodotSharpEditor.Instance.GodotIdeManager
.GetRunningOrNewServer() .GetRunningOrNewServer()
.BroadcastRequest<TResponse>(identity, request); .BroadcastRequest<TResponse>(_identity, request);
} }
public void SendOpenFile(string file) public void SendOpenFile(string file)

View file

@ -21,24 +21,26 @@ namespace GodotTools.Ides
{ {
public sealed class MessagingServer : IDisposable public sealed class MessagingServer : IDisposable
{ {
private readonly ILogger logger; private readonly ILogger _logger;
private readonly FileStream metaFile; private readonly FileStream _metaFile;
private string MetaFilePath { get; } private string _metaFilePath;
private readonly SemaphoreSlim peersSem = new SemaphoreSlim(1); private readonly SemaphoreSlim _peersSem = new SemaphoreSlim(1);
private readonly TcpListener listener; private readonly TcpListener _listener;
private readonly Dictionary<string, Queue<NotifyAwaiter<bool>>> clientConnectedAwaiters = new Dictionary<string, Queue<NotifyAwaiter<bool>>>(); private readonly Dictionary<string, Queue<NotifyAwaiter<bool>>> _clientConnectedAwaiters =
private readonly Dictionary<string, Queue<NotifyAwaiter<bool>>> clientDisconnectedAwaiters = new Dictionary<string, Queue<NotifyAwaiter<bool>>>(); new Dictionary<string, Queue<NotifyAwaiter<bool>>>();
private readonly Dictionary<string, Queue<NotifyAwaiter<bool>>> _clientDisconnectedAwaiters =
new Dictionary<string, Queue<NotifyAwaiter<bool>>>();
public async Task<bool> AwaitClientConnected(string identity) public async Task<bool> AwaitClientConnected(string identity)
{ {
if (!clientConnectedAwaiters.TryGetValue(identity, out var queue)) if (!_clientConnectedAwaiters.TryGetValue(identity, out var queue))
{ {
queue = new Queue<NotifyAwaiter<bool>>(); queue = new Queue<NotifyAwaiter<bool>>();
clientConnectedAwaiters.Add(identity, queue); _clientConnectedAwaiters.Add(identity, queue);
} }
var awaiter = new NotifyAwaiter<bool>(); var awaiter = new NotifyAwaiter<bool>();
@ -48,10 +50,10 @@ namespace GodotTools.Ides
public async Task<bool> AwaitClientDisconnected(string identity) public async Task<bool> AwaitClientDisconnected(string identity)
{ {
if (!clientDisconnectedAwaiters.TryGetValue(identity, out var queue)) if (!_clientDisconnectedAwaiters.TryGetValue(identity, out var queue))
{ {
queue = new Queue<NotifyAwaiter<bool>>(); queue = new Queue<NotifyAwaiter<bool>>();
clientDisconnectedAwaiters.Add(identity, queue); _clientDisconnectedAwaiters.Add(identity, queue);
} }
var awaiter = new NotifyAwaiter<bool>(); var awaiter = new NotifyAwaiter<bool>();
@ -77,7 +79,7 @@ namespace GodotTools.Ides
if (IsDisposed) if (IsDisposed)
return; return;
using (await peersSem.UseAsync()) using (await _peersSem.UseAsync())
{ {
if (IsDisposed) // lock may not be fair if (IsDisposed) // lock may not be fair
return; return;
@ -95,19 +97,19 @@ namespace GodotTools.Ides
foreach (var connection in Peers) foreach (var connection in Peers)
connection.Dispose(); connection.Dispose();
Peers.Clear(); Peers.Clear();
listener?.Stop(); _listener?.Stop();
metaFile?.Dispose(); _metaFile?.Dispose();
File.Delete(MetaFilePath); File.Delete(_metaFilePath);
} }
} }
public MessagingServer(string editorExecutablePath, string projectMetadataDir, ILogger logger) public MessagingServer(string editorExecutablePath, string projectMetadataDir, ILogger logger)
{ {
this.logger = logger; this._logger = logger;
MetaFilePath = Path.Combine(projectMetadataDir, GodotIdeMetadata.DefaultFileName); _metaFilePath = Path.Combine(projectMetadataDir, GodotIdeMetadata.DefaultFileName);
// Make sure the directory exists // Make sure the directory exists
Directory.CreateDirectory(projectMetadataDir); Directory.CreateDirectory(projectMetadataDir);
@ -115,13 +117,13 @@ namespace GodotTools.Ides
// The Godot editor's file system thread can keep the file open for writing, so we are forced to allow write sharing... // The Godot editor's file system thread can keep the file open for writing, so we are forced to allow write sharing...
const FileShare metaFileShare = FileShare.ReadWrite; const FileShare metaFileShare = FileShare.ReadWrite;
metaFile = File.Open(MetaFilePath, FileMode.Create, FileAccess.Write, metaFileShare); _metaFile = File.Open(_metaFilePath, FileMode.Create, FileAccess.Write, metaFileShare);
listener = new TcpListener(new IPEndPoint(IPAddress.Loopback, port: 0)); _listener = new TcpListener(new IPEndPoint(IPAddress.Loopback, port: 0));
listener.Start(); _listener.Start();
int port = ((IPEndPoint)listener.Server.LocalEndPoint).Port; int port = ((IPEndPoint)_listener.Server.LocalEndPoint).Port;
using (var metaFileWriter = new StreamWriter(metaFile, Encoding.UTF8)) using (var metaFileWriter = new StreamWriter(_metaFile, Encoding.UTF8))
{ {
metaFileWriter.WriteLine(port); metaFileWriter.WriteLine(port);
metaFileWriter.WriteLine(editorExecutablePath); metaFileWriter.WriteLine(editorExecutablePath);
@ -130,30 +132,30 @@ namespace GodotTools.Ides
private async Task AcceptClient(TcpClient tcpClient) private async Task AcceptClient(TcpClient tcpClient)
{ {
logger.LogDebug("Accept client..."); _logger.LogDebug("Accept client...");
using (var peer = new Peer(tcpClient, new ServerHandshake(), new ServerMessageHandler(), logger)) using (var peer = new Peer(tcpClient, new ServerHandshake(), new ServerMessageHandler(), _logger))
{ {
// ReSharper disable AccessToDisposedClosure // ReSharper disable AccessToDisposedClosure
peer.Connected += () => peer.Connected += () =>
{ {
logger.LogInfo("Connection open with Ide Client"); _logger.LogInfo("Connection open with Ide Client");
if (clientConnectedAwaiters.TryGetValue(peer.RemoteIdentity, out var queue)) if (_clientConnectedAwaiters.TryGetValue(peer.RemoteIdentity, out var queue))
{ {
while (queue.Count > 0) while (queue.Count > 0)
queue.Dequeue().SetResult(true); queue.Dequeue().SetResult(true);
clientConnectedAwaiters.Remove(peer.RemoteIdentity); _clientConnectedAwaiters.Remove(peer.RemoteIdentity);
} }
}; };
peer.Disconnected += () => peer.Disconnected += () =>
{ {
if (clientDisconnectedAwaiters.TryGetValue(peer.RemoteIdentity, out var queue)) if (_clientDisconnectedAwaiters.TryGetValue(peer.RemoteIdentity, out var queue))
{ {
while (queue.Count > 0) while (queue.Count > 0)
queue.Dequeue().SetResult(true); queue.Dequeue().SetResult(true);
clientDisconnectedAwaiters.Remove(peer.RemoteIdentity); _clientDisconnectedAwaiters.Remove(peer.RemoteIdentity);
} }
}; };
// ReSharper restore AccessToDisposedClosure // ReSharper restore AccessToDisposedClosure
@ -162,17 +164,17 @@ namespace GodotTools.Ides
{ {
if (!await peer.DoHandshake("server")) if (!await peer.DoHandshake("server"))
{ {
logger.LogError("Handshake failed"); _logger.LogError("Handshake failed");
return; return;
} }
} }
catch (Exception e) catch (Exception e)
{ {
logger.LogError("Handshake failed with unhandled exception: ", e); _logger.LogError("Handshake failed with unhandled exception: ", e);
return; return;
} }
using (await peersSem.UseAsync()) using (await _peersSem.UseAsync())
Peers.Add(peer); Peers.Add(peer);
try try
@ -181,7 +183,7 @@ namespace GodotTools.Ides
} }
finally finally
{ {
using (await peersSem.UseAsync()) using (await _peersSem.UseAsync())
Peers.Remove(peer); Peers.Remove(peer);
} }
} }
@ -192,7 +194,7 @@ namespace GodotTools.Ides
try try
{ {
while (!IsDisposed) while (!IsDisposed)
_ = AcceptClient(await listener.AcceptTcpClientAsync()); _ = AcceptClient(await _listener.AcceptTcpClientAsync());
} }
catch (Exception e) catch (Exception e)
{ {
@ -204,11 +206,11 @@ namespace GodotTools.Ides
public async void BroadcastRequest<TResponse>(string identity, Request request) public async void BroadcastRequest<TResponse>(string identity, Request request)
where TResponse : Response, new() where TResponse : Response, new()
{ {
using (await peersSem.UseAsync()) using (await _peersSem.UseAsync())
{ {
if (!IsAnyConnected(identity)) if (!IsAnyConnected(identity))
{ {
logger.LogError("Cannot write request. No client connected to the Godot Ide Server."); _logger.LogError("Cannot write request. No client connected to the Godot Ide Server.");
return; return;
} }
@ -225,16 +227,19 @@ namespace GodotTools.Ides
private class ServerHandshake : IHandshake private class ServerHandshake : IHandshake
{ {
private static readonly string ServerHandshakeBase = $"{Peer.ServerHandshakeName},Version={Peer.ProtocolVersionMajor}.{Peer.ProtocolVersionMinor}.{Peer.ProtocolVersionRevision}"; private static readonly string _serverHandshakeBase =
private static readonly string ClientHandshakePattern = $@"{Regex.Escape(Peer.ClientHandshakeName)},Version=([0-9]+)\.([0-9]+)\.([0-9]+),([_a-zA-Z][_a-zA-Z0-9]{{0,63}})"; $"{Peer.ServerHandshakeName},Version={Peer.ProtocolVersionMajor}.{Peer.ProtocolVersionMinor}.{Peer.ProtocolVersionRevision}";
public string GetHandshakeLine(string identity) => $"{ServerHandshakeBase},{identity}"; private static readonly string _clientHandshakePattern =
$@"{Regex.Escape(Peer.ClientHandshakeName)},Version=([0-9]+)\.([0-9]+)\.([0-9]+),([_a-zA-Z][_a-zA-Z0-9]{{0,63}})";
public string GetHandshakeLine(string identity) => $"{_serverHandshakeBase},{identity}";
public bool IsValidPeerHandshake(string handshake, out string identity, ILogger logger) public bool IsValidPeerHandshake(string handshake, out string identity, ILogger logger)
{ {
identity = null; identity = null;
var match = Regex.Match(handshake, ClientHandshakePattern); var match = Regex.Match(handshake, _clientHandshakePattern);
if (!match.Success) if (!match.Success)
return false; return false;

View file

@ -10,17 +10,17 @@ namespace GodotTools.Ides.MonoDevelop
public class Instance : IDisposable public class Instance : IDisposable
{ {
public DateTime LaunchTime { get; private set; } public DateTime LaunchTime { get; private set; }
private readonly string solutionFile; private readonly string _solutionFile;
private readonly EditorId editorId; private readonly EditorId _editorId;
private Process process; private Process _process;
public bool IsRunning => process != null && !process.HasExited; public bool IsRunning => _process != null && !_process.HasExited;
public bool IsDisposed { get; private set; } public bool IsDisposed { get; private set; }
public void Execute() public void Execute()
{ {
bool newWindow = process == null || process.HasExited; bool newWindow = _process == null || _process.HasExited;
var args = new List<string>(); var args = new List<string>();
@ -28,7 +28,7 @@ namespace GodotTools.Ides.MonoDevelop
if (OS.IsOSX) if (OS.IsOSX)
{ {
string bundleId = BundleIds[editorId]; string bundleId = BundleIds[_editorId];
if (Internal.IsOsxAppBundleInstalled(bundleId)) if (Internal.IsOsxAppBundleInstalled(bundleId))
{ {
@ -45,18 +45,18 @@ namespace GodotTools.Ides.MonoDevelop
} }
else else
{ {
command = OS.PathWhich(ExecutableNames[editorId]); command = OS.PathWhich(ExecutableNames[_editorId]);
} }
} }
else else
{ {
command = OS.PathWhich(ExecutableNames[editorId]); command = OS.PathWhich(ExecutableNames[_editorId]);
} }
args.Add("--ipc-tcp"); args.Add("--ipc-tcp");
if (newWindow) if (newWindow)
args.Add("\"" + Path.GetFullPath(solutionFile) + "\""); args.Add("\"" + Path.GetFullPath(_solutionFile) + "\"");
if (command == null) if (command == null)
throw new FileNotFoundException(); throw new FileNotFoundException();
@ -65,7 +65,7 @@ namespace GodotTools.Ides.MonoDevelop
if (newWindow) if (newWindow)
{ {
process = Process.Start(new ProcessStartInfo _process = Process.Start(new ProcessStartInfo
{ {
FileName = command, FileName = command,
Arguments = string.Join(" ", args), Arguments = string.Join(" ", args),
@ -88,14 +88,14 @@ namespace GodotTools.Ides.MonoDevelop
if (editorId == EditorId.VisualStudioForMac && !OS.IsOSX) if (editorId == EditorId.VisualStudioForMac && !OS.IsOSX)
throw new InvalidOperationException($"{nameof(EditorId.VisualStudioForMac)} not supported on this platform"); throw new InvalidOperationException($"{nameof(EditorId.VisualStudioForMac)} not supported on this platform");
this.solutionFile = solutionFile; _solutionFile = solutionFile;
this.editorId = editorId; _editorId = editorId;
} }
public void Dispose() public void Dispose()
{ {
IsDisposed = true; IsDisposed = true;
process?.Dispose(); _process?.Dispose();
} }
private static readonly IReadOnlyDictionary<EditorId, string> ExecutableNames; private static readonly IReadOnlyDictionary<EditorId, string> ExecutableNames;

View file

@ -11,6 +11,7 @@ using Environment = System.Environment;
using File = System.IO.File; using File = System.IO.File;
using Path = System.IO.Path; using Path = System.IO.Path;
using OS = GodotTools.Utils.OS; using OS = GodotTools.Utils.OS;
// ReSharper disable UnassignedField.Local // ReSharper disable UnassignedField.Local
// ReSharper disable InconsistentNaming // ReSharper disable InconsistentNaming
// ReSharper disable UnassignedField.Global // ReSharper disable UnassignedField.Global
@ -53,10 +54,10 @@ namespace GodotTools.Ides.Rider
private static RiderInfo[] CollectAllRiderPathsLinux() private static RiderInfo[] CollectAllRiderPathsLinux()
{ {
var installInfos = new List<RiderInfo>(); var installInfos = new List<RiderInfo>();
var home = Environment.GetEnvironmentVariable("HOME"); string home = Environment.GetEnvironmentVariable("HOME");
if (!string.IsNullOrEmpty(home)) if (!string.IsNullOrEmpty(home))
{ {
var toolboxRiderRootPath = GetToolboxBaseDir(); string toolboxRiderRootPath = GetToolboxBaseDir();
installInfos.AddRange(CollectPathsFromToolbox(toolboxRiderRootPath, "bin", "rider.sh", false) installInfos.AddRange(CollectPathsFromToolbox(toolboxRiderRootPath, "bin", "rider.sh", false)
.Select(a => new RiderInfo(a, true)).ToList()); .Select(a => new RiderInfo(a, true)).ToList());
@ -65,12 +66,12 @@ namespace GodotTools.Ides.Rider
if (shortcut.Exists) if (shortcut.Exists)
{ {
var lines = File.ReadAllLines(shortcut.FullName); string[] lines = File.ReadAllLines(shortcut.FullName);
foreach (var line in lines) foreach (string line in lines)
{ {
if (!line.StartsWith("Exec=\"")) if (!line.StartsWith("Exec=\""))
continue; continue;
var path = line.Split('"').Where((item, index) => index == 1).SingleOrDefault(); string path = line.Split('"').Where((item, index) => index == 1).SingleOrDefault();
if (string.IsNullOrEmpty(path)) if (string.IsNullOrEmpty(path))
continue; continue;
@ -82,7 +83,7 @@ namespace GodotTools.Ides.Rider
} }
// snap install // snap install
var snapInstallPath = "/snap/rider/current/bin/rider.sh"; string snapInstallPath = "/snap/rider/current/bin/rider.sh";
if (new FileInfo(snapInstallPath).Exists) if (new FileInfo(snapInstallPath).Exists)
installInfos.Add(new RiderInfo(snapInstallPath, false)); installInfos.Add(new RiderInfo(snapInstallPath, false));
@ -98,15 +99,15 @@ namespace GodotTools.Ides.Rider
if (folder.Exists) if (folder.Exists)
{ {
installInfos.AddRange(folder.GetDirectories("*Rider*.app") installInfos.AddRange(folder.GetDirectories("*Rider*.app")
.Select(a => new RiderInfo(Path.Combine(a.FullName, "Contents/MacOS/rider"), false)) .Select(a => new RiderInfo(Path.Combine(a.FullName, "Contents/MacOS/rider"), false))
.ToList()); .ToList());
} }
// /Users/user/Library/Application Support/JetBrains/Toolbox/apps/Rider/ch-1/181.3870.267/Rider EAP.app // /Users/user/Library/Application Support/JetBrains/Toolbox/apps/Rider/ch-1/181.3870.267/Rider EAP.app
// should be combined with "Contents/MacOS/rider" // should be combined with "Contents/MacOS/rider"
var toolboxRiderRootPath = GetToolboxBaseDir(); string toolboxRiderRootPath = GetToolboxBaseDir();
var paths = CollectPathsFromToolbox(toolboxRiderRootPath, "", "Rider*.app", true) var paths = CollectPathsFromToolbox(toolboxRiderRootPath, "", "Rider*.app", true)
.Select(a => new RiderInfo(Path.Combine(a, "Contents/MacOS/rider"), true)); .Select(a => new RiderInfo(Path.Combine(a, "Contents/MacOS/rider"), true));
installInfos.AddRange(paths); installInfos.AddRange(paths);
return installInfos.ToArray(); return installInfos.ToArray();
@ -134,7 +135,7 @@ namespace GodotTools.Ides.Rider
{ {
if (OS.IsWindows) if (OS.IsWindows)
{ {
var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); string localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
return GetToolboxRiderRootPath(localAppData); return GetToolboxRiderRootPath(localAppData);
} }

View file

@ -49,7 +49,7 @@ namespace GodotTools.Ides.Rider
if (!paths.Any()) if (!paths.Any())
return; return;
var newPath = paths.Last().Path; string newPath = paths.Last().Path;
Globals.EditorDef(EditorPathSettingName, newPath); Globals.EditorDef(EditorPathSettingName, newPath);
editorSettings.SetSetting(EditorPathSettingName, newPath); editorSettings.SetSetting(EditorPathSettingName, newPath);
} }
@ -57,7 +57,8 @@ namespace GodotTools.Ides.Rider
public static bool IsExternalEditorSetToRider(EditorSettings editorSettings) public static bool IsExternalEditorSetToRider(EditorSettings editorSettings)
{ {
return editorSettings.HasSetting(EditorPathSettingName) && IsRider((string)editorSettings.GetSetting(EditorPathSettingName)); return editorSettings.HasSetting(EditorPathSettingName) &&
IsRider((string)editorSettings.GetSetting(EditorPathSettingName));
} }
public static bool IsRider(string path) public static bool IsRider(string path)
@ -66,7 +67,7 @@ namespace GodotTools.Ides.Rider
return false; return false;
var fileInfo = new FileInfo(path); var fileInfo = new FileInfo(path);
var filename = fileInfo.Name.ToLowerInvariant(); string filename = fileInfo.Name.ToLowerInvariant();
return filename.StartsWith("rider", StringComparison.Ordinal); return filename.StartsWith("rider", StringComparison.Ordinal);
} }
@ -83,7 +84,7 @@ namespace GodotTools.Ides.Rider
if (!paths.Any()) if (!paths.Any())
return null; return null;
var newPath = paths.Last().Path; string newPath = paths.Last().Path;
editorSettings.SetSetting(EditorPathSettingName, newPath); editorSettings.SetSetting(EditorPathSettingName, newPath);
Globals.EditorDef(EditorPathSettingName, newPath); Globals.EditorDef(EditorPathSettingName, newPath);
return newPath; return newPath;
@ -96,8 +97,8 @@ namespace GodotTools.Ides.Rider
public static void OpenFile(string slnPath, string scriptPath, int line) public static void OpenFile(string slnPath, string scriptPath, int line)
{ {
var pathFromSettings = GetRiderPathFromSettings(); string pathFromSettings = GetRiderPathFromSettings();
var path = CheckAndUpdatePath(pathFromSettings); string path = CheckAndUpdatePath(pathFromSettings);
var args = new List<string>(); var args = new List<string>();
args.Add(slnPath); args.Add(slnPath);

View file

@ -39,45 +39,57 @@ namespace GodotTools.Internals
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_ResDataDir(); private static extern string internal_ResDataDir();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_ResMetadataDir(); private static extern string internal_ResMetadataDir();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_ResAssembliesBaseDir(); private static extern string internal_ResAssembliesBaseDir();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_ResAssembliesDir(); private static extern string internal_ResAssembliesDir();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_ResConfigDir(); private static extern string internal_ResConfigDir();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_ResTempDir(); private static extern string internal_ResTempDir();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_ResTempAssembliesBaseDir(); private static extern string internal_ResTempAssembliesBaseDir();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_ResTempAssembliesDir(); private static extern string internal_ResTempAssembliesDir();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_MonoUserDir(); private static extern string internal_MonoUserDir();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_MonoLogsDir(); private static extern string internal_MonoLogsDir();
#region Tools-only #region Tools-only
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_MonoSolutionsDir(); private static extern string internal_MonoSolutionsDir();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_BuildLogsDirs(); private static extern string internal_BuildLogsDirs();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_ProjectSlnPath(); private static extern string internal_ProjectSlnPath();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_ProjectCsProjPath(); private static extern string internal_ProjectCsProjPath();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_DataEditorToolsDir(); private static extern string internal_DataEditorToolsDir();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_DataEditorPrebuiltApiDir(); private static extern string internal_DataEditorPrebuiltApiDir();
#endregion #endregion
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_DataMonoEtcDir(); private static extern string internal_DataMonoEtcDir();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
private static extern string internal_DataMonoLibDir(); private static extern string internal_DataMonoLibDir();

View file

@ -8,7 +8,7 @@ namespace GodotTools.Utils
{ {
public static class FsPathUtils public static class FsPathUtils
{ {
private static readonly string ResourcePath = ProjectSettings.GlobalizePath("res://"); private static readonly string _resourcePath = ProjectSettings.GlobalizePath("res://");
private static bool PathStartsWithAlreadyNorm(this string childPath, string parentPath) private static bool PathStartsWithAlreadyNorm(this string childPath, string parentPath)
{ {
@ -34,7 +34,7 @@ namespace GodotTools.Utils
public static string LocalizePathWithCaseChecked(string path) public static string LocalizePathWithCaseChecked(string path)
{ {
string pathNorm = path.NormalizePath() + Path.DirectorySeparatorChar; string pathNorm = path.NormalizePath() + Path.DirectorySeparatorChar;
string resourcePathNorm = ResourcePath.NormalizePath() + Path.DirectorySeparatorChar; string resourcePathNorm = _resourcePath.NormalizePath() + Path.DirectorySeparatorChar;
if (!pathNorm.PathStartsWithAlreadyNorm(resourcePathNorm)) if (!pathNorm.PathStartsWithAlreadyNorm(resourcePathNorm))
return null; return null;

View file

@ -13,10 +13,10 @@ namespace GodotTools.Utils
public static class OS public static class OS
{ {
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
static extern string GetPlatformName(); private static extern string GetPlatformName();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
static extern bool UnixFileHasExecutableAccess(string filePath); private static extern bool UnixFileHasExecutableAccess(string filePath);
public static class Names public static class Names
{ {
@ -96,7 +96,10 @@ namespace GodotTools.Utils
public static string PathWhich([NotNull] string name) public static string PathWhich([NotNull] string name)
{ {
return IsWindows ? PathWhichWindows(name) : PathWhichUnix(name); if (IsWindows)
return PathWhichWindows(name);
return PathWhichUnix(name);
} }
private static string PathWhichWindows([NotNull] string name) private static string PathWhichWindows([NotNull] string name)
@ -119,7 +122,8 @@ namespace GodotTools.Utils
} }
string nameExt = Path.GetExtension(name); string nameExt = Path.GetExtension(name);
bool hasPathExt = !string.IsNullOrEmpty(nameExt) && windowsExts.Contains(nameExt, StringComparer.OrdinalIgnoreCase); bool hasPathExt = !string.IsNullOrEmpty(nameExt) &&
windowsExts.Contains(nameExt, StringComparer.OrdinalIgnoreCase);
searchDirs.Add(System.IO.Directory.GetCurrentDirectory()); // last in the list searchDirs.Add(System.IO.Directory.GetCurrentDirectory()); // last in the list

View file

@ -939,7 +939,7 @@ Error BindingsGenerator::generate_cs_core_project(const String &p_proj_dir) {
#define ADD_INTERNAL_CALL(m_icall) \ #define ADD_INTERNAL_CALL(m_icall) \
if (!m_icall.editor_only) { \ if (!m_icall.editor_only) { \
cs_icalls_content.append(MEMBER_BEGIN "[MethodImpl(MethodImplOptions.InternalCall)]\n"); \ cs_icalls_content.append(MEMBER_BEGIN "[MethodImpl(MethodImplOptions.InternalCall)]\n"); \
cs_icalls_content.append(INDENT2 "internal extern static "); \ cs_icalls_content.append(INDENT2 "internal static extern "); \
cs_icalls_content.append(m_icall.im_type_out + " "); \ cs_icalls_content.append(m_icall.im_type_out + " "); \
cs_icalls_content.append(m_icall.name + "("); \ cs_icalls_content.append(m_icall.name + "("); \
cs_icalls_content.append(m_icall.im_sig + ");\n"); \ cs_icalls_content.append(m_icall.im_sig + ");\n"); \
@ -1043,7 +1043,7 @@ Error BindingsGenerator::generate_cs_editor_project(const String &p_proj_dir) {
#define ADD_INTERNAL_CALL(m_icall) \ #define ADD_INTERNAL_CALL(m_icall) \
if (m_icall.editor_only) { \ if (m_icall.editor_only) { \
cs_icalls_content.append(MEMBER_BEGIN "[MethodImpl(MethodImplOptions.InternalCall)]\n"); \ cs_icalls_content.append(MEMBER_BEGIN "[MethodImpl(MethodImplOptions.InternalCall)]\n"); \
cs_icalls_content.append(INDENT2 "internal extern static "); \ cs_icalls_content.append(INDENT2 "internal static extern "); \
cs_icalls_content.append(m_icall.im_type_out + " "); \ cs_icalls_content.append(m_icall.im_type_out + " "); \
cs_icalls_content.append(m_icall.name + "("); \ cs_icalls_content.append(m_icall.name + "("); \
cs_icalls_content.append(m_icall.im_sig + ");\n"); \ cs_icalls_content.append(m_icall.im_sig + ");\n"); \

View file

@ -75,17 +75,17 @@ namespace Godot
/// </returns> /// </returns>
public bool Encloses(AABB with) public bool Encloses(AABB with)
{ {
Vector3 src_min = _position; Vector3 srcMin = _position;
Vector3 src_max = _position + _size; Vector3 srcMax = _position + _size;
Vector3 dst_min = with._position; Vector3 dstMin = with._position;
Vector3 dst_max = with._position + with._size; Vector3 dstMax = with._position + with._size;
return src_min.x <= dst_min.x && return srcMin.x <= dstMin.x &&
src_max.x > dst_max.x && srcMax.x > dstMax.x &&
src_min.y <= dst_min.y && srcMin.y <= dstMin.y &&
src_max.y > dst_max.y && srcMax.y > dstMax.y &&
src_min.z <= dst_min.z && srcMin.z <= dstMin.z &&
src_max.z > dst_max.z; srcMax.z > dstMax.z;
} }
/// <summary> /// <summary>
@ -162,7 +162,8 @@ namespace Godot
case 7: case 7:
return new Vector3(_position.x + _size.x, _position.y + _size.y, _position.z + _size.z); return new Vector3(_position.x + _size.x, _position.y + _size.y, _position.z + _size.z);
default: default:
throw new ArgumentOutOfRangeException(nameof(idx), String.Format("Index is {0}, but a value from 0 to 7 is expected.", idx)); throw new ArgumentOutOfRangeException(nameof(idx),
$"Index is {idx}, but a value from 0 to 7 is expected.");
} }
} }
@ -173,15 +174,15 @@ namespace Godot
public Vector3 GetLongestAxis() public Vector3 GetLongestAxis()
{ {
var axis = new Vector3(1f, 0f, 0f); var axis = new Vector3(1f, 0f, 0f);
real_t max_size = _size.x; real_t maxSize = _size.x;
if (_size.y > max_size) if (_size.y > maxSize)
{ {
axis = new Vector3(0f, 1f, 0f); axis = new Vector3(0f, 1f, 0f);
max_size = _size.y; maxSize = _size.y;
} }
if (_size.z > max_size) if (_size.z > maxSize)
{ {
axis = new Vector3(0f, 0f, 1f); axis = new Vector3(0f, 0f, 1f);
} }
@ -196,15 +197,15 @@ namespace Godot
public Vector3.Axis GetLongestAxisIndex() public Vector3.Axis GetLongestAxisIndex()
{ {
var axis = Vector3.Axis.X; var axis = Vector3.Axis.X;
real_t max_size = _size.x; real_t maxSize = _size.x;
if (_size.y > max_size) if (_size.y > maxSize)
{ {
axis = Vector3.Axis.Y; axis = Vector3.Axis.Y;
max_size = _size.y; maxSize = _size.y;
} }
if (_size.z > max_size) if (_size.z > maxSize)
{ {
axis = Vector3.Axis.Z; axis = Vector3.Axis.Z;
} }
@ -218,15 +219,15 @@ namespace Godot
/// <returns>The scalar length of the longest axis of the <see cref="AABB"/>.</returns> /// <returns>The scalar length of the longest axis of the <see cref="AABB"/>.</returns>
public real_t GetLongestAxisSize() public real_t GetLongestAxisSize()
{ {
real_t max_size = _size.x; real_t maxSize = _size.x;
if (_size.y > max_size) if (_size.y > maxSize)
max_size = _size.y; maxSize = _size.y;
if (_size.z > max_size) if (_size.z > maxSize)
max_size = _size.z; maxSize = _size.z;
return max_size; return maxSize;
} }
/// <summary> /// <summary>
@ -236,15 +237,15 @@ namespace Godot
public Vector3 GetShortestAxis() public Vector3 GetShortestAxis()
{ {
var axis = new Vector3(1f, 0f, 0f); var axis = new Vector3(1f, 0f, 0f);
real_t max_size = _size.x; real_t maxSize = _size.x;
if (_size.y < max_size) if (_size.y < maxSize)
{ {
axis = new Vector3(0f, 1f, 0f); axis = new Vector3(0f, 1f, 0f);
max_size = _size.y; maxSize = _size.y;
} }
if (_size.z < max_size) if (_size.z < maxSize)
{ {
axis = new Vector3(0f, 0f, 1f); axis = new Vector3(0f, 0f, 1f);
} }
@ -259,15 +260,15 @@ namespace Godot
public Vector3.Axis GetShortestAxisIndex() public Vector3.Axis GetShortestAxisIndex()
{ {
var axis = Vector3.Axis.X; var axis = Vector3.Axis.X;
real_t max_size = _size.x; real_t maxSize = _size.x;
if (_size.y < max_size) if (_size.y < maxSize)
{ {
axis = Vector3.Axis.Y; axis = Vector3.Axis.Y;
max_size = _size.y; maxSize = _size.y;
} }
if (_size.z < max_size) if (_size.z < maxSize)
{ {
axis = Vector3.Axis.Z; axis = Vector3.Axis.Z;
} }
@ -281,15 +282,15 @@ namespace Godot
/// <returns>The scalar length of the shortest axis of the <see cref="AABB"/>.</returns> /// <returns>The scalar length of the shortest axis of the <see cref="AABB"/>.</returns>
public real_t GetShortestAxisSize() public real_t GetShortestAxisSize()
{ {
real_t max_size = _size.x; real_t maxSize = _size.x;
if (_size.y < max_size) if (_size.y < maxSize)
max_size = _size.y; maxSize = _size.y;
if (_size.z < max_size) if (_size.z < maxSize)
max_size = _size.z; maxSize = _size.z;
return max_size; return maxSize;
} }
/// <summary> /// <summary>
@ -300,13 +301,13 @@ namespace Godot
/// <returns>A vector representing the support.</returns> /// <returns>A vector representing the support.</returns>
public Vector3 GetSupport(Vector3 dir) public Vector3 GetSupport(Vector3 dir)
{ {
Vector3 half_extents = _size * 0.5f; Vector3 halfExtents = _size * 0.5f;
Vector3 ofs = _position + half_extents; Vector3 ofs = _position + halfExtents;
return ofs + new Vector3( return ofs + new Vector3(
dir.x > 0f ? -half_extents.x : half_extents.x, dir.x > 0f ? -halfExtents.x : halfExtents.x,
dir.y > 0f ? -half_extents.y : half_extents.y, dir.y > 0f ? -halfExtents.y : halfExtents.y,
dir.z > 0f ? -half_extents.z : half_extents.z); dir.z > 0f ? -halfExtents.z : halfExtents.z);
} }
/// <summary> /// <summary>
@ -316,7 +317,7 @@ namespace Godot
/// <returns>The grown <see cref="AABB"/>.</returns> /// <returns>The grown <see cref="AABB"/>.</returns>
public AABB Grow(real_t by) public AABB Grow(real_t by)
{ {
var res = this; AABB res = this;
res._position.x -= by; res._position.x -= by;
res._position.y -= by; res._position.y -= by;
@ -385,36 +386,36 @@ namespace Godot
/// <returns>The clipped <see cref="AABB"/>.</returns> /// <returns>The clipped <see cref="AABB"/>.</returns>
public AABB Intersection(AABB with) public AABB Intersection(AABB with)
{ {
Vector3 src_min = _position; Vector3 srcMin = _position;
Vector3 src_max = _position + _size; Vector3 srcMax = _position + _size;
Vector3 dst_min = with._position; Vector3 dstMin = with._position;
Vector3 dst_max = with._position + with._size; Vector3 dstMax = with._position + with._size;
Vector3 min, max; Vector3 min, max;
if (src_min.x > dst_max.x || src_max.x < dst_min.x) if (srcMin.x > dstMax.x || srcMax.x < dstMin.x)
{ {
return new AABB(); return new AABB();
} }
min.x = src_min.x > dst_min.x ? src_min.x : dst_min.x; min.x = srcMin.x > dstMin.x ? srcMin.x : dstMin.x;
max.x = src_max.x < dst_max.x ? src_max.x : dst_max.x; max.x = srcMax.x < dstMax.x ? srcMax.x : dstMax.x;
if (src_min.y > dst_max.y || src_max.y < dst_min.y) if (srcMin.y > dstMax.y || srcMax.y < dstMin.y)
{ {
return new AABB(); return new AABB();
} }
min.y = src_min.y > dst_min.y ? src_min.y : dst_min.y; min.y = srcMin.y > dstMin.y ? srcMin.y : dstMin.y;
max.y = src_max.y < dst_max.y ? src_max.y : dst_max.y; max.y = srcMax.y < dstMax.y ? srcMax.y : dstMax.y;
if (src_min.z > dst_max.z || src_max.z < dst_min.z) if (srcMin.z > dstMax.z || srcMax.z < dstMin.z)
{ {
return new AABB(); return new AABB();
} }
min.z = src_min.z > dst_min.z ? src_min.z : dst_min.z; min.z = srcMin.z > dstMin.z ? srcMin.z : dstMin.z;
max.z = src_max.z < dst_max.z ? src_max.z : dst_max.z; max.z = srcMax.z < dstMax.z ? srcMax.z : dstMax.z;
return new AABB(min, max - min); return new AABB(min, max - min);
} }
@ -583,16 +584,16 @@ namespace Godot
var end2 = new Vector3(with._size.x, with._size.y, with._size.z) + beg2; var end2 = new Vector3(with._size.x, with._size.y, with._size.z) + beg2;
var min = new Vector3( var min = new Vector3(
beg1.x < beg2.x ? beg1.x : beg2.x, beg1.x < beg2.x ? beg1.x : beg2.x,
beg1.y < beg2.y ? beg1.y : beg2.y, beg1.y < beg2.y ? beg1.y : beg2.y,
beg1.z < beg2.z ? beg1.z : beg2.z beg1.z < beg2.z ? beg1.z : beg2.z
); );
var max = new Vector3( var max = new Vector3(
end1.x > end2.x ? end1.x : end2.x, end1.x > end2.x ? end1.x : end2.x,
end1.y > end2.y ? end1.y : end2.y, end1.y > end2.y ? end1.y : end2.y,
end1.z > end2.z ? end1.z : end2.z end1.z > end2.z ? end1.z : end2.z
); );
return new AABB(min, max - min); return new AABB(min, max - min);
} }

View file

@ -6,7 +6,7 @@ using System.Runtime.InteropServices;
namespace Godot.Collections namespace Godot.Collections
{ {
class ArraySafeHandle : SafeHandle internal class ArraySafeHandle : SafeHandle
{ {
public ArraySafeHandle(IntPtr handle) : base(IntPtr.Zero, true) public ArraySafeHandle(IntPtr handle) : base(IntPtr.Zero, true)
{ {
@ -33,15 +33,15 @@ namespace Godot.Collections
/// </summary> /// </summary>
public class Array : IList, IDisposable public class Array : IList, IDisposable
{ {
ArraySafeHandle safeHandle; private ArraySafeHandle _safeHandle;
bool disposed = false; private bool _disposed = false;
/// <summary> /// <summary>
/// Constructs a new empty <see cref="Array"/>. /// Constructs a new empty <see cref="Array"/>.
/// </summary> /// </summary>
public Array() public Array()
{ {
safeHandle = new ArraySafeHandle(godot_icall_Array_Ctor()); _safeHandle = new ArraySafeHandle(godot_icall_Array_Ctor());
} }
/// <summary> /// <summary>
@ -69,25 +69,25 @@ namespace Godot.Collections
{ {
throw new NullReferenceException($"Parameter '{nameof(array)} cannot be null.'"); throw new NullReferenceException($"Parameter '{nameof(array)} cannot be null.'");
} }
safeHandle = new ArraySafeHandle(godot_icall_Array_Ctor_MonoArray(array)); _safeHandle = new ArraySafeHandle(godot_icall_Array_Ctor_MonoArray(array));
} }
internal Array(ArraySafeHandle handle) internal Array(ArraySafeHandle handle)
{ {
safeHandle = handle; _safeHandle = handle;
} }
internal Array(IntPtr handle) internal Array(IntPtr handle)
{ {
safeHandle = new ArraySafeHandle(handle); _safeHandle = new ArraySafeHandle(handle);
} }
internal IntPtr GetPtr() internal IntPtr GetPtr()
{ {
if (disposed) if (_disposed)
throw new ObjectDisposedException(GetType().FullName); throw new ObjectDisposedException(GetType().FullName);
return safeHandle.DangerousGetHandle(); return _safeHandle.DangerousGetHandle();
} }
/// <summary> /// <summary>
@ -136,16 +136,16 @@ namespace Godot.Collections
/// </summary> /// </summary>
public void Dispose() public void Dispose()
{ {
if (disposed) if (_disposed)
return; return;
if (safeHandle != null) if (_safeHandle != null)
{ {
safeHandle.Dispose(); _safeHandle.Dispose();
safeHandle = null; _safeHandle = null;
} }
disposed = true; _disposed = true;
} }
// IList // IList
@ -272,67 +272,67 @@ namespace Godot.Collections
} }
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static IntPtr godot_icall_Array_Ctor(); internal static extern IntPtr godot_icall_Array_Ctor();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static IntPtr godot_icall_Array_Ctor_MonoArray(System.Array array); internal static extern IntPtr godot_icall_Array_Ctor_MonoArray(System.Array array);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Array_Dtor(IntPtr ptr); internal static extern void godot_icall_Array_Dtor(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static object godot_icall_Array_At(IntPtr ptr, int index); internal static extern object godot_icall_Array_At(IntPtr ptr, int index);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static object godot_icall_Array_At_Generic(IntPtr ptr, int index, int elemTypeEncoding, IntPtr elemTypeClass); internal static extern object godot_icall_Array_At_Generic(IntPtr ptr, int index, int elemTypeEncoding, IntPtr elemTypeClass);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Array_SetAt(IntPtr ptr, int index, object value); internal static extern void godot_icall_Array_SetAt(IntPtr ptr, int index, object value);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static int godot_icall_Array_Count(IntPtr ptr); internal static extern int godot_icall_Array_Count(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static int godot_icall_Array_Add(IntPtr ptr, object item); internal static extern int godot_icall_Array_Add(IntPtr ptr, object item);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Array_Clear(IntPtr ptr); internal static extern void godot_icall_Array_Clear(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static IntPtr godot_icall_Array_Concatenate(IntPtr left, IntPtr right); internal static extern IntPtr godot_icall_Array_Concatenate(IntPtr left, IntPtr right);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static bool godot_icall_Array_Contains(IntPtr ptr, object item); internal static extern bool godot_icall_Array_Contains(IntPtr ptr, object item);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Array_CopyTo(IntPtr ptr, System.Array array, int arrayIndex); internal static extern void godot_icall_Array_CopyTo(IntPtr ptr, System.Array array, int arrayIndex);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static IntPtr godot_icall_Array_Duplicate(IntPtr ptr, bool deep); internal static extern IntPtr godot_icall_Array_Duplicate(IntPtr ptr, bool deep);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static int godot_icall_Array_IndexOf(IntPtr ptr, object item); internal static extern int godot_icall_Array_IndexOf(IntPtr ptr, object item);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Array_Insert(IntPtr ptr, int index, object item); internal static extern void godot_icall_Array_Insert(IntPtr ptr, int index, object item);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static bool godot_icall_Array_Remove(IntPtr ptr, object item); internal static extern bool godot_icall_Array_Remove(IntPtr ptr, object item);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Array_RemoveAt(IntPtr ptr, int index); internal static extern void godot_icall_Array_RemoveAt(IntPtr ptr, int index);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static Error godot_icall_Array_Resize(IntPtr ptr, int newSize); internal static extern Error godot_icall_Array_Resize(IntPtr ptr, int newSize);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static Error godot_icall_Array_Shuffle(IntPtr ptr); internal static extern Error godot_icall_Array_Shuffle(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Array_Generic_GetElementTypeInfo(Type elemType, out int elemTypeEncoding, out IntPtr elemTypeClass); internal static extern void godot_icall_Array_Generic_GetElementTypeInfo(Type elemType, out int elemTypeEncoding, out IntPtr elemTypeClass);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static string godot_icall_Array_ToString(IntPtr ptr); internal static extern string godot_icall_Array_ToString(IntPtr ptr);
} }
/// <summary> /// <summary>
@ -344,7 +344,7 @@ namespace Godot.Collections
/// <typeparam name="T">The type of the array.</typeparam> /// <typeparam name="T">The type of the array.</typeparam>
public class Array<T> : IList<T>, ICollection<T>, IEnumerable<T> public class Array<T> : IList<T>, ICollection<T>, IEnumerable<T>
{ {
Array objectArray; private Array _objectArray;
internal static int elemTypeEncoding; internal static int elemTypeEncoding;
internal static IntPtr elemTypeClass; internal static IntPtr elemTypeClass;
@ -359,7 +359,7 @@ namespace Godot.Collections
/// </summary> /// </summary>
public Array() public Array()
{ {
objectArray = new Array(); _objectArray = new Array();
} }
/// <summary> /// <summary>
@ -372,7 +372,7 @@ namespace Godot.Collections
if (collection == null) if (collection == null)
throw new NullReferenceException($"Parameter '{nameof(collection)} cannot be null.'"); throw new NullReferenceException($"Parameter '{nameof(collection)} cannot be null.'");
objectArray = new Array(collection); _objectArray = new Array(collection);
} }
/// <summary> /// <summary>
@ -386,7 +386,7 @@ namespace Godot.Collections
{ {
throw new NullReferenceException($"Parameter '{nameof(array)} cannot be null.'"); throw new NullReferenceException($"Parameter '{nameof(array)} cannot be null.'");
} }
objectArray = new Array(array); _objectArray = new Array(array);
} }
/// <summary> /// <summary>
@ -395,22 +395,22 @@ namespace Godot.Collections
/// <param name="array">The untyped array to construct from.</param> /// <param name="array">The untyped array to construct from.</param>
public Array(Array array) public Array(Array array)
{ {
objectArray = array; _objectArray = array;
} }
internal Array(IntPtr handle) internal Array(IntPtr handle)
{ {
objectArray = new Array(handle); _objectArray = new Array(handle);
} }
internal Array(ArraySafeHandle handle) internal Array(ArraySafeHandle handle)
{ {
objectArray = new Array(handle); _objectArray = new Array(handle);
} }
internal IntPtr GetPtr() internal IntPtr GetPtr()
{ {
return objectArray.GetPtr(); return _objectArray.GetPtr();
} }
/// <summary> /// <summary>
@ -419,7 +419,7 @@ namespace Godot.Collections
/// <param name="from">The typed array to convert.</param> /// <param name="from">The typed array to convert.</param>
public static explicit operator Array(Array<T> from) public static explicit operator Array(Array<T> from)
{ {
return from.objectArray; return from._objectArray;
} }
/// <summary> /// <summary>
@ -429,7 +429,7 @@ namespace Godot.Collections
/// <returns>A new Godot Array.</returns> /// <returns>A new Godot Array.</returns>
public Array<T> Duplicate(bool deep = false) public Array<T> Duplicate(bool deep = false)
{ {
return new Array<T>(objectArray.Duplicate(deep)); return new Array<T>(_objectArray.Duplicate(deep));
} }
/// <summary> /// <summary>
@ -439,7 +439,7 @@ namespace Godot.Collections
/// <returns><see cref="Error.Ok"/> if successful, or an error code.</returns> /// <returns><see cref="Error.Ok"/> if successful, or an error code.</returns>
public Error Resize(int newSize) public Error Resize(int newSize)
{ {
return objectArray.Resize(newSize); return _objectArray.Resize(newSize);
} }
/// <summary> /// <summary>
@ -447,7 +447,7 @@ namespace Godot.Collections
/// </summary> /// </summary>
public void Shuffle() public void Shuffle()
{ {
objectArray.Shuffle(); _objectArray.Shuffle();
} }
/// <summary> /// <summary>
@ -458,7 +458,7 @@ namespace Godot.Collections
/// <returns>A new Godot Array with the contents of both arrays.</returns> /// <returns>A new Godot Array with the contents of both arrays.</returns>
public static Array<T> operator +(Array<T> left, Array<T> right) public static Array<T> operator +(Array<T> left, Array<T> right)
{ {
return new Array<T>(left.objectArray + right.objectArray); return new Array<T>(left._objectArray + right._objectArray);
} }
// IList<T> // IList<T>
@ -470,7 +470,7 @@ namespace Godot.Collections
public T this[int index] public T this[int index]
{ {
get { return (T)Array.godot_icall_Array_At_Generic(GetPtr(), index, elemTypeEncoding, elemTypeClass); } get { return (T)Array.godot_icall_Array_At_Generic(GetPtr(), index, elemTypeEncoding, elemTypeClass); }
set { objectArray[index] = value; } set { _objectArray[index] = value; }
} }
/// <summary> /// <summary>
@ -481,7 +481,7 @@ namespace Godot.Collections
/// <returns>The index of the item, or -1 if not found.</returns> /// <returns>The index of the item, or -1 if not found.</returns>
public int IndexOf(T item) public int IndexOf(T item)
{ {
return objectArray.IndexOf(item); return _objectArray.IndexOf(item);
} }
/// <summary> /// <summary>
@ -494,7 +494,7 @@ namespace Godot.Collections
/// <param name="item">The item to insert.</param> /// <param name="item">The item to insert.</param>
public void Insert(int index, T item) public void Insert(int index, T item)
{ {
objectArray.Insert(index, item); _objectArray.Insert(index, item);
} }
/// <summary> /// <summary>
@ -503,7 +503,7 @@ namespace Godot.Collections
/// <param name="index">The index of the element to remove.</param> /// <param name="index">The index of the element to remove.</param>
public void RemoveAt(int index) public void RemoveAt(int index)
{ {
objectArray.RemoveAt(index); _objectArray.RemoveAt(index);
} }
// ICollection<T> // ICollection<T>
@ -515,7 +515,7 @@ namespace Godot.Collections
/// <returns>The number of elements.</returns> /// <returns>The number of elements.</returns>
public int Count public int Count
{ {
get { return objectArray.Count; } get { return _objectArray.Count; }
} }
bool ICollection<T>.IsReadOnly => false; bool ICollection<T>.IsReadOnly => false;
@ -528,7 +528,7 @@ namespace Godot.Collections
/// <returns>The new size after adding the item.</returns> /// <returns>The new size after adding the item.</returns>
public void Add(T item) public void Add(T item)
{ {
objectArray.Add(item); _objectArray.Add(item);
} }
/// <summary> /// <summary>
@ -536,7 +536,7 @@ namespace Godot.Collections
/// </summary> /// </summary>
public void Clear() public void Clear()
{ {
objectArray.Clear(); _objectArray.Clear();
} }
/// <summary> /// <summary>
@ -546,7 +546,7 @@ namespace Godot.Collections
/// <returns>Whether or not this array contains the given item.</returns> /// <returns>Whether or not this array contains the given item.</returns>
public bool Contains(T item) public bool Contains(T item)
{ {
return objectArray.Contains(item); return _objectArray.Contains(item);
} }
/// <summary> /// <summary>
@ -566,7 +566,7 @@ namespace Godot.Collections
// TODO This may be quite slow because every element access is an internal call. // TODO This may be quite slow because every element access is an internal call.
// It could be moved entirely to an internal call if we find out how to do the cast there. // It could be moved entirely to an internal call if we find out how to do the cast there.
int count = objectArray.Count; int count = _objectArray.Count;
if (array.Length < (arrayIndex + count)) if (array.Length < (arrayIndex + count))
throw new ArgumentException("Destination array was not long enough. Check destIndex and length, and the array's lower bounds."); throw new ArgumentException("Destination array was not long enough. Check destIndex and length, and the array's lower bounds.");
@ -597,7 +597,7 @@ namespace Godot.Collections
/// <returns>An enumerator.</returns> /// <returns>An enumerator.</returns>
public IEnumerator<T> GetEnumerator() public IEnumerator<T> GetEnumerator()
{ {
int count = objectArray.Count; int count = _objectArray.Count;
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
@ -614,6 +614,6 @@ namespace Godot.Collections
/// Converts this <see cref="Array{T}"/> to a string. /// Converts this <see cref="Array{T}"/> to a string.
/// </summary> /// </summary>
/// <returns>A string representation of this array.</returns> /// <returns>A string representation of this array.</returns>
public override string ToString() => objectArray.ToString(); public override string ToString() => _objectArray.ToString();
} }
} }

View file

@ -88,9 +88,9 @@ namespace Godot
get => new Vector3(Row0.x, Row1.x, Row2.x); get => new Vector3(Row0.x, Row1.x, Row2.x);
set set
{ {
this.Row0.x = value.x; Row0.x = value.x;
this.Row1.x = value.y; Row1.x = value.y;
this.Row2.x = value.z; Row2.x = value.z;
} }
} }
@ -103,9 +103,9 @@ namespace Godot
get => new Vector3(Row0.y, Row1.y, Row2.y); get => new Vector3(Row0.y, Row1.y, Row2.y);
set set
{ {
this.Row0.y = value.x; Row0.y = value.x;
this.Row1.y = value.y; Row1.y = value.y;
this.Row2.y = value.z; Row2.y = value.z;
} }
} }
@ -118,9 +118,9 @@ namespace Godot
get => new Vector3(Row0.z, Row1.z, Row2.z); get => new Vector3(Row0.z, Row1.z, Row2.z);
set set
{ {
this.Row0.z = value.x; Row0.z = value.x;
this.Row1.z = value.y; Row1.z = value.y;
this.Row2.z = value.z; Row2.z = value.z;
} }
} }
@ -211,7 +211,7 @@ namespace Godot
/// <summary> /// <summary>
/// Returns the <see cref="Basis"/>'s rotation in the form of a /// Returns the <see cref="Basis"/>'s rotation in the form of a
/// <see cref="Godot.Quat"/>. See <see cref="GetEuler"/> if you /// <see cref="Quat"/>. See <see cref="GetEuler"/> if you
/// need Euler angles, but keep in mind quaternions should generally /// need Euler angles, but keep in mind quaternions should generally
/// be preferred to Euler angles. /// be preferred to Euler angles.
/// </summary> /// </summary>
@ -230,15 +230,15 @@ namespace Godot
return orthonormalizedBasis.Quat(); return orthonormalizedBasis.Quat();
} }
internal void SetQuatScale(Quat quat, Vector3 scale) internal void SetQuatScale(Quat quaternion, Vector3 scale)
{ {
SetDiagonal(scale); SetDiagonal(scale);
Rotate(quat); Rotate(quaternion);
} }
private void Rotate(Quat quat) private void Rotate(Quat quaternion)
{ {
this *= new Basis(quat); this *= new Basis(quaternion);
} }
private void SetDiagonal(Vector3 diagonal) private void SetDiagonal(Vector3 diagonal)
@ -272,7 +272,7 @@ namespace Godot
/// The returned vector contains the rotation angles in /// The returned vector contains the rotation angles in
/// the format (X angle, Y angle, Z angle). /// the format (X angle, Y angle, Z angle).
/// ///
/// Consider using the <see cref="Basis.Quat()"/> method instead, which /// Consider using the <see cref="Quat()"/> method instead, which
/// returns a <see cref="Godot.Quat"/> quaternion instead of Euler angles. /// returns a <see cref="Godot.Quat"/> quaternion instead of Euler angles.
/// </summary> /// </summary>
/// <returns>A <see cref="Vector3"/> representing the basis rotation in Euler angles.</returns> /// <returns>A <see cref="Vector3"/> representing the basis rotation in Euler angles.</returns>
@ -552,7 +552,7 @@ namespace Godot
/// <returns>The resulting dot product.</returns> /// <returns>The resulting dot product.</returns>
public real_t Tdotx(Vector3 with) public real_t Tdotx(Vector3 with)
{ {
return this.Row0[0] * with[0] + this.Row1[0] * with[1] + this.Row2[0] * with[2]; return Row0[0] * with[0] + Row1[0] * with[1] + Row2[0] * with[2];
} }
/// <summary> /// <summary>
@ -562,7 +562,7 @@ namespace Godot
/// <returns>The resulting dot product.</returns> /// <returns>The resulting dot product.</returns>
public real_t Tdoty(Vector3 with) public real_t Tdoty(Vector3 with)
{ {
return this.Row0[1] * with[0] + this.Row1[1] * with[1] + this.Row2[1] * with[2]; return Row0[1] * with[0] + Row1[1] * with[1] + Row2[1] * with[2];
} }
/// <summary> /// <summary>
@ -572,7 +572,7 @@ namespace Godot
/// <returns>The resulting dot product.</returns> /// <returns>The resulting dot product.</returns>
public real_t Tdotz(Vector3 with) public real_t Tdotz(Vector3 with)
{ {
return this.Row0[2] * with[0] + this.Row1[2] * with[1] + this.Row2[2] * with[2]; return Row0[2] * with[0] + Row1[2] * with[1] + Row2[2] * with[2];
} }
/// <summary> /// <summary>
@ -581,7 +581,7 @@ namespace Godot
/// <returns>The transposed basis matrix.</returns> /// <returns>The transposed basis matrix.</returns>
public Basis Transposed() public Basis Transposed()
{ {
var tr = this; Basis tr = this;
real_t temp = tr.Row0[1]; real_t temp = tr.Row0[1];
tr.Row0[1] = tr.Row1[0]; tr.Row0[1] = tr.Row1[0];
@ -608,9 +608,9 @@ namespace Godot
{ {
return new Vector3 return new Vector3
( (
this.Row0.Dot(v), Row0.Dot(v),
this.Row1.Dot(v), Row1.Dot(v),
this.Row2.Dot(v) Row2.Dot(v)
); );
} }
@ -627,9 +627,9 @@ namespace Godot
{ {
return new Vector3 return new Vector3
( (
this.Row0[0] * v.x + this.Row1[0] * v.y + this.Row2[0] * v.z, Row0[0] * v.x + Row1[0] * v.y + Row2[0] * v.z,
this.Row0[1] * v.x + this.Row1[1] * v.y + this.Row2[1] * v.z, Row0[1] * v.x + Row1[1] * v.y + Row2[1] * v.z,
this.Row0[2] * v.x + this.Row1[2] * v.y + this.Row2[2] * v.z Row0[2] * v.x + Row1[2] * v.y + Row2[2] * v.z
); );
} }
@ -749,23 +749,23 @@ namespace Godot
/// <summary> /// <summary>
/// Constructs a pure rotation basis matrix from the given quaternion. /// Constructs a pure rotation basis matrix from the given quaternion.
/// </summary> /// </summary>
/// <param name="quat">The quaternion to create the basis from.</param> /// <param name="quaternion">The quaternion to create the basis from.</param>
public Basis(Quat quat) public Basis(Quat quaternion)
{ {
real_t s = 2.0f / quat.LengthSquared; real_t s = 2.0f / quaternion.LengthSquared;
real_t xs = quat.x * s; real_t xs = quaternion.x * s;
real_t ys = quat.y * s; real_t ys = quaternion.y * s;
real_t zs = quat.z * s; real_t zs = quaternion.z * s;
real_t wx = quat.w * xs; real_t wx = quaternion.w * xs;
real_t wy = quat.w * ys; real_t wy = quaternion.w * ys;
real_t wz = quat.w * zs; real_t wz = quaternion.w * zs;
real_t xx = quat.x * xs; real_t xx = quaternion.x * xs;
real_t xy = quat.x * ys; real_t xy = quaternion.x * ys;
real_t xz = quat.x * zs; real_t xz = quaternion.x * zs;
real_t yy = quat.y * ys; real_t yy = quaternion.y * ys;
real_t yz = quat.y * zs; real_t yz = quaternion.y * zs;
real_t zz = quat.z * zs; real_t zz = quaternion.z * zs;
Row0 = new Vector3(1.0f - (yy + zz), xy - wz, xz + wy); Row0 = new Vector3(1.0f - (yy + zz), xy - wz, xz + wy);
Row1 = new Vector3(xy + wz, 1.0f - (xx + zz), yz - wx); Row1 = new Vector3(xy + wz, 1.0f - (xx + zz), yz - wx);

View file

@ -127,11 +127,11 @@ namespace Godot
} }
else if (g == max) else if (g == max)
{ {
h = 2 + (b - r) / delta; // Between cyan & yellow h = 2 + ((b - r) / delta); // Between cyan & yellow
} }
else else
{ {
h = 4 + (r - g) / delta; // Between magenta & cyan h = 4 + ((r - g) / delta); // Between magenta & cyan
} }
h /= 6.0f; h /= 6.0f;
@ -358,16 +358,16 @@ namespace Godot
Color res; Color res;
float sa = 1.0f - over.a; float sa = 1.0f - over.a;
res.a = a * sa + over.a; res.a = (a * sa) + over.a;
if (res.a == 0) if (res.a == 0)
{ {
return new Color(0, 0, 0, 0); return new Color(0, 0, 0, 0);
} }
res.r = (r * a * sa + over.r * over.a) / res.a; res.r = ((r * a * sa) + (over.r * over.a)) / res.a;
res.g = (g * a * sa + over.g * over.a) / res.a; res.g = ((g * a * sa) + (over.g * over.a)) / res.a;
res.b = (b * a * sa + over.b * over.a) / res.a; res.b = ((b * a * sa) + (over.b * over.a)) / res.a;
return res; return res;
} }
@ -395,9 +395,9 @@ namespace Godot
public Color Darkened(float amount) public Color Darkened(float amount)
{ {
Color res = this; Color res = this;
res.r = res.r * (1.0f - amount); res.r *= 1.0f - amount;
res.g = res.g * (1.0f - amount); res.g *= 1.0f - amount;
res.b = res.b * (1.0f - amount); res.b *= 1.0f - amount;
return res; return res;
} }
@ -424,9 +424,9 @@ namespace Godot
public Color Lightened(float amount) public Color Lightened(float amount)
{ {
Color res = this; Color res = this;
res.r = res.r + (1.0f - res.r) * amount; res.r += (1.0f - res.r) * amount;
res.g = res.g + (1.0f - res.g) * amount; res.g += (1.0f - res.g) * amount;
res.b = res.b + (1.0f - res.b) * amount; res.b += (1.0f - res.b) * amount;
return res; return res;
} }

View file

@ -6,7 +6,7 @@ using System.Runtime.InteropServices;
namespace Godot.Collections namespace Godot.Collections
{ {
class DictionarySafeHandle : SafeHandle internal class DictionarySafeHandle : SafeHandle
{ {
public DictionarySafeHandle(IntPtr handle) : base(IntPtr.Zero, true) public DictionarySafeHandle(IntPtr handle) : base(IntPtr.Zero, true)
{ {
@ -30,19 +30,17 @@ namespace Godot.Collections
/// typed elements allocated in the engine in C++. Useful when /// typed elements allocated in the engine in C++. Useful when
/// interfacing with the engine. /// interfacing with the engine.
/// </summary> /// </summary>
public class Dictionary : public class Dictionary : IDictionary, IDisposable
IDictionary,
IDisposable
{ {
DictionarySafeHandle safeHandle; private DictionarySafeHandle _safeHandle;
bool disposed = false; private bool _disposed = false;
/// <summary> /// <summary>
/// Constructs a new empty <see cref="Dictionary"/>. /// Constructs a new empty <see cref="Dictionary"/>.
/// </summary> /// </summary>
public Dictionary() public Dictionary()
{ {
safeHandle = new DictionarySafeHandle(godot_icall_Dictionary_Ctor()); _safeHandle = new DictionarySafeHandle(godot_icall_Dictionary_Ctor());
} }
/// <summary> /// <summary>
@ -61,20 +59,20 @@ namespace Godot.Collections
internal Dictionary(DictionarySafeHandle handle) internal Dictionary(DictionarySafeHandle handle)
{ {
safeHandle = handle; _safeHandle = handle;
} }
internal Dictionary(IntPtr handle) internal Dictionary(IntPtr handle)
{ {
safeHandle = new DictionarySafeHandle(handle); _safeHandle = new DictionarySafeHandle(handle);
} }
internal IntPtr GetPtr() internal IntPtr GetPtr()
{ {
if (disposed) if (_disposed)
throw new ObjectDisposedException(GetType().FullName); throw new ObjectDisposedException(GetType().FullName);
return safeHandle.DangerousGetHandle(); return _safeHandle.DangerousGetHandle();
} }
/// <summary> /// <summary>
@ -82,16 +80,16 @@ namespace Godot.Collections
/// </summary> /// </summary>
public void Dispose() public void Dispose()
{ {
if (disposed) if (_disposed)
return; return;
if (safeHandle != null) if (_safeHandle != null)
{ {
safeHandle.Dispose(); _safeHandle.Dispose();
safeHandle = null; _safeHandle = null;
} }
disposed = true; _disposed = true;
} }
/// <summary> /// <summary>
@ -229,17 +227,17 @@ namespace Godot.Collections
private class DictionaryEnumerator : IDictionaryEnumerator private class DictionaryEnumerator : IDictionaryEnumerator
{ {
private readonly Dictionary dictionary; private readonly Dictionary _dictionary;
private readonly int count; private readonly int _count;
private int index = -1; private int _index = -1;
private bool dirty = true; private bool _dirty = true;
private DictionaryEntry entry; private DictionaryEntry _entry;
public DictionaryEnumerator(Dictionary dictionary) public DictionaryEnumerator(Dictionary dictionary)
{ {
this.dictionary = dictionary; _dictionary = dictionary;
count = dictionary.Count; _count = dictionary.Count;
} }
public object Current => Entry; public object Current => Entry;
@ -248,19 +246,19 @@ namespace Godot.Collections
{ {
get get
{ {
if (dirty) if (_dirty)
{ {
UpdateEntry(); UpdateEntry();
} }
return entry; return _entry;
} }
} }
private void UpdateEntry() private void UpdateEntry()
{ {
dirty = false; _dirty = false;
godot_icall_Dictionary_KeyValuePairAt(dictionary.GetPtr(), index, out object key, out object value); godot_icall_Dictionary_KeyValuePairAt(_dictionary.GetPtr(), _index, out object key, out object value);
entry = new DictionaryEntry(key, value); _entry = new DictionaryEntry(key, value);
} }
public object Key => Entry.Key; public object Key => Entry.Key;
@ -269,15 +267,15 @@ namespace Godot.Collections
public bool MoveNext() public bool MoveNext()
{ {
index++; _index++;
dirty = true; _dirty = true;
return index < count; return _index < _count;
} }
public void Reset() public void Reset()
{ {
index = -1; _index = -1;
dirty = true; _dirty = true;
} }
} }
@ -291,67 +289,67 @@ namespace Godot.Collections
} }
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static IntPtr godot_icall_Dictionary_Ctor(); internal static extern IntPtr godot_icall_Dictionary_Ctor();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Dictionary_Dtor(IntPtr ptr); internal static extern void godot_icall_Dictionary_Dtor(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static object godot_icall_Dictionary_GetValue(IntPtr ptr, object key); internal static extern object godot_icall_Dictionary_GetValue(IntPtr ptr, object key);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static object godot_icall_Dictionary_GetValue_Generic(IntPtr ptr, object key, int valTypeEncoding, IntPtr valTypeClass); internal static extern object godot_icall_Dictionary_GetValue_Generic(IntPtr ptr, object key, int valTypeEncoding, IntPtr valTypeClass);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Dictionary_SetValue(IntPtr ptr, object key, object value); internal static extern void godot_icall_Dictionary_SetValue(IntPtr ptr, object key, object value);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static IntPtr godot_icall_Dictionary_Keys(IntPtr ptr); internal static extern IntPtr godot_icall_Dictionary_Keys(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static IntPtr godot_icall_Dictionary_Values(IntPtr ptr); internal static extern IntPtr godot_icall_Dictionary_Values(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static int godot_icall_Dictionary_Count(IntPtr ptr); internal static extern int godot_icall_Dictionary_Count(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static int godot_icall_Dictionary_KeyValuePairs(IntPtr ptr, out IntPtr keys, out IntPtr values); internal static extern int godot_icall_Dictionary_KeyValuePairs(IntPtr ptr, out IntPtr keys, out IntPtr values);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Dictionary_KeyValuePairAt(IntPtr ptr, int index, out object key, out object value); internal static extern void godot_icall_Dictionary_KeyValuePairAt(IntPtr ptr, int index, out object key, out object value);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Dictionary_Add(IntPtr ptr, object key, object value); internal static extern void godot_icall_Dictionary_Add(IntPtr ptr, object key, object value);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Dictionary_Clear(IntPtr ptr); internal static extern void godot_icall_Dictionary_Clear(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static bool godot_icall_Dictionary_Contains(IntPtr ptr, object key, object value); internal static extern bool godot_icall_Dictionary_Contains(IntPtr ptr, object key, object value);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static bool godot_icall_Dictionary_ContainsKey(IntPtr ptr, object key); internal static extern bool godot_icall_Dictionary_ContainsKey(IntPtr ptr, object key);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static IntPtr godot_icall_Dictionary_Duplicate(IntPtr ptr, bool deep); internal static extern IntPtr godot_icall_Dictionary_Duplicate(IntPtr ptr, bool deep);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static bool godot_icall_Dictionary_RemoveKey(IntPtr ptr, object key); internal static extern bool godot_icall_Dictionary_RemoveKey(IntPtr ptr, object key);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static bool godot_icall_Dictionary_Remove(IntPtr ptr, object key, object value); internal static extern bool godot_icall_Dictionary_Remove(IntPtr ptr, object key, object value);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static bool godot_icall_Dictionary_TryGetValue(IntPtr ptr, object key, out object value); internal static extern bool godot_icall_Dictionary_TryGetValue(IntPtr ptr, object key, out object value);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static bool godot_icall_Dictionary_TryGetValue_Generic(IntPtr ptr, object key, out object value, int valTypeEncoding, IntPtr valTypeClass); internal static extern bool godot_icall_Dictionary_TryGetValue_Generic(IntPtr ptr, object key, out object value, int valTypeEncoding, IntPtr valTypeClass);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Dictionary_Generic_GetValueTypeInfo(Type valueType, out int valTypeEncoding, out IntPtr valTypeClass); internal static extern void godot_icall_Dictionary_Generic_GetValueTypeInfo(Type valueType, out int valTypeEncoding, out IntPtr valTypeClass);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static string godot_icall_Dictionary_ToString(IntPtr ptr); internal static extern string godot_icall_Dictionary_ToString(IntPtr ptr);
} }
/// <summary> /// <summary>
@ -362,10 +360,9 @@ namespace Godot.Collections
/// </summary> /// </summary>
/// <typeparam name="TKey">The type of the dictionary's keys.</typeparam> /// <typeparam name="TKey">The type of the dictionary's keys.</typeparam>
/// <typeparam name="TValue">The type of the dictionary's values.</typeparam> /// <typeparam name="TValue">The type of the dictionary's values.</typeparam>
public class Dictionary<TKey, TValue> : public class Dictionary<TKey, TValue> : IDictionary<TKey, TValue>
IDictionary<TKey, TValue>
{ {
private readonly Dictionary objectDict; private readonly Dictionary _objectDict;
internal static int valTypeEncoding; internal static int valTypeEncoding;
internal static IntPtr valTypeClass; internal static IntPtr valTypeClass;
@ -380,7 +377,7 @@ namespace Godot.Collections
/// </summary> /// </summary>
public Dictionary() public Dictionary()
{ {
objectDict = new Dictionary(); _objectDict = new Dictionary();
} }
/// <summary> /// <summary>
@ -390,7 +387,7 @@ namespace Godot.Collections
/// <returns>A new Godot Dictionary.</returns> /// <returns>A new Godot Dictionary.</returns>
public Dictionary(IDictionary<TKey, TValue> dictionary) public Dictionary(IDictionary<TKey, TValue> dictionary)
{ {
objectDict = new Dictionary(); _objectDict = new Dictionary();
if (dictionary == null) if (dictionary == null)
throw new NullReferenceException($"Parameter '{nameof(dictionary)} cannot be null.'"); throw new NullReferenceException($"Parameter '{nameof(dictionary)} cannot be null.'");
@ -412,17 +409,17 @@ namespace Godot.Collections
/// <returns>A new Godot Dictionary.</returns> /// <returns>A new Godot Dictionary.</returns>
public Dictionary(Dictionary dictionary) public Dictionary(Dictionary dictionary)
{ {
objectDict = dictionary; _objectDict = dictionary;
} }
internal Dictionary(IntPtr handle) internal Dictionary(IntPtr handle)
{ {
objectDict = new Dictionary(handle); _objectDict = new Dictionary(handle);
} }
internal Dictionary(DictionarySafeHandle handle) internal Dictionary(DictionarySafeHandle handle)
{ {
objectDict = new Dictionary(handle); _objectDict = new Dictionary(handle);
} }
/// <summary> /// <summary>
@ -431,12 +428,12 @@ namespace Godot.Collections
/// <param name="from">The typed dictionary to convert.</param> /// <param name="from">The typed dictionary to convert.</param>
public static explicit operator Dictionary(Dictionary<TKey, TValue> from) public static explicit operator Dictionary(Dictionary<TKey, TValue> from)
{ {
return from.objectDict; return from._objectDict;
} }
internal IntPtr GetPtr() internal IntPtr GetPtr()
{ {
return objectDict.GetPtr(); return _objectDict.GetPtr();
} }
/// <summary> /// <summary>
@ -446,7 +443,7 @@ namespace Godot.Collections
/// <returns>A new Godot Dictionary.</returns> /// <returns>A new Godot Dictionary.</returns>
public Dictionary<TKey, TValue> Duplicate(bool deep = false) public Dictionary<TKey, TValue> Duplicate(bool deep = false)
{ {
return new Dictionary<TKey, TValue>(objectDict.Duplicate(deep)); return new Dictionary<TKey, TValue>(_objectDict.Duplicate(deep));
} }
// IDictionary<TKey, TValue> // IDictionary<TKey, TValue>
@ -457,8 +454,8 @@ namespace Godot.Collections
/// <value>The value at the given <paramref name="key"/>.</value> /// <value>The value at the given <paramref name="key"/>.</value>
public TValue this[TKey key] public TValue this[TKey key]
{ {
get { return (TValue)Dictionary.godot_icall_Dictionary_GetValue_Generic(objectDict.GetPtr(), key, valTypeEncoding, valTypeClass); } get { return (TValue)Dictionary.godot_icall_Dictionary_GetValue_Generic(_objectDict.GetPtr(), key, valTypeEncoding, valTypeClass); }
set { objectDict[key] = value; } set { _objectDict[key] = value; }
} }
/// <summary> /// <summary>
@ -468,7 +465,7 @@ namespace Godot.Collections
{ {
get get
{ {
IntPtr handle = Dictionary.godot_icall_Dictionary_Keys(objectDict.GetPtr()); IntPtr handle = Dictionary.godot_icall_Dictionary_Keys(_objectDict.GetPtr());
return new Array<TKey>(new ArraySafeHandle(handle)); return new Array<TKey>(new ArraySafeHandle(handle));
} }
} }
@ -480,7 +477,7 @@ namespace Godot.Collections
{ {
get get
{ {
IntPtr handle = Dictionary.godot_icall_Dictionary_Values(objectDict.GetPtr()); IntPtr handle = Dictionary.godot_icall_Dictionary_Values(_objectDict.GetPtr());
return new Array<TValue>(new ArraySafeHandle(handle)); return new Array<TValue>(new ArraySafeHandle(handle));
} }
} }
@ -499,7 +496,7 @@ namespace Godot.Collections
/// <param name="value">The object to add.</param> /// <param name="value">The object to add.</param>
public void Add(TKey key, TValue value) public void Add(TKey key, TValue value)
{ {
objectDict.Add(key, value); _objectDict.Add(key, value);
} }
/// <summary> /// <summary>
@ -509,7 +506,7 @@ namespace Godot.Collections
/// <returns>Whether or not this dictionary contains the given key.</returns> /// <returns>Whether or not this dictionary contains the given key.</returns>
public bool ContainsKey(TKey key) public bool ContainsKey(TKey key)
{ {
return objectDict.Contains(key); return _objectDict.Contains(key);
} }
/// <summary> /// <summary>
@ -543,14 +540,14 @@ namespace Godot.Collections
/// <returns>The number of elements.</returns> /// <returns>The number of elements.</returns>
public int Count public int Count
{ {
get { return objectDict.Count; } get { return _objectDict.Count; }
} }
bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly => false; bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly => false;
void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item) void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item)
{ {
objectDict.Add(item.Key, item.Value); _objectDict.Add(item.Key, item.Value);
} }
/// <summary> /// <summary>
@ -558,12 +555,12 @@ namespace Godot.Collections
/// </summary> /// </summary>
public void Clear() public void Clear()
{ {
objectDict.Clear(); _objectDict.Clear();
} }
bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item) bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item)
{ {
return objectDict.Contains(new KeyValuePair<object, object>(item.Key, item.Value)); return _objectDict.Contains(new KeyValuePair<object, object>(item.Key, item.Value));
} }
/// <summary> /// <summary>
@ -621,6 +618,6 @@ namespace Godot.Collections
/// Converts this <see cref="Dictionary{TKey, TValue}"/> to a string. /// Converts this <see cref="Dictionary{TKey, TValue}"/> to a string.
/// </summary> /// </summary>
/// <returns>A string representation of this dictionary.</returns> /// <returns>A string representation of this dictionary.</returns>
public override string ToString() => objectDict.ToString(); public override string ToString() => _objectDict.ToString();
} }
} }

View file

@ -72,7 +72,7 @@ namespace Godot
if (godotObject == null) if (godotObject == null)
throw new ArgumentNullException(nameof(godotObject)); throw new ArgumentNullException(nameof(godotObject));
this.Value = godotObject; Value = godotObject;
} }
/// <inheritdoc/> /// <inheritdoc/>
@ -189,16 +189,16 @@ namespace Godot
} }
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static string[] godot_icall_DynamicGodotObject_SetMemberList(IntPtr godotObject); internal static extern string[] godot_icall_DynamicGodotObject_SetMemberList(IntPtr godotObject);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static bool godot_icall_DynamicGodotObject_InvokeMember(IntPtr godotObject, string name, object[] args, out object result); internal static extern bool godot_icall_DynamicGodotObject_InvokeMember(IntPtr godotObject, string name, object[] args, out object result);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static bool godot_icall_DynamicGodotObject_GetMember(IntPtr godotObject, string name, out object result); internal static extern bool godot_icall_DynamicGodotObject_GetMember(IntPtr godotObject, string name, out object result);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static bool godot_icall_DynamicGodotObject_SetMember(IntPtr godotObject, string name, object value); internal static extern bool godot_icall_DynamicGodotObject_SetMember(IntPtr godotObject, string name, object value);
#region We don't override these methods #region We don't override these methods

View file

@ -36,6 +36,6 @@ namespace Godot
} }
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static WeakRef godot_icall_Object_weakref(IntPtr obj); internal static extern WeakRef godot_icall_Object_weakref(IntPtr obj);
} }
} }

View file

@ -552,70 +552,69 @@ namespace Godot
} }
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static object godot_icall_GD_bytes2var(byte[] bytes, bool allow_objects); internal static extern object godot_icall_GD_bytes2var(byte[] bytes, bool allowObjects);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static object godot_icall_GD_convert(object what, Variant.Type type); internal static extern object godot_icall_GD_convert(object what, Variant.Type type);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static int godot_icall_GD_hash(object var); internal static extern int godot_icall_GD_hash(object var);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static Object godot_icall_GD_instance_from_id(ulong instance_id); internal static extern Object godot_icall_GD_instance_from_id(ulong instanceId);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_GD_print(object[] what); internal static extern void godot_icall_GD_print(object[] what);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_GD_printerr(object[] what); internal static extern void godot_icall_GD_printerr(object[] what);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_GD_printraw(object[] what); internal static extern void godot_icall_GD_printraw(object[] what);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_GD_prints(object[] what); internal static extern void godot_icall_GD_prints(object[] what);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_GD_printt(object[] what); internal static extern void godot_icall_GD_printt(object[] what);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static float godot_icall_GD_randf(); internal static extern float godot_icall_GD_randf();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static uint godot_icall_GD_randi(); internal static extern uint godot_icall_GD_randi();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_GD_randomize(); internal static extern void godot_icall_GD_randomize();
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static double godot_icall_GD_rand_range(double from, double to); internal static extern double godot_icall_GD_rand_range(double from, double to);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static uint godot_icall_GD_rand_seed(ulong seed, out ulong newSeed); internal static extern uint godot_icall_GD_rand_seed(ulong seed, out ulong newSeed);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_GD_seed(ulong seed); internal static extern void godot_icall_GD_seed(ulong seed);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static string godot_icall_GD_str(object[] what); internal static extern string godot_icall_GD_str(object[] what);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static object godot_icall_GD_str2var(string str); internal static extern object godot_icall_GD_str2var(string str);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static bool godot_icall_GD_type_exists(string type); internal static extern bool godot_icall_GD_type_exists(string type);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static byte[] godot_icall_GD_var2bytes(object what, bool full_objects); internal static extern byte[] godot_icall_GD_var2bytes(object what, bool fullObjects);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static string godot_icall_GD_var2str(object var); internal static extern string godot_icall_GD_var2str(object var);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_GD_pusherror(string type); internal static extern void godot_icall_GD_pusherror(string type);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_GD_pushwarning(string type); internal static extern void godot_icall_GD_pushwarning(string type);
} }
} }

View file

@ -6,7 +6,8 @@ namespace Godot
{ {
public class GodotSynchronizationContext : SynchronizationContext public class GodotSynchronizationContext : SynchronizationContext
{ {
private readonly BlockingCollection<KeyValuePair<SendOrPostCallback, object>> _queue = new BlockingCollection<KeyValuePair<SendOrPostCallback, object>>(); private readonly BlockingCollection<KeyValuePair<SendOrPostCallback, object>> _queue =
new BlockingCollection<KeyValuePair<SendOrPostCallback, object>>();
public override void Post(SendOrPostCallback d, object state) public override void Post(SendOrPostCallback d, object state)
{ {

View file

@ -24,7 +24,7 @@ namespace Godot
try try
{ {
var stackTrace = new StackTrace(true).ToString(); string stackTrace = new StackTrace(true).ToString();
GD.PrintErr(stackTrace); GD.PrintErr(stackTrace);
} }
catch catch

View file

@ -3,7 +3,7 @@ using System.Collections.Generic;
namespace Godot namespace Godot
{ {
static class MarshalUtils internal static class MarshalUtils
{ {
/// <summary> /// <summary>
/// Returns <see langword="true"/> if the generic type definition of <paramref name="type"/> /// Returns <see langword="true"/> if the generic type definition of <paramref name="type"/>

View file

@ -40,9 +40,9 @@ namespace Godot
public const real_t NaN = real_t.NaN; public const real_t NaN = real_t.NaN;
// 0.0174532924f and 0.0174532925199433 // 0.0174532924f and 0.0174532925199433
private const real_t Deg2RadConst = (real_t)0.0174532925199432957692369077M; private const real_t _deg2RadConst = (real_t)0.0174532925199432957692369077M;
// 57.29578f and 57.2957795130823 // 57.29578f and 57.2957795130823
private const real_t Rad2DegConst = (real_t)57.295779513082320876798154814M; private const real_t _rad2DegConst = (real_t)57.295779513082320876798154814M;
/// <summary> /// <summary>
/// Returns the absolute value of <paramref name="s"/> (i.e. positive value). /// Returns the absolute value of <paramref name="s"/> (i.e. positive value).
@ -199,7 +199,7 @@ namespace Godot
/// <returns>The same angle expressed in radians.</returns> /// <returns>The same angle expressed in radians.</returns>
public static real_t Deg2Rad(real_t deg) public static real_t Deg2Rad(real_t deg)
{ {
return deg * Deg2RadConst; return deg * _deg2RadConst;
} }
/// <summary> /// <summary>
@ -240,7 +240,7 @@ namespace Godot
return Pow(s * 2.0f, -curve) * 0.5f; return Pow(s * 2.0f, -curve) * 0.5f;
} }
return (1.0f - Pow(1.0f - (s - 0.5f) * 2.0f, -curve)) * 0.5f + 0.5f; return ((1.0f - Pow(1.0f - ((s - 0.5f) * 2.0f), -curve)) * 0.5f) + 0.5f;
} }
return 0f; return 0f;
@ -347,7 +347,7 @@ namespace Godot
/// <returns>The resulting value of the interpolation.</returns> /// <returns>The resulting value of the interpolation.</returns>
public static real_t Lerp(real_t from, real_t to, real_t weight) public static real_t Lerp(real_t from, real_t to, real_t weight)
{ {
return from + (to - from) * weight; return from + ((to - from) * weight);
} }
/// <summary> /// <summary>
@ -364,7 +364,7 @@ namespace Godot
{ {
real_t difference = (to - from) % Mathf.Tau; real_t difference = (to - from) % Mathf.Tau;
real_t distance = ((2 * difference) % Mathf.Tau) - difference; real_t distance = ((2 * difference) % Mathf.Tau) - difference;
return from + distance * weight; return from + (distance * weight);
} }
/// <summary> /// <summary>
@ -434,7 +434,10 @@ namespace Godot
/// <returns>The value after moving.</returns> /// <returns>The value after moving.</returns>
public static real_t MoveToward(real_t from, real_t to, real_t delta) public static real_t MoveToward(real_t from, real_t to, real_t delta)
{ {
return Abs(to - from) <= delta ? to : from + Sign(to - from) * delta; if (Abs(to - from) <= delta)
return to;
return from + (Sign(to - from) * delta);
} }
/// <summary> /// <summary>
@ -518,7 +521,7 @@ namespace Godot
/// <returns>The same angle expressed in degrees.</returns> /// <returns>The same angle expressed in degrees.</returns>
public static real_t Rad2Deg(real_t rad) public static real_t Rad2Deg(real_t rad)
{ {
return rad * Rad2DegConst; return rad * _rad2DegConst;
} }
/// <summary> /// <summary>
@ -594,7 +597,7 @@ namespace Godot
return from; return from;
} }
real_t x = Clamp((weight - from) / (to - from), (real_t)0.0, (real_t)1.0); real_t x = Clamp((weight - from) / (to - from), (real_t)0.0, (real_t)1.0);
return x * x * (3 - 2 * x); return x * x * (3 - (2 * x));
} }
/// <summary> /// <summary>
@ -618,7 +621,8 @@ namespace Godot
/// <returns>The position of the first non-zero digit.</returns> /// <returns>The position of the first non-zero digit.</returns>
public static int StepDecimals(real_t step) public static int StepDecimals(real_t step)
{ {
double[] sd = new double[] { double[] sd = new double[]
{
0.9999, 0.9999,
0.09999, 0.09999,
0.009999, 0.009999,
@ -629,7 +633,7 @@ namespace Godot
0.00000009999, 0.00000009999,
0.000000009999, 0.000000009999,
}; };
double abs = Mathf.Abs(step); double abs = Abs(step);
double decs = abs - (int)abs; // Strip away integer part double decs = abs - (int)abs; // Strip away integer part
for (int i = 0; i < sd.Length; i++) for (int i = 0; i < sd.Length; i++)
{ {
@ -652,7 +656,7 @@ namespace Godot
{ {
if (step != 0f) if (step != 0f)
{ {
return Floor(s / step + 0.5f) * step; return Floor((s / step) + 0.5f) * step;
} }
return s; return s;
@ -691,7 +695,10 @@ namespace Godot
public static int Wrap(int value, int min, int max) public static int Wrap(int value, int min, int max)
{ {
int range = max - min; int range = max - min;
return range == 0 ? min : min + ((value - min) % range + range) % range; if (range == 0)
return min;
return min + ((((value - min) % range) + range) % range);
} }
/// <summary> /// <summary>
@ -707,7 +714,10 @@ namespace Godot
public static real_t Wrap(real_t value, real_t min, real_t max) public static real_t Wrap(real_t value, real_t min, real_t max)
{ {
real_t range = max - min; real_t range = max - min;
return IsZeroApprox(range) ? min : min + ((value - min) % range + range) % range; if (IsZeroApprox(range))
return min;
return min + ((((value - min) % range) + range) % range);
} }
} }
} }

View file

@ -41,16 +41,16 @@ namespace Godot
/// </example> /// </example>
public sealed partial class NodePath : IDisposable public sealed partial class NodePath : IDisposable
{ {
private bool disposed = false; private bool _disposed = false;
internal IntPtr ptr; private IntPtr ptr;
internal static IntPtr GetPtr(NodePath instance) internal static IntPtr GetPtr(NodePath instance)
{ {
if (instance == null) if (instance == null)
throw new NullReferenceException($"The instance of type {nameof(NodePath)} is null."); throw new NullReferenceException($"The instance of type {nameof(NodePath)} is null.");
if (instance.disposed) if (instance._disposed)
throw new ObjectDisposedException(instance.GetType().FullName); throw new ObjectDisposedException(instance.GetType().FullName);
return instance.ptr; return instance.ptr;
@ -72,7 +72,7 @@ namespace Godot
private void Dispose(bool disposing) private void Dispose(bool disposing)
{ {
if (disposed) if (_disposed)
return; return;
if (ptr != IntPtr.Zero) if (ptr != IntPtr.Zero)
@ -81,7 +81,7 @@ namespace Godot
ptr = IntPtr.Zero; ptr = IntPtr.Zero;
} }
disposed = true; _disposed = true;
} }
internal NodePath(IntPtr ptr) internal NodePath(IntPtr ptr)
@ -102,7 +102,6 @@ namespace Godot
/// </summary> /// </summary>
public NodePath() : this(string.Empty) { } public NodePath() : this(string.Empty) { }
/// <summary> /// <summary>
/// Constructs a <see cref="NodePath"/> from a string <paramref name="path"/>, /// Constructs a <see cref="NodePath"/> from a string <paramref name="path"/>,
/// e.g.: <c>"Path2D/PathFollow2D/Sprite2D:texture:size"</c>. /// e.g.: <c>"Path2D/PathFollow2D/Sprite2D:texture:size"</c>.
@ -134,7 +133,7 @@ namespace Godot
/// <param name="path"></param> /// <param name="path"></param>
public NodePath(string path) public NodePath(string path)
{ {
this.ptr = godot_icall_NodePath_Ctor(path); ptr = godot_icall_NodePath_Ctor(path);
} }
/// <summary> /// <summary>
@ -272,36 +271,36 @@ namespace Godot
} }
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static IntPtr godot_icall_NodePath_Ctor(string path); private static extern IntPtr godot_icall_NodePath_Ctor(string path);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_NodePath_Dtor(IntPtr ptr); private static extern void godot_icall_NodePath_Dtor(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static string godot_icall_NodePath_operator_String(IntPtr ptr); private static extern string godot_icall_NodePath_operator_String(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static IntPtr godot_icall_NodePath_get_as_property_path(IntPtr ptr); private static extern IntPtr godot_icall_NodePath_get_as_property_path(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static string godot_icall_NodePath_get_concatenated_subnames(IntPtr ptr); private static extern string godot_icall_NodePath_get_concatenated_subnames(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static string godot_icall_NodePath_get_name(IntPtr ptr, int arg1); private static extern string godot_icall_NodePath_get_name(IntPtr ptr, int arg1);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static int godot_icall_NodePath_get_name_count(IntPtr ptr); private static extern int godot_icall_NodePath_get_name_count(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static string godot_icall_NodePath_get_subname(IntPtr ptr, int arg1); private static extern string godot_icall_NodePath_get_subname(IntPtr ptr, int arg1);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static int godot_icall_NodePath_get_subname_count(IntPtr ptr); private static extern int godot_icall_NodePath_get_subname_count(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static bool godot_icall_NodePath_is_absolute(IntPtr ptr); private static extern bool godot_icall_NodePath_is_absolute(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static bool godot_icall_NodePath_is_empty(IntPtr ptr); private static extern bool godot_icall_NodePath_is_empty(IntPtr ptr);
} }
} }

View file

@ -5,7 +5,7 @@ namespace Godot
{ {
public partial class Object : IDisposable public partial class Object : IDisposable
{ {
private bool disposed = false; private bool _disposed = false;
private const string nativeName = "Object"; private const string nativeName = "Object";
@ -39,7 +39,7 @@ namespace Godot
if (instance == null) if (instance == null)
return IntPtr.Zero; return IntPtr.Zero;
if (instance.disposed) if (instance._disposed)
throw new ObjectDisposedException(instance.GetType().FullName); throw new ObjectDisposedException(instance.GetType().FullName);
return instance.ptr; return instance.ptr;
@ -64,7 +64,7 @@ namespace Godot
/// </summary> /// </summary>
protected virtual void Dispose(bool disposing) protected virtual void Dispose(bool disposing)
{ {
if (disposed) if (_disposed)
return; return;
if (ptr != IntPtr.Zero) if (ptr != IntPtr.Zero)
@ -79,10 +79,10 @@ namespace Godot
godot_icall_Object_Disposed(this, ptr); godot_icall_Object_Disposed(this, ptr);
} }
this.ptr = IntPtr.Zero; ptr = IntPtr.Zero;
} }
disposed = true; _disposed = true;
} }
/// <summary> /// <summary>
@ -132,19 +132,19 @@ namespace Godot
public dynamic DynamicObject => new DynamicGodotObject(this); public dynamic DynamicObject => new DynamicGodotObject(this);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static IntPtr godot_icall_Object_Ctor(Object obj); internal static extern IntPtr godot_icall_Object_Ctor(Object obj);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Object_Disposed(Object obj, IntPtr ptr); internal static extern void godot_icall_Object_Disposed(Object obj, IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_Reference_Disposed(Object obj, IntPtr ptr, bool isFinalizer); internal static extern void godot_icall_Reference_Disposed(Object obj, IntPtr ptr, bool isFinalizer);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static string godot_icall_Object_ToString(IntPtr ptr); internal static extern string godot_icall_Object_ToString(IntPtr ptr);
// Used by the generated API // Used by the generated API
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static IntPtr godot_icall_Object_ClassDB_get_method(string type, string method); internal static extern IntPtr godot_icall_Object_ClassDB_get_method(string type, string method);
} }
} }

View file

@ -156,9 +156,9 @@ namespace Godot
return null; return null;
} }
Vector3 result = b._normal.Cross(c._normal) * D + Vector3 result = (b._normal.Cross(c._normal) * D) +
c._normal.Cross(_normal) * b.D + (c._normal.Cross(_normal) * b.D) +
_normal.Cross(b._normal) * c.D; (_normal.Cross(b._normal) * c.D);
return result / denom; return result / denom;
} }
@ -253,7 +253,7 @@ namespace Godot
/// <returns>The projected point.</returns> /// <returns>The projected point.</returns>
public Vector3 Project(Vector3 point) public Vector3 Project(Vector3 point)
{ {
return point - _normal * DistanceTo(point); return point - (_normal * DistanceTo(point));
} }
// Constants // Constants
@ -292,7 +292,7 @@ namespace Godot
public Plane(real_t a, real_t b, real_t c, real_t d) public Plane(real_t a, real_t b, real_t c, real_t d)
{ {
_normal = new Vector3(a, b, c); _normal = new Vector3(a, b, c);
this.D = d; D = d;
} }
/// <summary> /// <summary>
@ -303,8 +303,8 @@ namespace Godot
/// <param name="d">The plane's distance from the origin. This value is typically non-negative.</param> /// <param name="d">The plane's distance from the origin. This value is typically non-negative.</param>
public Plane(Vector3 normal, real_t d) public Plane(Vector3 normal, real_t d)
{ {
this._normal = normal; _normal = normal;
this.D = d; D = d;
} }
/// <summary> /// <summary>

View file

@ -15,7 +15,7 @@ namespace Godot
/// It is similar to <see cref="Basis"/>, which implements matrix /// It is similar to <see cref="Basis"/>, which implements matrix
/// representation of rotations, and can be parametrized using both /// representation of rotations, and can be parametrized using both
/// an axis-angle pair or Euler angles. Basis stores rotation, scale, /// an axis-angle pair or Euler angles. Basis stores rotation, scale,
/// and shearing, while Quat only stores rotation /// and shearing, while Quat only stores rotation.
/// ///
/// Due to its compactness and the way it is stored in memory, certain /// Due to its compactness and the way it is stored in memory, certain
/// operations (obtaining axis-angle and performing SLERP, in particular) /// operations (obtaining axis-angle and performing SLERP, in particular)
@ -147,10 +147,9 @@ namespace Godot
/// <returns>The interpolated quaternion.</returns> /// <returns>The interpolated quaternion.</returns>
public Quat CubicSlerp(Quat b, Quat preA, Quat postB, real_t weight) public Quat CubicSlerp(Quat b, Quat preA, Quat postB, real_t weight)
{ {
real_t t = weight; real_t t2 = (1.0f - weight) * weight * 2f;
real_t t2 = (1.0f - t) * t * 2f; Quat sp = Slerp(b, weight);
Quat sp = Slerp(b, t); Quat sq = preA.Slerpni(postB, weight);
Quat sq = preA.Slerpni(postB, t);
return sp.Slerpni(sq, t2); return sp.Slerpni(sq, t2);
} }
@ -161,7 +160,7 @@ namespace Godot
/// <returns>The dot product.</returns> /// <returns>The dot product.</returns>
public real_t Dot(Quat b) public real_t Dot(Quat b)
{ {
return x * b.x + y * b.y + z * b.z + w * b.w; return (x * b.x) + (y * b.y) + (z * b.z) + (w * b.w);
} }
/// <summary> /// <summary>
@ -308,10 +307,10 @@ namespace Godot
// Calculate final values. // Calculate final values.
return new Quat return new Quat
( (
scale0 * x + scale1 * to1.x, (scale0 * x) + (scale1 * to1.x),
scale0 * y + scale1 * to1.y, (scale0 * y) + (scale1 * to1.y),
scale0 * z + scale1 * to1.z, (scale0 * z) + (scale1 * to1.z),
scale0 * w + scale1 * to1.w (scale0 * w) + (scale1 * to1.w)
); );
} }
@ -339,10 +338,10 @@ namespace Godot
return new Quat return new Quat
( (
invFactor * x + newFactor * to.x, (invFactor * x) + (newFactor * to.x),
invFactor * y + newFactor * to.y, (invFactor * y) + (newFactor * to.y),
invFactor * z + newFactor * to.z, (invFactor * z) + (newFactor * to.z),
invFactor * w + newFactor * to.w (invFactor * w) + (newFactor * to.w)
); );
} }
@ -361,7 +360,7 @@ namespace Godot
#endif #endif
var u = new Vector3(x, y, z); var u = new Vector3(x, y, z);
Vector3 uv = u.Cross(v); Vector3 uv = u.Cross(v);
return v + ((uv * w) + u.Cross(uv)) * 2; return v + (((uv * w) + u.Cross(uv)) * 2);
} }
// Constants // Constants
@ -416,25 +415,25 @@ namespace Godot
/// <param name="eulerYXZ">Euler angles that the quaternion will be rotated by.</param> /// <param name="eulerYXZ">Euler angles that the quaternion will be rotated by.</param>
public Quat(Vector3 eulerYXZ) public Quat(Vector3 eulerYXZ)
{ {
real_t half_a1 = eulerYXZ.y * 0.5f; real_t halfA1 = eulerYXZ.y * 0.5f;
real_t half_a2 = eulerYXZ.x * 0.5f; real_t halfA2 = eulerYXZ.x * 0.5f;
real_t half_a3 = eulerYXZ.z * 0.5f; real_t halfA3 = eulerYXZ.z * 0.5f;
// R = Y(a1).X(a2).Z(a3) convention for Euler angles. // R = Y(a1).X(a2).Z(a3) convention for Euler angles.
// Conversion to quaternion as listed in https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19770024290.pdf (page A-6) // Conversion to quaternion as listed in https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19770024290.pdf (page A-6)
// a3 is the angle of the first rotation, following the notation in this reference. // a3 is the angle of the first rotation, following the notation in this reference.
real_t cos_a1 = Mathf.Cos(half_a1); real_t cosA1 = Mathf.Cos(halfA1);
real_t sin_a1 = Mathf.Sin(half_a1); real_t sinA1 = Mathf.Sin(halfA1);
real_t cos_a2 = Mathf.Cos(half_a2); real_t cosA2 = Mathf.Cos(halfA2);
real_t sin_a2 = Mathf.Sin(half_a2); real_t sinA2 = Mathf.Sin(halfA2);
real_t cos_a3 = Mathf.Cos(half_a3); real_t cosA3 = Mathf.Cos(halfA3);
real_t sin_a3 = Mathf.Sin(half_a3); real_t sinA3 = Mathf.Sin(halfA3);
x = sin_a1 * cos_a2 * sin_a3 + cos_a1 * sin_a2 * cos_a3; x = (sinA1 * cosA2 * sinA3) + (cosA1 * sinA2 * cosA3);
y = sin_a1 * cos_a2 * cos_a3 - cos_a1 * sin_a2 * sin_a3; y = (sinA1 * cosA2 * cosA3) - (cosA1 * sinA2 * sinA3);
z = cos_a1 * cos_a2 * sin_a3 - sin_a1 * sin_a2 * cos_a3; z = (cosA1 * cosA2 * sinA3) - (sinA1 * sinA2 * cosA3);
w = sin_a1 * sin_a2 * sin_a3 + cos_a1 * cos_a2 * cos_a3; w = (sinA1 * sinA2 * sinA3) + (cosA1 * cosA2 * cosA3);
} }
/// <summary> /// <summary>
@ -478,10 +477,10 @@ namespace Godot
{ {
return new Quat return new Quat
( (
left.w * right.x + left.x * right.w + left.y * right.z - left.z * right.y, (left.w * right.x) + (left.x * right.w) + (left.y * right.z) - (left.z * right.y),
left.w * right.y + left.y * right.w + left.z * right.x - left.x * right.z, (left.w * right.y) + (left.y * right.w) + (left.z * right.x) - (left.x * right.z),
left.w * right.z + left.z * right.w + left.x * right.y - left.y * right.x, (left.w * right.z) + (left.z * right.w) + (left.x * right.y) - (left.y * right.x),
left.w * right.w - left.x * right.x - left.y * right.y - left.z * right.z (left.w * right.w) - (left.x * right.x) - (left.y * right.y) - (left.z * right.z)
); );
} }
@ -504,10 +503,10 @@ namespace Godot
{ {
return new Quat return new Quat
( (
left.w * right.x + left.y * right.z - left.z * right.y, (left.w * right.x) + (left.y * right.z) - (left.z * right.y),
left.w * right.y + left.z * right.x - left.x * right.z, (left.w * right.y) + (left.z * right.x) - (left.x * right.z),
left.w * right.z + left.x * right.y - left.y * right.x, (left.w * right.z) + (left.x * right.y) - (left.y * right.x),
-left.x * right.x - left.y * right.y - left.z * right.z -(left.x * right.x) - (left.y * right.y) - (left.z * right.z)
); );
} }
@ -515,10 +514,10 @@ namespace Godot
{ {
return new Quat return new Quat
( (
right.w * left.x + right.y * left.z - right.z * left.y, (right.w * left.x) + (right.y * left.z) - (right.z * left.y),
right.w * left.y + right.z * left.x - right.x * left.z, (right.w * left.y) + (right.z * left.x) - (right.x * left.z),
right.w * left.z + right.x * left.y - right.y * left.x, (right.w * left.z) + (right.x * left.y) - (right.y * left.x),
-right.x * left.x - right.y * left.y - right.z * left.z -(right.x * left.x) - (right.y * left.y) - (right.z * left.z)
); );
} }
@ -598,7 +597,7 @@ namespace Godot
/// <returns>A string representation of this quaternion.</returns> /// <returns>A string representation of this quaternion.</returns>
public override string ToString() public override string ToString()
{ {
return String.Format("({0}, {1}, {2}, {3})", x.ToString(), y.ToString(), z.ToString(), w.ToString()); return $"({x}, {y}, {z}, {w})";
} }
/// <summary> /// <summary>
@ -607,7 +606,7 @@ namespace Godot
/// <returns>A string representation of this quaternion.</returns> /// <returns>A string representation of this quaternion.</returns>
public string ToString(string format) public string ToString(string format)
{ {
return String.Format("({0}, {1}, {2}, {3})", x.ToString(format), y.ToString(format), z.ToString(format), w.ToString(format)); return $"({x.ToString(format)}, {y.ToString(format)}, {z.ToString(format)}, {w.ToString(format)})";
} }
} }
} }

View file

@ -11,7 +11,7 @@ namespace Godot
/// </summary> /// </summary>
public sealed partial class RID : IDisposable public sealed partial class RID : IDisposable
{ {
private bool disposed = false; private bool _disposed = false;
internal IntPtr ptr; internal IntPtr ptr;
@ -20,7 +20,7 @@ namespace Godot
if (instance == null) if (instance == null)
throw new NullReferenceException($"The instance of type {nameof(RID)} is null."); throw new NullReferenceException($"The instance of type {nameof(RID)} is null.");
if (instance.disposed) if (instance._disposed)
throw new ObjectDisposedException(instance.GetType().FullName); throw new ObjectDisposedException(instance.GetType().FullName);
return instance.ptr; return instance.ptr;
@ -42,7 +42,7 @@ namespace Godot
private void Dispose(bool disposing) private void Dispose(bool disposing)
{ {
if (disposed) if (_disposed)
return; return;
if (ptr != IntPtr.Zero) if (ptr != IntPtr.Zero)
@ -51,7 +51,7 @@ namespace Godot
ptr = IntPtr.Zero; ptr = IntPtr.Zero;
} }
disposed = true; _disposed = true;
} }
internal RID(IntPtr ptr) internal RID(IntPtr ptr)
@ -96,12 +96,12 @@ namespace Godot
public override string ToString() => "[RID]"; public override string ToString() => "[RID]";
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static IntPtr godot_icall_RID_Ctor(IntPtr from); internal static extern IntPtr godot_icall_RID_Ctor(IntPtr from);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static void godot_icall_RID_Dtor(IntPtr ptr); internal static extern void godot_icall_RID_Dtor(IntPtr ptr);
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static int godot_icall_RID_get_id(IntPtr ptr); internal static extern int godot_icall_RID_get_id(IntPtr ptr);
} }
} }

View file

@ -83,7 +83,7 @@ namespace Godot
/// <returns>The clipped <see cref="Rect2"/>.</returns> /// <returns>The clipped <see cref="Rect2"/>.</returns>
public Rect2 Clip(Rect2 b) public Rect2 Clip(Rect2 b)
{ {
var newRect = b; Rect2 newRect = b;
if (!Intersects(newRect)) if (!Intersects(newRect))
{ {
@ -123,7 +123,7 @@ namespace Godot
/// <returns>The expanded <see cref="Rect2"/>.</returns> /// <returns>The expanded <see cref="Rect2"/>.</returns>
public Rect2 Expand(Vector2 to) public Rect2 Expand(Vector2 to)
{ {
var expanded = this; Rect2 expanded = this;
Vector2 begin = expanded._position; Vector2 begin = expanded._position;
Vector2 end = expanded._position + expanded._size; Vector2 end = expanded._position + expanded._size;
@ -171,7 +171,7 @@ namespace Godot
/// <returns>The grown <see cref="Rect2"/>.</returns> /// <returns>The grown <see cref="Rect2"/>.</returns>
public Rect2 Grow(real_t by) public Rect2 Grow(real_t by)
{ {
var g = this; Rect2 g = this;
g._position.x -= by; g._position.x -= by;
g._position.y -= by; g._position.y -= by;
@ -194,7 +194,7 @@ namespace Godot
/// <returns>The grown <see cref="Rect2"/>.</returns> /// <returns>The grown <see cref="Rect2"/>.</returns>
public Rect2 GrowIndividual(real_t left, real_t top, real_t right, real_t bottom) public Rect2 GrowIndividual(real_t left, real_t top, real_t right, real_t bottom)
{ {
var g = this; Rect2 g = this;
g._position.x -= left; g._position.x -= left;
g._position.y -= top; g._position.y -= top;
@ -215,7 +215,7 @@ namespace Godot
/// <returns>The grown <see cref="Rect2"/>.</returns> /// <returns>The grown <see cref="Rect2"/>.</returns>
public Rect2 GrowMargin(Margin margin, real_t by) public Rect2 GrowMargin(Margin margin, real_t by)
{ {
var g = this; Rect2 g = this;
g = g.GrowIndividual(Margin.Left == margin ? by : 0, g = g.GrowIndividual(Margin.Left == margin ? by : 0,
Margin.Top == margin ? by : 0, Margin.Top == margin ? by : 0,

View file

@ -5,9 +5,9 @@ namespace Godot
{ {
public class SignalAwaiter : IAwaiter<object[]>, IAwaitable<object[]> public class SignalAwaiter : IAwaiter<object[]>, IAwaitable<object[]>
{ {
private bool completed; private bool _completed;
private object[] result; private object[] _result;
private Action action; private Action _action;
public SignalAwaiter(Object source, string signal, Object target) public SignalAwaiter(Object source, string signal, Object target)
{ {
@ -15,24 +15,24 @@ namespace Godot
} }
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static Error godot_icall_SignalAwaiter_connect(IntPtr source, string signal, IntPtr target, SignalAwaiter awaiter); internal static extern Error godot_icall_SignalAwaiter_connect(IntPtr source, string signal, IntPtr target, SignalAwaiter awaiter);
public bool IsCompleted public bool IsCompleted
{ {
get get
{ {
return completed; return _completed;
} }
} }
public void OnCompleted(Action action) public void OnCompleted(Action action)
{ {
this.action = action; this._action = action;
} }
public object[] GetResult() public object[] GetResult()
{ {
return result; return _result;
} }
public IAwaiter<object[]> GetAwaiter() public IAwaiter<object[]> GetAwaiter()
@ -42,19 +42,15 @@ namespace Godot
internal void SignalCallback(object[] args) internal void SignalCallback(object[] args)
{ {
completed = true; _completed = true;
result = args; _result = args;
_action?.Invoke();
if (action != null)
{
action();
}
} }
internal void FailureCallback() internal void FailureCallback()
{ {
action = null; _action = null;
completed = true; _completed = true;
} }
} }
} }

View file

@ -101,7 +101,7 @@ namespace Godot
/// <returns>The bigrams of this string.</returns> /// <returns>The bigrams of this string.</returns>
public static string[] Bigrams(this string instance) public static string[] Bigrams(this string instance)
{ {
var b = new string[instance.Length - 1]; string[] b = new string[instance.Length - 1];
for (int i = 0; i < b.Length; i++) for (int i = 0; i < b.Length; i++)
{ {
@ -267,7 +267,7 @@ namespace Godot
public static string Capitalize(this string instance) public static string Capitalize(this string instance)
{ {
string aux = instance.Replace("_", " ").ToLower(); string aux = instance.Replace("_", " ").ToLower();
var cap = string.Empty; string cap = string.Empty;
for (int i = 0; i < aux.GetSliceCount(" "); i++) for (int i = 0; i < aux.GetSliceCount(" "); i++)
{ {
@ -511,20 +511,20 @@ namespace Godot
int basepos = instance.Find("://"); int basepos = instance.Find("://");
string rs; string rs;
var @base = string.Empty; string directory = string.Empty;
if (basepos != -1) if (basepos != -1)
{ {
var end = basepos + 3; int end = basepos + 3;
rs = instance.Substring(end); rs = instance.Substring(end);
@base = instance.Substring(0, end); directory = instance.Substring(0, end);
} }
else else
{ {
if (instance.BeginsWith("/")) if (instance.BeginsWith("/"))
{ {
rs = instance.Substring(1); rs = instance.Substring(1);
@base = "/"; directory = "/";
} }
else else
{ {
@ -535,9 +535,9 @@ namespace Godot
int sep = Mathf.Max(rs.FindLast("/"), rs.FindLast("\\")); int sep = Mathf.Max(rs.FindLast("/"), rs.FindLast("\\"));
if (sep == -1) if (sep == -1)
return @base; return directory;
return @base + rs.Substr(0, sep); return directory + rs.Substr(0, sep);
} }
/// <summary> /// <summary>
@ -611,7 +611,7 @@ namespace Godot
/// <returns>The hexadecimal representation of this byte.</returns> /// <returns>The hexadecimal representation of this byte.</returns>
internal static string HexEncode(this byte b) internal static string HexEncode(this byte b)
{ {
var ret = string.Empty; string ret = string.Empty;
for (int i = 0; i < 2; i++) for (int i = 0; i < 2; i++)
{ {
@ -641,7 +641,7 @@ namespace Godot
/// <returns>The hexadecimal representation of this byte array.</returns> /// <returns>The hexadecimal representation of this byte array.</returns>
public static string HexEncode(this byte[] bytes) public static string HexEncode(this byte[] bytes)
{ {
var ret = string.Empty; string ret = string.Empty;
foreach (byte b in bytes) foreach (byte b in bytes)
{ {
@ -831,10 +831,10 @@ namespace Godot
return false; // Don't start with number plz return false; // Don't start with number plz
} }
bool validChar = instance[i] >= '0' && bool validChar = instance[i] == '_' ||
instance[i] <= '9' || instance[i] >= 'a' && (instance[i] >= 'a' && instance[i] <= 'z') ||
instance[i] <= 'z' || instance[i] >= 'A' && (instance[i] >= 'A' && instance[i] <= 'Z') ||
instance[i] <= 'Z' || instance[i] == '_'; (instance[i] >= '0' && instance[i] <= '9');
if (!validChar) if (!validChar)
return false; return false;
@ -1036,7 +1036,7 @@ namespace Godot
} }
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static byte[] godot_icall_String_md5_buffer(string str); internal static extern byte[] godot_icall_String_md5_buffer(string str);
/// <summary> /// <summary>
/// Returns the MD5 hash of the string as a string. /// Returns the MD5 hash of the string as a string.
@ -1050,7 +1050,7 @@ namespace Godot
} }
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static string godot_icall_String_md5_text(string str); internal static extern string godot_icall_String_md5_text(string str);
/// <summary> /// <summary>
/// Perform a case-insensitive comparison to another string, return -1 if less, 0 if equal and +1 if greater. /// Perform a case-insensitive comparison to another string, return -1 if less, 0 if equal and +1 if greater.
@ -1228,7 +1228,7 @@ namespace Godot
} }
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static int godot_icall_String_rfind(string str, string what, int from); internal static extern int godot_icall_String_rfind(string str, string what, int from);
/// <summary> /// <summary>
/// Perform a search for a substring, but start from the end of the string instead of the beginning. /// Perform a search for a substring, but start from the end of the string instead of the beginning.
@ -1245,7 +1245,7 @@ namespace Godot
} }
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static int godot_icall_String_rfindn(string str, string what, int from); internal static extern int godot_icall_String_rfindn(string str, string what, int from);
/// <summary> /// <summary>
/// Returns the right side of the string from a given position. /// Returns the right side of the string from a given position.
@ -1305,7 +1305,7 @@ namespace Godot
} }
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static byte[] godot_icall_String_sha256_buffer(string str); internal static extern byte[] godot_icall_String_sha256_buffer(string str);
/// <summary> /// <summary>
/// Returns the SHA-256 hash of the string as a string. /// Returns the SHA-256 hash of the string as a string.
@ -1319,7 +1319,7 @@ namespace Godot
} }
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static string godot_icall_String_sha256_text(string str); internal static extern string godot_icall_String_sha256_text(string str);
/// <summary> /// <summary>
/// Returns the similarity index of the text compared to this string. /// Returns the similarity index of the text compared to this string.
@ -1374,7 +1374,7 @@ namespace Godot
} }
[MethodImpl(MethodImplOptions.InternalCall)] [MethodImpl(MethodImplOptions.InternalCall)]
internal extern static string godot_icall_String_simplify_path(string str); internal static extern string godot_icall_String_simplify_path(string str);
/// <summary> /// <summary>
/// Split the string by a divisor string, return an array of the substrings. /// Split the string by a divisor string, return an array of the substrings.
@ -1425,7 +1425,8 @@ namespace Godot
return ret.ToArray(); return ret.ToArray();
} }
private static readonly char[] _nonPrintable = { private static readonly char[] _nonPrintable =
{
(char)00, (char)01, (char)02, (char)03, (char)04, (char)05, (char)00, (char)01, (char)02, (char)03, (char)04, (char)05,
(char)06, (char)07, (char)08, (char)09, (char)10, (char)11, (char)06, (char)07, (char)08, (char)09, (char)10, (char)11,
(char)12, (char)13, (char)14, (char)15, (char)16, (char)17, (char)12, (char)13, (char)14, (char)15, (char)16, (char)17,

View file

@ -168,7 +168,7 @@ namespace Godot
/// <returns>The resulting transform.</returns> /// <returns>The resulting transform.</returns>
public Transform LookingAt(Vector3 target, Vector3 up) public Transform LookingAt(Vector3 target, Vector3 up)
{ {
var t = this; Transform t = this;
t.SetLookAt(origin, target, up); t.SetLookAt(origin, target, up);
return t; return t;
} }
@ -205,7 +205,7 @@ namespace Godot
return new Transform(basis.Scaled(scale), origin * scale); return new Transform(basis.Scaled(scale), origin * scale);
} }
public void SetLookAt(Vector3 eye, Vector3 target, Vector3 up) private void SetLookAt(Vector3 eye, Vector3 target, Vector3 up)
{ {
// Make rotation matrix // Make rotation matrix
// Z vector // Z vector
@ -278,9 +278,9 @@ namespace Godot
return new Vector3 return new Vector3
( (
basis.Row0[0] * vInv.x + basis.Row1[0] * vInv.y + basis.Row2[0] * vInv.z, (basis.Row0[0] * vInv.x) + (basis.Row1[0] * vInv.y) + (basis.Row2[0] * vInv.z),
basis.Row0[1] * vInv.x + basis.Row1[1] * vInv.y + basis.Row2[1] * vInv.z, (basis.Row0[1] * vInv.x) + (basis.Row1[1] * vInv.y) + (basis.Row2[1] * vInv.z),
basis.Row0[2] * vInv.x + basis.Row1[2] * vInv.y + basis.Row2[2] * vInv.z (basis.Row0[2] * vInv.x) + (basis.Row1[2] * vInv.y) + (basis.Row2[2] * vInv.z)
); );
} }
@ -327,14 +327,14 @@ namespace Godot
} }
/// <summary> /// <summary>
/// Constructs a transformation matrix from the given <paramref name="quat"/> /// Constructs a transformation matrix from the given <paramref name="quaternion"/>
/// and <paramref name="origin"/> vector. /// and <paramref name="origin"/> vector.
/// </summary> /// </summary>
/// <param name="quat">The <see cref="Quat"/> to create the basis from.</param> /// <param name="quaternion">The <see cref="Quat"/> to create the basis from.</param>
/// <param name="origin">The origin vector, or column index 3.</param> /// <param name="origin">The origin vector, or column index 3.</param>
public Transform(Quat quat, Vector3 origin) public Transform(Quat quaternion, Vector3 origin)
{ {
basis = new Basis(quat); basis = new Basis(quaternion);
this.origin = origin; this.origin = origin;
} }

View file

@ -149,7 +149,7 @@ namespace Godot
if (det == 0) if (det == 0)
throw new InvalidOperationException("Matrix determinant is zero and cannot be inverted."); throw new InvalidOperationException("Matrix determinant is zero and cannot be inverted.");
var inv = this; Transform2D inv = this;
real_t temp = inv[0, 0]; real_t temp = inv[0, 0];
inv[0, 0] = inv[1, 1]; inv[0, 0] = inv[1, 1];
@ -176,7 +176,7 @@ namespace Godot
/// <returns>The determinant of the basis matrix.</returns> /// <returns>The determinant of the basis matrix.</returns>
private real_t BasisDeterminant() private real_t BasisDeterminant()
{ {
return x.x * y.y - x.y * y.x; return (x.x * y.y) - (x.y * y.x);
} }
/// <summary> /// <summary>
@ -238,8 +238,8 @@ namespace Godot
else else
{ {
real_t angle = weight * Mathf.Acos(dot); real_t angle = weight * Mathf.Acos(dot);
Vector2 v3 = (v2 - v1 * dot).Normalized(); Vector2 v3 = (v2 - (v1 * dot)).Normalized();
v = v1 * Mathf.Cos(angle) + v3 * Mathf.Sin(angle); v = (v1 * Mathf.Cos(angle)) + (v3 * Mathf.Sin(angle));
} }
// Extract parameters // Extract parameters
@ -263,7 +263,7 @@ namespace Godot
/// <returns>The inverse matrix.</returns> /// <returns>The inverse matrix.</returns>
public Transform2D Inverse() public Transform2D Inverse()
{ {
var inv = this; Transform2D inv = this;
// Swap // Swap
real_t temp = inv.x.y; real_t temp = inv.x.y;
@ -282,13 +282,13 @@ namespace Godot
/// <returns>The orthonormalized transform.</returns> /// <returns>The orthonormalized transform.</returns>
public Transform2D Orthonormalized() public Transform2D Orthonormalized()
{ {
var on = this; Transform2D on = this;
Vector2 onX = on.x; Vector2 onX = on.x;
Vector2 onY = on.y; Vector2 onY = on.y;
onX.Normalize(); onX.Normalize();
onY = onY - onX * onX.Dot(onY); onY = onY - (onX * onX.Dot(onY));
onY.Normalize(); onY.Normalize();
on.x = onX; on.x = onX;
@ -314,7 +314,7 @@ namespace Godot
/// <returns>The scaled transformation matrix.</returns> /// <returns>The scaled transformation matrix.</returns>
public Transform2D Scaled(Vector2 scale) public Transform2D Scaled(Vector2 scale)
{ {
var copy = this; Transform2D copy = this;
copy.x *= scale; copy.x *= scale;
copy.y *= scale; copy.y *= scale;
copy.origin *= scale; copy.origin *= scale;
@ -331,12 +331,12 @@ namespace Godot
private real_t Tdotx(Vector2 with) private real_t Tdotx(Vector2 with)
{ {
return this[0, 0] * with[0] + this[1, 0] * with[1]; return (this[0, 0] * with[0]) + (this[1, 0] * with[1]);
} }
private real_t Tdoty(Vector2 with) private real_t Tdoty(Vector2 with)
{ {
return this[0, 1] * with[0] + this[1, 1] * with[1]; return (this[0, 1] * with[0]) + (this[1, 1] * with[1]);
} }
/// <summary> /// <summary>
@ -350,7 +350,7 @@ namespace Godot
/// <returns>The translated matrix.</returns> /// <returns>The translated matrix.</returns>
public Transform2D Translated(Vector2 offset) public Transform2D Translated(Vector2 offset)
{ {
var copy = this; Transform2D copy = this;
copy.origin += copy.BasisXform(offset); copy.origin += copy.BasisXform(offset);
return copy; return copy;
} }
@ -478,7 +478,7 @@ namespace Godot
/// <summary> /// <summary>
/// Returns a Vector2 transformed (multiplied) by the inverse transformation matrix. /// Returns a Vector2 transformed (multiplied) by the inverse transformation matrix.
/// </summary> /// </summary>
/// <param name="vector">A vector to inversely transform.</param> /// <param name="vector">A Vector2 to inversely transform.</param>
/// <param name="transform">The transformation to apply.</param> /// <param name="transform">The transformation to apply.</param>
/// <returns>The inversely transformed Vector2.</returns> /// <returns>The inversely transformed Vector2.</returns>
public static Vector2 operator *(Vector2 vector, Transform2D transform) public static Vector2 operator *(Vector2 vector, Transform2D transform)
@ -522,7 +522,7 @@ namespace Godot
/// Returns a copy of the given Vector2[] transformed (multiplied) by transformation matrix. /// Returns a copy of the given Vector2[] transformed (multiplied) by transformation matrix.
/// </summary> /// </summary>
/// <param name="transform">The transformation to apply.</param> /// <param name="transform">The transformation to apply.</param>
/// <param name="array">a Vector2[] to transform.</param> /// <param name="array">A Vector2[] to transform.</param>
/// <returns>The transformed copy of the Vector2[].</returns> /// <returns>The transformed copy of the Vector2[].</returns>
public static Vector2[] operator *(Transform2D transform, Vector2[] array) public static Vector2[] operator *(Transform2D transform, Vector2[] array)
{ {

View file

@ -35,6 +35,7 @@ namespace Godot
/// The vector's X component. Also accessible by using the index position <c>[0]</c>. /// The vector's X component. Also accessible by using the index position <c>[0]</c>.
/// </summary> /// </summary>
public real_t x; public real_t x;
/// <summary> /// <summary>
/// The vector's Y component. Also accessible by using the index position <c>[1]</c>. /// The vector's Y component. Also accessible by using the index position <c>[1]</c>.
/// </summary> /// </summary>
@ -191,7 +192,7 @@ namespace Godot
/// <returns>The cross product value.</returns> /// <returns>The cross product value.</returns>
public real_t Cross(Vector2 b) public real_t Cross(Vector2 b)
{ {
return x * b.y - y * b.x; return (x * b.y) - (y * b.x);
} }
/// <summary> /// <summary>
@ -214,10 +215,12 @@ namespace Godot
real_t t2 = t * t; real_t t2 = t * t;
real_t t3 = t2 * t; real_t t3 = t2 * t;
return 0.5f * (p1 * 2.0f + return 0.5f * (
(-p0 + p2) * t + (p1 * 2.0f) +
(2.0f * p0 - 5.0f * p1 + 4 * p2 - p3) * t2 + ((-p0 + p2) * t) +
(-p0 + 3.0f * p1 - 3.0f * p2 + p3) * t3); (((2.0f * p0) - (5.0f * p1) + (4 * p2) - p3) * t2) +
((-p0 + (3.0f * p1) - (3.0f * p2) + p3) * t3)
);
} }
/// <summary> /// <summary>
@ -259,7 +262,7 @@ namespace Godot
/// <returns>The dot product of the two vectors.</returns> /// <returns>The dot product of the two vectors.</returns>
public real_t Dot(Vector2 with) public real_t Dot(Vector2 with)
{ {
return x * with.x + y * with.y; return (x * with.x) + (y * with.y);
} }
/// <summary> /// <summary>
@ -296,7 +299,7 @@ namespace Godot
/// <returns>The length of this vector.</returns> /// <returns>The length of this vector.</returns>
public real_t Length() public real_t Length()
{ {
return Mathf.Sqrt(x * x + y * y); return Mathf.Sqrt((x * x) + (y * y));
} }
/// <summary> /// <summary>
@ -307,7 +310,7 @@ namespace Godot
/// <returns>The squared length of this vector.</returns> /// <returns>The squared length of this vector.</returns>
public real_t LengthSquared() public real_t LengthSquared()
{ {
return x * x + y * y; return (x * x) + (y * y);
} }
/// <summary> /// <summary>
@ -372,10 +375,13 @@ namespace Godot
/// <returns>The resulting vector.</returns> /// <returns>The resulting vector.</returns>
public Vector2 MoveToward(Vector2 to, real_t delta) public Vector2 MoveToward(Vector2 to, real_t delta)
{ {
var v = this; Vector2 v = this;
var vd = to - v; Vector2 vd = to - v;
var len = vd.Length(); real_t len = vd.Length();
return len <= delta || len < Mathf.Epsilon ? to : v + vd / len * delta; if (len <= delta || len < Mathf.Epsilon)
return to;
return v + (vd / len * delta);
} }
/// <summary> /// <summary>
@ -384,7 +390,7 @@ namespace Godot
/// <returns>A normalized version of the vector.</returns> /// <returns>A normalized version of the vector.</returns>
public Vector2 Normalized() public Vector2 Normalized()
{ {
var v = this; Vector2 v = this;
v.Normalize(); v.Normalize();
return v; return v;
} }
@ -454,7 +460,7 @@ namespace Godot
throw new ArgumentException("Argument is not normalized", nameof(normal)); throw new ArgumentException("Argument is not normalized", nameof(normal));
} }
#endif #endif
return 2 * Dot(normal) * normal - this; return (2 * Dot(normal) * normal) - this;
} }
/// <summary> /// <summary>
@ -464,8 +470,11 @@ namespace Godot
/// <returns>The rotated vector.</returns> /// <returns>The rotated vector.</returns>
public Vector2 Rotated(real_t phi) public Vector2 Rotated(real_t phi)
{ {
real_t rads = Angle() + phi; real_t sine = Mathf.Sin(phi);
return new Vector2(Mathf.Cos(rads), Mathf.Sin(rads)) * Length(); real_t cosi = Mathf.Cos(phi);
return new Vector2(
x * cosi - y * sine,
x * sine + y * cosi);
} }
/// <summary> /// <summary>
@ -536,7 +545,7 @@ namespace Godot
/// <returns>The slid vector.</returns> /// <returns>The slid vector.</returns>
public Vector2 Slide(Vector2 normal) public Vector2 Slide(Vector2 normal)
{ {
return this - normal * Dot(normal); return this - (normal * Dot(normal));
} }
/// <summary> /// <summary>
@ -802,11 +811,7 @@ namespace Godot
/// <returns>A string representation of this vector.</returns> /// <returns>A string representation of this vector.</returns>
public override string ToString() public override string ToString()
{ {
return String.Format("({0}, {1})", new object[] return $"({x}, {y})";
{
x.ToString(),
y.ToString()
});
} }
/// <summary> /// <summary>
@ -815,11 +820,7 @@ namespace Godot
/// <returns>A string representation of this vector.</returns> /// <returns>A string representation of this vector.</returns>
public string ToString(string format) public string ToString(string format)
{ {
return String.Format("({0}, {1})", new object[] return $"({x.ToString(format)}, {y.ToString(format)})";
{
x.ToString(format),
y.ToString(format)
});
} }
} }
} }

View file

@ -39,10 +39,12 @@ namespace Godot
/// The vector's X component. Also accessible by using the index position <c>[0]</c>. /// The vector's X component. Also accessible by using the index position <c>[0]</c>.
/// </summary> /// </summary>
public real_t x; public real_t x;
/// <summary> /// <summary>
/// The vector's Y component. Also accessible by using the index position <c>[1]</c>. /// The vector's Y component. Also accessible by using the index position <c>[1]</c>.
/// </summary> /// </summary>
public real_t y; public real_t y;
/// <summary> /// <summary>
/// The vector's Z component. Also accessible by using the index position <c>[2]</c>. /// The vector's Z component. Also accessible by using the index position <c>[2]</c>.
/// </summary> /// </summary>
@ -158,9 +160,9 @@ namespace Godot
{ {
return new Vector3 return new Vector3
( (
y * b.z - z * b.y, (y * b.z) - (z * b.y),
z * b.x - x * b.z, (z * b.x) - (x * b.z),
x * b.y - y * b.x (x * b.y) - (y * b.x)
); );
} }
@ -185,10 +187,10 @@ namespace Godot
real_t t3 = t2 * t; real_t t3 = t2 * t;
return 0.5f * ( return 0.5f * (
p1 * 2.0f + (-p0 + p2) * t + (p1 * 2.0f) + ((-p0 + p2) * t) +
(2.0f * p0 - 5.0f * p1 + 4f * p2 - p3) * t2 + (((2.0f * p0) - (5.0f * p1) + (4f * p2) - p3) * t2) +
(-p0 + 3.0f * p1 - 3.0f * p2 + p3) * t3 ((-p0 + (3.0f * p1) - (3.0f * p2) + p3) * t3)
); );
} }
/// <summary> /// <summary>
@ -231,7 +233,7 @@ namespace Godot
/// <returns>The dot product of the two vectors.</returns> /// <returns>The dot product of the two vectors.</returns>
public real_t Dot(Vector3 b) public real_t Dot(Vector3 b)
{ {
return x * b.x + y * b.y + z * b.z; return (x * b.x) + (y * b.y) + (z * b.z);
} }
/// <summary> /// <summary>
@ -352,10 +354,13 @@ namespace Godot
/// <returns>The resulting vector.</returns> /// <returns>The resulting vector.</returns>
public Vector3 MoveToward(Vector3 to, real_t delta) public Vector3 MoveToward(Vector3 to, real_t delta)
{ {
var v = this; Vector3 v = this;
var vd = to - v; Vector3 vd = to - v;
var len = vd.Length(); real_t len = vd.Length();
return len <= delta || len < Mathf.Epsilon ? to : v + vd / len * delta; if (len <= delta || len < Mathf.Epsilon)
return to;
return v + (vd / len * delta);
} }
/// <summary> /// <summary>
@ -364,7 +369,7 @@ namespace Godot
/// <returns>A normalized version of the vector.</returns> /// <returns>A normalized version of the vector.</returns>
public Vector3 Normalized() public Vector3 Normalized()
{ {
var v = this; Vector3 v = this;
v.Normalize(); v.Normalize();
return v; return v;
} }
@ -440,7 +445,7 @@ namespace Godot
throw new ArgumentException("Argument is not normalized", nameof(normal)); throw new ArgumentException("Argument is not normalized", nameof(normal));
} }
#endif #endif
return 2.0f * Dot(normal) * normal - this; return (2.0f * Dot(normal) * normal) - this;
} }
/// <summary> /// <summary>
@ -550,7 +555,7 @@ namespace Godot
/// <returns>The slid vector.</returns> /// <returns>The slid vector.</returns>
public Vector3 Slide(Vector3 normal) public Vector3 Slide(Vector3 normal)
{ {
return this - normal * Dot(normal); return this - (normal * Dot(normal));
} }
/// <summary> /// <summary>
@ -872,12 +877,7 @@ namespace Godot
/// <returns>A string representation of this vector.</returns> /// <returns>A string representation of this vector.</returns>
public override string ToString() public override string ToString()
{ {
return String.Format("({0}, {1}, {2})", new object[] return $"({x}, {y}, {z})";
{
x.ToString(),
y.ToString(),
z.ToString()
});
} }
/// <summary> /// <summary>
@ -886,12 +886,7 @@ namespace Godot
/// <returns>A string representation of this vector.</returns> /// <returns>A string representation of this vector.</returns>
public string ToString(string format) public string ToString(string format)
{ {
return String.Format("({0}, {1}, {2})", new object[] return $"({x.ToString(format)}, {y.ToString(format)}, {z.ToString(format)})";
{
x.ToString(format),
y.ToString(format),
z.ToString(format)
});
} }
} }
} }