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); } } }
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); }