public void OnEnable() { this.editor = this; this.editorTarget = (TerrainAlign)this.target; // get the sceneview window. don't focus it, there's an occasional bug where it would get recreated and then you have multiple ones sceneView = EditorWindow.GetWindow <SceneView>("Scene View Window", false); // try getting a terrain in case there is none if (!editorTarget.settings.terrain) { editorTarget.settings.terrain = UnityEngine.Object.FindObjectOfType <Terrain>(); } meshProjector = new MeshProjector(editorTarget.settings, editorTarget.gameObject); meshProjector.OnEnable(); }
/// <summary> /// Generate icon image for brick using MeshProjector. /// </summary> /// <param name="brick">Brick.</param> /// <param name="filePath">File path.</param> /// <param name="size">Image size.</param> public static void GenerateIcon(Brick brick, string filePath, int size) { //generate texture MeshProjector projector = new MeshProjector(new Vector3(-1000, 0, 0), 31); var texture = projector.Project(brick, size); //convert texture RenderTexture.active = texture; Texture2D texture2D = new Texture2D(texture.width, texture.height); texture2D.ReadPixels(new Rect(0, 0, texture.width, texture.height), 0, 0); RenderTexture.active = null; //save texture as png image var image = ImageConversion.EncodeToPNG(texture2D); System.IO.File.WriteAllBytes(filePath, image); }
public void SaveResult(MeshProjector proj, Stream stream) { using (var io = new StreamWriter(stream)) { io.WriteLine("# Experimental mesh projection output."); io.WriteLine("s 1"); io.WriteLine("o projected"); foreach (var vert in proj.Vertices) { io.WriteLine("v " + vert.Position.X.ToString(CultureInfo.InvariantCulture) + " " + vert.Position.Y.ToString(CultureInfo.InvariantCulture) + " " + vert.Position.Z.ToString(CultureInfo.InvariantCulture)); } foreach (var vert in proj.Vertices) { io.WriteLine("vt " + vert.TexCoords[0].ToString(CultureInfo.InvariantCulture) + " " + (1 - vert.TexCoords[1]).ToString(CultureInfo.InvariantCulture)); } io.Write("f "); var baseInd = 1; var ticker = 0; var j = 0; foreach (var ind in proj.Indices) { var i = ind + baseInd; io.Write(i + "/" + i + " "); if (++ticker == 3) { io.WriteLine(""); if (j < proj.Indices.Count - 1) { io.Write("f "); } ticker = 0; } j++; } } }
public void TestHeightmapCircle() { OBJ heightmap, circle; using (var file = File.OpenRead(@"C:\Users\Rhys\Documents\planetest.obj")) { heightmap = new OBJ(file); } using (var file = File.OpenRead(@"C:\Users\Rhys\Documents\circletest.obj")) { circle = new OBJ(file); } var baseMesh = new List <BaseMeshTriangle>(); var projMesh = new List <MeshTriangle>(); foreach (var group in heightmap.FacesByObjgroup) { var otri = new List <Vector3>(); foreach (var tri in group.Value) { otri.Add(heightmap.Vertices[tri[0] - 1]); if (otri.Count == 3) { baseMesh.Add(new BaseMeshTriangle() { Vertices = otri.ToArray() }); otri = new List <Vector3>(); } } } foreach (var group in circle.FacesByObjgroup) { var otri = new List <Vector3>(); var otc = new List <float[]>(); foreach (var tri in group.Value) { otri.Add(circle.Vertices[tri[0] - 1]); otc.Add(new float[] { circle.TextureCoords[tri[1] - 1].X, circle.TextureCoords[tri[1] - 1].Y }); if (otri.Count == 3) { projMesh.Add(new MeshTriangle() { Vertices = otri.ToArray(), TexCoords = otc.ToArray() }); otri = new List <Vector3>(); otc = new List <float[]>(); } } } var proj = new MeshProjector(baseMesh, projMesh); proj.Project(); //write result using (var file = File.Open(@"C:\Users\Rhys\Documents\test.obj", FileMode.Create)) { SaveResult(proj, file); } }
public void TestCombo() { var map = BasicMap(); var timer = new System.Diagnostics.Stopwatch(); timer.Start(); var heightmap = new SimplifiedHeightmap(512, map); heightmap.BuildSecondDerivative(); heightmap.GenerateFullTree(); heightmap.GenerateMesh(); timer.Stop(); Console.WriteLine("!!! Heightmap took " + timer.ElapsedMilliseconds + "ms."); timer.Restart(); var svg = new SVGParser(File.ReadAllText(@"C:\Users\Rhys\Documents\roads.svg")); var paths = svg.ToLinePaths(); var geom = new RoadGeometry(paths, TS1RoadTemplates.OLD_TOWN_DEFAULT_TEMPLATES); geom.GenerateIntersections(); geom.GenerateRoadGeometry(); timer.Stop(); Console.WriteLine("!!! Road took " + timer.ElapsedMilliseconds + "ms."); timer.Restart(); List <MeshProjector> projectors = new List <MeshProjector>(); foreach (var pair in geom.Meshes) { var mesh = pair.Value; var baseTris = new List <BaseMeshTriangle>(); for (int i = 0; i < heightmap.Indices.Count; i += 3) { baseTris.Add(new BaseMeshTriangle() { Vertices = new Vector3[] { heightmap.Vertices[heightmap.Indices[i]], heightmap.Vertices[heightmap.Indices[i + 1]], heightmap.Vertices[heightmap.Indices[i + 2]], } }); } var projTris = new List <MeshTriangle>(); for (int i = 0; i < mesh.Indices.Count; i += 3) { projTris.Add(new MeshTriangle() { Vertices = new Vector3[] { mesh.Vertices[mesh.Indices[i]].Position, mesh.Vertices[mesh.Indices[i + 1]].Position, mesh.Vertices[mesh.Indices[i + 2]].Position, }, TexCoords = new float[][] { mesh.Vertices[mesh.Indices[i]].TexCoords, mesh.Vertices[mesh.Indices[i + 1]].TexCoords, mesh.Vertices[mesh.Indices[i + 2]].TexCoords, } }); } var proj = new MeshProjector(baseTris, projTris); proj.Project(); projectors.Add(proj); } timer.Stop(); Console.WriteLine("!!! Projection took " + timer.ElapsedMilliseconds + "ms."); //write result using (var file = File.Open(@"C:\Users\Rhys\Documents\combined.obj", FileMode.Create)) { SaveResults(projectors, file); } }
public DebugView(MeshProjector meshProjector) { this.meshProjector = meshProjector; }