@@ -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> | ||||