nim-nanovg/examples/demo_sdl2_gpu.nim
Joey Yakimowich-Payne 386e04dc49 Use generated icons
2020-09-17 20:25:07 -06:00

145 lines
3.9 KiB
Nim

import sdl2/sdl2 as sdl
import sdl2/sdl2_gpu as gpu
import glew
import os
import nanovg
import perf
import common
import icons
proc events(): bool =
result = false
var e: sdl.Event
while sdl.pollEvent(addr(e)) != 0:
# Quit requested
if e.kind.EventType == sdl.EventQuit:
return true
# Key pressed
elif e.kind.EventType == sdl.EventKeyDown:
# Exit on Escape key press
if e.key.keysym.sym == sdl.KeycodeEscape:
return true
proc frameBufferSize*(window: ptr Window): tuple[w, h: int32] =
var
fbWidth: cint
fbHeight: cint
window.glGetDrawableSize(fbWidth.addr, fbHeight.addr)
return (fbWidth.int32, fbHeight.int32)
proc size*(window: ptr Window): tuple[w, h: int32] =
var
width: cint
height: cint
window.getWindowSize(width.addr, height.addr)
return (width.int32, height.int32)
template generateFbo(width, height: float, code: untyped): gpu.Image =
let fb = createFrameBuffer(width, height, ImageFlagsGL.NO_DELETE)
fb.binde()
glViewPort(0, 0, width.int, height.int)
glCullFace(GL_BACK)
glFrontFace(GL_CCW)
glClearColor(0.3, 0.3, 0.32, 1.0)
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT)
beginFrame(width, height, 1.0)
code
endFrame()
gpu.resetRendererState()
echo fb.texture
let res = gpu.createImageUsingTexture(cast[TextureHandle](fb.texture), false)
fb.delete()
res
proc main() =
let
fps = newGraph(RenderStyle.FPS, "Frame Time")
cpuGraph = newGraph(RenderStyle.MS, "CPU Time")
discard sdl.init(sdl.INIT_EVERYTHING.uint32)
discard sdl.glSetAttribute(sdl.GL_STENCIL_SIZE, 1)
when defined(macosx):
discard sdl.glSetAttribute(sdl.GL_CONTEXT_PROFILE_MASK, sdl.GL_CONTEXT_PROFILE_CORE.cint)
discard sdl.glSetAttribute(sdl.GL_CONTEXT_FLAGS, sdl.GL_CONTEXT_FORWARD_COMPATIBLE_FLAG.cint)
discard sdl.glSetAttribute(sdl.GL_CONTEXT_MAJOR_VERSION, 3)
discard sdl.glSetAttribute(sdl.GL_CONTEXT_MINOR_VERSION, 2)
var w, h: cint
let screen = gpu.initRenderer(gpu.RENDERER_OPENGL_3, 640, 480, sdl.WINDOW_ALLOW_HIGHDPI)
let vg = nanovg.newContext()
discard sdl.glSetSwapInterval(0)
vg.loadFont(currentSourceDir()/"resources"/"Roboto-Regular.ttf", "sans")
vg.loadFont(currentSourceDir()/"resources"/"umeboshi.ttf", "umeboshi")
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
var image = gpu.loadImage(currentSourceDir()/"resources/howl.png")
let window = sdl.getWindowFromID(screen.context.windowID)
while not done:
gpu.clearRGBA(screen, 0, 0, 0, 0xFF)
# do gpu drawing
let fbSize = window.frameBufferSize()
glViewPort(0, 0, fbSize.w, fbSize.h)
glCullFace(GL_BACK)
glFrontFace(GL_CCW)
glClearColor(0.3, 0.3, 0.32, 1.0)
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT)
gpu.blit(image, nil, screen, 400, 100)
gpu.flushBlitBuffer()
withFrame(vg, window):
vg.setFont("umeboshi")
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)
vg.drawSearchBox("Search...", 60, 400, 280, 25)
gpu.resetRendererState()
vg.render(fps, 5, 5)
vg.render(cpuGraph, 210, 5)
gpu.flip(screen)
let t: float = sdl.getTicks().float/1000.0
let dt = t - prevt
prevt = t
let cpuTime: float = sdl.getTicks().float/1000.0 - t
fps.update(dt)
cpuGraph.update(cpuTime)
done = events()
gpu.freeImage(image)
vg.delete()
gpu.quit()
main()