node_shader_context.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. type material_t = {
  2. name?: string;
  3. canvas?: ui_node_canvas_t;
  4. };
  5. type node_shader_context_t = {
  6. kong?: node_shader_t;
  7. data?: shader_context_t;
  8. allow_vcols?: bool;
  9. material?: material_t;
  10. };
  11. function node_shader_context_create(material: material_t, props: shader_context_t): node_shader_context_t {
  12. let raw: node_shader_context_t = {};
  13. raw.material = material;
  14. let vertex_elements_default: vertex_element_t[] = [
  15. {
  16. name: "pos",
  17. data: "short4norm"
  18. },
  19. {
  20. name: "nor",
  21. data: "short2norm"
  22. }
  23. ];
  24. raw.data = {
  25. name: props.name,
  26. depth_write: props.depth_write,
  27. compare_mode: props.compare_mode,
  28. cull_mode: props.cull_mode,
  29. blend_source: props.blend_source,
  30. blend_destination: props.blend_destination,
  31. alpha_blend_source: props.alpha_blend_source,
  32. alpha_blend_destination: props.alpha_blend_destination,
  33. fragment_shader: "",
  34. vertex_shader: "",
  35. vertex_elements: props.vertex_elements != null ? props.vertex_elements : vertex_elements_default,
  36. color_attachments: props.color_attachments,
  37. depth_attachment: props.depth_attachment
  38. };
  39. let rw: shader_context_t = raw.data;
  40. rw._ = {};
  41. if (props.color_writes_red != null) {
  42. raw.data.color_writes_red = props.color_writes_red;
  43. }
  44. if (props.color_writes_green != null) {
  45. raw.data.color_writes_green = props.color_writes_green;
  46. }
  47. if (props.color_writes_blue != null) {
  48. raw.data.color_writes_blue = props.color_writes_blue;
  49. }
  50. if (props.color_writes_alpha != null) {
  51. raw.data.color_writes_alpha = props.color_writes_alpha;
  52. }
  53. raw.data.texture_units = [];
  54. raw.data.constants = [];
  55. return raw;
  56. }
  57. function node_shader_context_add_elem(raw: node_shader_context_t, name: string, data_type: string) {
  58. for (let i: i32 = 0; i < raw.data.vertex_elements.length; ++i) {
  59. let e: vertex_element_t = raw.data.vertex_elements[i];
  60. if (e.name == name) {
  61. return;
  62. }
  63. }
  64. let elem: vertex_element_t = { name: name, data: data_type };
  65. array_push(raw.data.vertex_elements, elem);
  66. }
  67. function node_shader_context_is_elem(raw: node_shader_context_t, name: string): bool {
  68. for (let i: i32 = 0; i < raw.data.vertex_elements.length; ++i) {
  69. let elem: vertex_element_t = raw.data.vertex_elements[i];
  70. if (elem.name == name) {
  71. return true;
  72. }
  73. }
  74. return false;
  75. }
  76. function node_shader_context_get_elem(raw: node_shader_context_t, name: string): vertex_element_t {
  77. for (let i: i32 = 0; i < raw.data.vertex_elements.length; ++i) {
  78. let elem: vertex_element_t = raw.data.vertex_elements[i];
  79. if (elem.name == name) {
  80. return elem;
  81. }
  82. }
  83. return null;
  84. }
  85. function node_shader_context_add_constant(raw: node_shader_context_t, ctype: string, name: string, link: string = null) {
  86. for (let i: i32 = 0; i < raw.data.constants.length; ++i) {
  87. let c: shader_const_t = raw.data.constants[i];
  88. if (c.name == name) {
  89. return;
  90. }
  91. }
  92. let c: shader_const_t = { name: name, type: ctype };
  93. if (link != null) {
  94. c.link = link;
  95. }
  96. let consts: shader_const_t[] = raw.data.constants;
  97. array_push(consts, c);
  98. }
  99. function node_shader_context_add_texture_unit(raw: node_shader_context_t, ctype: string, name: string, link: string = null) {
  100. for (let i: i32 = 0; i < raw.data.texture_units.length; ++i) {
  101. let c: tex_unit_t = raw.data.texture_units[i];
  102. if (c.name == name) {
  103. return;
  104. }
  105. }
  106. let c: tex_unit_t = { name: name, link: link };
  107. array_push(raw.data.texture_units, c);
  108. }
  109. function node_shader_context_make_kong(raw: node_shader_context_t): node_shader_t {
  110. raw.data.vertex_shader = raw.material.name + "_" + raw.data.name + ".vert";
  111. raw.data.fragment_shader = raw.material.name + "_" + raw.data.name + ".frag";
  112. raw.kong = node_shader_create(raw);
  113. return raw.kong;
  114. }