Jump to content

[TOPIC: topicViewTemplate]
[GLOBAL: userSmallPhoto]
Photo

pagecurl effect
Started by pickerel Jan 20 2017 12:52 AM

No replies to this topic
[TOPIC CONTROLS]
This topic has been archived. This means that you cannot reply to this topic.
[/TOPIC CONTROLS]
[modOptionsDropdown]
[/modOptionsDropdown]
[reputationFilter]
[TOPIC: post.html]
#1

pickerel

[GLOBAL: userInfoPane.html]
pickerel
  • Contributor

  • 155 posts
  • Corona SDK

Playground: I don't know why it cannot generate share link

 

from http://transitions.glsl.io/transition/b1ed2b9c435ed6d4b18c8b9fda6e4352

P_UV float MIN_AMOUNT = -0.16;
P_UV float MAX_AMOUNT = 1.3;
 
P_UV float PI = 3.141592653589793;

P_UV float scale = 512.0;
P_UV float sharpness = 3.0;


 
vec3 hitPoint(float hitAngle, float yc, vec3 point, mat3 rrotation)
{
	float hitPoint = hitAngle / (2.0 * PI);
	point.y = hitPoint;
	return rrotation * point;
}

vec4 antiAlias(vec4 color1, vec4 color2, float distanc)
{
	distanc *= scale;
	if (distanc < 0.0) return color2;
	if (distanc > 2.0) return color1;
	float dd = pow(1.0 - distanc / 2.0, sharpness);
	return ((color2 - color1) * dd) + color1;
}

float distanceToEdge(vec3 point)
{
	float dx = abs(point.x > 0.5 ? 1.0 - point.x : point.x);
	float dy = abs(point.y > 0.5 ? 1.0 - point.y : point.y);
	if (point.x < 0.0) dx = -point.x;
	if (point.x > 1.0) dx = point.x - 1.0;
	if (point.y < 0.0) dy = -point.y;
	if (point.y > 1.0) dy = point.y - 1.0;
	if ((point.x < 0.0 || point.x > 1.0) && (point.y < 0.0 || point.y > 1.0)) return sqrt(dx * dx + dy * dy);
	return min(dx, dy);
}

vec4 seeThrough(vec2 resolution, float cylinderRadius, float cylinderAngle,   float yc, vec2 p, mat3 rotation, mat3 rrotation)
{
	float hitAngle = PI - (acos(yc / cylinderRadius) - cylinderAngle);
	vec3 point = hitPoint(hitAngle, yc, rotation * vec3(p, 1.0), rrotation);
	if (yc <= 0.0 && (point.x < 0.0 || point.y < 0.0 || point.x > 1.0 || point.y > 1.0))
	{
	  vec2 texCoord = gl_FragCoord.xy / resolution.xy;
		return texture2D(CoronaSampler0 , texCoord);
	}

	if (yc > 0.0) return texture2D(CoronaSampler1, p);

	vec4 color = texture2D(CoronaSampler1, point.xy);
	vec4 tcolor = vec4(0.0);

	return antiAlias(color, tcolor, distanceToEdge(point));
}

vec4 seeThroughWithShadow(float amount, vec2 resolution, float cylinderRadius, float cylinderAngle, float yc, vec2 p, vec3 point, mat3 rotation, mat3 rrotation)
{
	float shadow = distanceToEdge(point) * 30.0;
	shadow = (1.0 - shadow) / 3.0;

	if (shadow < 0.0) shadow = 0.0; else shadow *= amount;

	vec4 shadowColor = seeThrough(  resolution,   cylinderRadius,   cylinderAngle,yc, p, rotation, rrotation);
	shadowColor.r -= shadow;
	shadowColor.g -= shadow;
	shadowColor.b -= shadow;

	return shadowColor;
}

vec4 backside(float cylinderRadius, float yc, vec3 point)
{
	vec4 color = texture2D(CoronaSampler1, point.xy);
	float gray = (color.r + color.b + color.g) / 15.0;
	gray += (8.0 / 10.0) * (pow(1.0 - abs(yc / cylinderRadius), 2.0 / 10.0) / 2.0 + (5.0 / 10.0));
	color.rgb = vec3(gray);
	return color;
}

