예제 #1
0
        private void Execute()
        {
            //playerPos = playerTrans.position;
            float dis = MathExtra.FastSqrt(playerTrans.position.sqrMagnitude);

            playerPos = playerTrans.position / dis * Mathf.Max((dis - activePlanet.sphereRadius * activePlanet.heightScale), activePlanet.sphereRadius);
            for (int i = 0; i < activePlanet.quadList.Count; i++)
            {
                activeTerrain = activePlanet.quadList[i];
                activeTerrain.Execute();
                activeTerrain.TryGenerateBorder();
                activeTerrain.CalculateMesh();
                activeTerrain.UpdateMesh();
            }
        }
예제 #2
0
        public void Init(QTNode parent, int quadrantID)
        {
            QTTerrain activeTerrain = QTManager.Instance.activeTerrain;
            QTPlanet  activePlanet  = QTManager.Instance.activePlanet;

            this.parent     = parent;
            lodLevel        = parent.lodLevel - 1;
            this.quadrantID = quadrantID;
            length          = parent.length * 0.5f;
            float offSet = length * 0.5f;

            center = new Vector3(parent.center.x + ((quadrantID == 0 || quadrantID == 3) ? offSet : -offSet), parent.center.y,
                                 parent.center.z + ((quadrantID == 0 || quadrantID == 1) ? offSet : -offSet));
            sphereCenter = MathExtra.FastNormalize(center) * activePlanet.sphereRadius;
            sphereLength = activePlanet.lengthArray[this.lodLevel];
            if (parent.borderStatus != BorderStatus.NotBorder)
            {
                if (((parent.borderStatus & BorderStatus.UpBorder) == BorderStatus.UpBorder) && (quadrantID == 0 || quadrantID == 1))
                {
                    borderStatus &= BorderStatus.UpBorder;
                }
                if (((parent.borderStatus & BorderStatus.RightBorder) == BorderStatus.RightBorder) && (quadrantID == 0 || quadrantID == 3))
                {
                    borderStatus &= BorderStatus.RightBorder;
                }
                if (((parent.borderStatus & BorderStatus.DownBorder) == BorderStatus.DownBorder) && (quadrantID == 2 || quadrantID == 3))
                {
                    borderStatus &= BorderStatus.DownBorder;
                }
                if (((parent.borderStatus & BorderStatus.LeftBorder) == BorderStatus.LeftBorder) && (quadrantID == 1 || quadrantID == 2))
                {
                    borderStatus &= BorderStatus.LeftBorder;
                }
            }
            fullGenerateWidth  = ((parent.fullGenerateWidth - 1) >> 1) + 1;
            fullGenerateOffset = fullGenerateWidth - 1;
            switch (quadrantID)
            {
            case 0:
                fullGenerateOrigin = parent.fullGenerateOrigin + new Vector2(fullGenerateOffset, fullGenerateOffset);
                break;

            case 1:
                fullGenerateOrigin = parent.fullGenerateOrigin + new Vector2(0, fullGenerateOffset);
                break;

            case 2:
                fullGenerateOrigin = parent.fullGenerateOrigin;
                break;

            case 3:
                fullGenerateOrigin = parent.fullGenerateOrigin + new Vector2(this.fullGenerateOffset, 0);
                break;
            }
            //terrainCenter = sphereCenter*(1f+activeTerrain.heightMap[activePlanet.vectorToHeightMapTable[         (int)((fullGenerateOrigin.x+(int)(fullGenerateOffset/2f))*activePlanet.mapScale),
            //	(int)((fullGenerateOrigin.y+(int)(fullGenerateOffset/2f))*activePlanet.mapScale)    ]]*activePlanet.heightScale);
            //terrainCenter = activeTerrain.transform.TransformPoint(terrainCenter);
            sphereCenter        = activeTerrain.transform.TransformPoint(sphereCenter);
            fullGenerateOffset /= activePlanet.splitCount;
            activeTerrain.allNodeListArray [lodLevel].Add(this);
            CheckForLOD();
        }