You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
431 lines
15 KiB
Java
431 lines
15 KiB
Java
package net.minecraft.client.shader;
|
|
|
|
import com.google.common.base.Charsets;
|
|
import com.google.common.collect.Lists;
|
|
import com.google.common.collect.Maps;
|
|
import com.google.gson.JsonArray;
|
|
import com.google.gson.JsonElement;
|
|
import com.google.gson.JsonObject;
|
|
import com.google.gson.JsonParser;
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
import java.io.InputStream;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import net.minecraft.client.renderer.OpenGlHelper;
|
|
import net.minecraft.client.renderer.texture.ITextureObject;
|
|
import net.minecraft.client.resources.IResourceManager;
|
|
import net.minecraft.client.util.JsonBlendingMode;
|
|
import net.minecraft.client.util.JsonException;
|
|
import net.minecraft.util.JsonUtils;
|
|
import net.minecraft.util.ResourceLocation;
|
|
import org.apache.commons.io.IOUtils;
|
|
import org.apache.logging.log4j.LogManager;
|
|
import org.apache.logging.log4j.Logger;
|
|
import org.lwjgl.opengl.GL11;
|
|
import org.lwjgl.opengl.ARBMultitexture;
|
|
import org.lwjgl.opengl.GL13;
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public class ShaderManager
|
|
{
|
|
private static final Logger logger = LogManager.getLogger();
|
|
private static final ShaderDefault defaultShaderUniform = new ShaderDefault();
|
|
private static ShaderManager staticShaderManager = null;
|
|
private static int field_147999_d = -1;
|
|
private static boolean field_148000_e = true;
|
|
private final Map field_147997_f = Maps.newHashMap();
|
|
private final List field_147998_g = Lists.newArrayList();
|
|
private final List field_148010_h = Lists.newArrayList();
|
|
private final List field_148011_i = Lists.newArrayList();
|
|
private final List field_148008_j = Lists.newArrayList();
|
|
private final Map field_148009_k = Maps.newHashMap();
|
|
private final int field_148006_l;
|
|
private final String field_148007_m;
|
|
private final boolean field_148004_n;
|
|
private boolean field_148005_o;
|
|
private final JsonBlendingMode field_148016_p;
|
|
private final List field_148015_q;
|
|
private final List field_148014_r;
|
|
private final ShaderLoader field_148013_s;
|
|
private final ShaderLoader field_148012_t;
|
|
private static final String __OBFID = "CL_00001040";
|
|
|
|
public ShaderManager(IResourceManager resourceManager, String programName) throws JsonException
|
|
{
|
|
JsonParser jsonparser = new JsonParser();
|
|
ResourceLocation resourcelocation = new ResourceLocation("shaders/program/" + programName + ".json");
|
|
this.field_148007_m = programName;
|
|
InputStream inputstream = null;
|
|
|
|
try
|
|
{
|
|
inputstream = resourceManager.getResource(resourcelocation).getInputStream();
|
|
JsonObject jsonobject = jsonparser.parse(IOUtils.toString(inputstream, Charsets.UTF_8)).getAsJsonObject();
|
|
String s1 = JsonUtils.getJsonObjectStringFieldValue(jsonobject, "vertex");
|
|
String s2 = JsonUtils.getJsonObjectStringFieldValue(jsonobject, "fragment");
|
|
JsonArray jsonarray = JsonUtils.getJsonObjectJsonArrayFieldOrDefault(jsonobject, "samplers", (JsonArray)null);
|
|
|
|
if (jsonarray != null)
|
|
{
|
|
int i = 0;
|
|
|
|
for (Iterator iterator = jsonarray.iterator(); iterator.hasNext(); ++i)
|
|
{
|
|
JsonElement jsonelement = (JsonElement)iterator.next();
|
|
|
|
try
|
|
{
|
|
this.func_147996_a(jsonelement);
|
|
}
|
|
catch (Exception exception2)
|
|
{
|
|
JsonException jsonexception1 = JsonException.func_151379_a(exception2);
|
|
jsonexception1.func_151380_a("samplers[" + i + "]");
|
|
throw jsonexception1;
|
|
}
|
|
}
|
|
}
|
|
|
|
JsonArray jsonarray1 = JsonUtils.getJsonObjectJsonArrayFieldOrDefault(jsonobject, "attributes", (JsonArray)null);
|
|
Iterator iterator1;
|
|
|
|
if (jsonarray1 != null)
|
|
{
|
|
int j = 0;
|
|
this.field_148015_q = Lists.newArrayListWithCapacity(jsonarray1.size());
|
|
this.field_148014_r = Lists.newArrayListWithCapacity(jsonarray1.size());
|
|
|
|
for (iterator1 = jsonarray1.iterator(); iterator1.hasNext(); ++j)
|
|
{
|
|
JsonElement jsonelement1 = (JsonElement)iterator1.next();
|
|
|
|
try
|
|
{
|
|
this.field_148014_r.add(JsonUtils.getJsonElementStringValue(jsonelement1, "attribute"));
|
|
}
|
|
catch (Exception exception1)
|
|
{
|
|
JsonException jsonexception2 = JsonException.func_151379_a(exception1);
|
|
jsonexception2.func_151380_a("attributes[" + j + "]");
|
|
throw jsonexception2;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
this.field_148015_q = null;
|
|
this.field_148014_r = null;
|
|
}
|
|
|
|
JsonArray jsonarray2 = JsonUtils.getJsonObjectJsonArrayFieldOrDefault(jsonobject, "uniforms", (JsonArray)null);
|
|
|
|
if (jsonarray2 != null)
|
|
{
|
|
int k = 0;
|
|
|
|
for (Iterator iterator2 = jsonarray2.iterator(); iterator2.hasNext(); ++k)
|
|
{
|
|
JsonElement jsonelement2 = (JsonElement)iterator2.next();
|
|
|
|
try
|
|
{
|
|
this.func_147987_b(jsonelement2);
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
JsonException jsonexception3 = JsonException.func_151379_a(exception);
|
|
jsonexception3.func_151380_a("uniforms[" + k + "]");
|
|
throw jsonexception3;
|
|
}
|
|
}
|
|
}
|
|
|
|
this.field_148016_p = JsonBlendingMode.func_148110_a(JsonUtils.getJsonObjectFieldOrDefault(jsonobject, "blend", (JsonObject)null));
|
|
this.field_148004_n = JsonUtils.getJsonObjectBooleanFieldValueOrDefault(jsonobject, "cull", true);
|
|
this.field_148013_s = ShaderLoader.func_148057_a(resourceManager, ShaderLoader.ShaderType.VERTEX, s1);
|
|
this.field_148012_t = ShaderLoader.func_148057_a(resourceManager, ShaderLoader.ShaderType.FRAGMENT, s2);
|
|
this.field_148006_l = ShaderLinkHelper.getStaticShaderLinkHelper().func_148078_c();
|
|
ShaderLinkHelper.getStaticShaderLinkHelper().func_148075_b(this);
|
|
this.func_147990_i();
|
|
|
|
if (this.field_148014_r != null)
|
|
{
|
|
iterator1 = this.field_148014_r.iterator();
|
|
|
|
while (iterator1.hasNext())
|
|
{
|
|
String s3 = (String)iterator1.next();
|
|
int l = OpenGlHelper.func_153164_b(this.field_148006_l, s3);
|
|
this.field_148015_q.add(Integer.valueOf(l));
|
|
}
|
|
}
|
|
}
|
|
catch (Exception exception3)
|
|
{
|
|
JsonException jsonexception = JsonException.func_151379_a(exception3);
|
|
jsonexception.func_151381_b(resourcelocation.getResourcePath());
|
|
throw jsonexception;
|
|
}
|
|
finally
|
|
{
|
|
IOUtils.closeQuietly(inputstream);
|
|
}
|
|
|
|
this.func_147985_d();
|
|
}
|
|
|
|
public void func_147988_a()
|
|
{
|
|
ShaderLinkHelper.getStaticShaderLinkHelper().func_148077_a(this);
|
|
}
|
|
|
|
public void func_147993_b()
|
|
{
|
|
OpenGlHelper.func_153161_d(0);
|
|
field_147999_d = -1;
|
|
staticShaderManager = null;
|
|
field_148000_e = true;
|
|
|
|
for (int i = 0; i < this.field_148010_h.size(); ++i)
|
|
{
|
|
if (this.field_147997_f.get(this.field_147998_g.get(i)) != null)
|
|
{
|
|
GL13.glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + i);
|
|
GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void func_147995_c()
|
|
{
|
|
this.field_148005_o = false;
|
|
staticShaderManager = this;
|
|
this.field_148016_p.func_148109_a();
|
|
|
|
if (this.field_148006_l != field_147999_d)
|
|
{
|
|
OpenGlHelper.func_153161_d(this.field_148006_l);
|
|
field_147999_d = this.field_148006_l;
|
|
}
|
|
|
|
if (field_148000_e != this.field_148004_n)
|
|
{
|
|
field_148000_e = this.field_148004_n;
|
|
|
|
if (this.field_148004_n)
|
|
{
|
|
GL11.glEnable(GL11.GL_CULL_FACE);
|
|
}
|
|
else
|
|
{
|
|
GL11.glDisable(GL11.GL_CULL_FACE);
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < this.field_148010_h.size(); ++i)
|
|
{
|
|
if (this.field_147997_f.get(this.field_147998_g.get(i)) != null)
|
|
{
|
|
GL13.glActiveTexture(ARBMultitexture.GL_TEXTURE0_ARB + i);
|
|
GL11.glEnable(GL11.GL_TEXTURE_2D);
|
|
Object object = this.field_147997_f.get(this.field_147998_g.get(i));
|
|
int j = -1;
|
|
|
|
if (object instanceof Framebuffer)
|
|
{
|
|
j = ((Framebuffer)object).framebufferTexture;
|
|
}
|
|
else if (object instanceof ITextureObject)
|
|
{
|
|
j = ((ITextureObject)object).getGlTextureId();
|
|
}
|
|
else if (object instanceof Integer)
|
|
{
|
|
j = ((Integer)object).intValue();
|
|
}
|
|
|
|
if (j != -1)
|
|
{
|
|
GL11.glBindTexture(GL11.GL_TEXTURE_2D, j);
|
|
OpenGlHelper.func_153163_f(OpenGlHelper.func_153194_a(this.field_148006_l, (CharSequence)this.field_147998_g.get(i)), i);
|
|
}
|
|
}
|
|
}
|
|
|
|
Iterator iterator = this.field_148011_i.iterator();
|
|
|
|
while (iterator.hasNext())
|
|
{
|
|
ShaderUniform shaderuniform = (ShaderUniform)iterator.next();
|
|
shaderuniform.func_148093_b();
|
|
}
|
|
}
|
|
|
|
public void func_147985_d()
|
|
{
|
|
this.field_148005_o = true;
|
|
}
|
|
|
|
public ShaderUniform func_147991_a(String p_147991_1_)
|
|
{
|
|
return this.field_148009_k.containsKey(p_147991_1_) ? (ShaderUniform)this.field_148009_k.get(p_147991_1_) : null;
|
|
}
|
|
|
|
public ShaderUniform func_147984_b(String p_147984_1_)
|
|
{
|
|
return (ShaderUniform)(this.field_148009_k.containsKey(p_147984_1_) ? (ShaderUniform)this.field_148009_k.get(p_147984_1_) : defaultShaderUniform);
|
|
}
|
|
|
|
private void func_147990_i()
|
|
{
|
|
int i = 0;
|
|
String s;
|
|
int k;
|
|
|
|
for (int j = 0; i < this.field_147998_g.size(); ++j)
|
|
{
|
|
s = (String)this.field_147998_g.get(i);
|
|
k = OpenGlHelper.func_153194_a(this.field_148006_l, s);
|
|
|
|
if (k == -1)
|
|
{
|
|
logger.warn("Shader " + this.field_148007_m + "could not find sampler named " + s + " in the specified shader program.");
|
|
this.field_147997_f.remove(s);
|
|
this.field_147998_g.remove(j);
|
|
--j;
|
|
}
|
|
else
|
|
{
|
|
this.field_148010_h.add(Integer.valueOf(k));
|
|
}
|
|
|
|
++i;
|
|
}
|
|
|
|
Iterator iterator = this.field_148011_i.iterator();
|
|
|
|
while (iterator.hasNext())
|
|
{
|
|
ShaderUniform shaderuniform = (ShaderUniform)iterator.next();
|
|
s = shaderuniform.func_148086_a();
|
|
k = OpenGlHelper.func_153194_a(this.field_148006_l, s);
|
|
|
|
if (k == -1)
|
|
{
|
|
logger.warn("Could not find uniform named " + s + " in the specified" + " shader program.");
|
|
}
|
|
else
|
|
{
|
|
this.field_148008_j.add(Integer.valueOf(k));
|
|
shaderuniform.func_148084_b(k);
|
|
this.field_148009_k.put(s, shaderuniform);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void func_147996_a(JsonElement p_147996_1_)
|
|
{
|
|
JsonObject jsonobject = JsonUtils.getJsonElementAsJsonObject(p_147996_1_, "sampler");
|
|
String s = JsonUtils.getJsonObjectStringFieldValue(jsonobject, "name");
|
|
|
|
if (!JsonUtils.jsonObjectFieldTypeIsString(jsonobject, "file"))
|
|
{
|
|
this.field_147997_f.put(s, (Object)null);
|
|
this.field_147998_g.add(s);
|
|
}
|
|
else
|
|
{
|
|
this.field_147998_g.add(s);
|
|
}
|
|
}
|
|
|
|
public void func_147992_a(String p_147992_1_, Object p_147992_2_)
|
|
{
|
|
if (this.field_147997_f.containsKey(p_147992_1_))
|
|
{
|
|
this.field_147997_f.remove(p_147992_1_);
|
|
}
|
|
|
|
this.field_147997_f.put(p_147992_1_, p_147992_2_);
|
|
this.func_147985_d();
|
|
}
|
|
|
|
private void func_147987_b(JsonElement p_147987_1_) throws JsonException
|
|
{
|
|
JsonObject jsonobject = JsonUtils.getJsonElementAsJsonObject(p_147987_1_, "uniform");
|
|
String s = JsonUtils.getJsonObjectStringFieldValue(jsonobject, "name");
|
|
int i = ShaderUniform.func_148085_a(JsonUtils.getJsonObjectStringFieldValue(jsonobject, "type"));
|
|
int j = JsonUtils.getJsonObjectIntegerFieldValue(jsonobject, "count");
|
|
float[] afloat = new float[Math.max(j, 16)];
|
|
JsonArray jsonarray = JsonUtils.getJsonObjectJsonArrayField(jsonobject, "values");
|
|
|
|
if (jsonarray.size() != j && jsonarray.size() > 1)
|
|
{
|
|
throw new JsonException("Invalid amount of values specified (expected " + j + ", found " + jsonarray.size() + ")");
|
|
}
|
|
else
|
|
{
|
|
int k = 0;
|
|
|
|
for (Iterator iterator = jsonarray.iterator(); iterator.hasNext(); ++k)
|
|
{
|
|
JsonElement jsonelement1 = (JsonElement)iterator.next();
|
|
|
|
try
|
|
{
|
|
afloat[k] = JsonUtils.getJsonElementFloatValue(jsonelement1, "value");
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
JsonException jsonexception = JsonException.func_151379_a(exception);
|
|
jsonexception.func_151380_a("values[" + k + "]");
|
|
throw jsonexception;
|
|
}
|
|
}
|
|
|
|
if (j > 1 && jsonarray.size() == 1)
|
|
{
|
|
while (k < j)
|
|
{
|
|
afloat[k] = afloat[0];
|
|
++k;
|
|
}
|
|
}
|
|
|
|
int l = j > 1 && j <= 4 && i < 8 ? j - 1 : 0;
|
|
ShaderUniform shaderuniform = new ShaderUniform(s, i + l, j, this);
|
|
|
|
if (i <= 3)
|
|
{
|
|
shaderuniform.func_148083_a((int)afloat[0], (int)afloat[1], (int)afloat[2], (int)afloat[3]);
|
|
}
|
|
else if (i <= 7)
|
|
{
|
|
shaderuniform.func_148092_b(afloat[0], afloat[1], afloat[2], afloat[3]);
|
|
}
|
|
else
|
|
{
|
|
shaderuniform.func_148097_a(afloat);
|
|
}
|
|
|
|
this.field_148011_i.add(shaderuniform);
|
|
}
|
|
}
|
|
|
|
public ShaderLoader func_147989_e()
|
|
{
|
|
return this.field_148013_s;
|
|
}
|
|
|
|
public ShaderLoader func_147994_f()
|
|
{
|
|
return this.field_148012_t;
|
|
}
|
|
|
|
public int func_147986_h()
|
|
{
|
|
return this.field_148006_l;
|
|
}
|
|
} |