public void SetLodValues(LodObject lodObject, int index) { Debug.Log("SET VALUES " + index); world.lodInfo[index].SetValues( (int)lodObject.lodValue.value, int.Parse(lodObject.distance.text), lodObject.colliderToggle.isOn); world.Reset(); }
public LodObject CreateLodObject(LODInfo lodInfo, int index) { GameObject lodGameObject = Instantiate(lodLayoutPrefab, lodObjectsPanel); LodObject lodObject = lodGameObject.GetComponent <LodObject>(); lodObject.lodValue.value = lodInfo.Lod; lodObject.lodText.text = lodInfo.Lod.ToString(); lodObject.distance.text = lodInfo.Distance.ToString(); lodObject.colliderToggle.isOn = lodInfo.UseForCollider; lodObject.lodValue.onValueChanged.AddListener(delegate { SetLodValues(lodObject, index); }); lodObject.distance.onEndEdit.AddListener(delegate { SetLodValues(lodObject, index); }); lodObject.colliderToggle.onValueChanged.AddListener(delegate { SetLodValues(lodObject, index); }); lodObject.removeButton.onClick.AddListener(delegate { RemoveLod(lodInfo, index); }); return(lodObject); }
// - Sivujen/neljäsosien neljäsosat rekursiivisesti - void LODQuarters(string side, int lodIndex) { int i = lodIndex; bool nextLod = (i != lodsCount); // onko seuraavan tason lod tarkkuutta olemassa // Looppaa jokaisen neljäsosan läpi for (int quarter = 0; quarter < 4; ++quarter) { childName = side + quarter.ToString(); childArrayIndex = getArrayPosition(childName); lodObj = allChildObjs[childArrayIndex]; localPositionM = SphericalCubeGenerator.getMiddleVerticePosition(childName) * (planetData.planetSize); if (QualitySettings.CurrentLOD.LodsCount > (i + 1)) { removeDistanceClose = (QualitySettings.CurrentLOD.distance[(i + 1)]); // TODO: säädä näitä valueita } else { removeDistanceClose = 0; } removeDistanceFar = (QualitySettings.CurrentLOD.distance[(i)] + QualitySettings.CurrentLOD.distance[(i - 1)] * 5f); // TODO: säädä näitä valueita //Debug.DrawLine(myTransform.position + SphericalCubeGenerator.getLTopVerticePosition(childName) * (planetData.planetSize), player.transform.position, Color.red, 1f); if (!nextLod || ( Vector3.Distance(myTransform.position + localPositionM, player.transform.position) >= QualitySettings.CurrentLOD.distance[i] * planetData.planetSize && // Middle Vector3.Distance(myTransform.position + SphericalCubeGenerator.getLBottomVerticePosition(childName) * (planetData.planetSize), player.transform.position) >= QualitySettings.CurrentLOD.distance[i] * planetData.planetSize && // Left Bottom Vector3.Distance(myTransform.position + SphericalCubeGenerator.getRBottomVerticePosition(childName) * (planetData.planetSize), player.transform.position) >= QualitySettings.CurrentLOD.distance[i] * planetData.planetSize && // Right Bottom Vector3.Distance(myTransform.position + SphericalCubeGenerator.getLTopVerticePosition(childName) * (planetData.planetSize), player.transform.position) >= QualitySettings.CurrentLOD.distance[i] * planetData.planetSize && // Left Top Vector3.Distance(myTransform.position + SphericalCubeGenerator.getRTopVerticePosition(childName) * (planetData.planetSize), player.transform.position) >= QualitySettings.CurrentLOD.distance[i] * planetData.planetSize // Right Top )) // Jos on seuraavasta lodista kauempana niin aktivoi ittensä { if (lodObj == null || lodObj.GameObj == null) // Jos objektia ei ole niin generoi sen { System.Tuple <GameObject, List <RenderTexture> > planetChunk = planetData.GeneratePlanetChunk( QualitySettings.CurrentLOD.gridSize[i], myTransform.position, QualitySettings.CurrentLOD.hasHeight[i], QualitySettings.CurrentLOD.hasCollider[i], childName ); lodObj = new LodObject( childName, planetChunk.Item1, planetChunk.Item2, localPositionM, removeDistanceClose, removeDistanceFar, QualitySettings.LODSide.Quarter ); lodObj.GameObj.transform.parent = myTransform; allChildObjs[childArrayIndex] = lodObj; lodObjects.Add(lodObj); //StartCoroutine(SaveMesh(lodObj.GameObj.GetComponent<MeshFilter>())); } else { lodObj.GameObj.SetActive(true); } } else // Jos on tarkemman lodin jatkaa rekursiota { LODQuarters(childName, i + 1); } } }
// - Update - void Update() { #region [ - Atmosphere - ] if (planetData.hasAtmosphere) { planetData.atmosphere.Update(); if (Vector3.Distance(transform.position, player.position) > planetData.radius * 1.17f) { //if (Vector3.Distance(transform.position, player.position) > planetData.radius * 1.17f) { planetData.atmosphere.atmoFromSpaceTransform.gameObject.SetActive(true); planetData.atmosphere.atmoFromGroundTransform.gameObject.SetActive(false); } else { planetData.atmosphere.atmoFromSpaceTransform.gameObject.SetActive(false); planetData.atmosphere.atmoFromGroundTransform.gameObject.SetActive(true); } } #endregion #region [ - LOD - ] if (nextDistanceCheckTime > 0) { nextDistanceCheckTime -= Time.deltaTime; return; } nextDistanceCheckTime += CHECK_DISTANCE_EVERY; // Deaktivoi viimekerralla aktivoituneina olleet childit for (int i = lodObjects.Count - 1; i >= 0; --i) { lodObjects[i].GameObj.SetActive(false); pointA = myTransform.position + lodObjects[i].LocalPosition; //if (lodObjects[i].Name.Length > 1) { // Debug.DrawLine(pointA, pointA + (player.transform.position - pointA).normalized * planetData.planetSize * lodObjects[i].RemoveDistanceFar, Color.red, 0.1f); // TODO: säädä näitä valueita //} //Debug.DrawLine(pointA, pointA + (player.transform.position - pointA).normalized * (planetData.planetSize) * lodObjects[i].RemoveDistanceClose, Color.green, 0.1f); distanceToPlayer = Vector3.Distance(pointA, player.transform.position); distanceToClosePoint = Vector3.Distance(pointA, pointA + (player.transform.position - pointA).normalized * (planetData.planetSize) * lodObjects[i].RemoveDistanceClose); distanceToFarPoint = Vector3.Distance(pointA, pointA + (player.transform.position - pointA).normalized * planetData.planetSize * lodObjects[i].RemoveDistanceFar); if (distanceToClosePoint >= distanceToPlayer || distanceToFarPoint < distanceToPlayer) { lodObjects[i].unallocateRenderTextures(); Destroy(lodObjects[i].GameObj); lodObjects.RemoveAt(i); } } // Hillitön LOD koodi for (int i = 0; i < lodsCount; ++i) { if (QualitySettings.CurrentLOD.lodSide[i] == QualitySettings.LODSide.Quarter) { return; } // Jos on quarter niin lopettaa tähän koska !! kattoo quarterit sivujen ja quarterejen sisällä rekursiivisesti !! bool nextLod = (i != lodsCount); // onko seuraavan tason lod tarkkuutta olemassa switch (QualitySettings.CurrentLOD.lodSide[i]) { // - Planeetta kokonaisena - case QualitySettings.LODSide.Full: localPositionM = Vector3.zero; childName = "F" + QualitySettings.CurrentLOD.lod[i].ToString(); childArrayIndex = getArrayPosition(childName); lodObj = allChildObjs[childArrayIndex]; removeDistanceFar = 1 + QualitySettings.CurrentLOD.distance[(i)] * 10; // Jos on seuraavasta lodista kauempana niin aktivoi ittensä if (!nextLod || Vector3.Distance(player.position, myTransform.position) >= QualitySettings.CurrentLOD.distance[i] * planetData.planetSize) { if (lodObj == null) // Jos objektia ei ole niin generoi sen { System.Tuple <GameObject, List <RenderTexture> > planetChunk = planetData.GeneratePlanetChunk( QualitySettings.CurrentLOD.gridSize[i], myTransform.position, QualitySettings.CurrentLOD.hasHeight[i], QualitySettings.CurrentLOD.hasCollider[i], childName ); lodObj = new LodObject( childName, planetChunk.Item1, planetChunk.Item2, localPositionM, 0, removeDistanceFar, QualitySettings.LODSide.Full ); lodObj.GameObj.transform.parent = myTransform; allChildObjs[childArrayIndex] = lodObj; lodObjects.Add(lodObj); } else // Jos objekti on jo olemassa { lodObj.GameObj.SetActive(true); } return; } break; // - Joku kuudesta sivusta - case QualitySettings.LODSide.Side: // Looppaa jokaisen sivun läpi for (int side = 0; side < 6; ++side) { childName = side.ToString(); childArrayIndex = getArrayPosition(childName); lodObj = allChildObjs[childArrayIndex]; localPositionM = sidePositions[side]; if (QualitySettings.CurrentLOD.LodsCount > (i + 1)) { removeDistanceClose = (QualitySettings.CurrentLOD.distance[(i)] - QualitySettings.CurrentLOD.distance[(i + 1)]); } else { removeDistanceClose = 0; } removeDistanceFar = (QualitySettings.CurrentLOD.distance[(i)] + QualitySettings.CurrentLOD.distance[(i - 1)]); // Jos on seuraavasta lodista kauempana niin aktivoi ittensä if (!nextLod || Vector3.Distance(player.position, myTransform.position + sidePositions[side]) >= QualitySettings.CurrentLOD.distance[i] * planetData.planetSize) { if (lodObj == null || lodObj.GameObj == null) // Jos objektia ei ole niin generoi sen { System.Tuple <GameObject, List <RenderTexture> > planetChunk = planetData.GeneratePlanetChunk( QualitySettings.CurrentLOD.gridSize[i], myTransform.position, QualitySettings.CurrentLOD.hasHeight[i], QualitySettings.CurrentLOD.hasCollider[i], childName ); lodObj = new LodObject( childName, planetChunk.Item1, planetChunk.Item2, localPositionM, removeDistanceClose, removeDistanceFar, QualitySettings.LODSide.Side ); lodObj.GameObj.transform.parent = myTransform; allChildObjs[childArrayIndex] = lodObj; lodObjects.Add(lodObj); } else // Jos objekti on jo olemassa { lodObj.GameObj.SetActive(true); } } else // Jos on tarkemman lodin sisäpuolella niin quartereitten tarkistus { LODQuarters(childName, i + 1); } } return; } } #endregion }