def update(self, dt): self.elapsed_time += dt mouse_x, mouse_y, buttons_states = self.get_mouse_state() ImGuiExtra.begin_frame( int(mouse_x), int(mouse_y), buttons_states, 0, self.width, self.height ) show_example_dialog() ImGuiExtra.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.setViewTransform(0, as_void_ptr(view), as_void_ptr(projection)) bgfx.setViewRect(0, 0, 0, self.width, self.height) bgfx.touch(0) mtx = rotate_xy(0, self.elapsed_time * 0.37) bgfx.setUniform( 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_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 _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 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 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_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 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 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_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)))
def update(self, dt): mouse_x, mouse_y, buttons_states = self.get_mouse_state() ImGuiExtra.begin_frame(int(mouse_x), int(mouse_y), buttons_states, 0, self.fb_width, self.fb_height) show_properties_dialog(self.fb_width, self.fb_height, self.hidpi) self._create_imgui_config_dialog() ImGuiExtra.end_frame() 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_circle_obstacle((0.5, 0.5), 40.0) self.fluid_simulator.update(dt) self.particle_area.update(dt) if glfw.get_mouse_button(self.window, glfw.MOUSE_BUTTON_LEFT) == glfw.PRESS\ and not ImGui.GetIO().WantCaptureMouse: n_mouse_x, n_mouse_y = self._get_normalized_mouse_coords( mouse_x, mouse_y) n_old_mouse_x, n_old_mouse_y = self._get_normalized_mouse_coords( self.old_mouse_x, self.old_mouse_y) vel_x = n_mouse_x - n_old_mouse_x vel_y = n_mouse_y - n_old_mouse_y # if vel_x != 0 and vel_y != 0: self.fluid_simulator.add_velocity((n_mouse_x, n_mouse_y), (vel_x * 10, vel_y * 10), 32.0) self.particle_area.add_particles((n_mouse_x, n_mouse_y), self.particles_diameter, self.particles_strength) self.old_mouse_x = mouse_x self.old_mouse_y = mouse_y bgfx.setState(0 | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A | BGFX_STATE_BLEND_ALPHA) bgfx.dispatch(0, self.cs_program, self.fb_width // 16, self.fb_height // 16) bgfx.setTexture(0, self.texture_uniform, self.output_texture) bgfx.submit(0, self.main_program, 0, False) if self.show_quiver_plot_overlay.value: bgfx.setBuffer(1, self.fluid_simulator.get_velocity_buffer(), bgfx.Access.Read) bgfx.setUniform( self.window_size_uniform, as_void_ptr((c_float * 2)(self.fb_width, self.fb_height)), ) bgfx.setUniform( self.velocity_size_uniform, as_void_ptr((c_float * 2)(self.fluid_simulator.width, self.fluid_simulator.height)), ) bgfx.setUniform( self.arrow_tile_size_uniform, as_void_ptr((c_float * 1)(self.quiver_plot_resolutions[ self.quiver_plot_resolution.value])), ) bgfx.submit(0, self.quiver_program, 0, False) bgfx.frame()