Exemplo n.º 1
0
    private void BakingTaskManagerUpdate()
    {
        if (bakingTaskManager.IsBusy)
        {
            bool isCancelled = EditorUtility.DisplayCancelableProgressBar("Baking Shadow Volume", string.Empty, bakingTaskManager.ProgressValue);
            if (isCancelled)
            {
                bakingTaskManager.StopAllTasks();
                ReleaseMemory();
            }
        }
        else
        {
            EditorUtility.ClearProgressBar();
        }

        bakingTaskManager.Update();

        ABakingTask completeTask = bakingTaskManager.PopCompleteTask();

        if (completeTask != null)
        {
            CreateShadowVolume(completeTask);
            ShadowVolumeCameraDraw();
            MarkSceneAsDirty();
        }
    }
Exemplo n.º 2
0
    private void CreateShadowVolume(ABakingTask completeBakingTask)
    {
        Transform root = GetRoot();

        Material debugMtrl = GetDebugMaterial();

        ShadowVolumeObject svObj = FindShadowVolumeObject(completeBakingTask.Transform.gameObject);

        if (svObj == null)
        {
            GameObject newMeshGo = new GameObject("_$SV " + completeBakingTask.Transform.gameObject.name + "$_");
            newMeshGo.transform.parent           = root;
            newMeshGo.transform.localScale       = completeBakingTask.Transform.lossyScale;
            newMeshGo.transform.localEulerAngles = completeBakingTask.Transform.eulerAngles;
            newMeshGo.transform.localPosition    = completeBakingTask.Transform.position;
            MeshFilter mf = newMeshGo.AddComponent <MeshFilter>();
            mf.sharedMesh = completeBakingTask.GetNewMesh();
            MeshRenderer mr = newMeshGo.AddComponent <MeshRenderer>();
            mr.sharedMaterial = debugMtrl;
            mr.enabled        = false;

            svObj                    = newMeshGo.AddComponent <ShadowVolumeObject>();
            svObj.source             = completeBakingTask.Transform.gameObject;
            svObj.sourceMeshRenderer = completeBakingTask.Transform.GetComponent <MeshRenderer>();
            svObj.sourceMeshFilter   = completeBakingTask.Transform.GetComponent <MeshFilter>();
            svObj.meshFilter         = mf;
            svObj.l2w                = mf.transform.localToWorldMatrix;
            svObj.wPos               = mf.transform.position;
        }
        else
        {
            svObj.transform.parent           = root;
            svObj.transform.localScale       = completeBakingTask.Transform.lossyScale;
            svObj.transform.localEulerAngles = completeBakingTask.Transform.eulerAngles;
            svObj.transform.localPosition    = completeBakingTask.Transform.position;

            svObj.l2w  = svObj.meshFilter.transform.localToWorldMatrix;
            svObj.wPos = svObj.meshFilter.transform.position;

            MeshFilter mf = svObj.gameObject.GetComponent <MeshFilter>();
            if (mf == null)
            {
                mf = svObj.gameObject.AddComponent <MeshFilter>();
            }
            mf.sharedMesh = completeBakingTask.GetNewMesh();

            MeshRenderer mr = svObj.gameObject.GetComponent <MeshRenderer>();
            if (mr == null)
            {
                mr = svObj.gameObject.AddComponent <MeshRenderer>();
            }
            mr.sharedMaterial = debugMtrl;
            mr.enabled        = false;
        }
    }
Exemplo n.º 3
0
        public ABakingTask PopCompleteTask()
        {
            if (completeTasks.Count > 0)
            {
                ABakingTask task = completeTasks[completeTasks.Count - 1];
                completeTasks.RemoveAt(completeTasks.Count - 1);
                popTasks.Add(task);

                return(task);
            }
            return(null);
        }
Exemplo n.º 4
0
    private void BakeAGameObject(GameObject go)
    {
        ShadowVolumeObject svo = go.GetComponent <ShadowVolumeObject>();

        if (svo != null)
        {
            go = svo.source;
        }

        PrefabType type = PrefabUtility.GetPrefabType(go);

        if (type == PrefabType.Prefab)
        {
            Debug.LogError("Skip a Shadow Volume Baking, because of it is a Prefab. " + go.name, go);
            return;
        }

        MeshFilter mf = go.GetComponent <MeshFilter>();

        if (mf == null)
        {
            Debug.LogError("Skip a Shadow Volume Baking, becase of there is no MeshFilter. " + go.name, go);
            return;
        }
        if (mf.sharedMesh == null)
        {
            Debug.LogError("Skip a Shadow Volume Baking, becase of there is no Mesh. " + go.name, go);
            return;
        }
        if (!mf.sharedMesh.isReadable)
        {
            Debug.LogError("Skip a Shadow Volume Baking, becase of Mesh is not readable. " + go.name, go);
            return;
        }

        Transform transform = go.transform;

        ABakingTask task = new ABakingTask();

        task.Init(transform, transform.localToWorldMatrix, transform.worldToLocalMatrix, dirLight.transform.forward, mf.sharedMesh, capsOffset, groundLayer, twoSubMeshes);
        bakingTaskManager.AddTask(task);
    }
Exemplo n.º 5
0
        public void Update()
        {
            int numWorkingTasks = workingTasks.Count;

            for (int i = 0; i < numWorkingTasks; ++i)
            {
                ABakingTask task = workingTasks[i];
                if (task.IsComplete)
                {
                    completeTasks.Add(task);
                    workingTasks.RemoveAt(i);
                    --i;
                    --numWorkingTasks;
                }
            }

            if (workingTasks.Count < concurrentTasks && idleTasks.Count > 0)
            {
                ABakingTask idleTask = idleTasks[idleTasks.Count - 1];
                idleTasks.RemoveAt(idleTasks.Count - 1);
                workingTasks.Add(idleTask);
                idleTask.Start();
            }
        }
Exemplo n.º 6
0
 public void AddTask(ABakingTask task)
 {
     totalTasks.Add(task);
     idleTasks.Add(task);
 }