Пример #1
0
    /// <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);
        }
    }
Пример #2
0
        /// <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);
            }
        }