Exemplo n.º 1
0
        /// <summary>
        /// Decompresses buffer passed using LZF decompression algorithm.
        /// </summary>
        /// <param name="input">Input buffer to decompress.</param>
        /// <param name="decompressedSize">Actual original decompressed size, if known. In case
        /// size is not final, resizes output automatically.</param>
        /// <returns>Decompressed buffer.</returns>
        public static unsafe byte[] Decompress(NativeArray <byte> input, int decompressedSize = 0)
        {
            int inputCount  = input.Length;
            int outputCount = decompressedSize <= 0 ? input.Length << 1 : decompressedSize;
            var output      = new NativeArray <byte>(outputCount);
            int finalCount  = 0;

            byte[] result = null;

            try
            {
                finalCount = Decompress(input.GetPointer(), inputCount, output.GetPointer(), outputCount);

                while (finalCount == 0)
                {
                    output.Free();
                    outputCount <<= 1;
                    output        = new NativeArray <byte>(outputCount);
                    finalCount    = Decompress(input.GetPointer(), inputCount, output.GetPointer(), outputCount);
                }
            }
            finally
            {
                result = new byte[finalCount];
                if (finalCount > 0)
                {
                    Marshal.Copy((IntPtr)output.GetPointer(), result, 0, finalCount);
                }
                output.Free();
            }

            return(result);
        }
Exemplo n.º 2
0
            // Resolves the distance of the nearest obstacle and target and stores the cell index.
            public void ExecuteFirst(int index)
            {
                var ptr      = CellDatas.GetPointer(index);
                var position = ptr->Separation / ptr->Count;

                NearestPosition(ObstaclePositions, position, out var obstaclePositionIndex, out var obstacleDistance);
                ptr->ObstaclePositionIndex = obstaclePositionIndex;
                ptr->ObstacleDistance      = obstacleDistance;

                NearestPosition(TargetPositions, position, out var targetPositionIndex, out _);
                ptr->TargetPositionIndex = targetPositionIndex;

                ptr->Index = index;
            }
Exemplo n.º 3
0
            public void Execute(ref Transform3D transform3D, ref BoidState boidState)
            {
                if (boidState.IsDied)
                {
                    return;
                }
                var len = obstaclePositions.m_Length;

                if (len == 0)
                {
                    return;
                }
                var ptr = obstaclePositions.GetPointer(0);

                for (int i = 0; i < len; ++i, ++ptr)
                {
                    var dist     = (transform3D.Position - ptr->Position).sqrMagnitude;
                    var sqrScale = ptr->Scale * ptr->Scale;
                    if (dist < MinSqrMagnitude * sqrScale)
                    {
                        boidState.IsDied    = true;
                        boidState.IsScored  = false;
                        boidState.SinkTimer = SinkTime;
                        boidState.Killer    = obstacleIdxs[i];
                    }
                }
            }
Exemplo n.º 4
0
            public void Execute(int index, [ReadOnly] ref Transform3D transform3D, [ReadOnly] ref BoidTag Tag)
            {
                var ptr = CellAry.GetPointer(index);

                ptr->Separation = transform3D.Position;
                ptr->Alignment  = transform3D.Forward;
                ptr->Count      = 1;
            }
Exemplo n.º 5
0
            public void Execute(int index, [ReadOnly] ref LocalToWorld localToWorld)
            {
                var ptr = cellPtr0.GetPointer(index);

                ptr->Separation = localToWorld.Position;
                ptr->Alignment  = localToWorld.Forward;
                ptr->Count      = 1;
            }
Exemplo n.º 6
0
            // Resolves the distance of the nearest obstacle and target and stores the cell index.
            public void ExecuteFirst(int index)
            {
                var ptr      = cellDatas.GetPointer(index);
                var position = ptr->Separation / ptr->Count;

                int    obstaclePositionIndex;
                LFloat obstacleDistance;

                NearestPosition(obstaclePositions, position, out obstaclePositionIndex, out obstacleDistance);
                ptr->ObstaclePositionIndex = obstaclePositionIndex;
                ptr->ObstacleDistance      = obstacleDistance;

                int    targetPositionIndex;
                LFloat targetDistance;

                NearestPosition(targetPositions, position, out targetPositionIndex, out targetDistance);
                ptr->TargetPositionIndex = targetPositionIndex;

                ptr->Index = index;
            }
