Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions TombLib/TombLib.Test/LevelSettingsTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System.Linq;
using System.Reflection;
using TombLib.LevelData;
using TombLib.Wad;

namespace TombLib.Test;

[TestClass]
public class LevelSettingsTests
{
[TestMethod]
public void AutoStaticMeshMergeEntry_StaticMesh_FallsBackToStaticIdNameWhenMissing()
{
var settings = new LevelSettings
{
GameVersion = TRVersion.Game.TR4
};

var entry = new AutoStaticMeshMergeEntry(123u, false, false, false, false, settings);

Assert.AreEqual(new WadStaticId(123u).ToString(settings.GameVersion), entry.StaticMesh);
}

[TestMethod]
public void Clone_ReparentsAutoStaticMeshMergeEntries()
{
var settings = new LevelSettings();
settings.AutoStaticMeshMerges.Add(new AutoStaticMeshMergeEntry(321u, true, false, false, false, settings));

var clonedSettings = settings.Clone();
var parentField = typeof(AutoStaticMeshMergeEntry).GetField("parent", BindingFlags.Instance | BindingFlags.NonPublic);

Assert.IsNotNull(parentField);
Assert.AreSame(clonedSettings, parentField.GetValue(clonedSettings.AutoStaticMeshMerges.Single()));
}
}
29 changes: 26 additions & 3 deletions TombLib/TombLib/LevelData/LevelSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public enum VariableType

public class AutoStaticMeshMergeEntry : ICloneable, IEquatable<AutoStaticMeshMergeEntry>
{
public string StaticMesh => parent.WadTryGetStatic(new WadStaticId(meshId)).ToString(parent.GameVersion);
public string StaticMesh => GetStaticMeshName();

private readonly LevelSettings parent;
public uint meshId;
Expand All @@ -53,9 +53,32 @@ public AutoStaticMeshMergeEntry(uint staticMesh, bool merge, bool interpretShade
ClearShades = clearShades;
}

private string GetStaticMeshName()
{
var staticMeshId = new WadStaticId(meshId);
var staticMesh = parent?.WadTryGetStatic(staticMeshId);

if (staticMesh == null)
{
if (parent == null)
{
return staticMeshId.ToString();
}

return staticMeshId.ToString(parent.GameVersion);
}

return staticMesh.ToString(parent.GameVersion);
}

public AutoStaticMeshMergeEntry Clone(LevelSettings newParent)
{
return new AutoStaticMeshMergeEntry(meshId, Merge, InterpretShadesAsEffect, TintAsAmbient, ClearShades, newParent);
}

public AutoStaticMeshMergeEntry Clone()
{
return (AutoStaticMeshMergeEntry)MemberwiseClone();
return Clone(parent);
}

object ICloneable.Clone()
Expand Down Expand Up @@ -242,7 +265,7 @@ public LevelSettings Clone()
result.Textures = Textures.ConvertAll(texture => (LevelTexture)texture.Clone());
result.AnimatedTextureSets = AnimatedTextureSets.ConvertAll(set => set.Clone());
result.ImportedGeometries = ImportedGeometries.ConvertAll(geometry => geometry.Clone());
result.AutoStaticMeshMerges = AutoStaticMeshMerges.ConvertAll(entry => entry.Clone());
result.AutoStaticMeshMerges = AutoStaticMeshMerges.ConvertAll(entry => entry.Clone(result));
return result;
}

Expand Down