Beispiel #1
0
 //---------------------------------------------------------------------------------------------------------
 /// <summary>
 /// Чтение свойств и данных трансформируемого объекта из формата атрибутов XML
 /// </summary>
 /// <param name="prefix">Префикс имени атрибута</param>
 /// <param name="xml_reader">Средство чтения данных формата XML</param>
 //---------------------------------------------------------------------------------------------------------
 public void ReadTransformableFromAttribute(String prefix, XmlReader xml_reader)
 {
     mPosition       = xml_reader.ReadMathVector2DfFromAttribute(prefix + "Position");
     mRotationAngle  = xml_reader.ReadSingleFromAttribute(prefix + "RotationAngle");
     mRotationOrigin = xml_reader.ReadMathVector2DfFromAttribute(prefix + "RotationOrigin");
     UpdateTransform();
 }
Beispiel #2
0
        public bool PeutVoir(SceneNode objet1, SceneNode objet2)
        {
            Vector2Df pos  = new Vector2Df(objet1.Position.X + .5f, objet1.Position.Z + .5f);
            Vector2Df pos2 = new Vector2Df(objet2.Position.X + .5f, objet2.Position.Z + .5f);
            float     dist = pos.GetDistanceFrom(pos2);
            Vector2Df v    = (pos2 - pos).Normalize() * 0.1f;

            for (float f = 0; f < dist; f += 0.1f)
            {
                Vector2Di posI = new Vector2Di((int)pos.X, (int)pos.Y);

                if ((posI.X < 0) || (posI.Y < 0) || (posI.X >= 32) || (posI.Y >= 32))
                {
                    return(false);
                }
                if (Murs[posI.X, posI.Y])
                {
                    return(false);
                }

                pos += v;
            }

            return(true);
        }
 //---------------------------------------------------------------------------------------------------------
 /// <summary>
 /// Конструктор инициализирует объект класса указанными параметрами
 /// </summary>
 /// <param name="geometry">Геометрия</param>
 /// <param name="start_point">Начальная точка</param>
 /// <param name="end_point">Конечная точка</param>
 //---------------------------------------------------------------------------------------------------------
 public CCadSegmentLine(CCadPrimitiveGeometry geometry, Vector2Df start_point, Vector2Df end_point)
 {
     mGeometry    = geometry;
     mBasePoint   = start_point;
     mEndPoint    = end_point;
     mSegmentType = TCadSegmentType.Line;
 }
Beispiel #4
0
        public bool TenterMouvement(SceneNode objet, Vector3Df direction, float rayon = .25f)
        {
            Vector2Df nouvellePosition = new Vector2Df(objet.Position.X + direction.X + .5f, objet.Position.Z + direction.Z + .5f);

            int minX = (int)(nouvellePosition.X - rayon);
            int maxX = (int)(nouvellePosition.X + rayon);

            int minY = (int)(nouvellePosition.Y - rayon);
            int maxY = (int)(nouvellePosition.Y + rayon);

            int x, y;

            for (x = minX; x <= maxX; x++)
            {
                for (y = minY; y <= maxY; y++)
                {
                    if (x < 0 || y < 0 || x >= 32 || y >= 32)
                    {
                        return(false);
                    }

                    if (Murs[x, y])
                    {
                        return(false);
                    }
                }
            }

            objet.Position += direction;
            return(true);
        }
