class_name SonarCaptureSample extends RefCounted const SonarMaterial = preload("res://game/domain/sonar/sonar_material.gd") var row: int var column: int var position_m: Vector3 var normal: Vector3 var intensity: float var elevation_m: float var material: SonarMaterial.Value func _init( p_row: int, p_column: int, p_position_m: Vector3, p_normal: Vector3, p_intensity: float, p_elevation_m: float, p_material: SonarMaterial.Value ) -> void: row = p_row column = p_column position_m = p_position_m normal = p_normal intensity = p_intensity elevation_m = p_elevation_m material = p_material func validation_error(columns: int, rows: int) -> String: if row < 0 or row >= rows or column < 0 or column >= columns: return "sonar capture sample coordinates are invalid" if not _vector_is_finite(position_m) or not _vector_is_finite(normal): return "sonar capture sample vectors are not finite" if normal.length_squared() < 0.25: return "sonar capture sample normal is invalid" if not is_finite(intensity) or intensity < 0.0 or intensity > 1.0: return "sonar capture sample intensity is invalid" if not is_finite(elevation_m): return "sonar capture sample elevation is invalid" if material == SonarMaterial.Value.UNKNOWN or not SonarMaterial.is_valid(material): return "sonar capture 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)