UNPKG

dreemgl

Version:

DreemGL is an open-source multi-screen prototyping framework for mediated environments, with a visual editor and shader styling for webGL and DALi runtimes written in JavaScript. As a toolkit for gpu-accelerated multiscreen development, DreemGL includes

284 lines (231 loc) 7.45 kB
/* DreemGL is a collaboration between Teeming Society & Samsung Electronics, sponsored by Samsung and others. Copyright 2015-2016 Teeming Society. Licensed under the Apache License, Version 2.0 (the "License"); You may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.*/ // some shapes based on http://iquilezles.org/www/articles/distfunctions/distfunctions.htm define(function (require, exports) { exports.roundedrectdistance = function(sized, width, height, topleftcorner, toprightcorner, bottomleftcorner, bottomrightcorner){ var c1 = vec2(topleftcorner-0.5 , topleftcorner -0.5); var c2 = vec2(bottomleftcorner -0.5, height - bottomleftcorner -0.5); var c3 = vec2(width - bottomrightcorner -.50 , height - bottomrightcorner -.5); var c4 = vec2(width - toprightcorner - .50, toprightcorner -0.5 ); var dist = 0.0 if (sized.x <= c1.x && sized.y < c1.y) { dist = distcircle(sized - c1, topleftcorner); } else { if (sized.x >= c3.x && sized.y >= c3.y) { dist = distcircle(sized - c3, bottomrightcorner); } else { if (sized.x <= c2.x && sized.y >= c2.y) { dist = distcircle(sized - c2, bottomleftcorner); } else { if (sized.x >= c4.x && sized.y <= c4.y) { dist = distcircle(sized - c4, toprightcorner); } else { dist = max(max(-sized.y, sized.y-height), max(-sized.x, sized.x-width)) } } } } return dist; } exports.circle = function (texpos, radius) { var c = texpos - vec2(0.5); var distance = length(c) - radius; var sdf = distance < 0. ? 1. : 0.0; return sdf; } exports.distcircle = function (texpos, radius) { var c = texpos - vec2(0.5); var distance = length(c) - radius; return distance; } //Sphere - signed exports.sdSphere = function (p, s) { return length(p) - s; } //Box - unsigned exports.udBox = function (p, b) { return length(max(abs(p) - b, 0.0)); } //Round Box - unsigned exports.udRoundBox = function(p, b, r) { return length(max(abs(p) - b, 0.0)) - r; } //Box - signed exports.sdBox = function(p, b) { var d = abs(p) - b; return min(max(d.x, max(d.y, d.z)), 0.0) + length(max(d, 0.0)); } //Torus - signed exports.sdTorus = function(p, t) { var q = vec2(length(p.xz) - t.x, p.y); return length(q) - t.y; } //Cylinder - signed exports.sdCylinder = function(p, c) { return length(p.xz - c.xy) - c.z; } //Cone - signed exports.sdCone = function(p, c) { // c must be normalized var q = length(p.xy); return dot(c, vec2(q, p.z)); } //Plane - signed exports.sdPlane = function(p, n) { // n must be normalized return dot(p, n.xyz) + n.w; } //Hexagonal Prism - signed exports.sdHexPrism = function(p, h) { var q = abs(p); return max(q.z - h.y, max((q.x * 0.866025 + q.y * 0.5), q.y) - h.x); } //Triangular Prism - signed exports.sdTriPrism = function(p, h) { var q = abs(p); return max(q.z - h.y, max(q.x * 0.866025 + p.y * 0.5, -p.y) - h.x * 0.5); } //Capsule / Line - signed exports.sdCapsule = function(p, a, b, r) { var pa = p - a, ba = b - a; var h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0); return length(pa - ba * h) - r; } //Capped cylinder - signed exports.sdCappedCylinder = function(p, h) { var d = abs(vec2(length(p.xz), p.y)) - h; return min(max(d.x, d.y), 0.0) + length(max(d, 0.0)); } //Triangle - unsigned exports.dot2 = function(v) { return dot(v, v); } exports.udTriangle = function (p, a, b, c) { var ba = b - a; var pa = p - a; var cb = c - b; var pb = p - b; var ac = a - c; var pc = p - c; var nor = cross(ba, ac); return sqrt( (sign(dot(cross(ba, nor), pa)) + sign(dot(cross(cb, nor), pb)) + sign(dot(cross(ac, nor), pc)) < 2.0) ? min(min( dot2(ba * clamp(dot(ba, pa) / dot2(ba), 0.0, 1.0) - pa), dot2(cb * clamp(dot(cb, pb) / dot2(cb), 0.0, 1.0) - pb)), dot2(ac * clamp(dot(ac, pc) / dot2(ac), 0.0, 1.0) - pc)) : dot(nor, pa) * dot(nor, pa) / dot2(nor)); } exports.udQuad = function(p, a, b, c, d) { var ba = b - a; var pa = p - a; var cb = c - b; var pb = p - b; var dc = d - c; var pc = p - c; var ad = a - d; var pd = p - d; var nor = cross(ba, ad); return sqrt( (sign(dot(cross(ba, nor), pa)) + sign(dot(cross(cb, nor), pb)) + sign(dot(cross(dc, nor), pc)) + sign(dot(cross(ad, nor), pd)) < 3.0) ? min(min(min( dot2(ba * clamp(dot(ba, pa) / dot2(ba), 0.0, 1.0) - pa), dot2(cb * clamp(dot(cb, pb) / dot2(cb), 0.0, 1.0) - pb)), dot2(dc * clamp(dot(dc, pc) / dot2(dc), 0.0, 1.0) - pc)), dot2(ad * clamp(dot(ad, pd) / dot2(ad), 0.0, 1.0) - pd)) : dot(nor, pa) * dot(nor, pa) / dot2(nor)); } //Capped Cone - signed exports.sdCappedCone = function(p, c) { var q = vec2(length(p.xz), p.y); var v = vec2(c.z * c.y / c.x, -c.z); var w = v - q; var vv = vec2(dot(v, v), v.x * v.x); var qv = vec2(dot(v, w), v.x * w.x); var d = max(qv, 0.0) * qv / vv; return sqrt(dot(w, w) - max(d.x, d.y)) * sign(max(q.y * v.x - q.x * v.y, w.y)); } //Torus82 - signed exports.sdTorus82 = function(p, t) { var q = vec2(length2(p.xz) - t.x, p.y); return length8(q) - t.y; } //Torus88 - signed exports.sdTorus88 = function(p, t) { var q = vec2(length8(p.xz) - t.x, p.y); return length8(q) - t.y; } //Union exports.opU = function(d1, d2) { return min(d1, d2); } //Substraction exports.opS = function(d1, d2) { return max(-d1, d2); } //Intersection exports.opI = function(d1, d2) { return max(d1, d2); } exports.union = function(d1, d2){ return min(d1, d2) } exports.intersect = function(d1, d2){ return max(d1,d2) } exports.subtract = function(d1, d2){ return max(-d1,d2) } exports.circle = function(p, x, y, radius){ return distance(p,vec2(x,y)) - radius } exports.box = function(p, left, top, width, height){ var xy = vec2(left, top) var hwh = vec2(.5*width, .5*height) var d = abs(p - xy-hwh) - hwh return min(max(d.x,d.y),0.) + length(max(d,0.)) } exports.roundbox = function(p, left, top, width, height, radius){ var rad2 = vec2(radius,radius) var hwh = vec2(.5*width, .5*height) var xy = vec2(left, top) return length(max(abs(p - xy - hwh) - (hwh - 2. * rad2), 0.)) - 2. * radius } exports.line = function(p, left, top, right, bottom, radius){ var a = vec2(left, top) var b = vec2(right, bottom) var pa = p - a, ba = b - a var h = clamp(dot(pa,ba)/dot(ba,ba), 0., 1.) return length(pa - ba * h) - radius } exports.drawField = function(coord, field, color){ var edge = length(vec2(length(dFdx(coord)), length(dFdy(coord)))) * SQRT_1_2 return vec4(color, smoothstep(-edge, edge, field)) } exports.smoothpoly = function(a, b, k){ var h = clamp( 0.5+0.5*(b-a)/k, 0.0, 1.0 ) return mix( b, a, h ) - k*h*(1.0-h) } exports.smoothpow = function(a, b, k){ a = pow( a, k ); b = pow( b, k ) return pow( (a*b)/(a+b), 1.0/k ) } exports.smoothexp = function(a, b, k){ var res = exp( -k*a ) + exp( -k*b ) return -log( res )/k } })