SDF-font loading example added

This commit is contained in:
JupiterRider 2024-11-03 15:38:02 +01:00
parent 735af12e7f
commit 549dbcf4d8
4 changed files with 226 additions and 0 deletions

View file

@ -0,0 +1,106 @@
package main
import (
_ "embed"
"fmt"
"unsafe"
rl "github.com/gen2brain/raylib-go/raylib"
)
//go:embed AnonymousPro-Bold.ttf
var fileData []byte
func main() {
// Initialization
const screenWidth, screenHeight = 800, 450
rl.InitWindow(screenWidth, screenHeight, "raylib [text] example - SDF fonts")
defer rl.CloseWindow() // Close window and OpenGL context
// NOTE: Textures/Fonts MUST be loaded after Window initialization (OpenGL context is required)
const msg = "Signed Distance Fields"
// Default font generation from TTF font
fontDefault := rl.Font{BaseSize: 16, CharsCount: 95}
defer rl.UnloadFont(fontDefault) // Default font unloading
// Loading font data from memory data
// Parameters > font size: 16, no glyphs array provided (nil), glyphs count: 95 (autogenerate chars array)
glyphs := rl.LoadFontData(fileData, 16, nil, 95, rl.FontDefault)
fontDefault.Chars = &glyphs[0]
// Parameters > font size: 16, glyphs padding in image: 4 px, pack method: 0 (default)
atlas := rl.GenImageFontAtlas(unsafe.Slice(fontDefault.Chars, fontDefault.CharsCount), unsafe.Slice(&fontDefault.Recs, fontDefault.CharsCount), 16, 4, 0)
fontDefault.Texture = rl.LoadTextureFromImage(&atlas)
rl.UnloadImage(&atlas)
// SDF font generation from TTF font
fontSDF := rl.Font{BaseSize: 16, CharsCount: 95}
defer rl.UnloadFont(fontSDF) // SDF font unloading
// Parameters > font size: 16, no glyphs array provided (nil), glyphs count: 0 (defaults to 95)
glyphsSDF := rl.LoadFontData(fileData, 16, nil, 0, rl.FontSdf)
fontSDF.Chars = &glyphsSDF[0]
// Parameters > font size: 16, glyphs padding in image: 0 px, pack method: 1 (Skyline algorithm)
atlas = rl.GenImageFontAtlas(unsafe.Slice(fontSDF.Chars, fontSDF.CharsCount), unsafe.Slice(&fontSDF.Recs, fontSDF.CharsCount), 16, 0, 1)
fontSDF.Texture = rl.LoadTextureFromImage(&atlas)
rl.UnloadImage(&atlas)
// Load SDF required shader (we use default vertex shader)
shader := rl.LoadShader("", "sdf.fs")
defer rl.UnloadShader(shader) // Unload SDF shader
rl.SetTextureFilter(fontSDF.Texture, rl.FilterBilinear) // Required for SDF font
fontPosition := rl.NewVector2(40, screenHeight/2.0-50)
textSize := rl.Vector2Zero()
fontSize := float32(16)
currentFont := 0 // 0 - fontDefault, 1 - fontSDF
rl.SetTargetFPS(60) // Set our game to run at 60 frames-per-second
// Main game loop
for !rl.WindowShouldClose() { // Detect window close button or ESC key
fontSize += rl.GetMouseWheelMove() * 8.0
if fontSize < 6 {
fontSize = 6
}
if rl.IsKeyDown(rl.KeySpace) {
currentFont = 1
textSize = rl.MeasureTextEx(fontSDF, msg, fontSize, 0)
} else {
currentFont = 0
textSize = rl.MeasureTextEx(fontDefault, msg, fontSize, 0)
}
fontPosition.X = float32(rl.GetScreenWidth()/2) - textSize.X/2
fontPosition.Y = float32(rl.GetScreenHeight()/2) - textSize.Y/2 + 80
rl.BeginDrawing()
rl.ClearBackground(rl.RayWhite)
if currentFont == 1 {
// NOTE: SDF fonts require a custom SDf shader to compute fragment color
rl.BeginShaderMode(shader) // Activate SDF font shader
rl.DrawTextEx(fontSDF, msg, fontPosition, fontSize, 0, rl.Black)
rl.EndShaderMode() // Activate our default shader for next drawings
rl.DrawTexture(fontSDF.Texture, 10, 10, rl.Black)
rl.DrawText("SDF!", 320, 20, 80, rl.Red)
} else {
rl.DrawTextEx(fontDefault, msg, fontPosition, fontSize, 0, rl.Black)
rl.DrawTexture(fontDefault.Texture, 10, 10, rl.Black)
rl.DrawText("default font", 315, 40, 30, rl.Gray)
}
rl.DrawText("FONT SIZE: 16.0", int32(rl.GetScreenWidth()-240), 20, 20, rl.DarkGray)
rl.DrawText(fmt.Sprintf("RENDER SIZE: %02.02f", fontSize), int32(rl.GetScreenWidth()-240), 50, 20, rl.DarkGray)
rl.DrawText("Use MOUSE WHEEL to SCALE TEXT!", int32(rl.GetScreenWidth()-240), 90, 10, rl.DarkGray)
rl.DrawText("HOLD SPACE to USE SDF FONT VERSION!", 340, int32(rl.GetScreenHeight()-30), 20, rl.Maroon)
rl.EndDrawing()
}
}