001package cpw.mods.fml.client; 002 003import java.nio.ByteBuffer; 004import java.util.List; 005 006import net.minecraft.client.renderer.texture.Texture; 007import net.minecraft.client.renderer.texture.TextureStitched; 008 009public abstract class TextureHelper { 010 011 /** 012 * Copy the texture from the source to the atlas at the specified position 013 * 014 * This will use the devised GL helper to do either GL-side copy or a subimage upload 015 * 016 * @param atlas The atlas texture we're copying into 017 * @param source The source texture we're copying from (complete) 018 * @param atlasX The X position on the atlas 019 * @param atlasY The Y position on the atlas 020 */ 021 public abstract void doTextureCopy(Texture atlas, Texture source, int atlasX, int atlasY); 022 023 /** 024 * Upload the texture to the GPU for GL side copying operations 025 * This may be a no-op depending on the active implementation. 026 * 027 * @param source The texture to upload 028 */ 029 public abstract void doTextureUpload(TextureStitched source); 030 031 /** 032 * Rotate the texture so that it doesn't need a rotational transform applied each tick 033 * 034 * @param texture The texture to rotate 035 * @param buffer The buffer for the texture 036 */ 037 public void rotateTexture(Texture texture, ByteBuffer buffer) 038 { 039 ByteBuffer bytebuffer = buffer; 040 buffer.position(0); 041 ByteBuffer other = ByteBuffer.allocateDirect(buffer.capacity()); 042 other.position(0); 043 044 int texHeight = texture.getHeight(); 045 int texWidth = texture.getWidth(); 046 047 for (int row = 0; row < texHeight; ++row) 048 { 049 int targCol = texHeight - row - 1; 050 int srcRowOffset = row * texWidth; 051 052 for (int col = 0; col < texWidth; ++col) 053 { 054 int targIndex = col * texHeight + targCol; 055 int srcIndex = srcRowOffset + col; 056 057 srcIndex <<=2; 058 targIndex <<=2; 059 060 other.put(targIndex + 0, bytebuffer.get(srcIndex + 0)); 061 other.put(targIndex + 1, bytebuffer.get(srcIndex + 1)); 062 other.put(targIndex + 2, bytebuffer.get(srcIndex + 2)); 063 other.put(targIndex + 3, bytebuffer.get(srcIndex + 3)); 064 } 065 } 066 buffer.position(0); 067 buffer.put(other); 068 } 069 070}