MakeNodePreview.hx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package arm.node;
  2. import zui.Nodes;
  3. import iron.data.SceneFormat;
  4. import arm.shader.MaterialParser;
  5. import arm.shader.NodeShader;
  6. import arm.shader.NodeShaderData;
  7. import arm.shader.NodeShaderContext;
  8. class MakeNodePreview {
  9. @:access(arm.shader.MaterialParser)
  10. public static function run(data: NodeShaderData, matcon: TMaterialContext, node: TNode, group: TNodeCanvas, parents: Array<TNode>): NodeShaderContext {
  11. var context_id = "mesh";
  12. var con_mesh: NodeShaderContext = data.add_context({
  13. name: context_id,
  14. depth_write: true,
  15. compare_mode: "less",
  16. cull_mode: "clockwise",
  17. vertex_elements: [{name: "pos", data: "short4norm"}, {name: "nor", data: "short2norm"}, {name: "tex", data: "short2norm"}, {name: "col", data: "short4norm"}],
  18. color_attachments: ["RGBA32"]
  19. });
  20. con_mesh.allow_vcols = true;
  21. var vert = con_mesh.make_vert();
  22. var frag = con_mesh.make_frag();
  23. frag.ins = vert.outs;
  24. vert.write_attrib('gl_Position = vec4(pos.xy * 3.0, 0.0, 1.0);'); // Pos unpack
  25. vert.write_attrib('const vec2 madd = vec2(0.5, 0.5);');
  26. vert.add_out('vec2 texCoord');
  27. vert.write_attrib('texCoord = gl_Position.xy * madd + madd;');
  28. #if (!kha_opengl)
  29. vert.write_attrib('texCoord.y = 1.0 - texCoord.y;');
  30. #end
  31. MaterialParser.init();
  32. MaterialParser.canvases = [Context.material.canvas];
  33. MaterialParser.nodes = Context.material.canvas.nodes;
  34. MaterialParser.links = Context.material.canvas.links;
  35. if (group != null) {
  36. MaterialParser.push_group(group);
  37. MaterialParser.parents = parents;
  38. }
  39. var links = MaterialParser.links;
  40. var nodes = Context.material.nodes;
  41. var link: TNodeLink = { id: nodes.getLinkId(links), from_id: node.id, from_socket: Context.nodePreviewSocket, to_id: -1, to_socket: -1 };
  42. links.push(link);
  43. MaterialParser.con = con_mesh;
  44. MaterialParser.vert = vert;
  45. MaterialParser.frag = frag;
  46. MaterialParser.curshader = frag;
  47. MaterialParser.matcon = matcon;
  48. MaterialParser.transform_color_space = false;
  49. var res = MaterialParser.write_result(link);
  50. MaterialParser.transform_color_space = true;
  51. var st = node.outputs[link.from_socket].type;
  52. if (st != "RGB" && st != "RGBA" && st != "VECTOR") {
  53. res = MaterialParser.to_vec3(res);
  54. }
  55. links.remove(link);
  56. frag.add_out('vec4 fragColor');
  57. frag.write('vec3 basecol = $res;');
  58. frag.write('fragColor = vec4(basecol.rgb, 1.0);');
  59. // frag.ndcpos = true;
  60. // vert.add_out('vec4 ndc');
  61. // vert.write_attrib('ndc = vec4(gl_Position.xyz * vec3(0.5, 0.5, 0.0) + vec3(0.5, 0.5, 0.0), 1.0);');
  62. MaterialParser.finalize(con_mesh);
  63. con_mesh.data.shader_from_source = true;
  64. con_mesh.data.vertex_shader = vert.get();
  65. con_mesh.data.fragment_shader = frag.get();
  66. return con_mesh;
  67. }
  68. }