Source code for yt_idv.simple_gui

import imgui
import matplotlib.pyplot as plt
import numpy as np
from imgui.integrations.pyglet import create_renderer
from yt.visualization.image_writer import write_bitmap, write_image

from .opengl_support import Texture2D


[docs]class SimpleGUI: renderer = None callbacks = None context = None window = None draw = False def __init__(self, window): self.window = window self.context = imgui.create_context() self.renderer = create_renderer(window) self.snapshot_count = 0 self.snapshot_format = r"snap_{count:04d}.png" data = plt.get_cmap("viridis")(np.mgrid[0.0:1.0:256j]).reshape((-1, 1, 4)) self.data = dict( r=data[:, 0, 0].astype("f4"), g=data[:, 0, 1].astype("f4"), b=data[:, 0, 2].astype("f4"), a=data[:, 0, 3].astype("f4"), ) data = (data[:, :, :4] * 255).astype("u1") self.colormap = Texture2D(data=data, boundary_x="clamp", boundary_y="clamp")
[docs] def render(self, scene): imgui.new_frame() changed = False if scene is not None: imgui.style_colors_classic() imgui.begin("Scene") imgui.text("Filename Template:") _, self.snapshot_format = imgui.input_text("", self.snapshot_format, 256) if imgui.button("Save Snapshot"): # Call render again, since we're in the middle of overlaying # some stuff and we want a clean scene snapshot scene.render() write_bitmap( scene.image[:, :, :3], self.snapshot_format.format(count=self.snapshot_count), ) self.snapshot_count += 1 if imgui.tree_node("Debug"): if imgui.button("Save Depth"): scene.render() write_image( scene.depth, self.snapshot_format.format(count=self.snapshot_count), ) self.snapshot_count += 1 imgui.tree_pop() _ = self.render_camera(scene) changed = changed or _ # imgui.show_style_editor() for i, element in enumerate(scene): if imgui.tree_node(f"element {i + 1}: {element.display_name}"): changed = changed or element.render_gui(imgui, self.renderer, scene) imgui.tree_pop() self.window._do_update = self.window._do_update or changed imgui.end() imgui.render() self.renderer.render(imgui.get_draw_data())
[docs] def render_camera(self, scene): if not imgui.tree_node("Camera"): return changed = False with scene.camera.hold_trait_notifications(): for attr in ("position", "up", "focus"): arr = getattr(scene.camera, attr) imgui.text(f"Camera {attr}") _, values = imgui.input_float3( "", arr[0], arr[1], arr[2], flags=imgui.INPUT_TEXT_ENTER_RETURNS_TRUE, ) changed = changed or _ if _: setattr(scene.camera, attr, np.array(values)) _, values = imgui.input_float2( "Camera Planes", scene.camera.near_plane, scene.camera.far_plane, format="%0.6f", flags=imgui.INPUT_TEXT_ENTER_RETURNS_TRUE, ) changed = changed or _ if _: scene.camera.near_plane = values[0] scene.camera.far_plane = values[1] if imgui.button("Center"): scene.camera.position = np.array([0.499, 0.499, 0.499]) scene.camera.focus = np.array([0.5, 0.5, 0.5]) changed = True if imgui.button("Outside"): scene.camera.position = np.array([1.5, 1.5, 1.5]) scene.camera.focus = np.array([0.5, 0.5, 0.5]) changed = True if changed: scene.camera._update_matrices() imgui.tree_pop() return changed
@property def mouse_event_handled(self): return self.renderer.io.want_capture_mouse @property def keyboard_event_handled(self): return self.renderer.io.want_capture_keyboard