Example #1
0
        public bool ReadFromStream(Stream stream, ushort type, ushort size, uint nameHash)
        {
            Type     = type;
            Size     = size;
            NameHash = nameHash;

            if (size == 156)
            {
                var reader = new BinaryReader(stream);
                //Read data present in all templates
                ConstraintType = (ConstraintType)reader.ReadUInt32();
                NameUnused     = reader.ReadUInt32();

                BodyANameUnused = reader.ReadUInt32();
                BodyAIndex      = reader.ReadUInt32();
                BodyAOrient     = reader.ReadMatrix33();
                BodyAPos        = reader.ReadVector3f();

                BodyBNameUnused = reader.ReadUInt32();
                BodyBIndex      = reader.ReadUInt32();
                BodyBOrient     = reader.ReadMatrix33();
                BodyBPos        = reader.ReadVector3f();

                Threshold = reader.ReadSingle();

                //Read constraint data, dependent on constraint type
                switch (ConstraintType)
                {
                case ConstraintType.ConstraintNone:
                    ConstraintData = null;
                    break;

                case ConstraintType.ConstraintPoint:
                    ConstraintData = new PointConstraintData();
                    ConstraintData.ReadFromStream(stream);
                    break;

                case ConstraintType.ConstraintHinge:
                    ConstraintData = new HingeConstraintData();
                    ConstraintData.ReadFromStream(stream);
                    break;

                case ConstraintType.ConstraintPrismatic:
                    ConstraintData = new PrismaticConstraintData();
                    ConstraintData.ReadFromStream(stream);
                    break;

                case ConstraintType.ConstraintRagdoll:
                    ConstraintData = new RagdollConstraintData();
                    ConstraintData.ReadFromStream(stream);
                    break;

                case ConstraintType.ConstraintMotor:
                    ConstraintData = new MotorConstraintData();
                    ConstraintData.ReadFromStream(stream);
                    break;

                case ConstraintType.ConstraintFake:
                    ConstraintData = new FakeConstraintData();
                    ConstraintData.ReadFromStream(stream);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
                return(true);
            }
            else
            {
                Console.WriteLine("Error! Found constraint template property with size != 156 bytes. Unknown data! Skipping property.");
                return(false);
            }
        }