shader_type spatial; render_mode diffuse_burley, specular_schlick_ggx; uniform sampler2D wood_height : filter_linear_mipmap_anisotropic, repeat_enable; uniform bool bark = false; uniform bool leaf = false; uniform bool endgrain = false; void fragment() { float h = texture(wood_height, UV).r; ALBEDO = COLOR.rgb * (bark ? mix(.48,.85,h) : .80); if (endgrain) { vec2 p=(UV-vec2(.5))*2.0; float a=atan(p.y,p.x), r=length(p); float phase=r*12.0+.13*sin(a*3.0+r*9.0)+.07*sin(a*7.0-r*8.0); float edge=abs(sin(phase*3.1415926)); float line=1.0-smoothstep(.12,.28+length(fwidth(p))*45.0,edge); float fibres=sin(a*113.0+r*38.0)*sin(r*290.0+a*5.0); float split=0.0; for(int k=0;k<3;k++) { float ca=.36+float(k)*2.12; float dist=abs(atan(sin(a-ca-.012*sin(r*24.0)),cos(a-ca-.012*sin(r*24.0)))); split=max(split,(1.0-smoothstep(.003,.014,dist))*smoothstep(.48+.1*float(k),.91,r)); } ALBEDO=vec3(.265,.147,.066)*mix(1.20,.56,line)*(1.0+fibres*.07)*mix(1.0,.20,split); ROUGHNESS=.86; } ROUGHNESS = bark ? mix(.74,.96,h) : .84; if (leaf) { BACKLIGHT = COLOR.rgb*.22; } if (bark) { vec3 dx=dFdx(VERTEX), dy=dFdy(VERTEX), n=NORMAL; vec3 rx=cross(dy,n), ry=cross(n,dx); float det=dot(dx,rx); NORMAL=normalize(abs(det)*n-sign(det)*(dFdx(h)*rx+dFdy(h)*ry)*.0018); } }