コード例 #1
0
ファイル: TerrainController.cs プロジェクト: Qn880914/IGGGame
 public void Init()
 {
     m_terrainTileArray = new TerrainTileData[transform.childCount];
     for (int i = 0; i < transform.childCount; i++)
     {
         Transform child = transform.GetChild(i);
         m_terrainTileArray[i] = new TerrainTileData(child.gameObject.name);
         m_terrainTileArray[i].CalculateBound(child.gameObject);
     }
 }
コード例 #2
0
        private bool BuildMesh()
        {
            var terrainTileSquares       = _controller.terrainController.terrainGeneratorSettings.size - 1;
            var collisionTileVertexCount = _controller.collisionBlockVertexCount;
            var collisionTileSquares     = collisionTileVertexCount - 1;
            var chunkOffsetX             = collisionTileSquares * _location.x;
            var chunkOffsetY             = collisionTileSquares * _location.y;
            var startTerrainTileX        = Mathf.FloorToInt(chunkOffsetX / (float)terrainTileSquares);
            var startTerrainTileY        = Mathf.FloorToInt(chunkOffsetY / (float)terrainTileSquares);
            var endTerrainTileX          = Mathf.CeilToInt((chunkOffsetX + collisionTileSquares) / (float)terrainTileSquares);
            var endTerrainTileY          = Mathf.CeilToInt((chunkOffsetY + collisionTileSquares) / (float)terrainTileSquares);
            var mainTileCountX           = endTerrainTileX - startTerrainTileX + 1;
            var mainTileCountY           = endTerrainTileY - startTerrainTileY + 1;
            var mainTiles = new TerrainTileData[mainTileCountX * mainTileCountY];

            _usedTerrainTiles = new Vector3[mainTileCountX * mainTileCountY];
            var dataSize = terrainTileSquares + 3;
            var startTerrainTileIndexX = startTerrainTileX * terrainTileSquares;
            var startTerrainTileIndexY = startTerrainTileY * terrainTileSquares;
            var startOffsetX           = chunkOffsetX - startTerrainTileIndexX;
            var startOffsetY           = chunkOffsetY - startTerrainTileIndexY;


            for (var x = 0; x < mainTileCountX; x++)
            {
                for (var y = 0; y < mainTileCountY; y++)
                {
                    var tile = _controller.terrainController.GetExistingTile(x + startTerrainTileX, y + startTerrainTileY);
                    if (tile == null || !tile.isBuilt)
                    {
                        //Debug.Log("Could not load collision tile because the terrain data has not been initialized!");
                        return(false);
                    }
                    mainTiles[x + y * mainTileCountX]         = tile.data;
                    _usedTerrainTiles[x + y * mainTileCountX] = tile.transform.position;
                }
            }

            for (var x = 0; x < _controller.collisionBlockVertexCount; x++)
            {
                for (var y = 0; y < _controller.collisionBlockVertexCount; y++)
                {
                    var tileX        = Mathf.FloorToInt((chunkOffsetX + x) / (float)terrainTileSquares) - startTerrainTileX;
                    var tileY        = Mathf.FloorToInt((chunkOffsetY + y) / (float)terrainTileSquares) - startTerrainTileY;
                    var innerOffsetX = 1 + ((startOffsetX + x) % terrainTileSquares);
                    var innerOffsetY = 1 + ((startOffsetY + y) % terrainTileSquares);

                    var height = mainTiles[tileX + tileY * mainTileCountX].locationData[innerOffsetX + dataSize * innerOffsetY].position.y;
                    _initialVertices[x + _controller.collisionBlockVertexCount * y] = new Vector3(
                        x * _controller.terrainController.terrainGeneratorSettings.gridSize, height,
                        y * _controller.terrainController.terrainGeneratorSettings.gridSize);
                    _initialNormals[x + _controller.collisionBlockVertexCount * y] =
                        mainTiles[tileX + tileY * mainTileCountX]
                        .locationData[innerOffsetX + dataSize * innerOffsetY].normal;
                    var color = mainTiles[tileX + tileY * mainTileCountX].splats[(innerOffsetX - 1) + (dataSize - 2) * (innerOffsetY - 1)];
                    _initialSplats[x + _controller.collisionBlockVertexCount * y] = new Vector4(color.r, color.g, color.b, color.a);
                }
            }

            //Definition Stage

            //Tessellation Stage
            for (var i = 0; i < _initialTriangles.Length / 3; i++)
            {
                AddTessellatedTriangle(i, _triangles, _vertices, _normals, _splats);
            }
            return(true);
        }