Esempio n. 1
0
            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);
                }
            }
Esempio n. 2
0
            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);
            }
Esempio n. 3
0
            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);
            }
Esempio n. 4
0
            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);
                }
            }
Esempio n. 5
0
            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);
                }
            }