Wednesday, 29 April 2020

Dashed Lines

Omber now has support for dashed lines. I've included a few basic types of dashes that can be chosen from, but it's fairly easy to add more types if you need more. Just let me know.

Saturday, 14 March 2020

Cloud Saves in Omber

Now that Omber works on iPads and Android phones and computers, I've had a few situations where I've wanted to work on a drawing from different places. I've wanted to work on it from my desktop computer at home, review it on my cellphone while on the subway, and play with it on a tablet while at the library. Transferring files between all these devices is a bit of a pain, so I've been looking into better support for saving documents in the cloud for Omber.

Other apps support cloud saves by making their own cloud services that users can subscribe to. That approach does provide a really good and consistent experience, but it locks users into a service, and it's expensive for users. Instead, I've tried to better integrate Omber with the native cloud saving services available on different devices.

Monday, 3 June 2019

Shape Previews

It's always hard to choose which new features should be added to Omber next. Obviously, I want as many people to use Omber as possible, but different features will appeal to different users. Should I improve the quality of the rendering for those who need the highest quality output? Should I add features that are unique to Omber to differentiate Omber from other tools? Should I improve the workflow for traditional vector graphics to make Omber more competitive for traditional vector graphics tasks? Should I add more premium features to give more incentives for people to purchase a subscription to Omber?

One type of user that I worry about is the beginner user. Many users who download Omber uninstall it soon afterwards. I suspect that some of those downloads are fake downloads or users who downloaded the wrong app. Still, I think many beginner users might simply be confused with how to use Omber. Most people aren't familiar with vector drawing apps. I've seen some beginner users try to rub their finger on the screen, trying to "paint" a scene, even though that's not how most vector drawing apps work. These beginner users will obviously become frustrated when nothing works like they expect, and they will uninstall Omber quickly.

To help these new users, I've been thinking about different ways that Omber could introduce them to vector graphics. I already include a basic introduction to vector graphics when Omber is first started, but it's a bit long to read and follow, so I suspect that most people skip it. I considered building an extensive tutorial system that would guide users step by step in how to draw different things in Omber, but those are actually difficult to make. After playing around with some other vector drawing apps, I noticed that some have a slightly different workflow where they constantly show a preview of the shape that you are drawing as you draw it.

This additional feedback seems like it might help show beginner users that vector drawing tools work differently from bitmap painting programs. If users try to rub their fingers on the screen, they will immediately see that they are specifying the outline for a shape instead of painting on a canvas because the shape preview will immediately show the shape being drawn. Users will get an intuitive feel for how vector drawing apps work instead of needing a tutorial explaining the difference.

I was hesitant about implementing it because I was afraid that Omber's rendering engine would be too slow and not robust enough to handle it. But I've done a lot of work on the rendering system, and it seems like it might handle it. It also required a revamp of the undo system, and lots of tweaks to the workflow. I myself am still getting used to the new new workflow with previews, and it's a tad less responsive than the old version without previews, but hopefully it will provide a gentler introduction to beginner users about the world of vector graphics.

Tuesday, 28 May 2019

Research Paper at Graphics Interface 2019

During the last few months, I haven't been releasing any features for Omber, and I apologize. I've been busy preparing a research paper describing some of the underlying technology behind Omber's advanced gradient system. This paper will be published at the Graphics Interface 2019 conference. I've named the technology DiffusionMesh for the research, but it's the same technology that you get to use in Omber. You might even recognize some of Omber's clipart in the example images. If you're interested, check out the paper and supplementary video. I've also made a video of the presentation I will be giving at the conference, and I will post it here once I've finished editing it together.

Update: The presentation video is now available.

Thursday, 4 October 2018

Performance Improvements for Omber

Omber's performance has always been slower than other vector drawing tools because

  • it can run in a web browser, and web browser code is slower than other code
  • it uses a custom graphics engine that I've written from scratch. Although this engine has support for Omber's gradients, it lacks many of the optimizations that are in older, more developed vector graphics engines
  • I've focused on adding features instead of on performance

This hasn't really been a problem for my uses because Omber defaults to a low quality mode that is fast enough to work with, and I can turn on the high quality HQ mode when I want a final image. I occasionally hire artists to give feedback about Omber, and I've been worried that they are initially confused by the low quality of Omber's default rendering. When they do find the HQ mode, they then tend to leave it on or they tend to regularly switch it on and off, meaning they experience sluggish performance when working.

This has worried me for a while, so I've decided to focus on improving Omber's performance enough that it can default to being in HQ mode. Below is a simulated animation of the different performance enhancements that I've made:

On the right is the original Omber. When you move a shape, it takes a while to draw, so it feels jerky and unresponsive. I spent a lot of time fixing up the performance of the initial drawing of shapes, so that Omber is responsive during shape manipulation. The middle animation demonstrates the effect of these performance improvements.