Exemplo n.º 7
0
 public NativeEnumerable(NativeArray <TSource> array, long offset, long length)
 {
     if (array.IsCreated && length > 0)
     {
         if (offset >= 0)
         {
             this.Ptr    = array.GetPointer() + offset;
             this.Length = length;
         }
         else
         {
             this.Ptr    = array.GetPointer();
             this.Length = length + offset;
         }
     }
     else
     {
         this.Ptr    = null;
         this.Length = 0;
     }
 }
            public void Execute(int index, ref Transform3D transform3D, ref BoidState boidState)
            {
                if (boidState.IsDied)
                {
                    return;
                }
                var forward         = transform3D.Forward;
                var currentPosition = transform3D.Position;
                var cellIndex       = CellDatas.GetPointer(index)->Index;
                var ptr             = CellDatas.GetPointer(cellIndex);

                var neighborCount                = ptr->Count;
                var alignment                    = ptr->Alignment;
                var separation                   = ptr->Separation;
                var nearestObstacleDistance      = ptr->ObstacleDistance;
                var nearestObstaclePositionIndex = ptr->ObstaclePositionIndex;
                var nearestTargetPositionIndex   = ptr->TargetPositionIndex;
                var nearestObstaclePosition      = *(ObstaclePositions.GetPointer(nearestObstaclePositionIndex));
                var nearestTargetPosition        = *(TargetPositions.GetPointer(nearestTargetPositionIndex));

                // steering calculations based on the boids algorithm
                var obstacleSteering     = currentPosition - nearestObstaclePosition;
                var avoidObstacleHeading = (nearestObstaclePosition + math.normalizesafe(obstacleSteering)
                                            * Settings.ObstacleAversionDistance) - currentPosition;
                var targetHeading = Settings.TargetWeight
                                    * math.normalizesafe(nearestTargetPosition - currentPosition);
                var nearestObstacleDistanceFromRadius = nearestObstacleDistance - Settings.ObstacleAversionDistance;
                var alignmentResult = Settings.AlignmentWeight
                                      * math.normalizesafe((alignment / neighborCount) - forward);
                var separationResult = Settings.SeparationWeight
                                       * math.normalizesafe((currentPosition * neighborCount) - separation);
                var normalHeading = math.normalizesafe(alignmentResult + separationResult + targetHeading);
                var targetForward = math.select(normalHeading, avoidObstacleHeading,
                                                nearestObstacleDistanceFromRadius < 0);
                var nextHeading = math.normalizesafe(forward + DeltaTime * (targetForward - forward));

                // updates based on the new heading
                transform3D.Position = transform3D.Position + (nextHeading * (Settings.MoveSpeed * DeltaTime));
                transform3D.Forward  = nextHeading;
            }
Exemplo n.º 9
0
 public NativeEnumerable(NativeArray <TSource> array)
 {
     if (array.IsCreated)
     {
         this.Ptr    = array.GetPointer();
         this.Length = array.Length;
     }
     else
     {
         this.Ptr    = null;
         this.Length = 0;
     }
 }
Exemplo n.º 10
0
        /// <summary>
        /// Compresses buffer passed using LZF compression algorithm.
        /// </summary>
        /// <param name="input">Input buffer to compress.</param>
        /// <returns>Compressed buffer.</returns>
        public static unsafe byte[] Compress(byte[] input)
        {
            if (input == null || input.Length == 0)
                return(new byte[0]);

            fixed(byte *inputPtr = input)
            {
                int inputCount  = input.Length;
                int outputCount = input.Length << 1;
                var output      = new NativeArray <byte>(outputCount);
                int finalCount  = 0;

                byte[] result = null;

                try
                {
                    finalCount = Compress(inputPtr, inputCount, output.GetPointer(), outputCount);

                    while (finalCount == 0)
                    {
                        output.Free();
                        outputCount <<= 1;
                        output        = new NativeArray <byte>(outputCount);
                        finalCount    = Compress(inputPtr, inputCount, output.GetPointer(), outputCount);
                    }
                }
                finally
                {
                    result = new byte[finalCount];
                    if (finalCount > 0)
                    {
                        Marshal.Copy((IntPtr)output.GetPointer(), result, 0, finalCount);
                    }
                    output.Free();
                }

                return(result);
            }
        }
