layout (triangles) in; layout (triangle_strip, max_vertices = 3) out; vec2 aViewRes = vec2(400.0, 400.0); vec2 aViewOffset = vec2(0.0, 0.0); mat4 aMat = occProjectionMatrix * occWorldViewMatrix * occModelWorldMatrix; vec3 toWinCoord(vec3 theVec) { vec4 aTransCoord = aMat * vec4(theVec, 1.0); vec3 aWinCoord = aTransCoord.xyz / aTransCoord.w; aWinCoord = aWinCoord * 0.5 + 0.5; aWinCoord.x = aWinCoord.x * aViewRes.x + aViewOffset.x; aWinCoord.y = aWinCoord.y * aViewRes.y + aViewOffset.y; return aWinCoord; } vec3 toObjectCoord(vec3 theVec) { theVec.x = (theVec.x - aViewOffset.x) / aViewRes.x; theVec.y = (theVec.y - aViewOffset.y) / aViewRes.y; theVec = theVec * 2.0 - 1.0; vec4 aObjectCoord = inverse(aMat) * vec4(theVec, 1.0); aObjectCoord.xyz /= aObjectCoord.w; return aObjectCoord.xyz; } void shrinkTriangle(float theValue) { vec3 aWinCoordCenter = toWinCoord(vec3(0.0, 0.0, 0.0)); aWinCoordCenter.xy += theValue; float aShift = length(toObjectCoord(aWinCoordCenter)); //aShift = aShift - theValue * 0.075; //for triangles //aShift = aShift - theValue * 0.0038; //for box for (int aTriVertIter = 0; aTriVertIter < 3; ++aTriVertIter) { vec3 aLeftPoint = gl_in[aTriVertIter].gl_Position.xyz; vec3 aRightPoint = gl_in[aTriVertIter].gl_Position.xyz; for(int i = 0; i < gl_in.length(); i++) { if(gl_in[i].gl_Position.xyz == gl_in[aTriVertIter].gl_Position.xyz) { continue; } else { if (aLeftPoint == gl_in[aTriVertIter].gl_Position.xyz) { aLeftPoint = gl_in[i].gl_Position.xyz; continue; } if (aRightPoint == gl_in[aTriVertIter].gl_Position.xyz) { aRightPoint = gl_in[i].gl_Position.xyz; continue; } } } vec3 aLeftVec = aLeftPoint - gl_in[aTriVertIter].gl_Position.xyz; vec3 aRightVec = aRightPoint - gl_in[aTriVertIter].gl_Position.xyz; float aAngle = acos(dot(aLeftVec, aRightVec) / (length(aLeftVec) * length(aRightVec))); float aScaleFactor = aShift / sin(aAngle / 2.0); vec3 aMoveVec = normalize(normalize(aLeftVec) + normalize(aRightVec)); vec3 aVertRes = gl_in[aTriVertIter].gl_Position.xyz + aMoveVec * aScaleFactor; gl_Position = aMat * vec4 (aVertRes, 1.0); EmitVertex(); } } void shrinkTrianglePix(float theValue) { for (int aTriVertIter = 0; aTriVertIter < 3; ++aTriVertIter) { vec3 aLeftPoint = toWinCoord(gl_in[aTriVertIter].gl_Position.xyz); vec3 aRightPoint = toWinCoord(gl_in[aTriVertIter].gl_Position.xyz); for(int i = 0; i < gl_in.length(); i++) { if(toWinCoord(gl_in[i].gl_Position.xyz) == toWinCoord(gl_in[aTriVertIter].gl_Position.xyz)) { continue; } else { if (aLeftPoint == toWinCoord(gl_in[aTriVertIter].gl_Position.xyz)) { aLeftPoint = toWinCoord(gl_in[i].gl_Position.xyz); continue; } if (aRightPoint == toWinCoord(gl_in[aTriVertIter].gl_Position.xyz)) { aRightPoint = toWinCoord(gl_in[i].gl_Position.xyz); continue; } } } vec3 aLeftVec = aLeftPoint - toWinCoord(gl_in[aTriVertIter].gl_Position.xyz); vec3 aRightVec = aRightPoint - toWinCoord(gl_in[aTriVertIter].gl_Position.xyz); float aAngle = acos(dot(aLeftVec, aRightVec) / (length(aLeftVec) * length(aRightVec))); float aScaleFactor = theValue / sin(aAngle / 2.0); vec3 aMoveVec = normalize(normalize(aLeftVec) + normalize(aRightVec)); vec3 aVertRes = toWinCoord(gl_in[aTriVertIter].gl_Position.xyz) + aMoveVec * aScaleFactor; gl_Position = aMat * vec4 (toObjectCoord(aVertRes), 1.0); EmitVertex(); } } void shrinkQuad(float theValue) { vec3 aWinCoordCenter = toWinCoord(vec3(0.0, 0.0, 0.0)); aWinCoordCenter.xy += theValue; float aShift = length(toObjectCoord(aWinCoordCenter)) - theValue * 0.075; for (int aTriVertIter = 0; aTriVertIter < 3; ++aTriVertIter) { vec3 aLeftPoint = gl_in[aTriVertIter].gl_Position.xyz; vec3 aRightPoint = gl_in[aTriVertIter].gl_Position.xyz; for(int i = 0; i < gl_in.length(); i++) { if(gl_in[i].gl_Position.xyz == gl_in[aTriVertIter].gl_Position.xyz) { continue; } else { if (aLeftPoint == gl_in[aTriVertIter].gl_Position.xyz) { aLeftPoint = gl_in[i].gl_Position.xyz; continue; } if (aRightPoint == gl_in[aTriVertIter].gl_Position.xyz) { aRightPoint = gl_in[i].gl_Position.xyz; continue; } } } vec3 aLeftVec = aLeftPoint - gl_in[aTriVertIter].gl_Position.xyz; vec3 aRightVec = aRightPoint - gl_in[aTriVertIter].gl_Position.xyz; float aAngle = acos(dot(aLeftVec, aRightVec) / (length(aLeftVec) * length(aRightVec))); vec3 aSideCenter = (gl_in[0].gl_Position.xyz + gl_in[1].gl_Position.xyz) / 2; vec3 aMoveVec = normalize(aSideCenter - gl_in[aTriVertIter].gl_Position.xyz); if(aTriVertIter == 2) { aAngle /= 2.0; aMoveVec = normalize(normalize(aLeftVec) + normalize(aRightVec)); } float aScaleFactor = aShift / sin(aAngle); vec3 aVertRes = gl_in[aTriVertIter].gl_Position.xyz + aMoveVec * aScaleFactor; gl_Position = aMat * vec4 (aVertRes, 1.0); EmitVertex(); } } void main() { // shrinkTrianglePix(10); shrinkTriangle(10); // shrinkQuad(10); EndPrimitive(); }