Beispiel #5
0
        private void Tirer()
        {
            Vector2Df pos = new Vector2Df(Device.SceneManager.ActiveCamera.Position.X, Device.SceneManager.ActiveCamera.Position.Z);
            Vector2Df v   = new Vector2Df(VecteurAvant.X, VecteurAvant.Z) * 0.1f;

            //Console.WriteLine(pos);
            //Console.WriteLine(v);

            for (float f = 0; f < 128; f++)
            {
                for (int i = 0; i < Choses.Count; i++)
                {
                    if (Choses[i].Position.GetDistanceFrom(pos) < .25f)
                    {
                        if (PeutVoir(Device.SceneManager.ActiveCamera, Choses[i].Sprite))
                        {
                            Choses[i].InfligerDegats(5);
                        }

                        return;
                    }
                }

                pos += v;
            }
        }
            //---------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Окончание захвата от управления курсора
            /// </summary>
            /// <param name="point">Точка в координатах канвы</param>
            //---------------------------------------------------------------------------------------------------------
            public void EndCapturePosition(ref Vector2Df point)
            {
                //if (mSelectedElements.Count > 0)
                //{
                //	for (Int32 i = 0; i < mSelectedElements.Count; i++)
                //	{
                //		ICadControlElementMouse control_element = mSelectedElements[i] as ICadControlElementMouse;
                //		control_element.EndCapturePosition(ref point);
                //	}

                //	if (ModifyIsCopy)
                //	{
                //		ModifyIsCopy = false;

                //		// Освобождаем текущие элементы от выделения
                //		Clear();

                //		// Добавляем копии в выбранные
                //		for (Int32 i = 0; i < mCopyElements.Count; i++)
                //		{
                //			//Add(mCopyElements[i]);
                //		}

                //		// Очищаем копии
                //		mCopyElements.Clear();
                //	}

                //	mCapturePoint = Vector2Df.Zero;
                //}
            }
Beispiel #7
0
 void getVectorAsStringLine(Vector2Df v, ref string s)
 {
     s  = v.X.ToString();
     s += " ";
     s += (-v.Y).ToString();
     s += "\n";
 }
            //---------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Окончание создание полилинии
            /// </summary>
            /// <param name="pos">Конечная позиция</param>
            //---------------------------------------------------------------------------------------------------------
            public void EndPolyline(Vector2Df pos)
            {
                mPrimitive.Update();
                //XCadManager.Canvas.Update();

                SetHandleRects();
            }
            //---------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Начало захвата от управления курсора
            /// </summary>
            /// <param name="point">Точка в координатах канвы</param>
            //---------------------------------------------------------------------------------------------------------
            public override void StartCapturePosition(ref Vector2Df point)
            {
                // Проверяем наведение на ручки
                if (mHandleIndex != -1)
                {
                    return;
                }

                // Если есть попадание
                mHandleIndex = CheckPointInHandleRect(ref point);

                if (mHandleIndex != -1)
                {
                    XCadManager.Editor.CaptureElement     = this;
                    XCadManager.Editor.CapturePointOffset = mPrimitive.StartSegmentOfPoints[mHandleIndex] - point;
                }
                else
                {
                    XCadManager.Editor.CaptureElement     = null;
                    XCadManager.Editor.CapturePointOffset = Vector2Df.Zero;
                }

                // Ставим соответствующий курсор
                SetHandleCursor();

                // Сохраняем положение
                //mCachedStartPoint = mStartPoint;
                //mCachedEndPoint = mEndPoint;

                // Копируем в состояние
                //XManager.MementoManager.AddStateToHistory(new CStateMementoElementChange(this));

                // Обновляем канву
                //XCadManager.Canvas.Update();
            }
            //---------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Добавление точки к полилинии
            /// </summary>
            /// <param name="pos">Текущая позиция</param>
            //---------------------------------------------------------------------------------------------------------
            public void CreateAddPoint(Vector2Df pos)
            {
                mPrimitive.StartSegmentOfPoints.AddPoint(ref pos);

                mPrimitive.Update();
                //XCadManager.Canvas.Update();
            }
            //---------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Продолжение создание полилинии
            /// </summary>
            /// <param name="pos">Текущая позиция</param>
            /// <param name="index">Индекс точки</param>
            //---------------------------------------------------------------------------------------------------------
            public void CreateContinuePolyline(ref Vector2Df pos, Int32 index)
            {
                mPrimitive.StartSegmentOfPoints[index] = pos;

                mPrimitive.Update();
                //XCadManager.Canvas.Update();
            }
