Created
November 21, 2019 10:58
-
-
Save furby-tm/90b2815cc76a5139b645c22d73ddb384 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import bgl | |
| import numpy as np | |
| import barnold.props as props | |
| import ctypes | |
| class GPU: | |
| def __init__(self, engine, scene, width, height, offset_x, offset_y, rect): | |
| self._width = width | |
| self._height = height | |
| self.buffer = bgl.Buffer(bgl.GL_SHORT, rect.shape, rect) | |
| self.data_size = self._width * self._height * 4 | |
| self.cscene = scene.arnold | |
| self._offset_x = offset_x | |
| self._offset_y = offset_y | |
| # pixels = bgl.Buffer(bgl.GL_SHORT, rect.shape, rect) | |
| # Generate texture | |
| self.texture = bgl.Buffer(bgl.GL_SHORT, 1) | |
| bgl.glGenTextures(1, self.texture) | |
| self.texture_id = self.texture[0] | |
| if self.cscene.transparency == True: | |
| self.user_set_format = bgl.GL_RGBA16F | |
| else: | |
| self.user_set_format = bgl.GL_RGB16F | |
| self.bucket_array = engine.AI.bucket_array | |
| self.bucket_index = engine.AI.bucket_counter | |
| self.data_pointer = 16 | |
| # self.render_buffer = bgl.Buffer(bgl.GL_INT, 2) | |
| # bgl.glGenBuffers(2, self.render_buffer) | |
| # bgl.glBindBuffer(bgl.GL_PIXEL_UNPACK_BUFFER, self.render_buffer[0]) | |
| # bgl.glBufferData(bgl.GL_PIXEL_UNPACK_BUFFER, self.data_size, 0, bgl.GL_STREAM_DRAW) | |
| # bgl.glBindBuffer(bgl.GL_PIXEL_UNPACK_BUFFER, self.render_buffer[1]) | |
| # bgl.glBufferData(bgl.GL_PIXEL_UNPACK_BUFFER, self.data_size, 0, bgl.GL_STREAM_DRAW) | |
| # bgl.glBindBuffer(bgl.GL_PIXEL_UNPACK_BUFFER, 0) | |
| self.index = 0 | |
| self.nextIndex = 1 | |
| self.vpointer = bgl.Buffer(bgl.GL_FLOAT, 16) | |
| # bgl.glActiveTexture(bgl.GL_TEXTURE0) | |
| # bgl.glBindTexture(bgl.GL_TEXTURE_2D, self.texture[0]) | |
| # bgl.glTexImage2D( | |
| # bgl.GL_TEXTURE_2D, | |
| # 0, | |
| # bgl.GL_RGBA16F, | |
| # width, | |
| # height, | |
| # 0, | |
| # bgl.GL_RGBA, | |
| # bgl.GL_UNSIGNED_SHORT, | |
| # pixels, | |
| # ) | |
| # bgl.glTexParameteri(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_MIN_FILTER, bgl.GL_LINEAR) | |
| # bgl.glTexParameteri(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_MAG_FILTER, bgl.GL_LINEAR) | |
| # bgl.glBindTexture(bgl.GL_TEXTURE_2D, 0) | |
| # Bind shader that converts from scene linear to display space, | |
| # use the scene's color management settings. | |
| self._init_opengl(engine, scene) | |
| self._init_texture() | |
| def _init_opengl(self, engine, scene): | |
| engine.bind_display_space_shader(scene) | |
| self.shader_program = bgl.Buffer(bgl.GL_INT, 1) | |
| bgl.glGetIntegerv(bgl.GL_CURRENT_PROGRAM, self.shader_program) | |
| # Generate vertex array | |
| self.vertex_array = bgl.Buffer(bgl.GL_INT, 1) | |
| bgl.glGenVertexArrays(1, self.vertex_array) | |
| bgl.glBindVertexArray(self.vertex_array[0]) | |
| self.texturecoord_location = bgl.glGetAttribLocation(self.shader_program[0], "texCoord") | |
| self.position_location = bgl.glGetAttribLocation(self.shader_program[0], "pos") | |
| bgl.glEnableVertexAttribArray(self.texturecoord_location) | |
| bgl.glEnableVertexAttribArray(self.position_location) | |
| x1, x2 = self._offset_x[0], self._offset_x[1] | |
| y1, y2 = self._offset_y[0], self._offset_y[1] | |
| position = [ | |
| x1, | |
| y2, # top left | |
| x2, | |
| y2, # top right | |
| x2, | |
| y1, # bottom right | |
| x1, | |
| y1, # bottom left | |
| ] | |
| texcoord = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0] # reversed | |
| position = bgl.Buffer(bgl.GL_FLOAT, len(position), position) | |
| texcoord = bgl.Buffer(bgl.GL_FLOAT, len(texcoord), texcoord) | |
| self.vertex_buffer = bgl.Buffer(bgl.GL_INT, 2) | |
| bgl.glGenBuffers(2, self.vertex_buffer) | |
| bgl.glBindBuffer(bgl.GL_ARRAY_BUFFER, self.vertex_buffer[0]) | |
| bgl.glBufferData(bgl.GL_ARRAY_BUFFER, 32, position, bgl.GL_STATIC_DRAW) | |
| bgl.glVertexAttribPointer( | |
| self.position_location, 2, bgl.GL_FLOAT, bgl.GL_FALSE, 0, None | |
| ) | |
| bgl.glBindBuffer(bgl.GL_ARRAY_BUFFER, self.vertex_buffer[1]) | |
| bgl.glBufferData(bgl.GL_ARRAY_BUFFER, 32, texcoord, bgl.GL_STATIC_DRAW) | |
| bgl.glVertexAttribPointer( | |
| self.texturecoord_location, 2, bgl.GL_FLOAT, bgl.GL_FALSE, 0, None | |
| ) | |
| bgl.glBindBuffer(bgl.GL_ARRAY_BUFFER, 0) | |
| bgl.glBindVertexArray(0) | |
| engine.unbind_display_space_shader() | |
| def __del__(self): | |
| bgl.glDeleteBuffers(2, self.vertex_buffer) | |
| bgl.glDeleteVertexArrays(1, self.vertex_array) | |
| bgl.glBindTexture(bgl.GL_TEXTURE_2D, 0) | |
| bgl.glDeleteTextures(1, self.texture) | |
| # bgl.glDeleteBuffers(2, self.render_buffer) | |
| def update(self): | |
| self.blit_buffer() | |
| def blit_buffer(self): | |
| """Blit a buffer into a texture. | |
| """ | |
| size = (self._width, self._height) | |
| target = bgl.GL_TEXTURE_2D | |
| # padding = ( 4 - (self._width * 4) % 4 ) % 4 | |
| # bufferSize = (self._width * 3 + padding) * self._height | |
| bgl.glBindTexture(target, self.texture_id) | |
| # if not self.vertex_buffer[self.index]: | |
| # if not self.vertex_buffer: | |
| # bgl.glGenBuffers(1, self.vertex_buffer) | |
| bgl.glBindBuffer(bgl.GL_ARRAY_BUFFER, self.vertex_buffer[0]) | |
| #invalidate old contents - avoids stalling if buffer is still waiting in queue to be rendered | |
| bgl.glBufferData(bgl.GL_ARRAY_BUFFER, 64, 0, bgl.GL_STREAM_DRAW) | |
| # bgl.glMapBuffer(bgl.GL_ARRAY_BUFFER, bgl.GL_WRITE_ONLY) | |
| # bgl.glMapBuffer(bgl.GL_ARRAY_BUFFER, bgl.GL_WRITE_ONLY) | |
| # vpointer_p_float = ctypes.cast(vpointer_p, ctypes.POINTER(ctypes.c_float)) | |
| # vpointer = np.array(np.zeros(shape=((16, 1)))) | |
| x = self.bucket_array[self.bucket_index][0][0] | |
| y = self.bucket_array[self.bucket_index][0][1] | |
| bucket_width = self.bucket_array[self.bucket_index][0][2] | |
| bucket_height = self.bucket_array[self.bucket_index][0][3] | |
| self.vpointer[0] = 0.0 | |
| self.vpointer[1] = 0.0 | |
| self.vpointer[2] = x | |
| self.vpointer[3] = y | |
| self.vpointer[4] = 1.0 | |
| self.vpointer[5] = 0.0 | |
| self.vpointer[6] = self._width + x | |
| self.vpointer[7] = y | |
| self.vpointer[8] = 1.0 | |
| self.vpointer[9] = 1.0 | |
| self.vpointer[10] = self._width + x | |
| self.vpointer[11] = self._height + y | |
| self.vpointer[12] = 0.0 | |
| self.vpointer[13] = 1.0 | |
| self.vpointer[14] = x | |
| self.vpointer[15] = self._height + y | |
| bgl.glGetBufferSubData(bgl.GL_ARRAY_BUFFER, 0, 64, self.vpointer) | |
| # buff = bgl.Buffer(bgl.GL_FLOAT, len(self.vpointer), self.vpointer) | |
| bgl.glBufferData(bgl.GL_ARRAY_BUFFER, 64, self.vpointer, bgl.GL_STREAM_DRAW) | |
| # bgl.glUnmapBuffer(bgl.GL_ARRAY_BUFFER) | |
| # bgl.glBindVertexArray(self.vertex_array[0]) | |
| # texcoord_attribute = bgl.glGetAttribLocation(self.shader_program[0], "texCoord") | |
| # position_attribute = bgl.glGetAttribLocation(self.shader_program[0], "pos") | |
| # bgl.glEnableVertexAttribArray(self.texturecoord_location) | |
| # bgl.glEnableVertexAttribArray(self.position_location) | |
| # bgl.glVertexAttribPointer( | |
| # texcoord_attribute, 2, bgl.GL_FLOAT, bgl.GL_FALSE, 16, 0 | |
| # ) | |
| # bgl.glVertexAttribPointer( | |
| # position_attribute, 2, bgl.GL_FLOAT, bgl.GL_FALSE, 16, 8 | |
| # ) | |
| # if self.vertex_buffer[self.index]: | |
| # bgl.glUnmapBuffer(bgl.GL_ARRAY_BUFFER) | |
| # transfer the new part of texture | |
| # bgl.glTexSubImage2D( | |
| # target, | |
| # 0, | |
| # self._offset_x[0], | |
| # self._offset_y[0], | |
| # size[0], | |
| # size[1], | |
| # bgl.GL_RGBA, | |
| # bgl.GL_UNSIGNED_SHORT, | |
| # buff, | |
| # ) | |
| self.index += 1 | |
| # bgl.glBindBuffer(bgl.GL_PIXEL_UNPACK_BUFFER, self.render_buffer[self.nextIndex]) | |
| self.nextIndex += 1 | |
| self.index = self.index % 2 | |
| self.nextIndex = self.index % 2 | |
| # bgl.glBufferData(bgl.GL_PIXEL_UNPACK_BUFFER, self.data_size, 0, bgl.GL_STREAM_DRAW) | |
| # ptr = bgl.glMapBuffer(bgl.GL_PIXEL_UNPACK_BUFFER, bgl.GL_WRITE_ONLY) | |
| # if ptr: | |
| # bgl.glUnmapBuffer(bgl.GL_PIXEL_PACK_BUFFER) | |
| err = bgl.glGetError() | |
| if err != bgl.GL_NO_ERROR: | |
| print("!!!!!!!!!!!!!!!GL Error:", err) | |
| bgl.glFlush() | |
| def _init_texture(self): | |
| bgl.glActiveTexture(bgl.GL_TEXTURE0) | |
| bgl.glBindTexture(bgl.GL_TEXTURE_2D, self.texture_id) | |
| self.data_pointer += 4 * 0 * self.bucket_array[self.bucket_index][0][2] | |
| print(self.data_pointer) | |
| bgl.glTexImage2D( | |
| bgl.GL_TEXTURE_2D, | |
| 0, | |
| self.user_set_format, | |
| self._width, | |
| self._height, | |
| 0, | |
| bgl.GL_RGBA, | |
| bgl.GL_UNSIGNED_SHORT, | |
| 0, | |
| ) | |
| # bgl.glTexParameteri(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_WRAP_S, bgl.GL_CLAMP_TO_EDGE) | |
| # bgl.glTexParameteri(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_WRAP_T, bgl.GL_CLAMP_TO_EDGE) | |
| bgl.glTexParameteri(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_MIN_FILTER, bgl.GL_NEAREST) | |
| bgl.glTexParameteri(bgl.GL_TEXTURE_2D, bgl.GL_TEXTURE_MAG_FILTER, bgl.GL_NEAREST) | |
| # bgl.glBindTexture(bgl.GL_TEXTURE_2D, 0) | |
| def draw(self, engine, scene): | |
| # if self._transparent: | |
| bgl.glEnable(bgl.GL_BLEND) | |
| bgl.glBlendFunc(bgl.GL_ONE, bgl.GL_ONE_MINUS_SRC_ALPHA) | |
| engine.bind_display_space_shader(scene) | |
| bgl.glActiveTexture(bgl.GL_TEXTURE0) | |
| bgl.glBindTexture(bgl.GL_TEXTURE_2D, self.texture_id) | |
| bgl.glBindVertexArray(self.vertex_array[0]) | |
| bgl.glDrawArrays(bgl.GL_TRIANGLE_FAN, 0, 4) | |
| bgl.glBindBuffer(bgl.GL_ARRAY_BUFFER, 0) | |
| bgl.glBindVertexArray(0) | |
| # bgl.glBindTexture(bgl.GL_TEXTURE_2D, 0) | |
| engine.unbind_display_space_shader() | |
| err = bgl.glGetError() | |
| if err != bgl.GL_NO_ERROR: | |
| print("GL Error:", err) | |
| # if self._transparent: | |
| bgl.glDisable(bgl.GL_BLEND) | |
| # bgl.glBindBuffer(bgl.GL_ARRAY_BUFFER, self.vertex_buffer[0]) | |
| # bgl.glVertexAttribPointer( | |
| # self.position_location, 2, bgl.GL_FLOAT, bgl.GL_FALSE, 0, None | |
| # ) | |
| # bgl.glBindBuffer(bgl.GL_ARRAY_BUFFER, self.vertex_buffer[1]) | |
| # bgl.glVertexAttribPointer( | |
| # self.texturecoord_location, 2, bgl.GL_FLOAT, bgl.GL_FALSE, 0, None | |
| # ) | |
| # bgl.glBindBuffer(bgl.GL_ARRAY_BUFFER, 0) | |
| # bgl.glDrawArrays(bgl.GL_TRIANGLE_FAN, 0, 4) | |
| # bgl.glBindVertexArray(0) | |
| # bgl.glBindTexture(bgl.GL_TEXTURE_2D, 0) | |
| @staticmethod | |
| def restore_opengl_defaults(): | |
| bgl.glLineWidth(1) | |
| bgl.glDisable(bgl.GL_BLEND) | |
| @staticmethod | |
| def _draw_texture(texture_id, x, y, width, height): | |
| # INITIALIZATION | |
| # Getting shader program | |
| shader_program = bgl.Buffer(bgl.GL_INT, 1) | |
| bgl.glGetIntegerv(bgl.GL_CURRENT_PROGRAM, shader_program) | |
| # Generate vertex array | |
| vertex_array = bgl.Buffer(bgl.GL_INT, 1) | |
| bgl.glGenVertexArrays(1, vertex_array) | |
| texturecoord_location = bgl.glGetAttribLocation(shader_program[0], "texCoord") | |
| position_location = bgl.glGetAttribLocation(shader_program[0], "pos") | |
| # Generate geometry buffers for drawing textured quad | |
| position = [x, y, x + width, y, x + width, y + height, x, y + height] | |
| position = bgl.Buffer(bgl.GL_FLOAT, len(position), position) | |
| texcoord = [0.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 1.0] | |
| texcoord = bgl.Buffer(bgl.GL_FLOAT, len(texcoord), texcoord) | |
| vertex_buffer = bgl.Buffer(bgl.GL_INT, 2) | |
| bgl.glGenBuffers(2, vertex_buffer) | |
| bgl.glBindBuffer(bgl.GL_ARRAY_BUFFER, vertex_buffer[0]) | |
| bgl.glBufferData(bgl.GL_ARRAY_BUFFER, 32, position, bgl.GL_STATIC_DRAW) | |
| bgl.glBindBuffer(bgl.GL_ARRAY_BUFFER, vertex_buffer[1]) | |
| bgl.glBufferData(bgl.GL_ARRAY_BUFFER, 32, texcoord, bgl.GL_STATIC_DRAW) | |
| bgl.glBindBuffer(bgl.GL_ARRAY_BUFFER, 0) | |
| # DRAWING | |
| bgl.glActiveTexture(bgl.GL_TEXTURE0) | |
| bgl.glBindTexture(bgl.GL_TEXTURE_2D, texture_id) | |
| bgl.glBindVertexArray(vertex_array[0]) | |
| bgl.glEnableVertexAttribArray(texturecoord_location) | |
| bgl.glEnableVertexAttribArray(position_location) | |
| bgl.glBindBuffer(bgl.GL_ARRAY_BUFFER, vertex_buffer[0]) | |
| bgl.glVertexAttribPointer( | |
| position_location, 2, bgl.GL_FLOAT, bgl.GL_FALSE, 0, None | |
| ) | |
| bgl.glBindBuffer(bgl.GL_ARRAY_BUFFER, vertex_buffer[1]) | |
| bgl.glVertexAttribPointer( | |
| texturecoord_location, 2, bgl.GL_FLOAT, bgl.GL_FALSE, 0, None | |
| ) | |
| bgl.glBindBuffer(bgl.GL_ARRAY_BUFFER, 0) | |
| bgl.glDrawArrays(bgl.GL_TRIANGLE_FAN, 0, 4) | |
| bgl.glBindVertexArray(0) | |
| bgl.glBindTexture(bgl.GL_TEXTURE_2D, 0) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment