Skip to content

Commit

Permalink
add simple reflection
Browse files Browse the repository at this point in the history
  • Loading branch information
myin142 committed Nov 11, 2023
1 parent 0aa67ab commit 059a7c5
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 1 deletion.
8 changes: 8 additions & 0 deletions godot/src/base-system/RelativeRemoteTransform2D.gd
Original file line number Diff line number Diff line change
@@ -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
14 changes: 14 additions & 0 deletions godot/src/character/player_reflection.tscn
Original file line number Diff line number Diff line change
@@ -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")
4 changes: 4 additions & 0 deletions godot/src/game.gd
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
Expand Down
20 changes: 19 additions & 1 deletion godot/src/game.tscn
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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")
Expand All @@ -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"]
5 changes: 5 additions & 0 deletions godot/src/tile_mirror.gdshader
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand Down

0 comments on commit 059a7c5

Please sign in to comment.