Improve production cockpit realism
This commit is contained in:
1 parent
7613daee84
commit
5455ae7928
9 files changed
+668
-21
No files matched your search
@@ -0,0 +1,120 @@
|
||||
class_name CockpitMaterialPalette
|
||||
extends RefCounted
|
||||
|
||||
var painted_steel: Material
|
||||
var dark_steel: Material
|
||||
var brass: Material
|
||||
var copper: Material
|
||||
var rubber: Material
|
||||
var ivory: Material
|
||||
var warm_emission: StandardMaterial3D
|
||||
var red_emission: StandardMaterial3D
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
painted_steel = _weathered_material(
|
||||
Color(0.045, 0.12, 0.125),
|
||||
Color(0.16, 0.18, 0.17),
|
||||
0.52,
|
||||
0.58,
|
||||
0.13
|
||||
)
|
||||
dark_steel = _weathered_material(
|
||||
Color(0.045, 0.055, 0.055),
|
||||
Color(0.22, 0.24, 0.22),
|
||||
0.78,
|
||||
0.44,
|
||||
0.08
|
||||
)
|
||||
brass = _weathered_material(
|
||||
Color(0.28, 0.18, 0.045),
|
||||
Color(0.08, 0.16, 0.13),
|
||||
0.74,
|
||||
0.38,
|
||||
0.17
|
||||
)
|
||||
copper = _weathered_material(
|
||||
Color(0.34, 0.12, 0.045),
|
||||
Color(0.055, 0.18, 0.15),
|
||||
0.72,
|
||||
0.42,
|
||||
0.12
|
||||
)
|
||||
rubber = _plain_material(Color(0.012, 0.018, 0.018), 0.0, 0.92)
|
||||
ivory = _plain_material(Color(0.72, 0.69, 0.56), 0.05, 0.63)
|
||||
warm_emission = _emissive_material(Color(0.96, 0.52, 0.18), 2.4)
|
||||
red_emission = _emissive_material(Color(0.92, 0.055, 0.025), 3.6)
|
||||
|
||||
|
||||
func _weathered_material(
|
||||
base_color: Color,
|
||||
worn_color: Color,
|
||||
metallic: float,
|
||||
roughness: float,
|
||||
wear_amount: float
|
||||
) -> ShaderMaterial:
|
||||
var shader := Shader.new()
|
||||
shader.code = """
|
||||
shader_type spatial;
|
||||
render_mode diffuse_burley, specular_schlick_ggx;
|
||||
|
||||
uniform vec4 base_color : source_color;
|
||||
uniform vec4 worn_color : source_color;
|
||||
uniform float metallic_value : hint_range(0.0, 1.0);
|
||||
uniform float roughness_value : hint_range(0.0, 1.0);
|
||||
uniform float wear_amount : hint_range(0.0, 0.4);
|
||||
|
||||
float hash21(vec2 p) {
|
||||
return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453123);
|
||||
}
|
||||
|
||||
float value_noise(vec2 p) {
|
||||
vec2 cell = floor(p);
|
||||
vec2 local = fract(p);
|
||||
local = local * local * (3.0 - 2.0 * local);
|
||||
float a = hash21(cell);
|
||||
float b = hash21(cell + vec2(1.0, 0.0));
|
||||
float c = hash21(cell + vec2(0.0, 1.0));
|
||||
float d = hash21(cell + vec2(1.0, 1.0));
|
||||
return mix(mix(a, b, local.x), mix(c, d, local.x), local.y);
|
||||
}
|
||||
|
||||
void fragment() {
|
||||
float broad = value_noise(UV * 11.0);
|
||||
float grain = value_noise(UV * 73.0 + vec2(4.2, 8.7));
|
||||
float wear = smoothstep(0.76, 1.0, broad) * wear_amount;
|
||||
ALBEDO = mix(base_color.rgb * mix(0.78, 1.08, broad), worn_color.rgb, wear);
|
||||
METALLIC = metallic_value;
|
||||
ROUGHNESS = clamp(roughness_value + (grain - 0.5) * 0.22, 0.16, 0.96);
|
||||
}
|
||||
"""
|
||||
var material := ShaderMaterial.new()
|
||||
material.shader = shader
|
||||
material.set_shader_parameter("base_color", base_color)
|
||||
material.set_shader_parameter("worn_color", worn_color)
|
||||
material.set_shader_parameter("metallic_value", metallic)
|
||||
material.set_shader_parameter("roughness_value", roughness)
|
||||
material.set_shader_parameter("wear_amount", wear_amount)
|
||||
return material
|
||||
|
||||
|
||||
func _plain_material(
|
||||
color: Color,
|
||||
metallic: float,
|
||||
roughness: float
|
||||
) -> StandardMaterial3D:
|
||||
var material := StandardMaterial3D.new()
|
||||
material.albedo_color = color
|
||||
material.metallic = metallic
|
||||
material.roughness = roughness
|
||||
return material
|
||||
|
||||
|
||||
func _emissive_material(color: Color, energy: float) -> StandardMaterial3D:
|
||||
var material := StandardMaterial3D.new()
|
||||
material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
|
||||
material.albedo_color = color
|
||||
material.emission_enabled = true
|
||||
material.emission = color
|
||||
material.emission_energy_multiplier = energy
|
||||
return material
|
||||
Reference in new issue
Block a user