51 lines
1.4 KiB
GDScript
51 lines
1.4 KiB
GDScript
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)
|