Ejemplo n.º 1
0
    void MergeGrass(GameObject[] _grassesToMerge)
    {
        GameObject mergedMesh = new GameObject("MergedGrassGroup");
        Vector3    avgPos     = GetAvgPosOfObjs(_grassesToMerge);

        mergedMesh.transform.position = avgPos;
        //Merge objects to one mesh
        int count = _grassesToMerge.Length;

        MeshFilter[] meshFilters = new MeshFilter[count];
        for (int i = 0; i < count; i++)
        {
            meshFilters[i] = _grassesToMerge[i].transform.GetChild(0).GetComponent <MeshFilter>();
            _grassesToMerge[i].transform.position -= avgPos;
        }

        GeneratedMesh.CombineMeshes(mergedMesh.transform, meshFilters);

        /////////////////////////

        //AddLods
        mergedMesh.AddComponent <LODGroup>();
        LOD[]      lods      = new LOD[1];
        Renderer[] renderers = new Renderer[1];
        renderers[0] = mergedMesh.transform.GetChild(0).GetComponent <Renderer>();
        lods[0]      = new LOD(0.07f, renderers);

        mergedMesh.GetComponent <LODGroup>().SetLODs(lods);
        mergedMesh.GetComponent <LODGroup>().RecalculateBounds();
    }
Ejemplo n.º 2
0
    void MergeGrass()
    {
        //Merge objects to one mesh
        int count = generatedBranches.Length;

        MeshFilter[] meshFilters = new MeshFilter[count];
        for (int i = 0; i < count; i++)
        {
            meshFilters[i] = generatedBranches[i].GetComponent <MeshFilter>();
        }

        mergedMesh = GeneratedMesh.CombineMeshes(transform, meshFilters);
    }
Ejemplo n.º 3
0
    private void GenerateFood()
    {
        int count = 5;

        GeneratedLeaves[] food = new GeneratedLeaves[count];
        for (int i = 0; i < count; i++)
        {
            food[i] = Instantiate(VegetationGenerator.instance.generatedBushFoodPrefab, generatedLeaves.transform);
            food[i].transform.localPosition = generatedLeaves.GetComponent <MeshFilter>().mesh.vertices[Random.Range(0, generatedLeaves.GetComponent <MeshFilter>().mesh.vertexCount - 1)];
            food[i].Generate(0);
            food[i].transform.localScale = new Vector3(0.15f, 0.15f, 0.15f);
            food[i].VerySlowlyConvertToFlatShading();
        }

        //Merge food objects to one mesh
        count = food.Length;
        MeshFilter[] meshFilters = new MeshFilter[count];
        for (int i = 0; i < count; i++)
        {
            meshFilters[i] = food[i].GetComponent <MeshFilter>();
        }

        foodObject = GeneratedMesh.CombineMeshes(generatedLeaves.transform, meshFilters);
    }
Ejemplo n.º 4
0
    protected IEnumerator MergeChildTrees(float LOD0_Distance, float LOD1_Distance)
    {
        yield return(new WaitForEndOfFrame());

        List <Tree> treesToMerge = new List <Tree>();

        if (transform.parent && !transform.parent.GetComponent <Tree>())
        {
            treesToMerge.Add(this);
            for (int i = 0; i < transform.childCount; i++)
            {
                if (transform.GetChild(i).GetComponent <Tree>())
                {
                    treesToMerge.Add(transform.GetChild(i).GetComponent <Tree>());
                }
            }


            //Merge
            int count = treesToMerge.Count;
            if (count > 0)
            {
                List <MeshFilter> meshFiltersBranches = new List <MeshFilter>();
                List <MeshFilter> meshFiltersLeaves   = new List <MeshFilter>();

                List <MeshFilter> meshFiltersBranchesLOD = new List <MeshFilter>();
                List <MeshFilter> meshFiltersLeavesLOD   = new List <MeshFilter>();
                for (int i = 0; i < count; i++)
                {
                    meshFiltersBranches.Add(treesToMerge[i].generatedBranch.GetComponent <MeshFilter>());
                    meshFiltersBranches.AddRange(treesToMerge[i].generatedBranchesParent.GetComponentsInChildren <MeshFilter>());
                    meshFiltersLeaves.Add(treesToMerge[i].generatedLeaves.GetComponent <MeshFilter>());

                    meshFiltersBranchesLOD.Add(treesToMerge[i].generatedBranchLOD.GetComponent <MeshFilter>());
                    meshFiltersLeavesLOD.Add(treesToMerge[i].generatedLeavesLOD.GetComponent <MeshFilter>());
                }
                GameObject mergedBranches = GeneratedMesh.CombineMeshes(transform, meshFiltersBranches.ToArray());
                mergedBranches.AddComponent <GeneratedBranch>();
                mergedBranches.name = "Newly merged branches";
                generatedBranch     = mergedBranches.GetComponent <GeneratedBranch>();

                GameObject mergedLeaves = GeneratedMesh.CombineMeshes(transform, meshFiltersLeaves.ToArray());
                mergedLeaves.AddComponent <GeneratedLeaves>();
                mergedLeaves.name = "Newly merged leaves";
                generatedLeaves   = mergedLeaves.GetComponent <GeneratedLeaves>();

                //LOD
                GameObject mergedBranchesLOD = GeneratedMesh.CombineMeshes(transform, meshFiltersBranchesLOD.ToArray());
                mergedBranchesLOD.AddComponent <GeneratedBranch>();
                mergedBranchesLOD.name = "Newly merged branches LOD";
                generatedBranchLOD     = mergedBranchesLOD.GetComponent <GeneratedBranch>();

                GameObject mergedLeavesLOD = GeneratedMesh.CombineMeshes(transform, meshFiltersLeavesLOD.ToArray());
                mergedLeavesLOD.AddComponent <GeneratedLeaves>();
                mergedLeavesLOD.name = "Newly merged leaves LOD";
                generatedLeavesLOD   = mergedLeavesLOD.GetComponent <GeneratedLeaves>();
            }

            AddLODsNew(LOD0_Distance, LOD1_Distance);
        }
    }
