node_shader_context.ts 3.9 KB

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