Beispiel #12
0
 //---------------------------------------------------------------------------------------------------------
 /// <summary>
 /// Конструктор инициализирует объект класса указанными параметрами
 /// </summary>
 /// <param name="text">Текст</param>
 /// <param name="start_point">Начальная точка</param>
 /// <param name="font_size">Размер шрифта текста</param>
 /// <param name="family">Имя семейства шрифтов</param>
 //---------------------------------------------------------------------------------------------------------
 public CCadDirect2DPrimitiveText(String text, Vector2Df start_point, Single font_size, String family = "Arial")
 {
     mText     = text;
     mFontSize = font_size;
     mBoundsRect.PointTopLeft = start_point;
     Update();
 }
            //---------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Вычисление базовой точки отрисовки текста
            /// </summary>
            /// <param name="id">Идентификатор текста</param>
            /// <param name="h_align">Вертикальное выравнивание</param>
            /// <param name="v_align">Горизонтальное выравнивание</param>
            /// <param name="rect">Прямоугольник</param>
            /// <returns>Базовая точка</returns>
            //---------------------------------------------------------------------------------------------------------
            public Vector2Df ComputeTextIDPoint(Int32 id, TCadTextHorizontalAlignment h_align,
                                                TCadTextVerticalAlignment v_align, Rect2Df rect)
            {
                Vector2Df point = Vector2Df.Zero;

                return(point);
            }
 //---------------------------------------------------------------------------------------------------------
 /// <summary>
 /// Конструктор инициализирует объект класса указанными параметрами
 /// </summary>
 /// <param name="geometry">Геометрия</param>
 /// <param name="segment_line">Сегмент отдельной линии</param>
 //---------------------------------------------------------------------------------------------------------
 public CCadSegmentLine(CCadPrimitiveGeometry geometry, CCadSegmentLine segment_line)
 {
     mGeometry    = geometry;
     mBasePoint   = segment_line.mBasePoint;
     mEndPoint    = segment_line.mEndPoint;
     mSegmentType = TCadSegmentType.Line;
 }
 //---------------------------------------------------------------------------------------------------------
 /// <summary>
 /// Конструктор инициализирует объект класса указанными параметрами
 /// </summary>
 /// <param name="center_point">Центр эллипса</param>
 /// <param name="radius_x">Радиус эллипса по X</param>
 /// <param name="radius_y">Радиус эллипса по Y</param>
 //---------------------------------------------------------------------------------------------------------
 public CCadDirect2DPrimitiveEllipse(Vector2Df center_point, Single radius_x, Single radius_y)
 {
     mBoundsRect.Center = center_point;
     mBoundsRect.Width  = radius_x * 2;
     mBoundsRect.Height = radius_y * 2;
     mD2DEllipse        = new Direct2D.Ellipse(center_point.ToRawVector2(), radius_x, radius_y);
 }
            //---------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Обновления захвата управления от курсора
            /// </summary>
            /// <param name="point">Точка в координатах канвы</param>
            /// <param name="offset">Смещение в координатах канвы</param>
            //---------------------------------------------------------------------------------------------------------
            public void UpdateCapturePosition(ref Vector2Df point, ref Vector2Df offset)
            {
                switch (mHandleIndex)
                {
                case 0:                         // Начальная точка
                {
                    if (XCadManager.Editor.EditModeMoving)
                    {
                        // Перемещаем графический элемент
                        mPrimitive.mStartPoint += offset;
                        mPrimitive.mEndPoint   += offset;
                    }
                    else
                    {
                        mPrimitive.mStartPoint = point;
                    }
                }
                break;

                case 1:                         // Точка по середине
                {
                    // Перемещаем графический элемент
                    mPrimitive.mStartPoint += offset;
                    mPrimitive.mEndPoint   += offset;
                }
                break;

                case 2:                         // Конечная точка
                {
                    if (XCadManager.Editor.EditModeMoving)
                    {
                        // Перемещаем графический элемент
                        mPrimitive.mStartPoint += offset;
                        mPrimitive.mEndPoint   += offset;
                    }
                    else
                    {
                        mPrimitive.mEndPoint = point;
                    }
                }
                break;

                default:
                {
                    // Графический элемент в составе множества - только перемещение
                    mPrimitive.mStartPoint += offset;
                    mPrimitive.mEndPoint   += offset;
                }
                break;
                }

                // Обновляем примитив
                mPrimitive.Update();

                // Обновляем ручки
                SetHandleRects();

                // Обновляем канву
                //XCadManager.Canvas.Update();
            }
 //---------------------------------------------------------------------------------------------------------
 /// <summary>
 /// Конструктор инициализирует объект класса указанными параметрами
 /// </summary>
 /// <param name="start_point">Начальная точка</param>
 /// <param name="radius_x">Радиус дуги по X</param>
 /// <param name="radius_y">Радиус дуги по Y</param>
 /// <param name="end_point">Конечная точка</param>
 //---------------------------------------------------------------------------------------------------------
 public CCadDirect2DPrimitiveArc(Vector2Df start_point, Single radius_x, Single radius_y, Vector2Df end_point)
 {
     mStartPoint = start_point;
     mRadiusX    = radius_x;
     mRadiusY    = radius_y;
     mEndPoint   = end_point;
 }
            ////---------------------------------------------------------------------------------------------------------
            ///// <summary>
            ///// Копирование параметров с графического элемента
            ///// </summary>
            ///// <param name="element">Графический элемент</param>
            ///// <param name="context">Контекст копирования данных</param>
            ////---------------------------------------------------------------------------------------------------------
            //public override void CopyParamemtrs(IBaseElement element, Object context)
            //{
            //	base.CopyParamemtrs(element, context);
            //	CCadShapeArc source = element as CCadShapeArc;
            //	if (source != null)
            //	{
            //		NotifyPropertyChanged(PropertyArgsStartPoint);
            //		NotifyPropertyChanged(PropertyArgsEndPoint);
            //		NotifyPropertyChanged(PropertyArgsIsLargeArc);
            //		NotifyPropertyChanged(PropertyArgsIsClockwiseDirection);
            //		NotifyPropertyChanged(PropertyArgsRotationAngle);
            //		NotifyPropertyChanged(PropertyArgsIsClosed);
            //		NotifyPropertyChanged(PropertyArgsRadiusX);
            //		NotifyPropertyChanged(PropertyArgsRadiusY);
            //		NotifyPropertyChanged(PropertyArgsLocation);
            //	}
            //}

            //---------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Проверка на попадание в область графического элемента указанной точки
            /// </summary>
            /// <param name="point">Проверяемая точка</param>
            /// <param name="epsilon">Точность проверки</param>
            /// <returns>Статус проверки</returns>
            //---------------------------------------------------------------------------------------------------------
            public override Boolean CheckPoint(ref Vector2Df point, Single epsilon)
            {
                // Если есть заливка то проверяем все пространство дуги
                if (mPrimitive.IsFilled)
                {
                    if (mPrimitive.FillContains(ref point))
                    {
                        return(true);
                    }
                }

                // Если выбран то проверяем ручки
                if (mIsSelect)
                {
                    for (Int32 i = 0; i < mHandleRects.Count; i++)
                    {
                        if (mHandleRects[i].Contains(ref point))
                        {
                            return(true);
                        }
                    }
                }

                // Если есть контур то проверяем границы дуги
                if (mPrimitive.IsStroked)
                {
                    return(mPrimitive.StrokeContains(ref point, epsilon));
                }

                return(false);
            }
            //---------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Конструктор инициализирует объект класса указанными параметрами
            /// </summary>
            /// <param name="location">Позиция текста</param>
            /// <param name="text">Текстовые данные</param>
            /// <param name="name">Имя текста</param>
            //---------------------------------------------------------------------------------------------------------
            public CCadShapeText(Vector2Df location, String text, String name = "Текст")
            {
                mName  = name;
                mGroup = "Тексты";

                mPrimitive = XCadManager.Canvas.CreateText(text, location, 12);
            }
