Exemple #1
0
            public void Execute(int i_arrayIndex)
            {
                Entity octreeRayEntity = a_collisionChecksEntities [i_arrayIndex];


                // Its value should be 0, if no collision is detected.
                // And >= 1, if instance collision is detected, or there is more than one collision,
                // indicating number of collisions.
                IsCollidingData isCollidingData = a_isCollidingData [octreeRayEntity];

                isCollidingData.i_collisionsCount = 0;                    // Reset colliding instances counter.
                // isCollidingData.i_nearestInstanceCollisionIndex  = 0 ; // Unused
                // isCollidingData.f_nearestDistance                = float.PositiveInfinity ; // Unused



                OctreeEntityPair4CollisionData octreeEntityPair4CollisionData = a_octreeEntityPair4CollisionData [octreeRayEntity];
                RayData            rayData            = a_rayData [octreeRayEntity];
                RayMaxDistanceData rayMaxDistanceData = a_rayMaxDistanceData [octreeRayEntity];


                // Octree entity pair, for collision checks

                Entity octreeRootNodeEntity = octreeEntityPair4CollisionData.octree2CheckEntity;

                // Is target octree active
                if (a_isActiveTag.Exists(octreeRootNodeEntity))
                {
                    RootNodeData octreeRootNodeData = a_octreeRootNodeData [octreeRootNodeEntity];

                    DynamicBuffer <NodeBufferElement> a_nodesBuffer = nodeBufferElement [octreeRootNodeEntity];
                    DynamicBuffer <NodeInstancesIndexBufferElement> a_nodeInstancesIndexBuffer = nodeInstancesIndexBufferElement [octreeRootNodeEntity];
                    DynamicBuffer <NodeChildrenBufferElement>       a_nodeChildrenBuffer       = nodeChildrenBufferElement [octreeRootNodeEntity];
                    DynamicBuffer <InstanceBufferElement>           a_instanceBuffer           = instanceBufferElement [octreeRootNodeEntity];



                    // To even allow instances collision checks, octree must have at least one instance.
                    if (octreeRootNodeData.i_totalInstancesCountInTree > 0)
                    {
                        if (IsRayColliding_Common._IsNodeColliding(octreeRootNodeData, octreeRootNodeData.i_rootNodeIndex, rayData.ray, ref isCollidingData, a_nodesBuffer, a_nodeChildrenBuffer, a_nodeInstancesIndexBuffer, a_instanceBuffer, rayMaxDistanceData.f))
                        {
                            /*
                             * // Debug
                             * Debug.Log ( "Is colliding." ) ;
                             */
                        }
                    }
                }

                a_isCollidingData [octreeRayEntity] = isCollidingData;  // Set back.
            }
Exemple #2
0
        protected override JobHandle OnUpdate(JobHandle inputDeps)
        {
            // EntityCommandBuffer ecb = barrier.CreateCommandBuffer () ;
            EntityArray a_collisionChecksEntities = group.GetEntityArray();
            ComponentDataFromEntity <OctreeEntityPair4CollisionData> a_octreeEntityPair4CollisionData = GetComponentDataFromEntity <OctreeEntityPair4CollisionData> ();
            ComponentDataFromEntity <RayData>            a_rayData            = GetComponentDataFromEntity <RayData> ();
            ComponentDataFromEntity <RayMaxDistanceData> a_rayMaxDistanceData = GetComponentDataFromEntity <RayMaxDistanceData> ();

            ComponentDataFromEntity <IsCollidingData> a_isCollidingData = GetComponentDataFromEntity <IsCollidingData> ();


            ComponentDataFromEntity <IsActiveTag> a_isActiveTag = GetComponentDataFromEntity <IsActiveTag> ();


            // Octree entity pair, for collision checks

            ComponentDataFromEntity <RootNodeData> a_octreeRootNodeData = GetComponentDataFromEntity <RootNodeData> ();

            BufferFromEntity <NodeBufferElement> nodeBufferElement = GetBufferFromEntity <NodeBufferElement> ();
            BufferFromEntity <NodeInstancesIndexBufferElement> nodeInstancesIndexBufferElement = GetBufferFromEntity <NodeInstancesIndexBufferElement> ();
            BufferFromEntity <NodeChildrenBufferElement>       nodeChildrenBufferElement       = GetBufferFromEntity <NodeChildrenBufferElement> ();
            BufferFromEntity <InstanceBufferElement>           instanceBufferElement           = GetBufferFromEntity <InstanceBufferElement> ();


            // Test ray
            // Debug
            // ! Ensure test this only with single, or at most few ray entiities.
            ComponentDataFromEntity <RayEntityPair4CollisionData> a_rayEntityPair4CollisionData = new ComponentDataFromEntity <RayEntityPair4CollisionData> (); // As empty.

            IsRayColliding_Common._DebugRays(a_collisionChecksEntities, a_rayData, a_rayMaxDistanceData, a_isCollidingData, a_rayEntityPair4CollisionData, false, false);


            // Test ray
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            // Debug.DrawLine ( ray.origin, ray.origin + ray.direction * 100, Color.red )  ;

            int i_groupLength = group.CalculateLength();

            var setRayTestJob = new SetRayTestJob
            {
                a_collisionChecksEntities = a_collisionChecksEntities,

                ray       = ray,
                a_rayData = a_rayData,
                // a_rayMaxDistanceData                = a_rayMaxDistanceData,
            }.Schedule(i_groupLength, 8, inputDeps);

            var job = new Job
            {
                a_collisionChecksEntities = a_collisionChecksEntities,

                a_octreeEntityPair4CollisionData = a_octreeEntityPair4CollisionData,
                a_rayData            = a_rayData,
                a_rayMaxDistanceData = a_rayMaxDistanceData,
                a_isCollidingData    = a_isCollidingData,



                // Octree entity pair, for collision checks

                a_isActiveTag = a_isActiveTag,

                a_octreeRootNodeData = a_octreeRootNodeData,

                nodeBufferElement = nodeBufferElement,
                nodeInstancesIndexBufferElement = nodeInstancesIndexBufferElement,
                nodeChildrenBufferElement       = nodeChildrenBufferElement,
                instanceBufferElement           = instanceBufferElement
            }.Schedule(i_groupLength, 8, setRayTestJob);

            return(job);
        }