コード例 #1
0
        /// <summary>
        /// Constructs a <see cref="MAPBrushSide"/> object using the provided <c>string</c> array as the data.
        /// </summary>
        /// <param name="lines">Data to parse.</param>
        public MAPBrushSide(string[] lines)
        {
            // If lines.Length is 1, then this line contains all data for a brush side
            if (lines.Length == 1)
            {
                string[] tokens = lines[0].SplitUnlessInContainer(' ', '\"', StringSplitOptions.RemoveEmptyEntries);

                float dist = 0;

                // If this succeeds, assume brushDef3
                if (float.TryParse(tokens[4], out dist))
                {
                    plane       = new Plane(new Vector3(float.Parse(tokens[1], _format), float.Parse(tokens[2], _format), float.Parse(tokens[3], _format)), dist);
                    textureInfo = new TextureInfo(new Vector3(float.Parse(tokens[8], _format), float.Parse(tokens[9], _format), float.Parse(tokens[10], _format)),
                                                  new Vector3(float.Parse(tokens[13], _format), float.Parse(tokens[14], _format), float.Parse(tokens[15], _format)),
                                                  new Vector2(0, 0),
                                                  new Vector2(1, 1),
                                                  0, 0, 0);
                    texture = tokens[18];
                }
                else
                {
                    Vector3 v1 = new Vector3(float.Parse(tokens[1], _format), float.Parse(tokens[2], _format), float.Parse(tokens[3], _format));
                    Vector3 v2 = new Vector3(float.Parse(tokens[6], _format), float.Parse(tokens[7], _format), float.Parse(tokens[8], _format));
                    Vector3 v3 = new Vector3(float.Parse(tokens[11], _format), float.Parse(tokens[12], _format), float.Parse(tokens[13], _format));
                    vertices = new Vector3[] { v1, v2, v3 };
                    plane    = PlaneExtensions.CreateFromVertices(v1, v2, v3);
                    texture  = tokens[15];
                    // GearCraft
                    if (tokens[16] == "[")
                    {
                        textureInfo = new TextureInfo(new Vector3(float.Parse(tokens[17], _format), float.Parse(tokens[18], _format), float.Parse(tokens[19], _format)),
                                                      new Vector3(float.Parse(tokens[23], _format), float.Parse(tokens[24], _format), float.Parse(tokens[25], _format)),
                                                      new Vector2(float.Parse(tokens[20], _format), float.Parse(tokens[26], _format)),
                                                      new Vector2(float.Parse(tokens[29], _format), float.Parse(tokens[30], _format)),
                                                      int.Parse(tokens[31]), 0, float.Parse(tokens[28], _format));
                        material = tokens[32];
                    }
                    else
                    {
                        //<x_shift> <y_shift> <rotation> <x_scale> <y_scale> <content_flags> <surface_flags> <value>
                        Vector3[] axes = TextureInfo.TextureAxisFromPlane(plane);
                        textureInfo = new TextureInfo(axes[0],
                                                      axes[1],
                                                      new Vector2(float.Parse(tokens[16], _format), float.Parse(tokens[17], _format)),
                                                      new Vector2(float.Parse(tokens[19], _format), float.Parse(tokens[20], _format)),
                                                      int.Parse(tokens[22]), 0, float.Parse(tokens[18], _format));
                    }
                }
            }
            else
            {
                bool inDispInfo = false;
                int  braceCount = 0;
                textureInfo = new TextureInfo();
                List <string> child = new List <string>(37);
                foreach (string line in lines)
                {
                    if (line == "{")
                    {
                        ++braceCount;
                    }
                    else if (line == "}")
                    {
                        --braceCount;
                        if (braceCount == 1)
                        {
                            child.Add(line);
                            displacement = new MAPDisplacement(child.ToArray());
                            child        = new List <string>(37);
                            inDispInfo   = false;
                        }
                    }
                    else if (line == "dispinfo")
                    {
                        inDispInfo = true;
                        continue;
                    }

                    if (braceCount == 1)
                    {
                        string[] tokens = line.SplitUnlessInContainer(' ', '\"', StringSplitOptions.RemoveEmptyEntries);
                        switch (tokens[0])
                        {
                        case "material": {
                            texture = tokens[1];
                            break;
                        }

                        case "plane": {
                            string[] points     = tokens[1].SplitUnlessBetweenDelimiters(' ', '(', ')', StringSplitOptions.RemoveEmptyEntries);
                            string[] components = points[0].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                            Vector3  v1         = new Vector3(float.Parse(components[0], _format), float.Parse(components[1], _format), float.Parse(components[2], _format));
                            components = points[1].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                            Vector3 v2 = new Vector3(float.Parse(components[0], _format), float.Parse(components[1], _format), float.Parse(components[2], _format));
                            components = points[2].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                            Vector3 v3 = new Vector3(float.Parse(components[0], _format), float.Parse(components[1], _format), float.Parse(components[2], _format));
                            plane = PlaneExtensions.CreateFromVertices(v1, v2, v3);
                            break;
                        }

                        case "uaxis": {
                            string[] split = tokens[1].SplitUnlessBetweenDelimiters(' ', '[', ']', StringSplitOptions.RemoveEmptyEntries);
                            textureInfo.scale       = new Vector2(float.Parse(split[1], _format), textureInfo.scale.Y());
                            split                   = split[0].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                            textureInfo.UAxis       = new Vector3(float.Parse(split[0], _format), float.Parse(split[1], _format), float.Parse(split[2], _format));
                            textureInfo.Translation = new Vector2(float.Parse(split[3], _format), textureInfo.Translation.Y());
                            break;
                        }

                        case "vaxis": {
                            string[] split = tokens[1].SplitUnlessBetweenDelimiters(' ', '[', ']', StringSplitOptions.RemoveEmptyEntries);
                            textureInfo.scale       = new Vector2(textureInfo.scale.X(), float.Parse(split[1], _format));
                            split                   = split[0].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                            textureInfo.VAxis       = new Vector3(float.Parse(split[0], _format), float.Parse(split[1], _format), float.Parse(split[2], _format));
                            textureInfo.Translation = new Vector2(textureInfo.Translation.X(), float.Parse(split[3], _format));
                            break;
                        }

                        case "rotation": {
                            textureInfo.rotation = float.Parse(tokens[1], _format);
                            break;
                        }
                        }
                    }
                    else if (braceCount > 1)
                    {
                        if (inDispInfo)
                        {
                            child.Add(line);
                        }
                    }
                }
            }
        }
