Writing

  1. Bandcamp wrapped 2024 As a personal experiment, I cancelled Spotify last year and set a target of buying one album per month.
  2. Emission and bloom Explains the relationship between emission and the bloom post-processing effect, and how to use them effectively in realtime 3D scenes.
  3. Don't use Data URLs in 3D models Other ways of packaging glTF files are unambiguously better. The “glTF Embedded” method should be avoided except for debugging.
  4. Choosing texture formats for WebGL and WebGPU applications A supplement to web.dev's “Choosing the Right Image Format,” adding context for texture formats used in WebGL and WebGPU development.
  5. Apps defaults in 2024 Lists of apps are sweeping the nation! Here's mine.
  6. Joining CARTO Some personal news: I'm joining CARTO! Founded in 2012 as “CartoDB”, CARTO originally made open source tools for building maps on PostGIS…
  7. Generating glTF files programmatically While it's far more common to create 3D models in artist-friendly software like Blender, there are times when we want to create a model in code. For example…
  8. Healthy expectations in open source Most open source projects choose licenses from a common list, while support and maintenance expectations are not standardized. Usually those expectations are not stated at all. That's a loss — …
  9. Publishing WebAssembly modules with AssemblyScript WebAssembly (WASM) is a compilation target for other programming languages. It runs in many computing environments, and it runs fast. Typically a WebAssembly module begins life as C/C++…
  10. Improving API documentation in TypeScript (Part 1) The JavaScript and TypeScript ecosystems represent the largest community of software developers working professionally today.[1] The prevailing package repository, npm, is the largest such registry…
  11. Converting glTF PBR materials from spec/gloss to metal/rough When the Khronos Group ratified glTF 2.0 in 2017, the format included a PBR shading model based on the metallic roughness (“metal/rough”) workflow, and an extension (KHR_materials_pbrSpecularGlossiness) for…
  12. Compressing LUTs with KTX 2.0 “Lookup tables (LUTs) are a technique for optimizing the evaluation of functions that are expensive to compute and inexpensive to cache, ... By precomputing the evaluation of a function over a domain…
  13. Writing volumetric refraction in glTF 2.0 With its release in 2017, glTF 2.0 created a baseline metal/rough physically-based-rendering (PBR) material workflow — the first of its kind to become widely-adopted in web and realtime applications…
  14. Personal updates & leaving Google Six years after joining Google to work on Project Sunroof, and later Environmental Insights Explorer, this will be my last week at the company. Enough essays have been written about burnout in the…
  15. Scotland bikepacking NEW POST, OLD TRIP: The past year hasn't been one for travel, thanks to COVID-19. But in reminiscing about going places, I've finally found the motivation to write about a trip I took two years ago…
  16. Projects up for adoption: A-Frame Extras and Physics System I've spent some time unsure what to do with a couple of my older projects, A-Frame Extras and A-Frame Physics System, and finally decided it's time to step back from developing both. They're each…
  17. Color management in three.js A particularly clear example of gamma correct (left) and incorrect (right) rendering. Source. Updated November 9, 2022: With three.js ≥r139, I contributed a more comprehensive guide to color…
  18. Unpaid work (visualization) Week 14, 2020 of #MakeoverMonday. I intended for this to be a bit of practice with different styles of visualization; it ended up being mostly a deep-dive into dataframe.js, which I hadn't used before…
  19. Hard drive backups I recently changed how I'm storing personal files and backing up my computer. As background, I use an older 2012 Apple laptop with a 500GB SSD, and that hard drive has been ~90% full for a while. I've…
  20. Three.js NodeMaterial introduction Node-based materials have been an experimental part of the three.js library for a few years now under three/examples/js/nodes/, thanks to the efforts of Sunag. There are great examples, but…
  21. Creating animated glTF characters with Mixamo and Blender **End result:** Rigged glTF 2.0 character with multiple animation clips. Mixamo, by Adobe, provides an easy way to get started with character animation: Automatic character rigging. *Upload a 3D…
  22. Creating a nav mesh for a WebVR scene This tutorial shows how to create a navigation mesh for a scene with Blender, and use it in A-Frame to do basic pathfinding. For the short version, watch this video at 6:08. The key parts are covered…
  23. Exporting glTF 2.0 from Maya LT Updated Febrary 2018: The tools available for glTF have changed since last June, and I've tried to update things accordingly. Unfortunately there is still no direct path to glTF from Autodesk tools…
  24. On immigration, refugees, and faith The executive branch of the U.S. government has just stopped entry of refugees for 120 days, and stopped admission of Syrian refugees…
  25. Gamepad support on the Web Overviews state of the Gamepad API on the web, as of early 2017.
  26. NPM version bumping and extra files NPM has a handy little feature for bumping the versions on your packages, and it works like this: npm version [major | minor | patch] Want to run tests first, minify your code, and only publish the…
  27. What can a technologist do about climate change From an essay by Bret Victor (@worrydream), on how the tech community "can contribute to tech and/or policy solutions," and why this is important — You cannot calibrate your sense of what’s valuable…
  28. Using ES6 generators with callback-based libraries ES6 introduces generators (and yield expressions) to JavaScript. Kyle Simpson has written a nice introduction to generators, if you're looking for more about how they work. They're a very welcome…
  29. Recommendations A short list of things I enjoy, to be updated at undisclosed and inconsistent intervals.
  30. Grayscale CSS and bookmarklet A bit of code that can be used to convert any webpage (or part of a page) to grayscale.
  31. Using an iPhone with Google Cardboard I haven't heard much about iPhone users trying Google Cardboard, so this post is basically my way of saying "Oh hey, it works." And yeah. It does, assuming you have a large enough screen for a…
  32. Getting involved in Open Source Software Contributing to open source is something I am improving at, along with finding enjoyable ways to get involved. I’m not where I want to be yet, but here are some things that have made the process…