using Godot; using System; using System.Linq; using System.Threading.Tasks; public static class Projector { public static int[,] Points = new int[512,256]; public static void GatherPoints(PlanetHelper helper, int resolutionH = 2048) { Points = new int[resolutionH,resolutionH / 2]; string filename = $"user://points-{resolutionH}-{resolutionH / 2}.dat"; if (FileAccess.FileExists(filename)) { var readfile = FileAccess.Open(filename, FileAccess.ModeFlags.Read); for (int x = 0; x < Points.GetLength(0); x++) { for (int y = 0; y < Points.GetLength(1); y++) { Points[x, y] = (int)readfile.Get32(); } } readfile.Close(); return; } Parallel.ForEach(Enumerable.Range(0, Points.GetLength(0)), x => { for (int y = 0; y < Points.GetLength(1); y++) { float yaw = (float)x / Points.GetLength(0) * 360f; float pitch = (float)y / Points.GetLength(1) * 180f; Vector3 point = Vector3.Up; point = point.Rotated(Vector3.Forward, Mathf.DegToRad(pitch)); point = point.Rotated(Vector3.Up, Mathf.DegToRad(yaw)); int index = helper.Octree.SearchNearest(point)?.Id ?? -1; Points[x,y] = index; } }); var file = FileAccess.Open(filename, FileAccess.ModeFlags.Write); for (int x = 0; x < Points.GetLength(0); x++) for (int y = 0; y < Points.GetLength(1); y++) file.Store32((uint)Points[x,y]); file.Close(); } public static ImageTexture Render(PlanetHelper helper) { return ImageTexture.CreateFromImage(RenderImage(helper)); } public static Image RenderImage(PlanetHelper helper) { var image = Image.CreateEmpty(Points.GetLength(0), Points.GetLength(1), false, Image.Format.Rgb8);; for (int x = 0; x < Points.GetLength(0); x++) { for (int y = 0; y < Points.GetLength(1); y++) { image.SetPixel(x,y, helper.Mdt.GetVertexColor(Points[x,y])); } } return image; } }