View spark-lut.sca
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] |
View spark-batch-export.sh
#! /bin/bash | |
# export all arproj found in sub directories. e.g. you want to export several projects in one folder | |
for i in */*.arproj | |
do | |
echo "============================" | |
/Applications/Spark\ AR\ Studio/Spark\ AR\ Studio.app/Contents/MacOS/sparkTerminalAppleMac export "$i" -d ./ | |
echo "============================" | |
done |
View batch-resize-webm.sh
# Batch encode webm files in a directory | |
for i in *.webm; | |
do | |
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}" | |
done |
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()) |
View convert-audio.sh
#! /bin/bash | |
# This command converts audio according to the specifications listed in the Spark docs: | |
# https://sparkar.facebook.com/ar-studio/learn/documentation/docs/audio | |
# mono m4a, 44.1kHz sample rate, 16-bit-depth resolution | |
# Usage: | |
# convert-audio.sh 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 |
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 | |
*/ |
View backup-github.sh
#!/bin/bash | |
# 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 https://gist.github.com/darktim/5582423 | |
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) |
View ShadowShader.shader
Shader "ShadowShader" { | |
Properties{ | |
_Color("Main Color", Color) = (1,1,1,1) | |
_MainTex("Base (RGB)", 2D) = "white" {} | |
_Cutoff("Cutout", Range(0,1)) = 1.0 | |
} | |
SubShader{ | |
Pass{ | |
Alphatest Greater[_Cutoff] SetTexture[_MainTex] |
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`). |
NewerOlder