make_node_preview.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. function make_node_preview_run(data: material_t, matcon: material_context_t, node: zui_node_t, group: zui_node_canvas_t, parents: zui_node_t[]): node_shader_context_t {
  2. let context_id: string = "mesh";
  3. let props: shader_context_t = {
  4. name: context_id,
  5. depth_write: false,
  6. compare_mode: "always",
  7. cull_mode: "clockwise",
  8. vertex_elements: [
  9. {
  10. name: "pos",
  11. data: "short4norm"
  12. },
  13. {
  14. name: "nor",
  15. data: "short2norm"
  16. },
  17. {
  18. name: "tex",
  19. data: "short2norm"
  20. },
  21. {
  22. name: "col",
  23. data: "short4norm"
  24. }
  25. ],
  26. color_attachments: ["RGBA32"]
  27. };
  28. let con_mesh: node_shader_context_t = node_shader_context_create(data, props);
  29. con_mesh.allow_vcols = true;
  30. let vert: node_shader_t = node_shader_context_make_vert(con_mesh);
  31. let frag: node_shader_t = node_shader_context_make_frag(con_mesh);
  32. frag.ins = vert.outs;
  33. node_shader_write_attrib(vert, "gl_Position = vec4(pos.xy * 3.0, 0.0, 1.0);"); // Pos unpack
  34. node_shader_write_attrib(vert, "const vec2 madd = vec2(0.5, 0.5);");
  35. node_shader_add_out(vert, "vec2 texCoord");
  36. node_shader_write_attrib(vert, "texCoord = gl_Position.xy * madd + madd;");
  37. ///if (!krom_opengl)
  38. node_shader_write_attrib(vert, "texCoord.y = 1.0 - texCoord.y;");
  39. ///end
  40. parser_material_init();
  41. parser_material_canvases = [context_raw.material.canvas];
  42. parser_material_nodes = context_raw.material.canvas.nodes;
  43. parser_material_links = context_raw.material.canvas.links;
  44. if (group != null) {
  45. parser_material_push_group(group);
  46. parser_material_parents = parents;
  47. }
  48. let links: zui_node_link_t[] = parser_material_links;
  49. let link: zui_node_link_t = { id: zui_get_link_id(links), from_id: node.id, from_socket: context_raw.node_preview_socket, to_id: -1, to_socket: -1 };
  50. array_push(links, link);
  51. parser_material_con = con_mesh;
  52. parser_material_vert = vert;
  53. parser_material_frag = frag;
  54. parser_material_curshader = frag;
  55. parser_material_matcon = matcon;
  56. parser_material_transform_color_space = false;
  57. let res: string = parser_material_write_result(link);
  58. parser_material_transform_color_space = true;
  59. let st: string = node.outputs[link.from_socket].type;
  60. if (st != "RGB" && st != "RGBA" && st != "VECTOR") {
  61. res = parser_material_to_vec3(res);
  62. }
  63. array_remove(links, link);
  64. node_shader_add_out(frag, "vec4 fragColor");
  65. node_shader_write(frag, "vec3 basecol = " + res + ";");
  66. node_shader_write(frag, "fragColor = vec4(basecol.rgb, 1.0);");
  67. // frag.ndcpos = true;
  68. // add_out(vert, "vec4 ndc");
  69. // write_attrib(vert, "ndc = vec4(gl_Position.xyz * vec3(0.5, 0.5, 0.0) + vec3(0.5, 0.5, 0.0), 1.0);");
  70. parser_material_finalize(con_mesh);
  71. con_mesh.data.shader_from_source = true;
  72. con_mesh.data.vertex_shader = node_shader_get(vert);
  73. con_mesh.data.fragment_shader = node_shader_get(frag);
  74. return con_mesh;
  75. }