private void SpawnAtVertex(Vector3 position, Vector2 uv, Vector3 localNormal)
        {
            Vector3 worldPosition = MeshFilterComponent.transform.TransformPoint(position);
            Vector3 offset        = Random.insideUnitSphere * PositionOffset;

            offset.y = 0;
            float distributionMultiplier = 1;

            if (DistributionMap != null)
            {
                distributionMultiplier = DistributionMap.GetPixelBilinear(uv.x, uv.y).a;
            }
            Vector3    scale = Vector3.one * Size * distributionMultiplier;
            GameObject g     = Instantiate(Prefab);

            g.transform.parent     = this.transform;
            g.transform.position   = worldPosition + offset;
            g.transform.localScale = scale;
            g.name = Prefab.name;

            if (FollowVertexNormal)
            {
                g.transform.up = MeshFilterComponent.transform.TransformPoint(localNormal);
            }
            float rotationDegreeY = MaxRotation * Random.value;

            g.transform.Rotate(0, rotationDegreeY, 0, Space.Self);
        }
        public void Populate()
        {
            if (MeshFilterComponent == null || MeshFilterComponent.sharedMesh == null)
            {
                return;
            }
            Utilities.ClearChildren(this.transform);
            Vector3[] vertices = MeshFilterComponent.sharedMesh.vertices;
            Vector2[] uvCoords = MeshFilterComponent.sharedMesh.uv;
            Vector3[] normals  = MeshFilterComponent.sharedMesh.normals;

            for (int i = 0; i < vertices.Length; ++i)
            {
                float distributionMultiplier = 1;
                if (DistributionMap != null)
                {
                    distributionMultiplier = DistributionMap.GetPixelBilinear(uvCoords[i].x, uvCoords[i].y).a;
                }
                float probability = Density * distributionMultiplier;

                if (Random.value < probability)
                {
                    SpawnAtVertex(vertices[i], uvCoords[i], normals[i]);
                }
            }
        }