henry lowengard's
V A P O R   P A I N T

[a fish schematic]
Vapor Paint is a program which attempts to bring the flavor of drawing in "traditional media" such as pastels, charcoal, pen and ink, and gouache to the animated world. It consists of a modeler and integrated renderer, which can produce arbitrarily sized bitmaps in various formats. Vapor Paint was started in 1989 and currently runs only on Amigas, although a re-write of the renderer in portable form has been usable since 1996.

Vapor Paint maintains a tree of actions which is traversed by a renderer during the rendering process. The colors, pen types, field moves, special processing and gestural information are all nodes in this tree, and can easily be edited by the modeler. These instructions are organized into Sequences, which are like cel levels in traditional animation, and key frames within those sequences.

The basic data structure for gestures is a sequence of six-dimensional floating point vertices, to encode X, Y , Z, Width(R), Pressure(M) and Time Stamp(S). Drawing is conceptually done into a virtual two-dimensional floating point canvas.

All drawing color is specified as bit RGBT (T is opacity), with 16 bit values per channel (64-bit color). The renderers reduce this as necessary, either to 1-bit, 8-bit monochrome or 24-bit color.

Vapor Paint animates by painting a frame one gesture at a time from information linearly interpolated out of the tree's key frames. Color and gestural information, as well as the field of view are the parameters which are interpolated. Key frame timing can be non-integral, and the rendering process can motion blur the frames by generating them at fractional times and averaging them.

Related keyframes are generally created by duplicating a frame and redrawing the gestures to new positions. The redrawing routine uses the timing of the redrawing gesture to reposition the underlying vertices of the new gesture. Other editing facilities allow for reversal of the gesture's vertices order, scaling, smoothing, and changing the Width and Pressure information in a straightforward way.

The Rendering "pens" allow for many styles of shading, blending and filling, which, although analogous to "real-world" operations, leave a number of digital artifacts which gives Vapor Paint pictures a very distinctive look.

The Vapor Paint modeler is generously larded with hooks to the macro language AREXX. This provides extensive macro capabilities, allowing interprocess communication, algorithmic structure modification and other useful features which would otherwise clutter up the core code. There are AREXX routines which convert the Vapor Paint tree into SGI's Inventor 2.0 files VRML 2.0 and Renderman rib files. The (Amiga) renderer can invoke scripts during the rendering process to help convert the frame into a specific graphic format or pass the current bitmap to an external program to be altered.

There are two features built into the Vapor Paint modeler which help to sketch and lay out the animation. First, simple 1-bitplane sketches can be drawn, saved and allowed to pop up on the screen for reference. Second, there are "Note Vectors", which are used for laying out the drawing and coordinating timing. They are not "seen" by the renderer, but can be scaled and animated in wireframe by the modeler. They are also used as spines in some deformation operations.

Note that Vapor Paint does not use bitmaps as source material at all. Every mark on the screen is the result of a gesture.

Vapor Paint has been used to make animation for public access television, an interactive laser disk installation by New York media artist Nik Williams at the International Expo in Taejon, Korea, large still frames for various art shows, audio files for a CD recording, VRML models for France Telecom at Telecom 95 and in a new MTV video for Asphodel Records, directed by Nik Williams.

Vapor Paint on Amiga is completely written in MC68000 Assembler and has its own memory management facility, user interface routines, hypertext help facility and line drawing routines. The program, complete with all the help files, some examples and AREXX routines, and a stripped down operating system fit uncompressed and ready to run on an 880K floppy. It can run in less than 1M of memory on all models of Amigas, under all operating systems from 1.2 on. The executable itself is about 190K.

A portable C-language renderer, which works off of control files created by the modeler, has been written and is being actively worked on. This renderer has been compiled for operation on SGI Irix, NeXTStep, Windows NT platforms, Linux, Mac OSX and I bet other platforms that I've forgotten.

The Vapor Paint renderer was upgraded in 2002 to allow bit mapped images to provide color information in some of the rendered gestures. If the images are numbered sequentially, they can be loaded in synch with the frame that is being rendered. Options allow an transparency mask to be synthesized from the image, and for the image to be colorized with the current pen color.

The old Amiga Vapor Paint program runs nicely under Amiga emulation using UAE on several platforms. I'm of course thinking of ways to port over the modeler to a more modern platform.

V a p o r o u s   I m a g e s   &   A n i m a t i o n s

Good ol' images
A static Fishie
A frame from The Sky

Screenshots of inventor 3D objects which had its origin as a Vapor Paint picture.
The Original Vapor Paint picture
Its wireframe view
Closeup of the previous
View #1
View #2
View #3
Gif Anims done with Vapor Paint
T drops his hat
Girl looks that-a-way
Some image colored frames from the little video below at their true rendered size.
Mpeg Anims done with Vapor Paint
Vapor Paint Logo
I seem to specialize in reanimating paintings...
The Scream (Munch)
Weeping Woman (Picasso)
New colored image video (MP4, super tiny)

D o c u m e n t a t a i o n

Vapor Paint has its own hypertext-like help system - which I've edited and converted to HTML here:
Vapor Docs

[Back to the main page]
Henry Lowengard, jhhl-at-panix.com /324 Wall St. Apt 5 / Kingston NY 12401/

© 2017 Henry Lowengard