rc1.0_final.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "rc1.0_final.h"
  2. #include "nvparse_errors.h"
  3. #include "nvparse_externs.h"
  4. void FinalRgbFunctionStruct::ZeroOut()
  5. {
  6. RegisterEnum zero;
  7. zero.word = RCP_ZERO;
  8. a.Init(zero, GL_UNSIGNED_IDENTITY_NV);
  9. b.Init(zero, GL_UNSIGNED_IDENTITY_NV);
  10. c.Init(zero, GL_UNSIGNED_IDENTITY_NV);
  11. d.Init(zero, GL_UNSIGNED_IDENTITY_NV);
  12. }
  13. void FinalAlphaFunctionStruct::ZeroOut()
  14. {
  15. RegisterEnum zero;
  16. zero.word = RCP_ZERO;
  17. g.Init(zero, GL_UNSIGNED_IDENTITY_NV);
  18. }
  19. void FinalProductStruct::ZeroOut()
  20. {
  21. RegisterEnum zero;
  22. zero.word = RCP_ZERO;
  23. e.Init(zero, GL_UNSIGNED_IDENTITY_NV);
  24. f.Init(zero, GL_UNSIGNED_IDENTITY_NV);
  25. }
  26. void FinalCombinerStruct::Validate()
  27. {
  28. if (hasProduct &&
  29. (GL_E_TIMES_F_NV == product.e.reg.bits.name ||
  30. GL_SPARE0_PLUS_SECONDARY_COLOR_NV == product.e.reg.bits.name ||
  31. GL_DISCARD_NV == product.e.reg.bits.name ||
  32. GL_E_TIMES_F_NV == product.f.reg.bits.name ||
  33. GL_SPARE0_PLUS_SECONDARY_COLOR_NV == product.f.reg.bits.name ||
  34. GL_DISCARD_NV == product.f.reg.bits.name))
  35. errors.set("invalid input register for final_product");
  36. if (hasProduct &&
  37. (RCP_BLUE == product.e.reg.bits.channel ||
  38. RCP_BLUE == product.f.reg.bits.channel))
  39. errors.set("blue register used in final_product");
  40. if (GL_E_TIMES_F_NV == alpha.g.reg.bits.name ||
  41. GL_SPARE0_PLUS_SECONDARY_COLOR_NV == alpha.g.reg.bits.name ||
  42. GL_DISCARD_NV == alpha.g.reg.bits.name)
  43. errors.set("invalid input register for final alpha");
  44. if (RCP_RGB == alpha.g.reg.bits.channel)
  45. errors.set("rgb register used in final alpha");
  46. if (GL_SPARE0_PLUS_SECONDARY_COLOR_NV == rgb.a.reg.bits.name &&
  47. GL_SPARE0_PLUS_SECONDARY_COLOR_NV != rgb.b.reg.bits.name &&
  48. GL_ZERO == rgb.c.reg.bits.name && GL_UNSIGNED_IDENTITY_NV == rgb.c.map)
  49. {
  50. MappedRegisterStruct temp;
  51. temp = rgb.a;
  52. rgb.a = rgb.b;
  53. rgb.b = temp;
  54. }
  55. if (GL_SPARE0_PLUS_SECONDARY_COLOR_NV == rgb.a.reg.bits.name &&
  56. GL_ZERO == rgb.b.reg.bits.name && GL_UNSIGNED_INVERT_NV == rgb.b.map &&
  57. GL_ZERO == rgb.c.reg.bits.name && GL_UNSIGNED_IDENTITY_NV == rgb.c.map &&
  58. GL_SPARE0_PLUS_SECONDARY_COLOR_NV != rgb.d.reg.bits.name)
  59. {
  60. MappedRegisterStruct temp;
  61. temp = rgb.a;
  62. rgb.a = rgb.d;
  63. rgb.d = temp;
  64. }
  65. if (GL_SPARE0_PLUS_SECONDARY_COLOR_NV == rgb.a.reg.bits.name ||
  66. GL_DISCARD_NV == rgb.a.reg.bits.name ||
  67. GL_DISCARD_NV == rgb.b.reg.bits.name ||
  68. GL_DISCARD_NV == rgb.c.reg.bits.name ||
  69. GL_DISCARD_NV == rgb.d.reg.bits.name)
  70. errors.set("invalid input register for final rgb");
  71. if (RCP_BLUE == rgb.a.reg.bits.channel ||
  72. RCP_BLUE == rgb.b.reg.bits.channel ||
  73. RCP_BLUE == rgb.c.reg.bits.channel ||
  74. RCP_BLUE == rgb.d.reg.bits.channel)
  75. errors.set("blue register used in final rgb");
  76. if ((GL_E_TIMES_F_NV == rgb.a.reg.bits.name ||
  77. GL_E_TIMES_F_NV == rgb.b.reg.bits.name ||
  78. GL_E_TIMES_F_NV == rgb.c.reg.bits.name ||
  79. GL_E_TIMES_F_NV == rgb.d.reg.bits.name) && !hasProduct)
  80. errors.set("final_product used but not set");
  81. if (RCP_NONE == rgb.a.reg.bits.channel)
  82. rgb.a.reg.bits.channel = RCP_RGB;
  83. if (RCP_NONE == rgb.b.reg.bits.channel)
  84. rgb.b.reg.bits.channel = RCP_RGB;
  85. if (RCP_NONE == rgb.c.reg.bits.channel)
  86. rgb.c.reg.bits.channel = RCP_RGB;
  87. if (RCP_NONE == rgb.d.reg.bits.channel)
  88. rgb.d.reg.bits.channel = RCP_RGB;
  89. if (RCP_NONE == product.e.reg.bits.channel)
  90. product.e.reg.bits.channel = RCP_RGB;
  91. if (RCP_NONE == product.f.reg.bits.channel)
  92. product.f.reg.bits.channel = RCP_RGB;
  93. if (RCP_NONE == alpha.g.reg.bits.channel)
  94. alpha.g.reg.bits.channel = RCP_ALPHA;
  95. }
  96. void FinalCombinerStruct::Invoke()
  97. {
  98. if(clamp)
  99. glCombinerParameteriNV(GL_COLOR_SUM_CLAMP_NV, GL_TRUE);
  100. else
  101. glCombinerParameteriNV(GL_COLOR_SUM_CLAMP_NV, GL_FALSE);
  102. glFinalCombinerInputNV(
  103. GL_VARIABLE_A_NV,
  104. rgb.a.reg.bits.name,
  105. rgb.a.map,
  106. MAP_CHANNEL(rgb.a.reg.bits.channel));
  107. glFinalCombinerInputNV(
  108. GL_VARIABLE_B_NV,
  109. rgb.b.reg.bits.name,
  110. rgb.b.map,
  111. MAP_CHANNEL(rgb.b.reg.bits.channel));
  112. glFinalCombinerInputNV(
  113. GL_VARIABLE_C_NV,
  114. rgb.c.reg.bits.name,
  115. rgb.c.map,
  116. MAP_CHANNEL(rgb.c.reg.bits.channel));
  117. glFinalCombinerInputNV(
  118. GL_VARIABLE_D_NV,
  119. rgb.d.reg.bits.name,
  120. rgb.d.map,
  121. MAP_CHANNEL(rgb.d.reg.bits.channel));
  122. glFinalCombinerInputNV(
  123. GL_VARIABLE_E_NV,
  124. product.e.reg.bits.name,
  125. product.e.map,
  126. MAP_CHANNEL(product.e.reg.bits.channel));
  127. glFinalCombinerInputNV(
  128. GL_VARIABLE_F_NV,
  129. product.f.reg.bits.name,
  130. product.f.map,
  131. MAP_CHANNEL(product.f.reg.bits.channel));
  132. glFinalCombinerInputNV(
  133. GL_VARIABLE_G_NV,
  134. alpha.g.reg.bits.name,
  135. alpha.g.map,
  136. MAP_CHANNEL(alpha.g.reg.bits.channel));
  137. }