/// <summary>
        /// Create a copy of a Shader program using same source but linked in another new program instance.
        /// </summary>
        /// <param name="copyTarget">
        /// The shader to derive a new instance from.
        /// </param>
        /// <param name="link">
        /// If the shader copy is to be linked
        /// </param>
        /// <returns></returns>
        public static ComposedShader CreateNewInstance(ComposedShader copyTarget, bool link = true)
        {
            ComposedShader derived;
            ShaderPart     partClone;

            derived           = new ComposedShader();
            derived.language  = copyTarget.language;
            derived.IsBuiltIn = copyTarget.IsBuiltIn;

            foreach (ShaderPart part in copyTarget.ShaderParts)
            {
                partClone = new ShaderPart();
                partClone.ShaderSource = part.ShaderSource;
                partClone.Type         = part.Type;

                derived.ShaderParts.Add(partClone);
            }

            if (link)
            {
                derived.Link();
            }

            return(derived);
        }
Exemple #2
0
            public void add(LuaTable table)
            {
                var sp = new ShaderPart();

                sp.type      = table["type"] as string;
                sp.className = table["class"] as string;
                sp.source    = table["source"] as string;

                if (sp.type == null)
                {
                    throw new InvalidShaderException("Shader is missing a type declaration");
                }
                if (sp.source == null)
                {
                    throw new InvalidShaderException("Shader is missing a source declaration");
                }

                foreach (string k in table.Keys)
                {
                    if (k == "type" || k == "class" || k == "source")
                    {
                        continue;
                    }
                    sp.properties[k] = table[k] as string;
                }
                shader.parts.Add(sp);
            }
Exemple #3
0
 /// <summary>
 /// Deletes a shader part.
 /// </summary>
 /// <param name="shaderPart">The shader part to delete.</param>
 internal static void DeleteShader(ShaderPart shaderPart)
 {
     //todo: don't use scheduler
     resetScheduler.Add(() =>
     {
         GL.DeleteShader(shaderPart);
     });
 }
Exemple #4
0
    //-------------Draw Functions----------------

    private static void testAltClick(Rect rect, ShaderPart property)
    {
        if (input.HadMouseDownRepaint && input.is_alt_down && rect.Contains(input.mouse_position))
        {
            if (property.options.altClick != null)
            {
                property.options.altClick.Perform();
            }
        }
    }
Exemple #5
0
    //-------------Draw Functions----------------

    private static void testAltClick(Rect rect, ShaderPart property)
    {
        var e = Event.current;

        if (HadMouseDownRepaint && e.alt && rect.Contains(e.mousePosition))
        {
            if (property.options.altClick != null)
            {
                property.options.altClick.Perform();
            }
        }
    }
Exemple #6
0
        private void CompileIfNecessary(ref ShaderFragment fragment, string header, string @class, ShaderType type)
        {
            // No compilation needed
            if (fragment != null)
            {
                return;
            }

            string typeName = GetShaderName(type);

            ShaderPart source = null;

            foreach (var sp in this.parts)
            {
                if (sp.type != typeName)
                {
                    continue;
                }
                if (sp.className != @class)
                {
                    continue;
                }
                source = sp;
                break;
            }
            if (source == null)
            {
                // Search for default shader
                foreach (var sp in this.parts)
                {
                    if (sp.type != typeName)
                    {
                        continue;
                    }
                    if (sp.className != null)
                    {
                        continue;
                    }
                    source = sp;
                    break;
                }
            }

            if (source == null)
            {
                return;                 // No source found, no shader available
            }
            string input = "";

            input = GetInput(source.properties["input"]);

            fragment = new ShaderFragment(type, header + input + source.source);
        }
Exemple #7
0
        /// <summary>
        /// Deletes a shader part.
        /// </summary>
        /// <param name="shaderPart">The shader part to delete.</param>
        internal static void DeleteShader(ShaderPart shaderPart)
        {
            if (!HasContext)
            {
                return;
            }

            resetScheduler.Add(() =>
            {
                GL.DeleteShader(shaderPart);
            });
        }
Exemple #8
0
 //function to handle the drawing of header or property
 void drawShaderPart(ShaderPart part, MaterialEditor materialEditor)
 {
     if (part is ShaderHeader)
     {
         ShaderHeader header = (ShaderHeader)part;
         drawShaderHeader(header, materialEditor);
     }
     else
     {
         ShaderProperty property = (ShaderProperty)part;
         drawShaderProperty(property, materialEditor);
     }
 }
