Use local context instead of global
This commit is contained in:
parent
734732fbbd
commit
77e390e9be
6 changed files with 302 additions and 274 deletions
|
|
@ -18,34 +18,34 @@ proc currentSourceDir*(): string {.inline.} =
|
|||
|
||||
# Config
|
||||
|
||||
proc drawLabel*(text: string, x, y, w, h: float) =
|
||||
nanovg.setFontSize(50.0)
|
||||
nanovg.setFont("sans")
|
||||
nanovg.setFillColor(1.0, 1.0, 1.0, 1.0)
|
||||
proc drawLabel*(vg: Context, text: string, x, y, w, h: float) =
|
||||
vg.setFontSize(50.0)
|
||||
vg.setFont("sans")
|
||||
vg.setFillColor(1.0, 1.0, 1.0, 1.0)
|
||||
|
||||
nanovg.textAlign("left middle")
|
||||
nanovg.text(text, x, y+h*0.5)
|
||||
vg.textAlign("left middle")
|
||||
vg.text(text, x, y+h*0.5)
|
||||
|
||||
proc drawWindow*(title: string, x, y, w, h: float) =
|
||||
proc drawWindow*(vg: Context, title: string, x, y, w, h: float) =
|
||||
let cornerRadius = 3.0
|
||||
withState:
|
||||
nanovg.beginPath()
|
||||
nanovg.pathRoundedRect(x, y, w, h, cornerRadius)
|
||||
#nanovg.setFillColor(rgba(255,255,255,192))
|
||||
nanovg.setFillColor(rgba(28,30,34,192))
|
||||
nanovg.pathFill()
|
||||
withState(vg):
|
||||
vg.beginPath()
|
||||
vg.pathRoundedRect(x, y, w, h, cornerRadius)
|
||||
#vg.setFillColor(rgba(255,255,255,192))
|
||||
vg.setFillColor(rgba(28,30,34,192))
|
||||
vg.pathFill()
|
||||
|
||||
nanovg.setFontSize(30.0)
|
||||
nanovg.setFont("sans")
|
||||
nanovg.textAlign("center middle")
|
||||
vg.setFontSize(30.0)
|
||||
vg.setFont("sans")
|
||||
vg.textAlign("center middle")
|
||||
|
||||
nanovg.setFontBlur(2)
|
||||
nanovg.setFillColor(rgba(0,0,0,128))
|
||||
nanovg.text(title, x+w/2, y+16+1)
|
||||
vg.setFontBlur(2)
|
||||
vg.setFillColor(rgba(0,0,0,128))
|
||||
vg.text(title, x+w/2, y+16+1)
|
||||
|
||||
nanovg.setFontBlur(0)
|
||||
nanovg.setFillColor(rgba(220,220,220,160))
|
||||
nanovg.text(title, x+w/2,y+16)
|
||||
vg.setFontBlur(0)
|
||||
vg.setFillColor(rgba(220,220,220,160))
|
||||
vg.text(title, x+w/2,y+16)
|
||||
|
||||
proc isBlack*(color: Color): bool =
|
||||
result = true
|
||||
|
|
@ -93,8 +93,8 @@ proc cpToUtf8*(code: int): string =
|
|||
|
||||
return res
|
||||
|
||||
proc drawButton*(text: string, x, y, width, height: float) =
|
||||
let bg = linearGradient(
|
||||
proc drawButton*(vg: Context, text: string, x, y, width, height: float) =
|
||||
let bg = vg.linearGradient(
|
||||
x, y, x, y+height,
|
||||
rgba(255, 255, 255, 16),
|
||||
rgba(100, 100, 100, 16)
|
||||
|
|
@ -109,28 +109,28 @@ proc drawButton*(text: string, x, y, width, height: float) =
|
|||
let drawShadow = true
|
||||
|
||||
if drawShadow:
|
||||
nanovg.beginPath()
|
||||
nanovg.pathRoundedRect(x+1+shadowOffset, y+1+shadowOffset, width-2, height-2, radius)
|
||||
nanovg.setFillColor(shadowColor)
|
||||
nanovg.pathFill()
|
||||
vg.beginPath()
|
||||
vg.pathRoundedRect(x+1+shadowOffset, y+1+shadowOffset, width-2, height-2, radius)
|
||||
vg.setFillColor(shadowColor)
|
||||
vg.pathFill()
|
||||
|
||||
nanovg.beginPath()
|
||||
nanovg.pathRoundedRect(x+1, y+1, width-2, height-2, radius)
|
||||
nanovg.setFillColor(color)
|
||||
nanovg.pathFill()
|
||||
vg.beginPath()
|
||||
vg.pathRoundedRect(x+1, y+1, width-2, height-2, radius)
|
||||
vg.setFillColor(color)
|
||||
vg.pathFill()
|
||||
|
||||
nanovg.setFillPaint(bg)
|
||||
nanovg.pathFill()
|
||||
vg.setFillPaint(bg)
|
||||
vg.pathFill()
|
||||
|
||||
nanovg.beginPath()
|
||||
nanovg.pathMoveTo(x+radius, y+lightWidth+1)
|
||||
nanovg.setStrokeWidth(lightWidth)
|
||||
nanovg.setStrokeColor(highlightColor)
|
||||
nanovg.pathLineTo(x+width-(radius), y+lightWidth+1)
|
||||
nanovg.pathStroke()
|
||||
vg.beginPath()
|
||||
vg.pathMoveTo(x+radius, y+lightWidth+1)
|
||||
vg.setStrokeWidth(lightWidth)
|
||||
vg.setStrokeColor(highlightColor)
|
||||
vg.pathLineTo(x+width-(radius), y+lightWidth+1)
|
||||
vg.pathStroke()
|
||||
|
||||
|
||||
proc drawButton*(preicon: string, text: string, x, y, w, h: float, color: Color) =
|
||||
proc drawButton*(vg: Context, preicon: string, text: string, x, y, w, h: float, color: Color) =
|
||||
|
||||
var
|
||||
bg: Paint
|
||||
|
|
@ -140,50 +140,50 @@ proc drawButton*(preicon: string, text: string, x, y, w, h: float, color: Color)
|
|||
tw = 0.0
|
||||
iw = 0.0
|
||||
|
||||
bg = nanovg.linearGradient(
|
||||
bg = vg.linearGradient(
|
||||
x,y,x,y+h,
|
||||
rgba(255,255,255, if isBlack(color): 16 else:32),
|
||||
rgba(0,0,0, if isBlack(color): 16 else:32)
|
||||
)
|
||||
|
||||
nanovg.beginPath()
|
||||
nanovg.pathRoundedRect(x+1, y+1, w-2, h-2, cornerRadius-1)
|
||||
vg.beginPath()
|
||||
vg.pathRoundedRect(x+1, y+1, w-2, h-2, cornerRadius-1)
|
||||
|
||||
if not isBlack(color):
|
||||
nanovg.setFillColor(color)
|
||||
nanovg.pathFill()
|
||||
vg.setFillColor(color)
|
||||
vg.pathFill()
|
||||
|
||||
nanovg.setFillPaint(bg)
|
||||
nanovg.pathFill()
|
||||
vg.setFillPaint(bg)
|
||||
vg.pathFill()
|
||||
|
||||
nanovg.beginPath()
|
||||
nanovg.pathRoundedRect(x+0.5, y+0.5, w-1, h-1, cornerRadius-0.5)
|
||||
nanovg.setStrokeColor(rgba(0,0,0,48))
|
||||
nanovg.pathStroke()
|
||||
vg.beginPath()
|
||||
vg.pathRoundedRect(x+0.5, y+0.5, w-1, h-1, cornerRadius-0.5)
|
||||
vg.setStrokeColor(rgba(0,0,0,48))
|
||||
vg.pathStroke()
|
||||
|
||||
nanovg.setFontSize(20.0)
|
||||
nanovg.setFont("sans-bold")
|
||||
tb = nanovg.textBounds(text, 0.0, 0.0)
|
||||
vg.setFontSize(20.0)
|
||||
vg.setFont("sans-bold")
|
||||
tb = vg.textBounds(text, 0.0, 0.0)
|
||||
tw = tb.horizontalAdvance
|
||||
|
||||
nanovg.setFontSize(h*0.5)
|
||||
nanovg.setFont("fa")
|
||||
ib = nanovg.textBounds(preicon, 0, 0)
|
||||
vg.setFontSize(h*0.5)
|
||||
vg.setFont("fa")
|
||||
ib = vg.textBounds(preicon, 0, 0)
|
||||
iw = ib.horizontalAdvance
|
||||
iw += h*0.15
|
||||
|
||||
nanovg.setFontSize(h*0.5)
|
||||
nanovg.setFont("fa")
|
||||
nanovg.setFillColor(rgba(255,255,255,96))
|
||||
nanovg.textAlign("left middle")
|
||||
nanovg.text(preicon, x+w*0.5-tw*0.5-iw*0.75, y+h*0.5)
|
||||
vg.setFontSize(h*0.5)
|
||||
vg.setFont("fa")
|
||||
vg.setFillColor(rgba(255,255,255,96))
|
||||
vg.textAlign("left middle")
|
||||
vg.text(preicon, x+w*0.5-tw*0.5-iw*0.75, y+h*0.5)
|
||||
|
||||
nanovg.setFontSize(20.0)
|
||||
nanovg.setFont("sans-bold")
|
||||
nanovg.textAlign("left middle")
|
||||
nanovg.setFillColor(rgba(0,0,0,160))
|
||||
nanovg.text(text, x+w*0.5-tw*0.5+iw*0.25, y+h*0.5-1)
|
||||
nanovg.setFillColor(rgba(255,255,255,160))
|
||||
nanovg.text(text, x+w*0.5-tw*0.5+iw*0.25, y+h*0.5)
|
||||
vg.setFontSize(20.0)
|
||||
vg.setFont("sans-bold")
|
||||
vg.textAlign("left middle")
|
||||
vg.setFillColor(rgba(0,0,0,160))
|
||||
vg.text(text, x+w*0.5-tw*0.5+iw*0.25, y+h*0.5-1)
|
||||
vg.setFillColor(rgba(255,255,255,160))
|
||||
vg.text(text, x+w*0.5-tw*0.5+iw*0.25, y+h*0.5)
|
||||
|
||||
proc glewInit*() {.header:"<GL/glew.h>".}
|
||||
|
|
@ -23,10 +23,10 @@ proc main =
|
|||
setTime(0)
|
||||
|
||||
glewInit()
|
||||
nanovg.init()
|
||||
nanovg.loadFont(currentSourceDir()/"resources/Roboto-Regular.ttf", "sans")
|
||||
nanovg.loadFont(currentSourceDir()/"resources/Roboto-Bold.ttf", "sans-bold")
|
||||
nanovg.loadFont(currentSourceDir()/"resources/fa.ttf", "fa")
|
||||
let vg = nanovg.newContext()
|
||||
vg.loadFont(currentSourceDir()/"resources/Roboto-Regular.ttf", "sans")
|
||||
vg.loadFont(currentSourceDir()/"resources/Roboto-Bold.ttf", "sans-bold")
|
||||
vg.loadFont(currentSourceDir()/"resources/fa.ttf", "fa")
|
||||
var prevt = getTime()
|
||||
|
||||
while not w.shouldClose():
|
||||
|
|
@ -43,16 +43,16 @@ proc main =
|
|||
glClearColor(0.3, 0.3, 0.32, 1.0)
|
||||
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT)
|
||||
|
||||
withFrame(w):
|
||||
let x = glyphPositions("Some仮名thing is up", 0, 0)
|
||||
drawWindow("Title", 50, 50, 300, 400)
|
||||
drawLabel("Hello!", 10, 10, 280, 20)
|
||||
drawButton(ICON_TRASH, "Delete", 100, 200, 160, 28, rgba(128, 16, 8, 255))
|
||||
drawButton(ICON_TRASH, "Deleter", 100, 250, 160, 28, rgba(12, 130, 80, 255))
|
||||
drawButton("Testing", 100, 300, 160, 28)
|
||||
vg.withFrame(w):
|
||||
let x = vg.glyphPositions("Some仮名thing is up", 0, 0)
|
||||
vg.drawWindow("Title", 50, 50, 300, 400)
|
||||
vg.drawLabel("Hello!", 10, 10, 280, 20)
|
||||
vg.drawButton(ICON_TRASH, "Delete", 100, 200, 160, 28, rgba(128, 16, 8, 255))
|
||||
vg.drawButton(ICON_TRASH, "Deleter", 100, 250, 160, 28, rgba(12, 130, 80, 255))
|
||||
vg.drawButton("Testing", 100, 300, 160, 28)
|
||||
|
||||
fps.render(5, 5)
|
||||
cpuGraph.render(210, 5)
|
||||
vg.render(fps, 5, 5)
|
||||
vg.render(cpuGraph, 210, 5)
|
||||
|
||||
w.swapBuffers()
|
||||
pollEvents()
|
||||
|
|
@ -64,6 +64,7 @@ proc main =
|
|||
waitEvents()
|
||||
|
||||
w.destroy()
|
||||
vg.delete()
|
||||
glfw.terminate()
|
||||
|
||||
main()
|
||||
|
|
|
|||
|
|
@ -71,11 +71,11 @@ proc main() =
|
|||
var prevt: float = sdl.getTicks().float/1000.0
|
||||
|
||||
glewInit()
|
||||
nanovg.init()
|
||||
nanovg.loadFont(currentSourceDir()/"resources/Roboto-Regular.ttf", "sans")
|
||||
nanovg.loadFont(currentSourceDir()/"resources/Roboto-Bold.ttf", "sans-bold")
|
||||
nanovg.loadFont(currentSourceDir()/"resources/fa.ttf", "fa")
|
||||
nanovg.loadFont(currentSourceDir()/"resources/entypo.ttf", "icons")
|
||||
let vg = nanovg.newContext()
|
||||
vg.loadFont(currentSourceDir()/"resources/Roboto-Regular.ttf", "sans")
|
||||
vg.loadFont(currentSourceDir()/"resources/Roboto-Bold.ttf", "sans-bold")
|
||||
vg.loadFont(currentSourceDir()/"resources/fa.ttf", "fa")
|
||||
vg.loadFont(currentSourceDir()/"resources/entypo.ttf", "icons")
|
||||
|
||||
while not done:
|
||||
let fbSize = window.frameBufferSize()
|
||||
|
|
@ -86,16 +86,16 @@ proc main() =
|
|||
glClearColor(0.3, 0.3, 0.32, 1.0)
|
||||
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT)
|
||||
|
||||
withFrame(window):
|
||||
let x = glyphPositions("Some仮名thing is up", 0, 0)
|
||||
drawWindow("Title", 50, 50, 300, 400)
|
||||
drawLabel("Hello!", 10, 10, 280, 20)
|
||||
drawButton(ICON_TRASH, "Delete", 100, 200, 160, 28, rgba(128, 16, 8, 255))
|
||||
drawButton(ICON_TRASH, "Deleter", 100, 250, 160, 28, rgba(12, 130, 80, 255))
|
||||
drawButton("Testing", 100, 300, 160, 28)
|
||||
vg.withFrame(window):
|
||||
let x = glyphPositions(vg, "Some仮名thing is up", 0, 0)
|
||||
vg.drawWindow("Title", 50, 50, 300, 400)
|
||||
vg.drawLabel("Hello!", 10, 10, 280, 20)
|
||||
vg.drawButton(ICON_TRASH, "Delete", 100, 200, 160, 28, rgba(128, 16, 8, 255))
|
||||
vg.drawButton(ICON_TRASH, "Deleter", 100, 250, 160, 28, rgba(12, 130, 80, 255))
|
||||
vg.drawButton("Testing", 100, 300, 160, 28)
|
||||
|
||||
fps.render(5, 5)
|
||||
cpuGraph.render(210, 5)
|
||||
vg.render(fps, 5, 5)
|
||||
vg.render(cpuGraph, 210, 5)
|
||||
|
||||
let t: float = sdl.getTicks().float/1000.0
|
||||
let dt = t - prevt
|
||||
|
|
@ -112,6 +112,7 @@ proc main() =
|
|||
|
||||
sdl.glDeleteContext(context)
|
||||
window.destroyWindow()
|
||||
vg.delete()
|
||||
img.quit()
|
||||
sdl.quit()
|
||||
|
||||
|
|
|
|||
|
|
@ -91,12 +91,12 @@ proc main() =
|
|||
gpu.setRequiredFeatures(gpu.FEATURE_BASIC_SHADERS)
|
||||
|
||||
|
||||
nanovg.init()
|
||||
let vg = nanovg.newContext()
|
||||
discard sdl.glSetSwapInterval(0)
|
||||
nanovg.loadFont(currentSourceDir()/"resources/Roboto-Regular.ttf", "sans")
|
||||
nanovg.loadFont(currentSourceDir()/"resources/Roboto-Bold.ttf", "sans-bold")
|
||||
nanovg.loadFont(currentSourceDir()/"resources/fa.ttf", "fa")
|
||||
nanovg.loadFont(currentSourceDir()/"resources/entypo.ttf", "icons")
|
||||
vg.loadFont(currentSourceDir()/"resources/umeboshi.ttf", "sans")
|
||||
vg.loadFont(currentSourceDir()/"resources/Roboto-Bold.ttf", "sans-bold")
|
||||
vg.loadFont(currentSourceDir()/"resources/fa.ttf", "fa")
|
||||
vg.loadFont(currentSourceDir()/"resources/entypo.ttf", "icons")
|
||||
|
||||
var done = false
|
||||
var prevt: float = sdl.getTicks().float/1000.0
|
||||
|
|
@ -122,18 +122,18 @@ proc main() =
|
|||
|
||||
gpu.flushBlitBuffer()
|
||||
|
||||
withFrame(window):
|
||||
text("Some仮名thing is up", 100, 100, 100)
|
||||
drawWindow("Title", 50, 50, 300, 400)
|
||||
drawLabel("Hello!", 10, 10, 500, 20)
|
||||
drawButton(ICON_TRASH, "Delete", 100, 200, 160, 28, rgba(128, 16, 8, 255))
|
||||
drawButton(ICON_TRASH, "Deleter", 100, 250, 160, 28, rgba(12, 130, 80, 255))
|
||||
drawButton("Testing", 100, 300, 160, 28)
|
||||
withFrame(vg, window):
|
||||
vg.text("Some仮名thing is up", 100, 100, 100)
|
||||
vg.drawWindow("Title", 50, 50, 300, 400)
|
||||
vg.drawLabel("Hello!", 10, 10, 500, 20)
|
||||
vg.drawButton(ICON_TRASH, "Delete", 100, 200, 160, 28, rgba(128, 16, 8, 255))
|
||||
vg.drawButton(ICON_TRASH, "Deleter", 100, 250, 160, 28, rgba(12, 130, 80, 255))
|
||||
vg.drawButton("Testing", 100, 300, 160, 28)
|
||||
|
||||
gpu.resetRendererState()
|
||||
|
||||
fps.render(5, 5)
|
||||
cpuGraph.render(210, 5)
|
||||
vg.render(fps, 5, 5)
|
||||
vg.render(cpuGraph, 210, 5)
|
||||
|
||||
|
||||
gpu.flip(screen)
|
||||
|
|
@ -149,6 +149,7 @@ proc main() =
|
|||
|
||||
done = events()
|
||||
gpu.freeImage(image)
|
||||
vg.delete()
|
||||
gpu.quit()
|
||||
|
||||
main()
|
||||
|
|
@ -32,19 +32,19 @@ proc getGraphAverage(graph: PerfGraph): float =
|
|||
|
||||
return avg / GRAPH_HISTORY_COUNT.float
|
||||
|
||||
proc render*(graph: PerfGraph, x, y: float) =
|
||||
proc render*(vg: Context, graph: PerfGraph, x, y: float) =
|
||||
let
|
||||
avg = getGraphAverage(graph)
|
||||
width: float = 200
|
||||
height: float = 35
|
||||
|
||||
nanovg.beginPath()
|
||||
nanovg.pathRect(x, y, width, height)
|
||||
nanovg.setFillColor(0, 0, 0, 128)
|
||||
nanovg.pathFill()
|
||||
vg.beginPath()
|
||||
vg.pathRect(x, y, width, height)
|
||||
vg.setFillColor(0, 0, 0, 128)
|
||||
vg.pathFill()
|
||||
|
||||
nanovg.beginPath()
|
||||
nanovg.pathMoveTo(x, y+height)
|
||||
vg.beginPath()
|
||||
vg.pathMoveTo(x, y+height)
|
||||
|
||||
case graph.style:
|
||||
of RenderStyle.FPS:
|
||||
|
|
@ -58,7 +58,7 @@ proc render*(graph: PerfGraph, x, y: float) =
|
|||
vx = x + (i/(GRAPH_HISTORY_COUNT-1)) * width
|
||||
vy = y + height - ((v / 80) * height)
|
||||
|
||||
nanovg.pathLineTo(vx, vy)
|
||||
vg.pathLineTo(vx, vy)
|
||||
|
||||
of RenderStyle.PERCENT:
|
||||
for i in 0 ..< GRAPH_HISTORY_COUNT:
|
||||
|
|
@ -71,7 +71,7 @@ proc render*(graph: PerfGraph, x, y: float) =
|
|||
vx = x + (i/(GRAPH_HISTORY_COUNT-1)) * width
|
||||
vy = y + height - ((v / 100) * height)
|
||||
|
||||
nanovg.pathLineTo(vx, vy)
|
||||
vg.pathLineTo(vx, vy)
|
||||
|
||||
of RenderStyle.MS:
|
||||
for i in 0 ..< GRAPH_HISTORY_COUNT:
|
||||
|
|
@ -84,40 +84,40 @@ proc render*(graph: PerfGraph, x, y: float) =
|
|||
vx = x + (i/(GRAPH_HISTORY_COUNT-1)) * width
|
||||
vy = y + height - ((v / 20) * height)
|
||||
|
||||
nanovg.pathLineTo(vx, vy)
|
||||
vg.pathLineTo(vx, vy)
|
||||
|
||||
nanovg.pathLineTo(x+width, y+height)
|
||||
nanovg.setFillColor(255, 192, 0, 128)
|
||||
nanovg.pathFill()
|
||||
vg.pathLineTo(x+width, y+height)
|
||||
vg.setFillColor(255, 192, 0, 128)
|
||||
vg.pathFill()
|
||||
|
||||
nanovg.setFont("sans")
|
||||
vg.setFont("sans")
|
||||
|
||||
if graph.name.len() > 0:
|
||||
nanovg.setFontSize(14)
|
||||
nanovg.textAlign("top left")
|
||||
nanovg.setFillColor(240, 240, 240, 192)
|
||||
nanovg.text(graph.name, x+3, y+1)
|
||||
vg.setFontSize(14)
|
||||
vg.textAlign("top left")
|
||||
vg.setFillColor(240, 240, 240, 192)
|
||||
vg.text(graph.name, x+3, y+1)
|
||||
|
||||
nanovg.setFontSize(18)
|
||||
nanovg.textAlign("top right")
|
||||
nanovg.setFillColor(240, 240, 240, 255)
|
||||
vg.setFontSize(18)
|
||||
vg.textAlign("top right")
|
||||
vg.setFillColor(240, 240, 240, 255)
|
||||
|
||||
case graph.style:
|
||||
of RenderStyle.FPS:
|
||||
var str = fmt"{1.0/avg:.2f} FPS"
|
||||
|
||||
nanovg.text(str, x+width-3, y+1)
|
||||
nanovg.setFontSize(15)
|
||||
nanovg.textAlign("bottom right")
|
||||
nanovg.setFillColor(240, 240, 240, 160)
|
||||
vg.text(str, x+width-3, y+1)
|
||||
vg.setFontSize(15)
|
||||
vg.textAlign("bottom right")
|
||||
vg.setFillColor(240, 240, 240, 160)
|
||||
|
||||
str = fmt"{avg*1000:.2f} ms"
|
||||
nanovg.text(str, x+width-3, y+height-1)
|
||||
vg.text(str, x+width-3, y+height-1)
|
||||
|
||||
of RenderStyle.PERCENT:
|
||||
let str = fmt"{avg:.1f} %"
|
||||
nanovg.text(str, x+width-3, y+1)
|
||||
vg.text(str, x+width-3, y+1)
|
||||
|
||||
of RenderStyle.MS:
|
||||
let str = fmt"{avg*1000:.2f} ms"
|
||||
nanovg.text(str, x+width-3, y+1)
|
||||
vg.text(str, x+width-3, y+1)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue