示例#1
0
        internal Shader(SBR block)
        {
            block.VerifyID(TokenID.Terrain_Shader);
            Name = block.ReadString();
            while (!block.EndOfBlock())
            {
                using (SBR subBlock = block.ReadSubBlock())
                {
                    switch (subBlock.ID)
                    {
                    case TokenID.Terrain_TexSlots:
                        int size = (int)subBlock.ReadUInt();
                        Textureslots = new List <TextureSlot>(size);
                        for (int i = 0; i < size; ++i)
                        {
                            Textureslots.Add(new TextureSlot(subBlock.ReadSubBlock()));
                        }
                        break;

                    case TokenID.Terrain_UVCalcs:
                        size    = (int)subBlock.ReadUInt();
                        UVCalcs = new List <UVCalc>(size);
                        for (int i = 0; i < size; ++i)
                        {
                            UVCalcs.Add(new UVCalc(subBlock.ReadSubBlock()));
                        }
                        break;

                    default:
                        break;
                    }
                }
            }
        }
示例#2
0
 public LodControl(SBR block)
 {
     block.VerifyID(TokenID.Lod_Control);
     DistanceLevelsHeader = new DistanceLevelsHeader(block.ReadSubBlock());
     DistanceLevels       = new DistanceLevels(block.ReadSubBlock());
     block.VerifyEndOfBlock();
 }
示例#3
0
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            SBR sbrValue = (SBR)value;

            if (sbrValue == null)
            {
                return(new ValidationResult("SBR segment is required"));
            }
            if (!(sbrValue.SBR1 == "A" || sbrValue.SBR1 == "B" || sbrValue.SBR1 == "C" || sbrValue.SBR1 == "D" || sbrValue.SBR1 == "E" || sbrValue.SBR1 == "F" || sbrValue.SBR1 == "G" || sbrValue.SBR1 == "H" || sbrValue.SBR1 == "P" || sbrValue.SBR1 == "S" || sbrValue.SBR1 == "T" || sbrValue.SBR1 == "U"))
            {
                return(new ValidationResult("the only allowed values for SBR01 should be ABCDEFGHPSTU"));
            }
            string ErrorString = string.Empty;

            if (!(sbrValue.SBR2 == "18" || string.IsNullOrEmpty(sbrValue.SBR2)))
            {
                ErrorString += "SBR02 can only be 18 ";
            }
            if (!(string.IsNullOrEmpty(sbrValue.SBR5) || sbrValue.SBR5 == "12" || sbrValue.SBR5 == "13" || sbrValue.SBR5 == "14" || sbrValue.SBR5 == "15" || sbrValue.SBR5 == "16" || sbrValue.SBR5 == "41" || sbrValue.SBR5 == "42" || sbrValue.SBR5 == "47"))
            {
                ErrorString += "SBR05 can only be 12 13 14 15 16 41 42 43 47 ";
            }
            if (!(string.IsNullOrEmpty(sbrValue.SBR9) || sbrValue.SBR9 == "11" || sbrValue.SBR9 == "12" || sbrValue.SBR9 == "13" || sbrValue.SBR9 == "14" || sbrValue.SBR9 == "15" || sbrValue.SBR9 == "16" || sbrValue.SBR9 == "17" || sbrValue.SBR9 == "AM" || sbrValue.SBR5 == "BL" || sbrValue.SBR5 == "CH" || sbrValue.SBR5 == "CI" || sbrValue.SBR5 == "DS" || sbrValue.SBR5 == "FI" || sbrValue.SBR5 == "HM" || sbrValue.SBR5 == "LM" || sbrValue.SBR5 == "MA" || sbrValue.SBR5 == "MB" || sbrValue.SBR5 == "MC" || sbrValue.SBR5 == "OF" || sbrValue.SBR5 == "TV" || sbrValue.SBR5 == "VA" || sbrValue.SBR5 == "WC" || sbrValue.SBR5 == "ZZ"))
            {
                ErrorString += "SBR09 can only be 11 12 13 14 15 16 17 AM BL CH CI DS FI HM LM MA MB MC OF TV VA WC ZZ ";
            }
            ErrorString += ValidateElement.GetValidation(sbrValue.SBR3, Element.Situational, 1, 50, "SBR03") + ValidateElement.GetValidation(sbrValue.SBR4, Element.Situational, 1, 60, "SBR04");
            if (ErrorString == string.Empty)
            {
                return(null);
            }
            return(new ValidationResult(ErrorString));
        }
