// Roblox in Godot 4.4 - part surface shader shader_type spatial; uniform sampler2D image : source_color; uniform vec3 size = vec3(1.0, 1.0, 2.0); uniform vec3 color = vec3(1.0, 1.0, 1.0); uniform int back_surface = 3; uniform int bottom_surface = 3; uniform int front_surface = 3; uniform int left_surface = 3; uniform int right_surface = 3; uniform int top_surface = 3; varying vec3 face_normal; void SetOffsetAndSize(int surface_type, inout vec2 offset) { // smooth if (surface_type == 0) { discard; // glue } else if (surface_type == 1) { offset = vec2(0.0, 0.7); // weld } else if (surface_type == 2) { offset = vec2(0.0, 0.5); // studs } else if (surface_type == 3) { offset = vec2(0.0, 0.0); // inlet } else if (surface_type == 4) { offset = vec2(0.0, 0.3); // universal } else if (surface_type == 5) { offset = vec2(0.0, 0.9); } else { discard; } } void vertex() { face_normal = NORMAL; } void fragment() { vec3 normal_dir = normalize(face_normal); vec2 offset = vec2(0, 0); vec2 uv_size = vec2(0, 0); int surface_type = 0; // top if (normal_dir.y > 0.5) { surface_type = top_surface; uv_size = vec2(size.x, size.z); // right (+x) } else if (normal_dir.x > 0.5) { surface_type = right_surface; uv_size = vec2(size.z, size.y); // backward (+z) } else if (normal_dir.z > 0.5) { surface_type = back_surface; uv_size = vec2(size.x, size.y); // left (-x) } else if (normal_dir.x < 0.0) { surface_type = left_surface; uv_size = vec2(size.z, size.y); // bottom } else if (normal_dir.y < 0.0) { surface_type = bottom_surface; uv_size = vec2(size.x, size.z); // forward (-z) } else if (normal_dir.z < 0.0) { surface_type = front_surface; uv_size = vec2(size.x, size.y); } else { discard; } vec2 base_uv = (UV / vec2((64.0 / uv_size.x / 100.0), 10.0 / uv_size.y)); base_uv += vec2(-0.025 * uv_size.x, 0.0); base_uv = mod(base_uv, vec2(1.0, 0.1)); SetOffsetAndSize(surface_type, offset); base_uv += offset; vec4 albedo_tex = texture(image, base_uv); ALBEDO = albedo_tex.rgb; ALPHA = albedo_tex.a * 1.0; }