QuadHelper.cs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System;
  2. namespace Ryujinx.Graphics
  3. {
  4. static class QuadHelper
  5. {
  6. public static int ConvertSizeQuadsToTris(int size)
  7. {
  8. return size <= 0 ? 0 : (size / 4) * 6;
  9. }
  10. public static int ConvertSizeQuadStripToTris(int size)
  11. {
  12. return size <= 1 ? 0 : ((size - 2) / 2) * 6;
  13. }
  14. public static byte[] ConvertQuadsToTris(byte[] data, int entrySize, int count)
  15. {
  16. int primitivesCount = count / 4;
  17. int quadPrimSize = 4 * entrySize;
  18. int trisPrimSize = 6 * entrySize;
  19. byte[] output = new byte[primitivesCount * 6 * entrySize];
  20. for (int prim = 0; prim < primitivesCount; prim++)
  21. {
  22. void AssignIndex(int src, int dst, int copyCount = 1)
  23. {
  24. src = prim * quadPrimSize + src * entrySize;
  25. dst = prim * trisPrimSize + dst * entrySize;
  26. Buffer.BlockCopy(data, src, output, dst, copyCount * entrySize);
  27. }
  28. // 0 1 2 -> 0 1 2.
  29. AssignIndex(0, 0, 3);
  30. // 2 3 -> 3 4.
  31. AssignIndex(2, 3, 2);
  32. // 0 -> 5.
  33. AssignIndex(0, 5);
  34. }
  35. return output;
  36. }
  37. public static byte[] ConvertQuadStripToTris(byte[] data, int entrySize, int count)
  38. {
  39. int primitivesCount = (count - 2) / 2;
  40. int quadPrimSize = 2 * entrySize;
  41. int trisPrimSize = 6 * entrySize;
  42. byte[] output = new byte[primitivesCount * 6 * entrySize];
  43. for (int prim = 0; prim < primitivesCount; prim++)
  44. {
  45. void AssignIndex(int src, int dst, int copyCount = 1)
  46. {
  47. src = prim * quadPrimSize + src * entrySize + 2 * entrySize;
  48. dst = prim * trisPrimSize + dst * entrySize;
  49. Buffer.BlockCopy(data, src, output, dst, copyCount * entrySize);
  50. }
  51. // -2 -1 0 -> 0 1 2.
  52. AssignIndex(-2, 0, 3);
  53. // 0 1 -> 3 4.
  54. AssignIndex(0, 3, 2);
  55. // -2 -> 5.
  56. AssignIndex(-2, 5);
  57. }
  58. return output;
  59. }
  60. }
  61. }