improve render efficiency

This commit is contained in:
Liam Galvin 2018-07-03 17:40:18 +01:00
parent 6fbcc3003e
commit 5ae70eeedc
5 changed files with 67 additions and 30 deletions

View File

@ -43,7 +43,7 @@ Ensure you have your latest graphics card drivers installed before use.
| UTF-8 output | ✔ | Works as long as the font in use supports the relevant characters. | UTF-8 output | ✔ | Works as long as the font in use supports the relevant characters.
| Copy/paste | | Paste working, no mouse interaction for copy | Copy/paste | | Paste working, no mouse interaction for copy
| Customisable colour schemes | ✔ | Complete, but the config file has no entry for this yet | Customisable colour schemes | ✔ | Complete, but the config file has no entry for this yet
| Config file | | Minimal options atm | Config file | | Minimal options atm
| Scrolling | | Infinite buffer implemented, need GUI scrollbar & render updates | Scrolling | | Infinite buffer implemented, need GUI scrollbar & render updates
| Mouse interaction | | | Mouse interaction | |
| Sweet render effects | | | Sweet render effects | |
@ -63,9 +63,17 @@ The following options are available:
|---------------|---------|---------|-----------------------| |---------------|---------|---------|-----------------------|
| debug | bool | False | Enables debug logging | debug | bool | False | Enables debug logging
## Flags
| Name | Type | Default |Description |
|-----------------|---------|---------|-----------------------|
| --debug | bool | False | Enables debug logging |
| --ignore-config | bool | False | Ignores user config files and uses defaults
## Keyboard Shortcuts ## Keyboard Shortcuts
| Operation | Key(s) | | Operation | Key(s) |
|-----------|---------------------| |-----------|---------------------|
| Paste | ctrl + alt + v | Paste | ctrl + alt + v
|||

View File

