128 lines
No EOL
3 KiB
GLSL
128 lines
No EOL
3 KiB
GLSL
#version 330 core
|
|
in vec2 fragTexCoord;
|
|
in vec3 normal;
|
|
in vec3 pos;
|
|
uniform vec3 campos;
|
|
uniform sampler2D tilemap;
|
|
uniform sampler2D tilesheet;
|
|
uniform vec2 size;
|
|
uniform int cols;
|
|
uniform vec4 fragColor;
|
|
out vec4 FragColor;
|
|
float dist;
|
|
vec3 n=normalize(normal);
|
|
bool lava=false;
|
|
vec4 directional(vec4 c){
|
|
float mult;
|
|
if ((pos.y>=0.98))return c;
|
|
float fac=pos.y/2+0.5;
|
|
if(abs(n.y)>abs(n.x)&&abs(n.y)>abs(n.z)){
|
|
mult=(n.y>0.0)?1.0:pos.y;
|
|
}else if(abs(n.x)>abs(n.y)&&abs(n.x)>abs(n.z)){
|
|
mult=(n.x>0.0)?fac+.2:fac+0.3;
|
|
}else{
|
|
mult=(n.z>0.0)?fac+.45:fac+0.1;
|
|
}
|
|
vec3 c2=c.rgb;
|
|
return vec4(c2*mult,c.a);
|
|
}
|
|
|
|
vec4 white(){
|
|
return vec4(1.0,1.0,1.0,1.0);
|
|
}
|
|
|
|
vec4 textured(){
|
|
float minus=1./1024;
|
|
float tile = texture(tilemap, fragTexCoord).r;
|
|
int idx = int(tile * 255.0);
|
|
bool terrain=idx<=250;
|
|
if (pos.y>1.0){ //top
|
|
if (!terrain){
|
|
discard;
|
|
return vec4(0.0,0.0,0.0,0.0);
|
|
}
|
|
|
|
}
|
|
else if (pos.y>0.0){ //walls
|
|
|
|
float previousx=texture(tilemap, vec2(fragTexCoord.x-minus,fragTexCoord.y)).r;
|
|
float previousz=texture(tilemap, vec2(fragTexCoord.x,fragTexCoord.y-minus)).r;
|
|
int previousxidx = int(previousx * 255.0);
|
|
int previouszidx = int(previousz * 255.0);
|
|
bool prevxidx=previousxidx<245;
|
|
bool prevzidx=previouszidx<245;
|
|
bool isterrain=1!=1;
|
|
bool negx=abs(n.x) > abs(n.y) && abs(n.x) > abs(n.z);
|
|
bool negz=abs(n.z) > abs(n.x) && abs(n.z) > abs(n.y);
|
|
if (prevxidx&&negx&&!(idx<245)) { // forces outer on -x
|
|
isterrain=prevxidx;
|
|
idx=previousxidx;
|
|
}else if (prevzidx&&negz&&!(idx<245)) { // forces outer on -z
|
|
isterrain=prevzidx;
|
|
idx=previouszidx;
|
|
}
|
|
if (!isterrain){
|
|
if (
|
|
(negx&&!prevxidx)
|
|
|| (negz&&!prevzidx)
|
|
|
|
)
|
|
isterrain=(idx<245);
|
|
|
|
if (!isterrain){
|
|
discard;}
|
|
}
|
|
|
|
|
|
}
|
|
if (pos.y<=0.0){
|
|
|
|
if (idx<=250&&idx>245){
|
|
|
|
idx+=5;
|
|
}else{
|
|
}
|
|
}
|
|
int x = idx % cols;
|
|
int y = idx / cols;
|
|
|
|
float tsize = 1.0 / float(cols);
|
|
vec2 tuv = fract(fragTexCoord * size) / float(cols);
|
|
|
|
return pos.y>0.0
|
|
?directional(texture(tilesheet, vec2(float(x) * tsize, float(y) * tsize) + tuv))
|
|
:texture(tilesheet, vec2(float(x) * tsize, float(y) * tsize) + tuv);
|
|
}
|
|
vec4 triplanar(){
|
|
vec3 weight = abs(n);
|
|
weight = weight / (weight.x + weight.y + weight.z);
|
|
|
|
vec4 x = texture(tilemap, pos.yz * 0.1);
|
|
vec4 y = texture(tilemap, pos.xz * 0.1);
|
|
vec4 z = texture(tilemap, pos.xy * 0.1);
|
|
|
|
vec4 triplanarColor = x * weight.x + y * weight.y + z * weight.z;
|
|
|
|
return directional(triplanarColor);
|
|
}
|
|
int rendermode=3;
|
|
void main(){
|
|
vec3 cpos=vec3(campos.x,0,campos.z);
|
|
vec3 wpos=pos*4;
|
|
float dist = length(cpos - wpos);
|
|
if (fragColor.r==1. && fragColor.b==1.){
|
|
FragColor=white();
|
|
return;
|
|
}
|
|
if(rendermode==3){
|
|
FragColor=textured()*fragColor*1.4;
|
|
}else if(rendermode==2){
|
|
FragColor=triplanar();
|
|
}else if(rendermode==1){
|
|
FragColor=directional(fragColor);
|
|
}else{
|
|
FragColor=white();
|
|
}
|
|
// float fogFactor = 1.0 / exp( (dist * 1) * (dist * 1));
|
|
FragColor.a=1/exp((dist*0.0008)*(dist*0.0008));
|
|
} |