Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- import sys
- import time
- sys.path.append("./shared")
- from sbmloader import SBMObject # location of sbm file format loader
- from ktxloader import KTXObject # location of ktx file format loader
- from sbmath import m3dDegToRad, m3dRadToDeg, m3dTranslateMatrix44, m3dRotationMatrix44, m3dMultiply, m3dOrtho, m3dPerspective, rotation_matrix, translate, m3dScaleMatrix44
- fullscreen = True
- import numpy.matlib
- import numpy as np
- try:
- from OpenGL.GLUT import *
- from OpenGL.GL import *
- from OpenGL.GLU import *
- from OpenGL.raw.GL.ARB.vertex_array_object import glGenVertexArrays, glBindVertexArray
- except:
- print ('''
- ERROR: PyOpenGL not installed properly.
- ''')
- sys.exit()
- identityMatrix = [1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]
- clear_program = GLuint(0)
- append_program = GLuint(0)
- resolve_program = GLuint(0)
- class textures:
- color = GLuint(0)
- normals = GLuint(0)
- class uniforms_block:
- mv_matrix = (GLfloat * 16)(*identityMatrix)
- view_matrix = (GLfloat * 16)(*identityMatrix)
- proj_matrix = (GLfloat * 16)(*identityMatrix)
- uniforms_buffer = GLuint(0)
- class uniforms:
- mvp = GLuint(0)
- fragment_buffer = GLuint(0)
- head_pointer_image = GLuint(0)
- atomic_counter_buffer = GLuint(0)
- dummy_vao = GLuint(0)
- uniform = uniforms()
- myobject = SBMObject()
- def link_from_shaders(shaders, shader_count, delete_shaders, check_errors=False):
- program = GLuint(0)
- program = glCreateProgram()
- for i in range(0, shader_count):
- glAttachShader(program, shaders[i]);
- glLinkProgram(program);
- if (delete_shaders):
- for i in range(0, shader_count):
- glDeleteShader(shaders[i]);
- return program
- def shader_load(filename, shader_type):
- result = GLuint(0)
- with open ( filename, "rb") as data:
- result = glCreateShader(shader_type)
- glShaderSource(result, data.read() )
- glCompileShader(result)
- return result
- def load_shaders():
- global clear_program
- global append_program
- global resolve_program
- global uniform
- shaders = [GLuint(0), GLuint(0)]
- shaders[0] = shader_load("fragmentlist_shaders/clear.vs.glsl", GL_VERTEX_SHADER);
- shaders[1] = shader_load("fragmentlist_shaders/clear.fs.glsl", GL_FRAGMENT_SHADER);
- if (clear_program):
- glDeleteProgram(clear_program);
- clear_program = link_from_shaders(shaders, 2, True);
- shaders[0] = shader_load("fragmentlist_shaders/append.vs.glsl", GL_VERTEX_SHADER);
- shaders[1] = shader_load("fragmentlist_shaders/append.fs.glsl", GL_FRAGMENT_SHADER);
- if (append_program):
- glDeleteProgram(append_program);
- append_program = link_from_shaders(shaders, 2, True);
- uniform.mvp = glGetUniformLocation(append_program, "mvp");
- shaders[0] = shader_load("fragmentlist_shaders/resolve.vs.glsl", GL_VERTEX_SHADER);
- shaders[1] = shader_load("fragmentlist_shaders/resolve.fs.glsl", GL_FRAGMENT_SHADER);
- if (resolve_program):
- glDeleteProgram(resolve_program)
- resolve_program = link_from_shaders(shaders, 2, True);
- class Scene:
- def __init__(self, width, height):
- global uniforms_buffer
- global fragment_buffer
- global atomic_counter_buffer
- global head_pointer_image
- global dummy_vao
- global myobject
- self.width = width
- self.height = height
- load_shaders()
- glGenBuffers(1, uniforms_buffer)
- glBindBuffer(GL_UNIFORM_BUFFER, uniforms_buffer)
- glBufferData(GL_UNIFORM_BUFFER, sys.getsizeof(uniforms_block), None, GL_DYNAMIC_DRAW)
- myobject.load("dragon.sbm")
- glGenBuffers(1, fragment_buffer)
- glBindBuffer(GL_SHADER_STORAGE_BUFFER, fragment_buffer);
- glBufferData(GL_SHADER_STORAGE_BUFFER, 1024 * 1024 * 16, None, GL_DYNAMIC_COPY)
- glGenBuffers(1, atomic_counter_buffer);
- glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, atomic_counter_buffer);
- glBufferData(GL_ATOMIC_COUNTER_BUFFER, 4, None, GL_DYNAMIC_COPY);
- head_pointer_image = glGenTextures(1)
- glBindTexture(GL_TEXTURE_2D, head_pointer_image);
- glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32UI, 1024, 1024);
- glGenVertexArrays(1, dummy_vao);
- glBindVertexArray(dummy_vao);
- def display(self):
- green = [ 0.0, 0.1, 0.0, 0.0 ]
- currentTime = time.time()
- f = currentTime
- zeros = [ 0.0, 0.0, 0.0, 0.0 ]
- gray = [ 0.1, 0.1, 0.1, 0.0 ]
- ones = [ 1.0 ]
- glViewport(0, 0, self.width , self.height);
- glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT | GL_ATOMIC_COUNTER_BARRIER_BIT | GL_SHADER_STORAGE_BARRIER_BIT);
- glUseProgram(clear_program);
- glBindVertexArray(dummy_vao);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
- glUseProgram(append_program)
- model_matrix = (GLfloat * 16)(*identityMatrix)
- # vmath::mat4 model_matrix = vmath::scale(7.0f);
- #view_position = (GLfloat * 3)(0.0,0.0,0.0)
- # vmath::vec3 view_position = vmath::vec3(cosf(f * 0.35f) * 120.0f, cosf(f * 0.4f) * 30.0f, sinf(f * 0.35f) * 120.0f);
- view_matrix = (GLfloat * 16)(*identityMatrix)
- # vmath::mat4 view_matrix = vmath::lookat(view_position,
- # vmath::vec3(0.0f, 30.0f, 0.0f),
- # vmath::vec3(0.0f, 1.0f, 0.0f));
- # temp used translate, rotation just to display something - delete ######
- T = (GLfloat * 16)(*identityMatrix) #
- RX = (GLfloat * 16)(*identityMatrix) #
- RY = (GLfloat * 16)(*identityMatrix) #
- R = (GLfloat * 16)(*identityMatrix) #
- m3dTranslateMatrix44(T, 0, 0, -4) #
- m3dRotationMatrix44(RX, currentTime * m3dDegToRad(17.0), 1.0, 0.0, 0.0) #
- m3dRotationMatrix44(RY, currentTime * m3dDegToRad(13.0), 0.0, 1.0, 0.0) #
- R = m3dMultiply(RY, RX) #
- model_matrix = m3dMultiply(T, R) #
- # ////////////////////////////// temp code #
- mv_matrix = (GLfloat * 16)(*identityMatrix)
- mv_matrix = m3dMultiply(view_matrix , model_matrix)
- proj_matrix = (GLfloat * 16)(*identityMatrix)
- proj_matrix = m3dPerspective(m3dDegToRad(50.0), float(self.width) / float(self.height), 0.1, 1000.0)
- glUniformMatrix4fv(uniform.mvp, 1, GL_FALSE, m3dMultiply(proj_matrix , mv_matrix))
- zero = 0;
- glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 0, atomic_counter_buffer)
- # next line not working ????
- #glBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 0, sys.getsizeof(zero), zero);
- glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, fragment_buffer)
- glBindImageTexture(0, head_pointer_image, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32UI)
- glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT | GL_ATOMIC_COUNTER_BARRIER_BIT | GL_SHADER_STORAGE_BARRIER_BIT)
- myobject.render()
- glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT | GL_ATOMIC_COUNTER_BARRIER_BIT | GL_SHADER_STORAGE_BARRIER_BIT)
- glUseProgram(resolve_program)
- glBindVertexArray(dummy_vao)
- glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT | GL_ATOMIC_COUNTER_BARRIER_BIT | GL_SHADER_STORAGE_BARRIER_BIT)
- glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
- glutSwapBuffers()
- def reshape(self, width, height):
- self.width = width
- self.height = height
- def keyboard(self, key, x, y ):
- global fullscreen
- print ('key:' , key)
- if key == b'x1b': # ESC
- sys.exit()
- elif key == b'f' or key == b'F': #fullscreen toggle
- if (fullscreen == True):
- glutReshapeWindow(512, 512)
- glutPositionWindow(int((1360/2)-(512/2)), int((768/2)-(512/2)))
- fullscreen = False
- else:
- glutFullScreen()
- fullscreen = True
- print('done')
- def init(self):
- pass
- def timer(self, blah):
- glutPostRedisplay()
- glutTimerFunc( int(1/60), self.timer, 0)
- time.sleep(1/60.0)
- if __name__ == '__main__':
- start = time.time()
- glutInit()
- glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH)
- glutInitWindowSize(512, 512)
- w1 = glutCreateWindow('OpenGL SuperBible - Fragment List')
- glutInitWindowPosition(int((1360/2)-(512/2)), int((768/2)-(512/2)))
- fullscreen = False
- many_cubes = False
- #glutFullScreen()
- scene = Scene(512,512)
- glutReshapeFunc(scene.reshape)
- glutDisplayFunc(scene.display)
- glutKeyboardFunc(scene.keyboard)
- glutIdleFunc(scene.display)
- #glutTimerFunc( int(1/60), scene.timer, 0)
- scene.init()
- glutMainLoop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement