コード例 #1
0
        protected override Mesh DoProcessing(MeshSemplifierData data)
        {
            MeshSimplifier simplifier = new MeshSimplifier(data.mesh);

            simplifier.SimplifyMesh(data.Force);
            return(simplifier.ToMesh());
        }
コード例 #2
0
        public void SimplifyMesh(Transform t, float mean)
        {
            MeshSimplifier meshSimplifier = new MeshSimplifier();
            float          diff           = t.GetComponent <MeshFilter>().mesh.triangles.Length / mean;
            float          quality        = 2 / diff;
            Mesh           originalMesh;

            if (t.GetComponent <MeshFilter>().mesh.triangles.Length / mean >= 3)
            {
                originalMesh = t.gameObject.GetComponent <MeshFilter>().mesh;
                meshSimplifier.Initialize(originalMesh);
                meshSimplifier.SimplifyMesh(quality);
                Mesh destMesh = meshSimplifier.ToMesh();
                t.gameObject.GetComponent <MeshFilter>().mesh = destMesh;
            }
        }
コード例 #3
0
        IEnumerator Simplify(Mesh inputMesh, Mesh outputMesh, float quality)
        {
            var meshSimplifier = new MeshSimplifier();

            meshSimplifier.Vertices = inputMesh.vertices;
            meshSimplifier.Normals  = inputMesh.normals;
            meshSimplifier.Tangents = inputMesh.tangents;
            meshSimplifier.UV1      = inputMesh.uv;
            meshSimplifier.UV2      = inputMesh.uv2;
            meshSimplifier.UV3      = inputMesh.uv3;
            meshSimplifier.UV4      = inputMesh.uv4;
            meshSimplifier.Colors   = inputMesh.colors;

            var triangles = new int[inputMesh.subMeshCount][];

            for (var submesh = 0; submesh < inputMesh.subMeshCount; submesh++)
            {
                triangles[submesh] = inputMesh.GetTriangles(submesh);
            }

            meshSimplifier.AddSubMeshTriangles(triangles);

            meshSimplifier.SimplifyMesh(quality);

            outputMesh.vertices     = meshSimplifier.Vertices;
            outputMesh.normals      = meshSimplifier.Normals;
            outputMesh.tangents     = meshSimplifier.Tangents;
            outputMesh.uv           = meshSimplifier.UV1;
            outputMesh.uv2          = meshSimplifier.UV2;
            outputMesh.uv3          = meshSimplifier.UV3;
            outputMesh.uv4          = meshSimplifier.UV4;
            outputMesh.colors       = meshSimplifier.Colors;
            outputMesh.subMeshCount = meshSimplifier.SubMeshCount;
            for (var submesh = 0; submesh < outputMesh.subMeshCount; submesh++)
            {
                outputMesh.SetTriangles(meshSimplifier.GetSubMeshTriangles(submesh), submesh);
            }

            yield break;
        }
コード例 #4
0
    private void _generate_lod_versions(Mesh mesh, List <Mesh> list, int lod_count)
    {
        // The first instance in the LOD array is the default mesh.
        list.Add(mesh);

        // Initialize the mesh simplifier.
        MeshSimplifier simplifier = new MeshSimplifier();

        // Iterate through each LOD version.
        for (int i = 1; i < lod_count; i++)
        {
            // Initialize the mesh simplifier with the previous LOD version mesh.
            simplifier.Initialize(list[i - 1]);

            // Simplify by a given percentage (0.5 = 50% by default).
            simplifier.SimplifyMesh(0.5f);

            // Get the resulting mesh.
            Mesh destMesh = simplifier.ToMesh();

            // Set the resulting mesh to the current LOD version.
            list.Add(destMesh);
        }
    }
コード例 #5
0
    // before artwork starts, standardize all meshes to have the same number of triangles
    // * equal to the number of triangles in the least complex mesh
    public void PreprocessMeshes()
    {
        Mesh  conMesh      = constellationList.First().Value.GetComponentInChildren <MeshFilter>().sharedMesh;
        float minTriangles = conMesh.triangles.Length;

        // first, identify the mesh with the smallest number of triangles and get that number
        // float minTriangles = constellationList[0].GetComponent<MeshFilter>().sharedMesh.triangles.Length;

        foreach (GameObject c in constellationList.Values)
        {
            if (c.GetComponentInChildren <MeshFilter>().sharedMesh.triangles.Length < minTriangles)
            {
                minTriangles = c.GetComponentInChildren <MeshFilter>().sharedMesh.triangles.Length;
            }
        }

        // create Base folder for standardized meshes (1.0f quality)
        if (!Directory.Exists("Assets/Meshes/1.0"))
        {
            Directory.CreateDirectory("Assets/Meshes/1.0");
        }

        // next, standardize all meshes to have that number of triangles
        foreach (var c in constellationList)
        {
            float conTriangles = c.Value.GetComponentInChildren <MeshFilter>().sharedMesh.triangles.Length;
            float meshQuality  = minTriangles / conTriangles;

            // simplify the copy
            meshSimplifier.Initialize(c.Value.GetComponentInChildren <MeshFilter>().sharedMesh);
            meshSimplifier.SimplifyMesh(meshQuality);

            string conName = c.Value.name;

            // save base meshes to Assets/Meshes/1.0
            var savePathBase = "Assets/Meshes/1.0/" + conName + ".asset";
            Debug.Log("Saved base mesh to: " + savePathBase);
            AssetDatabase.CreateAsset(meshSimplifier.ToMesh(), savePathBase);

            // set constellation mesh to new base mesh
            c.Value.GetComponentInChildren <MeshFilter>().sharedMesh = AssetDatabase.LoadAssetAtPath <Mesh>(savePathBase);

            // Finally, create meshes at varying complexities so they don't have to be calculated in-game
            // NOTE: only creates new meshes if directory doesn't exist
            // >> i.e. if new constellations added, NEED TO RETHINK THIS
            for (float i = 0; i < 1.0; i += 0.1f)
            {
                // create folders for each complexity meshes
                if (!Directory.Exists("Assets/Meshes/" + i.ToString("F1")))
                {
                    Directory.CreateDirectory("Assets/Meshes/" + i.ToString("F1"));
                }

                // e.g. Assets/Meshes/0.1/Ursa.asset"
                var savePath = "Assets/Meshes/" + i.ToString("F1") + "/" + conName + ".asset";

                meshSimplifier.Initialize(c.Value.GetComponentInChildren <MeshFilter>().sharedMesh);
                meshSimplifier.SimplifyMesh(i);

                Debug.Log("Saved " + i.ToString("F1") + " quality mesh to: " + savePath);
                AssetDatabase.CreateAsset(meshSimplifier.ToMesh(), savePath);
            }
        }

        // save changes made
        AssetDatabase.SaveAssets();
    }