/// <summary> /// MSTS WFiles represent some location with a position, 3x3 matrix and tile coordinates /// This converts it to the ORTS WorldPosition representation /// </summary> internal static WorldPosition WorldPositionFromMSTSLocation(PositionHolder holder, uint uid) { if (holder.LocationSet && holder.PositionSet) { holder.Location.Z *= -1;; Matrix xnaMatrix = new Matrix( holder.Position.M00, holder.Position.M01, -holder.Position.M02, 0, holder.Position.M10, holder.Position.M11, -holder.Position.M12, 0, -holder.Position.M20, -holder.Position.M21, holder.Position.M22, 0, 0, 0, 0, 1); return(new WorldPosition(holder.TileX, holder.TileZ, MatrixExtension.Multiply(xnaMatrix, Matrix.CreateTranslation(holder.Location)))); } else if (holder.LocationSet && holder.DirectionSet) { holder.Direction.Z *= -1; holder.Location.Z *= -1;; return(new WorldPosition(holder.TileX, holder.TileZ, MatrixExtension.Multiply(Matrix.CreateFromQuaternion(holder.Direction), Matrix.CreateTranslation(holder.Location)))); } else { Trace.TraceWarning($"Scenery object UiD {uid} is missing Matrix3x3 and QDirection"); return(WorldPosition.None); } }