Beispiel #20
0
 //---------------------------------------------------------------------------------------------------------
 /// <summary>
 /// Копирование параметров с трансформации
 /// </summary>
 /// <param name="transform">Трансформация</param>
 //---------------------------------------------------------------------------------------------------------
 public void CopyParamemtrs(CCadTransform transform)
 {
     mPosition       = transform.Position;
     mRotationAngle  = transform.RotationAngle;
     mRotationOrigin = transform.RotationOrigin;
     Matrix3Dx2f.Rotation((Single)(XMath.DegreeToRadian_f * mRotationAngle), mRotationOrigin, out mMatrixRotation);
     UpdateTransform();
 }
 //---------------------------------------------------------------------------------------------------------
 /// <summary>
 /// Чтение свойств и данных графического примитива из формата атрибутов XML
 /// </summary>
 /// <param name="prefix">Префикс имени атрибута</param>
 /// <param name="xml_reader">Средство чтения данных формата XML</param>
 //---------------------------------------------------------------------------------------------------------
 public override void ReadPrimitivFromAttribute(String prefix, XmlReader xml_reader)
 {
     mZIndex     = xml_reader.ReadIntegerFromAttribute(prefix + "ZIndex", mZIndex);
     mIsStroked  = xml_reader.ReadBooleanFromAttribute(prefix + "IsStroked", mIsStroked);
     mIsFilled   = xml_reader.ReadBooleanFromAttribute(prefix + "IsFilled", mIsFilled);
     mStartPoint = xml_reader.ReadMathVector2DfFromAttribute(prefix + "StartPoint");
     mEndPoint   = xml_reader.ReadMathVector2DfFromAttribute(prefix + "EndPoint");
 }
