NodeVar.hx 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. package hrt.shgraph;
  2. using hxsl.Ast;
  3. class NodeVar {
  4. public var node : ShaderNode;
  5. public var keyOutput : String;
  6. public function new ( n : ShaderNode, key : String ) {
  7. node = n;
  8. keyOutput = key;
  9. }
  10. public function getKey() : String {
  11. return keyOutput;
  12. }
  13. public function getTVar() {
  14. return node.getOutput(keyOutput);
  15. }
  16. public function getType() : Type {
  17. return node.getOutputType(keyOutput);
  18. }
  19. public function getVar(?type: Type) : TExpr {
  20. var currentType = getType();
  21. if (type == null || currentType == type) {
  22. return node.getOutputTExpr(keyOutput);
  23. }
  24. switch(currentType) {
  25. case TFloat:
  26. var tExprFloat = node.getOutputTExpr(keyOutput);
  27. switch(type) {
  28. case TVec(size, VFloat):
  29. if (size == 2) {
  30. return {
  31. e: TCall({
  32. e: TGlobal(Vec2),
  33. p: null,
  34. t: TFun([
  35. {
  36. ret: type,
  37. args: [
  38. { name: "u", type : TFloat },
  39. { name: "v", type : TFloat }]
  40. }
  41. ])
  42. }, [tExprFloat,
  43. tExprFloat]),
  44. p: null,
  45. t: type
  46. };
  47. } else if (size == 3) {
  48. return {
  49. e: TCall({
  50. e: TGlobal(Vec3),
  51. p: null,
  52. t: TFun([
  53. {
  54. ret: type,
  55. args: [
  56. { name: "x", type : TFloat },
  57. { name: "y", type : TFloat },
  58. { name: "z", type : TFloat }]
  59. }
  60. ])
  61. }, [tExprFloat,
  62. tExprFloat,
  63. tExprFloat]),
  64. p: null,
  65. t: type
  66. };
  67. } else {
  68. return {
  69. e: TCall({
  70. e: TGlobal(Vec4),
  71. p: null,
  72. t: TFun([
  73. {
  74. ret: type,
  75. args: [
  76. { name: "r", type : TFloat },
  77. { name: "g", type : TFloat },
  78. { name: "b", type : TFloat },
  79. { name: "a", type : TFloat }]
  80. }
  81. ])
  82. }, [tExprFloat,
  83. tExprFloat,
  84. tExprFloat,
  85. {
  86. e: TConst(CFloat(1.0)),
  87. p: null,
  88. t: TFloat
  89. }]),
  90. p: null,
  91. t: type
  92. };
  93. }
  94. default:
  95. };
  96. case TVec(sizeCurrentType, VFloat):
  97. var tExprFloat = node.getOutputTExpr(keyOutput);
  98. if (sizeCurrentType == 2) {
  99. switch(type) {
  100. case TVec(size, VFloat):
  101. if (size == 3) {
  102. return {
  103. e: TCall({
  104. e: TGlobal(Vec3),
  105. p: null,
  106. t: TFun([
  107. {
  108. ret: type,
  109. args: [
  110. { name: "x", type : TFloat },
  111. { name: "y", type : TFloat },
  112. { name: "z", type : TFloat }]
  113. }
  114. ])
  115. }, [{
  116. e: TSwiz(tExprFloat, [X]),
  117. p: null,
  118. t: TVec(1, VFloat)
  119. },
  120. {
  121. e: TSwiz(tExprFloat, [Y]),
  122. p: null,
  123. t: TVec(1, VFloat)
  124. },
  125. {
  126. e: TConst(CFloat(0.0)),
  127. p: null,
  128. t: TFloat
  129. }]),
  130. p: null,
  131. t: type
  132. };
  133. } else if (size == 4) {
  134. return {
  135. e: TCall({
  136. e: TGlobal(Vec4),
  137. p: null,
  138. t: TFun([
  139. {
  140. ret: type,
  141. args: [
  142. { name: "r", type : TFloat },
  143. { name: "g", type : TFloat },
  144. { name: "b", type : TFloat },
  145. { name: "a", type : TFloat }]
  146. }
  147. ])
  148. }, [{
  149. e: TSwiz(tExprFloat, [X]),
  150. p: null,
  151. t: TVec(1, VFloat)
  152. },
  153. {
  154. e: TSwiz(tExprFloat, [Y]),
  155. p: null,
  156. t: TVec(1, VFloat)
  157. },
  158. {
  159. e: TConst(CFloat(0.0)),
  160. p: null,
  161. t: TFloat
  162. },
  163. {
  164. e: TConst(CFloat(0.0)),
  165. p: null,
  166. t: TFloat
  167. }]),
  168. p: null,
  169. t: type
  170. };
  171. }
  172. default:
  173. };
  174. } else if (sizeCurrentType == 3) {
  175. switch(type) {
  176. case TVec(size, VFloat):
  177. if (size == 4) {
  178. return {
  179. e: TCall({
  180. e: TGlobal(Vec4),
  181. p: null,
  182. t: TFun([
  183. {
  184. ret: type,
  185. args: [
  186. { name: "r", type : TFloat },
  187. { name: "g", type : TFloat },
  188. { name: "b", type : TFloat },
  189. { name: "a", type : TFloat }]
  190. }
  191. ])
  192. }, [{
  193. e: TSwiz(tExprFloat, [X]),
  194. p: null,
  195. t: TVec(1, VFloat)
  196. },
  197. {
  198. e: TSwiz(tExprFloat, [Y]),
  199. p: null,
  200. t: TVec(1, VFloat)
  201. },
  202. {
  203. e: TSwiz(tExprFloat, [Z]),
  204. p: null,
  205. t: TVec(1, VFloat)
  206. },
  207. {
  208. e: TConst(CFloat(0.0)),
  209. p: null,
  210. t: TFloat
  211. }]),
  212. p: null,
  213. t: type
  214. };
  215. }
  216. default:
  217. };
  218. }
  219. default:
  220. }
  221. return node.getOutputTExpr(keyOutput);
  222. }
  223. public function getExpr() : Array<TExpr> {
  224. if (node.outputCompiled.get(keyOutput) != null)
  225. return [];
  226. node.outputCompiled.set(keyOutput, true);
  227. var res = [];
  228. var nodeBuild = node.build(keyOutput);
  229. if (getTVar() != null && getTVar().kind == Local)
  230. res.push({ e : TVarDecl(getTVar()), t : getType(), p : null });
  231. if (nodeBuild != null)
  232. res.push(nodeBuild);
  233. return res;
  234. }
  235. }