mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 18:27:24 +01:00
Add backface and transparency handling as well as more info to Mtrl handling.
This commit is contained in:
parent
febfa8836e
commit
847d8432ff
3 changed files with 118 additions and 11 deletions
|
|
@ -66,7 +66,7 @@ public partial class MtrlFile
|
|||
w.Write( ( ushort )ShaderPackage.ShaderKeys.Length );
|
||||
w.Write( ( ushort )ShaderPackage.Constants.Length );
|
||||
w.Write( ( ushort )ShaderPackage.Samplers.Length );
|
||||
w.Write( ShaderPackage.Unk );
|
||||
w.Write( ShaderPackage.Flags );
|
||||
|
||||
foreach( var key in ShaderPackage.ShaderKeys )
|
||||
{
|
||||
|
|
|
|||
|
|
@ -249,7 +249,7 @@ public partial class MtrlFile : IWritable
|
|||
public Constant[] Constants;
|
||||
public Sampler[] Samplers;
|
||||
public float[] ShaderValues;
|
||||
public uint Unk;
|
||||
public uint Flags;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -326,7 +326,7 @@ public partial class MtrlFile : IWritable
|
|||
var shaderKeyCount = r.ReadUInt16();
|
||||
var constantCount = r.ReadUInt16();
|
||||
var samplerCount = r.ReadUInt16();
|
||||
ShaderPackage.Unk = r.ReadUInt32();
|
||||
ShaderPackage.Flags = r.ReadUInt32();
|
||||
|
||||
ShaderPackage.ShaderKeys = r.ReadStructuresAsArray< ShaderKey >( shaderKeyCount );
|
||||
ShaderPackage.Constants = r.ReadStructuresAsArray< Constant >( constantCount );
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Numerics;
|
||||
|
|
@ -32,7 +33,7 @@ public partial class ModEditWindow
|
|||
private bool _changed;
|
||||
|
||||
private string _defaultPath = string.Empty;
|
||||
private bool _inInput = false;
|
||||
private bool _inInput;
|
||||
private T? _defaultFile;
|
||||
|
||||
private IReadOnlyList< Mod.Editor.FileRegistry > _list = null!;
|
||||
|
|
@ -230,10 +231,15 @@ public partial class ModEditWindow
|
|||
{
|
||||
var ret = DrawMaterialTextureChange( file, disabled );
|
||||
|
||||
ImGui.Dummy( new Vector2( ImGui.GetTextLineHeight() / 2 ) );
|
||||
ret |= DrawBackFaceAndTransparency( file, disabled );
|
||||
|
||||
ImGui.NewLine();
|
||||
ImGui.Dummy( new Vector2( ImGui.GetTextLineHeight() / 2 ) );
|
||||
ret |= DrawMaterialColorSetChange( file, disabled );
|
||||
|
||||
ImGui.Dummy( new Vector2( ImGui.GetTextLineHeight() / 2 ) );
|
||||
ret |= DrawOtherMaterialDetails( file, disabled );
|
||||
|
||||
return !disabled && ret;
|
||||
}
|
||||
|
||||
|
|
@ -266,7 +272,7 @@ public partial class ModEditWindow
|
|||
return false;
|
||||
}
|
||||
|
||||
ColorSetCopyAllClipboardButton( file, 0 );
|
||||
ColorSetCopyAllClipboardButton( file, 0 );
|
||||
ImGui.SameLine();
|
||||
var ret = ColorSetPasteAllClipboardButton( file, 0 );
|
||||
using var table = ImRaii.Table( "##ColorSets", 10,
|
||||
|
|
@ -310,9 +316,110 @@ public partial class ModEditWindow
|
|||
return ret;
|
||||
}
|
||||
|
||||
private static bool DrawBackFaceAndTransparency( MtrlFile file, bool disabled )
|
||||
{
|
||||
const uint transparencyBit = 0x10;
|
||||
const uint backfaceBit = 0x01;
|
||||
|
||||
var ret = false;
|
||||
|
||||
using var dis = ImRaii.Disabled( disabled );
|
||||
|
||||
var tmp = ( file.ShaderPackage.Flags & transparencyBit ) != 0;
|
||||
if( ImGui.Checkbox( "Enable Transparency", ref tmp ) )
|
||||
{
|
||||
file.ShaderPackage.Flags = tmp ? file.ShaderPackage.Flags | transparencyBit : file.ShaderPackage.Flags & ~transparencyBit;
|
||||
ret = true;
|
||||
}
|
||||
|
||||
ImGui.SameLine(200 * ImGuiHelpers.GlobalScale + ImGui.GetStyle().ItemSpacing.X + ImGui.GetStyle().WindowPadding.X);
|
||||
tmp = ( file.ShaderPackage.Flags & backfaceBit ) != 0;
|
||||
if( ImGui.Checkbox( "Hide Backfaces", ref tmp ) )
|
||||
{
|
||||
file.ShaderPackage.Flags = tmp ? file.ShaderPackage.Flags | backfaceBit : file.ShaderPackage.Flags & ~backfaceBit;
|
||||
ret = true;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
private static bool DrawOtherMaterialDetails( MtrlFile file, bool _ )
|
||||
{
|
||||
if( !ImGui.CollapsingHeader( "Further Content" ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
using( var sets = ImRaii.TreeNode( "UV Sets", ImGuiTreeNodeFlags.DefaultOpen ) )
|
||||
{
|
||||
if( sets )
|
||||
{
|
||||
foreach( var set in file.UvSets )
|
||||
{
|
||||
ImRaii.TreeNode( $"#{set.Index:D2} - {set.Name}", ImGuiTreeNodeFlags.Leaf ).Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
using( var shaders = ImRaii.TreeNode( "Shaders", ImGuiTreeNodeFlags.DefaultOpen ) )
|
||||
{
|
||||
if( shaders )
|
||||
{
|
||||
ImRaii.TreeNode( $"Name: {file.ShaderPackage.Name}", ImGuiTreeNodeFlags.Leaf ).Dispose();
|
||||
ImRaii.TreeNode( $"Flags: {file.ShaderPackage.Flags:X8}", ImGuiTreeNodeFlags.Leaf ).Dispose();
|
||||
foreach( var (key, idx) in file.ShaderPackage.ShaderKeys.WithIndex() )
|
||||
{
|
||||
using var t = ImRaii.TreeNode( $"Shader Key #{idx}" );
|
||||
if( t )
|
||||
{
|
||||
ImRaii.TreeNode( $"Category: {key.Category}", ImGuiTreeNodeFlags.Leaf ).Dispose();
|
||||
ImRaii.TreeNode( $"Value: {key.Value}", ImGuiTreeNodeFlags.Leaf ).Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
foreach( var (constant, idx) in file.ShaderPackage.Constants.WithIndex() )
|
||||
{
|
||||
using var t = ImRaii.TreeNode( $"Constant #{idx}" );
|
||||
if( t )
|
||||
{
|
||||
ImRaii.TreeNode( $"Category: {constant.Id}", ImGuiTreeNodeFlags.Leaf ).Dispose();
|
||||
ImRaii.TreeNode( $"Value: 0x{constant.Value:X8}", ImGuiTreeNodeFlags.Leaf ).Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
foreach( var (sampler, idx) in file.ShaderPackage.Samplers.WithIndex() )
|
||||
{
|
||||
using var t = ImRaii.TreeNode( $"Sampler #{idx}" );
|
||||
if( t )
|
||||
{
|
||||
ImRaii.TreeNode( $"ID: {sampler.SamplerId}", ImGuiTreeNodeFlags.Leaf ).Dispose();
|
||||
ImRaii.TreeNode( $"Texture Index: {sampler.TextureIndex}", ImGuiTreeNodeFlags.Leaf ).Dispose();
|
||||
ImRaii.TreeNode( $"Flags: 0x{sampler.Flags:X8}", ImGuiTreeNodeFlags.Leaf ).Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
foreach( var (value, idx) in file.ShaderPackage.ShaderValues.WithIndex() )
|
||||
{
|
||||
ImRaii.TreeNode( $"Value #{idx}: {value.ToString( CultureInfo.InvariantCulture )}", ImGuiTreeNodeFlags.Leaf ).Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( file.AdditionalData.Length > 0 )
|
||||
{
|
||||
using var t = ImRaii.TreeNode( "Additional Data" );
|
||||
if( t )
|
||||
{
|
||||
ImRaii.TreeNode( string.Join( ' ', file.AdditionalData.Select( c => $"{c:X2}" ) ), ImGuiTreeNodeFlags.Leaf ).Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void ColorSetCopyAllClipboardButton( MtrlFile file, int colorSetIdx )
|
||||
{
|
||||
if( !ImGui.Button( "Export All Rows to Clipboard" ) )
|
||||
if( !ImGui.Button( "Export All Rows to Clipboard", ImGuiHelpers.ScaledVector2( 200, 0 ) ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -335,7 +442,7 @@ public partial class ModEditWindow
|
|||
|
||||
private static unsafe bool ColorSetPasteAllClipboardButton( MtrlFile file, int colorSetIdx )
|
||||
{
|
||||
if( !ImGui.Button( "Import All Rows from Clipboard" ) || file.ColorSets.Length <= colorSetIdx )
|
||||
if( !ImGui.Button( "Import All Rows from Clipboard", ImGuiHelpers.ScaledVector2( 200, 0 ) ) || file.ColorSets.Length <= colorSetIdx )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
@ -353,13 +460,13 @@ public partial class ModEditWindow
|
|||
fixed( void* ptr = data, output = &rows )
|
||||
{
|
||||
Functions.MemCpyUnchecked( output, ptr, Marshal.SizeOf< MtrlFile.ColorSet.RowArray >() );
|
||||
if( data.Length >= Marshal.SizeOf< MtrlFile.ColorSet.RowArray >() + Marshal.SizeOf< MtrlFile.ColorDyeSet.RowArray >()
|
||||
&& file.ColorDyeSets.Length > colorSetIdx)
|
||||
if( data.Length >= Marshal.SizeOf< MtrlFile.ColorSet.RowArray >() + Marshal.SizeOf< MtrlFile.ColorDyeSet.RowArray >()
|
||||
&& file.ColorDyeSets.Length > colorSetIdx )
|
||||
{
|
||||
ref var dyeRows = ref file.ColorDyeSets[ colorSetIdx ].Rows;
|
||||
fixed( void* output2 = &dyeRows )
|
||||
{
|
||||
Functions.MemCpyUnchecked( output2, (byte*) ptr + Marshal.SizeOf<MtrlFile.ColorSet.RowArray>(), Marshal.SizeOf<MtrlFile.ColorDyeSet.RowArray>() );
|
||||
Functions.MemCpyUnchecked( output2, ( byte* )ptr + Marshal.SizeOf< MtrlFile.ColorSet.RowArray >(), Marshal.SizeOf< MtrlFile.ColorDyeSet.RowArray >() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue