Skip to content

Commit

Permalink
Fix texture issues (#673)
Browse files Browse the repository at this point in the history
Part of #653.
  • Loading branch information
lahm86 authored May 12, 2024
1 parent 26e5027 commit ac65dc7
Show file tree
Hide file tree
Showing 45 changed files with 791 additions and 663 deletions.
Binary file modified Deps/TRGE.Coord.dll
Binary file not shown.
59 changes: 39 additions & 20 deletions TRDataControl/Environment/EMEditorMapping.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,16 @@ public class EMEditorMapping
Formatting = Formatting.Indented
};

public EMEditorSet All { get; set; }
public List<EMEditorSet> Any { get; set; }
public List<List<EMEditorSet>> AllWithin { get; set; }
public List<EMEditorGroupedSet> OneOf { get; set; }
public List<EMConditionalEditorSet> ConditionalAllWithin { get; set; }
public List<EMConditionalSingleEditorSet> ConditionalAll { get; set; }
public List<EMConditionalGroupedSet> ConditionalOneOf { get; set; }
public EMEditorSet Mirrored { get; set; }
public EMEditorSet All { get; set; } = new();
public List<EMEditorSet> Any { get; set; } = new();
public List<List<EMEditorSet>> AllWithin { get; set; } = new();
public List<EMEditorGroupedSet> OneOf { get; set; } = new();
public List<EMConditionalEditorSet> ConditionalAllWithin { get; set; } = new();
public List<EMConditionalSingleEditorSet> ConditionalAll { get; set; } = new();
public List<EMConditionalGroupedSet> ConditionalOneOf { get; set; } = new();
public EMEditorSet Mirrored { get; set; } = new();
public Dictionary<ushort, ushort> AlternativeTextures { get; set; }

public EMEditorMapping()
{
All = new EMEditorSet();
ConditionalAll = new List<EMConditionalSingleEditorSet>();
Any = new List<EMEditorSet>();
AllWithin = new List<List<EMEditorSet>>();
ConditionalAllWithin = new List<EMConditionalEditorSet>();
OneOf = new List<EMEditorGroupedSet>();
ConditionalOneOf = new List<EMConditionalGroupedSet>();
Mirrored = new EMEditorSet();
}

public static EMEditorMapping Get(string packPath)
{
if (File.Exists(packPath))
Expand Down Expand Up @@ -83,4 +71,35 @@ public void SetCommunityPatch(bool isCommunityPatch)
ConditionalOneOf?.ForEach(s => s.SetCommunityPatch(isCommunityPatch));
Mirrored?.SetCommunityPatch(isCommunityPatch);
}

public List<BaseEMFunction> FindAll(Predicate<BaseEMFunction> predicate = null)
{
List<BaseEMFunction> results = new();
Scan(e =>
{
if (predicate == null || predicate(e))
{
results.Add(e);
}
});
return results;
}

public void Scan(Action<BaseEMFunction> callback)
{
All?.ForEach(e => callback(e));
ConditionalAll?.ForEach(s => s.OnFalse?.ForEach(e => callback(e)));
ConditionalAll?.ForEach(s => s.OnTrue?.ForEach(e => callback(e)));
Any?.ForEach(e => e.ForEach(a => callback(a)));
AllWithin?.ForEach(a => a.ForEach(s => s.ForEach(e => callback(e))));
ConditionalAllWithin?.ForEach(s => s.OnFalse?.ForEach(a => a.ForEach(e => callback(e))));
ConditionalAllWithin?.ForEach(s => s.OnTrue?.ForEach(a => a.ForEach(e => callback(e))));
OneOf?.ForEach(s => s.Leader.ForEach(e => callback(e)));
OneOf?.ForEach(s => s.Followers.ForEach(e => e.ForEach(a => callback(a))));
ConditionalOneOf?.ForEach(s => s.OnFalse?.Leader.ForEach(e => callback(e)));
ConditionalOneOf?.ForEach(s => s.OnFalse?.Followers.ForEach(e => e.ForEach(a => callback(a))));
ConditionalOneOf?.ForEach(s => s.OnTrue?.Leader.ForEach(e => callback(e)));
ConditionalOneOf?.ForEach(s => s.OnTrue?.Followers.ForEach(e => e.ForEach(a => callback(a))));
Mirrored?.ForEach(e => callback(e));
}
}
35 changes: 30 additions & 5 deletions TRDataControl/Transport/TRDataImporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public abstract class TRDataImporter<L, T, S, B> : TRDataTransport<L, T, S, B>
public List<T> TypesToRemove { get; set; } = new();
public bool ClearUnusedSprites { get; set; }
public string TextureRemapPath { get; set; }
public ITexturePositionMonitor<T> TextureMonitor { get; set; }
public bool IgnoreGraphics { get; set; }
public bool ForceCinematicOverwrite { get; set; }