Exemplo n.º 11
0
 public NativeEnumerable(NativeArray <T> array)
 {
     if (array.IsCreated)
     {
         Ptr    = array.GetPointer();
         Length = array.Length;
     }
     else
     {
         Ptr    = null;
         Length = 0;
     }
 }
Exemplo n.º 12
0
 public void Execute()
 {
     {
         var ptr = _CampAry.GetPointer(0);
         var len = _CampAry.Length;
         for (int i = 0, idx = 0; i < len; i++, ++ptr)
         {
             if (ptr->_entity._active)
             {
                 Execute(ref ptr->Unit);
                 idx++;
             }
         }
     }
     {
         var ptr = _PlayerAry.GetPointer(0);
         var len = _PlayerAry.Length;
         for (int i = 0, idx = 0; i < len; i++, ++ptr)
         {
             if (ptr->_entity._active)
             {
                 Execute(ref ptr->Unit);
                 idx++;
             }
         }
     }
     {
         var ptr = _EnemyAry.GetPointer(0);
         var len = _EnemyAry.Length;
         for (int i = 0, idx = 0; i < len; i++, ++ptr)
         {
             if (ptr->_entity._active)
             {
                 Execute(ref ptr->Unit);
                 idx++;
             }
         }
     }
     {
         var ptr = _BulletAry.GetPointer(0);
         var len = _BulletAry.Length;
         for (int i = 0, idx = 0; i < len; i++, ++ptr)
         {
             if (ptr->_entity._active)
             {
                 Execute(ref ptr->Unit);
                 idx++;
             }
         }
     }
 }
Exemplo n.º 13
0
 public void Execute()
 {
     {
         var ptr = _BoidAry.GetPointer(0);
         var len = _BoidAry.Length;
         for (int i = 0, idx = 0; i < len; i++, ++ptr)
         {
             if (ptr->_entity._active)
             {
                 Execute(idx, ref ptr->LocalToWorld);
                 idx++;
             }
         }
     }
 }
 public void Execute()
 {
     {
         var ptr = _BoidAry.GetPointer(0);
         var len = _BoidAry.Length;
         for (int i = 0, idx = 0; i < len; i++, ++ptr)
         {
             if (ptr->_entity._active)
             {
                 Execute(ref ptr->Transform, ref ptr->State);
                 idx++;
             }
         }
     }
 }
Exemplo n.º 15
0
            public void Execute(int index, ref LocalToWorld localToWorld)
            {
                var forward         = localToWorld.Forward;
                var currentPosition = localToWorld.Position;
                var cellIndex       = cellDatas.GetPointer(index)->Index;
                var ptr             = cellDatas.GetPointer(cellIndex);

                var neighborCount                = ptr->Count;
                var alignment                    = ptr->Alignment;
                var separation                   = ptr->Separation;
                var nearestObstacleDistance      = ptr->ObstacleDistance;
                var nearestObstaclePositionIndex = ptr->ObstaclePositionIndex;
                var nearestTargetPositionIndex   = ptr->TargetPositionIndex;
                var nearestObstaclePosition      = *(obstaclePositions.GetPointer(nearestObstaclePositionIndex));
                var nearestTargetPosition        = *(targetPositions.GetPointer(nearestTargetPositionIndex));

                // steering calculations based on the boids algorithm
                var obstacleSteering     = currentPosition - nearestObstaclePosition;
                var avoidObstacleHeading = (nearestObstaclePosition + math.normalizesafe(obstacleSteering)
                                            * settings.ObstacleAversionDistance) - currentPosition;
                var targetHeading = settings.TargetWeight
                                    * math.normalizesafe(nearestTargetPosition - currentPosition);
                var nearestObstacleDistanceFromRadius = nearestObstacleDistance - settings.ObstacleAversionDistance;
                var alignmentResult = settings.AlignmentWeight
                                      * math.normalizesafe((alignment / neighborCount) - forward);
                var separationResult = settings.SeparationWeight
                                       * math.normalizesafe((currentPosition * neighborCount) - separation);
                var normalHeading = math.normalizesafe(alignmentResult + separationResult + targetHeading);
                var targetForward = math.select(normalHeading, avoidObstacleHeading,
                                                nearestObstacleDistanceFromRadius < 0);
                var nextHeading = math.normalizesafe(forward + DeltaTime * (targetForward - forward));

                // updates based on the new heading
                localToWorld.Position = localToWorld.Position + (nextHeading * (settings.MoveSpeed * DeltaTime));
                localToWorld.Forward  = nextHeading;
            }
