#version 320 es #define FORCE_EARLY_Z layout(early_fragment_tests) in #define ATTRIBUTE_LOCATION(x) #define FRAGMENT_OUTPUT_LOCATION(x) #define FRAGMENT_OUTPUT_LOCATION_INDEXED(x, y) #define UBO_BINDING(packing, x) layout(packing, binding = x) #define SAMPLER_BINDING(x) layout(binding = x) #define SSBO_BINDING(x) layout(binding = x) #define VARYING_LOCATION(x) #extension GL_ANDROID_extension_pack_es31a : enable #extension GL_ARM_shader_framebuffer_fetch: enable #define FB_FETCH_VALUE gl_LastFragColorARM #define FRAGMENT_INOUT out precision highp float; precision highp int; precision highp sampler2DArray; precision highp usamplerBuffer; precision highp sampler2DMS; precision highp image2DArray; #define float2 vec2 #define float3 vec3 #define float4 vec4 #define uint2 uvec2 #define uint3 uvec3 #define uint4 uvec4 #define int2 ivec2 #define int3 ivec3 #define int4 ivec4 #define frac fract #define lerp mix struct Light { int4 color; float4 cosatt; float4 distatt; float4 pos; float4 dir; }; UBO_BINDING(std140, 2) uniform VSBlock { uint components; uint xfmem_dualTexInfo; uint xfmem_numColorChans; float4 cpnmtx[6]; float4 cproj[4]; int4 cmtrl[4]; Light clights[8]; float4 ctexmtx[24]; float4 ctrmtx[64]; float4 cnmtx[32]; float4 cpostmtx[64]; float4 cpixelcenter; float2 cviewport; uint4 xfmem_pack1[8]; #define xfmem_texMtxInfo(i) (xfmem_pack1[(i)].x) #define xfmem_postMtxInfo(i) (xfmem_pack1[(i)].y) #define xfmem_color(i) (xfmem_pack1[(i)].z) #define xfmem_alpha(i) (xfmem_pack1[(i)].w) }; struct VS_OUTPUT { float4 pos; float4 colors_0; float4 colors_1; float3 tex0; float3 tex1; float4 clipPos; float clipDist0; float clipDist1; }; ATTRIBUTE_LOCATION(0) in float4 rawpos; ATTRIBUTE_LOCATION(2) in float3 rawnorm0; ATTRIBUTE_LOCATION(5) in float4 rawcolor0; ATTRIBUTE_LOCATION(8) in float2 rawtex0; VARYING_LOCATION(0) out VertexData { float4 pos; float4 colors_0; float4 colors_1; float3 tex0; float3 tex1; float4 clipPos; float clipDist0; float clipDist1; } vs; void main() { VS_OUTPUT o; float4 pos = float4(dot(cpnmtx[0], rawpos), dot(cpnmtx[1], rawpos), dot(cpnmtx[2], rawpos), 1.0); float3 _norm0 = normalize(float3(dot(cpnmtx[3].xyz, rawnorm0), dot(cpnmtx[4].xyz, rawnorm0), dot(cpnmtx[5].xyz, rawnorm0))); o.pos = float4(dot(cproj[0], pos), dot(cproj[1], pos), dot(cproj[2], pos), dot(cproj[3], pos)); int4 lacc; float3 ldir, h, cosAttn, distAttn; float dist, dist2, attn; { int4 mat = cmtrl[2]; lacc = cmtrl[0]; lacc.w = 255; ldir = clights[0].pos.xyz - pos.xyz; dist2 = dot(ldir, ldir); dist = sqrt(dist2); ldir = ldir / dist; attn = max(0.0, dot(ldir, clights[0].dir.xyz)); attn = max(0.0, clights[0].cosatt.x + clights[0].cosatt.y*attn + clights[0].cosatt.z*attn*attn) / dot(clights[0].distatt.xyz, float3(1.0,dist,dist2)); lacc.rgb += int3(round(attn * max(0.0,dot(ldir, _norm0)) * float3(clights[0].color.rgb))); ldir = clights[1].pos.xyz - pos.xyz; dist2 = dot(ldir, ldir); dist = sqrt(dist2); ldir = ldir / dist; attn = max(0.0, dot(ldir, clights[1].dir.xyz)); attn = max(0.0, clights[1].cosatt.x + clights[1].cosatt.y*attn + clights[1].cosatt.z*attn*attn) / dot(clights[1].distatt.xyz, float3(1.0,dist,dist2)); lacc.rgb += int3(round(attn * max(0.0,dot(ldir, _norm0)) * float3(clights[1].color.rgb))); ldir = clights[2].pos.xyz - pos.xyz; dist2 = dot(ldir, ldir); dist = sqrt(dist2); ldir = ldir / dist; attn = max(0.0, dot(ldir, clights[2].dir.xyz)); attn = max(0.0, clights[2].cosatt.x + clights[2].cosatt.y*attn + clights[2].cosatt.z*attn*attn) / dot(clights[2].distatt.xyz, float3(1.0,dist,dist2)); lacc.rgb += int3(round(attn * max(0.0,dot(ldir, _norm0)) * float3(clights[2].color.rgb))); lacc = clamp(lacc, 0, 255); o.colors_0 = float4((mat * (lacc + (lacc >> 7))) >> 8) / 255.0; } { int4 mat = cmtrl[3]; lacc = int4(255, 255, 255, 255); mat.w = int(round(rawcolor0.w * 255.0)); lacc.w = 255; lacc = clamp(lacc, 0, 255); o.colors_1 = float4((mat * (lacc + (lacc >> 7))) >> 8) / 255.0; } float4 coord = float4(0.0, 0.0, 1.0, 1.0); { coord = float4(0.0, 0.0, 1.0, 1.0); coord = float4(rawtex0.x, rawtex0.y, 1.0, 1.0); coord.z = 1.0; o.tex0.xyz = float3(dot(coord, ctexmtx[0]), dot(coord, ctexmtx[1]), 1); float4 P0 = cpostmtx[61]; float4 P1 = cpostmtx[62]; float4 P2 = cpostmtx[63]; o.tex0.xyz = float3(dot(P0.xyz, o.tex0.xyz) + P0.w, dot(P1.xyz, o.tex0.xyz) + P1.w, dot(P2.xyz, o.tex0.xyz) + P2.w); if(o.tex0.z == 0.0f) o.tex0.xy = clamp(o.tex0.xy / 2.0f, float2(-1.0f,-1.0f), float2(1.0f,1.0f)); } { coord = float4(0.0, 0.0, 1.0, 1.0); coord.xyz = rawnorm0.xyz; o.tex1.xyz = float3(dot(coord, ctexmtx[3]), dot(coord, ctexmtx[4]), dot(coord, ctexmtx[5])); float4 P0 = cpostmtx[61]; float4 P1 = cpostmtx[62]; float4 P2 = cpostmtx[63]; o.tex1.xyz = float3(dot(P0.xyz, o.tex1.xyz) + P0.w, dot(P1.xyz, o.tex1.xyz) + P1.w, dot(P2.xyz, o.tex1.xyz) + P2.w); if(o.tex1.z == 0.0f) o.tex1.xy = clamp(o.tex1.xy / 2.0f, float2(-1.0f,-1.0f), float2(1.0f,1.0f)); } o.colors_1 = o.colors_0; o.clipPos = o.pos; o.pos.z = o.pos.w * cpixelcenter.w - o.pos.z * cpixelcenter.z; o.pos.z = o.pos.z * 2.0 - o.pos.w; o.pos.xy *= sign(cpixelcenter.xy * float2(1.0, -1.0)); o.pos.xy = o.pos.xy - o.pos.w * cpixelcenter.xy; vs.pos = o.pos; vs.colors_0 = o.colors_0; vs.colors_1 = o.colors_1; vs.tex0 = o.tex0; vs.tex1 = o.tex1; vs.clipPos = o.clipPos; vs.clipDist0 = o.clipDist0; vs.clipDist1 = o.clipDist1; gl_Position = o.pos; } #version 320 es #define FORCE_EARLY_Z layout(early_fragment_tests) in #define ATTRIBUTE_LOCATION(x) #define FRAGMENT_OUTPUT_LOCATION(x) #define FRAGMENT_OUTPUT_LOCATION_INDEXED(x, y) #define UBO_BINDING(packing, x) layout(packing, binding = x) #define SAMPLER_BINDING(x) layout(binding = x) #define SSBO_BINDING(x) layout(binding = x) #define VARYING_LOCATION(x) #extension GL_ANDROID_extension_pack_es31a : enable #extension GL_ARM_shader_framebuffer_fetch: enable #define FB_FETCH_VALUE gl_LastFragColorARM #define FRAGMENT_INOUT out precision highp float; precision highp int; precision highp sampler2DArray; precision highp usamplerBuffer; precision highp sampler2DMS; precision highp image2DArray; #define float2 vec2 #define float3 vec3 #define float4 vec4 #define uint2 uvec2 #define uint3 uvec3 #define uint4 uvec4 #define int2 ivec2 #define int3 ivec3 #define int4 ivec4 #define frac fract #define lerp mix //Pixel Shader for TEV stages //4 TEV stages, 2 texgens, 0 IND stages int idot(int3 x, int3 y) { int3 tmp = x * y; return tmp.x + tmp.y + tmp.z; } int idot(int4 x, int4 y) { int4 tmp = x * y; return tmp.x + tmp.y + tmp.z + tmp.w; } int iround(float x) { return int (round(x)); } int2 iround(float2 x) { return int2(round(x)); } int3 iround(float3 x) { return int3(round(x)); } int4 iround(float4 x) { return int4(round(x)); } SAMPLER_BINDING(0) uniform sampler2DArray samp[8]; UBO_BINDING(std140, 1) uniform PSBlock { int4 color[4]; int4 k[4]; int4 alphaRef; float4 texdim[8]; int4 czbias[2]; int4 cindscale[2]; int4 cindmtx[6]; int4 cfogcolor; int4 cfogi; float4 cfogf[2]; float4 czslope; float2 cefbscale; uint bpmem_genmode; uint bpmem_alphaTest; uint bpmem_fogParam3; uint bpmem_fogRangeBase; uint bpmem_dstalpha; uint bpmem_ztex_op; bool bpmem_late_ztest; bool bpmem_rgba6_format; bool bpmem_dither; bool bpmem_bounding_box; uint4 bpmem_pack1[16]; uint4 bpmem_pack2[8]; int4 konstLookup[32]; bool blend_enable; uint blend_src_factor; uint blend_src_factor_alpha; uint blend_dst_factor; uint blend_dst_factor_alpha; bool blend_subtract; bool blend_subtract_alpha; }; #define bpmem_combiners(i) (bpmem_pack1[(i)].xy) #define bpmem_tevind(i) (bpmem_pack1[(i)].z) #define bpmem_iref(i) (bpmem_pack1[(i)].w) #define bpmem_tevorder(i) (bpmem_pack2[(i)].x) #define bpmem_tevksel(i) (bpmem_pack2[(i)].y) struct VS_OUTPUT { float4 pos; float4 colors_0; float4 colors_1; float3 tex0; float3 tex1; float4 clipPos; float clipDist0; float clipDist1; }; FRAGMENT_OUTPUT_LOCATION_INDEXED(0, 0) FRAGMENT_INOUT vec4 real_ocol0; VARYING_LOCATION(0) in VertexData { float4 pos; float4 colors_0; float4 colors_1; float3 tex0; float3 tex1; float4 clipPos; float clipDist0; float clipDist1; }; void main() { float4 rawpos = gl_FragCoord; float4 initial_ocol0 = FB_FETCH_VALUE; float4 ocol0; float4 ocol1; int4 c0 = color[1], c1 = color[2], c2 = color[3], prev = color[0]; int4 rastemp = int4(0, 0, 0, 0), textemp = int4(0, 0, 0, 0), konsttemp = int4(0, 0, 0, 0); int3 comp16 = int3(1, 256, 0), comp24 = int3(1, 256, 256*256); int alphabump=0; int3 tevcoord=int3(0, 0, 0); int2 wrappedcoord=int2(0,0), tempcoord=int2(0,0); int4 tevin_a=int4(0,0,0,0),tevin_b=int4(0,0,0,0),tevin_c=int4(0,0,0,0),tevin_d=int4(0,0,0,0); float4 col0 = colors_0; float4 col1 = colors_1; int2 fixpoint_uv0 = int2((tex0.z == 0.0 ? tex0.xy : tex0.xy / tex0.z) * texdim[0].zw); int2 fixpoint_uv1 = int2((tex1.z == 0.0 ? tex1.xy : tex1.xy / tex1.z) * texdim[1].zw); // TEV stage 0 rastemp = iround(col0 * 255.0).rgba; tevcoord.xy = fixpoint_uv0; textemp = iround(255.0 * texture(samp[0], float3(float2(tevcoord.xy).xy * texdim[0].xy, 0.0))).rgba; tevin_a = int4(int3(0,0,0), 0)&int4(255, 255, 255, 255); tevin_b = int4(textemp.rgb, 0)&int4(255, 255, 255, 255); tevin_c = int4(rastemp.rgb, 0)&int4(255, 255, 255, 255); tevin_d = int4(int3(0,0,0), rastemp.a); // color combine prev.rgb = clamp((((tevin_d.rgb)) + (((((tevin_a.rgb<<8) + (tevin_b.rgb-tevin_a.rgb)*(tevin_c.rgb+(tevin_c.rgb>>7)))) + 128)>>8)), int3(0,0,0), int3(255,255,255)); // alpha combine prev.a = clamp((((tevin_d.a)) + (((((tevin_a.a<<8) + (tevin_b.a-tevin_a.a)*(tevin_c.a+(tevin_c.a>>7)))))>>8)), 0, 255); // TEV stage 1 rastemp = iround(col0 * 255.0).rgba; tevcoord.xy = fixpoint_uv1; textemp = iround(255.0 * texture(samp[1], float3(float2(tevcoord.xy).xy * texdim[1].xy, 0.0))).rgba; tevin_a = int4(int3(0,0,0), 0)&int4(255, 255, 255, 255); tevin_b = int4(textemp.rgb, 0)&int4(255, 255, 255, 255); tevin_c = int4(rastemp.rgb, 0)&int4(255, 255, 255, 255); tevin_d = int4(int3(0,0,0), prev.a); // color combine c0.rgb = clamp((((tevin_d.rgb)) + (((((tevin_a.rgb<<8) + (tevin_b.rgb-tevin_a.rgb)*(tevin_c.rgb+(tevin_c.rgb>>7)))) + 128)>>8)), int3(0,0,0), int3(255,255,255)); // alpha combine prev.a = clamp((((tevin_d.a)) + (((((tevin_a.a<<8) + (tevin_b.a-tevin_a.a)*(tevin_c.a+(tevin_c.a>>7)))))>>8)), 0, 255); // TEV sta