| 206 | } |
| 207 | |
| 208 | bool ProbesRendererService::LazyInit() |
| 209 | { |
| 210 | if (_initDone || _initFailed) |
| 211 | return false; |
| 212 | |
| 213 | // Load shader |
| 214 | if (_shader == nullptr) |
| 215 | { |
| 216 | _shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/ProbesFilter")); |
| 217 | _initFailed = _shader == nullptr; |
| 218 | if (_initFailed) |
| 219 | return false; |
| 220 | #if COMPILE_WITH_DEV_ENV |
| 221 | _shader->OnReloading.Bind<ProbesRendererService, &ProbesRendererService::OnShaderReloading>(this); |
| 222 | #endif |
| 223 | } |
| 224 | if (!_shader->IsLoaded()) |
| 225 | return true; |
| 226 | _initFailed |= InitShader(); |
| 227 | |
| 228 | // Init rendering pipeline |
| 229 | _output = GPUDevice::Instance->CreateTexture(TEXT("ProbesRenderer.Output")); |
| 230 | const int32 probeResolution = _current.GetResolution(); |
| 231 | const PixelFormat probeFormat = _current.GetFormat(); |
| 232 | _initFailed |= _output->Init(GPUTextureDescription::New2D(probeResolution, probeResolution, probeFormat)); |
| 233 | _task = New<SceneRenderTask>(); |
| 234 | auto task = _task; |
| 235 | task->Order = -100; // Run before main view rendering (realtime probes will get smaller latency) |
| 236 | task->Enabled = false; |
| 237 | task->IsCustomRendering = true; |
| 238 | task->ActorsSource = ActorsSources::ScenesAndCustomActors; |
| 239 | task->Output = _output; |
| 240 | auto& view = task->View; |
| 241 | view.Flags = |
| 242 | ViewFlags::AO | |
| 243 | ViewFlags::GI | |
| 244 | ViewFlags::DirectionalLights | |
| 245 | ViewFlags::PointLights | |
| 246 | ViewFlags::SpotLights | |
| 247 | ViewFlags::SkyLights | |
| 248 | ViewFlags::Decals | |
| 249 | ViewFlags::Shadows | |
| 250 | ViewFlags::Sky | |
| 251 | ViewFlags::Fog; |
| 252 | view.Mode = ViewMode::NoPostFx; |
| 253 | view.IsOfflinePass = true; |
| 254 | view.IsSingleFrame = true; |
| 255 | view.StaticFlagsMask = view.StaticFlagsCompare = StaticFlags::ReflectionProbe; |
| 256 | task->IsCameraCut = true; |
| 257 | task->Resize(probeResolution, probeResolution); |
| 258 | task->Render.Bind<ProbesRendererService, &ProbesRendererService::OnRender>(this); |
| 259 | task->SetupRender.Bind<ProbesRendererService, &ProbesRendererService::OnSetupRender>(this); |
| 260 | |
| 261 | // Init render targets |
| 262 | _probe = GPUDevice::Instance->CreateTexture(TEXT("ProbesRenderer.Probe")); |
| 263 | _initFailed |= _probe->Init(GPUTextureDescription::NewCube(probeResolution, probeFormat, GPUTextureFlags::ShaderResource | GPUTextureFlags::RenderTarget | GPUTextureFlags::PerMipViews, 0)); |
| 264 | _tmpFace = GPUDevice::Instance->CreateTexture(TEXT("ProbesRenderer.TmpFace")); |
| 265 | _initFailed |= _tmpFace->Init(GPUTextureDescription::New2D(probeResolution, probeResolution, 0, probeFormat, GPUTextureFlags::ShaderResource | GPUTextureFlags::RenderTarget | GPUTextureFlags::PerMipViews)); |
nothing calls this directly
no test coverage detected