Пример #1
0
    //=========================================================================
    public EchoPFX(string iergname, string ifxname)
    {
        int loop;

        erg = null;
        epe = null;

        if (iergname != null && ifxname != null)
        {
            if (ergList != null)
            {
                for (loop = 0; loop < ergList.Count; loop++)
                {
                    if (ergList[loop].name == iergname)
                    {
                        erg = ergList[loop];
                        break;
                    }
                }

                for (loop = 0; loop < erg.epeList.Count; loop++)
                {
                    if (erg.epeList[loop].name == ifxname)
                    {
                        epe = erg.epeList[loop];
                        break;
                    }
                }
                // look for special case shockwave option
                _passOpt[0] = epe.passOpt1;
                _passOpt[1] = epe.passOpt2;
            }
        }
    }
Пример #2
0
    //=========================================================================
    private int FindPassOptIndex(int ipass, EchoPFXRenderGroup ierg, ECHOPFXOPTION iopt)
    {
        if (ipass == 0)
        {
            for (int loop = 0; loop < ierg.possibleOpts1.Count; loop++)
            {
                if (ierg.possibleOpts1[loop].type == iopt)
                {
                    return(loop);
                }
            }
        }
        else
        {
            for (int loop = 0; loop < ierg.possibleOpts2.Count; loop++)
            {
                if (ierg.possibleOpts2[loop].type == iopt)
                {
                    return(loop);
                }
            }
        }

        return(-1);
    }
Пример #3
0
    //=========================================================================
    private void SetNewRenderGroup(EchoPFXRenderGroup ierg, bool iadd)
    {
        if (_erg != ierg)
        {
            _customOpt = null;
        }
        else
        {
            return;
        }

        _erg = ierg;

        if (iadd)
        {
            float highnum = -2;

            epfxm.ergList.Add(_erg);

            for (int loop = 0; loop < epfxm.ergList.Count; loop++)
            {
                if (epfxm.ergList[loop] != ierg)
                {
                    if (epfxm.ergList[loop].cameraDepthEnd > highnum)
                    {
                        highnum = epfxm.ergList[loop].cameraDepthEnd;
                    }
                }
            }

            highnum++;

            _erg.cameraDepthStart = highnum;
            _erg.cameraDepthEnd   = highnum + 1;
        }

        _ergIndex = epfxm.ergList.IndexOf(_erg);
        _epeIndex = 0;
    }
Пример #4
0
    //=========================================================================
    void OnEnable()
    {
        EchoPFXEffect epe;

        LoadPrefs();

        _customOpt = null;
        epfxm      = (EchoPFXManager)target;

        serializedObject.Update();
//		postFX.Update();

        if (epfxm.ergList.Count < 1)
        {
            SetNewRenderGroup(new EchoPFXRenderGroup(GetGroupID()), true);
        }

        if (_ergIndex < 0 || _ergIndex >= epfxm.ergList.Count)
        {
            _ergIndex = 0;
        }

        _erg = epfxm.ergList[_ergIndex];

        if (_epeIndex < 0 || _epeIndex >= _erg.epeList.Count)
        {
            if (_erg.epeList.Count < 1)
            {
                epe      = new EchoPFXEffect();
                epe.name = "New Effect";
                _erg.epeList.Add(epe);
                _epeIndex = _erg.epeList.IndexOf(epe);
            }
        }

        EditorApplication.playmodeStateChanged = AutoCompileShaders;

        //epfxm.UpdateAllRenderGroups();
    }
