public int GetId(ShaderConfig cfg) { return (cfg.LightCount & ((1 << 5) - 1)) | ((cfg.LightRangeAttenuation ? 1 : 0) << 5) | ((cfg.DiffuseMap ? 1 : 0) << 6) | ((cfg.TangentSpace ? 1 : 0) << 7) | ((cfg.BumpMap ? 1 : 0) << 8) | ((cfg.SpecularMap ? 1 : 0) << 9) | ((cfg.EmissiveMap ? 1 : 0) << 10) | ((cfg.ReflectionMap ? 1 : 0) << 11) | ((cfg.SphereMap ? 1 : 0) << 12); }
public ShaderConfig MaterialToConfig(Material m) { ShaderConfig c = new ShaderConfig(); c.BumpMap = m.BumpMap != null; c.DiffuseMap = m.diffusemap != null; c.EmissiveMap = m.EmissiveMap != null; c.LightCount = 8; c.LightRangeAttenuation = true; c.ReflectionMap = m.ReflectionMap != null; c.SpecularMap = m.SpecularMap != null; c.SphereMap = m.EnvironmentMap != null; c.TangentSpace = m.BumpMap != null; return c; }
public int GenerateShader(ShaderConfig cfg, out string vertexprogram, out string fragmentprogram) { Config = cfg; int id = GetId(cfg); string f = GenerateFragmentProgram(); string v = GenerateVertexProgram(); vertexprogram = v; fragmentprogram = f; //System.Console.WriteLine(v); //System.Console.WriteLine(f); return id; }
public Shader GetShader(ShaderConfig cfg) { return Get(cfg).Shader; }
public Entry Get(ShaderConfig cfg) { int id = Generator.GetId(cfg); if (Contains(id)) return Shaders[id]; else { string v, f; if (Generator.GenerateShader(cfg, out v, out f) != id) throw new Exception(); Shader s = null; if (Renderer != null) { //try { s = Renderer.CreateShader(v, f, null, 0, 0); } //catch (Exception e) { //StreamWriter sw1=new StreamWriter("c:\\vertex.txt", false); //StreamWriter sw2 = new StreamWriter("c:\\fragment.txt", false); //sw1.Write(v); //sw2.Write(f); //sw1.Close(); //sw2.Close(); //throw e; } } Add(id, v, f, s); return Shaders[id]; } }