Beispiel #22
0
 //---------------------------------------------------------------------------------------------------------
 /// <summary>
 /// Конструктор инициализирует объект класса указанными параметрами
 /// </summary>
 /// <param name="start_point">Начальная точка</param>
 /// <param name="radius_x">Радиус дуги по X</param>
 /// <param name="radius_y">Радиус дуги по Y</param>
 /// <param name="end_point">Конечная точка</param>
 //---------------------------------------------------------------------------------------------------------
 public CCadDrawingPrimitiveArc(Vector2Df start_point, Single radius_x, Single radius_y, Vector2Df end_point)
 {
     mStartPoint   = start_point;
     mRadiusX      = radius_x;
     mRadiusY      = radius_y;
     mEndPoint     = end_point;
     mGraphicsPath = new GraphicsPath();
 }
            //---------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Конструктор инициализирует объект класса указанными параметрами
            /// </summary>
            /// <param name="text">Текст</param>
            /// <param name="start_point">Начальная точка</param>
            /// <param name="font_size">Размер шрифта текста</param>
            //---------------------------------------------------------------------------------------------------------
            public CCadWindowsPrimitiveText(String text, Vector2Df start_point, Single font_size)
            {
                mText     = text;
                mFontSize = font_size;
                mBoundsRect.PointTopLeft = start_point;

                Update();
            }
            //---------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Обновления захвата управления от курсора
            /// </summary>
            /// <param name="point">Точка в координатах канвы</param>
            //---------------------------------------------------------------------------------------------------------
            public override void UpdateCapturePosition(ref Vector2Df point)
            {
                // Смещение
                Vector2Df offset = XCadManager.CanvasViewer.MouseDelta;

                // Обновляем
                UpdateCapturePosition(ref point, ref offset);
            }
Beispiel #25
0
 //---------------------------------------------------------------------------------------------------------
 /// <summary>
 /// Конструктор инициализирует объект класса указанными параметрами
 /// </summary>
 /// <param name="text">Текст</param>
 /// <param name="start_point">Начальная точка</param>
 /// <param name="font_size">Размер шрифта текста</param>
 /// <param name="family">Имя семейства шрифтов</param>
 //---------------------------------------------------------------------------------------------------------
 public CCadDrawingPrimitiveText(String text, Vector2Df start_point, Single font_size, String family = "Arial")
 {
     mText     = text;
     mFontSize = font_size;
     mBoundsRect.PointTopLeft = start_point;
     mGdiFont    = new Font(new FontFamily(family), mFontSize, FontStyle.Regular);
     mTextFormat = new StringFormat();
 }
