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(); } }
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; } }
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); }
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); }
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(); } }
public void AddTask(ABakingTask task) { totalTasks.Add(task); idleTasks.Add(task); }