From 4f0de6a39bd7df3067bc68824e056037e5e6d4de Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Fri, 25 Jun 2021 09:55:35 +0200 Subject: [PATCH] [orx-shader-phrases] Add shader embedding --- buildSrc/build.gradle.kts | 8 + .../main/kotlin/orx.embed-shaders.gradle.kts | 39 +++++ .../commonMain/kotlin/phrases/NoisePhrases.kt | 36 ----- .../src/commonMain/kotlin/phrases/Simplex.kt | 7 - .../extra/noise/shaders/gl3/cell-noise.frag | 56 ------- .../extra/noise/shaders/gl3/hash-noise.frag | 31 ---- .../noise/shaders/gl3/simplex-noise-3d.frag | 143 ------------------ .../noise/shaders/gl3/speckle-noise.frag | 35 ----- .../extra/noise/shaders/gl3/value-noise.frag | 53 ------- .../extra/noise/shaders/gl3/worley-noise.frag | 80 ---------- orx-shader-phrases/README.md | 30 +--- orx-shader-phrases/build.gradle.kts | 21 ++- .../commonMain/kotlin/ShaderPreprocessor.kt | 3 +- .../src/commonMain/kotlin/phrases/Matrix.kt | 3 - .../src/shaders/glsl/phraseHash21.shader | 3 + .../src/shaders/glsl/phraseHash33.shader | 6 + .../phraseProjectionToViewCoordinate.shader | 5 + .../glsl/phraseProjectionToViewDepth.shader | 5 + .../src/shaders/glsl/phraseSimplex31.shader | 2 +- .../src/shaders/glsl/phraseTbnMatrix.shader | 5 + .../shaders/glsl/phraseValueNoise21.shader | 14 ++ .../glsl/phraseViewToProjectionDepth.shader | 5 + 22 files changed, 111 insertions(+), 479 deletions(-) create mode 100644 buildSrc/build.gradle.kts create mode 100644 buildSrc/src/main/kotlin/orx.embed-shaders.gradle.kts delete mode 100644 orx-noise/src/commonMain/kotlin/phrases/NoisePhrases.kt delete mode 100644 orx-noise/src/commonMain/kotlin/phrases/Simplex.kt delete mode 100644 orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/cell-noise.frag delete mode 100644 orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/hash-noise.frag delete mode 100644 orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/simplex-noise-3d.frag delete mode 100644 orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/speckle-noise.frag delete mode 100644 orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/value-noise.frag delete mode 100644 orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/worley-noise.frag delete mode 100644 orx-shader-phrases/src/commonMain/kotlin/phrases/Matrix.kt create mode 100644 orx-shader-phrases/src/shaders/glsl/phraseHash21.shader create mode 100644 orx-shader-phrases/src/shaders/glsl/phraseHash33.shader create mode 100644 orx-shader-phrases/src/shaders/glsl/phraseProjectionToViewCoordinate.shader create mode 100644 orx-shader-phrases/src/shaders/glsl/phraseProjectionToViewDepth.shader rename orx-noise/src/main/resources/org/openrndr/extra/noise/phrases/gl3/simplex-3.frag => orx-shader-phrases/src/shaders/glsl/phraseSimplex31.shader (90%) create mode 100644 orx-shader-phrases/src/shaders/glsl/phraseTbnMatrix.shader create mode 100644 orx-shader-phrases/src/shaders/glsl/phraseValueNoise21.shader create mode 100644 orx-shader-phrases/src/shaders/glsl/phraseViewToProjectionDepth.shader diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 00000000..6e98d93a --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,8 @@ +plugins { + `kotlin-dsl` +} + +repositories { + mavenCentral() + +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/orx.embed-shaders.gradle.kts b/buildSrc/src/main/kotlin/orx.embed-shaders.gradle.kts new file mode 100644 index 00000000..cc3af64e --- /dev/null +++ b/buildSrc/src/main/kotlin/orx.embed-shaders.gradle.kts @@ -0,0 +1,39 @@ + + +abstract class EmbedShadersTask : DefaultTask() { + @get:Incremental + @get:PathSensitive(PathSensitivity.NAME_ONLY) + @get:InputDirectory + abstract val inputDir: DirectoryProperty + + @get:OutputDirectory + abstract val outputDir: DirectoryProperty + + @get:Input + abstract val defaultPackage: Property + + @TaskAction + fun execute(inputChanges: InputChanges) { + inputChanges.getFileChanges(inputDir).forEach { change -> + if (change.fileType == FileType.DIRECTORY) return@forEach + val name = change.file.nameWithoutExtension + val targetFile = outputDir.file(change.normalizedPath.replace(".","_")+".kt").get().asFile + if (change.changeType == ChangeType.REMOVED) { + targetFile.delete() + } else { + val contents = change.file.readText() + val lines = contents.split("\n") + var packageStatement = "package ${defaultPackage.get()}\n" + val r = Regex("#pragma package ([a-z.]+)") + for (line in lines) { + val m = r.find(line.trim()) + if (m != null) { + packageStatement = "package ${m.groupValues[1]}\n" + } + } + val text = "${packageStatement}const val $name = ${"\"\"\""}${contents}${"\"\"\""}" + targetFile.writeText(text) + } + } + } +} \ No newline at end of file diff --git a/orx-noise/src/commonMain/kotlin/phrases/NoisePhrases.kt b/orx-noise/src/commonMain/kotlin/phrases/NoisePhrases.kt deleted file mode 100644 index b2aeb5bc..00000000 --- a/orx-noise/src/commonMain/kotlin/phrases/NoisePhrases.kt +++ /dev/null @@ -1,36 +0,0 @@ -//@file:ShaderPhrases(exports = ["hash22","hash21","valueNoise21"]) -package org.openrndr.extra.noise.phrases - -//import org.openrndr.extra.shaderphrases.annotations.ShaderPhrases - -val phraseHash22 = """vec2 hash22(vec2 p) { - float n = sin(dot(p, vec2(41, 289))); - return fract(vec2(262144, 32768)*n); -} -""" - -val phraseHash21 = "float hash21(vec2 p) { return fract(1e4 * sin(17.0 * p.x + p.y * 0.1) * (0.1 + abs(sin(p.y * 13.0 + p.x)))); }" - -val phraseHash33 = """ -#define MOD3 vec3(.1031,.11369,.13787) -vec3 hash33(vec3 p3) { - p3 = fract(p3 * MOD3); - p3 += dot(p3, p3.yxz+19.19); - return -1.0 + 2.0 * fract(vec3((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y, (p3.y+p3.z)*p3.x)); -} -""" - -val phraseValueNoise21 = """ -float noise(vec2 x) { - vec2 i = floor(x); - vec2 f = fract(x); - - float a = hash21(i); - float b = hash21(i + vec2(1.0, 0.0)); - float c = hash21(i + vec2(0.0, 1.0)); - float d = hash21(i + vec2(1.0, 1.0)); - - vec2 u = f * f * (3.0 - 2.0 * f); - return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y; -} -""".trimIndent() diff --git a/orx-noise/src/commonMain/kotlin/phrases/Simplex.kt b/orx-noise/src/commonMain/kotlin/phrases/Simplex.kt deleted file mode 100644 index 41f449dd..00000000 --- a/orx-noise/src/commonMain/kotlin/phrases/Simplex.kt +++ /dev/null @@ -1,7 +0,0 @@ -//@file:ShaderPhrases([]) -package org.openrndr.extra.noise.phrases -// -//import org.openrndr.extra.shaderphrases.annotations.ShaderPhrases -//import org.openrndr.extra.shaderphrases.phraseResource -// -//val phraseSimplex3 by phraseResource("/org/openrndr/extra/noise/phrases/gl3/simplex-3.frag") \ No newline at end of file diff --git a/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/cell-noise.frag b/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/cell-noise.frag deleted file mode 100644 index ff01d6c7..00000000 --- a/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/cell-noise.frag +++ /dev/null @@ -1,56 +0,0 @@ -#version 330 - -// uniforms -uniform vec4 gain; -uniform vec4 bias; -uniform vec2 seed; - -uniform vec2 scale; -uniform vec2 lacunarity; -uniform vec4 decay; -uniform int octaves; -uniform bool premultipliedAlpha; - -// varyings -in vec2 v_texCoord0; - -// outputs -out vec4 o_output; - -vec2 hash22(vec2 p) { - float n = sin(dot(p, vec2(41, 289))); - return fract(vec2(262144, 32768)*n); -} - -float cell(vec2 p) { - vec2 ip = floor(p); - p = fract(p); - - float d = 1.0; - for (int i = -1; i <= 1; i++) { - for (int j = -1; j <= 1; j++) { - vec2 cellRef = vec2(i, j); - vec2 offset = hash22(ip + cellRef); - vec2 r = cellRef + offset - p; - float d2 = dot(r, r); - d = min(d, d2); - } - } - return d; -} - -void main() { - vec4 result = vec4(0.0); - vec4 _gain = gain; - vec2 _scale = scale; - for (int o = 0; o < octaves; ++o) { - result += cell((v_texCoord0+seed) * _scale) * _gain; - _scale *= lacunarity; - _gain *= decay; - } - o_output = result + bias; - - if (premultipliedAlpha) { - o_output.rgb *= o_output.a; - } -} \ No newline at end of file diff --git a/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/hash-noise.frag b/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/hash-noise.frag deleted file mode 100644 index fc94b2de..00000000 --- a/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/hash-noise.frag +++ /dev/null @@ -1,31 +0,0 @@ -#version 330 - -// uniforms -uniform vec4 gain; -uniform vec4 bias; -uniform bool monochrome; -uniform float seed; - -// varyings -in vec2 v_texCoord0; - -// outputs -out vec4 o_output; - -vec2 hash22(vec2 p) { - float n = sin(dot(p, vec2(41, 289))); - return fract(vec2(262144, 32768)*n); -} - -void main() { - - vec2 vseed = vec2(seed); - if (!monochrome) { - o_output.rg = hash22(vseed + v_texCoord0) * gain.rg + bias.rg; - o_output.ba = hash22(vseed + v_texCoord0+vec2(1.0, 1.0)) * gain.ba + bias.ba; - } else { - float c = hash22(vseed + v_texCoord0).r; - o_output = c * gain + bias; - } - -} \ No newline at end of file diff --git a/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/simplex-noise-3d.frag b/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/simplex-noise-3d.frag deleted file mode 100644 index 95e163db..00000000 --- a/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/simplex-noise-3d.frag +++ /dev/null @@ -1,143 +0,0 @@ -#version 330 - -// uniforms -uniform vec4 gain; -uniform vec4 bias; -uniform vec3 seed; -uniform vec3 scale; - -uniform vec3 lacunarity; -uniform vec4 decay; -uniform int octaves; -uniform bool premultipliedAlpha; - -// varyings -in vec2 v_texCoord0; - -// outputs -out vec4 o_output; - -// Simplex Noise 3D Implementation -// Description : Array and textureless GLSL 2D/3D/4D simplex -// noise functions. -// Author : Ian McEwan, Ashima Arts. -// Maintainer : ijm -// 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 -// -// -vec3 mod289(vec3 x) { - return x - floor(x * (1.0 / 289.0)) * 289.0; -} - -vec4 mod289(vec4 x) { - return x - floor(x * (1.0 / 289.0)) * 289.0; -} - -vec4 permute(vec4 x) { - return mod289(((x*34.0)+1.0)*x); -} - -vec4 taylorInvSqrt(vec4 r) -{ - return 1.79284291400159 - 0.85373472095314 * r; -} - -float snoise(vec3 v) -{ - const vec2 C = vec2(1.0/6.0, 1.0/3.0) ; - const vec4 D = vec4(0.0, 0.5, 1.0, 2.0); - - // First corner - vec3 i = floor(v + dot(v, C.yyy) ); - vec3 x0 = v - i + dot(i, C.xxx) ; - - // Other corners - vec3 g = step(x0.yzx, x0.xyz); - vec3 l = 1.0 - g; - vec3 i1 = min( g.xyz, l.zxy ); - vec3 i2 = max( g.xyz, l.zxy ); - - // x0 = x0 - 0.0 + 0.0 * C.xxx; - // x1 = x0 - i1 + 1.0 * C.xxx; - // x2 = x0 - i2 + 2.0 * C.xxx; - // x3 = x0 - 1.0 + 3.0 * C.xxx; - vec3 x1 = x0 - i1 + C.xxx; - vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y - vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y - - // Permutations - i = mod289(i); - vec4 p = permute( permute( permute( - i.z + vec4(0.0, i1.z, i2.z, 1.0 )) - + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) - + i.x + vec4(0.0, i1.x, i2.x, 1.0 )); - - // Gradients: 7x7 points over a square, mapped onto an octahedron. - // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) - float n_ = 0.142857142857; // 1.0/7.0 - vec3 ns = n_ * D.wyz - D.xzx; - - vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7) - - vec4 x_ = floor(j * ns.z); - vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N) - - vec4 x = x_ *ns.x + ns.yyyy; - vec4 y = y_ *ns.x + ns.yyyy; - vec4 h = 1.0 - abs(x) - abs(y); - - vec4 b0 = vec4( x.xy, y.xy ); - vec4 b1 = vec4( x.zw, y.zw ); - - //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0; - //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0; - vec4 s0 = floor(b0)*2.0 + 1.0; - vec4 s1 = floor(b1)*2.0 + 1.0; - vec4 sh = -step(h, vec4(0.0)); - - vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ; - vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ; - - vec3 p0 = vec3(a0.xy,h.x); - vec3 p1 = vec3(a0.zw,h.y); - vec3 p2 = vec3(a1.xy,h.z); - vec3 p3 = vec3(a1.zw,h.w); - - //Normalise gradients - vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); - p0 *= norm.x; - p1 *= norm.y; - p2 *= norm.z; - p3 *= norm.w; - - // Mix final noise value - vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0); - m = m * m; - return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), - dot(p2,x2), dot(p3,x3) ) ); -} - -void main() { - vec4 result = vec4(0.0); - vec4 _gain = gain; - - vec3 shift = vec3(100); - vec3 uv = vec3(v_texCoord0, 1.0) * 2.0 - 1.0; - vec3 x = ((uv + seed) * scale); - - for (int o = 0; o < octaves; ++o) { - result += snoise(x) * _gain; - x = x * lacunarity + shift; - _gain *= decay; - } - - o_output = result + bias; - - if (premultipliedAlpha) { - o_output.rgb *= o_output.a; - } -} diff --git a/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/speckle-noise.frag b/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/speckle-noise.frag deleted file mode 100644 index 2223e2a9..00000000 --- a/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/speckle-noise.frag +++ /dev/null @@ -1,35 +0,0 @@ -#version 330 - -// uniforms -uniform float seed; -uniform float density; -uniform vec4 color; -uniform bool premultipliedAlpha; -uniform float noise; - -// varyings -in vec2 v_texCoord0; - -// outputs -out vec4 o_output; - -vec2 hash22(vec2 p) { - float n = sin(dot(p, vec2(41, 289))); - return fract(vec2(262144, 32768)*n); -} - -void main() { - vec2 vseed = vec2(seed); - vec2 hash = hash22(v_texCoord0 + seed); - float t = hash.x; - - vec4 result = vec4(0.0); - if (t < density) { - vec4 noisyColor = vec4(color.rgb * mix(1.0, hash.y, noise), color.a); - result = noisyColor; - } - o_output = result; - if (premultipliedAlpha) { - o_output.rgb *= o_output.a; - } -} \ No newline at end of file diff --git a/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/value-noise.frag b/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/value-noise.frag deleted file mode 100644 index 444f5094..00000000 --- a/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/value-noise.frag +++ /dev/null @@ -1,53 +0,0 @@ -#version 330 -// based on https://www.shadertoy.com/view/4dS3Wd - -// uniforms -uniform vec4 gain; -uniform vec4 bias; -uniform vec2 seed; - -uniform vec2 scale; -uniform vec2 lacunarity; -uniform vec4 decay; -uniform int octaves; -uniform bool premultipliedAlpha; - -// varyings -in vec2 v_texCoord0; - -// outputs -out vec4 o_output; - -float hash(vec2 p) { return fract(1e4 * sin(17.0 * p.x + p.y * 0.1) * (0.1 + abs(sin(p.y * 13.0 + p.x)))); } - -float noise(vec2 x) { - vec2 i = floor(x); - vec2 f = fract(x); - - float a = hash(i); - float b = hash(i + vec2(1.0, 0.0)); - float c = hash(i + vec2(0.0, 1.0)); - float d = hash(i + vec2(1.0, 1.0)); - - vec2 u = f * f * (3.0 - 2.0 * f); - return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y; -} - -void main() { - vec4 result = vec4(0.0); - vec4 _gain = gain; - - vec2 shift = vec2(100); - mat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.50)); - vec2 x = ((v_texCoord0+seed) * scale); - for (int o = 0; o < octaves; ++o) { - result += noise(x) * _gain; - x = rot * x * lacunarity + shift; - _gain *= decay; - } - o_output = result + bias; - - if (premultipliedAlpha) { - o_output.rgb *= o_output.a; - } -} \ No newline at end of file diff --git a/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/worley-noise.frag b/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/worley-noise.frag deleted file mode 100644 index 97e7ba6d..00000000 --- a/orx-noise/src/main/resources/org/openrndr/extra/noise/shaders/gl3/worley-noise.frag +++ /dev/null @@ -1,80 +0,0 @@ -#version 330 - -// uniforms -//uniform vec4 gain; -//uniform vec4 bias; -//uniform vec3 seed; -uniform float scale; -// -//uniform vec3 lacunarity; -//uniform vec4 decay; -//uniform int octaves; -uniform bool premultipliedAlpha; - -// varyings -in vec2 v_texCoord0; - -// outputs -out vec4 o_output; - - -vec3 permute(vec3 x) { - return mod((34.0 * x + 1.0) * x, 289.0); -} - -vec3 dist(vec3 x, vec3 y, bool manhattanDistance) { - return manhattanDistance ? abs(x) + abs(y) : (x * x + y * y); -} - -vec2 worley(vec2 P, float jitter, bool manhattanDistance) { - float K= 0.142857142857; // 1/7 - float Ko= 0.428571428571 ;// 3/7 - vec2 Pi = mod(floor(P), 289.0); - vec2 Pf = fract(P); - vec3 oi = vec3(-1.0, 0.0, 1.0); - vec3 of = vec3(-0.5, 0.5, 1.5); - vec3 px = permute(Pi.x + oi); - vec3 p = permute(px.x + Pi.y + oi); // p11, p12, p13 - vec3 ox = fract(p*K) - Ko; - vec3 oy = mod(floor(p*K),7.0)*K - Ko; - vec3 dx = Pf.x + 0.5 + jitter*ox; - vec3 dy = Pf.y - of + jitter*oy; - vec3 d1 = dist(dx,dy, manhattanDistance); // d11, d12 and d13, squared - p = permute(px.y + Pi.y + oi); // p21, p22, p23 - ox = fract(p*K) - Ko; - oy = mod(floor(p*K),7.0)*K - Ko; - dx = Pf.x - 0.5 + jitter*ox; - dy = Pf.y - of + jitter*oy; - vec3 d2 = dist(dx,dy, manhattanDistance); // d21, d22 and d23, squared - p = permute(px.z + Pi.y + oi); // p31, p32, p33 - ox = fract(p*K) - Ko; - oy = mod(floor(p*K),7.0)*K - Ko; - dx = Pf.x - 1.5 + jitter*ox; - dy = Pf.y - of + jitter*oy; - vec3 d3 = dist(dx,dy, manhattanDistance); // d31, d32 and d33, squared - // Sort out the two smallest distances (F1, F2) - vec3 d1a = min(d1, d2); - d2 = max(d1, d2); // Swap to keep candidates for F2 - d2 = min(d2, d3); // neither F1 nor F2 are now in d3 - d1 = min(d1a, d2); // F1 is now in d1 - d2 = max(d1a, d2); // Swap to keep candidates for F2 - d1.xy = (d1.x < d1.y) ? d1.xy : d1.yx; // Swap if smaller - d1.xz = (d1.x < d1.z) ? d1.xz : d1.zx; // F1 is in d1.x - d1.yz = min(d1.yz, d2.yz); // F2 is now not in d2.yz - d1.y = min(d1.y, d1.z); // nor in d1.z - d1.y = min(d1.y, d2.x); // F2 is in d1.y, we're done. - return sqrt(d1.xy); -} - - -void main() { - vec2 F = worley(v_texCoord0 * scale, 1.0, false); - float F1 = F.x; - float F2 = F.y; - - o_output = vec4(vec3(F2-F1), 1.0); - - if (premultipliedAlpha) { - o_output.rgb *= o_output.a; - } -} diff --git a/orx-shader-phrases/README.md b/orx-shader-phrases/README.md index 34fdc356..e7b1a398 100644 --- a/orx-shader-phrases/README.md +++ b/orx-shader-phrases/README.md @@ -1,20 +1,11 @@ # orx-shader-phrases -A library that provides a `#pragma import` statement for shaders by using the JVM class loader. +A library that provides a `#pragma import` statement for shaders. ## Usage -Given a shader source: +Work in progress. -````glsl -#version 330 -// -- this imports all phrases in Dummy -#pragma import org.openrndr.extra.shaderphrases.phrases.Dummy.* - -void main() { - float a = dummy(); -} -```` We can use the `preprocessShader()` function to resolve `#pragma import` statements. @@ -28,20 +19,3 @@ Alternatively loading and preprocessing can be combined in a single function cal val preprocessedSource = preprocessShaderFromUrl(resourceUrl("/some-shader.frag")) ``` -To create importable shader phrases one creates a Kotlin class and adds the `ShaderPhrases` annotation. -For example the `dummy` phrase in our example is made available as follows: - -```kotlin -// -- force the class name to be Dummy on the JVM -@file:JvmName("Dummy") -@file:ShaderPhrases -package org.openrndr.extra.shaderphrases.phrases -import org.openrndr.extra.shaderphrases.annotations.ShaderPhrases - -// -- the shader phrase -const val dummy = """ -float dummy() { - return 0.0; -} -""" -``` \ No newline at end of file diff --git a/orx-shader-phrases/build.gradle.kts b/orx-shader-phrases/build.gradle.kts index ed656e21..4f32a59b 100644 --- a/orx-shader-phrases/build.gradle.kts +++ b/orx-shader-phrases/build.gradle.kts @@ -1,6 +1,9 @@ +import Orx_embed_shaders_gradle.EmbedShadersTask + plugins { kotlin("multiplatform") kotlin("plugin.serialization") + id("orx.embed-shaders") } val kotlinxSerializationVersion: String by rootProject.extra @@ -40,14 +43,15 @@ kotlin { useJUnitPlatform() } } - js(IR) { browser() nodejs() } - sourceSets { + val shaderKotlin by creating { + this.kotlin.srcDir("$projectDir/build/generated/shaderKotlin") + } @Suppress("UNUSED_VARIABLE") val commonMain by getting { dependencies { @@ -56,9 +60,10 @@ kotlin { implementation("org.openrndr:openrndr-draw:$openrndrVersion") implementation("org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion") implementation("io.github.microutils:kotlin-logging:$kotlinLoggingVersion") + api(shaderKotlin.kotlin) } } - + commonMain.dependsOn(shaderKotlin) @Suppress("UNUSED_VARIABLE") val commonTest by getting { dependencies { @@ -68,7 +73,6 @@ kotlin { implementation("io.kotest:kotest-assertions-core:$kotestVersion") } } - @Suppress("UNUSED_VARIABLE") val jvmMain by getting @@ -97,3 +101,12 @@ kotlin { } } } + +val embedShaders = tasks.register("embedShaders") { + inputDir.set(file("$projectDir/src/shaders/glsl")) + outputDir.set(file("$buildDir/generated/shaderKotlin")) + defaultPackage.set("org.openrndr.shaderphrases.phrases") +}.get() + +tasks.getByName("compileKotlinJvm").dependsOn(embedShaders) +tasks.getByName("compileKotlinJs").dependsOn(embedShaders) diff --git a/orx-shader-phrases/src/commonMain/kotlin/ShaderPreprocessor.kt b/orx-shader-phrases/src/commonMain/kotlin/ShaderPreprocessor.kt index 59f4b3e4..97df8539 100644 --- a/orx-shader-phrases/src/commonMain/kotlin/ShaderPreprocessor.kt +++ b/orx-shader-phrases/src/commonMain/kotlin/ShaderPreprocessor.kt @@ -2,9 +2,9 @@ package org.openrndr.extra.shaderphrases import mu.KotlinLogging import org.openrndr.draw.Shader +//import org.openrndr.extra.shaderphrases.phrases.phraseTbnMatrix import org.openrndr.utils.url.textFromURL - private val logger = KotlinLogging.logger {} /** @@ -115,7 +115,6 @@ fun Shader.Companion.preprocessedFromUrls( gsUrl: String? = null, fsUrl: String ): Shader { - val vsCode = textFromURL(vsUrl).preprocess() val tcsCode = tcsUrl?.let { textFromURL(it) }?.preprocess() val tesCode = tesUrl?.let { textFromURL(it) }?.preprocess() diff --git a/orx-shader-phrases/src/commonMain/kotlin/phrases/Matrix.kt b/orx-shader-phrases/src/commonMain/kotlin/phrases/Matrix.kt deleted file mode 100644 index e4822ec9..00000000 --- a/orx-shader-phrases/src/commonMain/kotlin/phrases/Matrix.kt +++ /dev/null @@ -1,3 +0,0 @@ -package org.openrndr.extra.shaderphrases.phrases - -val phraseTbnMatrix = """""" \ No newline at end of file diff --git a/orx-shader-phrases/src/shaders/glsl/phraseHash21.shader b/orx-shader-phrases/src/shaders/glsl/phraseHash21.shader new file mode 100644 index 00000000..1d6e36cd --- /dev/null +++ b/orx-shader-phrases/src/shaders/glsl/phraseHash21.shader @@ -0,0 +1,3 @@ +float hash21(vec2 p) { + return fract(1e4 * sin(17.0 * p.x + p.y * 0.1) * (0.1 + abs(sin(p.y * 13.0 + p.x)))); +} diff --git a/orx-shader-phrases/src/shaders/glsl/phraseHash33.shader b/orx-shader-phrases/src/shaders/glsl/phraseHash33.shader new file mode 100644 index 00000000..92ff38b5 --- /dev/null +++ b/orx-shader-phrases/src/shaders/glsl/phraseHash33.shader @@ -0,0 +1,6 @@ +#define MOD3 vec3(.1031,.11369,.13787) +vec3 hash33(vec3 p3) { + p3 = fract(p3 * MOD3); + p3 += dot(p3, p3.yxz+19.19); + return -1.0 + 2.0 * fract(vec3((p3.x + p3.y)*p3.z, (p3.x+p3.z)*p3.y, (p3.y+p3.z)*p3.x)); +} \ No newline at end of file diff --git a/orx-shader-phrases/src/shaders/glsl/phraseProjectionToViewCoordinate.shader b/orx-shader-phrases/src/shaders/glsl/phraseProjectionToViewCoordinate.shader new file mode 100644 index 00000000..16284520 --- /dev/null +++ b/orx-shader-phrases/src/shaders/glsl/phraseProjectionToViewCoordinate.shader @@ -0,0 +1,5 @@ +vec3 projectionToViewCoordinate(vec2 uv, float projectionDepth, mat4 projectionInverse) { + vec4 projectionCoordinate = vec4(uv * 2.0 - 1.0, projectionDepth*2.0-1.0, 1.0); + vec4 viewCoordinate = projectionInverse * projectionCoordinate; + return viewCoordinate.xyz / viewCoordinate.w; +} diff --git a/orx-shader-phrases/src/shaders/glsl/phraseProjectionToViewDepth.shader b/orx-shader-phrases/src/shaders/glsl/phraseProjectionToViewDepth.shader new file mode 100644 index 00000000..093b7a69 --- /dev/null +++ b/orx-shader-phrases/src/shaders/glsl/phraseProjectionToViewDepth.shader @@ -0,0 +1,5 @@ +float projectionToViewDepth(float projectionDepth, mat4 projectionInverse) { + float z = (projectionDepth*2.0-1.0) * projectionInverse[2].z + projectionInverse[3].z; + float w = (projectionDepth*2.0-1.0) * projectionInverse[2].w + projectionInverse[3].w; + return z / w; +} \ No newline at end of file diff --git a/orx-noise/src/main/resources/org/openrndr/extra/noise/phrases/gl3/simplex-3.frag b/orx-shader-phrases/src/shaders/glsl/phraseSimplex31.shader similarity index 90% rename from orx-noise/src/main/resources/org/openrndr/extra/noise/phrases/gl3/simplex-3.frag rename to orx-shader-phrases/src/shaders/glsl/phraseSimplex31.shader index f1d52d8f..ba948dd2 100644 --- a/orx-noise/src/main/resources/org/openrndr/extra/noise/phrases/gl3/simplex-3.frag +++ b/orx-shader-phrases/src/shaders/glsl/phraseSimplex31.shader @@ -1,4 +1,4 @@ -#pragma import org.openrndr.extra.noise.phrases.NoisePhrasesKt.phraseHash33; +#pragma import phraseHash33; float simplex31(vec3 p) { const float K1 = 0.333333333; diff --git a/orx-shader-phrases/src/shaders/glsl/phraseTbnMatrix.shader b/orx-shader-phrases/src/shaders/glsl/phraseTbnMatrix.shader new file mode 100644 index 00000000..54f9fccc --- /dev/null +++ b/orx-shader-phrases/src/shaders/glsl/phraseTbnMatrix.shader @@ -0,0 +1,5 @@ +#pragma package org.openrndr.extra.shaderphrases.phrases +mat3 tbnMatrix(vec4 tangent, vec3 normal) { + vec3 bitangent = cross(normal, tangent.xyz) * tangent.w; + return mat3(tangent.xyz, bitangent, normal); +} \ No newline at end of file diff --git a/orx-shader-phrases/src/shaders/glsl/phraseValueNoise21.shader b/orx-shader-phrases/src/shaders/glsl/phraseValueNoise21.shader new file mode 100644 index 00000000..e5983b76 --- /dev/null +++ b/orx-shader-phrases/src/shaders/glsl/phraseValueNoise21.shader @@ -0,0 +1,14 @@ +#pragma import phraseHash21 + +float valueNoise21(vec2 x) { + vec2 i = floor(x); + vec2 f = fract(x); + + float a = hash21(i); + float b = hash21(i + vec2(1.0, 0.0)); + float c = hash21(i + vec2(0.0, 1.0)); + float d = hash21(i + vec2(1.0, 1.0)); + + vec2 u = f * f * (3.0 - 2.0 * f); + return mix(a, b, u.x) + (c - a) * u.y * (1.0 - u.x) + (d - b) * u.x * u.y; +} \ No newline at end of file diff --git a/orx-shader-phrases/src/shaders/glsl/phraseViewToProjectionDepth.shader b/orx-shader-phrases/src/shaders/glsl/phraseViewToProjectionDepth.shader new file mode 100644 index 00000000..deda0003 --- /dev/null +++ b/orx-shader-phrases/src/shaders/glsl/phraseViewToProjectionDepth.shader @@ -0,0 +1,5 @@ +float viewToProjectionDepth(float viewDepth, mat4 projection) { + float z = viewDepth * projection[2].z + projection[3].z; + float w = viewDepth * projection[2].w + projection[3].w; + return z / w; +} \ No newline at end of file