Wednesday, March 15, 2017

Virtual Reality Financial Planning

We're continuing to explore ways to apply Virtual Reality to non-gaming applications. Our latest prototype is to expand Wealth Projector's Adviser Interface using a complementary Virtual Reality module for client-facing meetings.

The idea is to replace the 'let me turn my monitor around' or the 'let me sketch this on some paper' moment into a richly graphical, engaging Virtual Reality experience.

Check out video of the prototype below:

Wednesday, February 22, 2017

Virtual Reality Art Show

For the past six years, I've helped out at our community Art and Craft Festival. The logistics behind such a show are surprisingly daunting - hundreds of pieces of art have to be delivered, catalogued, tracked and (ideally) sold over the course of one weekend.

A couple of years ago I built a mobile website to help with this process. The website allows show coordinators to invite artists; artists to photograph (using their camera phone) and upload their art; the gallery team to arrange the paintings on walls using a drag-and-drop UI; and finally the sales team to track sales.

Another requested feature was to allow people to buy art online, before the show. But how to give people a good impression of how that art will look in their home? How to give a feel for the size of the art, and what colour walls it suits?

In previous years I solved this using stock photos of lounge rooms overlayed with simple CSS perspective transforms - to 'hang' the art on the wall.

However for the 2017 show I've upgraded the site to use the new A-Frame framework. I think this presents a great case study of using Virtual Reality for non-gaming. Virtual Reality excels at giving people a sense of scale, which (hopefully) will really help in deciding to buy art online. Art galleries are also a great application for Web VR, as paintings use only simple geometry which is easy for lower-end devices to handle.

Check it out at or see the screenshow below:

As a bonus, I've also Open Sourced the A-Frame collision detection component I developed to prevent the user walking through walls.

Thursday, February 9, 2017

Metawidget Ported to Angular 2

Metawidget development has slowed lately, thanks to two factors: the framework itself is very mature; and I've been consumed by my startup.

However, thanks to the Open Source community others have taken up the mantle. I look forward to integrating their work into the main branch in the future! For now, keep an eye on:

In addition, I'm still doing small changes and fixes as they come up.

Thursday, August 11, 2016

Metawidget and React

Congratulations to the University of Technology, Sydney's Metawidget Team.

For their first semester Software Development Studio project, they prototyped a React version of Metawidget and demonstrated retrofitting it into an existing application to deliver significant reductions in error-prone, boilerplate code.

Monday, July 18, 2016

500 on Air

I was interviewed on ABC Radio 612 Brisbane about our online 500 card game website.

Here's a link to the audio from the show.

Thursday, July 7, 2016

Wealth Projector featured in Queensland Country Life

Congratulations to AgriHive Wealth Projector for their write-up in Queensland Country Life:

"I think this is the direction we’re heading in - this type of thing will be important as an advocacy tool... [farming businesses] all believe in this."

Thursday, May 5, 2016

Metawidget: associating EventListeners with widgets

I was recently asked how to "associate further rules with widgets, depending on the populated data [when using the pure JavaScript Metawidget]". The answer is to use a WidgetProcessor. Here's a complete example:

<!DOCTYPE html>
      <script src="lib/metawidget/core/metawidget-core.min.js" type="text/javascript"></script>
      <div id="metawidget">
      <script type="text/javascript">

         var mw = new metawidget.Metawidget( document.getElementById( 'metawidget' ), {
            inspector: new metawidget.inspector.CompositeInspector( [
               new metawidget.inspector.PropertyTypeInspector(),
               new metawidget.inspector.JsonSchemaInspector( {

                  // Insert custom attribute into the metadata

                  properties: {
                     surname: {
                        disabledUnless: 'firstname'
               } ) ] ),
            appendWidgetProcessors: function( widget, elementName, attributes, mw ) {

               // Watch for custom attribute, and add an EventListener

               if ( attributes.disabledUnless !== undefined ) {
                  var triggerWidgetId = metawidget.util.getId( 'property', { name: attributes.disabledUnless }, mw );
                  var triggerWidget = document.getElementById( triggerWidgetId );
                  triggerWidget.addEventListener( 'keyup', function() {
                     widget.disabled = ( triggerWidget.value === '' );
                  } );
                  widget.disabled = true;
               return widget;
         } );

         mw.toInspect = {
            firstname: '',
            surname: ''