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 }
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; }
public void rewind(int unused) { m_NextPathCommand = Path.FlagsAndCommand.CommandMoveTo; m_CurrentFlatenAngle = m_StartAngle; }
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; }