Skip to content

Commit

Permalink
feat(webgl-shadertoy): add support for DefShaderOpts
Browse files Browse the repository at this point in the history
  • Loading branch information
postspectacular committed Oct 8, 2021
1 parent ef46bf5 commit d35cabc
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 32 deletions.
13 changes: 11 additions & 2 deletions packages/webgl-shadertoy/src/api.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import type { Fn2 } from "@thi.ng/api";
import type { FloatSym, IntSym, ScopeBody, Vec2Sym } from "@thi.ng/shader-ast";
import type { GLSLTarget } from "@thi.ng/shader-ast-glsl";
import type { ITexture, ModelSpec, UniformDecl } from "@thi.ng/webgl";
import type {
DefShaderOpts,
ITexture,
ModelSpec,
UniformDecl,
} from "@thi.ng/webgl";

export type MainImageFn<U extends ShaderToyUniforms> = Fn2<
GLSLTarget,
Expand Down Expand Up @@ -31,12 +36,16 @@ export interface ShaderToyOpts<U extends ShaderToyUniforms> {
* Optional textures to bind
*/
textures?: ITexture[];
/**
* Options for {@link @thi.ng/webgl#defShader}.
*/
opts?: Partial<DefShaderOpts>;
}

export interface ShaderToy<U extends ShaderToyUniforms> {
start(): void;
stop(): void;
update(time?: number): void;
recompile(main: MainImageFn<U>): void;
recompile(main: MainImageFn<U>, opts?: Partial<DefShaderOpts>): void;
model: ModelSpec;
}
65 changes: 35 additions & 30 deletions packages/webgl-shadertoy/src/shadertoy.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { assign } from "@thi.ng/shader-ast/ast/assign";
import { defMain, defn } from "@thi.ng/shader-ast/ast/function";
import { FLOAT0, FLOAT1, vec4 } from "@thi.ng/shader-ast/ast/lit";
import type { DefShaderOpts } from "@thi.ng/webgl";
import { compileModel } from "@thi.ng/webgl/buffer";
import { draw } from "@thi.ng/webgl/draw";
import { defQuadModel } from "@thi.ng/webgl/geo/quad";
Expand Down Expand Up @@ -66,40 +67,44 @@ export const shaderToy = <U extends ShaderToyUniforms>(
update(time: number) {
update(time);
},
recompile(main: MainImageFn<U>) {
recompile(main: MainImageFn<U>, shaderOpts?: Partial<DefShaderOpts>) {
if (model.shader) {
model.shader.release();
}
model.shader = defShader(gl, {
vs: (gl, _, ins) => [
defMain(() => [
assign(
gl.gl_Position,
vec4(ins.position, FLOAT0, FLOAT1)
),
]),
],
fs: (gl, unis, _, outputs) => [
defMain(() => [
assign(
outputs.fragColor,
defn("vec4", "mainImage", [], () =>
main(gl, <any>unis)
)()
),
]),
],
attribs: {
position: "vec2",
model.shader = defShader(
gl,
{
vs: (gl, _, ins) => [
defMain(() => [
assign(
gl.gl_Position,
vec4(ins.position, FLOAT0, FLOAT1)
),
]),
],
fs: (gl, unis, _, outputs) => [
defMain(() => [
assign(
outputs.fragColor,
defn("vec4", "mainImage", [], () =>
main(gl, <any>unis)
)()
),
]),
],
attribs: {
position: "vec2",
},
uniforms: {
resolution: "vec2",
mouse: ["vec2", [0, 0]],
mouseButtons: ["int", 0],
time: "float",
...opts.uniforms,
},
},
uniforms: {
resolution: "vec2",
mouse: ["vec2", [0, 0]],
mouseButtons: ["int", 0],
time: "float",
...opts.uniforms,
},
});
shaderOpts || opts.opts
);
},
model,
};
Expand Down

0 comments on commit d35cabc

Please sign in to comment.