2023-08-16 22:05:16 +09:30
|
|
|
extends Control
|
|
|
|
const hex2font_shader := preload('res://shaders/hex2font.gdshader')
|
|
|
|
|
|
|
|
var hexbox: TextureRect
|
|
|
|
var hexbox_rows: int
|
|
|
|
var hexbox_cols: int
|
|
|
|
|
|
|
|
func make_hexview(data: PoolByteArray, width: int = 256):
|
|
|
|
var hex2font_mat := ShaderMaterial.new()
|
|
|
|
hex2font_mat.shader = hex2font_shader
|
|
|
|
hex2font_mat.set_shader_param('glyph_atlas', SpriteLoader.font_atlas_texture)
|
|
|
|
var hex_img := Image.new()
|
|
|
|
|
|
|
|
var l := len(RomLoader.snes_bytes)
|
|
|
|
self.hexbox_cols = width
|
|
|
|
self.hexbox_rows = l / self.hexbox_cols
|
|
|
|
var remainder = l % self.hexbox_cols
|
|
|
|
if remainder:
|
|
|
|
self.hexbox_rows += 1
|
|
|
|
var padding = PoolByteArray()
|
|
|
|
padding.resize(self.hexbox_cols - remainder)
|
|
|
|
padding.fill(0)
|
|
|
|
data = data + padding
|
|
|
|
hex2font_mat.set_shader_param('tilemap_size', Vector2(self.hexbox_cols, self.hexbox_rows))
|
|
|
|
hex_img.create_from_data(self.hexbox_cols, self.hexbox_rows, false, Image.FORMAT_L8, data)
|
|
|
|
hexbox = TextureRect.new()
|
|
|
|
hexbox.texture = SpriteLoader.texture_from_image(hex_img)
|
|
|
|
hexbox.material = hex2font_mat
|
|
|
|
hexbox.rect_scale *= 4
|
|
|
|
add_child(hexbox)
|
|
|
|
|
|
|
|
func _ready() -> void:
|
|
|
|
ProjectSettings.set_setting('display/window/size/snap_to_integer', false)
|
|
|
|
make_hexview(RomLoader.snes_bytes, 480)
|
|
|
|
|
2023-08-16 23:02:59 +09:30
|
|
|
var fontbox := TextureRect.new()
|
|
|
|
fontbox.texture = SpriteLoader.font_atlas_texture
|
|
|
|
add_child(fontbox)
|
|
|
|
|
2023-08-16 22:05:16 +09:30
|
|
|
func scroll_hexview(rows: int):
|
|
|
|
var current_row: int = (-hexbox.rect_position.y)/4
|
|
|
|
var next_row = current_row + rows
|
|
|
|
if next_row > (hexbox_rows - 270):
|
|
|
|
next_row = hexbox_rows - 270
|
|
|
|
if next_row < 0:
|
|
|
|
next_row = 0
|
|
|
|
hexbox.rect_position.y = -next_row * 4
|
|
|
|
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
|
|
if event is InputEventMouseButton:
|
|
|
|
match event.button_index:
|
|
|
|
BUTTON_WHEEL_DOWN:
|
|
|
|
scroll_hexview(16)
|
|
|
|
BUTTON_WHEEL_UP:
|
|
|
|
scroll_hexview(-16)
|
|
|
|
elif event is InputEventMouseMotion:
|
|
|
|
var row: int = (event.position.y - hexbox.rect_position.y) / 4
|
|
|
|
var col: int = event.position.x / 4
|
|
|
|
var address: int = col + (row * 480)
|
|
|
|
hexbox.set_tooltip('0x%06X' % address)
|