diff --git a/test/tutorial/tut03.cpp b/test/tutorial/tut03.cpp index 24b0ffa9..de451f17 100644 --- a/test/tutorial/tut03.cpp +++ b/test/tutorial/tut03.cpp @@ -80,10 +80,13 @@ public: m_deltascale[i] = 1.0; m_dirty[i] = 2; } - m_center = -0.75; #if defined __CELLOS_LV2__ || defined __native_client__ - m_zoom_speed = -0.0025; + //m_center = f64cmplx(-.22815528839841, -1.11514249704382); + //m_center = f64cmplx(0.001643721971153, 0.822467633298876); + m_center = f64cmplx(-0.65823419062254, .50221777363480); + m_zoom_speed = 0;//-0.0025; #else + m_center = -0.75; m_zoom_speed = 0.0; #endif m_radius = 5.0; @@ -207,11 +210,7 @@ public: zoom = 1e-14 / m_radius; } m_radius *= zoom; -#if defined __CELLOS_LV2__ || defined __native_client__ - //m_center = f64cmplx(-.22815528839841, -1.11514249704382); - //m_center = f64cmplx(0.001643721971153, 0.822467633298876); - m_center = f64cmplx(-0.65823419062254, .50221777363480); -#else +#if !defined __CELLOS_LV2__ && !defined __native_client__ m_center = (m_center - worldmouse) * zoom + worldmouse; worldmouse = m_center + ScreenToWorldOffset(mousepos); #endif @@ -369,7 +368,8 @@ public: #endif "attribute vec2 in_TexCoord;" "attribute vec2 in_Vertex;" - "void main(void) {" + "void main(void)" + "{" " gl_Position = vec4(in_Vertex, 0.0, 1.0);" #if defined HAVE_GLES_2X " pass_TexCoord = in_TexCoord;" @@ -391,73 +391,93 @@ public: "uniform mat4 in_ZoomSettings;" "uniform sampler2D in_Texture;" "" - "float mylen(vec2 p) {" - //" return abs(p.x) + abs(p.y);" - " return 0.001 + p.x * p.x + p.y * p.y;" - //" return 0.001 + length(p);" + "float mylen(vec2 p)" + "{" + " p *= in_TexelSize.zw;" /* Correct for aspect ratio */ + //" return 0.001 + abs(p.x) + abs(p.y);" + //" return 0.1 + length(p);" + " vec2 q = p * p;" + " return 0.01 + q.x + q.y;" "}" "" /* Get the coordinate of the nearest point in slice 0 in xy, * and the squared distance to that point in z. * p is in normalised [0,1] texture coordinates. * return value has the 0.25 Y scaling. */ - "vec3 nearest0(vec2 p) {" + "vec3 nearest0(vec2 p)" + "{" + /* Step 1: center point in [-.5,.5], apply zoom and + * translation transformation, and go back to texture + * coordinates in [0,1]. That's the ideal point we + * would like to compute the value for. */ " p -= vec2(0.5, 0.5);" " p *= in_ZoomSettings[0][2];" " p += vec2(in_ZoomSettings[0][0], -in_ZoomSettings[0][1]);" " p += vec2(0.5, 0.5);" - " vec2 q = p + 0.5 * in_TexelSize.xy;" + /* Step 2: find out the (rounded) texel coordinates in + * the half-resolution slice. We use an offset of 15/32 + * instead of 1/2 to avoid rounding issues at edges. */ + " vec2 q = p + 0.46875 * in_TexelSize.xy;" " q = in_TexelSize.xy" " * (1.0 + 2.0 * floor(q * 0.5 * in_TexelSize.zw));" + /* Step 3: go back to full-resolution texel coordinates + * so that we know the error between the pixel we get + * and the pixel we wanted. */ " vec2 r = q - 0.5 * in_TexelSize.xy;" - " float l = (abs(q.x - 0.5) < 0.5 && abs(q.y - 0.5) < 0.5)" + " float l = (abs(q.x - .5) < .5 && abs(q.y - .5) < .5)" " ? 1.0 / mylen(r - p) : 0.0;" + /* Step 4: return final texel coordinates and + * corresponding error value. */ " return vec3(q * vec2(1.0, 0.25), l);" "}" "" - "vec3 nearest1(vec2 p) {" + "vec3 nearest1(vec2 p)" + "{" " p -= vec2(0.5, 0.5);" " p *= in_ZoomSettings[1][2];" " p += vec2(in_ZoomSettings[1][0], -in_ZoomSettings[1][1]);" " p += vec2(0.5, 0.5);" - " vec2 q = p + -0.5 * in_TexelSize.xy;" + " vec2 q = p + -0.46875 * in_TexelSize.xy;" " q = in_TexelSize.xy" " * (1.0 + 2.0 * floor(q * 0.5 * in_TexelSize.zw));" " vec2 r = q - -0.5 * in_TexelSize.xy;" - " float l = (abs(q.x - 0.5) < 0.5 && abs(q.y - 0.5) < 0.5)" + " float l = (abs(q.x - .5) < .5 && abs(q.y - .5) < .5)" " ? 1.0 / mylen(r - p) : 0.0;" " return vec3(q * vec2(1.0, 0.25) + vec2(0.0, 0.25), l);" "}" "" - "vec3 nearest2(vec2 p) {" + "vec3 nearest2(vec2 p)" + "{" " p -= vec2(0.5, 0.5);" " p *= in_ZoomSettings[2][2];" " p += vec2(in_ZoomSettings[2][0], -in_ZoomSettings[2][1]);" " p += vec2(0.5, 0.5);" - " vec2 q = p + vec2(0.5, -0.5) * in_TexelSize.xy;" + " vec2 q = p + vec2(0.46875, -0.46875) * in_TexelSize.xy;" " q = in_TexelSize.xy" " * (1.0 + 2.0 * floor(q * 0.5 * in_TexelSize.zw));" " vec2 r = q - vec2(0.5, -0.5) * in_TexelSize.xy;" - " float l = (abs(q.x - 0.5) < 0.5 && abs(q.y - 0.5) < 0.5)" + " float l = (abs(q.x - .5) < .5 && abs(q.y - .5) < .5)" " ? 1.0 / mylen(r - p) : 0.0;" " return vec3(q * vec2(1.0, 0.25) + vec2(0.0, 0.50), l);" "}" "" - "vec3 nearest3(vec2 p) {" + "vec3 nearest3(vec2 p)" + "{" " p -= vec2(0.5, 0.5);" " p *= in_ZoomSettings[3][2];" " p += vec2(in_ZoomSettings[3][0], -in_ZoomSettings[3][1]);" " p += vec2(0.5, 0.5);" - " vec2 q = p + vec2(-0.5, 0.5) * in_TexelSize.xy;" + " vec2 q = p + vec2(-0.46875, 0.46875) * in_TexelSize.xy;" " q = in_TexelSize.xy" " * (1.0 + 2.0 * floor(q * 0.5 * in_TexelSize.zw));" " vec2 r = q - vec2(-0.5, 0.5) * in_TexelSize.xy;" - " float l = (abs(q.x - 0.5) < 0.5 && abs(q.y - 0.5) < 0.5)" + " float l = (abs(q.x - .5) < .5 && abs(q.y - .5) < .5)" " ? 1.0 / mylen(r - p) : 0.0;" " return vec3(q * vec2(1.0, 0.25) + vec2(0.0, 0.75), l);" "}" "" - "void main(void) {" + "void main(void)" + "{" #if defined HAVE_GLES_2X " vec2 coord = pass_TexCoord;" #else @@ -472,12 +492,12 @@ public: " vec4 p1 = texture2D(in_Texture, k1.xy);" " vec4 p2 = texture2D(in_Texture, k2.xy);" " vec4 p3 = texture2D(in_Texture, k3.xy);" -//"if (k0.z >= k1.z && k0.z >= k2.z && k0.z >= k3.z) gl_FragColor = p0;" -//"if (k1.z >= k0.z && k1.z >= k2.z && k1.z >= k3.z) gl_FragColor = p1;" -//"if (k2.z >= k0.z && k2.z >= k1.z && k2.z >= k3.z) gl_FragColor = p2;" -//"if (k3.z >= k0.z && k3.z >= k1.z && k3.z >= k2.z) gl_FragColor = p3;" - " gl_FragColor = 1.0 / (k0.z + k1.z + k2.z + k3.z)" - " * (k0.z * p0 + k1.z * p1 + k2.z * p2 + k3.z * p3);" +"if (k0.z >= k1.z && k0.z >= k2.z && k0.z >= k3.z) gl_FragColor = p0;" +"if (k1.z >= k0.z && k1.z >= k2.z && k1.z >= k3.z) gl_FragColor = p1;" +"if (k2.z >= k0.z && k2.z >= k1.z && k2.z >= k3.z) gl_FragColor = p2;" +"if (k3.z >= k0.z && k3.z >= k1.z && k3.z >= k2.z) gl_FragColor = p3;" +// " gl_FragColor = 1.0 / (k0.z + k1.z + k2.z + k3.z)" +// " * (k0.z * p0 + k1.z * p1 + k2.z * p2 + k3.z * p3);" "}" #else "void main(float4 in_Position : POSITION," @@ -489,7 +509,8 @@ public: " out_Position = in_Position;" "}", - "float3 nearest0(float2 p, float4 in_TexelSize) {" + "float3 nearest0(float2 p, float4 in_TexelSize)" + "{" " float2 q = p + 0.5 * in_TexelSize.xy;" " q -= fmod(q, 2.0 * in_TexelSize.xy);" " q += 0.5 * in_TexelSize.xy;" @@ -497,7 +518,8 @@ public: " length(q - p));" "}" "" - "float3 nearest1(float2 p, float4 in_TexelSize) {" + "float3 nearest1(float2 p, float4 in_TexelSize)" + "{" " float2 q = p - 0.5 * in_TexelSize.xy;" " q -= fmod(q, 2.0 * in_TexelSize.xy);" " q += 1.5 * in_TexelSize.xy;" @@ -505,7 +527,8 @@ public: " length(q - p));" "}" "" - "float3 nearest2(float2 p, float4 in_TexelSize) {" + "float3 nearest2(float2 p, float4 in_TexelSize)" + "{" " float2 q = p + float2(0.5, -0.5) * in_TexelSize.xy;" " q -= fmod(q, 2.0 * in_TexelSize.xy);" " q += float2(0.5, 1.5) * in_TexelSize.xy;" @@ -513,7 +536,8 @@ public: " length(q - p));" "}" "" - "float3 nearest3(float2 p, float4 in_TexelSize) {" + "float3 nearest3(float2 p, float4 in_TexelSize)" + "{" " float2 q = p + float2(-0.5, 0.5) * in_TexelSize.xy;" " q -= fmod(q, 2.0 * in_TexelSize.xy);" " q += float2(1.5, 0.5) * in_TexelSize.xy;"