Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #version 130
- uniform sampler2D level;
- uniform sampler2D blocks;
- uniform sampler2D tiles;
- uniform sampler2D palette;
- void main()
- {
- // Get texture dimensions
- vec2 levelSz = textureSize(level, 0).xy;
- vec2 tilesSz = textureSize(tiles, 0).xy;
- // Get level block data
- vec4 data = texture2D(level, gl_TexCoord[0].xy / 16).rgba;
- float pos = (floor(data.a * 65536) + floor(data.r * 256)) * 4;
- float flags = floor(data.g * 256);
- // Block flags
- bool blkFlipX = mod(flags, 2) == 1;
- bool blkFlipY = mod(floor(flags / 2), 2) == 1;
- // Get tile to draw
- float blkCol = mod(floor(gl_TexCoord[0].x * levelSz.x / 8), 2);
- float blkRow = mod(floor(gl_TexCoord[0].y * levelSz.y / 8), 2);
- if (blkFlipX)
- blkCol = 1.0 - blkCol;
- if (blkFlipY)
- blkRow = 1.0 - blkRow;
- // Get block tile data
- data = texture2D(blocks, vec2((pos + (blkRow * 2) + blkCol) / textureSize(blocks, 0).x, 0)).rgba;
- pos = ((floor(data.a * 65536) + floor(data.r * 256)) * 8) / tilesSz.x;
- flags = floor(data.g * 256);
- // Tile flags
- bool tileFlipX = mod(flags, 2) == 1;
- bool tileFlipY = mod(floor(flags / 2), 2) == 1;
- float palLine = floor(data.b * 256);
- // Get tile pixel
- float pixelX = mod(floor(gl_TexCoord[0].x * levelSz.x), 8);
- float pixelY = mod(floor(gl_TexCoord[0].y * levelSz.y), 8);
- if ((!tileFlipX && blkFlipX) || (tileFlipX && !blkFlipX))
- pixelX = 7.0 - pixelX;
- if ((!tileFlipY && blkFlipY) || (tileFlipY && !blkFlipY))
- pixelY = 7.0 - pixelY;
- // Get palette entry
- float tilePixel = floor(texture2D(tiles, vec2(pos + (pixelX / tilesSz.x), pixelY / tilesSz.y)).a * 256);
- if (tilePixel == 0)
- gl_FragColor = texture2D(palette, vec2(0.5, 0));
- else
- gl_FragColor = texture2D(palette, vec2((tilePixel + (palLine * 16)) / 64, 0));
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement