/// <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); } } } } }
/// <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); } } } } }