public static void RenderAndDeleteTrajectory(IntPtr trajectory_iterator, UnityEngine.Color colour, Style style) { try { Vector3d?previous_point = null; UnityEngine.GL.Color(colour); int size = trajectory_iterator.IteratorSize(); for (int i = 0; !trajectory_iterator.IteratorAtEnd(); trajectory_iterator.IteratorIncrement(), ++i) { Vector3d current_point = (Vector3d)trajectory_iterator.IteratorGetXYZ(); if (previous_point.HasValue) { if (style == Style.FADED) { colour.a = (float)(4 * i + size) / (float)(5 * size); UnityEngine.GL.Color(colour); } if (style != Style.DASHED || i % 2 == 1) { AddSegment(previous_point.Value, current_point, hide_behind_bodies: true); } } previous_point = current_point; } } finally { Interface.IteratorDelete(ref trajectory_iterator); } }
public void RenderAndDeleteApsides(IntPtr apsis_iterator, CelestialBody celestial, MapObject.ObjectType type, NodeSource source) { for (; !apsis_iterator.IteratorAtEnd(); apsis_iterator.IteratorIncrement()) { Vector3d apsis = (Vector3d)apsis_iterator.IteratorGetXYZ(); MapNodeProperties node_properties; node_properties.object_type = type; node_properties.celestial = celestial; node_properties.world_position = apsis; node_properties.source = source; if (pool_index_ == nodes_.Count) { UnityEngine.Debug.LogWarning("Adding node to pool"); AddMapNodeToPool(); } properties_[nodes_[pool_index_++]] = node_properties; } Interface.IteratorDelete(ref apsis_iterator); }
public void RenderAndDeleteMarkers(IntPtr apsis_iterator, MapObject.ObjectType type, NodeSource source, Vessel vessel, CelestialBody celestial) { for (; !apsis_iterator.IteratorAtEnd(); apsis_iterator.IteratorIncrement()) { QP apsis = apsis_iterator.IteratorGetDiscreteTrajectoryQP(); MapNodeProperties node_properties; node_properties.object_type = type; node_properties.vessel = vessel; node_properties.celestial = celestial; node_properties.world_position = (Vector3d)apsis.q; node_properties.velocity = (Vector3d)apsis.p; node_properties.source = source; node_properties.time = apsis_iterator.IteratorGetDiscreteTrajectoryTime(); if (pool_index_ == nodes_.Count) { nodes_.Add(MakePoolNode()); } else if (properties_[nodes_[pool_index_]].object_type != type) { // Do not reuse a node for different types, as this results in // overlapping labels on KSP 1.3, e.g. a closest approach marker that // also says "Ap" and "DN". nodes_[pool_index_].Terminate(); properties_.Remove(nodes_[pool_index_]); nodes_[pool_index_] = MakePoolNode(); } properties_[nodes_[pool_index_++]] = node_properties; } Interface.IteratorDelete(ref apsis_iterator); }
public static void RenderAndDeleteTrajectory(IntPtr trajectory_iterator, UnityEngine.Color colour, Style style) { try { Vector3d? previous_point = null; UnityEngine.GL.Color(colour); int size = trajectory_iterator.IteratorSize(); for (int i = 0; !trajectory_iterator.IteratorAtEnd(); trajectory_iterator.IteratorIncrement(), ++i) { Vector3d current_point = (Vector3d)trajectory_iterator.IteratorGetXYZ(); if (previous_point.HasValue) { if (style == Style.FADED) { colour.a = (float)(4 * i + size) / (float)(5 * size); UnityEngine.GL.Color(colour); } if (style != Style.DASHED || i % 2 == 1) { AddSegment(previous_point.Value, current_point, hide_behind_bodies : true); } } previous_point = current_point; } } finally { Interface.IteratorDelete(ref trajectory_iterator); } }
public static void PlotAndDeleteRP2Lines(IntPtr rp2_lines_iterator, UnityEngine.Color colour, Style style) { try { UnityEngine.GL.Color(colour); // First evaluate the total size of the lines. int size = 0; for (; !rp2_lines_iterator.IteratorAtEnd(); rp2_lines_iterator.IteratorIncrement()) { IntPtr rp2_line_iterator = rp2_lines_iterator.IteratorGetRP2LinesIterator(); try { size += rp2_line_iterator.IteratorSize(); } finally { Interface.IteratorDelete(ref rp2_line_iterator); } } // Reset the iterator and do the actual plotting. rp2_lines_iterator.IteratorReset(); int index = 0; for (; !rp2_lines_iterator.IteratorAtEnd(); rp2_lines_iterator.IteratorIncrement()) { IntPtr rp2_line_iterator = rp2_lines_iterator.IteratorGetRP2LinesIterator(); try { XY?previous_rp2_point = null; for (; !rp2_line_iterator.IteratorAtEnd(); rp2_line_iterator.IteratorIncrement()) { XY current_rp2_point = ToScreen( rp2_line_iterator.IteratorGetRP2LineXY()); if (previous_rp2_point.HasValue) { if (style == Style.FADED) { colour.a = 1 - (float)(4 * index) / (float)(5 * size); UnityEngine.GL.Color(colour); } if (style != Style.DASHED || index % 2 == 1) { UnityEngine.GL.Vertex3((float)previous_rp2_point.Value.x, (float)previous_rp2_point.Value.y, 0); UnityEngine.GL.Vertex3((float)current_rp2_point.x, (float)current_rp2_point.y, 0); } } previous_rp2_point = current_rp2_point; ++index; } } finally { Interface.IteratorDelete(ref rp2_line_iterator); } } } finally { Interface.IteratorDelete(ref rp2_lines_iterator); } }