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()); }
//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); }
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; }