////////////////////////////////////////// // Complementary Shaders by EminGT // // With Euphoria Patches by SpacEagle17 // ////////////////////////////////////////// #include "/lib/common.glsl" #ifdef RENKO_CUT #ifdef FRAGMENT_SHADER in vec2 knifePos; in vec2 knifeDir; in float isKnifeDown; in vec2 texelPos; in float healing; void drawKnife(inout vec3 color, vec2 uv, vec2 pos, vec2 dir, float scale) { vec2 localUV = mat2(vec2(1, -1) * dir, dir.yx) * (uv - pos) / scale; const float knifeRot0 = 0.3; const vec2 knifeOffset = vec2(0.3, -0.05); const mat2 knifeRotMat0 = mat2(cos(knifeRot0), sin(knifeRot0), -sin(knifeRot0), cos(knifeRot0)); localUV = knifeRotMat0 * localUV + knifeOffset; float bladeLen0 = length(localUV * vec2(1, 2) - vec2(0.2, 0.5)); float bladeLen1 = length(localUV - vec2(0.9, 1.5)); float bladeLen2 = length(localUV - vec2(-0.8, 6.0)); if (bladeLen0 < 0.6 && bladeLen1 > 1.3 && bladeLen2 > 5.8) { color = vec3(0.7); if (bladeLen0 > 0.5) color = vec3(0.9); } vec2 handleMidCoord = vec2(-0.6, 0.13); vec2 handleScale = vec2(2.0, 5.0); float handleDist = length(pow(abs(localUV - handleMidCoord) * handleScale, vec2(3))); if (handleDist < 1.0) { color = vec3(0.6,0.2,0.0); color += 0.1 * (localUV.y * handleScale.y - handleMidCoord.y + 0.5); } } void main() { vec4 cutData = texelFetch(colortex2, texelCoord, 0); vec4 color = texelFetch(colortex3, texelCoord, 0); vec2 relPos = texelPos - knifePos; float projW = dot(relPos, knifeDir); float error = length(relPos - projW * knifeDir); if (isKnifeDown > 0.5 && error < 0.01 * (0.6 - 70.0 * projW * projW)) { cutData.g = 1.0; } else if (healing > 0.5) { float aroundHealthy = 0; for (int k = 0; k < 4; k++) { ivec2 offset = (k/2*2-1) * ivec2(k%2, (k+1)%2); aroundHealthy += texelFetch(colortex2, texelCoord + offset, 0).g; } if (aroundHealthy < 3.5) cutData.g = 0.0; } if (cutData.g > 0.5) { color = vec4(0, 0, 0, 1); } drawKnife(color.rgb, texelPos, knifePos, -knifeDir, 0.2); if (frameCounter < 10) { cutData.g = 0.0; } /* DRAWBUFFERS:32 */ gl_FragData[0] = color; gl_FragData[1] = cutData; } #endif #ifdef VERTEX_SHADER out vec2 knifePos; out vec2 knifeDir; out float isKnifeDown; out vec2 texelPos; out float healing; vec3 knifePosList[84] = vec3[84]( vec3(0.1, 0.7, 1), vec3(0.1, 0.5, 1), vec3(0.1, 0.3, 1), vec3(0.15, 0.3, 1), vec3(0.15, 0.45, 1), vec3(0.2, 0.45, 1), vec3(0.27, 0.3, 1), vec3(0.32, 0.3, 1), vec3(0.25, 0.47, 1), vec3(0.3, 0.55, 1), vec3(0.3, 0.62, 1), vec3(0.25, 0.7, 1), vec3(0.1, 0.7, 0), vec3(0.4, 0.7, 1), vec3(0.4, 0.5, 1), vec3(0.4, 0.3, 1), vec3(0.53, 0.3, 1), vec3(0.65, 0.3, 1), vec3(0.65, 0.35, 1), vec3(0.45, 0.35, 1), vec3(0.45, 0.475, 1), vec3(0.6, 0.475, 1), vec3(0.6, 0.525, 1), vec3(0.45, 0.525, 1), vec3(0.45, 0.65, 1), vec3(0.65, 0.65, 1), vec3(0.65, 0.7, 1), vec3(0.4, 0.7, 0), vec3(0.7, 0.7, 1), vec3(0.7, 0.5, 1), vec3(0.7, 0.3, 1), vec3(0.75, 0.3, 1), vec3(0.75, 0.45, 1), vec3(0.75, 0.6, 1), vec3(0.825, 0.45, 1), vec3(0.9, 0.3, 1), vec3(0.95, 0.3, 1), vec3(0.95, 0.5, 1), vec3(0.95, 0.7, 1), vec3(0.9, 0.7, 1), vec3(0.9, 0.55, 1), vec3(0.9, 0.4, 1), vec3(0.825, 0.55, 1), vec3(0.75, 0.7, 1), vec3(0.7, 0.7, 0), vec3(1.0, 0.7, 1), vec3(1.0, 0.5, 1), vec3(1.0, 0.3, 1), vec3(1.05, 0.3, 1), vec3(1.05, 0.5, 1), vec3(1.15, 0.4, 1), vec3(1.23, 0.3, 1), vec3(1.29, 0.3, 1), vec3(1.2, 0.42, 1), vec3(1.13, 0.48, 1), vec3(1.2, 0.59, 1), vec3(1.28, 0.7, 1), vec3(1.22, 0.7, 1), vec3(1.15, 0.61, 1), vec3(1.1, 0.56, 1), vec3(1.05, 0.6, 1), vec3(1.05, 0.7, 1), vec3(1.0, 0.7, 0), vec3(1.35, 0.6, 1), vec3(1.35, 0.4, 1), vec3(1.43, 0.3, 1), vec3(1.52, 0.3, 1), vec3(1.6, 0.4, 1), vec3(1.6, 0.6, 1), vec3(1.52, 0.7, 1), vec3(1.43, 0.7, 1), vec3(1.35, 0.6, 0), vec3(1.4, 0.55, 1), vec3(1.4, 0.45, 1), vec3(1.475, 0.38, 1), vec3(1.55, 0.45, 1), vec3(1.55, 0.55, 1), vec3(1.475, 0.62, 1), vec3(1.4, 0.55, 0), vec3(1.2, 0.7, 0), vec3(0.8, 0.8, 0), vec3(0.5, 0.8, 0), vec3(0.2, 0.75, 0), vec3(0.1, 0.7, 0) ); void main() { gl_Position = ftransform(); texelPos = 0.5 * gl_Position.xy + 0.5; texelPos.x *= aspectRatio; float cutProgress = max(0, frameTimeCounter * 2 - 40.0); int thisIndex = int(cutProgress) % knifePosList.length(); healing = float(thisIndex > knifePosList.length() - 5); int nextIndex = (thisIndex+1) % knifePosList.length(); knifePos = mix( knifePosList[thisIndex].xy, knifePosList[nextIndex].xy, mod(cutProgress, float(knifePosList.length())) - thisIndex); knifeDir = normalize(knifePosList[nextIndex].xy - knifePosList[thisIndex].xy); isKnifeDown = knifePosList[thisIndex].z; } #endif #else #ifdef FRAGMENT_SHADER void main() { /* DRAWBUFFERS:3 */ gl_FragData[0] = texelFetch(colortex3, texelCoord, 0); } #endif #ifdef VERTEX_SHADER void main() { gl_Position = ftransform(); } #endif #endif