1+ import os, strutils
2+ import nimgl/ opengl
3+ import glm
4+
5+
6+ type
7+ Shader * = object
8+ id* : GLuint
9+
10+
11+ proc readShader * (filepath: string ): cstring =
12+ # # Read shader from file with dependencies
13+ try :
14+ var source = splitLines (readFile (filepath))
15+ let path = splitFile (filepath)
16+
17+ for line in 0 .. source.len- 1 :
18+ if source[line].find (" #include " ) != - 1 :
19+ let file = source[line].splitWhitespace ()
20+ source[line] = $ readShader (path.dir & " /" & file[1 ])
21+ return join (source, " \n\r " ).cstring
22+ except IOError :
23+ echo (" ERROR LOAD SHADER " & filepath)
24+
25+ proc statusShader (shader: GLuint ) =
26+ # # (ECHO ERROR)
27+ var status: int32
28+ glGetShaderiv (shader, GL_COMPILE_STATUS , status.addr );
29+ if status != GL_TRUE .ord:
30+ var
31+ log_length: int32
32+ message = newSeq [char ](1024 )
33+ res: string
34+ glGetShaderInfoLog (shader, 1024 , log_length.addr , message[0 ].addr );
35+ for i in message:
36+ res &= i
37+ echo res
38+
39+ proc statusProgram (program: GLuint ) =
40+ # # (ECHO ERROR)
41+ var
42+ log_length: int32
43+ message = newSeq [char ](1024 )
44+ pLinked: int32
45+ res: string
46+ glGetProgramiv (program, GL_LINK_STATUS , pLinked.addr );
47+ if pLinked != GL_TRUE .ord:
48+ glGetProgramInfoLog (program, 1024 , log_length.addr , message[0 ].addr );
49+ for i in message:
50+ res &= i
51+ echo res
52+
53+
54+ proc newShader * (vertexPath, fragmentPath: string ): Shader =
55+ try :
56+ var
57+ vertexCode = readShader (vertexPath)
58+ fragmentCode = readShader (fragmentPath)
59+
60+ let vertex = glCreateShader (GL_VERTEX_SHADER )
61+ glShaderSource (vertex, 1 'i32 , vertexCode.addr , nil )
62+ glCompileShader (vertex)
63+ statusShader (vertex)
64+
65+ let fragment = glCreateShader (GL_FRAGMENT_SHADER )
66+ glShaderSource (fragment, 1 , fragmentCode.addr , nil )
67+ glCompileShader (fragment)
68+ statusShader (fragment)
69+
70+ let program = glCreateProgram ()
71+ glAttachShader (program, vertex)
72+ glAttachShader (program, fragment)
73+ glLinkProgram (program)
74+ statusProgram (program)
75+
76+ result .id = program
77+
78+ glDeleteShader (vertex)
79+ glDeleteShader (fragment)
80+ except :
81+ echo (" Shader was not loaded!!!" )
82+
83+ proc use * (shader: Shader ): void =
84+ glUseProgram (shader.id)
85+
86+ proc setBool * (shader: Shader , name: string , value: GLboolean ): void =
87+ glUniform1i (glGetUniformLocation (shader.id, name), value.GLint )
88+
89+ proc setInt * (shader: Shader , name: string , value: GLint ): void =
90+ glUniform1i (glGetUniformLocation (shader.id, name), value)
91+
92+ proc setFloat * (shader: Shader , name: string , value: GLfloat ): void =
93+ glUniform1f (glGetUniformLocation (shader.id, name), value)
0 commit comments