Пример #5
0
    //=========================================================================
    public int  ValidateOptions(EchoPFXRenderGroup ierg)
    {
        int total = 0;
        int loop;
        int pass;

        _erg = ierg;

        _passDict    = new Dictionary <ECHOPFXOPTION, EchoPFXOption> [2];
        _passDict[0] = _pass1Dict;
        _passDict[1] = _pass2Dict;

        passOpt[0] = passOpt1;
        passOpt[1] = passOpt2;

        optionsOff   = 0;
        optionsTotal = passOpt1.Count + passOpt2.Count;

        for (pass = 0; pass < 2; pass++)
        {
            for (loop = 0; loop < passOpt[pass].Count; loop++)
            {
                passOpt[pass][loop].passOrder = FindPassOptIndex(pass, _erg, passOpt[pass][loop].optType);
            }

            passOpt[pass].Sort(delegate(EchoPFXOption e1, EchoPFXOption e2)
            {
                return(e1.passOrder.CompareTo(e2.passOrder));
            });
        }

        _passDict[0].Clear();
        _passDict[1].Clear();

        for (pass = 0; pass < 2; pass++)
        {
            for (loop = 0; loop < passOpt[pass].Count; loop++)
            {
                _passDict[pass].Add(passOpt[pass][loop].optType, passOpt[pass][loop]);
            }
        }

        if (passActive == null || passActive.Length < 1)
        {
            passActive = new bool[2];
        }

        total = 0;
        if (passOpt[0].Count > 0)
        {
            passActive[0] = true;
            total++;
        }

        if (passOpt[1].Count > 0)
        {
            passActive[1] = true;
            total++;
        }

        if (total == 2)
        {
            _pass_low  = 0;
            _pass_high = 2;
        }
        else
        {
            if (passOpt[0].Count > 0)
            {
                _pass_low  = 0;
                _pass_high = 1;
            }
            else
            {
                _pass_low  = 1;
                _pass_high = 2;
            }
        }

        return(total);
    }
Пример #6
0
    //=========================================================================
    public void MyRenderGroupsGUI()
    {
        int loop;
        int delIndex = -1;
        EchoPFXRenderGroup erg;
        Color old_color = GUI.color;

        EditorGUILayout.Space();
        if (GUILayout.Button("Add Render Group"))
        {
            SetNewRenderGroup(new EchoPFXRenderGroup(GetGroupID()), true);
            epfxm.SortRenderGroups();
        }

        EditorGUILayout.Space();

        if (epfxm.ergList.Count < 1)
        {
            EditorGUILayout.Space();
            EditorGUILayout.LabelField("No Render Groups !");
            EditorGUILayout.Space();
            return;
        }

        for (loop = 0; loop < epfxm.ergList.Count; loop++)
        {
            erg = epfxm.ergList[loop];

            if (erg == null)
            {
                continue;
            }

            GUILayout.BeginHorizontal();

            if (loop == _ergIndex)
            {
                GUI.color = new Color(0.5f, 0.7f, 2.0f, 1.0f);
            }

            if (GUILayout.Button(erg.name))
            {
                EditorGUIUtility.systemCopyBuffer = erg.name;
                SetNewRenderGroup(erg, false);
                _curMode = 0;
            }

            GUI.color = old_color;

            if (GUILayout.Button("-", GUILayout.Width(32)))
            {
                _customOpt = null;
                delIndex   = loop;
            }

            GUILayout.EndHorizontal();
        }

        if (delIndex >= 0)
        {
            if (epfxm.ergList.Count > 0)
            {
                epfxm.ergList.RemoveAt(delIndex);

                _ergIndex--;

                if (_ergIndex < 0)
                {
                    _ergIndex = 0;
                    if (epfxm.ergList.Count < 1)
                    {
                        _erg = null;
                    }
                }
            }
            else
            {
                _erg      = null;
                _ergIndex = 0;
            }
        }
    }
