]> 200123454137425100143511000143511000200061222074117910312502508180250250Workspace1000-10707400225025011111250250001250158131130250250Output1002-10120120435110time1100-104171730016221320435243511011711435110000435110f1MyFloat1101-103212130020221320435243511012111435110003002361713488761126225025012411250250251250250250Artist Editor1001-101124240374251fNxMMyFloat1102-10229293002851110100491237425112911374251001929 ]]> 0.9 ) return y; x = x - 0.5; return -(sqrt(x*x+y*y)-0.4); } float distToBox( in vec3 p, in vec3 abc ) { vec3 di=max(abs(p)-abc,0.0); return dot(di,di); } float distToCone( in vec3 p, in vec3 abc, bool flip) { //abc.x = abc.z = +(abc.x)*p.y+sin(p.y)*abc.x*.1; if(flip) p.y = -p.y; p.y -= 1.2-abc.y; float r = sin((p.y*abc.y))*abc.x-abc.x/2.0; //float r = (abc.y+sin(p.y/abc.y)*test)*abc.x-abc.x*.5; abc.z*=r*-1.0; abc.x*=r*-1.0; // p.x = p.x + sin(p.x)*test; // p.z = p.z + cos(p.y)*test; #ifdef HQ float xOff = (noise3f(p*19.))/105.; float zOff = (noise3f(p*17.))/229.; abc.x += xOff;; abc.z += zOff; #else // float xOff = (sin(p.y*5.+p.x*12.5+cos(p.z*24.)))/offset; // float zOff = (cos(p.z*6.+p.y*45.+p.z*125.+p.x*52.5+sin(p.z*24.)))/offset; #endif // if(xOff+zOff < -0.005) // submat = 7; //abc.z+= (noise3f(p))*0.25; // p.y -= abc.y; vec3 di=max(abs(p)-abc,0.0); return dot(di,di); } float distToSphere( in vec3 p, in vec3 abc ) { vec3 di=max(abs(p)-abc,0.0); return dot(di,di); } float drawFloor(in float x, in float y, in float z, in float mindist, in float offx ) { y+=1.1+noise3f(vec3(x,y,z))/8.0+noise3f(vec3(x,y,z)*4.8)/19; vec3 p=vec3(x,y,z); return distToBox( p, vec3( 6 , 0.001, 7.0) ); } float drawWater(in float x, in float y, in float z, in float mindist, in float offx ) { y+=1.14+noise3f(vec3(x,y,z)*-0.42392)/-495.; vec3 p=vec3(x,y,z); return distToBox( p, vec3( 6 , 0.001, 7.0) ); } float drawForm(in float x, in float y, in float z, in float mindist, in float offx ) { y+=1.14+noise3f(vec3(x,y,z)*2.81613)/-3.11943; vec3 p=vec3(x,y,z); return distToBox( p, vec3( 6 , 0.001, 7.0) ); } float columna( in float x, in float y, in float z, in float mindist, in float offx ) { vec3 p=vec3(x,y,z); float di = 20000000.0; for(int i = 0; i< 7; i++) { vec3 posi = p; // posi.x += sin((35.0*i*offset)+cos(i*45.0))*2.5; // posi.z += sin((5.0*i)+cos(i*25.06*offset))*2.5; posi.x += stonesFloor[i*3+0]; posi.z -= stonesFloor[i*3+1]; float h = stonesFloor[i*3+2]; bool flip = false; if(i < 5) flip = true; float di1=distToCone( posi, vec3( h/8.,h, h/7.), flip); di = min(di1, di); } /* p.x += offset; p.z -= offset2; float h = offset3; */ // float di1=distToCone( p, vec3( h/8.,h, h/7.), false, submat ); // di = min(di1, di); return di; } float map( in vec3 pos, out int sid) { // submat = 0; float dis, mindist; //----------------------- // suelo //----------------------- dis = pos.y; mindist = 1; //sid = 0; //if( peld>0.0000001 ) sid = 2; //----------------------- // techo //----------------------- float fx = fract( pos.x ); float fz = fract( pos.z ); float di2, di4, di1; di1 = di2 = di4 = 200000.; di1 = columna( pos.x, pos.y-1.0, pos.z, mindist, 0.5); float di3 = drawFloor(pos.x, pos.y-3.4, pos.z, mindist, 0.5 ); di2 = drawFloor(pos.x, pos.y-1.0, pos.z, mindist, 0.5 ); di4 = drawForm(pos.x, pos.y-1.0, pos.z, mindist, 0.5 ); float power = 1.0/pow(di1,2.0) + 1.0/pow(di2,2.0) + 1.0/pow(di3,2.0) + 1.0/pow(di4,2.0) ; dis = sqrt(1.0/power); if( dis<(mindist) ) { mindist = dis; sid = 4; } if(di430.0 ) break; } bool water = false; if (matID == 1) { vec3 refpos; vec3 refrd = vec3(rd.x, -rd.y, rd.z); water = true; for( t=0.1; t<12.0; ) { refpos = pos + t*refrd; float h = map( refpos, matID ); if( h<0.01 ) break; t += h; //if( t>30.0 ) break; } pos = refpos; rd = refrd; } // shade if( matID!=666 ) { // calc normal vec3 nor = calcNormal(pos); // bump mapping float kke=0.0001; float bumpa=0.0075; if( matID!=5 ) bumpa*=0.75; if( matID==4 ) bumpa*=0.50; bumpa /= kke; float kk = fbm(32.0*pos); nor.x += bumpa*(fbm(32.0*vec3(pos.x+kke, pos.y, pos.z))-kk); nor.y += bumpa*(fbm(32.0*vec3(pos.x, pos.y+kke, pos.z))-kk); nor.z += bumpa*(fbm(32.0*vec3(pos.x, pos.y, pos.z+kke))-kk); nor = normalize(nor); // light float spe = 0.0; vec3 lig = vec3( 1.13-pos.x, 0.9-pos.y, 1.47-pos.z ); float llig = dot(lig,lig); float im = inversesqrt(llig); lig = lig * im; float dif = dot(nor,lig); if( matID==4 ) {dif=0.5+0.5*dif;} else {dif=0.1+0.9*dif;} //if( dif<0.0 ) dif=0.0; //dif=max(dif,0.0); dif = clamp(dif,0.0,1.0); dif *= 2.5*exp2(-1.75*llig); float dif2=(nor[0]+nor[1])*0.075; dif = 1.0; // materials if( matID==0 ) { float xoff = 13.1*float(subMatID&255); float fb = fbm(16.0*vec3(pos.x+xoff,pos.y,pos.z)); rgb = vec3(0.7) + fb*vec3(0.20,0.22,0.25); float baldscale = float((subMatID>>9)&15)/14.0; baldscale = 0.51 + 0.34*baldscale; rgb *= baldscale; float fx = 1.0; if( (subMatID&256)!=0 ) fx = -1.0; float m = sin( 64.0*pos.z*fx + 64.0*pos.x + 4.0*fb ); m = smoothstep( 0.25, 0.5, m ) - smoothstep( 0.5, 0.75, m ); rgb += m*vec3(0.15); } else if( matID==2 ) { rgb = vec3(0.0); } else if( matID==1 ) { float fb = fbm( 16.0*pos ); float m = sin( 64.0*pos.z + 64.0*pos.x + 4.0*fb ); m = smoothstep( 0.30, 0.5, m ) - smoothstep( 0.5, 0.70, m ); rgb = 1.0; vec3(0.59) + fb*vec3(0.,0.72,0.89) + m*vec3(0.15) + vec3(dif2); rgb = vec3(0.,0.4,0.89); } else if( matID==4 ) { float ft = fbm( 16.0*pos ); rgb = vec3(0.82,0.73,0.65) + ft*vec3(0.1); float fs = 0.9+0.1*fbm( 32.0*pos ); rgb *= fs; float fre = max( -dot( nor, rd ), 0.0); rgb -= vec3(fre*fre*0.45); spe = clamp((nor.y-nor.z)*(0.707+test),0.0,1.0); spe = 0.20*pow(spe,32.0); } // techo else //if( matID==5 ) { float ft = fbm( 16.0*pos ); //rgb = vec3(0.82,0.73,0.65) + ft*vec3(0.1); rgb = vec3(0.35, 0.5, 0.26) + ft*vec3(0.1);; // float fs = 0.9+0.1*fbm( 32.0*pos ); // rgb *= fs*vec3(0.,0.4,0.89); if(water) { rd.x *= 1.2; // rd.z *= 1.1; rd.y *= 8.2; } float fre = max( -dot( nor, rd ), 0.0); rgb -= vec3(fre*fre*0.45); spe = clamp((nor.y-nor.z)*0.707,0.0,1.0); spe = 0.20*pow(spe,32.0); } // AO float ao; float totao = 0.0; float sca = 10.0; for( int aoi=0; aoi<5; aoi++ ) { float hr = 0.01 + 0.015*float(aoi*aoi); vec3 aopos = nor * hr + pos; int kk, kk2; float dd = map( aopos, kk ); ao = -(dd-hr); totao += ao*sca; sca *= 0.5; } ao = 1.0 - clamp( totao, 0.0, 1.0 ); // shadow float so = 0.0; for( int i=0; i<6; i++ ) { float h = float(i)/6.0; float hr = 0.01 + h; vec3 aopos = lig * hr + pos; int kk, kk2; float dd = map( aopos, kk ); so += (1.0-h)*dd*2.0 * (10.0/6.0); } dif *= clamp( (so-0.40)*1.5, 0.0, 1.0 ); // lighting rgb = vec3(spe) + rgb * (ao*vec3(0.25,0.30,0.35) + dif*vec3(1.95,1.65,1.05)); // fog rgb = rgb * exp2( -0.4*t ); if (water) { rgb = clamp(rgb, 0., 1.); rgb *=0.3; /* rgb = clamp(rgb, 0.0, 1.0); // float factor = 1-dot(rd, vec3(0,-1,0)); // rgb = mix(vec3(0,.4,.9), rgb, 0.66); vec3 ggg = rgb+vec3(0.001); rgb = clamp(rgb, 0.0, 1.0); rgb = vec3(0,.4,.9)+rgb*0.001; */ } } // color correct rgb =rgb*vec3(1.0,0.9,0.81)*1.23; // vigneting rgb *= 0.25+0.75*clamp(0.60*abs(pixel.x-1.0)*abs(pixel.x+1.0),0.0,1.0); gl_FragColor=vec4(rgb,1.0); }]]>