forked from Maxon-Computer/Redshift-OSL-Shaders
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Hexagon.osl
66 lines (53 loc) · 1.92 KB
/
Hexagon.osl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
* Hexagon.osl by Michel J. Anders (c)2012
* from https://github.com/sambler/osl-shaders
*
* license: cc-by-sa
*
* original script from -
* http://blenderthings.blogspot.co.uk/2012/11/a-hexagon-osl-shader.html
* Modified 1/4/2020 by Saul Espinosa for Redshift 3D
*/
#define A 0.86602540378443864676372317075294 // sqrt(3)/2
#define A2 (2*A)
#define A4 (4*A)
#define SY (1/A)
shader MAhexagon
[[ string help = "Generates an RGB Hexagon Pattern",
string label = "Hexagons" ]]
(
vector Vector = 0,
color Diffuse_Color1 = color(0.2, 0.8, 0.2),
color Diffuse_Color2 = color(0.8, 0.2, 0.2),
color Diffuse_Color3 = color(0.2, 0.2, 0.8),
output color Color = 0,
output int Index = 1,
output float Distance = 0)
{
// calculate the color
color colors[3] = {Diffuse_Color1,
Diffuse_Color2,
Diffuse_Color3};
// we warp the grid so that two adjacent equilateral triangles
// are mapped to two triangles that fit in a square
float syc = Vector[1] * SY;
float sxc = Vector[0] + 0.5 * syc;
int ind[18] = {1,1,3,3,3,1, 2,2,2,3,3,3, 1,2,2,2,1,1};
int iy = int(mod(syc,3.0));
int ix = int(mod(sxc,3.0));
ix = iy * 6 + ix * 2 + ( mod(sxc,1.0) > mod(syc,1.0) );
Index = ind[ix];
Color = colors[Index-1];
// calculate the distance to the center of the hexagon
float sx = mod(Vector[0],3);
float sy = mod(Vector[1]+0.75,A4);
// map everthing to a single quadrant
if ( sx > 1.5 ) sx = 3 - sx;
if ( sy > A2 ) sy = A4 - sy;
// the distance were interested in is the distance to
// the *closest* center point
float d1 = distance(vector(sx,sy,0),vector(1.5,A2,0));
float d2 = distance(vector(sx,sy,0),vector(0,A,0));
float d6 = distance(vector(sx,sy,0),vector(1.5,0,0));
Distance = min(min(d1,d2), d6);
}