Пример #7
0
        //============================================================
        private static EchoPFXRenderGroup LoadRenderGroup(XmlNode inode)
        {
            EchoPFXRenderGroup erg = new EchoPFXRenderGroup(_curID++);
            XmlNode            node;
            XmlNode            childNode;
            int           loop;
            ECHOPFXOPTION fxo;
            PossibleOpts  po;

            node = inode.FirstChild;

            erg.name             = inode["name"].InnerText;
            erg.id               = NodeParseInt(inode, "id");
            erg.passCount        = NodeParseInt(inode, "passCount");
            erg.active           = NodeParseBool(inode, "active");
            erg.cameraDepthStart = NodeParseFloat(inode, "cameraDepthStart");
            erg.cameraDepthEnd   = NodeParseFloat(inode, "cameraDepthEnd");
            erg.meshCellWidth    = NodeParseInt(inode, "meshCellWidth");
            erg.meshCellHeight   = NodeParseInt(inode, "meshCellHeight");
            erg.rtAdjustSize     = (ECHORTADJUST)NodeParseEnum(inode, "rtAdjustSize", typeof(ECHORTADJUST), (int)ECHORTADJUST.DEVICE_SIZE);
            erg.rtAdjustWidth    = NodeParseInt(inode, "rtAdjustWidth");
            erg.rtAdjustHeight   = NodeParseInt(inode, "rtAdjustHeight");

            erg.rtFilterMode    = new FilterMode[2];
            erg.rtFilterMode[0] = ( FilterMode )NodeParseEnum(inode, "rtFilterMode1", typeof(FilterMode), (int)FilterMode.Point);
            erg.rtFilterMode[1] = ( FilterMode )NodeParseEnum(inode, "rtFilterMode2", typeof(FilterMode), (int)FilterMode.Point);

            erg.rtBlendMode    = new ECHOPFXBLEND[2];
            erg.rtBlendMode[0] = ( ECHOPFXBLEND )NodeParseEnum(inode, "rtBlendMode1", typeof(ECHOPFXBLEND), (int)ECHOPFXBLEND.NORMAL);
            erg.rtBlendMode[1] = ( ECHOPFXBLEND )NodeParseEnum(inode, "rtBlendMode2", typeof(ECHOPFXBLEND), (int)ECHOPFXBLEND.NORMAL);


            node = inode["PossibleOpts1"];
            erg.possibleOpts1.Clear();
            for (loop = 0; loop < node.ChildNodes.Count; loop++)
            {
                childNode = node.ChildNodes[loop];

                fxo = ( ECHOPFXOPTION )NodeParseEnum(childNode["type"], typeof(ECHOPFXOPTION), (int)ECHOPFXOPTION.COUNT);
                if (fxo != ECHOPFXOPTION.COUNT)
                {
                    po            = new PossibleOpts(fxo, loop);
                    po.customCode = NodeParseString(childNode["code"]);
                    erg.possibleOpts1.Add(po);
                }
            }

            node = inode["PossibleOpts2"];
            erg.possibleOpts2.Clear();
            for (loop = 0; loop < node.ChildNodes.Count; loop++)
            {
                childNode = node.ChildNodes[loop];

                fxo = ( ECHOPFXOPTION )NodeParseEnum(childNode["type"], typeof(ECHOPFXOPTION), (int)ECHOPFXOPTION.COUNT);
                if (fxo != ECHOPFXOPTION.COUNT)
                {
                    po            = new PossibleOpts(fxo, loop);
                    po.customCode = NodeParseString(node.ChildNodes[loop]["code"]);
                    erg.possibleOpts2.Add(po);
                }
            }


            node = inode["Effects"];
            erg.epeList.Clear();
            for (loop = 0; loop < node.ChildNodes.Count; loop++)
            {
                erg.epeList.Add(LoadEffect(node.ChildNodes[loop]));
            }

            return(erg);
        }