示例#4
0
 public LightModelConfig(SBR block)
 {
     block.VerifyID(TokenID.Light_Model_Cfg);
     Flags        = block.ReadFlags();
     UVOperations = new UVOperations(block.ReadSubBlock());
     block.VerifyEndOfBlock();
 }
示例#5
0
 public UVOperationCopy(SBR block)
 {
     block.VerifyID(TokenID.UV_OP_Copy);
     TextureAddressMode = block.ReadInt();
     SourceUVIndex      = block.ReadInt();
     block.VerifyEndOfBlock();
 }
示例#6
0
 public AnimationNode(SBR block)
 {
     block.VerifyID(TokenID.Anim_node);
     Name        = block.Label;
     Controllers = new Controllers(block.ReadSubBlock());
     block.VerifyEndOfBlock();
 }
示例#7
0
 public SlerpRotation(SBR block)
 {
     block.VerifyID(TokenID.Slerp_Rot);
     Frame      = block.ReadInt();
     quaternion = new Quaternion(block.ReadFloat(), block.ReadFloat(), -block.ReadFloat(), block.ReadFloat());
     block.VerifyEndOfBlock();
 }
示例#8
0
 internal Range(SBR block, TokenID expectedToken)
 {
     block.VerifyID(expectedToken);
     LowerLimit = block.ReadFloat();
     UpperLimit = block.ReadFloat();
     block.VerifyEndOfBlock();
 }
示例#9
0
 internal Size2D(SBR block, TokenID expectedToken)
 {
     block.VerifyID(expectedToken);
     Width  = block.ReadFloat();
     Height = block.ReadFloat();
     block.VerifyEndOfBlock();
 }
示例#10
0
 private void ReadTrackItemId(SBR block)
 {
     block.VerifyID(TokenID.TrItemId);
     block.ReadInt();    //don't mind the database id, should be 0 always (TrackDB)
     ItemId = block.ReadInt();
     block.VerifyEndOfBlock();
 }
示例#11
0
 public CarSpawnerObject(SBR block, int detailLevel, int tileX, int tileZ)
 {
     DetailLevel     = detailLevel;
     CarFrequency    = 5.0f;
     CarAverageSpeed = 20.0f;
     ReadBlock(block, tileX, tileZ);
 }
示例#12
0
        internal UVOperations(SBR block)
        {
            block.VerifyID(TokenID.UV_Ops);
            int count = Capacity = block.ReadInt();

            while (count-- > 0)
            {
                SBR subBlock = block.ReadSubBlock();
                switch (subBlock.ID)
                {
                case TokenID.UV_OP_Copy: Add(new UVOperationCopy(subBlock)); break;

                case TokenID.UV_Op_ReflectMapFull: Add(new UVOperationReflectMapFull(subBlock)); break;

                case TokenID.UV_Op_Reflectmap: Add(new UVOperationReflectMap(subBlock)); break;

                case TokenID.UV_Op_UniformScale: Add(new UVOperationUniformScale(subBlock)); break;

                case TokenID.UV_Op_NonUniformScale: Add(new UVOperationNonUniformScale(subBlock)); break;

                default: throw new InvalidDataException($"Unexpected uv_op: {subBlock.ID}");
                }
            }
            block.VerifyEndOfBlock();
        }
