Skip to content

Instantly share code, notes, and snippets.

View robksawyer's full-sized avatar
🎯
Focusing

Rob Sawyer robksawyer

🎯
Focusing
View GitHub Profile
@robksawyer
robksawyer / custom_shader_example.js
Created November 18, 2022 11:58 — forked from oskarbraten/custom_shader_example.js
A three.js custom shader example
"use strict";
class MyCustomMaterial extends THREE.ShaderMaterial {
// constructor takes appropriate parameters.
// Default values using object destructuring (ES6)
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#Object_destructuring
constructor({
color = 0xffffff,
emissive = 0x000000,
@robksawyer
robksawyer / random.jsx
Created November 16, 2022 16:07
Here's a clever/clean way to randomly position geometry.
function Noodle() {
const { viewport, camera } = useThree()
const { nodes } = useGLTF('/worms-transformed.glb')
const [geometry] = useState(() => nodes[`noodle_${Math.ceil(Math.random() * 4)}`].geometry)
const [speed] = useState(() => 0.1 + Math.random() / 10)
const position = useMemo(() => {
const z = Math.random() * -30
const bounds = viewport.getCurrentViewport(camera, [0, 0, z])
return [THREE.MathUtils.randFloatSpread(bounds.width), THREE.MathUtils.randFloatSpread(bounds.height * 0.75), z]
}, [viewport])
@robksawyer
robksawyer / useFont.js
Created November 4, 2022 01:01
Simple helper to load a font with React Three Fiber
import { FontLoader } from 'three-stdlib';
import { useLoader } from '@react-three/fiber';
export const useFont = (src) => {
return useLoader(FontLoader, src);
}
@robksawyer
robksawyer / useIsoLayoutEffect.js
Last active September 13, 2022 04:48
A hook for checking the scroll speed with smooth scrollbar.
/**
* @file useIsoLayoutEffect.js
* Hook to suppress useLayoutEffect error on SSR.
*/
import { useLayoutEffect, useEffect } from 'react';
const useIsoLayoutEffect =
typeof window !== 'undefined' ? useLayoutEffect : useEffect;
import * as THREE from 'three';
(function () {
'use strict';
var root = this;
var has_require = typeof require !== 'undefined';
// var THREE = root.THREE || (has_require && require('three'));
@robksawyer
robksawyer / UnrealBloomPass.js
Created August 24, 2022 15:26
Unreal Bloom Pass with transparency.
import {
AdditiveBlending,
Color,
LinearFilter,
MeshBasicMaterial,
RGBAFormat,
ShaderMaterial,
Texture,
UniformsUtils,
Vector2,
@robksawyer
robksawyer / soap-bubble-frag.glsl
Created August 17, 2022 17:04
Soap bubble shader from http://otosatram.com/bubble.html (Bubbles on still soap (Blu blu))
precision highp float;
precision highp int;
#define SHADER_NAME ShaderMaterial
#define GAMMA_FACTOR 2
#define DOUBLE_SIDED
#define NUM_CLIPPING_PLANES 0
uniform mat4 viewMatrix;
uniform vec3 cameraPosition;
#define TONE_MAPPING
#define saturate(a) clamp( a, 0.0, 1.0 )
@robksawyer
robksawyer / rotation-example-slerp.js
Last active August 15, 2022 11:16
An example of how to convert Euler to Quaternions and use slerp for rotation.
// Rotations
const step = 'q1';
const cameraRotations = {
q1: {
x: 0.75,
y: 0,
z: 0,
},
q2A: {
x: -0,
@robksawyer
robksawyer / audioLoading.jsx
Created August 13, 2022 19:07
This snippet shows how to load audio with Three JS
const [sound, setSound] = useState()
const [listener, setListener] = useState()
const [analyser, setAnalyser] = useState()
const [data, setData] = useState(1)
// load a sound and set it as the Audio object's buffer
useEffect(() => {
const listener = new THREE.AudioListener()
setListener(listener)
const sound = new THREE.PositionalAudio(listener)
setSound(sound)
@robksawyer
robksawyer / shader-noise.glsl
Created August 1, 2022 14:07
A bunch of noise functions
//
// Description : Array and textureless GLSL 2D/3D/4D simplex
// noise functions.
// Author : Ian McEwan, Ashima Arts.
// Maintainer : stegu
// Lastmod : 20110822 (ijm)
// License : Copyright (C) 2011 Ashima Arts. All rights reserved.
// Distributed under the MIT License. See LICENSE file.
// https://github.com/ashima/webgl-noise
// https://github.com/stegu/webgl-noise