-
Notifications
You must be signed in to change notification settings - Fork 17
/
diamondplateshader.osl
86 lines (80 loc) · 1.61 KB
/
diamondplateshader.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
shader diamondplate(
point Pos = P,
float Scale = 2,
int Diamonds = 4,
float Margin = 0.1,
output float Bool = 0,
output int Fac = 0,
output float Disp = 0,
output normal Normal =
normal(0,0,1)
){
point p = Pos * Scale;
int xi = (int)floor(p[0]);
int yi = (int)floor(p[1]);
float x = abs(fmod(p[0],1.0));
float y = abs(fmod(p[1],1.0));
int flipxy=0;
float flipx=1, flipy=1;
if( (xi%2)^(yi%2) ){
float t = x;
x = y;
y = t;
flipxy=1;
}
if( (x < Margin)
||(x > 1-Margin)
|| (y < Margin)
|| (y > 1-Margin) )
{
Fac = 0; // do nothing
}else{
x -= Margin;
if(y>0.5){
y=1-y;
flipy = -1;
}
y -= Margin;
float w =
(1-2*Margin)/Diamonds;
x = mod(x,w)/w;
if(x>0.5){
x=1-x;
flipx = -1;
}
float topx=0.15;
float topy=0.5;
float topy2=0.55;
float botx=0.5;
float boty=0;
float a=(boty-topy)
/(botx-topx);
if(x>=topx){
float uppery =
(x-topx)*a+topy2;
float lowery = (
x-topx)*a+topy;
if(y > lowery){
if(y > uppery){
Fac = 1;
Disp= 1.0;
}else{
Fac = 2;
Disp= (y-lowery)
/(uppery - lowery);
if(flipxy){
Normal=normalize(
vector(-flipy,
flipx/a,
1));
}else{
Normal=normalize(
vector(flipx/a,
-flipy,
1));
}
}
}
}
}
}