Improved drawable shader parameters loading

This commit is contained in:
dexy 2020-03-11 01:29:16 +11:00
parent d3bc78ddb4
commit 211764c0f9

View File

@ -402,51 +402,31 @@ namespace CodeWalker.GameFiles
} }
[TypeConverter(typeof(ExpandableObjectConverter))] public class ShaderParameter : ResourceSystemBlock [TypeConverter(typeof(ExpandableObjectConverter))] public class ShaderParameter
{ {
public override long BlockLength
{
get { return 16; }
}
// structure data
public byte DataType { get; set; } //0: texture, 1: vector4 public byte DataType { get; set; } //0: texture, 1: vector4
public byte Unknown_1h { get; set; } public byte Unknown_1h { get; set; }
public ushort Unknown_2h; // 0x0000 public ushort Unknown_2h; // 0x0000
public uint Unknown_4h; // 0x00000000 public uint Unknown_4h; // 0x00000000
public ulong DataPointer { get; set; } public ulong DataPointer { get; set; }
//public IResourceBlock Data { get; set; }
public object Data { get; set; } public object Data { get; set; }
public override void Read(ResourceDataReader reader, params object[] parameters) public void Read(ResourceDataReader reader)
{ {
// read structure data
this.DataType = reader.ReadByte(); this.DataType = reader.ReadByte();
this.Unknown_1h = reader.ReadByte(); this.Unknown_1h = reader.ReadByte();
this.Unknown_2h = reader.ReadUInt16(); this.Unknown_2h = reader.ReadUInt16();
this.Unknown_4h = reader.ReadUInt32(); this.Unknown_4h = reader.ReadUInt32();
this.DataPointer = reader.ReadUInt64(); this.DataPointer = reader.ReadUInt64();
// DONT READ DATA...
} }
public override void Write(ResourceDataWriter writer, params object[] parameters) public void Write(ResourceDataWriter writer)
{ {
// write structure data
writer.Write(this.DataType); writer.Write(this.DataType);
writer.Write(this.Unknown_1h); writer.Write(this.Unknown_1h);
writer.Write(this.Unknown_2h); writer.Write(this.Unknown_2h);
writer.Write(this.Unknown_4h); writer.Write(this.Unknown_4h);
writer.Write(this.DataPointer); writer.Write(this.DataPointer);
// DONT WRITE DATA
}
public override IResourceBlock[] GetReferences()
{
var list = new List<IResourceBlock>(base.GetReferences());
//if (Data != null) list.Add(Data);
return list.ToArray();
} }
public override string ToString() public override string ToString()
@ -455,7 +435,7 @@ namespace CodeWalker.GameFiles
} }
} }
[TypeConverter(typeof(ExpandableObjectConverter))] public class ShaderParametersBlock : ResourceSystemBlock, IResourceNoCacheBlock [TypeConverter(typeof(ExpandableObjectConverter))] public class ShaderParametersBlock : ResourceSystemBlock
{ {
public override long BlockLength public override long BlockLength
@ -522,7 +502,9 @@ namespace CodeWalker.GameFiles
var paras = new List<ShaderParameter>(); var paras = new List<ShaderParameter>();
for (int i = 0; i < Count; i++) for (int i = 0; i < Count; i++)
{ {
paras.Add(reader.ReadBlock<ShaderParameter>()); var p = new ShaderParameter();
p.Read(reader);
paras.Add(p);
} }
int offset = 0; int offset = 0;
@ -609,11 +591,6 @@ namespace CodeWalker.GameFiles
{ {
// update pointers... // update pointers...
//foreach (var f in Parameters)
// if (f.Data != null)
// f.DataPointer = (ulong)f.Data.Position;
// else
// f.DataPointer = 0;
for (int i = 0; i < Parameters.Length; i++) for (int i = 0; i < Parameters.Length; i++)
{ {
var param = Parameters[i]; var param = Parameters[i];
@ -639,14 +616,11 @@ namespace CodeWalker.GameFiles
// write parameter infos // write parameter infos
foreach (var f in Parameters) foreach (var f in Parameters)
writer.WriteBlock(f); {
f.Write(writer);
}
// write vector data // write vector data
//foreach (var f in Parameters)
//{
// if (f.DataType != 0)
// writer.WriteBlock(f.Data);
//}
for (int i = 0; i < Parameters.Length; i++) for (int i = 0; i < Parameters.Length; i++)
{ {
var param = Parameters[i]; var param = Parameters[i];
@ -664,7 +638,9 @@ namespace CodeWalker.GameFiles
// write hashes // write hashes
foreach (var h in Hashes) foreach (var h in Hashes)
{
writer.Write((uint)h); writer.Write((uint)h);
}
} }
public void WriteXml(StringBuilder sb, int indent) public void WriteXml(StringBuilder sb, int indent)
{ {
@ -804,8 +780,12 @@ namespace CodeWalker.GameFiles
list.AddRange(base.GetReferences()); list.AddRange(base.GetReferences());
foreach (var x in Parameters) foreach (var x in Parameters)
{
if (x.DataType == 0) if (x.DataType == 0)
{
list.Add(x.Data as TextureBase); list.Add(x.Data as TextureBase);
}
}
return list.ToArray(); return list.ToArray();
} }
@ -815,13 +795,7 @@ namespace CodeWalker.GameFiles
var list = new List<Tuple<long, IResourceBlock>>(); var list = new List<Tuple<long, IResourceBlock>>();
list.AddRange(base.GetParts()); list.AddRange(base.GetParts());
long offset = 0; long offset = Parameters.Length * 16;
foreach (var x in Parameters)
{
list.Add(new Tuple<long, IResourceBlock>(offset, x));
offset += 16;
}
var blist = new List<ResourceSystemStructBlock<Vector4>>(); var blist = new List<ResourceSystemStructBlock<Vector4>>();
foreach (var x in Parameters) foreach (var x in Parameters)