106 lines
3.9 KiB
Go
106 lines
3.9 KiB
Go
package main
|
|
|
|
import (
|
|
_ "embed"
|
|
"fmt"
|
|
"unsafe"
|
|
|
|
rl "git.terah.dev/UnrealXR/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()
|
|
|
|
}
|
|
}
|