79 lines
2.5 KiB
Nim
79 lines
2.5 KiB
Nim
|
## This example show how to have real time pixie using glfw API.
|
||
|
|
||
|
import math, opengl, pixie, staticglfw
|
||
|
|
||
|
let
|
||
|
w: int32 = 256
|
||
|
h: int32 = 256
|
||
|
|
||
|
var
|
||
|
screen = newImage(w, h)
|
||
|
ctx = newContext(screen)
|
||
|
frameCount = 0
|
||
|
window: Window
|
||
|
|
||
|
proc display() =
|
||
|
## Called every frame by main while loop
|
||
|
|
||
|
# draw shiny sphere on gradient background
|
||
|
var linerGradient = Paint(kind: pkGradientLinear)
|
||
|
linerGradient.gradientHandlePositions.add(vec2(0, 0))
|
||
|
linerGradient.gradientHandlePositions.add(vec2(0, 256))
|
||
|
linerGradient.gradientStops.add(
|
||
|
ColorStop(color: rgbx(0, 0, 0, 255), position: 0))
|
||
|
linerGradient.gradientStops.add(
|
||
|
ColorStop(color: rgbx(255, 255, 255, 255), position: 1))
|
||
|
ctx.fillStyle = linerGradient
|
||
|
ctx.fillRect(0, 0, 256, 256)
|
||
|
|
||
|
var radialGradient = Paint(kind: pkGradientRadial)
|
||
|
radialGradient.gradientHandlePositions.add(vec2(128, 128))
|
||
|
radialGradient.gradientHandlePositions.add(vec2(256, 128))
|
||
|
radialGradient.gradientHandlePositions.add(vec2(128, 256))
|
||
|
radialGradient.gradientStops.add(
|
||
|
ColorStop(color: rgbx(255, 255, 255, 255), position: 0))
|
||
|
radialGradient.gradientStops.add(
|
||
|
ColorStop(color: rgbx(0, 0, 0, 255), position: 1))
|
||
|
ctx.fillStyle = radialGradient
|
||
|
ctx.fillCircle(vec2(128.0, 128.0 + sin(float(frameCount)/10.0) * 20), 76.8)
|
||
|
|
||
|
# update texture with new pixels from surface
|
||
|
var dataPtr = ctx.image.data[0].addr
|
||
|
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, GLsizei w, GLsizei h, GL_RGBA,
|
||
|
GL_UNSIGNED_BYTE, dataPtr)
|
||
|
|
||
|
# draw a quad over the whole screen
|
||
|
glClear(GL_COLOR_BUFFER_BIT)
|
||
|
glBegin(GL_QUADS)
|
||
|
glTexCoord2d(0.0, 0.0); glVertex2d(-1.0, +1.0)
|
||
|
glTexCoord2d(1.0, 0.0); glVertex2d(+1.0, +1.0)
|
||
|
glTexCoord2d(1.0, 1.0); glVertex2d(+1.0, -1.0)
|
||
|
glTexCoord2d(0.0, 1.0); glVertex2d(-1.0, -1.0)
|
||
|
glEnd()
|
||
|
|
||
|
inc frameCount
|
||
|
swapBuffers(window)
|
||
|
|
||
|
if init() == 0:
|
||
|
quit("Failed to Initialize GLFW.")
|
||
|
|
||
|
windowHint(RESIZABLE, false.cint)
|
||
|
window = createWindow(w.cint, h.cint, "GLFW/Pixie", nil, nil)
|
||
|
|
||
|
makeContextCurrent(window)
|
||
|
loadExtensions()
|
||
|
|
||
|
# allocate a texture and bind it
|
||
|
var dataPtr = ctx.image.data[0].addr
|
||
|
glTexImage2D(GL_TEXTURE_2D, 0, 3, GLsizei w, GLsizei h, 0, GL_RGBA,
|
||
|
GL_UNSIGNED_BYTE, dataPtr)
|
||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
|
||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
|
||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
|
||
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
|
||
|
glEnable(GL_TEXTURE_2D)
|
||
|
|
||
|
while windowShouldClose(window) != 1:
|
||
|
pollEvents()
|
||
|
display()
|