Expand Down Expand Up @@ -278,14 +279,20 @@ protected void RemoveData()
switch (blobType)
{
case TRBlobType.Model:
staleTextures.AddRange(Models[type].Meshes
.SelectMany(m => m.TexturedFaces.Select(t => (int)t.Texture)));
Models.Remove(id);
if (Models.ContainsKey(id))
{
staleTextures.AddRange(Models[type].Meshes
.SelectMany(m => m.TexturedFaces.Select(t => (int)t.Texture)));
Models.Remove(id);
}
break;

case TRBlobType.StaticMesh:
staleTextures.AddRange(StaticMeshes[type].Mesh.TexturedFaces.Select(t => (int)t.Texture));
StaticMeshes.Remove(id);
if (StaticMeshes.ContainsKey(id))
{
staleTextures.AddRange(StaticMeshes[type].Mesh.TexturedFaces.Select(t => (int)t.Texture));
StaticMeshes.Remove(id);
}
break;

case TRBlobType.Sprite:
Expand All @@ -301,6 +308,8 @@ protected void RemoveData()
CreateRemapper(Level)?.RemoveUnusedTextures(staleTextures,
(tile, bounds) => remapGroup?.CanRemoveRectangle(tile, bounds, TypesToRemove) ?? true);
}

TextureMonitor?.OnTexturesRemoved(TypesToRemove);
}

protected void ImportTextures(List<B> blobs)
Expand Down Expand Up @@ -373,6 +382,8 @@ protected void ImportTextures(List<B> blobs)
}
}

Dictionary<T, List<PositionedTexture>> texturePositions = new();

foreach (B blob in blobs)
{
if (blob.IsDependencyOnly)
Expand Down Expand Up @@ -412,7 +423,21 @@ protected void ImportTextures(List<B> blobs)
{
face.Texture = ImportColour(blob, face.Texture);
}

texturePositions[blob.Alias] = new();
foreach (var (oldIndex, newIndex) in remap)
{
TRObjectTexture texture = Level.ObjectTextures[newIndex];
texturePositions[blob.Alias].Add(new()
{
OriginalIndex = oldIndex,
TileIndex = texture.Atlas,
Position = texture.Position
});
}
}

TextureMonitor?.OnTexturesPositioned(texturePositions);
}

protected void ImportData(List<B> blobs, TRMesh oldDummyMesh)
Expand Down
12 changes: 5 additions & 7 deletions TRImageControl/Packing/Remapping/ITexturePositionMonitor.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
namespace TRImageControl.Packing;

// This allows external callers to monitor specific textures for specific entities by providing a list
// of texture indices it wants to observe. When the import completes, a map of entity to a list of
// PositionedTextures will be returned to it for processing as necessary.
public interface ITexturePositionMonitor<E> where E : Enum
public interface ITexturePositionMonitor<T>
where T : Enum
{
Dictionary<E, List<int>> GetMonitoredTextureIndices();
void MonitoredTexturesPositioned(Dictionary<E, List<PositionedTexture>> texturePositions);
void EntityTexturesRemoved(List<E> entities);
Dictionary<T, List<int>> GetMonitoredIndices();
void OnTexturesPositioned(Dictionary<T, List<PositionedTexture>> texturePositions);
void OnTexturesRemoved(List<T> types);
}
14 changes: 3 additions & 11 deletions TRImageControl/Packing/Remapping/PositionedTexture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,7 @@ namespace TRImageControl.Packing;

public class PositionedTexture
{
private readonly TRTextileSegment _segment;

public int OriginalIndex => _segment.Index;
public int TileIndex => _segment.Atlas;
public Point Position => new(_segment.Bounds.X, _segment.Bounds.Y);
public Rectangle Bounds => _segment.Bounds;

public PositionedTexture(TRTextileSegment segment)
{
_segment = segment;
}
public int OriginalIndex { get; set; }
public int TileIndex { get; set; }
public Point Position { get; set; }
}
2 changes: 1 addition & 1 deletion TRRandomizerCore/Processors/TR3/TR3SequenceProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ private void ImportUPV(TR3CombinedLevel level)
LevelName = level.Name,
TypesToImport = upvImport,
DataFolder = GetResourcePath(@"TR3\Objects"),
//TexturePositionMonitor = TextureMonitor.CreateMonitor(level.Name, upvImport)
TextureMonitor = TextureMonitor.CreateMonitor(level.Name, upvImport)
};

