From 3ccc493871824daa1f12e0dba63dcfcde208e413 Mon Sep 17 00:00:00 2001 From: Ryan Jones Date: Tue, 29 Nov 2016 15:40:20 -0800 Subject: [PATCH 1/3] add helpers for v3 and shaders --- .../src/procedural/ProceduralCommon.slf | 31 +++++++++++++++++++ libraries/script-engine/src/Vec3.cpp | 13 ++++++++ libraries/script-engine/src/Vec3.h | 2 ++ 3 files changed, 46 insertions(+) diff --git a/libraries/procedural/src/procedural/ProceduralCommon.slf b/libraries/procedural/src/procedural/ProceduralCommon.slf index d4144ad537..22e51b034f 100644 --- a/libraries/procedural/src/procedural/ProceduralCommon.slf +++ b/libraries/procedural/src/procedural/ProceduralCommon.slf @@ -264,6 +264,37 @@ float snoise(vec2 v) { return 130.0 * dot(m, g); } +// https://www.shadertoy.com/view/lsfGRr +float hash( float n ) +{ + return fract(sin(n)*43758.5453); +} + +float noise( in vec2 x ) +{ + vec2 p = floor(x); + vec2 f = fract(x); + + f = f*f*(3.0-2.0*f); + + float n = p.x + p.y*57.0; + + return mix(mix( hash(n+ 0.0), hash(n+ 1.0),f.x), + mix( hash(n+ 57.0), hash(n+ 58.0),f.x),f.y); +} + +// https://www.shadertoy.com/view/MdX3Rr +// https://en.wikipedia.org/wiki/Fractional_Brownian_motion +float fbm(in vec2 p) { + const mat2 m2 = mat2(0.8, -0.6, 0.6, 0.8); + float f = 0.0; + f += 0.5000 * noise(p); p = m2 * p * 2.02; + f += 0.2500 * noise(p); p = m2 * p * 2.03; + f += 0.1250 * noise(p); p = m2 * p * 2.01; + f += 0.0625 * noise(p); + + return f / 0.9375; +} #define PROCEDURAL 1 diff --git a/libraries/script-engine/src/Vec3.cpp b/libraries/script-engine/src/Vec3.cpp index 88d6373b6d..5c84619820 100644 --- a/libraries/script-engine/src/Vec3.cpp +++ b/libraries/script-engine/src/Vec3.cpp @@ -82,3 +82,16 @@ glm::vec3 Vec3::fromPolar(float elevation, float azimuth) { glm::vec3 v = glm::vec3(elevation, azimuth, 1.0f); return fromPolar(v); } + +float Vec3::angle(const glm::vec3& fromV, const glm::vec3& toV) { + glm::vec3 fromVNormalized = glm::normalize(fromV); + glm::vec3 toVNormalized = glm::normalize(toV); + + float radians = glm::acos(glm::dot(fromVNormalized, toVNormalized)); + + return radians * 180.0f / PI; +} + +glm::vec3 Vec3::lerp(const glm::vec3& v1, const glm::vec3& v2, float t) { + return v1 * (1.0f - t) + v2 * t; +} diff --git a/libraries/script-engine/src/Vec3.h b/libraries/script-engine/src/Vec3.h index 07f2279d02..4b293ffe7f 100644 --- a/libraries/script-engine/src/Vec3.h +++ b/libraries/script-engine/src/Vec3.h @@ -83,6 +83,8 @@ public slots: glm::vec3 toPolar(const glm::vec3& v); glm::vec3 fromPolar(const glm::vec3& polar); glm::vec3 fromPolar(float elevation, float azimuth); + float angle(const glm::vec3& fromV, const glm::vec3& toV); + glm::vec3 lerp(const glm::vec3& v1, const glm::vec3& v2, float t); private: const glm::vec3& UNIT_X() { return Vectors::UNIT_X; } From fe774a853018d515917cd2e0d17376a55c469df5 Mon Sep 17 00:00:00 2001 From: Ryan Jones Date: Tue, 29 Nov 2016 15:41:50 -0800 Subject: [PATCH 2/3] adjust whitespace --- libraries/script-engine/src/Vec3.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/script-engine/src/Vec3.h b/libraries/script-engine/src/Vec3.h index 4b293ffe7f..cd6b3ebb70 100644 --- a/libraries/script-engine/src/Vec3.h +++ b/libraries/script-engine/src/Vec3.h @@ -83,8 +83,8 @@ public slots: glm::vec3 toPolar(const glm::vec3& v); glm::vec3 fromPolar(const glm::vec3& polar); glm::vec3 fromPolar(float elevation, float azimuth); - float angle(const glm::vec3& fromV, const glm::vec3& toV); - glm::vec3 lerp(const glm::vec3& v1, const glm::vec3& v2, float t); + float angle(const glm::vec3& fromV, const glm::vec3& toV); + glm::vec3 lerp(const glm::vec3& v1, const glm::vec3& v2, float t); private: const glm::vec3& UNIT_X() { return Vectors::UNIT_X; } From 7b0756c74529274f33f157e4ac450ad83079ee93 Mon Sep 17 00:00:00 2001 From: Ryan Jones Date: Wed, 30 Nov 2016 16:37:04 -0800 Subject: [PATCH 3/3] remove lerp in deference to mix, adjust naming conventions, namespace shader helper functions --- .../src/procedural/ProceduralCommon.slf | 26 +++++++++---------- libraries/script-engine/src/Vec3.cpp | 12 ++------- libraries/script-engine/src/Vec3.h | 3 +-- 3 files changed, 15 insertions(+), 26 deletions(-) diff --git a/libraries/procedural/src/procedural/ProceduralCommon.slf b/libraries/procedural/src/procedural/ProceduralCommon.slf index 22e51b034f..dcc34b5131 100644 --- a/libraries/procedural/src/procedural/ProceduralCommon.slf +++ b/libraries/procedural/src/procedural/ProceduralCommon.slf @@ -265,33 +265,31 @@ float snoise(vec2 v) { } // https://www.shadertoy.com/view/lsfGRr -float hash( float n ) -{ - return fract(sin(n)*43758.5453); +float hifi_hash(float n) { + return fract(sin(n) * 43758.5453); } -float noise( in vec2 x ) -{ +float hifi_noise(in vec2 x) { vec2 p = floor(x); vec2 f = fract(x); - f = f*f*(3.0-2.0*f); + f = f * f * (3.0 - 2.0 * f); - float n = p.x + p.y*57.0; + float n = p.x + p.y * 57.0; - return mix(mix( hash(n+ 0.0), hash(n+ 1.0),f.x), - mix( hash(n+ 57.0), hash(n+ 58.0),f.x),f.y); + return mix(mix(hifi_hash(n + 0.0), hifi_hash(n + 1.0), f.x), + mix(hifi_hash(n + 57.0), hifi_hash(n + 58.0), f.x), f.y); } // https://www.shadertoy.com/view/MdX3Rr // https://en.wikipedia.org/wiki/Fractional_Brownian_motion -float fbm(in vec2 p) { +float hifi_fbm(in vec2 p) { const mat2 m2 = mat2(0.8, -0.6, 0.6, 0.8); float f = 0.0; - f += 0.5000 * noise(p); p = m2 * p * 2.02; - f += 0.2500 * noise(p); p = m2 * p * 2.03; - f += 0.1250 * noise(p); p = m2 * p * 2.01; - f += 0.0625 * noise(p); + f += 0.5000 * hifi_noise(p); p = m2 * p * 2.02; + f += 0.2500 * hifi_noise(p); p = m2 * p * 2.03; + f += 0.1250 * hifi_noise(p); p = m2 * p * 2.01; + f += 0.0625 * hifi_noise(p); return f / 0.9375; } diff --git a/libraries/script-engine/src/Vec3.cpp b/libraries/script-engine/src/Vec3.cpp index 5c84619820..6c8f618500 100644 --- a/libraries/script-engine/src/Vec3.cpp +++ b/libraries/script-engine/src/Vec3.cpp @@ -83,15 +83,7 @@ glm::vec3 Vec3::fromPolar(float elevation, float azimuth) { return fromPolar(v); } -float Vec3::angle(const glm::vec3& fromV, const glm::vec3& toV) { - glm::vec3 fromVNormalized = glm::normalize(fromV); - glm::vec3 toVNormalized = glm::normalize(toV); - - float radians = glm::acos(glm::dot(fromVNormalized, toVNormalized)); - - return radians * 180.0f / PI; +float Vec3::getAngle(const glm::vec3& v1, const glm::vec3& v2) { + return glm::acos(glm::dot(glm::normalize(v1), glm::normalize(v2))); } -glm::vec3 Vec3::lerp(const glm::vec3& v1, const glm::vec3& v2, float t) { - return v1 * (1.0f - t) + v2 * t; -} diff --git a/libraries/script-engine/src/Vec3.h b/libraries/script-engine/src/Vec3.h index cd6b3ebb70..5f524eaf74 100644 --- a/libraries/script-engine/src/Vec3.h +++ b/libraries/script-engine/src/Vec3.h @@ -83,8 +83,7 @@ public slots: glm::vec3 toPolar(const glm::vec3& v); glm::vec3 fromPolar(const glm::vec3& polar); glm::vec3 fromPolar(float elevation, float azimuth); - float angle(const glm::vec3& fromV, const glm::vec3& toV); - glm::vec3 lerp(const glm::vec3& v1, const glm::vec3& v2, float t); + float getAngle(const glm::vec3& v1, const glm::vec3& v2); private: const glm::vec3& UNIT_X() { return Vectors::UNIT_X; }