From 059a7c5b2ada0c1ad86c1c7c812e5c56b72e4a20 Mon Sep 17 00:00:00 2001 From: myin Date: Sat, 11 Nov 2023 19:54:39 +0100 Subject: [PATCH] add simple reflection --- .../base-system/RelativeRemoteTransform2D.gd | 8 ++++++++ godot/src/character/player_reflection.tscn | 14 +++++++++++++ godot/src/game.gd | 4 ++++ godot/src/game.tscn | 20 ++++++++++++++++++- godot/src/tile_mirror.gdshader | 5 +++++ 5 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 godot/src/base-system/RelativeRemoteTransform2D.gd create mode 100644 godot/src/character/player_reflection.tscn diff --git a/godot/src/base-system/RelativeRemoteTransform2D.gd b/godot/src/base-system/RelativeRemoteTransform2D.gd new file mode 100644 index 0000000..f088f2d --- /dev/null +++ b/godot/src/base-system/RelativeRemoteTransform2D.gd @@ -0,0 +1,8 @@ +class_name RelativeRemoteTransform2D +extends Node2D + +@export var remote_node: Node2D +@export var relative_to_origin := 1.1 + +func _process(delta): + remote_node.global_position = global_position * relative_to_origin diff --git a/godot/src/character/player_reflection.tscn b/godot/src/character/player_reflection.tscn new file mode 100644 index 0000000..a7e9f39 --- /dev/null +++ b/godot/src/character/player_reflection.tscn @@ -0,0 +1,14 @@ +[gd_scene load_steps=4 format=3 uid="uid://1sccjkvbts1e"] + +[ext_resource type="Texture2D" uid="uid://wi47ngkwkxbc" path="res://assets/Gura__Trident_Mirror.png" id="1_awrgi"] +[ext_resource type="Script" path="res://src/character/MirrorSprite2D.gd" id="2_21pk6"] +[ext_resource type="Texture2D" uid="uid://co8dko7iojh8p" path="res://assets/Gura__Trident_Normal.png" id="3_4mtbe"] + +[node name="PlayerReflection" type="Node2D"] + +[node name="MirrorSprite2D" type="Sprite2D" parent="."] +position = Vector2(3, -2) +texture = ExtResource("1_awrgi") +hframes = 4 +script = ExtResource("2_21pk6") +mirror_texture = ExtResource("3_4mtbe") diff --git a/godot/src/game.gd b/godot/src/game.gd index 18c1308..952bc08 100644 --- a/godot/src/game.gd +++ b/godot/src/game.gd @@ -5,6 +5,7 @@ const ROOM = preload("res://src/props/room.tscn") @onready var cam = $Camera2D @onready var player = $Player @onready var music_player = $MusicPlayer +@onready var mirror_viewport = $MirrorViewport @export var enemy_value := 5.0 @export var enemy_kills := 5.0 @@ -42,6 +43,9 @@ func _setup_next_room(current_room: Room): func _create_room() -> Room: var room = ROOM.instantiate() + var mat = room.material as ShaderMaterial + mat.set_shader_parameter("reflection_viewport", mirror_viewport.get_viewport().get_texture()) + room.finished.connect(func(): _setup_next_room(room) GameManager.room_done() diff --git a/godot/src/game.tscn b/godot/src/game.tscn index e0c135d..a7945d4 100644 --- a/godot/src/game.tscn +++ b/godot/src/game.tscn @@ -1,9 +1,11 @@ -[gd_scene load_steps=9 format=3 uid="uid://di8g8e6s34cik"] +[gd_scene load_steps=11 format=3 uid="uid://di8g8e6s34cik"] [ext_resource type="Script" path="res://src/game.gd" id="1_fscq0"] +[ext_resource type="Script" path="res://src/base-system/RelativeRemoteTransform2D.gd" id="3_vvprc"] [ext_resource type="AudioStream" uid="uid://cj3tphknhrawu" path="res://assets/sound/Sparkle.mp3" id="4_rug7x"] [ext_resource type="AudioStream" uid="uid://bygqjhqr85tjf" path="res://assets/sound/危機.mp3" id="5_3pgwk"] [ext_resource type="PackedScene" uid="uid://dlby6flxkmnjs" path="res://src/character/player.tscn" id="6_2xq02"] +[ext_resource type="PackedScene" uid="uid://1sccjkvbts1e" path="res://src/character/player_reflection.tscn" id="6_bcrcl"] [sub_resource type="Animation" id="Animation_880qs"] length = 0.001 @@ -152,6 +154,11 @@ position_smoothing_enabled = true [node name="Player" parent="." instance=ExtResource("6_2xq02")] z_index = 10 +[node name="RelativeRemoteTransform2D" type="Node2D" parent="Player" node_paths=PackedStringArray("remote_node")] +script = ExtResource("3_vvprc") +remote_node = NodePath("../../MirrorViewport/PlayerReflection") +relative_to_origin = 1.05 + [node name="BGM" type="AudioStreamPlayer" parent="."] process_mode = 3 stream = ExtResource("4_rug7x") @@ -168,5 +175,16 @@ libraries = { "": SubResource("AnimationLibrary_06h2n") } +[node name="MirrorViewport" type="SubViewport" parent="."] +transparent_bg = true +size = Vector2i(384, 224) +render_target_update_mode = 4 + +[node name="Camera2D2" type="Camera2D" parent="MirrorViewport"] +visible = false +position_smoothing_enabled = true + +[node name="PlayerReflection" parent="MirrorViewport" instance=ExtResource("6_bcrcl")] + [connection signal="died" from="Player" to="." method="_on_player_died"] [connection signal="reflected" from="Player" to="." method="_on_player_reflected"] diff --git a/godot/src/tile_mirror.gdshader b/godot/src/tile_mirror.gdshader index 3ee62d2..807683a 100644 --- a/godot/src/tile_mirror.gdshader +++ b/godot/src/tile_mirror.gdshader @@ -1,5 +1,7 @@ shader_type canvas_item; +uniform sampler2D reflection_viewport; + uniform vec4 base_color : source_color = vec4(.5, .5, .5, 1.); uniform vec4 shine_color : source_color = vec4(1.0); uniform float shine_speed : hint_range(0.0, 10.0, 0.1) = 1.0; @@ -16,6 +18,9 @@ void fragment() { color = base_color; float shine = step(1.0 - shine_size * 0.01, 0.5 + 0.5 * sin(SCREEN_UV.x - SCREEN_UV.y + TIME * shine_speed)); color.rgb = mix(color.rgb, shine_color.rgb, shine * shine_color.a); + + vec4 reflection = texture(reflection_viewport, SCREEN_UV); + color.rgb = color.rgb * (1.0 - reflection.a) + reflection.rgb * reflection.a; } COLOR = color;