diff --git a/Source/Editor/Surface/Elements/FloatValue.cs b/Source/Editor/Surface/Elements/FloatValue.cs index 7674c68b9..56539e3e3 100644 --- a/Source/Editor/Surface/Elements/FloatValue.cs +++ b/Source/Editor/Surface/Elements/FloatValue.cs @@ -33,6 +33,10 @@ namespace FlaxEditor.Surface.Elements Archetype = archetype; ParentNode.ValuesChanged += OnNodeValuesChanged; + + // Disable slider if surface doesn't allow it + if (!ParentNode.Surface.CanLivePreviewValueChanges) + _slideSpeed = 0.0f; } private void OnNodeValuesChanged() diff --git a/Source/Editor/Surface/MaterialSurface.cs b/Source/Editor/Surface/MaterialSurface.cs index 08e1161d9..ba7f2e01e 100644 --- a/Source/Editor/Surface/MaterialSurface.cs +++ b/Source/Editor/Surface/MaterialSurface.cs @@ -22,6 +22,9 @@ namespace FlaxEditor.Surface { } + /// + public override bool CanLivePreviewValueChanges => false; + /// public override string GetTypeName(ScriptType type) { diff --git a/Source/Editor/Surface/VisjectSurface.cs b/Source/Editor/Surface/VisjectSurface.cs index 0185e364a..3ac702549 100644 --- a/Source/Editor/Surface/VisjectSurface.cs +++ b/Source/Editor/Surface/VisjectSurface.cs @@ -534,6 +534,11 @@ namespace FlaxEditor.Surface /// public virtual bool CanSetParameters => false; + /// + /// Gets a value indicating whether surface supports/allows live previewing graph modifications due to value sliders and color pickers. True by default but disabled for shader surfaces that generate and compile shader source at flight. + /// + public virtual bool CanLivePreviewValueChanges => true; + /// /// Determines whether the specified node archetype can be used in the surface. /// diff --git a/Source/Engine/Engine/NativeInterop.cs b/Source/Engine/Engine/NativeInterop.cs index b07facf4d..fc04d9668 100644 --- a/Source/Engine/Engine/NativeInterop.cs +++ b/Source/Engine/Engine/NativeInterop.cs @@ -1112,9 +1112,11 @@ namespace FlaxEngine.Interop internal static void ToManagedPointer(ref IntPtr managedValue, IntPtr nativePtr, bool byRef) { - if (byRef) - nativePtr = Unsafe.Read(nativePtr.ToPointer()); - managedValue = nativePtr; + Type type = typeof(T); + byRef |= type.IsByRef; // Is this needed? + if (type.IsByRef) + Assert.IsTrue(type.GetElementType().IsValueType); + managedValue = byRef ? nativePtr : Unsafe.Read(nativePtr.ToPointer()); } internal static void ToManagedHandle(ref ManagedHandle managedValue, IntPtr nativePtr, bool byRef) diff --git a/Source/Engine/Level/SceneObjectsFactory.cpp b/Source/Engine/Level/SceneObjectsFactory.cpp index 985da6c29..2ae947c85 100644 --- a/Source/Engine/Level/SceneObjectsFactory.cpp +++ b/Source/Engine/Level/SceneObjectsFactory.cpp @@ -166,7 +166,6 @@ SceneObject* SceneObjectsFactory::Spawn(Context& context, const ISerializable::D return nullptr; } const StringAnsiView typeName(typeNameMember->value.GetStringAnsiView()); - const ScriptingTypeHandle type = Scripting::FindScriptingType(typeName); if (type) { diff --git a/Source/Engine/Scripting/ManagedCLR/MUtils.cpp b/Source/Engine/Scripting/ManagedCLR/MUtils.cpp index 52d049403..1bbfa2a6d 100644 --- a/Source/Engine/Scripting/ManagedCLR/MUtils.cpp +++ b/Source/Engine/Scripting/ManagedCLR/MUtils.cpp @@ -1209,9 +1209,20 @@ void* MUtils::VariantToManagedArgPtr(Variant& value, MType* type, bool& failed) return object; } case MTypes::Ptr: - if (value.Type.Type == VariantType::Null) + switch (value.Type.Type) + { + case VariantType::Pointer: + return &value.AsPointer; + case VariantType::Object: + return &value.AsObject; + case VariantType::Asset: + return &value.AsAsset; + case VariantType::Structure: + case VariantType::Blob: + return &value.AsBlob.Data; + default: return nullptr; - return (void*)value; + } default: break; } diff --git a/Source/Engine/Serialization/JsonSerializer.cs b/Source/Engine/Serialization/JsonSerializer.cs index a5d6e0771..076e8abe7 100644 --- a/Source/Engine/Serialization/JsonSerializer.cs +++ b/Source/Engine/Serialization/JsonSerializer.cs @@ -19,7 +19,7 @@ namespace FlaxEngine.Json { internal class SerializerCache { - public readonly JsonSerializerSettings JsonSettings; + public bool IsManagedOnly; public Newtonsoft.Json.JsonSerializer JsonSerializer; public StringBuilder StringBuilder; public StringWriter StringWriter; @@ -33,9 +33,9 @@ namespace FlaxEngine.Json public uint CacheVersion; #endif - public unsafe SerializerCache(JsonSerializerSettings settings) + public unsafe SerializerCache(bool isManagedOnly) { - JsonSettings = settings; + IsManagedOnly = isManagedOnly; StringBuilder = new StringBuilder(256); StringWriter = new StringWriter(StringBuilder, CultureInfo.InvariantCulture); MemoryStream = new UnmanagedMemoryStream((byte*)0, 0); @@ -114,7 +114,7 @@ namespace FlaxEngine.Json /// Builds the serializer private void BuildSerializer() { - JsonSerializer = Newtonsoft.Json.JsonSerializer.CreateDefault(Settings); + JsonSerializer = Newtonsoft.Json.JsonSerializer.CreateDefault(IsManagedOnly ? SettingsManagedOnly : Settings); JsonSerializer.Formatting = Formatting.Indented; JsonSerializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; } @@ -149,8 +149,8 @@ namespace FlaxEngine.Json internal static ExtendedSerializationBinder SerializationBinder; internal static FlaxObjectConverter ObjectConverter; internal static ThreadLocal Current = new ThreadLocal(); - internal static ThreadLocal Cache = new ThreadLocal(() => new SerializerCache(Settings)); - internal static ThreadLocal CacheManagedOnly = new ThreadLocal(() => new SerializerCache(SettingsManagedOnly)); + internal static ThreadLocal Cache = new ThreadLocal(() => new SerializerCache(false)); + internal static ThreadLocal CacheManagedOnly = new ThreadLocal(() => new SerializerCache(true)); internal static ThreadLocal CachedGuidBuffer = new ThreadLocal(() => Marshal.AllocHGlobal(32 * sizeof(char)), true); internal static string CachedGuidDigits = "0123456789abcdef"; #if FLAX_EDITOR diff --git a/Source/Engine/Threading/JobSystem.cpp b/Source/Engine/Threading/JobSystem.cpp index 0dd16b3d3..c89e6aca5 100644 --- a/Source/Engine/Threading/JobSystem.cpp +++ b/Source/Engine/Threading/JobSystem.cpp @@ -105,7 +105,7 @@ namespace CriticalSection WaitMutex; CriticalSection JobsLocker; #if JOB_SYSTEM_USE_MUTEX - RingBuffer> Jobs; + RingBuffer Jobs; #else ConcurrentQueue Jobs; #endif diff --git a/Source/Platforms/Mac/Default.icns b/Source/Platforms/Mac/Default.icns index 911276d8e..92394b74b 100644 Binary files a/Source/Platforms/Mac/Default.icns and b/Source/Platforms/Mac/Default.icns differ diff --git a/Source/Platforms/Mac/Icon.png b/Source/Platforms/Mac/Icon.png new file mode 100644 index 000000000..06bdecf46 --- /dev/null +++ b/Source/Platforms/Mac/Icon.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9de813ad971bee3cffc5c0dcaffeed61ea56f97526d021e79f267db025f09414 +size 80147 diff --git a/Source/Platforms/Mac/IconAlt.png b/Source/Platforms/Mac/IconAlt.png new file mode 100644 index 000000000..5fa4b78af --- /dev/null +++ b/Source/Platforms/Mac/IconAlt.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:697e1359d2cefeba10102f7d331c43568e98815016293865b17197dbdadc749b +size 80080