Beispiel #26
0
 //---------------------------------------------------------------------------------------------------------
 /// <summary>
 /// Конструктор инициализирует объект класса указанными параметрами
 /// </summary>
 /// <param name="start_point">Начальная точка</param>
 /// <param name="radius_x">Радиус дуги по X</param>
 /// <param name="radius_y">Радиус дуги по Y</param>
 /// <param name="end_point">Конечная точка</param>
 //---------------------------------------------------------------------------------------------------------
 public CCadWindowsPrimitiveArc(Vector2Df start_point, Single radius_x, Single radius_y, Vector2Df end_point)
 {
     mStartPoint  = start_point;
     mRadiusX     = radius_x;
     mRadiusY     = radius_y;
     mEndPoint    = end_point;
     mGeometryArc = new StreamGeometry();
 }
            //---------------------------------------------------------------------------------------------------------
            /// <summary>
            /// Обновления захвата управления от курсора
            /// </summary>
            /// <param name="point">Точка в координатах канвы</param>
            //---------------------------------------------------------------------------------------------------------
            public override void UpdateCapturePosition(ref Vector2Df point)
            {
                Vector2Df offset = XCadManager.CanvasViewer.MouseDelta;

                UpdateCapturePosition(ref point, ref offset);

                // Обновляем ручки
                SetHandleRects();
            }
 //---------------------------------------------------------------------------------------------------------
 /// <summary>
 /// Конструктор инициализирует объект класса указанными параметрами
 /// </summary>
 /// <param name="geometry">Геометрия</param>
 /// <param name="start_point">Начальная точка</param>
 /// <param name="size_arc">Размеры эллипса дуги</param>
 //---------------------------------------------------------------------------------------------------------
 public CCadSegmentArc(CCadPrimitiveGeometry geometry, Vector2Df start_point, Vector2Df size_arc)
 {
     mGeometry    = geometry;
     mSegmentType = TCadSegmentType.Arc;
     mBasePoint   = start_point;
     mRadiusX     = size_arc.X;
     mRadiusY     = size_arc.Y;
     mEndPoint    = start_point + size_arc;
 }
 //---------------------------------------------------------------------------------------------------------
 /// <summary>
 /// Конструктор инициализирует объект класса указанными параметрами
 /// </summary>
 /// <param name="geometry">Геометрия</param>
 /// <param name="base_point">Базовая точка</param>
 /// <param name="next_point">Следующая точка</param>
 //---------------------------------------------------------------------------------------------------------
 public CCadSegmentPoints(CCadPrimitiveGeometry geometry, Vector2Df base_point, Vector2Df next_point)
 {
     mGeometry    = geometry;
     mSegmentType = TCadSegmentType.Points;
     mPoints      = new List <Vector2Df>();
     mBasePoint   = base_point;
     mPoints.Add(base_point);
     mPoints.Add(next_point);
 }
 //---------------------------------------------------------------------------------------------------------
 /// <summary>
 /// Отпускание кнопки мыши
 /// </summary>
 /// <param name="pos">Позиция курсора в области канвы</param>
 /// <param name="button">Кнопка мыши связанная с данным событием</param>
 //---------------------------------------------------------------------------------------------------------
 public override void OnMouseUp(ref Vector2Df pos, TMouseButton button)
 {
     if (button == TMouseButton.Left && mIsCreateElement)
     {
         if (!XCadManager.CanvasViewer.CreateModeIsAutoCAD)
         {
             EndCreateEllipse(ref pos);
         }
     }
 }
Beispiel #31
0
			internal Vertex(Vector3 Coordinates, Vector2Df TextureCoordinates) {
				this.Coordinates = Coordinates;
				this.TextureCoordinates = TextureCoordinates;
			}
