This a list of selected projects and experiments. Click on an item to see a description and further links.
Experiments
RavenJS
Porting a 3D PC RPG to the browser
Nov 2011
With WebGL arising, the question was whether we could
actually provide a plugin-free 3D experience in the browser.
To this point, WebGL demos were mostly mere tech-demos – but
what about real content, exploring a world in first person
view?
To test this, I ported several levels of a famous triple A
Computer game to the browser.
More: See Video - Read post
CSS Shader Playground
Live edit and share CSS Shaders
Nov 2012
In 2012, CSS gains the ability to apply GLSL shaders to DOM
nodes. Time to see how far one can go…
This experiment uses requestAnimationFrame to dynamically
apply vertex
and fragment shaders via data-URI to a regular DOM node.
Sadly, support for CSS shaders was removed in 2014
due to security concerns.
More: View code (GitHub)
Shooting At Balls
A 3D shootout game utilizing various bleeding-edge HTML5
APIs
Dec 2012
This project used to serve as a testing ground for new
HTML5 APIs like GamePad, WebAudio, pageVisibility, FullScreen and PointerLock APIs, for patterns like Component-Entity-Architecture and Object-Pooling and for sub-projects like
Decoupled-Input and InfiniteGround.
But, it’s also quite fun!
More: Run experiment - View code (GitHub)
Surf in Style
Browsing a website inside of a 3D scene, or: I put a
computer
in your computer
Jul 2013
WebGL is not only for games – it can fundamentally change how we interact with content delivered via the Web.
This is more of an artistic experiment, but the
initial question behind this was if one could seamlessly
blend traditional HTML and user interaction into an 3D WebGL
scene.
More: Run experiment - View code (GitHub) - Read blog post
Projects
IDBWrapper
A wrapper for the IndexedDB HTML5 offline storage API
IndexedDB is the new standard for offline persistence, but
the API is not very pleasant to use. This wrapper makes
using IndexedDB easier, while still providing access to
all the core API's features.
More: View code (GitHub) - Read post
AMD-Feature
Cross-target development with AMD modules
Handling cross-target development and deployment gets more and more important.
AMD-feature helps achieving this by dynamically loading the right implementation for a given feature at runtime, as well as creating a specific build just for one platform. No more code-branching inside of a module, but nicely organized files instead.
You might also want to read Alex Sexton's article about high performance deployment over here.
More: View code (GitHub)
Decoupled-Input
User input handling done right
Loose coupling and task separation are common concepts – but are often missing when it comes to user input handling. When high performance and 60FPS are the goal, this is especially painful.
Decoupled-Input separates input listeners from handling logic, comes pre-built with listeners for keyboard, mouse, GamePad and Speech API, allows binding changes during runtime, and handles PointerLock and FullScreen.
More: Read Post - View Code (GitHub)
farbs
Minimal dependency-free application setup
A clean separation between UI components and application logic doesn't need a huge framework; it can be done in a few lines of plain JavaScript, without the help of any libraries.
To prove this, I created farbs, which does that in 948 bytes of code (457 bytes via gzip). It allows a declarative UI set up, late and lazy event binding and module communication via Pub/Sub.
I successfully introduced this approach in a high-traffic mobile website.
More: View Code (GitHub)
storehouse
A persistent data store implementing the dojo/store API
In version 1.6, the Dojo Toolkit introduced the new Object Store, and my storage providers that were part of the official pre-1.6 builds are not compatible with the new API. But - Dojo no longer ships a persistent solution. Storehouse fills this gap, providing a persistent multi-backend solution that favors the IndexedDB engine.
Storehouse is fully CLA covered to provide maximum IP protection.
More: View Code (GitHub)