make_node_preview.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. function make_node_preview_run(data: material_t, matcon: material_context_t, node: ui_node_t, group: ui_node_canvas_t, parents: ui_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 kong: node_shader_t = node_shader_context_make_kong(con_mesh);
  31. node_shader_write_attrib_vert(kong, "output.pos = float4(input.pos.xy * 3.0, 0.0, 1.0);"); // Pos unpack
  32. node_shader_write_attrib_vert(kong, "var madd: float2 = float2(0.5, 0.5);");
  33. node_shader_add_out(kong, "tex_coord: float2");
  34. node_shader_write_attrib_vert(kong, "output.tex_coord = output.pos.xy * madd + madd;");
  35. node_shader_write_attrib_vert(kong, "output.tex_coord.y = 1.0 - output.tex_coord.y;");
  36. node_shader_write_attrib_frag(kong, "var tex_coord: float2 = input.tex_coord;");
  37. parser_material_init();
  38. parser_material_canvases = [context_raw.material.canvas];
  39. parser_material_nodes = context_raw.material.canvas.nodes;
  40. parser_material_links = context_raw.material.canvas.links;
  41. if (group != null) {
  42. parser_material_push_group(group);
  43. parser_material_parents = parents;
  44. }
  45. let links: ui_node_link_t[] = parser_material_links;
  46. let link: ui_node_link_t = {
  47. id: ui_next_link_id(links),
  48. from_id: node.id,
  49. from_socket: context_raw.node_preview_socket,
  50. to_id: -1,
  51. to_socket: -1
  52. };
  53. array_push(links, link);
  54. parser_material_con = con_mesh;
  55. parser_material_kong = kong;
  56. parser_material_matcon = matcon;
  57. parser_material_transform_color_space = false;
  58. let res: string = parser_material_write_result(link);
  59. parser_material_transform_color_space = true;
  60. let st: string = node.outputs[link.from_socket].type;
  61. if (st != "RGB" && st != "RGBA" && st != "VECTOR") {
  62. res = parser_material_to_vec3(res);
  63. }
  64. array_remove(links, link);
  65. kong.frag_out = "float4";
  66. node_shader_write_frag(kong, "var basecol: float3 = " + res + ";");
  67. node_shader_write_frag(kong, "output = float4(basecol.rgb, 1.0);");
  68. parser_material_finalize(con_mesh);
  69. con_mesh.data.shader_from_source = true;
  70. gpu_create_shaders_from_kong(node_shader_get(kong), ADDRESS(con_mesh.data.vertex_shader), ADDRESS(con_mesh.data.fragment_shader), ADDRESS(con_mesh.data._.vertex_shader_size), ADDRESS(con_mesh.data._.fragment_shader_size));
  71. return con_mesh;
  72. }