private List<BitmapFontRegion> GenerateRegions(BitmapFontFile file) { var regions = new List<BitmapFontRegion>(); foreach (var character in file.Chars) { BitmapFontRegion region = new BitmapFontRegion() { Character = (char)character.ID, Rect = new Rectangle(character.X, character.Y, character.Width, character.Height), XOffset = character.XOffset, YOffset = character.YOffset, XAdvance = character.XAdvance }; regions.Add(region); } return regions; }
/// <summary> /// Regenerates vertex and UV information. (Call this after making changes to font, string, or position.) /// Note: This is called in the constructor. /// </summary> public void GenerateInformation() { BitmapFontRegion[] regions = new BitmapFontRegion[String.Length]; verticies = new Vector2[String.Length * 6]; uvs = new Vector2[String.Length * 6]; int length = String.Length; int vi = 0, ui = 0; // Vertex index, UV index int dx = 0, dy = 0; for (int i = 0; i < length; i++) { regions[i] = Font.GetCharacterRegion(String[i]); if (regions[i] != null) { // Calculate verticies var VTopLeft = new Vector2(dx + regions[i].XOffset, dy + regions[i].YOffset); var VTopRight = VTopLeft + new Vector2(regions[i].Rect.Width, 0); var VBottomLeft = VTopLeft + new Vector2(0, regions[i].Rect.Height); var VBottomRight = VTopLeft + new Vector2(regions[i].Rect.Width, regions[i].Rect.Height); // Add verticies to array (TL,TR,BL,TR,BL,BR) verticies[vi++] = VTopLeft; verticies[vi++] = VTopRight; verticies[vi++] = VBottomLeft; verticies[vi++] = VTopRight; verticies[vi++] = VBottomLeft; verticies[vi++] = VBottomRight; // Calculate and add UVs Vector2 uvCoefficient = new Vector2(1 / Font.TextureSize.X, 1 / Font.TextureSize.Y); var UTopLeft = new Vector2(regions[i].Rect.X * uvCoefficient.X, regions[i].Rect.Y * uvCoefficient.Y); var UTopRight = UTopLeft + new Vector2(regions[i].Rect.Width * uvCoefficient.X, 0); var UBottomLeft = UTopLeft + new Vector2(0, regions[i].Rect.Height * uvCoefficient.Y); var UBottomRight = UTopLeft + new Vector2(regions[i].Rect.Width * uvCoefficient.X, regions[i].Rect.Height * uvCoefficient.Y); // Add UVs to array (TL,TR,BL,TR,BL,BR) uvs[ui++] = UTopLeft; uvs[ui++] = UTopRight; uvs[ui++] = UBottomLeft; uvs[ui++] = UTopRight; uvs[ui++] = UBottomLeft; uvs[ui++] = UBottomRight; dx += regions[i].XAdvance; } if (String[i] == '\n') { dy += Font.LineHeight; dx = 0; } } GL.BindVertexArray(VAO); GL.BindBuffer(BufferTarget.ArrayBuffer, VBO); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(BlittableValueType.StrideOf(verticies) * verticies.Length), verticies, BufferUsageHint.StaticDraw); GL.EnableVertexAttribArray(0); GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, OpenTK.BlittableValueType.StrideOf(verticies), 0); GL.BindBuffer(BufferTarget.ArrayBuffer, UBO); GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(BlittableValueType.StrideOf(uvs) * uvs.Length), uvs, BufferUsageHint.StaticDraw); GL.EnableVertexAttribArray(1); GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, false, OpenTK.BlittableValueType.StrideOf(uvs), 0); }