Ejemplo n.º 1
0
    // - 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);
            }
        }
    }
Ejemplo n.º 2
0
 // Generate planet mesh
 Mesh GenerateSphericalMesh(int gridSize, string side = "")
 {
     return(SphericalCubeGenerator.GetMesh(gridSize, side));
 }