コード例 #1
0
    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();
    }
コード例 #2
0
    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);
    }
コード例 #3
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);
            }
        }
    }
コード例 #4
0
    // - 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
    }