Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix getPathFromTo #246

Merged
merged 2 commits into from
Nov 16, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions src/Data/Modules/PassengerSeat.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,16 @@ size = Vector3( 0.5, 0.5, 0.2 )
[sub_resource type="SpatialMaterial" id=4]
albedo_color = Color( 0.00784314, 0.788235, 0, 1 )

[node name="PassengerSeat" type="Spatial" groups=[
"PassengerSeat",
]]
[node name="PassengerSeat" type="Spatial" groups=["PassengerSeat"]]
script = ExtResource( 1 )

[node name="MeshInstance" type="MeshInstance" parent="."]
transform = Transform( 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0 )
mesh = SubResource( 1 )
material/0 = SubResource( 2 )

[node name="MeshInstance2" type="MeshInstance" parent="."]
transform = Transform( -4.2222e-08, 1, 2.98023e-08, 1.13133e-08, 2.98023e-08, -1, -1, -4.2222e-08, -1.13133e-08, 0, 0.6, 0 )
[node name="MeshInstance2" type="MeshInstance" parent="MeshInstance"]
transform = Transform( -4.2222e-08, 1, 2.98023e-08, 1.13133e-08, 2.98023e-08, -1, -1, -4.2222e-08, -1.13133e-08, 0, 0.1, 0 )
mesh = SubResource( 3 )
skeleton = NodePath("../..")
material/0 = SubResource( 4 )
8 changes: 3 additions & 5 deletions src/Data/Scripts/PassengerDoor.gd
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
extends Spatial
extends PassengerPathNode

var worldPos: Vector3 ## Only updated by the player in function sendDoorPositionsToCurrentStation()

func _ready():
$MeshInstance.queue_free()
func _init():
type = Type.DOOR
20 changes: 18 additions & 2 deletions src/Data/Scripts/PassengerPathNode.gd
Original file line number Diff line number Diff line change
@@ -1,7 +1,23 @@
class_name PassengerPathNode
extends Spatial

export (Array,String) var connections: Array
export (Array, NodePath) var connections: Array = [] # array of node paths
var connection_nodes := [] # array of nodes

enum Type {
PATH_NODE = 0,
DOOR = 1,
SEAT = 2,
}
var type: int = Type.PATH_NODE

func _ready():
$MeshInstance.queue_free()

for connection in connections:
var conn = get_node(connection)
if conn == null:
Logger.warn("Connection has wrong NodePath!", self)
continue
connection_nodes.append(conn)
if conn.type != Type.PATH_NODE:
conn.connection_nodes.append(self)
7 changes: 3 additions & 4 deletions src/Data/Scripts/PassengerSeat.gd
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
extends Spatial
extends PassengerPathNode

func _ready():
$MeshInstance.queue_free()
$MeshInstance2.queue_free()
func _init():
type = Type.SEAT
2 changes: 1 addition & 1 deletion src/Data/Scripts/Person.gd
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ func handleWalk(delta: float) -> void:
leave_wagon_timer = 0
transitionToStation = false
leave_current_wagon()
if destinationIsSeat and translation.distance_to(attachedSeat.translation) < 0.1:
if destinationIsSeat and attachedSeat != null and translation.distance_to(attachedSeat.translation) < 0.1:
destinationIsSeat = false
rotation_degrees.y = attachedSeat.rotation_degrees.y + 90

Expand Down
10 changes: 0 additions & 10 deletions src/Data/Scripts/Player.gd
Original file line number Diff line number Diff line change
Expand Up @@ -1590,22 +1590,12 @@ func sendDoorPositionsToCurrentStation() -> void:
var doorsArray := []
var doorsWagon := []
for wagon in wagonsI:
var wagonTransform: Transform
if forward:
wagonTransform = wagon.currentRail.get_transform_at_rail_distance(wagon.distance_on_rail)
else:
var forward_transform: Transform = wagon.currentRail.get_transform_at_rail_distance(wagon.distance_on_rail)
var backward_basis: Basis = forward_transform.basis.rotated(Vector3(0,1,0), deg2rad(180)) # Maybe this could break on ascending/descanding rails..
var backward_transform: Transform = Transform(backward_basis, forward_transform.origin)
wagonTransform = backward_transform
if (currentStationNode.platform_side == PlatformSide.LEFT):
for door in wagon.leftDoors:
door.worldPos = (wagonTransform.translated(door.translation).origin)
doorsArray.append(door)
doorsWagon.append(wagon)
if (currentStationNode.platform_side == PlatformSide.RIGHT):
for door in wagon.rightDoors:
door.worldPos = (wagonTransform.translated(door.translation).origin)
doorsArray.append(door)
doorsWagon.append(wagon)
currentStationNode.setDoorPositions(doorsArray, doorsWagon)
Expand Down
5 changes: 3 additions & 2 deletions src/Data/Scripts/Station.gd
Original file line number Diff line number Diff line change
Expand Up @@ -115,16 +115,17 @@ func getRandomTransformAtPlatform() -> Transform:
return Transform(Basis(Vector3(0,deg2rad(rail.get_deg_at_RailDistance(randRailDistance)), 0)) , rail.get_shifted_pos_at_RailDistance(randRailDistance, rand_range(-platformStart, -platformEnd)) + Vector3(0, platformHeight, 0))
return Transform()


