| @@ -13,6 +13,7 @@ | |||||
| .auto | .auto | ||||
| .libs | .libs | ||||
| .deps | .deps | ||||
| .dirstamp | |||||
| Makefile | Makefile | ||||
| Makefile.in | Makefile.in | ||||
| aclocal.m4 | aclocal.m4 | ||||
| @@ -27,6 +27,8 @@ using namespace lol; | |||||
| # include <direct.h> | # include <direct.h> | ||||
| #endif | #endif | ||||
| extern char const *lolfx_02_cube; | |||||
| class Cube : public WorldEntity | class Cube : public WorldEntity | ||||
| { | { | ||||
| public: | public: | ||||
| @@ -81,41 +83,8 @@ public: | |||||
| if (!m_ready) | if (!m_ready) | ||||
| { | { | ||||
| m_shader = Shader::Create( | |||||
| #if !defined __CELLOS_LV2__ && !defined _XBOX && !defined USE_D3D9 | |||||
| "#version 120\n" | |||||
| "attribute vec3 in_Vertex;" | |||||
| "attribute vec3 in_Color;" | |||||
| "uniform mat4 in_Matrix;" | |||||
| "varying vec3 pass_Color;" | |||||
| "" | |||||
| "void main(void) {" | |||||
| " gl_Position = in_Matrix * vec4(in_Vertex, 1.0);" | |||||
| " pass_Color = in_Color;" | |||||
| "}", | |||||
| "#version 120\n" | |||||
| "varying vec3 pass_Color;" | |||||
| "" | |||||
| "void main(void) {" | |||||
| " gl_FragColor = vec4(pass_Color, 1.0);" | |||||
| "}" | |||||
| #else | |||||
| "void main(float3 in_Vertex : POSITION," | |||||
| " float3 in_Color : COLOR," | |||||
| " uniform float4x4 in_Matrix," | |||||
| " out float4 out_Position : POSITION," | |||||
| " out float3 pass_Color : COLOR) {" | |||||
| " pass_Color = in_Color;" | |||||
| " out_Position = mul(in_Matrix, float4(in_Vertex, 1.0));" | |||||
| "}", | |||||
| "void main(float3 pass_Color : COLOR," | |||||
| " out float4 out_FragColor : COLOR) {" | |||||
| " out_FragColor = float4(pass_Color, 1.0);" | |||||
| "}" | |||||
| #endif | |||||
| ); | |||||
| m_shader = Shader::Create(lolfx_02_cube); | |||||
| m_mvp = m_shader->GetUniformLocation("in_Matrix"); | m_mvp = m_shader->GetUniformLocation("in_Matrix"); | ||||
| m_coord = m_shader->GetAttribLocation("in_Vertex", | m_coord = m_shader->GetAttribLocation("in_Vertex", | ||||
| VertexUsage::Position, 0); | VertexUsage::Position, 0); | ||||
| @@ -0,0 +1,46 @@ | |||||
| -- GLSL.Vert -- | |||||
| #version 120\n | |||||
| attribute vec3 in_Vertex; | |||||
| attribute vec3 in_Color; | |||||
| uniform mat4 in_Matrix; | |||||
| varying vec3 pass_Color; | |||||
| void main(void) | |||||
| { | |||||
| gl_Position = in_Matrix * vec4(in_Vertex, 1.0); | |||||
| pass_Color = in_Color; | |||||
| } | |||||
| -- GLSL.Frag -- | |||||
| #version 120 | |||||
| varying vec3 pass_Color; | |||||
| void main(void) | |||||
| { | |||||
| gl_FragColor = vec4(pass_Color, 1.0); | |||||
| } | |||||
| -- HLSL.Vert -- | |||||
| void main(float3 in_Vertex : POSITION, | |||||
| float3 in_Color : COLOR, | |||||
| uniform float4x4 in_Matrix, | |||||
| out float4 out_Position : POSITION, | |||||
| out float3 pass_Color : COLOR) | |||||
| { | |||||
| pass_Color = in_Color; | |||||
| out_Position = mul(in_Matrix, float4(in_Vertex, 1.0)); | |||||
| } | |||||
| -- HLSL.Frag -- | |||||
| void main(float3 pass_Color : COLOR, | |||||
| out float4 out_FragColor : COLOR) | |||||
| { | |||||
| out_FragColor = float4(pass_Color, 1.0); | |||||
| } | |||||
| @@ -37,6 +37,8 @@ using namespace lol; | |||||
| # include <direct.h> | # include <direct.h> | ||||
| #endif | #endif | ||||
| extern char const *lolfx_03_fractal; | |||||
| #if defined USE_D3D9 | #if defined USE_D3D9 | ||||
| extern IDirect3DDevice9 *g_d3ddevice; | extern IDirect3DDevice9 *g_d3ddevice; | ||||
| #elif defined _XBOX | #elif defined _XBOX | ||||
| @@ -478,194 +480,8 @@ public: | |||||
| D3DPOOL_SYSTEMMEM, &m_tex, NULL); | D3DPOOL_SYSTEMMEM, &m_tex, NULL); | ||||
| #endif | #endif | ||||
| m_shader = Shader::Create( | |||||
| #if !defined __CELLOS_LV2__ && !defined _XBOX && !defined USE_D3D9 | |||||
| # if !defined HAVE_GLES_2X | |||||
| "#version 120\n" | |||||
| # else | |||||
| "precision highp float;" | |||||
| # endif | |||||
| "" | |||||
| "uniform mat4 u_ZoomSettings;" | |||||
| "uniform vec4 u_TexelSize;" | |||||
| "uniform vec4 u_ScreenSize;" | |||||
| "" | |||||
| "attribute vec2 a_TexCoord;" | |||||
| "attribute vec2 a_Vertex;" | |||||
| "" | |||||
| "varying vec4 v_CenterX, v_CenterY, v_IndexX, v_IndexY;" | |||||
| "" | |||||
| "void main(void)" | |||||
| "{" | |||||
| " gl_Position = vec4(a_Vertex, 0.0, 1.0);" | |||||
| /* 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. Then add or remove half the | |||||
| * size of a texel: the distance from this new point to | |||||
| * the final point will be our error. */ | |||||
| " vec4 offsets = vec4(0.5, -0.5, 0.015625, -0.015625);" | |||||
| " vec4 zoomscale = vec4(u_ZoomSettings[0][2]," | |||||
| " u_ZoomSettings[1][2]," | |||||
| " u_ZoomSettings[2][2]," | |||||
| " u_ZoomSettings[3][2]);" | |||||
| " vec4 zoomtx = vec4(u_ZoomSettings[0][0]," | |||||
| " u_ZoomSettings[1][0]," | |||||
| " u_ZoomSettings[2][0]," | |||||
| " u_ZoomSettings[3][0]);" | |||||
| " vec4 zoomty = vec4(u_ZoomSettings[0][1]," | |||||
| " u_ZoomSettings[1][1]," | |||||
| " u_ZoomSettings[2][1]," | |||||
| " u_ZoomSettings[3][1]);" | |||||
| " v_CenterX = zoomscale * a_TexCoord.x + zoomtx" | |||||
| " + offsets.xyxy * u_TexelSize.x;" | |||||
| " v_CenterY = zoomscale * a_TexCoord.y - zoomty" | |||||
| " + offsets.xyyx * u_TexelSize.y;" | |||||
| /* Precompute the multiple of one texel where our ideal | |||||
| * point lies. The fragment shader will call floor() on | |||||
| * this value. We add or remove a slight offset to avoid | |||||
| * rounding issues at the image's edges. */ | |||||
| " v_IndexX = v_CenterX * u_ScreenSize.z - offsets.zwzw;" | |||||
| " v_IndexY = v_CenterY * u_ScreenSize.w - offsets.zwwz;" | |||||
| "}", | |||||
| m_shader = Shader::Create(lolfx_03_fractal); | |||||
| # if !defined HAVE_GLES_2X | |||||
| "#version 120\n" | |||||
| # else | |||||
| "precision highp float;" | |||||
| # endif | |||||
| "" | |||||
| "uniform vec4 u_TexelSize;" | |||||
| "uniform sampler2D u_Texture;" | |||||
| "" | |||||
| "varying vec4 v_CenterX, v_CenterY, v_IndexX, v_IndexY;" | |||||
| "" | |||||
| "void main(void)" | |||||
| "{" | |||||
| " vec4 v05 = vec4(0.5, 0.5, 0.5, 0.5);" | |||||
| " vec4 rx, ry, t0, dx, dy, dd;" | |||||
| /* Get a pixel coordinate from each slice into rx & ry */ | |||||
| " rx = u_TexelSize.x + u_TexelSize.z * floor(v_IndexX);" | |||||
| " ry = u_TexelSize.y + u_TexelSize.w * floor(v_IndexY);" | |||||
| /* Compute inverse distance to expected pixel in dd, | |||||
| * and put zero if we fall outside the texture. */ | |||||
| " t0 = step(abs(rx - v05), v05) * step(abs(ry - v05), v05);" | |||||
| " dx = rx - v_CenterX;" | |||||
| " dy = ry - v_CenterY;" | |||||
| //" vec4 dd = t0 * (abs(dx) + abs(dy));" | |||||
| //" vec4 dd = t0 / (0.001 + sqrt((dx * dx) + (dy * dy)));" | |||||
| " dd = t0 / (0.000001 + (dx * dx) + (dy * dy));" | |||||
| /* Modify Y coordinate to select proper quarter. */ | |||||
| " ry = ry * 0.25 + vec4(0.0, 0.25, 0.5, 0.75);" | |||||
| "" | |||||
| # if 1 | |||||
| "\n#if 0\n" /* XXX: disabled until we can autodetect i915 */ | |||||
| /* t1.x <-- dd.x > dd.y */ | |||||
| /* t1.y <-- dd.z > dd.w */ | |||||
| " vec2 t1 = step(dd.xz, dd.yw);" | |||||
| /* ret.x <-- max(rx.x, rx.y) wrt. t1.x */ | |||||
| /* ret.y <-- max(rx.z, rx.w) wrt. t1.y */ | |||||
| /* ret.z <-- max(ry.x, ry.y) wrt. t1.x */ | |||||
| /* ret.w <-- max(ry.z, ry.w) wrt. t1.y */ | |||||
| " vec4 ret = mix(vec4(rx.xz, ry.xz)," | |||||
| " vec4(rx.yw, ry.yw), t1.xyxy);" | |||||
| /* dd.x <-- max(dd.x, dd.y) */ | |||||
| /* dd.z <-- max(dd.z, dd.w) */ | |||||
| " dd.xy = mix(dd.xz, dd.yw, t1);" | |||||
| /* t2 <-- dd.x > dd.z */ | |||||
| " float t2 = step(dd.x, dd.y);" | |||||
| /* ret.x <-- max(ret.x, ret.y); */ | |||||
| /* ret.y <-- max(ret.z, ret.w); */ | |||||
| " ret.xy = mix(ret.xz, ret.yw, t2);" | |||||
| "\n#else\n" | |||||
| /* Fallback for i915 cards -- the trick to reduce the | |||||
| * number of operations is to compute both step(a,b) | |||||
| * and step(b,a) and hope that their sum is 1. This is | |||||
| * almost always the case, and when it isn't we can | |||||
| * afford to have a few wrong pixels. However, a real | |||||
| * problem is when panning the image, because half the | |||||
| * screen is likely to flicker. To avoid this problem, | |||||
| * we cheat a little (see m_translate comment above). */ | |||||
| " vec4 t1 = step(dd.xzyw, dd.ywxz);" | |||||
| " vec4 ret = vec4(rx.xz, ry.xz) * t1.zwzw" | |||||
| " + vec4(rx.yw, ry.yw) * t1.xyxy;" | |||||
| " dd.xy = dd.xz * t1.zw + dd.yw * t1.xy;" | |||||
| " vec2 t2 = step(dd.xy, dd.yx);" | |||||
| " ret.xy = ret.xz * t2.yy + ret.yw * t2.xx;" | |||||
| "\n#endif\n" | |||||
| /* Nearest neighbour */ | |||||
| " gl_FragColor = texture2D(u_Texture, ret.xy);" | |||||
| # else | |||||
| /* Alternate version: some kind of linear interpolation */ | |||||
| " vec4 p0 = texture2D(u_Texture, vec2(rx.x, ry.x));" | |||||
| " vec4 p1 = texture2D(u_Texture, vec2(rx.y, ry.y));" | |||||
| " vec4 p2 = texture2D(u_Texture, vec2(rx.z, ry.z));" | |||||
| " vec4 p3 = texture2D(u_Texture, vec2(rx.w, ry.w));" | |||||
| " gl_FragColor = 1.0 / (dd.x + dd.y + dd.z + dd.w)" | |||||
| " * (dd.x * p0 + dd.y * p1 + dd.z * p2 + dd.w * p3);" | |||||
| # endif | |||||
| "}" | |||||
| #else | |||||
| "void main(float2 a_Vertex : POSITION," | |||||
| " float2 a_TexCoord : TEXCOORD0," | |||||
| " uniform float4x4 u_ZoomSettings," | |||||
| " uniform float4 u_TexelSize," | |||||
| " uniform float4 u_ScreenSize," | |||||
| " out float4 out_Position : POSITION0," | |||||
| " out float4 v_CenterX : TEXCOORD0," | |||||
| " out float4 v_CenterY : TEXCOORD1," | |||||
| " out float4 v_IndexX : TEXCOORD2," | |||||
| " out float4 v_IndexY : TEXCOORD3)" | |||||
| "{" | |||||
| " out_Position = float4(a_Vertex, 0.0, 1.0);" | |||||
| " float4 offsets = float4(0.5, -0.5, 0.015625, -0.015625);" | |||||
| " float4 zoomscale = float4(u_ZoomSettings[2][0]," | |||||
| " u_ZoomSettings[2][1]," | |||||
| " u_ZoomSettings[2][2]," | |||||
| " u_ZoomSettings[2][3]);" | |||||
| " float4 zoomtx = float4(u_ZoomSettings[0][0]," | |||||
| " u_ZoomSettings[0][1]," | |||||
| " u_ZoomSettings[0][2]," | |||||
| " u_ZoomSettings[0][3]);" | |||||
| " float4 zoomty = float4(u_ZoomSettings[1][0]," | |||||
| " u_ZoomSettings[1][1]," | |||||
| " u_ZoomSettings[1][2]," | |||||
| " u_ZoomSettings[1][3]);" | |||||
| " v_CenterX = zoomscale * a_TexCoord.x + zoomtx" | |||||
| " + offsets.xyxy * u_TexelSize.x;" | |||||
| " v_CenterY = zoomscale * a_TexCoord.y - zoomty" | |||||
| " + offsets.xyyx * u_TexelSize.y;" | |||||
| " v_IndexX = v_CenterX * u_ScreenSize.z - offsets.zwzw;" | |||||
| " v_IndexY = v_CenterY * u_ScreenSize.w - offsets.zwwz;" | |||||
| "}", | |||||
| "void main(in float4 v_CenterX : TEXCOORD0," | |||||
| " in float4 v_CenterY : TEXCOORD1," | |||||
| " in float4 v_IndexX : TEXCOORD2," | |||||
| " in float4 v_IndexY : TEXCOORD3," | |||||
| " uniform float4 u_TexelSize," | |||||
| " uniform sampler2D u_Texture," | |||||
| " out float4 out_FragColor : COLOR)" | |||||
| "{" | |||||
| " float4 v05 = float4(0.5, 0.5, 0.5, 0.5);" | |||||
| " float4 rx, ry, t0, dx, dy, dd;" | |||||
| " rx = u_TexelSize.x + u_TexelSize.z * floor(v_IndexX);" | |||||
| " ry = u_TexelSize.y + u_TexelSize.w * floor(v_IndexY);" | |||||
| " t0 = step(abs(rx - v05), v05) * step(abs(ry - v05), v05);" | |||||
| " dx = rx - v_CenterX;" | |||||
| " dy = ry - v_CenterY;" | |||||
| " dd = t0 / (0.000001 + (dx * dx) + (dy * dy));" | |||||
| " ry = ry * 0.25 + float4(0.0, 0.25, 0.5, 0.75);" | |||||
| " float2 t1 = step(dd.xz, dd.yw);" | |||||
| " float4 ret = lerp(float4(rx.xz, ry.xz)," | |||||
| " float4(rx.yw, ry.yw), t1.xyxy);" | |||||
| " dd.xy = lerp(dd.xz, dd.yw, t1);" | |||||
| " float t2 = step(dd.x, dd.y);" | |||||
| " ret.xy = lerp(ret.xz, ret.yw, t2);" | |||||
| " out_FragColor = tex2D(u_Texture, ret.xy);" | |||||
| "}" | |||||
| #endif | |||||
| ); | |||||
| m_vertexattrib = m_shader->GetAttribLocation("a_Vertex", VertexUsage::Position, 0); | m_vertexattrib = m_shader->GetAttribLocation("a_Vertex", VertexUsage::Position, 0); | ||||
| m_texattrib = m_shader->GetAttribLocation("a_TexCoord", VertexUsage::TexCoord, 0); | m_texattrib = m_shader->GetAttribLocation("a_TexCoord", VertexUsage::TexCoord, 0); | ||||
| m_texeluni = m_shader->GetUniformLocation("u_TexelSize"); | m_texeluni = m_shader->GetUniformLocation("u_TexelSize"); | ||||
| @@ -0,0 +1,196 @@ | |||||
| -- GLSL.Vert -- | |||||
| #version 120 | |||||
| #if defined HAVE_GLES_2X | |||||
| precision highp float; | |||||
| #endif | |||||
| uniform mat4 u_ZoomSettings; | |||||
| uniform vec4 u_TexelSize; | |||||
| uniform vec4 u_ScreenSize; | |||||
| attribute vec2 a_TexCoord; | |||||
| attribute vec2 a_Vertex; | |||||
| varying vec4 v_CenterX, v_CenterY, v_IndexX, v_IndexY; | |||||
| void main(void) | |||||
| { | |||||
| gl_Position = vec4(a_Vertex, 0.0, 1.0); | |||||
| /* 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. Then add or remove half the | |||||
| * size of a texel: the distance from this new point to | |||||
| * the final point will be our error. */ | |||||
| vec4 offsets = vec4(0.5, -0.5, 0.015625, -0.015625); | |||||
| vec4 zoomscale = vec4(u_ZoomSettings[0][2], | |||||
| u_ZoomSettings[1][2], | |||||
| u_ZoomSettings[2][2], | |||||
| u_ZoomSettings[3][2]); | |||||
| vec4 zoomtx = vec4(u_ZoomSettings[0][0], | |||||
| u_ZoomSettings[1][0], | |||||
| u_ZoomSettings[2][0], | |||||
| u_ZoomSettings[3][0]); | |||||
| vec4 zoomty = vec4(u_ZoomSettings[0][1], | |||||
| u_ZoomSettings[1][1], | |||||
| u_ZoomSettings[2][1], | |||||
| u_ZoomSettings[3][1]); | |||||
| v_CenterX = zoomscale * a_TexCoord.x + zoomtx | |||||
| + offsets.xyxy * u_TexelSize.x; | |||||
| v_CenterY = zoomscale * a_TexCoord.y - zoomty | |||||
| + offsets.xyyx * u_TexelSize.y; | |||||
| /* Precompute the multiple of one texel where our ideal | |||||
| * point lies. The fragment shader will call floor() on | |||||
| * this value. We add or remove a slight offset to avoid | |||||
| * rounding issues at the image's edges. */ | |||||
| v_IndexX = v_CenterX * u_ScreenSize.z - offsets.zwzw; | |||||
| v_IndexY = v_CenterY * u_ScreenSize.w - offsets.zwwz; | |||||
| } | |||||
| -- GLSL.Frag -- | |||||
| #version 120 | |||||
| #if defined HAVE_GLES_2X | |||||
| precision highp float; | |||||
| #endif | |||||
| uniform vec4 u_TexelSize; | |||||
| uniform sampler2D u_Texture; | |||||
| varying vec4 v_CenterX, v_CenterY, v_IndexX, v_IndexY; | |||||
| void main(void) | |||||
| { | |||||
| vec4 v05 = vec4(0.5, 0.5, 0.5, 0.5); | |||||
| vec4 rx, ry, t0, dx, dy, dd; | |||||
| /* Get a pixel coordinate from each slice into rx & ry */ | |||||
| rx = u_TexelSize.x + u_TexelSize.z * floor(v_IndexX); | |||||
| ry = u_TexelSize.y + u_TexelSize.w * floor(v_IndexY); | |||||
| /* Compute inverse distance to expected pixel in dd, | |||||
| * and put zero if we fall outside the texture. */ | |||||
| t0 = step(abs(rx - v05), v05) * step(abs(ry - v05), v05); | |||||
| dx = rx - v_CenterX; | |||||
| dy = ry - v_CenterY; | |||||
| #if 0 | |||||
| vec4 dd = t0 * (abs(dx) + abs(dy)); | |||||
| vec4 dd = t0 / (0.001 + sqrt((dx * dx) + (dy * dy))); | |||||
| #endif | |||||
| dd = t0 / (0.000001 + (dx * dx) + (dy * dy)); | |||||
| /* Modify Y coordinate to select proper quarter. */ | |||||
| ry = ry * 0.25 + vec4(0.0, 0.25, 0.5, 0.75); | |||||
| #if 1 | |||||
| # if 0 | |||||
| /* XXX: disabled until we can autodetect i915 */ | |||||
| /* t1.x <-- dd.x > dd.y */ | |||||
| /* t1.y <-- dd.z > dd.w */ | |||||
| vec2 t1 = step(dd.xz, dd.yw); | |||||
| /* ret.x <-- max(rx.x, rx.y) wrt. t1.x */ | |||||
| /* ret.y <-- max(rx.z, rx.w) wrt. t1.y */ | |||||
| /* ret.z <-- max(ry.x, ry.y) wrt. t1.x */ | |||||
| /* ret.w <-- max(ry.z, ry.w) wrt. t1.y */ | |||||
| vec4 ret = mix(vec4(rx.xz, ry.xz), | |||||
| vec4(rx.yw, ry.yw), t1.xyxy); | |||||
| /* dd.x <-- max(dd.x, dd.y) */ | |||||
| /* dd.z <-- max(dd.z, dd.w) */ | |||||
| dd.xy = mix(dd.xz, dd.yw, t1); | |||||
| /* t2 <-- dd.x > dd.z */ | |||||
| float t2 = step(dd.x, dd.y); | |||||
| /* ret.x <-- max(ret.x, ret.y); */ | |||||
| /* ret.y <-- max(ret.z, ret.w); */ | |||||
| ret.xy = mix(ret.xz, ret.yw, t2); | |||||
| # else | |||||
| /* Fallback for i915 cards -- the trick to reduce the | |||||
| * number of operations is to compute both step(a,b) | |||||
| * and step(b,a) and hope that their sum is 1. This is | |||||
| * almost always the case, and when it isn't we can | |||||
| * afford to have a few wrong pixels. However, a real | |||||
| * problem is when panning the image, because half the | |||||
| * screen is likely to flicker. To avoid this problem, | |||||
| * we cheat a little (see m_translate comment above). */ | |||||
| vec4 t1 = step(dd.xzyw, dd.ywxz); | |||||
| vec4 ret = vec4(rx.xz, ry.xz) * t1.zwzw | |||||
| + vec4(rx.yw, ry.yw) * t1.xyxy; | |||||
| dd.xy = dd.xz * t1.zw + dd.yw * t1.xy; | |||||
| vec2 t2 = step(dd.xy, dd.yx); | |||||
| ret.xy = ret.xz * t2.yy + ret.yw * t2.xx; | |||||
| # endif | |||||
| /* Nearest neighbour */ | |||||
| gl_FragColor = texture2D(u_Texture, ret.xy); | |||||
| #else | |||||
| /* Alternate version: some kind of linear interpolation */ | |||||
| vec4 p0 = texture2D(u_Texture, vec2(rx.x, ry.x)); | |||||
| vec4 p1 = texture2D(u_Texture, vec2(rx.y, ry.y)); | |||||
| vec4 p2 = texture2D(u_Texture, vec2(rx.z, ry.z)); | |||||
| vec4 p3 = texture2D(u_Texture, vec2(rx.w, ry.w)); | |||||
| gl_FragColor = 1.0 / (dd.x + dd.y + dd.z + dd.w) | |||||
| * (dd.x * p0 + dd.y * p1 + dd.z * p2 + dd.w * p3); | |||||
| #endif | |||||
| } | |||||
| -- HLSL.Vert -- | |||||
| void main(float2 a_Vertex : POSITION, | |||||
| float2 a_TexCoord : TEXCOORD0, | |||||
| uniform float4x4 u_ZoomSettings, | |||||
| uniform float4 u_TexelSize, | |||||
| uniform float4 u_ScreenSize, | |||||
| out float4 out_Position : POSITION0, | |||||
| out float4 v_CenterX : TEXCOORD0, | |||||
| out float4 v_CenterY : TEXCOORD1, | |||||
| out float4 v_IndexX : TEXCOORD2, | |||||
| out float4 v_IndexY : TEXCOORD3) | |||||
| { | |||||
| out_Position = float4(a_Vertex, 0.0, 1.0); | |||||
| float4 offsets = float4(0.5, -0.5, 0.015625, -0.015625); | |||||
| float4 zoomscale = float4(u_ZoomSettings[2][0], | |||||
| u_ZoomSettings[2][1], | |||||
| u_ZoomSettings[2][2], | |||||
| u_ZoomSettings[2][3]); | |||||
| float4 zoomtx = float4(u_ZoomSettings[0][0], | |||||
| u_ZoomSettings[0][1], | |||||
| u_ZoomSettings[0][2], | |||||
| u_ZoomSettings[0][3]); | |||||
| float4 zoomty = float4(u_ZoomSettings[1][0], | |||||
| u_ZoomSettings[1][1], | |||||
| u_ZoomSettings[1][2], | |||||
| u_ZoomSettings[1][3]); | |||||
| v_CenterX = zoomscale * a_TexCoord.x + zoomtx | |||||
| + offsets.xyxy * u_TexelSize.x; | |||||
| v_CenterY = zoomscale * a_TexCoord.y - zoomty | |||||
| + offsets.xyyx * u_TexelSize.y; | |||||
| v_IndexX = v_CenterX * u_ScreenSize.z - offsets.zwzw; | |||||
| v_IndexY = v_CenterY * u_ScreenSize.w - offsets.zwwz; | |||||
| } | |||||
| -- HLSL.Frag -- | |||||
| void main(in float4 v_CenterX : TEXCOORD0, | |||||
| in float4 v_CenterY : TEXCOORD1, | |||||
| in float4 v_IndexX : TEXCOORD2, | |||||
| in float4 v_IndexY : TEXCOORD3, | |||||
| uniform float4 u_TexelSize, | |||||
| uniform sampler2D u_Texture, | |||||
| out float4 out_FragColor : COLOR) | |||||
| { | |||||
| float4 v05 = float4(0.5, 0.5, 0.5, 0.5); | |||||
| float4 rx, ry, t0, dx, dy, dd; | |||||
| rx = u_TexelSize.x + u_TexelSize.z * floor(v_IndexX); | |||||
| ry = u_TexelSize.y + u_TexelSize.w * floor(v_IndexY); | |||||
| t0 = step(abs(rx - v05), v05) * step(abs(ry - v05), v05); | |||||
| dx = rx - v_CenterX; | |||||
| dy = ry - v_CenterY; | |||||
| dd = t0 / (0.000001 + (dx * dx) + (dy * dy)); | |||||
| ry = ry * 0.25 + float4(0.0, 0.25, 0.5, 0.75); | |||||
| float2 t1 = step(dd.xz, dd.yw); | |||||
| float4 ret = lerp(float4(rx.xz, ry.xz), | |||||
| float4(rx.yw, ry.yw), t1.xyxy); | |||||
| dd.xy = lerp(dd.xz, dd.yw, t1); | |||||
| float t2 = step(dd.x, dd.y); | |||||
| ret.xy = lerp(ret.xz, ret.yw, t2); | |||||
| out_FragColor = tex2D(u_Texture, ret.xy); | |||||
| } | |||||
| @@ -27,11 +27,13 @@ nodist_01_triangle_SOURCES = 01_triangle.lolfx.cpp | |||||
| 01_triangle_DEPENDENCIES = $(top_builddir)/src/liblol.a | 01_triangle_DEPENDENCIES = $(top_builddir)/src/liblol.a | ||||
| 02_cube_SOURCES = 02_cube.cpp | 02_cube_SOURCES = 02_cube.cpp | ||||
| nodist_02_cube_SOURCES = 02_cube.lolfx.cpp | |||||
| 02_cube_CPPFLAGS = @LOL_CFLAGS@ @PIPI_CFLAGS@ | 02_cube_CPPFLAGS = @LOL_CFLAGS@ @PIPI_CFLAGS@ | ||||
| 02_cube_LDFLAGS = $(top_builddir)/src/liblol.a @LOL_LIBS@ @PIPI_LIBS@ | 02_cube_LDFLAGS = $(top_builddir)/src/liblol.a @LOL_LIBS@ @PIPI_LIBS@ | ||||
| 02_cube_DEPENDENCIES = $(top_builddir)/src/liblol.a | 02_cube_DEPENDENCIES = $(top_builddir)/src/liblol.a | ||||
| 03_fractal_SOURCES = 03_fractal.cpp | 03_fractal_SOURCES = 03_fractal.cpp | ||||
| nodist_03_fractal_SOURCES = 03_fractal.lolfx.cpp | |||||
| 03_fractal_CPPFLAGS = @LOL_CFLAGS@ @PIPI_CFLAGS@ | 03_fractal_CPPFLAGS = @LOL_CFLAGS@ @PIPI_CFLAGS@ | ||||
| 03_fractal_LDFLAGS = $(top_builddir)/src/liblol.a @LOL_LIBS@ @PIPI_LIBS@ | 03_fractal_LDFLAGS = $(top_builddir)/src/liblol.a @LOL_LIBS@ @PIPI_LIBS@ | ||||
| 03_fractal_DEPENDENCIES = $(top_builddir)/src/liblol.a | 03_fractal_DEPENDENCIES = $(top_builddir)/src/liblol.a | ||||
| @@ -29,6 +29,9 @@ | |||||
| <ItemGroup> | <ItemGroup> | ||||
| <ClCompile Include="..\test\tutorial\02_cube.cpp" /> | <ClCompile Include="..\test\tutorial\02_cube.cpp" /> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | |||||
| <LolFxCompile Include="..\test\tutorial\02_cube.lolfx" /> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | <ItemGroup> | ||||
| <ProjectReference Include="lolcore.vcxproj"> | <ProjectReference Include="lolcore.vcxproj"> | ||||
| <Project>{9e62f2fe-3408-4eae-8238-fd84238ceeda}</Project> | <Project>{9e62f2fe-3408-4eae-8238-fd84238ceeda}</Project> | ||||
| @@ -29,6 +29,9 @@ | |||||
| <ItemGroup> | <ItemGroup> | ||||
| <ClCompile Include="..\test\tutorial\03_fractal.cpp" /> | <ClCompile Include="..\test\tutorial\03_fractal.cpp" /> | ||||
| </ItemGroup> | </ItemGroup> | ||||
| <ItemGroup> | |||||
| <LolFxCompile Include="..\test\tutorial\03_fractal.lolfx" /> | |||||
| </ItemGroup> | |||||
| <ItemGroup> | <ItemGroup> | ||||
| <ProjectReference Include="lolcore.vcxproj"> | <ProjectReference Include="lolcore.vcxproj"> | ||||
| <Project>{9e62f2fe-3408-4eae-8238-fd84238ceeda}</Project> | <Project>{9e62f2fe-3408-4eae-8238-fd84238ceeda}</Project> | ||||