예제 #1
0
        private static int AddToList(NativeList_ulong targetLst, ulong targetInd)
        {
            int index = targetLst.Length;

            targetLst.Add(targetInd);
            return(index);
        }
예제 #2
0
        private static ulong RemoveFromList(NativeList_ulong targetLst, int targetIndex)
        {
            targetLst[targetIndex] = targetLst[targetLst.Length - 1];
            ulong cdr = targetLst[targetIndex];

            targetLst.RemoveLast();
            return(cdr);
        }
예제 #3
0
    public void AddRange(NativeList_ulong array)
    {
        int last = data->count;

        data->count += array.Length;
        ResizeToCount();
        void *dest = unsafePtr + last;

        UnsafeUtility.MemCpy(dest, array.unsafePtr, array.Length * sizeof(ulong));
    }
예제 #4
0
 public static void Initialize()
 {
     if (initialized)
     {
         return;
     }
     initialized         = true;
     drawGBufferList     = new NativeList_ulong(30, Unity.Collections.Allocator.Persistent);
     drawShadowList      = new NativeList_ulong(30, Unity.Collections.Allocator.Persistent);
     drawTransparentList = new NativeList_ulong(30, Unity.Collections.Allocator.Persistent);
     allEvents           = new List <CustomDrawRequest>(30);
 }
예제 #5
0
 public static void ExecuteInList(NativeList_Int cullResult, float4 *frustumPlanes, NativeList_ulong indexBuffer)
 {
     for (int i = 0; i < indexBuffer.Length; ++i)
     {
         CustomDrawRequest.ComponentData *dataPtr = (CustomDrawRequest.ComponentData *)indexBuffer[i];
         if (MathLib.BoxIntersect(ref dataPtr->localToWorldMatrix, dataPtr->boundingBoxPosition, dataPtr->boundingBoxExtents, frustumPlanes, 6))
         {
             cullResult.ConcurrentAdd(dataPtr->index);
         }
     }
 }
예제 #6
0
        public override void PreRenderFrame(PipelineCamera cam, ref PipelineCommandData data)
        {
            float shadowDist = clamp(shadowDistance, 0, cam.cam.farClipPlane);

            if (SunLight.current && SunLight.current.enabled && SunLight.current.gameObject.activeSelf)
            {
                data.buffer.EnableShaderKeyword("ENABLE_SUN");
                data.buffer.SetKeyword("ENABLE_SUNSHADOW", SunLight.current.enableShadow);
            }
            else
            {
                data.buffer.DisableShaderKeyword("ENABLE_SUN");
            }
            var visLights = proper.cullResults.visibleLights;

            LightFilter.allVisibleLight = visLights.Ptr();
            allLights.Clear();
            foreach (var i in visLights)
            {
                allLights.Add(i.light);
            }
            shadowCheckJob.Init(cam.cam, shadowDistance);
            shadowCullHandle = shadowCheckJob.ScheduleRef();
            addMLightCommandList.Clear();
            LightFilter.allMLightCommandList = addMLightCommandList;
            pointLightArray   = new NativeArray <PointLightStruct>(visLights.Length, Allocator.Temp, NativeArrayOptions.UninitializedMemory);
            spotLightArray    = new NativeArray <SpotLight>(visLights.Length, Allocator.Temp, NativeArrayOptions.UninitializedMemory);
            cubemapVPMatrices = new NativeList <CubemapViewProjMatrix>(CBDRSharedData.MAXIMUMPOINTLIGHTCOUNT, Allocator.Temp);
            spotLightMatrices = new NativeList <SpotLightMatrix>(CBDRSharedData.MAXIMUMSPOTLIGHTCOUNT, Allocator.Temp);
            NativeList_ulong allSpotCustomCullResults  = new NativeList_ulong(CBDRSharedData.MAXIMUMSPOTLIGHTCOUNT, Allocator.Temp);
            NativeList_ulong allPointCustomCullResults = new NativeList_ulong(CBDRSharedData.MAXIMUMPOINTLIGHTCOUNT, Allocator.Temp);

            LightFilter.allLights         = allLights;
            LightFilter.pointLightArray   = pointLightArray;
            LightFilter.spotLightArray    = spotLightArray;
            LightFilter.cubemapVPMatrices = cubemapVPMatrices;
            LightFilter.spotLightMatrices = spotLightMatrices;
            Transform camTrans = cam.cam.transform;

            needCheckedShadows.Clear();
            needCheckedShadows.AddCapacityTo(allLights.Count);
            lightingHandle = (new LightFilter
            {
                camPos = cam.cam.transform.position,
                shadowDist = shadowDist,
                lightDist = cbdrDistance,
                needCheckLight = needCheckedShadows,
                allSpotCustomDrawRequests = allSpotCustomCullResults,
                allPointCustomDrawRequests = allPointCustomCullResults
            }).Schedule(allLights.Count, max(1, allLights.Count / 4), shadowCullHandle);
            spotLightCustomCullHandle = new SpotLightCull
            {
                ptrs           = allSpotCustomCullResults,
                drawShadowList = CustomDrawRequest.drawShadowList
            }.Schedule(CBDRSharedData.MAXIMUMSPOTLIGHTCOUNT, max(1, CBDRSharedData.MAXIMUMSPOTLIGHTCOUNT / 2), lightingHandle);
            pointLightCustomCullHandle = new PointLightCull
            {
                ptrs           = allPointCustomCullResults,
                drawShadowList = CustomDrawRequest.drawShadowList
            }.Schedule(CBDRSharedData.MAXIMUMPOINTLIGHTCOUNT, max(1, CBDRSharedData.MAXIMUMPOINTLIGHTCOUNT / 2), lightingHandle);
            if (SunLight.current != null && SunLight.current.enabled && SunLight.current.enableShadow)
            {
                clipDistances = (float *)UnsafeUtility.Malloc(SunLight.CASCADECLIPSIZE * sizeof(float), 16, Allocator.Temp);
                staticFit     = DirectionalShadowStaticFit(cam.cam, SunLight.current, clipDistances);
                sunShadowCams = MUnsafeUtility.Malloc <OrthoCam>(SunLight.CASCADELEVELCOUNT * sizeof(OrthoCam), Allocator.Temp);
                Matrix4x4 proj = cam.cam.projectionMatrix;
                //      cam.cam.projectionMatrix = cam.cam.nonJitteredProjectionMatrix;
                PipelineFunctions.GetfrustumCorners(clipDistances, SunLight.CASCADELEVELCOUNT + 1, cam.cam, staticFit.frustumCorners.Ptr());
                //   cam.cam.projectionMatrix = proj;
                csmStruct = new CascadeShadowmap
                {
                    cascadeShadowmapVPs = (float4x4 *)cascadeShadowMapVP.Ptr(),
                    results             = sunShadowCams,
                    orthoCam            = (OrthoCam *)UnsafeUtility.AddressOf(ref SunLight.current.shadCam),
                    farClipPlane        = SunLight.current.farestZ,
                    frustumCorners      = staticFit.frustumCorners.Ptr(),
                    resolution          = staticFit.resolution,
                    isD3D = GraphicsUtility.platformIsD3D
                };
                csmHandle = csmStruct.ScheduleRefBurst(SunLight.CASCADELEVELCOUNT, max(1, SunLight.CASCADELEVELCOUNT / 4));
                for (int i = 0; i < SunLight.CASCADELEVELCOUNT; ++i)
                {
                    SunLight.customCullResults[i] = new NativeList_Int(CustomDrawRequest.drawShadowList.Length, Allocator.Temp);
                }
                sunCullResultHandle = new SunCustomRenderCull
                {
                    cams        = sunShadowCams,
                    cullResults = SunLight.customCullResults.Ptr()
                }.Schedule(SunLight.CASCADELEVELCOUNT, 1, csmHandle);
            }
            decalEvt.PreRenderFrame(cam, ref data);
        }