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);
        }
    }
Beispiel #4
0
    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));
    }