@ -13,8 +13,10 @@ type Cell struct {
cv uint32 cv uint32
colourAttr uint32 colourAttr uint32
points []float32 points []float32
colour [3]float32 bgColour [3]float32
fgColour [3]float32
hidden bool hidden bool
r rune
} }
func (gui *GUI) NewCell(font *v41.Font, x float32, y float32, w float32, h float32, colourAttr uint32, bgColour [3]float32) Cell { func (gui *GUI) NewCell(font *v41.Font, x float32, y float32, w float32, h float32, colourAttr uint32, bgColour [3]float32) Cell {
@ -23,7 +25,7 @@ func (gui *GUI) NewCell(font *v41.Font, x float32, y float32, w float32, h float
colourAttr: colourAttr, colourAttr: colourAttr,
} }
cell.colour = bgColour cell.bgColour = bgColour
cell.text.SetPosition(mgl32.Vec2{x, y}) cell.text.SetPosition(mgl32.Vec2{x, y})
x = (x - (w / 2)) / (float32(gui.width) / 2) x = (x - (w / 2)) / (float32(gui.width) / 2)
@ -45,19 +47,34 @@ func (gui *GUI) NewCell(font *v41.Font, x float32, y float32, w float32, h float
} }
func (cell *Cell) SetFgColour(r, g, b float32) { func (cell *Cell) SetRune(r rune) {
if cell.r == r {
return
}
if cell.text != nil { if cell.text != nil {
if r == '%' {
cell.text.SetString("%%")
} else {
cell.text.SetString(string(r))
}
}
cell.r = r
}
func (cell *Cell) SetFgColour(r, g, b float32) {
if cell.text != nil && (cell.fgColour[0] != r || cell.fgColour[1] != g || cell.fgColour[2] != b) {
cell.fgColour = [3]float32{r, g, b}
cell.text.SetColor(mgl32.Vec3{r, g, b}) cell.text.SetColor(mgl32.Vec3{r, g, b})
} }
} }
func (cell *Cell) SetBgColour(r float32, g float32, b float32) { func (cell *Cell) SetBgColour(r float32, g float32, b float32) {
if cell.colour[0] == r && cell.colour[1] == g && cell.colour[2] == b { if cell.bgColour[0] == r && cell.bgColour[1] == g && cell.bgColour[2] == b {
return return
} }
cell.colour = [3]float32{r, g, b} cell.bgColour = [3]float32{r, g, b}
cell.Clean() cell.Clean()
cell.makeVao() cell.makeVao()
} }
@ -83,12 +100,12 @@ func (cell *Cell) makeVao() {
gl.GenBuffers(1, &cell.cv) gl.GenBuffers(1, &cell.cv)
gl.BindBuffer(gl.ARRAY_BUFFER, cell.cv) gl.BindBuffer(gl.ARRAY_BUFFER, cell.cv)
triColor := []float32{ triColor := []float32{
cell.colour[0], cell.colour[1], cell.colour[2], cell.bgColour[0], cell.bgColour[1], cell.bgColour[2],
cell.colour[0], cell.colour[1], cell.colour[2], cell.bgColour[0], cell.bgColour[1], cell.bgColour[2],
cell.colour[0], cell.colour[1], cell.colour[2], cell.bgColour[0], cell.bgColour[1], cell.bgColour[2],
cell.colour[0], cell.colour[1], cell.colour[2], cell.bgColour[0], cell.bgColour[1], cell.bgColour[2],
cell.colour[0], cell.colour[1], cell.colour[2], cell.bgColour[0], cell.bgColour[1], cell.bgColour[2],
cell.colour[0], cell.colour[1], cell.colour[2], cell.bgColour[0], cell.bgColour[1], cell.bgColour[2],
} }
gl.BufferData(gl.ARRAY_BUFFER, len(triColor)*4, gl.Ptr(triColor), gl.STATIC_DRAW) gl.BufferData(gl.ARRAY_BUFFER, len(triColor)*4, gl.Ptr(triColor), gl.STATIC_DRAW)
gl.EnableVertexAttribArray(cell.colourAttr) gl.EnableVertexAttribArray(cell.colourAttr)
@ -124,17 +141,6 @@ func (cell *Cell) Hide() {
cell.hidden = true cell.hidden = true
} }
func (cell *Cell) SetRune(r rune) {
if cell.text != nil {
if r == '%' {
cell.text.SetString("%%")
} else {
cell.text.SetString(string(r))
}
}
}
func (cell *Cell) Release() { func (cell *Cell) Release() {
if cell.text != nil { if cell.text != nil {
cell.text.Release() cell.text.Release()

17
main.go
View File

@ -1,6 +1,7 @@
package main package main
import ( import (
"flag"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"os" "os"
@ -12,7 +13,19 @@ import (
"go.uber.org/zap" "go.uber.org/zap"
) )
func loadConfig() config.Config { func getConfig() config.Config {
ignore := false
flag.BoolVar(&ignore, "ignore-config", ignore, "Ignore user config files and use defauls")
if ignore {
return config.DefaultConfig
}
conf := loadConfigFile()
flag.BoolVar(&conf.DebugMode, "debug", conf.DebugMode, "Enable debug logging")
flag.Parse()
return conf
}
func loadConfigFile() config.Config {
home := os.Getenv("HOME") home := os.Getenv("HOME")
if home == "" { if home == "" {
@ -56,7 +69,7 @@ func getLogger(conf config.Config) (*zap.SugaredLogger, error) {
func main() { func main() {
// parse this // parse this
conf := loadConfig() conf := getConfig()
logger, err := getLogger(conf) logger, err := getLogger(conf)
if err != nil { if err != nil {

View File

@ -394,9 +394,9 @@ func (terminal *Terminal) processInput(buffer chan rune) {
default: default:
terminal.logger.Errorf("Unknown OSC control sequence: 0x%02X", b) terminal.logger.Errorf("Unknown OSC control sequence: 0x%02X", b)
} }
case rune('c'): case 'c':
terminal.logger.Errorf("RIS not yet supported") terminal.logger.Errorf("RIS not yet supported")
case rune(')'), rune('('): case ')', '(':
b = <-buffer b = <-buffer
// todo charset changes // todo charset changes
//terminal.logger.Debugf("Ignoring character set control code )%s", string(b)) //terminal.logger.Debugf("Ignoring character set control code )%s", string(b))
@ -424,12 +424,19 @@ func (terminal *Terminal) processInput(buffer chan rune) {
case 0x08: case 0x08:
// backspace // backspace
terminal.position.Col-- terminal.position.Col--
if terminal.position.Col < 0 {
terminal.position.Col = 0
}
case 0x07: case 0x07:
// @todo ring bell // @todo ring bell
default: default:
// render character at current location // render character at current location
// fmt.Printf("%s\n", string([]byte{b})) // fmt.Printf("%s\n", string([]byte{b}))
terminal.writeRune(b) if b >= 0x20 {
terminal.writeRune(b)
} else {
terminal.logger.Error("Non-readable rune received: 0x%X", b)
}
} }
} }

View File

@ -179,7 +179,7 @@ func (terminal *Terminal) getBufferedLine(line int) *Line {
line = len(terminal.lines) - int(terminal.size.Height) + line line = len(terminal.lines) - int(terminal.size.Height) + line
} }
if line >= len(terminal.lines) { if line < 0 || line >= len(terminal.lines) {
return nil return nil
} }
@ -328,6 +328,9 @@ func (terminal *Terminal) SetSize(newCols int, newLines int) error {
terminal.position.Line = len(terminal.lines) - 1 terminal.position.Line = len(terminal.lines) - 1
} }
} }
if terminal.position.Line < 0 {
terminal.position.Line = 0
}
} }