1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- import { fn } from '../../core/FunctionNode.js';
- // Original shader code from:
- // https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/stdlib/genglsl/lib/mx_hsv.glsl
- export const mx_hsvtorgb = fn( `vec3 mx_hsvtorgb(vec3 hsv)
- {
- // Reference for this technique: Foley & van Dam
- float h = hsv.x; float s = hsv.y; float v = hsv.z;
- if (s < 0.0001f) {
- return vec3 (v, v, v);
- } else {
- h = 6.0f * (h - floor(h)); // expand to [0..6)
- int hi = int(trunc(h));
- float f = h - float(hi);
- float p = v * (1.0f-s);
- float q = v * (1.0f-s*f);
- float t = v * (1.0f-s*(1.0f-f));
- if (hi == 0)
- return vec3 (v, t, p);
- else if (hi == 1)
- return vec3 (q, v, p);
- else if (hi == 2)
- return vec3 (p, v, t);
- else if (hi == 3)
- return vec3 (p, q, v);
- else if (hi == 4)
- return vec3 (t, p, v);
- return vec3 (v, p, q);
- }
- }` );
- export const mx_rgbtohsv = fn( `vec3 mx_rgbtohsv(vec3 c)
- {
- // See Foley & van Dam
- float r = c.x; float g = c.y; float b = c.z;
- float mincomp = min (r, min(g, b));
- float maxcomp = max (r, max(g, b));
- float delta = maxcomp - mincomp; // chroma
- float h, s, v;
- v = maxcomp;
- if (maxcomp > 0.0f)
- s = delta / maxcomp;
- else s = 0.0f;
- if (s <= 0.0f)
- h = 0.0f;
- else {
- if (r >= maxcomp) h = (g-b) / delta;
- else if (g >= maxcomp) h = 2.0f + (b-r) / delta;
- else h = 4.0f + (r-g) / delta;
- h *= (1.0f/6.0f);
- if (h < 0.0f)
- h += 1.0f;
- }
- return vec3(h, s, v);
- }` );
|