package net.minecraft.client.shader; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.nio.FloatBuffer; import java.nio.IntBuffer; import javax.vecmath.Matrix4f; import net.minecraft.client.renderer.OpenGlHelper; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.BufferUtils; @SideOnly(Side.CLIENT) public class ShaderUniform { private static final Logger logger = LogManager.getLogger(); private int uniformLocation; private final int uniformCount; private final int uniformType; private final IntBuffer uniformIntBuffer; private final FloatBuffer uniformFloatBuffer; private final String shaderName; private boolean field_148105_h; private final ShaderManager shaderManager; private static final String __OBFID = "CL_00001046"; public ShaderUniform(String name, int type, int count, ShaderManager manager) { this.shaderName = name; this.uniformCount = count; this.uniformType = type; this.shaderManager = manager; if (type <= 3) { this.uniformIntBuffer = BufferUtils.createIntBuffer(count); this.uniformFloatBuffer = null; } else { this.uniformIntBuffer = null; this.uniformFloatBuffer = BufferUtils.createFloatBuffer(count); } this.uniformLocation = -1; this.markDirty(); } private void markDirty() { this.field_148105_h = true; if (this.shaderManager != null) { this.shaderManager.markDirty(); } } public static int parseType(String p_148085_0_) { byte b0 = -1; if (p_148085_0_.equals("int")) { b0 = 0; } else if (p_148085_0_.equals("float")) { b0 = 4; } else if (p_148085_0_.startsWith("matrix")) { if (p_148085_0_.endsWith("2x2")) { b0 = 8; } else if (p_148085_0_.endsWith("3x3")) { b0 = 9; } else if (p_148085_0_.endsWith("4x4")) { b0 = 10; } } return b0; } public void setUniformLocation(int p_148084_1_) { this.uniformLocation = p_148084_1_; } public String getShaderName() { return this.shaderName; } public void set(float p_148090_1_) { this.uniformFloatBuffer.position(0); this.uniformFloatBuffer.put(0, p_148090_1_); this.markDirty(); } public void set(float p_148087_1_, float p_148087_2_) { this.uniformFloatBuffer.position(0); this.uniformFloatBuffer.put(0, p_148087_1_); this.uniformFloatBuffer.put(1, p_148087_2_); this.markDirty(); } public void set(float p_148095_1_, float p_148095_2_, float p_148095_3_) { this.uniformFloatBuffer.position(0); this.uniformFloatBuffer.put(0, p_148095_1_); this.uniformFloatBuffer.put(1, p_148095_2_); this.uniformFloatBuffer.put(2, p_148095_3_); this.markDirty(); } public void set(float p_148081_1_, float p_148081_2_, float p_148081_3_, float p_148081_4_) { this.uniformFloatBuffer.position(0); this.uniformFloatBuffer.put(p_148081_1_); this.uniformFloatBuffer.put(p_148081_2_); this.uniformFloatBuffer.put(p_148081_3_); this.uniformFloatBuffer.put(p_148081_4_); this.uniformFloatBuffer.flip(); this.markDirty(); } public void func_148092_b(float p_148092_1_, float p_148092_2_, float p_148092_3_, float p_148092_4_) { this.uniformFloatBuffer.position(0); if (this.uniformType >= 4) { this.uniformFloatBuffer.put(0, p_148092_1_); } if (this.uniformType >= 5) { this.uniformFloatBuffer.put(1, p_148092_2_); } if (this.uniformType >= 6) { this.uniformFloatBuffer.put(2, p_148092_3_); } if (this.uniformType >= 7) { this.uniformFloatBuffer.put(3, p_148092_4_); } this.markDirty(); } public void set(int p_148083_1_, int p_148083_2_, int p_148083_3_, int p_148083_4_) { this.uniformIntBuffer.position(0); if (this.uniformType >= 0) { this.uniformIntBuffer.put(0, p_148083_1_); } if (this.uniformType >= 1) { this.uniformIntBuffer.put(1, p_148083_2_); } if (this.uniformType >= 2) { this.uniformIntBuffer.put(2, p_148083_3_); } if (this.uniformType >= 3) { this.uniformIntBuffer.put(3, p_148083_4_); } this.markDirty(); } public void set(float[] p_148097_1_) { if (p_148097_1_.length < this.uniformCount) { logger.warn("Uniform.set called with a too-small value array (expected " + this.uniformCount + ", got " + p_148097_1_.length + "). Ignoring."); } else { this.uniformFloatBuffer.position(0); this.uniformFloatBuffer.put(p_148097_1_); this.uniformFloatBuffer.position(0); this.markDirty(); } } public void set(float p_148094_1_, float p_148094_2_, float p_148094_3_, float p_148094_4_, float p_148094_5_, float p_148094_6_, float p_148094_7_, float p_148094_8_, float p_148094_9_, float p_148094_10_, float p_148094_11_, float p_148094_12_, float p_148094_13_, float p_148094_14_, float p_148094_15_, float p_148094_16_) { this.uniformFloatBuffer.position(0); this.uniformFloatBuffer.put(0, p_148094_1_); this.uniformFloatBuffer.put(1, p_148094_2_); this.uniformFloatBuffer.put(2, p_148094_3_); this.uniformFloatBuffer.put(3, p_148094_4_); this.uniformFloatBuffer.put(4, p_148094_5_); this.uniformFloatBuffer.put(5, p_148094_6_); this.uniformFloatBuffer.put(6, p_148094_7_); this.uniformFloatBuffer.put(7, p_148094_8_); this.uniformFloatBuffer.put(8, p_148094_9_); this.uniformFloatBuffer.put(9, p_148094_10_); this.uniformFloatBuffer.put(10, p_148094_11_); this.uniformFloatBuffer.put(11, p_148094_12_); this.uniformFloatBuffer.put(12, p_148094_13_); this.uniformFloatBuffer.put(13, p_148094_14_); this.uniformFloatBuffer.put(14, p_148094_15_); this.uniformFloatBuffer.put(15, p_148094_16_); this.markDirty(); } public void set(Matrix4f p_148088_1_) { this.set(p_148088_1_.m00, p_148088_1_.m01, p_148088_1_.m02, p_148088_1_.m03, p_148088_1_.m10, p_148088_1_.m11, p_148088_1_.m12, p_148088_1_.m13, p_148088_1_.m20, p_148088_1_.m21, p_148088_1_.m22, p_148088_1_.m23, p_148088_1_.m30, p_148088_1_.m31, p_148088_1_.m32, p_148088_1_.m33); } public void upload() { if (!this.field_148105_h) { ; } this.field_148105_h = false; if (this.uniformType <= 3) { this.uploadInt(); } else if (this.uniformType <= 7) { this.uploadFloat(); } else { if (this.uniformType > 10) { logger.warn("Uniform.upload called, but type value (" + this.uniformType + ") is not " + "a valid type. Ignoring."); return; } this.uploadFloatMatrix(); } } private void uploadInt() { switch (this.uniformType) { case 0: OpenGlHelper.glUniform1(this.uniformLocation, this.uniformIntBuffer); break; case 1: OpenGlHelper.glUniform2(this.uniformLocation, this.uniformIntBuffer); break; case 2: OpenGlHelper.glUniform3(this.uniformLocation, this.uniformIntBuffer); break; case 3: OpenGlHelper.glUniform4(this.uniformLocation, this.uniformIntBuffer); break; default: logger.warn("Uniform.upload called, but count value (" + this.uniformCount + ") is " + " not in the range of 1 to 4. Ignoring."); } } private void uploadFloat() { switch (this.uniformType) { case 4: OpenGlHelper.glUniform1(this.uniformLocation, this.uniformFloatBuffer); break; case 5: OpenGlHelper.glUniform2(this.uniformLocation, this.uniformFloatBuffer); break; case 6: OpenGlHelper.glUniform3(this.uniformLocation, this.uniformFloatBuffer); break; case 7: OpenGlHelper.glUniform4(this.uniformLocation, this.uniformFloatBuffer); break; default: logger.warn("Uniform.upload called, but count value (" + this.uniformCount + ") is " + "not in the range of 1 to 4. Ignoring."); } } private void uploadFloatMatrix() { switch (this.uniformType) { case 8: OpenGlHelper.glUniformMatrix2(this.uniformLocation, true, this.uniformFloatBuffer); break; case 9: OpenGlHelper.glUniformMatrix3(this.uniformLocation, true, this.uniformFloatBuffer); break; case 10: OpenGlHelper.glUniformMatrix4(this.uniformLocation, true, this.uniformFloatBuffer); } } }