Exemplo n.º 1
0
        public void ExtraStep(ushort vehicleID, ref Vehicle vehicleData, ref Vehicle leaderVehicleData)
        {
            // base.ExtraSimulationStep(vehicleID, ref vehicleData);
            uint path = leaderVehicleData.m_path;
            byte pathPositionIndex = leaderVehicleData.m_pathPositionIndex;

            Singleton <PathManager> .instance.m_pathUnits.m_buffer[path].GetPosition(pathPositionIndex >> 1, out PathUnit.Position position);
            ushort segment = position.m_segment;
            byte   lane    = position.m_lane;

            if (segment != 0)
            {
                ushort num = (ushort)((int)(vehicleData.m_flags2 & (Vehicle.Flags2)(-65536)) >> 16);
                byte   b   = (byte)((int)(vehicleData.m_flags2 & (Vehicle.Flags2) 61440) >> 12);
                CalculatePositionAndRotation(vehicleID, ref vehicleData, out Vector3 position2, out Vector3 swayPosition, out Quaternion rotation);
                float      poleLength = m_poleLength;
                Quaternion rhs        = Quaternion.Euler(swayPosition.z * 57.29578f, 0f, swayPosition.x * -57.29578f);
                Vector3    polePivot  = position2 + rotation * rhs * (Vector3.left * m_offsetX + Vector3.back * m_offsetZ + Vector3.up * m_offsetY);
                Vector3    polePivot2 = position2 + rotation * rhs * (Vector3.right * m_offsetX + Vector3.back * m_offsetZ + Vector3.up * m_offsetY);
                Vector3    poleEnd    = position2 + rotation * rhs * (Vector3.left * m_offsetX + Vector3.back * (m_offsetZ + poleLength) + Vector3.up * m_offsetY);
                Vector3    poleEnd2   = position2 + rotation * rhs * (Vector3.right * m_offsetX + Vector3.back * (m_offsetZ + poleLength) + Vector3.up * m_offsetY);
                if (TrolleybusReversePatch.FindSegmentWireConnection(segment, lane, VehicleInfo.VehicleType.TrolleybusLeftPole, polePivot, poleEnd, poleLength, out Vector3 connectionPoint) && TrolleybusReversePatch.FindSegmentWireConnection(segment, lane, VehicleInfo.VehicleType.TrolleybusRightPole, polePivot2, poleEnd2, poleLength, out connectionPoint))
                {
                    pathPositionIndex = leaderVehicleData.m_pathPositionIndex;
                    Singleton <PathManager> .instance.m_pathUnits.m_buffer[path].GetNextPosition(pathPositionIndex >> 1, out PathUnit.Position position3);
                    num = position3.m_segment;
                    b   = position3.m_lane;
                    CachePathData(vehicleID, ref vehicleData, segment, lane, num, b);
                }
            }
        }
Exemplo n.º 2
0
        private Matrix4x4 CalculatePoleMatrix(ushort vehicleID, ref Vehicle vehicleData, Vector3 position, Quaternion rotation, Vector3 swayPosition, VehicleInfo.MeshInfo meshInfo, VehicleInfoBase subInfo, bool assetEditor)
        {
            Vehicle.Flags           flags    = meshInfo.m_vehicleFlagsRequired & (Vehicle.Flags.TakingOff | Vehicle.Flags.Landing);
            VehicleInfo.VehicleType wireType = GetWireType(vehicleData.m_flags, flags);
            float      poleLength            = m_poleLength;
            Quaternion rhs     = Quaternion.Euler(swayPosition.z * 57.29578f, 0f, swayPosition.x * -57.29578f);
            Vector3    a       = (flags != Vehicle.Flags.TakingOff) ? Vector3.left : Vector3.right;
            Vector3    vector  = position + rotation * rhs * (a * m_offsetX + Vector3.back * m_offsetZ + Vector3.up * m_offsetY);
            Vector3    poleEnd = position + rotation * rhs * (a * m_offsetX + Vector3.back * (m_offsetZ + poleLength) + Vector3.up * m_offsetY);
            Vector3    wireAttachmentPosition;

            if (!assetEditor)
            {
                TrolleybusReversePatch.FindWireConnection(vehicleID, ref vehicleData, wireType, poleLength, vector, poleEnd, out wireAttachmentPosition);
            }
            else
            {
                wireAttachmentPosition = position + rotation * rhs * (a * m_offsetX + Vector3.back * (m_offsetZ + poleLength) + Vector3.up * 4.55f);
            }
            Matrix4x4 result = default(Matrix4x4);

            result.SetTRS(vector, Quaternion.LookRotation(vector - wireAttachmentPosition, Vector3.up), Vector3.one);
            return(result);
        }