Пример #8
0
        //============================================================
        public static void SaveRenderGroup(EchoPFXRenderGroup ierg, XmlElement iparent)
        {
            XmlElement   eleParent;
            XmlElement   ele;
            XmlElement   eleOpts;
            XmlElement   opar;
            PossibleOpts po;
            int          loop;

            eleParent = xfile.CreateElement("RenderGroup");
            iparent.AppendChild(eleParent);

            ele           = xfile.CreateElement("name");
            ele.InnerText = ierg.name;
            eleParent.AppendChild(ele);

            ele           = xfile.CreateElement("id");
            ele.InnerText = ierg.id.ToString();
            eleParent.AppendChild(ele);

            ele           = xfile.CreateElement("passCount");
            ele.InnerText = ierg.passCount.ToString();
            eleParent.AppendChild(ele);

            ele           = xfile.CreateElement("active");
            ele.InnerText = ierg.active.ToString();
            eleParent.AppendChild(ele);

            ele           = xfile.CreateElement("cameraDepthStart");
            ele.InnerText = ierg.cameraDepthStart.ToString();
            eleParent.AppendChild(ele);

            ele           = xfile.CreateElement("cameraDepthEnd");
            ele.InnerText = ierg.cameraDepthEnd.ToString();
            eleParent.AppendChild(ele);

            ele           = xfile.CreateElement("meshCellWidth");
            ele.InnerText = ierg.meshCellWidth.ToString();
            eleParent.AppendChild(ele);

            ele           = xfile.CreateElement("meshCellHeight");
            ele.InnerText = ierg.meshCellHeight.ToString();
            eleParent.AppendChild(ele);

            ele           = xfile.CreateElement("rtAdjustSize");
            ele.InnerText = ierg.rtAdjustSize.ToString();
            eleParent.AppendChild(ele);

            ele           = xfile.CreateElement("rtAdjustWidth");
            ele.InnerText = ierg.rtAdjustWidth.ToString();
            eleParent.AppendChild(ele);

            ele           = xfile.CreateElement("rtAdjustHeight");
            ele.InnerText = ierg.rtAdjustHeight.ToString();
            eleParent.AppendChild(ele);

            ele           = xfile.CreateElement("rtFilterMode1");
            ele.InnerText = ierg.rtFilterMode[0].ToString();
            eleParent.AppendChild(ele);

            ele           = xfile.CreateElement("rtFilterMode2");
            ele.InnerText = ierg.rtFilterMode[1].ToString();
            eleParent.AppendChild(ele);

            ele           = xfile.CreateElement("rtBlendMode1");
            ele.InnerText = ierg.rtBlendMode[0].ToString();
            eleParent.AppendChild(ele);

            ele           = xfile.CreateElement("rtBlendMode2");
            ele.InnerText = ierg.rtBlendMode[1].ToString();
            eleParent.AppendChild(ele);

            // possible options pass 1
            eleOpts = xfile.CreateElement("PossibleOpts1");
            eleParent.AppendChild(eleOpts);

            for (loop = 0; loop < ierg.possibleOpts1.Count; loop++)
            {
                po = ierg.possibleOpts1[loop];

                // parent
                opar = xfile.CreateElement("Option");
                eleOpts.AppendChild(opar);

                ele           = xfile.CreateElement("type");
                ele.InnerText = po.type.ToString();
                opar.AppendChild(ele);

                ele           = xfile.CreateElement("code");
                ele.InnerText = po.customCode;
                opar.AppendChild(ele);
            }

            // possible options pass 2
            eleOpts = xfile.CreateElement("PossibleOpts2");
            eleParent.AppendChild(eleOpts);

            for (loop = 0; loop < ierg.possibleOpts2.Count; loop++)
            {
                po = ierg.possibleOpts2[loop];

                // parent
                opar = xfile.CreateElement("Option");
                eleOpts.AppendChild(opar);

                ele           = xfile.CreateElement("type");
                ele.InnerText = po.type.ToString();
                opar.AppendChild(ele);

                ele           = xfile.CreateElement("code");
                ele.InnerText = po.customCode.ToString();
                opar.AppendChild(ele);
            }

            // save effects
            eleOpts = xfile.CreateElement("Effects");
            eleParent.AppendChild(eleOpts);

            for (loop = 0; loop < ierg.epeList.Count; loop++)
            {
                SaveEffect(ierg.epeList[loop], eleOpts);
            }
        }