示例#13
0
        public terrain_shader(SBR block)
        {
            block.VerifyID(TokenID.terrain_shader);
            ShaderName = block.ReadString();
            while (!block.EndOfBlock())
            {
                using (var subBlock = block.ReadSubBlock())
                {
                    switch (subBlock.ID)
                    {
                    case TokenID.terrain_texslots:
                        terrain_texslots = new terrain_texslot[subBlock.ReadUInt()];
                        for (var i = 0; i < terrain_texslots.Length; ++i)
                        {
                            terrain_texslots[i] = new terrain_texslot(subBlock.ReadSubBlock());
                        }
                        break;

                    case TokenID.terrain_uvcalcs:
                        terrain_uvcalcs = new terrain_uvcalc[subBlock.ReadUInt()];
                        for (var i = 0; i < terrain_uvcalcs.Length; ++i)
                        {
                            terrain_uvcalcs[i] = new terrain_uvcalc(subBlock.ReadSubBlock());
                        }
                        break;

                    default:
                        break;
                    }
                }
            }
        }
示例#14
0
        public terrain_patchset(SBR block)
        {
            block.VerifyID(TokenID.terrain_patchset);
            while (!block.EndOfBlock())
            {
                using (var subBlock = block.ReadSubBlock())
                {
                    switch (subBlock.ID)
                    {
                    case TokenID.terrain_patchset_distance:
                        terrain_patchset_distance = subBlock.ReadInt();
                        break;

                    case TokenID.terrain_patchset_npatches:
                        terrain_patchset_npatches = subBlock.ReadInt();
                        break;

                    case TokenID.terrain_patchset_patches:
                        terrain_patchset_patches = new terrain_patchset_patch[terrain_patchset_npatches * terrain_patchset_npatches];
                        for (var i = 0; i < terrain_patchset_patches.Length; ++i)
                        {
                            terrain_patchset_patches[i] = new terrain_patchset_patch(subBlock.ReadSubBlock());
                        }
                        break;
                    }
                }
            }
        }
示例#15
0
 public GeometryInfo(SBR block)
 {
     block.VerifyID(TokenID.Geometry_Info);
     FaceNormals         = block.ReadInt();
     TextureLightCmds    = block.ReadInt();
     NodeXTriListIndices = block.ReadInt();
     TriListIndices      = block.ReadInt();
     LineListIndices     = block.ReadInt();
     NodeXTriListIndices = block.ReadInt();
     TriLists            = block.ReadInt();
     LineLists           = block.ReadInt();
     PointLists          = block.ReadInt();
     NodeXTriLists       = block.ReadInt();
     GeometryNodes       = new GeometryNodes(block.ReadSubBlock());
     {
         var subBlock = block.ReadSubBlock();
         subBlock.VerifyID(TokenID.Geometry_Node_Map);
         GeometryNodeMap = new int[subBlock.ReadInt()];
         for (var i = 0; i < GeometryNodeMap.Length; ++i)
         {
             GeometryNodeMap[i] = subBlock.ReadInt();
         }
         subBlock.VerifyEndOfBlock();
     }
     block.VerifyEndOfBlock();
 }
示例#16
0
        protected void ReadBlock(SBR block, int tileX, int tileZ)
        {
            PositionHolder holder = new PositionHolder()
            {
                TileX = tileX,
                TileZ = tileZ,
            };

            while (!block.EndOfBlock())
            {
                using (var subBlock = block.ReadSubBlock())
                {
                    if (subBlock.ID == TokenID.UiD)
                    {
                        UiD = subBlock.ReadUInt();
                    }
                    else
                    {
                        AddOrModifyObj(subBlock, holder);
                    }
                }
            }
            worldPosition = PositionHolder.WorldPositionFromMSTSLocation(holder, UiD);
            if (this is HazardObject hazard)  //remember the Quaternation component
            {
                hazard.Direction = holder.Direction;
            }
        }
示例#17
0
 public IndexedTriList(SBR block)
 {
     block.VerifyID(TokenID.Indexed_TriList);
     VertexIndices = new VertexIndices(block.ReadSubBlock());
     {
         var subBlock = block.ReadSubBlock();
         subBlock.VerifyID(TokenID.Normal_Idxs);
         NormalIndices = new int[subBlock.ReadInt()];
         for (var i = 0; i < NormalIndices.Length; ++i)
         {
             NormalIndices[i] = subBlock.ReadInt();
             subBlock.ReadInt(); // skip the '3' value - its purpose unknown
         }
         subBlock.VerifyEndOfBlock();
     }
     {
         var subBlock = block.ReadSubBlock();
         subBlock.VerifyID(TokenID.Flags);
         Flags = new uint[subBlock.ReadInt()];
         for (var i = 0; i < Flags.Length; ++i)
         {
             Flags[i] = subBlock.ReadFlags();
         }
         subBlock.VerifyEndOfBlock();
     }
     block.VerifyEndOfBlock();
 }
