From 720436dd3b22dc8746c2bae4a9dd5d6d3dc23396 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Thu, 24 Sep 2026 12:51:56 +0530 Subject: Make the door swing --- src/main/resources/shaders/mrdoor.glsl | 45 +++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 12 deletions(-) (limited to 'src/main/resources/shaders/mrdoor.glsl') diff --git a/src/main/resources/shaders/mrdoor.glsl b/src/main/resources/shaders/mrdoor.glsl index 06733c6..a37cbab 100644 --- a/src/main/resources/shaders/mrdoor.glsl +++ b/src/main/resources/shaders/mrdoor.glsl @@ -29,14 +29,34 @@ Obj create_obj(in int objid, in float dist) { return Obj(objid, dist, vec3(1), true, 0.0); } +void timing_actions(out float door1angle) { + float maxt = 4.0; + float t = mod(seconds, maxt); + door1angle = -t / 1.6; + if ((int(t / 2) % 2) == 1) + door1angle = (t - maxt / 2) / 1.6 - PI / 2.5; +} + Obj scene(in vec3 p) { - vec3 doorpos = p - vec3(-0.5, 1.4, 5); + vec3 roomposabs = vec3(-0.5, 1.4, 5); + vec3 roompos = p - roomposabs; + float debugshapesdist = sdf_circle(p, 0.01); + + vec3 doorpos = roompos; vec3 doorsize = vec3(1., 2., 0.1); + float door1angle; + timing_actions(door1angle); + vec3 hingepos = vec3(-1.0, 0, -0.0); + debugshapesdist = min(debugshapesdist, sdf_circle(doorpos - hingepos, 0.1)); + doorpos = vec3( + hingepos.x + (doorpos.x - hingepos.x) * cos(door1angle) - (doorpos.z - hingepos.z) * sin(door1angle), + doorpos.y, + hingepos.z + (doorpos.x - hingepos.x) * sin(door1angle) + (doorpos.z - hingepos.z) * cos(door1angle)); float doorbody = sdf_box(doorpos, doorsize, 0.04); doorbody = ssubtract(doorbody, sdf_box(doorpos - vec3(0, 1.1, -0.2), vec3(0.65, 0.5, 0.1), 0), 0.1); doorbody = ssubtract(doorbody, sdf_box(doorpos - vec3(0, -0.75, -0.2), vec3(0.65, 0.85, 0.1), 0), 0.1); - Obj doorhandle = create_obj(2, sdf_circle(doorpos - vec3(0.75, 0.34, -0.3), 0.1)); + Obj doorhandle = create_obj(2, sdf_circle(doorpos - vec3(0.75, 0.34, -0.2), 0.1)); doorhandle.material = vec3(0.4, 0.4, 0.4); doorhandle.shine = 22.0; Obj door = create_obj(2, doorbody); @@ -44,20 +64,21 @@ Obj scene(in vec3 p) { door.shine = 2.0; float doorframe = ssubtract( - sdf_box(doorpos - vec3(0, 0.5, 0), vec3(2., 2.6, 0.1), 0), - sdf_box(doorpos, doorsize + vec3(0.01, 0.01, 0.04), 0), 0.0); - vec3 wallpos = doorpos; + sdf_box(roompos - vec3(0, 0.5, 0), vec3(2., 2.6, 0.1), 0), + sdf_box(roompos, doorsize + vec3(0.01, 0.01, 0.04), 0), 0.0); + vec3 wallpos = roompos; wallpos.xz *= mat2x2(cos(PI / 2.), -sin(PI / 2.), sin(PI / 2.), cos(PI / 2.)); float wallsides = min( sdf_box(wallpos - vec3(0, 0.5, -2), vec3(2., 2.6, 0.08), 0), sdf_box(wallpos - vec3(0, 0.5, 2), vec3(2., 2.6, 0.08), 0)); - float roof = sdf_box(doorpos - vec3(0, 3.3, -2), vec3(2., 0.08, 2.6), 0); + float roof = sdf_box(roompos - vec3(0, 3.3, -2), vec3(2., 0.08, 2.6), 0); Obj walls = create_obj(2, min(min(doorframe, wallsides), roof)); walls.material = vec3(0.15, 0.28, 0.42); - Obj debugdot = create_obj(-1, sdf_circle(p - door1_light_position, 0.1)); - debugdot.lighting = false; - debugdot.material = vec3(0, 1, 0); + debugshapesdist = min(debugshapesdist, sdf_circle(p - door1_light_position, 0.1)); + Obj debug = create_obj(-1, debugshapesdist); + debug.lighting = false; + debug.material = vec3(0, 1, 0); Obj floor = create_obj(0, sdf_plane(p - vec3(0, -0.6, 0), vec3(0, 1, 0), 0.0)); floor.material = vec3(0.4); @@ -65,12 +86,12 @@ Obj scene(in vec3 p) { dist = min(door.dist, dist); dist = min(doorhandle.dist, dist); dist = min(walls.dist, dist); - dist = min(debugdot.dist, dist); + dist = min(debug.dist, dist); if (dist == door.dist) return door; if (dist == doorhandle.dist) return doorhandle; if (dist == floor.dist) return floor; if (dist == walls.dist) return walls; - if (dist == debugdot.dist) return debugdot; + if (dist == debug.dist) return debug; return null_object; } @@ -144,7 +165,7 @@ void main() { vec3 keyl_dir = normalize(key_light_position - p); float key_contrast = 1.; key_contrast *= clamp(dot(normal, keyl_dir), 0, 1); - key_contrast *= shadow_scene(p, keyl_dir, 8.); + // key_contrast *= shadow_scene(p, keyl_dir, 8.); key_contrast = clamp(key_contrast, 0, 1); vec3 door1_ldir = normalize(door1_light_position - p); -- cgit v1.3.1