mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-11-26 17:02:53 +08:00
Changed DrawableModels into arrays and added DrawableModelsBlock
This commit is contained in:
parent
e48503e130
commit
1f516a87b3
@ -2035,7 +2035,233 @@ namespace CodeWalker.GameFiles
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[TypeConverter(typeof(ExpandableObjectConverter))] public class DrawableModelsBlock : ResourceSystemBlock
|
||||||
|
{
|
||||||
|
public override long BlockLength
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
long len = 0;
|
||||||
|
len += ListLength(High, len);
|
||||||
|
len += ListLength(Med, len);
|
||||||
|
len += ListLength(Low, len);
|
||||||
|
len += ListLength(VLow, len);
|
||||||
|
len += ListLength(Extra, len);
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public DrawableBase Owner;
|
||||||
|
|
||||||
|
public DrawableModel[] High { get; set; }
|
||||||
|
public DrawableModel[] Med { get; set; }
|
||||||
|
public DrawableModel[] Low { get; set; }
|
||||||
|
public DrawableModel[] VLow { get; set; }
|
||||||
|
public DrawableModel[] Extra { get; set; } //shouldn't be used
|
||||||
|
|
||||||
|
public ResourcePointerListHeader HighHeader { get; set; }
|
||||||
|
public ResourcePointerListHeader MedHeader { get; set; }
|
||||||
|
public ResourcePointerListHeader LowHeader { get; set; }
|
||||||
|
public ResourcePointerListHeader VLowHeader { get; set; }
|
||||||
|
public ResourcePointerListHeader ExtraHeader { get; set; }
|
||||||
|
|
||||||
|
public ulong[] HighPointers { get; set; }
|
||||||
|
public ulong[] MedPointers { get; set; }
|
||||||
|
public ulong[] LowPointers { get; set; }
|
||||||
|
public ulong[] VLowPointers { get; set; }
|
||||||
|
public ulong[] ExtraPointers { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public override void Read(ResourceDataReader reader, params object[] parameters)
|
||||||
|
{
|
||||||
|
Owner = parameters[0] as DrawableBase;
|
||||||
|
var pos = (ulong)reader.Position;
|
||||||
|
var highPointer = (Owner?.DrawableModelsHighPointer ?? 0);
|
||||||
|
var medPointer = (Owner?.DrawableModelsMediumPointer ?? 0);
|
||||||
|
var lowPointer = (Owner?.DrawableModelsLowPointer ?? 0);
|
||||||
|
var vlowPointer = (Owner?.DrawableModelsVeryLowPointer ?? 0);
|
||||||
|
var extraPointer = (pos != highPointer) ? pos : 0;
|
||||||
|
|
||||||
|
if (highPointer != 0)
|
||||||
|
{
|
||||||
|
HighHeader = reader.ReadStructAt<ResourcePointerListHeader>((long)highPointer);
|
||||||
|
HighPointers = reader.ReadUlongsAt(HighHeader.Pointer, HighHeader.Capacity, false);
|
||||||
|
High = reader.ReadBlocks<DrawableModel>(HighPointers);
|
||||||
|
}
|
||||||
|
if (medPointer != 0)
|
||||||
|
{
|
||||||
|
MedHeader = reader.ReadStructAt<ResourcePointerListHeader>((long)medPointer);
|
||||||
|
MedPointers = reader.ReadUlongsAt(MedHeader.Pointer, MedHeader.Capacity, false);
|
||||||
|
Med = reader.ReadBlocks<DrawableModel>(MedPointers);
|
||||||
|
}
|
||||||
|
if (lowPointer != 0)
|
||||||
|
{
|
||||||
|
LowHeader = reader.ReadStructAt<ResourcePointerListHeader>((long)lowPointer);
|
||||||
|
LowPointers = reader.ReadUlongsAt(LowHeader.Pointer, LowHeader.Capacity, false);
|
||||||
|
Low = reader.ReadBlocks<DrawableModel>(LowPointers);
|
||||||
|
}
|
||||||
|
if (vlowPointer != 0)
|
||||||
|
{
|
||||||
|
VLowHeader = reader.ReadStructAt<ResourcePointerListHeader>((long)vlowPointer);
|
||||||
|
VLowPointers = reader.ReadUlongsAt(VLowHeader.Pointer, VLowHeader.Capacity, false);
|
||||||
|
VLow = reader.ReadBlocks<DrawableModel>(VLowPointers);
|
||||||
|
}
|
||||||
|
if (extraPointer != 0)
|
||||||
|
{
|
||||||
|
ExtraHeader = reader.ReadStructAt<ResourcePointerListHeader>((long)extraPointer);
|
||||||
|
ExtraPointers = reader.ReadUlongsAt(ExtraHeader.Pointer, ExtraHeader.Capacity, false);
|
||||||
|
Extra = reader.ReadBlocks<DrawableModel>(ExtraPointers);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
||||||
|
{
|
||||||
|
|
||||||
|
ResourcePointerListHeader makeHeader(ref long p, int c)
|
||||||
|
{
|
||||||
|
p += Pad(p);
|
||||||
|
var h = new ResourcePointerListHeader() { Pointer = (ulong)(p + 16), Count = (ushort)c, Capacity = (ushort)c };
|
||||||
|
p += HeaderLength(c);
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
ulong[] makePointers(ref long p, DrawableModel[] a)
|
||||||
|
{
|
||||||
|
var ptrs = new ulong[a.Length];
|
||||||
|
for (int i = 0; i < a.Length; i++)
|
||||||
|
{
|
||||||
|
p += Pad(p);
|
||||||
|
ptrs[i] = (ulong)p;
|
||||||
|
p += a[i].BlockLength;
|
||||||
|
}
|
||||||
|
return ptrs;
|
||||||
|
}
|
||||||
|
void write(ResourcePointerListHeader h, ulong[] p, DrawableModel[] a)
|
||||||
|
{
|
||||||
|
writer.WritePadding(16);
|
||||||
|
writer.WriteStruct(h);
|
||||||
|
writer.WriteUlongs(p);
|
||||||
|
for (int i = 0; i < a.Length; i++)
|
||||||
|
{
|
||||||
|
writer.WritePadding(16);
|
||||||
|
writer.WriteBlock(a[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var ptr = writer.Position;
|
||||||
|
if (High != null)
|
||||||
|
{
|
||||||
|
HighHeader = makeHeader(ref ptr, High.Length);
|
||||||
|
HighPointers = makePointers(ref ptr, High);
|
||||||
|
write(HighHeader, HighPointers, High);
|
||||||
|
}
|
||||||
|
if (Med != null)
|
||||||
|
{
|
||||||
|
MedHeader = makeHeader(ref ptr, Med.Length);
|
||||||
|
MedPointers = makePointers(ref ptr, Med);
|
||||||
|
write(MedHeader, MedPointers, Med);
|
||||||
|
}
|
||||||
|
if (Low != null)
|
||||||
|
{
|
||||||
|
LowHeader = makeHeader(ref ptr, Low.Length);
|
||||||
|
LowPointers = makePointers(ref ptr, Low);
|
||||||
|
write(LowHeader, LowPointers, Low);
|
||||||
|
}
|
||||||
|
if (VLow != null)
|
||||||
|
{
|
||||||
|
VLowHeader = makeHeader(ref ptr, VLow.Length);
|
||||||
|
VLowPointers = makePointers(ref ptr, VLow);
|
||||||
|
write(VLowHeader, VLowPointers, VLow);
|
||||||
|
}
|
||||||
|
if (Extra != null)
|
||||||
|
{
|
||||||
|
ExtraHeader = makeHeader(ref ptr, Extra.Length);
|
||||||
|
ExtraPointers = makePointers(ref ptr, Extra);
|
||||||
|
write(ExtraHeader, ExtraPointers, Extra);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private long Pad(long o) => ((16 - (o % 16)) % 16);
|
||||||
|
private long HeaderLength(int listlength) => 16 + ((listlength) * 8);
|
||||||
|
private long ListLength(DrawableModel[] list, long o)
|
||||||
|
{
|
||||||
|
if (list == null) return 0;
|
||||||
|
long l = 0;
|
||||||
|
l += HeaderLength(list.Length);
|
||||||
|
foreach (var m in list) l += Pad(l) + m.BlockLength;
|
||||||
|
return Pad(o) + l;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override Tuple<long, IResourceBlock>[] GetParts()
|
||||||
|
{
|
||||||
|
var parts = new List<Tuple<long, IResourceBlock>>();
|
||||||
|
parts.AddRange(base.GetParts());
|
||||||
|
|
||||||
|
void addParts(ref long p, DrawableModel[] a)
|
||||||
|
{
|
||||||
|
if (a == null) return;
|
||||||
|
p += Pad(p);
|
||||||
|
p += HeaderLength(a.Length);
|
||||||
|
foreach (var m in a)
|
||||||
|
{
|
||||||
|
p += Pad(p);
|
||||||
|
parts.Add(new Tuple<long, IResourceBlock>(p, m));
|
||||||
|
p += m.BlockLength;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var ptr = (long)0;
|
||||||
|
addParts(ref ptr, High);
|
||||||
|
addParts(ref ptr, Med);
|
||||||
|
addParts(ref ptr, Low);
|
||||||
|
addParts(ref ptr, VLow);
|
||||||
|
addParts(ref ptr, Extra);
|
||||||
|
|
||||||
|
return parts.ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public long GetHighPointer()
|
||||||
|
{
|
||||||
|
if (High == null) return 0;
|
||||||
|
return FilePosition;
|
||||||
|
}
|
||||||
|
public long GetMedPointer()
|
||||||
|
{
|
||||||
|
if (Med == null) return 0;
|
||||||
|
var p = FilePosition;
|
||||||
|
p += ListLength(High, p);
|
||||||
|
p += Pad(p);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
public long GetLowPointer()
|
||||||
|
{
|
||||||
|
if (Low == null) return 0;
|
||||||
|
var p = GetMedPointer();
|
||||||
|
p += ListLength(Med, p);
|
||||||
|
p += Pad(p);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
public long GetVLowPointer()
|
||||||
|
{
|
||||||
|
if (VLow == null) return 0;
|
||||||
|
var p = GetLowPointer();
|
||||||
|
p += ListLength(Low, p);
|
||||||
|
p += Pad(p);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
public long GetExtraPointer()
|
||||||
|
{
|
||||||
|
if (Extra == null) return 0;
|
||||||
|
var p = GetVLowPointer();
|
||||||
|
p += ListLength(VLow, p);
|
||||||
|
p += Pad(p);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
[TypeConverter(typeof(ExpandableObjectConverter))] public class DrawableModel : ResourceSystemBlock, IMetaXmlItem
|
[TypeConverter(typeof(ExpandableObjectConverter))] public class DrawableModel : ResourceSystemBlock, IMetaXmlItem
|
||||||
{
|
{
|
||||||
@ -2206,12 +2432,12 @@ namespace CodeWalker.GameFiles
|
|||||||
//if (BoundsPointer != (pos + off))
|
//if (BoundsPointer != (pos + off))
|
||||||
//{ }//no hit
|
//{ }//no hit
|
||||||
//off += (ulong)((GeometriesCount1 + ((GeometriesCount1 > 1) ? 1 : 0)) * 32); //BoundsData
|
//off += (ulong)((GeometriesCount1 + ((GeometriesCount1 > 1) ? 1 : 0)) * 32); //BoundsData
|
||||||
//if ((Geometries?.data_pointers != null) && (Geometries?.data_items != null))
|
//if ((GeometryPointers != null) && (Geometries != null))
|
||||||
//{
|
//{
|
||||||
// for (int i = 0; i < GeometriesCount1; i++)
|
// for (int i = 0; i < GeometriesCount1; i++)
|
||||||
// {
|
// {
|
||||||
// var geomptr = Geometries.data_pointers[i];
|
// var geomptr = GeometryPointers[i];
|
||||||
// var geom = Geometries.data_items[i];
|
// var geom = Geometries[i];
|
||||||
// if (geom != null)
|
// if (geom != null)
|
||||||
// {
|
// {
|
||||||
// off += ((16 - (off % 16)) % 16);
|
// off += ((16 - (off % 16)) % 16);
|
||||||
@ -3902,7 +4128,7 @@ namespace CodeWalker.GameFiles
|
|||||||
public ushort Unknown_98h { get; set; } // 0x0000
|
public ushort Unknown_98h { get; set; } // 0x0000
|
||||||
public ushort Unknown_9Ah { get; set; }
|
public ushort Unknown_9Ah { get; set; }
|
||||||
public uint Unknown_9Ch { get; set; } // 0x00000000
|
public uint Unknown_9Ch { get; set; } // 0x00000000
|
||||||
public ulong DrawableModelsXPointer { get; set; }
|
public ulong DrawableModelsPointer { get; set; }
|
||||||
|
|
||||||
public byte FlagsHigh
|
public byte FlagsHigh
|
||||||
{
|
{
|
||||||
@ -3949,12 +4175,9 @@ namespace CodeWalker.GameFiles
|
|||||||
// reference data
|
// reference data
|
||||||
public ShaderGroup ShaderGroup { get; set; }
|
public ShaderGroup ShaderGroup { get; set; }
|
||||||
public Skeleton Skeleton { get; set; }
|
public Skeleton Skeleton { get; set; }
|
||||||
public ResourcePointerList64<DrawableModel> DrawableModelsHigh { get; set; }
|
|
||||||
public ResourcePointerList64<DrawableModel> DrawableModelsMedium { get; set; }
|
|
||||||
public ResourcePointerList64<DrawableModel> DrawableModelsLow { get; set; }
|
|
||||||
public ResourcePointerList64<DrawableModel> DrawableModelsVeryLow { get; set; }
|
|
||||||
public Joints Joints { get; set; }
|
public Joints Joints { get; set; }
|
||||||
public ResourcePointerList64<DrawableModel> DrawableModelsX { get; set; }
|
public DrawableModelsBlock DrawableModels { get; set; }
|
||||||
|
|
||||||
|
|
||||||
public DrawableModel[] AllModels { get; set; }
|
public DrawableModel[] AllModels { get; set; }
|
||||||
public Dictionary<ulong, VertexDeclaration> VertexDecls { get; set; }
|
public Dictionary<ulong, VertexDeclaration> VertexDecls { get; set; }
|
||||||
@ -4014,45 +4237,60 @@ namespace CodeWalker.GameFiles
|
|||||||
this.Unknown_98h = reader.ReadUInt16();
|
this.Unknown_98h = reader.ReadUInt16();
|
||||||
this.Unknown_9Ah = reader.ReadUInt16();
|
this.Unknown_9Ah = reader.ReadUInt16();
|
||||||
this.Unknown_9Ch = reader.ReadUInt32();
|
this.Unknown_9Ch = reader.ReadUInt32();
|
||||||
this.DrawableModelsXPointer = reader.ReadUInt64();
|
this.DrawableModelsPointer = reader.ReadUInt64();
|
||||||
|
|
||||||
// read reference data
|
// read reference data
|
||||||
this.ShaderGroup = reader.ReadBlockAt<ShaderGroup>(
|
this.ShaderGroup = reader.ReadBlockAt<ShaderGroup>(this.ShaderGroupPointer);
|
||||||
this.ShaderGroupPointer // offset
|
this.Skeleton = reader.ReadBlockAt<Skeleton>(this.SkeletonPointer);
|
||||||
);
|
this.Joints = reader.ReadBlockAt<Joints>(this.JointsPointer);
|
||||||
this.Skeleton = reader.ReadBlockAt<Skeleton>(
|
this.DrawableModels = reader.ReadBlockAt<DrawableModelsBlock>(this.DrawableModelsPointer, this);
|
||||||
this.SkeletonPointer // offset
|
|
||||||
);
|
|
||||||
this.DrawableModelsHigh = reader.ReadBlockAt<ResourcePointerList64<DrawableModel>>(
|
|
||||||
this.DrawableModelsHighPointer // offset
|
|
||||||
);
|
|
||||||
this.DrawableModelsMedium = reader.ReadBlockAt<ResourcePointerList64<DrawableModel>>(
|
|
||||||
this.DrawableModelsMediumPointer // offset
|
|
||||||
);
|
|
||||||
this.DrawableModelsLow = reader.ReadBlockAt<ResourcePointerList64<DrawableModel>>(
|
|
||||||
this.DrawableModelsLowPointer // offset
|
|
||||||
);
|
|
||||||
this.DrawableModelsVeryLow = reader.ReadBlockAt<ResourcePointerList64<DrawableModel>>(
|
|
||||||
this.DrawableModelsVeryLowPointer // offset
|
|
||||||
);
|
|
||||||
this.Joints = reader.ReadBlockAt<Joints>(
|
|
||||||
this.JointsPointer // offset
|
|
||||||
);
|
|
||||||
this.DrawableModelsX = reader.ReadBlockAt<ResourcePointerList64<DrawableModel>>(
|
|
||||||
this.DrawableModelsXPointer // offset
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
BuildAllModels();
|
BuildAllModels();
|
||||||
BuildVertexDecls();
|
BuildVertexDecls();
|
||||||
|
|
||||||
AssignGeometryShaders(ShaderGroup);
|
AssignGeometryShaders(ShaderGroup);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
////just testing!!!
|
////just testing!!!
|
||||||
|
|
||||||
|
//long pad(long o) => ((16 - (o % 16)) % 16);
|
||||||
|
//long listlength(DrawableModel[] list)
|
||||||
|
//{
|
||||||
|
// long l = 16;
|
||||||
|
// l += (list.Length) * 8;
|
||||||
|
// foreach (var m in list) l += pad(l) + m.BlockLength;
|
||||||
|
// return l;
|
||||||
|
//}
|
||||||
|
//var ptr = (long)DrawableModelsPointer;
|
||||||
|
//if (DrawableModels?.High != null)
|
||||||
|
//{
|
||||||
|
// if (ptr != (long)DrawableModelsHighPointer)
|
||||||
|
// { }//no hit
|
||||||
|
// ptr += listlength(DrawableModels?.High);
|
||||||
|
//}
|
||||||
|
//if (DrawableModels?.Med != null)
|
||||||
|
//{
|
||||||
|
// ptr += pad(ptr);
|
||||||
|
// if (ptr != (long)DrawableModelsMediumPointer)
|
||||||
|
// { }//no hit
|
||||||
|
// ptr += listlength(DrawableModels?.Med);
|
||||||
|
//}
|
||||||
|
//if (DrawableModels?.Low != null)
|
||||||
|
//{
|
||||||
|
// ptr += pad(ptr);
|
||||||
|
// if (ptr != (long)DrawableModelsLowPointer)
|
||||||
|
// { }//no hit
|
||||||
|
// ptr += listlength(DrawableModels?.Low);
|
||||||
|
//}
|
||||||
|
//if (DrawableModels?.VLow != null)
|
||||||
|
//{
|
||||||
|
// ptr += pad(ptr);
|
||||||
|
// if (ptr != (long)DrawableModelsVeryLowPointer)
|
||||||
|
// { }//no hit
|
||||||
|
// ptr += listlength(DrawableModels?.VLow);
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
//switch (Unknown_3Ch)
|
//switch (Unknown_3Ch)
|
||||||
//{
|
//{
|
||||||
// case 0x7f800001:
|
// case 0x7f800001:
|
||||||
@ -4242,12 +4480,12 @@ namespace CodeWalker.GameFiles
|
|||||||
// update structure data
|
// update structure data
|
||||||
this.ShaderGroupPointer = (ulong)(this.ShaderGroup != null ? this.ShaderGroup.FilePosition : 0);
|
this.ShaderGroupPointer = (ulong)(this.ShaderGroup != null ? this.ShaderGroup.FilePosition : 0);
|
||||||
this.SkeletonPointer = (ulong)(this.Skeleton != null ? this.Skeleton.FilePosition : 0);
|
this.SkeletonPointer = (ulong)(this.Skeleton != null ? this.Skeleton.FilePosition : 0);
|
||||||
this.DrawableModelsHighPointer = (ulong)(this.DrawableModelsHigh != null ? this.DrawableModelsHigh.FilePosition : 0);
|
this.DrawableModelsHighPointer = (ulong)(DrawableModels?.GetHighPointer() ?? 0);
|
||||||
this.DrawableModelsMediumPointer = (ulong)(this.DrawableModelsMedium != null ? this.DrawableModelsMedium.FilePosition : 0);
|
this.DrawableModelsMediumPointer = (ulong)(DrawableModels?.GetMedPointer() ?? 0);
|
||||||
this.DrawableModelsLowPointer = (ulong)(this.DrawableModelsLow != null ? this.DrawableModelsLow.FilePosition : 0);
|
this.DrawableModelsLowPointer = (ulong)(DrawableModels?.GetLowPointer() ?? 0);
|
||||||
this.DrawableModelsVeryLowPointer = (ulong)(this.DrawableModelsVeryLow != null ? this.DrawableModelsVeryLow.FilePosition : 0);
|
this.DrawableModelsVeryLowPointer = (ulong)(DrawableModels?.GetVLowPointer() ?? 0);
|
||||||
this.JointsPointer = (ulong)(this.Joints != null ? this.Joints.FilePosition : 0);
|
this.JointsPointer = (ulong)(this.Joints != null ? this.Joints.FilePosition : 0);
|
||||||
this.DrawableModelsXPointer = (ulong)(this.DrawableModelsX != null ? this.DrawableModelsX.FilePosition : 0);
|
this.DrawableModelsPointer = (ulong)(DrawableModels?.FilePosition ?? 0);
|
||||||
|
|
||||||
// write structure data
|
// write structure data
|
||||||
writer.Write(this.ShaderGroupPointer);
|
writer.Write(this.ShaderGroupPointer);
|
||||||
@ -4274,7 +4512,7 @@ namespace CodeWalker.GameFiles
|
|||||||
writer.Write(this.Unknown_98h);
|
writer.Write(this.Unknown_98h);
|
||||||
writer.Write(this.Unknown_9Ah);
|
writer.Write(this.Unknown_9Ah);
|
||||||
writer.Write(this.Unknown_9Ch);
|
writer.Write(this.Unknown_9Ch);
|
||||||
writer.Write(this.DrawableModelsXPointer);
|
writer.Write(this.DrawableModelsPointer);
|
||||||
}
|
}
|
||||||
public virtual void WriteXml(StringBuilder sb, int indent, string ddsfolder)
|
public virtual void WriteXml(StringBuilder sb, int indent, string ddsfolder)
|
||||||
{
|
{
|
||||||
@ -4309,25 +4547,25 @@ namespace CodeWalker.GameFiles
|
|||||||
Joints.WriteXml(sb, indent + 1);
|
Joints.WriteXml(sb, indent + 1);
|
||||||
YdrXml.CloseTag(sb, indent, "Joints");
|
YdrXml.CloseTag(sb, indent, "Joints");
|
||||||
}
|
}
|
||||||
if (DrawableModelsHigh?.data_items != null)
|
if (DrawableModels?.High != null)
|
||||||
{
|
{
|
||||||
YdrXml.WriteItemArray(sb, DrawableModelsHigh.data_items, indent, "DrawableModelsHigh");
|
YdrXml.WriteItemArray(sb, DrawableModels.High, indent, "DrawableModelsHigh");
|
||||||
}
|
}
|
||||||
if (DrawableModelsMedium?.data_items != null)
|
if (DrawableModels?.Med != null)
|
||||||
{
|
{
|
||||||
YdrXml.WriteItemArray(sb, DrawableModelsMedium.data_items, indent, "DrawableModelsMedium");
|
YdrXml.WriteItemArray(sb, DrawableModels.Med, indent, "DrawableModelsMedium");
|
||||||
}
|
}
|
||||||
if (DrawableModelsLow?.data_items != null)
|
if (DrawableModels?.Low != null)
|
||||||
{
|
{
|
||||||
YdrXml.WriteItemArray(sb, DrawableModelsLow.data_items, indent, "DrawableModelsLow");
|
YdrXml.WriteItemArray(sb, DrawableModels.Low, indent, "DrawableModelsLow");
|
||||||
}
|
}
|
||||||
if (DrawableModelsVeryLow?.data_items != null)
|
if (DrawableModels?.VLow != null)
|
||||||
{
|
{
|
||||||
YdrXml.WriteItemArray(sb, DrawableModelsVeryLow.data_items, indent, "DrawableModelsVeryLow");
|
YdrXml.WriteItemArray(sb, DrawableModels.VLow, indent, "DrawableModelsVeryLow");
|
||||||
}
|
}
|
||||||
if ((DrawableModelsX?.data_items != null) && (DrawableModelsX != DrawableModelsHigh))//is this right? duplicates..?
|
if (DrawableModels?.Extra != null)//is this right? duplicates..?
|
||||||
{
|
{
|
||||||
YdrXml.WriteItemArray(sb, DrawableModelsX.data_items, indent, "DrawableModelsX");
|
YdrXml.WriteItemArray(sb, DrawableModels.Extra, indent, "DrawableModelsX");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public virtual void ReadXml(XmlNode node, string ddsfolder)
|
public virtual void ReadXml(XmlNode node, string ddsfolder)
|
||||||
@ -4363,39 +4601,15 @@ namespace CodeWalker.GameFiles
|
|||||||
Joints = new Joints();
|
Joints = new Joints();
|
||||||
Joints.ReadXml(jnode);
|
Joints.ReadXml(jnode);
|
||||||
}
|
}
|
||||||
var dmhigh = XmlMeta.ReadItemArray<DrawableModel>(node, "DrawableModelsHigh");
|
this.DrawableModels = new DrawableModelsBlock();
|
||||||
if (dmhigh != null)
|
this.DrawableModels.High = XmlMeta.ReadItemArray<DrawableModel>(node, "DrawableModelsHigh");
|
||||||
|
this.DrawableModels.Med = XmlMeta.ReadItemArray<DrawableModel>(node, "DrawableModelsMedium");
|
||||||
|
this.DrawableModels.Low = XmlMeta.ReadItemArray<DrawableModel>(node, "DrawableModelsLow");
|
||||||
|
this.DrawableModels.VLow = XmlMeta.ReadItemArray<DrawableModel>(node, "DrawableModelsVeryLow");
|
||||||
|
this.DrawableModels.Extra = XmlMeta.ReadItemArray<DrawableModel>(node, "DrawableModelsX");
|
||||||
|
if (DrawableModels.BlockLength == 0)
|
||||||
{
|
{
|
||||||
DrawableModelsHigh = new ResourcePointerList64<DrawableModel>();
|
DrawableModels = null;
|
||||||
DrawableModelsHigh.data_items = dmhigh;
|
|
||||||
}
|
|
||||||
var dmmed = XmlMeta.ReadItemArray<DrawableModel>(node, "DrawableModelsMedium");
|
|
||||||
if (dmmed != null)
|
|
||||||
{
|
|
||||||
DrawableModelsMedium = new ResourcePointerList64<DrawableModel>();
|
|
||||||
DrawableModelsMedium.data_items = dmmed;
|
|
||||||
}
|
|
||||||
var dmlow = XmlMeta.ReadItemArray<DrawableModel>(node, "DrawableModelsLow");
|
|
||||||
if (dmlow != null)
|
|
||||||
{
|
|
||||||
DrawableModelsLow = new ResourcePointerList64<DrawableModel>();
|
|
||||||
DrawableModelsLow.data_items = dmlow;
|
|
||||||
}
|
|
||||||
var dmvlow = XmlMeta.ReadItemArray<DrawableModel>(node, "DrawableModelsVeryLow");
|
|
||||||
if (dmvlow != null)
|
|
||||||
{
|
|
||||||
DrawableModelsVeryLow = new ResourcePointerList64<DrawableModel>();
|
|
||||||
DrawableModelsVeryLow.data_items = dmvlow;
|
|
||||||
}
|
|
||||||
var dmx = XmlMeta.ReadItemArray<DrawableModel>(node, "DrawableModelsX");
|
|
||||||
if (dmx != null)
|
|
||||||
{
|
|
||||||
DrawableModelsX = new ResourcePointerList64<DrawableModel>();
|
|
||||||
DrawableModelsX.data_items = dmx;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DrawableModelsX = DrawableModelsHigh;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BuildRenderMasks();
|
BuildRenderMasks();
|
||||||
@ -4410,12 +4624,8 @@ namespace CodeWalker.GameFiles
|
|||||||
var list = new List<IResourceBlock>(base.GetReferences());
|
var list = new List<IResourceBlock>(base.GetReferences());
|
||||||
if (ShaderGroup != null) list.Add(ShaderGroup);
|
if (ShaderGroup != null) list.Add(ShaderGroup);
|
||||||
if (Skeleton != null) list.Add(Skeleton);
|
if (Skeleton != null) list.Add(Skeleton);
|
||||||
if (DrawableModelsHigh != null) list.Add(DrawableModelsHigh);
|
|
||||||
if (DrawableModelsMedium != null) list.Add(DrawableModelsMedium);
|
|
||||||
if (DrawableModelsLow != null) list.Add(DrawableModelsLow);
|
|
||||||
if (DrawableModelsVeryLow != null) list.Add(DrawableModelsVeryLow);
|
|
||||||
if (Joints != null) list.Add(Joints);
|
if (Joints != null) list.Add(Joints);
|
||||||
if (DrawableModelsX != null) list.Add(DrawableModelsX);
|
if (DrawableModels != null) list.Add(DrawableModels);
|
||||||
return list.ToArray();
|
return list.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4455,14 +4665,11 @@ namespace CodeWalker.GameFiles
|
|||||||
public void BuildAllModels()
|
public void BuildAllModels()
|
||||||
{
|
{
|
||||||
var allModels = new List<DrawableModel>();
|
var allModels = new List<DrawableModel>();
|
||||||
if (DrawableModelsHigh != null) allModels.AddRange(DrawableModelsHigh.data_items);
|
if (DrawableModels?.High != null) allModels.AddRange(DrawableModels.High);
|
||||||
if (DrawableModelsMedium != null) allModels.AddRange(DrawableModelsMedium.data_items);
|
if (DrawableModels?.Med != null) allModels.AddRange(DrawableModels.Med);
|
||||||
if (DrawableModelsLow != null) allModels.AddRange(DrawableModelsLow.data_items);
|
if (DrawableModels?.Low != null) allModels.AddRange(DrawableModels.Low);
|
||||||
if (DrawableModelsVeryLow != null) allModels.AddRange(DrawableModelsVeryLow.data_items);
|
if (DrawableModels?.VLow != null) allModels.AddRange(DrawableModels.VLow);
|
||||||
if ((DrawableModelsX != null) && (DrawableModelsX != DrawableModelsHigh))
|
if (DrawableModels?.Extra != null) allModels.AddRange(DrawableModels.Extra);
|
||||||
{
|
|
||||||
allModels.AddRange(DrawableModelsX.data_items);
|
|
||||||
}
|
|
||||||
AllModels = allModels.ToArray();
|
AllModels = allModels.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4495,10 +4702,10 @@ namespace CodeWalker.GameFiles
|
|||||||
|
|
||||||
public void BuildRenderMasks()
|
public void BuildRenderMasks()
|
||||||
{
|
{
|
||||||
var hmask = BuildRenderMask(DrawableModelsHigh?.data_items);
|
var hmask = BuildRenderMask(DrawableModels?.High);
|
||||||
var mmask = BuildRenderMask(DrawableModelsMedium?.data_items);
|
var mmask = BuildRenderMask(DrawableModels?.Med);
|
||||||
var lmask = BuildRenderMask(DrawableModelsLow?.data_items);
|
var lmask = BuildRenderMask(DrawableModels?.Low);
|
||||||
var vmask = BuildRenderMask(DrawableModelsVeryLow?.data_items);
|
var vmask = BuildRenderMask(DrawableModels?.VLow);
|
||||||
|
|
||||||
////just testing
|
////just testing
|
||||||
//if (hmask != RenderMaskHigh)
|
//if (hmask != RenderMaskHigh)
|
||||||
@ -4574,11 +4781,12 @@ namespace CodeWalker.GameFiles
|
|||||||
r.Unknown_9Ah = Unknown_9Ah;
|
r.Unknown_9Ah = Unknown_9Ah;
|
||||||
r.ShaderGroup = ShaderGroup;
|
r.ShaderGroup = ShaderGroup;
|
||||||
r.Skeleton = Skeleton?.Clone();
|
r.Skeleton = Skeleton?.Clone();
|
||||||
r.DrawableModelsHigh = DrawableModelsHigh;
|
r.DrawableModels = new DrawableModelsBlock();
|
||||||
r.DrawableModelsMedium = DrawableModelsMedium;
|
r.DrawableModels.High = DrawableModels?.High;
|
||||||
r.DrawableModelsLow = DrawableModelsLow;
|
r.DrawableModels.Med = DrawableModels?.Med;
|
||||||
r.DrawableModelsVeryLow = DrawableModelsVeryLow;
|
r.DrawableModels.Low = DrawableModels?.Low;
|
||||||
r.DrawableModelsX = DrawableModelsX;
|
r.DrawableModels.VLow = DrawableModels?.VLow;
|
||||||
|
r.DrawableModels.Extra = DrawableModels?.Extra;
|
||||||
r.Joints = Joints;
|
r.Joints = Joints;
|
||||||
r.AllModels = AllModels;
|
r.AllModels = AllModels;
|
||||||
r.VertexDecls = VertexDecls;
|
r.VertexDecls = VertexDecls;
|
||||||
|
@ -1722,7 +1722,13 @@ namespace CodeWalker.GameFiles
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[TypeConverter(typeof(ExpandableObjectConverter))] public struct ResourcePointerListHeader
|
||||||
|
{
|
||||||
|
public ulong Pointer { get; set; }
|
||||||
|
public ushort Count { get; set; }
|
||||||
|
public ushort Capacity { get; set; }
|
||||||
|
public uint Unknown { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -572,6 +572,16 @@ namespace CodeWalker.GameFiles
|
|||||||
if (pad > 0) Write(new byte[pad]);
|
if (pad > 0) Write(new byte[pad]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void WriteUlongs(ulong[] val)
|
||||||
|
{
|
||||||
|
if (val == null) return;
|
||||||
|
foreach (var v in val)
|
||||||
|
{
|
||||||
|
Write(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -167,34 +167,30 @@ namespace CodeWalker
|
|||||||
d.Unknown_9Ah = 33;//WTF is this???
|
d.Unknown_9Ah = 33;//WTF is this???
|
||||||
d.FileVFT = 1079446584;
|
d.FileVFT = 1079446584;
|
||||||
d.FileUnknown = 1;
|
d.FileUnknown = 1;
|
||||||
|
d.DrawableModels = new DrawableModelsBlock();
|
||||||
if (mlHigh.Count > 0)
|
if (mlHigh.Count > 0)
|
||||||
{
|
{
|
||||||
d.DrawableModelsHigh = new ResourcePointerList64<DrawableModel>();
|
d.DrawableModels.High = mlHigh.ToArray();
|
||||||
d.DrawableModelsHigh.data_items = mlHigh.ToArray();
|
|
||||||
d.FlagsHigh = 1;//what flags should be used??
|
d.FlagsHigh = 1;//what flags should be used??
|
||||||
}
|
}
|
||||||
if (mlMed.Count > 0)
|
if (mlMed.Count > 0)
|
||||||
{
|
{
|
||||||
d.DrawableModelsMedium = new ResourcePointerList64<DrawableModel>();
|
d.DrawableModels.Med = mlMed.ToArray();
|
||||||
d.DrawableModelsMedium.data_items = mlMed.ToArray();
|
|
||||||
d.LodDistHigh = bsRad * 2.0f; //when med models present, generate a high lod dist..
|
d.LodDistHigh = bsRad * 2.0f; //when med models present, generate a high lod dist..
|
||||||
d.FlagsMed = 1;
|
d.FlagsMed = 1;
|
||||||
}
|
}
|
||||||
if (mlLow.Count > 0)
|
if (mlLow.Count > 0)
|
||||||
{
|
{
|
||||||
d.DrawableModelsLow = new ResourcePointerList64<DrawableModel>();
|
d.DrawableModels.Low = mlLow.ToArray();
|
||||||
d.DrawableModelsLow.data_items = mlLow.ToArray();
|
|
||||||
d.LodDistMed = bsRad * 8.0f; //when low models present, generate a med lod dist..
|
d.LodDistMed = bsRad * 8.0f; //when low models present, generate a med lod dist..
|
||||||
d.FlagsLow = 1;
|
d.FlagsLow = 1;
|
||||||
}
|
}
|
||||||
if (mlVlow.Count > 0)
|
if (mlVlow.Count > 0)
|
||||||
{
|
{
|
||||||
d.DrawableModelsVeryLow = new ResourcePointerList64<DrawableModel>();
|
d.DrawableModels.VLow = mlVlow.ToArray();
|
||||||
d.DrawableModelsVeryLow.data_items = mlVlow.ToArray();
|
|
||||||
d.LodDistLow = bsRad * 32.0f; //when vlow models present, generate a low lod dist..
|
d.LodDistLow = bsRad * 32.0f; //when vlow models present, generate a low lod dist..
|
||||||
d.FlagsVlow = 1;
|
d.FlagsVlow = 1;
|
||||||
}
|
}
|
||||||
d.DrawableModelsX = d.DrawableModelsHigh;
|
|
||||||
|
|
||||||
d.BuildRenderMasks();
|
d.BuildRenderMasks();
|
||||||
|
|
||||||
|
@ -964,11 +964,11 @@ namespace CodeWalker.Forms
|
|||||||
TexturesTreeView.Nodes.Clear();
|
TexturesTreeView.Nodes.Clear();
|
||||||
if (drawable != null)
|
if (drawable != null)
|
||||||
{
|
{
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsHigh, "High Detail", true);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail", true);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsMedium, "Medium Detail", false);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail", false);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail", false);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail", false);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail", false);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail", false);
|
||||||
//AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false);
|
//AddDrawableModelsTreeNodes(drawable.DrawableModels?.Extra, "X Detail", false);
|
||||||
|
|
||||||
var fdrawable = drawable as FragDrawable;
|
var fdrawable = drawable as FragDrawable;
|
||||||
if (fdrawable != null)
|
if (fdrawable != null)
|
||||||
@ -984,10 +984,10 @@ namespace CodeWalker.Forms
|
|||||||
if (cdrwbl.Owner is FragDrawable) continue; //it's a copied drawable... eg a wheel
|
if (cdrwbl.Owner is FragDrawable) continue; //it's a copied drawable... eg a wheel
|
||||||
|
|
||||||
var dname = child.GroupName;
|
var dname = child.GroupName;
|
||||||
AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsHigh, dname + " - High Detail", true);
|
AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.High, dname + " - High Detail", true);
|
||||||
AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsMedium, dname + " - Medium Detail", false);
|
AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.Med, dname + " - Medium Detail", false);
|
||||||
AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsLow, dname + " - Low Detail", false);
|
AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.Low, dname + " - Low Detail", false);
|
||||||
AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsVeryLow, dname + " - Very Low Detail", false);
|
AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.VLow, dname + " - Very Low Detail", false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1070,23 +1070,22 @@ namespace CodeWalker.Forms
|
|||||||
dnode.Tag = drawable;
|
dnode.Tag = drawable;
|
||||||
dnode.Checked = check;
|
dnode.Checked = check;
|
||||||
|
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsHigh, "High Detail", true, dnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail", true, dnode);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsMedium, "Medium Detail", false, dnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail", false, dnode);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail", false, dnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail", false, dnode);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail", false, dnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail", false, dnode);
|
||||||
//AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false, dnode);
|
//AddDrawableModelsTreeNodes(drawable.DrawableModels?.Extra, "X Detail", false, dnode);
|
||||||
|
|
||||||
}
|
}
|
||||||
private void AddDrawableModelsTreeNodes(ResourcePointerList64<DrawableModel> models, string prefix, bool check, TreeNode parentDrawableNode = null)
|
private void AddDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check, TreeNode parentDrawableNode = null)
|
||||||
{
|
{
|
||||||
if (models == null) return;
|
if (models == null) return;
|
||||||
if (models.data_items == null) return;
|
|
||||||
|
|
||||||
for (int mi = 0; mi < models.data_items.Length; mi++)
|
for (int mi = 0; mi < models.Length; mi++)
|
||||||
{
|
{
|
||||||
var tnc = (parentDrawableNode != null) ? parentDrawableNode.Nodes : ModelsTreeView.Nodes;
|
var tnc = (parentDrawableNode != null) ? parentDrawableNode.Nodes : ModelsTreeView.Nodes;
|
||||||
|
|
||||||
var model = models.data_items[mi];
|
var model = models[mi];
|
||||||
string mprefix = prefix + " " + (mi + 1).ToString();
|
string mprefix = prefix + " " + (mi + 1).ToString();
|
||||||
var mnode = tnc.Add(mprefix + " " + model.ToString());
|
var mnode = tnc.Add(mprefix + " " + model.ToString());
|
||||||
mnode.Tag = model;
|
mnode.Tag = model;
|
||||||
|
@ -36,10 +36,10 @@ namespace CodeWalker.Forms
|
|||||||
ModelsTreeView.ShowRootLines = false;
|
ModelsTreeView.ShowRootLines = false;
|
||||||
if (drawable != null)
|
if (drawable != null)
|
||||||
{
|
{
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsHigh, "High Detail");
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail");
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsMedium, "Medium Detail");
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail");
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail");
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail");
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail");
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail");
|
||||||
|
|
||||||
var fdrawable = drawable as FragDrawable;
|
var fdrawable = drawable as FragDrawable;
|
||||||
if (fdrawable != null)
|
if (fdrawable != null)
|
||||||
@ -55,10 +55,10 @@ namespace CodeWalker.Forms
|
|||||||
if (cdrwbl.Owner is FragDrawable) continue; //it's a copied drawable... eg a wheel
|
if (cdrwbl.Owner is FragDrawable) continue; //it's a copied drawable... eg a wheel
|
||||||
|
|
||||||
var dname = child.GroupName;
|
var dname = child.GroupName;
|
||||||
AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsHigh, dname + " - High Detail");
|
AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.High, dname + " - High Detail");
|
||||||
AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsMedium, dname + " - Medium Detail");
|
AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.Med, dname + " - Medium Detail");
|
||||||
AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsLow, dname + " - Low Detail");
|
AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.Low, dname + " - Low Detail");
|
||||||
AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsVeryLow, dname + " - Very Low Detail");
|
AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.VLow, dname + " - Very Low Detail");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -82,26 +82,25 @@ namespace CodeWalker.Forms
|
|||||||
var dnode = ModelsTreeView.Nodes.Add(mhash.ToString());
|
var dnode = ModelsTreeView.Nodes.Add(mhash.ToString());
|
||||||
dnode.Tag = drawable;
|
dnode.Tag = drawable;
|
||||||
|
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsHigh, "High Detail", dnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail", dnode);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsMedium, "Medium Detail", dnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail", dnode);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail", dnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail", dnode);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail", dnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail", dnode);
|
||||||
|
|
||||||
dnode.Expand();
|
dnode.Expand();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddDrawableModelsTreeNodes(ResourcePointerList64<DrawableModel> models, string prefix, TreeNode parentDrawableNode = null)
|
private void AddDrawableModelsTreeNodes(DrawableModel[] models, string prefix, TreeNode parentDrawableNode = null)
|
||||||
{
|
{
|
||||||
if (models == null) return;
|
if (models == null) return;
|
||||||
if (models.data_items == null) return;
|
|
||||||
|
|
||||||
for (int mi = 0; mi < models.data_items.Length; mi++)
|
for (int mi = 0; mi < models.Length; mi++)
|
||||||
{
|
{
|
||||||
var tnc = (parentDrawableNode != null) ? parentDrawableNode.Nodes : ModelsTreeView.Nodes;
|
var tnc = (parentDrawableNode != null) ? parentDrawableNode.Nodes : ModelsTreeView.Nodes;
|
||||||
|
|
||||||
var model = models.data_items[mi];
|
var model = models[mi];
|
||||||
string mprefix = prefix + " " + (mi + 1).ToString();
|
string mprefix = prefix + " " + (mi + 1).ToString();
|
||||||
var mnode = tnc.Add(mprefix + " " + model.ToString());
|
var mnode = tnc.Add(mprefix + " " + model.ToString());
|
||||||
mnode.Tag = model;
|
mnode.Tag = model;
|
||||||
|
@ -515,11 +515,11 @@ namespace CodeWalker
|
|||||||
dnode.Tag = drawable;
|
dnode.Tag = drawable;
|
||||||
dnode.Checked = check;
|
dnode.Checked = check;
|
||||||
|
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsHigh?.data_items, "High Detail", true, dnode, tnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail", true, dnode, tnode);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsMedium?.data_items, "Medium Detail", false, dnode, tnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail", false, dnode, tnode);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsLow?.data_items, "Low Detail", false, dnode, tnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail", false, dnode, tnode);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow?.data_items, "Very Low Detail", false, dnode, tnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail", false, dnode, tnode);
|
||||||
//AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false, dnode, tnode);
|
//AddDrawableModelsTreeNodes(drawable.DrawableModels?.Extra, "X Detail", false, dnode, tnode);
|
||||||
|
|
||||||
}
|
}
|
||||||
private void AddDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check, TreeNode parentDrawableNode = null, TreeNode parentTextureNode = null)
|
private void AddDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check, TreeNode parentDrawableNode = null, TreeNode parentTextureNode = null)
|
||||||
|
@ -101,10 +101,10 @@ namespace CodeWalker.Rendering
|
|||||||
|
|
||||||
DataSize = 0;
|
DataSize = 0;
|
||||||
|
|
||||||
var hd = Key.DrawableModelsHigh?.data_items ?? Key.AllModels;
|
var hd = Key.DrawableModels?.High ?? Key.AllModels;
|
||||||
var med = Key.DrawableModelsMedium?.data_items;
|
var med = Key.DrawableModels?.Med;
|
||||||
var low = Key.DrawableModelsLow?.data_items;
|
var low = Key.DrawableModels?.Low;
|
||||||
var vlow = Key.DrawableModelsVeryLow?.data_items;
|
var vlow = Key.DrawableModels?.VLow;
|
||||||
int totmodels = (hd?.Length ?? 0) + (med?.Length ?? 0) + (low?.Length ?? 0) + (vlow?.Length ?? 0);
|
int totmodels = (hd?.Length ?? 0) + (med?.Length ?? 0) + (low?.Length ?? 0) + (vlow?.Length ?? 0);
|
||||||
int curmodel = hd?.Length ?? 0;
|
int curmodel = hd?.Length ?? 0;
|
||||||
AllModels = new RenderableModel[totmodels];
|
AllModels = new RenderableModel[totmodels];
|
||||||
|
@ -461,23 +461,22 @@ namespace CodeWalker
|
|||||||
dnode.Tag = drawable;
|
dnode.Tag = drawable;
|
||||||
dnode.Checked = check;
|
dnode.Checked = check;
|
||||||
|
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsHigh, "High Detail", true, dnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail", true, dnode);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsMedium, "Medium Detail", false, dnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail", false, dnode);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail", false, dnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail", false, dnode);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail", false, dnode);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail", false, dnode);
|
||||||
//AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false, dnode);
|
//AddDrawableModelsTreeNodes(drawable.DrawableModels?.Extra, "X Detail", false, dnode);
|
||||||
|
|
||||||
}
|
}
|
||||||
private void AddDrawableModelsTreeNodes(ResourcePointerList64<DrawableModel> models, string prefix, bool check, TreeNode parentDrawableNode = null)
|
private void AddDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check, TreeNode parentDrawableNode = null)
|
||||||
{
|
{
|
||||||
if (models == null) return;
|
if (models == null) return;
|
||||||
if (models.data_items == null) return;
|
|
||||||
|
|
||||||
for (int mi = 0; mi < models.data_items.Length; mi++)
|
for (int mi = 0; mi < models.Length; mi++)
|
||||||
{
|
{
|
||||||
var tnc = (parentDrawableNode != null) ? parentDrawableNode.Nodes : ModelsTreeView.Nodes;
|
var tnc = (parentDrawableNode != null) ? parentDrawableNode.Nodes : ModelsTreeView.Nodes;
|
||||||
|
|
||||||
var model = models.data_items[mi];
|
var model = models[mi];
|
||||||
string mprefix = prefix + " " + (mi + 1).ToString();
|
string mprefix = prefix + " " + (mi + 1).ToString();
|
||||||
var mnode = tnc.Add(mprefix + " " + model.ToString());
|
var mnode = tnc.Add(mprefix + " " + model.ToString());
|
||||||
mnode.Tag = model;
|
mnode.Tag = model;
|
||||||
@ -632,11 +631,11 @@ namespace CodeWalker
|
|||||||
TexturesTreeView.Nodes.Clear();
|
TexturesTreeView.Nodes.Clear();
|
||||||
if (drawable != null)
|
if (drawable != null)
|
||||||
{
|
{
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsHigh, "High Detail", true);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.High, "High Detail", true);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsMedium, "Medium Detail", false);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.Med, "Medium Detail", false);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsLow, "Low Detail", false);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.Low, "Low Detail", false);
|
||||||
AddDrawableModelsTreeNodes(drawable.DrawableModelsVeryLow, "Very Low Detail", false);
|
AddDrawableModelsTreeNodes(drawable.DrawableModels?.VLow, "Very Low Detail", false);
|
||||||
//AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false);
|
//AddDrawableModelsTreeNodes(drawable.DrawableModels?.Extra, "X Detail", false);
|
||||||
|
|
||||||
|
|
||||||
var fdrawable = drawable as FragDrawable;
|
var fdrawable = drawable as FragDrawable;
|
||||||
@ -653,10 +652,10 @@ namespace CodeWalker
|
|||||||
if (cdrwbl.Owner is FragDrawable) continue; //it's a copied drawable... eg a wheel
|
if (cdrwbl.Owner is FragDrawable) continue; //it's a copied drawable... eg a wheel
|
||||||
|
|
||||||
var dname = child.GroupName;
|
var dname = child.GroupName;
|
||||||
AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsHigh, dname + " - High Detail", true);
|
AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.High, dname + " - High Detail", true);
|
||||||
AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsMedium, dname + " - Medium Detail", false);
|
AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.Med, dname + " - Medium Detail", false);
|
||||||
AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsLow, dname + " - Low Detail", false);
|
AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.Low, dname + " - Low Detail", false);
|
||||||
AddDrawableModelsTreeNodes(cdrwbl.DrawableModelsVeryLow, dname + " - Very Low Detail", false);
|
AddDrawableModelsTreeNodes(cdrwbl.DrawableModels?.VLow, dname + " - Very Low Detail", false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,11 +75,11 @@ namespace CodeWalker.World
|
|||||||
HierarchyTreeView.Nodes.Clear();
|
HierarchyTreeView.Nodes.Clear();
|
||||||
if (item.Drawable != null)
|
if (item.Drawable != null)
|
||||||
{
|
{
|
||||||
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsHigh, "High Detail", true);
|
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.High, "High Detail", true);
|
||||||
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsMedium, "Medium Detail", false);
|
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.Med, "Medium Detail", false);
|
||||||
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsLow, "Low Detail", false);
|
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.Low, "Low Detail", false);
|
||||||
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsVeryLow, "Very Low Detail", false);
|
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.VLow, "Very Low Detail", false);
|
||||||
//AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false);
|
//AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.Extra, "X Detail", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.EntityDef != null)
|
if (item.EntityDef != null)
|
||||||
@ -201,14 +201,13 @@ namespace CodeWalker.World
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
private void AddSelectionDrawableModelsTreeNodes(ResourcePointerList64<DrawableModel> models, string prefix, bool check)
|
private void AddSelectionDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check)
|
||||||
{
|
{
|
||||||
if (models == null) return;
|
if (models == null) return;
|
||||||
if (models.data_items == null) return;
|
|
||||||
|
|
||||||
for (int mi = 0; mi < models.data_items.Length; mi++)
|
for (int mi = 0; mi < models.Length; mi++)
|
||||||
{
|
{
|
||||||
var model = models.data_items[mi];
|
var model = models[mi];
|
||||||
string mprefix = prefix + " " + (mi + 1).ToString();
|
string mprefix = prefix + " " + (mi + 1).ToString();
|
||||||
var mnode = SelDrawableModelsTreeView.Nodes.Add(mprefix + " " + model.ToString());
|
var mnode = SelDrawableModelsTreeView.Nodes.Add(mprefix + " " + model.ToString());
|
||||||
mnode.Tag = model;
|
mnode.Tag = model;
|
||||||
|
@ -2401,14 +2401,14 @@ namespace CodeWalker
|
|||||||
|
|
||||||
|
|
||||||
bool usegeomboxes = SelectByGeometry;
|
bool usegeomboxes = SelectByGeometry;
|
||||||
var dmodels = drawable.DrawableModelsHigh;
|
var dmodels = drawable.DrawableModels?.High;
|
||||||
if((dmodels==null)||(dmodels.data_items==null))
|
if (dmodels == null)
|
||||||
{ usegeomboxes = false; }
|
{ usegeomboxes = false; }
|
||||||
if (usegeomboxes)
|
if (usegeomboxes)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < dmodels.data_items.Length; i++)
|
for (int i = 0; i < dmodels.Length; i++)
|
||||||
{
|
{
|
||||||
var m = dmodels.data_items[i];
|
var m = dmodels[i];
|
||||||
if (m.BoundsData == null)
|
if (m.BoundsData == null)
|
||||||
{ usegeomboxes = false; break; }
|
{ usegeomboxes = false; break; }
|
||||||
}
|
}
|
||||||
@ -2428,9 +2428,9 @@ namespace CodeWalker
|
|||||||
{
|
{
|
||||||
//geometry bounding boxes version
|
//geometry bounding boxes version
|
||||||
float ghitdist = float.MaxValue;
|
float ghitdist = float.MaxValue;
|
||||||
for (int i = 0; i < dmodels.data_items.Length; i++)
|
for (int i = 0; i < dmodels.Length; i++)
|
||||||
{
|
{
|
||||||
var m = dmodels.data_items[i];
|
var m = dmodels[i];
|
||||||
int gbbcount = m.BoundsData.Length;
|
int gbbcount = m.BoundsData.Length;
|
||||||
for (int j = 0; j < gbbcount; j++) //first box seems to be whole model
|
for (int j = 0; j < gbbcount; j++) //first box seems to be whole model
|
||||||
{
|
{
|
||||||
@ -3538,11 +3538,11 @@ namespace CodeWalker
|
|||||||
SelDrawableTexturesTreeView.Nodes.Clear();
|
SelDrawableTexturesTreeView.Nodes.Clear();
|
||||||
if (item.Drawable != null)
|
if (item.Drawable != null)
|
||||||
{
|
{
|
||||||
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsHigh, "High Detail", true);
|
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.High, "High Detail", true);
|
||||||
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsMedium, "Medium Detail", false);
|
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.Med, "Medium Detail", false);
|
||||||
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsLow, "Low Detail", false);
|
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.Low, "Low Detail", false);
|
||||||
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsVeryLow, "Very Low Detail", false);
|
AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.VLow, "Very Low Detail", false);
|
||||||
//AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModelsX, "X Detail", false);
|
//AddSelectionDrawableModelsTreeNodes(item.Drawable.DrawableModels?.Extra, "X Detail", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3765,14 +3765,13 @@ namespace CodeWalker
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private void AddSelectionDrawableModelsTreeNodes(ResourcePointerList64<DrawableModel> models, string prefix, bool check)
|
private void AddSelectionDrawableModelsTreeNodes(DrawableModel[] models, string prefix, bool check)
|
||||||
{
|
{
|
||||||
if (models == null) return;
|
if (models == null) return;
|
||||||
if (models.data_items == null) return;
|
|
||||||
|
|
||||||
for (int mi = 0; mi < models.data_items.Length; mi++)
|
for (int mi = 0; mi < models.Length; mi++)
|
||||||
{
|
{
|
||||||
var model = models.data_items[mi];
|
var model = models[mi];
|
||||||
string mprefix = prefix + " " + (mi + 1).ToString();
|
string mprefix = prefix + " " + (mi + 1).ToString();
|
||||||
var mnode = SelDrawableModelsTreeView.Nodes.Add(mprefix + " " + model.ToString());
|
var mnode = SelDrawableModelsTreeView.Nodes.Add(mprefix + " " + model.ToString());
|
||||||
mnode.Tag = model;
|
mnode.Tag = model;
|
||||||
|
Loading…
Reference in New Issue
Block a user