コード例 #2
0
ファイル: MAPBrushSide.cs プロジェクト: wfowler1/LibBSP
		/// <summary>
		/// Constructs a <see cref="MAPBrushSide"/> object using the provided <c>string</c> array as the data.
		/// </summary>
		/// <param name="lines">Data to parse.</param>
		public MAPBrushSide(string[] lines) {
			// If lines.Length is 1, then this line contains all data for a brush side
			if (lines.Length == 1) {
				string[] tokens = lines[0].SplitUnlessInContainer(' ', '\"', StringSplitOptions.RemoveEmptyEntries);

				float dist = 0;

				// If this succeeds, assume brushDef3
				if (Single.TryParse(tokens[4], out dist)) {
					plane = new Plane(new Vector3(Single.Parse(tokens[1], _format), Single.Parse(tokens[2], _format), Single.Parse(tokens[3], _format)), dist);
					textureS = new Vector3(Single.Parse(tokens[8], _format), Single.Parse(tokens[9], _format), Single.Parse(tokens[10], _format));
					textureT = new Vector3(Single.Parse(tokens[13], _format), Single.Parse(tokens[14], _format), Single.Parse(tokens[15], _format));
					texture = tokens[18];
				} else {
					Vector3 v1 = new Vector3(Single.Parse(tokens[1], _format), Single.Parse(tokens[2], _format), Single.Parse(tokens[3], _format));
					Vector3 v2 = new Vector3(Single.Parse(tokens[6], _format), Single.Parse(tokens[7], _format), Single.Parse(tokens[8], _format));
					Vector3 v3 = new Vector3(Single.Parse(tokens[11], _format), Single.Parse(tokens[12], _format), Single.Parse(tokens[13], _format));
					vertices = new Vector3[] { v1, v2, v3 };
					plane = new Plane(v1, v2, v3);
					texture = tokens[15];
					// GearCraft
					if (tokens[16] == "[") {
						textureS = new Vector3(Single.Parse(tokens[17], _format), Single.Parse(tokens[18], _format), Single.Parse(tokens[19], _format));
						textureShiftS = Double.Parse(tokens[20], _format);
						textureT = new Vector3(Single.Parse(tokens[23], _format), Single.Parse(tokens[24], _format), Single.Parse(tokens[25], _format));
						textureShiftT = Double.Parse(tokens[26], _format);
						texRot = Single.Parse(tokens[28], _format);
						texScaleX = Double.Parse(tokens[29], _format);
						texScaleY = Double.Parse(tokens[30], _format);
						flags = Int32.Parse(tokens[31]);
						material = tokens[32];
					} else {
						//<x_shift> <y_shift> <rotation> <x_scale> <y_scale> <content_flags> <surface_flags> <value>
						textureShiftS = Single.Parse(tokens[16], _format);
						textureShiftT = Single.Parse(tokens[17], _format);
						texRot = Single.Parse(tokens[18], _format);
						texScaleX = Double.Parse(tokens[19], _format);
						texScaleY = Double.Parse(tokens[20], _format);
						flags = Int32.Parse(tokens[22]);
					}
				}
			} else {
				bool inDispInfo = false;
				int braceCount = 0;
				List<string> child = new List<string>(37);
				foreach (string line in lines) {
					if (line == "{") {
						++braceCount;
					} else if (line == "}") {
						--braceCount;
						if (braceCount == 1) {
							child.Add(line);
							displacement = new MAPDisplacement(child.ToArray());
							child = new List<string>(37);
							inDispInfo = false;
						}
					} else if (line == "dispinfo") {
						inDispInfo = true;
						continue;
					}

					if (braceCount == 1) {
						string[] tokens = line.SplitUnlessInContainer(' ', '\"', StringSplitOptions.RemoveEmptyEntries);
						switch (tokens[0]) {
							case "material": {
								texture = tokens[1];
								break;
							}
							case "plane": {
								string[] points = tokens[1].SplitUnlessBetweenDelimiters(' ', '(', ')', StringSplitOptions.RemoveEmptyEntries);
								string[] components = points[0].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
								Vector3 v1 = new Vector3(Single.Parse(components[0], _format), Single.Parse(components[1], _format), Single.Parse(components[2], _format));
								components = points[1].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
								Vector3 v2 = new Vector3(Single.Parse(components[0], _format), Single.Parse(components[1], _format), Single.Parse(components[2], _format));
								components = points[2].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
								Vector3 v3 = new Vector3(Single.Parse(components[0], _format), Single.Parse(components[1], _format), Single.Parse(components[2], _format));
								plane = new Plane(v1, v2, v3);
								break;
							}
							case "uaxis": {
								string[] split = tokens[1].SplitUnlessBetweenDelimiters(' ', '[', ']', StringSplitOptions.RemoveEmptyEntries);
								texScaleX = Single.Parse(split[1], _format);
								split = split[0].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
								textureS = new Vector3(Single.Parse(split[0], _format), Single.Parse(split[1], _format), Single.Parse(split[2], _format));
								textureShiftS = Single.Parse(split[3], _format);
								break;
							}
							case "vaxis": {
								string[] split = tokens[1].SplitUnlessBetweenDelimiters(' ', '[', ']', StringSplitOptions.RemoveEmptyEntries);
								texScaleY = Single.Parse(split[1], _format);
								split = split[0].Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
								textureT = new Vector3(Single.Parse(split[0], _format), Single.Parse(split[1], _format), Single.Parse(split[2], _format));
								textureShiftT = Single.Parse(split[3], _format);
								break;
							}
							case "rotation": {
								texRot = Single.Parse(tokens[1], _format);
								break;
							}
						}
					} else if (braceCount > 1) {
						if (inDispInfo) {
							child.Add(line);
						}
					}
				}
			}
		}