Skip to content

Instantly share code, notes, and snippets.


Josh Beckwith positlabs

View GitHub Profile
vec4 getLutColor(vec2 rg, float sliceNo, std::Texture2d colorLutTex, vec2 gridSize) {
vec2 pixelSize = 1.0 / colorLutTex.size;
vec2 scale = 1.0 / gridSize;
float row = floor(sliceNo * scale.x);
float col = sliceNo - row * gridSize.x; // mod(sliceNo, gridSize.x);
vec2 colorLutCoords = (vec2(col, row) + rg) * scale;
// offset by 0.5 pixel and fit within range [0.5px, width-0.5px]
#! /bin/bash
# export all arproj found in sub directories. e.g. you want to export several projects in one folder
for i in */*.arproj
echo "============================"
/Applications/Spark\ AR\ Studio/Spark\ AR\ export "$i" -d ./
echo "============================"
positlabs /
Last active Sep 22, 2020
Lossless batch encode and resize command
# Batch encode webm files in a directory
for i in *.webm;
ffmpeg -y -i $i -b:v 0 -crf 30 -pass 1 -an -f webm /dev/null
ffmpeg -y -i $i -vf scale=640:640:force_original_aspect_ratio=decrease -b:v 0 -crf 30 -pass 2 "_${i}"
positlabs / framePulse.js
Created Jul 18, 2020
Spark frame pulse
View framePulse.js
const R = require('Reactive')
const Patches = require('Patches')
const Animation = require('Animation')
let frame = 0
const td = Animation.timeDriver({durationMilliseconds: 1, loopCount: Infinity, mirror: false})
td.onAfterIteration().subscribe(() => {
frame ++
Patches.inputs.setScalar('currentFrame', frame)
Patches.inputs.setPulse('frame', R.once())
positlabs /
Last active May 6, 2020
FFMPEG audio conversion for Spark AR
#! /bin/bash
# This command converts audio according to the specifications listed in the Spark docs:
# mono m4a, 44.1kHz sample rate, 16-bit-depth resolution
# Usage:
# myaudio.mp3 converted.m4a
# Notes:
# Always use m4a for output file type
# Change "64k" to a higher value to improve bitrate/quality. e.g. 96k 128k 192k
positlabs / screen-plane.js
Created Jun 20, 2019
Spark AR script to resize plane to match screen size
View screen-plane.js
Resize plane to match screen size
const Scene = require('Scene')
const camera = Scene.root.find('Camera')
const plane = Scene.root.find('plane0')
plane.width = camera.focalPlane.width
plane.height = camera.focalPlane.height
View renderer-client.js
The client lib for the generator will override some browser methods in order to
generate video or gifs of the page that it runs on. This guarantees that frames
won't be dropped, and the framerate will be consistent.
Global method overrides
- setTimeout
- setInterval
- requestAnimationFrame
Set currentTime of videos
positlabs /
Last active Jan 7, 2019 — forked from rodw/
A simple script to backup an organization's GitHub repositories, wikis and issues.
# A simple script to backup an organization's GitHub repositories.
# NOTE: if you have more than 100 repositories, you'll need to step thru the list of repos
# returned by GitHub one page at a time, as described at
GHBU_BACKUP_DIR=${GHBU_BACKUP_DIR-"github-backups"} # where to place the backup files
GHBU_ORG=${GHBU_ORG-"<REPLACE_ME>"} # the GitHub organization whose repos will be backed up
# (if you're backing up a user's repos instead, this should be your GitHub username)
GHBU_UNAME=${GHBU_UNAME-"<REPLACE_ME>"} # the username of a GitHub account (to use with the GitHub API)
positlabs / ShadowShader.shader
Created Jan 20, 2018
Unity shader for rendering shadows onto a transparent surface. Useful for augmented reality.
View ShadowShader.shader
Shader "ShadowShader" {
_Color("Main Color", Color) = (1,1,1,1)
_MainTex("Base (RGB)", 2D) = "white" {}
_Cutoff("Cutout", Range(0,1)) = 1.0
Alphatest Greater[_Cutoff] SetTexture[_MainTex]
positlabs / LazyPromise.js
Last active May 19, 2017
LazyPromise is a cachey promise creator that returns a function. It's good for lazily running things only once.
View LazyPromise.js
LazyPromise is a cachey promise creator that returns a function.
It's good for lazily running things only once.
Promise creation is deferred until the first call.
Construct using same signature as a regular Promise (except it doesn't require `new`).