pySSV GUI Library Examples
pySSV includes a powerful and easy to use immediate mode GUI library to create interactive user interfaces for your shaders.
Check out the documentation for more details about the GUI library: SSVGUI Documentation
[ ]:
# Google colab support
try:
# Try enabling custom widgets, this will fail silently if we're not in Google Colab
from google.colab import output
output.enable_custom_widget_manager()
# Install pySSV for this session
%pip install pySSV
except:
pass
[ ]:
import pySSV as ssv
from pySSV.ssv_gui import create_gui, SSVGUI
from pySSV import ssv_colour
class MyGUI:
# We create a new class for the GUI so that state can be stored between on_gui_draw calls
checkbox_value = False
slider_font_size = 10.
slider_font_weight = 0.4
slider_rounding = 4
slider_int = 0
slider_non_lin = 0
def on_gui_draw(self, gui: SSVGUI):
# Begin drawing our GUI in here.
# This is an immediate mode gui, so any time the GUI is invalidated (on mouse click for instance), we redraw the entire GUI.
# The GUI drawing methods used here should *only* be used within the on_gui callback.
gui.begin_vertical(pad=True)
gui.rounded_rect(ssv_colour.ui_base_bg, overlay_last=True)
gui.button("Hello world!")
gui.button("GUIs are Awesome", ssv_colour.orange)
gui.begin_horizontal()
gui.rounded_rect(ssv_colour.violet)
gui.rounded_rect(ssv_colour.darkgrey)
gui.end_horizontal()
gui.label("Shaders are cool!", font_size=float(self.slider_font_size), x_offset=5, shadow=True, overlay_last=True)
gui.begin_horizontal()
gui.button("Horizontal", ssv_colour.red)
gui.button("Layout", ssv_colour.green)
gui.button("Groups", ssv_colour.blue)
gui.end_horizontal()
gui.space()
self.checkbox_value = gui.checkbox("We can enable layout groups", self.checkbox_value)
gui.begin_toggle(self.checkbox_value)
gui.button("This control can be hidden", ssv_colour.olive)
gui.button("Peekaboo", ssv_colour.emeraldgreen)
gui.end_toggle()
gui.button("Controls are automatically layed out", ssv_colour.navy)
gui.label("Text can be styled", font_size=22., x_offset=5, colour=ssv_colour.orange)
gui.label("Text can be styled", font_size=30., x_offset=5, colour=ssv_colour.white, weight=float(self.slider_font_weight))
gui.label("Text can be styled", font_size=30., x_offset=5, colour=ssv_colour.limegreen, weight=0.75)
gui.label("Text can be styled", font_size=16., x_offset=5, colour=ssv_colour.cyan, italic=True, shadow=True)
self.slider_font_size = gui.slider("Sliders!", self.slider_font_size, min_value=0, max_value=100, step_size=1, power=1., track_thickness=4)
self.slider_font_weight = gui.slider("Font weight", self.slider_font_weight, min_value=0.25, max_value=0.8)
self.slider_rounding = gui.slider(f"Corner radius = {float(self.slider_rounding):.2f}", self.slider_rounding, min_value=0, max_value=20)
self.slider_int = gui.slider(f"Integer slider = {self.slider_int}", self.slider_int, min_value=0, max_value=100, step_size=20, track_thickness=10)
self.slider_non_lin = gui.slider(f"Nonlinear slider = {float(self.slider_non_lin):.2f}", self.slider_non_lin, min_value=0, max_value=100, power=2., track_thickness=10)
gui.rounding_radius = self.slider_rounding.result
gui.space(height=30)
gui.end_vertical()
# Set up a basic canvas
canvas = ssv.canvas(use_renderdoc=True)
# Now create an SSVGUI
gui = create_gui(canvas)
my_gui = MyGUI()
# Register a callback to the on_gui event
gui.on_gui(lambda x: my_gui.on_gui_draw(x))
# Now we render a shader as usual
canvas.shader("""
#pragma SSV shadertoy
void mainImage(out vec4 fragColor, in vec2 fragCoord)
{
// Normalized pixel coordinates (from 0 to 1)
vec2 uv = fragCoord/iResolution.yy;
// Colour changing over time
vec3 col = sin(uv.xyx + iTime * vec3(3, 4, 5)) * 0.5 + 0.5;
float alpha = smoothstep(0.1, 0.1+2./iResolution.y, 1.-length(uv*2.-1.));
// Output to screen
fragColor = vec4(vec3(col), 1.0);
}
""")
canvas.run(stream_quality=100)
[ ]: