private FindTargetMesh findClosestMesh(RoadConnector connector, RoadConnectorPort port) { MeshInstance mesh = null; Vector3 currentFace = Vector3.Zero; var newMesh = port.GetSide().mesh; float oldDistance = 99999; if (port.GetSide().findMesh == false && newMesh != null && newMesh is MeshInstance) { GD.Print("use no mesh filter"); var tempMesh = (MeshInstance)newMesh; foreach (var face2 in tempMesh.Mesh.GetFaces()) { var face = tempMesh.Transform.Xform(face2); var newDistance = port.Translation.DistanceTo(face); if (newDistance <= oldDistance) { currentFace = face; mesh = tempMesh; oldDistance = newDistance; } } } else if (port.GetSide().findMesh) { GD.Print("find by meshes"); foreach (var tempMesh in connector.GetMeshes()) { foreach (var face2 in tempMesh.Mesh.GetFaces()) { var face = tempMesh.Transform.Xform(face2); var newDistance = port.Translation.DistanceTo(face); if (newDistance <= oldDistance) { currentFace = face; mesh = tempMesh; oldDistance = newDistance; } } } } else { GD.Print("cant find any mesh"); } var tag = new FindTargetMesh { mesh = mesh, vec = connector.Transform.Xform(currentFace) }; return(tag); }
//only for testing private void createTestPoint(Vector3 transform) { var t = new RoadConnectorPort(); var gt2 = t.Transform; gt2.origin = transform; t.Transform = gt2; t.test = true; roadGrid.AddChild(t); t.Owner = GetEditorInterface().GetEditedSceneRoot(); t.Scale = new Vector3(0.25f, 0.25f, 0.25f); }
private void initConnector() { if (editConnector != null) { var sideScene = GD.Load <PackedScene>("res://addons/road_editor/RoadConnectorSide.tscn"); var tf = (RoadConnectorSide)sideScene.Instance(); var connectorPortScript = GD.Load <Script>("res://addons/road_editor/RoadConnectorPort.cs"); var topRight = new RoadConnectorPort(); var topLeft = new RoadConnectorPort(); var bottomRight = new RoadConnectorPort(); var bottomLeft = new RoadConnectorPort(); tf.Name = "port_1"; tf.AddChild(bottomRight); tf.AddChild(bottomLeft); tf.AddChild(topRight); tf.AddChild(topLeft); editConnector.AddChild(tf); tf.Owner = GetEditorInterface().GetEditedSceneRoot(); topRight.Owner = GetEditorInterface().GetEditedSceneRoot(); topLeft.Owner = GetEditorInterface().GetEditedSceneRoot(); bottomRight.Owner = GetEditorInterface().GetEditedSceneRoot(); bottomLeft.Owner = GetEditorInterface().GetEditedSceneRoot(); bottomRight.Name = "down_right"; bottomLeft.Name = "down_left"; topRight.Name = "up_right"; topLeft.Name = "up_left"; tf.side_top_right_path = topRight.GetPath(); tf.side_top_left_path = topLeft.GetPath(); tf.side_bottom_right_path = bottomRight.GetPath(); tf.side_bottom_left_path = bottomLeft.GetPath(); topRight.SetScript(connectorPortScript); topLeft.SetScript(connectorPortScript); bottomRight.SetScript(connectorPortScript); bottomLeft.SetScript(connectorPortScript); } }
public override void _Ready() { portTopLeft = ConnectPort(side_top_left_path); portTopRight = ConnectPort(side_top_right_path); portBottomLeft = ConnectPort(side_bottom_left_path); portBottomRight = ConnectPort(side_bottom_right_path); if (meshPath != null) { var node = GetNodeOrNull(meshPath); if (node != null && node is MeshInstance) { mesh = (MeshInstance)node; } } }
private float calclateRadius(RoadConnector connector, RoadConnectorPort left, RoadConnectorPort right, RoadConnectorPort bottom_left, RoadConnectorPort top_right) { var source_ports_front_0_test = findClosestMesh(connector, left); var source_ports_front_1_test = findClosestMesh(connector, right); var source_ports_rears_0_test = findClosestMesh(connector, bottom_left); var source_ports_rears_1_test = findClosestMesh(connector, top_right); var v1 = source_ports_front_0_test.vec; var v2 = source_ports_front_1_test.vec; var v3 = source_ports_rears_0_test.vec; var v4 = source_ports_rears_1_test.vec; v1.y = 0; v2.y = 0; v3.y = 0; v4.y = 0; var totalRadiusSource = (v2 - v1).AngleTo((v4 - v3)); return(Mathf.Rad2Deg(totalRadiusSource)); }