protected void BuildMaterials()
        {
            //Create materials for each blending mode
            //Blending modes cannot be changed by MaterialPropertyBlocks,
            //so we need to have a separate material to pass to each layer based on its setting

            _materials = new Dictionary <ShaderBlendMode, Material>();
            HashSet <Shader> layerShaders = new HashSet <Shader>();

            foreach (Depthkit_ZeroDaysLookLayer layer in _layers)
            {
                if (layer != null && layer.Shader != null)
                {
                    layerShaders.Add(layer.Shader);
                }
            }

            foreach (BlendMode mode in BlendMode.GetValues(typeof(BlendMode)))
            {
                foreach (Shader shader in layerShaders)
                {
                    ShaderBlendMode sbm = new ShaderBlendMode(shader, mode);

                    Material mat = new Material(shader);
                    mat.SetInt("_SrcMode", (int)GetSrcMode(mode));
                    mat.SetInt("_DstMode", (int)GetDstMode(mode));
                    mat.SetInt("_BlendEnum", (int)mode);

                    _materials.Add(sbm, mat);
                }
            }
        }
Exemple #2
0
 public ParsedShader(IReadOnlyDictionary <string, ShaderUniformDefinition> uniforms,
                     IReadOnlyDictionary <string, ShaderVaryingDefinition> varyings, IList <ShaderFunctionDefinition> functions,
                     ShaderLightMode lightMode, ShaderBlendMode blendMode)
 {
     Uniforms  = uniforms;
     Varyings  = varyings;
     Functions = functions;
     LightMode = lightMode;
     BlendMode = blendMode;
 }
 public ParsedShader(IReadOnlyDictionary <string, ShaderUniformDefinition> uniforms,
                     IReadOnlyDictionary <string, ShaderVaryingDefinition> varyings,
                     IReadOnlyDictionary <string, ShaderConstantDefinition> constants, IList <ShaderFunctionDefinition> functions,
                     ShaderLightMode lightMode, ShaderBlendMode blendMode, ShaderPreset preset)
 {
     Uniforms  = uniforms;
     Varyings  = varyings;
     Functions = functions;
     LightMode = lightMode;
     BlendMode = blendMode;
     Preset    = preset;
     Constants = constants;
 }
Exemple #4
0
        void Update()
        {
            if (_layersDirty)
            {
                _layers = GetComponentsInChildren <HologramLayer>();
                if (_layers == null)
                {
                    Debug.LogError("No Layers Found");
                    return;
                }

                _layersDirty    = false;
                _materialsDirty = true;
            }

            //build materials if shaders are not set or have changed
            if (_materialsDirty)
            {
                BuildMaterials();
                _materialsDirty = false;
            }

            //draw the layers
            Matrix4x4 transformmat = Matrix4x4.TRS(transform.position, transform.rotation, transform.localScale);
            Material  m;

            if (_layers != null)
            {
                foreach (HologramLayer layer in _layers)
                {
                    if (layer == null)
                    {
                        continue;
                    }

                    ShaderBlendMode materialKey = new ShaderBlendMode(layer.Shader, layer.BlendMode);
                    if (_materials.ContainsKey(materialKey))
                    {
                        m = _materials[materialKey];
                        SetMaterialProperties(m);
                        layer.Draw(transformmat, m);
                    }
                    else
                    {
                        Debug.LogError("Blending Mode / Shader combo not found in Materials: " + layer.Shader + " " + layer.BlendMode);
                        _materialsDirty = true;
                    }
                }
            }
        }
        public override void Draw()
        {
            CreateRequiredLayers();

            if (Texture == null)
            {
                //Don't render if the parent texture is null
                return;
            }

            _occludeLayer.enabled = _selfOcclusion;
            if (_layersDirty || _layers == null)
            {
                _layers = GetComponentsInChildren <Depthkit_ZeroDaysLookLayer>();
                if (_layers == null)
                {
                    Debug.LogError("No Layers Found");
                    return;
                }

                _layersDirty   = false;
                _materialDirty = true;
            }

            //build materials if shaders are not set or have changed
            if (_materialDirty || _materials == null)
            {
                BuildMaterials();
                _materialDirty = false;
            }

            //draw the layers
            Matrix4x4 transformmat = Matrix4x4.TRS(transform.position, transform.rotation, transform.localScale);
            Material  m;

            if (_layers != null)
            {
                foreach (Depthkit_ZeroDaysLookLayer layer in _layers)
                {
                    if (layer == null)
                    {
                        continue;
                    }

                    if (_metadataChanged)
                    {
                        layer.SetBounds(_bounds);
                    }

                    ShaderBlendMode materialKey = new ShaderBlendMode(layer.Shader, layer.BlendMode);
                    if (_materials.ContainsKey(materialKey))
                    {
                        m = _materials[materialKey];
                        SetMaterialProperties(m);
                        layer.Draw(transformmat, m);
                    }
                    else
                    {
                        Debug.LogError("Blending Mode / Shader combo not found in Materials: " + layer.Shader + " Blend Mode: " + layer.BlendMode);
                        _materialDirty = true;
                    }
                }

                _metadataChanged = false;
            }
        }