@@ -167,7 +167,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
||||
Presenter.Undo?.AddAction(new MultiUndoAction(actions));
|
||||
|
||||
// Build ragdoll
|
||||
SceneGraph.Actors.AnimatedModelNode.BuildRagdoll(animatedModel, options, ragdoll);
|
||||
AnimatedModelNode.BuildRagdoll(animatedModel, options, ragdoll);
|
||||
}
|
||||
|
||||
private void OnRebuildBone(Button button)
|
||||
@@ -191,7 +191,7 @@ namespace FlaxEditor.CustomEditors.Dedicated
|
||||
}
|
||||
|
||||
// Build ragdoll
|
||||
SceneGraph.Actors.AnimatedModelNode.BuildRagdoll(animatedModel, new AnimatedModelNode.RebuildOptions(), ragdoll, name);
|
||||
AnimatedModelNode.BuildRagdoll(animatedModel, new AnimatedModelNode.RebuildOptions(), ragdoll, name);
|
||||
}
|
||||
|
||||
private void OnRemoveBone(Button button)
|
||||
|
||||
@@ -50,13 +50,13 @@ namespace FlaxEngine.Interop
|
||||
/// <remarks>The resources must be released by calling FreePooled() instead of Free()-method.</remarks>
|
||||
public static ManagedArray WrapPooledArray(Array arr, Type arrayType)
|
||||
{
|
||||
ManagedArray managedArray = ManagedArrayPool.Get(arr.Length * Marshal.SizeOf(arr.GetType().GetElementType()));
|
||||
ManagedArray managedArray = ManagedArrayPool.Get(arr.Length * NativeInterop.GetTypeSize(arr.GetType().GetElementType()));
|
||||
managedArray.WrapArray(arr, arrayType);
|
||||
return managedArray;
|
||||
}
|
||||
|
||||
internal static ManagedArray AllocateNewArray(int length, Type arrayType, Type elementType)
|
||||
=> new ManagedArray((IntPtr)NativeInterop.NativeAlloc(length, Marshal.SizeOf(elementType)), length, arrayType, elementType);
|
||||
=> new ManagedArray((IntPtr)NativeInterop.NativeAlloc(length, NativeInterop.GetTypeSize(elementType)), length, arrayType, elementType);
|
||||
|
||||
internal static ManagedArray AllocateNewArray(IntPtr ptr, int length, Type arrayType, Type elementType)
|
||||
=> new ManagedArray(ptr, length, arrayType, elementType);
|
||||
@@ -86,7 +86,7 @@ namespace FlaxEngine.Interop
|
||||
_length = arr.Length;
|
||||
_arrayType = arrayType;
|
||||
_elementType = arr.GetType().GetElementType();
|
||||
_elementSize = Marshal.SizeOf(_elementType);
|
||||
_elementSize = NativeInterop.GetTypeSize(_elementType);
|
||||
}
|
||||
|
||||
internal void Allocate<T>(int length) where T : unmanaged
|
||||
@@ -117,7 +117,7 @@ namespace FlaxEngine.Interop
|
||||
_length = length;
|
||||
_arrayType = arrayType;
|
||||
_elementType = elementType;
|
||||
_elementSize = Marshal.SizeOf(elementType);
|
||||
_elementSize = NativeInterop.GetTypeSize(_elementType);
|
||||
}
|
||||
|
||||
~ManagedArray()
|
||||
|
||||
@@ -885,6 +885,7 @@ namespace FlaxEngine.Interop
|
||||
handle.Free();
|
||||
fieldHandleCacheCollectible.Clear();
|
||||
#endif
|
||||
_typeSizeCache.Clear();
|
||||
|
||||
foreach (var pair in classAttributesCacheCollectible)
|
||||
pair.Value.Free();
|
||||
|
||||
@@ -46,6 +46,7 @@ namespace FlaxEngine.Interop
|
||||
#endif
|
||||
private static Dictionary<object, ManagedHandle> classAttributesCacheCollectible = new();
|
||||
private static Dictionary<Assembly, ManagedHandle> assemblyHandles = new();
|
||||
private static Dictionary<Type, int> _typeSizeCache = new();
|
||||
|
||||
private static Dictionary<string, IntPtr> loadedNativeLibraries = new();
|
||||
internal static Dictionary<string, string> nativeLibraryPaths = new();
|
||||
@@ -584,7 +585,7 @@ namespace FlaxEngine.Interop
|
||||
else if (fieldType.IsClass || fieldType.IsPointer)
|
||||
fieldAlignment = IntPtr.Size;
|
||||
else
|
||||
fieldAlignment = Marshal.SizeOf(fieldType);
|
||||
fieldAlignment = GetTypeSize(fieldType);
|
||||
}
|
||||
|
||||
internal static void ToManagedField(FieldInfo field, ref T fieldOwner, IntPtr fieldPtr, out int fieldOffset)
|
||||
@@ -1088,6 +1089,26 @@ namespace FlaxEngine.Interop
|
||||
return handle;
|
||||
}
|
||||
|
||||
internal static int GetTypeSize(Type type)
|
||||
{
|
||||
if (!_typeSizeCache.TryGetValue(type, out var size))
|
||||
{
|
||||
try
|
||||
{
|
||||
size = Marshal.SizeOf(type);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Workaround the issue where structure defined within generic type instance (eg. MyType<int>.MyStruct) fails to get size
|
||||
// https://github.com/dotnet/runtime/issues/46426
|
||||
var obj = Activator.CreateInstance(type);
|
||||
size = Marshal.SizeOf(obj);
|
||||
}
|
||||
_typeSizeCache.Add(type, size);
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
private static class DelegateHelpers
|
||||
{
|
||||
#if USE_AOT
|
||||
|
||||
@@ -23,8 +23,8 @@ namespace FlaxEngine
|
||||
if (_keyframes == null || _keyframes.Length != count)
|
||||
_keyframes = new BezierCurve<Transform>.Keyframe[count];
|
||||
#if !BUILD_RELEASE
|
||||
if (Marshal.SizeOf(typeof(BezierCurve<Transform>.Keyframe)) != Transform.SizeInBytes * 3 + sizeof(float))
|
||||
throw new Exception("Invalid size of BezierCurve keyframe " + Marshal.SizeOf(typeof(BezierCurve<Transform>.Keyframe)) + " bytes.");
|
||||
if (System.Runtime.CompilerServices.Unsafe.SizeOf<BezierCurve<Transform>.Keyframe>() != Transform.SizeInBytes * 3 + sizeof(float))
|
||||
throw new Exception("Invalid size of BezierCurve keyframe " + System.Runtime.CompilerServices.Unsafe.SizeOf<BezierCurve<Transform>.Keyframe>() + " bytes.");
|
||||
#endif
|
||||
Internal_GetKeyframes(__unmanagedPtr, _keyframes);
|
||||
return _keyframes;
|
||||
|
||||
Reference in New Issue
Block a user