precision highp float; uniform vec2 resolution; uniform vec2 mouse; uniform float time; uniform sampler2D backbuffer; out vec4 outColor; float TIME; int SCENE; float localTime; float sceneGlobalStartTime; float sceneTime; // Arm Transition #define SCENE1_START 5.0 // Arm down #define SCENE2_START 12.0 // Arm up #define SCENE3_START 17.0 // Arm fall #define SCENE4_START 22.0 // End #define SCENE5_START 1000.0 #define END 1000.0 float LoopTime(float x, float start,float len) { return mod(x - start, len) + start; } const float PI = acos(-1.0); ivec2 font_data[94] = ivec2[]( //0 ivec2(0x00000000,0x00000000), //space //1~10 ivec2(0x7e91897e,0x00000000), //0 ivec2(0x01ff4121,0x00000000), //1 ivec2(0x71898543,0x00000000), //2 ivec2(0x6e919142,0x00000000), //3 ivec2(0x08ff4838,0x00000000), //4 ivec2(0x8e9191f2,0x00000000), //5 ivec2(0x0e91916e,0x00000000), //6 ivec2(0xc0b08f80,0x00000000), //7 ivec2(0x6e91916e,0x00000000), //8 ivec2(0x6e919162,0x00000000), //9 //11~36 ivec2(0x1e11110e,0x00000001), //a 11 ivec2(0x0e11117f,0x00000000), //b 12 ivec2(0x0a11110e,0x00000000), //c 13 ivec2(0x7f11110e,0x00000000), //d 14 ivec2(0x0815150e,0x00000000), //e 15 ivec2(0x48483f08,0x00000000), //f 16 ivec2(0x3e494930,0x00000000), //g 17 ivec2(0x0708087f,0x00000000), //h 18 ivec2(0x012f0900,0x00000000), //i 19 ivec2(0x5e111102,0x00000000), //j 20 ivec2(0x000b047f,0x00000000), //k 21 ivec2(0x017f4100,0x00000000), //l 22 ivec2(0x0807080f,0x00000007), //m 23 ivec2(0x0708080f,0x00000000), //n 24 ivec2(0x06090906,0x00000000), //o 25 ivec2(0x1824243f,0x00000000), //p 26 ivec2(0x3f242418,0x00000000), //q 27 ivec2(0x0010081f,0x00000000), //r 28 ivec2(0x0012150d,0x00000000), //s 29 ivec2(0x11113e10,0x00000000), //t 30 ivec2(0x0f01010e,0x00000000), //u 31 ivec2(0x000e010e,0x00000000), //v 32 ivec2(0x010e010e,0x0000000f), //w 33 ivec2(0x0a040a11,0x00000011), //x 34 ivec2(0x3e090930,0x00000000), //y 35 ivec2(0x00191513,0x00000000), //z 36 //37~63 ivec2(0x7f88887f,0x00000000), //A 37 ivec2(0x6e9191ff,0x00000000), //B 38 ivec2(0x4281817e,0x00000000), //C 39 ivec2(0x7e8181ff,0x00000000), //D 40 ivec2(0x919191ff,0x00000000), //E 41 ivec2(0x909090ff,0x00000000), //F 42 ivec2(0x4685817e,0x00000000), //G 43 ivec2(0xff1010ff,0x00000000), //H 44 ivec2(0x0081ff81,0x00000000), //I 45 ivec2(0x80fe8182,0x00000000), //J 46 ivec2(0x413608ff,0x00000000), //K 47 ivec2(0x010101ff,0x00000000), //L 48 ivec2(0x601060ff,0x000000ff), //M 49 ivec2(0x0c1060ff,0x000000ff), //N 50 ivec2(0x7e81817e,0x00000000), //O 51 ivec2(0x609090ff,0x00000000), //P 52 ivec2(0x7f83817e,0x00000001), //Q 53 ivec2(0x619698ff,0x00000000), //R 54 ivec2(0x4e919162,0x00000000), //S 55 ivec2(0x80ff8080,0x00000080), //T 56 ivec2(0xfe0101fe,0x00000000), //U 57 ivec2(0x0e010ef0,0x000000f0), //V 58 ivec2(0x031c03fc,0x000000fc), //W 59 ivec2(0x340834c3,0x000000c3), //X 60 ivec2(0x300f30c0,0x000000c0), //Y 61 ivec2(0xe1918d83,0x00000081), //Z 62 //63~ ivec2(0x00007d00,0x00000000), //! 63 ivec2(0x60006000,0x00000000), //" 64 ivec2(0x3f123f12,0x00000012), //# 65 ivec2(0x52ff5224,0x0000000c), //$ 66 ivec2(0x33086661,0x00000043), //% 67 ivec2(0x374d5926,0x00000001), //& 68 ivec2(0x00006000,0x00000000), //' 69 ivec2(0x0081423c,0x00000000), //( 70 ivec2(0x003c4281,0x00000000), //) 71 ivec2(0x00143814,0x00000000), //* 72 ivec2(0x00103810,0x00000000), //+ 73 ivec2(0x00020100,0x00000000), //, 74 ivec2(0x08080808,0x00000000), //- 75 ivec2(0x00000100,0x00000000), //. 76 ivec2(0x30080601,0x00000040), /// ivec2(0x00240000,0x00000000), //: ivec2(0x00240200,0x00000000), //; ivec2(0x41221408,0x00000000), //< ivec2(0x00141414,0x00000000), //= ivec2(0x08142241,0x00000000), //> ivec2(0xa999423c,0x0000007c), //@ ivec2(0x008181ff,0x00000000), //[ ivec2(0x06083040,0x00000001), //\ ivec2(0x00000000,0x00000000), //] 何故か表示されない ivec2(0x00ff8181,0x00000000), //] ivec2(0x20402010,0x00000010), //^ ivec2(0x01010101,0x00000000), //_ ivec2(0x40408080,0x00000000), //` ivec2(0x41413608,0x00000000), //{ ivec2(0x00ff0000,0x00000000), //| ivec2(0x08364141,0x00000000), //} ivec2(0x08101008,0x00000010) //~ ); #define FontWidth 8 #define FontHeight 8 #define LineMaxLength 40 #define ID 86 vec3 font(vec2 uv,int id){ vec2 uv1 = uv; uv = uv * 8.0; ivec2 texel = ivec2(uv); int bit_offset = texel.x * FontWidth + texel.y; int s,t; s = font_data[id].x; t = font_data[id].y; int tex = 0; if(bit_offset <= 31){ s = s >> bit_offset; s = s & 0x00000001; tex = s; } else{ t = t >> (bit_offset - 32); t = t & 0x00000001; tex = t; } tex = (abs(uv1.x - 0.5) < 0.5 && abs(uv1.y - 0.5) < 0.5) ? tex : 0; return vec3(tex); } float sdBox( vec3 p, vec3 b ) { vec3 q = abs(p) - b; return length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0); } vec2 rot(vec2 p, float a){ return vec2(p.x * cos(a) - p.y * sin(a), p.x * sin(a) + p.y * cos(a)); } vec3 rot(vec3 r, vec3 axis, float a){ return r * cos(a) + cross(axis, r) * sin(a) + axis * dot(axis, r) * (1.0 - cos(a)); } int indexClane; // factor : 0.0 ~ 1.0 open, close float sdClene(vec3 p, float factor){ float d = sdBox(p - vec3(0.0,4.0,0.0), vec3(0.2,3.0,0.2)); float d1 = sdBox(p - vec3(0.0,1.0,0.0), vec3(0.5,0.3,0.3)); vec3 armP = p - vec3(0.0,1.0,0.0); armP.x = -abs(armP.x); armP.x += 0.2; float armRot = mix(0.3, 0.7,factor); // OPEN, CLOSE armP = rot(armP, vec3(0,0,1),PI * 0.5 - armRot); armP -= vec3(0.0,-0.5,0.0); float dP = sdBox(armP, vec3(0.1,0.5,0.1)); dP = min(dP,sdBox(rot(armP,vec3(0,0,1),PI * 0.5) - vec3(0.4,0.3,0.), vec3(0.1,0.4,0.1))); indexClane = (d > d1) ? 2 : 3; d = min(d1, d); indexClane = (d > dP) ? 3 : indexClane; d = min(d, dP); return d; } float easeOutBounce(float x){ const float n1 = 7.5625; const float d1 = 2.75; if (x < 1.0 / d1) { return n1 * x * x; } else if (x < 2.0 / d1) { return n1 * (x -= 1.5 / d1) * x + 0.75; } else if (x < 2.5 / d1) { return n1 * (x -= 2.25 / d1) * x + 0.9375; } else { return n1 * (x -= 2.625 / d1) * x + 0.984375; } } #define saturate(x) clamp(x,0.,1.) float powEaseOut(float x, float e){ return 1.0 - pow(saturate(1.0 - x), e); } vec3 localPos; int index; float map(vec3 p){ vec3 pos = p; vec3 boxPos = pos; boxPos.y -= 0.5; if(SCENE==2){ boxPos.y -= mix(0.0, 1.0, saturate((localTime-1.0) / 3.0)); } if(SCENE==3) { boxPos.y -= 1.0; boxPos.y -= mix(0.0, -0.06, saturate((localTime- 0.0) / 2.0)); float t = saturate((localTime - 2.0) / 2.0); boxPos.y += mix(0.0, -0.06, saturate((localTime- 2.0) / 2.0)); boxPos.y -= - easeOutBounce(saturate(t)); } float d = sdBox(boxPos, vec3(0.5)); localPos = boxPos; vec3 clenePos = pos - vec3(0.0,1.5,0.0); float factor = 1.0; if(SCENE == 0){ clenePos.x -= mix(0.0, 2.0, saturate((localTime - 2.0) / 2.0)) - 2.0; } if(SCENE == 1){ clenePos.y -= mix(0.0, -1.0, saturate((localTime-1.0) / 3.0)); factor = mix(1.0,0.0, saturate(localTime / 1.0)); factor = mix(factor, 0.4, saturate((localTime - 5.0) / 1.0)); } if(SCENE == 2){ clenePos.y -= mix(-1.0, 0.0, saturate((localTime-1.0) / 3.0)); factor = 0.4; } if(SCENE == 3){ //clenePos.x -= mix(2.0, -2.0, saturate((localTime - 5.0) / 4.0)) - 2.0; factor = mix(0.4,1.0, easeOutBounce(saturate((localTime - 2.55) / 0.4))); } if(SCENE == 4){ clenePos.x -= mix(2.0, -2.0, saturate((localTime - 0.0) / 4.0)) - 2.0; } float dC = sdClene(clenePos, factor * 2.0); index = (d > pos.y) ? 1 : 0; d = min(d, pos.y); index = (d > dC) ? indexClane : index; d = min(d, dC); return d; } vec3 normalmap( vec3 p) { vec2 d = vec2( 0, 1E-4 ); return normalize(vec3( map( p + d.yxx) - map( p - d.yxx), map( p + d.xyx) - map( p - d.xyx), map( p + d.xxy) - map( p - d.xxy) )); } vec3 Texture(vec2 uv) { return vec3(0.2,0.8,0.2); } void main(){ TIME = mod(time, SCENE4_START + 7.0); //TIME = LoopTime(TIME, SCENE4_START, 7.0); if(TIME < SCENE1_START){ SCENE = 0; localTime = TIME; } else if(TIME < SCENE2_START){ SCENE = 1; localTime = TIME - SCENE1_START; } else if(TIME < SCENE3_START){ SCENE = 2; localTime = TIME - SCENE2_START; } else if(TIME < SCENE4_START){ SCENE = 3; localTime = TIME - SCENE3_START; } else if(TIME < SCENE5_START){ SCENE = 4; localTime = TIME - SCENE4_START; } else{ SCENE = 5; localTime = TIME - SCENE5_START; } vec2 uv = (2.0 * (gl_FragCoord.xy) - resolution.xy)/resolution.y; vec3 ro = vec3(0.0, 2.0, 2.0); vec3 rd = normalize(vec3(uv, -1.0)); rd = rot(rd, vec3(1,0,0), PI * 2.0 - 0.4); vec3 pos = ro; float t = 0.0; float d = 0.0; for(int i = 0; i < 100; i++){ pos = ro + rd * t; d = map(pos); if(d < 0.001) break; t += d; } vec3 color = vec3(0.0); if(d < 0.001){ vec3 basecolor = vec3(1.0); vec3 normal = normalmap(pos); if(index == 0){ if(abs(dot(normal,vec3(0,1,0))) > 0.5)basecolor = Texture(localPos.xz).xyz; if(abs(dot(normal,vec3(0,0,1))) > 0.5)basecolor = Texture(localPos.xy).xyz; if(abs(dot(normal,vec3(1,0,0))) > 0.5)basecolor = Texture(localPos.yz*vec2(0.1,1.0)).xyz; } if(index == 1){ basecolor = vec3(1.0); } if(index == 2){ basecolor = vec3(0.8,0.0,0.0); } if(index == 3){ basecolor = vec3(0.2); } color = basecolor; vec3 lightPos = vec3(0.0, 3.0, 1.0); vec3 lightDir = normalize(lightPos - pos); float diff = max(0.0, dot(normal, lightDir) + 0.5); float spec = pow(max(0.0, dot(reflect(-lightDir, normal), -rd)), 32.0); diff = clamp(diff, 0.0, 1.0); color = color * diff + color * spec; color = exp(-0.1 * t) * color; } float fade = 0.0; if(SCENE == 0){ fade = smoothstep(1.0, 0.0, saturate(localTime / 2.0)); } else if(SCENE == 4){ fade = smoothstep(0.0, 1.0, saturate((localTime - 1.0) / 2.0)); } color = mix(color, vec3(0.0), fade); vec2 uvText = uv; uvText *= 5.0; int font_indices[13] = int[]( 70, 56, 25, 56, 71, 0, 30, 15, 11, 28, 76, 76, 76 ); float uvOffsetX[13] = float[]( 1.0,-0.5,-0.4,0.,0., -1.0,0.,0.,0.,0., 0.,0.,0. ); float charSpacing = 0.0; for(int i = 0; i < 13; i++){ charSpacing += uvOffsetX[i]; vec2 uvPos = uvText - vec2(float(i - 6) * 1.0 + charSpacing, 0.0); vec3 charColor = font(uvPos, font_indices[i]); if(SCENE == 4){ charColor = mix(vec3(0.0), charColor,saturate((localTime - 2.5) / 2.0)); charColor = mix(charColor, vec3(0.0), saturate((localTime - 4.0) / 2.0)); color += charColor; } } outColor = vec4(color,1.0); }