vec4 behindSurface(vec2 resolution, float amount, float cylinderRadius, float cylinderAngle, float yc, vec3 point, mat3 rrotation)
{
	float shado = (1.0 - ((-cylinderRadius - yc) / amount * 7.0)) / 6.0;
	shado *= 1.0 - abs(point.x - 0.5);

	yc = (-cylinderRadius - cylinderRadius - yc);

	float hitAngle = (acos(yc / cylinderRadius) + cylinderAngle) - PI;
	point = hitPoint(hitAngle, yc, point, rrotation);

	if (yc < 0.0 && point.x >= 0.0 && point.y >= 0.0 && point.x <= 1.0 && point.y <= 1.0 && (hitAngle < PI || amount > 0.5))
	{
		shado = 1.0 - (sqrt(pow(point.x - 0.5, 2.0) + pow(point.y - 0.5, 2.0)) / (71.0 / 100.0));
		shado *= pow(-yc / cylinderRadius, 3.0);
		shado *= 0.5;
	}
	else
	{
		shado = 0.0;
	}
	
	vec2 texCoord = gl_FragCoord.xy / resolution.xy;

	return vec4(texture2D(CoronaSampler0, texCoord).rgb - shado, 1.0);
}
 
 
 
P_COLOR vec4 FragmentKernel( P_UV vec2 texCoord ){
     float progress = abs(cos(CoronaTotalTime)); 
    float amount = progress * (MAX_AMOUNT - MIN_AMOUNT) + MIN_AMOUNT;
   
    float cylinderCenter = amount;
// 360 degrees * amount
float cylinderAngle = 2.0 * PI * amount;

  float cylinderRadius = 1.0 / PI / 2.0;
    
    vec2 resolution = vec2(CoronaVertexUserData.x,CoronaVertexUserData.y);
    
    
    
    vec2 texCoord1 = gl_FragCoord.xy / resolution.xy;
  
    float angle = 30.0 * PI / 180.0;
	float c = cos(-angle);
	float s = sin(-angle);

	mat3 rotation = mat3( c, s, 0,
								-s, c, 0,
								0.12, 0.258, 1
								);
	c = cos(angle);
	s = sin(angle);

	mat3 rrotation = mat3(	c, s, 0,
									-s, c, 0,
									0.15, -0.5, 1
								);

	vec3 point = rotation * vec3(texCoord, 1.0);

	float yc = point.y - cylinderCenter;

	if (yc < -cylinderRadius)
	{
		// Behind surface
		gl_FragColor = behindSurface(  resolution,   amount,   cylinderRadius,   cylinderAngle, yc, point, rrotation);
			return CoronaColorScale( vec4(vec3(gl_FragColor), 1.0)); 
	}

	if (yc > cylinderRadius)
	{
		// Flat surface
		gl_FragColor = texture2D(CoronaSampler1 , texCoord);
			return CoronaColorScale( vec4(vec3(gl_FragColor), 1.0)); 
	}

	float hitAngle = (acos(yc / cylinderRadius) + cylinderAngle) - PI;

	float hitAngleMod = mod(hitAngle, 2.0 * PI);
	if ((hitAngleMod > PI && amount < 0.5) || (hitAngleMod > PI/2.0 && amount < 0.0))
	{
		gl_FragColor = seeThrough( resolution,   cylinderRadius,   cylinderAngle,yc, texCoord, rotation, rrotation);
			return CoronaColorScale( vec4(vec3(gl_FragColor), 1.0)); 
	}

	point = hitPoint(hitAngle, yc, point, rrotation);

	if (point.x < 0.0 || point.y < 0.0 || point.x > 1.0 || point.y > 1.0)
	{
		gl_FragColor = seeThroughWithShadow(  amount, resolution,   cylinderRadius,   cylinderAngle,  yc, texCoord, point, rotation, rrotation);
			return CoronaColorScale( vec4(vec3(gl_FragColor), 1.0)); 
	}

	vec4 color = backside(cylinderRadius,yc, point);

	vec4 otherColor;
	if (yc < 0.0)
	{
		float shado = 1.0 - (sqrt(pow(point.x - 0.5, 2.0) + pow(point.y - 0.5, 2.0)) / 0.71);
		shado *= pow(-yc / cylinderRadius, 3.0);
		shado *= 0.5;
		otherColor = vec4(0.0, 0.0, 0.0, shado);
	}
	else
	{
		otherColor = texture2D(CoronaSampler1, texCoord);
	}

	color = antiAlias(color, otherColor, cylinderRadius - abs(yc));

	vec4 cl = seeThroughWithShadow(amount, resolution,   cylinderRadius,   cylinderAngle,yc, texCoord, point, rotation, rrotation);
	float dist = distanceToEdge(point);

	gl_FragColor = antiAlias(color, cl, dist);
    
    
    

	return CoronaColorScale( vec4(vec3(gl_FragColor), 1.0));    
}




[topic_controls]
[/topic_controls]