Here is the overview of the work that I recently sent out internally.

I started out with a pure-functional scripting interface, but it very rapidly 
became imperative, and it is in heavy flux.  The sample scripts do capture the 
general "flavor" that I want this to have -- I think it will be easy enough to 
get interesting things happening that it will still tempt people who might be a 
little hostile to working in a Lisp.

------------------------------------------

Here is the first preview of the general purpose VR scripting environment I 
have been working on.  There isn’t anything exciting to look at, but if you 
squint real hard you can see where it might be going.  After I get a bit 
farther along, we can build a PC version as well for cross platform support.
        
Motivation:

Doing VR GUI development in the native apps is unpleasant – you can gut it out 
in C++ with our current interfaces, but the iteration times and code structure 
don’t make it a lot of fun.

In-editor prototyping is nice in Unity, but actual on-device testing cycle 
times are terrible, and you wind up with all the bulk of Unity and poor access 
to the native VR features like TimeWarp layers.

With app signing, we have no way for developers to casually share work with 
each other or limited communities.

My solution is to support development of VR applications in a scripting 
language with several modes:

“Web like”, where the script is downloaded from the net for each execution and 
run by a single signed app that we provide (NetHMD).  Fully specified by an 
app-scheme URI, this allows VR experiences to be launched directly from web 
pages or app-links on Facebook, which I think is VERY powerful – read about how 
great something is while browsing on your phone, then just click the link and 
get the “insert into HMD” dialog and jump right there.  VR scripts can link to 
other VR scripts without leaving VR.  There is no direct monetization here, but 
IAP can eventually be supported.

“App like”, where the script is bundled into a conventional apk to be 
distributed through the store, and the scripting is simply used as a more 
effective development environment for some classes of applications.

“Remote development”, where the script is actually executed in an IDE on a PC, 
communicating with NetHMD over a TCP connection.  This allows sub-second 
code-change to VR change iteration cycles, and the use of a debugger.  There 
might also be a use for a related mode where a central server directly drives 
one or more clients.

Where it will win first:

My “reference application” is the linking of multiple panoramic photos with 
text and audio annotations.  This is a completely obvious application that is 
not performance sensitive, and even a non-programmer could copy-paste-modify 
the simple script for this to make a high quality experience.

Once I hook up an ExoPlayer interface, this will completely subsume what I 
wanted to accomplish with “experience files” – the addition of static prop 
models to panoramic video, linking between different videos, merging of models 
or panoramas with videos that aren’t fully panoramic (GoPro, etc), and so on.

Once I hook up the Social interfaces, this will make it much easier to build 
trivial “activities” for multi-user experiences – board games, card games, etc.

It is already a big help for basic graphics development work – being able to 
just position a few quads with a custom shader and iterate on the shader 
programming remotely without rebuilding is a huge win.

Implementation:

This will be controversial, and I will have a longer discussion about it, but I 
chose Scheme (a Lisp) for the scripting language.  If this all works out, we 
can eventually make C# and Javascript versions, but I have a bunch of reasons 
for going this way first.  I am using Racket http://racket-lang.org/ for the PC 
development environment, and Chibi Scheme for the embedded interpreter on 
Android.  Download Racket and walk through their quick-intro-with-pictures to 
get a feel for the language and you should be able to hack on the sample 
scripts I have been writing pretty quickly.  Note that Racket is a very 
extended Scheme targeted at desktop apps, the embedded version is just the 
basic standard.

All texture / model / sound resources are loaded and cached from network URI.  
For testing, you can just paste in any URI from a Google image search, which is 
convenient.  For an actual project development, dropbox should work fine.

I am favoring ease of development over performance, and it definitely won’t be 
suitable for a lot of tasks, but everything we have done with first party apps 
so far should be at least a candidate for development in this style once it is 
mature.

Everything is super-rough right now, and I keep thinking “one more day of work 
will clean it up better for people to look at”, but it is past time I at least 
get this on everyone’s radar.

<actual Android apk redacted -- it is too crappy to show the broader world 
right now>

Running it will load a default home script, which has links to a few test 
programs I have made.  The back button returns to the home page.

The sample scripts are at:

http://s3.amazonaws.com/o.oculuscdn.com/netasset/home.rkt
http://s3.amazonaws.com/o.oculuscdn.com/netasset/office.rkt
http://s3.amazonaws.com/o.oculuscdn.com/netasset/shader.rkt
http://s3.amazonaws.com/o.oculuscdn.com/netasset/spin.rkt
http://s3.amazonaws.com/o.oculuscdn.com/netasset/text-panels.rkt
http://s3.amazonaws.com/o.oculuscdn.com/netasset/reversi.rkt

You could edit them dawn-of-the-web style by downloading, editing, uploading 
someplace else, and sending a new intent to nethmd:

adb shell am start -d 
nethmd://s3.amazonaws.com/o.oculuscdn.com/netasset/shader.rkt

However, the preferred development strategy is to use the DrRacket IDE.  In 
addition to the scripts you are working on, download the following two files 
into the same directory:

https://s3.amazonaws.com/o.oculuscdn.com/netasset/vr.rkt
https://s3.amazonaws.com/o.oculuscdn.com/netasset/remote.rkt

Make sure you have your phone and PC on the same WiFi network, and they can 
ping each other.  Run the NetHmd app (which reports the IP address on the home 
page for convenience).  Open the script you want to work with in DrRacket and 
put the ip address in the last line, which looks something like this:
(remote "172.22.52.94" #f tic)

Hit ctrl-R or select the Racket->Run menu option to start execution.  NetHMD on 
the phone should change from the home screen to the test scene.  You can load 
and run other scripts, or restart the current one, without restarting NetHmd on 
the phone.  You can move around with the joypad during development.  Button Y / 
4-dot resets the view to the home position.

I am still figuring out exactly what the “standard library” should look like, 
and I’m sure it will go through incompatible changes, but I would be happy to 
support anyone interested in doing bleeding-edge experimentation with this.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to