HollowBond/Public/ecma/Themes/Level0Theme.ecma.js

237 lines
8.0 KiB
JavaScript

"use strict";
const Level0Theme = {
key : "level_0",
name: "Level 0 - The Lobby",
shaders: {
floor: {
vertex: `
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,
fragment: `
varying vec2 vUv;
float hash(vec2 p) {
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
}
void main() {
vec3 col_base = vec3(0.55, 0.48, 0.32);
vec3 col_dark = vec3(0.42, 0.36, 0.24);
// Patrón tenue de moqueta húmeda
float grain = hash(floor(vUv * 50.0)) * 0.15;
vec3 color = mix(col_base, col_dark, grain);
gl_FragColor = vec4(color, 1.0);
}
`
},
ceiling: {
vertex: `
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,
fragment: `
varying vec2 vUv;
float hash(vec2 p) {
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
}
void main() {
vec2 panel_uv = fract(vUv);
float border = step(0.02, panel_uv.x) * step(panel_uv.x, 0.98) *
step(0.02, panel_uv.y) * step(panel_uv.y, 0.98);
vec3 plate = vec3(0.82, 0.81, 0.77);
vec3 grid = vec3(0.35, 0.35, 0.35);
float speck = hash(floor(panel_uv * 100.0)) * 0.05;
plate -= speck;
gl_FragColor = vec4(mix(grid, plate, border), 1.0);
}
`
},
walls: {
vertex: `
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,
fragment: `
varying vec2 vUv;
float hash(vec2 p) {
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
}
void main() {
vec3 col_yellow = vec3(0.76, 0.70, 0.42);
vec3 col_dark = vec3(0.68, 0.62, 0.36);
float stripe = sin(vUv.x * 31.4159) * 0.5 + 0.5;
vec3 color = mix(col_yellow, col_dark, stripe * 0.12);
// Zócalo inferior
if(vUv.y < 0.12) {
color = vec3(0.25, 0.22, 0.18);
}
float grain = hash(floor(vUv * 140.0)) * 0.05;
color -= grain;
gl_FragColor = vec4(color, 1.0);
}
`
},
frame: {
vertex: `
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,
fragment: `
varying vec2 vUv;
float hash(vec2 p) {
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
}
void main() {
// Tono marco madera barnizada oscura / metal marrón de oficina
vec3 col_base = vec3(0.24, 0.18, 0.14);
vec3 col_grain = vec3(0.18, 0.13, 0.10);
// Veteado suave alineado al marco
float grain = hash(floor(vUv * vec2(15.0, 180.0))) * 0.12;
vec3 color = mix(col_base, col_grain, grain);
gl_FragColor = vec4(color, 1.0);
}
`
},
hole: {
vertex: `
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,
fragment: `
varying vec2 vUv;
float hash(vec2 p) {
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
}
void main() {
// Hormigón oscuro / forjado de obra
vec3 col_base = vec3(0.22, 0.20, 0.18);
vec3 col_grain = vec3(0.14, 0.13, 0.12);
float grain = hash(floor(vUv * 60.0)) * 0.25;
vec3 color = mix(col_base, col_grain, grain);
gl_FragColor = vec4(color, 1.0);
}
`
},
stair: {
vertex: `
varying vec2 vUv;
varying vec3 vNormal;
void main() {
vUv = uv;
vNormal = normalize(normalMatrix * normal);
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,
fragment: `
varying vec2 vUv;
varying vec3 vNormal;
float hash(vec2 p) {
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
}
void main() {
// Acero gris oscuro con textura rayada en los peldaños
vec3 base = vec3(0.22, 0.22, 0.23);
vec3 edge = vec3(0.35, 0.35, 0.36);
float stripes = sin(vUv.y * 120.0) * 0.05;
float noise = hash(floor(vUv * 60.0)) * 0.06;
vec3 col = mix(base, edge, abs(vNormal.y) * 0.25 + stripes + noise);
gl_FragColor = vec4(col, 1.0);
}
`
},
elevator_cabin: {
vertex: `
varying vec2 vUv;
varying vec3 vNormal;
varying vec3 vWorldPosition;
void main() {
vUv = uv;
vNormal = normalize(normalMatrix * normal);
vec4 worldPos = modelMatrix * vec4(position, 1.0);
vWorldPosition = worldPos.xyz;
gl_Position = projectionMatrix * viewMatrix * worldPos;
}
`,
fragment: `
varying vec2 vUv;
varying vec3 vNormal;
varying vec3 vWorldPosition;
float hash(vec2 p) {
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
}
void main() {
// Acero cepillado con reflejos anisotrópicos simulados
vec3 metal_dark = vec3(0.28, 0.28, 0.29);
vec3 metal_light = vec3(0.48, 0.47, 0.46);
float grain = hash(floor(vUv * vec2(40.0, 400.0))) * 0.08;
float specular = pow(abs(dot(vNormal, vec3(0.0, 1.0, 0.0))), 2.0) * 0.15;
vec3 col = mix(metal_dark, metal_light, grain + specular);
gl_FragColor = vec4(col, 1.0);
}
`
},
elevator_light: {
vertex: `
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}
`,
fragment: `
varying vec2 vUv;
void main() {
// Luz blanca cálida fluorescente de tubo típico de oficina
vec3 light_color = vec3(0.96, 0.94, 0.85);
gl_FragColor = vec4(light_color * 1.4, 1.0);
}
`
},
}
}