def update(self, dt): self.elapsed_time += dt mouse_x, mouse_y, buttons_states = self.get_mouse_state() ImGuiExtra.imgui_begin_frame( int(mouse_x), int(mouse_y), buttons_states, 0, self.width, self.height ) show_example_dialog() ImGuiExtra.imgui_end_frame() at = (c_float * 3)(*[0.0, 1.0, 0.0]) eye = (c_float * 3)(*[0.0, 1.0, -2.5]) up = (c_float * 3)(*[0.0, 1.0, 0.0]) view = look_at(eye, at, up) projection = proj(60.0, self.width / self.height, 0.1, 100.0) bgfx.set_view_transform(0, as_void_ptr(view), as_void_ptr(projection)) bgfx.set_view_rect(0, 0, 0, self.width, self.height) bgfx.touch(0) mtx = rotate_xy( 0, self.elapsed_time * 0.37 ) bgfx.set_uniform(self.time_uniform, as_void_ptr((c_float * 4)(self.elapsed_time, 0.0, 0.0, 0.0))) self.mesh.submit(0, self.main_program, mtx) bgfx.frame()
def init(self, platform_data): self.init_conf.platform_data = platform_data bgfx.render_frame() bgfx.init(self.init_conf) bgfx.reset( self.width, self.height, BGFX_RESET_VSYNC, self.init_conf.resolution.format, ) bgfx.set_debug(BGFX_DEBUG_TEXT) bgfx.set_view_clear(0, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x443355FF, 1.0, 0) self.vertex_layout = bgfx.VertexLayout() self.vertex_layout.begin().add( bgfx.Attrib.POSITION, 3, bgfx.AttribType.FLOAT).add(bgfx.Attrib.COLOR0, 4, bgfx.AttribType.UINT8, True).add(bgfx.Attrib.TEXCOORD0, 2, bgfx.AttribType.FLOAT).end() # Create static vertex buffer vb_memory = bgfx.copy(as_void_ptr(cube_vertices), sizeof(PosColorTexVertex) * num_vertices) self.vertex_buffer = bgfx.create_vertex_buffer(vb_memory, self.vertex_layout) # Create index buffer ib_memory = bgfx.copy(as_void_ptr(cube_indices), cube_indices.nbytes) self.index_buffer = bgfx.create_index_buffer(ib_memory) # Create texture uniform self.texture_uniform = bgfx.create_uniform("s_tex", bgfx.UniformType.SAMPLER) # Load the image using PIL and make the texture logo = Image.open( Path(__file__).parent.parent / "assets" / "textures" / "python_logo.png") logo_memory = bgfx.copy(as_void_ptr(logo.tobytes()), len(logo.tobytes())) self.logo_texture = bgfx.create_texture2d(logo.width, logo.height, False, 1, bgfx.TextureFormat.RGBA8, BGFX_TEXTURE_RT, logo_memory) # Create program from shaders. self.main_program = bgfx.create_program( load_shader("textures.VertexShader.vert", ShaderType.VERTEX, root_path=root_path), load_shader("textures.FragmentShader.frag", ShaderType.FRAGMENT, root_path=root_path), True, ) ImGuiExtra.imgui_create()
def update(self, dt): self.elapsed_time += dt mouse_x, mouse_y, buttons_states = self.get_mouse_state() ImGuiExtra.imgui_begin_frame(int(mouse_x), int(mouse_y), buttons_states, 0, self.width, self.height) show_example_dialog() self._create_imgui_cubes_selection_dialog() ImGuiExtra.imgui_end_frame() at = (c_float * 3)(*[0.0, 0.0, 0.0]) eye = (c_float * 3)(*[0.0, 0.0, -35.0]) up = (c_float * 3)(*[0.0, 1.0, 0.0]) view = look_at(eye, at, up) projection = proj(60.0, self.width / self.height, 0.1, 100.0) bgfx.set_view_transform(0, as_void_ptr(view), as_void_ptr(projection)) bgfx.set_view_rect(0, 0, 0, self.width, self.height) bgfx.touch(0) for yy in range(0, 11): for xx in range(0, 11): mtx = rotate_xy(self.elapsed_time + xx * 0.21, self.elapsed_time + yy * 0.37) mtx[3, 0] = -15.0 + xx * 3.0 mtx[3, 1] = -15.0 + yy * 3.0 mtx[3, 2] = 0.0 bgfx.set_transform(as_void_ptr(mtx), 1) # Set vertex and index buffer. bgfx.set_vertex_buffer(0, self.vertex_buffer, 0, num_vertices) bgfx.set_index_buffer( self.index_buffers[self.primitive_geometry.value], 0, primitives[self.primitive_geometry.value].size, ) bgfx.set_state( bgfx_states[self.primitive_geometry.value] | (BGFX_STATE_WRITE_R if self.write_r.value else 0) | (BGFX_STATE_WRITE_G if self.write_g.value else 0) | (BGFX_STATE_WRITE_B if self.write_b.value else 0) | (BGFX_STATE_WRITE_A if self.write_a.value else 0) | BGFX_STATE_WRITE_Z | BGFX_STATE_DEPTH_TEST_LESS | BGFX_STATE_CULL_CW | BGFX_STATE_MSAA, 0, ) bgfx.submit(0, self.main_program, 0, False) bgfx.frame()
def update(self, dt): self.elapsed_time += dt mouse_x, mouse_y, buttons_states = self.get_mouse_state() ImGuiExtra.imgui_begin_frame(int(mouse_x), int(mouse_y), buttons_states, 0, self.width, self.height) show_example_dialog() ImGuiExtra.imgui_end_frame() at = (c_float * 3)(*[0.0, 0.0, 0.0]) eye = (c_float * 3)(*[0.0, 0.0, -15.0]) up = (c_float * 3)(*[0.0, 1.0, 0.0]) view = look_at(eye, at, up) projection = proj(60.0, self.width / self.height, 0.1, 100.0) bgfx.set_view_transform(0, as_void_ptr(view), as_void_ptr(projection)) bgfx.set_view_rect(0, 0, 0, self.width, self.height) bgfx.touch(0) for yy in range(-2, 2): for xx in range(-2, 2): mtx = rotate_xy(self.elapsed_time + xx * 0.51, self.elapsed_time + yy * 0.27) mtx[3, 0] = 4 + xx * 3.5 mtx[3, 1] = 2 + yy * 3.5 mtx[3, 2] = 0 bgfx.set_transform(as_void_ptr(mtx), 1) # Set vertex and index buffer. bgfx.set_vertex_buffer(0, self.vertex_buffer, 0, num_vertices) bgfx.set_index_buffer(self.index_buffer, 0, cube_indices.size) # Set the texture bgfx.set_texture(0, self.texture_uniform, self.logo_texture) bgfx.set_state( 0 | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A | BGFX_STATE_WRITE_Z | BGFX_STATE_DEPTH_TEST_LESS | BGFX_STATE_MSAA, 0, ) bgfx.submit(0, self.main_program, 0, False) bgfx.frame()
def add_particles(self, position: tuple, radius: float, strength: float): if self.simulate: self._init_compute_kernels() bgfx.setUniform( self.position_uniform, as_void_ptr((c_float * 2)(position[0], position[1])), ) bgfx.setUniform(self.value_uniform, as_void_ptr((c_float * 1)(strength))) bgfx.setUniform(self.radius_uniform, as_void_ptr((c_float * 1)(radius))) bgfx.dispatch(0, self._add_particles_kernel, self._num_groups_x, self._num_groups_x, 1) self._flip_buffer()
def update(self, dt): mouse_x, mouse_y, buttons_states = self.get_mouse_state() ImGuiExtra.imguiBeginFrame( int(mouse_x), int(mouse_y), buttons_states, 0, self.fb_width, self.fb_height ) show_properties_dialog(self.fluid_simulator, self.particle_area, self.hidpi) ImGuiExtra.imguiEndFrame() vel_y = random.uniform(-0.08, 0.08) vel_x = random.uniform(-0.01, 0.1) strength = random.uniform(0.01, 0.09) at = (c_float * 3)(*[0.0, 0.0, 0.0]) eye = (c_float * 3)(*[0.0, 0.0, 10.0]) up = (c_float * 3)(*[0.0, 1.0, 0.0]) view = look_at(eye, at, up) projection = proj(11.4, 1, 0.1, 100.0) bgfx.setViewRect(0, 0, 0, self.fb_width, self.fb_height) bgfx.setViewTransform(0, as_void_ptr(view), as_void_ptr(projection)) bgfx.setVertexBuffer(0, self.vertex_buffer, 0, 4) bgfx.setIndexBuffer(self.index_buffer, 0, cube_indices.size) bgfx.setState(BGFX_STATE_DEFAULT) bgfx.setImage(0, self.output_texture, 0, bgfx.Access.Write) self.fluid_simulator.add_velocity((0.23, 0.5), (vel_x, vel_y), 34.0) self.fluid_simulator.add_circle_obstacle((0.5, 0.7), 30.0) self.fluid_simulator.add_triangle_obstacle( (0.65, 0.5), (0.42, 0.5), (0.42, 0.39) ) self.fluid_simulator.add_triangle_obstacle( (0.65, 0.06), (0.65, 0.39), (0.42, 0.39) ) self.fluid_simulator.update(dt) self.particle_area.add_particles((0.2, 0.5), 220.0, strength) self.particle_area.update(dt) bgfx.dispatch(0, self.cs_program, self.fb_width // 16, self.fb_height // 16) bgfx.setTexture(0, self.texture_uniform, self.output_texture) bgfx.setState(BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A) bgfx.submit(0, self.main_program, 0, False) bgfx.frame()
def add_velocity(self, position: tuple, velocity: tuple, radius: float): if self.simulate: self._init_compute_kernels() bgfx.setUniform( self.position_uniform, as_void_ptr((c_float * 2)(position[0], position[1])), ) bgfx.setUniform( self.value_uniform, as_void_ptr((c_float * 2)(velocity[0], velocity[1])) ) bgfx.setUniform(self.radius_uniform, as_void_ptr((c_float * 1)(radius))) bgfx.dispatch( 0, self._add_velocity_kernel, self._num_groups_x, self._num_groups_y, 1 ) self._flip_velocity_buffer()
def init(self, platform_data): self.init_conf.platform_data = platform_data bgfx.render_frame() bgfx.init(self.init_conf) bgfx.reset( self.width, self.height, BGFX_RESET_VSYNC, self.init_conf.resolution.format, ) bgfx.set_debug(BGFX_DEBUG_TEXT) bgfx.set_view_clear(0, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x443355FF, 1.0, 0) self.vertex_layout = bgfx.VertexLayout() self.vertex_layout.begin().add(bgfx.Attrib.POSITION, 3, bgfx.AttribType.FLOAT).add( bgfx.Attrib.COLOR0, 4, bgfx.AttribType.UINT8, True).end() # Create static vertex buffer vb_memory = bgfx.copy(as_void_ptr(cube_vertices), sizeof(PosColorVertex) * num_vertices) self.vertex_buffer = bgfx.create_vertex_buffer(vb_memory, self.vertex_layout) self.index_buffers = [] for i in range(0, len(primitives)): ib_memory = bgfx.copy(as_void_ptr(primitives[i]), primitives[i].nbytes) self.index_buffers.append(bgfx.create_index_buffer(ib_memory)) # Create program from shaders. self.main_program = bgfx.create_program( load_shader("cubes.VertexShader.vert", ShaderType.VERTEX, root_path=root_path), load_shader("cubes.FragmentShader.frag", ShaderType.FRAGMENT, root_path=root_path), True, ) ImGuiExtra.imgui_create()
def add_triangle_obstacle(self, p1: tuple, p2: tuple, p3: tuple, static=False): if self.simulate: self._init_compute_kernels() bgfx.setUniform(self.p1_uniform, as_void_ptr((c_float * 2)(p1[0], p1[1]))) bgfx.setUniform(self.p2_uniform, as_void_ptr((c_float * 2)(p2[0], p2[1]))) bgfx.setUniform(self.p3_uniform, as_void_ptr((c_float * 2)(p3[0], p3[1]))) bgfx.setUniform( self.static_uniform, as_void_ptr((c_float * 1)(1.0 if static else 0.0)) ) bgfx.dispatch( 0, self._add_triangle_obstacle_kernel, self._num_groups_x, self._num_groups_y, 1, )
def add_circle_obstacle(self, position: tuple, radius: float, static=False): if self.simulate: self._init_compute_kernels() bgfx.setUniform( self.position_uniform, as_void_ptr((c_float * 2)(position[0], position[1])), ) bgfx.setUniform(self.radius_uniform, as_void_ptr((c_float * 1)(radius))) bgfx.setUniform( self.static_uniform, as_void_ptr((c_float * 1)(1.0 if static else 0.0)) ) bgfx.dispatch( 0, self._add_circle_obstacle_kernel, self._num_groups_x, self._num_groups_y, 1, )
def update(self, time_delta: float): self._init_compute_kernels() if self.simulate: bgfx.setUniform(self.dissipation_uniform, as_void_ptr((c_float * 1)(self.dissipation))) bgfx.setUniform(self.elapsed_time_uniform, as_void_ptr((c_float * 1)(time_delta))) bgfx.setUniform(self.speed_uniform, as_void_ptr((c_float * 1)(self.speed))) bgfx.dispatch( 0, self._advect_particles_kernel, self._num_groups_x, self._num_groups_y, 1, ) self._flip_buffer()
def _init_compute_kernels(self): bgfx.setUniform( self.particle_size_uniform, as_void_ptr((c_float * 2)(self._particle_size[0], self._particle_size[1])), ) bgfx.setUniform( self.velocity_size_uniform, as_void_ptr((c_float * 2)(self._velocity_size[0], self._velocity_size[1])), ) bgfx.setBuffer( TemplateConstants.PARTICLES_IN.value, self._particles_buffer[self.PARTICLES_IN], bgfx.Access.Write, ) bgfx.setBuffer( TemplateConstants.PARTICLES_OUT.value, self._particles_buffer[self.PARTICLES_OUT], bgfx.Access.Write, )
def run(self): glfw.init() glfw.window_hint(glfw.CLIENT_API, glfw.OPENGL_API) glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 2) glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 3) glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE) glfw.window_hint(glfw.CONTEXT_CREATION_API, glfw.OSMESA_CONTEXT_API) self.window = glfw.create_window(self.width, self.height, self.title, None, None) handle, display = None, None if sys.platform == "linux": glfw_native.glfwGetX11Window.argtypes = [ ctypes.POINTER(glfw._GLFWwindow) ] glfw_native.glfwGetX11Window.restype = ctypes.c_void_p handle = glfw_native.glfwGetX11Window(self.window) display = glfw_native.glfwGetX11Display() glfw.make_context_current(self.window) data = bgfx.PlatformData() data.ndt = as_void_ptr(display) data.nwh = as_void_ptr(handle) data.context = as_void_ptr(glfw.get_os_mesa_context(self.window)) data.back_buffer = None data.back_buffer_ds = None self.init(data) for _ in range(0, 10): self.update(1.0) self.shutdown() glfw.terminate()
def _init_compute_kernels(self): bgfx.setUniform( self.size_uniform, as_void_ptr((c_float * 2)(self._width, self._height)) ) bgfx.setBuffer(1, self._velocity_buffer[self.VELOCITY_READ], bgfx.Access.Read) bgfx.setBuffer(2, self._velocity_buffer[self.VELOCITY_WRITE], bgfx.Access.Write) bgfx.setBuffer(3, self._pressure_buffer[self.PRESSURE_READ], bgfx.Access.Read) bgfx.setBuffer(4, self._pressure_buffer[self.PRESSURE_WRITE], bgfx.Access.Write) bgfx.setBuffer(5, self._divergence_buffer, bgfx.Access.ReadWrite) bgfx.setBuffer(6, self._vorticity_buffer, bgfx.Access.ReadWrite) bgfx.setBuffer(7, self._obstacles_buffer, bgfx.Access.ReadWrite)
def _update_params(self, time_delta: float): bgfx.setUniform( self.elapsed_time_uniform, as_void_ptr((c_float * 1)(time_delta)) ) bgfx.setUniform(self.speed_uniform, as_void_ptr((c_float * 1)(self.speed))) bgfx.setUniform( self.dissipation_uniform, as_void_ptr((c_float * 1)(self.dissipation)) ) bgfx.setUniform( self.vorticity_scale_uniform, as_void_ptr((c_float * 1)(self.vorticity)) ) if self._viscosity > 0.0: centre_factor = 1.0 / self.viscosity stencil_factor = 1.0 / (4.0 + centre_factor) bgfx.setUniform( self.alpha_uniform, as_void_ptr((c_float * 1)(centre_factor)) ) bgfx.setUniform( self.rbeta_uniform, as_void_ptr((c_float * 1)(stencil_factor)) )
0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, 0x20, 0x0f, ] ) logo = as_void_ptr(s_python_logo)
def init(self, platform_data): self.init_conf.platformData = platform_data bgfx.init(self.init_conf) bgfx.reset( self.fb_width, self.fb_height, BGFX_RESET_VSYNC | BGFX_RESET_HIDPI, self.init_conf.resolution.format, ) bgfx.setDebug(BGFX_DEBUG_TEXT) bgfx.setViewClear(0, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x443355FF, 1.0, 0) self.vertex_layout = bgfx.VertexLayout() self.vertex_layout.begin().add( bgfx.Attrib.Position, 3, bgfx.AttribType.Float ).add(bgfx.Attrib.TexCoord0, 3, bgfx.AttribType.Float).end() self.fluid_simulator = FluidSimulator( self.width // 2, self.height // 2, self.vertex_layout ) self.fluid_simulator.vorticity = 1.0 self.fluid_simulator.viscosity = 0.0 self.fluid_simulator.iterations = 100 self.particle_area = SmoothParticlesArea( self.fb_width, self.fb_height, self.fluid_simulator, self.vertex_layout ) self.particle_area.dissipation = 0.980 # Create static vertex buffer vb_memory = bgfx.copy(as_void_ptr(cube_vertices), sizeof(PosColorVertex) * 4) self.vertex_buffer = bgfx.createVertexBuffer(vb_memory, self.vertex_layout) ib_memory = bgfx.copy(as_void_ptr(cube_indices), cube_indices.nbytes) self.index_buffer = bgfx.createIndexBuffer(ib_memory) self.output_texture = bgfx.createTexture2D( self.fb_width, self.fb_height, False, 1, bgfx.TextureFormat.RGBA8, BGFX_TEXTURE_COMPUTE_WRITE, ) self.texture_uniform = bgfx.createUniform( "InputTexture", bgfx.UniformType.Sampler ) # Create program from shaders. self.main_program = bgfx.createProgram( load_shader( "demo.VertexShader.vert", ShaderType.VERTEX, root_path=root_path ), load_shader( "demo.FragmentShader.frag", ShaderType.FRAGMENT, root_path=root_path ), True, ) self.cs_program = bgfx.createProgram( load_shader( "demo.ComputeShader.comp", ShaderType.COMPUTE, root_path=root_path ), True, ) ImGuiExtra.imguiCreate(36.0)
def run(self): glfw_native.glfwCreateWindow.argtypes = [ ctypes.c_int, ctypes.c_int, ctypes.c_char_p, ] glfw_native.glfwCreateWindow.restype = ctypes.POINTER(glfw._GLFWwindow) glfw_native.glfwMakeContextCurrent.argtypes = [ ctypes.POINTER(glfw._GLFWwindow) ] glfw_native.glfwWindowShouldClose.argtypes = [ ctypes.POINTER(glfw._GLFWwindow) ] glfw_native.glfwWindowShouldClose.restype = ctypes.c_int glfw.init() glfw.window_hint(glfw.CLIENT_API, glfw.NO_API) self.window = glfw.create_window(self.width, self.height, self.title, None, None) glfw.set_window_size_callback(self.window, self._handle_window_resize) handle, display = None, None if sys.platform == "darwin": glfw_native.glfwGetCocoaWindow.argtypes = [ ctypes.POINTER(glfw._GLFWwindow) ] glfw_native.glfwGetCocoaWindow.restype = ctypes.c_void_p handle = glfw_native.glfwGetCocoaWindow(self.window) elif sys.platform == "win32": glfw_native.glfwGetWin32Window.argtypes = [ ctypes.POINTER(glfw._GLFWwindow) ] glfw_native.glfwGetWin32Window.restype = ctypes.c_void_p handle = glfw_native.glfwGetWin32Window(self.window) elif sys.platform == "linux": glfw_native.glfwGetX11Window.argtypes = [ ctypes.POINTER(glfw._GLFWwindow) ] glfw_native.glfwGetX11Window.restype = ctypes.c_void_p handle = glfw_native.glfwGetX11Window(self.window) display = glfw_native.glfwGetX11Display() data = bgfx.PlatformData() data.ndt = display data.nwh = as_void_ptr(handle) data.context = None data.back_buffer = None data.back_buffer_ds = None self.init(data) last_time = None while not glfw.window_should_close(self.window): glfw.poll_events() now = time.perf_counter() if not last_time: last_time = now frame_time = now - last_time last_time = now self.update(frame_time) self.shutdown() glfw.terminate()