importer.Import();
Expand Down
2 changes: 1 addition & 1 deletion TRRandomizerCore/Randomizers/TR1/TR1EnemyRandomizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1376,7 +1376,7 @@ protected override void ProcessImpl()
Level = level.Data,
LevelName = level.Name,
DataFolder = _outer.GetResourcePath(@"TR1\Objects"),
//TexturePositionMonitor = _outer.TextureMonitor.CreateMonitor(level.Name, enemies.EntitiesToImport)
TextureMonitor = _outer.TextureMonitor.CreateMonitor(level.Name, enemies.TypesToImport)
};

string remapPath = @"TR1\Textures\Deduplication\" + level.Name + "-TextureRemap.json";
Expand Down
4 changes: 2 additions & 2 deletions TRRandomizerCore/Randomizers/TR1/TR1OutfitRandomizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ private void ImportBraid(TR1CombinedLevel level)
LevelName = level.Name,
ClearUnusedSprites = false,
TypesToImport = _ponytailEntities,
//TexturePositionMonitor = _outer.TextureMonitor.CreateMonitor(level.Name, _ponytailEntities),
TextureMonitor = _outer.TextureMonitor.CreateMonitor(level.Name, _ponytailEntities),
DataFolder = _outer.GetResourcePath(@"TR1\Objects")
};

Expand Down Expand Up @@ -881,7 +881,7 @@ private void ConvertToMauledOutfit(TR1CombinedLevel level)
LevelName = level.CutSceneLevel.Name,
ClearUnusedSprites = false,
TypesToImport = _mauledEntities,
//TexturePositionMonitor = _outer.TextureMonitor.CreateMonitor(level.CutSceneLevel.Name, _mauledEntities),
TextureMonitor = _outer.TextureMonitor.CreateMonitor(level.CutSceneLevel.Name, _mauledEntities),
DataFolder = _outer.GetResourcePath(@"TR1\Objects")
};

Expand Down
4 changes: 2 additions & 2 deletions TRRandomizerCore/Randomizers/TR1/TR1TextureRandomizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -217,8 +217,8 @@ private TR1TextureMapping GetMapping(TR1CombinedLevel level)
level.JsonID,
_textureDatabase,
TextureMonitor.GetLevelMapping(level.Name),
TextureMonitor.GetIgnoredEntities(level.Name),
TextureMonitor.GetEntityMap(level.Name)
TextureMonitor.GetIgnoredTypes(level.Name),
TextureMonitor.GetTypeMap(level.Name)
);
}
}
Expand Down
2 changes: 1 addition & 1 deletion TRRandomizerCore/Randomizers/TR2/TR2EnemyRandomizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1036,7 +1036,7 @@ private bool Import(TR2CombinedLevel level, EnemyTransportCollection enemies)
LevelName = level.Name,
DataFolder = _outer.GetResourcePath(@"TR2\Objects"),
TextureRemapPath = _outer.GetResourcePath(@"TR2\Textures\Deduplication\" + level.JsonID + "-TextureRemap.json"),
//TexturePositionMonitor = _outer.TextureMonitor.CreateMonitor(level.Name, enemies.EntitiesToImport)
TextureMonitor = _outer.TextureMonitor.CreateMonitor(level.Name, enemies.TypesToImport)
};

importer.Data.AliasPriority = TR2EnemyUtilities.GetAliasPriority(level.Name, enemies.TypesToImport);
Expand Down
2 changes: 1 addition & 1 deletion TRRandomizerCore/Randomizers/TR2/TR2ItemRandomizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -619,7 +619,7 @@ private void RandomizeVehicles()
ClearUnusedSprites = false,
TypesToImport = new(vehicles.Keys),
DataFolder = GetResourcePath(@"TR2\Objects"),
//TexturePositionMonitor = TextureMonitor.CreateMonitor(_levelInstance.Name, vehicles.Keys.ToList())
TextureMonitor = TextureMonitor.CreateMonitor(_levelInstance.Name, vehicles.Keys.ToList())
};


