Created
June 5, 2020 15:00
-
-
Save RSDuck/1914ff77a1f77eeaaf0186becdb67916 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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