From dede00377edab4a6f2d7c5901d354c4f6e0adcc2 Mon Sep 17 00:00:00 2001 From: zomseffen Date: Sun, 19 Jul 2020 10:41:08 +0200 Subject: [PATCH] fixes most bugs --- Lights/Lights.py | 41 ++-- MatrixStuff/Transformations.py | 74 ++++---- Objects/Cube/Cube.py | 9 +- Objects/Objects.py | 19 +- Objects/Structure.py | 52 ++--- fragment.glsl | 50 ++--- main.py | 338 ++++++++++++++++++--------------- 7 files changed, 321 insertions(+), 262 deletions(-) diff --git a/Lights/Lights.py b/Lights/Lights.py index 63623d7..d12a3f5 100644 --- a/Lights/Lights.py +++ b/Lights/Lights.py @@ -14,8 +14,9 @@ class Light: programId = {} depthshaderId = -1 - def getDepthProgram(self,vertexshader=-1,geometryshader=-1): - if ((vertexshader,geometryshader) not in self.programId.keys() and vertexshader != -1 and geometryshader != -1): + def getDepthProgram(self, vertexshader=-1, geometryshader=-1): + if (( + vertexshader, geometryshader) not in self.programId.keys() and vertexshader != -1 and geometryshader != -1): if self.depthshaderId == -1: with open('./Lights/depthfragment.glsl', 'r') as f: fragment_shader_string = f.read() @@ -33,24 +34,24 @@ class Light: self.programId[(vertexshader, geometryshader)] = program_id return program_id else: - if (vertexshader,geometryshader) not in self.programId.keys(): + if (vertexshader, geometryshader) not in self.programId.keys(): return -1 - return self.programId[(vertexshader,geometryshader)] - - + return self.programId[(vertexshader, geometryshader)] def __init__(self): self._ModelviewProjectionMatrix = np.identity(4) - self._pos = [0,0,0] - self._lightColor = [1,1,1] + self._pos = [0, 0, 0] + self._lightColor = [1, 1, 1] self.FramebufferId = -1 self.DepthBuffer = -1 + self.map_size = 1024 @property def lightColor(self): return self._lightColor + @lightColor.setter - def lightColor(self,value): + def lightColor(self, value): self._lightColor = value @property @@ -66,7 +67,7 @@ class Light: return self._pos @pos.setter - def pos(self,value): + def pos(self, value): self._pos = value def prepareForDepthMapping(self): @@ -74,18 +75,23 @@ class Light: if self.FramebufferId == -1: self.FramebufferId = glGenFramebuffers(1) new = True - glClearColor(1.0,1.0,1.0,1.0) - glBindFramebuffer(GL_FRAMEBUFFER,self.FramebufferId) - #glCullFace(GL_FRONT) - glViewport(0, 0, 512, 512) + glClearColor(1.0, 1.0, 1.0, 1.0) + glBindFramebuffer(GL_FRAMEBUFFER, self.FramebufferId) + glCullFace(GL_FRONT) + glViewport(0, 0, self.map_size, self.map_size) if new: if self.DepthBuffer == -1: self.DepthBuffer = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, self.DepthBuffer) - glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT, 512, 512, 0,GL_DEPTH_COMPONENT, GL_FLOAT, None) + glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, self.map_size, self.map_size, 0, GL_DEPTH_COMPONENT, GL_FLOAT, None) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,GL_TEXTURE_2D, self.FramebufferId, 0) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER) + glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, np.array([0, 0, 0], dtype=np.float32)) + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, self.FramebufferId, 0) DrawBuffers = [GL_NONE] glDrawBuffers(DrawBuffers) @@ -97,5 +103,4 @@ class Light: DrawBuffers = [GL_COLOR_ATTACHMENT0] glDrawBuffers(DrawBuffers) glClearColor(0.0, 0.0, 0.0, 1.0) - glBindFramebuffer(GL_FRAMEBUFFER,0) - + glBindFramebuffer(GL_FRAMEBUFFER, 0) diff --git a/MatrixStuff/Transformations.py b/MatrixStuff/Transformations.py index 3527260..013fdfe 100644 --- a/MatrixStuff/Transformations.py +++ b/MatrixStuff/Transformations.py @@ -2,46 +2,48 @@ import math as math import numpy as np -def lookAt(eyeX,eyeY,eyeZ,cX,cY,cZ,upX,upY,upZ): - F = np.matrix([cX-eyeX,cY-eyeY,cZ-eyeZ]) - UP = np.matrix([upX,upY,upZ]) +def lookAt(eyeX, eyeY, eyeZ, cX, cY, cZ, upX, upY, upZ): + F = np.matrix([cX - eyeX, cY - eyeY, cZ - eyeZ]) + UP = np.matrix([upX, upY, upZ]) f = F / math.sqrt(np.sum(np.square(F))) UP = UP / math.sqrt(np.sum(np.square(UP))) - s = np.cross(f,UP) - u = np.cross((s/math.sqrt(np.sum(np.square(s)))),f) + s = np.cross(f, UP) + u = np.cross((s / math.sqrt(np.sum(np.square(s)))), f) mat = np.matrix([ - [s[0,0],s[0,1],s[0,2],0], - [u[0,0],u[0,1],u[0,2],0], - [-f[0,0],-f[0,1],-f[0,2],0], - [0,0,0,1] - ]) - - return np.transpose(mat) - -def orthogonalMatrix(r,l,t,b,f,n): - mat = np.matrix([ - [2/(r-l),0,0,-(r+l)/(r-l)], - [0,2/(t-b),0,-(t+b)/(t-b)], - [0,0,-2/(f-n),-(f+n)/(f-n)], - [0,0,0,1] + [s[0, 0], s[0, 1], s[0, 2], 0], + [u[0, 0], u[0, 1], u[0, 2], 0], + [-f[0, 0], -f[0, 1], -f[0, 2], 0], + [0, 0, 0, 1] ]) return np.transpose(mat) -def perspectiveMatrix(fovy,aspect,znear,zfar): - fovy_rads = fovy*math.pi/180 - f = math.cos(fovy_rads/2.0)/math.sin(fovy_rads/2.0) - a = (zfar+znear)/(znear-zfar) +def orthogonalMatrix(r, l, t, b, f, n): + mat = np.matrix([ + [2 / (r - l), 0, 0, -(r + l) / (r - l)], + [0, 2 / (t - b), 0, -(t + b) / (t - b)], + [0, 0, -2 / (f - n), -(f + n) / (f - n)], + [0, 0, 0, 1] + ]) + + return np.transpose(mat) + + +def perspectiveMatrix(fovy, aspect, znear, zfar): + fovy_rads = fovy * math.pi / 180 + f = math.cos(fovy_rads / 2.0) / math.sin(fovy_rads / 2.0) + a = (zfar + znear) / (znear - zfar) b = (2 * zfar * znear) / (znear - zfar) - mat = np.matrix([[f/aspect,0,0,0], - [0,f,0,0], - [0,0,a,b], - [0,0,-1,0]],np.float32) + mat = np.matrix([[f / aspect, 0, 0, 0], + [0, f, 0, 0], + [0, 0, a, b], + [0, 0, -1, 0]], np.float32) return np.transpose(mat) + def translate(x, y, z): mat = np.matrix([[1, 0, 0, x], [0, 1, 0, y], @@ -50,16 +52,20 @@ def translate(x, y, z): return np.transpose(mat) -def rotate(x,y,z,d4 = False): + +def rotate(x, y, z, d4=False): if not d4: mat = np.matrix([[1, 0, 0], [0, math.cos(x), -math.sin(x)], [0, math.sin(x), math.cos(x)]], np.float32) mat = mat * np.matrix([[math.cos(y), 0, -math.sin(y)], [0, 1, 0], [math.sin(y), 0, math.cos(y)]], np.float32) mat = mat * np.matrix([[math.cos(z), -math.sin(z), 0], [math.sin(z), math.cos(z), 0], [0, 0, 1]], np.float32) else: - mat = np.matrix([[1, 0, 0, 0], [0, math.cos(x), -math.sin(x), 0], [0, math.sin(x), math.cos(x), 0], [0, 0, 0, 1]], np.float32) - mat = mat * np.matrix([[math.cos(y), 0, -math.sin(y), 0], [0, 1, 0, 0], [math.sin(y), 0, math.cos(y), 0], [0, 0, 0, 1]], np.float32) - mat = mat * np.matrix([[math.cos(z), -math.sin(z), 0, 0], [math.sin(z), math.cos(z), 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32) + mat = np.matrix( + [[1, 0, 0, 0], [0, math.cos(x), -math.sin(x), 0], [0, math.sin(x), math.cos(x), 0], [0, 0, 0, 1]], + np.float32) + mat = mat * np.matrix( + [[math.cos(y), 0, -math.sin(y), 0], [0, 1, 0, 0], [math.sin(y), 0, math.cos(y), 0], [0, 0, 0, 1]], + np.float32) + mat = mat * np.matrix( + [[math.cos(z), -math.sin(z), 0, 0], [math.sin(z), math.cos(z), 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], + np.float32) return np.transpose(mat) - - - diff --git a/Objects/Cube/Cube.py b/Objects/Cube/Cube.py index b92d7de..4123252 100644 --- a/Objects/Cube/Cube.py +++ b/Objects/Cube/Cube.py @@ -4,13 +4,16 @@ from OpenGL.GL import * from Objects.Objects import * import numpy as np + class Cube(Object): GeometryShaderId = -1 + def __init__(self): Object.__init__(self) - if(Cube.GeometryShaderId == -1): + if (Cube.GeometryShaderId == -1): self.initializeShader() - def initializeShader(self)->bool: + + def initializeShader(self) -> bool: with open('./Objects/Cube/cube_geometry.glsl', 'r') as f: geometry_shader_string = f.read() Cube.GeometryShaderId = glCreateShader(GL_GEOMETRY_SHADER) @@ -19,4 +22,4 @@ class Cube(Object): if glGetShaderiv(Cube.GeometryShaderId, GL_COMPILE_STATUS) != GL_TRUE: raise RuntimeError(glGetShaderInfoLog(Cube.GeometryShaderId)) return False - return True \ No newline at end of file + return True diff --git a/Objects/Objects.py b/Objects/Objects.py index 8331af8..916bed7 100644 --- a/Objects/Objects.py +++ b/Objects/Objects.py @@ -1,20 +1,27 @@ import numpy as np import typing + + class Object: GeometryShaderId = -1 - def draw(self)->bool: + + def draw(self) -> bool: return False - def initializeShader(self)->bool: + + def initializeShader(self) -> bool: return True + def __init__(self): self.pos = np.zeros((3)) self.color = np.zeros((3,)) self.programmId = -1 - def translate(self,M): - self.pos = np.array((np.concatenate((self.pos, [1])) * M)[0,0:3])[0] + + def translate(self, M): + self.pos = np.array((np.concatenate((self.pos, [1])) * M)[0, 0:3])[0] return self - def setColor(self,R,G,B): + + def setColor(self, R, G, B): self.color[0] = R self.color[1] = G self.color[2] = B - return self \ No newline at end of file + return self diff --git a/Objects/Structure.py b/Objects/Structure.py index b7d660f..f1e10cb 100644 --- a/Objects/Structure.py +++ b/Objects/Structure.py @@ -22,20 +22,21 @@ def check_error(message): return True return False + class Structure: def __init__(self): self.Objects = {} self.vais = {} - self.Matrix = np.identity(4,np.float32) + self.Matrix = np.identity(4, np.float32) self.dirty = False - def addShape(self,program,shape): + def addShape(self, program, shape): if not program in self.Objects.keys(): self.Objects[program] = [] self.Objects[program].append(shape) self.dirty = True - def removeShape(self,program,shape): + def removeShape(self, program, shape): if program in self.Objects.keys(): self.Objects[program].remove(shape) if len(self.Objects[program]) == 0: @@ -51,11 +52,12 @@ class Structure: glEnableClientState(GL_COLOR_ARRAY) self.vais = {} - for key,objects in self.Objects.items(): - tvai = GLuint(-1) - tpbi = -1 - tcbi = -1 - tsbi = -1 + for key, objects in self.Objects.items(): + tvai = GLuint(0) + tpbi = GLuint(0) + tcbi = GLuint(0) + tsbi = GLuint(0) + glGenVertexArrays(1, tvai) glBindVertexArray(tvai) @@ -69,7 +71,7 @@ class Structure: positions.append(o.pos[0]) positions.append(o.pos[1]) positions.append(o.pos[2]) - glBufferData(GL_ARRAY_BUFFER, np.asarray(positions), GL_STATIC_DRAW) + glBufferData(GL_ARRAY_BUFFER, np.array(positions, dtype=np.float32), GL_STATIC_DRAW) glVertexAttribPointer(vid, 3, GL_FLOAT, GL_FALSE, 0, None) check_error("Could not create position buffer") @@ -80,14 +82,14 @@ class Structure: colors.append(o.color[2]) tcbi = glGenBuffers(1) glBindBuffer(GL_ARRAY_BUFFER, tcbi) - glBufferData(GL_ARRAY_BUFFER, np.asarray(colors), GL_STATIC_DRAW) + glBufferData(GL_ARRAY_BUFFER, np.array(colors, dtype=np.float32), GL_STATIC_DRAW) vc = glGetAttribLocation(key, "MyInColor") if vc != -1: glEnableVertexAttribArray(vc) glVertexAttribPointer(vc, 3, GL_FLOAT, GL_FALSE, 0, None) check_error("Could not create color buffer") - if hasattr(objects[0],'size'): + if hasattr(objects[0], 'size'): sizes = [] for o in objects: sizes.append(o.size[0]) @@ -95,7 +97,7 @@ class Structure: sizes.append(o.size[2]) tsbi = glGenBuffers(1) glBindBuffer(GL_ARRAY_BUFFER, tsbi) - glBufferData(GL_ARRAY_BUFFER, np.asarray(sizes), GL_STATIC_DRAW) + glBufferData(GL_ARRAY_BUFFER, np.array(sizes, dtype=np.float32), GL_STATIC_DRAW) vs = glGetAttribLocation(key, "MyInSize") if vs != -1: glEnableVertexAttribArray(vs) @@ -103,26 +105,26 @@ class Structure: check_error("Could not create size buffer") glBindVertexArray(0) - self.vais[key] = (tvai,tpbi,tcbi,tsbi) + self.vais[key] = (tvai, tpbi, tcbi, tsbi) self.dirty = False def clearVertexArrays(self): - for key,(a,p,c,s) in self.vais.items(): + for key, (a, p, c, s) in self.vais.items(): if p != -1: glDisableVertexAttribArray(p) - glDeleteBuffers(1,[p]) + glDeleteBuffers(1, [p]) if c != -1: glDisableVertexAttribArray(c) - glDeleteBuffers(1,[c]) + glDeleteBuffers(1, [c]) if s != -1 and s != GLuint(-1): glDisableVertexAttribArray(s) - glDeleteBuffers(1,[s]) + glDeleteBuffers(1, [s]) glDeleteVertexArrays(1, a) check_error("Could not destroy vertex array") - def render(self,projMatrix,geometryRotMatrix,alternateprograms = None): + def render(self, projMatrix, geometryRotMatrix, alternateprograms=None): - for key,tupel in self.vais.items(): + for key, tupel in self.vais.items(): if alternateprograms == None: program_id = key else: @@ -150,20 +152,22 @@ class Structure: else: return False + class CompoundStructure: def __init__(self): self.Structures = [] - def addStructure(self, structure : Structure, M : np.matrix = np.identity(4, np.float), R : np.matrix = np.identity(3, np.float)): - self.Structures.append((structure,M,R)) + def addStructure(self, structure: Structure, M: np.matrix = np.identity(4, np.float), + R: np.matrix = np.identity(3, np.float)): + self.Structures.append((structure, M, R)) - def render(self,projMatrix,geometryRotMatrix,alternateprograms = None): + def render(self, projMatrix, geometryRotMatrix, alternateprograms=None): for (structure, M, R) in self.Structures: structure.buildvertexArrays() - structure.render(M*projMatrix, R*geometryRotMatrix, alternateprograms) + structure.render(M * projMatrix, R * geometryRotMatrix, alternateprograms) def __eq__(self, other): if type(other) is type(self): return self.Structures == other.Structures else: - return False \ No newline at end of file + return False diff --git a/fragment.glsl b/fragment.glsl index 0192d0c..264112f 100644 --- a/fragment.glsl +++ b/fragment.glsl @@ -21,13 +21,19 @@ const float specFactor = 1.0; const float shininess = 16.0; const float screenGamma = 2.2; const float pitl = 2*3.14159265359 / 16.0; -const float circlelength = 700.0; +const float circlelength = 100000.0; bool isVisible(int i, vec2 offs, float lambertian) { - float bias = 0.005*tan(acos(lambertian)); - bias = clamp(bias,0.0,0.01);//*tan(acos(dot(normal,-normalize(lightpos[i] - pos.xyz)))); - return !(texture(ShadowMaps[i],lightviewpos[i].xy + offs).x < (lightviewpos[i].z - bias)); +// float bias = 0.005*tan(acos(lambertian)); +// bias = clamp(bias,0.0,0.01);//*tan(acos(dot(normal,-normalize(lightpos[i] - pos.xyz)))); +// return !(texture(ShadowMaps[i],lightviewpos[i].xy + offs).x < (lightviewpos[i].z - bias)); + + vec2 size = textureSize(ShadowMaps[i], 0); + float bias = (1.0 / (10.0 * max(size.x, size.y)))*sin(acos(lambertian)); +// bias = 0.0001*(1.0 - lambertian); +// bias = max(bias, 0.001); + return !((texture(ShadowMaps[i],lightviewpos[i].xy + offs).x) < (lightviewpos[i].z - bias)); } void main() @@ -36,7 +42,7 @@ void main() for(int i = 0; i < numLights; i++){ vec3 lightDir = -normalize(lightpos[i] - pos.xyz); - float lambertian = max(dot(normalize(normal),lightDir),0.0); + float lambertian = dot(normalize(normal),lightDir); float cosTheta = clamp(dot(normalize(normal),-lightDir), 0.0, 1.0); float specular = 0; vec3 viewDir = normalize(-pos.xyz); @@ -45,29 +51,25 @@ void main() specular = int(lambertian > 0)*pow(specAngle, shininess); //int visible = int(!(texture(ShadowMaps,lightpos[i].xy/2 + vec2(0.5,0.5)).z < (lightpos[i].z))); float visible = 0; - for(int j = 0; j < 4; j++){ - vec2 offs = vec2(cos(j*4*pitl),sin(j*4*pitl)) / circlelength; - visible += float(isVisible(i, offs,cosTheta)) * 1.0/16.0; - } - if(visible == 0.25) - visible = 1.0; - else - visible = 0; - for(int j = 0; j < 16; j++){ - vec2 offs = vec2(cos(j*pitl),sin(j*pitl)) / circlelength; - visible += float(isVisible(i, offs,cosTheta)) * 1.0/16.0; - } - colorLinear += (visible * 0.5 + 0.5) *(lambertian * diffuseFactor * colorin * lightColor[i] + specular * specFactor*colorin); + int count = 0; + + vec2 texelSize = 1.0 / textureSize(ShadowMaps[i], 0); + for(int x = -2; x <= 2; x++){ + for(int y = -2; y <= 2; y++){ + vec2 offs = vec2(x, y) * texelSize; + visible += float(int(isVisible(i, offs, lambertian))) * 1.0/25.0; + } + } + bool condition = visible >= (1.0/5.0); + visible = float(condition) * 1.0 + float(!condition) * visible; + + colorLinear += (visible * 0.5 + 0.0) *(lambertian * diffuseFactor * colorin * lightColor[i] + specular * specFactor*colorin) * (200.0/(length(lightpos[i] - pos.xyz) * length(lightpos[i] - pos.xyz))); - colorLinear /= dot(lightpos[i] - pos.xyz, lightpos[i] - pos.xyz)/200; - //colorLinear = vec3(visible * specular); } vec3 colorGammaCorrected = colorLinear;//pow(colorLinear, vec3(1.0/screenGamma)); - - - //colorOut = vec4(colorin, 1.0)*max(dot(normal,normalize(vec3(0.0,0.0,10.0)-pos)),0.0); - colorOut = vec4(colorGammaCorrected,1.0) * float(gl_FragCoord.y <= 768 && gl_FragCoord.x <= 1024 && gl_FragCoord.x >= 0 && gl_FragCoord.y >= 0); + + colorOut = vec4(colorGammaCorrected,1.0); depth = gl_FragCoord.z; } \ No newline at end of file diff --git a/main.py b/main.py index 1b965dc..695f05b 100644 --- a/main.py +++ b/main.py @@ -1,3 +1,8 @@ +import random +import sys + +print('64' if sys.maxsize > 2 ** 32 else '32') + from wsgiref.validate import check_errors from OpenGL.GL.ARB.vertex_array_object import glDeleteVertexArrays @@ -28,23 +33,25 @@ program2_id = 0 program3_id = 0 start = time.time() frames = 0 -width = 1024 -height = 768 +width = 1920 +height = 1080 opening = 45 l = Light() + + def main(): lm = LightingManager() - #lm.addRenderStep(0,0) - #lm.addRenderStep(1,1) - #lm.removeRenderStep(0,0) + # lm.addRenderStep(0,0) + # lm.addRenderStep(1,1) + # lm.removeRenderStep(0,0) glutInit(sys.argv) w = width h = height glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH) - glutInitWindowSize(w,h) + glutInitWindowSize(w, h) glutCreateWindow(name) - #glutEnterGameMode() + # glutEnterGameMode() print("Vendor:", glGetString(GL_VENDOR)) print("Renderer:", glGetString(GL_RENDERER)) @@ -54,16 +61,15 @@ def main(): c = Cube() cuboid = Cuboid() - - glClearColor(0.,0.,0.,1.) - #glShadeModel(GL_SMOOTH) - #glDisable(GL_CULL_FACE) + glClearColor(0., 0., 0., 1.) + # glShadeModel(GL_SMOOTH) + # glDisable(GL_CULL_FACE) glEnable(GL_CULL_FACE) glCullFace(GL_BACK) glEnable(GL_TEXTURE_2D) glEnable(GL_DEPTH_TEST) - #glEnable(GL_LIGHTING) + # glEnable(GL_LIGHTING) '''lightZeroPosition = [10.,4.,10.,1.] lightZeroColor = [0.8,1.0,0.8,1.0] #green tinged glLightfv(GL_LIGHT0, GL_POSITION, lightZeroPosition) @@ -78,12 +84,10 @@ def main(): '''glMatrixMode(GL_PROJECTION) gluPerspective(40.,1.,1.,40.) glMatrixMode(GL_MODELVIEW)''' - #gluLookAt(0,0,10, + # gluLookAt(0,0,10, # 0,0,0, # 0,1,0) - #glPushMatrix() - glViewport(0, 0, w,h) - glFrustum(-10,10,-10,10,0.01,100) + # glPushMatrix() with open('passthroughvertex.glsl', 'r') as f: vertex_shader_string = f.read() @@ -120,29 +124,38 @@ def main(): global program_id, program2_id, program3_id program_id = glCreateProgram() glAttachShader(program_id, vertex_shader_id) - glAttachShader(program_id,Cube.GeometryShaderId) - #glAttachShader(program_id, Cuboid.GeometryShaderId) + glAttachShader(program_id, Cube.GeometryShaderId) + # glAttachShader(program_id, Cuboid.GeometryShaderId) glAttachShader(program_id, fragment_shader_id) - #glAttachShader(program_id, l.FragmentShaderId) + # glAttachShader(program_id, l.FragmentShaderId) glLinkProgram(program_id) global struct, cstruct struct = Structure() - struct.addShape(program_id,Cube().translate(translate(0, 0, 1)).setColor(1, 1, 0)) - struct.addShape(program_id, Cube().translate(translate(1, 1, 0)).setColor(0, 0, 1)) - struct.addShape(program_id, Cube().translate(translate(1, 0, 0)).setColor(0, 1, 0)) - struct.addShape(program_id, Cube().translate(translate(1, -1, 0)).setColor(1, 0, 0)) - struct.addShape(program_id, Cube().translate(translate(0, -1, 0)).setColor(0, 1, 0)) - struct.addShape(program_id, Cube().translate(translate(-1, -1, 0)).setColor(0, 0, 1)) - struct.addShape(program_id, Cube().translate(translate(-1, 0, 0)).setColor(0, 1, 1)) - struct.addShape(program_id, Cube().translate(translate(-1, 1, 0)).setColor(1, 1, 1)) - struct.addShape(program_id, Cube().translate(translate(0, 1, 0)).setColor(0, 0, 1)) + struct.addShape(program_id, Cube().translate(translate(0, 0, 1)).setColor(1, 1, 0)) + # struct.addShape(program_id, Cube().translate(translate(1, 1, 0)).setColor(0, 0, 1)) + # struct.addShape(program_id, Cube().translate(translate(1, 0, 0)).setColor(0, 1, 0)) + # struct.addShape(program_id, Cube().translate(translate(1, -1, 0)).setColor(1, 0, 0)) + # struct.addShape(program_id, Cube().translate(translate(0, -1, 0)).setColor(0, 1, 0)) + # struct.addShape(program_id, Cube().translate(translate(-1, -1, 0)).setColor(0, 0, 1)) + # struct.addShape(program_id, Cube().translate(translate(-1, 0, 0)).setColor(0, 1, 1)) + # struct.addShape(program_id, Cube().translate(translate(-1, 1, 0)).setColor(1, 1, 1)) + # struct.addShape(program_id, Cube().translate(translate(0, 1, 0)).setColor(0, 0, 1)) + + for x_pos in range(-10, 10, 1): + for y_pos in range(-10, 10): + struct.addShape(program_id, Cube().translate(translate(x_pos, y_pos, 0)).setColor( + random.randint(0, 100) / 100.0, random.randint(0, 100) / 100.0, random.randint(0, 100) / 100.0)) + + struct.buildvertexArrays() - struct.clearVertexArrays() + + # struct.clearVertexArrays() + cstruct = CompoundStructure() cstruct.addStructure(struct) - program3_id = l.getDepthProgram(vertex_shader_id,Cube.GeometryShaderId) + program3_id = l.getDepthProgram(vertex_shader_id, Cube.GeometryShaderId) program2_id = glCreateProgram() glAttachShader(program2_id, passthrough_vertex_shader_id) @@ -152,16 +165,16 @@ def main(): if glGetProgramiv(program_id, GL_LINK_STATUS) != GL_TRUE: raise RuntimeError(glGetProgramInfoLog(program_id)) - global vai, pbi,cbi,vai2,vai3 + global vai, pbi, cbi, vai2, vai3 vai, pbi, cbi = create_vertex_buffers(np.array([0, 0, 1, - 1,1,0, + 1, 1, 0, 1, 0, 0, 1, -1, 0, 0, -1, 0, -1, -1, 0, -1, 0, 0, -1, 1, 0, - 0, 1, 0],dtype=np.float32), + 0, 1, 0], dtype=np.float32), np.array([1, 1, 0, 0, 0, 1, 0, 1, 0, @@ -170,15 +183,15 @@ def main(): 0, 0, 1, 0, 1, 1, 1, 1, 1, - 0, 0, 1],dtype=np.float32), program_id, + 0, 0, 1], dtype=np.float32), program_id, sizes=np.array( [0.5, 1.5, 1.5, 0.5, 1.5, 1.5, - 0.5, 1.5, 1.5],dtype=np.float32)) + 0.5, 1.5, 1.5], dtype=np.float32)) v = [] color = [] - for i in range(-11,12): - for j in range(-11,12): + for i in range(-11, 12): + for j in range(-11, 12): v.append(i) v.append(j) v.append(0) @@ -186,7 +199,6 @@ def main(): color.append(1) color.append(1) - '''vai, pbi, cbi = create_vertex_buffers(np.array(v, dtype=np.float32), np.array(color, dtype=np.float32), program_id, sizes=np.array( @@ -194,18 +206,18 @@ def main(): 0.5, 1.5, 1.5, 0.5, 1.5, 1.5], dtype=np.float32))''' - vai2, _, _ = create_vertex_buffers(np.array([0.4,0.4,0, - 1,0.4,0, - 0.4,1,0, - 0.4,1,0, - 1,0.4,0, - 1,1,0], dtype=np.float32), - np.array([0,0,0, - 1,0,0, - 0,1,0, - 0,1,0, - 1,0,0, - 1,1,0],dtype=np.float32),program2_id) + vai2, _, _ = create_vertex_buffers(np.array([0.4, 0.4, 0, + 1, 0.4, 0, + 0.4, 1, 0, + 0.4, 1, 0, + 1, 0.4, 0, + 1, 1, 0], dtype=np.float32), + np.array([0, 0, 0, + 1, 0, 0, + 0, 1, 0, + 0, 1, 0, + 1, 0, 0, + 1, 1, 0], dtype=np.float32), program2_id) vai3, _, _ = create_vertex_buffers(np.array([-1, -1, 0, 1, -1, 0, -1, 1, 0, @@ -218,51 +230,54 @@ def main(): 0, 1, 0, 1, 0, 0, 1, 1, 0], dtype=np.float32), program2_id) - struct.render(projMatrix,rotate(rx, 0, 0)) + struct.render(projMatrix, rotate(rx, 0, 0)) glutMainLoop() return + projMatrix = perspectiveMatrix(45.0, 400 / 400, 0.01, 100.0); + def check_error(message): gl_error = glGetError() - if (gl_error != GL_NO_ERROR): + if gl_error != GL_NO_ERROR: print("Error: " + message) - if (gluErrorString(gl_error)): + if gluErrorString(gl_error): print(gluErrorString(gl_error)) else: print(hex(gl_error)) return True return False -def create_vertex_buffers(positions,colors,program_id,sizes=np.array([])): + +def create_vertex_buffers(positions, colors, program_id, sizes=np.array([])): glEnableClientState(GL_VERTEX_ARRAY) glEnableClientState(GL_TEXTURE_COORD_ARRAY) glEnableClientState(GL_NORMAL_ARRAY) glEnableClientState(GL_COLOR_ARRAY) - #global vai, pbi, cbi + # global vai, pbi, cbi tvai = GLuint(0) tpbi = GLuint(0) tcbi = GLuint(0) - #test = glGetString(GL_VERSION) + # test = glGetString(GL_VERSION) - glGenVertexArrays(1,tvai) + glGenVertexArrays(1, tvai) glBindVertexArray(tvai) - vid = glGetAttribLocation(program_id,"in_position") + vid = glGetAttribLocation(program_id, "in_position") glEnableVertexAttribArray(vid) tpbi = glGenBuffers(1) - glBindBuffer(GL_ARRAY_BUFFER,tpbi) - glBufferData(GL_ARRAY_BUFFER,positions,GL_STATIC_DRAW) - glVertexAttribPointer(vid,3,GL_FLOAT,GL_FALSE,0,None) + glBindBuffer(GL_ARRAY_BUFFER, tpbi) + glBufferData(GL_ARRAY_BUFFER, positions, GL_STATIC_DRAW) + glVertexAttribPointer(vid, 3, GL_FLOAT, GL_FALSE, 0, None) check_error("Could not create position buffer") tcbi = glGenBuffers(1) - glBindBuffer(GL_ARRAY_BUFFER,tcbi) - glBufferData(GL_ARRAY_BUFFER, colors,GL_STATIC_DRAW) + glBindBuffer(GL_ARRAY_BUFFER, tcbi) + glBufferData(GL_ARRAY_BUFFER, colors, GL_STATIC_DRAW) vc = glGetAttribLocation(program_id, "MyInColor") if vc != -1: glEnableVertexAttribArray(vc) @@ -271,45 +286,48 @@ def create_vertex_buffers(positions,colors,program_id,sizes=np.array([])): if len(sizes) > 0: sbi = glGenBuffers(1) - glBindBuffer(GL_ARRAY_BUFFER,sbi) - glBufferData(GL_ARRAY_BUFFER,sizes,GL_STATIC_DRAW) + glBindBuffer(GL_ARRAY_BUFFER, sbi) + glBufferData(GL_ARRAY_BUFFER, sizes, GL_STATIC_DRAW) vs = glGetAttribLocation(program_id, "MyInSize") if vs != -1: glEnableVertexAttribArray(vs) - glVertexAttribPointer(vs, 3, GL_FLOAT, GL_FALSE, 0 ,None) + glVertexAttribPointer(vs, 3, GL_FLOAT, GL_FALSE, 0, None) check_error("Could not create size buffer") glBindVertexArray(0) return tvai, tpbi, tcbi + def clear_buffer(buffer_id): glDisableVertexAttribArray(buffer_id) - glDeleteBuffers(1,[buffer_id]) + glDeleteBuffers(1, [buffer_id]) + def clear_vertex_array(va_id): - glDeleteVertexArrays(1,va_id) + glDeleteVertexArrays(1, va_id) check_error("Could not destroy vertex array") -vai, pbi, cbi = 0,0,0 -vai2,pbi2,cbi2 = 0,0,0 -vai3,pbi3,cbi3 = 0,0,0 + +vai, pbi, cbi = 0, 0, 0 +vai2, pbi2, cbi2 = 0, 0, 0 +vai3, pbi3, cbi3 = 0, 0, 0 rx = 0 ry = 0 -def render(program_id,projMatrix,vai,x,y,z,alternateprograms = None): +def render(program_id, projMatrix, vai, x, y, z, alternateprograms=None): global struct, cstruct - cstruct.render(translate(x, y, z) * rotate(0,ry,0,True) * projMatrix,rotate(rx, 0, 0),alternateprograms) - - '''glUseProgram(program_id) + cstruct.render(translate(x, y, z) * rotate(0, ry, 0, True) * projMatrix, rotate(rx, 0, 0), alternateprograms) + ''' + glUseProgram(program_id) check_error("Renderingprogram is not initialized!") projection = glGetUniformLocation(program_id, 'projModelViewMatrix') rot = glGetUniformLocation(program_id, 'rotMatrix') - glUniformMatrix4fv(projection, 1, GL_FALSE, np.array(translate(x, y, z) * rotate(0,ry,0,True) * projMatrix)) - glUniformMatrix3fv(rot, 1, GL_FALSE, np.array(rotate(rx, 0, 0))) + glUniformMatrix4fv(projection, 1, GL_FALSE, np.array(translate(x, y, z) * rotate(rx, 0, 0, True) * projMatrix, dtype=np.float32)) + glUniformMatrix3fv(rot, 1, GL_FALSE, np.array(rotate(rx, 0, 0), dtype=np.float32)) glBindVertexArray(vai) @@ -317,7 +335,9 @@ def render(program_id,projMatrix,vai,x,y,z,alternateprograms = None): check_error("Rendering problem") glBindVertexArray(0) - glUseProgram(0)''' + glUseProgram(0) + ''' + def display(): '''if time.time() - start >= 1: @@ -328,18 +348,27 @@ def display(): else: global frames frames += 1''' - + glClearColor(0, 0, 0, 0) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) global l l.prepareForDepthMapping() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) - #newMat = orthogonalMatrix(10, -10, 10, -10, 10, -10) * lookAt(cx, cy, 5, 0, 0, 0, 0, 1,0) * np.identity(4) - #newMat = translate(0, 0, -10) * newMat + # newMat = orthogonalMatrix(10, -10, 10, -10, 10, -10) * lookAt(cx, cy, 5, 0, 0, 0, 0, 1,0) * np.identity(4) + # newMat = translate(0, 0, -10) * newMat + + global projMatrix + projMatrix = perspectiveMatrix(45, float(width) / float(height), 0.01, 100.0) + + newMat = translate(-cx, -cy, -2) * lookAt(cx, cy, 2, 0, 0, 0, 0, 1, 0) * perspectiveMatrix(opening, + float(l.map_size) / + float(l.map_size), + 0.01, 100.0) + l.pos = [-cx, -cy, -2] + l.ModelviewProjectionMatrix = newMat + l.lightColor = [1, 1, 1] - newMat = translate(-cx,-cy,-5)*lookAt(cx,cy,5,0,0,0,0,1,0) * perspectiveMatrix(opening,float(width)/float(height),0.01,100.0) - oldMat = rotate(0, -0.5, 0, True) * projMatrix glUseProgram(program3_id) widthid = glGetUniformLocation(program3_id, 'width') heightid = glGetUniformLocation(program3_id, 'height') @@ -352,10 +381,11 @@ def display(): altPrId = {} altPrId[program_id] = program3_id - render(program3_id, newMat, vai, 0, 0, 0,altPrId) + render(program3_id, newMat, vai, 0, 0, 0, altPrId) glFlush() l.finishDepthMapping() - resize(width, height) + + glClearColor(1, 0, 0, 0) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glUseProgram(program_id) @@ -365,20 +395,15 @@ def display(): farid = glGetUniformLocation(program_id, 'far') glUniform1f(nearid, 0.01) glUniform1f(farid, 100) - glUniform1f(widthid,width) + glUniform1f(widthid, width) glUniform1f(heightid, height) - lightProjModelViewMatrix = glGetUniformLocation(program_id, 'lightProjModelViewMatrix') numLights = glGetUniformLocation(program_id, 'numLights') lightpos = glGetUniformLocation(program_id, 'lightpos') lightcolorid = glGetUniformLocation(program_id, 'lightColor') - l.pos = [-cx, -cy, -5] - l.ModelviewProjectionMatrix = newMat - l.lightColor = [1,1,1] - - glUniformMatrix4fv(lightProjModelViewMatrix,1,GL_FALSE,np.array(l.ModelviewProjectionMatrix)) + glUniformMatrix4fv(lightProjModelViewMatrix, 1, GL_FALSE, np.array(l.ModelviewProjectionMatrix)) glUniform1iv(numLights, 1, 1) glUniform3fv(lightpos, 1, l.pos) glUniform3fv(lightcolorid, 1, l.lightColor) @@ -386,15 +411,15 @@ def display(): texID = glGetUniformLocation(program_id, 'ShadowMaps') glActiveTexture(GL_TEXTURE0) glBindTexture(GL_TEXTURE_2D, l.DepthBuffer) - glUniform1iv(texID,1, 0) + glUniform1iv(texID, 1, 0) - render(program_id,projMatrix,vai,0,0,-10) - - temp, _, _ = create_vertex_buffers(np.array([cx, cy, 5], dtype=np.float32), - np.array([1, 1, 0], dtype=np.float32), program_id) - render(program_id, projMatrix, temp, 0, 0, -10) - #ry += 0.05 + glViewport(0, 0, width, height) + render(program_id, translate(0, 0, -10) * lookAt(0, 0, 10, 0, 0, 0, 0, 1, 0) * projMatrix, vai, 0, 0, 0) + # temp, _, _ = create_vertex_buffers(np.array([cx, cy, 5], dtype=np.float32), + # np.array([1, 1, 0], dtype=np.float32), program_id) + # render(program_id, projMatrix, temp, 0, 0, -10) + # ry += 0.05 glUseProgram(program2_id) check_error("Renderingprogram is not initialized!") @@ -407,107 +432,114 @@ def display(): glBindVertexArray(vai2) glDrawArrays(GL_TRIANGLES, 0, 6) check_error("Rendering problem") + glBindVertexArray(0) glUseProgram(0) glFlush() - glFlush() glutSwapBuffers() global rx - #rx += 0.025 + # rx += 0.025 global ry glutPostRedisplay() return + cx = 0 cy = 0 -def display2(): - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) - global l - l.prepareForDepthMapping() - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) - newMat = orthogonalMatrix(10, -10, 10, -10, 20, 0.01) * lookAt(-cx, -cy, 1, 0, 0, 0, 0, 1, 0) * np.identity(4) - newMat = translate(5,0,-10)*lookAt(-5,0,10,0,0,0,0,1,0) * projMatrix - oldMat = rotate(0,-0.5,0,True) * projMatrix - glUseProgram(program3_id) - widthid = glGetUniformLocation(program3_id, 'width') - heightid = glGetUniformLocation(program3_id, 'height') - nearid = glGetUniformLocation(program3_id, 'near') - farid = glGetUniformLocation(program3_id, 'far') - glUniform1f(nearid, 0.01) - glUniform1f(farid, 100) - glUniform1f(widthid, width) - glUniform1f(heightid, height) - render(program3_id, newMat,vai,0,0,0) - glFlush() - l.finishDepthMapping() - glUseProgram(program2_id) - check_error("Renderingprogram is not initialized!") +# def display2(): +# glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) +# global l +# l.prepareForDepthMapping() +# glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) +# +# newMat = orthogonalMatrix(10, -10, 10, -10, 20, 0.01) * lookAt(-cx, -cy, 1, 0, 0, 0, 0, 1, 0) * np.identity(4) +# newMat = translate(5, 0, -10) * lookAt(-5, 0, 10, 0, 0, 0, 0, 1, 0) * projMatrix +# oldMat = rotate(0, -0.5, 0, True) * projMatrix +# glUseProgram(program3_id) +# widthid = glGetUniformLocation(program3_id, 'width') +# heightid = glGetUniformLocation(program3_id, 'height') +# nearid = glGetUniformLocation(program3_id, 'near') +# farid = glGetUniformLocation(program3_id, 'far') +# glUniform1f(nearid, 0.01) +# glUniform1f(farid, 100) +# glUniform1f(widthid, width) +# glUniform1f(heightid, height) +# render(program3_id, newMat, vai, 0, 0, 0) +# glFlush() +# l.finishDepthMapping() +# +# glUseProgram(program2_id) +# check_error("Renderingprogram is not initialized!") +# +# texID = glGetUniformLocation(program2_id, "Tex") +# glActiveTexture(GL_TEXTURE0) +# glBindTexture(GL_TEXTURE_2D, l.DepthBuffer) +# glUniform1i(texID, 0) +# +# glBindVertexArray(vai3) +# glDrawArrays(GL_TRIANGLES, 0, 6) +# check_error("Rendering problem") +# glBindVertexArray(0) +# glUseProgram(0) +# glFlush() +# glutSwapBuffers() +# glutPostRedisplay() - texID = glGetUniformLocation(program2_id, "Tex") - glActiveTexture(GL_TEXTURE0) - glBindTexture(GL_TEXTURE_2D,l.DepthBuffer) - glUniform1i(texID,0) - glBindVertexArray(vai3) - glDrawArrays(GL_TRIANGLES, 0, 6) - check_error("Rendering problem") - glBindVertexArray(0) - glUseProgram(0) - glFlush() - glutSwapBuffers() - glutPostRedisplay() - -def resize(w,h): - glViewport(0,0,w,h) +def resize(w, h): + w = max(w, 1) + h = max(h, 1) + glViewport(0, 0, w, h) global projMatrix - projMatrix = perspectiveMatrix(45.0,float(w)/float(h),0.01,100.0) + projMatrix = perspectiveMatrix(45.0, float(w) / float(h), 0.01, 100.0) global width, height width = w height = h -def keyboardHandler(key:int,x:int,y:int): +def keyboardHandler(key: int, x: int, y: int): if key == b'\x1b': exit() + global rx + global cx + global cy + global opening if key == b'+': - global rx rx += 0.25 if key == b'-': - global rx rx -= 0.25 if key == b'w': - global cy cy += 0.25 if key == b's': - global cy cy -= 0.25 if key == b'a': - global cx cx -= 0.25 if key == b'd': - global cx cx += 0.25 if key == b'q': - global opening opening -= 0.25 if key == b'e': - global opening opening += 0.25 if key == b'r': - print(cx,cy, opening) + print(cx, cy, opening) glutPostRedisplay() - #print(key,x,y) + # print(key,x,y) -def funcKeydHandler(key:int,x:int,y:int): + +def funcKeydHandler(key: int, x: int, y: int): if key == 11: glutFullScreenToggle() - #print(key) + # print(key) -if __name__ == '__main__': main() \ No newline at end of file + +if __name__ == '__main__': + rx = 0 + ry = 0 + main()