make_node_preview.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. function make_node_preview_run(data: material_t, matcon: material_context_t, node: ui_node_t, group: ui_node_canvas_t,
  2. parents: ui_node_t[]): node_shader_context_t {
  3. let context_id: string = "mesh";
  4. let props: shader_context_t = {
  5. name : context_id,
  6. depth_write : false,
  7. compare_mode : "always",
  8. cull_mode : "clockwise",
  9. vertex_elements : [
  10. {name : "pos", data : "short4norm"}, {name : "nor", data : "short2norm"}, {name : "tex", data : "short2norm"}, {name : "col", data : "short4norm"}
  11. ],
  12. color_attachments : [ "RGBA32" ]
  13. };
  14. let con_mesh: node_shader_context_t = node_shader_context_create(data, props);
  15. con_mesh.allow_vcols = true;
  16. let kong: node_shader_t = node_shader_context_make_kong(con_mesh);
  17. node_shader_write_attrib_vert(kong, "output.pos = float4(input.pos.xy * 3.0, 0.0, 1.0);"); // Pos unpack
  18. node_shader_write_attrib_vert(kong, "var madd: float2 = float2(0.5, 0.5);");
  19. node_shader_add_out(kong, "tex_coord: float2");
  20. node_shader_write_attrib_vert(kong, "output.tex_coord = output.pos.xy * madd + madd;");
  21. node_shader_write_attrib_vert(kong, "output.tex_coord.y = 1.0 - output.tex_coord.y;");
  22. node_shader_write_attrib_frag(kong, "var tex_coord: float2 = input.tex_coord;");
  23. parser_material_init();
  24. parser_material_canvases = [ context_raw.material.canvas ];
  25. parser_material_nodes = context_raw.material.canvas.nodes;
  26. parser_material_links = context_raw.material.canvas.links;
  27. if (group != null) {
  28. parser_material_push_group(group);
  29. parser_material_parents = parents;
  30. }
  31. let links: ui_node_link_t[] = parser_material_links;
  32. let socket_preview: i32 = i32_imap_get(context_raw.node_preview_socket_map, node.id);
  33. let link:
  34. ui_node_link_t = {id : ui_next_link_id(links), from_id : node.id, from_socket : socket_preview == -1 ? 0 : socket_preview, to_id : -1, to_socket : -1};
  35. array_push(links, link);
  36. parser_material_con = con_mesh;
  37. parser_material_kong = kong;
  38. parser_material_matcon = matcon;
  39. parser_material_transform_color_space = false;
  40. let res: string = parser_material_write_result(link);
  41. parser_material_transform_color_space = true;
  42. let st: string = node.outputs[link.from_socket].type;
  43. if (st != "RGB" && st != "RGBA" && st != "VECTOR") {
  44. res = parser_material_to_vec3(res);
  45. }
  46. array_remove(links, link);
  47. kong.frag_out = "float4";
  48. node_shader_write_frag(kong, "var basecol: float3 = " + res + ";");
  49. node_shader_write_frag(kong, "output = float4(basecol.rgb, 1.0);");
  50. parser_material_finalize(con_mesh);
  51. con_mesh.data.shader_from_source = true;
  52. gpu_create_shaders_from_kong(node_shader_get(kong), ADDRESS(con_mesh.data.vertex_shader), ADDRESS(con_mesh.data.fragment_shader),
  53. ADDRESS(con_mesh.data._.vertex_shader_size), ADDRESS(con_mesh.data._.fragment_shader_size));
  54. return con_mesh;
  55. }