Exemplo n.º 1
0
        public static VisibilityProbe Allocate(int NumberOfPoints)
        {
            VisibilityProbe VisibilityProbe = new VisibilityProbe();

            VisibilityProbe.LocalPoints = new Vector3[NumberOfPoints];
            return(VisibilityProbe);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Procedurally generates probe points on a <see cref="BoxDefinition"/>.
        /// If the provided density is too high, a minimum set of points (represented by Box corners) are provided.
        /// </summary>
        public static VisibilityProbe GenerateAndAlocateVisibilityProbeLocalPointsFrom(float ProbeDensityPerUnit, BoxDefinition BoxDefinition)
        {
            Intersection.ExtractBoxColliderLocalPoints(BoxDefinition.LocalCenter, BoxDefinition.LocalSize,
                                                       out Vector3 C1, out Vector3 C2, out Vector3 C3, out Vector3 C4, out Vector3 C5, out Vector3 C6, out Vector3 C7, out Vector3 C8);

            float BoxWidth  = Vector3.Distance(C1, C2);
            float BoxHeight = Vector3.Distance(C1, C4);
            float BoxDepth  = Vector3.Distance(C1, C5);

            CalculateProbeNumberAndIntervalFromDensity(BoxWidth, ProbeDensityPerUnit, out int WidthNumberOfProbe, out float WidthDistanceBetweenProbes);
            CalculateProbeNumberAndIntervalFromDensity(BoxHeight, ProbeDensityPerUnit, out int HeightNumberOfProbe, out float HeightDistanceBetweenProbes);
            CalculateProbeNumberAndIntervalFromDensity(BoxDepth, ProbeDensityPerUnit, out int DepthNumberOfProbe, out float DepthDistanceBetweenProbes);

            int             totalNumberOfProbe = (WidthNumberOfProbe + HeightNumberOfProbe - 2 + DepthNumberOfProbe - 2) * 4;
            VisibilityProbe VisibilityProbe    = VisibilityProbe.Allocate(totalNumberOfProbe);

            int probeCounter = 0;

            FeedVisibilityProbe(C1, C2, true, true, WidthNumberOfProbe, WidthDistanceBetweenProbes, ref VisibilityProbe, ref probeCounter);
            FeedVisibilityProbe(C4, C3, true, true, WidthNumberOfProbe, WidthDistanceBetweenProbes, ref VisibilityProbe, ref probeCounter);
            FeedVisibilityProbe(C5, C6, true, true, WidthNumberOfProbe, WidthDistanceBetweenProbes, ref VisibilityProbe, ref probeCounter);
            FeedVisibilityProbe(C8, C7, true, true, WidthNumberOfProbe, WidthDistanceBetweenProbes, ref VisibilityProbe, ref probeCounter);


            FeedVisibilityProbe(C1, C4, false, false, HeightNumberOfProbe, HeightDistanceBetweenProbes, ref VisibilityProbe, ref probeCounter);
            FeedVisibilityProbe(C2, C3, false, false, HeightNumberOfProbe, HeightDistanceBetweenProbes, ref VisibilityProbe, ref probeCounter);
            FeedVisibilityProbe(C5, C8, false, false, HeightNumberOfProbe, HeightDistanceBetweenProbes, ref VisibilityProbe, ref probeCounter);
            FeedVisibilityProbe(C6, C7, false, false, HeightNumberOfProbe, HeightDistanceBetweenProbes, ref VisibilityProbe, ref probeCounter);


            FeedVisibilityProbe(C1, C5, false, false, DepthNumberOfProbe, DepthDistanceBetweenProbes, ref VisibilityProbe, ref probeCounter);
            FeedVisibilityProbe(C2, C6, false, false, DepthNumberOfProbe, DepthDistanceBetweenProbes, ref VisibilityProbe, ref probeCounter);
            FeedVisibilityProbe(C4, C8, false, false, DepthNumberOfProbe, DepthDistanceBetweenProbes, ref VisibilityProbe, ref probeCounter);
            FeedVisibilityProbe(C3, C7, false, false, DepthNumberOfProbe, DepthDistanceBetweenProbes, ref VisibilityProbe, ref probeCounter);

            return(VisibilityProbe);
        }
Exemplo n.º 3
0
        /// <summary>
        ///
        /// </summary>
        private static void FeedVisibilityProbe(Vector3 StartPosition, Vector3 EndPosition,
                                                bool GenerateStart, bool GenerateEnd, int NumberOfProbes, float DistanceBetweenProbes, ref VisibilityProbe visibilityProbe, ref int CurrentProbeCounter)
        {
            if (GenerateStart)
            {
                visibilityProbe[CurrentProbeCounter] = StartPosition;
                CurrentProbeCounter += 1;
            }

            Vector3 OffsetDirectionNormalize = (EndPosition - StartPosition).normalized;

            for (int i = 1; i < NumberOfProbes; i++)
            {
                if (i == NumberOfProbes - 1 && !GenerateEnd)
                {
                    break;
                    ;
                }

                Vector3 probePosition;
                if (i == NumberOfProbes - 1)
                {
                    probePosition = EndPosition;
                }
                else
                {
                    probePosition = StartPosition + (OffsetDirectionNormalize * DistanceBetweenProbes * i);
                }

                visibilityProbe[CurrentProbeCounter] = probePosition;
                CurrentProbeCounter += 1;
            }
        }