mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-17 22:24:22 +01:00
Prevent import of models with too many shape values
This commit is contained in:
parent
c3ba8a2231
commit
ec114b3f6a
2 changed files with 11 additions and 3 deletions
|
|
@ -4,7 +4,7 @@ using SharpGLTF.Schema2;
|
||||||
|
|
||||||
namespace Penumbra.Import.Models.Import;
|
namespace Penumbra.Import.Models.Import;
|
||||||
|
|
||||||
public partial class ModelImporter(ModelRoot _model)
|
public partial class ModelImporter(ModelRoot model)
|
||||||
{
|
{
|
||||||
public static MdlFile Import(ModelRoot model)
|
public static MdlFile Import(ModelRoot model)
|
||||||
{
|
{
|
||||||
|
|
@ -99,7 +99,7 @@ public partial class ModelImporter(ModelRoot _model)
|
||||||
|
|
||||||
/// <summary> Returns an iterator over sorted, grouped mesh nodes. </summary>
|
/// <summary> Returns an iterator over sorted, grouped mesh nodes. </summary>
|
||||||
private IEnumerable<IEnumerable<Node>> GroupedMeshNodes()
|
private IEnumerable<IEnumerable<Node>> GroupedMeshNodes()
|
||||||
=> _model.LogicalNodes
|
=> model.LogicalNodes
|
||||||
.Where(node => node.Mesh != null)
|
.Where(node => node.Mesh != null)
|
||||||
.Select(node =>
|
.Select(node =>
|
||||||
{
|
{
|
||||||
|
|
@ -171,6 +171,14 @@ public partial class ModelImporter(ModelRoot _model)
|
||||||
|
|
||||||
_shapeValues.AddRange(meshShapeKey.ShapeValues);
|
_shapeValues.AddRange(meshShapeKey.ShapeValues);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The number of shape values in a model is bounded by the count
|
||||||
|
// value, which is stored as a u16.
|
||||||
|
// While technically there are similar bounds on other shape struct
|
||||||
|
// arrays, values is practically guaranteed to be the highest of the
|
||||||
|
// group, so a failure on any of them will be a failure on it.
|
||||||
|
if (_shapeValues.Count > ushort.MaxValue)
|
||||||
|
throw new Exception($"Importing this file would require more than the maximum of {ushort.MaxValue} shape values.\nTry removing or applying shape keys that do not need to be changed at runtime in-game.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private ushort BuildBoneTable(List<string> boneNames)
|
private ushort BuildBoneTable(List<string> boneNames)
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,7 @@ public partial class ModEditWindow
|
||||||
var spaceAvail = ImGui.GetContentRegionAvail().X - ImGui.GetStyle().ItemSpacing.X - 100;
|
var spaceAvail = ImGui.GetContentRegionAvail().X - ImGui.GetStyle().ItemSpacing.X - 100;
|
||||||
foreach (var exception in tab.IoExceptions)
|
foreach (var exception in tab.IoExceptions)
|
||||||
{
|
{
|
||||||
var message = $"{exception.GetType().Name}: {exception.Message} {exception.Message}";
|
var message = $"{exception.GetType().Name}: {exception.Message}";
|
||||||
var textSize = ImGui.CalcTextSize(message).X;
|
var textSize = ImGui.CalcTextSize(message).X;
|
||||||
if (textSize > spaceAvail)
|
if (textSize > spaceAvail)
|
||||||
message = message.Substring(0, (int)Math.Floor(message.Length * (spaceAvail / textSize))) + "...";
|
message = message.Substring(0, (int)Math.Floor(message.Length * (spaceAvail / textSize))) + "...";
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue