Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
        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);
        }