Refine cockpit porthole and indicators
This commit is contained in:
1 parent
53288b48c8
commit
c2b3ac42a3
8 files changed
+298
-10
No files matched your search
@@ -3,16 +3,20 @@ extends Node3D
|
||||
|
||||
const CockpitMaterialPalette = preload("res://game/presentation/cockpit/cockpit_material_palette.gd")
|
||||
const CockpitMeshFactory = preload("res://game/presentation/cockpit/cockpit_mesh_factory.gd")
|
||||
const DiveAlertLevel = preload("res://game/domain/dive/dive_alert_level.gd")
|
||||
|
||||
var _materials: CockpitMaterialPalette
|
||||
var _battery_needle: Node3D
|
||||
var _pressure_needle: Node3D
|
||||
var _indicator_materials: Array[StandardMaterial3D] = []
|
||||
var _active_indicator_count := 0
|
||||
|
||||
|
||||
func _init(materials: CockpitMaterialPalette) -> void:
|
||||
_materials = materials
|
||||
name = "AnalogGauges"
|
||||
_build_binnacle()
|
||||
_build_indicator_bank()
|
||||
_battery_needle = _add_gauge(
|
||||
"BatteryGauge",
|
||||
Vector3(-0.095, 0.315, 0.145),
|
||||
@@ -27,15 +31,28 @@ func _init(materials: CockpitMaterialPalette) -> void:
|
||||
_add_binnacle_label("PRESSION COQUE", Vector3(0.095, 0.235, 0.160))
|
||||
|
||||
|
||||
func present(battery_ratio: float, pressure_ratio: float) -> void:
|
||||
func present(
|
||||
battery_ratio: float,
|
||||
pressure_ratio: float,
|
||||
alert_level: DiveAlertLevel.Value
|
||||
) -> void:
|
||||
_set_needle_ratio(_battery_needle, battery_ratio)
|
||||
_set_needle_ratio(_pressure_needle, pressure_ratio)
|
||||
_update_indicator_bank(alert_level)
|
||||
|
||||
|
||||
func battery_needle_degrees() -> float:
|
||||
return 0.0 if _battery_needle == null else _battery_needle.rotation_degrees.z
|
||||
|
||||
|
||||
func indicator_count() -> int:
|
||||
return _indicator_materials.size()
|
||||
|
||||
|
||||
func active_indicator_count() -> int:
|
||||
return _active_indicator_count
|
||||
|
||||
|
||||
func _build_binnacle() -> void:
|
||||
CockpitMeshFactory.add_box(
|
||||
"BinnacleHousing",
|
||||
@@ -53,6 +70,72 @@ func _build_binnacle() -> void:
|
||||
)
|
||||
|
||||
|
||||
func _build_indicator_bank() -> void:
|
||||
var root := Node3D.new()
|
||||
root.name = "IndicatorBank"
|
||||
add_child(root)
|
||||
var colors: Array[Color] = [
|
||||
Color(0.08, 0.72, 0.38),
|
||||
Color(1.0, 0.46, 0.035),
|
||||
Color(0.92, 0.035, 0.018),
|
||||
]
|
||||
var captions: Array[String] = ["SYS", "ATTN", "ALRM"]
|
||||
for indicator_index in colors.size():
|
||||
var x := -0.055 + indicator_index * 0.055
|
||||
CockpitMeshFactory.add_cylinder(
|
||||
"%sBezel" % captions[indicator_index],
|
||||
root,
|
||||
Vector3(x, 0.198, 0.156),
|
||||
0.016,
|
||||
0.012,
|
||||
_materials.brass,
|
||||
Vector3(90.0, 0.0, 0.0)
|
||||
)
|
||||
var material := _indicator_material(colors[indicator_index])
|
||||
_indicator_materials.append(material)
|
||||
CockpitMeshFactory.add_cylinder(
|
||||
"%sLens" % captions[indicator_index],
|
||||
root,
|
||||
Vector3(x, 0.198, 0.165),
|
||||
0.009,
|
||||
0.008,
|
||||
material,
|
||||
Vector3(90.0, 0.0, 0.0)
|
||||
)
|
||||
var label := Label3D.new()
|
||||
label.name = "%sLabel" % captions[indicator_index]
|
||||
label.text = captions[indicator_index]
|
||||
label.font_size = 8
|
||||
label.pixel_size = 0.00042
|
||||
label.modulate = Color(0.70, 0.67, 0.56)
|
||||
label.position = Vector3(x, 0.177, 0.168)
|
||||
root.add_child(label)
|
||||
|
||||
|
||||
func _indicator_material(color: Color) -> StandardMaterial3D:
|
||||
var material := StandardMaterial3D.new()
|
||||
material.albedo_color = color * 0.12
|
||||
material.metallic = 0.05
|
||||
material.roughness = 0.16
|
||||
material.emission_enabled = true
|
||||
material.emission = color
|
||||
material.emission_energy_multiplier = 0.04
|
||||
return material
|
||||
|
||||
|
||||
func _update_indicator_bank(alert_level: DiveAlertLevel.Value) -> void:
|
||||
var active_index := 0
|
||||
if alert_level >= DiveAlertLevel.Value.CRITICAL:
|
||||
active_index = 2
|
||||
elif alert_level >= DiveAlertLevel.Value.ATTENTION:
|
||||
active_index = 1
|
||||
for indicator_index in _indicator_materials.size():
|
||||
_indicator_materials[indicator_index].emission_energy_multiplier = (
|
||||
2.8 if indicator_index == active_index else 0.04
|
||||
)
|
||||
_active_indicator_count = 1
|
||||
|
||||
|
||||
func _add_binnacle_label(caption: String, position: Vector3) -> void:
|
||||
var label := Label3D.new()
|
||||
label.name = "%sLabel" % caption.to_pascal_case().replace(" ", "")
|
||||
@@ -113,6 +196,7 @@ func _add_gauge(gauge_name: String, position: Vector3, caption: String) -> Node3
|
||||
face.rotation_degrees.x = 90.0
|
||||
face.position.z = 0.003
|
||||
gauge.add_child(face)
|
||||
_add_dial_ticks(gauge)
|
||||
_add_scale_label(gauge, "0", Vector3(-0.052, -0.018, 0.028))
|
||||
_add_scale_label(gauge, "50", Vector3(0.0, 0.052, 0.028))
|
||||
_add_scale_label(gauge, "100", Vector3(0.052, -0.018, 0.028))
|
||||
@@ -160,12 +244,30 @@ func _add_gauge(gauge_name: String, position: Vector3, caption: String) -> Node3
|
||||
return needle_root
|
||||
|
||||
|
||||
func _add_dial_ticks(gauge: Node3D) -> void:
|
||||
for tick_index in 11:
|
||||
var ratio := float(tick_index) / 10.0
|
||||
var angle_degrees := lerpf(125.0, -125.0, ratio)
|
||||
var angle_radians := deg_to_rad(angle_degrees)
|
||||
var direction := Vector2(-sin(angle_radians), cos(angle_radians))
|
||||
var is_major := tick_index % 5 == 0
|
||||
var tick_length := 0.015 if is_major else 0.009
|
||||
var tick := CockpitMeshFactory.add_box(
|
||||
"MajorTick" if is_major else "MinorTick",
|
||||
gauge,
|
||||
Vector3(direction.x * 0.064, direction.y * 0.064, 0.029),
|
||||
Vector3(0.004 if is_major else 0.0025, tick_length, 0.003),
|
||||
_materials.dark_steel
|
||||
)
|
||||
tick.rotation_degrees.z = angle_degrees
|
||||
|
||||
|
||||
func _add_scale_label(gauge: Node3D, text: String, position: Vector3) -> void:
|
||||
var label := Label3D.new()
|
||||
label.name = "Scale%s" % text
|
||||
label.text = text
|
||||
label.font_size = 9
|
||||
label.pixel_size = 0.00048
|
||||
label.font_size = 11
|
||||
label.pixel_size = 0.00052
|
||||
label.modulate = Color(0.09, 0.085, 0.065)
|
||||
label.position = position
|
||||
gauge.add_child(label)
|
||||
|
||||
Reference in new issue
Block a user