public void ParseShape(MegaXMLNode node, MegaShape shape) { for (int i = 0; i < node.values.Count; i++) { MegaXMLValue val = node.values[i]; //Debug.Log("Shape val " + val.name); switch (val.name) { case "name": break; case "p": break; case "r": break; case "s": break; } } foreach (MegaXMLNode n in node.children) { //Debug.Log("Shape tagName " + n.tagName); switch (n.tagName) { case "Spline": ParseSpline(n, shape); break; } } }
public void ParseSpline(MegaXMLNode node, MegaShape shape) { MegaSpline spline = new MegaSpline(); for (int i = 0; i < node.values.Count; i++) { MegaXMLValue val = node.values[i]; //Debug.Log("Spline val " + val.name); switch (val.name) { case "flags": break; case "closed": spline.closed = int.Parse(val.value) > 0 ? true : false; break; } } foreach (MegaXMLNode n in node.children) { //Debug.Log("Spline tagName " + n.tagName); switch (n.tagName) { case "K": ParseKnot(n, shape, spline); break; } } //Debug.Log("************** Add Spline"); shape.splines.Add(spline); }
public void ParseKnot(MegaXMLNode node, MegaShape shape, MegaSpline spline) { Vector3 p = Vector3.zero; Vector3 invec = Vector3.zero; Vector3 outvec = Vector3.zero; for (int i = 0; i < node.values.Count; i++) { MegaXMLValue val = node.values[i]; //Debug.Log("Knot val " + val.name); switch (val.name) { case "p": p = ParseV3Split(val.value, 0); break; case "i": invec = ParseV3Split(val.value, 0); break; case "o": outvec = ParseV3Split(val.value, 0); break; case "l": break; } } spline.AddKnot(p, invec, outvec); }
public void ParseTag(MegaXMLNode node, MegaShapeOSMWay way) { MegaShapeOSMTag tag = null; for (int i = 0; i < node.values.Count; i++) { MegaXMLValue val = node.values[i]; switch (val.name) { case "k": tag = FindTagK(val.value); if (tag == null) { tag = new MegaShapeOSMTag(); tag.k = val.value; tags.Add(tag); } break; case "v": way.tags.Add(AddV(tag, val.value)); break; } } }
public void ParseWay(MegaXMLNode node) { MegaShapeOSMWay way = new MegaShapeOSMWay(); way.name = ""; for (int i = 0; i < node.values.Count; i++) { MegaXMLValue val = node.values[i]; switch (val.name) { case "id": way.id = ulong.Parse(val.value); break; } } foreach (MegaXMLNode n in node.children) { switch (n.tagName) { case "nd": ParseND(n, way); break; case "tag": ParseTag(n, way); break; } } osmways.Add(way); }
public void ParseND(MegaXMLNode node, MegaShapeOSMWay way) { for (int i = 0; i < node.values.Count; i++) { MegaXMLValue val = node.values[i]; switch (val.name) { case "ref": way.nodes.Add(ulong.Parse(val.value)); break; } } }
void ParseRect(MegaXMLNode node, MegaShape shape) { MegaSpline spline = GetSpline(shape); Vector3[] ppoints = new Vector3[4]; float w = 0.0f; float h = 0.0f; float x = 0.0f; float y = 0.0f; for (int i = 0; i < node.values.Count; i++) { MegaXMLValue val = node.values[i]; switch (val.name) { case "x": x = float.Parse(val.value); break; case "y": y = float.Parse(val.value); break; case "width": w = float.Parse(val.value); break; case "height": h = float.Parse(val.value); break; case "transform": Debug.Log("SVG Transform not implemented yet"); break; } } ppoints[0] = new Vector3(x, 0.0f, y); ppoints[1] = new Vector3(x, 0.0f, y + h); ppoints[2] = new Vector3(x + w, 0.0f, y + h); ppoints[3] = new Vector3(x + w, 0.0f, y); spline.closed = true; spline.knots.Clear(); //spline.AddKnot(ppoints[0], ppoints[0], ppoints[0]); //spline.AddKnot(ppoints[1], ppoints[1], ppoints[1]); //spline.AddKnot(ppoints[2], ppoints[2], ppoints[2]); //spline.AddKnot(ppoints[3], ppoints[3], ppoints[3]); AddKnot(spline, ppoints[0], ppoints[0], ppoints[0], shape.axis); AddKnot(spline, ppoints[1], ppoints[1], ppoints[1], shape.axis); AddKnot(spline, ppoints[2], ppoints[2], ppoints[2], shape.axis); AddKnot(spline, ppoints[3], ppoints[3], ppoints[3], shape.axis); }
public MegaXMLNode parseAttributes(String xmlTag, MegaXMLNode node) { int index = 0; int attrNameIndex = 0; int lastIndex = 0; while (true) { index = xmlTag.IndexOf(BEGIN_QUOTE, lastIndex); if (index < 0 || index > xmlTag.Length) { break; } attrNameIndex = xmlTag.LastIndexOf(SPACE, index); if (attrNameIndex < 0 || attrNameIndex > xmlTag.Length) { break; } attrNameIndex++; String attrName = xmlTag.Substring(attrNameIndex, index - attrNameIndex); index += 2; lastIndex = xmlTag.IndexOf(QUOTE, index); if (lastIndex < 0 || lastIndex > xmlTag.Length) { break; } int tagLength = lastIndex - index; String attrValue = xmlTag.Substring(index, tagLength); MegaXMLValue val = new MegaXMLValue(); val.name = attrName; val.value = attrValue; node.values.Add(val); } return(node); }
void ParsePolygon(MegaXMLNode node, MegaShape shape) { MegaSpline spline = GetSpline(shape); spline.knots.Clear(); spline.closed = true; char[] charSeparators = new char[] { ' ' }; for (int i = 0; i < node.values.Count; i++) { MegaXMLValue val = node.values[i]; switch (val.name) { case "points": string[] coordinates = val.value.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries); for (int j = 0; j < coordinates.Length; j++) { Vector3 p = ParseV2Split(coordinates[j], 0); MegaKnot k = new MegaKnot(); k.p = SwapAxis(new Vector3(p.x, 0.0f, p.y), shape.axis); k.invec = k.p; k.outvec = k.p; spline.knots.Add(k); } break; } } if (spline.closed) { Vector3 delta1 = spline.knots[0].outvec - spline.knots[0].p; spline.knots[0].invec = spline.knots[0].p - delta1; } }
public MegaXMLNode parseAttributes(String xmlTag, MegaXMLNode node) { int index = 0; int attrNameIndex = 0; int lastIndex = 0; while ( true ) { index = xmlTag.IndexOf(BEGIN_QUOTE, lastIndex); if ( index < 0 || index > xmlTag.Length ) break; attrNameIndex = xmlTag.LastIndexOf(SPACE, index); if ( attrNameIndex < 0 || attrNameIndex > xmlTag.Length ) break; attrNameIndex++; String attrName = xmlTag.Substring(attrNameIndex, index - attrNameIndex); index += 2; lastIndex = xmlTag.IndexOf(QUOTE, index); if ( lastIndex < 0 || lastIndex > xmlTag.Length ) { break; } int tagLength = lastIndex - index; String attrValue = xmlTag.Substring(index, tagLength); MegaXMLValue val = new MegaXMLValue(); val.name = attrName; val.value = attrValue; node.values.Add(val); } return node; }
void ParseCircle(MegaXMLNode node, MegaShape shape) { MegaSpline spline = GetSpline(shape); float cx = 0.0f; float cy = 0.0f; float r = 0.0f; for (int i = 0; i < node.values.Count; i++) { MegaXMLValue val = node.values[i]; switch (val.name) { case "cx": cx = float.Parse(val.value); break; case "cy": cy = float.Parse(val.value); break; case "r": r = float.Parse(val.value); break; } } float vector = CIRCLE_VECTOR_LENGTH * r; spline.knots.Clear(); for (int ix = 0; ix < 4; ++ix) { float angle = (Mathf.PI * 2.0f) * (float)ix / (float)4; float sinfac = Mathf.Sin(angle); float cosfac = Mathf.Cos(angle); Vector3 p = new Vector3((cosfac * r) + cx, 0.0f, (sinfac * r) + cy); Vector3 rotvec = new Vector3(sinfac * vector, 0.0f, -cosfac * vector); //spline.AddKnot(p, p + rotvec, p - rotvec); AddKnot(spline, p, p + rotvec, p - rotvec, shape.axis); } spline.closed = true; }
public void ParseNode(MegaXMLNode node) { MegaShapeOSMNode onode = new MegaShapeOSMNode(); for (int i = 0; i < node.values.Count; i++) { MegaXMLValue val = node.values[i]; switch (val.name) { case "id": //Debug.Log("id " + val.value); onode.id = ulong.Parse(val.value); break; case "lat": onode.pos.x = float.Parse(val.value); break; case "lon": onode.pos.z = float.Parse(val.value); break; } } osmnodes.Add(onode); }
void ParsePath(MegaXMLNode node, MegaShape shape) { Vector3 cp = Vector3.zero; Vector2 cP1; Vector2 cP2; char[] charSeparators = new char[] { ',', ' ' }; MegaSpline spline = null; MegaKnot k; string[] coord; for (int i = 0; i < node.values.Count; i++) { MegaXMLValue val = node.values[i]; //Debug.Log("val name " + val.name); switch (val.name) { case "d": #if UNITY_FLASH || UNITY_WP8 || UNITY_METRO string[] coordinates = null; //string.Split(val.value, @"(?=[MmLlCcSsZzHhVv])"); #else string[] coordinates = Regex.Split(val.value, @"(?=[MmLlCcSsZzHhVv])"); #endif for (int j = 0; j < coordinates.Length; j++) { if (coordinates[j].Length > 0) { string v = coordinates[j].Substring(1); if (v != null && v.Length > 0) { //v = v.Replace("-", ",-"); while (v.Length > 0 && (v[0] == ',' || v[0] == ' ')) { v = v.Substring(1); } } switch (coordinates[j][0]) { case 'Z': case 'z': if (spline != null) { spline.closed = true; #if false Vector3 delta1 = spline.knots[0].outvec - spline.knots[0].p; spline.knots[0].invec = spline.knots[0].p - delta1; if (spline.knots[0].p == spline.knots[spline.knots.Count - 1].p) { spline.knots.Remove(spline.knots[spline.knots.Count - 1]); } #else int kc = spline.knots.Count - 1; spline.knots[0].invec = spline.knots[kc].invec; spline.knots.Remove(spline.knots[kc]); #endif } break; case 'M': spline = GetSpline(shape); spline.knots.Clear(); cp = ParseV2Split(v, 0); k = new MegaKnot(); k.p = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.invec = k.p; k.outvec = k.p; spline.knots.Add(k); break; case 'm': spline = GetSpline(shape); spline.knots.Clear(); //Debug.Log("v: " + v); coord = v.Split(" "[0]); //Debug.Log("m coords " + coord.Length); //Debug.Log("v2 " + coord[0]); for (int k0 = 0; k0 < coord.Length - 1; k0 = k0 + 1) { //Debug.Log("v2 " + coord[k0]); Vector3 cp1 = ParseV2Split(coord[k0], 0); //Debug.Log("cp1 " + cp1); cp.x += cp1.x; //ParseV2Split(coord[k0], 0); // ParseV2(coord, k0); cp.y += cp1.y; k = new MegaKnot(); k.p = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.invec = k.p; k.outvec = k.p; spline.knots.Add(k); } #if false Vector3 cp1 = ParseV2Split(v, 0); cp.x += cp1.x; cp.y += cp1.y; k = new MegaKnot(); k.p = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.invec = k.p; k.outvec = k.p; spline.knots.Add(k); #endif break; case 'l': //coord = v.Split(","[0]); coord = v.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries); for (int k0 = 0; k0 < coord.Length; k0 = k0 + 2) { cp += ParseV2(coord, k0); } spline.knots[spline.knots.Count - 1].outvec = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k = new MegaKnot(); k.p = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.invec = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.outvec = k.p - (k.invec - k.p); spline.knots.Add(k); break; case 'c': coord = v.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries); for (int k2 = 0; k2 < coord.Length; k2 += 6) { cP1 = cp + ParseV2(coord, k2); cP2 = cp + ParseV2(coord, k2 + 2); cp += ParseV2(coord, k2 + 4); spline.knots[spline.knots.Count - 1].outvec = SwapAxis(new Vector3(cP1.x, 0.0f, cP1.y), shape.axis); k = new MegaKnot(); k.p = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.invec = SwapAxis(new Vector3(cP2.x, 0.0f, cP2.y), shape.axis); k.outvec = k.p - (k.invec - k.p); spline.knots.Add(k); } break; case 'L': //coord = v.Split(","[0]); coord = v.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries); //Debug.Log("v " + v); //Debug.Log("coords " + coord.Length); for (int k3 = 0; k3 < coord.Length; k3 = k3 + 2) { cp = ParseV2(coord, k3); } spline.knots[spline.knots.Count - 1].outvec = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k = new MegaKnot(); k.p = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.invec = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.outvec = k.p - (k.invec - k.p); spline.knots.Add(k); break; case 'v': //Debug.Log("v: " + v); coord = v.Split(","[0]); for (int k4 = 0; k4 < coord.Length; k4++) { cp.y += float.Parse(coord[k4]); } spline.knots[spline.knots.Count - 1].outvec = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k = new MegaKnot(); k.p = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.invec = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.outvec = k.p - (k.invec - k.p); spline.knots.Add(k); break; case 'V': //coord = v.Split(","[0]); coord = v.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries); for (int k9 = 0; k9 < coord.Length; k9++) { cp.y = float.Parse(coord[k9]); } spline.knots[spline.knots.Count - 1].outvec = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k = new MegaKnot(); k.p = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.invec = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.outvec = k.p - (k.invec - k.p); spline.knots.Add(k); break; case 'h': //coord = v.Split(","[0]); coord = v.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries); for (int k5 = 0; k5 < coord.Length; k5++) { cp.x += float.Parse(coord[k5]); } spline.knots[spline.knots.Count - 1].outvec = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k = new MegaKnot(); k.p = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.invec = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.outvec = k.p - (k.invec - k.p); spline.knots.Add(k); break; case 'H': coord = v.Split(","[0]); for (int k6 = 0; k6 < coord.Length; k6++) { cp.x = float.Parse(coord[k6]); } spline.knots[spline.knots.Count - 1].outvec = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k = new MegaKnot(); k.p = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.invec = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.outvec = k.p - (k.invec - k.p); spline.knots.Add(k); break; case 'S': //coord = v.Split(","[0]); coord = v.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries); for (int k7 = 0; k7 < coord.Length; k7 = k7 + 4) { cp = ParseV2(coord, k7 + 2); cP1 = ParseV2(coord, k7); k = new MegaKnot(); k.p = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.invec = SwapAxis(new Vector3(cP1.x, 0.0f, cP1.y), shape.axis); k.outvec = k.p - (k.invec - k.p); spline.knots.Add(k); } break; case 's': coord = v.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries); for (int k7 = 0; k7 < coord.Length; k7 = k7 + 4) { cP1 = cp + ParseV2(coord, k7); cp += ParseV2(coord, k7 + 2); k = new MegaKnot(); k.p = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.invec = SwapAxis(new Vector3(cP1.x, 0.0f, cP1.y), shape.axis); k.outvec = k.p - (k.invec - k.p); spline.knots.Add(k); } break; case 'C': //Debug.Log("v " + v); coord = v.Split(charSeparators, StringSplitOptions.RemoveEmptyEntries); //Debug.Log("crds " + coord.Length); for (int k2 = 0; k2 < coord.Length; k2 += 6) { cP1 = ParseV2(coord, k2); cP2 = ParseV2(coord, k2 + 2); cp = ParseV2(coord, k2 + 4); spline.knots[spline.knots.Count - 1].outvec = SwapAxis(new Vector3(cP1.x, 0.0f, cP1.y), shape.axis); k = new MegaKnot(); k.p = SwapAxis(new Vector3(cp.x, 0.0f, cp.y), shape.axis); k.invec = SwapAxis(new Vector3(cP2.x, 0.0f, cP2.y), shape.axis); k.outvec = k.p - (k.invec - k.p); spline.knots.Add(k); } break; default: break; } } } break; } } }
void ParseEllipse(MegaXMLNode node, MegaShape shape) { MegaSpline spline = GetSpline(shape); float cx = 0.0f; float cy = 0.0f; float rx = 0.0f; float ry = 0.0f; for (int i = 0; i < node.values.Count; i++) { MegaXMLValue val = node.values[i]; switch (val.name) { case "cx": cx = float.Parse(val.value); break; case "cy": cy = float.Parse(val.value); break; case "rx": rx = float.Parse(val.value); break; case "ry": ry = float.Parse(val.value); break; } } ry = Mathf.Clamp(ry, 0.0f, float.MaxValue); rx = Mathf.Clamp(rx, 0.0f, float.MaxValue); float radius, xmult, ymult; if (ry < rx) { radius = rx; xmult = 1.0f; ymult = ry / rx; } else { if (rx < ry) { radius = ry; xmult = rx / ry; ymult = 1.0f; } else { radius = ry; xmult = ymult = 1.0f; } } float vector = CIRCLE_VECTOR_LENGTH * radius; Vector3 mult = new Vector3(xmult, ymult, 1.0f); for (int ix = 0; ix < 4; ++ix) { float angle = 6.2831853f * (float)ix / 4.0f; float sinfac = Mathf.Sin(angle); float cosfac = Mathf.Cos(angle); Vector3 p = new Vector3(cosfac * radius + cx, 0.0f, sinfac * radius + cy); Vector3 rotvec = new Vector3(sinfac * vector, 0.0f, -cosfac * vector); //spline.AddKnot(Vector3.Scale(p, mult), Vector3.Scale((p + rotvec), mult), Vector3.Scale((p - rotvec), mult)); //, tm); AddKnot(spline, Vector3.Scale(p, mult), Vector3.Scale((p + rotvec), mult), Vector3.Scale((p - rotvec), mult), shape.axis); //, tm); } spline.closed = true; }