Beispiel #1
0
        public IGeometricObjectElement Clone(GeometricObject mesh)
        {
            DeformSet d = (DeformSet)MemberwiseClone();

            d.Reset();
            d.mesh    = mesh;
            d.r3bones = new DeformBone[r3bones.Length];
            for (int i = 0; i < r3bones.Length; i++)
            {
                d.r3bones[i] = r3bones[i].Clone();
            }
            d.r3weights = new DeformVertexWeights[r3weights.Length];
            for (int i = 0; i < r3weights.Length; i++)
            {
                d.r3weights[i] = r3weights[i].Clone();
            }
            return(d);
        }
Beispiel #2
0
        public static DeformSet Read(Reader reader, Pointer offset, GeometricObject m)
        {
            MapLoader l = MapLoader.Loader;
            DeformSet d = new DeformSet(offset, m);

            d.off_weights = Pointer.Read(reader);
            d.off_bones   = Pointer.Read(reader);
            d.num_weights = reader.ReadUInt16();
            d.num_bones   = reader.ReadByte();
            d.num_bones  += 1;
            // one more byte here, always zero? padding?

            // Create arrays
            d.r3bones   = new DeformBone[d.num_bones]; // add root bone
            d.r3weights = new DeformVertexWeights[d.num_weights];

            // Read weights
            Pointer.Goto(ref reader, d.off_weights);
            for (int i = 0; i < d.num_weights; i++)
            {
                Pointer off_weightsForVertex = Pointer.Read(reader);
                ushort  vertex_index         = reader.ReadUInt16();
                byte    num_weightsForVertex = reader.ReadByte();
                reader.ReadByte(); // 0, padding
                d.r3weights[i] = new DeformVertexWeights(vertex_index);
                Pointer curPos = Pointer.Goto(ref reader, off_weightsForVertex);
                for (int j = 0; j < num_weightsForVertex; j++)
                {
                    ushort weight = reader.ReadUInt16();
                    //float floatWeight = weight / UInt16.MaxValue;
                    byte boneIndex = reader.ReadByte();
                    reader.ReadByte(); // 0, padding
                    d.r3weights[i].boneWeights.Add(boneIndex, weight);
                }
                Pointer.Goto(ref reader, curPos);
            }

            // Read bones
            d.r3bones[0]       = new DeformBone();
            d.r3bones[0].mat   = new Matrix(null, 1, Matrix4x4.identity, new Vector4(1f, 1f, 1f, 1f));
            d.r3bones[0].index = 0;
            Pointer.Goto(ref reader, d.off_bones);
            for (int i = 1; i < d.num_bones; i++)
            {
                d.r3bones[i] = new DeformBone();

                // each bone is a 0x38 block
                Matrix4x4 mat = new Matrix4x4();
                float     x   = reader.ReadSingle();
                float     y   = reader.ReadSingle();
                float     z   = reader.ReadSingle();
                mat.SetColumn(3, new Vector4(x, y, z, 1f));
                for (int j = 0; j < 3; j++)
                {
                    mat.SetColumn(j, new Vector4(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), 1f));
                }
                d.r3bones[i].mat = new Matrix(null, 1, mat, new Vector4(1f, 1f, 1f, 1f));
                if (Settings.s.game == Settings.Game.LargoWinch)
                {
                    Pointer off_shorts = Pointer.Read(reader);                     // offset of shorts. the next ushort, invert, is actually number of shorts.
                    d.r3bones[i].invert = reader.ReadUInt16();
                    //l.print("Number of shorts: " + d.r3bones[i].invert);
                    Pointer.DoAt(ref reader, off_shorts, () => {
                        for (int j = 0; j < d.r3bones[i].invert; j++)
                        {
                            reader.ReadUInt16();
                        }
                    });
                }
                else
                {
                    d.r3bones[i].unknown1 = reader.ReadSingle();
                    d.r3bones[i].invert   = reader.ReadUInt16();
                }

                d.r3bones[i].index = reader.ReadByte();
                reader.ReadByte(); // 0, padding
            }

            return(d);
        }
Beispiel #3
0
        public static DeformSet Read(EndianBinaryReader reader, Pointer offset, MeshObject m)
        {
            MapLoader l = MapLoader.Loader;
            DeformSet d = new DeformSet(offset, m);

            d.off_weights = Pointer.Read(reader);
            d.off_bones   = Pointer.Read(reader);
            d.num_weights = reader.ReadUInt16();
            d.num_bones   = reader.ReadByte();
            d.num_bones  += 1;
            // one more byte here, always zero? padding?

            // Create arrays
            d.r3bones   = new DeformBone[d.num_bones]; // add root bone
            d.r3weights = new DeformVertexWeights[d.num_weights];

            // Read weights
            Pointer.Goto(ref reader, d.off_weights);
            for (int i = 0; i < d.num_weights; i++)
            {
                Pointer off_weightsForVertex = Pointer.Read(reader);
                ushort  vertex_index         = reader.ReadUInt16();
                byte    num_weightsForVertex = reader.ReadByte();
                reader.ReadByte(); // 0, padding
                d.r3weights[i] = new DeformVertexWeights(vertex_index);
                Pointer curPos = Pointer.Goto(ref reader, off_weightsForVertex);
                for (int j = 0; j < num_weightsForVertex; j++)
                {
                    ushort weight = reader.ReadUInt16();
                    //float floatWeight = weight / UInt16.MaxValue;
                    byte boneIndex = reader.ReadByte();
                    reader.ReadByte(); // 0, padding
                    d.r3weights[i].boneWeights.Add(boneIndex, weight);
                }
                Pointer.Goto(ref reader, curPos);
            }

            // Read bones
            d.r3bones[0]       = new DeformBone();
            d.r3bones[0].mat   = new Matrix(null, 1, Matrix4x4.identity, new Vector4(1f, 1f, 1f, 1f));
            d.r3bones[0].index = 0;
            Pointer.Goto(ref reader, d.off_bones);
            for (int i = 1; i < d.num_bones; i++)
            {
                d.r3bones[i] = new DeformBone();

                // each bone is a 0x38 block
                Matrix4x4 mat = new Matrix4x4();
                float     x   = reader.ReadSingle();
                float     y   = reader.ReadSingle();
                float     z   = reader.ReadSingle();
                mat.SetColumn(3, new Vector4(x, y, z, 1f));
                for (int j = 0; j < 3; j++)
                {
                    mat.SetColumn(j, new Vector4(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), 1f));
                }
                d.r3bones[i].mat      = new Matrix(null, 1, mat, new Vector4(1f, 1f, 1f, 1f));
                d.r3bones[i].unknown1 = reader.ReadSingle();
                d.r3bones[i].invert   = reader.ReadUInt16();
                d.r3bones[i].index    = reader.ReadByte();
                reader.ReadByte(); // 0, padding
            }
            d.InitUnityBones();

            return(d);
        }