Beispiel #32
0
			internal Vertex(double X, double Y, double Z) {
				this.Coordinates = new Vector3(X, Y, Z);
				this.TextureCoordinates = new Vector2Df(0.0f, 0.0f);
			}
            public override void DrawLine(Vector2Df Start, Vector2Df End)
            {
                if(m_LineImageCache == null)
                {
                	//m_LineImageCache = new BufferedImage(4, 1, BufferedImage.PixelType.INT_ARGB);
                	//renderer.FillRect(1, 0, 1, 1);
                	m_LineImageCache = new BufferedImage(4, 4, BufferedImage.PixelType.INT_ARGB);
                	Renderer2D renderer = m_LineImageCache.GetRenderer2D;
                    renderer.Color.AlphaI = 0;
                    renderer.FillRect(0, 0, 4, 4);
                    renderer.Color.AlphaI = 255;
                    renderer.FillRect(1, 2, 1, 2);
#if false // Fill in the rest of the pixels for testing
                	renderer.Color.RedI = 0;
                	renderer.FillRect(0, 0, 4, 1);
                	renderer.FillRect(3, 0, 1, 4);
                	renderer.Color.BlueI = 0;
                	renderer.FillRect(0, 1, 1, 3);
                	renderer.FillRect(0, 1, 3, 1);
                	renderer.FillRect(2, 1, 1, 3);
#endif
                }
	            
                ImageGLDisplayListPlugin GLBuffer = ImageGLDisplayListPlugin.GetImageGLDisplayListPlugin(m_LineImageCache);
                Gl.glEnable(Gl.GL_TEXTURE_2D);
                Gl.glEnable(Gl.GL_BLEND);
                Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
                Gl.glColor4f(m_Color.RedF, m_Color.GreenF, m_Color.BlueF, m_Color.AlphaF);

                Vector2Df Normal = (End - Start);
                Vector2Df PerpendicularNormal = Normal.GetPerpendicularNormal();
                float Width = 1;
                Vector2Df OffsetPos = PerpendicularNormal * Width;
                Vector2Df OffsetNeg = PerpendicularNormal * -(Width + 1);

                PushOrthoProjection();

                Gl.glBindTexture(Gl.GL_TEXTURE_2D, GLBuffer.GLTextureHandle);
                
                Gl.glBegin(Gl.GL_QUADS);
#if true
                Gl.glTexCoord2d(0, .75); Gl.glVertex2f(Start.x + OffsetPos.x, Start.y + OffsetPos.y);
                Gl.glTexCoord2d(0, 1); Gl.glVertex2f(End.x + OffsetPos.x, End.y + OffsetPos.y);
                Gl.glTexCoord2d(.75, 1); Gl.glVertex2f(End.x + OffsetNeg.x, End.y + OffsetNeg.y);
                Gl.glTexCoord2d(.75, .5); Gl.glVertex2f(Start.x + OffsetNeg.x, Start.y + OffsetNeg.y);
#else
                // draw the main line (without the tips)
                Gl.glTexCoord2d(0, .75); Gl.glVertex2f(Start.x + OffsetPos.x + Normal.x, Start.y + OffsetPos.y + Normal.y);
                Gl.glTexCoord2d(0, 1); Gl.glVertex2f(End.x + OffsetPos.x - Normal.x, End.y + OffsetPos.y - Normal.y);
                Gl.glTexCoord2d(.75, 1); Gl.glVertex2f(End.x + OffsetNeg.x - Normal.x, End.y + OffsetNeg.y - Normal.y);
                Gl.glTexCoord2d(.75, .5); Gl.glVertex2f(Start.x + OffsetNeg.x + Normal.x, Start.y + OffsetNeg.y + Normal.y);

                // draw the ending tip anti-aliased
                Gl.glTexCoord2d(0, 1); Gl.glVertex2f(End.x + OffsetPos.x - Normal.x, End.y + OffsetPos.y - Normal.y);
                Gl.glTexCoord2d(0, .25); Gl.glVertex2f(End.x + OffsetPos.x, End.y + OffsetPos.y);
                Gl.glTexCoord2d(.75, .25); Gl.glVertex2f(End.x + OffsetNeg.x, End.y + OffsetNeg.y);
                Gl.glTexCoord2d(.75, 1); Gl.glVertex2f(End.x + OffsetNeg.x - Normal.x, End.y + OffsetNeg.y - Normal.y);

                // draw the starting tip anti-aliased
                Gl.glTexCoord2d(0, .25); Gl.glVertex2f(Start.x + OffsetPos.x, Start.y + OffsetPos.y);
                Gl.glTexCoord2d(0, 1); Gl.glVertex2f(Start.x + OffsetPos.x + Normal.x, Start.y + OffsetPos.y + Normal.y);
                Gl.glTexCoord2d(.75, 1); Gl.glVertex2f(Start.x + OffsetNeg.x + Normal.x, Start.y + OffsetNeg.y + Normal.y);
                Gl.glTexCoord2d(.75, .25); Gl.glVertex2f(Start.x + OffsetNeg.x, Start.y + OffsetNeg.y);
#endif
                Gl.glColor4f(1, 1, 1, 1);
                Gl.glEnd();

                PopOrthoProjection();
            }