projection to png saving

This commit is contained in:
Aada 2026-03-03 08:51:52 +02:00
parent aefc76c178
commit 2ace157573
3 changed files with 112 additions and 34 deletions

View file

@ -2,6 +2,7 @@
using Godot;
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using Godot.Collections;
@ -21,6 +22,8 @@ public partial class Main : Control
[Export] private MeshInstance3D _meshInstance;
[Export] private Node3D World;
[Export] private TextureRect _textureRect;
[Export] private Gradient _gradient;
private PlanetHelper.VertexData? _vertex = null;
private PlanetHelper.PlateData? _plate = null;
@ -31,6 +34,7 @@ public partial class Main : Control
{
_planetHelper = new PlanetHelper(_meshInstance, _textureRect);
UpdateStats();
Projector.GatherPoints(_planetHelper, int.Parse(GetNode<LineEdit>("%Resolution").Text));
}
private const float RayLength = 1000.0f;
@ -147,6 +151,47 @@ public partial class Main : Control
_planetHelper.AutoRun = true;
}
public void SaveImageValue()
{
Image img = Projector.RenderImage(_planetHelper);
DirectoryInfo d = new DirectoryInfo(ProjectSettings.GlobalizePath("user://"));
FileInfo[] files = d.GetFiles("Projection-*.png");
int max = 0;
foreach (FileInfo file in files)
{
int number = int.Parse(file.Name.Split('-')[1]);
max = Math.Max(max, number);
}
max += 1;
img.SavePng(ProjectSettings.GlobalizePath($"user://ProjectionValue-{max}-{Projector.Points.GetLength(0)}.png"));
}
public void SaveImageColor()
{
Image img = Projector.RenderImage(_planetHelper);
Vector2 size = img.GetSize();
for (int x = 0; x < size.X; x++)
{
for (int y = 0; y < size.Y; y++)
{
img.SetPixel(x,y, _gradient.Sample(img.GetPixel(x,y).R));
}
}
DirectoryInfo d = new DirectoryInfo(ProjectSettings.GlobalizePath("user://"));
FileInfo[] files = d.GetFiles("ProjectionColor-*.png");
int max = 0;
foreach (FileInfo file in files)
{
int number = int.Parse(file.Name.Split('-')[1]);
max = Math.Max(max, number);
}
max += 1;
img.SavePng(ProjectSettings.GlobalizePath($"user://Projection-{max}-{Projector.Points.GetLength(0)}.png"));
}
public void OpenFolder()
{
OS.ShellShowInFileManager(ProjectSettings.GlobalizePath("user://"));
}
public void ResolutionChange(String change)
{
change = new string(change.Where(c => char.IsDigit(c)).ToArray());

View file

@ -5,7 +5,7 @@ using System.Threading.Tasks;
public static class Projector
{
public static int[,] Points = new int[1024,512];
public static int[,] Points = new int[512,256];
public static void GatherPoints(PlanetHelper helper, int resolutionH = 2048)
{
Points = new int[resolutionH,resolutionH / 2];
@ -45,6 +45,11 @@ public static class Projector
}
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);;
@ -55,6 +60,7 @@ public static class Projector
image.SetPixel(x,y, helper.Mdt.GetVertexColor(Points[x,y]));
}
}
return ImageTexture.CreateFromImage(image);
return image;
}
}