public static void UpdateBounds(HLOD hlod)
    {
        var    renderers = hlod.GetComponentsInChildren <Renderer>();
        Bounds bounds    = renderers[0].bounds;

        for (int i = 0; i != renderers.Length; i++)
        {
            bounds.Encapsulate(renderers[i].bounds);
        }

        var lodgroup = hlod.GetComponent <LODGroup>();

        lodgroup.size = bounds.size.magnitude;
        lodgroup.localReferencePoint = lodgroup.transform.InverseTransformPoint(bounds.center);
    }
Esempio n. 2
0
 public void HlodControllerIsNotNull()
 {
     Assert.NotNull(hlod.GetComponent <HLODControllerBase>());
 }
Esempio n. 3
0
 public void ComponentTest()
 {
     Assert.NotNull(m_hlodGameObject);
     Assert.NotNull(m_hlod);
     Assert.NotNull(m_hlod.GetComponent <AddressableHLODController>());
 }
    public static void GenerateCombinedMesh(HLOD hlod, Transform sourceLOD, Transform generatedLOD, int lodIndex, List <Mesh> generatedMeshes)
    {
        const float fieldOfView  = 60.0F;
        const float distanceBias = 0.0F;

        var instances          = new Dictionary <Material, List <CombineInstance> >();
        var lodGroups          = sourceLOD.GetComponentsInChildren <LODGroup>();
        var hlodSwitchDistance = LODGroupExtensions.CalculateLODSwitchDistance(fieldOfView, hlod.GetComponent <LODGroup>(), lodIndex - 1);

        foreach (var group in lodGroups)
        {
            float cullingDistance = LODGroupExtensions.CalculateLODSwitchDistance(fieldOfView, group, group.lodCount - 1);

            if (cullingDistance + distanceBias < hlodSwitchDistance)
            {
                continue;
            }

            var renderers = group.GetLODs()[group.lodCount - 1].renderers;

            foreach (var renderer in renderers)
            {
                var meshRenderer = renderer as MeshRenderer;
                if (meshRenderer == null)
                {
                    continue;
                }

                var instance = new CombineInstance();
                instance.transform = generatedLOD.worldToLocalMatrix * renderer.transform.localToWorldMatrix;

                var materials = meshRenderer.sharedMaterials;
                for (int m = 0; m != materials.Length; m++)
                {
                    if (!instances.ContainsKey(materials[m]))
                    {
                        instances[materials[m]] = new List <CombineInstance>();
                    }
                    instance.mesh         = meshRenderer.GetComponent <MeshFilter>().sharedMesh;
                    instance.subMeshIndex = m;
                    instances[materials[m]].Add(instance);
                }
            }
        }

        while (generatedLOD.childCount != 0)
        {
            Object.DestroyImmediate(generatedLOD.GetChild(0).gameObject);
        }

        var generatedRenderers = new List <Renderer>();

        foreach (var instance in instances)
        {
            var mesh = new Mesh();
            mesh.name = "CombinedLowLOD";
            mesh.CombineMeshes(instance.Value.ToArray(), true, true, false);
            var go = new GameObject("CombinedLowLOD", typeof(MeshRenderer), typeof(MeshFilter));
            go.GetComponent <MeshFilter>().sharedMesh       = mesh;
            go.GetComponent <MeshRenderer>().sharedMaterial = instance.Key;

            generatedRenderers.Add(go.GetComponent <MeshRenderer>());
            generatedMeshes.Add(mesh);

            go.transform.SetParent(generatedLOD, false);
        }

        var lodGroup = generatedLOD.GetComponent <LODGroup>();
        var lods     = lodGroup.GetLODs();

        lods[0].renderers = generatedRenderers.ToArray();
        lodGroup.SetLODs(lods);
    }