From bc8bf9852d2323eb756069ad1bc4027f0c508130 Mon Sep 17 00:00:00 2001 From: Liam Galvin Date: Thu, 9 Aug 2018 14:07:10 +0100 Subject: [PATCH] efficient rendering with backgrounds --- gui/gui.go | 23 ++++++++++++++++------- gui/renderer.go | 26 +++++++++++++++++--------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/gui/gui.go b/gui/gui.go index 516bb14..d351d13 100644 --- a/gui/gui.go +++ b/gui/gui.go @@ -106,11 +106,22 @@ func (gui *GUI) Render() error { return fmt.Errorf("Failed to load font: %s", err) } - gui.renderer = NewOpenGLRenderer(gui.config, gui.font, gui.fontScale, 0, 0, gui.width, gui.height) + changeChan := make(chan bool, 1) + titleChan := make(chan bool, 1) + + gui.renderer = NewOpenGLRenderer(gui.config, gui.font, gui.fontScale, 0, 0, gui.width, gui.height, gui.colourAttr, program) gui.window.SetFramebufferSizeCallback(gui.resize) gui.window.SetKeyCallback(gui.key) gui.window.SetCharCallback(gui.char) + gui.window.SetFocusCallback(func(w *glfw.Window, focused bool) { + if focused { + select { + case changeChan <- true: + default: + } + } + }) w, h := gui.window.GetSize() gui.resize(gui.window, w, h) @@ -137,15 +148,12 @@ func (gui *GUI) Render() error { //glfw.SwapInterval(1) gl.ClearColor( - 1.0, //gui.config.ColourScheme.DefaultBg[0], + gui.config.ColourScheme.DefaultBg[0], gui.config.ColourScheme.DefaultBg[1], gui.config.ColourScheme.DefaultBg[2], 1.0, ) - changeChan := make(chan bool, 1) - titleChan := make(chan bool, 1) - gui.terminal.AttachTitleChangeHandler(titleChan) gui.terminal.AttachDisplayChangeHandler(changeChan) @@ -191,12 +199,13 @@ func (gui *GUI) Render() error { gui.font.Print(10, float32(gui.height-20), 1.5, fmt.Sprintf("%s", fpsData)) } - glfw.PollEvents() - if gui.config.Rendering.AlwaysRepaint || frames > 0 { + glfw.PollEvents() frameCount++ gui.window.SwapBuffers() frames-- + } else { + glfw.WaitEventsTimeout(0.02) // every 20ms = 50fps on nothing changing } } diff --git a/gui/renderer.go b/gui/renderer.go index e01414c..1b9c4f2 100644 --- a/gui/renderer.go +++ b/gui/renderer.go @@ -31,6 +31,8 @@ type OpenGLRenderer struct { cellPositions map[[2]int][2]float32 rectangles map[[2]int]*rectangle config config.Config + colourAttr uint32 + program uint32 } type rectangle struct { @@ -42,7 +44,7 @@ type rectangle struct { points []float32 } -func (r *OpenGLRenderer) newRectangle(x float32, y float32) *rectangle { +func (r *OpenGLRenderer) newRectangle(x float32, y float32, colourAttr uint32) *rectangle { x = (x - float32(r.areaWidth/2)) / float32(r.areaWidth/2) y = -(y - float32(r.areaHeight/2)) / float32(r.areaHeight/2) @@ -59,6 +61,7 @@ func (r *OpenGLRenderer) newRectangle(x float32, y float32) *rectangle { x + w, y + h, 0, x + w, y, 0, }, + colourAttr: colourAttr, } rect.gen() @@ -98,7 +101,7 @@ func (rect *rectangle) gen() { } func (rect *rectangle) setColour(colour [3]float32) { - if rect.colour == colour || true { + if rect.colour == colour { return } rect.Free() @@ -112,7 +115,7 @@ func (rect *rectangle) Free() { gl.DeleteBuffers(1, &rect.cv) } -func NewOpenGLRenderer(config config.Config, font *glfont.Font, fontScale int32, areaX int, areaY int, areaWidth int, areaHeight int) *OpenGLRenderer { +func NewOpenGLRenderer(config config.Config, font *glfont.Font, fontScale int32, areaX int, areaY int, areaWidth int, areaHeight int, colourAttr uint32, program uint32) *OpenGLRenderer { r := &OpenGLRenderer{ areaWidth: areaWidth, areaHeight: areaHeight, @@ -122,6 +125,8 @@ func NewOpenGLRenderer(config config.Config, font *glfont.Font, fontScale int32, cellPositions: map[[2]int][2]float32{}, rectangles: map[[2]int]*rectangle{}, config: config, + colourAttr: colourAttr, + program: program, } r.SetFont(font) return r @@ -169,6 +174,7 @@ func (r *OpenGLRenderer) calculatePositions() { } func (r *OpenGLRenderer) generateRectangles() { + gl.UseProgram(r.program) for line := 0; line < r.termRows; line++ { for col := 0; col < r.termCols; col++ { @@ -180,7 +186,7 @@ func (r *OpenGLRenderer) generateRectangles() { // rounding to whole pixels makes everything nice x := float32(float64((float32(col) * r.cellWidth))) y := float32(float64((float32(line) * r.cellHeight) + (r.cellHeight))) - r.rectangles[[2]int{col, line}] = r.newRectangle(x, y) + r.rectangles[[2]int{col, line}] = r.newRectangle(x, y, r.colourAttr) } } } @@ -218,12 +224,14 @@ func (r *OpenGLRenderer) DrawCell(cell *buffer.Cell, col int, row int) { panic(fmt.Sprintf("Missing rectangle data for cell at %d,%d", col, row)) } - //rect.setColour(bg) - _ = bg - rect.setColour([3]float32{0, 0, 1}) + // don't bother rendering rectangles that are the same colour as the background + if bg != r.config.ColourScheme.DefaultBg { + rect.setColour(bg) - gl.BindVertexArray(rect.vao) - gl.DrawArrays(gl.TRIANGLES, 0, 6) + gl.UseProgram(r.program) + gl.BindVertexArray(rect.vao) + gl.DrawArrays(gl.TRIANGLES, 0, 6) + } if cell.Attr().Bold { // bold means draw text again one pixel to right, so it's fatter r.font.Print(pos[0]+1, pos[1], 1, string(cell.Rune()))