Files
Ransom-s-wake/game/domain/sonar/sonar_sample.gd

54 lines
1.5 KiB
GDScript

class_name SonarSample
extends RefCounted
const SonarMaterial = preload("res://game/domain/sonar/sonar_material.gd")
var position_m: Vector3
var normal: Vector3
var intensity: float
var elevation_m: float
var material: SonarMaterial.Value
var observed: bool
func _init(
p_position_m: Vector3 = Vector3.ZERO,
p_normal: Vector3 = Vector3.UP,
p_intensity: float = 0.0,
p_elevation_m: float = 0.0,
p_material: SonarMaterial.Value = SonarMaterial.Value.UNKNOWN,
p_observed: bool = false
) -> void:
position_m = p_position_m
normal = p_normal
intensity = p_intensity
elevation_m = p_elevation_m
material = p_material
observed = p_observed
static func unknown() -> SonarSample:
return new()
func validation_error() -> String:
if not observed:
if material != SonarMaterial.Value.UNKNOWN:
return "unobserved sonar sample has a material"
return ""
if not _vector_is_finite(position_m):
return "sonar sample position is not finite"
if not _vector_is_finite(normal) or normal.length_squared() < 0.25:
return "sonar sample normal is invalid"
if not is_finite(intensity) or intensity < 0.0 or intensity > 1.0:
return "sonar sample intensity must be between 0 and 1"
if not is_finite(elevation_m):
return "sonar sample elevation is not finite"
if material == SonarMaterial.Value.UNKNOWN or not SonarMaterial.is_valid(material):
return "observed sonar sample material is invalid"
return ""
func _vector_is_finite(value: Vector3) -> bool:
return is_finite(value.x) and is_finite(value.y) and is_finite(value.z)