545 lines
18 KiB
Python
545 lines
18 KiB
Python
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
|
|
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'
|
|
|
|
struct = None
|
|
cstruct = None
|
|
program_id = 0
|
|
program2_id = 0
|
|
program3_id = 0
|
|
start = time.time()
|
|
frames = 0
|
|
width = 1920
|
|
height = 1080
|
|
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()
|
|
|
|
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)
|
|
|
|
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))
|
|
|
|
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()
|
|
|
|
cstruct = CompoundStructure()
|
|
cstruct.addStructure(struct)
|
|
|
|
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)
|
|
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:
|
|
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, 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)
|
|
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(rx, 0, 0, True) * projMatrix, dtype=np.float32))
|
|
glUniformMatrix3fv(rot, 1, GL_FALSE, np.array(rotate(rx, 0, 0), dtype=np.float32))
|
|
|
|
|
|
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'''
|
|
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
|
|
|
|
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]
|
|
|
|
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)
|
|
|
|
altPrId = {}
|
|
altPrId[program_id] = program3_id
|
|
render(program3_id, newMat, vai, 0, 0, 0, altPrId)
|
|
glFlush()
|
|
l.finishDepthMapping()
|
|
|
|
glClearColor(1, 0, 0, 0)
|
|
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(l.ModelviewProjectionMatrix))
|
|
glUniform1iv(numLights, 1, 1)
|
|
glUniform3fv(lightpos, 1, l.pos)
|
|
glUniform3fv(lightcolorid, 1, l.lightColor)
|
|
|
|
texID = glGetUniformLocation(program_id, 'ShadowMaps')
|
|
glActiveTexture(GL_TEXTURE0)
|
|
glBindTexture(GL_TEXTURE_2D, l.DepthBuffer)
|
|
glUniform1iv(texID, 1, 0)
|
|
|
|
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!")
|
|
|
|
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()
|
|
|
|
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):
|
|
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)
|
|
global width, height
|
|
width = w
|
|
height = h
|
|
|
|
def keyboardHandler(key: int, x: int, y: int):
|
|
if key == b'\x1b':
|
|
exit()
|
|
global rx
|
|
global cx
|
|
global cy
|
|
global opening
|
|
|
|
if key == b'+':
|
|
rx += 0.25
|
|
if key == b'-':
|
|
rx -= 0.25
|
|
|
|
if key == b'w':
|
|
cy += 0.25
|
|
if key == b's':
|
|
cy -= 0.25
|
|
|
|
if key == b'a':
|
|
cx -= 0.25
|
|
if key == b'd':
|
|
cx += 0.25
|
|
|
|
if key == b'q':
|
|
opening -= 0.25
|
|
if key == b'e':
|
|
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__':
|
|
rx = 0
|
|
ry = 0
|
|
main()
|