示例#18
0
 private void ReadLocation(SBR block, PositionHolder holder)
 {
     block.VerifyID(TokenID.Position);
     holder.Location    = new Vector3(block.ReadFloat(), block.ReadFloat(), block.ReadFloat());
     holder.LocationSet = true;
     block.VerifyEndOfBlock();
 }
示例#19
0
 public Shape(SBR block)
 {
     block.VerifyID(TokenID.Shape);
     ShapeHeader        = new ShapeHeader(block.ReadSubBlock());
     Volumes            = new Volumes(block.ReadSubBlock());
     ShaderNames        = new ShaderNames(block.ReadSubBlock());
     TextureFilterNames = new TextureFilterNames(block.ReadSubBlock());
     Points             = new Points(block.ReadSubBlock());
     UVPoints           = new UVPoints(block.ReadSubBlock());
     Normals            = new Normals(block.ReadSubBlock());
     SortVectors        = new SortVectors(block.ReadSubBlock());
     Colors             = new Colors(block.ReadSubBlock());
     Matrices           = new Matrices(block.ReadSubBlock());
     ImageNames         = new ImageNames(block.ReadSubBlock());
     Textures           = new Textures(block.ReadSubBlock());
     LightMaterials     = new LightMaterials(block.ReadSubBlock());
     LightModelConfigs  = new LightModelConfigs(block.ReadSubBlock());
     VertexStates       = new VertexStates(block.ReadSubBlock());
     PrimaryStates      = new PrimaryStates(block.ReadSubBlock());
     LodControls        = new LodControls(block.ReadSubBlock());
     if (!block.EndOfBlock())
     {
         Animations = new Animations(block.ReadSubBlock());
     }
     block.VerifyEndOfBlock();
 }
示例#20
0
 private void ReadDirection(SBR block, PositionHolder holder)
 {
     block.VerifyID(TokenID.QDirection);
     holder.Direction    = new Quaternion(block.ReadFloat(), block.ReadFloat(), block.ReadFloat(), block.ReadFloat());
     holder.DirectionSet = true;
     block.VerifyEndOfBlock();
 }
示例#21
0
 public LinearKey(SBR block)
 {
     block.VerifyID(TokenID.Linear_Key);
     Frame    = block.ReadInt();
     position = new Vector3(block.ReadFloat(), block.ReadFloat(), -block.ReadFloat());
     block.VerifyEndOfBlock();
 }
示例#22
0
 internal CapacityData(SBR block)
 {
     block.VerifyID(TokenID.PickupCapacity);
     QuantityAvailableKG = (float)Mass.Kilogram.FromLb(block.ReadFloat());
     FeedRateKGpS        = (float)Mass.Kilogram.FromLb(block.ReadFloat());
     block.VerifyEndOfBlock();
 }
示例#23
0
        public UVOperations(SBR block)
        {
            block.VerifyID(TokenID.UV_Ops);
            var count = Capacity = block.ReadInt();

            while (count-- > 0)
            {
                var subBlock = block.ReadSubBlock();
                switch (subBlock.ID)
                {
                case TokenID.UV_OP_Copy: Add(new UVOperationCopy(subBlock)); break;

                case TokenID.UV_Op_ReflectMapFull: Add(new UVOperationReflectMapFull(subBlock)); break;

                case TokenID.UV_Op_Reflectmap: Add(new UVOperationReflectMap(subBlock)); break;

                case TokenID.UV_Op_UniformScale: this.Add(new UVOperationUniformScale(subBlock)); break;

                case TokenID.UV_Op_NonUniformScale: this.Add(new UVOperationNonUniformScale(subBlock)); break;

                default: throw new System.Exception("Unexpected uv_op: " + subBlock.ID.ToString());
                }
            }
            block.VerifyEndOfBlock();
        }
