package page import ( "fmt" "github.com/go-gl/gl/v3.3-core/gl" "github.com/go-gl/mathgl/mgl32" "github.com/veandco/go-sdl2/sdl" "rhemawavetech.com/rhemawave/internal/colors" "rhemawavetech.com/rhemawave/internal/fontManager" "rhemawavetech.com/rhemawave/internal/shaderManager" ) type MessagePage struct { Base message StringItem instructions StringItem msgDim mgl32.Vec2 instDim mgl32.Vec2 textShader *shaderManager.Shader msgPos mgl32.Vec2 instPos mgl32.Vec2 } func (p *MessagePage) Init(ctx *PageCtx) error { var err error var ok bool if ctx.Msg == "" { ctx.Msg = "This is an example message because no message was passed" } if ctx.Inst == "" { ctx.Inst = "Press F1 to exit" } if err = p.Base.Init(ctx); err != nil { return fmt.Errorf("failed to init Base page: %w", err) } // Fetch and cache shader sm := shaderManager.Get() p.textShader, ok = sm.Get("text") if !ok { return fmt.Errorf("failed to fetch text shader") } fm := fontManager.Get() font, ok := fm.GetFont("Roboto-Regular") if !ok { return fmt.Errorf("unable to fetch font") } p.message, err = NewStringItem(ctx.Msg, font, colors.Orange) if err != nil { return fmt.Errorf("unable to create message string texture: %w", err) } p.instructions, err = NewStringItem(ctx.Inst, font, colors.White) if err != nil { return fmt.Errorf("unable to create instructions string texture: %w", err) } baseFontSize := float32(p.Context.CfgPtr.StandardFontSize) p.message.Scale(float32(48) / baseFontSize) p.instructions.Scale(float32(28) / baseFontSize) // Cache scaled dimensions — never recomputed unless textures are replaced p.msgDim = p.message.RawDimensions() p.instDim = p.instructions.RawDimensions() p.msgPos = mgl32.Vec2{ float32(p.Base.ScreenCenterX) - p.msgDim[0]/2, float32(p.Base.ScreenCenterY) - p.msgDim[1]/2, } p.instPos = mgl32.Vec2{ float32(p.Base.ScreenCenterX) - p.instDim[0]/2, float32(20), } return nil } func (p *MessagePage) HandleEvent(event *sdl.Event) error { return nil } func (p *MessagePage) Update(dt float32) error { return nil } func (p *MessagePage) Render() error { p.Base.RenderTexture(p.textShader, p.message.ID, p.msgPos, p.msgDim, colors.Orange) p.Base.RenderTexture(p.textShader, p.instructions.ID, p.instPos, p.instDim, colors.White) return nil } func (p *MessagePage) Destroy() error { gl.DeleteTextures(1, &p.message.ID) gl.DeleteTextures(1, &p.instructions.ID) return p.Base.Destroy() } func (p *MessagePage) SetMessage(msg string) error { return nil } func (p *MessagePage) SetInstructions(inst string) error { return nil }