Skip to content

Commit 2b64342

Browse files
[Core] Added NoiseGeneratorSettings asset;
[Serialization] Added StapleSerializer Serialize/DeserializeObject; [Serialization] Added SceneSerialization support for more primary types; [Editor] Fixed ID issues with Object Pickers and documented some EditorGUI methods;
1 parent 94be6c9 commit 2b64342

File tree

12 files changed

+259
-56
lines changed

12 files changed

+259
-56
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using Staple.Internal;
2+
using System;
3+
4+
namespace Staple;
5+
6+
/// <summary>
7+
/// Contains settings for making a noise generator. Check <see cref="NoiseGenerator"/> for details.
8+
/// </summary>
9+
public class NoiseGeneratorSettings : IStapleAsset, IGuidAsset
10+
{
11+
public int seed = 1337;
12+
public float frequency = 0.01f;
13+
public NoiseGenerator.NoiseType noiseType = NoiseGenerator.NoiseType.OpenSimplex2;
14+
public NoiseGenerator.RotationType3D rotationType3D = NoiseGenerator.RotationType3D.None;
15+
public NoiseGenerator.FractalType fractalType = NoiseGenerator.FractalType.None;
16+
public int fractalOctaves = 3;
17+
public float fractalLacunarity = 2;
18+
public float fractalGain = 0.5f;
19+
public float fractalWeightedStrength = 0;
20+
public float fractalPingPongStrength = 2;
21+
public NoiseGenerator.CellularDistanceFunction cellularDistanceFunction = NoiseGenerator.CellularDistanceFunction.EuclideanSq;
22+
public NoiseGenerator.CellularReturnType cellularReturnType = NoiseGenerator.CellularReturnType.Distance;
23+
public float cellularJitter = 1;
24+
public NoiseGenerator.DomainWarpType domainWarpType = NoiseGenerator.DomainWarpType.OpenSimplex2;
25+
public float domainWarpAmp = 1;
26+
27+
public int GuidHash { get; set; }
28+
29+
public string Guid { get; set; }
30+
31+
public static object Create(string guid)
32+
{
33+
return ResourceManager.instance.LoadAsset<NoiseGeneratorSettings>(guid);
34+
}
35+
36+
/// <summary>
37+
/// Creates a noise generator instance
38+
/// </summary>
39+
/// <returns>The generator instance</returns>
40+
public NoiseGenerator MakeGenerator()
41+
{
42+
return new()
43+
{
44+
cellularDistanceFunction = cellularDistanceFunction,
45+
cellularJitter = cellularJitter,
46+
cellularReturnType = cellularReturnType,
47+
domainWarpType = domainWarpType,
48+
domainWarpAmp = domainWarpAmp,
49+
fractalGain = fractalGain,
50+
fractalLacunarity = fractalLacunarity,
51+
fractalOctaves = fractalOctaves,
52+
fractalPingPongStrength = fractalPingPongStrength,
53+
fractalType = fractalType,
54+
fractalWeightedStrength = fractalWeightedStrength,
55+
frequency = frequency,
56+
noiseType = noiseType,
57+
rotationType3D = rotationType3D,
58+
seed = seed,
59+
};
60+
}
61+
}

Engine/Core/Serialization/Asset/AssetSerialization.cs

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -198,29 +198,7 @@ public static SerializableStapleAsset Serialize(object instance, bool targetText
198198
return default;
199199
}
200200

201-
try
202-
{
203-
var container = StapleSerializer.SerializeContainer(instance, targetText);
204-
205-
if (container == null)
206-
{
207-
return default;
208-
}
209-
210-
var outValue = new SerializableStapleAsset()
211-
{
212-
typeName = instance.GetType().FullName,
213-
parameters = container.parameters,
214-
};
215-
216-
return outValue;
217-
}
218-
catch(Exception e)
219-
{
220-
Log.Debug($"[AssetSerialization] Failed to serialize {instance.GetType().FullName}: {e}");
221-
222-
return default;
223-
}
201+
return StapleSerializer.SerializeObject(instance, targetText);
224202
}
225203

226204
/// <summary>
@@ -235,11 +213,7 @@ public static IStapleAsset Deserialize(SerializableStapleAsset asset)
235213
return null;
236214
}
237215

238-
var instance = StapleSerializer.DeserializeContainer(new()
239-
{
240-
parameters = asset.parameters,
241-
typeName = asset.typeName,
242-
});
216+
var instance = StapleSerializer.DeserializeObject(asset);
243217