Omber also has a separate gradient generation stage that works in the background to generate gradients after you manipulate shapes. Since this runs in the background, it doesn't affect the responsiveness of Omber, so it usually isn't performance critical. Unfortunately, in HQ mode, the shapes that Omber has to deal with are more complicated, and the gradient generation started to become too slow for complex drawings. In the middle animation, you can see that after the shape has finished moving, it takes a while for the gradients to be calculated.

So I'm now working on improving gradient generation speed, so that Omber will behave like in the left animation, where it's responsive when you move a shape, and then the gradient quickly fills in afterwards.

The key to all these performance improvements is a new feature added to web browsers called Web Assembly. The existing Omber code has already been heavily optimized in the past. Unfortunately, in the past, web browsers could only run code written in JavaScript, and there are limitations to how fast those web browsers can run that code. WebAssembly lets browsers run code written in C++. This opens up many new possibilities for performance enhancements. C++ gives programmers more control over memory layouts, data types, and memory allocation. This makes it possible to rewrite key pieces of Omber code to make use of this extra control. For example, many of Omber's algorithms need to process thousands of points and triangles. With C++, these points and triangles can be stored compactly in arrays, which can be accessed more quickly and take less memory. Putting things in arrays also provides an arbitrary and implicit ordering on objects, providing a means to sort these objects. Supplementary information about these objects can be stored in arrays instead of dictionaries. Traditionally, the main problems with C++ is that it's hard to write and it's prone to security problems. I'm dealing the coding difficulties by focusing my efforts on only the small sections of code in Omber that take the most time. WebAssembly eliminates most security problems with C++ by adding extra security checks throughout the code.

As I've rewritten the slow parts of Omber in C++, I've also discovered a few coding mistakes that have reduced performance that I've eliminated. For example, I added some special code for handling some edge cases in the Edge web browser. Unfortunately, this resulted in mouse events being processed twice, halving performance.

These performance improvements will be released in the next week or two. After this round of optimizations, I think there are only limited means available for further speed-ups, such as taking advantage of increased parallelism (not really possible in web browsers) and algorithmic improvements (I have a few ideas in mind here, but those changes would require extensive new research).

Thursday, 23 August 2018

Game Engine Import for Omber

One of my long-term goals for Omber is to develop vector graphics tooling for animation and games. That's why the Omber gradient engine is based on a 3d graphics pipeline typical for games instead of a more typical vector graphics pipeline. Omber has supported COLLADA and glTF export for a while because I've always wanted Omber's art to be usable in games.

Unfortunately, support for COLLADA and glTF is pretty rudimentary in most game engines. The situation is not improving either. The new glTF 3d format is one of the best 3d file standards that's been created in decades. It is the first 3d file format standard with the technical capabilities needed for sharing modern 3d models between programs. But most 3d tools have been very reluctant to add support for it. So even though Omber has been able to export its vector art for use in games, no game engines have been able to actually import this vector art.

So I took some time out from working on Omber to create some importer plugins for the game engines PIXI.js (which is also used by RPG Maker MV) and Unity. You don't have to wait around for game engines to catch up to importing modern 3d file formats. You can import Omber vector art immediately into these game engines using the importer plugins with a minimum of hassle. I even game jammed with Omber's PIXI plugin to make sure everything worked, and it was fine. The vector art exported by Omber tends to be heavy in triangles currently, which can be graphics intensive if you have hundreds of pieces of vector art on-screen at the same time, but it's fine for more normal situations. I also used the Unity plugin to make an animation from one of Omber's clipart pieces. Basically, I broke down the chibi boy image into parts and exported each one separately. After importing them into Unity, I reassembled them hierarchically so that the the legs, arms, and heads would be children of the torso object, etc. Then, I could use Unity's animation tools to make a simple run animation. If you want support for other game engines, just send me a message and I'll see what I can do.

I'm now back to working directly on Omber again. I'm not sure which areas I should focus on next. I could add in more general vector design functionality. Although Omber has some unique features, it will take a while for it to be competitive in the general graphic design space. Even then, it would be hard to compete with better resourced firms. I was thinking of making an iPad port, but now that Affinity Designer is out and Vectornator has been made free, I'm not sure there's much of a market there. Ports are also time-consuming and other versions of Omber won't see any improvements when I'm doing the port. Oddly enough, three years ago, I made a rudimentary animation tool in a few months called Animation Companion, and even now, that tool often has more traffic and more users than Omber. I could use some of Omber's technology to make a much better animation tool, something comparable to Spine and that could also handle vector art exported by Omber. I wonder if that would be a better area to focus on.