Second commit

This commit is contained in:
ThomasCharester committed 2026-09-20 15:26:03 +03:00
commit 36840f3ad4
999 files changed
+61364

No files matched your search

+304
View File
@@ -0,0 +1,304 @@
//
// This file is part of the Tremble package by Tiny Goose.
// Copyright (c) 2024-2026 TinyGoose Ltd., All Rights Reserved.
//
using System.Collections.Generic;
using UnityEngine;
namespace TinyGoose.Tremble
{
public class WadPalette
{
private Color32[] m_Colours;
public ref Color32 Get(int pos) => ref m_Colours[pos];
private static WadPalette s_QuakePalette;
public static WadPalette QuakePalette
{
get
{
if (s_QuakePalette == null)
{
s_QuakePalette = new()
{
m_Colours = new Color32[]
{
new(0x00, 0x00, 0x00, 0xFF),
new(0x0F, 0x0F, 0x0F, 0xFF),
new(0x1F, 0x1F, 0x1F, 0xFF),
new(0x2F, 0x2F, 0x2F, 0xFF),
new(0x3F, 0x3F, 0x3F, 0xFF),
new(0x4B, 0x4B, 0x4B, 0xFF),
new(0x5B, 0x5B, 0x5B, 0xFF),
new(0x6B, 0x6B, 0x6B, 0xFF),
new(0x7B, 0x7B, 0x7B, 0xFF),
new(0x8B, 0x8B, 0x8B, 0xFF),
new(0x9B, 0x9B, 0x9B, 0xFF),
new(0xAB, 0xAB, 0xAB, 0xFF),
new(0xBB, 0xBB, 0xBB, 0xFF),
new(0xCB, 0xCB, 0xCB, 0xFF),
new(0xDB, 0xDB, 0xDB, 0xFF),
new(0xEB, 0xEB, 0xEB, 0xFF),
new(0x0F, 0x0B, 0x07, 0xFF),
new(0x17, 0x0F, 0x0B, 0xFF),
new(0x1F, 0x17, 0x0B, 0xFF),
new(0x27, 0x1B, 0x0F, 0xFF),
new(0x2F, 0x23, 0x13, 0xFF),
new(0x37, 0x2B, 0x17, 0xFF),
new(0x3F, 0x2F, 0x17, 0xFF),
new(0x4B, 0x37, 0x1B, 0xFF),
new(0x53, 0x3B, 0x1B, 0xFF),
new(0x5B, 0x43, 0x1F, 0xFF),
new(0x63, 0x4B, 0x1F, 0xFF),
new(0x6B, 0x53, 0x1F, 0xFF),
new(0x73, 0x57, 0x1F, 0xFF),
new(0x7B, 0x5F, 0x23, 0xFF),
new(0x83, 0x67, 0x23, 0xFF),
new(0x8F, 0x6F, 0x23, 0xFF),
new(0x0B, 0x0B, 0x0F, 0xFF),
new(0x13, 0x13, 0x1B, 0xFF),
new(0x1B, 0x1B, 0x27, 0xFF),
new(0x27, 0x27, 0x33, 0xFF),
new(0x2F, 0x2F, 0x3F, 0xFF),
new(0x37, 0x37, 0x4B, 0xFF),
new(0x3F, 0x3F, 0x57, 0xFF),
new(0x47, 0x47, 0x67, 0xFF),
new(0x4F, 0x4F, 0x73, 0xFF),
new(0x5B, 0x5B, 0x7F, 0xFF),
new(0x63, 0x63, 0x8B, 0xFF),
new(0x6B, 0x6B, 0x97, 0xFF),
new(0x73, 0x73, 0xA3, 0xFF),
new(0x7B, 0x7B, 0xAF, 0xFF),
new(0x83, 0x83, 0xBB, 0xFF),
new(0x8B, 0x8B, 0xCB, 0xFF),
new(0x00, 0x00, 0x00, 0xFF),
new(0x07, 0x07, 0x00, 0xFF),
new(0x0B, 0x0B, 0x00, 0xFF),
new(0x13, 0x13, 0x00, 0xFF),
new(0x1B, 0x1B, 0x00, 0xFF),
new(0x23, 0x23, 0x00, 0xFF),
new(0x2B, 0x2B, 0x07, 0xFF),
new(0x2F, 0x2F, 0x07, 0xFF),
new(0x37, 0x37, 0x07, 0xFF),
new(0x3F, 0x3F, 0x07, 0xFF),
new(0x47, 0x47, 0x07, 0xFF),
new(0x4B, 0x4B, 0x0B, 0xFF),
new(0x53, 0x53, 0x0B, 0xFF),
new(0x5B, 0x5B, 0x0B, 0xFF),
new(0x63, 0x63, 0x0B, 0xFF),
new(0x6B, 0x6B, 0x0F, 0xFF),
new(0x07, 0x00, 0x00, 0xFF),
new(0x0F, 0x00, 0x00, 0xFF),
new(0x17, 0x00, 0x00, 0xFF),
new(0x1F, 0x00, 0x00, 0xFF),
new(0x27, 0x00, 0x00, 0xFF),
new(0x2F, 0x00, 0x00, 0xFF),
new(0x37, 0x00, 0x00, 0xFF),
new(0x3F, 0x00, 0x00, 0xFF),
new(0x47, 0x00, 0x00, 0xFF),
new(0x4F, 0x00, 0x00, 0xFF),
new(0x57, 0x00, 0x00, 0xFF),
new(0x5F, 0x00, 0x00, 0xFF),
new(0x67, 0x00, 0x00, 0xFF),
new(0x6F, 0x00, 0x00, 0xFF),
new(0x77, 0x00, 0x00, 0xFF),
new(0x7F, 0x00, 0x00, 0xFF),
new(0x13, 0x13, 0x00, 0xFF),
new(0x1B, 0x1B, 0x00, 0xFF),
new(0x23, 0x23, 0x00, 0xFF),
new(0x2F, 0x2B, 0x00, 0xFF),
new(0x37, 0x2F, 0x00, 0xFF),
new(0x43, 0x37, 0x00, 0xFF),
new(0x4B, 0x3B, 0x07, 0xFF),
new(0x57, 0x43, 0x07, 0xFF),
new(0x5F, 0x47, 0x07, 0xFF),
new(0x6B, 0x4B, 0x0B, 0xFF),
new(0x77, 0x53, 0x0F, 0xFF),
new(0x83, 0x57, 0x13, 0xFF),
new(0x8B, 0x5B, 0x13, 0xFF),
new(0x97, 0x5F, 0x1B, 0xFF),
new(0xA3, 0x63, 0x1F, 0xFF),
new(0xAF, 0x67, 0x23, 0xFF),
new(0x23, 0x13, 0x07, 0xFF),
new(0x2F, 0x17, 0x0B, 0xFF),
new(0x3B, 0x1F, 0x0F, 0xFF),
new(0x4B, 0x23, 0x13, 0xFF),
new(0x57, 0x2B, 0x17, 0xFF),
new(0x63, 0x2F, 0x1F, 0xFF),
new(0x73, 0x37, 0x23, 0xFF),
new(0x7F, 0x3B, 0x2B, 0xFF),
new(0x8F, 0x43, 0x33, 0xFF),
new(0x9F, 0x4F, 0x33, 0xFF),
new(0xAF, 0x63, 0x2F, 0xFF),
new(0xBF, 0x77, 0x2F, 0xFF),
new(0xCF, 0x8F, 0x2B, 0xFF),
new(0xDF, 0xAB, 0x27, 0xFF),
new(0xEF, 0xCB, 0x1F, 0xFF),
new(0xFF, 0xF3, 0x1B, 0xFF),
new(0x0B, 0x07, 0x00, 0xFF),
new(0x1B, 0x13, 0x00, 0xFF),
new(0x2B, 0x23, 0x0F, 0xFF),
new(0x37, 0x2B, 0x13, 0xFF),
new(0x47, 0x33, 0x1B, 0xFF),
new(0x53, 0x37, 0x23, 0xFF),
new(0x63, 0x3F, 0x2B, 0xFF),
new(0x6F, 0x47, 0x33, 0xFF),
new(0x7F, 0x53, 0x3F, 0xFF),
new(0x8B, 0x5F, 0x47, 0xFF),
new(0x9B, 0x6B, 0x53, 0xFF),
new(0xA7, 0x7B, 0x5F, 0xFF),
new(0xB7, 0x87, 0x6B, 0xFF),
new(0xC3, 0x93, 0x7B, 0xFF),
new(0xD3, 0xA3, 0x8B, 0xFF),
new(0xE3, 0xB3, 0x97, 0xFF),
new(0xAB, 0x8B, 0xA3, 0xFF),
new(0x9F, 0x7F, 0x97, 0xFF),
new(0x93, 0x73, 0x87, 0xFF),
new(0x8B, 0x67, 0x7B, 0xFF),
new(0x7F, 0x5B, 0x6F, 0xFF),
new(0x77, 0x53, 0x63, 0xFF),
new(0x6B, 0x4B, 0x57, 0xFF),
new(0x5F, 0x3F, 0x4B, 0xFF),
new(0x57, 0x37, 0x43, 0xFF),
new(0x4B, 0x2F, 0x37, 0xFF),
new(0x43, 0x27, 0x2F, 0xFF),
new(0x37, 0x1F, 0x23, 0xFF),
new(0x2B, 0x17, 0x1B, 0xFF),
new(0x23, 0x13, 0x13, 0xFF),
new(0x17, 0x0B, 0x0B, 0xFF),
new(0x0F, 0x07, 0x07, 0xFF),
new(0xBB, 0x73, 0x9F, 0xFF),
new(0xAF, 0x6B, 0x8F, 0xFF),
new(0xA3, 0x5F, 0x83, 0xFF),
new(0x97, 0x57, 0x77, 0xFF),
new(0x8B, 0x4F, 0x6B, 0xFF),
new(0x7F, 0x4B, 0x5F, 0xFF),
new(0x73, 0x43, 0x53, 0xFF),
new(0x6B, 0x3B, 0x4B, 0xFF),
new(0x5F, 0x33, 0x3F, 0xFF),
new(0x53, 0x2B, 0x37, 0xFF),
new(0x47, 0x23, 0x2B, 0xFF),
new(0x3B, 0x1F, 0x23, 0xFF),
new(0x2F, 0x17, 0x1B, 0xFF),
new(0x23, 0x13, 0x13, 0xFF),
new(0x17, 0x0B, 0x0B, 0xFF),
new(0x0F, 0x07, 0x07, 0xFF),
new(0xDB, 0xC3, 0xBB, 0xFF),
new(0xCB, 0xB3, 0xA7, 0xFF),
new(0xBF, 0xA3, 0x9B, 0xFF),
new(0xAF, 0x97, 0x8B, 0xFF),
new(0xA3, 0x87, 0x7B, 0xFF),
new(0x97, 0x7B, 0x6F, 0xFF),
new(0x87, 0x6F, 0x5F, 0xFF),
new(0x7B, 0x63, 0x53, 0xFF),
new(0x6B, 0x57, 0x47, 0xFF),
new(0x5F, 0x4B, 0x3B, 0xFF),
new(0x53, 0x3F, 0x33, 0xFF),
new(0x43, 0x33, 0x27, 0xFF),
new(0x37, 0x2B, 0x1F, 0xFF),
new(0x27, 0x1F, 0x17, 0xFF),
new(0x1B, 0x13, 0x0F, 0xFF),
new(0x0F, 0x0B, 0x07, 0xFF),
new(0x6F, 0x83, 0x7B, 0xFF),
new(0x67, 0x7B, 0x6F, 0xFF),
new(0x5F, 0x73, 0x67, 0xFF),
new(0x57, 0x6B, 0x5F, 0xFF),
new(0x4F, 0x63, 0x57, 0xFF),
new(0x47, 0x5B, 0x4F, 0xFF),
new(0x3F, 0x53, 0x47, 0xFF),
new(0x37, 0x4B, 0x3F, 0xFF),
new(0x2F, 0x43, 0x37, 0xFF),
new(0x2B, 0x3B, 0x2F, 0xFF),
new(0x23, 0x33, 0x27, 0xFF),
new(0x1F, 0x2B, 0x1F, 0xFF),
new(0x17, 0x23, 0x17, 0xFF),
new(0x0F, 0x1B, 0x13, 0xFF),
new(0x0B, 0x13, 0x0B, 0xFF),
new(0x07, 0x0B, 0x07, 0xFF),
new(0xFF, 0xF3, 0x1B, 0xFF),
new(0xEF, 0xDF, 0x17, 0xFF),
new(0xDB, 0xCB, 0x13, 0xFF),
new(0xCB, 0xB7, 0x0F, 0xFF),
new(0xBB, 0xA7, 0x0F, 0xFF),
new(0xAB, 0x97, 0x0B, 0xFF),
new(0x9B, 0x83, 0x07, 0xFF),
new(0x8B, 0x73, 0x07, 0xFF),
new(0x7B, 0x63, 0x07, 0xFF),
new(0x6B, 0x53, 0x00, 0xFF),
new(0x5B, 0x47, 0x00, 0xFF),
new(0x4B, 0x37, 0x00, 0xFF),
new(0x3B, 0x2B, 0x00, 0xFF),
new(0x2B, 0x1F, 0x00, 0xFF),
new(0x1B, 0x0F, 0x00, 0xFF),
new(0x0B, 0x07, 0x00, 0xFF),
new(0x00, 0x00, 0xFF, 0xFF),
new(0x0B, 0x0B, 0xEF, 0xFF),
new(0x13, 0x13, 0xDF, 0xFF),
new(0x1B, 0x1B, 0xCF, 0xFF),
new(0x23, 0x23, 0xBF, 0xFF),
new(0x2B, 0x2B, 0xAF, 0xFF),
new(0x2F, 0x2F, 0x9F, 0xFF),
new(0x2F, 0x2F, 0x8F, 0xFF),
new(0x2F, 0x2F, 0x7F, 0xFF),
new(0x2F, 0x2F, 0x6F, 0xFF),
new(0x2F, 0x2F, 0x5F, 0xFF),
new(0x2B, 0x2B, 0x4F, 0xFF),
new(0x23, 0x23, 0x3F, 0xFF),
new(0x1B, 0x1B, 0x2F, 0xFF),
new(0x13, 0x13, 0x1F, 0xFF),
new(0x0B, 0x0B, 0x0F, 0xFF),
new(0x2B, 0x00, 0x00, 0xFF),
new(0x3B, 0x00, 0x00, 0xFF),
new(0x4B, 0x07, 0x00, 0xFF),
new(0x5F, 0x07, 0x00, 0xFF),
new(0x6F, 0x0F, 0x00, 0xFF),
new(0x7F, 0x17, 0x07, 0xFF),
new(0x93, 0x1F, 0x07, 0xFF),
new(0xA3, 0x27, 0x0B, 0xFF),
new(0xB7, 0x33, 0x0F, 0xFF),
new(0xC3, 0x4B, 0x1B, 0xFF),
new(0xCF, 0x63, 0x2B, 0xFF),
new(0xDB, 0x7F, 0x3B, 0xFF),
new(0xE3, 0x97, 0x4F, 0xFF),
new(0xE7, 0xAB, 0x5F, 0xFF),
new(0xEF, 0xBF, 0x77, 0xFF),
new(0xF7, 0xD3, 0x8B, 0xFF),
new(0xA7, 0x7B, 0x3B, 0xFF),
new(0xB7, 0x9B, 0x37, 0xFF),
new(0xC7, 0xC3, 0x37, 0xFF),
new(0xE7, 0xE3, 0x57, 0xFF),
new(0x7F, 0xBF, 0xFF, 0xFF),
new(0xAB, 0xE7, 0xFF, 0xFF),
new(0xD7, 0xFF, 0xFF, 0xFF),
new(0x67, 0x00, 0x00, 0xFF),
new(0x8B, 0x00, 0x00, 0xFF),
new(0xB3, 0x00, 0x00, 0xFF),
new(0xD7, 0x00, 0x00, 0xFF),
new(0xFF, 0x00, 0x00, 0xFF),
new(0xFF, 0xF3, 0x93, 0xFF),
new(0xFF, 0xF7, 0xC7, 0xFF),
new(0xFF, 0xFF, 0xFF, 0xFF),
new(0x9F, 0x5B, 0x53, 0xFF)
}
};
}
return s_QuakePalette;
}
}
}
public readonly struct WadEntry
{
public int Address { get; init; }
public int Size { get; init; }
public char Type { get; init; }
public string Name { get; init; }
}
public record WadFile
{
public List<WadEntry> Entries { get; init; }
}
}
+10
View File
@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: 81577f4367354726bf894c329ef36a6c
timeCreated: 1722844184
AssetOrigin:
serializedVersion: 1
productId: 277805
packageName: Tremble - Map Importer
packageVersion: 1.11.1
assetPath: Assets/Tremble/IO/WAD/WadFile.cs
uploadId: 939664
+102
View File
@@ -0,0 +1,102 @@
//
// This file is part of the Tremble package by Tiny Goose.
// Copyright (c) 2024-2026 TinyGoose Ltd., All Rights Reserved.
//
using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Experimental.Rendering;
namespace TinyGoose.Tremble
{
public class WadParser
{
private readonly StreamReadIO m_Stream;
public WadParser(string filename)
{
m_Stream = new(filename);
}
public void WriteTextureToFile(in WadEntry entry, string outFile)
{
m_Stream.Seek(entry.Address);
string name = m_Stream.ReadString(16);
int width = m_Stream.ReadInt32();
int height = m_Stream.ReadInt32();
m_Stream.SkipBytes(16);
byte[] palettedTextureData = m_Stream.ReadBytes(width * height);
byte[] rgbTextureData = new byte[palettedTextureData.Length * 3];
// Copy paletted to RGB, flipping as we go
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
int readOffset = y * width + x;
int invY = height - y - 1;
int writeOffset = (invY * width + x) * 3;
ref Color32 colour = ref WadPalette.QuakePalette.Get(palettedTextureData[readOffset]);
rgbTextureData[writeOffset + 0] = colour.r;
rgbTextureData[writeOffset + 1] = colour.g;
rgbTextureData[writeOffset + 2] = colour.b;
}
}
byte[] pngBytes = ImageConversion.EncodeArrayToPNG(rgbTextureData, GraphicsFormat.R8G8B8_UNorm, (uint)width, (uint)height);
File.WriteAllBytes(outFile, pngBytes);
}
public WadFile Parse()
{
m_Stream.Seek(0);
string magic = new(m_Stream.ReadChars(4));
if (!magic.EqualsInvariant("wad2"))
{
Debug.LogError($"File was not a WAD2 :(");
return default;
}
int numEntries = m_Stream.ReadInt32();
int dirOffset = m_Stream.ReadInt32();
m_Stream.Seek(dirOffset);
List<WadEntry> entries = new(numEntries);
for (int entryIdx = 0; entryIdx < numEntries; entryIdx++)
{
int entryAddress = m_Stream.ReadInt32();
int entrySize = m_Stream.ReadInt32();
m_Stream.SkipBytes(4);
char type = (char)m_Stream.ReadByte();
m_Stream.SkipBytes(3);
string name = new(m_Stream.ReadString(16));
// Skip anything that's not a texture
if (type != 'D')
continue;
entries.Add(new()
{
Address = entryAddress,
Size = entrySize,
Type = type,
Name = name.Replace('*', '_') // * is not a valid name for an asset!
});
}
return new()
{
Entries = entries
};
}
}
}
+10
View File
@@ -0,0 +1,10 @@
fileFormatVersion: 2
guid: f8ecbbe775a9445a9f8f2148c4a06be2
timeCreated: 1722843896
AssetOrigin:
serializedVersion: 1
productId: 277805
packageName: Tremble - Map Importer
packageVersion: 1.11.1
assetPath: Assets/Tremble/IO/WAD/WadParser.cs
uploadId: 939664