Skip to content

Commit 80acfe8

Browse files
committed
Add parsing for scenegraph material definitions.
This does not yet convert the material definitions to unity materials. That will be done in a follow up as there are a bunch of different properties that will need to be handled.
1 parent 59d8456 commit 80acfe8

14 files changed

+228
-0
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
# Autogenerated Jetbrains Rider plugin
2424
/[Aa]ssets/Plugins/Editor/JetBrains*
25+
# Jetbrains Rider directory
26+
.idea/
2527

2628
# Visual Studio cache directory
2729
.vs/
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using OpenTS2.Files.Formats.DBPF.Scenegraph.Block;
2+
3+
namespace OpenTS2.Content.DBPF.Scenegraph
4+
{
5+
public class ScenegraphMaterialDefinitionAsset : AbstractAsset
6+
{
7+
public MaterialDefinitionBlock MaterialDefinition { get; }
8+
9+
public ScenegraphMaterialDefinitionAsset(MaterialDefinitionBlock material) => (MaterialDefinition) = (material);
10+
}
11+
}

Assets/Scripts/OpenTS2/Content/DBPF/Scenegraph/ScenegraphMaterialDefinitionAsset.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Scripts/OpenTS2/Files/Formats/DBPF/GroupsTypes.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public static class TypeIDs
2020
/// </summary>
2121
public const uint SCENEGRAPH_TXTR = Scenegraph.Block.ImageDataBlock.TYPE_ID;
2222
public const uint SCENEGRAPH_LIFO = Scenegraph.Block.MipLevelInfoBlock.TYPE_ID;
23+
public const uint SCENEGRAPH_TXMT = Scenegraph.Block.MaterialDefinitionBlock.TYPE_ID;
2324
public const uint NHOOD_TERRAIN = 0xABCB5DA4;
2425
// Neighborhood info
2526
public const uint NHOOD_INFO = 0xAC8A7A2E;
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using OpenTS2.Files.Utils;
4+
using UnityEngine;
5+
6+
namespace OpenTS2.Files.Formats.DBPF.Scenegraph.Block
7+
{
8+
public class MaterialDefinitionBlock : ScenegraphDataBlock
9+
{
10+
public const uint TYPE_ID = 0x49596978;
11+
public const string BLOCK_NAME = "cMaterialDefinition";
12+
public override string BlockName => BLOCK_NAME;
13+
14+
public ScenegraphResource Resource { get; }
15+
16+
/// <summary>
17+
/// A dictionary mapping material properties such as "reflectivity" -> "0.5" and
18+
/// "stdMatCullMode" -> "cullClockwise".
19+
/// </summary>
20+
public Dictionary<string, string> MaterialProperties { get; }
21+
22+
/// <summary>
23+
/// A list of textures used by the material.
24+
/// </summary>
25+
public string[] TextureNames { get; }
26+
27+
public MaterialDefinitionBlock(PersistTypeInfo blockTypeInfo, ScenegraphResource resource,
28+
Dictionary<string, string> materialProperties, string[] textureNames) : base(blockTypeInfo)
29+
=> (Resource, MaterialProperties, TextureNames) = (resource, materialProperties, textureNames);
30+
}
31+
32+
public class MaterialDefinitionBlockReader : IScenegraphDataBlockReader<MaterialDefinitionBlock>
33+
{
34+
public MaterialDefinitionBlock Deserialize(IoBuffer reader, PersistTypeInfo blockTypeInfo)
35+
{
36+
// TODO: there's some special handling needed for versions < 8, not implemented yet and probably not
37+
// necessary if there's no files of that version.
38+
Debug.Assert(blockTypeInfo.Version >= 8);
39+
40+
var resource = ScenegraphResource.Deserialize(reader);
41+
var materialName = reader.ReadVariableLengthPascalString();
42+
var definitionName = reader.ReadVariableLengthPascalString();
43+
44+
var numberOfProperties = reader.ReadInt32();
45+
var properties = new Dictionary<string, string>(numberOfProperties);
46+
for (var i = 0; i < numberOfProperties; i++)
47+
{
48+
properties[reader.ReadVariableLengthPascalString()] = reader.ReadVariableLengthPascalString();
49+
}
50+
51+
var numberOfTextures = reader.ReadUInt32();
52+
var textures = new string[numberOfTextures];
53+
for (var i = 0; i < numberOfTextures; i++)
54+
{
55+
textures[i] = reader.ReadVariableLengthPascalString();
56+
}
57+
58+
return new MaterialDefinitionBlock(blockTypeInfo, resource, properties, textures);
59+
}
60+
}
61+
}

