public IEnumerator ExecutePass(MagicLightProbes parent)
        {
            parent.totalProbesInSubVolume = parent.tmpSharedPointsArray.Count;

            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            for (int i = 0; i < parent.tmpNearbyGeometryPoints.Count; i++)
            {
                GameObject point = GameObject.CreatePrimitive(PrimitiveType.Sphere);

                point.name = "Temporary Point " + i;
                point.transform.position   = parent.tmpNearbyGeometryPoints[i].position;
                point.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
                point.AddComponent <SphereCollider>().radius = 0.1f;

                parent.tmpNearbyGeometryPoints[i].temporaryObject = point;

                if (!parent.isInBackground)
                {
                    if (parent.UpdateProgress(parent.tmpNearbyGeometryPoints.Count))
                    {
                        yield return(null);
                    }
                }
            }

            for (int i = 0; i < parent.tmpNearbyGeometryPoints.Count; i++)
            {
                if (parent.tmpNearbyGeometryPoints[i].collisionObject != null)
                {
                    parent.tmpNearbyGeometryPoints[i].collisionObject.SetActive(false);

                    Ray        ray = new Ray(parent.tmpNearbyGeometryPoints[i].position, (parent.tmpNearbyGeometryPoints[i].contactPoint - parent.tmpNearbyGeometryPoints[i].position).normalized);
                    RaycastHit raycastHit;

                    if (Physics.Raycast(ray, out raycastHit, Mathf.Infinity, parent.layerMask))
                    {
                        if (raycastHit.collider.name.Contains("Temporary Point"))
                        {
                            parent.tmpNearbyGeometryPoints[i].lightLeakLocked = true;
                        }
                    }

                    parent.tmpNearbyGeometryPoints[i].collisionObject.SetActive(true);
                }
            }

            for (int i = 0; i < parent.tmpNearbyGeometryPoints.Count; i++)
            {
                Object.DestroyImmediate(parent.tmpNearbyGeometryPoints[i].temporaryObject);
            }

            parent.totalProbesInSubVolume   = parent.tmpSharedPointsArray.Count;
            parent.calculatingVolumeSubPass = false;
        }
        public IEnumerator ExecutePass(MagicLightProbes parent, MLPVolume currentVolume)
        {
            currentVolume.resultLocalCornerPointsPositions.Clear();

            ComputeBuffer inputArray;
            ComputeBuffer exitArray;
            ComputeBuffer directionsArray;

            inputArray      = new ComputeBuffer(currentVolume.localCornerPointsPositions.Count, 3 * sizeof(float), ComputeBufferType.Default);
            exitArray       = new ComputeBuffer(currentVolume.localCornerPointsPositions.Count, 3 * sizeof(float), ComputeBufferType.Default);
            directionsArray = new ComputeBuffer(currentVolume.localCornerPointsPositions.Count, 3 * sizeof(float), ComputeBufferType.Default);

            inputArray.SetData(currentVolume.localCornerPointsPositions.ToArray());
            exitArray.SetData(currentVolume.localCornerPointsPositions.ToArray());
            directionsArray.SetData(currentVolume.localAvaragedDirections.ToArray());

            parent.calculateDistanceFromGeometry.SetBuffer(parent.calculateDistanceFromGeometry.FindKernel("CSMain"), "inputArray", inputArray);
            parent.calculateDistanceFromGeometry.SetBuffer(parent.calculateDistanceFromGeometry.FindKernel("CSMain"), "exitArray", exitArray);
            parent.calculateDistanceFromGeometry.SetBuffer(parent.calculateDistanceFromGeometry.FindKernel("CSMain"), "directionsArray", directionsArray);
            parent.calculateDistanceFromGeometry.SetFloat("distance", parent.unlitVolumeFillingRate);

            parent.calculateDistanceFromGeometry.Dispatch(parent.calculateDistanceFromGeometry.FindKernel("CSMain"), 256, 1, 1);

            Vector3[] exit = new Vector3[inputArray.count];
            exitArray.GetData(exit);

            inputArray.Dispose();
            exitArray.Dispose();

            currentVolume.localCornerPointsPositions.Clear();

            for (int i = 0; i < exit.Length; i++)
            {
                if (exit[i] == Vector3.zero)
                {
                    continue;
                }

                currentVolume.localCornerPointsPositions.Add(exit[i]);

                if (parent.UpdateProgress(exit.Length, 1000))
                {
                    yield return(null);
                }
            }
        }
Exemple #3
0
        //private void Init ()
        //{
        //    string[] directories = Directory.GetDirectories(Application.dataPath, "Magic Light Probes/Editor/Icons", SearchOption.AllDirectories);
        //    string[] str = Directory.GetFiles(directories[0]);

        //    textureData = File.ReadAllBytes(str[0]);

        //    logoAsset = new Texture2D(512, 512);
        //    logoAsset.LoadImage(textureData);

        //    initialized = true;
        //}

        public override void OnInspectorGUI()
        {
            MagicLightProbes magicLightProbes = (MagicLightProbes)target;

            if (magicLightProbes.unloaded)
            {
                magicLightProbes.unloaded = false;

                EditorApplication.update -= magicLightProbes.CheckState;
                EditorApplication.update += magicLightProbes.CheckState;
            }

            if (!GeneralMethods.stylesInitialized)
            {
                GeneralMethods.InitStyles();
            }

            serializedObject.Update();
            GeneralMethods.MLPMainComponentEditor(magicLightProbes);
            serializedObject.ApplyModifiedProperties();
            EditorUtility.SetDirty(magicLightProbes);
        }
