aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/main/resources/shaders/mrdoor.glsl45
1 files changed, 33 insertions, 12 deletions
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);