Minimap experimentation
Add a tile globbing hack to enable 2x2 blocks to render nicely at different scales
This commit is contained in:
parent
9678501a8c
commit
7b7b0a1876
|
@ -4,16 +4,19 @@ uniform sampler2D palette : hint_normal;
|
||||||
uniform float palette_rows = 8.0; // 128 colours
|
uniform float palette_rows = 8.0; // 128 colours
|
||||||
// uniform float tile_width = 8.0;
|
// uniform float tile_width = 8.0;
|
||||||
uniform float tilemap_width = 512.0; // Require square tilemap for now
|
uniform float tilemap_width = 512.0; // Require square tilemap for now
|
||||||
|
uniform float uv_scale = 512.0; // Require square tilemap for now
|
||||||
uniform bool enable_sea_scroll = true; // Disable on underwater maps (tileset 3)
|
uniform bool enable_sea_scroll = true; // Disable on underwater maps (tileset 3)
|
||||||
uniform bool enable_waterfall_scroll = true; // Only enable on tileset 1
|
uniform bool enable_waterfall_scroll = true; // Only enable on tileset 1
|
||||||
|
uniform bool enable_tile_globbing = false; // hack for minimap
|
||||||
|
// uniform vec2 subtile_offset = vec2(0.0);
|
||||||
const float index_scale = 255.0 / 16.0;
|
const float index_scale = 255.0 / 16.0;
|
||||||
const vec2 sea_tile_uv = vec2(0.125, 0.375);
|
const vec2 sea_tile_uv = vec2(2.0, 6.0)/16.0;
|
||||||
const vec2 sea_tile_uv_end = vec2(0.25, 0.5);
|
const vec2 sea_tile_uv_end = vec2(4.0, 8.0)/16.0;
|
||||||
const vec2 sea_tile_size = sea_tile_uv_end - sea_tile_uv;
|
const vec2 sea_tile_size = sea_tile_uv_end - sea_tile_uv;
|
||||||
const vec2 sea_tile_size_inv = 1.0/sea_tile_size;
|
const vec2 sea_tile_size_inv = 1.0/sea_tile_size;
|
||||||
const vec2 waterfall_tile_uv = vec2(7.0/16.0, 8.0/16.0);
|
const vec2 waterfall_tile_uv = vec2(7.0, 8.0)/16.0;
|
||||||
const vec2 waterfall_tile_uv_end = vec2(9.0/16.0, 9.0/16.0);
|
const vec2 waterfall_tile_uv_end = vec2(9.0, 9.0)/16.0;
|
||||||
const vec2 waterfall_tile_uv_end_hack = vec2(9.0/16.0, 10.0/16.0); // we hack a second row in the atlas
|
const vec2 waterfall_tile_uv_end_hack = vec2(9.0, 10.0)/16.0; // we hack a second row in the atlas
|
||||||
const vec2 waterfall_tile_size = waterfall_tile_uv_end - waterfall_tile_uv;
|
const vec2 waterfall_tile_size = waterfall_tile_uv_end - waterfall_tile_uv;
|
||||||
const vec2 waterfall_tile_size_inv = 1.0/waterfall_tile_size;
|
const vec2 waterfall_tile_size_inv = 1.0/waterfall_tile_size;
|
||||||
|
|
||||||
|
@ -26,7 +29,8 @@ vec2 get_tile_atlas_uv(float tile_id, vec2 uv) {
|
||||||
float tile_row = trunc(tile_idx16) / 16.0;
|
float tile_row = trunc(tile_idx16) / 16.0;
|
||||||
float tile_col = fract(tile_idx16);
|
float tile_col = fract(tile_idx16);
|
||||||
vec2 tile_uv = vec2(tile_col, tile_row); // Convert 15.9375 to vec2(0.9375==15/16, (15)/16), this should result in integer coordinates in [0,15] scaled to [0,15/16] for UV
|
vec2 tile_uv = vec2(tile_col, tile_row); // Convert 15.9375 to vec2(0.9375==15/16, (15)/16), this should result in integer coordinates in [0,15] scaled to [0,15/16] for UV
|
||||||
vec2 sub_tile_uv = fract(uv * tilemap_width) / 16.0;
|
// vec2 sub_tile_uv = fract((uv * uv_scale) + subtile_offset) / 16.0;
|
||||||
|
vec2 sub_tile_uv = fract(uv * uv_scale) / 16.0;
|
||||||
|
|
||||||
vec2 out_uv = tile_uv + sub_tile_uv;
|
vec2 out_uv = tile_uv + sub_tile_uv;
|
||||||
|
|
||||||
|
@ -67,11 +71,14 @@ void fragment() {
|
||||||
// GLES2
|
// GLES2
|
||||||
// vec2 uv_tile = trunc(UV * tilemap_width) / tilemap_width;
|
// vec2 uv_tile = trunc(UV * tilemap_width) / tilemap_width;
|
||||||
vec2 uv_tile = UV;
|
vec2 uv_tile = UV;
|
||||||
float s = texture(TEXTURE, uv_tile).r;
|
if (enable_tile_globbing) {
|
||||||
|
uv_tile += step(0.5, fract(UV*0.5*uv_scale))/tilemap_width;
|
||||||
|
}
|
||||||
|
float tile_id = texture(TEXTURE, uv_tile).r;
|
||||||
|
|
||||||
// TODO: move cycling palette to a sampler2DArray or sampler3D rather than rebinding
|
// TODO: move cycling palette to a sampler2DArray or sampler3D rather than rebinding
|
||||||
|
|
||||||
vec2 lut_uv = get_tile_atlas_uv(s, UV);
|
vec2 lut_uv = get_tile_atlas_uv(tile_id, UV);
|
||||||
float color_id = texture(tile_atlas, lut_uv).r;
|
float color_id = texture(tile_atlas, lut_uv).r;
|
||||||
float color_idx16 = color_id * index_scale;
|
float color_idx16 = color_id * index_scale;
|
||||||
float pal_row = trunc(color_idx16) / palette_rows;
|
float pal_row = trunc(color_idx16) / palette_rows;
|
||||||
|
|
|
@ -11,31 +11,6 @@ var current_texture: Texture
|
||||||
var minimap_mode := 0
|
var minimap_mode := 0
|
||||||
var minimap_tween := 0.0
|
var minimap_tween := 0.0
|
||||||
|
|
||||||
#func _create_palette_and_atlas_texrects() -> void:
|
|
||||||
# for tileset in 3:
|
|
||||||
# # Debug the Atlases
|
|
||||||
# var texrect = TextureRect.new()
|
|
||||||
# texrect.rect_position.x = tileset * 256 * 2
|
|
||||||
# texrect.rect_scale *= 16
|
|
||||||
# texrect.texture = SpriteLoader.worldmap_palette_textures[tileset]
|
|
||||||
# map_texrects.append(texrect)
|
|
||||||
# add_child(texrect)
|
|
||||||
# texrect = TextureRect.new()
|
|
||||||
# texrect.rect_position.x = tileset * 256 * 2
|
|
||||||
# texrect.rect_position.y = 256
|
|
||||||
# texrect.rect_scale *= 4
|
|
||||||
# texrect.texture = SpriteLoader.worldmap_tile_atlas_textures[tileset]
|
|
||||||
# texrect.material = pal_shader_mat.duplicate()
|
|
||||||
# texrect.material.set_shader_param('palette', SpriteLoader.worldmap_palette_textures[tileset])
|
|
||||||
# map_texrects.append(texrect)
|
|
||||||
# add_child(texrect)
|
|
||||||
# texrect = TextureRect.new()
|
|
||||||
# texrect.rect_position.x = tileset * 256 * 2
|
|
||||||
# texrect.rect_position.y = 768
|
|
||||||
# texrect.rect_scale *= 4
|
|
||||||
# texrect.texture = SpriteLoader.worldmap_tile_atlas_textures[tileset]
|
|
||||||
# map_texrects.append(texrect)
|
|
||||||
# add_child(texrect)
|
|
||||||
|
|
||||||
const map_tilesets = [0, 1, 0, 2, 2]
|
const map_tilesets = [0, 1, 0, 2, 2]
|
||||||
const waterfall_scrolls = [true, false, true, false, false]
|
const waterfall_scrolls = [true, false, true, false, false]
|
||||||
|
@ -64,6 +39,7 @@ func _set_map(id: int) -> void:
|
||||||
minimap.material.set_shader_param('tile_atlas', SpriteLoader.worldmap_tile_atlas_textures[tileset])
|
minimap.material.set_shader_param('tile_atlas', SpriteLoader.worldmap_tile_atlas_textures[tileset])
|
||||||
minimap.material.set_shader_param('enable_waterfall_scroll', false)
|
minimap.material.set_shader_param('enable_waterfall_scroll', false)
|
||||||
minimap.material.set_shader_param('enable_sea_scroll', false)
|
minimap.material.set_shader_param('enable_sea_scroll', false)
|
||||||
|
minimap.material.set_shader_param('enable_tile_globbing', true)
|
||||||
|
|
||||||
# Called when the node enters the scene tree for the first time.
|
# Called when the node enters the scene tree for the first time.
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
@ -72,8 +48,8 @@ func _ready() -> void:
|
||||||
# _create_palette_and_atlas_texrects()
|
# _create_palette_and_atlas_texrects()
|
||||||
self.material = worldmap_shader_mat.duplicate()
|
self.material = worldmap_shader_mat.duplicate()
|
||||||
minimap.material = worldmap_shader_mat.duplicate()
|
minimap.material = worldmap_shader_mat.duplicate()
|
||||||
minimap.modulate.a8 = 0xc0
|
minimap.modulate.a8 = 192
|
||||||
minimap.rect_scale = Vector2(0.125, 0.125)
|
minimap.rect_scale = Vector2.ONE * 0.125
|
||||||
minimap.rect_position = Vector2(8, 168)
|
minimap.rect_position = Vector2(8, 168)
|
||||||
_set_map(0)
|
_set_map(0)
|
||||||
|
|
||||||
|
@ -81,13 +57,18 @@ func _ready() -> void:
|
||||||
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||||||
func _process(delta: float) -> void:
|
func _process(delta: float) -> void:
|
||||||
self.pos = self.pos.posmod(256.0)
|
self.pos = self.pos.posmod(256.0)
|
||||||
self.minimap_tween -= sign(minimap_tween - minimap_mode) * delta #* 0.06125
|
self.minimap_tween -= sign(minimap_tween - minimap_mode) * delta / 4
|
||||||
self.minimap_tween = clamp(minimap_tween, 0, 1)
|
self.minimap_tween = clamp(minimap_tween, 0, 1)
|
||||||
var l = ease(minimap_tween, -3.75)
|
var l = ease(minimap_tween, -3.75)
|
||||||
# l = minimap_tween
|
l = minimap_tween
|
||||||
minimap.rect_scale = Vector2.ONE * lerp(0.125, 0.5, l)
|
var minimap_scale = lerp(0.125, 0.5, l)
|
||||||
|
minimap.rect_scale = Vector2.ONE * minimap_scale
|
||||||
minimap.rect_position = Vector2(lerp(8, 64, l), lerp(168, -8, l))
|
minimap.rect_position = Vector2(lerp(8, 64, l), lerp(168, -8, l))
|
||||||
minimap.modulate.a8 = lerp(192, 240, l)
|
minimap.modulate.a8 = lerp(192, 240, l)
|
||||||
|
# minimap.material.set_shader_param('subtile_offset', Vector2.ONE*0/8.0)
|
||||||
|
# minimap.material.set_shader_param('uv_scale', 64 * minimap_scale)
|
||||||
|
minimap.material.set_shader_param('uv_scale', lerp(512, 1<<5, l))
|
||||||
|
# minimap.material.set_shader_param('uv_scale', 512/16)
|
||||||
update()
|
update()
|
||||||
|
|
||||||
var pos := Vector2(0, 0)
|
var pos := Vector2(0, 0)
|
||||||
|
|
|
@ -6,5 +6,7 @@
|
||||||
shader = ExtResource( 1 )
|
shader = ExtResource( 1 )
|
||||||
shader_param/palette_rows = 8.0
|
shader_param/palette_rows = 8.0
|
||||||
shader_param/tilemap_width = 512.0
|
shader_param/tilemap_width = 512.0
|
||||||
|
shader_param/uv_scale = 512.0
|
||||||
shader_param/enable_sea_scroll = true
|
shader_param/enable_sea_scroll = true
|
||||||
shader_param/enable_waterfall_scroll = true
|
shader_param/enable_waterfall_scroll = true
|
||||||
|
shader_param/enable_tile_globbing = false
|
||||||
|
|
Loading…
Reference in New Issue