Rebuild cmb vertex buffers when saving

This commit is contained in:
KillzXGaming 2020-02-08 15:24:54 -05:00
parent 217771ce83
commit f86519c81c
3 changed files with 34 additions and 19 deletions

View file

@ -217,7 +217,7 @@ namespace FirstPlugin
int texIndex = 0; int texIndex = 0;
foreach (var tex in header.SectionData.TextureChunk.Textures) foreach (var tex in header.SectionData.TextureChunk.Textures)
{ {
var texWrapper = new CTXB.TextureWrapper(); var texWrapper = new CTXB.TextureWrapper(tex);
texWrapper.Text = $"Texture {texIndex++}"; texWrapper.Text = $"Texture {texIndex++}";
texWrapper.ImageKey = "texture"; texWrapper.ImageKey = "texture";
texWrapper.SelectedImageKey = texWrapper.ImageKey; texWrapper.SelectedImageKey = texWrapper.ImageKey;
@ -794,13 +794,14 @@ namespace FirstPlugin
values[3] * VertexAttribute.Scale); values[3] * VertexAttribute.Scale);
} }
private static void WriteVertexBufferData(FileWriter writer, BufferSlice Slice, private static void WriteVertexBufferData(FileWriter writer, long startPos, BufferSlice Slice,
SepdVertexAttribute VertexAttribute, int elementCount) SepdVertexAttribute VertexAttribute, int elementCount)
{ {
int StrideSize = CalculateStrideSize(VertexAttribute.Type, elementCount); if (Slice == null || VertexAttribute == null)
int VertexCount = (int)Slice.Size / StrideSize; return;
for (int v = 0; v < VertexCount; v++)
{ writer.SeekBegin(startPos + VertexAttribute.StartPosition + Slice.Offset);
for (int v = 0; v < VertexAttribute.VertexData?.Length; v++) {
WriteVertexBufferData(writer, VertexAttribute, VertexAttribute.VertexData[v], elementCount); WriteVertexBufferData(writer, VertexAttribute, VertexAttribute.VertexData[v], elementCount);
} }
} }
@ -903,34 +904,54 @@ namespace FirstPlugin
QuadTreeChunk.Write(writer, header); QuadTreeChunk.Write(writer, header);
} }
_offsetPos += 4;
if (MaterialChunk != null) if (MaterialChunk != null)
{ {
writer.WriteUint32Offset(pos + (_offsetPos += 4)); writer.WriteUint32Offset(pos + (_offsetPos));
MaterialChunk.Write(writer, header); MaterialChunk.Write(writer, header);
} }
_offsetPos += 4;
if (TextureChunk != null) if (TextureChunk != null)
{ {
writer.WriteUint32Offset(pos + (_offsetPos += 4)); writer.WriteUint32Offset(pos + (_offsetPos));
TextureChunk.Write(writer, header); TextureChunk.Write(writer, header);
} }
_offsetPos += 4;
if (SkeletalMeshChunk != null) if (SkeletalMeshChunk != null)
{ {
writer.WriteUint32Offset(pos + (_offsetPos += 4)); writer.WriteUint32Offset(pos + (_offsetPos));
SkeletalMeshChunk.Write(writer, header); SkeletalMeshChunk.Write(writer, header);
} }
_offsetPos += 4;
if (LUTSChunk != null) if (LUTSChunk != null)
{ {
writer.WriteUint32Offset(pos + (_offsetPos += 4)); writer.WriteUint32Offset(pos + (_offsetPos));
LUTSChunk.Write(writer, header); LUTSChunk.Write(writer, header);
} }
_offsetPos += 4;
if (VertexAttributesChunk != null) if (VertexAttributesChunk != null)
{ {
writer.WriteUint32Offset(pos + (_offsetPos += 4)); writer.WriteUint32Offset(pos + (_offsetPos));
long vatrPos = writer.Position;
VertexAttributesChunk.Write(writer, header); VertexAttributesChunk.Write(writer, header);
foreach (var shape in SkeletalMeshChunk.ShapeChunk.SeperateShapes)
{
WriteVertexBufferData(writer, vatrPos, VertexAttributesChunk.PositionSlice, shape.Position, 3);
WriteVertexBufferData(writer, vatrPos, VertexAttributesChunk.NormalSlice, shape.Normal, 3);
WriteVertexBufferData(writer, vatrPos, VertexAttributesChunk.TangentSlice, shape.Tangent, 3);
WriteVertexBufferData(writer, vatrPos, VertexAttributesChunk.ColorSlice, shape.Color, 4);
WriteVertexBufferData(writer, vatrPos, VertexAttributesChunk.Texcoord0Slice, shape.TexCoord0, 2);
WriteVertexBufferData(writer, vatrPos, VertexAttributesChunk.Texcoord1Slice, shape.TexCoord1, 2);
WriteVertexBufferData(writer, vatrPos, VertexAttributesChunk.Texcoord2Slice, shape.TexCoord2, 2);
WriteVertexBufferData(writer, vatrPos, VertexAttributesChunk.BoneIndicesSlice, shape.BoneIndices, shape.boneDimension);
WriteVertexBufferData(writer, vatrPos, VertexAttributesChunk.BoneWeightsSlice, shape.BoneWeights, shape.boneDimension);
}
writer.WriteSectionSizeU32(vatrPos + 4, vatrPos, writer.Position);
} }
if (SkeletalMeshChunk != null && SkeletalMeshChunk.ShapeChunk.SeperateShapes.Count > 0) if (SkeletalMeshChunk != null && SkeletalMeshChunk.ShapeChunk.SeperateShapes.Count > 0)
@ -1469,8 +1490,6 @@ namespace FirstPlugin
public uint MaxIndex; public uint MaxIndex;
private byte[] data;
public void Read(FileReader reader, Header header) public void Read(FileReader reader, Header header)
{ {
StartPosition = reader.Position; StartPosition = reader.Position;
@ -1490,8 +1509,6 @@ namespace FirstPlugin
Texcoord2Slice = ReadSlice(reader); Texcoord2Slice = ReadSlice(reader);
BoneIndicesSlice = ReadSlice(reader); BoneIndicesSlice = ReadSlice(reader);
BoneWeightsSlice = ReadSlice(reader); BoneWeightsSlice = ReadSlice(reader);
data = reader.ReadBytes((int)(sectionSize - 76));
} }
public void Write(FileWriter writer, Header header) public void Write(FileWriter writer, Header header)
@ -1513,8 +1530,6 @@ namespace FirstPlugin
WriteSlice(writer, BoneIndicesSlice); WriteSlice(writer, BoneIndicesSlice);
WriteSlice(writer, BoneWeightsSlice); WriteSlice(writer, BoneWeightsSlice);
writer.Write(data);
long endPos = writer.Position; long endPos = writer.Position;
using (writer.TemporarySeek(pos + 4, System.IO.SeekOrigin.Begin)) { using (writer.TemporarySeek(pos + 4, System.IO.SeekOrigin.Begin)) {
writer.Write((uint)(endPos - pos)); writer.Write((uint)(endPos - pos));

View file

@ -404,6 +404,8 @@ namespace FirstPlugin
{ {
settings.LoadBitMap(FileName); settings.LoadBitMap(FileName);
settings.Format = CTR_3DS.ConvertToPICAFormat(Format); settings.Format = CTR_3DS.ConvertToPICAFormat(Format);
if (MipCount == 1)
settings.MipCount = 1;
importer.LoadSettings(new List<CTR_3DSImporterSettings>() { settings, }); importer.LoadSettings(new List<CTR_3DSImporterSettings>() { settings, });
if (importer.ShowDialog() == DialogResult.OK) if (importer.ShowDialog() == DialogResult.OK)

View file

@ -214,8 +214,6 @@ namespace Toolbox.Library.Forms
mipmaps.Add(CTR_3DS.EncodeBlock(DecompressedData[SurfaceLevel], mipmaps.Add(CTR_3DS.EncodeBlock(DecompressedData[SurfaceLevel],
(int)TexWidth, (int)TexHeight, Format)); (int)TexWidth, (int)TexHeight, Format));
//while (Image.Width / 2 > 0 && Image.Height / 2 > 0)
// for (int mipLevel = 0; mipLevel < MipCount; mipLevel++)
for (int mipLevel = 0; mipLevel < MipCount; mipLevel++) for (int mipLevel = 0; mipLevel < MipCount; mipLevel++)
{ {
int width = Image.Width / 2; int width = Image.Width / 2;