diff --git a/csharp-api/AssemblyGenerator/ClassGenerator.cs b/csharp-api/AssemblyGenerator/ClassGenerator.cs index c74c2f95e..495e642c0 100644 --- a/csharp-api/AssemblyGenerator/ClassGenerator.cs +++ b/csharp-api/AssemblyGenerator/ClassGenerator.cs @@ -19,6 +19,8 @@ public class PseudoProperty { public REFrameworkNET.Method? getter; public REFrameworkNET.Method? setter; public REFrameworkNET.TypeDefinition? type; + public bool indexer = false; + public REFrameworkNET.TypeDefinition? indexType; }; private Dictionary pseudoProperties = []; @@ -68,24 +70,50 @@ public ClassGenerator(string className_, REFrameworkNET.TypeDefinition t_) { continue; } - if (method.Name.StartsWith("get_") && method.Parameters.Count == 0 && method.ReturnType.FullName != "System.Void") { - // Add the getter to the pseudo property (create if it doesn't exist) - var propertyName = method.Name[4..]; - if (!pseudoProperties.ContainsKey(propertyName)) { - pseudoProperties[propertyName] = new PseudoProperty(); - } + if (method.Name.StartsWith("get_") && method.ReturnType.FullName != "System.Void") { + if (method.Parameters.Count == 0) { + // Add the getter to the pseudo property (create if it doesn't exist) + var propertyName = method.Name[4..]; + if (!pseudoProperties.ContainsKey(propertyName)) { + pseudoProperties[propertyName] = new PseudoProperty(); + } + + pseudoProperties[propertyName].getter = method; + pseudoProperties[propertyName].type = method.ReturnType; + } else if (method.Parameters.Count == 1 && method.Name == "get_Item") { + // This is an indexer property + var propertyName = method.Name[4..]; + if (!pseudoProperties.ContainsKey(propertyName)) { + pseudoProperties[propertyName] = new PseudoProperty(); + } - pseudoProperties[propertyName].getter = method; - pseudoProperties[propertyName].type = method.ReturnType; - } else if (method.Name.StartsWith("set_") && method.Parameters.Count == 1) { - // Add the setter to the pseudo property (create if it doesn't exist) - var propertyName = method.Name[4..]; - if (!pseudoProperties.ContainsKey(propertyName)) { - pseudoProperties[propertyName] = new PseudoProperty(); + pseudoProperties[propertyName].getter = method; + pseudoProperties[propertyName].type = method.ReturnType; + pseudoProperties[propertyName].indexer = true; + pseudoProperties[propertyName].indexType = method.Parameters[0].Type; } + } else if (method.Name.StartsWith("set_")) { + if (method.Parameters.Count == 1) { + // Add the setter to the pseudo property (create if it doesn't exist) + var propertyName = method.Name[4..]; + if (!pseudoProperties.ContainsKey(propertyName)) { + pseudoProperties[propertyName] = new PseudoProperty(); + } - pseudoProperties[propertyName].setter = method; - pseudoProperties[propertyName].type = method.Parameters[0].Type; + pseudoProperties[propertyName].setter = method; + pseudoProperties[propertyName].type = method.Parameters[0].Type; + } else if (method.Parameters.Count == 2 && method.Name == "set_Item") { + // This is an indexer property + var propertyName = method.Name[4..]; + if (!pseudoProperties.ContainsKey(propertyName)) { + pseudoProperties[propertyName] = new PseudoProperty(); + } + + pseudoProperties[propertyName].setter = method; + pseudoProperties[propertyName].type = method.Parameters[1].Type; + pseudoProperties[propertyName].indexer = true; + pseudoProperties[propertyName].indexType = method.Parameters[0].Type; + } } else { methods.Add(method); } @@ -332,9 +360,17 @@ private TypeDeclarationSyntax GenerateProperties(List base var propertyType = MakeProperType(property.Value.type, t); var propertyName = new string(property.Key); - var propertyDeclaration = SyntaxFactory.PropertyDeclaration(propertyType, propertyName) + BasePropertyDeclarationSyntax propertyDeclaration = SyntaxFactory.PropertyDeclaration(propertyType, propertyName) .AddModifiers([SyntaxFactory.Token(SyntaxKind.PublicKeyword)]); + if (property.Value.indexer) { + ParameterSyntax parameter = SyntaxFactory.Parameter(SyntaxFactory.Identifier("index")).WithType(MakeProperType(property.Value.indexType, t)); + + propertyDeclaration = SyntaxFactory.IndexerDeclaration(propertyType) + .AddModifiers([SyntaxFactory.Token(SyntaxKind.PublicKeyword)]) + .AddParameterListParameters(parameter); + } + bool shouldAddNewKeyword = false; bool shouldAddStaticKeyword = false; diff --git a/csharp-api/test/Test/ObjectExplorer.cs b/csharp-api/test/Test/ObjectExplorer.cs index 9b36369ae..c65efe49a 100644 --- a/csharp-api/test/Test/ObjectExplorer.cs +++ b/csharp-api/test/Test/ObjectExplorer.cs @@ -475,7 +475,7 @@ public static void Render() { if (ImGui.TreeNode("AppDomain")) { if (assemblies != null && ImGui.TreeNode("Assemblies")) { for (int i = 0; i < assemblies.Length; i++) { - var assembly = assemblies.get_Item(i); + var assembly = assemblies[i]; var assemblyT = (assembly as IObject).GetTypeDefinition(); var location = assembly.Location ?? "null"; diff --git a/csharp-api/test/Test/Test.cs b/csharp-api/test/Test/Test.cs index 46d384882..94407a9bb 100644 --- a/csharp-api/test/Test/Test.cs +++ b/csharp-api/test/Test/Test.cs @@ -93,11 +93,10 @@ public static void Entry() { var appdomain = _System.AppDomain.CurrentDomain; var assemblies = appdomain.GetAssemblies(); - // TODO: Make this work! get_length, get_item is ugly! //foreach (REFrameworkNET.ManagedObject assemblyRaw in assemblies) { for (int i = 0; i < assemblies.Length; i++) { //var assembly = assemblyRaw.As<_System.Reflection.Assembly>(); - var assembly = assemblies.get_Item(i); + var assembly = assemblies[i]; REFrameworkNET.API.LogInfo("Assembly: " + assembly.Location?.ToString()); } @@ -149,7 +148,7 @@ public static void Entry() { var meshes = via.SceneManager.MainScene.findComponents(via.render.Mesh.REFType.RuntimeType.As<_System.Type>()); for (int i = 0; i < meshes.Length; i++) { - var mesh = (meshes.get_Item(i) as IObject).As(); + var mesh = (meshes[i] as IObject).As(); mesh.DrawRaytracing = true; } diff --git a/csharp-api/test/Test/TestRE2.cs b/csharp-api/test/Test/TestRE2.cs index cff7e55fd..ee39af29d 100644 --- a/csharp-api/test/Test/TestRE2.cs +++ b/csharp-api/test/Test/TestRE2.cs @@ -44,6 +44,7 @@ public static void ImGuiCallback() { ImGui.SetNextWindowSize(new System.Numerics.Vector2(500, 500), ImGuiCond.FirstUseEver); if (ImGui.Begin("RE2 Bench")) { + ImGui.Text(RE2HookBenchmark.MeasureCount.ToString() + " calls"); ImGui.PushStyleColor(ImGuiCol.Text, new System.Numerics.Vector4(0.5f, 1f, 0.4f, 1.0f)); ImGui.PlotLines("Overall Benchmark", ref RE2HookBenchmark.BenchmarkData[0], 1000, RE2HookBenchmark.MeasureCount % 1000, RE2HookBenchmark.RunningAvg.ToString("0.000") + " µs", 0, (float)RE2HookBenchmark.RunningAvg * 2.0f, new System.Numerics.Vector2(0, 40)); @@ -260,7 +261,7 @@ static PreHookResult Pre(Span args) { var hitController = ManagedObject.ToManagedObject(args[1]).As(); Bench(() => { - for (int i = 0; i < 10000; ++i) { + for (int i = 0; i < 10; ++i) { var gameobj = hitController.GameObject; if (gameobj != null) { } @@ -280,22 +281,30 @@ static void Post(ref ulong retval) { static System.Diagnostics.Stopwatch cameraFovStopwatch = new(); static System.Diagnostics.Stopwatch cameraFovStopwatch2 = new(); - [Callback(typeof(BeginRendering), CallbackType.Pre)] - static void BeginRenderingCallback() { - if (!cameraFovStopwatch2.IsRunning) { - cameraFovStopwatch2.Start(); + [Callback(typeof(LockScene), CallbackType.Post)] + static void LockSceneCallback() { + var playerManager = API.GetManagedSingletonT(); + if (playerManager == null) { + return; } - cameraFovStopwatch.Stop(); - var deltaSeconds = cameraFovStopwatch.Elapsed.TotalMilliseconds / 1000.0; - var elapsedSeconds = cameraFovStopwatch2.Elapsed.TotalMilliseconds / 1000.0; - cameraFovStopwatch.Restart(); + var player = playerManager.CurrentPlayer; + if (player == null) { + return; + } - var wantedValue = Math.Sin(elapsedSeconds) + 1.0; - cameraFovLerp = double.Lerp(cameraFovLerp, wantedValue, cameraFovLerpSpeed * deltaSeconds); + var transform = player.Transform; + var headJoint = transform.getJointByName("head"); + + if (headJoint == null) { + return; + } var camera = via.SceneManager.MainView.PrimaryCamera; - var degrees = cameraFovLerp * 180.0 / Math.PI; - camera.FOV = (float)degrees; + camera.GameObject.Transform.Position = headJoint.Position; + camera.GameObject.Transform.Joints[0].Position = headJoint.Position; + + // Shrink head scale + headJoint.LocalScale = via.vec3.Zero; } } \ No newline at end of file