YuvVideo.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System;
  2. using Urho.Urho2D;
  3. namespace Urho.SharpReality
  4. {
  5. public class YuvVideo : Component
  6. {
  7. [Preserve]
  8. public YuvVideo() { }
  9. [Preserve]
  10. public YuvVideo(IntPtr handle) : base(handle) { }
  11. public Texture2D CameraYtexture { get; private set; }
  12. public Texture2D CameraUVtexture { get; private set; }
  13. public RenderPathCommand RenderPathCommand { get; private set; }
  14. public bool TexturesInited { get; private set; }
  15. public unsafe void SetData(
  16. IntPtr yTexturePtr, IntPtr uvTexturePtr,
  17. int yWidth, int yHeight,
  18. int uvWidth, int uvHeight,
  19. int nativeBoundsWidth, int nativeBoundsHeight)
  20. {
  21. if (!TexturesInited)
  22. {
  23. TexturesInited = true;
  24. CreateTextures(yWidth, yHeight, uvWidth, uvHeight, nativeBoundsWidth, nativeBoundsHeight);
  25. }
  26. if (yTexturePtr == IntPtr.Zero || uvTexturePtr == IntPtr.Zero)
  27. return;
  28. CameraYtexture.SetData(0, 0, 0, yWidth, yHeight, (void*)yTexturePtr);
  29. CameraUVtexture.SetData(0, 0, 0, uvWidth, uvHeight, (void*)uvTexturePtr);
  30. }
  31. unsafe void CreateTextures(
  32. int yWidth, int yHeight,
  33. int uvWidth, int uvHeight,
  34. int nativeBoundsWidth, int nativeBoundsHeight)
  35. {
  36. var cache = Application.ResourceCache;
  37. // texture for Y-plane;
  38. CameraYtexture = new Texture2D();
  39. CameraYtexture.SetNumLevels(1);
  40. CameraYtexture.FilterMode = TextureFilterMode.Bilinear;
  41. CameraYtexture.SetAddressMode(TextureCoordinate.U, TextureAddressMode.Clamp);
  42. CameraYtexture.SetAddressMode(TextureCoordinate.V, TextureAddressMode.Clamp);
  43. CameraYtexture.SetSize(yWidth, yHeight, Graphics.LuminanceFormat, TextureUsage.Dynamic);
  44. CameraYtexture.Name = nameof(CameraYtexture);
  45. cache.AddManualResource(CameraYtexture);
  46. // texture for UV-plane;
  47. CameraUVtexture = new Texture2D();
  48. CameraUVtexture.SetNumLevels(1);
  49. CameraUVtexture.SetSize(uvWidth, uvHeight, Graphics.LuminanceAlphaFormat, TextureUsage.Dynamic);
  50. CameraUVtexture.FilterMode = TextureFilterMode.Bilinear;
  51. CameraUVtexture.SetAddressMode(TextureCoordinate.U, TextureAddressMode.Clamp);
  52. CameraUVtexture.SetAddressMode(TextureCoordinate.V, TextureAddressMode.Clamp);
  53. CameraUVtexture.Name = nameof(CameraUVtexture);
  54. cache.AddManualResource(CameraUVtexture);
  55. float imageAspect = (float)yWidth / yHeight;
  56. float screenAspect = (float)nativeBoundsHeight / nativeBoundsWidth;
  57. var rpc = new RenderPathCommand(RenderCommandType.Quad);
  58. rpc.SetTextureName(TextureUnit.Diffuse, CameraYtexture.Name);
  59. rpc.SetTextureName(TextureUnit.Normal, CameraUVtexture.Name);
  60. rpc.Type = RenderCommandType.Quad;
  61. rpc.VertexShaderName = (UrhoString)"ARKit";
  62. rpc.PixelShaderName = (UrhoString)"ARKit";
  63. rpc.SetOutput(0, "viewport");
  64. rpc.SetShaderParameter("CameraScale", screenAspect / imageAspect);
  65. RenderPathCommand = rpc;
  66. Application.Renderer.GetViewport(0).RenderPath.InsertCommand(1, rpc);
  67. }
  68. }
  69. }