Пример #9
0
    //=========================================================================
    public static void WriteFragOption(PossibleOpts ipo, EchoPFXRenderGroup ierg, int ipass)
    {
        switch (ipo.type)
        {
        case ECHOPFXOPTION.GREYSCALE:
            _final += _greyscale;
            break;

        case ECHOPFXOPTION.INVERSE:
            _final += _inverse;
            break;

        case ECHOPFXOPTION.COLOR:
            _final += _color;
            break;

        case ECHOPFXOPTION.ADD:
            _final += _add;
            break;

        case ECHOPFXOPTION.MULTIPLY:
            _final += _multiply;
            break;

        case ECHOPFXOPTION.NOISE:
            _final += _noise;
            break;

        case ECHOPFXOPTION.DISTORTION:
            break;

        case ECHOPFXOPTION.SHOCKWAVE:
            break;

        case ECHOPFXOPTION.SCANLINES:
            if (ipo.scanlines == ECHOPFXSCANLINES.HORIZONTAL || ipo.scanlines == ECHOPFXSCANLINES.BOTH)
            {
                _final += _scanlineh;
            }
            _final += "\n";
            if (ipo.scanlines == ECHOPFXSCANLINES.VERTICAL || ipo.scanlines == ECHOPFXSCANLINES.BOTH)
            {
                _final += _scanlinev;
            }
            break;

        case ECHOPFXOPTION.LUMRAMP:
            _final += _ramp;
            break;

        case ECHOPFXOPTION.COLOR_CORRECT:
            _final += _color_correct;
            break;

        case ECHOPFXOPTION.OVERLAY_NORMAL:
            _final += _overlay_lerp;
            break;

        case ECHOPFXOPTION.OVERLAY_SCREEN:
            _final += _overlay_screen;
            break;

        case ECHOPFXOPTION.OVERLAY_ADD:
            _final += _overlay_add;
            break;

        case ECHOPFXOPTION.OVERLAY_SUBTRACT:
            _final += _overlay_subtract;
            break;

        case ECHOPFXOPTION.OVERLAY_MULTIPLY:
            _final += _overlay_multiply;
            break;

        case ECHOPFXOPTION.OVERLAY_OVERLAY:
            _final += _overlay_overlay;
            break;

        case ECHOPFXOPTION.CUSTOM_FRAG_1:
            _final += "#ifdef ECHO_PFX_CUSTOM_FRAG_1_ON\n";
            _final += ParseCustomCode(ipo.type, ipo.customCode) + "\n";
            _final += "#endif\n";
            break;

        case ECHOPFXOPTION.CUSTOM_FRAG_2:
            _final += "#ifdef ECHO_PFX_CUSTOM_FRAG_2_ON\n";
            _final += ipo.customCode + "\n";
            _final += "#endif\n";
            break;

        case ECHOPFXOPTION.CUSTOM_FRAG_3:
            _final += "#ifdef ECHO_PFX_CUSTOM_FRAG_3_ON\n";
            _final += ipo.customCode + "\n";
            _final += "#endif\n";
            break;

        case ECHOPFXOPTION.CUSTOM_FRAG_4:
            _final += "#ifdef ECHO_PFX_CUSTOM_FRAG_4_ON\n";
            _final += ipo.customCode + "\n";
            _final += "#endif\n";
            break;
        }

        _final += "\n";
    }
Пример #10
0
    //=========================================================================
    public static void BuildRenderGroupShaders(EchoPFXRenderGroup ierg)
    {
        int    loop;
        int    pass;
        int    index;
        string line;

        List <PossibleOpts>[] po = new List <PossibleOpts> [2];
        string groupName;
        string passName;

        po[0] = ierg.possibleOpts1;
        po[1] = ierg.possibleOpts2;

        groupName = "group" + ierg.id + "_";

        for (pass = 0; pass < 2; pass++)
        {
            passName = "pass" + (pass + 1);

            _final = "";

            for (index = 0; index < _template.Length; index++)
            {
                line = _template[index].Trim();

                switch (line)
                {
                case "ECHO_SHADER_NAME:":
                    _final += "Shader \"echoLogin/PFX/echologin_postfx_" + groupName + passName + "\"" + "\n";
                    break;

                case "ECHO_BLEND_MODE:":
                    _final += rtBlendModes[(int)ierg.rtBlendMode[pass]] + "\n";
                    break;

                case "ECHO_KEYWORDS:":
                    for (loop = 0; loop < po[pass].Count; loop++)
                    {
                        WriteTCDefine(po[pass][loop]);
                    }

                    _final += "\n";

                    for (loop = 0; loop < po[pass].Count; loop++)
                    {
                        _final += "#pragma multi_compile ";
                        _final += EchoPFXRenderGroup._keywords[(int)po[pass][loop].type, 0] + " ";
                        _final += EchoPFXRenderGroup._keywords[(int)po[pass][loop].type, 1] + "\n";
                    }
                    break;

                case "ECHO_FRAG_INSERT:":
                    for (loop = 0; loop < po[pass].Count; loop++)
                    {
                        WriteFragOption(po[pass][loop], ierg, pass);
                    }
                    break;

                default:
                    _final += line + "\n";
                    break;
                }
            }

            SaveTextFile("echoLogin-postfx-" + groupName + passName + ".shader", _final);
        }
    }