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