NativeVertexFormat.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Copyright 2009 Dolphin Emulator Project
  2. // Licensed under GPLv2+
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include "Common/ChunkFile.h"
  6. #include "VideoBackends/Software/Vec3.h"
  7. struct Vec4
  8. {
  9. float x;
  10. float y;
  11. float z;
  12. float w;
  13. };
  14. struct InputVertexData
  15. {
  16. u8 posMtx;
  17. u8 texMtx[8];
  18. Vec3 position;
  19. Vec3 normal[3];
  20. u8 color[2][4];
  21. float texCoords[8][2];
  22. };
  23. struct OutputVertexData
  24. {
  25. // components in color channels
  26. enum
  27. {
  28. RED_C,
  29. GRN_C,
  30. BLU_C,
  31. ALP_C
  32. };
  33. Vec3 mvPosition;
  34. Vec4 projectedPosition;
  35. Vec3 screenPosition;
  36. Vec3 normal[3];
  37. u8 color[2][4];
  38. Vec3 texCoords[8];
  39. void Lerp(float t, OutputVertexData *a, OutputVertexData *b)
  40. {
  41. #define LINTERP(T, OUT, IN) (OUT) + ((IN - OUT) * T)
  42. #define LINTERP_INT(T, OUT, IN) (OUT) + (((IN - OUT) * T) >> 8)
  43. mvPosition = LINTERP(t, a->mvPosition, b->mvPosition);
  44. projectedPosition.x = LINTERP(t, a->projectedPosition.x, b->projectedPosition.x);
  45. projectedPosition.y = LINTERP(t, a->projectedPosition.y, b->projectedPosition.y);
  46. projectedPosition.z = LINTERP(t, a->projectedPosition.z, b->projectedPosition.z);
  47. projectedPosition.w = LINTERP(t, a->projectedPosition.w, b->projectedPosition.w);
  48. for (int i = 0; i < 3; ++i)
  49. {
  50. normal[i] = LINTERP(t, a->normal[i], b->normal[i]);
  51. }
  52. u16 t_int = (u16)(t * 256);
  53. for (int i = 0; i < 4; ++i)
  54. {
  55. color[0][i] = LINTERP_INT(t_int, a->color[0][i], b->color[0][i]);
  56. color[1][i] = LINTERP_INT(t_int, a->color[1][i], b->color[1][i]);
  57. }
  58. for (int i = 0; i < 8; ++i)
  59. {
  60. texCoords[i] = LINTERP(t, a->texCoords[i], b->texCoords[i]);
  61. }
  62. #undef LINTERP
  63. #undef LINTERP_INT
  64. }
  65. void DoState(PointerWrap &p)
  66. {
  67. mvPosition.DoState(p);
  68. p.Do(projectedPosition);
  69. screenPosition.DoState(p);
  70. for (auto& vec : normal)
  71. vec.DoState(p);
  72. p.DoArray(color, sizeof color);
  73. for (auto& vec : texCoords)
  74. vec.DoState(p);
  75. }
  76. };