Distroverse -- more than just a crappy name

… though not yet much more.



I’ve been working on a universal virtual reality client (using jME) for the last few months in my spare time, and I’m now ready to announce an incomplete, extremely rough version 0.01.  It’s hosted at



http://github.com/dreish/distroverse/



where you can browse and laugh at the source code online, clone the git repository, or download any version you like as a tarball.  Be warned, if you decide to run it: there’s really nothing to look at right now except display glitches and missing features.  This project is strictly about infrastructure at this point; I’m trying to design a single client that can be used for any VR site or 3D game, networked or not (or strictly speaking, 2D app, for that matter).  If I included a screenshot in this post, you would think I was joking, so I would rather you read the protocol idea, and if it sounds interesting, look at the code.  I recommend version 0.01, since that’s what I’m announcing today, at:



http://github.com/dreish/distroverse/tree/v0.01



I started thinking about this subject a few days after the first iPhone keynote in early 2007, which led me to Jeff Han’s TED talk on multi-touch, which led me to Kurzweil and futurism in general.  I had checked out Second Life a few months earlier, and I was having a hard time drawing a continuous line from Second Life to any reasonable futuristic vision of virtual reality, so that got me thinking about how I might design such a system, and how I would address all the shortcomings that bothered me about Second Life.



I kept going around in circles on the following problem: I wanted the system to be able to transmit fractal landscapes with minimal information (i.e., just the parameters – random seeds, or coefficients to a generator function), but I didn’t want to load up the client with a ton of landscape generators and have to keep publishing a new version of the client every time I had an idea for a new type of landscape (to say nothing of how cumbersome it would be for people with ideas who aren’t fortunate enough to be me).  In fact, after a few weeks of long walks spent thinking about this, I couldn’t even settle on a set of shapes that planets (or non-planet-like planes of existence) could be allowed to have.



Finally I realized that the solution is to do it this way:





client     


connects to
>        server

client   
requests "proxy"
>    server

client      <
sends proxy
        server

(A "proxy" in this context is some arbitrary JVM bytecode that can run
in a drastically restricted sandbox and that functions as follows:)

    local computer        Internet    remote computer
/
/    /
/      /
/

client  <===>  proxy  <
>      server
          ^                    ^
          |                    |
DVTP: Distroverse Transfer    +-- Custom per-site protocol is
Protocol: simple, general,        whatever is appropriate for this
relatively high-bandwidth.        site.


The key is to specify a protocol that the client uses to communicate with _another local program_, which in turn communicates with the server.

So the project is the standard client, Distroverse Viewer (which I'm writing in Java and licensing under the GPL), some off-the-shelf proxies and useful proxy base classes, and one or more example servers. Everything is GPL'd except the classes that make up DVTP itself (and a handful required supporting classes), which are under the LGPL, so that if some fool wants to make a proprietary proxy, they may do so.

I've got some extremely simple, broken demos at this point: I've punted on movement -- all objects currently bob and weave in a fixed way.  The design for actual movement is there, but not yet the code to implement it in the client.  I haven't even begun to implement user input. There's no text.  I'm still using jME 1.0 because I didn't stumble across the still-alive part of this site until I was around halfway through to v0.01.  It's all pretty ridiculous.  I've been focusing on the infrastructure: scalable multiplexing networking code (I'm trying to write everything with our glorious many-core future in mind), servers, a simple pass-through proxy, and getting _something_ remotely resembling my shapes to show up on the display.

I should point out that I've never written a GUI app or anything 3D before, and that this is my first time writing anything in Java aside from a warmup digital clock app.  (It's admittedly not my favorite language, but I think I made the right choice all things considered.)

My next tasks, as laid out in the top-level TODO file where I keep track of what I'm working on, are to switch to the latest jME, add textures, add a way of morphing existing shapes, add user input, and a few other things.

I want to get feature-complete as quickly as I can so I can move on to the more interesting problem of designing a good multi-user server with in-world editing.