Экспериментальный: этот API является экспериментальным и может быть изменен или удален в будущем.
Описание
Определяет необходимые элементы для реализации ScriptableBakedReflectionSystem.
Вы можете использовать пустую реализацию в качестве базового класса, см. ScriptableBakedReflectionSystem.
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEditor.Experimental.Rendering;
public interface IBakeJobs
{
// Add job counts + remove jobs count
int count { get; }
int toAddCount { get; }
int toRemoveCount { get; }
}
public interface IBaker
{
IBakeJobs PrepareBakeJobsFor(SceneStateHash sceneStateHash);
void IssueJobs(IBakeJobs jobs);
List bakedProbes { get; set; }
void StopRunningJobs();
}
abstract class CustomScriptableBakedReflectionSystem : ScriptableBakedReflectionSystem
{
enum Stage
{
None,
BakeReflectionProbes
}
IBaker<ReflectionProbe> m_ReflectionProbeBaker;
public CustomScriptableBakedReflectionSystem(
IBaker<ReflectionProbe> reflectionProbeBaker)
// Our custom system processes in 1 stage: reflection probes
: base(1)
{
m_ReflectionProbeBaker = reflectionProbeBaker;
}
public override void Tick(
SceneStateHash sceneStateHash,
IScriptableBakedReflectionSystemStageNotifier handle)
{
// Reflection Probes
{
// Calculate reflection probes to remove and to bake and add
var jobs = m_ReflectionProbeBaker.PrepareBakeJobsFor(sceneStateHash);
if (jobs.count > 0)
{
// Update progression information of current stage
// Progress is the progression of to bake and add jobs
handle.EnterStage(
(int)Stage.BakeReflectionProbes,
string.Format("Reflection Probes | {0} jobs", jobs.toAddCount),
1 - (jobs.toAddCount / (float)m_ReflectionProbeBaker.bakedProbes.Count));
// Perform removal of remove jobs
// Issue baking of add jobs if they are not in progress
m_ReflectionProbeBaker.IssueJobs(jobs);
return;
}
handle.ExitStage((int)Stage.BakeReflectionProbes);
}
// Update the hash of the reflection system
stateHashes = CalculateStateHash();
// Baking is complete for this sceneStateHash
handle.SetIsDone(true);
}
public override void SynchronizeReflectionProbes()
{
// Synchronize Reflection Probes
for (int i = 0, c = m_ReflectionProbeBaker.bakedProbes.Count; i < c; ++i)
{
var probe = m_ReflectionProbeBaker.bakedProbes[i];
probe.bakedTexture = GetReflectionProbeBakedTexture(probe);
}
}
public override void Clear()
{
m_ReflectionProbeBaker.bakedProbes.Clear();
DeleteBakedReflectionProbeTextures();
}
public override void Cancel()
{
m_ReflectionProbeBaker.StopRunningJobs();
}
Cubemap GetReflectionProbeBakedTexture(ReflectionProbe probe)
{
throw new System.NotImplementedException();
}
protected abstract void DeleteBakedReflectionProbeTextures();
protected abstract Hash128[] CalculateStateHash();
}
Свойства
stageCount | Количество этапов процесса выпечки. |
stateHashes | Хэши текущего запеченного состояния ScriptableBakedReflectionSystem. |
Публичные Методы
BakeAllReflectionProbes | Реализуйте этот метод для запекания всех загруженных зондов отражения. |
Cancel | Отменить текущие задания на выпечку. |
Clear | Очистить состояние ScriptableBakedReflectionSystem. |
SynchronizeReflectionProbes | Синхронизируйте запеченные данные с фактическими компонентами и настройками рендеринга. |
Tick | Этот метод вызывается при каждом обновлении редактора до тех пор, пока ScriptableBakedReflectionSystem не укажет, что запекание завершено с помощью handle.SetIsDone(true). (См. IScriptableBakedReflectionSystemStageNotifier.SetIsDone). |