示例#1
0
        private void SetLocation(IntegerCoordinate2D location, TerrainCollisionController controller)
        {
            _location = location;
            var currentTransform = transform;

            currentTransform.name     = "Collision Tile (" + _location.x + " " + _location.y + ")";
            _controller               = controller;
            _physicalSize             = (_controller.collisionBlockVertexCount - 1) * controller.terrainController.terrainGeneratorSettings.gridSize;
            currentTransform.position = new Vector3(_physicalSize * _location.x, 0, _physicalSize * _location.y);
            StartCoroutine(Build());
        }
示例#2
0
        //Create a new collision Tile.
        public static TerrainCollisionTile Instantiate(IntegerCoordinate2D location, TerrainCollisionController controller)
        {
            var gameObject = new GameObject();

            gameObject.transform.parent = controller.child;
            var collider = gameObject.AddComponent <MeshCollider>();

            collider.cookingOptions = MeshColliderCookingOptions.None;
            //collider.convex = true;
            var tile = gameObject.AddComponent <TerrainCollisionTile>();

            tile.SetLocation(location, controller);
            return(tile);
        }
示例#3
0
        public static IEnumerator GetChunkData(CollisionBaseData[] inputData, TerrainCollisionController controller, TerrainCollisionTile tile)
        {
            var settings = controller.terrainController.terrainGeneratorSettings;
            var shader = controller.terrainCollisionComputeShader;
            
            var kernel = shader.FindKernel("ComputeOffsets");
            
            var dataBuffer = new ComputeBuffer(inputData.Length, 40); //See CollisionBaseData summary
            dataBuffer.SetData(inputData);
            
            var outputData = new float[inputData.Length];
            for(var i = 0; i < inputData.Length; i++)
            {
                outputData[i] = 10;
            }
            var outputBuffer = new ComputeBuffer(outputData.Length, 4); //Float = 4 Bytes
            outputBuffer.SetData(outputData);
            
            TerrainUtilities.TransferTerrainGeneratorSettingsToComputeShader(shader, settings);
            
            shader.SetBuffer(kernel, "_BaseData", dataBuffer);
            shader.SetBuffer(kernel, "_FullData", outputBuffer);
            shader.SetInt("_size", inputData.Length);
            
            //Obtain base shader data.
            controller.terrainController.SetMainComputeShaderData(shader, kernel);
            
            //Dispatch the main Kernel
            shader.Dispatch(kernel, Mathf.CeilToInt(inputData.Length / 8.0f), 1, 1);

            //Wait for the requests to finish asynchronously
            var request = AsyncGPUReadback.Request(outputBuffer);
            yield return new WaitUntil(() => request.done);
            
            //Write results back to tile
            tile.displacements = request.GetData<float>().ToArray();
            
            //Clean up GPU buffers
            dataBuffer.Release();
            dataBuffer.Dispose();
            outputBuffer.Release();
            outputBuffer.Dispose();
            yield return null;
        }