from wsgiref.validate import check_errors from OpenGL.GL.ARB.vertex_array_object import glDeleteVertexArrays from OpenGL.GL.framebufferobjects import glBindFramebuffer from OpenGL.GLUT import * import OpenGL.GLUT.freeglut from OpenGL.GLU import * from OpenGL.GL import * from ctypes import sizeof, c_float, c_void_p, c_uint import sys import math as math from Objects.Cube.Cube import * from Objects.Cuboid.Cuboid import * from Objects.Structure import * from MatrixStuff.Transformations import * from Lights.Lights import * from Lights.LightingManager import * import numpy as np import time name = b'ball_glut' program_id = 0 program2_id = 0 program3_id = 0 start = time.time() frames = 0 width = 1024 height = 768 opening = 45 l = Light() def main(): lm = LightingManager() 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) glutCreateWindow(name) #glutEnterGameMode() print("Vendor:", glGetString(GL_VENDOR)) print("Renderer:", glGetString(GL_RENDERER)) print("Version:", glGetString(GL_VERSION)) print("GLSL:", glGetString(GL_SHADING_LANGUAGE_VERSION)) c = Cube() cuboid = Cuboid() 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) '''lightZeroPosition = [10.,4.,10.,1.] lightZeroColor = [0.8,1.0,0.8,1.0] #green tinged glLightfv(GL_LIGHT0, GL_POSITION, lightZeroPosition) glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor) glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1) glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05) glEnable(GL_LIGHT0)''' glutDisplayFunc(display) glutReshapeFunc(resize) glutKeyboardFunc(keyboardHandler) glutSpecialFunc(funcKeydHandler) '''glMatrixMode(GL_PROJECTION) gluPerspective(40.,1.,1.,40.) glMatrixMode(GL_MODELVIEW)''' #gluLookAt(0,0,10, # 0,0,0, # 0,1,0) #glPushMatrix() glViewport(0, 0, w,h) glFrustum(-10,10,-10,10,0.01,100) with open('passthroughvertex.glsl', 'r') as f: vertex_shader_string = f.read() passthrough_vertex_shader_id = glCreateShader(GL_VERTEX_SHADER) glShaderSource(passthrough_vertex_shader_id, vertex_shader_string) glCompileShader(passthrough_vertex_shader_id) if glGetShaderiv(passthrough_vertex_shader_id, GL_COMPILE_STATUS) != GL_TRUE: raise RuntimeError(glGetShaderInfoLog(passthrough_vertex_shader_id)) with open('vertex.glsl', 'r') as f: vertex_shader_string = f.read() vertex_shader_id = glCreateShader(GL_VERTEX_SHADER) glShaderSource(vertex_shader_id, vertex_shader_string) glCompileShader(vertex_shader_id) if glGetShaderiv(vertex_shader_id, GL_COMPILE_STATUS) != GL_TRUE: raise RuntimeError(glGetShaderInfoLog(vertex_shader_id)) with open('texturefragment.glsl', 'r') as f: fragment_shader_string = f.read() texturefragment_shader_id = glCreateShader(GL_FRAGMENT_SHADER) glShaderSource(texturefragment_shader_id, fragment_shader_string) glCompileShader(texturefragment_shader_id) if glGetShaderiv(texturefragment_shader_id, GL_COMPILE_STATUS) != GL_TRUE: raise RuntimeError(glGetShaderInfoLog(texturefragment_shader_id)) with open('fragment.glsl', 'r') as f: fragment_shader_string = f.read() fragment_shader_id = glCreateShader(GL_FRAGMENT_SHADER) glShaderSource(fragment_shader_id, fragment_shader_string) glCompileShader(fragment_shader_id) if glGetShaderiv(fragment_shader_id, GL_COMPILE_STATUS) != GL_TRUE: raise RuntimeError(glGetShaderInfoLog(fragment_shader_id)) 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, fragment_shader_id) #glAttachShader(program_id, l.FragmentShaderId) glLinkProgram(program_id) struct = Structure() struct.addShape(program_id,c) struct.buildvertexArrays() struct.clearVertexArrays() program3_id = l.getDepthProgram(vertex_shader_id,Cube.GeometryShaderId) program2_id = glCreateProgram() glAttachShader(program2_id, passthrough_vertex_shader_id) glAttachShader(program2_id, texturefragment_shader_id) glLinkProgram(program2_id) if glGetProgramiv(program_id, GL_LINK_STATUS) != GL_TRUE: raise RuntimeError(glGetProgramInfoLog(program_id)) global vai, pbi,cbi,vai2,vai3 vai, pbi, cbi = create_vertex_buffers(np.array([0, 0, 1, 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), np.array([1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 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)) v = [] color = [] for i in range(-11,12): for j in range(-11,12): v.append(i) v.append(j) v.append(0) color.append(1) 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( [0.5, 1.5, 1.5, 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) vai3, _, _ = create_vertex_buffers(np.array([-1, -1, 0, 1, -1, 0, -1, 1, 0, -1, 1, 0, 1, -1, 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) 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): print("Error: " + message) 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([])): glEnableClientState(GL_VERTEX_ARRAY) glEnableClientState(GL_TEXTURE_COORD_ARRAY) glEnableClientState(GL_NORMAL_ARRAY) glEnableClientState(GL_COLOR_ARRAY) #global vai, pbi, cbi tvai = GLuint(0) tpbi = GLuint(0) tcbi = GLuint(0) #test = glGetString(GL_VERSION) glGenVertexArrays(1,tvai) glBindVertexArray(tvai) 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) check_error("Could not create position buffer") tcbi = glGenBuffers(1) glBindBuffer(GL_ARRAY_BUFFER,tcbi) glBufferData(GL_ARRAY_BUFFER, colors,GL_STATIC_DRAW) vc = glGetAttribLocation(program_id, "MyInColor") if vc != -1: glEnableVertexAttribArray(vc) glVertexAttribPointer(vc, 3, GL_FLOAT, GL_FALSE, 0, None) check_error("Could not create color buffer") if len(sizes) > 0: sbi = glGenBuffers(1) 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) 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]) def clear_vertex_array(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 rx = 0 ry = 0 def render(program_id,projMatrix,vai,x,y,z): ident = np.transpose(np.matrix([[1, 0, 0], [0, 1, 0], [0, 0, 1]], np.float32)) glUseProgram(program_id) check_error("Renderingprogram is not initialized!") projection = glGetUniformLocation(program_id, 'projModelViewMatrix') normal = glGetUniformLocation(program_id, 'normalMatrix') rot = glGetUniformLocation(program_id, 'rotMatrix') glUniformMatrix4fv(projection, 1, GL_FALSE, np.array(translate(x, y, z) * rotate(0,ry,0,True) * projMatrix)) glUniformMatrix3fv(normal, 1, GL_FALSE, np.array(ident)) glUniformMatrix3fv(rot, 1, GL_FALSE, np.array(rotate(rx, 0, 0))) glBindVertexArray(vai) glDrawArrays(GL_POINTS, 0, 9)#529 check_error("Rendering problem") glBindVertexArray(0) glUseProgram(0) def display(): '''if time.time() - start >= 1: print(frames+1) global start, frames frames = 0 start = time.time() else: global frames frames += 1''' 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 = 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') 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() resize(width, height) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glUseProgram(program_id) widthid = glGetUniformLocation(program_id, 'width') heightid = glGetUniformLocation(program_id, 'height') nearid = glGetUniformLocation(program_id, 'near') farid = glGetUniformLocation(program_id, 'far') glUniform1f(nearid, 0.01) glUniform1f(farid, 100) 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') glUniformMatrix4fv(lightProjModelViewMatrix,1,GL_FALSE,np.array(newMat)) glUniform1iv(numLights, 1, 1) glUniform3fv(lightpos, 1, [-cx,-cy,-5]) glUniform3fv(lightcolorid, 1, [4,1,1]) texID = glGetUniformLocation(program_id, 'ShadowMaps') glActiveTexture(GL_TEXTURE0) glBindTexture(GL_TEXTURE_2D, l.DepthBuffer) glUniform1i(texID, 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 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(vai2) glDrawArrays(GL_TRIANGLES, 0, 6) check_error("Rendering problem") glBindVertexArray(0) glUseProgram(0) glFlush() glFlush() glutSwapBuffers() global rx #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!") 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) global projMatrix 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): if key == b'\x1b': exit() 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) glutPostRedisplay() #print(key,x,y) def funcKeydHandler(key:int,x:int,y:int): if key == 11: glutFullScreenToggle() #print(key) if __name__ == '__main__': main()