public static Mesh Parse(GeometryCommand[] commands, GeometricObject go, bool backfaceCulling, Material mat) { List <Vertex> verts = new List <Vertex>(); Vertex wipVertex = new Vertex(); List <Triangle> triangles = new List <Triangle>(); GeometryCommand.PrimitiveType primitive = GeometryCommand.PrimitiveType.Triangles; int lastVertexCount = 0; Texture tex = mat.GetTexture("_Tex0"); float wFactor = 64f, hFactor = 64f; if (tex != null) { wFactor = tex.width; hFactor = tex.height; } Mesh mesh = new Mesh(); bool parsing = true; foreach (GeometryCommand c in commands) { switch (c.Command) { case GeometryCommand.Type.TEXCOORD: wipVertex.uv = new Vector2(c.u / c.scale / wFactor, c.v / c.scale / hFactor); break; case GeometryCommand.Type.COLOR: wipVertex.color = new Color(c.r / c.scale, c.g / c.scale, c.b / c.scale, 1f); break; case GeometryCommand.Type.NORMAL: wipVertex.normal = new Vector3(c.x / c.scale, c.y / c.scale, c.z / c.scale); break; case GeometryCommand.Type.VTX_XY: wipVertex.x = c.x / c.scale; wipVertex.y = c.y / c.scale; verts.Add(wipVertex.Clone()); break; case GeometryCommand.Type.VTX_XZ: wipVertex.x = c.x / c.scale; wipVertex.z = c.z / c.scale; verts.Add(wipVertex.Clone()); break; case GeometryCommand.Type.VTX_YZ: wipVertex.y = c.y / c.scale; wipVertex.z = c.z / c.scale; verts.Add(wipVertex.Clone()); break; case GeometryCommand.Type.VTX_16: wipVertex.x = c.x / c.scale; wipVertex.y = c.y / c.scale; wipVertex.z = c.z / c.scale; verts.Add(wipVertex.Clone()); break; case GeometryCommand.Type.BEGIN_VTXS: AddTriangles(triangles, verts.Count, lastVertexCount, primitive); primitive = c.Primitive; /*if (primitive != GeometryCommand.PrimitiveType.Triangles && primitive != GeometryCommand.PrimitiveType.TriangleStrip) { * Debug.LogError("QUADS???? FUUUU! " + primitive); * }*/ lastVertexCount = verts.Count; break; case GeometryCommand.Type.END_VTXS: break; default: Debug.LogError("Unparsed command: " + c.Command); break; } if (!parsing) { break; } } AddTriangles(triangles, verts.Count, lastVertexCount, primitive); mesh.vertices = verts.Select(v => new Vector3(v.x / go.ScaleFactor, v.z / go.ScaleFactor, v.y / go.ScaleFactor)).ToArray(); mesh.normals = verts.Select(v => new Vector3(v.normal.x, v.normal.z, v.normal.y)).ToArray(); mesh.SetUVs(0, verts.Select(v => new Vector3(v.uv.x, v.uv.y, 1f)).ToList()); mesh.SetColors(verts.Select(v => new Color(v.color.r, v.color.g, v.color.b, v.color.a)).ToList()); mesh.triangles = triangles.SelectMany(t => backfaceCulling ? new int[] { t.v1, t.v2, t.v3 } : new int[] { t.v1, t.v2, t.v3, t.v2, t.v1, t.v3 }).ToArray(); mesh.RecalculateNormals(); return(mesh); }
public static Vector3[] ParseVerticesOnly(GeometryCommand[] commands, GeometricObject go) { List <Vertex> verts = new List <Vertex>(); Vertex wipVertex = new Vertex(); List <Triangle> triangles = new List <Triangle>(); GeometryCommand.PrimitiveType primitive = GeometryCommand.PrimitiveType.Triangles; int lastVertexCount = 0; Mesh mesh = new Mesh(); bool parsing = true; foreach (GeometryCommand c in commands) { switch (c.Command) { case GeometryCommand.Type.VTX_XY: wipVertex.x = c.x / c.scale; wipVertex.y = c.y / c.scale; verts.Add(wipVertex.Clone()); break; case GeometryCommand.Type.VTX_XZ: wipVertex.x = c.x / c.scale; wipVertex.z = c.z / c.scale; verts.Add(wipVertex.Clone()); break; case GeometryCommand.Type.VTX_YZ: wipVertex.y = c.y / c.scale; wipVertex.z = c.z / c.scale; verts.Add(wipVertex.Clone()); break; case GeometryCommand.Type.VTX_16: wipVertex.x = c.x / c.scale; wipVertex.y = c.y / c.scale; wipVertex.z = c.z / c.scale; verts.Add(wipVertex.Clone()); break; case GeometryCommand.Type.BEGIN_VTXS: AddTriangles(triangles, verts.Count, lastVertexCount, primitive); primitive = c.Primitive; /*if (primitive != GeometryCommand.PrimitiveType.Triangles && primitive != GeometryCommand.PrimitiveType.TriangleStrip) { * Debug.LogError("QUADS???? FUUUU! " + primitive); * }*/ lastVertexCount = verts.Count; break; case GeometryCommand.Type.END_VTXS: break; } if (!parsing) { break; } } return(verts.Select(v => new Vector3(v.x / go.ScaleFactor, v.z / go.ScaleFactor, v.y / go.ScaleFactor)).ToArray()); }
/// <summary> /// calculates surrounding area of given visible area /// starts in center and moves by step = patchSize /// </summary> /// <param name="extraPatchCount">how many extra patches will be contained</param> /// <returns></returns> public Area GetSurroundingAreaOf(Vertex centerOnGrid,Area visibleArea,int patchSize, int extraPatchCount) { Vertex botLeft; Vertex topRight; if (!visibleArea.Contains(centerOnGrid) || patchSize <= 0) { Debug.Log("centerOnGrid not in visible area: " + centerOnGrid); botLeft = new Vertex(centerOnGrid.x - patchSize, centerOnGrid.z - patchSize); topRight = new Vertex(centerOnGrid.x + patchSize, centerOnGrid.z + patchSize); return new Area(botLeft, topRight); } //get most left coordinate Vertex pointLeft = centerOnGrid.Clone(); ; while (visibleArea.Contains(pointLeft)){ pointLeft.x -= patchSize; } //get most bot coordinate Vertex pointBot = centerOnGrid.Clone(); ; while (visibleArea.Contains(pointBot)) { pointBot.z -= patchSize; } //get most right coordinate Vertex pointRight = centerOnGrid.Clone(); ; while (visibleArea.Contains(pointRight)) { pointRight.x += patchSize; } //get most top coordinate Vertex pointTop = centerOnGrid.Clone(); ; while (visibleArea.Contains(pointTop)) { pointTop.z += patchSize; } botLeft = new Vertex(pointLeft.x - extraPatchCount * patchSize, pointBot.z - extraPatchCount * patchSize); topRight = new Vertex(pointRight.x + extraPatchCount * patchSize, pointTop.z + extraPatchCount * patchSize); return new Area(botLeft, topRight); }