Shapeflow Update

Shapeflow OSX Screenshot

I haven’t written any updates on Shapeflow itself in a while. The problem with developing a framework instead of just an application is that one often has a long stretch where no real progress is visible in the user interface. But rest assured, I’m still working on it!

Recent additions

The last couple of weeks have focused mainly on API-design refactoring and fixing a number of bugs/shortcomings in the existing functionality. So while the app hasn’t made much progress from a user perspective, it has made a lot of it from an implementation standpoint.

  • Document, modes and operations: the framework now has a concept of a document (e.g. the combination of a render layout and a renderer). The document can for example be queried if there are any unsaved modifications in the scene. This made writing a multi-document application much easier. There are now also modes which represent certain stages in the workflow (e.g. modelling, rigging, animation) and a unified interface for the operations (e.g. extrude face) that can be used.
  • The scene graph now supports using multiple renderers on the same data. In the current use case, this meant the material library panel could use a separate renderer instance and does not block/interact with the main renderer that does the content area. But also this allows for having a raytracer- and a rasterizer-based renderer in parallel in the future.
  • I’m reworking the UI concept for the macOS version of Shapeflow. It has been an inspector-based design up to now but for working with multiple screens it’s much nicer to have a panel-based approach.
  • MacOS tab behavior: There were a number of problems implementing a tab-based multi-document app with 3D rendering on macOS. It took some time but now everything seems to work great.
  • Vulkan-renderer: I experimented with a Vulcan-Based renderer but put it on the back burner for now. Vulkan does seem interesting, but not having any proper support on macOS (only indirectly with MoltenVK which maps Vulkan to Metal) means one has to do a lot of low level initialisation work which otherwise the OS base-classes take care of.
  • MatCap: Render support for MatCaps has been added.
  • The render mesh generation has been optimised for faster upload to the GPU
  • Rendering for both OpenGL and Metal is now on-demand, so if nothing changes and nothing is animated, drawing the next frame is a simple blit (a copy of the last frame). This saves CPU and more importantly battery.
  • The File I/O now has an option to either read only an assembly or also automatically read the referenced parts as well.
  • Using a surrounding as a background and for image-based lighting are now to independent options.

I also wrote a small tool to make it easier to author surroundings which I call EnvFlow. It allows building new surrounding with simple drag & drop, blur/resample the cube maps, calculate irradiance maps and then save the result as an XML file which Shapeflow can read.

EnvFlow Surrounding Authoring Tool
EnvFlow Surrounding Authoring Tool

Next Steps

Work currently happens on two fronts: I’m beginning to implement the basic operations (such as extrude face, split edge, etc) in the new operations-system and designing the macOS UI to support them. I’m looking forward to finally being able to edit mesh vertices and B-Rep trim curves instead of just being able to edit whole shapes.

The other front is making an existing scene look great. So creating some nice pre-packaged MatCaps, surroundings and lighting setups, being able to do material assignments and so on. Probably have to design a custom icon set soon as well, the placeholder icons in the screenshot do look pretty out of place … it really is the case of a ton of cool tech hiding under an ugly interface!

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*