Ejemplo n.º 5
0
    void CreateLeaves(int width, int leavesAmount)
    {
        float startPosY   = 1.5f;
        float startScale  = leavesAmount;
        int   leavesWidth = width;

        GeneratedCone[] generatedLeavesLOD0 = new GeneratedCone[leavesAmount];
        GeneratedCone   firstLeaves         = Instantiate(VegetationGenerator.instance.generatedConeLeavesPrefab, transform);

        firstLeaves.Generate(leavesWidth, 1, null);
        //firstLeaves.VerySlowlyConvertToFlatShading();
        firstLeaves.transform.localPosition = new Vector3(0, startPosY, 0);
        firstLeaves.transform.localScale   *= startScale;
        startScale             = 1 * 0.8f;
        generatedLeavesLOD0[0] = firstLeaves;
        firstLeaves.GetComponent <Renderer>().material.color = new Color(Random.Range(0.0f, 1.0f), Random.Range(0.7f, 1.0f), Random.Range(0.0f, 0.35f));

        //leaves1 = firstLeaves.gameObject;

        //Creating leaves for LOD0
        for (int i = 1; i < leavesAmount; i++)
        {
            GeneratedCone newLeaves = Instantiate(VegetationGenerator.instance.generatedConeLeavesPrefab, generatedLeavesLOD0[i - 1].transform /*transform*/);
            newLeaves.Generate(leavesWidth, 1, null);
            //newLeaves.VerySlowlyConvertToFlatShading();

            newLeaves.transform.localPosition = newLeaves.transform.up * 0.575f /*new Vector3(0,0,0)*/;
            newLeaves.transform.localScale    = new Vector3(1f, 1.25f, 1f) * startScale / firstLeaves.transform.parent.localScale.x;
            newLeaves.transform.localRotation = Quaternion.Euler(new Vector3(Random.Range(-5f, 5f), 0, Random.Range(-5f, 5f)));
            startScale            *= 0.9f;
            generatedLeavesLOD0[i] = newLeaves;
            newLeaves.GetComponent <Renderer>().material.color = firstLeaves.GetComponent <Renderer>().material.color;
        }

        //Creating leaves for LOD1
        GameObject[] generatedLeavesLOD1 = new GameObject[leavesAmount];
        int          count = generatedLeavesLOD0.Length;

        generatedLeavesLOD1[0] = CreateLODFromMesh(generatedLeavesLOD0[0].gameObject, 1);
        generatedLeavesLOD1[0].GetComponent <Renderer>().material.color = firstLeaves.GetComponent <Renderer>().material.color;
        for (int i = 1; i < count; i++)
        {
            generatedLeavesLOD1[i] = CreateLODFromMesh(generatedLeavesLOD0[i].gameObject, 1);
            generatedLeavesLOD1[i].transform.parent        = generatedLeavesLOD1[i - 1].transform;
            generatedLeavesLOD1[i].transform.localScale    = generatedLeavesLOD0[i].transform.localScale;
            generatedLeavesLOD1[i].transform.localRotation = generatedLeavesLOD0[i].transform.localRotation;
            generatedLeavesLOD1[i].GetComponent <Renderer>().material.color = firstLeaves.GetComponent <Renderer>().material.color;
        }

        //Making each leave flat-shaded
        for (int i = 0; i < count; i++)
        {
            generatedLeavesLOD0[i].GetComponent <GeneratedCone>().VerySlowlyConvertToFlatShading();
            generatedLeavesLOD1[i].GetComponent <GeneratedCone>().VerySlowlyConvertToFlatShading();
        }


        GameObject mergedLeavesLOD0;
        GameObject mergedLeavesLOD1;

        //Merge leaves objects to one mesh LOD0
        count = generatedLeavesLOD0.Length;
        MeshFilter[] meshFilters = new MeshFilter[count];
        for (int i = 0; i < count; i++)
        {
            meshFilters[i] = generatedLeavesLOD0[i].GetComponent <MeshFilter>();
        }
        mergedLeavesLOD0 = GeneratedMesh.CombineMeshes(transform, meshFilters);

        //Merge leaves objects to one mesh LOD1
        count       = generatedLeavesLOD0.Length;
        meshFilters = new MeshFilter[count];
        for (int i = 0; i < count; i++)
        {
            meshFilters[i] = generatedLeavesLOD1[i].GetComponent <MeshFilter>();
        }
        mergedLeavesLOD1 = GeneratedMesh.CombineMeshes(transform, meshFilters);


        AddLODs(0.105f, 0.025f, ref mergedLeavesLOD0, ref mergedLeavesLOD1);
    }