Exemple #9
0
    //-------------Draw Functions----------------

    private static void testAltClick(Rect rect, ShaderPart property)
    {
        var e = Event.current;

        if (isMouseClick && e.alt && rect.Contains(e.mousePosition))
        {
            if (property.altClick != "")
            {
                if (property.altClick.StartsWith("url:"))
                {
                    Application.OpenURL(property.altClick.Replace("url:", ""));
                }
            }
        }
    }
        public static int ApplyShaderPart(int shaderProgramHandle, ShaderPart part)
        {
            ShaderType type = ShaderType.VertexShader;

            switch (part.Type)
            {
            case shaderPartTypeValues.VERTEX:
                type = ShaderType.VertexShader;
                break;

            case shaderPartTypeValues.FRAGMENT:
                type = ShaderType.FragmentShader;
                break;

            case shaderPartTypeValues.TESS_CONTROL:
                type = ShaderType.TessControlShader;
                break;

            case shaderPartTypeValues.TESS_EVAL:
                type = ShaderType.TessEvaluationShader;
                break;

            case shaderPartTypeValues.GEOMETRY:
                type = ShaderType.GeometryShader;
                break;

            default:
                throw new Exception("unknown shader type");
            }

            part.ShaderHandle = GL.CreateShader(type);

            GL.ShaderSource(part.ShaderHandle, part.ShaderSource);
            GL.CompileShader(part.ShaderHandle);

            string err = GL.GetShaderInfoLog(part.ShaderHandle).Trim();

            if (!string.IsNullOrEmpty(err))
            {
                Console.WriteLine(err);
            }

            GL.AttachShader(shaderProgramHandle, part.ShaderHandle);
            Console.WriteLine("ShaderPart {0} [attaching]", part.Type);

            return(part.ShaderHandle);
        }
Exemple #11
0
            public void addDefault(string name)
            {
                var sp = new ShaderPart();

                switch (name)
                {
                case "vertex":
                    this.include("transform");
                    sp.type   = "vertex";
                    sp.source = Resource.GetString("OpenWorld.Engine.Resources.Shaders.Defaults.vertex");
                    sp.properties["input"] = "mesh";
                    break;

                case "fragment":
                    this.include("mesh");
                    sp.type   = "vertex";
                    sp.source = Resource.GetString("OpenWorld.Engine.Resources.Shaders.Defaults.fragment");
                    break;

                default:
                    throw new InvalidOperationException("Failed to add default shader: " + name + " is not a valid default shader!");
                }
                shader.parts.Add(sp);
            }
Exemple #12
0
 /// <summary>
 /// Deletes a shader part.
 /// </summary>
 /// <param name="shaderPart">The shader part to delete.</param>
 internal static void DeleteShader(ShaderPart shaderPart)
 {
     //todo: don't use scheduler
     ScheduleDisposal(() => { GL.DeleteShader(shaderPart); });
 }
Exemple #13
0
 public void addPart(ShaderPart part)
 {
     parts.Add(part);
 }
Exemple #14
0
    private bool IsSearchedFor(ShaderPart part, string term)
    {
        string lowercaseTerm = header_search_term.ToLower();

        return(part.content.text.ToLower().Contains(lowercaseTerm));
    }
