/// <summary> /// Add prefabs, mode Poisson /// </summary> public void AddPrefabs_Poisson_Any(Vector3 position, Vector3 normal) { GameObject container = editorTarget.container as GameObject; float brushSize = editorTarget.brushSettings.brushSize; float brushRadius = brushSize / 2.0f; float discRadius = editorTarget.brushSettings.poissonDiscSize / 2; PoissonDiscSampler sampler = new PoissonDiscSampler(brushSize, brushSize, discRadius); foreach (Vector2 sample in sampler.Samples()) { // brush is currenlty a disc => ensure the samples are within the disc if (Vector2.Distance(sample, new Vector2(brushRadius, brushRadius)) > brushRadius) { continue; } // x/z come from the poisson sample float x = position.x + sample.x - brushRadius; float z = position.z + sample.y - brushRadius; float y = position.y + editorTarget.brushSettings.poissonDiscRaycastOffset; Vector3 currentPosition = new Vector3(x, y, z); // TODO: raycast hit against layer // see https://docs.unity3d.com/ScriptReference/Physics.Raycast.html if (Physics.Raycast(currentPosition, Vector3.down, out RaycastHit raycastHitDown, Mathf.Infinity)) { y = raycastHitDown.point.y; }
/// <summary> /// Get the list of samples. /// The samples are re-used unless forceNew is true. This is usually after the current sample set has been used for painting. /// Otherwise the sample set will be used for drawing the gizmo /// </summary> /// <param name="brushSize"></param> /// <param name="brushRadius"></param> /// <param name="discRadius"></param> /// <param name="forceNew"></param> /// <returns></returns> public IEnumerable <Vector2> Samples(float brushSize, float brushRadius, float discRadius, bool forceNewDistribution) { if (discRadius < MIN_DISC_SIZE) { Debug.LogError("Poisson Disc Size is too small. Setting it to " + MIN_DISC_SIZE); discRadius = MIN_DISC_SIZE; } bool createNewList = forceNewDistribution || sampler == null || sampleParameters.HasChanged(brushSize, brushRadius, discRadius); if (createNewList) { sampler = new PoissonDiscSampler(brushSize, brushSize, discRadius); samplesList = CreateSamplesList(brushSize, brushSize, discRadius); } // store parameters for reuse of the list sampleParameters = new SampleParameters(brushSize, brushRadius, discRadius); return(samplesList); }