func setDoorPositions(doors: Array, doorsWagon: Array) -> void: ## Called by the train
if doors.size() == 0:
return
for person in attachedPersons:
person.clear_destinations()
var nearestDoorIndex = 0
for i in range(doors.size()):
if doors[i].worldPos.distance_to(person.translation) < doors[nearestDoorIndex].worldPos.distance_to(person.translation):
if doors[i].global_transform.origin.distance_to(person.translation) < doors[nearestDoorIndex].global_transform.origin.distance_to(person.translation):
nearestDoorIndex = i
person.destinationPos.append(doors[nearestDoorIndex].worldPos)
person.destinationPos.append(doors[nearestDoorIndex].global_transform.origin)
person.transitionToWagon = true
person.assignedDoor = doors[nearestDoorIndex]
person.attachedWagon = doorsWagon[nearestDoorIndex]
Expand Down
77 changes: 27 additions & 50 deletions src/Data/Scripts/Wagon.gd
Original file line number Diff line number Diff line change
Expand Up @@ -229,11 +229,10 @@ func registerPerson(person: Spatial, door: Spatial):
person.owner = self
person.translation = door.translation

var passengerRoutePath: Array = getPathFromTo(door, seats[seatIndex])
var passengerRoutePath: Array = get_path_from_to(door, seats[seatIndex])
if passengerRoutePath == []:
Logger.err("Some seats of "+ name + " are not reachable from every door!!", self)
return
# print(passengerRoutePath)
person.destinationPos = passengerRoutePath
person.destinationIsSeat = true
person.attachedSeat = seats[seatIndex]
Expand All @@ -250,51 +249,29 @@ func getRandomFreeSeatIndex() -> int:
return -1


func getPathFromTo(start: Spatial, destination: Spatial) -> Array:
var passengerRoutePath := [] ## Array of Vector3
var realStartNode: Node = start
# print(start.get_groups())
if start.is_in_group("PassengerDoor") or start.is_in_group("PassengerSeat"):
# find the connected passengerNode
for passengerPathNode in passengerPathNodes:
for connection in passengerPathNode.connections:
# print(connection + " " + start.name)
if connection == start.name:
passengerRoutePath.append(passengerPathNode.translation)
# print("Equals!")
realStartNode = passengerPathNode
# print(realStartNode.name)

if not realStartNode.is_in_group("PassengerPathNode"):
# printerr("At " + name + " " + start.name + " is not connected to a passengerPathNode!")
func get_path_from_to(from: Spatial, to: Spatial) -> Array:
if from == to:
return []

var restOfpassengerRoutePath: Array = getPathFromToHelper(realStartNode, destination, [])
if restOfpassengerRoutePath == []:
return []
for routePathPosition in restOfpassengerRoutePath:
passengerRoutePath.append(routePathPosition)
return passengerRoutePath


## Recursion, Simple Pathfinding, Start has to be a PassengerPathNode.
func getPathFromToHelper(start: Spatial, destination: Spatial, visitedNodes: Array) -> Array:
# print("Recursion: " + start.name + " " + destination.name + " " + String(visitedNodes))
for connection in start.connections:
var connectionN: Node = get_node(connection)
if connectionN == null:
continue
if connectionN == destination:
return [connectionN.translation]
if connectionN.is_in_group("PassengerPathNode"):
if visitedNodes.has(connectionN):
continue
visitedNodes.append(connectionN)
var passengerRoutePath: Array = getPathFromToHelper(connectionN, destination, visitedNodes)
if passengerRoutePath != null:
passengerRoutePath.push_front(connectionN.translation)
return passengerRoutePath
return []
var previous := {}
var visited := []
var stack := [from]
while not stack.empty():
var node = stack.pop_front()
visited.append(node)
if node == to:
break
for conn in node.connection_nodes:
if not visited.has(conn):
stack.append(conn)
previous[conn] = node

var path := [to.translation]
var node := to
while previous.has(node):
node = previous[node]
path.push_front(node.translation)
return path


func registerPassengerPathNodes() -> void:
Expand All @@ -319,11 +296,9 @@ func sendPersonsToDoor(doorDirection: int, proportion: float = 0.5) -> void:
#0: No platform, 1: at left side, 2: at right side, 3: at both sides
var possibleDoors := []
if doorDirection == 1 or doorDirection == 3: # Left
for door in leftDoors:
possibleDoors.append(door)
possibleDoors.append_array(leftDoors)
if doorDirection == 2 or doorDirection == 3: # Right
for door in rightDoors:
possibleDoors.append(door)
possibleDoors.append_array(rightDoors)

if possibleDoors.empty():
Logger.err(name + ": No Doors found for doorDirection: " + String(doorDirection), self)
Expand All @@ -344,7 +319,7 @@ func sendPersonsToDoor(doorDirection: int, proportion: float = 0.5) -> void:
Logger.err(name + ": Error: Seat from person" + personNode.name+ " not found!", self)
return

var passengerRoutePath: Array = getPathFromTo(seats[seatIndex], randomDoor)
var passengerRoutePath: Array = get_path_from_to(seats[seatIndex], randomDoor)
if passengerRoutePath == []:
Logger.err("Some doors are not reachable from every door! Check your Path configuration", self)
return
Expand Down Expand Up @@ -378,6 +353,7 @@ func initialize_outside_announcement_player() -> void:

add_child(audioStreamPlayer)


func play_outside_announcement(sound_path : String) -> void:
if sound_path == "":
return
Expand All @@ -391,6 +367,7 @@ func play_outside_announcement(sound_path : String) -> void:
outside_announcement_player.stream = stream
outside_announcement_player.play()


var switch_on_next_change: bool = false
func updateSwitchOnNextChange(): ## Exact function also in player.gd. But these are needed: When the player drives over many small rails that could be inaccurate..
if forward and currentRail.isSwitchPart[1] != "":
Expand Down
Loading