RetroQUEST/scripts/libretro_loader.gd

109 lines
3.4 KiB
GDScript3
Raw Normal View History

2024-12-10 12:59:49 +00:00
extends Node
2024-12-13 03:19:48 +00:00
@onready var sub_viewport = $room/SubViewport
@onready var texture_rect = $room/SubViewport/TextureRect
2024-12-10 12:59:49 +00:00
2024-12-13 03:19:48 +00:00
var current_core : Object = null # The emulator core (passed dynamically)
var current_rom : String = "" # Initialize to an empty string
2024-12-10 12:59:49 +00:00
2024-12-13 03:19:48 +00:00
func start_emulation(core_path: String, rom_path: String) -> bool:
2024-12-27 01:53:34 +00:00
print("[libretro_loader] Starting emulation with core: ", core_path, ", ROM: ", rom_path)
2024-12-13 03:19:48 +00:00
2024-12-18 06:48:50 +00:00
if not core_path:
2024-12-27 01:53:34 +00:00
push_error("[libretro_loader] Core path is missing.")
2024-12-18 06:48:50 +00:00
return false
if not rom_path:
2024-12-27 01:53:34 +00:00
push_error("[libretro_loader] ROM path is missing.")
2024-12-13 03:19:48 +00:00
return false
2024-12-10 12:59:49 +00:00
2024-12-13 03:19:48 +00:00
# Load the core (emulator)
2024-12-27 01:53:34 +00:00
print("[libretro_loader] Loading core...")
2024-12-13 03:19:48 +00:00
current_core = load(core_path)
if not current_core:
2024-12-27 01:53:34 +00:00
push_error("[libretro_loader] Failed to load core: " + core_path)
2024-12-13 03:19:48 +00:00
return false
2024-12-10 12:59:49 +00:00
2024-12-13 03:19:48 +00:00
current_core.initialize()
2024-12-27 01:53:34 +00:00
print("[libretro_loader] Core initialized.")
2024-12-10 12:59:49 +00:00
2024-12-13 03:19:48 +00:00
# Load the ROM
2024-12-27 01:53:34 +00:00
print("[libretro_loader] Checking ROM file...")
2024-12-13 03:19:48 +00:00
if not FileAccess.file_exists(rom_path):
2024-12-27 01:53:34 +00:00
push_error("[libretro_loader] ROM not found: " + rom_path)
2024-12-13 03:19:48 +00:00
return false
2024-12-27 01:53:34 +00:00
print("[libretro_loader] ROM file exists.")
2024-12-10 12:59:49 +00:00
2024-12-13 03:19:48 +00:00
var file = FileAccess.open(rom_path, FileAccess.READ)
if not file:
push_error("Error opening ROM: " + rom_path)
return false
print("ROM file opened successfully.")
2024-12-10 12:59:49 +00:00
2024-12-13 03:19:48 +00:00
var rom_data = file.get_buffer(file.get_length())
file.close()
2024-12-27 01:53:34 +00:00
print("[libretro_loader] ROM data loaded successfully.")
2024-12-10 12:59:49 +00:00
2024-12-13 03:19:48 +00:00
if not current_core.load_game(rom_data):
2024-12-27 01:53:34 +00:00
push_error("[libretro_loader] Failed to load ROM: " + rom_path)
2024-12-13 03:19:48 +00:00
return false
2024-12-27 01:53:34 +00:00
print("[libretro_loader] ROM loaded successfully.")
2024-12-13 03:19:48 +00:00
current_rom = rom_path
2024-12-27 01:53:34 +00:00
print("[libretro_loader] Core and ROM loaded successfully.")
2024-12-13 03:19:48 +00:00
2024-12-18 06:48:50 +00:00
# Ensure SubViewport is ready
2024-12-13 03:19:48 +00:00
sub_viewport.render_target_update_mode = SubViewport.UPDATE_ALWAYS
2024-12-18 06:48:50 +00:00
# Wait for the SubViewport to initialize (up to 3 seconds)
var max_wait_time = 3.0 # Maximum wait time in seconds
var elapsed_time = 0.0
while not sub_viewport.get_texture() and elapsed_time < max_wait_time:
await get_tree().idle_frame # Waits for the next frame
elapsed_time += get_process_delta_time()
if not sub_viewport.get_texture():
2024-12-27 01:53:34 +00:00
push_error("[libretro_loader] Error: SubViewport texture is not ready after waiting.")
2024-12-13 03:19:48 +00:00
return false
2024-12-18 06:48:50 +00:00
texture_rect.texture = sub_viewport.get_texture()
2024-12-27 01:53:34 +00:00
print("[libretro_loader] SubViewport texture assigned successfully.")
2024-12-13 03:19:48 +00:00
return true
2024-12-10 12:59:49 +00:00
func _process(delta):
2024-12-13 03:19:48 +00:00
"""
Dynamically updates the TextureRect's texture during runtime.
"""
if current_core:
current_core.run()
var frame_data = current_core.get_frame_buffer()
if frame_data:
var frame_width = current_core.get_frame_width()
var frame_height = current_core.get_frame_height()
if frame_width > 0 and frame_height > 0:
var image = Image.create_from_data(
frame_width,
frame_height,
false,
Image.FORMAT_RGB8,
frame_data
)
var texture = ImageTexture.create_from_image(image)
texture_rect.texture = texture
func _ready():
"""
Initializes the SubViewport and TextureRect.
"""
2024-12-27 01:53:34 +00:00
print("[libretro_loader] _ready: Initializing SubViewport and TextureRect.")
2024-12-13 03:19:48 +00:00
if sub_viewport and texture_rect:
print("SubViewport and TextureRect initialized successfully.")
else:
push_error("Error: SubViewport or TextureRect is missing.")
# Ensure SubViewport always renders
sub_viewport.render_target_update_mode = SubViewport.UPDATE_ALWAYS
2024-12-27 01:53:34 +00:00
print("[libretro_loader] SubViewport set to always update.")