Failed to show and edit script sctruct

+ SizeInBytes for MonoFields
This commit is contained in:
Simon Lübeß
2023-07-28 11:48:01 +02:00
parent f39acdadb3
commit 00dc3faa19
4 changed files with 131 additions and 4 deletions
@@ -514,11 +514,89 @@ namespace GlitchyEditor.EditWindows
scriptInstance.SetFieldValue<T>(scriptField, value); scriptInstance.SetFieldValue<T>(scriptField, value);
} }
T GetData<T>(void* instance, ScriptField scriptField)
{
T data = default;
Mono.mono_field_get_value((.)instance, scriptField.[Friend]_monoField, &data);
return data;
}
void GetData<T>(void* instance, ScriptField scriptField, T* data)
{
Mono.mono_field_get_value((.)instance, scriptField.[Friend]_monoField, data);
}
void SetData<T>(void* instance, ScriptField scriptField, in T value)
{
Mono.mono_field_set_value((.)instance, scriptField.[Friend]_monoField, &value);
}
void SetData<T>(void* instance, ScriptField scriptField, T* data)
{
Mono.mono_field_set_value((.)instance, scriptField.[Friend]_monoField, data);
}
if (scriptComponent.Instance?.IsInitialized == true) if (scriptComponent.Instance?.IsInitialized == true)
{ {
SharpClass sharpClass = scriptComponent.Instance.ScriptClass; SharpClass sharpClass = scriptComponent.Instance.ScriptClass;
ScriptInstance scriptInstance = scriptComponent.Instance; ScriptInstance scriptInstance = scriptComponent.Instance;
/*void DoFunnyStuff(void* instance, SharpType sharpType)
{
for (let (fieldName, scriptField) in sharpType.Fields)
{
var monoField = scriptField.[Friend]_monoField;
switch (scriptField.FieldType)
{
case .Float:
var value = GetData<float>(instance, scriptField);
if (ImGui.DragScalar(fieldName.ToScopeCStr!(), .Float, &value))
SetData(instance, scriptField, value);
case .Struct:
{
var v = Mono.mono_field_get_value_object(ScriptEngine.[Friend]s_AppDomain, scriptField.[Friend]_monoField, (.)instance);
void* dataPtr = Mono.mono_object_unbox(v);
Span<uint8> data = .((.)dataPtr, scriptField.SizeInBytes);
if (ImGui.CollapsingHeader(fieldName.Ptr))
{
DoFunnyStuff(dataPtr, scriptField.SharpType);
}
SetData<MonoObject>(instance, scriptField, v);
//Mono.mono_field_set_value_object(ScriptEngine.[Friend]s_AppDomain, scriptField.[Friend]_monoField, (.)instance);
//uint8* data = ;
/*uint8[] data = scope .[scriptField.SizeInBytes];
GetData(instance, scriptField, data.Ptr);
if (ImGui.CollapsingHeader(fieldName.Ptr))
{
DoFunnyStuff(data.Ptr, scriptField.SharpType);
}
MonoObject* boxed = Mono.mono_value_box(ScriptEngine.[Friend]s_AppDomain, ((SharpClass)scriptField.SharpType).[Friend]_monoClass, data.Ptr);
SetData<MonoObject>(instance, scriptField, boxed);*/
//Mono.mono_field_get_value(instance, scriptField.[Friend]_monoField, data.Ptr);
}
default:
//Log.EngineLogger.Error($"Unhandled field type {scriptField.FieldType}");
}
}
}
DoFunnyStuff(scriptInstance.[Friend]_instance, sharpClass);*/
for (let (fieldName, scriptField) in sharpClass.Fields) for (let (fieldName, scriptField) in sharpClass.Fields)
{ {
var monoField = scriptField.[Friend]_monoField; var monoField = scriptField.[Friend]_monoField;
@@ -594,6 +672,22 @@ namespace GlitchyEditor.EditWindows
// TODO! // TODO!
case .Struct: case .Struct:
// TODO! // TODO!
/*{
uint8[] data = scope .[scriptField.SizeInBytes];
Mono.mono_field_get_value(scriptInstance.[Friend]_instance, scriptField.[Friend]_monoField, data.Ptr);
//scriptField.
//scriptInstance.GetFieldValue();
//scriptInstance.ScriptClass.Fields[]
/*
var value = GetFieldValue<double>(scriptInstance, scriptField);
if (ImGui.DragScalar(fieldName.ToScopeCStr!(), .Double, &value))
SetFieldValue(scriptInstance, scriptField, value);
*/
}*/
default: default:
Log.EngineLogger.Error($"Unhandled field type {scriptField.FieldType}"); Log.EngineLogger.Error($"Unhandled field type {scriptField.FieldType}");
} }
+17 -2
View File
@@ -14,14 +14,16 @@ public struct ScriptField
public bool IsStatic; public bool IsStatic;
public ScriptFieldType FieldType; public ScriptFieldType FieldType;
public SharpType SharpType; public SharpType SharpType;
public int SizeInBytes;
internal this(StringView name, MonoClassField* monoField, bool isStatic, ScriptFieldType fieldType, SharpType sharpType) internal this(StringView name, MonoClassField* monoField, bool isStatic, ScriptFieldType fieldType, int sizeInBytes, SharpType sharpType)
{ {
Name = name; Name = name;
_monoField = monoField; _monoField = monoField;
IsStatic = isStatic; IsStatic = isStatic;
FieldType = fieldType; FieldType = fieldType;
SharpType = sharpType; SharpType = sharpType;
SizeInBytes = sizeInBytes;
} }
public bool IsType(SharpClass otherClass, bool checkIfSubtype) public bool IsType(SharpClass otherClass, bool checkIfSubtype)
@@ -173,7 +175,20 @@ class SharpClass : SharpType
(attributes != null && (attributes != null &&
Mono.mono_custom_attrs_has_attr(attributes, ScriptEngine.Attributes.s_ShowInEditorAttribute))) Mono.mono_custom_attrs_has_attr(attributes, ScriptEngine.Attributes.s_ShowInEditorAttribute)))
{ {
_monoFields[name] = .(name, currentField, flags.HasFlag(.Static), fieldType, sharpType); MonoClass* fieldClass = Mono.mono_type_get_class(type);
int sizeInBytes = 8;
if (fieldClass != null)
{
sizeInBytes = Mono.mono_class_instance_size(fieldClass);
}
else
{
}
_monoFields[name] = .(name, currentField, flags.HasFlag(.Static), fieldType, sizeInBytes, sharpType);
} }
} }
} }
+15 -1
View File
@@ -514,12 +514,26 @@ static class ScriptEngine
Log.EngineLogger.AssertDebug(scriptClass != null); Log.EngineLogger.AssertDebug(scriptClass != null);
for (let (fieldName, field) in scriptClass.Fields) void AddFieldsToMap(Dictionary<StringView, ScriptField> classFields, StringView baseName)
{ {
for (let (fieldName, field) in classFields)
{
/*if (field.FieldType == .Struct && field.SharpType != null)
{
AddFieldsToMap(field.SharpType.Fields, scope $"{baseName}{fieldName}.");
}
else
{
entityFields.Add(new $"{baseName}{fieldName}", ScriptFieldInstance(field.FieldType));
}*/
entityFields.Add(new String(fieldName), ScriptFieldInstance(field.FieldType)); entityFields.Add(new String(fieldName), ScriptFieldInstance(field.FieldType));
} }
} }
AddFieldsToMap(scriptClass.Fields, "");
}
public static ScriptFieldMap GetScriptFieldMap(Entity entity) public static ScriptFieldMap GetScriptFieldMap(Entity entity)
{ {
Log.EngineLogger.AssertDebug(entity.IsValid); Log.EngineLogger.AssertDebug(entity.IsValid);
+4
View File
@@ -265,6 +265,10 @@ static class Mono
[LinkName(.C)] [LinkName(.C)]
public static extern MonoVTable* mono_class_vtable(MonoDomain* domain, MonoClass* @class); public static extern MonoVTable* mono_class_vtable(MonoDomain* domain, MonoClass* @class);
[LinkName(.C)]
public static extern MonoObject* mono_value_box(MonoDomain* domain, MonoClass* klass, gpointer value);
} }
struct MonoDomain; struct MonoDomain;