scene.org File Archive

File download

<root>­/­parties­/­2017­/­tokyodemofest17­/­glsl_graphics_compo/schottkywaltz.txt

File size:
15 121 bytes (14.77K)
File date:
2017-02-20 05:45:01
Download count:
all-time: 589

Screenshot (by Demozoo)

Screenshot

Preview

 #ifdef GL_ES
precision highp float;
#endif

#extension GL_OES_standard_derivatives : enable

uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;

vec2 rand2n(vec2 co, float sampleIndex) {
    vec2 seed = co * (sampleIndex + 1.0);
	seed+=vec2(-1,1);
    return vec2(fract(sin(dot(seed.xy ,vec2(12.9898,78.233))) * 43758.5453),
                fract(cos(dot(seed.xy ,vec2(4.898,7.23))) * 23421.631));
}

vec2 circleInvert(vec2 pos, vec3 circle){
	return ((pos - circle.xy) * circle.z * circle.z)/(length(pos - circle.xy) * length(pos - circle.xy) ) + circle.xy;
}

mat2 getRotationMat2(float angleRadians){
	return mat2(cos(angleRadians), -sin(angleRadians),
                sin(angleRadians), cos(angleRadians));
}
const mat2 UNI_MAT = mat2(1, 0, 0, 1);

const float PI = 3.1415926535;
const float PI_2 = 3.1415926535/2.;
const float PI_4 = 3.1415926535/4.;


const float R = 100. * sqrt(2.) / 2.;
vec3 c1 = vec3(100, 0, 0);
vec3 c3 = vec3(-100, 0, 0);
vec3 c2 = vec3(0, 100, 0);
vec3 c4 = vec3(0, -100, 0);
vec3 c5 = vec3(0);

// control point and rotation matrix of l1
float l1Angle = PI_4;
vec2 l1p = vec2(500, 0);
mat2 l1m;
mat2 l1mInv;
// control point and rotation matrix of l1
float l2Angle = PI + PI_4;
vec2 l2p = vec2(-800, 0);
mat2 l2m;
mat2 l2mInv;

float l3Angle = PI + PI_4;
vec2 l3p = vec2(-1500, 0);
mat2 l3m;
mat2 l3mInv;

float l4Angle = PI_2 + PI_4;
vec2 l4p = vec2(0, -1500);
mat2 l4m;
mat2 l4mInv;

bool enableL1 = false;
bool enableL2 = false;
bool enableL3 = false;
bool enableL4 = false;

const int MAX_ITERATIONS = 35;
float IIS(vec2 pos){
    float loopNum = 0.;
	bool cont = false;
	for(int i = 0 ; i < MAX_ITERATIONS ; i++){
		cont = false;
		
        if(length(pos - c1.xy) < c1.z){
			pos = circleInvert(pos, c1);
			cont = true;
            loopNum++;
		}else if(length(pos - c2.xy) < c2.z){
			pos = circleInvert(pos, c2);
			cont = true;
            loopNum++;
		}else if(length(pos - c3.xy) < c3.z){
			pos = circleInvert(pos, c3);
			cont = true;
            loopNum++;
		}else if(length(pos - c4.xy) < c4.z){
			pos = circleInvert(pos, c4);
			cont = true;
            loopNum++;
		}else if(length(pos - c5.xy) < c5.z){
			pos = circleInvert(pos, c5);
			cont = true;
            loopNum++;
		}
        
        if(enableL1){
        	pos -= l1p;
        	pos = l1mInv * pos;
        	if(pos.x > 0.){
        		pos.x *= -1.;
            	loopNum++;
            	cont = true;
        	}
        	pos = l1m * pos;
        	pos += l1p;
        }
        
        if(enableL2){
        pos -= l2p;
        pos = l2mInv * pos;
        if(pos.x > 0.){
        	pos.x *= -1.;
            loopNum++;
            cont = true;
        }
        pos = l2m * pos;
        pos += l2p;
        }
        
        if(enableL3){
        pos -= l3p;
        pos = l3mInv * pos;
        if(pos.x > 0.){
        	pos.x *= -1.;
            loopNum++;
            cont = true;
        }
        pos = l3m * pos;
        pos += l3p;
        }
         
        if(enableL4){
        	pos -= l4p;
        	pos = l4mInv * pos;
        	if(pos.x > 0.){
        		pos.x *= -1.;
            	loopNum++;
				cont = true;
        	}
        	pos = l4m * pos;
        	pos += l4p;
        }
        
		if(cont == false) break;
	}

	return loopNum;
}

