65 lines
2.3 KiB
C#
65 lines
2.3 KiB
C#
|
|
using Godot;
|
||
|
|
using System;
|
||
|
|
using System.Linq;
|
||
|
|
using System.Threading.Tasks;
|
||
|
|
|
||
|
|
public static class Projector
|
||
|
|
{
|
||
|
|
public static int[,] Points = new int[1024,512];
|
||
|
|
private static bool _gathered = false;
|
||
|
|
public static void GatherPoints(PlanetHelper helper, int resolutionH = 2048, bool regather = false)
|
||
|
|
{
|
||
|
|
if (!regather && _gathered)
|
||
|
|
return;
|
||
|
|
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]);
|
||
|
|
_gathered = true;
|
||
|
|
file.Close();
|
||
|
|
}
|
||
|
|
|
||
|
|
public static ImageTexture Render(PlanetHelper helper)
|
||
|
|
{
|
||
|
|
var image = Image.CreateEmpty(Points.GetLength(0) + 1, Points.GetLength(1) + 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 ImageTexture.CreateFromImage(image);
|
||
|
|
}
|
||
|
|
}
|