WebViewTexture.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // Copyright Epic Games, Inc. All Rights Reserved.
  2. #include "WebViewTexture.h"
  3. #include "ExternalTexture.h"
  4. #include "Modules/ModuleManager.h"
  5. #include "RenderUtils.h"
  6. #include "RenderingThread.h"
  7. #include "UObject/WeakObjectPtrTemplates.h"
  8. #include "WebViewTextureResource.h"
  9. //#include "IWebViewWindow.h"
  10. /* UWebViewTexture structors
  11. *****************************************************************************/
  12. UWebViewTexture::UWebViewTexture(const FObjectInitializer& ObjectInitializer)
  13. : Super(ObjectInitializer)
  14. , AddressX(TA_Clamp)
  15. , AddressY(TA_Clamp)
  16. , ClearColor(FLinearColor::Black)
  17. , Size(0)
  18. {
  19. SampleQueue = MakeShared<FWebViewTextureSampleQueue, ESPMode::ThreadSafe>();
  20. WebPlayerGuid = FGuid::NewGuid();
  21. NeverStream = true;
  22. }
  23. /* UWebViewTexture interface
  24. *****************************************************************************/
  25. float UWebViewTexture::GetAspectRatio() const
  26. {
  27. if (Dimensions.Y == 0)
  28. {
  29. return 0.0f;
  30. }
  31. return (float)(Dimensions.X) / Dimensions.Y;
  32. }
  33. int32 UWebViewTexture::GetHeight() const
  34. {
  35. return Dimensions.Y;
  36. }
  37. int32 UWebViewTexture::GetWidth() const
  38. {
  39. return Dimensions.X;
  40. }
  41. /* UTexture interface
  42. *****************************************************************************/
  43. FTextureResource* UWebViewTexture::CreateResource()
  44. {
  45. return new FWebViewTextureResource(*this, Dimensions, Size);
  46. }
  47. EMaterialValueType UWebViewTexture::GetMaterialType() const
  48. {
  49. return MCT_TextureExternal;
  50. }
  51. float UWebViewTexture::GetSurfaceWidth() const
  52. {
  53. return Dimensions.X;
  54. }
  55. float UWebViewTexture::GetSurfaceHeight() const
  56. {
  57. return Dimensions.Y;
  58. }
  59. FGuid UWebViewTexture::GetExternalTextureGuid() const
  60. {
  61. return WebPlayerGuid;
  62. }
  63. void UWebViewTexture::SetExternalTextureGuid(FGuid guid)
  64. {
  65. WebPlayerGuid = guid;
  66. }
  67. /* UObject interface
  68. *****************************************************************************/
  69. void UWebViewTexture::BeginDestroy()
  70. {
  71. UnregisterPlayerGuid();
  72. Super::BeginDestroy();
  73. }
  74. FString UWebViewTexture::GetDesc()
  75. {
  76. return FString::Printf(TEXT("%ix%i [%s]"), Dimensions.X, Dimensions.Y, GPixelFormats[PF_B8G8R8A8].Name);
  77. }
  78. void UWebViewTexture::GetResourceSizeEx(FResourceSizeEx& CumulativeResourceSize)
  79. {
  80. Super::GetResourceSizeEx(CumulativeResourceSize);
  81. CumulativeResourceSize.AddUnknownMemoryBytes(Size);
  82. }
  83. /* UWebViewTexture implementation
  84. *****************************************************************************/
  85. void UWebViewTexture::TickResource(TSharedPtr<FWebViewTextureSample, ESPMode::ThreadSafe> Sample)
  86. {
  87. #if WEBVIEW_ENGINE_VERSION>=42700
  88. if (GetResource() == nullptr)
  89. #else
  90. if (Resource == nullptr)
  91. #endif
  92. {
  93. return;
  94. }
  95. check(SampleQueue.IsValid());
  96. if (Sample.IsValid())
  97. {
  98. SampleQueue.Get()->Enqueue(Sample);
  99. }
  100. // issue a render command to render the current sample
  101. FWebViewTextureResource::FRenderParams RenderParams;
  102. {
  103. RenderParams.ClearColor = ClearColor;
  104. RenderParams.PlayerGuid = GetExternalTextureGuid();
  105. RenderParams.SampleSource = SampleQueue;
  106. }
  107. #if WEBVIEW_ENGINE_VERSION>=42700
  108. FWebViewTextureResource* ResourceParam = (FWebViewTextureResource*)GetResource();
  109. #else
  110. FWebViewTextureResource* ResourceParam = (FWebViewTextureResource*)Resource;
  111. if (Resource == nullptr)
  112. #endif
  113. ENQUEUE_RENDER_COMMAND(UWebViewTextureResourceRender)(
  114. [ResourceParam, RenderParams](FRHICommandListImmediate& RHICmdList)
  115. {
  116. ResourceParam->Render(RenderParams);
  117. });
  118. }
  119. void UWebViewTexture::UnregisterPlayerGuid()
  120. {
  121. if (!WebPlayerGuid.IsValid())
  122. {
  123. return;
  124. }
  125. FGuid PlayerGuid = WebPlayerGuid;
  126. ENQUEUE_RENDER_COMMAND(UWebViewTextureUnregisterPlayerGuid)(
  127. [PlayerGuid](FRHICommandListImmediate& RHICmdList)
  128. {
  129. FExternalTextureRegistry::Get().UnregisterExternalTexture(PlayerGuid);
  130. });
  131. }