123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- extends Test
- const OPTION_JOINT_TYPE = "Joint Type/%s Joint (%d)"
- const OPTION_TEST_CASE_BODIES_COLLIDE = "Test case/Attached bodies collide"
- const OPTION_TEST_CASE_WORLD_ATTACHMENT = "Test case/No parent body"
- const OPTION_TEST_CASE_DYNAMIC_ATTACHMENT = "Test case/Parent body is dynamic (no gravity)"
- const OPTION_TEST_CASE_DESTROY_BODY = "Test case/Destroy attached body"
- const OPTION_TEST_CASE_CHANGE_POSITIONS = "Test case/Set body positions after added to scene"
- const BOX_SIZE = Vector3(1.0, 1.0, 1.0)
- var _update_joint = false
- var _selected_joint = null
- var _bodies_collide = false
- var _world_attachement = false
- var _dynamic_attachement = false
- var _destroy_body = false
- var _change_positions = false
- var _joint_types = {}
- func _ready():
- var options = $Options
- var joints = $Joints
- for joint_index in joints.get_child_count():
- var joint_node = joints.get_child(joint_index)
- joint_node.visible = false
- var joint_name = String(joint_node.name)
- var joint_short = joint_name.substr(0, joint_name.length() - 5)
- var option_name = OPTION_JOINT_TYPE % [joint_short, joint_index + 1]
- options.add_menu_item(option_name)
- _joint_types[option_name] = joint_node
- options.add_menu_item(OPTION_TEST_CASE_BODIES_COLLIDE, true, false)
- options.add_menu_item(OPTION_TEST_CASE_WORLD_ATTACHMENT, true, false)
- options.add_menu_item(OPTION_TEST_CASE_DYNAMIC_ATTACHMENT, true, false)
- options.add_menu_item(OPTION_TEST_CASE_DESTROY_BODY, true, false)
- options.add_menu_item(OPTION_TEST_CASE_CHANGE_POSITIONS, true, false)
- options.connect(&"option_selected", Callable(self, "_on_option_selected"))
- options.connect(&"option_changed", Callable(self, "_on_option_changed"))
- _selected_joint = _joint_types.values()[0]
- _update_joint = true
- func _process(_delta):
- if _update_joint:
- _update_joint = false
- await _create_joint()
- $LabelJointType.text = "Joint Type: " + String(_selected_joint.name)
- func _input(event):
- var key_event = event as InputEventKey
- if key_event and not key_event.pressed:
- var joint_index = key_event.keycode - KEY_1
- if joint_index >= 0 and joint_index < _joint_types.size():
- _selected_joint = _joint_types.values()[joint_index]
- _update_joint = true
- func _on_option_selected(option):
- if _joint_types.has(option):
- _selected_joint = _joint_types[option]
- _update_joint = true
- func _on_option_changed(option, checked):
- match option:
- OPTION_TEST_CASE_BODIES_COLLIDE:
- _bodies_collide = checked
- _update_joint = true
- OPTION_TEST_CASE_WORLD_ATTACHMENT:
- _world_attachement = checked
- _update_joint = true
- OPTION_TEST_CASE_DYNAMIC_ATTACHMENT:
- _dynamic_attachement = checked
- _update_joint = true
- OPTION_TEST_CASE_DESTROY_BODY:
- _destroy_body = checked
- _update_joint = true
- OPTION_TEST_CASE_CHANGE_POSITIONS:
- _change_positions = checked
- _update_joint = true
- func _create_joint():
- cancel_timer()
- var root = $Objects
- while root.get_child_count():
- var last_child_index = root.get_child_count() - 1
- var last_child = root.get_child(last_child_index)
- root.remove_child(last_child)
- last_child.queue_free()
- var child_body = create_rigidbody_box(BOX_SIZE, true)
- if _change_positions:
- root.add_child(child_body)
- child_body.transform.origin = Vector3(0.0, -1.5, 0.0)
- else:
- child_body.transform.origin = Vector3(0.0, -1.5, 0.0)
- root.add_child(child_body)
- var parent_body = null
- if not _world_attachement:
- parent_body = create_rigidbody_box(BOX_SIZE, true)
- if _dynamic_attachement:
- parent_body.gravity_scale = 0.0
- child_body.gravity_scale = 0.0
- else:
- parent_body.freeze = true
- if _change_positions:
- root.add_child(parent_body)
- parent_body.transform.origin = Vector3(0.0, 1.5, 0.0)
- else:
- parent_body.transform.origin = Vector3(0.0, 1.5, 0.0)
- root.add_child(parent_body)
- var joint = _selected_joint.duplicate()
- joint.visible = true
- joint.set_exclude_nodes_from_collision(not _bodies_collide)
- root.add_child(joint)
- if parent_body:
- joint.set_node_a(joint.get_path_to(parent_body))
- joint.set_node_b(joint.get_path_to(child_body))
- if _destroy_body:
- await start_timer(0.5).timeout
- if is_timer_canceled():
- return
- child_body.queue_free()
|