VoxelEngine/main.py
2017-08-27 12:51:26 +02:00

492 lines
16 KiB
Python

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()