/// <summary>
    /// 检测目标载体的正确性
    /// </summary>
    private void CheckTargetCorrectness()
    {
        if (m_TargetGameObject == null)
        {
            m_TargetErrorDef = TargetErrorDef.None;
            return;
        }
        MeshFilter mf = m_TargetGameObject.GetComponent <MeshFilter>();

        if (mf && mf.sharedMesh && UnlitWaterUtils.IsMeshFromModelFile(mf.sharedMesh))
        {
            m_TargetErrorDef = TargetErrorDef.MeshFromModel;
            return;
        }
        if (m_MeshGeneratorType != MeshGeneratorType.ModelFile)
        {
            if (mf && mf.sharedMesh)
            {
                m_TargetErrorDef = TargetErrorDef.WillReplaceMesh;
                return;
            }
        }
        else
        {
            if (!mf || !mf.sharedMesh)
            {
                m_TargetErrorDef = TargetErrorDef.NoMesh;
                return;
            }
        }
        m_TargetErrorDef = TargetErrorDef.None;
    }
 private void DrawPreview(Rect rect, Rect toolbar)
 {
     if (GUI.Button(new Rect(toolbar.x + 10, toolbar.y, 90, 15), "从文件加载深度图", GUIStyleCache.GetStyle("MiniToolBarButton")))
     {
         UnlitWaterUtils.LoadTexture(ref m_Texture);
     }
     if (GUI.Button(new Rect(toolbar.x + 100, toolbar.y, 90, 15), "保存深度图", GUIStyleCache.GetStyle("MiniToolBarButton")))
     {
         UnlitWaterUtils.SaveTexture(m_Texture);
     }
     if (m_Texture)
     {
         Rect previewRect = DrawPreviewTexture(rect);
         GUI.DrawTexture(previewRect, m_Texture);
     }
 }
    private void DrawMeshSetting(Rect rect)
    {
        bool guienable = GUI.enabled;

        GUI.enabled = guienable && m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.None;
        GUI.BeginGroup(new Rect(rect.x + 5, rect.y + 5, rect.width - 10, rect.height - 10));
        EditorGUI.BeginChangeCheck();
        m_TargetGameObject =
            EditorGUI.ObjectField(new Rect(0, 0, rect.width - 10, 17), "载体目标", m_TargetGameObject, typeof(GameObject), true) as
            GameObject;
        m_MeshGeneratorType = (MeshGeneratorType)EditorGUI.EnumPopup(new Rect(0, 20, rect.width - 10, 17), "Mesh生成器类型", m_MeshGeneratorType);
        if (EditorGUI.EndChangeCheck())
        {
            CheckTargetCorrectness();
            Vector2 size = default(Vector2);
            UnlitWaterUtils.CalculateAreaInfo(m_TargetGameObject, m_MeshGeneratorType != MeshGeneratorType.ModelFile, ref m_LocalCenter, ref size);
            m_MeshGeneratorFactory.SetSize(m_MeshGeneratorType, size);
        }


        GUI.Box(new Rect(3, 45, rect.width - 16, rect.height - 140), "", GUI.skin.FindStyle("WindowBackground"));

        GUILayout.BeginArea(new Rect(5, 48, rect.width - 20, rect.height - 146));

        if (meshGenerator != null)
        {
            meshGenerator.DrawGUI();
        }
        GUILayout.EndArea();


        if (m_TargetErrorDef != TargetErrorDef.None)
        {
            DrawTargetErrorHelpBox(new Rect(0, rect.height - 90, rect.width - 10, 80));
        }
        GUI.EndGroup();
    }
    private void DrawTargetErrorHelpBox(Rect rect)
    {
        switch (m_TargetErrorDef)
        {
        case TargetErrorDef.MeshFromModel:
            EditorGUI.HelpBox(rect, "提示,Mesh来自模型文件,需要生成拷贝Mesh!", MessageType.Info);
            if (GUI.Button(new Rect(rect.x + 30, rect.y + 30, rect.width - 60, 17), "生成拷贝"))
            {
                if (UnlitWaterUtils.CreateCopyMesh(m_TargetGameObject))
                {
                    CheckTargetCorrectness();
                }
            }
            break;

        case TargetErrorDef.NoMesh:
            EditorGUI.HelpBox(rect, "错误,目标对象没有MeshFilter或没有Mesh,请确认!", MessageType.Error);
            break;

        case TargetErrorDef.WillReplaceMesh:
            EditorGUI.HelpBox(rect, "提示,该目标对象已经存在Mesh,自动生成新Mesh将覆盖原Mesh!", MessageType.Info);
            break;
        }
    }
    private void DrawSetting(Rect rect)
    {
        bool guienable = true;

        GUI.enabled = (int)m_TargetErrorDef <= (int)TargetErrorDef.WillReplaceMesh && m_TargetGameObject && guienable && m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.None;
        GUI.BeginGroup(new Rect(rect.x + 5, rect.y + 5, rect.width - 10, rect.height - 10));

        GUI.Label(new Rect(0, 0, rect.width - 10, 17), "灯光");
        m_LightTransform =
            (Transform)
            EditorGUI.ObjectField(new Rect(0, 20, (rect.width - 10) * 0.8f, 17), "平行光", m_LightTransform, typeof(Transform),
                                  true);
        if (GUI.Button(new Rect((rect.width - 10) * 0.8f, 20, (rect.width - 10) * 0.2f, 17), "设置光照方向"))
        {
            if (m_LightTransform)
            {
                UnlitWaterUtils.BakeLightDir(m_TargetGameObject, m_LightTransform.forward);
            }
        }

        GUI.enabled = (int)m_TargetErrorDef <= (int)TargetErrorDef.WillReplaceMesh && m_TargetGameObject && guienable;

        GUI.Label(new Rect(0, 40, rect.width - 10, 17), "顶点绘制");


        GUI.Box(new Rect(5, 60, rect.width - 20, rect.height - 75), "", GUI.skin.FindStyle("WindowBackground"));

        GUILayout.BeginArea(new Rect(10, 65, rect.width - 30, rect.height - 85));

        GUILayout.Label("选择绘制通道");

        GUILayout.BeginHorizontal();
        EditorGUI.BeginChangeCheck();
        m_Painter.paintVertexChannel = GUILayout.Toggle(m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.None, "不绘制",
                                                        GUI.skin.FindStyle("ButtonLeft"))
            ? UnlitWaterPainter.Channel.None
            : m_Painter.paintVertexChannel;

        m_Painter.paintVertexChannel = GUILayout.Toggle(m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.R, "R:深度",
                                                        GUI.skin.FindStyle("ButtonMid"))
            ? UnlitWaterPainter.Channel.R
            : m_Painter.paintVertexChannel;

        m_Painter.paintVertexChannel = GUILayout.Toggle(m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.G, "G:浪花透明", GUI.skin.FindStyle("ButtonMid"))
            ? UnlitWaterPainter.Channel.G
            : m_Painter.paintVertexChannel;

        m_Painter.paintVertexChannel = GUILayout.Toggle(m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.B, "B:海浪波纹透明", GUI.skin.FindStyle("ButtonMid"))
            ? UnlitWaterPainter.Channel.B
            : m_Painter.paintVertexChannel;

        m_Painter.paintVertexChannel = GUILayout.Toggle(m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.A, "A:整体透明", GUI.skin.FindStyle("ButtonRight"))
            ? UnlitWaterPainter.Channel.A
            : m_Painter.paintVertexChannel;

        if (EditorGUI.EndChangeCheck())
        {
            m_Painter.ResetChannel();
        }

        GUILayout.EndHorizontal();

        m_Painter.paintVertexType =
            (UnlitWaterPainter.BrushType)
            EditorGUILayout.EnumPopup("笔刷类型", m_Painter.paintVertexType);

        m_Painter.paintVertexAlpha = EditorGUILayout.Slider("绘制强度", m_Painter.paintVertexAlpha, 0, 1);

        m_Painter.previewVertexColor = EditorGUILayout.Toggle("预览顶点色",
                                                              m_Painter.previewVertexColor);


        GUILayout.EndArea();

        GUI.EndGroup();
        GUI.enabled = guienable;
    }
    private void DrawBakeSetting(Rect rect)
    {
        bool guienable = GUI.enabled;

        GUI.enabled = guienable && m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.None;
        GUI.BeginGroup(new Rect(rect.x + 5, rect.y + 5, rect.width - 10, rect.height - 10));

        GUI.enabled = (int)m_TargetErrorDef <= (int)TargetErrorDef.WillReplaceMesh && m_TargetGameObject && m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.None && guienable;
        GUI.Label(new Rect(0, 0, position.width - 10, 17), "区域设置");
        m_MaxHeight = Mathf.Max(0,
                                EditorGUI.FloatField(new Rect(0, 20, rect.width - 10, 17),
                                                     new GUIContent("上方高度", EditorGUIUtility.FindTexture("console.erroricon.inactive.sml"), "调整上方高度直到超过所有物体"),
                                                     m_MaxHeight));
        m_MinHeight = Mathf.Max(0,
                                EditorGUI.FloatField(new Rect(0, 40, rect.width - 10, 17),
                                                     new GUIContent("下方高度", EditorGUIUtility.FindTexture("console.erroricon.inactive.sml"), "调整下方高度直到刚好超过水底最深处"),
                                                     m_MinHeight));

        GUI.enabled   = (int)m_TargetErrorDef <= (int)TargetErrorDef.WillReplaceMesh && m_TargetGameObject && m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.None && guienable && m_MeshGeneratorType == MeshGeneratorType.ModelFile;
        m_LocalCenter = EditorGUI.Vector2Field(new Rect(0, 60, rect.width - 10, 40),
                                               new GUIContent("位置偏移", EditorGUIUtility.FindTexture("console.erroricon.inactive.sml"), "调整渲染区域的坐标偏移"),
                                               m_LocalCenter);


        GUI.enabled = (int)m_TargetErrorDef <= (int)TargetErrorDef.WillReplaceMesh && m_TargetGameObject && m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.None && guienable;
        m_RotY      = EditorGUI.FloatField(new Rect(0, 100, rect.width - 10, 17),
                                           new GUIContent("Y轴旋转", EditorGUIUtility.FindTexture("console.erroricon.inactive.sml"), "调整渲染区域的Y轴旋转"),
                                           m_RotY);

        GUI.Label(new Rect(0, 120, position.width - 10, 17), "渲染设置");
        m_TextureRendererType = (TextureRendererType)EditorGUI.EnumPopup(new Rect(0, 140, rect.width - 10, 17), "贴图渲染器类型", m_TextureRendererType);


        GUILayout.BeginArea(new Rect(0, 160, rect.width - 10, rect.height - 160));

        TextureRenderer renderer = textureRenderer;

        if (renderer != null)
        {
            renderer.DrawGUI();
        }

        EditorGUILayout.Space();
        GUILayout.BeginHorizontal();
        if (GUILayout.Button("渲染", GUIStyleCache.GetStyle("ButtonLeft"), GUILayout.Width(rect.width * 0.5f - 5)))
        {
            if (renderer != null)
            {
                Vector2 size = m_MeshGeneratorFactory.GetSize(m_MeshGeneratorType);
                renderer.RenderDepthTexture(m_TargetGameObject, m_LocalCenter, size,
                                            Quaternion.Euler(90, m_RotY, 0), m_MaxHeight, m_MinHeight, ref m_Texture);
            }
        }
        GUI.enabled = m_Texture != null && m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.None && guienable;
        if (m_MeshGeneratorType != MeshGeneratorType.ModelFile)
        {
            if (GUILayout.Button("生成Mesh", GUIStyleCache.GetStyle("ButtonRight")))
            {
                UnlitWaterUtils.GenerateMesh(m_TargetGameObject, m_Texture, meshGenerator);
            }
        }
        else
        {
            if (GUILayout.Button("应用到顶点色", GUIStyleCache.GetStyle("ButtonRight")))
            {
                UnlitWaterUtils.ApplyToVertexColor(m_TargetGameObject, m_Texture, m_LocalCenter, m_MeshGeneratorFactory.GetSize(m_MeshGeneratorType), m_MinHeight, m_MaxHeight);
            }
        }
        GUILayout.EndHorizontal();

        GUI.enabled = guienable;

        GUILayout.EndArea();

        GUI.EndGroup();
    }
示例#7
0
    private void DrawBakeSetting(Rect rect)
    {
        bool guienable = GUI.enabled;

        GUI.enabled = guienable && m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.None;
        GUI.BeginGroup(new Rect(rect.x + 5, rect.y + 5, rect.width - 10, rect.height - 10));

        GUI.enabled = (int)m_TargetErrorDef <= (int)TargetErrorDef.WillReplaceMesh && m_TargetGameObject && m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.None && guienable;
        GUI.Label(new Rect(0, 0, position.width - 10, 17), "区域设置");
        m_MaxHeight = Mathf.Max(0,
                                EditorGUI.FloatField(new Rect(0, 20, rect.width - 10, 17),
                                                     new GUIContent("上方高度", EditorGUIUtility.FindTexture("console.erroricon.inactive.sml"), "调整上方高度直到超过所有物体"),
                                                     m_MaxHeight));
        m_MinHeight = Mathf.Max(0,
                                EditorGUI.FloatField(new Rect(0, 40, rect.width - 10, 17),
                                                     new GUIContent("下方高度", EditorGUIUtility.FindTexture("console.erroricon.inactive.sml"), "调整下方高度直到刚好超过水底最深处"),
                                                     m_MinHeight));

        GUI.enabled   = (int)m_TargetErrorDef <= (int)TargetErrorDef.WillReplaceMesh && m_TargetGameObject && m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.None && guienable && m_MeshGeneratorType == MeshGeneratorType.ModelFile;
        m_LocalCenter = EditorGUI.Vector2Field(new Rect(0, 60, rect.width - 10, 40),
                                               new GUIContent("位置偏移", EditorGUIUtility.FindTexture("console.erroricon.inactive.sml"), "调整渲染区域的坐标偏移"),
                                               m_LocalCenter);


        GUI.enabled = (int)m_TargetErrorDef <= (int)TargetErrorDef.WillReplaceMesh && m_TargetGameObject && m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.None && guienable;
        m_RotY      = EditorGUI.FloatField(new Rect(0, 100, rect.width - 10, 17),
                                           new GUIContent("Y轴旋转", EditorGUIUtility.FindTexture("console.erroricon.inactive.sml"), "调整渲染区域的Y轴旋转"),
                                           m_RotY);

        GUI.Label(new Rect(0, 120, position.width - 10, 17), "渲染设置");
        m_MaxDepth = Mathf.Max(0,
                               EditorGUI.FloatField(new Rect(0, 140, rect.width - 10, 17),
                                                    new GUIContent("最大深度范围", EditorGUIUtility.FindTexture("console.erroricon.inactive.sml"), "控制渲染的最大深度范围,默认为1"),
                                                    m_MaxDepth));
        m_DepthPower = Mathf.Max(0,
                                 EditorGUI.FloatField(new Rect(0, 160, rect.width - 10, 17),
                                                      new GUIContent("深度增强", EditorGUIUtility.FindTexture("console.erroricon.inactive.sml"), "控制渲染深度的效果增强或减弱,默认为1表示不增强"),
                                                      m_DepthPower));

        if (GUI.Button(new Rect(0, 220, (rect.width - 10) / 2, 16), "渲染", GUIStyleCache.GetStyle("ButtonLeft")))
        {
            Vector2 size = m_Factory.GetSize(m_MeshGeneratorType);
            UnlitWaterUtils.RenderDepthTexture(m_TargetGameObject, m_LocalCenter, size,
                                               Quaternion.Euler(90, m_RotY, 0), m_MaxHeight, m_MinHeight, m_MaxDepth, m_DepthPower, ref m_Texture);
        }
        GUI.enabled = m_Texture != null && m_Painter.paintVertexChannel == UnlitWaterPainter.Channel.None && guienable;
        if (m_MeshGeneratorType != MeshGeneratorType.ModelFile)
        {
            if (GUI.Button(new Rect((rect.width - 10) / 2, 220, (rect.width - 10) / 2, 16), "生成Mesh",
                           GUIStyleCache.GetStyle("ButtonRight")))
            {
                UnlitWaterUtils.GenerateMesh(m_TargetGameObject, m_Texture, meshGenerator);
            }
        }
        else
        {
            if (GUI.Button(new Rect((rect.width - 10) / 2, 220, (rect.width - 10) / 2, 16), "应用到顶点色",
                           GUIStyleCache.GetStyle("ButtonRight")))
            {
                UnlitWaterUtils.ApplyToVertexColor(m_TargetGameObject, m_Texture, m_LocalCenter, m_Factory.GetSize(m_MeshGeneratorType), m_MinHeight, m_MaxHeight);
            }
        }

        GUI.enabled = guienable;
        GUI.EndGroup();
    }