예제 #1
0
        void SendShapeToTeselator(VertexCachedTesselator teselator, IVertexSource vertexSource)
        {
            teselator.BeginPolygon();

            Path.FlagsAndCommand PathAndFlags = 0;
            double x, y;
            bool   haveBegunContour = false;

            while (!Path.is_stop(PathAndFlags = vertexSource.vertex(out x, out y)))
            {
                if (Path.is_close(PathAndFlags) ||
                    (haveBegunContour && Path.is_move_to(PathAndFlags)))
                {
                    teselator.EndContour();
                    haveBegunContour = false;
                }

                if (!Path.is_close(PathAndFlags))
                {
                    if (!haveBegunContour)
                    {
                        teselator.BeginContour();
                        haveBegunContour = true;
                    }

                    teselator.AddVertex(x, y);
                }
            }

            if (haveBegunContour)
            {
                teselator.EndContour();
            }

#if use_timers
            OpenGLEndPolygonTimer.Start();
#endif
            teselator.EndPolygon();
#if use_timers
            OpenGLEndPolygonTimer.Stop();
#endif
        }
예제 #2
0
파일: Arc.cs 프로젝트: Wiladams/NewTOAPIA
        public Path.FlagsAndCommand vertex(out double x, out double y)
        {
            x = 0;
            y = 0;

            if (Path.is_stop(m_NextPathCommand))
            {
                return Path.FlagsAndCommand.CommandStop;
            }

            if ((m_CurrentFlatenAngle < m_EndAngle - m_FlatenDeltaAngle / 4) != ((int)EDirection.CounterClockWise == 1))
            {
                x = m_OriginX + Math.Cos(m_EndAngle) * m_RadiusX;
                y = m_OriginY + Math.Sin(m_EndAngle) * m_RadiusY;
                m_NextPathCommand = Path.FlagsAndCommand.CommandStop;

                return Path.FlagsAndCommand.CommandLineTo;
            }

            x = m_OriginX + Math.Cos(m_CurrentFlatenAngle) * m_RadiusX;
            y = m_OriginY + Math.Sin(m_CurrentFlatenAngle) * m_RadiusY;

            m_CurrentFlatenAngle += m_FlatenDeltaAngle;

            Path.FlagsAndCommand CurrentPathCommand = m_NextPathCommand;
            m_NextPathCommand = Path.FlagsAndCommand.CommandLineTo;
            return CurrentPathCommand;
        }
예제 #3
0
파일: Arc.cs 프로젝트: Wiladams/NewTOAPIA
 public void rewind(int unused)
 {
     m_NextPathCommand = Path.FlagsAndCommand.CommandMoveTo;
     m_CurrentFlatenAngle = m_StartAngle;
 }
예제 #4
0
        public Pictor.Path.FlagsAndCommand Vertex(out double x, out double y)
        {
            x = 0;
            y = 0;
            Path.FlagsAndCommand cmd = Path.FlagsAndCommand.CommandStop;
            bool done = false;
            while (!done) {
                switch (status) {
                    case Status.Initial:
                        markers.RemoveAll ();
                        lastCommand = source.Vertex (out startX, out startY);
                        status = Status.Accumulate;
                        goto case Status.Accumulate;

                    case Status.Accumulate:
                        if (Path.IsStop (lastCommand))
                            return Path.FlagsAndCommand.CommandStop;

                        generator.RemoveAll ();
                        generator.AddVertex (startX, startY, Path.FlagsAndCommand.CommandMoveTo);
                        markers.AddVertex (startX, startY, Path.FlagsAndCommand.CommandMoveTo);

                        while (true) {
                            cmd = source.Vertex (out x, out y);

                            if (Path.IsVertex (cmd)) {
                                lastCommand = cmd;
                                if (Path.IsMoveTo (cmd)) {
                                    startX = x;
                                    startY = y;
                                    break;
                                }
                                generator.AddVertex (x, y, cmd);
                                markers.AddVertex (x, y, Path.FlagsAndCommand.CommandLineTo);
                            } else {
                                if (Path.IsStop (cmd)) {
                                    lastCommand = Path.FlagsAndCommand.CommandStop;
                                    break;
                                }
                                if (Path.IsEndPoly (cmd)) {
                                    generator.AddVertex (x, y, cmd);
                                    break;
                                }
                            }

                            generator.Rewind (0);
                            status = Status.Generate;
                            goto case Status.Generate;
                        }

                        break;

                    case Status.Generate:
                        cmd = generator.Vertex (ref x, ref y);
                        if (Path.IsStop (cmd)) {
                            status = Status.Accumulate;
                            break;
                        }
                        done = true;
                        break;
                }
            }
            return cmd;
        }