/// <summary> /// Renders the shadows to a camera /// </summary> /// <param name="camera"> /// The camera to render shadows on. /// </param> private void Render(Camera camera) { // Calculate the camera frustum planes if (camera != null) { #if !UNITY_FLASH && !UNITY_IPHONE && !UNITY_WINRT && !UNITY_WEBPLAYER GeometryUtilityInternal.CalculateFrustumPlanes(_cameraFrustumPlanes, camera); #else _cameraFrustumPlanes = GeometryUtility.CalculateFrustumPlanes(camera); #endif } // Recreate the temporary array if it is too short int meshManagersCount = _meshManagers.Count; if (_meshManagersArrayCache.Length < meshManagersCount) { _meshManagersArrayCache = new SS_ShadowMeshManager[meshManagersCount]; } // Copy the values into temporary array int meshManagerCounter = 0; foreach (var meshManager in _meshManagers) { _meshManagersArrayCache[meshManagerCounter] = meshManager.Value; meshManagerCounter++; } _isRecalculatingMesh = true; // Clearing list of managers added on previous recalculations _meshManagersNew.Clear(); // Loop known mesh managers, we don't care if new items will be added inside the loop for (int i = 0; i < meshManagersCount; i++) { _meshManagersArrayCache[i].RecalculateGeometry(_cameraFrustumPlanes); _meshManagersArrayCache[i].DrawMesh(camera); } _isRecalculatingMesh = false; // Calculate & draw the newly added managers (if AutoStatic is used) for (int i = 0; i < _meshManagersNew.Count; i++) { _meshManagersNew[i].RecalculateGeometry(_cameraFrustumPlanes); _meshManagersNew[i].DrawMesh(camera); } }
/// <summary> /// Renders the shadows to a camera /// </summary> /// <param name="camera"> /// The camera to render shadows on. /// </param> private void Render(Camera camera) { // Calculate the camera frustum planes int cameraCullingMask; if (camera != null) { #if SUPPORTS_REFLECTION GeometryUtilityInternal.CalculateFrustumPlanes(_cameraFrustumPlanes, camera); #else _cameraFrustumPlanes = GeometryUtility.CalculateFrustumPlanes(camera); #endif cameraCullingMask = camera.cullingMask; } else { cameraCullingMask = unchecked (~0); } _isRecalculatingMesh = true; // Clearing list of managers added on previous recalculations _meshManagersNew.Clear(); // Loop known mesh managers, we don't care if new items will be added inside the loop ShadowMeshManagerMapEnumerator meshManagersEnumerator = new ShadowMeshManagerMapEnumerator(_meshManagers); while (meshManagersEnumerator.MoveNext()) { ShadowMeshManager meshManager = meshManagersEnumerator.CurrentValue; UpdateAndDrawMeshManager(meshManager, camera, cameraCullingMask); } _isRecalculatingMesh = false; // Calculate & draw the newly added managers (if AutoStatic is used) // and add them to the actual list ShadowMeshManagerMapEnumerator meshManagersNewEnumerator = new ShadowMeshManagerMapEnumerator(_meshManagersNew); while (meshManagersNewEnumerator.MoveNext()) { ShadowMeshManager meshManager = meshManagersNewEnumerator.CurrentValue; UpdateAndDrawMeshManager(meshManager, camera, cameraCullingMask); _meshManagers.Add(meshManager.GetInstanceHashCode(), meshManager); } }