Exemple #15
0
    //finds all properties and headers and stores them in correct order
    private void CollectAllProperties()
    {
        //load display names from file if it exists
        MaterialProperty[]          props  = current.properties;
        Dictionary <string, string> labels = LoadDisplayNamesFromFile();

        LoadLocales();

        current.propertyDictionary = new Dictionary <string, ShaderProperty>();
        current.shaderParts        = new List <ShaderPart>();
        shaderparts = new ShaderHeader();                            //init top object that all Shader Objects are childs of
        Stack <ShaderGroup> headerStack = new Stack <ShaderGroup>(); //header stack. used to keep track if current header to parent new objects to

        headerStack.Push(shaderparts);                               //add top object as top object to stack
        headerStack.Push(shaderparts);                               //add top object a second time, because it get's popped with first actual header item
        footer = new List <ButtonData>();                            //init footer list
        int headerCount = 0;

        Type         materialPropertyDrawerType = typeof(UnityEditor.Editor).Assembly.GetType("UnityEditor.MaterialPropertyHandler");
        MethodInfo   getPropertyHandlerMethod   = materialPropertyDrawerType.GetMethod("GetShaderPropertyHandler", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
        PropertyInfo drawerProperty             = materialPropertyDrawerType.GetProperty("propertyDrawer");

        Type      materialToggleDrawerType = typeof(UnityEditor.Editor).Assembly.GetType("UnityEditor.MaterialToggleDrawer");
        FieldInfo keyWordField             = materialToggleDrawerType.GetField("keyword", BindingFlags.Instance | BindingFlags.NonPublic);

        for (int i = 0; i < props.Length; i++)
        {
            string displayName = props[i].displayName;
            if (locale != null)
            {
                foreach (string key in locale.GetAllKeys())
                {
                    if (displayName.Contains("locale::" + key))
                    {
                        displayName = displayName.Replace("locale::" + key, locale.Get(key));
                    }
                }
            }
            displayName = Regex.Replace(displayName, @"''", "\"");

            if (labels.ContainsKey(props[i].name))
            {
                displayName = labels[props[i].name];
            }
            PropertyOptions options = ExtractExtraOptionsFromDisplayName(ref displayName);

            int offset = options.offset + headerCount;

            //Handle keywords
            object propertyHandler = getPropertyHandlerMethod.Invoke(null, new object[] { current.shader, props[i].name });
            //if has custom drawer
            if (propertyHandler != null)
            {
                object propertyDrawer = drawerProperty.GetValue(propertyHandler, null);
                //if custom drawer exists
                if (propertyDrawer != null)
                {
                    if (propertyDrawer.GetType().ToString() == "UnityEditor.MaterialToggleDrawer")
                    {
                        object keyword = keyWordField.GetValue(propertyDrawer);
                        if (keyword != null)
                        {
                            foreach (Material m in current.materials)
                            {
                                if (m.GetFloat(props[i].name) == 1)
                                {
                                    m.EnableKeyword((string)keyword);
                                }
                                else
                                {
                                    m.DisableKeyword((string)keyword);
                                }
                            }
                        }
                    }
                }
            }


            ThryPropertyType type = GetPropertyType(props[i], options);
            switch (type)
            {
            case ThryPropertyType.header:
                headerStack.Pop();
                break;

            case ThryPropertyType.header_start:
                offset = options.offset + ++headerCount;
                break;

            case ThryPropertyType.header_end:
                headerStack.Pop();
                headerCount--;
                break;

            case ThryPropertyType.on_swap_to:
                on_swap_to_actions = options.actions;
                break;
            }
            ShaderProperty newPorperty = null;
            ShaderPart     newPart     = null;
            switch (type)
            {
            case ThryPropertyType.master_label:
                masterLabelText = displayName;
                break;

            case ThryPropertyType.footer:
                footer.Add(Parser.ParseToObject <ButtonData>(displayName));
                break;

            case ThryPropertyType.header:
            case ThryPropertyType.header_start:
                ShaderHeader newHeader = new ShaderHeader(props[i], current.editor, displayName, offset, options);
                headerStack.Peek().addPart(newHeader);
                headerStack.Push(newHeader);
                HeaderHider.InitHidden(newHeader);
                newPart = newHeader;
                break;

            case ThryPropertyType.group_start:
                ShaderGroup new_group = new ShaderGroup(options);
                headerStack.Peek().addPart(new_group);
                headerStack.Push(new_group);
                newPart = new_group;
                break;

            case ThryPropertyType.group_end:
                headerStack.Pop();
                break;

            case ThryPropertyType.none:
            case ThryPropertyType.property:
                DrawingData.lastPropertyUsedCustomDrawer = false;
                current.editor.GetPropertyHeight(props[i]);
                bool forceOneLine = props[i].type == MaterialProperty.PropType.Vector && !DrawingData.lastPropertyUsedCustomDrawer;
                if (props[i].type == MaterialProperty.PropType.Texture)
                {
                    newPorperty = new TextureProperty(props[i], displayName, offset, options, props[i].flags.HasFlag(MaterialProperty.PropFlags.NoScaleOffset) == false, !DrawingData.lastPropertyUsedCustomDrawer);
                }
                else
                {
                    newPorperty = new ShaderProperty(props[i], displayName, offset, options, forceOneLine);
                }
                break;

            case ThryPropertyType.lightmap_flags:
                newPorperty = new GIProperty(props[i], displayName, offset, options, false);
                break;

            case ThryPropertyType.dsgi:
                newPorperty = new DSGIProperty(props[i], displayName, offset, options, false);
                break;

            case ThryPropertyType.instancing:
                newPorperty = new InstancingProperty(props[i], displayName, offset, options, false);
                break;

            case ThryPropertyType.locale:
                newPorperty = new LocaleProperty(props[i], displayName, offset, options, false);
                break;
            }
            if (newPorperty != null)
            {
                newPart = newPorperty;
                if (current.propertyDictionary.ContainsKey(props[i].name))
                {
                    continue;
                }
                current.propertyDictionary.Add(props[i].name, newPorperty);
                if (type != ThryPropertyType.none)
                {
                    headerStack.Peek().addPart(newPorperty);
                }
            }
            if (newPart != null)
            {
                current.shaderParts.Add(newPart);
            }
        }
    }