Skip to content

Instantly share code, notes, and snippets.

@RSDuck
Created June 5, 2020 15:00
Show Gist options
  • Save RSDuck/1914ff77a1f77eeaaf0186becdb67916 to your computer and use it in GitHub Desktop.
Save RSDuck/1914ff77a1f77eeaaf0186becdb67916 to your computer and use it in GitHub Desktop.
# Blender v2.79 (sub 0) OBJ File: ''
# www.blender.org
mtllib ico.mtl
o Icosphere
v 0.000000 -1.000000 0.000000
v 0.723607 -0.447220 0.525725
v -0.276388 -0.447220 0.850649
v -0.894426 -0.447216 0.000000
v -0.276388 -0.447220 -0.850649
v 0.723607 -0.447220 -0.525725
v 0.276388 0.447220 0.850649
v -0.723607 0.447220 0.525725
v -0.723607 0.447220 -0.525725
v 0.276388 0.447220 -0.850649
v 0.894426 0.447216 0.000000
v 0.000000 1.000000 0.000000
v -0.162456 -0.850654 0.499995
v 0.425323 -0.850654 0.309011
v 0.262869 -0.525738 0.809012
v 0.850648 -0.525736 0.000000
v 0.425323 -0.850654 -0.309011
v -0.525730 -0.850652 0.000000
v -0.688189 -0.525736 0.499997
v -0.162456 -0.850654 -0.499995
v -0.688189 -0.525736 -0.499997
v 0.262869 -0.525738 -0.809012
v 0.951058 0.000000 0.309013
v 0.951058 0.000000 -0.309013
v 0.000000 0.000000 1.000000
v 0.587786 0.000000 0.809017
v -0.951058 0.000000 0.309013
v -0.587786 0.000000 0.809017
v -0.587786 0.000000 -0.809017
v -0.951058 0.000000 -0.309013
v 0.587786 0.000000 -0.809017
v 0.000000 0.000000 -1.000000
v 0.688189 0.525736 0.499997
v -0.262869 0.525738 0.809012
v -0.850648 0.525736 0.000000
v -0.262869 0.525738 -0.809012
v 0.688189 0.525736 -0.499997
v 0.162456 0.850654 0.499995
v 0.525730 0.850652 0.000000
v -0.425323 0.850654 0.309011
v -0.425323 0.850654 -0.309011
v 0.162456 0.850654 -0.499995
vn 0.1024 -0.9435 0.3151
vn 0.7002 -0.6617 0.2680
vn -0.2680 -0.9435 0.1947
vn -0.2680 -0.9435 -0.1947
vn 0.1024 -0.9435 -0.3151
vn 0.9050 -0.3304 0.2680
vn 0.0247 -0.3304 0.9435
vn -0.8897 -0.3304 0.3151
vn -0.5746 -0.3304 -0.7488
vn 0.5346 -0.3304 -0.7779
vn 0.8026 -0.1256 0.5831
vn -0.3066 -0.1256 0.9435
vn -0.9921 -0.1256 0.0000
vn -0.3066 -0.1256 -0.9435
vn 0.8026 -0.1256 -0.5831
vn 0.4089 0.6617 0.6284
vn -0.4713 0.6617 0.5831
vn -0.7002 0.6617 -0.2680
vn 0.0385 0.6617 -0.7488
vn 0.7240 0.6617 -0.1947
vn 0.2680 0.9435 -0.1947
vn 0.4911 0.7947 -0.3568
vn 0.4089 0.6617 -0.6284
vn -0.1024 0.9435 -0.3151
vn -0.1876 0.7947 -0.5773
vn -0.4713 0.6617 -0.5831
vn -0.3313 0.9435 0.0000
vn -0.6071 0.7947 0.0000
vn -0.7002 0.6617 0.2680
vn -0.1024 0.9435 0.3151
vn -0.1876 0.7947 0.5773
vn 0.0385 0.6617 0.7488
vn 0.2680 0.9435 0.1947
vn 0.4911 0.7947 0.3568
vn 0.7240 0.6617 0.1947
vn 0.8897 0.3304 -0.3151
vn 0.7947 0.1876 -0.5773
vn 0.5746 0.3304 -0.7488
vn -0.0247 0.3304 -0.9435
vn -0.3035 0.1876 -0.9342
vn -0.5346 0.3304 -0.7779
vn -0.9050 0.3304 -0.2680
vn -0.9822 0.1876 0.0000
vn -0.9050 0.3304 0.2680
vn -0.5346 0.3304 0.7779
vn -0.3035 0.1876 0.9342
vn -0.0247 0.3304 0.9435
vn 0.5746 0.3304 0.7488
vn 0.7947 0.1876 0.5773
vn 0.8897 0.3304 0.3151
vn 0.3066 0.1256 -0.9435
vn 0.3035 -0.1876 -0.9342
vn 0.0247 -0.3304 -0.9435
vn -0.8026 0.1256 -0.5831
vn -0.7947 -0.1876 -0.5773
vn -0.8897 -0.3304 -0.3151
vn -0.8026 0.1256 0.5831
vn -0.7947 -0.1876 0.5773
vn -0.5746 -0.3304 0.7488
vn 0.3066 0.1256 0.9435
vn 0.3035 -0.1876 0.9342
vn 0.5346 -0.3304 0.7779
vn 0.9921 0.1256 0.0000
vn 0.9822 -0.1876 0.0000
vn 0.9050 -0.3304 -0.2680
vn 0.4713 -0.6617 -0.5831
vn 0.1876 -0.7947 -0.5773
vn -0.0385 -0.6617 -0.7488
vn -0.4089 -0.6617 -0.6284
vn -0.4911 -0.7947 -0.3568
vn -0.7240 -0.6617 -0.1947
vn -0.7240 -0.6617 0.1947
vn -0.4911 -0.7947 0.3568
vn -0.4089 -0.6617 0.6284
vn 0.7002 -0.6617 -0.2680
vn 0.6071 -0.7947 0.0000
vn 0.3313 -0.9435 0.0000
vn -0.0385 -0.6617 0.7488
vn 0.1876 -0.7947 0.5773
vn 0.4713 -0.6617 0.5831
usemtl None
s off
f 1//1 14//1 13//1
f 2//2 14//2 16//2
f 1//3 13//3 18//3
f 1//4 18//4 20//4
f 1//5 20//5 17//5
f 2//6 16//6 23//6
f 3//7 15//7 25//7
f 4//8 19//8 27//8
f 5//9 21//9 29//9
f 6//10 22//10 31//10
f 2//11 23//11 26//11
f 3//12 25//12 28//12
f 4//13 27//13 30//13
f 5//14 29//14 32//14
f 6//15 31//15 24//15
f 7//16 33//16 38//16
f 8//17 34//17 40//17
f 9//18 35//18 41//18
f 10//19 36//19 42//19
f 11//20 37//20 39//20
f 39//21 42//21 12//21
f 39//22 37//22 42//22
f 37//23 10//23 42//23
f 42//24 41//24 12//24
f 42//25 36//25 41//25
f 36//26 9//26 41//26
f 41//27 40//27 12//27
f 41//28 35//28 40//28
f 35//29 8//29 40//29
f 40//30 38//30 12//30
f 40//31 34//31 38//31
f 34//32 7//32 38//32
f 38//33 39//33 12//33
f 38//34 33//34 39//34
f 33//35 11//35 39//35
f 24//36 37//36 11//36
f 24//37 31//37 37//37
f 31//38 10//38 37//38
f 32//39 36//39 10//39
f 32//40 29//40 36//40
f 29//41 9//41 36//41
f 30//42 35//42 9//42
f 30//43 27//43 35//43
f 27//44 8//44 35//44
f 28//45 34//45 8//45
f 28//46 25//46 34//46
f 25//47 7//47 34//47
f 26//48 33//48 7//48
f 26//49 23//49 33//49
f 23//50 11//50 33//50
f 31//51 32//51 10//51
f 31//52 22//52 32//52
f 22//53 5//53 32//53
f 29//54 30//54 9//54
f 29//55 21//55 30//55
f 21//56 4//56 30//56
f 27//57 28//57 8//57
f 27//58 19//58 28//58
f 19//59 3//59 28//59
f 25//60 26//60 7//60
f 25//61 15//61 26//61
f 15//62 2//62 26//62
f 23//63 24//63 11//63
f 23//64 16//64 24//64
f 16//65 6//65 24//65
f 17//66 22//66 6//66
f 17//67 20//67 22//67
f 20//68 5//68 22//68
f 20//69 21//69 5//69
f 20//70 18//70 21//70
f 18//71 4//71 21//71
f 18//72 19//72 4//72
f 18//73 13//73 19//73
f 13//74 3//74 19//74
f 16//75 17//75 6//75
f 16//76 14//76 17//76
f 14//77 1//77 17//77
f 13//78 15//78 3//78
f 13//79 14//79 15//79
f 14//80 2//80 15//80
import
streams, strutils, parseutils, hashes, tables,
glm
type
Vertex* = tuple [
x, y, z: float32,
nx, ny, nz: float32,
u, v: float32
]
Mesh* = object
vertices*: seq[Vertex]
indices*: seq[uint16]
proc loadObj*(data: string): Mesh =
var mesh = Mesh()
var vertexTable = initTable[Hash, uint16]()
proc addVertex(position: Vec3f, normal: Vec3f, uv: Vec2f) =
let h = !$(hash(int(position.x * 10_001f)) !& int(position.y * 10_002f) !& int(position.z * 10_003f) !&
int(normal.x * 10_001f) !& int(normal.y * 10_002f) !& int(normal.z * 10_003f) !& int(uv.x * 10_001f) !&
int(uv.y * 10_002f))
if vertexTable.hasKey(h):
mesh.indices.add(vertexTable[h])
return
mesh.indices.add(uint16 mesh.vertices.len)
vertexTable[h] = uint16 mesh.vertices.len
mesh.vertices.add((position.x, position.y, position.z, normal.x, normal.y, normal.z, uv.x, uv.y))
var
vertices = newSeq[Vec3f]()
uvs = newSeq[Vec2f]()
normals = newSeq[Vec3f]()
let stream = newStringStream(data)
while not stream.atEnd():
let
parts = stream.readLine().split(' ')
typ = parts[0]
case typ
of "#":
continue
of "v":
vertices.add(vec3f(float32 parseFloat(parts[1]), float32 parseFloat(parts[2]), float32 parseFloat(parts[3])))
of "vt":
uvs.add(vec2f(float32 parseFloat(parts[1]), float32 parseFloat(parts[2])))
of "vn":
normals.add(vec3f(float32 parseFloat(parts[1]), float32 parseFloat(parts[2]), float32 parseFloat(parts[3])))
of "f":
let
subPart0 = parts[1].split('/')
subPart1 = parts[2].split('/')
subPart2 = parts[3].split('/')
let
i0 = parseInt(subPart0[0]) - 1
i1 = parseInt(subPart1[0]) - 1
i2 = parseInt(subPart2[0]) - 1
pos0 = vertices[i0]
pos1 = vertices[i1]
pos2 = vertices[i2]
var
nrm0 = vec3f(0, 0, 0)
nrm1 = vec3f(0, 0, 0)
nrm2 = vec3f(0, 0, 0)
uv0 = vec2f(0, 0)
uv1 = vec2f(0, 0)
uv2 = vec2f(0, 0)
if subPart0.len == 1: # nur Vertexe
nrm0 = cross(pos0, pos2)
nrm1 = nrm0
nrm2 = nrm0
elif subPart0.len == 3: # Vertex und Normale und Texturkoordinaten
let
j0 = parseInt(subPart0[2]) - 1
j1 = parseInt(subPart1[2]) - 1
j2 = parseInt(subPart2[2]) - 1
nrm0 = normals[j0]
nrm1 = normals[j1]
nrm2 = normals[j2]
if subPart0[1] != "":
let
k0 = parseInt(subPart0[1]) - 1
k1 = parseInt(subPart1[1]) - 1
k2 = parseInt(subPart2[1]) - 1
uv0 = uvs[k0]
uv1 = uvs[k1]
uv2 = uvs[k2]
addVertex(pos0, nrm0, uv0)
addVertex(pos1, nrm1, uv1)
addVertex(pos2, nrm2, uv2)
of "usemtl":
discard
of "s":
discard
of "mtllib":
discard
of "o":
discard
else:
echo "abc"
#echo "warning: unrecognised entry \"", typ, "\" in obj file ", $address
mesh
# Blender v2.80 (sub 43) OBJ File: ''
# www.blender.org
mtllib room.mtl
o Cube_Cube.001
v -10.000000 -10.000000 34.000008
v -10.000000 10.000000 34.000008
v -10.000000 -10.000000 -180.153091
v -10.000000 10.000000 -180.153091
v 10.000000 -10.000000 34.000008
v 10.000000 10.000000 34.000008
v 10.000000 -10.000000 -180.153091
v 10.000000 10.000000 -180.153091
vt 0.375000 0.250000
vt 0.625000 0.000000
vt 0.375000 0.000000
vt 0.375000 0.750000
vt 0.625000 0.500000
vt 0.375000 0.500000
vt 0.125000 0.750000
vt 0.125000 0.500000
vt 0.625000 0.750000
vt 0.875000 0.500000
vt 0.625000 0.250000
vt 0.875000 0.750000
vn 1.0000 0.0000 0.0000
vn -1.0000 0.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 0.0000 -1.0000 0.0000
usemtl None
s off
f 3/1/1 2/2/1 1/3/1
f 5/4/2 8/5/2 7/6/2
f 1/7/3 7/6/3 3/8/3
f 6/9/4 4/10/4 8/5/4
f 3/1/1 4/11/1 2/2/1
f 5/4/2 6/9/2 8/5/2
f 1/7/3 5/4/3 7/6/3
f 6/9/4 2/12/4 4/10/4
import
uri, strutils, tables, hashes,
glm, opengl
type
Shader* = ref object
program*: Gluint
uniforms: Table[string, ShaderUniform]
defaultValues: Table[string, ConfiguredUniform]
ShaderUniformType* = enum
ShaderUniform_Bool,
ShaderUniform_Float,
ShaderUniform_Int,
ShaderUniform_Vec2,
ShaderUniform_Vec3,
ShaderUniform_Vec4,
ShaderUniform_Mat4,
ShaderUniform_Mat3,
ShaderUniform_Sampler2d
ShaderUniform* = tuple [
typ: ShaderUniformType,
location: int
]
ConfiguredUniform* = object
shader: Shader
location: int
case typ: ShaderUniformType
of ShaderUniform_Bool:
boolVal: bool
of ShaderUniform_Float:
floatVal: float32
of ShaderUniform_Int:
intVal: int
of ShaderUniform_Vec2:
vec2: Vec2f
of ShaderUniform_Vec3:
vec3: Vec3f
of ShaderUniform_Vec4:
vec4: Vec4f
of ShaderUniform_Mat4:
mat4: Mat4f
of ShaderUniform_Mat3:
mat3: Mat3f
of ShaderUniform_Sampler2d:
sampler: int
proc loadShader*(data: string): Shader =
const vtxshHeader = "#vertex shader"
const frgshHeader = "#fragment shader"
assert data.startsWith(vtxshHeader)
assert data.find(frgshHeader) != -1
let
vtxStart = vtxshHeader.len + "\n".len
frgStart = data.find(frgshHeader) + frgshHeader.len + "\n".len
vtxshSrc = data.substr(vtxStart, frgStart - frgshHeader.len - "\n".len * 2)
frgshSrc = data.substr(frgStart)
vtxsh = glCreateShader(GL_VERTEX_SHADER)
frgsh = glCreateShader(GL_FRAGMENT_SHADER)
proc compileShader(sh: GLuint, source: string, typ: string) =
var sources = allocCStringArray([source])
glShaderSource(sh, 1, sources, nil)
glCompileShader(sh)
var status = Glint(0)
glGetShaderiv(sh, GL_COMPILE_STATUS, addr status)
if Glboolean(status) == GL_FALSE:
var
buffer = newString(512)
length = Glsizei 0
glGetShaderInfoLog(sh, 512, addr length, buffer)
buffer.setLen(int length)
echo "Error while compiling ", typ
echo buffer
deallocCStringArray(sources)
compileShader(vtxsh, vtxshSrc, "vertex")
compileShader(frgsh, frgshSrc, "fragment")
let program = glCreateProgram()
glAttachShader(program, vtxsh)
glAttachShader(program, frgsh)
glLinkProgram(program)
glDeleteShader(vtxsh)
glDeleteShader(frgsh)
var
uniforms = initTable[string, ShaderUniform]()
uniformsCount = Glint 0
uniformLength = GLint 0
uniformSize = Glint 0
uniformType = Glenum 0
uniformName = newString(128)
uniformDefaultValues = initTable[string, ConfiguredUniform]()
shader = Shader()
glGetProgramiv(program, GL_ACTIVE_UNIFORMS, addr uniformsCount)
for i in 0..<uniformsCount:
glGetActiveUniform(program, Gluint i, 128, addr uniformLength, addr uniformSize, addr uniformType, addr uniformName[0])
uniformName.setLen(uniformLength)
var typ = (case uniformType
of cGL_FLOAT: ShaderUniform_Float
of GL_BOOL: ShaderUniform_Bool
of GL_FLOAT_VEC2: ShaderUniform_Vec2
of GL_FLOAT_VEC3: ShaderUniform_Vec3
of GL_FLOAT_VEC4: ShaderUniform_Vec4
of GL_FLOAT_MAT4: ShaderUniform_Mat4
of GL_FLOAT_MAT3: ShaderUniform_Mat3
of GL_SAMPLER_2D: ShaderUniform_Sampler2d
of cGL_INT: ShaderUniform_Int
else: raise newException(ValueError, "Unsupported uniform format"))
let location = int(glGetUniformLocation(program, uniformName))
uniforms[uniformName] = (typ, location)
uniformDefaultValues[uniformName] = ConfiguredUniform(typ: typ, location: location, shader: shader)
assert (not shader.isNil)
shader.program = program
shader.uniforms = uniforms
shader.defaultValues = uniformDefaultValues
shader
proc bindShader*(self: Shader) =
glUseProgram(self.program)
proc getUniformLocation*(self: Shader, name: string): int =
glGetUniformLocation(self.program, name)
template declSetUniform(realType: typedesc, glCall: untyped, enumTyp: ShaderUniformType, glTyp: typedesc, configVar: untyped): untyped =
proc setUniform*(self: Shader, location: string, val: realType) =
if self.uniforms.hasKey(location):
assert self.uniforms[location].typ == enumTyp, "Given value doesn't match uniform type"
var safeCopy = val
when val is Vec:
glCall(Glint self.uniforms[location].location, 1, caddr(safeCopy))
elif val is Mat:
glCall(Glint self.uniforms[location].location, 1, false, caddr(safeCopy))
else:
glCall(Glint self.uniforms[location].location, glTyp val)
proc getPreConfiguredUniform*(self: Shader, location: string, val: realType): ConfiguredUniform =
if self.uniforms.hasKey(location):
assert self.uniforms[location].typ == enumTyp, "Given value doesn't match uniform type"
assert (not self.isNil)
result = ConfiguredUniform(typ: enumTyp,
location: self.uniforms[location].location, configVar: val, shader: self)
proc setDefaultValue*(self: Shader, location: string, val: realType) =
if self.uniforms.hasKey(location):
self.defaultValues[location] = getPreConfiguredUniform(self, location, val)
declSetUniform(float32, glUniform1f, ShaderUniform_Float, GLfloat, floatVal)
declSetUniform(bool, glUniform1i, ShaderUniform_Bool, Glint, boolVal)
declSetUniform(int, glUniform1i, ShaderUniform_Int, Glint, intVal)
declSetUniform(Vec2f, glUniform2fv, ShaderUniform_Vec2, void, vec2)
declSetUniform(Vec3f, glUniform3fv, ShaderUniform_Vec3, void, vec3)
declSetUniform(Vec4f, glUniform4fv, ShaderUniform_Vec4, void, vec4)
declSetUniform(Mat3f, glUniformMatrix3fv, ShaderUniform_Mat3, void, mat3)
declSetUniform(Mat4f, glUniformMatrix4fv, ShaderUniform_Mat4, void, mat4)
proc setUniform*(self: Shader, config: ConfiguredUniform) =
assert self == config.shader
case config.typ
of ShaderUniform_Float:
glUniform1f(Glint config.location, Glfloat config.floatVal)
of ShaderUniform_Bool:
glUniform1i(Glint config.location, Glint config.boolVal)
of ShaderUniform_Int:
glUniform1i(Glint config.location, Glint config.intVal)
of ShaderUniform_Vec2:
var safeCopy = config.vec2
glUniform2fv(Glint config.location, 1, caddr(safeCopy))
of ShaderUniform_Vec3:
var safeCopy = config.vec3
glUniform3fv(Glint config.location, 1, caddr(safeCopy))
of ShaderUniform_Vec4:
var safeCopy = config.vec4
glUniform4fv(Glint config.location, 1, caddr(safeCopy))
of ShaderUniform_Mat3:
var safeCopy = config.mat3
glUniformMatrix3fv(Glint config.location, 1, false, caddr(safeCopy))
of ShaderUniform_Mat4:
var safeCopy = config.mat4
glUniformMatrix4fv(Glint config.location, 1, false, caddr(safeCopy))
of ShaderUniform_Sampler2d:
glUniform1i(Glint config.location, Glint config.sampler)
proc setUniform*(self: Shader, config: openArray[ConfiguredUniform]) =
for c in config:
self.setUniform(c)
proc resetToDefault*(self: Shader) =
for _, defaultVal in pairs self.defaultValues:
self.setUniform(defaultVal)
proc setUniformSamplerUnit*(self: Shader, location: string, sampler: int) =
if self.uniforms.hasKey(location):
assert self.uniforms[location].typ == ShaderUniform_Sampler2d
glUniform1i(Glint self.uniforms[location].location, Glint sampler)
proc getPreConfiguredSamplerUnit*(self: Shader, location: string, sampler: int): ConfiguredUniform =
if self.uniforms.hasKey(location):
assert self.uniforms[location].typ == ShaderUniform_Sampler2d
assert (not self.isNil)
return ConfiguredUniform(typ: ShaderUniform_Sampler2d, location: self.uniforms[location].location,
sampler: sampler, shader: self)
proc setDefaultSamplerUnit*(self: Shader, location: string, sampler: int) =
self.defaultValues[location] = self.getPreConfiguredSamplerUnit(location, sampler)
proc `==`*(a, b: ConfiguredUniform): bool =
if a.typ == b.typ and a.shader == b.shader and a.location == b.location:
case a.typ
of ShaderUniform_Bool: return a.boolVal == b.boolVal
of ShaderUniform_Float: return a.floatVal == b.floatVal
of ShaderUniform_Int: return a.intVal == b.intVal
of ShaderUniform_Mat3: return a.mat3 == b.mat3
of ShaderUniform_Mat4: return a.mat4 == b.mat4
of ShaderUniform_Vec2: return a.vec2 == b.vec2
of ShaderUniform_Vec3: return a.vec3 == b.vec3
of ShaderUniform_Vec4: return a.vec4 == b.vec4
of ShaderUniform_Sampler2d: return a.sampler == b.sampler
false
proc hash*(uniform: ConfiguredUniform): Hash =
result = (0 !& hash(ord uniform.typ) !& hash(cast[int](uniform.shader)) !& hash(uniform.location))
return !$(result !& (case uniform.typ
of ShaderUniform_Bool: hash(uniform.boolVal)
of ShaderUniform_Float: hash(uniform.floatVal)
of ShaderUniform_Int: hash(uniform.intVal)
of ShaderUniform_Mat3: hash(uniform.mat3.arr[0].arr) !& hash(uniform.mat3.arr[1].arr) !& hash(uniform.mat3.arr[2].arr)
of ShaderUniform_Mat4: hash(uniform.mat4.arr[0].arr) !& hash(uniform.mat4.arr[1].arr) !& hash(uniform.mat4.arr[2].arr) !& hash(uniform.mat4.arr[3].arr)
of ShaderUniform_Vec2: hash(uniform.vec2.arr)
of ShaderUniform_Vec3: hash(uniform.vec3.arr)
of ShaderUniform_Vec4: hash(uniform.vec4.arr)
of ShaderUniform_Sampler2d: hash(uniform.sampler)))
import opengl, sdl2, glm, objloader, math, shader
sdl2.init(sdl2.INIT_VIDEO or INIT_EVENTS)
discard sdl2.glSetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE)
discard sdl2.glSetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3)
discard sdl2.glSetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3)
let
window = sdl2.createWindow("halt die klappe jakob!", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 960,
SDL_WINDOW_SHOWN or SDL_WINDOW_OPENGL or SDL_WINDOW_ALLOW_HIGHDPI or SDL_WINDOW_RESIZABLE)
glContext = glCreateContext(window)
sphere = loadObj(readFile("ico.obj"))
plane = loadObj(readFile("room.obj"))
discard glMakeCurrent(window, glContext)
opengl.loadExtensions()
var vao: GLuint
glGenVertexArrays(1, addr vao)
glBindVertexArray(vao)
var vbo: GLuint
glGenBuffers(1, addr vbo)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*(sphere.vertices.len + plane.vertices.len), nil, GL_STATIC_DRAW)
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertex) * sphere.vertices.len, unsafeAddr sphere.vertices[0])
glBufferSubData(GL_ARRAY_BUFFER, GLintptr sizeof(Vertex)*sphere.vertices.len,sizeof(Vertex) * plane.vertices.len, unsafeAddr plane.vertices[0])
var ibo: GLuint
glGenBuffers(1, addr ibo)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(uint16) * (sphere.indices.len + plane.indices.len), nil, GL_STATIC_DRAW)
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(uint16) * sphere.indices.len, unsafeAddr sphere.indices[0])
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, GLintptr sizeof(uint16) * sphere.indices.len, sizeof(uint16) * plane.indices.len, unsafeAddr plane.indices[0])
glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 3, cGL_FLOAT, GL_FALSE, GLsizei sizeof(Vertex), cast[pointer](0))
glEnableVertexAttribArray(1)
glVertexAttribPointer(1, 3, cGL_FLOAT, GL_FALSE, GLsizei sizeof(Vertex), cast[pointer](sizeof(float32)*3))
glEnableVertexAttribArray(2)
glVertexAttribPointer(2, 2, cGL_FLOAT, GL_FALSE, GLsizei sizeof(Vertex), cast[pointer](sizeof(float32)*6))
let
shdr = loadShader(readFile("shader.shr"))
shdr.bindShader()
glEnable(GL_DEPTH_TEST)
glEnable(GL_BLEND)
#glEnable(GL_FRAMEBUFFER_SRGB)
discard glSetSwapInterval(1)
var
done = false
event = sdl2.Event(kind: QuitEvent)
w = 1280f
h = 960f
posS = vec3f(0, 10, -20)
posP = vec3f(0, 0, -20)
wallPos = vec3f(0,0,0)
movDir = vec3f(0, 0, 0)
speed = 8f
g = 9.81
y = 0f
dt = 0f
lastTime = sdl2.getPerformanceCounter()
while not done:
let currentTime = sdl2.getPerformanceCounter()
dt = float32(currentTime - lastTime) / float32 sdl2.getPerformanceFrequency()
lastTime = currentTime
while sdl2.pollEvent(event):
if event.kind == sdl2.QuitEvent:
done = true
if event.kind == sdl2.WindowEvent and event.window.event == sdl2.WindowEvent_Resized:
w = float32(event.window.data1)
h = float32(event.window.data2)
glClearColor(0f, 0f, 0f, 1f)
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT)
let
proj = perspective(degToRad(70f), float32(w)/float32(h), 0.1f, 500f)
translationSphere = rotateY(translate(mat4f(), posS),y)
translationPlane = translate(mat4f(), posP)
shdr.setUniform("light[0].lightDir", vec3f(1f, 0f, 0f).normalize())
shdr.setUniform("light[1].lightDir", vec3f(0f, 1f, 0f).normalize())
shdr.setUniform("light[2].lightDir", vec3f(-1f, 0f, 0f).normalize())
shdr.setUniform("light[0].lightColor", vec3f(1, 0, 0))
shdr.setUniform("light[1].lightColor", vec3f(0, 1, 0))
shdr.setUniform("light[2].lightColor", vec3f(0, 0, 1))
shdr.setUniform("objColor", vec3f(1, 1, 1))
shdr.setUniform("lightsUsed", 3)
y += degToRad(90f) * dt
if (posS.y + movDir.y * dt) - 1 <= posP.y:
movDir.y = 7
movDir.y -= g * dt
posS += movDir * dt * speed
shdr.setUniform("projection", proj * translationSphere)
glDrawElements(GL_TRIANGLES, GLsizei sphere.indices.len, cGL_UNSIGNED_SHORT, cast[pointer](0))
shdr.setUniform("projection", proj * translationPlane)
glDrawElementsBaseVertex(GL_TRIANGLES, GLsizei plane.indices.len, cGL_UNSIGNED_SHORT, cast[pointer](sphere.indices.len * sizeof(uint16)), GLsizei sphere.vertices.len)
sdl2.glSwapWindow(window)
glContext.glDeleteContext()
window.destroy()
sdl2.quit()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment