NodeShaderContext.hx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package arm.shader;
  2. import zui.Nodes;
  3. import iron.data.SceneFormat;
  4. import arm.shader.NodeShaderData;
  5. class NodeShaderContext {
  6. public var vert: NodeShader;
  7. public var frag: NodeShader;
  8. public var data: TShaderContext;
  9. public var allow_vcols = false;
  10. var material: TMaterial;
  11. var constants: Array<TShaderConstant>;
  12. var tunits: Array<TTextureUnit>;
  13. public function new(material: TMaterial, props: Dynamic) {
  14. this.material = material;
  15. data = {
  16. name: props.name,
  17. depth_write: props.depth_write,
  18. compare_mode: props.compare_mode,
  19. cull_mode: props.cull_mode,
  20. blend_source: props.blend_source,
  21. blend_destination: props.blend_destination,
  22. blend_operation: props.blend_operation,
  23. alpha_blend_source: props.alpha_blend_source,
  24. alpha_blend_destination: props.alpha_blend_destination,
  25. alpha_blend_operation: props.alpha_blend_operation,
  26. fragment_shader: '',
  27. vertex_shader: '',
  28. vertex_elements: Reflect.hasField(props, 'vertex_elements') ? props.vertex_elements : [ {name: "pos", data: 'short4norm'}, {name: "nor", data: 'short2norm'}],
  29. color_attachments: props.color_attachments,
  30. depth_attachment: props.depth_attachment
  31. };
  32. if (props.color_writes_red != null) {
  33. data.color_writes_red = props.color_writes_red;
  34. }
  35. if (props.color_writes_green != null) {
  36. data.color_writes_green = props.color_writes_green;
  37. }
  38. if (props.color_writes_blue != null) {
  39. data.color_writes_blue = props.color_writes_blue;
  40. }
  41. if (props.color_writes_alpha != null) {
  42. data.color_writes_alpha = props.color_writes_alpha;
  43. }
  44. tunits = data.texture_units = [];
  45. constants = data.constants = [];
  46. }
  47. public function add_elem(name: String, data_type: String) {
  48. for (e in data.vertex_elements) {
  49. if (e.name == name) return;
  50. }
  51. var elem: TVertexElement = { name: name, data: data_type };
  52. data.vertex_elements.push(elem);
  53. }
  54. public function is_elem(name: String): Bool {
  55. for (elem in data.vertex_elements) {
  56. if (elem.name == name) {
  57. return true;
  58. }
  59. }
  60. return false;
  61. }
  62. public function get_elem(name: String): TVertexElement {
  63. for (elem in data.vertex_elements) {
  64. if (elem.name == name) {
  65. return elem;
  66. }
  67. }
  68. return null;
  69. }
  70. public function add_constant(ctype: String, name: String, link: String = null) {
  71. for (c in constants) {
  72. if (c.name == name) {
  73. return;
  74. }
  75. }
  76. var c: TShaderConstant = { name: name, type: ctype };
  77. if (link != null) {
  78. c.link = link;
  79. }
  80. constants.push(c);
  81. }
  82. public function add_texture_unit(ctype: String, name: String, link: String = null, is_image = false) {
  83. for (c in tunits) {
  84. if (c.name == name) {
  85. return;
  86. }
  87. }
  88. var c: TTextureUnit = { name: name };
  89. if (link != null) {
  90. c.link = link;
  91. }
  92. if (is_image) {
  93. c.is_image = is_image;
  94. }
  95. tunits.push(c);
  96. }
  97. public function make_vert(): NodeShader {
  98. data.vertex_shader = material.name + '_' + data.name + '.vert';
  99. vert = new NodeShader(this, 'vert');
  100. return vert;
  101. }
  102. public function make_frag(): NodeShader {
  103. data.fragment_shader = material.name + '_' + data.name + '.frag';
  104. frag = new NodeShader(this, 'frag');
  105. return frag;
  106. }
  107. }