Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Changed Textures to be assigned by waypoint texture ID #319

Merged
merged 11 commits into from
Aug 22, 2024
48 changes: 48 additions & 0 deletions FileHandler.gd
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,51 @@ static func create_directory_if_missing(path: String):
var success = dir.make_dir(path)
if success != OK:
print("Error: Could not create data folder:", path)

static func find_file_duplicate(directory_path: String, target_name: String, target_content: PoolByteArray, relative_path: String):
var dir = Directory.new()
if dir.open(directory_path) == OK:
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As discussed offline, switch this logic so you can unindent the code below.

dir.list_dir_begin(true)
var file_name = dir.get_next()
while file_name != "":
var full_path = directory_path.plus_file(file_name)
var current_relative_path = relative_path.plus_file(file_name)
if dir.current_is_dir():
var found_path = find_file_duplicate(full_path, target_name, target_content, current_relative_path)
if found_path != "":
dir.list_dir_end()
return found_path
if file_name == target_name:
var file = File.new()
file.open(full_path, File.READ)
var file_content = file.get_buffer(file.get_len())
file.close()
if file_content == target_content:
dir.list_dir_end()
return current_relative_path
file_name = dir.get_next()
return ""
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

return null from this function when a file is not found instead of an empty string.


static func find_image_duplicates(file_path: String, destintation_dir: String) -> String:
# These are all supported file types in Godot that are not supported
# by other marker programs. "jpg", "jpeg", "bmp", "tga"
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need this comment explaining what formats godot supports.

var file_name: String = file_path.get_file()
var file_extension: String = file_name.get_extension().to_lower()
if not file_extension == "png":
print("File is not a supported image type. Please choose a png")
return ""

var file: File = File.new()
file.open(file_path, File.READ)
var file_content = file.get_buffer(file.get_len())
var relative_path = find_file_duplicate(destintation_dir, file_name, file_content, "")
return relative_path


static func copy_file(file_path: String, destination_path: String):
var dir = Directory.new()
var result = dir.copy(file_path, destination_path)
if result == OK:
print("File imported successfully.")
else:
print("Failed to import file.")
3 changes: 0 additions & 3 deletions Icon.gd
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,10 @@ extends Sprite3D

const Waypoint = preload("res://waypoint.gd")

var texture_path
var waypoint: Waypoint.Icon
var category: TreeItem

func set_icon_image(texture_path: String):
self.texture_path = texture_path

var texture_file = File.new()
var image = Image.new()
texture_file.open(texture_path, File.READ)
Expand Down
81 changes: 56 additions & 25 deletions Spatial.gd
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ var edit_panel_open: bool = false

# This is the path to the texture that will be used for the next created 3d-path
# object or icon object in the UI
var next_texture_path: String = ""
var next_texture_id: int = 0

# A pointer to the trail object that any new nodes should be appended to. If
# the value is null then a new trail will be created the next time a trail point
Expand Down Expand Up @@ -343,11 +343,19 @@ func decode_context_packet(spb: StreamPeerBuffer):

if self.map_id != old_map_id:
print("New Map")
var old_textue_path: String = ""
if old_map_id != 0 and not read_hash(old_map_id) == make_hash(self.waypoint_data.to_bytes()):
print("Saving Old Map")
old_textue_path = self.waypoint_data.get_textures()[self.next_texture_id]
AsherGlick marked this conversation as resolved.
Show resolved Hide resolved
save_map_data(old_map_id)
print("Loading New Map")
load_waypoint_markers(self.map_id)
if old_textue_path != "":
self.next_texture_id = get_texture_index(old_textue_path)
if self.next_texture_id == -1:
self.waypoint_data.add_textures().set_filepath(old_textue_path)
self.next_texture_id = self.waypoint_data.get_textures().size() - 1
AsherGlick marked this conversation as resolved.
Show resolved Hide resolved


reset_minimap_masks()