244218
if(instance is IStapleAsset stapleAsset)
245219
{

Engine/Core/Serialization/Asset/SerializableStapleAsset.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ namespace Staple.Internal;
77
public class SerializableStapleAssetHeader
88
{
99
[IgnoreMember]
10-
public readonly static char[] ValidHeader = new char[]
11-
{
12-
'S', 'S', 'A', 'S'
13-
};
10+
public readonly static char[] ValidHeader =
11+
[
12+
'S', 'S', 'A', 'S'
13+
];
1414

1515
[IgnoreMember]
1616
public const byte ValidVersion = 1;
@@ -39,7 +39,7 @@ public class SerializableStapleAssetContainer
3939
public string typeName;
4040

4141
[Key(1)]
42-
public Dictionary<string, SerializableStapleAssetParameter> parameters = new();
42+
public Dictionary<string, SerializableStapleAssetParameter> parameters = [];
4343
}
4444

4545
[MessagePackObject]
@@ -52,5 +52,5 @@ public class SerializableStapleAsset
5252
public string typeName;
5353

5454
[Key(2)]
55-
public Dictionary<string, SerializableStapleAssetParameter> parameters = new();
55+
public Dictionary<string, SerializableStapleAssetParameter> parameters = [];
5656
}

Engine/Core/Serialization/Asset/StapleSerializer.cs

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1213,4 +1213,68 @@ public static SerializableStapleAssetContainer DecodeContainer(string typeName,
12131213

12141214
return decodedContainer;
12151215
}
1216+
1217+
/// <summary>
1218+
/// Attempts to serialize an object into a SerializableStapleAsset
1219+
/// </summary>
1220+
/// <param name="instance">The object's instance</param>
1221+
/// <param name="targetText">Whether we're targeting a text serializer</param>
1222+
/// <returns>The SerializableStapleAsset, or null</returns>
1223+
public static SerializableStapleAsset SerializeObject(object instance, bool targetText)
1224+
{
1225+
if (instance == null)
1226+
{
1227+
return default;
1228+
}
1229+
1230+
try
1231+
{
1232+
var container = SerializeContainer(instance, targetText);
1233+
1234+
if (container == null)
1235+
{
1236+
return default;
1237+
}
1238+
1239+
var outValue = new SerializableStapleAsset()
1240+
{
1241+
typeName = instance.GetType().FullName,
1242+
parameters = container.parameters,
1243+
};
1244+
1245+
return outValue;
1246+
}
1247+
catch (Exception e)
1248+
{
1249+
Log.Debug($"[AssetSerialization] Failed to serialize {instance.GetType().FullName}: {e}");
1250+
1251+
return default;
1252+
}
1253+
}
1254+
1255+
/// <summary>
1256+
/// Deserializes an asset into an object instance
1257+
/// </summary>
1258+
/// <param name="asset">The asset data</param>
1259+
/// <returns>The instance, or null</returns>
1260+
public static object DeserializeObject(SerializableStapleAsset asset)
1261+
{
1262+
if (asset == null)
1263+
{
1264+
return null;
1265+
}
1266+
1267+
var instance = DeserializeContainer(new()
1268+
{
1269+
parameters = asset.parameters,
1270+
typeName = asset.typeName,
1271+
});
1272+
1273+
if (instance is IGuidAsset guidAsset)
1274+
{
1275+
guidAsset.Guid = asset.guid;
1276+
}
1277+
1278+
return instance;
1279+
}
12161280
}

Engine/Core/Serialization/Scene/SceneSerialization.cs