Exemple #4
0
        private bool CheckIfIsGroundOrFloor(MagicLightProbes parent, Collider checkObject, List <string> keywords)
        {
            bool result = false;

            for (int i = 0; i < keywords.Count; i++)
            {
                if (checkObject.name.Contains(keywords[i]))
                {
                    result = true;
                    break;
                }
                else if (parent.CheckIfTagExist(keywords[i]))
                {
                    if (checkObject.CompareTag(keywords[i]))
                    {
                        result = true;
                        break;
                    }
                }
            }

            return(result);
        }
        public IEnumerator ExecutePass(MagicLightProbes parent, TargetPoint targetPoint, MLPVolume currentVolume = null, bool realtimeEditing = false)
        {
            List <MLPPointData> tempList            = new List <MLPPointData>();
            List <Vector3>      realTimeEditingList = new List <Vector3>();
            List <Vector3>      targetPoints        = new List <Vector3>();
            float fillingRate = 0;

            switch (targetPoint)
            {
            case TargetPoint.Unlit:
                parent.currentPass = "******";
                targetPoints.AddRange(currentVolume.localUnlitPointsPositions);
                currentVolume.resultLocalFreePointsPositions.Clear();
                currentVolume.resultLocalUnlitPointsPositions.Clear();
                fillingRate = parent.unlitVolumeFillingRate;
                tempList.AddRange(parent.tmpUnlitPoints);
                break;

            case TargetPoint.Equivalent:
                parent.currentPass = "******";
                targetPoints.AddRange(currentVolume.localEquivalentPointsPositions);
                currentVolume.resultLocalFreePointsPositions.Clear();
                currentVolume.resultLocalEquivalentPointsPositions.Clear();
                fillingRate = parent.equivalentVolumeFillingRate;
                tempList.AddRange(parent.tmpEqualPoints);
                break;

            case TargetPoint.Free:
                parent.currentPass = "******";
                targetPoints.AddRange(currentVolume.localFreePointsPositions);
                currentVolume.resultLocalFreePointsPositions.Clear();
                currentVolume.resultLocalEquivalentPointsPositions.Clear();
                currentVolume.resultLocalUnlitPointsPositions.Clear();
                fillingRate = parent.freeVolumeFillingRate;
                tempList.AddRange(parent.tmpFreePoints);
                break;
            }

            if (!realtimeEditing)
            {
                //tempList.Clear
            }

            realTimeEditingList.AddRange(targetPoints);

            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            if (targetPoints.Count > 0)
            {
                if (SystemInfo.supportsComputeShaders)
                {
                    ComputeBuffer inputArray;
                    ComputeBuffer exitArray;

                    inputArray = new ComputeBuffer(targetPoints.Count, 3 * sizeof(float), ComputeBufferType.Default);
                    exitArray  = new ComputeBuffer(targetPoints.Count, 3 * sizeof(float), ComputeBufferType.Default);

                    inputArray.SetData(targetPoints.ToArray());
                    exitArray.SetData(targetPoints.ToArray());

                    parent.calculateVolumeFilling.SetBuffer(parent.calculateVolumeFilling.FindKernel("CSMain"), "inputArray", inputArray);
                    parent.calculateVolumeFilling.SetBuffer(parent.calculateVolumeFilling.FindKernel("CSMain"), "exitArray", exitArray);
                    parent.calculateVolumeFilling.SetFloat("threshold", fillingRate);

                    parent.calculateVolumeFilling.Dispatch(parent.calculateVolumeFilling.FindKernel("CSMain"), 256, 1, 1);

                    Vector3[] exit = new Vector3[inputArray.count];
                    exitArray.GetData(exit);

                    inputArray.Dispose();
                    exitArray.Dispose();

                    for (int i = 0; i < exit.Length; i++)
                    {
                        if (exit[i] == Vector3.zero)
                        {
                            continue;
                        }

                        if (!realtimeEditing)
                        {
                            tempList[i].position = exit[i];
                            parent.tmpSharedPointsArray.Add(tempList[i]);
                        }

                        switch (targetPoint)
                        {
                        case TargetPoint.Unlit:
                            currentVolume.resultLocalUnlitPointsPositions.Add(exit[i]);
                            break;

                        case TargetPoint.Equivalent:
                            currentVolume.resultLocalEquivalentPointsPositions.Add(exit[i]);
                            break;

                        case TargetPoint.Free:
                            currentVolume.resultLocalFreePointsPositions.Add(exit[i]);
                            break;
                        }

                        if (parent.UpdateProgress(exit.Length, 1000))
                        {
                            yield return(null);
                        }
                    }
                }
                else
                {
                    for (int i = 0; i < Mathf.RoundToInt(targetPoints.Count * (1 - fillingRate)); i++)
                    {
                        realTimeEditingList.Remove(realTimeEditingList[UnityEngine.Random.Range(0, realTimeEditingList.Count)]);

                        if (parent.UpdateProgress(Mathf.RoundToInt(targetPoints.Count * (1 - fillingRate))))
                        {
                            yield return(null);
                        }
                    }

                    if (!realtimeEditing)
                    {
                        parent.tmpSharedPointsArray.AddRange(tempList);

                        for (int i = 0; i < tempList.Count; i++)
                        {
                            switch (targetPoint)
                            {
                            case TargetPoint.Unlit:
                                currentVolume.resultLocalUnlitPointsPositions.Add(tempList[i].position);
                                break;

                            case TargetPoint.Equivalent:
                                currentVolume.resultLocalEquivalentPointsPositions.Add(tempList[i].position);
                                break;

                            case TargetPoint.Free:
                                currentVolume.resultLocalFreePointsPositions.Add(tempList[i].position);
                                break;
                            }
                        }
                    }
                    else
                    {
                        for (int i = 0; i < realTimeEditingList.Count; i++)
                        {
                            switch (targetPoint)
                            {
                            case TargetPoint.Unlit:
                                currentVolume.resultLocalUnlitPointsPositions.Add(realTimeEditingList[i]);
                                break;

                            case TargetPoint.Equivalent:
                                currentVolume.resultLocalEquivalentPointsPositions.Add(realTimeEditingList[i]);
                                break;

                            case TargetPoint.Free:
                                currentVolume.resultLocalFreePointsPositions.Add(realTimeEditingList[i]);
                                break;
                            }
                        }
                    }
                }

                if (targetPoint == TargetPoint.Unlit)
                {
                    if (!realtimeEditing)
                    {
                        parent.currentPass = "******";
                        parent.currentPassProgressCounter      = 0;
                        parent.currentPassProgressFrameSkipper = 0;

                        for (int i = 0; i < tempList.Count; i++)
                        {
                            if (!tempList[i].lockForCull)
                            {
                                parent.CheckForNearContrast(tempList[i]);
                            }

                            if (!parent.isInBackground)
                            {
                                if (parent.UpdateProgress(tempList.Count))
                                {
                                    yield return(null);
                                }
                            }
                        }
                    }
                }
            }

            parent.totalProbesInSubVolume   = parent.tmpSharedPointsArray.Count;
            parent.calculatingVolumeSubPass = false;
        }
        public IEnumerator ExecutePass(MagicLightProbes parent, MLPVolume currentVolume = null)
        {
            if (parent.debugMode)
            {
                parent.tmpSharedPointsArray.Clear();
                parent.tmpSharedPointsArray.AddRange(parent.debugAcceptedPoints);
                parent.debugAcceptedPoints.Clear();
                parent.debugCulledPoints.Clear();
            }

            List <MLPPointData> candidatesList = new List <MLPPointData>();

            foreach (var light in parent.lights)
            {
                parent.currentPass = "******"" + light.name + "\"";
                parent.currentPassProgressCounter      = 0;
                parent.currentPassProgressFrameSkipper = 0;

                if (!parent.isInBackground)
                {
                    if (parent.UpdateProgress(parent.tmpSharedPointsArray.Count, 1))
                    {
                        yield return(null);
                    }
                }

                if (
                    light.lightType == MLPLight.MLPLightType.Directional ||
                    light.parentVolume == parent ||
                    (parent.parentVolume != null && light.parentVolume == parent.gameObject))
                {
                    for (int i = 0; i < parent.tmpSharedPointsArray.Count; i++)
                    {
                        switch (light.calculationType)
                        {
                        case MLPLight.CalculationType.AccurateShadows:
                            if (light.accurateTrace)
                            {
                                if (parent.tmpSharedPointsArray[i].inRangeForLights.Contains(light))
                                {
                                    int fullShaded = 0;

                                    foreach (var tracePoint in light.tracePointsData)
                                    {
                                        if (parent.CheckIfInShadow(light, tracePoint, parent.tmpSharedPointsArray[i]))
                                        {
                                            fullShaded++;
                                        }
                                        else
                                        {
                                            fullShaded--;
                                        }
                                    }

                                    if (fullShaded == light.tracePointsData.Count)
                                    {
                                        foreach (var tracePoint in light.tracePointsData)
                                        {
                                            for (int np = 0; np < parent.tmpSharedPointsArray[i].nearbyPoints.Count; np++)
                                            {
                                                if (parent.tmpSharedPointsArray[i].nearbyPoints[np] != null)
                                                {
                                                    if (!parent.CheckIfInShadow(light, tracePoint, parent.tmpSharedPointsArray[i].nearbyPoints[np]))
                                                    {
                                                        if (light.lightMode == LightmapBakeType.Mixed)
                                                        {
                                                            if (parent.tmpSharedPointsArray[i].savedNearGeometry)
                                                            {
                                                                parent.tmpSharedPointsArray[i].nearbyPoints[np].contrastOnShadingArea = true;

                                                                if (!parent.tmpContrastShadingBordersPoints.Contains(parent.tmpSharedPointsArray[i].nearbyPoints[np]))
                                                                {
                                                                    parent.tmpContrastShadingBordersPoints.Add(parent.tmpSharedPointsArray[i].nearbyPoints[np]);
                                                                }

                                                                for (int n = 0; n < parent.tmpSharedPointsArray[i].nearbyPoints[np].nearbyPoints.Count; n++)
                                                                {
                                                                    if (!parent.tmpSharedPointsArray[i].nearbyPoints[np].nearbyPoints[n].savedNearGeometry)
                                                                    {
                                                                        parent.tmpSharedPointsArray[i].nearbyPoints[np].nearbyPoints[n].contrastOnShadingArea = true;

                                                                        if (!parent.tmpContrastShadingBordersPoints.Contains(parent.tmpSharedPointsArray[i].nearbyPoints[np].nearbyPoints[n]))
                                                                        {
                                                                            parent.tmpContrastShadingBordersPoints.Add(parent.tmpSharedPointsArray[i].nearbyPoints[np].nearbyPoints[n]);
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                        else
                                                        {
                                                            parent.tmpSharedPointsArray[i].contrastOnShadingArea = true;
                                                            parent.tmpSharedPointsArray[i].nearbyPoints[np].contrastOnShadingArea = true;

                                                            if (!parent.tmpContrastShadingBordersPoints.Contains(parent.tmpSharedPointsArray[i].nearbyPoints[np]))
                                                            {
                                                                parent.tmpContrastShadingBordersPoints.Add(parent.tmpSharedPointsArray[i].nearbyPoints[np]);
                                                            }

                                                            if (!parent.tmpContrastShadingBordersPoints.Contains(parent.tmpSharedPointsArray[i]))
                                                            {
                                                                parent.tmpContrastShadingBordersPoints.Add(parent.tmpSharedPointsArray[i]);
                                                            }
                                                        }
                                                    }
                                                    else
                                                    {
                                                        if (!candidatesList.Contains(parent.tmpSharedPointsArray[i]))
                                                        {
                                                            candidatesList.Add(parent.tmpSharedPointsArray[i]);
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    if (!candidatesList.Contains(parent.tmpSharedPointsArray[i]))
                                    {
                                        candidatesList.Add(parent.tmpSharedPointsArray[i]);
                                    }
                                }
                            }
                            else
                            {
                                if (parent.tmpSharedPointsArray[i].inRangeForLights.Contains(light))
                                {
                                    if (parent.tmpSharedPointsArray[i].inShadowForLights.Contains(light) && !parent.tmpSharedPointsArray[i].inCorner)
                                    {
                                        Vector3 shadedPointStartPosition = parent.tmpSharedPointsArray[i].position;

                                        for (int np = 0; np < parent.tmpSharedPointsArray[i].nearbyPoints.Count; np++)
                                        {
                                            if (parent.tmpSharedPointsArray[i].nearbyPoints[np] != null && parent.tmpSharedPointsArray[i].nearbyPoints[np].inRangeForLights.Contains(light))
                                            {
                                                if (!parent.tmpSharedPointsArray[i].nearbyPoints[np].inShadowForLights.Contains(light) && !parent.tmpSharedPointsArray[i].nearbyPoints[np].inCorner)
                                                {
                                                    if (light.lightMode == LightmapBakeType.Mixed)
                                                    {
                                                        if (parent.tmpSharedPointsArray[i].savedNearGeometry)
                                                        {
                                                            if (parent.tmpSharedPointsArray[i].nearbyPoints[np].savedNearGeometry)
                                                            {
                                                                if (
                                                                    (parent.tmpSharedPointsArray[i].position - parent.tmpSharedPointsArray[i].nearbyPoints[np].position).normalized !=
                                                                    (parent.tmpSharedPointsArray[i].contactPoint - parent.tmpSharedPointsArray[i].nearbyPoints[np].position).normalized)
                                                                {
                                                                    parent.tmpSharedPointsArray[i].contrastOnShadingArea = true;
                                                                    parent.tmpSharedPointsArray[i].nearbyPoints[np].contrastOnShadingArea = true;
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                    }
                                                    else
                                                    {
                                                        if ((parent.tmpSharedPointsArray[i].position - parent.tmpSharedPointsArray[i].nearbyPoints[np].position).normalized !=
                                                            (parent.tmpSharedPointsArray[i].contactPoint - parent.tmpSharedPointsArray[i].nearbyPoints[np].position).normalized)
                                                        {
                                                            parent.tmpSharedPointsArray[i].contrastOnShadingArea = true;
                                                            parent.tmpSharedPointsArray[i].nearbyPoints[np].contrastOnShadingArea = true;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            break;
                        }
                    }
                }
            }

            if (parent.debugMode)
            {
                parent.currentPass = "******";
                parent.currentPassProgressCounter      = 0;
                parent.currentPassProgressFrameSkipper = 0;

                foreach (var point in parent.tmpSharedPointsArray)
                {
                    if (point.contrastOnShadingArea)
                    {
                        if (!parent.tmpContrastShadingBordersPoints.Contains(point))
                        {
                            parent.tmpContrastShadingBordersPoints.Add(point);
                        }
                    }

                    if (!parent.isInBackground)
                    {
                        if (parent.UpdateProgress(parent.tmpSharedPointsArray.Count, 1000))
                        {
                            yield return(null);
                        }
                    }
                }

                switch (parent.debugPass)
                {
                case MagicLightProbes.DebugPasses.ShadingBorders:
                    parent.debugAcceptedPoints.AddRange(parent.tmpContrastShadingBordersPoints);
                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                    break;

                case MagicLightProbes.DebugPasses.ContrastAreas:
                    parent.debugAcceptedPoints.AddRange(parent.tmpContrastOnOutOfRangePoints);
                    parent.debugAcceptedPoints.AddRange(parent.tmpContrastShadingBordersPoints);
                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                    break;

                case MagicLightProbes.DebugPasses.LightIntensity:
                case MagicLightProbes.DebugPasses.EqualProbes:
                    parent.debugAcceptedPoints.AddRange(parent.tmpContrastOnOutOfRangePoints);
                    parent.debugAcceptedPoints.AddRange(parent.tmpContrastShadingBordersPoints);
                    parent.debugAcceptedPoints.AddRange(parent.tmpSharedPointsArray);
                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                    break;

                case MagicLightProbes.DebugPasses.UnlitProbes:
                    parent.debugAcceptedPoints.AddRange(parent.tmpSharedPointsArray);
                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                    break;
                }
            }
            else
            {
                parent.currentPass = "******";
                parent.currentPassProgressCounter      = 0;
                parent.currentPassProgressFrameSkipper = 0;

                List <MLPPointData> tempList = new List <MLPPointData>();

                tempList.AddRange(parent.tmpSharedPointsArray);

                foreach (var point in tempList)
                {
                    if (point.contrastOnShadingArea)
                    {
                        parent.tmpContrastShadingBordersPoints.Add(point);
                        parent.tmpSharedPointsArray.Remove(point);
                        //currentVolume.localContrastPoints.Add(point);
                    }

                    if (point.savedNearGeometry)
                    {
                        parent.tmpSharedPointsArray.Remove(point);
                    }

                    if (!parent.isInBackground)
                    {
                        if (parent.UpdateProgress(tempList.Count, 1000))
                        {
                            yield return(null);
                        }
                    }
                }

                parent.totalProbesInSubVolume = parent.tmpSharedPointsArray.Count;
            }

            parent.calculatingVolumeSubPass = false;
        }
Exemple #7
0
        public IEnumerator ExecutePass(MagicLightProbes parent, float volumeSpacing, float cornersDetectionThreshold, MLPVolume currentVolume = null)
        {
            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            List <MLPPointData> addedPoints   = new List <MLPPointData>();
            List <MLPPointData> removedPoints = new List <MLPPointData>();

            GameObject cameraObject = new GameObject("Temp Camera");
            Camera     renderCamera = cameraObject.AddComponent <Camera>();

            renderCamera.cullingMask = parent.layerMask;

            Texture2D     tex           = new Texture2D(128, 128, TextureFormat.RGB24, false);
            RenderTexture renderTexture = new RenderTexture(128, 128, 24);

            if (parent.debugMode)
            {
                parent.tmpSharedPointsArray.Clear();
                parent.tmpSharedPointsArray.AddRange(parent.debugAcceptedPoints);
                parent.debugAcceptedPoints.Clear();
            }

            for (int i = 0; i < parent.tmpSharedPointsArray.Count; i++)
            {
                SortedList <float, Vector3> results = new SortedList <float, Vector3>();
                RaycastHit hitInfo;

                Ray[] checkRays =
                {
                    new Ray(parent.tmpSharedPointsArray[i].position, Vector3.forward),
                    new Ray(parent.tmpSharedPointsArray[i].position, -Vector3.forward),
                    new Ray(parent.tmpSharedPointsArray[i].position, Vector3.right),
                    new Ray(parent.tmpSharedPointsArray[i].position,   -Vector3.right),
                    new Ray(parent.tmpSharedPointsArray[i].position, Vector3.up),
                    new Ray(parent.tmpSharedPointsArray[i].position,      -Vector3.up),
                };

                foreach (var ray in checkRays)
                {
                    if (Physics.Raycast(ray, out hitInfo, volumeSpacing + (volumeSpacing * 0.5f), parent.layerMask)) // parent.volumeSpacing + 0.1f?
                    {
                        if (!results.Keys.Contains(hitInfo.distance))
                        {
                            if (parent.CheckIfInside(parent.probesVolume.transform, hitInfo.point))
                            {
                                bool inSubVolume = false;

                                foreach (var volume in parent.innerVolumes)
                                {
                                    if (parent.CheckIfInside(volume, hitInfo.point))
                                    {
                                        inSubVolume = true;
                                        break;
                                    }
                                }

                                if (!inSubVolume)
                                {
                                    results.Add(hitInfo.distance, hitInfo.point);
                                }
                            }
                        }
                    }
                }

                if (results.Count > 0)
                {
                    foreach (var result in results)
                    {
                        MLPPointData newPoint     = new MLPPointData();
                        Vector3      closestPoint = result.Value;
                        Ray          rayToPoint   = new Ray(parent.tmpSharedPointsArray[i].position, (closestPoint - parent.tmpSharedPointsArray[i].position).normalized);

                        if (Physics.Raycast(rayToPoint, out hitInfo, volumeSpacing + 0.1f, parent.layerMask))
                        {
                            if (parent.CheckIfStatic(hitInfo.collider.gameObject))
                            {
                                if (hitInfo.collider.gameObject.GetComponent <MLPForceNoProbes>() != null)
                                {
                                    removedPoints.Add(parent.tmpSharedPointsArray[i]);
                                    continue;
                                }

                                removedPoints.Add(parent.tmpSharedPointsArray[i]);

                                newPoint.position = hitInfo.point;

                                Vector3 direction = (parent.tmpSharedPointsArray[i].position - newPoint.position).normalized;

                                newPoint.position += direction * parent.distanceFromNearbyGeometry;

                                bool tooClose = false;

                                foreach (var point in currentVolume.localCornerPoints)
                                {
                                    if (Vector3.Distance(point.position, newPoint.position) < cornersDetectionThreshold)
                                    {
                                        tooClose = true;
                                        break;
                                    }
                                }

                                if (!tooClose)
                                {
                                    renderCamera.targetTexture      = renderTexture;
                                    renderCamera.nearClipPlane      = 0.01f;
                                    renderCamera.farClipPlane       = volumeSpacing * 2;
                                    renderCamera.fieldOfView        = 1;
                                    renderCamera.transform.position = newPoint.position;
                                    renderCamera.transform.LookAt(hitInfo.point);
                                    renderCamera.Render();

                                    RenderTexture.active = renderTexture;
                                    tex.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);

                                    Color pixel;
                                    float red   = 0;
                                    float green = 0;
                                    float blue  = 0;
                                    int   count = 0;

                                    for (int x = 0; x < renderTexture.width; x++)
                                    {
                                        for (int y = 0; y < renderTexture.height; y++)
                                        {
                                            pixel = tex.GetPixel(x, y);

                                            red   += pixel.r;
                                            green += pixel.g;
                                            blue  += pixel.b;

                                            count++;
                                        }
                                    }

                                    red   /= count;
                                    green /= count;
                                    blue  /= count;

                                    Color average = new Color(red, green, blue, 1);

                                    newPoint.col               = parent.tmpSharedPointsArray[i].col;
                                    newPoint.row               = parent.tmpSharedPointsArray[i].row;
                                    newPoint.depth             = parent.tmpSharedPointsArray[i].depth;
                                    newPoint.collisionNormal   = hitInfo.normal;
                                    newPoint.savedNearGeometry = true;
                                    newPoint.contactPoint      = closestPoint;
                                    newPoint.collisionObject   = hitInfo.collider.gameObject;
                                    newPoint.averagedColor     = average;
                                    newPoint.xStartPoint       = parent.tmpSharedPointsArray[i].xStartPoint;
                                    newPoint.yStartPoint       = parent.tmpSharedPointsArray[i].yStartPoint;
                                    newPoint.zStartPoint       = parent.tmpSharedPointsArray[i].zStartPoint;
                                    newPoint.xEndPoint         = parent.tmpSharedPointsArray[i].xEndPoint;
                                    newPoint.yEndPoint         = parent.tmpSharedPointsArray[i].yEndPoint;
                                    newPoint.zEndPoint         = parent.tmpSharedPointsArray[i].zEndPoint;

                                    parent.tmpNearbyGeometryPoints.Add(newPoint);

                                    //if (currentVolume != null)
                                    //{
                                    //    currentVolume.localDirections.Add(direction);
                                    //    currentVolume.localNearbyGeometryPointsPositions.Add(newPoint.position);
                                    //}

                                    RenderTexture.active = null;
                                }
                            }
                        }
                    }
                }

                if (!parent.isInBackground)
                {
                    if (parent.UpdateProgress(parent.tmpSharedPointsArray.Count, 1000))
                    {
                        yield return(null);
                    }
                }
            }

            Object.DestroyImmediate(cameraObject);

            if (parent.debugMode)
            {
                switch (parent.debugPass)
                {
                case MagicLightProbes.DebugPasses.NearGeometry:
                case MagicLightProbes.DebugPasses.GeometryEdges:
                case MagicLightProbes.DebugPasses.EqualColor:
                    parent.debugAcceptedPoints.AddRange(parent.tmpNearbyGeometryPoints);
                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                    break;

                default:
                    parent.debugAcceptedPoints.AddRange(parent.tmpSharedPointsArray);
                    parent.debugAcceptedPoints.AddRange(parent.tmpNearbyGeometryPoints);
                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                    break;
                }
            }
            else
            {
                parent.currentPass = "******";
                parent.currentPassProgressCounter      = 0;
                parent.currentPassProgressFrameSkipper = 0;

                Parallel.For(0, removedPoints.Count, (i, state) =>
                {
                    lock (parent.tmpSharedPointsArray)
                    {
                        parent.tmpSharedPointsArray.Remove(removedPoints[i]);
                    }
                });

                parent.tmpFreePoints.AddRange(parent.tmpSharedPointsArray);

                for (int i = 0; i < parent.tmpSharedPointsArray.Count; i++)
                {
                    currentVolume.localFreePointsPositions.Add(parent.tmpSharedPointsArray[i].position);
                }

                parent.currentPass = "******";
                parent.currentPassProgressCounter      = 0;
                parent.currentPassProgressFrameSkipper = 0;

                List <MLPPointData> removeList = new List <MLPPointData>();

                foreach (var point in parent.tmpNearbyGeometryPoints)
                {
                    foreach (var checkPoint in parent.tmpPointsNearGeometryIntersections)
                    {
                        if (Vector3.Distance(point.position, checkPoint.position) <= cornersDetectionThreshold * 2.0f)
                        {
                            removeList.Add(point);
                            break;
                        }
                    }

                    if (!parent.isInBackground)
                    {
                        if (parent.UpdateProgress(parent.tmpNearbyGeometryPoints.Count, 1000))
                        {
                            yield return(null);
                        }
                    }
                }

                Parallel.For(0, removeList.Count, (i, state) =>
                {
                    lock (parent.tmpNearbyGeometryPoints)
                    {
                        parent.tmpNearbyGeometryPoints.Remove(removeList[i]);
                    }
                });

                //currentVolume.localNearbyGeometryPoints.AddRange(parent.tmpNearbyGeometryPoints);
                parent.tmpSharedPointsArray.AddRange(parent.tmpNearbyGeometryPoints);
                parent.totalProbesInSubVolume += parent.tmpNearbyGeometryPoints.Count;
            }

            parent.calculatingVolumeSubPass = false;
        }
Exemple #8
0
        public IEnumerator ExecutePass(MagicLightProbes parent, MLPVolume currentVolume = null, bool realtimeEditing = false)
        {
            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            if (parent.debugMode)
            {
                parent.tmpSharedPointsArray.Clear();
                parent.tmpSharedPointsArray.AddRange(parent.debugAcceptedPoints);
                parent.debugAcceptedPoints.Clear();
            }

            List <MLPPointData> tempList = new List <MLPPointData>();

            if (realtimeEditing)
            {
                parent.tmpSharedPointsArray.Clear();

                for (int i = 0; i < tempList.Count; i++)
                {
                    tempList[i].equalIntensity = false;
                }
            }
            else
            {
                tempList.AddRange(parent.tmpSharedPointsArray);
            }

            int equivalent;

            //Parallel.For(0, parent.acceptedPoints.Count, (i, state) =>
            for (int i = 0; i < tempList.Count; i++)
            {
                lock (tempList)
                {
                    if (tempList[i].nearbyPoints.Count > 0)
                    {
                        if (!tempList[i].inSaveRange &&
                            !tempList[i].contrastOnShadingArea &&
                            !tempList[i].contrastOnOutOfRangeArea &&
                            !tempList[i].savedNearGeometry)
                        {
                            if (!realtimeEditing)
                            {
                                //currentVolume.savedPointsForLightIntensityThresholdEditing.Add(tempList[i]);
                            }

                            if (tempList[i].lightIntensity > 0)
                            {
                                equivalent = 0;

                                foreach (MLPPointData neigboringPoint in tempList[i].nearbyPoints)
                                {
                                    if (neigboringPoint != null)
                                    {
                                        if (neigboringPoint.lightIntensity == 0)
                                        {
                                            equivalent = 0;
                                            break;
                                        }
                                        else
                                        {
                                            if (neigboringPoint.lightIntensity.EqualsApproximately(tempList[i].lightIntensity, tempList[i].lightIntensity * (1 - parent.lightIntensityTreshold)))
                                            {
                                                equivalent++;
                                            }
                                        }
                                    }
                                }

                                if (equivalent == tempList[i].nearbyPoints.Count)
                                {
                                    tempList[i].equalIntensity = true;
                                }
                                else
                                {
                                    tempList[i].contrastOnShadingArea = true;
                                }
                            }
                            else
                            {
                                equivalent = 0;

                                foreach (MLPPointData neigboringPoint in tempList[i].nearbyPoints)
                                {
                                    if (neigboringPoint != null)
                                    {
                                        if (neigboringPoint.lightIntensity > 0)
                                        {
                                            equivalent = 0;
                                            break;
                                        }
                                        else
                                        {
                                            if (!tempList[i].inSaveRange && !tempList[i].savedNearGeometry)
                                            {
                                                equivalent++;
                                            }
                                        }
                                    }
                                }

                                if (equivalent == tempList[i].nearbyPoints.Count)
                                {
                                    tempList[i].equalIntensity = true;
                                }
                                else
                                {
                                    tempList[i].contrastOnShadingArea = true;
                                }
                            }
                        }
                    }
                }
            }//);

            if (realtimeEditing)
            {
                parent.tmpEqualPoints.Clear();
                parent.tmpSharedPointsArray.Clear();
                parent.tmpSharedPointsArray.AddRange(tempList);
            }

            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            foreach (var point in tempList)
            {
                if (point.equalIntensity &&
                    !point.inSaveRange &&
                    !point.contrastOnOutOfRangeArea &&
                    !point.contrastOnShadingArea &&
                    !point.inCorner &&
                    !point.savedNearGeometry)
                {
                    if (point.inShadowForLights.Count == parent.lights.Count || point.isUnlit)
                    {
                        parent.tmpSharedPointsArray.Remove(point);
                    }
                    else
                    {
                        parent.tmpSharedPointsArray.Remove(point);
                        parent.tmpEqualPoints.Add(point);
                        currentVolume.localEquivalentPointsPositions.Add(point.position);
                    }
                }
                else if (point.contrastOnOutOfRangeArea || point.contrastOnShadingArea)
                {
                    currentVolume.localContrastPoints.Add(point);
                }

                if (!parent.isInBackground)
                {
                    if (parent.UpdateProgress(tempList.Count, 1000))
                    {
                        yield return(null);
                    }
                }
            }

            tempList.Clear();

            if (!parent.debugMode)
            {
                if (!realtimeEditing)
                {
                    //currentVolume.contrastPointsForQuickEditing.AddRange(parent.acceptedPoints);
                    parent.totalProbesInSubVolume = parent.tmpSharedPointsArray.Count;
                }
            }
            else
            {
                parent.debugAcceptedPoints.AddRange(parent.tmpEqualPoints);
                parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
            }

            parent.calculatingVolumeSubPass = false;
        }
Exemple #9
0
 private void Start()
 {
     parentRootComponent = GetComponentInParent <MagicLightProbes>();
     selfRenderer        = GetComponent <MeshRenderer>();
 }
Exemple #10
0
        public IEnumerator ExecutePass(MagicLightProbes parent, List <MLPPointData> inputList)
        {
            float spacing = 0;

            if (parent.useDynamicDensity)
            {
                if (parent.currentVolume.isSubdividedPart)
                {
                    spacing = parent.volumeSpacingMin;
                }
                else
                {
                    spacing = parent.volumeSpacingMax;
                }
            }
            else
            {
                spacing = parent.volumeSpacing;
            }

            List <List <MLPPointData> > separated = new List <List <MLPPointData> >();

            for (int i = 0; i < inputList.Count; i += 1000)
            {
                separated.Add(inputList.GetRange(i, Math.Min(1000, inputList.Count - i)));
            }

            for (int s_list = 0; s_list < separated.Count; s_list++)
            {
                parent.currentPass = "******" + s_list + "/" + separated.Count;
                parent.currentPassProgressCounter      = 0;
                parent.currentPassProgressFrameSkipper = 0;

                if (!parent.isInBackground)
                {
                    if (parent.UpdateProgress(separated[s_list].Count, 1))
                    {
                        yield return(null);
                    }
                }

                Parallel.For(0, separated[s_list].Count, i =>
                {
                    foreach (var point in separated[s_list])
                    {
                        if (point != separated[s_list][i])
                        {
                            if (Vector3.Distance(point.position, separated[s_list][i].position).EqualsApproximately(spacing, 0.01f))
                            {
                                separated[s_list][i].nearbyPoints.Add(point);
                            }
                        }
                    }
                });
            }

            if (parent.debugMode)
            {
                parent.debugAcceptedPoints.AddRange(inputList);
            }

            parent.calculatingVolumeSubPass = false;
        }
Exemple #11
0
        public IEnumerator ExecutePass(MagicLightProbes parent, float volumeSpacing)
        {
            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            if (parent.debugMode)
            {
                parent.tmpSharedPointsArray.Clear();
                parent.tmpSharedPointsArray.AddRange(parent.debugAcceptedPoints);
                parent.debugAcceptedPoints.Clear();
            }

            Thread calculationThread = new Thread(new ThreadStart(() =>
            {
                Parallel.For(0, parent.tmpSharedPointsArray.Count, (i, state) =>
                {
                    if (!parent.tmpSharedPointsArray[i].contrastOnOutOfRangeArea)
                    {
                        foreach (var light in parent.lights)
                        {
                            if (parent.tmpSharedPointsArray[i].inRangeForLights.Contains(light))
                            {
                                if (light.lightMode != LightmapBakeType.Mixed)
                                {
                                    if (light.saveNearbyProbes)
                                    {
                                        if (light.accurateTrace)
                                        {
                                            foreach (var tracePoint in light.tracePointsData)
                                            {
                                                if (Vector3.Distance(parent.tmpSharedPointsArray[i].position, tracePoint.position).EqualsApproximately(volumeSpacing, volumeSpacing / 2))
                                                {
                                                    parent.tmpSharedPointsArray[i].contrastOnShadingArea = true;
                                                    parent.tmpSharedPointsArray[i].SetInSaveRange(true);
                                                    parent.tmpNearbyLightsPoints.Add(parent.tmpSharedPointsArray[i]);

                                                    break;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            if (Vector3.Distance(parent.tmpSharedPointsArray[i].position, light.position) <= volumeSpacing * 2)
                                            {
                                                parent.tmpSharedPointsArray[i].SetInSaveRange(true);

                                                lock (parent.tmpNearbyLightsPoints)
                                                {
                                                    parent.tmpNearbyLightsPoints.Add(parent.tmpSharedPointsArray[i]);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    parent.UpdateProgress(parent.tmpSharedPointsArray.Count);
                });
            }));

            calculationThread.Start();

            while (calculationThread.ThreadState == ThreadState.Running)
            {
                yield return(null);
            }

            if (parent.debugMode)
            {
                parent.debugAcceptedPoints.AddRange(parent.tmpNearbyLightsPoints);
                parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
            }

            parent.calculatingVolumeSubPass = false;
        }
Exemple #12
0
        public IEnumerator ExecutePass(MagicLightProbes parent, MLPVolume currentVolume = null, bool realtimeEditing = false)
        {
            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            if (parent.debugMode)
            {
                parent.tmpSharedPointsArray.Clear();
                parent.debugAcceptedPoints.Clear();
            }

            if (currentVolume.localEquivalentPointsPositions.Count > 0)
            {
                currentVolume.resultLocalEquivalentPointsPositions.Clear();

                ComputeBuffer inputArray;
                ComputeBuffer exitArray;

                inputArray = new ComputeBuffer(currentVolume.localEquivalentPointsPositions.Count, 3 * sizeof(float), ComputeBufferType.Default);
                exitArray  = new ComputeBuffer(currentVolume.localEquivalentPointsPositions.Count, 3 * sizeof(float), ComputeBufferType.Default);

                inputArray.SetData(currentVolume.localEquivalentPointsPositions.ToArray());
                exitArray.SetData(currentVolume.localEquivalentPointsPositions.ToArray());

                parent.calculateVolumeFilling.SetBuffer(parent.calculateVolumeFilling.FindKernel("CSMain"), "inputArray", inputArray);
                parent.calculateVolumeFilling.SetBuffer(parent.calculateVolumeFilling.FindKernel("CSMain"), "exitArray", exitArray);
                parent.calculateVolumeFilling.SetFloat("threshold", parent.equivalentVolumeFillingRate);

                parent.calculateVolumeFilling.Dispatch(parent.calculateVolumeFilling.FindKernel("CSMain"), 256, 1, 1);

                Vector3[] exit = new Vector3[inputArray.count];
                exitArray.GetData(exit);

                inputArray.Dispose();
                exitArray.Dispose();

                List <MLPPointData> tempList = new List <MLPPointData>();
                tempList.AddRange(parent.tmpEqualPoints);

                for (int i = 0; i < exit.Length; i++)
                {
                    if (exit[i] == Vector3.zero)
                    {
                        continue;
                    }

                    if (!realtimeEditing)
                    {
                        tempList[i].position = exit[i];
                        parent.tmpSharedPointsArray.Add(tempList[i]);
                    }

                    currentVolume.resultLocalEquivalentPointsPositions.Add(exit[i]);

                    if (!parent.isInBackground)
                    {
                        if (parent.UpdateProgress(exit.Length, 1000))
                        {
                            yield return(null);
                        }
                    }
                }

                if (parent.debugMode)
                {
                    parent.debugAcceptedPoints.AddRange(parent.tmpSharedPointsArray);
                }
            }

            parent.totalProbesInSubVolume   = parent.tmpSharedPointsArray.Count;
            parent.calculatingVolumeSubPass = false;
        }
Exemple #13
0
        public IEnumerator ExecutePass(MagicLightProbes parent, float volumeSpacing)
        {
            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            for (int i = 0; i < parent.tmpNearbyGeometryPoints.Count; i++)
            {
                //GameObject temp = GameObject.CreatePrimitive(PrimitiveType.Sphere);

                //temp.transform.localScale = Vector3.one * 0.1f;

                parent.layerMasks.Clear();

                for (int j = 0; j < parent.staticObjects.Count; j++)
                {
                    parent.layerMasks.Add(parent.staticObjects[j].layer);

                    if (parent.staticObjects[j] != parent.tmpNearbyGeometryPoints[i].collisionObject)
                    {
                        parent.staticObjects[j].gameObject.layer = LayerMask.NameToLayer("Ignore Raycast");
                    }
                }

                RaycastHit hitInfo;
                Vector3[]  directions =
                {
                    Vector3.forward,
                    -Vector3.forward,
                    Vector3.right,
                    -Vector3.right,
                    Vector3.up,
                    -Vector3.up
                };

                bool edgeFound = false;

                Vector3 startPosition = new Vector3(
                    parent.tmpNearbyGeometryPoints[i].position.x,
                    parent.tmpNearbyGeometryPoints[i].position.y,
                    parent.tmpNearbyGeometryPoints[i].position.z);

                for (int d = 0; d < directions.Length && !edgeFound; d++)
                {
                    float dot = Vector3.Dot(directions[d], -parent.tmpNearbyGeometryPoints[i].collisionNormal);

                    if (dot.EqualsApproximately(0f, 0.1f))
                    {
                        parent.tmpNearbyGeometryPoints[i].position = startPosition;

                        float prevDistance    = Vector3.Distance(startPosition, parent.tmpNearbyGeometryPoints[i].contactPoint);
                        float currentDistance = 0;

                        while (Vector3.Distance(startPosition, parent.tmpNearbyGeometryPoints[i].position) <= volumeSpacing && !edgeFound)
                        {
                            //Debug.DrawRay(parent.nearbyGeometryPoints[i].position, directions[d], Color.red, 1f);
                            //temp.transform.position = parent.nearbyGeometryPoints[i].position;

                            if (Physics.Raycast(new Ray(parent.tmpNearbyGeometryPoints[i].position, -parent.tmpNearbyGeometryPoints[i].collisionNormal), out hitInfo, parent.layerMask))
                            {
                                currentDistance = hitInfo.distance;

                                float difference = Mathf.Abs(prevDistance - currentDistance);

                                if (difference > 0.5f)
                                {
                                    parent.tmpNearbyGeometryPoints[i].position      -= directions[d] * 0.1f;
                                    parent.tmpNearbyGeometryPoints[i].onGeometryEdge = true;
                                    edgeFound = true;
                                }
                                else
                                {
                                    parent.tmpNearbyGeometryPoints[i].position += directions[d] * 0.05f;
                                }

                                prevDistance = currentDistance;
                            }
                            else
                            {
                                parent.tmpNearbyGeometryPoints[i].position      -= directions[d] * 0.1f;
                                parent.tmpNearbyGeometryPoints[i].onGeometryEdge = true;
                                edgeFound = true;
                            }

                            //while (!parent.nextStep)
                            //{
                            //    yield return null;
                            //}

                            parent.nextStep = false;
                        }
                    }

                    //while (!parent.nextStep)
                    //{
                    //    yield return null;
                    //}

                    parent.nextStep = false;
                }

                if (!edgeFound)
                {
                    parent.tmpNearbyGeometryPoints[i].position = startPosition;
                    //Object.DestroyImmediate(temp.gameObject);
                }
                else
                {
                    //temp.transform.position = parent.nearbyGeometryPoints[i].position;
                }

                for (int j = 0; j < parent.staticObjects.Count; j++)
                {
                    parent.staticObjects[j].layer = parent.layerMasks[j];
                }

                //while (!parent.nextStep)
                //{
                //    yield return null;
                //}

                parent.nextStep = false;

                if (!parent.isInBackground)
                {
                    if (parent.UpdateProgress(parent.tmpNearbyGeometryPoints.Count, 1000))
                    {
                        yield return(null);
                    }
                }
            }

            if (parent.debugMode)
            {
                List <MLPPointData> exitArray = new List <MLPPointData>();

                Parallel.For(0, parent.tmpNearbyGeometryPoints.Count, i =>
                {
                    if (parent.tmpNearbyGeometryPoints[i].onGeometryEdge)
                    {
                        lock (exitArray)
                        {
                            exitArray.Add(parent.tmpNearbyGeometryPoints[i]);
                        }
                    }
                });

                parent.debugAcceptedPoints.Clear();
                parent.debugAcceptedPoints.AddRange(exitArray);
                exitArray.Clear();
            }

            parent.calculatingVolumeSubPass = false;
        }
Exemple #14
0
        public IEnumerator ExecutePass(MagicLightProbes parent)
        {
            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            int steps = Mathf.RoundToInt(parent.verticalDublicatingHeight / parent.verticalDublicatingStep);

            List <MLPPointData> candidates        = new List <MLPPointData>();
            List <MLPPointData> savedNearGeometry = new List <MLPPointData>();

            parent.tmpSharedPointsArray.AddRange(parent.tmpNearbyGeometryPoints);

            for (int i = 0; i < parent.tmpSharedPointsArray.Count; i++)
            {
                if (parent.tmpSharedPointsArray[i].savedNearGeometry)
                {
                    if (Vector3.Dot(-Vector3.up, (parent.tmpSharedPointsArray[i].contactPoint - parent.tmpSharedPointsArray[i].position).normalized) == 1)
                    {
                        candidates.Add(parent.tmpSharedPointsArray[i]);
                    }
                    else
                    {
                        savedNearGeometry.Add(parent.tmpSharedPointsArray[i]);
                    }
                }

                if (parent.UpdateProgress(parent.tmpSharedPointsArray.Count, 1000))
                {
                    yield return(null);
                }
            }

            parent.tmpSharedPointsArray.Clear();

            for (int i = 0; i < steps; i++)
            {
                parent.currentPass = "******" + i + "/" + steps;
                parent.currentPassProgressCounter      = 0;
                parent.currentPassProgressFrameSkipper = 0;

                foreach (var point in candidates)
                {
                    MLPPointData newPoint = new MLPPointData();
                    newPoint.position = new Vector3(point.position.x, point.position.y + (parent.verticalDublicatingStep * i), point.position.z);

                    if (parent.probesVolume.GetComponent <MeshRenderer>().bounds.Contains(newPoint.position))
                    {
                        parent.tmpSharedPointsArray.Add(newPoint);
                    }

                    if (!parent.isInBackground)
                    {
                        if (parent.UpdateProgress(parent.tmpSharedPointsArray.Count, 1000))
                        {
                            yield return(null);
                        }
                    }
                }
            }

            parent.tmpSharedPointsArray.AddRange(candidates);
            parent.tmpSharedPointsArray.AddRange(savedNearGeometry);
            parent.tmpSharedPointsArray.AddRange(parent.tmpPointsNearGeometryIntersections);

            parent.calculatingVolumeSubPass = false;
        }
Exemple #15
0
        public static void AddVolume(List <MagicLightProbes> allGroups, Vector3 position = new Vector3(), float avaragedSize = 0)
        {
            GameObject mlpGroupsObject;

            mlpGroupsObject = GameObject.Find("Magic Light Probes");

            if (mlpGroupsObject == null)
            {
                mlpGroupsObject = new GameObject("Magic Light Probes");
            }

            GameObject newProbesVolume = new GameObject("MLP Group " + allGroups.Count, typeof(MagicLightProbes));

            newProbesVolume.transform.parent = mlpGroupsObject.transform;

            if (position != Vector3.zero)
            {
                newProbesVolume.transform.position = position;
            }
            else
            {
                newProbesVolume.transform.position = SceneView.lastActiveSceneView.camera.transform.position + SceneView.lastActiveSceneView.camera.transform.forward * 5;
            }

            GameObject probeVolume = GameObject.CreatePrimitive(PrimitiveType.Cube);

            probeVolume.name = "MLP Group " + allGroups.Count + " Volume";
            probeVolume.AddComponent <MLPVolume>();
            probeVolume.transform.parent = newProbesVolume.transform;
            probeVolume.GetComponent <MeshRenderer>().lightProbeUsage      = UnityEngine.Rendering.LightProbeUsage.Off;
            probeVolume.GetComponent <MeshRenderer>().reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off;
            probeVolume.GetComponent <MeshRenderer>().enabled = false;
            probeVolume.transform.localPosition = Vector3.zero;

            if (avaragedSize > 0)
            {
                probeVolume.transform.localScale = new Vector3(avaragedSize, avaragedSize, avaragedSize);
            }

            Object.DestroyImmediate(probeVolume.GetComponent <Collider>());

            GameObject lightProbeGroup = new GameObject("Light Probe Group " + allGroups.Count, typeof(MLPQuickEditing));

            lightProbeGroup.transform.parent = newProbesVolume.transform;

            MagicLightProbes mlp          = newProbesVolume.GetComponent <MagicLightProbes>();
            MLPQuickEditing  quickEditing = lightProbeGroup.GetComponent <MLPQuickEditing>();

            quickEditing.parent       = mlp;
            mlp.quickEditingComponent = quickEditing;
            mlp.probesVolume          = probeVolume;


            allGroups.Add(mlp);

            if (MLPCombinedVolume.Instance == null)
            {
                MLPCombinedVolume.CreateCombinedVolumeObject();
            }

            mlp.combinedVolumeComponent = MLPCombinedVolume.Instance;
        }
Exemple #16
0
        public IEnumerator ExecutePass(MagicLightProbes parent, float spacing, MagicLightProbes.VolumeParameters volumePart, MagicLightProbes.CalculationTarget calculationTarget)
        {
            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            MLPPointData pointData;

            parent.recalculationRequired = false;

            var offset = volumePart.position;

            var stepX = Mathf.FloorToInt(volumePart.demensions.x / spacing);
            var stepY = Mathf.FloorToInt(volumePart.demensions.y / spacing);
            var stepZ = Mathf.FloorToInt(volumePart.demensions.z / spacing) + 1;

            parent.xPointsCount = stepX;
            parent.yPointsCount = stepY;
            parent.zPointsCount = stepZ;

            offset   -= volumePart.demensions * 0.5f;
            offset.x += (volumePart.demensions.x - stepX * spacing) * 0.5f;
            offset.y += (volumePart.demensions.y - stepY * spacing) * 0.5f;
            offset.z += (volumePart.demensions.z - stepZ * spacing) * 0.5f;

            for (int x = 0; x < stepX; x++)
            {
                for (int y = 0; y < stepY; y++)
                {
                    for (int z = 0; z < stepZ; z++)
                    {
                        var pointPosition = offset + new Vector3(x * spacing, y * spacing, z * spacing);

                        pointData          = new MLPPointData();
                        pointData.position = pointPosition;
                        pointData.col      = x;
                        pointData.row      = y;
                        pointData.depth    = z;

                        if (parent.innerVolumes.Count > 0)
                        {
                            int containsIn = 0;

                            foreach (var volume in parent.innerVolumes)
                            {
                                if (parent.CheckIfInside(volume, pointPosition))
                                {
                                    containsIn++;
                                }
                            }

                            if (containsIn == 0)
                            {
                                parent.tmpSharedPointsArray.Add(pointData);
                                parent.totalProbes++;
                            }
                        }
                        else
                        {
                            parent.tmpSharedPointsArray.Add(pointData);
                            parent.totalProbes++;
                        }

                        parent.UpdateProgress(stepX * stepY * stepZ);
                    }
                }
            }

            if (!parent.isInBackground)
            {
                yield return(null);
            }

            parent.calculatingVolumeSubPass = false;
        }
Exemple #17
0
        public IEnumerator ExecutePass(MagicLightProbes parent)
        {
            if (parent.debugMode)
            {
                parent.tmpSharedPointsArray.Clear();
                parent.tmpSharedPointsArray.AddRange(parent.debugAcceptedPoints);
                parent.debugAcceptedPoints.Clear();
                parent.debugCulledPoints.Clear();
            }

            List <MLPPointData> tempList    = new List <MLPPointData>();
            List <MLPPointData> addedPoints = new List <MLPPointData>();

            foreach (var light in parent.lights)
            {
                parent.currentPass = "******" + light.name;
                parent.currentPassProgressCounter      = 0;
                parent.currentPassProgressFrameSkipper = 0;

                if (!parent.isInBackground)
                {
                    if (parent.UpdateProgress(parent.tmpSharedPointsArray.Count, 1))
                    {
                        yield return(null);
                    }
                }

                Parallel.For(0, parent.tmpSharedPointsArray.Count, i =>
                {
                    if (light.saveOnOutOfRange)
                    {
                        switch (light.lightType)
                        {
                        case MLPLight.MLPLightType.Directional:
                            break;

                        default:
                            if (light.calculationType != MLPLight.CalculationType.LightIntensity)
                            {
                                if (light.accurateTrace)
                                {
                                    foreach (var tracePoint in light.tracePointsData)
                                    {
                                        switch (light.calculationType)
                                        {
                                        case MLPLight.CalculationType.AccurateShadows:
                                            if (parent.tmpSharedPointsArray[i].inRangeForLights.Contains(light) && !parent.tmpSharedPointsArray[i].inCorner)
                                            {
                                                for (int np = 0; np < parent.tmpSharedPointsArray[i].nearbyPoints.Count; np++)
                                                {
                                                    if (parent.tmpSharedPointsArray[i].nearbyPoints[np] != null)
                                                    {
                                                        if (!parent.tmpSharedPointsArray[i].nearbyPoints[np].inRangeForLights.Contains(light) && !parent.tmpSharedPointsArray[i].inCorner)
                                                        {
                                                            if (light.saveOnOutOfRange)
                                                            {
                                                                if (!parent.tmpSharedPointsArray[i].inShadowForLights.Contains(light))
                                                                {
                                                                    if (light.lightMode == LightmapBakeType.Mixed)
                                                                    {
                                                                        if (parent.tmpSharedPointsArray[i].nearbyPoints[np].savedNearGeometry)
                                                                        {
                                                                            if ((parent.tmpSharedPointsArray[i].position - parent.tmpSharedPointsArray[i].nearbyPoints[np].position).normalized !=
                                                                                (parent.tmpSharedPointsArray[i].contactPoint - parent.tmpSharedPointsArray[i].nearbyPoints[np].position).normalized)
                                                                            {
                                                                                parent.tmpSharedPointsArray[i].contrastOnOutOfRangeArea = true;
                                                                                parent.tmpSharedPointsArray[i].nearbyPoints[np].contrastOnOutOfRangeArea = true;
                                                                            }
                                                                        }
                                                                    }
                                                                    else
                                                                    {
                                                                        if ((parent.tmpSharedPointsArray[i].position - parent.tmpSharedPointsArray[i].nearbyPoints[np].position).normalized !=
                                                                            (parent.tmpSharedPointsArray[i].contactPoint - parent.tmpSharedPointsArray[i].nearbyPoints[np].position).normalized)
                                                                        {
                                                                            parent.tmpSharedPointsArray[i].contrastOnOutOfRangeArea = true;
                                                                            parent.tmpSharedPointsArray[i].nearbyPoints[np].contrastOnOutOfRangeArea = true;
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                            break;
                                        }
                                    }
                                }
                                else
                                {
                                    switch (light.calculationType)
                                    {
                                    case MLPLight.CalculationType.AccurateShadows:
                                        if (parent.tmpSharedPointsArray[i].inRangeForLights.Contains(light) && !parent.tmpSharedPointsArray[i].inCorner)
                                        {
                                            for (int np = 0; np < parent.tmpSharedPointsArray[i].nearbyPoints.Count; np++)
                                            {
                                                if (parent.tmpSharedPointsArray[i].nearbyPoints[np] != null)
                                                {
                                                    if (!parent.tmpSharedPointsArray[i].nearbyPoints[np].inRangeForLights.Contains(light) && !parent.tmpSharedPointsArray[i].inCorner)
                                                    {
                                                        if (light.saveOnOutOfRange)
                                                        {
                                                            if (!parent.tmpSharedPointsArray[i].inShadowForLights.Contains(light))
                                                            {
                                                                if (light.lightMode == LightmapBakeType.Mixed)
                                                                {
                                                                    if (parent.tmpSharedPointsArray[i].nearbyPoints[np].savedNearGeometry)
                                                                    {
                                                                        if ((parent.tmpSharedPointsArray[i].position - parent.tmpSharedPointsArray[i].nearbyPoints[np].position).normalized !=
                                                                            (parent.tmpSharedPointsArray[i].contactPoint - parent.tmpSharedPointsArray[i].nearbyPoints[np].position).normalized)
                                                                        {
                                                                            parent.tmpSharedPointsArray[i].nearbyPoints[np].contrastOnOutOfRangeArea = true;
                                                                            parent.tmpSharedPointsArray[i].contrastOnOutOfRangeArea = true;
                                                                        }
                                                                    }
                                                                }
                                                                else
                                                                {
                                                                    if ((parent.tmpSharedPointsArray[i].position - parent.tmpSharedPointsArray[i].nearbyPoints[np].position).normalized !=
                                                                        (parent.tmpSharedPointsArray[i].contactPoint - parent.tmpSharedPointsArray[i].nearbyPoints[np].position).normalized)
                                                                    {
                                                                        parent.tmpSharedPointsArray[i].contrastOnOutOfRangeArea = true;
                                                                        parent.tmpSharedPointsArray[i].nearbyPoints[np].contrastOnOutOfRangeArea = true;
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                        break;
                                    }
                                }
                            }
                            break;
                        }
                    }
                });
            }

            if (parent.debugMode)
            {
                parent.currentPass = "******";
                parent.currentPassProgressCounter      = 0;
                parent.currentPassProgressFrameSkipper = 0;

                parent.tmpSharedPointsArray.AddRange(addedPoints);

                foreach (var point in parent.tmpSharedPointsArray)
                {
                    if (point != null)
                    {
                        if (point.inRangeForLights.Count > 0)
                        {
                            tempList.Add(point);
                        }
                        else
                        {
                            parent.tmpOutOfRangePoints.Add(point);
                        }

                        if (point.contrastOnOutOfRangeArea)
                        {
                            parent.tmpContrastOnOutOfRangePoints.Add(point);
                        }
                    }

                    if (!parent.isInBackground)
                    {
                        if (parent.UpdateProgress(parent.tmpSharedPointsArray.Count, 1000))
                        {
                            yield return(null);
                        }
                    }
                }

                switch (parent.debugPass)
                {
                case MagicLightProbes.DebugPasses.NearGeometry:
                    parent.debugAcceptedPoints.AddRange(tempList);
                    parent.debugAcceptedPoints.AddRange(parent.tmpContrastOnOutOfRangePoints);
                    parent.debugAcceptedPoints.AddRange(parent.tmpOutOfRangePoints);
                    break;

                case MagicLightProbes.DebugPasses.OutOfRange:
                    parent.debugAcceptedPoints.AddRange(tempList);
                    parent.debugCulledPoints.AddRange(parent.tmpOutOfRangePoints);

                    if (parent.debugPass == MagicLightProbes.DebugPasses.OutOfRange)
                    {
                        switch (parent.drawMode)
                        {
                        case MagicLightProbes.DrawModes.Accepted:
                            parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                            break;

                        case MagicLightProbes.DrawModes.Culled:
                            parent.totalProbesInSubVolume = parent.debugCulledPoints.Count;
                            break;

                        case MagicLightProbes.DrawModes.Both:
                            parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count + parent.debugCulledPoints.Count;
                            break;
                        }
                    }
                    break;

                case MagicLightProbes.DebugPasses.OutOfRangeBorders:
                    parent.debugAcceptedPoints.AddRange(parent.tmpContrastOnOutOfRangePoints);
                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                    break;

                case MagicLightProbes.DebugPasses.NearLights:
                case MagicLightProbes.DebugPasses.ShadingBorders:
                    parent.debugAcceptedPoints.AddRange(parent.tmpSharedPointsArray);
                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                    break;

                case MagicLightProbes.DebugPasses.LightIntensity:
                case MagicLightProbes.DebugPasses.ContrastAreas:
                case MagicLightProbes.DebugPasses.EqualProbes:
                    parent.debugAcceptedPoints.AddRange(parent.tmpContrastOnOutOfRangePoints);
                    parent.debugAcceptedPoints.AddRange(tempList);
                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                    break;

                case MagicLightProbes.DebugPasses.UnlitProbes:
                    parent.debugAcceptedPoints.AddRange(parent.tmpSharedPointsArray);
                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                    break;
                }
            }
            else
            {
                parent.totalProbesInSubVolume = parent.tmpSharedPointsArray.Count;
            }

            tempList.Clear();
            tempList = null;

            parent.calculatingVolumeSubPass = false;
        }
        public IEnumerator ExecutePass(MagicLightProbes parent)
        {
            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            List <MLPPointData> pointsToRemove = new List <MLPPointData>();

            if (parent.debugMode)
            {
                if (parent.subVolumesDivided.Count > 0)
                {
                    for (int i = 0; i < parent.debugAcceptedPoints.Count; i++)
                    {
                        if (parent.debugAcceptedPoints[i].col == parent.xPointsCount - 1 || parent.debugAcceptedPoints[i].depth == parent.zPointsCount)
                        {
                            pointsToRemove.Add(parent.debugAcceptedPoints[i]);
                        }

                        if (!parent.isInBackground)
                        {
                            if (parent.UpdateProgress(parent.debugAcceptedPoints.Count))
                            {
                                yield return(null);
                            }
                        }
                    }

                    for (int i = 0; i < pointsToRemove.Count; i++)
                    {
                        parent.debugAcceptedPoints.Remove(pointsToRemove[i]);
                    }
                }
            }
            else
            {
                if (parent.subVolumesDivided.Count > 0)
                {
                    for (int i = 0; i < parent.tmpNearbyGeometryPoints.Count; i++)
                    {
                        if (
                            parent.tmpNearbyGeometryPoints[i].col == parent.xPointsCount - 1 ||
                            parent.tmpNearbyGeometryPoints[i].depth == parent.zPointsCount)
                        {
                            pointsToRemove.Add(parent.tmpNearbyGeometryPoints[i]);
                        }

                        if (!parent.isInBackground)
                        {
                            if (parent.UpdateProgress(parent.tmpNearbyGeometryPoints.Count))
                            {
                                yield return(null);
                            }
                        }
                    }

                    for (int i = 0; i < pointsToRemove.Count; i++)
                    {
                        parent.tmpNearbyGeometryPoints.Remove(pointsToRemove[i]);
                    }
                }

                //parent.tmpNearbyGeometryPoints.AddRange(parent.tmpPointsNearGeometryIntersections);
            }

            pointsToRemove.Clear();
            parent.calculatingVolumeSubPass = false;
        }
Exemple #19
0
        public IEnumerator ExecutePass(MagicLightProbes parent, MagicLightProbes.VolumeParameters volumePart, MagicLightProbes.CalculationTarget calculationTarget)
        {
            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            List <MLPPointData> tempList = new List <MLPPointData>();

            if (parent.useVolumeBottom)
            {
                for (int i = 0; i < parent.tmpSharedPointsArray.Count; i++)
                {
                    if (parent.tmpSharedPointsArray[i].position.y >= volumePart.position.y - (volumePart.demensions.y / 2))
                    {
                        tempList.Add(parent.tmpSharedPointsArray[i]);
                    }
                }
            }
            else
            {
                NativeArray <RaycastHit>     raycastResults  = new NativeArray <RaycastHit>(parent.tmpSharedPointsArray.Count, Allocator.TempJob);
                NativeArray <RaycastCommand> raycastCommands = new NativeArray <RaycastCommand>(parent.tmpSharedPointsArray.Count, Allocator.TempJob);

                Parallel.For(0, parent.tmpSharedPointsArray.Count, i =>
                {
                    if (parent.tmpSharedPointsArray[i] != null)
                    {
                        raycastCommands[i] = new RaycastCommand(parent.tmpSharedPointsArray[i].position, Vector3.down, Mathf.Infinity, parent.layerMask);
                    }
                });

                JobHandle handle = RaycastCommand.ScheduleBatch(raycastCommands, raycastResults, 1, default);

                handle.Complete();

                for (int i = 0; i < raycastResults.Length; i++)
                {
                    RaycastHit outInfo = raycastResults[i];

                    if (outInfo.collider != null)
                    {
#if TERRAINPACKAGE_EXIST
                        if (outInfo.collider.GetComponent <Terrain>() != null)
                        {
                            if (outInfo.distance <= parent.maxHeightAboveTerrain)
                            {
                                tempList.Add(parent.tmpSharedPointsArray[i]);
                            }
                            else
                            {
                                if (parent.debugMode)
                                {
                                    parent.tmpOutOfMaxHeightPoints.Add(parent.tmpSharedPointsArray[i]);
                                }
                            }
                        }
                        else
                        {
                            //RaycastHit[] topDownRaycastResults = RaycastAllNonConvex(parent.tmpSharedPointsArray[i].position, parent.layerMask);
                            RaycastHit[] topDownRaycastResults = Physics.RaycastAll(parent.tmpSharedPointsArray[i].position, Vector3.down, Mathf.Infinity, parent.layerMask);

                            if (topDownRaycastResults.Length > 0)
                            {
                                for (int j = 0; j < topDownRaycastResults.Length; j++)
                                {
                                    if (CheckIfIsGroundOrFloor(parent, topDownRaycastResults[j].collider, parent.groundAndFloorKeywords))
                                    {
                                        if (outInfo.distance <= parent.maxHeightAboveGeometry)
                                        {
                                            tempList.Add(parent.tmpSharedPointsArray[i]);
                                        }
                                        else
                                        {
                                            if (parent.debugMode)
                                            {
                                                parent.tmpOutOfMaxHeightPoints.Add(parent.tmpSharedPointsArray[i]);
                                            }
                                        }

                                        break;
                                    }
                                }
                            }
                        }
#else
                        //RaycastHit[] topDownRaycastResults = RaycastAllNonConvex(parent.tmpSharedPointsArray[i].position, parent.layerMask);
                        RaycastHit[] topDownRaycastResults = Physics.RaycastAll(parent.tmpSharedPointsArray[i].position, Vector3.down, Mathf.Infinity, parent.layerMask);

                        if (topDownRaycastResults.Length > 0)
                        {
                            for (int j = 0; j < topDownRaycastResults.Length; j++)
                            {
                                if (CheckIfIsGroundOrFloor(parent, topDownRaycastResults[j].collider, parent.groundAndFloorKeywords))
                                {
                                    if (outInfo.distance <= parent.maxHeightAboveGeometry)
                                    {
                                        tempList.Add(parent.tmpSharedPointsArray[i]);
                                    }
                                    else
                                    {
                                        if (parent.debugMode)
                                        {
                                            parent.tmpOutOfMaxHeightPoints.Add(parent.tmpSharedPointsArray[i]);
                                        }
                                    }

                                    break;
                                }
                            }
                        }
#endif
                    }

                    if (!parent.isInBackground)
                    {
                        if (parent.UpdateProgress(parent.tmpSharedPointsArray.Count, 1000))
                        {
                            yield return(null);
                        }
                    }
                }

                raycastResults.Dispose();
                raycastCommands.Dispose();
            }

            if (parent.debugMode)
            {
                parent.debugAcceptedPoints.AddRange(tempList);
                parent.debugCulledPoints.AddRange(parent.tmpOutOfMaxHeightPoints);

                if (parent.debugPass == MagicLightProbes.DebugPasses.MaximumHeight)
                {
                    switch (parent.drawMode)
                    {
                    case MagicLightProbes.DrawModes.Accepted:
                        parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                        break;

                    case MagicLightProbes.DrawModes.Culled:
                        parent.totalProbesInSubVolume = parent.debugCulledPoints.Count;
                        break;

                    case MagicLightProbes.DrawModes.Both:
                        parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count + parent.debugCulledPoints.Count;
                        break;
                    }
                }
                else
                {
                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                }
            }
            else
            {
                parent.tmpOutOfMaxHeightPoints.Clear();
                parent.tmpSharedPointsArray.Clear();
                parent.tmpSharedPointsArray.AddRange(tempList);
                tempList.Clear();

                parent.totalProbesInSubVolume = parent.tmpSharedPointsArray.Count;
            }

            parent.calculatingVolumeSubPass = false;
        }
Exemple #20
0
        public IEnumerator ExecutePass(MagicLightProbes parent)
        {
            if (parent.debugMode)
            {
                parent.tmpSharedPointsArray.Clear();
                parent.tmpSharedPointsArray.AddRange(parent.debugAcceptedPoints);
                parent.tmpNearbyGeometryPoints.AddRange(parent.debugAcceptedPoints);
                parent.debugAcceptedPoints.Clear();
            }

            int l_counter = 0;

            foreach (var light in parent.lights)
            {
                l_counter++;
                parent.currentPass = "******"" + light.name + "\" - " + l_counter + "/" + parent.lights.Count;
                parent.currentPassProgressCounter      = 0;
                parent.currentPassProgressFrameSkipper = 0;

                if (light.lightType == MLPLight.MLPLightType.Directional || parent.lights.Contains(light))
                {
                    foreach (var tracePoint in light.tracePointsData)
                    {
                        tracePoint.pointGameObject.SetActive(false);
                    }

                    for (int i = 0; i < parent.tmpSharedPointsArray.Count; i++)
                    {
                        bool calculate = true;

                        if (light.lightType != MLPLight.MLPLightType.Directional)
                        {
                            if (Vector3.Distance(light.position, parent.tmpSharedPointsArray[i].position) > light.range)
                            {
                                calculate = false;
                            }
                        }

                        if (calculate)
                        {
                            if (light.accurateTrace)
                            {
                                int fullShaded = 0;

                                foreach (var tracePoint in light.tracePointsData)
                                {
                                    if (parent.CheckIfInShadow(light, tracePoint, parent.tmpSharedPointsArray[i]))
                                    {
                                        fullShaded++;
                                    }
                                    else
                                    {
                                        fullShaded--;
                                    }
                                }

                                if (fullShaded == light.tracePointsData.Count)
                                {
                                    if (!parent.tmpSharedPointsArray[i].inShadowForLights.Contains(light))
                                    {
                                        parent.tmpSharedPointsArray[i].inShadowForLights.Add(light);
                                    }
                                }
                                else
                                {
                                    parent.tmpSharedPointsArray[i].inShadowForLights.Remove(light);
                                }
                            }
                            else
                            {
                                parent.CheckIfInShadow(light, light.mainTracePoint, parent.tmpSharedPointsArray[i]);
                            }
                        }

                        if (!parent.isInBackground)
                        {
                            if (parent.UpdateProgress(parent.tmpSharedPointsArray.Count, 1000))
                            {
                                yield return(null);
                            }
                        }
                    }

                    light.gameObject.SetActive(true);
                }
            }

            if (parent.debugMode)
            {
                parent.debugAcceptedPoints.AddRange(parent.tmpSharedPointsArray);
            }

            parent.calculatingVolumeSubPass = false;
        }
Exemple #21
0
        public IEnumerator ExecutePass(MagicLightProbes parent)
        {
            if (parent.debugMode)
            {
                parent.tmpSharedPointsArray.Clear();
                parent.tmpSharedPointsArray.AddRange(parent.debugAcceptedPoints);
                parent.tmpNearbyGeometryPoints.AddRange(parent.debugAcceptedPoints);
                parent.debugAcceptedPoints.Clear();
            }

            foreach (var light in parent.lights)
            {
                parent.currentPass = "******" + light.name;
                parent.currentPassProgressCounter      = 0;
                parent.currentPassProgressFrameSkipper = 0;

                if (!parent.isInBackground)
                {
                    if (parent.UpdateProgress(parent.tmpSharedPointsArray.Count, 1))
                    {
                        yield return(null);
                    }
                }

                if (
                    light.lightType == MLPLight.MLPLightType.Directional ||
                    light.parentVolume == parent ||
                    (parent.parentVolume != null && light.parentVolume == parent.gameObject))
                {
                    for (int i = 0; i < parent.tmpSharedPointsArray.Count; i++)
                    {
                        switch (light.lightType)
                        {
                        case MLPLight.MLPLightType.Directional:
                            parent.tmpSharedPointsArray[i].inRangeForLights.Add(light);
                            break;

                        default:
                            if (light.accurateTrace)
                            {
                                foreach (var tracePoint in light.tracePointsData)
                                {
                                    parent.CheckIfOutOfRange(light, tracePoint, parent.tmpSharedPointsArray[i]);
                                    tracePoint.pointGameObject.SetActive(false);
                                }
                            }
                            else
                            {
                                parent.CheckIfOutOfRange(light, light.mainTracePoint, parent.tmpSharedPointsArray[i]);
                            }
                            break;
                        }
                    }
                }
            }

            if (parent.debugMode)
            {
                parent.debugAcceptedPoints.Clear();

                for (int i = 0; i < parent.tmpSharedPointsArray.Count; i++)
                {
                    switch (parent.debugPass)
                    {
                    case MagicLightProbes.DebugPasses.OutOfRange:
                        if (parent.tmpSharedPointsArray[i].inRangeForLights.Count > 0)
                        {
                            parent.debugAcceptedPoints.Add(parent.tmpSharedPointsArray[i]);
                        }
                        else
                        {
                            parent.debugCulledPoints.Add(parent.tmpSharedPointsArray[i]);
                        }
                        break;

                    case MagicLightProbes.DebugPasses.OutOfRangeBorders:
                    case MagicLightProbes.DebugPasses.LightIntensity:
                    case MagicLightProbes.DebugPasses.UnlitProbes:
                    case MagicLightProbes.DebugPasses.ShadingBorders:
                    case MagicLightProbes.DebugPasses.ContrastAreas:
                    case MagicLightProbes.DebugPasses.EqualProbes:
                        parent.debugAcceptedPoints.Add(parent.tmpSharedPointsArray[i]);
                        break;

                    case MagicLightProbes.DebugPasses.NearLights:
                        if (parent.tmpSharedPointsArray[i].inRangeForLights.Count > 0)
                        {
                            parent.debugAcceptedPoints.Add(parent.tmpSharedPointsArray[i]);
                        }
                        break;
                    }
                }
            }

            parent.calculatingVolumeSubPass = false;
        }
Exemple #22
0
        private void CalculateProbeSpacing(MagicLightProbes parent, MLPVolume currentVolume, bool realtimeEditing = false)
        {
            probeSpacingCalculating = true;

            #region Test Implementations

            //if (currentVolume.localCornerPointsPositions.Count > 0)
            //{
            //    if (realtimeEditing)
            //    {
            //        parent.currentPass = "******";
            //        parent.currentPassProgressCounter = 0;
            //        parent.currentPassProgressFrameSkipper = 0;
            //    }

            //    currentVolume.resultLocalCornerPointsPositions.Clear();

            //    ComputeBuffer inputArray;
            //    ComputeBuffer exitArray;
            //    //ComputeBuffer collisionNormals;

            //    inputArray = new ComputeBuffer(currentVolume.localCornerPointsPositions.Count, 3 * sizeof(float), ComputeBufferType.Default);
            //    exitArray = new ComputeBuffer(currentVolume.localCornerPointsPositions.Count, 3 * sizeof(float), ComputeBufferType.Default);
            //    //collisionNormals = new ComputeBuffer(currentVolume.localCornerPointsPositions.Count, 3 * sizeof(float), ComputeBufferType.Default);

            //    inputArray.SetData(currentVolume.localCornerPointsPositions.ToArray());
            //    exitArray.SetData(currentVolume.localCornerPointsPositions.ToArray());
            //    //collisionNormals.SetData(tmpCollisionNormals.ToArray());

            //    parent.calculateProbeSpacing.SetBuffer(parent.calculateProbeSpacing.FindKernel("CSMain"), "inputArray", inputArray);
            //    parent.calculateProbeSpacing.SetBuffer(parent.calculateProbeSpacing.FindKernel("CSMain"), "exitArray", exitArray);
            //    //parent.calculateProbeSpacing.SetBuffer(parent.calculateProbeSpacing.FindKernel("CSMain"), "collisionNormals", collisionNormals);
            //    parent.calculateProbeSpacing.SetFloat("probeSpacing", parent.cornerProbesSpacing);
            //    parent.calculateProbeSpacing.SetInt("arrayCount", currentVolume.localCornerPointsPositions.Count);

            //    parent.calculateProbeSpacing.Dispatch(parent.calculateProbeSpacing.FindKernel("CSMain"), 256, 1, 1);

            //    Vector3[] exit = new Vector3[inputArray.count];
            //    exitArray.GetData(exit);

            //    inputArray.Dispose();
            //    exitArray.Dispose();
            //    //collisionNormals.Dispose();

            //    List<MLPPointData> tempList = new List<MLPPointData>();
            //    tempList.AddRange(parent.tmpPointsNearGeometryIntersections);
            //    parent.tmpPointsNearGeometryIntersections.Clear();

            //    for (int i = 0; i < exit.Length; i++)
            //    {
            //        if (exit[i] == Vector3.zero)
            //        {
            //            continue;
            //        }

            //        if (!realtimeEditing)
            //        {
            //            tempList[i].position = exit[i];
            //            parent.tmpPointsNearGeometryIntersections.Add(tempList[i]);
            //        }

            //        currentVolume.resultLocalCornerPointsPositions.Add(exit[i]);

            //        parent.UpdateProgress(exit.Length, 1000);
            //    }

            //    tempList.Clear();
            //}

            //for (int i = 0; i < parent.tmpPointsNearGeometryIntersections.Count; i++)
            //{
            //    for (int j = 0; j < parent.tmpPointsNearGeometryIntersections.Count; j++)
            //    {
            //        if (parent.tmpPointsNearGeometryIntersections[j] != parent.tmpPointsNearGeometryIntersections[i])
            //        {
            //            float distance = Vector3.Distance(parent.tmpPointsNearGeometryIntersections[i].position, parent.tmpPointsNearGeometryIntersections[j].position);
            //            float angle = Vector3.Dot(parent.tmpPointsNearGeometryIntersections[i].collisionNormal, parent.tmpPointsNearGeometryIntersections[j].collisionNormal);

            //            if (distance <= parent.cornerProbesSpacing && angle > 0.9f)
            //            {
            //                parent.tmpPointsNearGeometryIntersections.RemoveAt(i);
            //            }
            //        }
            //    }
            //}

            #endregion

            List <MLPPointData> cullList = new List <MLPPointData>();

            for (int i = 0; i < currentVolume.localCornerPoints.Count; i++)
            {
                currentVolume.localCornerPoints[i].lockForCull = false;
                currentVolume.localCornerPoints[i].removed     = false;
            }

            for (int i = 0; i < currentVolume.localCornerPoints.Count; i++)
            {
                if (!currentVolume.localCornerPoints[i].removed)
                {
                    for (int j = 0; j < currentVolume.localCornerPoints.Count; j++)
                    {
                        if (currentVolume.localCornerPoints[j] != currentVolume.localCornerPoints[i])
                        {
                            float distance = Vector3.Distance(currentVolume.localCornerPoints[i].position, currentVolume.localCornerPoints[j].position);
                            float angle    = Vector3.Dot(currentVolume.localCornerPoints[i].collisionNormal, currentVolume.localCornerPoints[j].collisionNormal);

                            if (distance <= parent.cornerProbesSpacing && angle > 0.9f && !currentVolume.localCornerPoints[j].lockForCull)
                            {
                                currentVolume.localCornerPoints[i].lockForCull = true;
                                currentVolume.localCornerPoints[j].removed     = true;
                                cullList.Add(currentVolume.localCornerPoints[j]);
                            }
                        }
                    }
                }
            }

            currentVolume.resultLocalCornerPointsPositions.Clear();

            for (int i = 0; i < currentVolume.localCornerPoints.Count; i++)
            {
                if (!cullList.Contains(currentVolume.localCornerPoints[i]))
                {
                    currentVolume.resultLocalCornerPointsPositions.Add(currentVolume.localCornerPoints[i].position);

                    if (!realtimeEditing)
                    {
                        parent.tmpPointsNearGeometryIntersections.Add(currentVolume.localCornerPoints[i]);
                    }
                }
            }

            probeSpacingCalculating = false;
        }
        public IEnumerator ExecutePass(MagicLightProbes parent, MagicLightProbes.VolumeParameters volumePart, MagicLightProbes.CalculationTarget calculationTarget)
        {
            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            List <MLPPointData> tempAcceptedList = new List <MLPPointData>();
            List <MLPPointData> tempCulledList   = new List <MLPPointData>();

            bool physicsOptionsChanged = false;

            if (Physics.queriesHitBackfaces)
            {
                Physics.queriesHitBackfaces = false;
                physicsOptionsChanged       = true;
            }

            if (parent.debugMode)
            {
                parent.tmpSharedPointsArray.Clear();
                parent.tmpSharedPointsArray.AddRange(parent.debugAcceptedPoints);
                parent.debugAcceptedPoints.Clear();
                parent.debugCulledPoints.Clear();
            }

            for (int i = 0; i < parent.tmpSharedPointsArray.Count; i++)
            {
                Collider[] colliders = Physics.OverlapSphere(parent.tmpSharedPointsArray[i].position, parent.collisionDetectionRadius, parent.layerMask);

                if (colliders.Length == 0)
                {
                    Ray[] checkRays =
                    {
                        new Ray(parent.tmpSharedPointsArray[i].position, Vector3.down),
                        new Ray(parent.tmpSharedPointsArray[i].position,   -Vector3.down),
                        new Ray(parent.tmpSharedPointsArray[i].position, Vector3.right),
                        new Ray(parent.tmpSharedPointsArray[i].position,  -Vector3.right),
                        new Ray(parent.tmpSharedPointsArray[i].position, Vector3.forward),
                        new Ray(parent.tmpSharedPointsArray[i].position, -Vector3.forward)
                    };

                    int freeRays = 0;

                    foreach (var ray in checkRays)
                    {
                        RaycastHit hitInfoForward;
                        RaycastHit hitInfoBackward;

                        Vector3 endPoint = parent.tmpSharedPointsArray[i].position + (ray.direction * 5000.0f);
                        Ray     backRay  = new Ray(endPoint, (ray.origin - endPoint).normalized);

                        if (Physics.Raycast(ray, out hitInfoForward, 5000.0f, parent.layerMask))
                        {
                            if (parent.CheckIfStatic(hitInfoForward.collider.gameObject))
                            {
                                if (Physics.Raycast(new Ray(hitInfoForward.point, (parent.tmpSharedPointsArray[i].position - hitInfoForward.point).normalized), out hitInfoBackward, 5000.0f, parent.layerMask))
                                {
                                    if (parent.CheckIfStatic(hitInfoForward.collider.gameObject))
                                    {
                                        if (hitInfoForward.distance <= hitInfoBackward.distance)
                                        {
                                            freeRays++;
                                        }
                                    }
                                    else
                                    {
                                        freeRays++;
                                    }
                                }
                                else
                                {
                                    freeRays++;
                                }
                            }
                            else
                            {
                                freeRays++;
                            }
                        }
                        else
                        {
                            if (Physics.Raycast(backRay, out hitInfoBackward, 5000.0f, parent.layerMask))
                            {
                                float dist = Vector3.Distance(parent.tmpSharedPointsArray[i].position, endPoint);

                                if (hitInfoBackward.distance >= 5000.0f)
                                {
                                    freeRays++;
                                }
                            }
                            else
                            {
                                freeRays++;
                            }
                        }
                    }

                    if (freeRays == checkRays.Length)
                    {
                        tempAcceptedList.Add(parent.tmpSharedPointsArray[i]);
                    }
                    else
                    {
                        tempCulledList.Add(parent.tmpSharedPointsArray[i]);
                    }
                }
                else
                {
                    foreach (var collider in colliders)
                    {
                        if (parent.CheckIfStatic(collider.gameObject))
                        {
                            if (!tempCulledList.Contains(parent.tmpSharedPointsArray[i]))
                            {
                                tempCulledList.Add(parent.tmpSharedPointsArray[i]);
                            }
                        }
                        else
                        {
                            tempAcceptedList.Add(parent.tmpSharedPointsArray[i]);
                        }
                    }
                }

                if (!parent.isInBackground)
                {
                    if (parent.UpdateProgress(parent.tmpSharedPointsArray.Count, 1000))
                    {
                        yield return(null);
                    }
                }
            }

            if (physicsOptionsChanged)
            {
                Physics.queriesHitBackfaces = true;
            }

            if (parent.debugMode)
            {
                parent.debugAcceptedPoints.AddRange(tempAcceptedList);
                parent.debugCulledPoints.AddRange(tempCulledList);

                if (parent.debugPass == MagicLightProbes.DebugPasses.GeometryCollision)
                {
                    switch (parent.drawMode)
                    {
                    case MagicLightProbes.DrawModes.Accepted:
                        parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                        break;

                    case MagicLightProbes.DrawModes.Culled:
                        parent.totalProbesInSubVolume = parent.debugCulledPoints.Count;
                        break;

                    case MagicLightProbes.DrawModes.Both:
                        parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count + parent.debugCulledPoints.Count;
                        break;
                    }
                }
                else
                {
                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                }
            }
            else
            {
                parent.tmpSharedPointsArray.Clear();
                parent.tmpSharedPointsArray.AddRange(tempAcceptedList);
                tempAcceptedList.Clear();
                tempCulledList.Clear();
            }

            parent.calculatingVolumeSubPass = false;
        }
Exemple #24
0
        public IEnumerator ExecutePass(MagicLightProbes parent, int volumePartIndex, float cornersDetectionThreshold, MLPVolume currentVolume = null, bool realtimeEditing = false)
        {
            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            List <TempPointData> tempPointDatas = new List <TempPointData>();

            string dirPath      = parent.assetEditorPath + "/Scene Data/" + SceneManager.GetActiveScene().name + "/" + parent.name + "/GeometryIntersectionsData";
            string fullFilePath = dirPath + "/" + parent.name + "_" + "vol_" + volumePartIndex + "_GeometryIntersectionsData.mlpdat";

            if (!Directory.Exists(dirPath))
            {
                Directory.CreateDirectory(dirPath);
            }

            if (!realtimeEditing)
            {
                List <MLPPointData> removedPoints    = new List <MLPPointData>();
                List <Vector3>      collisionNormals = new List <Vector3>();

                if (parent.debugMode)
                {
                    parent.tmpSharedPointsArray.Clear();
                    parent.tmpSharedPointsArray.AddRange(parent.debugAcceptedPoints);
                    parent.debugAcceptedPoints.Clear();
                }

                for (int i = 0; i < parent.tmpSharedPointsArray.Count; i++)
                {
                    Ray[] checkRays =
                    {
                        new Ray(parent.tmpSharedPointsArray[i].position, Vector3.forward),
                        new Ray(parent.tmpSharedPointsArray[i].position, -Vector3.forward),
                        new Ray(parent.tmpSharedPointsArray[i].position, Vector3.right),
                        new Ray(parent.tmpSharedPointsArray[i].position,   -Vector3.right),
                        new Ray(parent.tmpSharedPointsArray[i].position, Vector3.up),
                        new Ray(parent.tmpSharedPointsArray[i].position,      -Vector3.up),
                    };

                    SortedList <float, Vector3> results = new SortedList <float, Vector3>();
                    RaycastHit hitInfo;

                    foreach (var ray in checkRays)
                    {
                        if (Physics.Raycast(ray, out hitInfo, cornersDetectionThreshold + 0.1f, parent.layerMask))
                        {
                            if (parent.CheckIfStatic(hitInfo.collider.gameObject))
                            {
                                if (!results.Keys.Contains(hitInfo.distance))
                                {
                                    results.Add(hitInfo.distance, hitInfo.point);
                                }
                            }
                        }
                    }

                    if (results.Count > 1)
                    {
                        Vector3 targetPoint       = new Vector3();
                        Vector3 avaragedDirection = new Vector3();

                        foreach (var result in results)
                        {
                            targetPoint.x += result.Value.x;
                            targetPoint.y += result.Value.y;
                            targetPoint.z += result.Value.z;

                            avaragedDirection.x += result.Value.x - parent.tmpSharedPointsArray[i].position.x;
                            avaragedDirection.y += result.Value.y - parent.tmpSharedPointsArray[i].position.y;
                            avaragedDirection.z += result.Value.z - parent.tmpSharedPointsArray[i].position.z;
                        }

                        targetPoint.x /= results.Count;
                        targetPoint.y /= results.Count;
                        targetPoint.z /= results.Count;

                        avaragedDirection.x /= results.Count;
                        avaragedDirection.y /= results.Count;
                        avaragedDirection.z /= results.Count;

                        avaragedDirection = Vector3.Normalize(avaragedDirection);

                        Ray          rayToPoint = new Ray(parent.tmpSharedPointsArray[i].position, (targetPoint - parent.tmpSharedPointsArray[i].position).normalized);
                        MLPPointData newPoint   = new MLPPointData();

                        if (Physics.Raycast(rayToPoint, out hitInfo, cornersDetectionThreshold * 2, parent.layerMask))
                        {
                            newPoint.position        = hitInfo.point;
                            newPoint.position       -= avaragedDirection * parent.distanceFromNearbyGeometry;
                            newPoint.collisionNormal = hitInfo.normal;
                            newPoint.inCorner        = true;
                            newPoint.contactPoint    = targetPoint;

                            currentVolume.localCornerPoints.Add(newPoint);
                            currentVolume.localCornerPointsPositions.Add(newPoint.position);
                            currentVolume.localAvaragedDirections.Add(avaragedDirection);
                            tempPointDatas.Add(new TempPointData(newPoint.position, newPoint.collisionNormal));

                            //if (Vector3.Distance(parent.tmpSharedPointsArray[i].position, hitInfo.point) < parent.cornersDetectionThreshold / 2)
                            //{
                            //    removedPoints.Add(parent.tmpSharedPointsArray[i]);

                            //    //collisionNormals.Add(newPoint.collisionNormal);
                            //}
                        }
                    }

                    if (!parent.isInBackground)
                    {
                        if (parent.UpdateProgress(parent.tmpSharedPointsArray.Count, 1000))
                        {
                            yield return(null);
                        }
                    }
                }

                if (!parent.debugMode)
                {
                    MLPDataSaver.SaveData(tempPointDatas, fullFilePath);
                }

                parent.currentPass = "******";
                parent.currentPassProgressCounter      = 0;
                parent.currentPassProgressFrameSkipper = 0;

                CalculateProbeSpacing(parent, currentVolume, realtimeEditing);

                while (probeSpacingCalculating)
                {
                    yield return(null);
                }

                if (parent.debugMode)
                {
                    removedPoints.Clear();
                    parent.tmpSharedPointsArray.Clear();

                    switch (parent.debugPass)
                    {
                    case MagicLightProbes.DebugPasses.GeometryIntersections:
                        parent.debugAcceptedPoints.AddRange(parent.tmpPointsNearGeometryIntersections);
                        break;

                    case MagicLightProbes.DebugPasses.NearGeometry:
                        parent.debugAcceptedPoints.AddRange(parent.tmpPointsNearGeometryIntersections);
                        break;
                    }

                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                }
            }
            else
            {
                tempPointDatas = MLPDataSaver.LoadData(tempPointDatas, fullFilePath);
                currentVolume.localCornerPoints.Clear();

                if (tempPointDatas.Count > 0)
                {
                    for (int i = 0; i < tempPointDatas.Count; i++)
                    {
                        MLPPointData tempPoint = new MLPPointData();
                        tempPoint.position        = new Vector3(tempPointDatas[i].xPos, tempPointDatas[i].yPos, tempPointDatas[i].zPos);
                        tempPoint.collisionNormal = new Vector3(tempPointDatas[i].collisionNormalX, tempPointDatas[i].collisionNormalY, tempPointDatas[i].collisionNormalZ);
                        currentVolume.localCornerPoints.Add(tempPoint);
                    }
                }

                CalculateProbeSpacing(parent, currentVolume, realtimeEditing);

                if (!parent.isInBackground)
                {
                    while (probeSpacingCalculating)
                    {
                        yield return(null);
                    }
                }
            }

            parent.calculatingVolumeSubPass = false;
        }
Exemple #25
0
        public IEnumerator ExecutePass(MagicLightProbes parent, int volumePartIndex, MLPVolume currentVolume = null, bool realtimeEditing = false)
        {
            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            if (parent.debugMode)
            {
                parent.tmpNearbyGeometryPoints.Clear();
                parent.tmpNearbyGeometryPoints.AddRange(parent.debugAcceptedPoints);
                parent.debugAcceptedPoints.Clear();
            }

            List <TempPointData> tempPointDatas    = new List <TempPointData>();
            List <MLPPointData>  tempList          = new List <MLPPointData>();
            List <MLPPointData>  lockedForCullList = new List <MLPPointData>();

            string dirPath      = parent.assetEditorPath + "/Scene Data/" + SceneManager.GetActiveScene().name + "/" + parent.name + "/ColorThresholdData";
            string fullFilePath = dirPath + "/" + parent.name + "_" + "vol_" + volumePartIndex + "_ColorThresholdData.mlpdat";

            if (!Directory.Exists(dirPath))
            {
                Directory.CreateDirectory(dirPath);
            }

            if (realtimeEditing)
            {
                tempPointDatas = MLPDataSaver.LoadData(tempPointDatas, fullFilePath);

                if (tempPointDatas.Count > 0)
                {
                    for (int i = 0; i < tempPointDatas.Count; i++)
                    {
                        MLPPointData pointData = new MLPPointData();

                        pointData.position      = new Vector3(tempPointDatas[i].xPos, tempPointDatas[i].yPos, tempPointDatas[i].zPos);
                        pointData.averagedColor = new Color(tempPointDatas[i].colorR, tempPointDatas[i].colorG, tempPointDatas[i].colorB);

                        for (int j = 0; j < tempPointDatas[i].nearbyAvaragedColors.Length; j++)
                        {
                            MLPPointData nerabyPoint = new MLPPointData();
                            nerabyPoint.avaragedColorValue = tempPointDatas[i].nearbyAvaragedColors[j];

                            pointData.nearbyPoints.Add(nerabyPoint);
                        }

                        tempList.Add(pointData);
                    }

                    parent.tmpSharedPointsArray.Clear();

                    for (int i = 0; i < tempList.Count; i++)
                    {
                        tempList[i].equalColor = false;
                    }
                }
            }
            else
            {
                tempList.AddRange(parent.tmpNearbyGeometryPoints);
            }

            for (int i = 0; i < tempList.Count; i++)
            {
                if (!realtimeEditing)
                {
                    if ((tempList[i].collisionObject != null && tempList[i].collisionObject.gameObject.GetComponent <MLPForceSaveProbes>() != null) ||
                        tempList[i].onGeometryEdge ||
                        tempList[i].lightLeakLocked)
                    {
                        TempPointData tempPoint = new TempPointData(tempList[i].position, tempList[i].averagedColor, new List <float>());
                        tempPointDatas.Add(tempPoint);

                        continue;
                    }
                    else
                    {
                        if (tempList[i].contrastOnShadingArea || tempList[i].contrastOnOutOfRangeArea)
                        {
                            if (parent.forceSaveProbesOnShadingBorders)
                            {
                                TempPointData tempPoint = new TempPointData(tempList[i].position, tempList[i].averagedColor, new List <float>());
                                tempPointDatas.Add(tempPoint);

                                continue;
                            }
                        }
                    }
                }

                int equivalent = 0;

                List <float> tempAvaragedColors = new List <float>();

                for (int j = 0; j < tempList[i].nearbyPoints.Count; j++)
                {
                    if (tempList[i].nearbyPoints[j] != null)
                    {
                        if (tempList[i].nearbyPoints[j].avaragedColorValue == 0)
                        {
                            float averagedColorValue =
                                (tempList[i].nearbyPoints[j].averagedColor.r +
                                 tempList[i].nearbyPoints[j].averagedColor.g +
                                 tempList[i].nearbyPoints[j].averagedColor.b) / 3;

                            tempList[i].nearbyPoints[j].avaragedColorValue = averagedColorValue;
                        }

                        if (tempList[i].avaragedColorValue == 0)
                        {
                            float averagedColorValueCompared =
                                (tempList[i].averagedColor.r +
                                 tempList[i].averagedColor.g +
                                 tempList[i].averagedColor.b) / 3;

                            tempList[i].avaragedColorValue = averagedColorValueCompared;
                        }

                        if (tempList[i].nearbyPoints[j].avaragedColorValue.EqualsApproximately(tempList[i].avaragedColorValue, parent.colorTreshold))
                        {
                            equivalent++;
                        }

                        tempAvaragedColors.Add(tempList[i].nearbyPoints[j].avaragedColorValue);
                    }
                }

                if (tempList[i].nearbyPoints.Count > 0 && equivalent == tempList[i].nearbyPoints.Count)
                {
                    tempList[i].equalColor = true;
                }

                if (!realtimeEditing)
                {
                    TempPointData tempPoint = new TempPointData(tempList[i].position, tempList[i].averagedColor, tempAvaragedColors);
                    tempPointDatas.Add(tempPoint);
                    //currentVolume.localColorThresholdEditingPoints.Add(tempList[i]);
                }

                if (!parent.isInBackground)
                {
                    if (parent.UpdateProgress(tempList.Count, 1000))
                    {
                        yield return(null);
                    }
                }
            }

            if (!realtimeEditing)
            {
                MLPDataSaver.SaveData(tempPointDatas, fullFilePath);
            }

            if (!parent.debugMode)
            {
                if (realtimeEditing)
                {
                    currentVolume.localNearbyGeometryPoints.Clear();
                    currentVolume.localNearbyGeometryPoints.AddRange(lockedForCullList);
                    currentVolume.localNearbyGeometryPoints.AddRange(tempList);
                }

                parent.currentPass = "******";
                parent.currentPassProgressCounter      = 0;
                parent.currentPassProgressFrameSkipper = 0;

                foreach (var point in tempList)
                {
                    if (point.equalColor)
                    {
                        if (parent.forceSaveProbesOnShadingBorders)
                        {
                            if (!point.contrastOnShadingArea && !point.contrastOnOutOfRangeArea)
                            {
                                if (realtimeEditing)
                                {
                                    currentVolume.localNearbyGeometryPoints.Remove(point);
                                }
                                else
                                {
                                    parent.tmpNearbyGeometryPoints.Remove(point);
                                }
                            }
                        }
                        else
                        {
                            if (realtimeEditing)
                            {
                                currentVolume.localNearbyGeometryPoints.Remove(point);
                            }
                            else
                            {
                                parent.tmpNearbyGeometryPoints.Remove(point);
                            }
                        }
                    }
                    else
                    {
                        if (!realtimeEditing)
                        {
                            currentVolume.resultNearbyGeometryPointsPositions.Add(point.position);
                        }
                    }

                    if (!parent.isInBackground)
                    {
                        if (parent.UpdateProgress(tempList.Count, 1000))
                        {
                            yield return(null);
                        }
                    }
                }

                tempList.Clear();

                parent.totalProbesInSubVolume = parent.tmpSharedPointsArray.Count;
            }
            else
            {
                parent.debugAcceptedPoints.AddRange(parent.tmpNearbyGeometryPoints);
                parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
            }

            parent.calculatingVolumeSubPass = false;
        }
Exemple #26
0
        public IEnumerator ExecutePass(MagicLightProbes parent, MLPVolume currentVolume = null)
        {
            parent.currentPass = "******";
            parent.currentPassProgressCounter      = 0;
            parent.currentPassProgressFrameSkipper = 0;

            if (parent.debugMode)
            {
                parent.tmpSharedPointsArray.Clear();
                parent.tmpSharedPointsArray.AddRange(parent.debugAcceptedPoints);
                parent.debugAcceptedPoints.Clear();
            }

            for (int i = 0; i < parent.tmpSharedPointsArray.Count; i++)
            {
                float resultIntensity = 0;

                foreach (var light in parent.lights)
                {
                    RaycastHit hitInfo;
                    Ray        rayToLight = new Ray();

                    switch (light.lightType)
                    {
                    case MLPLight.MLPLightType.Directional:
                        rayToLight = new Ray(parent.tmpSharedPointsArray[i].position, -light.transform.forward);

                        if (!Physics.Raycast(rayToLight, out hitInfo, Mathf.Infinity, parent.layerMask))
                        {
                            if (light.lightMode == LightmapBakeType.Mixed)
                            {
                                if (parent.tmpSharedPointsArray[i].savedNearGeometry)
                                {
                                    resultIntensity += light.intensity;
                                }
                            }
                            else
                            {
                                resultIntensity += light.intensity;
                            }
                        }
                        break;

                    default:
                        if (light.accurateTrace)
                        {
                            if (parent.tmpSharedPointsArray[i].inRangeForLights.Contains(light) && !parent.tmpSharedPointsArray[i].inShadowForLights.Contains(light))
                            {
                                float tracePointWeight = 1f / light.tracePoints.Count;

                                foreach (var tracePoint in light.tracePointsData)
                                {
                                    tracePoint.pointGameObject.SetActive(true);
                                    rayToLight = new Ray(parent.tmpSharedPointsArray[i].position, (tracePoint.position - parent.tmpSharedPointsArray[i].position).normalized);

                                    if (Physics.Raycast(rayToLight, out hitInfo, Mathf.Infinity, parent.layerMask))
                                    {
                                        if (hitInfo.collider.name == tracePoint.name)
                                        {
                                            //resultIntensity += tracePointWeight;
                                            resultIntensity += 1.0F / (1.0F + 25.0F * (tracePoint.position - parent.tmpSharedPointsArray[i].position).sqrMagnitude / (light.range * light.range));
                                            parent.tmpSharedPointsArray[i].distancesToLights.Add(hitInfo.distance);
                                        }
                                    }

                                    tracePoint.pointGameObject.SetActive(false);
                                }
                            }
                        }
                        else
                        {
                            if (parent.tmpSharedPointsArray[i].inRangeForLights.Contains(light) && !parent.tmpSharedPointsArray[i].inShadowForLights.Contains(light))
                            {
                                rayToLight = new Ray(parent.tmpSharedPointsArray[i].position, (light.transform.position - parent.tmpSharedPointsArray[i].position).normalized);

                                if (Physics.Raycast(rayToLight, out hitInfo, Mathf.Infinity, parent.layerMask))
                                {
                                    if (hitInfo.collider.name == light.gameObject.name)
                                    {
                                        if (light.calculationType == MLPLight.CalculationType.AccurateShadows)
                                        {
                                            if (parent.tmpSharedPointsArray[i].inRangeForLights.Contains(light) && !parent.tmpSharedPointsArray[i].inShadowForLights.Contains(light))
                                            {
                                                if (light.lightMode == LightmapBakeType.Mixed)
                                                {
                                                    if (parent.tmpSharedPointsArray[i].savedNearGeometry)
                                                    {
                                                        //resultIntensity += light.intensity;
                                                        resultIntensity += 1.0F / (1.0F + 25.0F * (light.position - parent.tmpSharedPointsArray[i].position).sqrMagnitude / (light.range * light.range));
                                                    }
                                                }
                                                else
                                                {
                                                    //resultIntensity += light.intensity;
                                                    resultIntensity += 1.0F / (1.0F + 25.0F * (light.position - parent.tmpSharedPointsArray[i].position).sqrMagnitude / (light.range * light.range));
                                                }
                                            }
                                        }
                                        else
                                        {
                                            if (light.lightMode == LightmapBakeType.Mixed)
                                            {
                                                if (parent.tmpSharedPointsArray[i].savedNearGeometry)
                                                {
                                                    //resultIntensity += light.intensity;
                                                    resultIntensity += 1.0F / (1.0F + 25.0F * (light.position - parent.tmpSharedPointsArray[i].position).sqrMagnitude / (light.range * light.range));
                                                }
                                            }
                                            else
                                            {
                                                //resultIntensity += light.intensity;
                                                resultIntensity += 1.0F / (1.0F + 25.0F * (light.position - parent.tmpSharedPointsArray[i].position).sqrMagnitude / (light.range * light.range));
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        break;
                    }
                }

                parent.tmpSharedPointsArray[i].SetLightIntensity(resultIntensity);

                if (parent.tmpSharedPointsArray[i].lightIntensity == 0 &&
                    !parent.tmpSharedPointsArray[i].contrastOnOutOfRangeArea &&
                    !parent.tmpSharedPointsArray[i].contrastOnShadingArea)
                {
                    parent.tmpSharedPointsArray[i].isUnlit = true;
                    parent.tmpUnlitPoints.Add(parent.tmpSharedPointsArray[i]);
                    currentVolume.localUnlitPointsPositions.Add(parent.tmpSharedPointsArray[i].position);
                }

                if (!parent.isInBackground)
                {
                    if (parent.UpdateProgress(parent.tmpSharedPointsArray.Count, 1000))
                    {
                        yield return(null);
                    }
                }
            }

            if (parent.debugMode)
            {
                switch (parent.debugPass)
                {
                case MagicLightProbes.DebugPasses.OutOfRangeBorders:
                case MagicLightProbes.DebugPasses.ShadingBorders:
                case MagicLightProbes.DebugPasses.ContrastAreas:
                case MagicLightProbes.DebugPasses.EqualProbes:
                    parent.debugAcceptedPoints.AddRange(parent.tmpSharedPointsArray);
                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                    break;

                case MagicLightProbes.DebugPasses.LightIntensity:
                    parent.debugAcceptedPoints.AddRange(parent.tmpSharedPointsArray);
                    parent.totalProbesInSubVolume = parent.debugAcceptedPoints.Count;
                    break;

                case MagicLightProbes.DebugPasses.UnlitProbes:
                    parent.debugCulledPoints.AddRange(parent.tmpUnlitPoints);
                    parent.totalProbesInSubVolume = parent.debugCulledPoints.Count;
                    break;
                }
            }

            parent.calculatingVolumeSubPass = false;
        }