Between June and August 1996 I held an internship position at Silicon Graphics, Inc., a high-end computer graphics workstation manufacturer. I worked in the Cosmo group, helping to develop the PC version of Cosmo Player, SGI's VRML 2.0 browser.
The work I did can be categorized into three major projects:
Of course, I also found some time to get out of the office...
doomToVrml2 (available from SGI's VRML website) is a ground-up rewrite of WadToIv, my Doom to Open Inventor converter. This was a warm-up project so I could learn about VRML 2.0 while providing a (hopefully) useful tool to the VRML community.
There were several goals in the design of doomToVrml2, not the least of which was to eliminate WadToIv's dependency on Open Inventor. In addition, as VRML 2.0 allows complex behaviors to be defined in the scene graph, we wanted doors to open and close as they do in the real game. Finally, we wanted the output to match the game's graphics as closely as possible, to allow people to design environments using Doom editors and then, expecting a very close correspondence, convert them to a Web-savvy 3D graphics format using doomToVrml2.
doomToVrml2 runs on the PC and SGI platforms today, and porting it to other platforms should be as straightforward as a recompile. It implements moving doors in the output world; click on a door and it rises up for a few seconds, then slides down to its initial position. Finally, unlike WadToIv, it uses the BSP tree information contained within the Doom levels. This ensures that complex floor shapes are rendered correctly in the output world.
My first "real" project was to implement the MovieTexture node in the PC player. The MovieTexture node allows a video-only MPEG-1 movie to be used as an animated texture map on some piece or pieces of geometry in the scene; in addition, it allows an MPEG-1 Systems stream (both video and audio) to be used as an audio source in the world.
One of the major obstacles along the path to implementation was that I could not find a freeware MPEG library which supported decompression of both video-only and systems streams. The closest thing I found was a set of three unrelated programs: an MPEG-Systems demultiplexer (to extract separate audio and video streams from a single MPEG) and two decompression utilities for supporting audio and video MPEG streams separately. Ultimately I reworked this software into a thread-safe MPEG decompression library, meaning that multiple MPEGs could be decompressed simultaneously in the background while the VRML browser maintained interactivity with the user.
In order to implement the MovieTexture node, I had to reorganize the Texture hierarchy (ImageTexture, MovieTexture, and PixelTexture), because previously ImageTexture had been the only implemented node of the three. One indication of whether this redesign was successful was the fact that it took one of the other engineers about three hours to implement the final texture node, PixelTexture, given the new class hierarchy.
The External Interface for VRML is designed to allow an external Java program (for example, an applet) to control the VRML browser. There are several reasons why this functionality is useful:
I assisted in the early design and implementation of the External Interface while at SGI. This included:
The External Interface was undoubtedly the most challenging project I worked on while at SGI (even given my prior experience with a similar problem). My only regret about my internship experience was the fact that the Cosmo Player implementation of the External Interface was not stable when I left. I am still not convinced that all of the problems we saw were ours; I suspect there are at least a few bugs in Netscape's Java implementation relating to native methods making method calls back into Java.
Most weekends I went running either at the beach or at Shoreline, a wildlife preserve at the northern edge of Mountain View. Shoreline was nice because it was so flat; there were no hills to tire you out, so you could just keep going and going. I also ran on the beaches at San Gregorio, Santa Cruz, Monterey, Sand City, and Santa Barbara. Sand City's beach was the best for taking a long run (the stretch I found was at least 6.5 miles long); Santa Barbara's was the best for a beautiful view and climate.
![]() Alex, sporting the Vismod t-shirt | ![]() Yours truly, at Muir Beach |
![]() Hamming it up at the Golden Gate Bridge |
![]() Pencigraphic composite of the mantel in the "social room" in the main house (done with the help of Steve Mann) |