vec3 hsv2rgb(vec3 c)
{
    vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
    vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
    return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
}

//w: start time
//s: duration
float scene(in float t, in float w, in float s){
    return clamp(t - w, 0.0, s) / s;  
}

float expEzingIn(float t){
    return pow( 2., 13. * (t - 1.) );
}
float expEzingOut(float t) {
	return -pow( 2., -10. * t) + 1.;
}

float circEzingInOut(float t){
	t /= .5;
	if (t < 1.) return -.5 * (sqrt(1. - t*t) - 1.);
	t -= 2.;
	return .5 * (sqrt(1. - t*t) + 1.);
}

float circEzingIn(float t){
	return -  (sqrt(1. - t*t) - 1.);
}

float ezing(in float t){
    //return pow( 2., 13. * (t - 1.) );
    //return t;  
    //return t * t * t;
    //return t * t * (3.0 - 2.0 * t);
    //return sin(t * radians(90.0));
    //return 1.0 - pow(cos(t * radians(90.0)), 0.5);
    return pow(sin(t * radians(90.0)), 0.2);
}

const float DISPLAY_GAMMA_COEFF = 1. / 2.2;
vec3 gammaCorrect(vec3 rgb) {
  return vec3((min(pow(rgb.r, DISPLAY_GAMMA_COEFF), 1.)),
              (min(pow(rgb.g, DISPLAY_GAMMA_COEFF), 1.)),
              (min(pow(rgb.b, DISPLAY_GAMMA_COEFF), 1.)));
}

