Skip to content

Commit

Permalink
.NET: Add support for indexers
Browse files Browse the repository at this point in the history
  • Loading branch information
praydog committed May 13, 2024
1 parent 9f4556f commit 3ab5846
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 33 deletions.
68 changes: 52 additions & 16 deletions csharp-api/AssemblyGenerator/ClassGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, PseudoProperty> pseudoProperties = [];
Expand Down Expand Up @@ -68,24 +70,50 @@ public class PseudoProperty {
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);
}
Expand Down Expand Up @@ -332,9 +360,17 @@ public class PseudoProperty {
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;
Expand Down
2 changes: 1 addition & 1 deletion csharp-api/test/Test/ObjectExplorer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,7 @@ class ObjectExplorer {
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";

Expand Down
5 changes: 2 additions & 3 deletions csharp-api/test/Test/Test.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,10 @@ public class DangerousFunctions {
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());
}

Expand Down Expand Up @@ -149,7 +148,7 @@ public class DangerousFunctions {

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<via.render.Mesh>();
var mesh = (meshes[i] as IObject).As<via.render.Mesh>();
mesh.DrawRaytracing = true;
}

Expand Down
35 changes: 22 additions & 13 deletions csharp-api/test/Test/TestRE2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public class TestRE2Plugin {

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));
Expand Down Expand Up @@ -260,7 +261,7 @@ internal class ThreadData {
var hitController = ManagedObject.ToManagedObject(args[1]).As<app.Collision.HitController>();

Bench(() => {
for (int i = 0; i < 10000; ++i) {
for (int i = 0; i < 10; ++i) {
var gameobj = hitController.GameObject;
if (gameobj != null) {
}
Expand All @@ -280,22 +281,30 @@ internal class ThreadData {
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<app.ropeway.PlayerManager>();
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;
}
}

0 comments on commit 3ab5846

Please sign in to comment.