Home Reference Source

src/materials/ShockWaveMaterial.js

import { ShaderMaterial, Uniform, Vector2 } from "three";

import fragment from "./glsl/shock-wave/shader.frag";
import vertex from "./glsl/shock-wave/shader.vert";

/**
 * A shock wave shader material.
 *
 * Based on a Gist by Jean-Philippe Sarda:
 *  https://gist.github.com/jpsarda/33cea67a9f2ecb0a0eda
 */

export class ShockWaveMaterial extends ShaderMaterial {

	/**
	 * Constructs a new shock wave material.
	 *
	 * @param {Object} [options] - The options.
	 * @param {Number} [options.waveSize=0.2] - The wave size.
	 * @param {Number} [options.amplitude=0.05] - The distortion amplitude.
	 */

	constructor(options = {}) {

		const settings = Object.assign({
			maxRadius: 1.0,
			waveSize: 0.2,
			amplitude: 0.05
		}, options);

		super({

			type: "ShockWaveMaterial",

			uniforms: {

				tDiffuse: new Uniform(null),

				center: new Uniform(new Vector2(0.5, 0.5)),
				aspect: new Uniform(1.0),
				cameraDistance: new Uniform(1.0),

				size: new Uniform(1.0),
				radius: new Uniform(-settings.waveSize),
				maxRadius: new Uniform(settings.maxRadius),
				waveSize: new Uniform(settings.waveSize),
				amplitude: new Uniform(settings.amplitude)

			},

			fragmentShader: fragment,
			vertexShader: vertex,

			depthWrite: false,
			depthTest: false

		});

	}

}