Temporal Ninching

[Semi-relevant link: JACK2002]

I've worked on several products at Microsoft - Liquid Motion, Vizact 2000, PowerPoint 2002 and InfoPath 2003. InfoPath has had the most customer impact, but I think I had the most fun working on Vizact.

Liquid Motion was a Java-based animation authoring tool and runtime that was started when my team was a small Java startup in San Francisco named Dimension X. When acquired by Microsoft we kept working on the product and released it in 1998. It was roughly comparable to Macromedia Flash – animations in a box on a web page.

As a follow-up, we started "Liquid Motion 2000" code named "Riptide", which was eventually sucked into the Office org and branded "Vizact". Whereas Liquid Motion animated "within the box" on a web page, Vizact animated any element on the page (think: Macromedia Dreamweaver) using DHTML. We worked with the Internet Explorer team to push some animation behaviors into the IE code base, known as HTML+TIME. This eventually evolved into part of the SMIL 2.0 W3C standard.

I worked on the "authoring tool" side of Vizact. It hosted the IE display engine and used it as an editor. This was pretty cool – IE provided a lot of editability of HTML "for free". In fact, it took just a few hours to get things like a "Bold" button hooked up. As the editing model of Vizact evolved, though, things got more complicated. Which leads to the title of this post.

"Ninched" refers to a mixed state. For example, if you select some bold text in a word processor, the "B" button on the toolbar should show as selected ("latched"). If you have normal text, it should show as unselected. But if the text you have selected is both bold and normal, the state is referred to as "ninched". In the old days, toolbars would actually show an intermediate state for this. (Nowadays, most apps don't bother with this, for several reasons: it’s slow to actually crawl over the entire selection and inspect every character’s styles, and most users don’t understand the mixed state - or care anyway. Apps shortcut and just look at the first character.) Implementing true ninching is relatively straightforward: when selection changes, inspect the selected range and report either "true", "false", or "ninched". And for basic cases we could actually just ask Internet Explorer to do it for us.

But Vizact wasn’t a word processor – it was an animation tool. The basic model for styles was that you could not only select some text and make it bold, you could select text and select a range of time on the timeline (say 5-10 seconds), then apply bold. So you’d end up with text that was only bold between 5 and 10 seconds. Scale this concept to all sorts of styles like color and visibility, and you have an animation authoring environment.

But what should the toolbar show? Now it not only needs to look at the current text selection range to determine if it’s bold or not, it needs to intersect that with the currently selected time range (say, 15-25 seconds) and determine if there is a “boldness” animation behavior applied during that time range. Hence, "temporal ninching".

So more strictly, normal ninching is "spatial ninching", and the full algorithm provides for "spatiotemporal ninching." It ends up being the same algorithms used for spatial ninching with an extra dimension thrown into the mix, and we had a fairly simple concept of time (we punted on across through dependent or triggered timelines), but I’m still proud of that work.

On the name Vizact: product naming appears to be done by paying someone lots of money to put various related terms into a blender to generate possible names, then asking a focus group to rank them, and finally seeing which names aren’t already taken or can be purchased for cheap. Vizact survived that filter. I actually liked the name, but it does sound like a product from a large pharmaceutical manufacturer. "Are you suffering the effect of web page dysfunction? Talk to your doctor about Vizact!" (Some of the other candidate names sounded more like venereal diseases Vizact might treat than a real product name.)