Some changes

This commit is contained in:
2026-06-11 19:59:31 -05:00
parent 2f2ea060b1
commit eec429147b
150 changed files with 16615 additions and 262 deletions
+56 -41
View File
@@ -1,51 +1,66 @@
class_name OverworldCamera extends Camera3D
enum TargetType {
FREE,
FOLLOW_NODE
}
const COLLISION_MARGIN:float = 0.3
enum FollowType {
INSTANT,
SMOOTH
}
@export_category("Follow Target")
@export_category("Target")
@export var targetNode:Node3D = null
@export var targetType:TargetType = TargetType.FOLLOW_NODE
@export var targetPosition:Vector3 = Vector3.ZERO
@export var pivotOffset:Vector3 = Vector3(0, 1.2, 0)
@export_category("Follow Settings")
@export var targetOffset:Vector3 = Vector3.ZERO
@export var positionOffset:Vector3 = Vector3(3, 10, 0)
@export var pixelPerfect:bool = true
@export_category("Orbit")
@export var distance:float = 10.0
@export var minDistance:float = 1.5
@export var orbitSensitivity:float = 120.0
@export var pitchMin:float = -10.0
@export var pitchMax:float = 70.0
func getTargetLookAt() -> Vector3:
var targetPos:Vector3
if TargetType.FREE:
targetPos = self.targetPosition
elif TargetType.FOLLOW_NODE:
if targetNode == null:
targetPos = self.global_transform.origin + self.global_transform.basis.z
else:
targetPos = targetNode.global_transform.origin
@export_category("Collision")
@export_flags_3d_physics var collisionMask:int = 1
targetPos += targetOffset
return targetPos
var _yaw:float = 0.0
var _pitch:float = 30.0
func getTargetPosition() -> Vector3:
var targetPos = getTargetLookAt()
targetPos += positionOffset
return targetPos
func _process(delta:float) -> void:
if targetNode == null:
return
func _process(_delta: float) -> void:
var targetPos = getTargetPosition()
global_transform.origin = targetPos
var lookAt = getTargetLookAt()
look_at(lookAt, Vector3.UP)
var orbitInput:Vector2 = Input.get_vector(
"camera_orbit_left", "camera_orbit_right",
"camera_orbit_up", "camera_orbit_down"
)
_yaw += orbitInput.x * orbitSensitivity * delta
# Invert Y so stick-up = camera rises (bird's-eye)
_pitch -= orbitInput.y * orbitSensitivity * delta
_pitch = clamp(_pitch, pitchMin, pitchMax)
func _enter_tree() -> void:
var targetPos = getTargetPosition()
global_transform.origin = targetPos
var lookAt = getTargetLookAt()
look_at(lookAt, Vector3.UP)
var pivot:Vector3 = targetNode.global_transform.origin + pivotOffset
var yawRad:float = deg_to_rad(_yaw)
var pitchRad:float = deg_to_rad(_pitch)
var dir:Vector3 = Vector3(
sin(yawRad) * cos(pitchRad),
sin(pitchRad),
cos(yawRad) * cos(pitchRad)
)
var desired:Vector3 = pivot + dir * distance
var actual:Vector3 = _resolveCollision(pivot, desired)
global_transform.origin = actual
look_at(pivot, Vector3.UP)
# Cast a ray from the pivot to the desired camera position.
# If terrain blocks the shot, pull the camera in to just in front of the hit.
func _resolveCollision(pivot:Vector3, desired:Vector3) -> Vector3:
var space:PhysicsDirectSpaceState3D = get_world_3d().direct_space_state
var query:PhysicsRayQueryParameters3D = PhysicsRayQueryParameters3D.create(pivot, desired)
query.collision_mask = collisionMask
var hit:Dictionary = space.intersect_ray(query)
if hit.is_empty():
return desired
var hitDir:Vector3 = (desired - pivot).normalized()
var pulled:Vector3 = hit["position"] - hitDir * COLLISION_MARGIN
var pulledDist:float = (pulled - pivot).length()
if pulledDist < minDistance:
return pivot + hitDir * minDistance
return pulled