示例#24
0
 public TextData(SBR block)
 {
     block.VerifyID(TokenID.Speed_Text_Size);
     Size   = block.ReadFloat();
     Offset = new Vector2(block.ReadFloat(), block.ReadFloat());
     block.VerifyEndOfBlock();
 }
示例#25
0
        public PrimaryState(SBR block)
        {
            block.VerifyID(TokenID.Prim_State);

            Name = block.Label;

            Flags       = block.ReadFlags();
            ShaderIndex = block.ReadInt();
            {
                var subBlock = block.ReadSubBlock();
                subBlock.VerifyID(TokenID.Tex_Idxs);
                TextureIndices = new int[subBlock.ReadInt()];
                for (var i = 0; i < TextureIndices.Length; ++i)
                {
                    TextureIndices[i] = subBlock.ReadInt();
                }
                subBlock.VerifyEndOfBlock();
            }
            ZBias            = block.ReadFloat();
            VertexStateIndex = block.ReadInt();
            AlphaTestMode    = block.ReadInt();
            LightConfigIndex = block.ReadInt();
            ZBufferMode      = block.ReadInt();
            block.VerifyEndOfBlock();
        }
示例#26
0
        protected virtual void AddOrModifyObj(SBR subBlock, PositionHolder holder)
        {
            switch (subBlock.ID)
            {
            case TokenID.FileName:
                FileName = subBlock.ReadString(); break;

            case TokenID.Position:
                //Position = new STFPositionItem(subBlock);
                ReadLocation(subBlock, holder);
                break;

            case TokenID.QDirection:
                //QDirection = new STFQDirectionItem(subBlock);
                ReadDirection(subBlock, holder);
                break;

            case TokenID.Matrix3x3:
                //Matrix3x3 = ReadMatrix3x3(subBlock);
                ReadPosition(subBlock, holder);
                break;

            case TokenID.VDbId:
                ViewDbId = subBlock.ReadUInt(); break;

            case TokenID.StaticFlags:
                StaticFlags = subBlock.ReadFlags(); break;

            default:
                subBlock.Skip(); break;
            }
        }
示例#27
0
 public DistanceLevel(SBR block)
 {
     block.VerifyID(TokenID.Distance_Level);
     DistanceLevelHeader = new DistanceLevelHeader(block.ReadSubBlock());
     SubObjects          = new SubObjects(block.ReadSubBlock());
     block.VerifyEndOfBlock();
 }
示例#28
0
 private void ReadCrossingParameters(SBR block)
 {
     block.VerifyID(TokenID.LevelCrParameters);
     WarningTime     = block.ReadFloat();
     MinimumDistance = block.ReadFloat();
     block.VerifyEndOfBlock();
 }
        /// <summary>
        /// constructor
        /// </summary>
        /// <param name="filename">file to read and parse</param>
        public MstsShapeFile(string filename)
        {
            var file = SBR.Open(filename);

            shape = new MstsShape(file.ReadSubBlock());
            file.VerifyEndOfBlock();
        }
示例#30
0
        internal PatchSet(SBR block)
        {
            block.VerifyID(TokenID.Terrain_PatchSet);
            while (!block.EndOfBlock())
            {
                using (SBR subBlock = block.ReadSubBlock())
                {
                    switch (subBlock.ID)
                    {
                    case TokenID.Terrain_PatchSet_Distance:
                        Distance = subBlock.ReadInt();
                        break;

                    case TokenID.Terrain_PatchSet_NPatches:
                        PatchSize = subBlock.ReadInt();
                        break;

                    case TokenID.Terrain_PatchSet_Patches:
                        Patches = new List <Patch>(PatchSize * PatchSize);
                        for (int i = 0; i < (PatchSize * PatchSize); ++i)
                        {
                            Patches.Add(new Patch(subBlock.ReadSubBlock()));
                        }
                        break;
                    }
                }
            }
        }