Skip to content

Commit 5b2094f

Browse files
committed
[Core.Assets.Quantum] Modernize code
1 parent 1351e31 commit 5b2094f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+3117
-3286
lines changed
Lines changed: 43 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,66 @@
11
// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
22
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
3-
using System;
4-
using System.Collections.Generic;
5-
using Stride.Core;
3+
64
using Stride.Core.Quantum;
75

8-
namespace Stride.Core.Assets.Quantum
6+
namespace Stride.Core.Assets.Quantum;
7+
8+
internal class AssetBaseToDerivedRegistry : IBaseToDerivedRegistry
99
{
10-
internal class AssetBaseToDerivedRegistry : IBaseToDerivedRegistry
10+
private readonly AssetPropertyGraph propertyGraph;
11+
private readonly Dictionary<IAssetNode, IAssetNode> baseToDerived = [];
12+
13+
public AssetBaseToDerivedRegistry(AssetPropertyGraph propertyGraph)
1114
{
12-
private readonly AssetPropertyGraph propertyGraph;
13-
private readonly Dictionary<IAssetNode, IAssetNode> baseToDerived = new Dictionary<IAssetNode, IAssetNode>();
15+
this.propertyGraph = propertyGraph;
16+
}
1417

15-
public AssetBaseToDerivedRegistry(AssetPropertyGraph propertyGraph)
16-
{
17-
this.propertyGraph = propertyGraph;
18-
}
18+
public void RegisterBaseToDerived(IAssetNode? baseNode, IAssetNode derivedNode)
19+
{
20+
var baseValue = baseNode?.Retrieve();
21+
if (baseValue == null)
22+
return;
1923

20-
public void RegisterBaseToDerived(IAssetNode baseNode, IAssetNode derivedNode)
24+
if (baseValue is IIdentifiable)
2125
{
22-
var baseValue = baseNode?.Retrieve();
23-
if (baseValue == null)
24-
return;
25-
26-
if (baseValue is IIdentifiable)
26+
baseToDerived[baseNode!] = derivedNode;
27+
var baseMemberNode = baseNode as IAssetMemberNode;
28+
if (baseMemberNode?.Target != null && !propertyGraph.Definition.IsMemberTargetObjectReference(baseMemberNode, baseValue))
2729
{
28-
baseToDerived[baseNode] = derivedNode;
29-
var baseMemberNode = baseNode as IAssetMemberNode;
30-
if (baseMemberNode?.Target != null && !propertyGraph.Definition.IsMemberTargetObjectReference(baseMemberNode, baseValue))
31-
{
32-
baseToDerived[baseMemberNode.Target] = ((IAssetMemberNode)derivedNode).Target;
33-
}
30+
baseToDerived[baseMemberNode.Target] = ((IAssetMemberNode)derivedNode).Target;
3431
}
32+
}
3533

36-
var derivedObjectNode = derivedNode as IObjectNode;
37-
var baseObjectNode = baseNode as IObjectNode;
38-
if (derivedObjectNode?.ItemReferences != null && baseObjectNode?.ItemReferences != null)
34+
var derivedObjectNode = derivedNode as IObjectNode;
35+
var baseObjectNode = baseNode as IObjectNode;
36+
if (derivedObjectNode?.ItemReferences != null && baseObjectNode?.ItemReferences != null)
37+
{
38+
foreach (var reference in derivedObjectNode.ItemReferences)
3939
{
40-
foreach (var reference in derivedObjectNode.ItemReferences)
41-
{
42-
var target = propertyGraph.baseLinker.FindTargetReference(derivedNode, baseNode, reference);
43-
if (target == null)
44-
continue;
40+
var target = propertyGraph.baseLinker.FindTargetReference(derivedNode, baseNode, reference);
41+
if (target == null)
42+
continue;
4543

46-
baseValue = target.TargetNode?.Retrieve();
47-
if (!propertyGraph.Definition.IsTargetItemObjectReference(baseObjectNode, target.Index, baseNode.Retrieve(target.Index)))
44+
baseValue = target.TargetNode?.Retrieve();
45+
if (!propertyGraph.Definition.IsTargetItemObjectReference(baseObjectNode, target.Index, baseNode.Retrieve(target.Index)))
46+
{
47+
if (baseValue is IIdentifiable)
4848
{
49-
if (baseValue is IIdentifiable)
50-
{
51-
baseToDerived[(IAssetNode)target.TargetNode] = (IAssetNode)derivedObjectNode.IndexedTarget(reference.Index);
52-
}
49+
baseToDerived[(IAssetNode)target.TargetNode] = (IAssetNode)derivedObjectNode.IndexedTarget(reference.Index);
5350
}
5451
}
5552
}
5653
}
54+
}
5755

58-
public IIdentifiable ResolveFromBase(object baseObjectReference, IAssetNode derivedReferencerNode)
59-
{
60-
if (derivedReferencerNode == null) throw new ArgumentNullException(nameof(derivedReferencerNode));
61-
if (baseObjectReference == null)
62-
return null;
56+
public IIdentifiable? ResolveFromBase(object? baseObjectReference, IAssetNode derivedReferencerNode)
57+
{
58+
ArgumentNullException.ThrowIfNull(derivedReferencerNode);
59+
if (baseObjectReference == null)
60+
return null;
6361

64-
var baseNode = (IAssetNode)propertyGraph.Container.NodeContainer.GetNode(baseObjectReference);
65-
IAssetNode derivedNode;
66-
baseToDerived.TryGetValue(baseNode, out derivedNode);
67-
return derivedNode?.Retrieve() as IIdentifiable;
68-
}
62+
var baseNode = (IAssetNode)propertyGraph.Container.NodeContainer.GetNode(baseObjectReference);
63+
baseToDerived.TryGetValue(baseNode, out var derivedNode);
64+
return derivedNode?.Retrieve() as IIdentifiable;
6965
}
7066
}
Lines changed: 48 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,63 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
41
using Stride.Core.Assets.Yaml;
52

6-
namespace Stride.Core.Assets.Quantum
3+
namespace Stride.Core.Assets.Quantum;
4+
5+
/// <summary>
6+
/// A class containing helper methods for asset cloning.
7+
/// </summary>
8+
public static class AssetCloningHelper
79
{
810
/// <summary>
9-
/// A class containing helper methods for asset cloning.
11+
/// Updates the paths in the given <see cref="YamlAssetMetadata{T}"/> instance to reflect that new <see cref="Guid"/> have been generated after cloning,
12+
/// when <see cref="AssetClonerFlags.GenerateNewIdsForIdentifiableObjects"/> has been used.
1013
/// </summary>
11-
public static class AssetCloningHelper
14+
/// <typeparam name="T">The type of content in the metadata.</typeparam>
15+
/// <param name="metadata">The metadata to update.</param>
16+
/// <param name="idRemapping">A dictionary representing the mapping between initial ids and their corresponding id in the cloned object.</param>
17+
/// <param name="basePath">If not null, this method will apply the remapping only for paths that are contained in the given base path.</param>
18+
public static void RemapIdentifiablePaths<T>(YamlAssetMetadata<T> metadata, Dictionary<Guid, Guid> idRemapping, YamlAssetPath? basePath = null)
1219
{
13-
/// <summary>
14-
/// Updates the paths in the given <see cref="YamlAssetMetadata{T}"/> instance to reflect that new <see cref="Guid"/> have been generated after cloning,
15-
/// when <see cref="AssetClonerFlags.GenerateNewIdsForIdentifiableObjects"/> has been used.
16-
/// </summary>
17-
/// <typeparam name="T">The type of content in the metadata.</typeparam>
18-
/// <param name="metadata">The metadata to update.</param>
19-
/// <param name="idRemapping">A dictionary representing the mapping between initial ids and their corresponding id in the cloned object.</param>
20-
/// <param name="basePath">If not null, this method will apply the remapping only for paths that are contained in the given base path.</param>
21-
public static void RemapIdentifiablePaths<T>(YamlAssetMetadata<T> metadata, Dictionary<Guid, Guid> idRemapping, YamlAssetPath basePath = null)
22-
{
23-
// Early exit if nothing to remap
24-
if (metadata == null || idRemapping == null)
25-
return;
20+
// Early exit if nothing to remap
21+
if (metadata == null || idRemapping == null)
22+
return;
2623

27-
var replacements = new List<Tuple<YamlAssetPath, YamlAssetPath, T>>();
28-
foreach (var entry in metadata)
29-
{
30-
// Skip paths that doesn't start with the given base path.
31-
if (basePath != null && !entry.Key.StartsWith(basePath))
32-
continue;
24+
var replacements = new List<Tuple<YamlAssetPath, YamlAssetPath, T>>();
25+
foreach (var entry in metadata)
26+
{
27+
// Skip paths that doesn't start with the given base path.
28+
if (basePath != null && !entry.Key.StartsWith(basePath))
29+
continue;
3330

34-
var newPath = new YamlAssetPath(entry.Key.Elements.Select(x => FixupIdentifier(x, idRemapping)));
35-
replacements.Add(Tuple.Create(entry.Key, newPath, entry.Value));
36-
}
31+
var newPath = new YamlAssetPath(entry.Key.Elements.Select(x => FixupIdentifier(x, idRemapping)));
32+
replacements.Add(Tuple.Create(entry.Key, newPath, entry.Value));
33+
}
3734

38-
// First remove everything, then re-add everything, in case we have a collision between an old path and a new path
39-
foreach (var replacement in replacements)
40-
{
41-
metadata.Remove(replacement.Item1);
42-
}
43-
foreach (var replacement in replacements)
44-
{
45-
metadata.Set(replacement.Item2, replacement.Item3);
46-
}
35+
// First remove everything, then re-add everything, in case we have a collision between an old path and a new path
36+
foreach (var replacement in replacements)
37+
{
38+
metadata.Remove(replacement.Item1);
4739
}
40+
foreach (var replacement in replacements)
41+
{
42+
metadata.Set(replacement.Item2, replacement.Item3);
43+
}
44+
}
4845

49-
private static YamlAssetPath.Element FixupIdentifier(YamlAssetPath.Element element, Dictionary<Guid, Guid> idRemapping)
46+
private static YamlAssetPath.Element FixupIdentifier(YamlAssetPath.Element element, Dictionary<Guid, Guid> idRemapping)
47+
{
48+
switch (element.Type)
5049
{
51-
switch (element.Type)
52-
{
53-
case YamlAssetPath.ElementType.Index:
54-
if (element.Value is Guid && idRemapping.TryGetValue((Guid)element.Value, out var newId))
55-
{
56-
return new YamlAssetPath.Element(YamlAssetPath.ElementType.Index, newId);
57-
}
58-
return element;
59-
case YamlAssetPath.ElementType.Member:
60-
case YamlAssetPath.ElementType.ItemId:
61-
return element;
62-
default:
63-
throw new ArgumentOutOfRangeException();
64-
}
50+
case YamlAssetPath.ElementType.Index:
51+
if (element.Value is Guid guid && idRemapping.TryGetValue(guid, out var newId))
52+
{
53+
return new YamlAssetPath.Element(YamlAssetPath.ElementType.Index, newId);
54+
}
55+
return element;
56+
case YamlAssetPath.ElementType.Member:
57+
case YamlAssetPath.ElementType.ItemId:
58+
return element;
59+
default:
60+
throw new ArgumentOutOfRangeException();
6561
}
6662
}
6763
}
Lines changed: 25 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,36 @@
11
// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
22
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
3-
using System;
4-
using System.Collections.Generic;
5-
using Stride.Core;
63

7-
namespace Stride.Core.Assets.Quantum
4+
namespace Stride.Core.Assets.Quantum;
5+
6+
internal class AssetCompositeBaseToDerivedRegistry : IBaseToDerivedRegistry
87
{
9-
internal class AssetCompositeBaseToDerivedRegistry : IBaseToDerivedRegistry
10-
{
11-
private readonly Dictionary<Guid, AssetBaseToDerivedRegistry> baseToInstances = new Dictionary<Guid, AssetBaseToDerivedRegistry>();
12-
private readonly AssetPropertyGraph propertyGraph;
8+
private readonly Dictionary<Guid, AssetBaseToDerivedRegistry> baseToInstances = [];
9+
private readonly AssetPropertyGraph propertyGraph;
1310

14-
public AssetCompositeBaseToDerivedRegistry(AssetPropertyGraph propertyGraph)
15-
{
16-
this.propertyGraph = propertyGraph;
17-
}
11+
public AssetCompositeBaseToDerivedRegistry(AssetPropertyGraph propertyGraph)
12+
{
13+
this.propertyGraph = propertyGraph;
14+
}
1815

19-
public void RegisterBaseToDerived(IAssetNode baseNode, IAssetNode derivedNode)
20-
{
21-
var ownerPart = derivedNode.GetContent(NodesToOwnerPartVisitor.OwnerPartContentName);
22-
var instanceId = (ownerPart?.Retrieve() as IAssetPartDesign)?.Base?.InstanceId ?? Guid.Empty;
23-
AssetBaseToDerivedRegistry derivedRegistry;
24-
if (!baseToInstances.TryGetValue(instanceId, out derivedRegistry))
25-
baseToInstances[instanceId] = derivedRegistry = new AssetBaseToDerivedRegistry(propertyGraph);
16+
public void RegisterBaseToDerived(IAssetNode? baseNode, IAssetNode derivedNode)
17+
{
18+
var ownerPart = derivedNode.GetContent(NodesToOwnerPartVisitor.OwnerPartContentName);
19+
var instanceId = (ownerPart?.Retrieve() as IAssetPartDesign)?.Base?.InstanceId ?? Guid.Empty;
20+
if (!baseToInstances.TryGetValue(instanceId, out var derivedRegistry))
21+
baseToInstances[instanceId] = derivedRegistry = new AssetBaseToDerivedRegistry(propertyGraph);
2622

27-
derivedRegistry.RegisterBaseToDerived(baseNode, derivedNode);
28-
}
23+
derivedRegistry.RegisterBaseToDerived(baseNode, derivedNode);
24+
}
2925

30-
public IIdentifiable ResolveFromBase(object baseObjectReference, IAssetNode derivedReferencerNode)
31-
{
32-
if (derivedReferencerNode == null) throw new ArgumentNullException(nameof(derivedReferencerNode));
33-
var ownerPart = derivedReferencerNode.GetContent(NodesToOwnerPartVisitor.OwnerPartContentName);
34-
var instanceId = (ownerPart?.Retrieve() as IAssetPartDesign)?.Base?.InstanceId ?? Guid.Empty;
35-
AssetBaseToDerivedRegistry derivedRegistry;
36-
if (!baseToInstances.TryGetValue(instanceId, out derivedRegistry))
37-
return null;
26+
public IIdentifiable? ResolveFromBase(object? baseObjectReference, IAssetNode derivedReferencerNode)
27+
{
28+
ArgumentNullException.ThrowIfNull(derivedReferencerNode);
29+
var ownerPart = derivedReferencerNode.GetContent(NodesToOwnerPartVisitor.OwnerPartContentName);
30+
var instanceId = (ownerPart?.Retrieve() as IAssetPartDesign)?.Base?.InstanceId ?? Guid.Empty;
31+
if (!baseToInstances.TryGetValue(instanceId, out var derivedRegistry))
32+
return null;
3833

39-
return derivedRegistry.ResolveFromBase(baseObjectReference, derivedReferencerNode);
40-
}
34+
return derivedRegistry.ResolveFromBase(baseObjectReference, derivedReferencerNode);
4135
}
4236
}

0 commit comments

Comments
 (0)