mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 18:27:24 +01:00
Import material names
This commit is contained in:
parent
3cd438bb5d
commit
d2f93f8562
3 changed files with 44 additions and 4 deletions
|
|
@ -10,6 +10,8 @@ public class MeshImporter(IEnumerable<Node> nodes)
|
|||
public MdlStructs.MeshStruct MeshStruct;
|
||||
public List<MdlStructs.SubmeshStruct> SubMeshStructs;
|
||||
|
||||
public string? Material;
|
||||
|
||||
public MdlStructs.VertexDeclarationStruct VertexDeclaration;
|
||||
public IEnumerable<byte> VertexBuffer;
|
||||
|
||||
|
|
@ -35,6 +37,8 @@ public class MeshImporter(IEnumerable<Node> nodes)
|
|||
|
||||
private readonly List<MdlStructs.SubmeshStruct> _subMeshes = [];
|
||||
|
||||
private string? _material;
|
||||
|
||||
private MdlStructs.VertexDeclarationStruct? _vertexDeclaration;
|
||||
private byte[]? _strides;
|
||||
private ushort _vertexCount;
|
||||
|
|
@ -74,6 +78,7 @@ public class MeshImporter(IEnumerable<Node> nodes)
|
|||
BoneTableIndex = 0,
|
||||
},
|
||||
SubMeshStructs = _subMeshes,
|
||||
Material = _material,
|
||||
VertexDeclaration = _vertexDeclaration.Value,
|
||||
VertexBuffer = _streams[0].Concat(_streams[1]).Concat(_streams[2]),
|
||||
Indices = _indices,
|
||||
|
|
@ -105,6 +110,9 @@ public class MeshImporter(IEnumerable<Node> nodes)
|
|||
|
||||
var subMeshName = node.Name ?? node.Mesh.Name;
|
||||
|
||||
// TODO: Record a warning if there's a mismatch between current and incoming, as we can't support multiple materials per mesh.
|
||||
_material ??= subMesh.Material;
|
||||
|
||||
// Check that vertex declarations match - we need to combine the buffers, so a mismatch would take a whole load of resolution.
|
||||
if (_vertexDeclaration == null)
|
||||
_vertexDeclaration = subMesh.VertexDeclaration;
|
||||
|
|
|
|||
|
|
@ -19,6 +19,8 @@ public partial class ModelImporter(ModelRoot _model)
|
|||
private readonly List<MdlStructs.MeshStruct> _meshes = [];
|
||||
private readonly List<MdlStructs.SubmeshStruct> _subMeshes = [];
|
||||
|
||||
private readonly List<string> _materials = [];
|
||||
|
||||
private readonly List<MdlStructs.VertexDeclarationStruct> _vertexDeclarations = [];
|
||||
private readonly List<byte> _vertexBuffer = [];
|
||||
|
||||
|
|
@ -37,6 +39,8 @@ public partial class ModelImporter(ModelRoot _model)
|
|||
BuildMeshForGroup(subMeshNodes);
|
||||
|
||||
// Now that all the meshes have been built, we can build some of the model-wide metadata.
|
||||
var materials = _materials.Count > 0 ? _materials : ["/NO_MATERIAL"];
|
||||
|
||||
var shapes = new List<MdlFile.Shape>();
|
||||
var shapeMeshes = new List<MdlStructs.ShapeMeshStruct>();
|
||||
foreach (var (keyName, keyMeshes) in _shapeMeshes)
|
||||
|
|
@ -86,8 +90,7 @@ public partial class ModelImporter(ModelRoot _model)
|
|||
},
|
||||
],
|
||||
|
||||
// TODO: Would be good to populate from gltf material names.
|
||||
Materials = ["/NO_MATERIAL"],
|
||||
Materials = [.. materials],
|
||||
|
||||
// TODO: Would be good to calculate all of this up the tree.
|
||||
Radius = 1,
|
||||
|
|
@ -130,15 +133,20 @@ public partial class ModelImporter(ModelRoot _model)
|
|||
var mesh = MeshImporter.Import(subMeshNodes);
|
||||
var meshStartIndex = (uint)(mesh.MeshStruct.StartIndex + indexOffset);
|
||||
|
||||
ushort materialIndex = 0;
|
||||
if (mesh.Material != null)
|
||||
materialIndex = GetMaterialIndex(mesh.Material);
|
||||
|
||||
// If no bone table is used for a mesh, the index is set to 255.
|
||||
var boneTableIndex = 255;
|
||||
ushort boneTableIndex = 255;
|
||||
if (mesh.Bones != null)
|
||||
boneTableIndex = BuildBoneTable(mesh.Bones);
|
||||
|
||||
_meshes.Add(mesh.MeshStruct with
|
||||
{
|
||||
MaterialIndex = materialIndex,
|
||||
SubMeshIndex = (ushort)(mesh.MeshStruct.SubMeshIndex + subMeshOffset),
|
||||
BoneTableIndex = (ushort)boneTableIndex,
|
||||
BoneTableIndex = boneTableIndex,
|
||||
StartIndex = meshStartIndex,
|
||||
VertexBufferOffset = mesh.MeshStruct.VertexBufferOffset
|
||||
.Select(offset => (uint)(offset + vertexOffset))
|
||||
|
|
@ -173,6 +181,23 @@ public partial class ModelImporter(ModelRoot _model)
|
|||
}
|
||||
}
|
||||
|
||||
private ushort GetMaterialIndex(string materialName)
|
||||
{
|
||||
// If we already have this material, grab the current one
|
||||
var index = _materials.IndexOf(materialName);
|
||||
if (index >= 0)
|
||||
return (ushort)index;
|
||||
|
||||
// If there's already 4 materials, we can't add any more.
|
||||
// TODO: permit, with a warning to reduce, and validation in MdlTab.
|
||||
var count = _materials.Count;
|
||||
if (count >= 4)
|
||||
return 0;
|
||||
|
||||
_materials.Add(materialName);
|
||||
return (ushort)count;
|
||||
}
|
||||
|
||||
private ushort BuildBoneTable(List<string> boneNames)
|
||||
{
|
||||
var boneIndices = new List<ushort>();
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@ public class SubMeshImporter
|
|||
{
|
||||
public MdlStructs.SubmeshStruct SubMeshStruct;
|
||||
|
||||
public string? Material;
|
||||
|
||||
public MdlStructs.VertexDeclarationStruct VertexDeclaration;
|
||||
|
||||
public ushort VertexCount;
|
||||
|
|
@ -81,6 +83,10 @@ public class SubMeshImporter
|
|||
ArgumentNullException.ThrowIfNull(_attributes);
|
||||
ArgumentNullException.ThrowIfNull(_shapeValues);
|
||||
|
||||
var material = _primitive.Material.Name;
|
||||
if (material == "")
|
||||
material = null;
|
||||
|
||||
return new SubMesh()
|
||||
{
|
||||
SubMeshStruct = new MdlStructs.SubmeshStruct()
|
||||
|
|
@ -93,6 +99,7 @@ public class SubMeshImporter
|
|||
BoneStartIndex = 0,
|
||||
BoneCount = 0,
|
||||
},
|
||||
Material = material,
|
||||
VertexDeclaration = new MdlStructs.VertexDeclarationStruct()
|
||||
{
|
||||
VertexElements = _attributes.Select(attribute => attribute.Element).ToArray(),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue