Example #1
0
    static void Cleanup(SAMeshColliderBuilder meshColliderBuilder)
    {
        if (meshColliderBuilder == null)
        {
            Debug.LogError("");
            return;
        }

        MeshFilter[]          meshFilters          = SAColliderBuilderEditorCommon.GetMeshFilters(meshColliderBuilder.gameObject);
        SkinnedMeshRenderer[] skinnedMeshRenderers = SAColliderBuilderEditorCommon.GetSkinnedMeshRenderers(meshColliderBuilder.gameObject);

        if ((meshFilters == null || meshFilters.Length == 0) && (skinnedMeshRenderers == null || skinnedMeshRenderers.Length == 0))
        {
            Debug.LogError("Nothing MeshFilter/SkinnedMeshRenderer. Skip Cleanuping.");
            return;
        }

        if (meshFilters != null)
        {
            foreach (MeshFilter meshFilter in meshFilters)
            {
                SAMeshColliderEditorCommon.CleanupChildSAMeshColliders(meshFilter.gameObject, meshColliderBuilder.cleanupModified);
            }
        }

        if (skinnedMeshRenderers != null)
        {
            foreach (SkinnedMeshRenderer skinnedMeshRenderer in skinnedMeshRenderers)
            {
                SAMeshColliderEditorCommon.CleanupChildSAMeshColliders(skinnedMeshRenderer.gameObject, meshColliderBuilder.cleanupModified);
            }
        }
    }
Example #2
0
    static void ProcessPolygon(
        List <ReducerTask> reducerTasks,
        MeshCache meshCache,
        SAMeshColliderBuilder meshColliderBuilder,
        GameObject parentGameObject,
        SplitMesh parentSplitMesh)
    {
        if (reducerTasks == null || meshCache == null || meshColliderBuilder == null || parentGameObject == null || parentSplitMesh == null)
        {
            Debug.LogError("");
            return;
        }

        if (!meshColliderBuilder.splitPolygonNormalEnabled)
        {
            return;
        }

        SplitMesh[] resplitMeshes = SAMeshColliderEditorCommon.MakeSplitMeshesByPolygon(meshCache, parentSplitMesh, meshColliderBuilder.splitPolygonNormalAngle);
        if (resplitMeshes == null || resplitMeshes.Length == 0)
        {
            return;
        }

        SAMeshCollider[] existingMeshColliders = SAMeshColliderEditorCommon.GetChildSAMeshColliders(parentGameObject);

        for (int i = 0; i < resplitMeshes.Length; ++i)
        {
            SplitMesh      resplitMesh          = resplitMeshes[i];
            SAMeshCollider existingMeshCollider = SAMeshColliderEditorCommon.FindSAMeshCollider(existingMeshColliders, resplitMesh);
            if (existingMeshCollider != null && existingMeshCollider.modified)
            {
                continue;                 // Not overwrite modified SAMeshCollider.
            }

            string         resplitMeshColliderName = SAMeshColliderEditorCommon.GetSAMeshColliderName_Polygon(i);
            SAMeshCollider resplitMeshCollider     = null;
            if (existingMeshCollider != null)
            {
                resplitMeshCollider = existingMeshCollider;
                SAMeshColliderEditorCommon.SetupSAMeshCollider(
                    meshColliderBuilder,
                    resplitMeshCollider,
                    resplitMeshColliderName);
                resplitMesh = resplitMeshCollider.splitMesh;
            }
            else
            {
                resplitMeshCollider = SAMeshColliderEditorCommon.CreateSAMeshCollider(
                    meshColliderBuilder,
                    parentGameObject,
                    resplitMeshColliderName,
                    resplitMesh,
                    SplitMode.Polygon);
            }

            SAMeshColliderEditorCommon.SalvageMeshByPolygon(resplitMesh);
            SAMeshColliderEditorCommon.RegistReducerTask(reducerTasks, resplitMeshCollider);
        }
    }
    static void SplitPolygon(List <ReducerTask> reducerTasks, MeshCache meshCache, SAMeshCollider parentMeshCollider, SAMeshCollider rootMeshCollider)
    {
        if (reducerTasks == null || meshCache == null || parentMeshCollider == null || rootMeshCollider == null)
        {
            Debug.LogError("");
            return;
        }

        SplitMesh parentSplitMesh = parentMeshCollider.splitMesh;

        if (parentSplitMesh == null)
        {
            Debug.LogError("");
            return;
        }

        SAMeshColliderEditorCommon.CleanupSelfSAMeshCollider(parentMeshCollider);

        SAMeshCollider[] existingMeshColliders = SAMeshColliderEditorCommon.GetChildSAMeshColliders(parentMeshCollider.gameObject);

        SplitMesh[] resplitMeshes = SAMeshColliderEditorCommon.MakeSplitMeshesByPolygon(meshCache, parentSplitMesh, rootMeshCollider.splitPolygonNormalAngle);

        if (resplitMeshes == null || resplitMeshes.Length == 0)
        {
            return;
        }

        for (int i = 0; i < resplitMeshes.Length; ++i)
        {
            SplitMesh      resplitMesh          = resplitMeshes[i];
            SAMeshCollider existingMeshCollider = SAMeshColliderEditorCommon.FindSAMeshCollider(existingMeshColliders, resplitMesh);
            if (existingMeshCollider != null && existingMeshCollider.modified)
            {
                continue;
            }

            string         resplitMeshColliderName = SAMeshColliderEditorCommon.GetSAMeshColliderName_Polygon(i);
            SAMeshCollider resplitMeshCollider     = null;
            if (existingMeshCollider != null)
            {
                resplitMeshCollider = existingMeshCollider;
                SAMeshColliderEditorCommon.SetupSAMeshCollider(
                    parentMeshCollider,
                    resplitMeshCollider,
                    resplitMeshColliderName);
                resplitMesh = resplitMeshCollider.splitMesh;
            }
            else
            {
                resplitMeshCollider = SAMeshColliderEditorCommon.CreateSAMeshCollider(
                    parentMeshCollider,
                    resplitMeshColliderName,
                    resplitMesh,
                    SplitMode.Polygon);
            }

            SAMeshColliderEditorCommon.SalvageMeshByPolygon(resplitMesh);
            SAMeshColliderEditorCommon.RegistReducerTask(reducerTasks, resplitMeshCollider);
        }
    }
    static void ProcessPrimitive(List <ReducerTask> reducerTasks, MeshCache meshCache, SAMeshCollider meshCollider)
    {
        if (reducerTasks == null || meshCache == null || meshCollider == null)
        {
            Debug.LogError("");
            return;
        }

        SplitMesh splitMesh = meshCollider.splitMesh;

        if (splitMesh == null)
        {
            Debug.LogError("");
            return;
        }

        SAMeshColliderEditorCommon.MarkManualProcessingToParent(meshCollider);

        if (meshCollider.splitPolygonNormalEnabled)
        {
            SAMeshColliderEditorCommon.MakeSplitMeshTriangles(meshCache, splitMesh);
            SplitPolygon(reducerTasks, meshCache, meshCollider, meshCollider);
        }
        else
        {
            SAMeshColliderEditorCommon.MakeSplitMeshTriangles(meshCache, splitMesh);
            SAMeshColliderEditorCommon.RegistReducerTask(reducerTasks, meshCollider);
        }
    }
Example #5
0
    static void Process(SAMeshCollider meshCollider)
    {
        if (meshCollider == null)
        {
            Debug.LogError("");
            return;
        }

        Cleanup(meshCollider);

        MeshCache meshCache = null;

        if (meshCollider.splitMode == SplitMode.None ||
            meshCollider.splitMode == SplitMode.Material ||
            meshCollider.splitMode == SplitMode.Primitive)
        {
            meshCache = SAMeshColliderEditorCommon.GetParentMeshCache(meshCollider);

            if (meshCache == null)
            {
                Debug.LogError("Mesh not found:" + meshCollider.name);
                return;
            }
        }

        List <ReducerTask> reducerTasks = new List <ReducerTask>();

        switch (meshCollider.splitMode)
        {
        case SplitMode.None:
            ProcessRoot(reducerTasks, meshCache, meshCollider);
            break;

        case SplitMode.Material:
            ProcessMaterial(reducerTasks, meshCache, meshCollider);
            break;

        case SplitMode.Primitive:
            ProcessPrimitive(reducerTasks, meshCache, meshCollider);
            break;

        case SplitMode.Polygon:
            ProcessPolygon(reducerTasks, meshCollider);
            break;
        }

        SAMeshColliderEditorCommon.Reduce(reducerTasks, meshCollider.isDebug);
    }
    static void Cleanup(SAMeshCollider meshCollider)
    {
        if (meshCollider == null)
        {
            Debug.LogError("");
            return;
        }

        SAMeshColliderEditorCommon.CleanupChildSAMeshColliders(
            meshCollider.gameObject,
            meshCollider.cleanupModified);

        SAMeshColliderEditorCommon.CleanupSelfSAMeshCollider(meshCollider);

        SAMeshColliderEditorCommon.MarkManualProcessingToParent(meshCollider);
    }
Example #7
0
    static void Process(SAMeshColliderBuilder meshColliderBuilder)
    {
        if (meshColliderBuilder == null)
        {
            Debug.LogError("");
            return;
        }

        MeshFilter[]          meshFilters          = SAColliderBuilderEditorCommon.GetMeshFilters(meshColliderBuilder.gameObject);
        SkinnedMeshRenderer[] skinnedMeshRenderers = SAColliderBuilderEditorCommon.GetSkinnedMeshRenderers(meshColliderBuilder.gameObject);

        if ((meshFilters == null || meshFilters.Length == 0) && (skinnedMeshRenderers == null || skinnedMeshRenderers.Length == 0))
        {
            Debug.LogError("Nothing MeshFilter/SkinnedMeshRenderer. Skip Processing.");
            return;
        }

        List <ReducerTask> reducerTasks = new List <ReducerTask>();

        if (meshFilters != null)
        {
            foreach (MeshFilter meshFilter in meshFilters)
            {
                Mesh       mesh      = SAColliderBuilderEditorCommon.GetMesh(meshFilter);
                Material[] materials = SAColliderBuilderEditorCommon.GetMaterials(meshFilter);
                MeshCache  meshCahce = new MeshCache(mesh, materials);
                SAMeshColliderEditorCommon.CleanupChildSAMeshColliders(meshFilter.gameObject, meshColliderBuilder.cleanupModified);
                ProcessRoot(reducerTasks, meshCahce, meshColliderBuilder, meshFilter.gameObject);
            }
        }

        if (skinnedMeshRenderers != null)
        {
            foreach (SkinnedMeshRenderer skinnedMeshRenderer in skinnedMeshRenderers)
            {
                Mesh       mesh      = SAColliderBuilderEditorCommon.GetMesh(skinnedMeshRenderer);
                Material[] materials = SAColliderBuilderEditorCommon.GetMaterials(skinnedMeshRenderer);
                MeshCache  meshCahce = new MeshCache(mesh, materials);
                SAMeshColliderEditorCommon.CleanupChildSAMeshColliders(skinnedMeshRenderer.gameObject, meshColliderBuilder.cleanupModified);
                ProcessRoot(reducerTasks, meshCahce, meshColliderBuilder, skinnedMeshRenderer.gameObject);
            }
        }

        SAMeshColliderEditorCommon.Reduce(reducerTasks, meshColliderBuilder.isDebug);
    }
    static void ProcessPolygon(List <ReducerTask> reducerTasks, SAMeshCollider meshCollider)
    {
        if (reducerTasks == null || meshCollider == null)
        {
            Debug.LogError("");
            return;
        }

        SplitMesh splitMesh = meshCollider.splitMesh;

        if (splitMesh == null)
        {
            Debug.LogError("");
            return;
        }

        SAMeshColliderEditorCommon.MarkManualProcessingToParent(meshCollider);

        SAMeshColliderEditorCommon.SalvageMeshByPolygon(splitMesh);
        SAMeshColliderEditorCommon.RegistReducerTask(reducerTasks, meshCollider);
    }
Example #9
0
    static void ProcessMaterial(
        List <ReducerTask> reducerTasks,
        MeshCache meshCache,
        SAMeshColliderBuilder meshColliderBuilder,
        GameObject parentGameObject)
    {
        if (reducerTasks == null || meshCache == null || meshColliderBuilder == null || parentGameObject == null)
        {
            Debug.LogError("");
            return;
        }

        SplitMesh[] resplitMeshes = SAMeshColliderEditorCommon.MakeSplitMeshesByMaterial(meshCache);
        if (resplitMeshes == null || resplitMeshes.Length == 0)
        {
            return;
        }

        SAMeshCollider[] existingMeshColliders = SAMeshColliderEditorCommon.GetChildSAMeshColliders(parentGameObject);

        Material[] materials = meshCache.materials;

        for (int i = 0; i < resplitMeshes.Length; ++i)
        {
            SplitMesh      resplitMesh          = resplitMeshes[i];
            SAMeshCollider existingMeshCollider = SAMeshColliderEditorCommon.FindSAMeshCollider(existingMeshColliders, resplitMesh);
            if (existingMeshCollider != null && existingMeshCollider.modified)
            {
                continue;                 // Not overwrite modified SAMeshCollider.
            }

            string         resplitMeshColliderName = SAMeshColliderEditorCommon.GetSAMeshColliderName_Material(materials, i);
            SAMeshCollider resplitMeshCollider     = null;
            if (existingMeshCollider != null)
            {
                resplitMeshCollider = existingMeshCollider;
                SAMeshColliderEditorCommon.SetupSAMeshCollider(
                    meshColliderBuilder,
                    resplitMeshCollider,
                    resplitMeshColliderName);
                resplitMesh = resplitMeshCollider.splitMesh;
            }
            else
            {
                resplitMeshCollider = SAMeshColliderEditorCommon.CreateSAMeshCollider(
                    meshColliderBuilder,
                    parentGameObject,
                    resplitMeshColliderName,
                    resplitMesh,
                    SplitMode.Material);
            }

            if (resplitMeshCollider.splitPrimitiveEnabled)
            {
                ProcessPrimitive(reducerTasks, meshCache, meshColliderBuilder, resplitMeshCollider.gameObject, resplitMeshCollider.splitMesh);
            }
            else if (resplitMeshCollider.splitPolygonNormalEnabled)
            {
                SAMeshColliderEditorCommon.MakeSplitMeshTriangles(meshCache, resplitMesh);
                ProcessPolygon(reducerTasks, meshCache, meshColliderBuilder, resplitMeshCollider.gameObject, resplitMeshCollider.splitMesh);
            }
            else
            {
                SAMeshColliderEditorCommon.MakeSplitMeshTriangles(meshCache, resplitMesh);
                SAMeshColliderEditorCommon.RegistReducerTask(reducerTasks, resplitMeshCollider);
            }
        }
    }
Example #10
0
    static void ProcessRoot(
        List <ReducerTask> reducerTasks,
        MeshCache meshCache,
        SAMeshColliderBuilder meshColliderBuilder,
        GameObject parentGameObject)
    {
        if (reducerTasks == null || meshCache == null || meshColliderBuilder == null || parentGameObject == null)
        {
            Debug.LogError("");
            return;
        }

        SplitMesh resplitMesh = SAMeshColliderEditorCommon.MakeRootSplitMesh(meshCache);

        if (resplitMesh == null)
        {
            return;
        }

        if (meshColliderBuilder.splitMaterialEnabled)
        {
            ProcessMaterial(reducerTasks, meshCache, meshColliderBuilder, parentGameObject);
        }
        else if (meshColliderBuilder.splitPrimitiveEnabled)
        {
            ProcessPrimitive(reducerTasks, meshCache, meshColliderBuilder, parentGameObject, resplitMesh);
        }
        else if (meshColliderBuilder.splitPolygonNormalEnabled)
        {
            SAMeshColliderEditorCommon.MakeSplitMeshTriangles(meshCache, resplitMesh);
            ProcessPolygon(reducerTasks, meshCache, meshColliderBuilder, parentGameObject, resplitMesh);
        }
        else
        {
            SAMeshCollider[] existingMeshColliders = SAMeshColliderEditorCommon.GetChildSAMeshColliders(parentGameObject);
            SAMeshCollider   existingMeshCollider  = SAMeshColliderEditorCommon.FindSAMeshCollider(existingMeshColliders, resplitMesh);
            if (existingMeshCollider != null && existingMeshCollider.modified)
            {
                return;                 // Not overwrite modified SAMeshCollider.
            }

            string         resplitMeshColliderName = SAMeshColliderEditorCommon.GetSAMeshColliderName_Root(parentGameObject);
            SAMeshCollider resplitMeshCollider     = null;
            if (existingMeshCollider != null)
            {
                resplitMeshCollider = existingMeshCollider;
                SAMeshColliderEditorCommon.SetupSAMeshCollider(
                    meshColliderBuilder,
                    resplitMeshCollider,
                    resplitMeshColliderName);
                resplitMesh = resplitMeshCollider.splitMesh;
            }
            else
            {
                resplitMeshCollider = SAMeshColliderEditorCommon.CreateSAMeshCollider(
                    meshColliderBuilder,
                    parentGameObject,
                    resplitMeshColliderName,
                    resplitMesh,
                    SplitMode.None);
            }

            SAMeshColliderEditorCommon.MakeSplitMeshTriangles(meshCache, resplitMesh);
            SAMeshColliderEditorCommon.RegistReducerTask(reducerTasks, resplitMeshCollider);
        }
    }
    public override void OnInspectorGUI()
    {
        SAMeshCollider meshCollider = (SAMeshCollider)target;

        if (meshCollider.edittingMeshCollidertProperty == null)
        {
            if (meshCollider.meshColliderProperty != null)
            {
                meshCollider.edittingMeshCollidertProperty = meshCollider.meshColliderProperty.Copy();
            }
        }
        SAMeshColliderProperty meshColliderProperty = meshCollider.edittingMeshCollidertProperty;

        if (meshColliderProperty != null)
        {
            SplitProperty splitProperty = meshColliderProperty.splitProperty;
            if (splitProperty != null)
            {
                GUILayout.Label("Split", EditorStyles.boldLabel);
                // Split Material
                GUI.enabled = ((int)meshCollider.splitMode <= (int)SplitMode.None);
                splitProperty.splitMaterialEnabled = EditorGUILayout.Toggle("Split Material", splitProperty.splitMaterialEnabled);
                GUI.enabled = true;
                // Split Primitive
                GUI.enabled = ((int)meshCollider.splitMode <= (int)SplitMode.Material);
                splitProperty.splitPrimitiveEnabled = EditorGUILayout.Toggle("Split Primitive", splitProperty.splitPrimitiveEnabled);
                GUI.enabled = true;
                // Split Polygon Normal
                EditorGUILayout.BeginHorizontal();
                GUI.enabled = ((int)meshCollider.splitMode <= (int)SplitMode.Primitive);
                splitProperty.splitPolygonNormalEnabled = EditorGUILayout.Toggle("Split Polygon Normal", splitProperty.splitPolygonNormalEnabled);
                GUI.enabled = GUI.enabled && meshCollider.splitPolygonNormalEnabled;
                splitProperty.splitPolygonNormalAngle = EditorGUILayout.Slider(splitProperty.splitPolygonNormalAngle, 0.0f, 180.0f);
                GUI.enabled = true;
                EditorGUILayout.EndHorizontal();
            }

            EditorGUILayout.Separator();
            GUILayout.Label("Reducer", EditorStyles.boldLabel);
            SAColliderBuilderEditorCommon.ReducerInspectorGUI(meshColliderProperty.reducerProperty, ReducerOption.Advanced);

            GUI.enabled = meshColliderProperty.reducerProperty.shapeType != ShapeType.None;
            EditorGUILayout.Separator();
            GUILayout.Label("Collider", EditorStyles.boldLabel);
            SAColliderBuilderEditorCommon.ColliderInspectorGUI(meshColliderProperty.colliderProperty, ColliderOption.None);
            EditorGUILayout.Separator();
            GUILayout.Label("Rigidbody", EditorStyles.boldLabel);
            SAColliderBuilderEditorCommon.RigidbodyInspectorGUI(meshColliderProperty.rigidbodyProperty);
            GUI.enabled = true;
        }

        EditorGUILayout.Separator();
        meshCollider.cleanupModified = EditorGUILayout.Toggle("Cleanup Modified", meshCollider.cleanupModified);
        meshCollider.isDebug         = EditorGUILayout.Toggle("Is Debug", meshCollider.isDebug);

        EditorGUILayout.Separator();

        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("Set Default"))
        {
            if (meshCollider.defaultMeshColliderProperty != null)
            {
                float beginTime = Time.realtimeSinceStartup;
                meshCollider.meshColliderProperty          = meshCollider.defaultMeshColliderProperty.Copy();
                meshCollider.edittingMeshCollidertProperty = null;
                Process(meshCollider);
                meshCollider.cleanupModified = false;
                SAMeshColliderEditorCommon.UnmarkManualProcessingToParent(meshCollider);
                meshCollider.ResetModifyName();
                float endTime = Time.realtimeSinceStartup;
                Debug.Log("Processed.[" + (endTime - beginTime) + " sec]");
            }
        }
        GUILayout.FlexibleSpace();
        if (GUILayout.Button("Revert"))
        {
            meshCollider.edittingMeshCollidertProperty = null;
        }
        if (GUILayout.Button("Cleanup"))
        {
            if (meshCollider.edittingMeshCollidertProperty != null)
            {
                meshCollider.meshColliderProperty          = meshCollider.edittingMeshCollidertProperty;
                meshCollider.edittingMeshCollidertProperty = null;
                Cleanup(meshCollider);
                meshCollider.cleanupModified = false;
                meshCollider.isDebug         = false;
                Debug.Log("Cleanuped.");
            }
        }
        if (GUILayout.Button("Process"))
        {
            if (meshCollider.edittingMeshCollidertProperty != null)
            {
                float beginTime = Time.realtimeSinceStartup;
                meshCollider.meshColliderProperty          = meshCollider.edittingMeshCollidertProperty;
                meshCollider.edittingMeshCollidertProperty = null;
                Process(meshCollider);
                meshCollider.cleanupModified = false;
                meshCollider.isDebug         = false;
                float endTime = Time.realtimeSinceStartup;
                Debug.Log("Processed.[" + (endTime - beginTime) + " sec]");
            }
        }
        EditorGUILayout.EndHorizontal();
    }