Guest User

Untitled

a guest
Mar 17th, 2026
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.32 KB | None | 0 0
  1. class Window:
  2. def _rendering_loop(self):
  3. glClearDepth(self.depth_buffer_clear_value)
  4. glDepthFunc(self.clear_func_value)
  5. if self.last_clear_color != self.clear_color:
  6. glClearColor(*self.clear_color)
  7. self.last_clear_color = self.clear_color
  8. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
  9. for camera in self._other_linked_cameras:
  10. camera._render()
  11. glMemoryBarrier(GL_TEXTURE_FETCH_BARRIER_BIT | GL_FRAMEBUFFER_BARRIER_BIT)
  12. self.main_camera._render(False)
  13. swap_buffers(self.id)
  14.  
  15. class Camera:
  16. def _render(self,render_to_output:bool=True):
  17. self.output._activate_output(render_to_output)
  18. self._update_frustum_planes()
  19. static_models_in_view=self._get_all_static_models_in_view()
  20. active_lights_in_view=self._get_all_active_lights_in_view()
  21. self.uniform_helper.uniforms_available["numLights"]=LightHandler._update_gpu_data(active_lights_in_view)
  22. self.renderer.start_drawing(self,self._rendering_shader,static_models_in_view)
  23. for shader in self._postprocessing_shader_list:
  24. self.renderer.start_drawing(self,shader,static_models_in_view)
  25.  
  26. class Output:
  27. # Afterwards,write the code to connect those to the framebuffer.
  28. # Make sure that the window rendering loop plays nicely with these buffers, and make it identify what the framebuffer has , so as to clear it (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | stencil)
  29. def __init__(self,starting_settings:OutputStartupSettings):
  30. self.resolution_x=starting_settings.resolution_x
  31. self.resolution_y=starting_settings.resolution_y
  32.  
  33. self.frame_buffer_object = glGenFramebuffers(1)
  34. glBindFramebuffer(GL_FRAMEBUFFER, self.frame_buffer_object)
  35. self.texture, self._texture_id = TextureHandler.get_textures(
  36. self.frame_buffer_object,
  37. minification_filter=self.resolution_x, # Width
  38. magnification_filter=self.resolution_y, # Height
  39. wrapping_x_axis=GL_LINEAR, # Force min_filter to LINEAR
  40. wrapping_y_axis=GL_LINEAR, # Force mag_filter to LINEAR
  41. generate_mipmap=False, # Crucial: No mipmaps for RTT
  42. return_id_with_slot=True
  43. )
  44. glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, self._texture_id, 0)
  45.  
  46. self.render_buffer_object=glGenRenderbuffers(1)
  47. self.handle=TextureHandler.id_handle_dict[self._texture_id]
  48. if starting_settings.add_stencil_buffer and starting_settings.add_depth_buffer:
  49. self.buffer_clear_tags=GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT
  50. glBindRenderbuffer(GL_RENDERBUFFER, self.render_buffer_object)
  51. glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, self.resolution_x, self.resolution_y)
  52. glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER,self.render_buffer_object)
  53. glBindRenderbuffer(GL_RENDERBUFFER, 0)
  54. elif starting_settings.add_depth_buffer:
  55. self.buffer_clear_tags = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
  56. glBindRenderbuffer(GL_RENDERBUFFER, self.render_buffer_object)
  57. glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24 , self.resolution_x, self.resolution_y)
  58. glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,self.render_buffer_object)
  59. glBindRenderbuffer(GL_RENDERBUFFER, 0)
  60. elif starting_settings.add_stencil_buffer:
  61. self.buffer_clear_tags = GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT
  62. glBindRenderbuffer(GL_RENDERBUFFER, self.render_buffer_object)
  63. glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, self.resolution_x, self.resolution_y)
  64. glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER,self.render_buffer_object)
  65. glBindRenderbuffer(GL_RENDERBUFFER, 0)
  66. else:
  67. glDeleteRenderbuffers(1, [self.render_buffer_object])
  68. self.render_buffer_object = None
  69. self.buffer_clear_tags = GL_COLOR_BUFFER_BIT
  70. glBindFramebuffer(GL_FRAMEBUFFER,0)
  71. def _calculate_perspective_matrix(self,fov_y,resolution_x,resolution_y,near_plane,far_plane,fov_x):
  72. resolution_aspect=resolution_x/resolution_y
  73. if near_plane<far_plane:
  74. perspective_matrix = glm.perspective(glm.radians(fov_y), resolution_aspect, near_plane, far_plane)
  75. else:
  76. perspective_matrix = glm.perspectiveLH_ZO(glm.radians(fov_y), resolution_aspect, near_plane, far_plane)
  77. if fov_x != RECOMPUTE and fov_x is not None:
  78. sx = 1.0 / glm.tan(glm.radians(fov_x) / 2.0)
  79. perspective_matrix[0][0] = sx
  80. return perspective_matrix
  81. #TODO
  82. # Finish framebuffer setup and everything
  83. # Finish reverse z buffer cameras
  84. #
  85. # glDeleteFramebuffers(1,self.frame_buffer_object)
  86. def _activate_output(self,render_to_output:bool):
  87. if render_to_output:
  88. glViewport(0, 0, self.resolution_x,self.resolution_y)
  89. glBindFramebuffer(GL_FRAMEBUFFER, self.frame_buffer_object)
  90. else:
  91. glViewport(0, 0, self.resolution_x, self.resolution_y)
  92. glBindFramebuffer(GL_FRAMEBUFFER, 0)
  93.  
  94. class TextureHandler:
  95. def get_textures(image_names: str | list |np.uintc , minification_filter=GL_NEAREST_MIPMAP_NEAREST,
  96. magnification_filter=GL_NEAREST, wrapping_x_axis=GL_CLAMP_TO_EDGE,
  97. wrapping_y_axis=GL_CLAMP_TO_EDGE, file_path: str = USE_OWN,generate_mipmap:bool=True,return_id_with_slot:bool=False):
  98. if file_path == USE_OWN:
  99. file_path = TextureHandler.default_file_path
  100. if isinstance(image_names, str) or isinstance(image_names,np.uintc):
  101. if image_names in TextureHandler.name_id_dict:
  102. if not return_id_with_slot:
  103. return TextureHandler.name_slot_dict[image_names]
  104. else:
  105. return TextureHandler.name_slot_dict[image_names],TextureHandler.name_id_dict[image_names]
  106. else:
  107.  
  108. slot,tex_id = TextureHandler._generate_texture(image_names, minification_filter, magnification_filter,
  109. wrapping_x_axis, wrapping_y_axis, file_path,generate_mipmap,return_id_with_slot)
  110. TextureHandler._update_texture_shader_storage_buffer()
  111. if not return_id_with_slot:
  112. return slot
  113. else:
  114. return slot,tex_id
  115. else:
  116. made_textures = False
  117. slots = []
  118. tex_ids=[]
  119. for name in image_names:
  120. if name in TextureHandler.name_id_dict:
  121. slots.append(TextureHandler.id_handle_dict[TextureHandler.name_id_dict[name]])
  122. if return_id_with_slot:
  123. tex_ids.append(TextureHandler.name_id_dict[name])
  124.  
  125. else:
  126. made_textures = True
  127. slot,tex_id=TextureHandler._generate_texture(name, minification_filter, magnification_filter,
  128. wrapping_x_axis, wrapping_y_axis, file_path,generate_mipmap,return_id_with_slot)
  129. slots.append(slot)
  130. if return_id_with_slot:
  131. tex_ids.append(tex_id)
  132.  
  133. if made_textures:
  134. TextureHandler._update_texture_shader_storage_buffer()
  135. if return_id_with_slot:
  136. return slots,tex_ids
  137. else:
  138. return slots
  139. @staticmethod
  140. def _update_texture_shader_storage_buffer():
  141. glBindBuffer(GL_SHADER_STORAGE_BUFFER, TextureHandler.texture_shader_storage_buffer)
  142. # Convert 64-bit handles to two 32-bit uints each
  143. data = np.array(TextureHandler.texture_handles, dtype=np.uint64)
  144. glBufferData(GL_SHADER_STORAGE_BUFFER, data.nbytes, data, GL_DYNAMIC_DRAW)
  145. @staticmethod
  146. def _generate_texture(image_name: str|int, min_filter, mag_filter, wrapping_x_axis, wrapping_y_axis, file_path: str,generate_mipmap:bool,return_id_with_slot:bool=False):
  147. tex_id = glGenTextures(1)
  148. glBindTexture(GL_TEXTURE_2D, tex_id)
  149.  
  150.  
  151. if type(image_name)==str:
  152. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter)
  153. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter)
  154. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapping_x_axis)
  155. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapping_y_axis)
  156.  
  157.  
  158.  
  159. # Bindless
  160.  
  161. image = pilimage.open(f"{file_path}/{image_name}")
  162. image = image.transpose(pilimage.Transpose.FLIP_TOP_BOTTOM)
  163. image = image.convert("RGBA")
  164.  
  165. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width, image.height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
  166. image.tobytes())
  167. if generate_mipmap:
  168. glGenerateMipmap(GL_TEXTURE_2D)
  169. else:
  170. # Now use actual GL constants for filters
  171. glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, min_filter, mag_filter)
  172. # Hardcode or use the hijacked wrapping args for the actual filters
  173. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
  174. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
  175. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
  176. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
  177. # Get the bindless handle
  178. texture_handle = glGetTextureHandleARB(tex_id)
  179. glMakeTextureHandleResidentARB(texture_handle)
  180. # Store handle in list
  181. slot = len(TextureHandler.texture_handles) # the SSBO index
  182. TextureHandler.texture_handles.append(texture_handle)
  183.  
  184. # Store mappings
  185. TextureHandler.name_id_dict[image_name] = tex_id
  186. TextureHandler.id_handle_dict[tex_id] = texture_handle
  187. TextureHandler.name_slot_dict[image_name] = slot
  188. if return_id_with_slot:
  189. return slot,tex_id
  190. else:
  191. return slot,None
Add Comment
Please, Sign In to add comment