//--------------------------------------------------------------------------------------------------------- /// <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(); }
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; }
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); }
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; //} }
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(); }
//--------------------------------------------------------------------------------------------------------- /// <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); }
//--------------------------------------------------------------------------------------------------------- /// <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"); }
//--------------------------------------------------------------------------------------------------------- /// <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); }
//--------------------------------------------------------------------------------------------------------- /// <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(); }
//--------------------------------------------------------------------------------------------------------- /// <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); } } }
internal Vertex(Vector3 Coordinates, Vector2Df TextureCoordinates) { this.Coordinates = Coordinates; this.TextureCoordinates = TextureCoordinates; }
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(); }