Files
mtgodot-poc/project/game_camera_test.gd

61 lines
2.4 KiB
GDScript

# game_camera_test —— CameraProcedure / PythonApplicationCamera 的离线状态回归。
extends SceneTree
const GameCamera = preload("res://game_camera.gd")
var _fail := 0
func _ck(condition: bool, message: String) -> void:
if not condition:
_fail += 1
printerr("FAIL: " + message)
func _init() -> void:
await _run()
if _fail == 0:
print("PASS: game_camera_test (NORMAL/STAND/BLEND + cm/degree conversion)")
quit(0)
else:
printerr("%d check(s) failed" % _fail)
quit(1)
func _run() -> void:
var root := Node3D.new()
get_root().add_child(root)
var actor := Node3D.new()
actor.position = Vector3(10, 2, 20)
root.add_child(actor)
var camera: Camera3D = GameCamera.new()
camera.target = actor
root.add_child(camera)
await process_frame
_ck(camera.camera_mode == GameCamera.CameraMode.NORMAL, "starts in NORMAL mode")
_ck(is_equal_approx(camera.dist, 15.5), "default distance is 1550cm")
_ck(is_equal_approx(camera.pitch, deg_to_rad(27.0)), "default pitch is 27 degrees")
var shot := {"x": 1000, "y": 2000, "z": 300, "distance": 500, "pitch": 40, "rot": 90,
"up": 0, "view": 0, "cross": 0}
camera.set_event_camera(shot)
_ck(camera.camera_mode == GameCamera.CameraMode.STAND, "SET_CAMERA enters STAND")
_ck(camera.is_event_locked(), "event camera locks orbit")
var setting: Dictionary = camera.get_camera_setting()
_ck(is_equal_approx(float(setting.distance), 500.0), "event distance remains centimetres")
camera.snap_to_target()
_ck(camera.global_position.distance_to(Vector3(13.830, 6.214, 20)) < 0.02,
"event centre converts server x/y/z into world axes: %s" % camera.global_position)
camera.blend_event_camera({"x": 3000, "y": 4000, "z": 500, "distance": 1000,
"pitch": 60, "rot": 180}, 1.0)
camera._process(0.5)
var middle: Dictionary = camera.get_camera_setting()
_ck(camera.camera_mode == GameCamera.CameraMode.BLEND, "blend remains BLEND before deadline")
_ck(is_equal_approx(float(middle.distance), 750.0), "blend is linear at half duration")
camera._process(0.6)
_ck(camera.camera_mode == GameCamera.CameraMode.STAND, "blend settles into STAND")
_ck(is_equal_approx(camera.dist, 10.0), "blend target distance applied")
camera.set_default_camera()
_ck(camera.camera_mode == GameCamera.CameraMode.NORMAL, "RESTORE_CAMERA enters NORMAL")
_ck(is_equal_approx(camera.dist, 15.5), "RESTORE_CAMERA restores saved normal view")
root.queue_free()