Lines changed: 92 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,26 @@ public static void DeserializeProperty(Type fieldType, Action<object> setter, Js
7171
{
7272
setter(element.GetSingle());
7373
}
74+
else if (fieldType == typeof(byte) && element.ValueKind == JsonValueKind.Number)
75+
{
76+
setter(element.GetByte());
77+
}
78+
else if (fieldType == typeof(sbyte) && element.ValueKind == JsonValueKind.Number)
79+
{
80+
setter(element.GetSByte());
81+
}
82+
else if (fieldType == typeof(ushort) && element.ValueKind == JsonValueKind.Number)
83+
{
84+
setter(element.GetUInt16());
85+
}
86+
else if (fieldType == typeof(short) && element.ValueKind == JsonValueKind.Number)
87+
{
88+
setter(element.GetInt16());
89+
}
90+
else if (fieldType == typeof(uint) && element.ValueKind == JsonValueKind.Number)
91+
{
92+
setter(element.GetUInt32());
93+
}
7494
else if (fieldType == typeof(int) && element.ValueKind == JsonValueKind.Number)
7595
{
7696
setter(element.GetInt32());
@@ -692,8 +712,12 @@ public static void SerializeProperty(Type fieldType, string name, Func<object> g
692712
if (fieldType == typeof(bool) ||
693713
fieldType == typeof(float) ||
694714
fieldType == typeof(double) ||
695-
fieldType == typeof(int) ||
715+
fieldType == typeof(byte) ||
716+
fieldType == typeof(sbyte) ||
717+
fieldType == typeof(ushort) ||
718+
fieldType == typeof(short) ||
696719
fieldType == typeof(uint) ||
720+
fieldType == typeof(int) ||
697721
fieldType == typeof(string))
698722
{
699723
if (parameters)
@@ -733,13 +757,46 @@ public static void SerializeProperty(Type fieldType, string name, Func<object> g
733757

734758
break;
735759

736-
case Type t when t == typeof(int):
760+
case Type t when t == typeof(byte):
737761

738762
sceneComponent.parameters.Add(new SceneComponentParameter()
739763
{
740764
name = name,
741765
type = SceneComponentParameterType.Int,
742-
intValue = (int)getter(),
766+
intValue = (byte)getter(),
767+
});
768+
769+
break;
770+
771+
case Type t when t == typeof(sbyte):
772+
773+
sceneComponent.parameters.Add(new SceneComponentParameter()
774+
{
775+
name = name,
776+
type = SceneComponentParameterType.Int,
777+
intValue = (sbyte)getter(),
778+
});
779+
780+
break;
781+
782+
case Type t when t == typeof(ushort):
783+
784+
sceneComponent.parameters.Add(new SceneComponentParameter()
785+
{
786+
name = name,
787+
type = SceneComponentParameterType.Int,
788+
intValue = (ushort)getter(),
789+
});
790+
791+
break;
792+
793+
case Type t when t == typeof(short):
794+
795+
sceneComponent.parameters.Add(new SceneComponentParameter()
796+
{
797+
name = name,
798+
type = SceneComponentParameterType.Int,
799+
intValue = (short)getter(),
743800
});
744801

745802
break;
@@ -755,6 +812,38 @@ public static void SerializeProperty(Type fieldType, string name, Func<object> g
755812

756813
break;
757814

815+
case Type t when t == typeof(int):
816+
817+
sceneComponent.parameters.Add(new SceneComponentParameter()
818+
{
819+
name = name,
820+
type = SceneComponentParameterType.Int,
821+
intValue = (int)getter(),
822+
});
823+
824+
break;
825+
826+
case Type t when t == typeof(ulong):
827+
828+
sceneComponent.parameters.Add(new SceneComponentParameter()
829+
{
830+
name = name,
831+
type = SceneComponentParameterType.Int,
832+
intValue = (int)(ulong)getter(),
833+
});
834+
835+
break;
836+
837+
case Type t when t == typeof(long):
838+
839+
sceneComponent.parameters.Add(new SceneComponentParameter()
840+
{
841+
name = name,
842+
type = SceneComponentParameterType.Int,
843+
intValue = (int)(long)getter(),
844+
});
845+
846+
break;
758847

759848
case Type t when t == typeof(string):
760849

Engine/Core/StapleCore.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797

9898
<ItemGroup>
9999
<Compile Include="AppSettings\AppProfilingMode.cs" />
100+
<Compile Include="Assets\NoiseGeneratorSettings.cs" />
100101
<Compile Include="Assets\TextAsset.cs" />
101102
<Compile Include="Attributes\AdditionalLibraryAttribute.cs" />
102103
<Compile Include="Attributes\AutoAssignEntityAttribute.cs" />

Engine/Editor/Editors/Assets/MaterialEditor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public override bool DrawProperty(Type fieldType, string name, Func<object> gett
5353

5454
cachedTextures.TryGetValue(key, out var texture);
5555

56-
var newValue = EditorGUI.ObjectPicker(typeof(Texture), label, texture);
56+
var newValue = EditorGUI.ObjectPicker(typeof(Texture), label, texture, $"{material.guid}.{key}.Picker");
5757

5858
if(newValue != texture)
5959
{
@@ -198,7 +198,7 @@ public override bool DrawProperty(Type fieldType, string name, Func<object> gett
198198
}
199199
}
200200

201-
var newValue = EditorGUI.ObjectPicker(typeof(Shader), "Shader: ", shader);
201+
var newValue = EditorGUI.ObjectPicker(typeof(Shader), "Shader: ", shader, $"{material.guid}.{key}.Picker");
202202

203203
if (newValue != shader)
204204
{

Engine/Editor/Editors/Default/SpriteRendererEditor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public override bool DrawProperty(Type fieldType, string name, Func<object> gett
1414
{
1515
case nameof(SpriteRenderer.sprite):
1616

17-
setter(EditorGUI.SpritePicker(name, getter() as Sprite));
17+
setter(EditorGUI.SpritePicker(name, getter() as Sprite, $"{name}.SpritePicker"));
1818

1919
return true;
2020

Engine/Editor/Editors/Default/UIImageEditor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public override bool DrawProperty(Type fieldType, string name, Func<object> gett
1515
{
1616
case nameof(UIImage.sprite):
1717

18-
setter(EditorGUI.SpritePicker(name, getter() as Sprite));
18+
setter(EditorGUI.SpritePicker(name, getter() as Sprite, $"{name}.SpritePicker"));
1919

2020
return true;
2121

0 commit comments

Comments
 (0)