Exemplo n.º 16
0
        public static NativeEnumerable <T> Create(NativeArray <T> array, long offset, long length)
        {
            NativeEnumerable <T> answer = default;

            if (array.IsCreated && length > 0)
            {
                if (offset >= 0)
                {
                    answer.Ptr    = array.GetPointer() + offset;
                    answer.Length = length;
                }
                else
                {
                    answer.Ptr    = array.GetPointer();
                    answer.Length = length + offset;
                }
            }
            else
            {
                answer.Ptr    = null;
                answer.Length = 0;
            }
            return(answer);
        }
Exemplo n.º 17
0
            public void Execute(Unity.Entities.Entity entity, int index,
                                ref Unity.Transforms.LocalToWorld localToWorld, ref EntityRef entityRef)
            {
                var ptr = allBoids.GetPointer(entityRef._index);

                if (ptr->EntityRef == entityRef)
                {
                    localToWorld = new Unity.Transforms.LocalToWorld {
                        Value = float4x4.TRS(
                            ptr->LocalToWorld.Position.ToVector3(),
                            quaternion.LookRotationSafe(ptr->LocalToWorld.Forward.ToVector3(), Unity.Mathematics.math.up()),
                            new Unity.Mathematics.float3(1.0f, 1.0f, 1.0f)
                            )
                    };
                }
            }
Exemplo n.º 18
0
            void NearestPosition(NativeArray <LVector3> targets, LVector3 position,
                                 out int nearestPositionIndex, out LFloat nearestDistance)
            {
                nearestPositionIndex = 0;
                var ptr = targets.GetPointer(0);
                var len = targets.m_Length;

                nearestDistance = math.lengthsq(position - *ptr);
                ++ptr;
                for (int i = 1; i < len; i++, ++ptr)
                {
                    var distance = math.lengthsq(position - *ptr);
                    var nearest  = distance < nearestDistance;

                    nearestDistance      = math.select(nearestDistance, distance, nearest);
                    nearestPositionIndex = math.select(nearestPositionIndex, new LFloat(i), nearest);
                }

                nearestDistance = LMath.Sqrt(nearestDistance);
            }
Exemplo n.º 19
0
        public void Execute(Entity *entity, ref SpawnerData spawner, ref AssetData assetData)
        {
            var count          = spawner.Count;
            var center         = spawner.Position;
            var radius         = spawner.Radius;
            var spawnPositions = new NativeArray <LVector3>(count, Allocator.Temp,
                                                            NativeArrayOptions.UninitializedMemory);

            GeneratePoints.RandomPointsInUnitCube(spawnPositions);
            var pointPtr = spawnPositions.GetPointer(0);
            var context  = _context;

            for (int i = 0; i < count; ++i, ++pointPtr)
            {
                var boidPtr = context.PostCmdCreateBoid();
                boidPtr->LocalToWorld.Position = center + (*pointPtr * radius);
                boidPtr->LocalToWorld.Forward  = *pointPtr;
                boidPtr->AssetData.AssetId     = assetData.AssetId;
            }

            spawnPositions.Dispose();
            context.PostCmdDestroyEntity(entity);
        }