public HUD() { if (this.DesignMode) { opengl = false; //return; } //InitializeComponent(); graphicsObject = this; graphicsObjectGDIP = Graphics.FromImage(objBitmap); }
void drawstring(HUD e, string text, Font font, float fontsize, Brush brush, float x, float y) { if (!opengl) { drawstring(graphicsObjectGDIP, text, font, fontsize, brush, x, y); return; } if (text == null || text == "") return; /* OpenTK.Graphics.Begin(); GL.PushMatrix(); GL.Translate(x, y, 0); printer.Print(text, font, c); GL.PopMatrix(); printer.End(); */ char[] chars = text.ToCharArray(); float maxy = 1; foreach (char cha in chars) { int charno = (int)cha; int charid = charno + (128 * (int)fontsize); // 128 * 40 * 5;128 if (charbitmaps[charid] == null) { charbitmaps[charid] = new Bitmap(128, 128, System.Drawing.Imaging.PixelFormat.Format32bppArgb); charbitmaps[charid].MakeTransparent(Color.Transparent); //charbitmaptexid float maxx = this.Width / 150; // for space // create bitmap using (Graphics gfx = Graphics.FromImage(charbitmaps[charid])) { pth.Reset(); if (text != null) pth.AddString(cha + "", font.FontFamily, 0, fontsize + 5, new Point((int)0, (int)0), StringFormat.GenericTypographic); gfx.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; gfx.DrawPath(P, pth); //Draw the face gfx.FillPath(brush, pth); if (pth.PointCount > 0) { foreach (PointF pnt in pth.PathPoints) { if (pnt.X > maxx) maxx = pnt.X; if (pnt.Y > maxy) maxy = pnt.Y; } } } charwidth[charid] = (int)(maxx + 2); //charbitmaps[charid] = charbitmaps[charid].Clone(new RectangleF(0, 0, maxx + 2, maxy + 2), charbitmaps[charid].PixelFormat); //charbitmaps[charno * (int)fontsize].Save(charno + " " + (int)fontsize + ".png"); // create texture int textureId; GL.TexEnv(TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode, (float)TextureEnvModeCombine.Replace);//Important, or wrong color on some computers Bitmap bitmap = charbitmaps[charid]; GL.GenTextures(1, out textureId); GL.BindTexture(TextureTarget.Texture2D, textureId); BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); // GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)All.Nearest); //GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)All.Nearest); GL.Finish(); bitmap.UnlockBits(data); charbitmaptexid[charid] = textureId; } //GL.Enable(EnableCap.Blend); GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha); GL.Enable(EnableCap.Texture2D); GL.BindTexture(TextureTarget.Texture2D, charbitmaptexid[charid]); float scale = 1.0f; GL.Begin(BeginMode.Quads); GL.TexCoord2(0, 0); GL.Vertex2(x, y); GL.TexCoord2(1, 0); GL.Vertex2(x + charbitmaps[charid].Width * scale, y); GL.TexCoord2(1, 1); GL.Vertex2(x + charbitmaps[charid].Width * scale, y + charbitmaps[charid].Height * scale); GL.TexCoord2(0, 1); GL.Vertex2(x + 0, y + charbitmaps[charid].Height * scale); GL.End(); //GL.Disable(EnableCap.Blend); GL.Disable(EnableCap.Texture2D); x += charwidth[charid] * scale; } }
public HUD() { if (this.DesignMode) return; InitializeComponent(); graphicsObject = this; graphicsObjectGDIP = Graphics.FromImage(objBitmap); }