Nim/tests/manyloc/named_argument_bug/tri_engine/tri_engine.nim
2013-07-24 23:07:28 +02:00

106 lines
2.1 KiB
Nim

import
algorithm,
tri_engine/config,
tri_engine/gfx/gl/gl,
tri_engine/gfx/gl/primitive,
tri_engine/gfx/gl/shader,
tri_engine/gfx/color
const primitiveVs = """
#version 330 core
layout(location = 0) in vec2 pos;
layout(location = 1) in vec2 texCoord;
out vec2 uv;
void main()
{
gl_Position = vec4(pos, 0, 1);
uv = texCoord;
}
"""
const primitiveFs = """
#version 330 core
in vec2 uv;
out vec4 color;
uniform sampler2D tex;
uniform vec4 inColor;
void main()
{
color = texture(tex, uv) * inColor;
}
"""
var gW, gH: Natural = 0
proc w*(): int =
gW
proc h*(): int =
gH
type
PRenderer = ref object
primitiveProgram: TProgram
primitives: seq[PPrimitive]
proc setupGL() =
?glEnable(GLblend)
?glBlendFunc(GLsrcAlpha, GLoneMinusSrcAlpha)
?glClearColor(0.0, 0.0, 0.0, 1.0)
?glPolygonMode(GLfrontAndBack, GLfill)
proc newRenderer*(w, h: Positive): PRenderer =
gW = w
gH = h
new(result)
newSeq(result.primitives, 0)
loadExtensions()
setupGL()
result.primitiveProgram = newProgram(@[
newShaderFromSrc(primitiveVs, TShaderType.vert),
newShaderFromSrc(primitiveFs, TShaderType.frag)])
proc draw(o: PRenderer, p: PPrimitive) =
let loc = proc(x: string): Glint =
result = glGetUniformLocation(o.primitiveProgram.id, x)
if result == -1:
raise newException(E_GL, "Shader error: " & x & " does not correspond to a uniform variable")
setUniformV4(loc("inColor"), p.color)
?glActiveTexture(GLtexture0)
?glBindTexture(GLtexture2D, p.tex.id.GLuint)
?glUniform1i(loc("tex"), 0)
p.bindBufs()
setVertAttribPointers()
?glDrawElements(p.vertMode.GLenum, p.indices.len.GLsizei, cGLunsignedShort, nil)
proc draw*(o: PRenderer) =
?glClear(GLcolorBufferBit)
o.primitiveProgram.use()
enableVertAttribArrs()
var zSortedPrimitives = o.primitives
zSortedPrimitives.sort(proc(x, y: PPrimitive): int =
if x.z < y.z:
-1
elif x.z > y.z:
1
else:
0)
for x in zSortedPrimitives:
o.draw(x)
disableVertAttribArrs()
proc addPrimitive*(o: PRenderer, p: PPrimitive) =
o.primitives.add(p)