Skip to content

Commit

Permalink
add support for skins
Browse files Browse the repository at this point in the history
  • Loading branch information
ovska committed May 2, 2024
1 parent 6ee4438 commit 9b3394a
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 14 deletions.
1 change: 1 addition & 0 deletions Pack3r.Console/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ internal static IConfiguration SetupDI()
.Bind<IMapFileParser>().To<MapFileParser>()
.Bind<IReferenceParser>(1).To<AseParser>()
.Bind<IReferenceParser>(2).To<Md3Parser>()
.Bind<IReferenceParser>(3).To<SkinParser>()
.Bind<IReferenceResourceParser>().To<ReferenceResourceParser>()
.Bind<IAssetService>().To<AssetService>()
.Bind<LoggerBase>().To<LoggerBase>()
Expand Down
9 changes: 3 additions & 6 deletions Pack3r.Core/Parsers/AseParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public partial class AseParser(

await foreach (var line in lines)
{
if (Matcher.Comment().IsMatch(line.Value.Span))
if (Comment().IsMatch(line.Value.Span))
{
if (!line.Value.Span.Contains("Generated by Q3Map2", StringComparison.Ordinal))
{
Expand All @@ -57,9 +57,6 @@ await foreach (var line in lines)
return resouces;
}

private static partial class Matcher
{
[GeneratedRegex("""\*COMMENT\s""", RegexOptions.Singleline, 1000)]
public static partial Regex Comment();
}
[GeneratedRegex("""\*COMMENT\s""", RegexOptions.Singleline, 1000)]
private static partial Regex Comment();
}
8 changes: 0 additions & 8 deletions Pack3r.Core/Parsers/MapFileParser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ public class MapFileParser(
ROMC currentEntity = default;
bool hasStyleLights = false;

List<ROMC> unsupSkins = [];
List<ROMC> unsupTerrains = [];

int lineCount = 0;
Expand Down Expand Up @@ -173,12 +172,6 @@ await foreach (var line in reader.ReadLines(path, new LineOptions(KeepRaw: true)
}
}

if (unsupSkins.Count > 0)
{
string entities = string.Join(", ", unsupSkins);
logger.Warn($"Resources referenced by skins are not supported, please include manually (on entities: {entities})");
}

if (unsupTerrains.Count > 0)
{
string entities = string.Join(", ", unsupTerrains);
Expand Down Expand Up @@ -246,7 +239,6 @@ void HandleKeysAndClear()
}
else if (key.EqualsF("skin") || key.EqualsF("_skin"))
{
unsupSkins.Add(currentEntity);
resources.Add(value);
referenceResources.Add(value);
}
Expand Down
39 changes: 39 additions & 0 deletions Pack3r.Core/Parsers/SkinParser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using System.IO.Compression;
using Pack3r.Extensions;
using Pack3r.IO;
using Pack3r.Models;

namespace Pack3r.Parsers;

public class SkinParser(ILineReader reader) : IReferenceParser
{
public bool CanParse(ReadOnlyMemory<char> resource) => resource.EndsWithF(".skin");

public Task<HashSet<Resource>?> Parse(string path, CancellationToken cancellationToken)
{
return ParseCore(reader.ReadLines(path, default, cancellationToken))!;
}

public Task<HashSet<Resource>?> Parse(ZipArchiveEntry entry, string archivePath, CancellationToken cancellationToken)
{
return ParseCore(reader.ReadLines(archivePath, entry, default, cancellationToken))!;
}

private static async Task<HashSet<Resource>> ParseCore(IAsyncEnumerable<Line> lines)
{
var result = new HashSet<Resource>();

await foreach (var line in lines)
{
int comma = line.Value.Span.IndexOf(',');

if (comma >= 0)
{
result.Add(
new Resource(line.Value[(comma + 1)..].Trim().Trim('"'), IsShader: true));
}
}

return result;
}
}
38 changes: 38 additions & 0 deletions Pack3r.Tests/SkinParserTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Pack3r.Parsers;

namespace Pack3r.Tests;

public static class SkinParserTests
{
[Fact]
public static async Task Should_Parse_Skin()
{
var reader = new StringLineReader("""
head, "models/players/hud/allied_field"
teeth,"models/players/hud/teeth01"
eye1, "models/players/hud/eye02"
eye2, "models/players/hud/eye02"
""");

var parser = new SkinParser(reader);

Assert.True(parser.CanParse("test.skin".AsMemory()));
Assert.False(parser.CanParse("test.md3".AsMemory()));

var result = await parser.Parse("", default);

Assert.NotNull(result);
Assert.Equal(
[
"models/players/hud/allied_field",
"models/players/hud/teeth01",
"models/players/hud/eye02",
],
result.Select(s => s.Value.ToString()));
}
}

0 comments on commit 9b3394a

Please sign in to comment.