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 @@
[ext_resource type="Script" uid="uid://bhpic251bgvgk" path="res://src/Main.cs" id="1_611at"] [ext_resource type="Script" uid="uid://bhpic251bgvgk" path="res://src/Main.cs" id="1_611at"]
[ext_resource type="ArrayMesh" uid="uid://65modei4jwaj" path="res://assets/PlanetBase.obj" id="2_k24pf"] [ext_resource type="ArrayMesh" uid="uid://65modei4jwaj" path="res://assets/PlanetBase.obj" id="2_k24pf"]
[ext_resource type="Gradient" uid="uid://b5l44rktieewe" path="res://resources/planet_gradient.tres" id="2_ygjfp"]
[ext_resource type="Material" uid="uid://c55st036tapeo" path="res://shaders/planet.tres" id="3_ygjfp"] [ext_resource type="Material" uid="uid://c55st036tapeo" path="res://shaders/planet.tres" id="3_ygjfp"]
[ext_resource type="Material" uid="uid://k3teblrpopsb" path="res://shaders/map.tres" id="4_1wiy7"] [ext_resource type="Material" uid="uid://k3teblrpopsb" path="res://shaders/map.tres" id="4_1wiy7"]
@ -35,6 +36,7 @@ _cameraNode = NodePath("TabContainer/Planet/SubViewportContainer/SubViewport/ZaW
_meshInstance = NodePath("TabContainer/Planet/SubViewportContainer/SubViewport/ZaWarudo/Icosphere") _meshInstance = NodePath("TabContainer/Planet/SubViewportContainer/SubViewport/ZaWarudo/Icosphere")
World = NodePath("TabContainer/Planet/SubViewportContainer/SubViewport/ZaWarudo") World = NodePath("TabContainer/Planet/SubViewportContainer/SubViewport/ZaWarudo")
_textureRect = NodePath("TabContainer/Projection") _textureRect = NodePath("TabContainer/Projection")
_gradient = ExtResource("2_ygjfp")
[node name="TabContainer" type="TabContainer" parent="." unique_id=1586027287] [node name="TabContainer" type="TabContainer" parent="." unique_id=1586027287]
layout_mode = 1 layout_mode = 1
@ -98,124 +100,146 @@ theme_override_constants/margin_top = 12
theme_override_constants/margin_right = 12 theme_override_constants/margin_right = 12
theme_override_constants/margin_bottom = 12 theme_override_constants/margin_bottom = 12
[node name="VBoxContainer" type="VBoxContainer" parent="TabContainer/Planet/PanelContainer/MarginContainer" unique_id=654818970] [node name="VBoxContainer2" type="VBoxContainer" parent="TabContainer/Planet/PanelContainer/MarginContainer" unique_id=1788559732]
layout_mode = 2 layout_mode = 2
[node name="HBoxContainer3" type="HBoxContainer" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer" unique_id=1125245293] [node name="VBoxContainer" type="VBoxContainer" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2" unique_id=654818970]
layout_mode = 2
size_flags_vertical = 3
[node name="HBoxContainer3" type="HBoxContainer" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer" unique_id=1125245293]
layout_mode = 2 layout_mode = 2
[node name="Reset" type="Button" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer3" unique_id=662365522] [node name="Reset" type="Button" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer3" unique_id=662365522]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
text = "Reset" text = "Reset"
[node name="Advance" type="Button" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer3" unique_id=1446263017] [node name="Advance" type="Button" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer3" unique_id=1446263017]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
text = "Advance Once" text = "Advance Once"
[node name="AutoRun" type="Button" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer3" unique_id=58920233] [node name="AutoRun" type="Button" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer3" unique_id=58920233]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
text = "Auto Run text = "Auto Run
" "
[node name="HBoxContainer4" type="HBoxContainer" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer" unique_id=1084572184] [node name="HBoxContainer4" type="HBoxContainer" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer" unique_id=1084572184]
layout_mode = 2 layout_mode = 2
[node name="Label" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer4" unique_id=1959611598] [node name="Label" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer4" unique_id=1959611598]
layout_mode = 2 layout_mode = 2
text = "Projection Resolution:" text = "Projection Resolution:"
[node name="Resolution" type="LineEdit" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer4" unique_id=1285940001] [node name="Resolution" type="LineEdit" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer4" unique_id=1285940001]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
text = "512" text = "512"
max_length = 5 max_length = 5
[node name="HSeparator" type="HSeparator" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer" unique_id=1862016318] [node name="HSeparator" type="HSeparator" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer" unique_id=1862016318]
layout_mode = 2 layout_mode = 2
[node name="Label2" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer" unique_id=186838891] [node name="Label2" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer" unique_id=186838891]
layout_mode = 2 layout_mode = 2
text = "- Point -" text = "- Point -"
[node name="HBoxContainer2" type="HBoxContainer" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer" unique_id=1345806516] [node name="HBoxContainer2" type="HBoxContainer" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer" unique_id=1345806516]
layout_mode = 2 layout_mode = 2
[node name="Margin" type="VSeparator" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer2" unique_id=1465747985] [node name="Margin" type="VSeparator" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer2" unique_id=1465747985]
layout_mode = 2 layout_mode = 2
[node name="Label" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer2" unique_id=1300757041] [node name="Label" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer2" unique_id=1300757041]
layout_mode = 2 layout_mode = 2
theme_override_colors/font_color = Color(0.4922884, 0.49228835, 0.49228835, 1) theme_override_colors/font_color = Color(0.4922884, 0.49228835, 0.49228835, 1)
text = "Point ID: " text = "Point ID: "
[node name="PointId" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer2" unique_id=1976947082] [node name="PointId" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer2" unique_id=1976947082]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
text = "-1" text = "-1"
[node name="VSeparator1" type="VSeparator" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer2" unique_id=746067660] [node name="VSeparator1" type="VSeparator" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer2" unique_id=746067660]
layout_mode = 2 layout_mode = 2
[node name="Label1" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer2" unique_id=1690535936] [node name="Label1" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer2" unique_id=1690535936]
layout_mode = 2 layout_mode = 2
theme_override_colors/font_color = Color(0.4922884, 0.49228835, 0.49228835, 1) theme_override_colors/font_color = Color(0.4922884, 0.49228835, 0.49228835, 1)
text = "Height:" text = "Height:"
[node name="PointHeight" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer2" unique_id=2115494397] [node name="PointHeight" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer2" unique_id=2115494397]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
text = "-1" text = "-1"
[node name="Label3" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer" unique_id=1412781677] [node name="Label3" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer" unique_id=1412781677]
layout_mode = 2 layout_mode = 2
text = " - Plate -" text = " - Plate -"
[node name="HBoxContainer" type="HBoxContainer" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer" unique_id=471041646] [node name="HBoxContainer" type="HBoxContainer" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer" unique_id=471041646]
layout_mode = 2 layout_mode = 2
[node name="Margin" type="VSeparator" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=1514412102] [node name="Margin" type="VSeparator" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer" unique_id=1514412102]
layout_mode = 2 layout_mode = 2
[node name="Label1" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=1070896445] [node name="Label1" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer" unique_id=1070896445]
layout_mode = 2 layout_mode = 2
theme_override_colors/font_color = Color(0.4922884, 0.49228835, 0.49228835, 1) theme_override_colors/font_color = Color(0.4922884, 0.49228835, 0.49228835, 1)
text = "Plate ID:" text = "Plate ID:"
[node name="PlateId" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=37820014] [node name="PlateId" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer" unique_id=37820014]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
text = "-1" text = "-1"
[node name="VSeparator1" type="VSeparator" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=1699626450] [node name="VSeparator1" type="VSeparator" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer" unique_id=1699626450]
layout_mode = 2 layout_mode = 2
[node name="Label2" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=288487629] [node name="Label2" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer" unique_id=288487629]
layout_mode = 2 layout_mode = 2
theme_override_colors/font_color = Color(0.4922884, 0.49228835, 0.49228835, 1) theme_override_colors/font_color = Color(0.4922884, 0.49228835, 0.49228835, 1)
text = "Is Landform:" text = "Is Landform:"
[node name="IsLandform" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=2089133484] [node name="IsLandform" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer" unique_id=2089133484]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
text = "unknown" text = "unknown"
[node name="VSeparator2" type="VSeparator" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=75061841] [node name="VSeparator2" type="VSeparator" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer" unique_id=75061841]
layout_mode = 2 layout_mode = 2
[node name="Label3" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=1444405231] [node name="Label3" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer" unique_id=1444405231]
layout_mode = 2 layout_mode = 2
theme_override_colors/font_color = Color(0.4922884, 0.49228835, 0.49228835, 1) theme_override_colors/font_color = Color(0.4922884, 0.49228835, 0.49228835, 1)
text = "Area:" text = "Area:"
[node name="Area" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer" unique_id=849006497] [node name="Area" type="Label" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer" unique_id=849006497]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
text = "0%" text = "0%"
[node name="HBoxContainer5" type="HBoxContainer" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2" unique_id=2066226936]
layout_mode = 2
[node name="SaveValue" type="Button" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/HBoxContainer5" unique_id=1765975441]
layout_mode = 2
size_flags_horizontal = 3
text = "Save Value Image"
[node name="SaveColor" type="Button" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/HBoxContainer5" unique_id=203135614]
layout_mode = 2
size_flags_horizontal = 3
text = "Save Color Image"
[node name="Open Folder" type="Button" parent="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/HBoxContainer5" unique_id=217700409]
layout_mode = 2
size_flags_horizontal = 3
text = "Open Folder"
[node name="Projection" type="TextureRect" parent="TabContainer" unique_id=155743781] [node name="Projection" type="TextureRect" parent="TabContainer" unique_id=155743781]
visible = false visible = false
material = ExtResource("4_1wiy7") material = ExtResource("4_1wiy7")
@ -225,7 +249,10 @@ stretch_mode = 5
metadata/_tab_index = 1 metadata/_tab_index = 1
[connection signal="tab_changed" from="TabContainer" to="." method="Tab"] [connection signal="tab_changed" from="TabContainer" to="." method="Tab"]
[connection signal="pressed" from="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer3/Reset" to="." method="MakeGo"] [connection signal="pressed" from="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer3/Reset" to="." method="MakeGo"]
[connection signal="pressed" from="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer3/Advance" to="." method="Advance"] [connection signal="pressed" from="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer3/Advance" to="." method="Advance"]
[connection signal="pressed" from="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer3/AutoRun" to="." method="AutoRun"] [connection signal="pressed" from="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer3/AutoRun" to="." method="AutoRun"]
[connection signal="text_changed" from="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer4/Resolution" to="." method="ResolutionChange"] [connection signal="text_changed" from="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/VBoxContainer/HBoxContainer4/Resolution" to="." method="ResolutionChange"]
[connection signal="pressed" from="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/HBoxContainer5/SaveValue" to="." method="SaveImageValue"]
[connection signal="pressed" from="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/HBoxContainer5/SaveColor" to="." method="SaveImageColor"]
[connection signal="pressed" from="TabContainer/Planet/PanelContainer/MarginContainer/VBoxContainer2/HBoxContainer5/Open Folder" to="." method="OpenFolder"]

View file

@ -2,6 +2,7 @@
using Godot; using Godot;
using System; using System;
using System.Globalization; using System.Globalization;
using System.IO;
using System.Linq; using System.Linq;
using Godot.Collections; using Godot.Collections;
@ -21,6 +22,8 @@ public partial class Main : Control
[Export] private MeshInstance3D _meshInstance; [Export] private MeshInstance3D _meshInstance;
[Export] private Node3D World; [Export] private Node3D World;
[Export] private TextureRect _textureRect; [Export] private TextureRect _textureRect;
[Export] private Gradient _gradient;
private PlanetHelper.VertexData? _vertex = null; private PlanetHelper.VertexData? _vertex = null;
private PlanetHelper.PlateData? _plate = null; private PlanetHelper.PlateData? _plate = null;
@ -31,6 +34,7 @@ public partial class Main : Control
{ {
_planetHelper = new PlanetHelper(_meshInstance, _textureRect); _planetHelper = new PlanetHelper(_meshInstance, _textureRect);
UpdateStats(); UpdateStats();
Projector.GatherPoints(_planetHelper, int.Parse(GetNode<LineEdit>("%Resolution").Text));
} }
private const float RayLength = 1000.0f; private const float RayLength = 1000.0f;
@ -147,6 +151,47 @@ public partial class Main : Control
_planetHelper.AutoRun = true; _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) public void ResolutionChange(String change)
{ {
change = new string(change.Where(c => char.IsDigit(c)).ToArray()); 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 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) public static void GatherPoints(PlanetHelper helper, int resolutionH = 2048)
{ {
Points = new int[resolutionH,resolutionH / 2]; Points = new int[resolutionH,resolutionH / 2];
@ -45,6 +45,11 @@ public static class Projector
} }
public static ImageTexture Render(PlanetHelper helper) 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);; 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])); image.SetPixel(x,y, helper.Mdt.GetVertexColor(Points[x,y]));
} }
} }
return ImageTexture.CreateFromImage(image);
return image;
} }
} }