Expand Down
2 changes: 1 addition & 1 deletion TRRandomizerCore/Randomizers/TR2/TR2OutfitRandomizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ private bool Import(TR2CombinedLevel level, TR2Type lara)
ClearUnusedSprites = false,
TypesToImport = laraImport,
TypesToRemove = laraRemovals,
//TexturePositionMonitor = _outer.TextureMonitor.CreateMonitor(level.Name, laraImport),
TextureMonitor = _outer.TextureMonitor.CreateMonitor(level.Name, laraImport),
DataFolder = _outer.GetResourcePath(@"TR2\Objects")
};

Expand Down
2 changes: 1 addition & 1 deletion TRRandomizerCore/Randomizers/TR2/TR2TextureRandomizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ private TR2TextureMapping GetMapping(TR2CombinedLevel level)
level.JsonID,
_textureDatabase,
TextureMonitor.GetLevelMapping(level.Name),
TextureMonitor.GetIgnoredEntities(level.Name)
TextureMonitor.GetIgnoredTypes(level.Name)
);
}
}
Expand Down
2 changes: 1 addition & 1 deletion TRRandomizerCore/Randomizers/TR3/TR3EnemyRandomizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -734,7 +734,7 @@ protected override void ProcessImpl()
Level = level.Data,
LevelName = level.Name,
DataFolder = _outer.GetResourcePath(@"TR3\Objects"),
//TexturePositionMonitor = _outer.TextureMonitor.CreateMonitor(level.Name, enemies.EntitiesToImport)
TextureMonitor = _outer.TextureMonitor.CreateMonitor(level.Name, enemies.TypesToImport)
};

string remapPath = @"TR3\Textures\Deduplication\" + level.Name + "-TextureRemap.json";
Expand Down
2 changes: 1 addition & 1 deletion TRRandomizerCore/Randomizers/TR3/TR3OutfitRandomizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ private bool Import(TR3CombinedLevel level, TR3Type lara)
ClearUnusedSprites = false,
TypesToImport = laraImport,
TypesToRemove = laraRemovals,
//TexturePositionMonitor = _outer.TextureMonitor.CreateMonitor(level.Name, laraImport),
TextureMonitor = _outer.TextureMonitor.CreateMonitor(level.Name, laraImport),
DataFolder = _outer.GetResourcePath(@"TR3\Objects")
};

Expand Down
6 changes: 3 additions & 3 deletions TRRandomizerCore/Randomizers/TR3/TR3SecretRandomizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -753,7 +753,7 @@ protected override void ProcessImpl()
LevelName = level.Name,
TypesToImport = allocation.ImportModels,
DataFolder = _outer.GetResourcePath(@"TR3\Objects"),
//TexturePositionMonitor = monitor
TextureMonitor = monitor
};
importer.Import();

Expand Down Expand Up @@ -782,8 +782,8 @@ protected override void ProcessImpl()
SetPuzzleTypeName(level, puzzlePickupType, _pickupNames[artefactPickupType]);

// Tell the texture monitor that these artefacts are puzzle items
monitor.EntityMap[artefactPickupType] = puzzlePickupType;
monitor.EntityMap[artefactMenuType] = puzzleMenuType;
monitor.TypeMap[artefactPickupType] = puzzlePickupType;
monitor.TypeMap[artefactMenuType] = puzzleMenuType;
}
}

Expand Down
4 changes: 2 additions & 2 deletions TRRandomizerCore/Randomizers/TR3/TR3TextureRandomizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -215,8 +215,8 @@ private TR3TextureMapping GetMapping(TR3CombinedLevel level)
level.Name,
_textureDatabase,
TextureMonitor.GetLevelMapping(level.Name),
TextureMonitor.GetIgnoredEntities(level.Name),
TextureMonitor.GetEntityMap(level.Name)
TextureMonitor.GetIgnoredTypes(level.Name),
TextureMonitor.GetTypeMap(level.Name)
);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -441,6 +441,7 @@
{
"Comments": "Add a bowl where the spikes were.",
"EMType": 24,
"MeshID": 302,
"Locations": [
{
"X": 47616,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1928,7 +1928,6 @@
"Centre": {},
"Vertices": [],
"Normals": [],
"Lights": [],
"TexturedRectangles": [],
"TexturedTriangles": [],
"ColouredRectangles": [],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,25 @@
}
]
}
},
{
"EMType": 23,
"Rotations": [
{
"RoomNumber": 8,
"FaceIndices": [
15,
31,
42
],
"VertexRemap": {
"0": 2,
"1": 3,
"2": 0,
"3": 1
}
}
]
}
],
"Any": [
Expand Down
Loading

0 comments on commit ac65dc7

Please sign in to comment.