const float SAMPLE_NUM = 20.;
void main(){
    vec3 sum = vec3(0);
    float t = mod(time, 22.);
	float ratio = resolution.x / resolution.y / 2.0;
    
    enableL1 = enableL2 = enableL3 = enableL4 = false;

	float start = 1.5;
   c1.z = mix(0., R, expEzingIn(scene(t, start, 1.)));
    c2.z = mix(0., R, expEzingIn(scene(t, start + .1, 1.)));
	c3.z = mix(0., R, expEzingIn(scene(t, start + .3, 1.)));
	c4.z = mix(0., R, expEzingIn(scene(t, start + .5, 1.)));
    
    float rotationStart = start + 1.7;
    float scaleFactor = 150.;    
    float theta = mix(0., 2. * PI + PI_4, circEzingInOut(scene(t, rotationStart, 1.)));
    scaleFactor += mix(0., 800., circEzingInOut(scene(t, rotationStart, 1.)));
        
    //1.8---3.
	l1p.x = mix(1500., 200., expEzingIn(scene(t, rotationStart, 1.)));
	l2p.x = mix(-1500., -200., expEzingIn(scene(t, rotationStart, 1.5)));
    enableL1 = t > rotationStart + .5;
    enableL2 = t > rotationStart + .5;
    
	float lineStart = rotationStart + 1.5;
    l1Angle += mix(0., PI_2 , circEzingInOut(scene(t, lineStart, 1.)));
    l2Angle += mix(0., PI_2 , circEzingInOut(scene(t, lineStart, 1.)));
    float lpRotateAngle1 = mix(0., PI_2, circEzingInOut(scene(t, lineStart, 1.)));
   	l3p.x = mix(-1500., -200., expEzingIn(scene(t, lineStart, 1.)));
    enableL3 = t > lineStart;
    
    float rotateStart2 = lineStart + 1.1;
    l1Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart2, 1.)));
    l2Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart2, 1.)));
	l3Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart2, 1.)));    
	lpRotateAngle1 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart2, 1.)));    
    l4p.y = mix(-1500., -200., expEzingIn(scene(t, rotateStart2, 1.)));
    enableL4 = t > rotateStart2;
    
    float rotateStart3 = rotateStart2 + 1.1;
    l1Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart3, 1.)));
    l2Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart3, 1.)));
	l3Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart3, 1.)));  
   	l4Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart3, 1.)));
    lpRotateAngle1 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart3, 1.)));    
	float lpRotateAngle2 = mix(0., PI_2, circEzingInOut(scene(t, rotateStart3, 1.))); 

    float rotateStart4 = rotateStart3 + 1.3;
    l1Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart4, 1.)));
    l2Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart4, 1.)));
	l3Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart4, 1.)));  
   	l4Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart4, 1.)));
    lpRotateAngle1 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart4, 1.)));    
	lpRotateAngle2 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart4, 1.))); 
    scaleFactor += mix(0., -600., circEzingInOut(scene(t, rotateStart4, 1.)));

    float rotateStart5 = rotateStart4 + 1.1;
    l1Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart5, 1.)));
    l2Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart5, 1.)));
	l3Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart5, 1.)));  
   	l4Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart5, 1.)));
    lpRotateAngle1 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart5, 1.)));    
	lpRotateAngle2 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart5, 1.))); 
 
    float rotateStart6 = rotateStart5 + 1.3;
    l1Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart6, 1.)));
    l2Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart6, 1.)));
	l3Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart6, 1.)));  
   	l4Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart6, 1.)));
    lpRotateAngle1 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart6, 1.)));    
	lpRotateAngle2 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart6, 1.))); 
    
    float rotateStart7 = rotateStart6 + 1.3;
    l1Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart7, 1.)));
    l2Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart7, 1.)));
	l3Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart7, 1.)));  
   	l4Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart7, 1.)));
    lpRotateAngle1 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart7, 1.)));    
	lpRotateAngle2 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart7, 1.)));
    
    float rotateStart8 = rotateStart7 + 1.3;
    l1Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart8, 1.)));
    l2Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart8, 1.)));
	l3Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart8, 1.)));  
   	l4Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart8, 1.)));
    lpRotateAngle1 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart8, 1.)));    
	lpRotateAngle2 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart8, 1.)));

    float rotateStart9 = rotateStart8 + 1.3;
    l1Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart9, 1.)));
    l2Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart9, 1.)));
	l3Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart9, 1.)));  
   	l4Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart9, 1.)));
    lpRotateAngle1 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart9, 1.)));    
	lpRotateAngle2 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart9, 1.)));

    float rotateStart10 = rotateStart9 + 1.2;
    l1Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart10, 1.)));
    l2Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart10, 1.)));
	l3Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart10, 1.)));  
   	l4Angle += mix(0., PI_2 , circEzingInOut(scene(t, rotateStart10, 1.)));
    lpRotateAngle1 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart10, 1.)));    
	lpRotateAngle2 += mix(0., PI_2, circEzingInOut(scene(t, rotateStart10, 1.)));
        
    
    float circleStart = rotateStart5;
    float deformR = 100.;
    c1.z += mix(0., deformR, expEzingOut(scene(t, rotateStart5, 1.)));
    c1.z += mix(0., -deformR, expEzingOut(scene(t, rotateStart6, 1.)));
	
    //c2.z += mix(0., deformR, expEzingOut(scene(t, circleStart+.5, 1.)));
	//c2.z += mix(0., -deformR, expEzingOut(scene(t, circleStart+.5 +1., 1.)));

	c3.z += mix(0., deformR, expEzingOut(scene(t, rotateStart6, 1.)));
  	c3.z += mix(0., -deformR, expEzingOut(scene(t, rotateStart7, 1.)));

	//c4.z += mix(0., deformR, expEzingOut(scene(t, circleStart+1.5, 1.)));    
	//c4.z += mix(0., -deformR, expEzingOut(scene(t, circleStart+1.5+1., 1.)));    

    c5.z += mix(0., 50., circEzingInOut(scene(t, rotateStart7, 1.)));
    
    scaleFactor += mix(0., -300., circEzingInOut(scene(t, rotateStart7, 1.)));
    scaleFactor /= mix(1., 4., circEzingInOut(scene(t, rotateStart8, 1.)));
    scaleFactor /= mix(1., 4., circEzingInOut(scene(t, rotateStart9, 1.)));
    scaleFactor /= mix(1., 4., circEzingInOut(scene(t, rotateStart10, 1.)));

    float endingStart = rotateStart10 + 1.3;
    if(t >= endingStart){
        
        float rotateStart11 = endingStart;
   		l1Angle -= mix(0., PI_2 , circEzingInOut(scene(t, rotateStart11, 1.)));
    	l2Angle -= mix(0., PI_2 , circEzingInOut(scene(t, rotateStart11, 1.)));
		l3Angle -= mix(0., PI_2 , circEzingInOut(scene(t, rotateStart11, 1.)));  
   		l4Angle -= mix(0., PI_2 , circEzingInOut(scene(t, rotateStart11, 1.)));
    	lpRotateAngle1 -= mix(0., PI_2, circEzingInOut(scene(t, rotateStart11, 1.)));    
		lpRotateAngle2 -= mix(0., PI_2, circEzingInOut(scene(t, rotateStart11, 1.)));
        
        float rotateStart12 = rotateStart11 + 1.3;
   		l1Angle -= mix(0., PI_2 , circEzingInOut(scene(t, rotateStart12, 1.)));
    	l2Angle -= mix(0., PI_2 , circEzingInOut(scene(t, rotateStart12, 1.)));
		l3Angle -= mix(0., PI_2 , circEzingInOut(scene(t, rotateStart12, 1.)));  
   		l4Angle -= mix(0., PI_2 , circEzingInOut(scene(t, rotateStart12, 1.)));
    	lpRotateAngle1 -= mix(0., PI_2, circEzingInOut(scene(t, rotateStart12, 1.)));    
		lpRotateAngle2 -= mix(0., PI_2, circEzingInOut(scene(t, rotateStart12, 1.)));
        
        float rotateStart13 = rotateStart12+1.3;
   		l1Angle -= mix(0., PI_2 , circEzingInOut(scene(t, rotateStart13, 1.)));
    	l2Angle -= mix(0., PI_2 , circEzingInOut(scene(t, rotateStart13, 1.)));
		l3Angle -= mix(0., PI_2 , circEzingInOut(scene(t, rotateStart13, 1.)));  
   		l4Angle -= mix(0., PI_2 , circEzingInOut(scene(t, rotateStart13, 1.)));
    	lpRotateAngle1 -= mix(0., PI_2, circEzingInOut(scene(t, rotateStart13, 1.)));    
		lpRotateAngle2 -= mix(0., PI_2, circEzingInOut(scene(t, rotateStart13, 1.)));
        
        
        float endingTime = 1.;
   		
		c5.z  = mix(50., 0., circEzingInOut(scene(t, rotateStart12, endingTime)));
        l1p.x = mix(200., 5000., circEzingIn(scene(t, rotateStart13, endingTime)));  
		l2p.x = mix(-200., -5000., circEzingIn(scene(t, rotateStart13, endingTime)));
    	l3p.y = mix(0., -5000., circEzingIn(scene(t, rotateStart13, endingTime)));  
		l4p.y = mix(-200., -5000., circEzingIn(scene(t, rotateStart13, endingTime)));
        c1.z = mix(R, 0., circEzingInOut(scene(t, rotateStart13, endingTime)));
    	c2.z = mix(R, 0., circEzingInOut(scene(t, rotateStart13, endingTime)));
		c3.z = mix(R, 0., circEzingInOut(scene(t, rotateStart13, endingTime)));
		c4.z = mix(R, 0., circEzingInOut(scene(t, rotateStart13, endingTime)));

        theta += mix(0., -PI_2, circEzingInOut(scene(t, rotateStart13, 1.)));

        scaleFactor *= mix(1., 650., circEzingInOut(scene(t, endingStart, 1.)));

    }
    
    mat2 lpRotate1 = getRotationMat2(lpRotateAngle1);    
    l1m = getRotationMat2(l1Angle);
    l1mInv = getRotationMat2(-l1Angle);
    l2m = getRotationMat2(l2Angle);
    l2mInv = getRotationMat2(-l2Angle);
    l3m = getRotationMat2(l3Angle);
    l3mInv = getRotationMat2(-l3Angle);    
	l4m = getRotationMat2(l4Angle);
    l4mInv = getRotationMat2(-l4Angle); 
    
    l1p = lpRotate1 * l1p;
	l2p = lpRotate1 * l2p;
	l3p = lpRotate1 * l3p;
    
    mat2 lpRotate2 = getRotationMat2(lpRotateAngle2);    
 	l4p = lpRotate2 * l4p;    
    
    mat2 m = getRotationMat2(theta);    

    for(float i = 0. ; i < SAMPLE_NUM ; i++){
        vec2 position = ( (gl_FragCoord.xy + rand2n(gl_FragCoord.xy, i)) / resolution.yy ) - vec2(ratio, 0.5);
        
        position = position * scaleFactor;
        position = m * position;
        
        
        float loopNum = IIS(position);

        if(loopNum >  0.){
            sum += hsv2rgb(vec3(0.01 + 0.05 * (loopNum-1.),1.0,1.0));
        }
    }
    gl_FragColor = vec4(gammaCorrect(sum/SAMPLE_NUM), 1.);
}