57 lines
1.7 KiB
GDScript
57 lines
1.7 KiB
GDScript
class_name FullscreenMenuPresentation
|
|
extends RefCounted
|
|
|
|
const UIReferencePresentationType = preload(
|
|
"res://ui/ui_reference_presentation.gd"
|
|
)
|
|
|
|
const WIDE_REFERENCE_SIZE: Vector2 = Vector2(1280.0, 720.0)
|
|
const COMPACT_REFERENCE_SIZE: Vector2 = Vector2(960.0, 720.0)
|
|
const COMPACT_MAX_ASPECT: float = 1.5
|
|
const COMPACT_SOURCE_RECT := Rect2(160.0, 0.0, 960.0, 720.0)
|
|
|
|
|
|
static func uses_compact_profile(display_size: Vector2) -> bool:
|
|
if display_size.x <= 0.0 or display_size.y <= 0.0:
|
|
return false
|
|
return display_size.aspect() <= COMPACT_MAX_ASPECT
|
|
|
|
|
|
static func get_profile_scale(display_size: Vector2) -> float:
|
|
if not uses_compact_profile(display_size):
|
|
return 1.0
|
|
var wide_scale: float = UIReferencePresentationType.get_scale(display_size)
|
|
var compact_scale: float = minf(
|
|
display_size.x / COMPACT_REFERENCE_SIZE.x,
|
|
display_size.y / COMPACT_REFERENCE_SIZE.y,
|
|
)
|
|
return compact_scale / wide_scale
|
|
|
|
|
|
static func get_profile_position(display_size: Vector2) -> Vector2:
|
|
if not uses_compact_profile(display_size):
|
|
return Vector2.ZERO
|
|
var wide_scale: float = UIReferencePresentationType.get_scale(display_size)
|
|
var compact_scale: float = minf(
|
|
display_size.x / COMPACT_REFERENCE_SIZE.x,
|
|
display_size.y / COMPACT_REFERENCE_SIZE.y,
|
|
)
|
|
var profile_scale: float = compact_scale / wide_scale
|
|
var wide_offset: Vector2 = UIReferencePresentationType.get_offset(
|
|
display_size
|
|
)
|
|
var compact_offset: Vector2 = (
|
|
display_size - COMPACT_REFERENCE_SIZE * compact_scale
|
|
) * 0.5
|
|
return (
|
|
(compact_offset - wide_offset) / wide_scale
|
|
- COMPACT_SOURCE_RECT.position * profile_scale
|
|
)
|
|
|
|
|
|
static func get_source_rect(display_size: Vector2) -> Rect2:
|
|
return (
|
|
COMPACT_SOURCE_RECT
|
|
if uses_compact_profile(display_size)
|
|
else Rect2(Vector2.ZERO, WIDE_REFERENCE_SIZE)
|
|
)
|