Skip to content

Instantly share code, notes, and snippets.

View CodyJasonBennett's full-sized avatar

Cody Bennett CodyJasonBennett

View GitHub Profile
@CodyJasonBennett
CodyJasonBennett / index.ts
Last active May 31, 2023 07:59
WebGL 2 Compute via Transform Feedback
/**
* Matches against GLSL shader outputs.
*/
const VARYING_REGEX = /[^\w](?:varying|out)\s+\w+\s+(\w+)\s*;/g
/**
* Adds line numbers to a string with an optional starting offset.
*/
const lineNumbers = (source: string, offset = 0): string => source.replace(/^/gm, () => `${offset++}:`)
@CodyJasonBennett
CodyJasonBennett / Controls.ts
Created July 11, 2022 00:46
Simple accessible orbital controls
import { Vector3, Camera } from 'three'
// https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons
enum BUTTONS {
NONE = 0,
LEFT = 1,
RIGHT = 2,
}
const KEYBOARD_ZOOM_SPEED = 0.04
@CodyJasonBennett
CodyJasonBennett / index.js
Created August 5, 2022 03:26
KHR_parallel_shader_compile vs WebGL 2 fence-checking
import { GUI } from 'https://unpkg.com/[email protected]/examples/jsm/libs/lil-gui.module.min.js'
const canvas = document.createElement('canvas')
const gl = canvas.getContext('webgl2')
const ext = gl.getExtension('KHR_parallel_shader_compile')
const parameters = {
count: 1000,
series: false,
KHR: false,
@CodyJasonBennett
CodyJasonBennett / four.ts
Last active August 30, 2022 08:34
JS13K '22
import { mat4, quat, vec3, mat3 } from 'gl-matrix'
export class Object3D {
readonly matrix = mat4.create()
readonly quaternion = quat.create()
readonly position = vec3.create()
readonly scale = vec3.set(vec3.create(), 1, 1, 1)
readonly up = vec3.set(vec3.create(), 0, 1, 0)
readonly children: Object3D[] = []
public parent: Object3D | null = null
@CodyJasonBennett
CodyJasonBennett / four.js
Created August 12, 2022 20:38
four.js UMD
(function(E,I){typeof exports=="object"&&typeof module<"u"?I(exports):typeof define=="function"&&define.amd?define(["exports"],I):(E=typeof globalThis<"u"?globalThis:E||self,I(E.FOUR={}))})(this,function(E){"use strict";var I=1e-6,R=typeof Float32Array<"u"?Float32Array:Array;Math.hypot||(Math.hypot=function(){for(var r=0,i=arguments.length;i--;)r+=arguments[i]*arguments[i];return Math.sqrt(r)});function G(){var r=new R(9);return R!=Float32Array&&(r[1]=0,r[2]=0,r[3]=0,r[5]=0,r[6]=0,r[7]=0),r[0]=1,r[4]=1,r[8]=1,r}function j(r,i){var t=i[0],e=i[1],a=i[2],n=i[3],s=i[4],l=i[5],h=i[6],c=i[7],x=i[8],w=i[9],A=i[10],m=i[11],M=i[12],p=i[13],y=i[14],b=i[15],S=t*l-e*s,d=t*h-a*s,f=t*c-n*s,g=e*h-a*l,v=e*c-n*l,T=a*c-n*h,V=x*p-w*M,_=x*y-A*M,u=x*b-m*M,U=w*y-A*p,z=w*b-m*p,F=A*b-m*y,o=S*F-d*z+f*U+g*u-v*_+T*V;return o?(o=1/o,r[0]=(l*F-h*z+c*U)*o,r[1]=(h*u-s*F-c*_)*o,r[2]=(s*z-l*u+c*V)*o,r[3]=(a*z-e*F-n*U)*o,r[4]=(t*F-a*u+n*_)*o,r[5]=(e*u-t*z-n*V)*o,r[6]=(p*T-y*v+b*g)*o,r[7]=(y*f-M*T-b*d)*o,r[8]=(M*v-p*f+b*S)*o,r):null}function L
@CodyJasonBennett
CodyJasonBennett / vite.config.ts
Last active August 13, 2022 17:35
vite - glslx webgl2
import * as vite from 'vite'
import * as path from 'path'
import * as fs from 'fs'
// @ts-ignore
import glslx from 'glslx'
export default vite.defineConfig(({ command }) => ({
build: {
target: 'esnext',
polyfillModulePreload: false,
@CodyJasonBennett
CodyJasonBennett / index.js
Last active September 13, 2022 09:55
signals-react fix
import {
useRef,
useMemo,
// @ts-ignore-next-line
// eslint-disable-next-line @typescript-eslint/no-unused-vars
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED as internals,
} from 'react'
import React from 'react'
import { signal, computed, batch, effect, Signal } from '@preact/signals-core'
@CodyJasonBennett
CodyJasonBennett / index.jsx
Last active September 21, 2022 13:20
R3F cross-container context
import * as React from 'react'
import * as ReactDOM from 'react-dom/client'
import { render } from 'react-nil'
function traverseFiber(fiber, ascending, selector) {
if (selector(fiber) === true) return fiber
let child = ascending ? fiber.return : fiber.child
while (child) {
const match = traverseFiber(child, ascending, selector)
@CodyJasonBennett
CodyJasonBennett / polyfill.js
Created September 19, 2022 10:03
three WebGPU matrix polyfill test
function polyfills() {
THREE.Camera.prototype.clippingSpace = 'webgl'
THREE.PerspectiveCamera.prototype.updateProjectionMatrix = function() {
const near = this.near;
let top = near * Math.tan( THREE.MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom;
let height = 2 * top;
let width = this.aspect * height;
@CodyJasonBennett
CodyJasonBennett / index.html
Last active October 24, 2022 22:55
Holoplay WebXR FBO repro
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<style>
body {
margin: 0;
}