private LOD_Info CreateLODInfo(MeshRenderer meshRenderer, int lodlevel) { Vector3 pos = meshRenderer.transform.position; pos /= cubeSize; if (pos.x != 0) { pos.x = Mathf.Floor(pos.x); } if (pos.y != 0) { pos.y = Mathf.Floor(pos.y); } if (pos.z != 0) { pos.z = Mathf.Floor(pos.z); } pos *= cubeSize; LOD_Info lodinfo = new LOD_Info(); lodinfo.pos = pos; lodinfo.lodlevel = lodlevel; lodinfo.rendr = meshRenderer; return(lodinfo); }
private LODGroup FindNearestLODGroup(List <LODGroup> LODGroupLists, LOD_Info lodinfo) { foreach (LODGroup lod in LODGroupLists) { if (ValueOnRange(lodinfo.pos.x, lod.transform.position.x - 1, lod.transform.position.x + 1)) { if (ValueOnRange(lodinfo.pos.y, lod.transform.position.y - 1, lod.transform.position.y + 1)) { if (ValueOnRange(lodinfo.pos.z, lod.transform.position.z - 1, lod.transform.position.z + 1)) { return(lod); } } } } return(null); }
public void AutoLOD() { allLODGroups_Created = GetComponentsInChildren <LODGroup>().ToList(); foreach (LODGroup lodgroup in allLODGroups_Created) { Vector3 pos = lodgroup.transform.position; pos /= cubeSize; print(pos); //Prevent rounding error pos.x = Mathf.Round(pos.x * 10) / 10; pos.y = Mathf.Round(pos.y * 10) / 10; pos.z = Mathf.Round(pos.z * 10) / 10; pos.x = Mathf.Floor(pos.x); pos.y = Mathf.Floor(pos.y); pos.z = Mathf.Floor(pos.z); print(pos); pos *= cubeSize; lodgroup.gameObject.name = "LODRegion - " + pos.ToString(); lodgroup.transform.SetAsFirstSibling(); lodgroup.transform.position = pos; print(pos); } List <LOD_Info> all_LODInfo = new List <LOD_Info>(); List <MeshRenderer> all_LOD0 = new List <MeshRenderer>(); List <MeshRenderer> all_LOD1 = new List <MeshRenderer>(); List <MeshRenderer> all_LOD2 = new List <MeshRenderer>(); all_LOD0 = GetComponentsInChildren <MeshRenderer>().Where(x => x.name.EndsWith("LOD0")).ToList(); all_LOD1 = GetComponentsInChildren <MeshRenderer>().Where(x => x.name.EndsWith("LOD1")).ToList(); all_LOD2 = GetComponentsInChildren <MeshRenderer>().Where(x => x.name.EndsWith("LOD2")).ToList(); foreach (MeshRenderer meshRenderer in all_LOD0) { LOD_Info lodinfo = CreateLODInfo(meshRenderer, 0); all_LODInfo.Add(lodinfo); } foreach (MeshRenderer meshRenderer in all_LOD1) { LOD_Info lodinfo = CreateLODInfo(meshRenderer, 1); all_LODInfo.Add(lodinfo); } foreach (MeshRenderer meshRenderer in all_LOD2) { LOD_Info lodinfo = CreateLODInfo(meshRenderer, 2); all_LODInfo.Add(lodinfo); } foreach (LOD_Info lodinfo in all_LODInfo) { LODGroup lodgroup = FindNearestLODGroup(allLODGroups_Created, lodinfo); if (lodgroup != null) { //This is empty } else { lodgroup = new GameObject().AddComponent <LODGroup>(); lodgroup.transform.parent = this.gameObject.transform; lodgroup.transform.position = lodinfo.pos; lodgroup.transform.SetAsFirstSibling(); allLODGroups_Created.Add(lodgroup); } if (lodgroup != null) { lodinfo.lodGroup = lodgroup; } } foreach (LODGroup lodgroup in allLODGroups_Created) { LOD_Info[] currentLODInfos = all_LODInfo.Where(x => x.lodGroup == lodgroup).ToArray(); List <LOD_Info> group_lod0 = currentLODInfos.Where(x => x.lodlevel == 0).ToList(); List <LOD_Info> group_lod1 = currentLODInfos.Where(x => x.lodlevel == 1).ToList(); List <LOD_Info> group_lod2 = currentLODInfos.Where(x => x.lodlevel == 2).ToList(); List <Renderer> renderers_LOD0 = new List <Renderer>(); List <Renderer> renderers_LOD1 = new List <Renderer>(); List <Renderer> renderers_LOD2 = new List <Renderer>(); foreach (LOD_Info lodinfo in group_lod0) { renderers_LOD0.Add(lodinfo.rendr); } foreach (LOD_Info lodinfo in group_lod1) { renderers_LOD1.Add(lodinfo.rendr); } foreach (LOD_Info lodinfo in group_lod2) { renderers_LOD2.Add(lodinfo.rendr); } List <LOD> lods = new List <LOD>(); LOD lod0 = new LOD(); LOD lod1 = new LOD(); LOD lod2 = new LOD(); lod0.renderers = renderers_LOD0.ToArray(); lod0.screenRelativeTransitionHeight = LOD0_Size; lod1.renderers = renderers_LOD1.ToArray(); lod1.screenRelativeTransitionHeight = LOD1_Size; lod2.renderers = renderers_LOD2.ToArray(); lod2.screenRelativeTransitionHeight = LOD2_Size; lods.Add(lod0); lods.Add(lod1); lods.Add(lod2); lodgroup.gameObject.name = "LODRegion - " + lodgroup.transform.position.ToString(); lodgroup.SetLODs(lods.ToArray()); lodgroup.size = LODSizeScreen; } }