| 650 | } |
| 651 | |
| 652 | void DebugDrawService::Update() |
| 653 | { |
| 654 | // Special case for Null renderer |
| 655 | if (GPUDevice::Instance->GetRendererType() == RendererType::Null) |
| 656 | { |
| 657 | GlobalContext.DebugDrawDefault.Clear(); |
| 658 | GlobalContext.DebugDrawDepthTest.Clear(); |
| 659 | return; |
| 660 | } |
| 661 | |
| 662 | PROFILE_CPU(); |
| 663 | PROFILE_MEM(EngineDebug); |
| 664 | |
| 665 | // Update lists |
| 666 | float deltaTime = Time::Update.DeltaTime.GetTotalSeconds(); |
| 667 | #if USE_EDITOR |
| 668 | if (!Editor::IsPlayMode) |
| 669 | deltaTime = Time::Update.UnscaledDeltaTime.GetTotalSeconds(); |
| 670 | #endif |
| 671 | GlobalContext.DebugDrawDefault.Update(deltaTime); |
| 672 | GlobalContext.DebugDrawDepthTest.Update(deltaTime); |
| 673 | |
| 674 | // Lazy-init resources |
| 675 | if (DebugDrawShader == nullptr) |
| 676 | { |
| 677 | DebugDrawShader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/DebugDraw")); |
| 678 | if (DebugDrawShader == nullptr) |
| 679 | { |
| 680 | LOG(Fatal, "Cannot load DebugDraw shader"); |
| 681 | } |
| 682 | #if COMPILE_WITH_DEV_ENV |
| 683 | DebugDrawShader->OnReloading.Bind(&OnShaderReloading); |
| 684 | #endif |
| 685 | } |
| 686 | if (DebugDrawPsWireTrianglesDepthTest.Depth == nullptr && DebugDrawShader && DebugDrawShader->IsLoaded()) |
| 687 | { |
| 688 | bool failed = false; |
| 689 | const auto shader = DebugDrawShader->GetShader(); |
| 690 | |
| 691 | // Create pipeline states |
| 692 | GPUPipelineState::Description desc = GPUPipelineState::Description::Default; |
| 693 | desc.BlendMode = BlendingMode::AlphaBlend; |
| 694 | desc.CullMode = CullMode::TwoSided; |
| 695 | desc.VS = shader->GetVS("VS"); |
| 696 | |
| 697 | // Default |
| 698 | desc.PS = shader->GetPS("PS", 0); |
| 699 | desc.PrimitiveTopology = PrimitiveTopologyType::Line; |
| 700 | failed |= DebugDrawPsLinesDefault.Create(desc); |
| 701 | desc.PS = shader->GetPS("PS", 1); |
| 702 | desc.PrimitiveTopology = PrimitiveTopologyType::Triangle; |
| 703 | failed |= DebugDrawPsTrianglesDefault.Create(desc); |
| 704 | desc.Wireframe = true; |
| 705 | failed |= DebugDrawPsWireTrianglesDefault.Create(desc); |
| 706 | |
| 707 | // Depth Test |
| 708 | desc.Wireframe = false; |
| 709 | desc.PS = shader->GetPS("PS", 2); |