Assets/Scripts/OpenTS2/Files/Formats/DBPF/Scenegraph/Block/MaterialDefinitionBlock.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System.IO;
2+
using OpenTS2.Common;
3+
using OpenTS2.Content;
4+
using OpenTS2.Content.DBPF.Scenegraph;
5+
using OpenTS2.Files.Formats.DBPF.Scenegraph.Block;
6+
using OpenTS2.Files.Utils;
7+
8+
namespace OpenTS2.Files.Formats.DBPF.Scenegraph.Codecs
9+
{
10+
[Codec(TypeIDs.SCENEGRAPH_TXMT)]
11+
public class ScenegraphMaterialDefinitionCodec : AbstractCodec
12+
{
13+
public override AbstractAsset Deserialize(byte[] bytes, ResourceKey tgi, DBPFFile sourceFile)
14+
{
15+
var stream = new MemoryStream(bytes);
16+
var reader = IoBuffer.FromStream(stream, ByteOrder.LITTLE_ENDIAN);
17+
18+
var material = ScenegraphResourceCollection.DeserializeSingletonScenegraphBlock<MaterialDefinitionBlock>(reader);
19+
return new ScenegraphMaterialDefinitionAsset(material);
20+
}
21+
}
22+
}

Assets/Scripts/OpenTS2/Files/Formats/DBPF/Scenegraph/Codecs/ScenegraphMaterialDefinitionCodec.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Scripts/OpenTS2/Files/Formats/DBPF/Scenegraph/ScenegraphResourceCollection.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public static ScenegraphResourceCollection Deserialize(IoBuffer reader)
9595
{ ImageDataBlock.TYPE_ID, new ImageDataBlockReader() },
9696
{ MipLevelInfoBlock.TYPE_ID, new MipLevelInfoBlockReader() },
9797
{ GeometryDataContainerBlock.TYPE_ID, new GeometryDataContainerBlockReader() },
98+
{ MaterialDefinitionBlock.TYPE_ID, new MaterialDefinitionBlockReader() },
9899
};
99100
}
100101
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using NUnit.Framework;
2+
using OpenTS2.Common;
3+
using OpenTS2.Content;
4+
using OpenTS2.Content.DBPF.Scenegraph;
5+
using OpenTS2.Files.Formats.DBPF;
6+
7+
public class ScenegraphMaterailDefinitionCodecTest
8+
{
9+
[SetUp]
10+
public void SetUp()
11+
{
12+
TestMain.Initialize();
13+
ContentProvider.Get().AddPackage("TestAssets/Scenegraph/material_definition.package");
14+
}
15+
16+
[Test]
17+
public void TestLoadsMaterialDefinitionSuccessfully()
18+
{
19+
var materialAsset = ContentProvider.Get()
20+
.GetAsset<ScenegraphMaterialDefinitionAsset>(new ResourceKey("ufocrash_cabin_txmt", 0x1C0532FA,
21+
TypeIDs.SCENEGRAPH_TXMT));
22+
23+
Assert.That(materialAsset.MaterialDefinition.MaterialProperties.Count, Is.GreaterThan(0));
24+
25+
Assert.That(materialAsset.MaterialDefinition.MaterialProperties["reflectivity"], Is.EqualTo("0.025"));
26+
Assert.That(materialAsset.MaterialDefinition.MaterialProperties["stdMatCullMode"], Is.EqualTo("cullClockwise"));
27+
Assert.That(materialAsset.MaterialDefinition.MaterialProperties["stdMatSpecCoef"],
28+
Is.EqualTo("0.94,0.94,0.94"));
29+
30+
Assert.That(materialAsset.MaterialDefinition.TextureNames, Is.EquivalentTo(new[]{ "ufocrash-cabin", }));
31+
}
32+
}

Assets/Tests/OpenTS2/Files/Formats/DBPF/Scenegraph/Codecs/ScenegraphMaterailDefinitionCodecTest.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Textures/ShadowMaterial.mat

Lines changed: 78 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Textures/ShadowMaterial.mat.meta

Lines changed: 8 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Binary file not shown.

0 commit comments

Comments
 (0)