private Mesh ParsePackets(FileReader reader, DrawElement element) { Mesh mesh = new Mesh(); mesh.DrawElement = element; mesh.Shape = Shapes[element.ShapeIndex]; mesh.Packets = ParsePackets(mesh, 0, reader, element).ToArray(); //mesh.Packets = ParsePackets(mesh, (ShapePackets.Length / 2), reader, element).ToArray(); return(mesh); }
public ushort ReplaceMaterial(string text, DrawElement drawElement) { var convertedMat = Newtonsoft.Json.JsonConvert.DeserializeObject <MaterialConvert>(text); var currentMaterial = Header.Materials[drawElement.MaterialIndex]; currentMaterial.Color = new STColor8( convertedMat.DiffuseR, convertedMat.DiffuseG, convertedMat.DiffuseB, convertedMat.DiffuseA); currentMaterial.AlphaFlags = convertedMat.AlphaFlags; currentMaterial.Unknown1 = convertedMat.Unknown1; currentMaterial.Unknown3 = convertedMat.Unknown2; List <Sampler> samplers = Header.Samplers.ToList(); if (convertedMat.TevStages != null) { currentMaterial.NumTevStages = (byte)convertedMat.TevStages.Length; for (int i = 0; i < currentMaterial.NumTevStages; i++) { if (currentMaterial.TevStages.Length <= i) { break; } var stage = convertedMat.TevStages[i]; var currentStage = currentMaterial.TevStages[i]; currentStage.Unknown = stage.Unknown; currentStage.Unknowns2 = stage.Values; } } var meshSettings = convertedMat.MeshSettings; Header.Samplers = samplers.ToArray(); Header.Materials[drawElement.MaterialIndex] = currentMaterial; Header.Shapes[drawElement.ShapeIndex].NormalFlags = meshSettings.NormalsFlags; Header.Shapes[drawElement.ShapeIndex].Unknown1 = meshSettings.Unknown1; Header.Shapes[drawElement.ShapeIndex].Unknown2 = meshSettings.Unknown2; Header.Shapes[drawElement.ShapeIndex].Unknown3 = meshSettings.Unknown3; return(meshSettings.NodeIndex); }
public string ExportMaterial(DrawElement drawElement) { ushort nodeIdex = 0; foreach (var node in Header.Nodes) { for (int i = 0; i < node.ShapeCount; i++) { if (node.ShapeIndex + i == drawElement.ShapeIndex) { nodeIdex = node.NodeIndex; } } } var shape = Header.Shapes[drawElement.ShapeIndex]; var material = Header.Materials[drawElement.MaterialIndex]; var convertedMat = new MaterialConvert(); convertedMat.AlphaFlags = material.AlphaFlags; convertedMat.DiffuseR = material.Color.R; convertedMat.DiffuseG = material.Color.G; convertedMat.DiffuseB = material.Color.B; convertedMat.DiffuseA = material.Color.A; convertedMat.Unknown1 = material.Unknown1; convertedMat.Unknown2 = material.Unknown3; convertedMat.MeshSettings = new ShapeFlags() { NormalsFlags = shape.NormalFlags, Unknown1 = shape.Unknown1, Unknown2 = shape.Unknown2, Unknown3 = shape.Unknown3, NodeIndex = nodeIdex, }; TevStageConvert[] stages = new TevStageConvert[material.NumTevStages]; convertedMat.TevStages = stages; for (int i = 0; i < material.NumTevStages; i++) { stages[i] = new TevStageConvert(); stages[i].SamplerIndex = material.TevStages[i].SamplerIndex; stages[i].Unknown = material.TevStages[i].Unknown; stages[i].Values = material.TevStages[i].Unknowns2; } return(Newtonsoft.Json.JsonConvert.SerializeObject(convertedMat, Newtonsoft.Json.Formatting.Indented)); }
private List <ShapePacket> ParsePackets(Mesh mesh, int startLODIndex, FileReader reader, DrawElement element) { List <ShapePacket> drawpackets = new List <ShapePacket>(); ushort[] matrixIndices = new ushort[10]; int startIndex = startLODIndex + mesh.Shape.PacketBeginIndex; for (int i = startIndex; i < startIndex + mesh.Shape.PacketCount; i++) { var packet = ShapePackets[i]; drawpackets.Add(packet); bool isLOD = startLODIndex > 0; for (int m = 0; m < packet.MatrixIndicesCount; m++) { if (packet.MatrixIndices[m] == ushort.MaxValue) { continue; } matrixIndices[m] = packet.MatrixIndices[m]; } reader.SeekBegin(packet.DataOffset); while (reader.BaseStream.Position < packet.DataOffset + packet.DataSize) { byte opcode = reader.ReadByte(); if (opcode == 0) { continue; } ShapePacket.DrawList drawPacket = new ShapePacket.DrawList(); drawPacket.OpCode = opcode; packet.DrawLists.Add(drawPacket); ushort numVertices = reader.ReadUInt16(); drawPacket.Vertices = new List <ShapePacket.VertexGroup>(); for (int v = 0; v < numVertices; v++) { var drawList = new ShapePacket.VertexGroup(); if (!isLOD) { drawList.MatrixIndex = reader.ReadSByte(); if (drawList.MatrixIndex != -1) { drawList.MatrixDataIndex = matrixIndices[(drawList.MatrixIndex / 3)]; } drawList.Tex0MatrixIndex = reader.ReadSByte(); drawList.Tex1MatrixIndex = reader.ReadSByte(); drawList.PositionIndex = reader.ReadInt16(); if (FileHeader.NormalCount > 0) { drawList.NormalIndex = reader.ReadInt16(); } if (mesh.Shape.NormalFlags > 1) //NBT { drawList.TangentIndex = reader.ReadInt16(); drawList.BinormalIndex = reader.ReadInt16(); } if (FileHeader.ColorCount > 0) { drawList.ColorIndex = reader.ReadInt16(); } if (FileHeader.TexcoordCount > 0) { drawList.TexCoordIndex = reader.ReadInt16(); } } else { drawList.MatrixIndex = reader.ReadSByte(); if (drawList.MatrixIndex != -1) { drawList.MatrixDataIndex = matrixIndices[(drawList.MatrixIndex / 3)]; } drawList.PositionIndex = reader.ReadInt16(); if (FileHeader.NormalCount > 0) { drawList.NormalIndex = reader.ReadByte(); } } drawPacket.Vertices.Add(drawList); } } } return(drawpackets); }