コード例 #1
0
            public void Read(FileReader reader)
            {
                Position = reader.Position;

                Visible = reader.ReadUInt32() == 1;
                if (!Visible)
                {
                    return;
                }
                reader.ReadBytes(28);
                Scale       = reader.ReadVec3();
                Rotation    = reader.ReadVec3();
                Translation = reader.ReadVec3();
                Unknowns    = reader.ReadBytes(20);
                ulong SubMeshArrayOffsetPtr = reader.ReadUInt64();
                ulong unkoff             = reader.ReadUInt64();
                ulong ChildNodeOffsetPtr = reader.ReadUInt64();

                reader.ReadUInt32();

                Matrix4 TranslateMat = Matrix4.CreateTranslation(Translation);
                Matrix4 RotXMat      = Matrix4.CreateRotationX(Rotation.X);
                Matrix4 RotYMat      = Matrix4.CreateRotationY(Rotation.Y);
                Matrix4 RotZMat      = Matrix4.CreateRotationZ(Rotation.Z);
                Matrix4 ScaleMat     = Matrix4.CreateTranslation(Scale);

                Transform = ScaleMat * (RotXMat * RotYMat * RotZMat) * TranslateMat;

                if (SubMeshArrayOffsetPtr != 0)
                {
                    int i = 0;
                    while (true)
                    {
                        reader.SeekBegin((int)SubMeshArrayOffsetPtr + i * 8);

                        ulong SubMeshArrayOffset1 = reader.ReadUInt64();
                        if (SubMeshArrayOffset1 == 0)
                        {
                            break;
                        }

                        if (SubMeshArrayOffset1 != 0)
                        {
                            reader.SeekBegin(SubMeshArrayOffset1);
                            SubMesh subMesh = new SubMesh(this);
                            subMesh.Read(reader);
                            SubMeshes.Add(subMesh);
                        }

                        i++;
                    }
                }

                if (ChildNodeOffsetPtr != 0)
                {
                    //2 possible children
                    for (int i = 0; i < 2; i++)
                    {
                        reader.SeekBegin((int)ChildNodeOffsetPtr + i * 8);

                        ulong ChildNodeOffset1 = reader.ReadUInt64();
                        if (ChildNodeOffset1 != 0)
                        {
                            reader.SeekBegin(ChildNodeOffset1);
                            Node ChildNode = new Node();
                            ChildNode.Read(reader);
                            Children.Add(ChildNode);
                        }
                    }
                }

                //After repeats a fairly similar structure, with SRT values
                //Unsure what it's used for?
            }
コード例 #2
0
            public void Read(FileReader reader)
            {
                Position = reader.Position;

                Visible     = reader.ReadUInt32() == 1;
                Scale       = reader.ReadVec3();
                Rotation    = reader.ReadVec3();
                Translation = reader.ReadVec3();
                Unknowns    = reader.ReadBytes(16);
                uint SubMeshArrayOffsetPtr = reader.ReadUInt32();
                uint ChildNodeOffsetPtr    = reader.ReadUInt32();

                Matrix4 TranslateMat = Matrix4.CreateTranslation(Translation);
                Matrix4 RotXMat      = Matrix4.CreateRotationX(Rotation.X);
                Matrix4 RotYMat      = Matrix4.CreateRotationY(Rotation.Y);
                Matrix4 RotZMat      = Matrix4.CreateRotationZ(Rotation.Z);
                Matrix4 ScaleMat     = Matrix4.CreateTranslation(Scale);

                Transform = ScaleMat * (RotXMat * RotYMat * RotZMat) * TranslateMat;

                if (SubMeshArrayOffsetPtr != 0)
                {
                    //4 possible sub meshes
                    reader.SeekBegin(SubMeshArrayOffsetPtr);
                    uint SubMeshArrayOffset1 = reader.ReadUInt32();
                    uint SubMeshArrayOffset2 = reader.ReadUInt32();
                    uint SubMeshArrayOffset3 = reader.ReadUInt32();
                    uint SubMeshArrayOffset4 = reader.ReadUInt32();
                    if (SubMeshArrayOffset1 != 0)
                    {
                        reader.SeekBegin(SubMeshArrayOffset1);
                        SubMesh subMesh = new SubMesh(this);
                        subMesh.Read(reader);
                        SubMeshes.Add(subMesh);
                    }
                    if (SubMeshArrayOffset2 != 0)
                    {
                        reader.SeekBegin(SubMeshArrayOffset2);
                        SubMesh subMesh = new SubMesh(this);
                        subMesh.Read(reader);
                        SubMeshes.Add(subMesh);
                    }
                    if (SubMeshArrayOffset3 != 0)
                    {
                        reader.SeekBegin(SubMeshArrayOffset3);
                        SubMesh subMesh = new SubMesh(this);
                        subMesh.Read(reader);
                        SubMeshes.Add(subMesh);
                    }
                    if (SubMeshArrayOffset4 != 0)
                    {
                        reader.SeekBegin(SubMeshArrayOffset4);
                        SubMesh subMesh = new SubMesh(this);
                        subMesh.Read(reader);
                        SubMeshes.Add(subMesh);
                    }
                }

                if (ChildNodeOffsetPtr != 0)
                {
                    //4 possible children
                    reader.SeekBegin(ChildNodeOffsetPtr);
                    uint ChildNodeOffset1 = reader.ReadUInt32();
                    uint ChildNodeOffset2 = reader.ReadUInt32();
                    uint ChildNodeOffset3 = reader.ReadUInt32();
                    uint ChildNodeOffset4 = reader.ReadUInt32();
                    if (ChildNodeOffset1 != 0)
                    {
                        reader.SeekBegin(ChildNodeOffset1);
                        Node ChildNode = new Node();
                        ChildNode.Read(reader);
                        Children.Add(ChildNode);
                    }
                    if (ChildNodeOffset2 != 0)
                    {
                        reader.SeekBegin(ChildNodeOffset2);
                        Node ChildNode = new Node();
                        ChildNode.Read(reader);
                        Children.Add(ChildNode);
                    }
                    if (ChildNodeOffset3 != 0)
                    {
                        reader.SeekBegin(ChildNodeOffset3);
                        Node ChildNode = new Node();
                        ChildNode.Read(reader);
                        Children.Add(ChildNode);
                    }
                    if (ChildNodeOffset4 != 0)
                    {
                        reader.SeekBegin(ChildNodeOffset4);
                        Node ChildNode = new Node();
                        ChildNode.Read(reader);
                        Children.Add(ChildNode);
                    }
                }

                //After repeats a fairly similar structure, with SRT values
                //Unsure what it's used for?
            }