mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 13:01:52 +00:00
Failed to show and edit script sctruct
+ SizeInBytes for MonoFields
This commit is contained in:
@@ -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}");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -514,10 +514,24 @@ 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)
|
||||||
{
|
{
|
||||||
entityFields.Add(new String(fieldName), ScriptFieldInstance(field.FieldType));
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AddFieldsToMap(scriptClass.Fields, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ScriptFieldMap GetScriptFieldMap(Entity entity)
|
public static ScriptFieldMap GetScriptFieldMap(Entity entity)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user