aboutsummaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2025-12-14 20:42:02 +0100
committermetamuffin <metamuffin@disroot.org>2025-12-14 20:42:02 +0100
commit6d982e3ccb990ab8fd45d97a2a6bba77a78d4e2a (patch)
tree9afedc4fd40ad0b897ed095301b0140838b1af82 /client
parent43132e07fe11723b228bcc97b20b0cfa7dc472f7 (diff)
downloadhurrycurry-6d982e3ccb990ab8fd45d97a2a6bba77a78d4e2a.tar
hurrycurry-6d982e3ccb990ab8fd45d97a2a6bba77a78d4e2a.tar.bz2
hurrycurry-6d982e3ccb990ab8fd45d97a2a6bba77a78d4e2a.tar.zst
More efficient black/white hole shader
Diffstat (limited to 'client')
-rw-r--r--client/map/tiles/portal.gdshader31
-rw-r--r--client/map/tiles/portal.tscn7
2 files changed, 18 insertions, 20 deletions
diff --git a/client/map/tiles/portal.gdshader b/client/map/tiles/portal.gdshader
index a9dbd1e6..c5bc0be4 100644
--- a/client/map/tiles/portal.gdshader
+++ b/client/map/tiles/portal.gdshader
@@ -25,6 +25,7 @@ varying vec3 world_position;
uniform float type : hint_range(-1.0, 1.0);
uniform float size : hint_range(0.0, 2.0);
+uniform vec3 glow : source_color;
void vertex() {
MODELVIEW_MATRIX = VIEW_MATRIX * mat4(
@@ -37,25 +38,21 @@ void vertex() {
world_camera = (inverse(MODELVIEW_MATRIX) * vec4(0, 0, 0, 1)).xyz;
}
+vec2 rv_to_screen(mat4 pm, vec3 rv) {
+ vec4 k = pm * vec4(rv*1000.0, 1.0);
+ k /= k.w;
+ return (k.xy + 1.) / 2.;
+}
+
void fragment() {
vec3 ray = world_camera / size;
vec3 rv = normalize(world_position - world_camera);
- vec3 em = vec3(0.);
- bool hit = false;
-
- for (int i = 0; i < 100; i++) {
- float st = length(ray) * 0.1;
- ray += normalize(rv) * st;
- if (length(ray) < 1.) { hit = true; break; }
- rv += -normalize(ray) * -type / exp(dot(ray,ray)) * st;
- em += st * smoothstep(1.5,1.2,length(ray)) * 0.2;
- }
-
- vec4 k = PROJECTION_MATRIX * vec4(rv*1000.0, 1.0);
- k /= k.w;
- vec2 k2 = (k.xy + 1.) / 2.;
-
- vec3 col = hit ? vec3(type*0.5+0.5) : texture(screen_texture, k2).rgb;
- col += vec3(0.3,0.0,1.0) * max(em - 0.1,0.);
+
+ vec3 o = ray + length(ray)*rv;
+ float d = length(o) - 1.;
+ rv += o / (exp(d*2.)-1.) * type * 0.08;
+ vec2 screen = rv_to_screen(PROJECTION_MATRIX, rv);
+ vec3 col = d<0. ? vec3(type*0.5+0.5) : texture(screen_texture, screen).rgb;
+ col += glow * exp(d < 0. ? d*30. : d*-10.);
ALBEDO = col;
}
diff --git a/client/map/tiles/portal.tscn b/client/map/tiles/portal.tscn
index 372b97ea..1bad208b 100644
--- a/client/map/tiles/portal.tscn
+++ b/client/map/tiles/portal.tscn
@@ -10,13 +10,14 @@ size = Vector2(3, 3)
resource_local_to_scene = true
render_priority = 0
shader = ExtResource("1_aiexk")
-shader_parameter/type = 4.75e-08
-shader_parameter/size = 0.2
+shader_parameter/type = -1.0
+shader_parameter/size = 0.2000000095
+shader_parameter/glow = Color(0.6156863, 0.003921569, 1, 1)
[node name="Portal" type="Node3D"]
script = ExtResource("1_h7xlp")
[node name="Mesh" type="MeshInstance3D" parent="."]
-transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.7, 0)
+transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0022193193, 0.69999975, -0.0013526678)
mesh = SubResource("QuadMesh_us4em")
surface_material_override/0 = SubResource("ShaderMaterial_hvgsb")