FLAMEGPU/FLAMEGPU2-visualiser

Simple user interface for interacting with models

mondus opened this issue · 4 comments

Suggest a couple of utility functions which would add control to a movable UI window rendered with OpenGL.

addUISliderControl(name_of_env_var, min_range, max_range): This should create a slider element in the UI so that the environment property (float or int) can be varied interactively. E.g. Boids rule weights.

addUIToggleControl(callback): This should create a toggle button element in the UI so that the environment property (int or bool) can be varied interactively. E.g. Exit open/closed.

There are some nice simple libraries for this e.g. https://github.com/wjakob/nanogui Although this wouldn't be overly difficult to implement from scratch.

@MILeach Has used https://github.com/ocornut/imgui which seems like a good candidate library.

Sliders don't work, would require users to additionally specify min/max/step, alot of extra hassle.

Probably easier to just allow users to type in a new value.

Need to complete #17 first, shouldn't be too difficult after that.

cc @mondus

Main question is whether users should be able to create multiple distinct UI panels, or only one.

In both cases, probably want to move customisation into a distinct class to save cluttering ModelVis further.

All customisation should largely consist of a direct mapping to IMGUI features, with some extra fudge to pull in the correct data. Maybe I'm blind, but I can't find a clear documentation list of the UI elements supports (widgets), short of just reading the header imgui.h.

/**
 * This provides an interface for managing the render options for a specific CUDASimulation
 */
class ModelVis {
     ...
     /**
      * Add a customisable user interface panel to the visualisation
      *
      * Each panel can be moved around the screen/minimised with custom elements representing environment properties added
      * @param panel_title The string that will be visible in the title of the panel
      */
     PanelVis newUIPanel(const std::string &panel_title);
};
/**
 * This provides an interface for constructing visualisation UI panels.
 * Elements added will appear vertically in the same order that they are added
 */
class PanelVis {
     /**
      * Add a slider which displays the named environment property and allows it's value to be updated
      *
      * @param property_name Name of the affected environment property
      * @param min Minimum value of the slider
      * @param max Maximum value of the slider
      * @param steps Number of steps available on the slider
      * @throw exception::InvalidProperty When a slider has already been defined (in any UI for this property)
      */
     template<typename T>
     void newEnvironmentPropertySlider(const std::string &property_name, T min, T max, unsigned int steps);
     /**
      * Add a label which displays the named environment property's value 
      *
      * @param property_name Name of the affected environment property
      */
     void newEnvironmentPropertyLabel(const std::string &property_name);
     /**
      * Add a label containing a fixed string
      *
      * @param label_text Text of the label
      */
     void newStaticLabel(const std::string &label_text);
     ...  // Whatever other UI elements we decide to support
};

Interface looks good. I would suggest for now a single UI Panel only with the ability to toggle its view on or off using a keyboard binding. Label should support multi line to allow a model like description to be displayed.