mirror of
https://github.com/FMS-Cat/condition.git
synced 2025-08-30 08:39:56 +02:00
please
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -2,6 +2,7 @@ export const
|
|||||||
RTINSPECTOR_MULTIPLE = false,
|
RTINSPECTOR_MULTIPLE = false,
|
||||||
// RTINSPECTOR_MULTIPLE = true,
|
// RTINSPECTOR_MULTIPLE = true,
|
||||||
RTINSPECTOR_CAPTURE_NAME: string | null = null,
|
RTINSPECTOR_CAPTURE_NAME: string | null = null,
|
||||||
|
// RTINSPECTOR_CAPTURE_NAME: string | null = 'PixelSorter/index',
|
||||||
// RTINSPECTOR_CAPTURE_NAME: string | null = 'Bloom/swap1',
|
// RTINSPECTOR_CAPTURE_NAME: string | null = 'Bloom/swap1',
|
||||||
// RTINSPECTOR_CAPTURE_NAME: string | null = 'main/postSwap0',
|
// RTINSPECTOR_CAPTURE_NAME: string | null = 'main/postSwap0',
|
||||||
// RTINSPECTOR_CAPTURE_NAME: string | null = 'DeferredCamera/cameraTarget',
|
// RTINSPECTOR_CAPTURE_NAME: string | null = 'DeferredCamera/cameraTarget',
|
||||||
|
@@ -40,7 +40,7 @@ export class Bloom extends Entity {
|
|||||||
this.components.push( new Blit( {
|
this.components.push( new Blit( {
|
||||||
src: options.input,
|
src: options.input,
|
||||||
dst: options.target,
|
dst: options.target,
|
||||||
name: 'Glitch/blitDry',
|
name: 'Bloom/blitDry',
|
||||||
} ) );
|
} ) );
|
||||||
|
|
||||||
// -- down -------------------------------------------------------------------------------------
|
// -- down -------------------------------------------------------------------------------------
|
||||||
|
117
src/entities/Crystal.ts
Normal file
117
src/entities/Crystal.ts
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
import { Entity } from '../heck/Entity';
|
||||||
|
import { Geometry } from '../heck/Geometry';
|
||||||
|
import { Lambda } from '../heck/components/Lambda';
|
||||||
|
import { Material } from '../heck/Material';
|
||||||
|
import { Mesh, MeshCull } from '../heck/components/Mesh';
|
||||||
|
import { Vector3 } from '@fms-cat/experimental';
|
||||||
|
import { auto } from '../globals/automaton';
|
||||||
|
import { dummyRenderTarget, dummyRenderTargetFourDrawBuffers } from '../globals/dummyRenderTarget';
|
||||||
|
import { genCube } from '../geometries/genCube';
|
||||||
|
import { objectValuesMap } from '../utils/objectEntriesMap';
|
||||||
|
import { randomTexture, randomTextureStatic } from '../globals/randomTexture';
|
||||||
|
import crystalFrag from '../shaders/crystal.frag';
|
||||||
|
import raymarchObjectVert from '../shaders/raymarch-object.vert';
|
||||||
|
|
||||||
|
interface CrystalOptions {
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
noiseOffset: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Crystal extends Entity {
|
||||||
|
public constructor( { width, height, noiseOffset }: CrystalOptions ) {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.transform.position = new Vector3( [ 0.0, 0.0, 0.0 ] );
|
||||||
|
this.transform.scale = new Vector3( [ 1.0, 1.0, 1.0 ] );
|
||||||
|
|
||||||
|
// -- geometry ---------------------------------------------------------------------------------
|
||||||
|
const cube = genCube( { dimension: [ width, height, width ] } );
|
||||||
|
|
||||||
|
const geometry = new Geometry();
|
||||||
|
|
||||||
|
geometry.vao.bindVertexbuffer( cube.position, 0, 3 );
|
||||||
|
geometry.vao.bindIndexbuffer( cube.index );
|
||||||
|
|
||||||
|
geometry.count = cube.count;
|
||||||
|
geometry.mode = cube.mode;
|
||||||
|
geometry.indexType = cube.indexType;
|
||||||
|
|
||||||
|
// -- materials --------------------------------------------------------------------------------
|
||||||
|
const deferred = new Material(
|
||||||
|
raymarchObjectVert,
|
||||||
|
crystalFrag,
|
||||||
|
{
|
||||||
|
defines: [ 'DEFERRED 1' ],
|
||||||
|
initOptions: { geometry, target: dummyRenderTargetFourDrawBuffers },
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
const depth = new Material(
|
||||||
|
raymarchObjectVert,
|
||||||
|
crystalFrag,
|
||||||
|
{
|
||||||
|
defines: [ 'SHADOW 1' ],
|
||||||
|
initOptions: { geometry, target: dummyRenderTarget }
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
const materials = { deferred, depth };
|
||||||
|
|
||||||
|
if ( process.env.DEV ) {
|
||||||
|
if ( module.hot ) {
|
||||||
|
module.hot.accept( '../shaders/crystal.frag', () => {
|
||||||
|
deferred.replaceShader( raymarchObjectVert, crystalFrag );
|
||||||
|
depth.replaceShader( raymarchObjectVert, crystalFrag );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
objectValuesMap( materials, ( material ) => {
|
||||||
|
material.addUniform( 'range', '4f', -1.0, -1.0, 1.0, 1.0 );
|
||||||
|
material.addUniform( 'size', '2f', width, height );
|
||||||
|
material.addUniform( 'noiseOffset', '1f', noiseOffset );
|
||||||
|
|
||||||
|
material.addUniformTexture( 'samplerRandom', randomTexture.texture );
|
||||||
|
material.addUniformTexture( 'samplerRandomStatic', randomTextureStatic.texture );
|
||||||
|
} );
|
||||||
|
|
||||||
|
// -- updater ----------------------------------------------------------------------------------
|
||||||
|
this.components.push( new Lambda( {
|
||||||
|
onDraw: ( event ) => {
|
||||||
|
objectValuesMap( materials, ( material ) => {
|
||||||
|
material.addUniform(
|
||||||
|
'cameraNearFar',
|
||||||
|
'2f',
|
||||||
|
event.camera.near,
|
||||||
|
event.camera.far
|
||||||
|
);
|
||||||
|
|
||||||
|
material.addUniformMatrixVector(
|
||||||
|
'inversePVM',
|
||||||
|
'Matrix4fv',
|
||||||
|
event.projectionMatrix
|
||||||
|
.multiply( event.viewMatrix )
|
||||||
|
.multiply( event.globalTransform.matrix )
|
||||||
|
.inverse!
|
||||||
|
.elements
|
||||||
|
);
|
||||||
|
|
||||||
|
material.addUniform( 'deformAmp', '1f', auto( 'Music/NEURO_WUB_AMP' ) );
|
||||||
|
material.addUniform( 'deformFreq', '1f', auto( 'Music/NEURO_WUB_FREQ' ) + auto( 'Music/NEURO_DETUNE' ) );
|
||||||
|
material.addUniform( 'deformTime', '1f', auto( 'Music/NEURO_TIME' ) );
|
||||||
|
} );
|
||||||
|
},
|
||||||
|
name: process.env.DEV && 'Crystal/updater',
|
||||||
|
} ) );
|
||||||
|
|
||||||
|
// -- mesh -------------------------------------------------------------------------------------
|
||||||
|
const mesh = new Mesh( {
|
||||||
|
geometry,
|
||||||
|
materials,
|
||||||
|
name: process.env.DEV && 'Crystal/mesh',
|
||||||
|
} );
|
||||||
|
mesh.cull = MeshCull.None;
|
||||||
|
this.components.push( mesh );
|
||||||
|
}
|
||||||
|
}
|
65
src/entities/DVi.ts
Normal file
65
src/entities/DVi.ts
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
import { Blit } from '../heck/components/Blit';
|
||||||
|
import { BufferRenderTarget } from '../heck/BufferRenderTarget';
|
||||||
|
import { Entity } from '../heck/Entity';
|
||||||
|
import { Material } from '../heck/Material';
|
||||||
|
import { Quad } from '../heck/components/Quad';
|
||||||
|
import { RenderTarget } from '../heck/RenderTarget';
|
||||||
|
import { dummyRenderTarget } from '../globals/dummyRenderTarget';
|
||||||
|
import { quadGeometry } from '../globals/quadGeometry';
|
||||||
|
import { randomTexture } from '../globals/randomTexture';
|
||||||
|
import dviFrag from '../shaders/dvi.frag';
|
||||||
|
import quadVert from '../shaders/quad.vert';
|
||||||
|
import { auto } from '../globals/automaton';
|
||||||
|
|
||||||
|
export interface DViOptions {
|
||||||
|
input: BufferRenderTarget;
|
||||||
|
target: RenderTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class DVi extends Entity {
|
||||||
|
public constructor( options: DViOptions ) {
|
||||||
|
super();
|
||||||
|
|
||||||
|
// -- bypass -----------------------------------------------------------------------------------
|
||||||
|
const blitBypass = new Blit( {
|
||||||
|
src: options.input,
|
||||||
|
dst: options.target,
|
||||||
|
name: 'DVi/blitBypass',
|
||||||
|
} );
|
||||||
|
|
||||||
|
// -- dvi --------------------------------------------------------------------------------------
|
||||||
|
const material = new Material(
|
||||||
|
quadVert,
|
||||||
|
dviFrag,
|
||||||
|
{ initOptions: { geometry: quadGeometry, target: dummyRenderTarget } },
|
||||||
|
);
|
||||||
|
material.addUniformTexture( 'sampler0', options.input.texture );
|
||||||
|
material.addUniformTexture( 'samplerRandom', randomTexture.texture );
|
||||||
|
|
||||||
|
if ( process.env.DEV ) {
|
||||||
|
if ( module.hot ) {
|
||||||
|
module.hot.accept( '../shaders/dvi.frag', () => {
|
||||||
|
material.replaceShader( quadVert, dviFrag );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const quadDVi = new Quad( {
|
||||||
|
target: options.target,
|
||||||
|
material,
|
||||||
|
name: process.env.DEV && 'DVi/quad',
|
||||||
|
} );
|
||||||
|
|
||||||
|
// -- components -------------------------------------------------------------------------------
|
||||||
|
this.components.push(
|
||||||
|
blitBypass,
|
||||||
|
quadDVi,
|
||||||
|
);
|
||||||
|
|
||||||
|
// -- bypass auto ------------------------------------------------------------------------------
|
||||||
|
auto( 'DVi/active', ( { uninit } ) => {
|
||||||
|
quadDVi.active = !uninit;
|
||||||
|
blitBypass.active = !quadDVi.active;
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
}
|
@@ -15,6 +15,7 @@ import { randomTexture } from '../globals/randomTexture';
|
|||||||
import aoFrag from '../shaders/ao.frag';
|
import aoFrag from '../shaders/ao.frag';
|
||||||
import quadVert from '../shaders/quad.vert';
|
import quadVert from '../shaders/quad.vert';
|
||||||
import shadingFrag from '../shaders/shading.frag';
|
import shadingFrag from '../shaders/shading.frag';
|
||||||
|
import { auto } from '../globals/automaton';
|
||||||
|
|
||||||
export interface DeferredCameraOptions {
|
export interface DeferredCameraOptions {
|
||||||
scenes: Entity[];
|
scenes: Entity[];
|
||||||
@@ -26,10 +27,12 @@ export interface DeferredCameraOptions {
|
|||||||
|
|
||||||
export class DeferredCamera extends Entity {
|
export class DeferredCamera extends Entity {
|
||||||
public cameraTarget: BufferRenderTarget;
|
public cameraTarget: BufferRenderTarget;
|
||||||
|
public camera: PerspectiveCamera;
|
||||||
|
|
||||||
public constructor( options: DeferredCameraOptions ) {
|
public constructor( options: DeferredCameraOptions ) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
|
// -- camera -----------------------------------------------------------------------------------
|
||||||
this.cameraTarget = new BufferRenderTarget( {
|
this.cameraTarget = new BufferRenderTarget( {
|
||||||
width: options.target.width,
|
width: options.target.width,
|
||||||
height: options.target.height,
|
height: options.target.height,
|
||||||
@@ -38,7 +41,7 @@ export class DeferredCamera extends Entity {
|
|||||||
filter: gl.NEAREST,
|
filter: gl.NEAREST,
|
||||||
} );
|
} );
|
||||||
|
|
||||||
const camera = new PerspectiveCamera( {
|
this.camera = new PerspectiveCamera( {
|
||||||
scenes: options.scenes,
|
scenes: options.scenes,
|
||||||
renderTarget: this.cameraTarget,
|
renderTarget: this.cameraTarget,
|
||||||
near: 0.1,
|
near: 0.1,
|
||||||
@@ -46,8 +49,9 @@ export class DeferredCamera extends Entity {
|
|||||||
name: 'DeferredCamera/camera',
|
name: 'DeferredCamera/camera',
|
||||||
materialTag: 'deferred',
|
materialTag: 'deferred',
|
||||||
} );
|
} );
|
||||||
camera.clear = [];
|
this.camera.clear = [];
|
||||||
|
|
||||||
|
// -- ao ---------------------------------------------------------------------------------------
|
||||||
const aoTarget = new BufferRenderTarget( {
|
const aoTarget = new BufferRenderTarget( {
|
||||||
width: AO_RESOLUTION_RATIO * options.target.width,
|
width: AO_RESOLUTION_RATIO * options.target.width,
|
||||||
height: AO_RESOLUTION_RATIO * options.target.height,
|
height: AO_RESOLUTION_RATIO * options.target.height,
|
||||||
@@ -67,7 +71,7 @@ export class DeferredCamera extends Entity {
|
|||||||
aoMaterial.addUniformMatrixVector(
|
aoMaterial.addUniformMatrixVector(
|
||||||
'cameraPV',
|
'cameraPV',
|
||||||
'Matrix4fv',
|
'Matrix4fv',
|
||||||
camera.projectionMatrix.multiply(
|
this.camera.projectionMatrix.multiply(
|
||||||
cameraView
|
cameraView
|
||||||
).elements
|
).elements
|
||||||
);
|
);
|
||||||
@@ -90,6 +94,7 @@ export class DeferredCamera extends Entity {
|
|||||||
name: process.env.DEV && 'DeferredCamera/ao/quad',
|
name: process.env.DEV && 'DeferredCamera/ao/quad',
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
// -- deferred ---------------------------------------------------------------------------------
|
||||||
const shadingMaterial = new Material(
|
const shadingMaterial = new Material(
|
||||||
quadVert,
|
quadVert,
|
||||||
shadingFrag,
|
shadingFrag,
|
||||||
@@ -128,7 +133,7 @@ export class DeferredCamera extends Entity {
|
|||||||
shadingMaterial.addUniformMatrixVector(
|
shadingMaterial.addUniformMatrixVector(
|
||||||
'cameraPV',
|
'cameraPV',
|
||||||
'Matrix4fv',
|
'Matrix4fv',
|
||||||
camera.projectionMatrix.multiply(
|
this.camera.projectionMatrix.multiply(
|
||||||
cameraView
|
cameraView
|
||||||
).elements
|
).elements
|
||||||
);
|
);
|
||||||
@@ -136,8 +141,8 @@ export class DeferredCamera extends Entity {
|
|||||||
shadingMaterial.addUniform(
|
shadingMaterial.addUniform(
|
||||||
'cameraNearFar',
|
'cameraNearFar',
|
||||||
'2f',
|
'2f',
|
||||||
camera.near,
|
this.camera.near,
|
||||||
camera.far
|
this.camera.far
|
||||||
);
|
);
|
||||||
|
|
||||||
shadingMaterial.addUniform(
|
shadingMaterial.addUniform(
|
||||||
@@ -201,7 +206,7 @@ export class DeferredCamera extends Entity {
|
|||||||
shadingMaterial.addUniformTexture( 'samplerRandom', randomTexture.texture );
|
shadingMaterial.addUniformTexture( 'samplerRandom', randomTexture.texture );
|
||||||
|
|
||||||
this.components.push(
|
this.components.push(
|
||||||
camera,
|
this.camera,
|
||||||
lambdaAoSetCameraUniforms,
|
lambdaAoSetCameraUniforms,
|
||||||
aoQuad,
|
aoQuad,
|
||||||
lambda,
|
lambda,
|
||||||
|
@@ -2,6 +2,7 @@ import { Entity } from '../heck/Entity';
|
|||||||
import { GPUParticles } from './GPUParticles';
|
import { GPUParticles } from './GPUParticles';
|
||||||
import { InstancedGeometry } from '../heck/InstancedGeometry';
|
import { InstancedGeometry } from '../heck/InstancedGeometry';
|
||||||
import { Material } from '../heck/Material';
|
import { Material } from '../heck/Material';
|
||||||
|
import { MeshCull } from '../heck/components/Mesh';
|
||||||
import { TRIANGLE_STRIP_QUAD } from '@fms-cat/experimental';
|
import { TRIANGLE_STRIP_QUAD } from '@fms-cat/experimental';
|
||||||
import { dummyRenderTarget } from '../globals/dummyRenderTarget';
|
import { dummyRenderTarget } from '../globals/dummyRenderTarget';
|
||||||
import { gl, glCat } from '../globals/canvas';
|
import { gl, glCat } from '../globals/canvas';
|
||||||
@@ -118,6 +119,7 @@ export class FlickyParticles extends Entity {
|
|||||||
computeNumBuffers: 1,
|
computeNumBuffers: 1,
|
||||||
namePrefix: process.env.DEV && 'FlickyParticles',
|
namePrefix: process.env.DEV && 'FlickyParticles',
|
||||||
} );
|
} );
|
||||||
|
gpuParticles.meshRender.cull = MeshCull.None;
|
||||||
this.children.push( gpuParticles );
|
this.children.push( gpuParticles );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -10,10 +10,12 @@ export interface ForwardCameraOptions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class ForwardCamera extends Entity {
|
export class ForwardCamera extends Entity {
|
||||||
|
public camera: PerspectiveCamera;
|
||||||
|
|
||||||
public constructor( options: ForwardCameraOptions ) {
|
public constructor( options: ForwardCameraOptions ) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
const camera = new PerspectiveCamera( {
|
this.camera = new PerspectiveCamera( {
|
||||||
scenes: options.scenes,
|
scenes: options.scenes,
|
||||||
renderTarget: options.target,
|
renderTarget: options.target,
|
||||||
near: 0.1,
|
near: 0.1,
|
||||||
@@ -21,8 +23,8 @@ export class ForwardCamera extends Entity {
|
|||||||
name: 'ForwardCamera/camera',
|
name: 'ForwardCamera/camera',
|
||||||
materialTag: 'forward',
|
materialTag: 'forward',
|
||||||
} );
|
} );
|
||||||
camera.clear = false;
|
this.camera.clear = false;
|
||||||
|
|
||||||
this.components.push( camera );
|
this.components.push( this.camera );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -20,6 +20,8 @@ export interface GPUParticlesOptions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class GPUParticles extends Entity {
|
export class GPUParticles extends Entity {
|
||||||
|
public meshRender: Mesh;
|
||||||
|
|
||||||
public constructor( {
|
public constructor( {
|
||||||
materialCompute,
|
materialCompute,
|
||||||
geometryRender,
|
geometryRender,
|
||||||
@@ -59,7 +61,7 @@ export class GPUParticles extends Entity {
|
|||||||
} );
|
} );
|
||||||
|
|
||||||
// -- render -----------------------------------------------------------------------------------
|
// -- render -----------------------------------------------------------------------------------
|
||||||
const meshRender = new Mesh( {
|
this.meshRender = new Mesh( {
|
||||||
geometry: geometryRender,
|
geometry: geometryRender,
|
||||||
materials: materialsRender,
|
materials: materialsRender,
|
||||||
name: process.env.DEV && `${ namePrefix }/meshRender`,
|
name: process.env.DEV && `${ namePrefix }/meshRender`,
|
||||||
@@ -101,7 +103,9 @@ export class GPUParticles extends Entity {
|
|||||||
} ) );
|
} ) );
|
||||||
|
|
||||||
// -- rest of components -----------------------------------------------------------------------
|
// -- rest of components -----------------------------------------------------------------------
|
||||||
this.components.push( quadCompute );
|
this.components.push(
|
||||||
this.components.push( meshRender );
|
quadCompute,
|
||||||
|
this.meshRender,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -14,13 +14,14 @@ import lightShaftVert from '../shaders/light-shaft.vert';
|
|||||||
|
|
||||||
interface LightShaftOptions {
|
interface LightShaftOptions {
|
||||||
light: LightEntity;
|
light: LightEntity;
|
||||||
|
intensity?: number;
|
||||||
namePrefix?: string;
|
namePrefix?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class LightShaft extends Entity {
|
export class LightShaft extends Entity {
|
||||||
private __forward: Material;
|
private __forward: Material;
|
||||||
|
|
||||||
public constructor( { light, namePrefix }: LightShaftOptions ) {
|
public constructor( { light, intensity, namePrefix }: LightShaftOptions ) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
// -- geometry ---------------------------------------------------------------------------------
|
// -- geometry ---------------------------------------------------------------------------------
|
||||||
@@ -45,6 +46,8 @@ export class LightShaft extends Entity {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
forward.addUniform( 'intensity', '1f', intensity ?? 0.01 );
|
||||||
|
|
||||||
forward.addUniformTexture( 'samplerRandom', randomTexture.texture );
|
forward.addUniformTexture( 'samplerRandom', randomTexture.texture );
|
||||||
forward.addUniformTexture( 'samplerShadow', light.shadowMap.texture );
|
forward.addUniformTexture( 'samplerShadow', light.shadowMap.texture );
|
||||||
|
|
||||||
|
@@ -1,9 +1,7 @@
|
|||||||
import { Entity } from '../heck/Entity';
|
import { Entity } from '../heck/Entity';
|
||||||
import { InstancedGeometry } from '../heck/InstancedGeometry';
|
import { InstancedGeometry } from '../heck/InstancedGeometry';
|
||||||
import { Lambda } from '../heck/components/Lambda';
|
|
||||||
import { Material } from '../heck/Material';
|
import { Material } from '../heck/Material';
|
||||||
import { Mesh } from '../heck/components/Mesh';
|
import { Mesh } from '../heck/components/Mesh';
|
||||||
import { Quaternion, Vector3 } from '@fms-cat/experimental';
|
|
||||||
import { dummyRenderTarget } from '../globals/dummyRenderTarget';
|
import { dummyRenderTarget } from '../globals/dummyRenderTarget';
|
||||||
import { genTorus } from '../geometries/genTorus';
|
import { genTorus } from '../geometries/genTorus';
|
||||||
import { glCat } from '../globals/canvas';
|
import { glCat } from '../globals/canvas';
|
||||||
@@ -17,15 +15,6 @@ export class Rings extends Entity {
|
|||||||
public constructor() {
|
public constructor() {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
const rot0 = Quaternion.fromAxisAngle(
|
|
||||||
new Vector3( [ 1.0, 0.0, 0.0 ] ),
|
|
||||||
0.4,
|
|
||||||
).multiply( Quaternion.fromAxisAngle(
|
|
||||||
new Vector3( [ 0.0, 0.0, 1.0 ] ),
|
|
||||||
0.4,
|
|
||||||
) );
|
|
||||||
this.transform.rotation = rot0;
|
|
||||||
|
|
||||||
// -- geometry ---------------------------------------------------------------------------------
|
// -- geometry ---------------------------------------------------------------------------------
|
||||||
const torus = genTorus( { segmentsRadial: 256 } );
|
const torus = genTorus( { segmentsRadial: 256 } );
|
||||||
|
|
||||||
@@ -47,7 +36,7 @@ export class Rings extends Entity {
|
|||||||
geometry.primcount = PRIMCOUNT;
|
geometry.primcount = PRIMCOUNT;
|
||||||
|
|
||||||
// -- materials --------------------------------------------------------------------------------
|
// -- materials --------------------------------------------------------------------------------
|
||||||
const forward = new Material(
|
const cubemap = new Material(
|
||||||
ringsVert,
|
ringsVert,
|
||||||
ringsFrag,
|
ringsFrag,
|
||||||
{
|
{
|
||||||
@@ -72,7 +61,7 @@ export class Rings extends Entity {
|
|||||||
);
|
);
|
||||||
|
|
||||||
const materials = {
|
const materials = {
|
||||||
forward,
|
cubemap,
|
||||||
deferred,
|
deferred,
|
||||||
depth,
|
depth,
|
||||||
};
|
};
|
||||||
@@ -85,7 +74,7 @@ export class Rings extends Entity {
|
|||||||
'../shaders/rings.frag',
|
'../shaders/rings.frag',
|
||||||
],
|
],
|
||||||
() => {
|
() => {
|
||||||
forward.replaceShader( ringsVert, ringsFrag );
|
cubemap.replaceShader( ringsVert, ringsFrag );
|
||||||
deferred.replaceShader( ringsVert, ringsFrag );
|
deferred.replaceShader( ringsVert, ringsFrag );
|
||||||
depth.replaceShader( ringsVert, depthFrag );
|
depth.replaceShader( ringsVert, depthFrag );
|
||||||
},
|
},
|
||||||
@@ -100,18 +89,5 @@ export class Rings extends Entity {
|
|||||||
name: process.env.DEV && 'Rings/mesh',
|
name: process.env.DEV && 'Rings/mesh',
|
||||||
} );
|
} );
|
||||||
this.components.push( mesh );
|
this.components.push( mesh );
|
||||||
|
|
||||||
this.components.push( new Lambda( {
|
|
||||||
onUpdate: ( { time } ) => {
|
|
||||||
this.transform.rotation = rot0.multiply(
|
|
||||||
Quaternion.fromAxisAngle( new Vector3( [ 0.0, 1.0, 0.0 ] ), time )
|
|
||||||
).multiply(
|
|
||||||
Quaternion.fromAxisAngle( new Vector3( [ 1.0, 0.0, 0.0 ] ), 1.0 )
|
|
||||||
).multiply(
|
|
||||||
Quaternion.fromAxisAngle( new Vector3( [ 0.0, 0.0, 1.0 ] ), 1.0 )
|
|
||||||
);
|
|
||||||
},
|
|
||||||
name: process.env.DEV && 'Rings/speen',
|
|
||||||
} ) );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,46 +1,43 @@
|
|||||||
|
import { Condition } from './Condition';
|
||||||
|
import { Cube } from './Cube';
|
||||||
import { Entity } from '../heck/Entity';
|
import { Entity } from '../heck/Entity';
|
||||||
import { LightEntity } from './LightEntity';
|
import { LightEntity } from './LightEntity';
|
||||||
import { Vector3 } from '@fms-cat/experimental';
|
import { Vector3 } from '@fms-cat/experimental';
|
||||||
|
|
||||||
interface LightsFirstOptions {
|
export class SceneBegin extends Entity {
|
||||||
scenes: Entity[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export class LightsFirst extends Entity {
|
|
||||||
public readonly lights: LightEntity[];
|
public readonly lights: LightEntity[];
|
||||||
|
|
||||||
public constructor( { scenes }: LightsFirstOptions ) {
|
public constructor() {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
// -- 1 ----------------------------------------------------------------------------------------
|
// -- lights -----------------------------------------------------------------------------------
|
||||||
const light1 = new LightEntity( {
|
const light1 = new LightEntity( {
|
||||||
scenes,
|
scenes: [ this ],
|
||||||
shadowMapFov: 30.0,
|
shadowMapFov: 30.0,
|
||||||
shadowMapNear: 1.0,
|
shadowMapNear: 1.0,
|
||||||
shadowMapFar: 20.0,
|
shadowMapFar: 20.0,
|
||||||
namePrefix: process.env.DEV && 'lightFirst',
|
namePrefix: process.env.DEV && 'lightBegin1',
|
||||||
} );
|
} );
|
||||||
|
light1.color = [ 200.0, 200.0, 200.0 ];
|
||||||
light1.color = [ 400.0, 400.0, 400.0 ];
|
|
||||||
light1.transform.lookAt( new Vector3( [ 4.0, 4.0, 4.0 ] ) );
|
light1.transform.lookAt( new Vector3( [ 4.0, 4.0, 4.0 ] ) );
|
||||||
|
|
||||||
this.children.push( light1 );
|
|
||||||
|
|
||||||
// -- 2 ----------------------------------------------------------------------------------------
|
|
||||||
const light2 = new LightEntity( {
|
const light2 = new LightEntity( {
|
||||||
scenes,
|
scenes: [ this ],
|
||||||
shadowMapFov: 30.0,
|
shadowMapFov: 30.0,
|
||||||
shadowMapNear: 1.0,
|
shadowMapNear: 1.0,
|
||||||
shadowMapFar: 20.0,
|
shadowMapFar: 20.0,
|
||||||
namePrefix: process.env.DEV && 'lightFirst',
|
namePrefix: process.env.DEV && 'lightBegin2',
|
||||||
} );
|
} );
|
||||||
|
light2.color = [ 80.0, 90.0, 100.0 ];
|
||||||
light2.color = [ 100.0, 140.0, 200.0 ];
|
|
||||||
light2.transform.lookAt( new Vector3( [ -4.0, 0.0, -4.0 ] ) );
|
light2.transform.lookAt( new Vector3( [ -4.0, 0.0, -4.0 ] ) );
|
||||||
|
|
||||||
this.children.push( light2 );
|
|
||||||
|
|
||||||
// -- haha -------------------------------------------------------------------------------------
|
|
||||||
this.lights = [ light1, light2 ];
|
this.lights = [ light1, light2 ];
|
||||||
|
|
||||||
|
// -- scene ------------------------------------------------------------------------------------
|
||||||
|
this.children.push(
|
||||||
|
new Cube(),
|
||||||
|
new Condition(),
|
||||||
|
...this.lights,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
41
src/entities/SceneCrystals.ts
Normal file
41
src/entities/SceneCrystals.ts
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import { Crystal } from './Crystal';
|
||||||
|
import { Entity } from '../heck/Entity';
|
||||||
|
import { Lambda } from '../heck/components/Lambda';
|
||||||
|
import { Quaternion, Vector3 } from '@fms-cat/experimental';
|
||||||
|
import { Rings } from './Rings';
|
||||||
|
|
||||||
|
export class SceneCrystals extends Entity {
|
||||||
|
public constructor() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
const crystal = new Crystal( { width: 0.4, height: 1.5, noiseOffset: 7.0 } );
|
||||||
|
this.children.push( crystal );
|
||||||
|
|
||||||
|
const speen = new Entity();
|
||||||
|
this.children.push( speen );
|
||||||
|
|
||||||
|
const up = new Vector3( [ 0.0, 1.0, 0.0 ] );
|
||||||
|
this.components.push( new Lambda( {
|
||||||
|
onUpdate: ( { time } ) => {
|
||||||
|
speen.transform.rotation = Quaternion.fromAxisAngle( up, time );
|
||||||
|
},
|
||||||
|
} ) );
|
||||||
|
|
||||||
|
for ( let i = 0; i < 3; i ++ ) {
|
||||||
|
const smolCrystal = new Crystal( { width: 0.2, height: 0.8, noiseOffset: i } );
|
||||||
|
const t = Math.PI * i / 1.5;
|
||||||
|
smolCrystal.transform.position = new Vector3( [ Math.cos( t ), 0.0, Math.sin( t ) ] );
|
||||||
|
speen.children.push( smolCrystal );
|
||||||
|
}
|
||||||
|
|
||||||
|
const rings = new Rings();
|
||||||
|
rings.transform.rotation = Quaternion.fromAxisAngle(
|
||||||
|
new Vector3( [ 1.0, 0.0, 0.0 ] ),
|
||||||
|
0.1,
|
||||||
|
).multiply( Quaternion.fromAxisAngle(
|
||||||
|
new Vector3( [ 0.0, 0.0, 1.0 ] ),
|
||||||
|
0.1,
|
||||||
|
) );
|
||||||
|
this.children.push( rings );
|
||||||
|
}
|
||||||
|
}
|
@@ -1,31 +1,32 @@
|
|||||||
|
import { BoundingBox } from './BoundingBox';
|
||||||
import { BufferRenderTarget } from '../heck/BufferRenderTarget';
|
import { BufferRenderTarget } from '../heck/BufferRenderTarget';
|
||||||
import { Entity } from '../heck/Entity';
|
import { Entity } from '../heck/Entity';
|
||||||
|
import { IFSPistons } from './IFSPistons';
|
||||||
import { LightEntity } from './LightEntity';
|
import { LightEntity } from './LightEntity';
|
||||||
import { LightShaft } from './LightShaft';
|
import { LightShaft } from './LightShaft';
|
||||||
import { Vector3 } from '@fms-cat/experimental';
|
import { Quaternion, Vector3 } from '@fms-cat/experimental';
|
||||||
|
import { SufferTexts } from './SufferTexts';
|
||||||
|
import { Wobbleball } from './Wobbleball';
|
||||||
|
|
||||||
interface LightsPinkOptions {
|
export class SceneNeuro extends Entity {
|
||||||
scenes: Entity[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export class LightsPink extends Entity {
|
|
||||||
public readonly lights: LightEntity[];
|
public readonly lights: LightEntity[];
|
||||||
private readonly __shafts: LightShaft[];
|
private readonly __shafts: LightShaft[];
|
||||||
|
|
||||||
public constructor( { scenes }: LightsPinkOptions ) {
|
public constructor() {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
|
// -- lights -----------------------------------------------------------------------------------
|
||||||
type TypeScriptSucks = [ [ number, number, number ], [ number, number, number ], boolean ][];
|
type TypeScriptSucks = [ [ number, number, number ], [ number, number, number ], boolean ][];
|
||||||
|
|
||||||
this.__shafts = [];
|
this.__shafts = [];
|
||||||
|
|
||||||
this.lights = ( [
|
this.lights = ( [
|
||||||
[ [ 6000.0, 40.0, 200.0 ], [ 8.0, 4.0, -8.0 ], true ],
|
[ [ 2000.0, 20.0, 100.0 ], [ 8.0, 4.0, -8.0 ], true ],
|
||||||
[ [ 6000.0, 40.0, 200.0 ], [ -8.0, 4.0, -8.0 ], true ],
|
[ [ 2000.0, 20.0, 100.0 ], [ -8.0, 4.0, -8.0 ], true ],
|
||||||
[ [ 10.0, 14.0, 20.0 ], [ 0.0, -4.0, 4.0 ], false ],
|
[ [ 50.0, 50.0, 50.0 ], [ 0.0, -4.0, 4.0 ], false ],
|
||||||
] as TypeScriptSucks ).map( ( [ color, pos, isSpot ], i ) => {
|
] as TypeScriptSucks ).map( ( [ color, pos, isSpot ], i ) => {
|
||||||
const light = new LightEntity( {
|
const light = new LightEntity( {
|
||||||
scenes,
|
scenes: [ this ],
|
||||||
shadowMapFov: isSpot ? 15.0 : 50.0,
|
shadowMapFov: isSpot ? 15.0 : 50.0,
|
||||||
shadowMapNear: 0.5,
|
shadowMapNear: 0.5,
|
||||||
shadowMapFar: 20.0,
|
shadowMapFar: 20.0,
|
||||||
@@ -34,11 +35,9 @@ export class LightsPink extends Entity {
|
|||||||
} );
|
} );
|
||||||
|
|
||||||
light.color = color;
|
light.color = color;
|
||||||
light.spotness = isSpot ? 0.9 : 0.0;
|
light.spotness = isSpot ? 0.99 : 0.0;
|
||||||
light.transform.lookAt( new Vector3( pos ) );
|
light.transform.lookAt( new Vector3( pos ) );
|
||||||
|
|
||||||
this.children.push( light );
|
|
||||||
|
|
||||||
if ( isSpot ) {
|
if ( isSpot ) {
|
||||||
const shaft = new LightShaft( {
|
const shaft = new LightShaft( {
|
||||||
light,
|
light,
|
||||||
@@ -51,6 +50,23 @@ export class LightsPink extends Entity {
|
|||||||
|
|
||||||
return light;
|
return light;
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
// -- bounding box -----------------------------------------------------------------------------
|
||||||
|
const boundingBox = new BoundingBox();
|
||||||
|
boundingBox.transform.rotation = Quaternion.fromAxisAngle(
|
||||||
|
new Vector3( [ 0.0, 0.0, 1.0 ] ),
|
||||||
|
0.25 * Math.PI,
|
||||||
|
);
|
||||||
|
boundingBox.transform.scale = new Vector3( [ 1.2, 1.2, 1.2 ] );
|
||||||
|
|
||||||
|
// -- scene ------------------------------------------------------------------------------------
|
||||||
|
this.children.push(
|
||||||
|
new Wobbleball(),
|
||||||
|
new IFSPistons(),
|
||||||
|
boundingBox,
|
||||||
|
new SufferTexts(),
|
||||||
|
...this.lights,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public setDefferedCameraTarget( deferredCameraTarget: BufferRenderTarget ): void {
|
public setDefferedCameraTarget( deferredCameraTarget: BufferRenderTarget ): void {
|
@@ -1,10 +1,9 @@
|
|||||||
import { BoundingBox } from './BoundingBox';
|
|
||||||
import { Entity } from '../heck/Entity';
|
import { Entity } from '../heck/Entity';
|
||||||
import { Geometry } from '../heck/Geometry';
|
import { Geometry } from '../heck/Geometry';
|
||||||
import { Lambda } from '../heck/components/Lambda';
|
import { Lambda } from '../heck/components/Lambda';
|
||||||
import { Material } from '../heck/Material';
|
import { Material } from '../heck/Material';
|
||||||
import { Mesh, MeshCull } from '../heck/components/Mesh';
|
import { Mesh, MeshCull } from '../heck/components/Mesh';
|
||||||
import { Quaternion, Vector3 } from '@fms-cat/experimental';
|
import { Vector3 } from '@fms-cat/experimental';
|
||||||
import { auto } from '../globals/automaton';
|
import { auto } from '../globals/automaton';
|
||||||
import { dummyRenderTarget, dummyRenderTargetFourDrawBuffers } from '../globals/dummyRenderTarget';
|
import { dummyRenderTarget, dummyRenderTargetFourDrawBuffers } from '../globals/dummyRenderTarget';
|
||||||
import { genOctahedron } from '../geometries/genOctahedron';
|
import { genOctahedron } from '../geometries/genOctahedron';
|
||||||
@@ -106,16 +105,5 @@ export class Wobbleball extends Entity {
|
|||||||
} );
|
} );
|
||||||
mesh.cull = MeshCull.None;
|
mesh.cull = MeshCull.None;
|
||||||
this.components.push( mesh );
|
this.components.push( mesh );
|
||||||
|
|
||||||
// -- bounding box -----------------------------------------------------------------------------
|
|
||||||
const boundingBox = new BoundingBox();
|
|
||||||
|
|
||||||
boundingBox.transform.rotation = Quaternion.fromAxisAngle(
|
|
||||||
new Vector3( [ 0.0, 0.0, 1.0 ] ),
|
|
||||||
0.25 * Math.PI,
|
|
||||||
);
|
|
||||||
boundingBox.transform.scale = new Vector3( [ 1.2, 1.2, 1.2 ] );
|
|
||||||
|
|
||||||
this.children.push( boundingBox );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -16,9 +16,32 @@ export interface PerspectiveCameraOptions extends ComponentOptions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class PerspectiveCamera extends Camera {
|
export class PerspectiveCamera extends Camera {
|
||||||
public readonly fov: number;
|
public get fov(): number {
|
||||||
public readonly near: number;
|
return this.__fov;
|
||||||
public readonly far: number;
|
}
|
||||||
|
public set fov( value: number ) {
|
||||||
|
this.__fov = value;
|
||||||
|
this.__updatePerspectiveCamera();
|
||||||
|
}
|
||||||
|
private __fov: number;
|
||||||
|
|
||||||
|
public get near(): number {
|
||||||
|
return this.__near;
|
||||||
|
}
|
||||||
|
public set near( value: number ) {
|
||||||
|
this.__near = value;
|
||||||
|
this.__updatePerspectiveCamera();
|
||||||
|
}
|
||||||
|
private __near: number;
|
||||||
|
|
||||||
|
public get far(): number {
|
||||||
|
return this.__far;
|
||||||
|
}
|
||||||
|
public set far( value: number ) {
|
||||||
|
this.__far = value;
|
||||||
|
this.__updatePerspectiveCamera();
|
||||||
|
}
|
||||||
|
private __far: number;
|
||||||
|
|
||||||
public constructor( options: PerspectiveCameraOptions ) {
|
public constructor( options: PerspectiveCameraOptions ) {
|
||||||
const fov = options.fov ?? 45.0;
|
const fov = options.fov ?? 45.0;
|
||||||
@@ -35,8 +58,12 @@ export class PerspectiveCamera extends Camera {
|
|||||||
clear: options.clear,
|
clear: options.clear,
|
||||||
} );
|
} );
|
||||||
|
|
||||||
this.fov = fov;
|
this.__fov = fov;
|
||||||
this.near = near;
|
this.__near = near;
|
||||||
this.far = far;
|
this.__far = far;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected __updatePerspectiveCamera(): void {
|
||||||
|
this.projectionMatrix = Matrix4.perspective( this.fov, this.near, this.far );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -110,7 +110,7 @@ vec2 deepkick( float t ) {
|
|||||||
|
|
||||||
vec2 tt = t + mix( 0.0, 0.007, smoothstep( 0.0, 0.1, t ) ) * wavetable( 0.1 * t, vec2( 2.0 ), vec2( -0.1 ) );
|
vec2 tt = t + mix( 0.0, 0.007, smoothstep( 0.0, 0.1, t ) ) * wavetable( 0.1 * t, vec2( 2.0 ), vec2( -0.1 ) );
|
||||||
vec2 phase = 50.0 * tt - 3.0 * exp( -100.0 * tt ) - 5.4 * exp( -30.0 * tt );
|
vec2 phase = 50.0 * tt - 3.0 * exp( -100.0 * tt ) - 5.4 * exp( -30.0 * tt );
|
||||||
return exp( -1.0 * tt ) * sin( TAU * phase );
|
return exp( -0.4 * tt ) * sin( TAU * phase );
|
||||||
}
|
}
|
||||||
|
|
||||||
vec2 longclap( float t, float tg ) {
|
vec2 longclap( float t, float tg ) {
|
||||||
@@ -612,7 +612,7 @@ vec2 mainAudio( vec4 time ) {
|
|||||||
t += 1.0 * inRangeInteg( time.z, 28.0 * BEAT, 31.75 * BEAT, 50.0 );
|
t += 1.0 * inRangeInteg( time.z, 28.0 * BEAT, 31.75 * BEAT, 50.0 );
|
||||||
float freq = n2f( chordsB[ progB ] ) * 0.125;
|
float freq = n2f( chordsB[ progB ] ) * 0.125;
|
||||||
float fadetime = max( 0.0, time.w - SECTION_AAAA + 8.0 * BEAT );
|
float fadetime = max( 0.0, time.w - SECTION_AAAA + 8.0 * BEAT );
|
||||||
dest += 0.12 * exp( -1.0 * fadetime ) * mix( 0.1, 1.0, sidechain ) * superbass( t, freq, exp( -2.0 * fadetime ) );
|
dest += 0.11 * exp( -1.0 * fadetime ) * mix( 0.1, 1.0, sidechain ) * superbass( t, freq, exp( -2.0 * fadetime ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// -- choir --------------------------------------------------------------------------------------
|
// -- choir --------------------------------------------------------------------------------------
|
||||||
@@ -687,12 +687,12 @@ vec2 mainAudio( vec4 time ) {
|
|||||||
sum += 0.1 * mix( 0.2, 1.0, sidechain ) * phase;
|
sum += 0.1 * mix( 0.2, 1.0, sidechain ) * phase;
|
||||||
}
|
}
|
||||||
|
|
||||||
dest += 0.12 * aSaturate( sum );
|
dest += 0.14 * aSaturate( sum );
|
||||||
}
|
}
|
||||||
|
|
||||||
// -- deepkick -----------------------------------------------------------------------------------
|
// -- deepkick -----------------------------------------------------------------------------------
|
||||||
if ( inRange( time.w, SECTION_BEGIN, SECTION_BEGIN + 16.0 * BEAT ) ) {
|
if ( inRange( time.w, SECTION_BEGIN, SECTION_BEGIN + 64.0 * BEAT ) ) {
|
||||||
dest += 0.3 * deepkick( mod( time.z, 16.0 * BEAT ) );
|
dest += 0.3 * deepkick( time.z );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( inRange( time.w, SECTION_AAAA - 8.0 * BEAT, SECTION_AAAA ) ) {
|
if ( inRange( time.w, SECTION_AAAA - 8.0 * BEAT, SECTION_AAAA ) ) {
|
||||||
|
91
src/scene.ts
91
src/scene.ts
@@ -3,9 +3,8 @@ import { Bloom } from './entities/Bloom';
|
|||||||
import { BufferRenderTarget } from './heck/BufferRenderTarget';
|
import { BufferRenderTarget } from './heck/BufferRenderTarget';
|
||||||
import { CanvasRenderTarget } from './heck/CanvasRenderTarget';
|
import { CanvasRenderTarget } from './heck/CanvasRenderTarget';
|
||||||
import { Component } from './heck/components/Component';
|
import { Component } from './heck/components/Component';
|
||||||
import { Condition } from './entities/Condition';
|
|
||||||
import { Cube } from './entities/Cube';
|
|
||||||
import { CubemapCameraEntity } from './entities/CubemapCameraEntity';
|
import { CubemapCameraEntity } from './entities/CubemapCameraEntity';
|
||||||
|
import { DVi } from './entities/DVi';
|
||||||
import { DeferredCamera } from './entities/DeferredCamera';
|
import { DeferredCamera } from './entities/DeferredCamera';
|
||||||
import { Dog } from './heck/Dog';
|
import { Dog } from './heck/Dog';
|
||||||
import { Entity } from './heck/Entity';
|
import { Entity } from './heck/Entity';
|
||||||
@@ -15,20 +14,17 @@ import { FlickyParticles } from './entities/FlickyParticles';
|
|||||||
import { ForwardCamera } from './entities/ForwardCamera';
|
import { ForwardCamera } from './entities/ForwardCamera';
|
||||||
import { Glitch } from './entities/Glitch';
|
import { Glitch } from './entities/Glitch';
|
||||||
import { IBLLUT } from './entities/IBLLUT';
|
import { IBLLUT } from './entities/IBLLUT';
|
||||||
import { IFSPistons } from './entities/IFSPistons';
|
|
||||||
import { Lambda } from './heck/components/Lambda';
|
import { Lambda } from './heck/components/Lambda';
|
||||||
import { LightsFirst } from './entities/LightsFirst';
|
|
||||||
import { LightsPink } from './entities/LightsPink';
|
|
||||||
import { PixelSorter } from './entities/PixelSorter';
|
import { PixelSorter } from './entities/PixelSorter';
|
||||||
import { Post } from './entities/Post';
|
import { Post } from './entities/Post';
|
||||||
import { RTInspector } from './entities/RTInspector';
|
import { RTInspector } from './entities/RTInspector';
|
||||||
import { Rings } from './entities/Rings';
|
import { SceneBegin } from './entities/SceneBegin';
|
||||||
|
import { SceneCrystals } from './entities/SceneCrystals';
|
||||||
|
import { SceneNeuro } from './entities/SceneNeuro';
|
||||||
import { Serial } from './entities/Serial';
|
import { Serial } from './entities/Serial';
|
||||||
import { SphereParticles } from './entities/SphereParticles';
|
import { SphereParticles } from './entities/SphereParticles';
|
||||||
import { SufferTexts } from './entities/SufferTexts';
|
|
||||||
import { Swap, Vector3 } from '@fms-cat/experimental';
|
import { Swap, Vector3 } from '@fms-cat/experimental';
|
||||||
import { Trails } from './entities/Trails';
|
import { Trails } from './entities/Trails';
|
||||||
import { Wobbleball } from './entities/Wobbleball';
|
|
||||||
import { arraySetDelete } from './utils/arraySetDelete';
|
import { arraySetDelete } from './utils/arraySetDelete';
|
||||||
import { auto, automaton } from './globals/automaton';
|
import { auto, automaton } from './globals/automaton';
|
||||||
import { music } from './globals/music';
|
import { music } from './globals/music';
|
||||||
@@ -109,13 +105,6 @@ if ( process.env.DEV && module.hot ) {
|
|||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
const replacerCondition = new EntityReplacer( deferredRoot, () => new Condition(), 'Condition' );
|
|
||||||
if ( process.env.DEV && module.hot ) {
|
|
||||||
module.hot.accept( './entities/Condition', () => {
|
|
||||||
replacerCondition.replace();
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
|
|
||||||
const replacerFlashyTerrain = new EntityReplacer(
|
const replacerFlashyTerrain = new EntityReplacer(
|
||||||
deferredRoot,
|
deferredRoot,
|
||||||
() => new FlashyTerrain(),
|
() => new FlashyTerrain(),
|
||||||
@@ -134,31 +123,29 @@ if ( process.env.DEV && module.hot ) {
|
|||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
const replacerRings = new EntityReplacer( deferredRoot, () => new Rings(), 'Rings' );
|
const replacerSceneBegin = new EntityReplacer( deferredRoot, () => new SceneBegin(), 'SceneBegin' );
|
||||||
if ( process.env.DEV && module.hot ) {
|
if ( process.env.DEV && module.hot ) {
|
||||||
module.hot.accept( './entities/Rings', () => {
|
module.hot.accept( './entities/SceneBegin', () => {
|
||||||
replacerRings.replace();
|
replacerSceneBegin.current.lights.map( ( light ) => arraySetDelete( lights, light ) );
|
||||||
|
replacerSceneBegin.replace();
|
||||||
|
lights.push( ...replacerSceneBegin.current.lights );
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
const replacerCube = new EntityReplacer( deferredRoot, () => new Cube(), 'Cube' );
|
const replacerSceneNeuro = new EntityReplacer( deferredRoot, () => new SceneNeuro(), 'SceneNeuro' );
|
||||||
if ( process.env.DEV && module.hot ) {
|
if ( process.env.DEV && module.hot ) {
|
||||||
module.hot.accept( './entities/Cube', () => {
|
module.hot.accept( './entities/SceneNeuro', () => {
|
||||||
replacerCube.replace();
|
replacerSceneNeuro.current.lights.map( ( light ) => arraySetDelete( lights, light ) );
|
||||||
|
replacerSceneNeuro.replace();
|
||||||
|
lights.push( ...replacerSceneNeuro.current.lights );
|
||||||
|
replacerSceneNeuro.current.setDefferedCameraTarget( deferredCamera.cameraTarget );
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
const replacerWobbleball = new EntityReplacer( deferredRoot, () => new Wobbleball(), 'Wobbleball' );
|
const replacerSceneCrystals = new EntityReplacer( deferredRoot, () => new SceneCrystals(), 'SceneCrystals' );
|
||||||
if ( process.env.DEV && module.hot ) {
|
if ( process.env.DEV && module.hot ) {
|
||||||
module.hot.accept( './entities/Wobbleball', () => {
|
module.hot.accept( './entities/SceneCrystals', () => {
|
||||||
replacerWobbleball.replace();
|
replacerSceneCrystals.replace();
|
||||||
} );
|
|
||||||
}
|
|
||||||
|
|
||||||
const replacerIFSPistons = new EntityReplacer( deferredRoot, () => new IFSPistons(), 'IFSPistons' );
|
|
||||||
if ( process.env.DEV && module.hot ) {
|
|
||||||
module.hot.accept( './entities/IFSPistons', () => {
|
|
||||||
replacerIFSPistons.replace();
|
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -166,17 +153,6 @@ if ( process.env.DEV && module.hot ) {
|
|||||||
const forwardRoot = new Entity();
|
const forwardRoot = new Entity();
|
||||||
dog.root.children.push( forwardRoot );
|
dog.root.children.push( forwardRoot );
|
||||||
|
|
||||||
const replacerSufferTexts = new EntityReplacer(
|
|
||||||
forwardRoot,
|
|
||||||
() => new SufferTexts(),
|
|
||||||
'SufferTexts',
|
|
||||||
);
|
|
||||||
if ( process.env.DEV && module.hot ) {
|
|
||||||
module.hot.accept( './entities/SufferTexts', () => {
|
|
||||||
replacerSufferTexts.replace();
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
|
|
||||||
const replacerFlickyParticles = new EntityReplacer(
|
const replacerFlickyParticles = new EntityReplacer(
|
||||||
forwardRoot,
|
forwardRoot,
|
||||||
() => new FlickyParticles(),
|
() => new FlickyParticles(),
|
||||||
@@ -205,23 +181,9 @@ const swap = new Swap(
|
|||||||
} ),
|
} ),
|
||||||
);
|
);
|
||||||
|
|
||||||
const replacerLightsFirst = new EntityReplacer(
|
|
||||||
dog.root,
|
|
||||||
() => new LightsFirst( { scenes: [ dog.root ] } ),
|
|
||||||
'LightsFirst',
|
|
||||||
);
|
|
||||||
|
|
||||||
const replacerLightsPink = new EntityReplacer(
|
|
||||||
dog.root,
|
|
||||||
() => new LightsPink( {
|
|
||||||
scenes: [ dog.root ],
|
|
||||||
} ),
|
|
||||||
'LightsPink',
|
|
||||||
);
|
|
||||||
|
|
||||||
const lights = [
|
const lights = [
|
||||||
...replacerLightsFirst.current.lights,
|
...replacerSceneBegin.current.lights,
|
||||||
...replacerLightsPink.current.lights,
|
...replacerSceneNeuro.current.lights,
|
||||||
];
|
];
|
||||||
|
|
||||||
// const light2 = new LightEntity( {
|
// const light2 = new LightEntity( {
|
||||||
@@ -255,7 +217,7 @@ const deferredCamera = new DeferredCamera( {
|
|||||||
textureEnv: environmentMap.texture,
|
textureEnv: environmentMap.texture,
|
||||||
} );
|
} );
|
||||||
dog.root.children.push( deferredCamera );
|
dog.root.children.push( deferredCamera );
|
||||||
replacerLightsPink.current.setDefferedCameraTarget( deferredCamera.cameraTarget );
|
replacerSceneNeuro.current.setDefferedCameraTarget( deferredCamera.cameraTarget );
|
||||||
|
|
||||||
const forwardCamera = new ForwardCamera( {
|
const forwardCamera = new ForwardCamera( {
|
||||||
scenes: [ dog.root ],
|
scenes: [ dog.root ],
|
||||||
@@ -314,6 +276,10 @@ dog.root.components.push( new Lambda( {
|
|||||||
] ).scale( shake )
|
] ).scale( shake )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto( 'Camera/fov', ( { value } ) => {
|
||||||
|
camera.camera.fov = 90.0 * value;
|
||||||
|
} );
|
||||||
} );
|
} );
|
||||||
},
|
},
|
||||||
name: process.env.DEV && 'main/updateCamera',
|
name: process.env.DEV && 'main/updateCamera',
|
||||||
@@ -355,6 +321,13 @@ const serial = new Serial( {
|
|||||||
} );
|
} );
|
||||||
dog.root.children.push( serial );
|
dog.root.children.push( serial );
|
||||||
|
|
||||||
|
swap.swap();
|
||||||
|
const dvi = new DVi( {
|
||||||
|
input: swap.i,
|
||||||
|
target: swap.o,
|
||||||
|
} );
|
||||||
|
dog.root.children.push( dvi );
|
||||||
|
|
||||||
swap.swap();
|
swap.swap();
|
||||||
const post = new Post( {
|
const post = new Post( {
|
||||||
input: swap.i,
|
input: swap.i,
|
||||||
|
136
src/shaders/crystal.frag
Normal file
136
src/shaders/crystal.frag
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
#version 300 es
|
||||||
|
|
||||||
|
precision highp float;
|
||||||
|
|
||||||
|
#define fs(i) (fract(sin((i)*114.514)*1919.810))
|
||||||
|
#define saturate(x) clamp(x,0.,1.)
|
||||||
|
#define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a)))
|
||||||
|
|
||||||
|
const int MARCH_ITER = 90;
|
||||||
|
const float PI = 3.14159265;
|
||||||
|
const float TAU = PI * 2.0;
|
||||||
|
const float foldcos = cos( PI / 5.0 );
|
||||||
|
const float foldrem = sqrt( 0.75 - foldcos * foldcos );
|
||||||
|
const vec3 foldvec = vec3( -0.5, -foldcos, foldrem );
|
||||||
|
const vec3 foldface = vec3( 0.0, foldrem, foldcos );
|
||||||
|
|
||||||
|
#ifdef DEFERRED
|
||||||
|
layout (location = 0) out vec4 fragPosition;
|
||||||
|
layout (location = 1) out vec4 fragNormal;
|
||||||
|
layout (location = 2) out vec4 fragColor;
|
||||||
|
layout (location = 3) out vec4 fragWTF;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
in vec4 vPositionWithoutModel;
|
||||||
|
|
||||||
|
#ifdef SHADOW
|
||||||
|
out vec4 fragColor;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
uniform float deformAmp;
|
||||||
|
uniform float deformFreq;
|
||||||
|
uniform float deformTime;
|
||||||
|
uniform float time;
|
||||||
|
uniform float noiseOffset;
|
||||||
|
uniform vec2 resolution;
|
||||||
|
uniform vec2 size;
|
||||||
|
uniform vec2 cameraNearFar;
|
||||||
|
uniform vec3 cameraPos;
|
||||||
|
uniform mat4 normalMatrix;
|
||||||
|
uniform mat4 modelMatrix;
|
||||||
|
uniform mat4 viewMatrix;
|
||||||
|
uniform mat4 projectionMatrix;
|
||||||
|
uniform mat4 inversePVM;
|
||||||
|
uniform sampler2D samplerRandom;
|
||||||
|
uniform sampler2D samplerRandomStatic;
|
||||||
|
uniform sampler2D samplerCapture;
|
||||||
|
|
||||||
|
vec3 divideByW( vec4 v ) {
|
||||||
|
return v.xyz / v.w;
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://www.iquilezles.org/www/articles/smin/smin.htm
|
||||||
|
float smin( float a, float b, float k ) {
|
||||||
|
float h = max( k - abs( a - b ), 0.0 ) / k;
|
||||||
|
return min( a, b ) - h * h * h * k * ( 1.0 / 6.0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
mat2 rot2d( float t ) {
|
||||||
|
float c = cos( t );
|
||||||
|
float s = sin( t );
|
||||||
|
return mat2( c, -s, s, c );
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma glslify: cyclicNoise = require( ./modules/cyclicNoise );
|
||||||
|
|
||||||
|
vec3 fold( vec3 p ) {
|
||||||
|
for ( int i = 0; i < 5; i ++ ) {
|
||||||
|
p.xy = abs( p.xy );
|
||||||
|
p -= 2.0 * min( dot( foldvec, p ), 0.0 ) * foldvec;
|
||||||
|
}
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
float distFunc( vec3 p ) {
|
||||||
|
p.zx = rot2d( 0.5 * time ) * p.zx;
|
||||||
|
p -= size.xyx * vec3( 0.01, 0.2, 0.01 ) * cyclicNoise( vec3( 1.0, 0.04, 1.0 ) / size.xyx * p + noiseOffset );
|
||||||
|
p.y -= min( 0.8 * size.y - size.x, abs( p.y ) ) * sign( p.y );
|
||||||
|
p = fold( p );
|
||||||
|
return dot( p, foldface ) - size.x;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 normalFunc( vec3 p, float dd ) {
|
||||||
|
vec2 d = vec2( 0.0, dd );
|
||||||
|
return normalize( vec3(
|
||||||
|
distFunc( p + d.yxx ) - distFunc( p - d.yxx ),
|
||||||
|
distFunc( p + d.xyx ) - distFunc( p - d.xyx ),
|
||||||
|
distFunc( p + d.xxy ) - distFunc( p - d.xxy )
|
||||||
|
) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 p = ( gl_FragCoord.xy * 2.0 - resolution ) / resolution.y;
|
||||||
|
|
||||||
|
vec3 rayOri = divideByW( inversePVM * vec4( p, 0.0, 1.0 ) );
|
||||||
|
vec3 farPos = divideByW( inversePVM * vec4( p, 1.0, 1.0 ) );
|
||||||
|
vec3 rayDir = normalize( farPos - rayOri );
|
||||||
|
float rayLen = length( vPositionWithoutModel.xyz - rayOri );
|
||||||
|
vec3 rayPos = rayOri + rayDir * rayLen;
|
||||||
|
float dist;
|
||||||
|
|
||||||
|
for ( int i = 0; i < MARCH_ITER; i ++ ) {
|
||||||
|
dist = distFunc( rayPos );
|
||||||
|
rayLen += 0.5 * dist;
|
||||||
|
rayPos = rayOri + rayDir * rayLen;
|
||||||
|
|
||||||
|
if ( abs( dist ) < 1E-3 ) { break; }
|
||||||
|
if ( rayLen > cameraNearFar.y ) { break; }
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( 0.01 < dist ) {
|
||||||
|
discard;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec3 modelNormal = ( normalMatrix * vec4( normalFunc( rayPos, 1E-2 ), 1.0 ) ).xyz;
|
||||||
|
|
||||||
|
vec4 modelPos = modelMatrix * vec4( rayPos, 1.0 );
|
||||||
|
vec4 projPos = projectionMatrix * viewMatrix * modelPos; // terrible
|
||||||
|
float depth = projPos.z / projPos.w;
|
||||||
|
gl_FragDepth = 0.5 + 0.5 * depth;
|
||||||
|
|
||||||
|
#ifdef DEFERRED
|
||||||
|
fragPosition = vec4( modelPos.xyz, depth );
|
||||||
|
fragNormal = vec4( modelNormal, 1.0 );
|
||||||
|
fragColor = vec4( vec3( 0.5, 0.52, 1.0 ), 1.0 );
|
||||||
|
fragWTF = vec4( vec3( 0.02, 1.0, 0.0 ), 3 );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SHADOW
|
||||||
|
float shadowDepth = linearstep(
|
||||||
|
cameraNearFar.x,
|
||||||
|
cameraNearFar.y,
|
||||||
|
length( cameraPos - rayPos )
|
||||||
|
);
|
||||||
|
fragColor = vec4( shadowDepth, shadowDepth * shadowDepth, shadowDepth, 1.0 );
|
||||||
|
#endif
|
||||||
|
}
|
111
src/shaders/dvi.frag
Normal file
111
src/shaders/dvi.frag
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
#version 300 es
|
||||||
|
|
||||||
|
precision highp float;
|
||||||
|
|
||||||
|
const float PI = 3.14159265;
|
||||||
|
const vec3 LUMA = vec3( 0.2126, 0.7152, 0.0722 );
|
||||||
|
|
||||||
|
#define saturate(i) clamp(i,0.,1.)
|
||||||
|
#define linearstep(a,b,x) saturate(((x)-(a))/((b)-(a)))
|
||||||
|
#define lofi(i,m) (floor((i)/(m))*(m))
|
||||||
|
|
||||||
|
in vec2 vUv;
|
||||||
|
|
||||||
|
out vec4 fragColor;
|
||||||
|
|
||||||
|
uniform float time;
|
||||||
|
uniform vec2 resolution;
|
||||||
|
uniform sampler2D sampler0;
|
||||||
|
|
||||||
|
mat2 r2d( float t ) {
|
||||||
|
return mat2( cos( t ), sin( t ), -sin( t ), cos( t ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
float smin(float a,float b,float k){
|
||||||
|
float h = linearstep( k, 0.0, abs( a - b ) );
|
||||||
|
return min( a, b ) - h * h * h * k / 6.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
float dRadial(
|
||||||
|
vec2 p,
|
||||||
|
float offr,
|
||||||
|
float repr,
|
||||||
|
float exr,
|
||||||
|
float offx,
|
||||||
|
float exx,
|
||||||
|
float r
|
||||||
|
) {
|
||||||
|
p = r2d( offr ) * p;
|
||||||
|
float a = atan( p.y, p.x );
|
||||||
|
p = r2d( -lofi( a + repr / 2.0, repr ) ) * p;
|
||||||
|
a = atan( p.y, p.x );
|
||||||
|
p = r2d( -sign( a ) * min( abs( a ), exr ) ) * p;
|
||||||
|
p.x -= offx;
|
||||||
|
p.x -= sign( p.x ) * min( abs( p.x ), exx );
|
||||||
|
float d = length( p ) - r;
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdbox( vec2 p,vec2 d ) {
|
||||||
|
vec2 pt = abs( p ) - d;
|
||||||
|
return min( max( pt.x, pt.y ), 0.0 ) + length( max( pt, 0.0 ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
float dCirc( vec2 p ) {
|
||||||
|
return max( length( p ) - 0.02, 0.018 - length( p ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
float dOverlay( vec2 p ) {
|
||||||
|
float d = 1E9;
|
||||||
|
float t = time;
|
||||||
|
|
||||||
|
// center bar
|
||||||
|
d = min( d, sdbox( p, vec2( 0.12, 0.002 ) ) );
|
||||||
|
|
||||||
|
// circles
|
||||||
|
{
|
||||||
|
vec2 pt = abs( p );
|
||||||
|
d = min( d, dCirc( pt - vec2( 0.0, 0.05 ) ) );
|
||||||
|
d = min( d, dCirc( pt - vec2( 0.07, 0.05 ) ) );
|
||||||
|
d = min( d, dCirc( pt - vec2( 0.035, 0.05 + 0.035 * sqrt( 3.0 ) ) ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
// rings
|
||||||
|
{
|
||||||
|
float d2 = 1E9;
|
||||||
|
d2 = smin( d2, dRadial( p, 0.1 * t, PI / 2.0, PI / 8.0, 0.7, 0.0, 0.02 ), 0.05 );
|
||||||
|
d2 = smin( d2, dRadial( p, 0.1 * t + PI / 4.0, PI / 2.0, PI / 8.0, 0.72, 0.0, 0.02 ), 0.05 );
|
||||||
|
d = min( d2, d );
|
||||||
|
}
|
||||||
|
|
||||||
|
d = min( d, dRadial( p, 0.1 * t, PI / 8.0, PI / 19.0, 0.76, 0.002, 0.0 ) );
|
||||||
|
d = min( d, dRadial( p, -0.1 * t, PI / 8.0, PI / 9.0, 0.78, 0.01, 0.0 ) );
|
||||||
|
d = min( d, dRadial( p, 0.04 * t, PI / 48.0, 0.002, 0.815, 0.008, 0.0 ) );
|
||||||
|
d = min( d, dRadial( p, 0.04 * t, PI / 192.0, 0.002, 0.815, 0.002, 0.0 ) );
|
||||||
|
|
||||||
|
{
|
||||||
|
float d2 = 1E9;
|
||||||
|
d2 = smin( d2, dRadial( p, 0.1 * t, PI / 1.5, PI / 8.0, 0.86, 0.0, 0.02 ), 0.05 );
|
||||||
|
d2 = smin( d2, dRadial( p, 0.1 * t + PI / 4.0, PI / 1.5, PI, 0.88, 0.0, 0.02 ), 0.05 );
|
||||||
|
d = min( d2, d );
|
||||||
|
}
|
||||||
|
|
||||||
|
d = min( d, dRadial( p, 0.2 * t, PI / 2.0, PI / 4.2, 0.915, 0.002, 0.0 ) );
|
||||||
|
d = min( d, dRadial( p, -.1 * t, PI / 4.0, PI / 8.5, 0.94, 0.01, 0.0 ) );
|
||||||
|
d = min( d, dRadial( p, 0.04 * t, PI / 96.0, 0.002, 0.99, 0.03, 0.0 ) );
|
||||||
|
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
vec2 uv = vUv;
|
||||||
|
vec2 p = ( uv * resolution * 2.0 - resolution ) / resolution.y;
|
||||||
|
|
||||||
|
vec3 col = texture( sampler0, uv ).rgb;
|
||||||
|
|
||||||
|
float d = dOverlay( p * 0.65 );
|
||||||
|
float shape = linearstep( 2.0 / resolution.y, 0.0, d );
|
||||||
|
col = mix( col, saturate( 0.5 - 0.3 * col.gbr ), shape );
|
||||||
|
|
||||||
|
fragColor = vec4( col, 1.0 );
|
||||||
|
}
|
@@ -41,6 +41,12 @@ vec3 divideByW( vec4 v ) {
|
|||||||
return v.xyz / v.w;
|
return v.xyz / v.w;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://www.iquilezles.org/www/articles/smin/smin.htm
|
||||||
|
float smin( float a, float b, float k ) {
|
||||||
|
float h = max( k - abs( a - b ), 0.0 ) / k;
|
||||||
|
return min( a, b ) - h * h * h * k * ( 1.0 / 6.0 );
|
||||||
|
}
|
||||||
|
|
||||||
mat2 rot2d( float t ) {
|
mat2 rot2d( float t ) {
|
||||||
float c = cos( t );
|
float c = cos( t );
|
||||||
float s = sin( t );
|
float s = sin( t );
|
||||||
@@ -54,7 +60,7 @@ vec3 ifs( vec3 p, vec3 r, vec3 t ) {
|
|||||||
vec3 s = t;
|
vec3 s = t;
|
||||||
mat3 bas = orthBasis( r );
|
mat3 bas = orthBasis( r );
|
||||||
|
|
||||||
for ( int i = 0; i < 6; i ++ ) {
|
for ( int i = 0; i < 5; i ++ ) {
|
||||||
p = abs( p ) - abs( s ) * pow( 1.8, -float( i ) );
|
p = abs( p ) - abs( s ) * pow( 1.8, -float( i ) );
|
||||||
|
|
||||||
s = bas * s;
|
s = bas * s;
|
||||||
@@ -82,8 +88,8 @@ vec4 map( vec3 p ) {
|
|||||||
pt.y += 10.0;
|
pt.y += 10.0;
|
||||||
|
|
||||||
vec3 r = mix(
|
vec3 r = mix(
|
||||||
fs( vec3( 4.7, 2.2, 8.3 ) + floor( ifsSeed ) ),
|
fs( vec3( 4.7, 3.2, 4.3 ) + floor( ifsSeed ) ),
|
||||||
fs( vec3( 4.7, 2.2, 8.3 ) + floor( ifsSeed + 1.0 ) ),
|
fs( vec3( 4.7, 3.2, 4.3 ) + floor( ifsSeed + 1.0 ) ),
|
||||||
fract( ifsSeed )
|
fract( ifsSeed )
|
||||||
);
|
);
|
||||||
vec3 t = 0.1 * vec3( 4.2, 3.5, 2.2 );
|
vec3 t = 0.1 * vec3( 4.2, 3.5, 2.2 );
|
||||||
@@ -91,19 +97,21 @@ vec4 map( vec3 p ) {
|
|||||||
|
|
||||||
pt = mod( pt - 0.1, 0.2 ) - 0.1;
|
pt = mod( pt - 0.1, 0.2 ) - 0.1;
|
||||||
|
|
||||||
isect = vec4( max( box( pt, vec3( 0.04 ) ), clampbox ), 2, 0, 0 );
|
float d = max( box( pt, vec3( 0.05 ) ), clampbox );
|
||||||
|
|
||||||
|
isect = vec4( d, 2, 0, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
vec3 pt = p;
|
vec3 pt = p;
|
||||||
|
|
||||||
float clampbox = box( pt, vec3( 1.0, 10.0, 1.0 ) - 0.1 );
|
float clampbox = box( pt, vec3( 1.0, 10.0, 1.0 ) - 0.02 );
|
||||||
|
|
||||||
pt.y += 10.0;
|
pt.y += 10.0;
|
||||||
|
|
||||||
vec3 r = mix(
|
vec3 r = mix(
|
||||||
fs( vec3( 5.3, 1.1, 2.9 ) + floor( ifsSeed ) ),
|
fs( vec3( 5.3, 1.9, 3.9 ) + floor( ifsSeed ) ),
|
||||||
fs( vec3( 5.3, 1.1, 2.9 ) + floor( ifsSeed + 1.0 ) ),
|
fs( vec3( 5.3, 1.9, 3.9 ) + floor( ifsSeed + 1.0 ) ),
|
||||||
fract( ifsSeed )
|
fract( ifsSeed )
|
||||||
);
|
);
|
||||||
vec3 t = 0.2 * vec3( 3.0, 2.3, 3.5 );
|
vec3 t = 0.2 * vec3( 3.0, 2.3, 3.5 );
|
||||||
@@ -111,7 +119,11 @@ vec4 map( vec3 p ) {
|
|||||||
|
|
||||||
pt = mod( pt - 0.1, 0.2 ) - 0.1;
|
pt = mod( pt - 0.1, 0.2 ) - 0.1;
|
||||||
|
|
||||||
vec4 isectb = vec4( clampbox, 2, 0, 0 );
|
float d = max( box( pt, vec3( 0.07 ) ), clampbox );
|
||||||
|
|
||||||
|
float gorge = step( 0.0, 0.005 - abs( pt.x ) );
|
||||||
|
|
||||||
|
vec4 isectb = vec4( d, 1.0 + 2.0 * gorge, 0, 0 );
|
||||||
isect = isectb.x < isect.x ? isectb : isect;
|
isect = isectb.x < isect.x ? isectb : isect;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,7 +132,7 @@ vec4 map( vec3 p ) {
|
|||||||
|
|
||||||
float d = box( pt - vec3( 1.0, 0.0, 1.0 ), vec3( 0.02, 9.9, 0.02 ) );
|
float d = box( pt - vec3( 1.0, 0.0, 1.0 ), vec3( 0.02, 9.9, 0.02 ) );
|
||||||
|
|
||||||
vec4 isectb = vec4( d, 3, 0, 0 );
|
vec4 isectb = vec4( d, 4, 0, 0 );
|
||||||
isect = isectb.x < isect.x ? isectb : isect;
|
isect = isectb.x < isect.x ? isectb : isect;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,21 +182,34 @@ void main() {
|
|||||||
fragPosition = vec4( modelPos.xyz, depth );
|
fragPosition = vec4( modelPos.xyz, depth );
|
||||||
fragNormal = vec4( modelNormal, 1.0 );
|
fragNormal = vec4( modelNormal, 1.0 );
|
||||||
|
|
||||||
if ( isect.y == 2.0 ) {
|
if ( isect.y < 2.5 ) {
|
||||||
vec3 noise = cyclicNoise( 3.0 * rayPos );
|
vec3 noise = cyclicNoise( 3.0 * rayPos );
|
||||||
vec3 noiseDetail = cyclicNoise( vec3( 38.0, 1.0, 1.0 ) * ( orthBasis( vec3( 1 ) ) * rayPos ) );
|
vec3 noiseDetail = cyclicNoise( vec3( 38.0, 1.0, 1.0 ) * ( orthBasis( vec3( 1 ) ) * rayPos ) );
|
||||||
|
|
||||||
|
if ( isect.y == 1.0 ) {
|
||||||
float roughness = (
|
float roughness = (
|
||||||
0.6 +
|
0.6 +
|
||||||
0.1 * noise.x +
|
0.1 * noise.x +
|
||||||
0.2 * smoothstep( -0.2, 0.4, noise.y ) * ( 0.8 + 0.2 * sin( 17.0 * noiseDetail.x ) )
|
0.2 * smoothstep( -0.2, 0.4, noise.y ) * ( 0.8 + 0.2 * sin( 17.0 * noiseDetail.x ) )
|
||||||
);
|
);
|
||||||
|
|
||||||
fragColor = vec4( vec3( 0.4 ), 1.0 );
|
fragColor = vec4( vec3( 0.04 ), 1.0 );
|
||||||
fragWTF = vec4( vec3( roughness, 0.9, 0.0 ), 2 );
|
fragWTF = vec4( vec3( roughness, 0.9, 0.0 ), 2 );
|
||||||
} else if ( isect.y == 1.0 ) {
|
} else {
|
||||||
fragColor = vec4( vec3( 1.0 ), 1.0 );
|
float roughness = (
|
||||||
fragWTF = vec4( vec3( 0.3, 0.1, 0.0 ), 2 );
|
0.2 +
|
||||||
|
0.2 * ( 0.5 + 0.5 * sin( 17.0 * noiseDetail.x ) )
|
||||||
|
);
|
||||||
|
|
||||||
|
fragColor = vec4( vec3( 0.3 ), 1.0 );
|
||||||
|
fragWTF = vec4( vec3( roughness, 0.1, 0.0 ), 2 );
|
||||||
|
}
|
||||||
} else if ( isect.y == 3.0 ) {
|
} else if ( isect.y == 3.0 ) {
|
||||||
|
float amp = 20.0 * exp( -5.0 * fract( abs( rayPos.x ) - rayPos.y + abs( rayPos.z ) + time ) );
|
||||||
|
|
||||||
|
fragColor = vec4( 0.2 * vec3( 1.0, 0.002, 0.03 ), 1.0 );
|
||||||
|
fragWTF = vec4( vec3( 0.1, 0.1, amp ), 2 );
|
||||||
|
} else if ( isect.y == 4.0 ) {
|
||||||
fragColor = vec4( 0.2 * vec3( 1.0, 0.002, 0.03 ), 1.0 );
|
fragColor = vec4( 0.2 * vec3( 1.0, 0.002, 0.03 ), 1.0 );
|
||||||
fragWTF = vec4( vec3( 0.1, 0.1, 20.0 ), 2 );
|
fragWTF = vec4( vec3( 0.1, 0.1, 20.0 ), 2 );
|
||||||
}
|
}
|
||||||
|
@@ -16,6 +16,7 @@ in vec4 vPosition;
|
|||||||
out vec4 fragColor;
|
out vec4 fragColor;
|
||||||
|
|
||||||
uniform float time;
|
uniform float time;
|
||||||
|
uniform float intensity;
|
||||||
uniform vec2 lightNearFar;
|
uniform vec2 lightNearFar;
|
||||||
uniform vec2 resolution;
|
uniform vec2 resolution;
|
||||||
uniform vec2 cameraNearFar;
|
uniform vec2 cameraNearFar;
|
||||||
@@ -107,5 +108,5 @@ void main() {
|
|||||||
if ( rayLen > cameraNearFar.y ) { break; }
|
if ( rayLen > cameraNearFar.y ) { break; }
|
||||||
}
|
}
|
||||||
|
|
||||||
fragColor = vec4( 0.01 * lightColor * accum, 1.0 );
|
fragColor = vec4( intensity * lightColor * accum, 1.0 );
|
||||||
}
|
}
|
||||||
|
@@ -33,7 +33,7 @@ void main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
float index = ( reverse ? texIndex.y : texIndex.x ) - 1.0;
|
float index = ( reverse ? texIndex.y : texIndex.x ) - 1.0;
|
||||||
float width = texIndex.x + texIndex.y - 1.0;
|
float width = texIndex.x + texIndex.y - 2.0;
|
||||||
|
|
||||||
bool isCompHigher = mod( index, 2.0 * comp * width ) < comp * width;
|
bool isCompHigher = mod( index, 2.0 * comp * width ) < comp * width;
|
||||||
float offset = floor( ( ( isCompHigher ^^ reverse ) ? comp : -comp ) * width + 0.5 );
|
float offset = floor( ( ( isCompHigher ^^ reverse ) ? comp : -comp ) * width + 0.5 );
|
||||||
|
@@ -24,14 +24,6 @@ uniform sampler2D samplerRandom;
|
|||||||
|
|
||||||
#pragma glslify: prng = require( ./-prng );
|
#pragma glslify: prng = require( ./-prng );
|
||||||
|
|
||||||
vec3 colorMap( vec3 i ) {
|
|
||||||
return vec3(
|
|
||||||
smoothstep( 0.0, 1.0, i.r ),
|
|
||||||
i.g,
|
|
||||||
0.1 + 0.8 * i.b
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec3 barrel( float amp, vec2 uv ) {
|
vec3 barrel( float amp, vec2 uv ) {
|
||||||
float corn = length( vec2( 0.5 ) );
|
float corn = length( vec2( 0.5 ) );
|
||||||
float a = min( 3.0 * sqrt( amp ), corn * PI );
|
float a = min( 3.0 * sqrt( amp ), corn * PI );
|
||||||
|
@@ -23,13 +23,13 @@ uniform float time;
|
|||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
#ifdef FORWARD
|
#ifdef FORWARD
|
||||||
fragColor = vec4( 8.0 * vec3( 0.1, 0.9, 0.4 ), 1.0 );
|
fragColor = vec4( 8.0 * vec3( 0.1, 0.4, 1.0 ), 1.0 );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEFERRED
|
#ifdef DEFERRED
|
||||||
fragPosition = vPosition;
|
fragPosition = vPosition;
|
||||||
fragNormal = vec4( normalize( vNormal ), 1.0 );
|
fragNormal = vec4( normalize( vNormal ), 1.0 );
|
||||||
fragColor = vec4( 0.1, 0.9, 0.4, 1.0 );
|
fragColor = vec4( 0.1, 0.4, 1.0, 1.0 );
|
||||||
fragWTF = vec4( vec3( 0.2, 0.2, 8.0 ), MTL_PBR );
|
fragWTF = vec4( vec3( 0.2, 0.2, 8.0 ), MTL_PBR );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@@ -37,7 +37,7 @@ void main() {
|
|||||||
vNormal = normalize( ( normalMatrix * vec4( normal, 1.0 ) ).xyz );
|
vNormal = normalize( ( normalMatrix * vec4( normal, 1.0 ) ).xyz );
|
||||||
|
|
||||||
vPosition = vec4( mix( 2.0, 2.7, random() ) * position, 1.0 );
|
vPosition = vec4( mix( 2.0, 2.7, random() ) * position, 1.0 );
|
||||||
vPosition.xyz += mix( 0.002, 0.005, random() ) * normal;
|
vPosition.xyz += mix( 0.005, 0.01, random() ) * normal;
|
||||||
vPosition.y += sin( random() * time + random() * vPosition.x + TAU * random() ) * 0.2 * random();
|
vPosition.y += sin( random() * time + random() * vPosition.x + TAU * random() ) * 0.2 * random();
|
||||||
vPosition.y += sin( random() * time + random() * vPosition.z + TAU * random() ) * 0.2 * random();
|
vPosition.y += sin( random() * time + random() * vPosition.z + TAU * random() ) * 0.2 * random();
|
||||||
vPosition.xy = rotate2D( 0.2 * ( random() - 0.5 ) ) * vPosition.xy;
|
vPosition.xy = rotate2D( 0.2 * ( random() - 0.5 ) ) * vPosition.xy;
|
||||||
|
@@ -5,6 +5,7 @@ precision highp float;
|
|||||||
const int MTL_NONE = 0;
|
const int MTL_NONE = 0;
|
||||||
const int MTL_UNLIT = 1;
|
const int MTL_UNLIT = 1;
|
||||||
const int MTL_PBR = 2;
|
const int MTL_PBR = 2;
|
||||||
|
const int MTL_REFRACT = 3;
|
||||||
const float ENV_UV_MARGIN = 0.9375;
|
const float ENV_UV_MARGIN = 0.9375;
|
||||||
const float AO_BIAS = 0.0;
|
const float AO_BIAS = 0.0;
|
||||||
const float AO_RADIUS = 0.5;
|
const float AO_RADIUS = 0.5;
|
||||||
@@ -192,7 +193,6 @@ vec3 shadePBR( Isect isect ) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
shadow *= castShadow( iLight, lightP * 0.5 + 0.5, isect, NdotL );
|
shadow *= castShadow( iLight, lightP * 0.5 + 0.5, isect, NdotL );
|
||||||
shadow = mix( 0.0, 1.0, shadow );
|
|
||||||
|
|
||||||
// do shading
|
// do shading
|
||||||
vec3 diffuse = brdfLambert( f0, albedo, VdotH );
|
vec3 diffuse = brdfLambert( f0, albedo, VdotH );
|
||||||
@@ -268,6 +268,18 @@ void main() {
|
|||||||
} else if ( isect.materialId == MTL_PBR ) {
|
} else if ( isect.materialId == MTL_PBR ) {
|
||||||
color = shadePBR( isect );
|
color = shadePBR( isect );
|
||||||
|
|
||||||
|
} else if ( isect.materialId == MTL_REFRACT ) {
|
||||||
|
color = shadePBR( isect );
|
||||||
|
|
||||||
|
// really really cheap full spectrum
|
||||||
|
vec3 refrEnvRefractive = refract( V, isect.normal, 1.0 / 2.56 );
|
||||||
|
vec2 uvEnvRefractive = vec2(
|
||||||
|
0.5 + atan( refrEnvRefractive.x, -refrEnvRefractive.z ) / TAU,
|
||||||
|
0.5 + atan( refrEnvRefractive.y, length( refrEnvRefractive.zx ) ) / PI
|
||||||
|
);
|
||||||
|
vec3 texEnvRefractive = sampleEnvLinear( uvEnvRefractive, 0.1 ).rgb;
|
||||||
|
|
||||||
|
color += isect.color * texEnvRefractive;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -142,8 +142,8 @@ void main() {
|
|||||||
#ifdef DEFERRED
|
#ifdef DEFERRED
|
||||||
fragPosition = vec4( modelPos.xyz, depth );
|
fragPosition = vec4( modelPos.xyz, depth );
|
||||||
fragNormal = vec4( modelNormal, 1.0 );
|
fragNormal = vec4( modelNormal, 1.0 );
|
||||||
fragColor = vec4( 0.4, 0.7, 0.9, 1.0 );
|
fragColor = vec4( vec3( 0.3 ), 1.0 );
|
||||||
fragWTF = vec4( vec3( 0.9, 0.7, 0.0 ), MTL_PBR );
|
fragWTF = vec4( vec3( 1.0, 0.1, 0.0 ), MTL_PBR );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef SHADOW
|
#ifdef SHADOW
|
||||||
|
Reference in New Issue
Block a user