Expand Down Expand Up @@ -542,21 +550,11 @@ func _waypoint_categories_to_godot_nodes(item: TreeItem, waypoint_category: Wayp
godot_category2d.visible = category_data.is_visible

for trail in waypoint_category.get_trail():
var texture_id = trail.get_texture_id()
if texture_id == null:
print("Warning: No texture found in " , category_name)
continue
var full_texture_path = self.unsaved_markers_dir + self.waypoint_data.get_textures()[texture_id].get_filepath()
gen_new_trail(full_texture_path, trail, category_item)

gen_new_trail(trail, category_item)

for icon in waypoint_category.get_icon():
var texture_id = icon.get_texture_id()
if texture_id == null:
print("Warning: No texture found in " , category_name)
continue
var full_texture_path = self.unsaved_markers_dir + self.waypoint_data.get_textures()[texture_id].get_filepath()
gen_new_icon(full_texture_path, icon, category_item)
gen_new_icon(icon, category_item)


for category_child in waypoint_category.get_children():
_waypoint_categories_to_godot_nodes(category_item, category_child, godot_category3d, godot_category2d, true)
Expand All @@ -577,14 +575,18 @@ func apply_category_visibility_to_nodes(category_item: TreeItem):
category_data.category2d.visible = category_data.is_visible


func gen_new_trail(texture_path: String, waypoint_trail: Waypoint.Trail, category_item: TreeItem):
func gen_new_trail(waypoint_trail: Waypoint.Trail, category_item: TreeItem) -> Array:
# Create the texture to use from an image file
# TODO: We want to be able to cache this data so that if a texture is used
# by multiple objects we only need to keep ony copy of it in memory. #22.
# TODO: We want to have two copies of each texture in memory one for 2D
# which does not use srgb to render properly, and one for 3D which forces
# srgb to render properly. Issue #23.
# TODO: Search within waypoint data for texture paths instead of input
var texture_id: int = waypoint_trail.get_texture_id()
if texture_id == null:
AsherGlick marked this conversation as resolved.
Show resolved Hide resolved
var category_data = category_item.get_metadata(0)
print("Warning: No texture found in " , category_data.waypoint_category.get_name())
var texture_path: String = self.marker_file_dir + self.waypoint_data.get_textures()[texture_id].get_filepath()
var texture_file = File.new()
var image = Image.new()
if !texture_file.file_exists(texture_path):
Expand All @@ -598,7 +600,6 @@ func gen_new_trail(texture_path: String, waypoint_trail: Waypoint.Trail, categor
texture.create_from_image(image, 22)

var new_trail3d = trail3d_scene.instance()
new_trail3d.texture_path = texture_path # Save the location of the image for later
new_trail3d.waypoint = waypoint_trail
new_trail3d.refresh_mesh()
new_trail3d.set_texture(texture)
Expand All @@ -614,13 +615,18 @@ func gen_new_trail(texture_path: String, waypoint_trail: Waypoint.Trail, categor
new_trail2d.refresh_points()
category_data.category2d.add_trail2d(new_trail2d)

return [new_trail3d, new_trail2d]
return Array([new_trail3d, new_trail2d])
AsherGlick marked this conversation as resolved.
Show resolved Hide resolved

func gen_new_icon(texture_path: String, waypoint_icon: Waypoint.Icon, category_item: TreeItem):
# TODO: Search within waypoint data for texture paths instead of input
func gen_new_icon(waypoint_icon: Waypoint.Icon, category_item: TreeItem):
var texture_id: int = waypoint_icon.get_texture_id()
if texture_id == null:
AsherGlick marked this conversation as resolved.
Show resolved Hide resolved
var category_data = category_item.get_metadata(0)
print("Warning: No texture found in " , category_data.waypoint_category.get_name())
var texture_path: String = self.marker_file_dir + self.waypoint_data.get_textures()[texture_id].get_filepath()
var position = waypoint_icon.get_position()
if position == null:
print("Warning: No position found for icon ", category_item.get_metadata(0).waypoint_category.get_name())
var category_data = category_item.get_metadata(0)
print("Warning: No position found for icon ", category_data.waypoint_category.get_name())
return
var position_vector = Vector3(position.get_x(), position.get_y(), -position.get_z())
var new_icon = icon_scene.instance()
Expand Down Expand Up @@ -779,6 +785,12 @@ func clear_adjustment_nodes():
################################################################################
# Update Waypoint datum
################################################################################
func get_texture_index(path: String) -> int:
for i in self.waypoint_data.get_textures().size():
if path == self.waypoint_data.get_textures()[i].get_filepath():
return i
return -1

func set_icon_position(new_position: Vector3, waypoint_icon: Waypoint.Icon, icon: Sprite3D):
if icon.waypoint != waypoint_icon:
push_error("Desync between Waypoint and Icon")
Expand Down Expand Up @@ -876,6 +888,8 @@ func refresh_trail3d_points(trail3d: Spatial):
func refresh_trail2d_points(trail2d: Line2D):
trail2d.refresh_points()

func toast(message: String):
print(message)

################################################################################
# Signal Functions
Expand Down Expand Up @@ -930,8 +944,23 @@ func _on_ChangeTexture_pressed():
# Set the file that will be used to create a new trail or icon when a new trail
# or icon is created.
################################################################################
func _on_TexturePathOpen_file_selected(path):
self.next_texture_path = path
var temp_image_file_path: String = ""
AsherGlick marked this conversation as resolved.
Show resolved Hide resolved

func _on_TexturePathOpen_file_selected(path: String):
var next_texture_path: String = FileHandler.find_image_duplicates(path, self.marker_file_dir)
AsherGlick marked this conversation as resolved.
Show resolved Hide resolved
if next_texture_path == "":
next_texture_path = "Data".plus_file(path.get_file())
var file = File.new()
if file.file_exists(self.marker_file_dir.plus_file(next_texture_path)):
toast(String(["Error: A different image with the name ", path.get_file(), " has already been imported. Please rename the file and try again."]))
return
FileHandler.copy_file(path, self.marker_file_dir.plus_file(next_texture_path))
var texture_index = get_texture_index(next_texture_path)
if texture_index == -1:
self.waypoint_data.add_textures().set_filepath(next_texture_path)
texture_index = self.waypoint_data.get_textures().size() - 1
self.next_texture_id = texture_index


################################################################################
# Null out the currently active trail so that a new one is created the next time
Expand All @@ -952,7 +981,8 @@ func _on_NewIcon_pressed():
position.set_x(self.player_position.x)
position.set_y(self.player_position.y)
position.set_z(-self.player_position.z)
gen_new_icon(self.next_texture_trail, waypoint_icon, self.currently_active_category)
AsherGlick marked this conversation as resolved.
Show resolved Hide resolved
waypoint_icon.set_texture_id(self.next_texture_id)
gen_new_icon(waypoint_icon, self.currently_active_category)

# A new trail point is created
func _on_NewTrailPoint_pressed():
Expand All @@ -966,7 +996,8 @@ func _on_NewTrailPoint_pressed():
trail_data.add_points_x(self.player_position.x)
trail_data.add_points_y(self.player_position.y)
trail_data.add_points_z(-self.player_position.z)
var new_trails = gen_new_trail(self.next_texture_path, waypoint_trail, self.currently_active_category)
waypoint_trail.set_texture_id(self.next_texture_id)
var new_trails: PoolStringArray = gen_new_trail(waypoint_trail, self.currently_active_category)
self.currently_active_trail3d = new_trails[0]
self.currently_active_trail2d = new_trails[1]
else:
Expand Down
14 changes: 7 additions & 7 deletions Spatial.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -487,16 +487,16 @@ __meta__ = {
}

[node name="TexturePathOpen" type="FileDialog" parent="Control/Dialogs"]
margin_left = 740.978
margin_top = 139.437
margin_right = 1343.98
margin_bottom = 602.437
margin_left = 327.0
margin_top = 97.0
margin_right = 930.0
margin_bottom = 560.0
window_title = "Open a File"
mode = 0
access = 1
access = 2
filters = PoolStringArray( "*.png" )
current_dir = "user://"
current_path = "user://"
current_dir = "/"
current_path = "/"
__meta__ = {
"_edit_use_anchors_": false
}
Expand Down
Loading