-
Notifications
You must be signed in to change notification settings - Fork 4
/
step3.nim
114 lines (96 loc) · 3.55 KB
/
step3.nim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import vmath, opengl, staticglfw
proc emscripten_set_main_loop(f: proc() {.cdecl.}, a: cint, b: bool) {.importc.}
var
vertices: seq[float32] = @[
-0.6f, -0.4f, 1.0f, 0.0f, 0.0f,
+0.6f, -0.4f, 0.0f, 1.0f, 0.0f,
+0.0f, +0.6f, 0.0f, 0.0f, 1.0f
]
vertexShaderText = readFile("data/vert.sh")
fragmentShaderText = readFile("data/frag.sh")
proc checkError*(shader: GLuint) =
var code: GLint
glGetShaderiv(shader, GL_COMPILE_STATUS, addr code)
if code.GLboolean == GL_FALSE:
var length: GLint = 0
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, addr length)
var log = newString(length.int)
glGetShaderInfoLog(shader, length, nil, log);
echo log
else:
echo "pass"
# Init GLFW
if init() == 0:
raise newException(Exception, "Failed to Initialize GLFW")
# Open window.
var window = createWindow(800, 600, "GLFW3 WINDOW", nil, nil)
# Connect the GL context.
window.makeContextCurrent()
when not defined(emscripten):
# This must be called to make any GL function work
loadExtensions()
var vertexBuffer: GLuint
glGenBuffers(1, addr vertexBuffer)
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer)
glBufferData(GL_ARRAY_BUFFER, vertices.len * 5 * 4, addr vertices[0], GL_STATIC_DRAW)
var vertexShader = glCreateShader(GL_VERTEX_SHADER)
var vertexShaderTextArr = allocCStringArray([vertexShaderText])
glShaderSource(vertexShader, 1.GLsizei, vertexShaderTextArr, nil)
glCompileShader(vertex_shader)
checkError(vertexShader)
var fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
var fragmentShaderTextArr = allocCStringArray([fragmentShaderText])
glShaderSource(fragmentShader, 1.GLsizei, fragmentShaderTextArr, nil);
glCompileShader(fragmentShader)
checkError(fragment_shader)
var program = glCreateProgram()
glAttachShader(program, vertexShader)
glAttachShader(program, fragmentShader)
glLinkProgram(program)
var
mvpLocation = glGetUniformLocation(program, "MVP").GLuint
vposLocation = glGetAttribLocation(program, "vPos").GLuint
vcolLocation = glGetAttribLocation(program, "vCol").GLuint
echo mvpLocation
echo vposLocation
#echo vcolLocation
glEnableVertexAttribArray(vposLocation);
glVertexAttribPointer(vposLocation, 2.GLint, cGL_FLOAT, GL_FALSE, (5 * 4).GLsizei, nil)
glEnableVertexAttribArray(vcolLocation.GLuint);
glVertexAttribPointer(vcolLocation, 3.GLint, cGL_FLOAT, GL_FALSE, (5 * 4).GLsizei, cast[pointer](4*2))
var colorFade = 1.0
proc onResize(handle: staticglfw.Window, w, h: int32) {.cdecl.} =
echo "resize: ", w, "x", h
discard window.setFramebufferSizeCallback(onResize)
proc mainLoop() {.cdecl.} =
var ratio: float32
var width, height: cint
var m, p, mvp: Mat4
getFramebufferSize(window, addr width, addr height)
ratio = width.float32 / height.float32
glViewport(0, 0, width, height)
var a = sin(colorFade)*0.2 + 0.20
glClearColor(a, a, a, 1)
colorFade += 0.01
glClear(GL_COLOR_BUFFER_BIT)
m = rotateZ(getTime().float32)
p = ortho[float32](-1, 1, 1, -1, -1000, 1000)
mvp = m * p;
glUseProgram(program)
var mvp_addr = cast[ptr GLFloat](mvp.unsafeAddr)
glUniformMatrix4fv(mvpLocation.GLint, 1, GL_FALSE, mvp_addr);
glDrawArrays(GL_TRIANGLES, 0, 3);
# Swap buffers (this will display the red color)
window.swapBuffers()
# Check for events.
pollEvents()
when defined(emscripten):
# Emscripten can't block so it will call this callback instead.
emscripten_set_main_loop(main_loop, 0, true);
else:
# When running native code we can block in an infinite loop.
while windowShouldClose(window) == 0:
mainLoop()
# If you get ESC key quit.
if window.getKey(KEY_ESCAPE) == 1:
window.setWindowShouldClose(1)