84 lines
2.7 KiB
TypeScript
84 lines
2.7 KiB
TypeScript
|
|
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 {
|
|
let context_id: string = "mesh";
|
|
let props: shader_context_t = {
|
|
name: context_id,
|
|
depth_write: false,
|
|
compare_mode: "always",
|
|
cull_mode: "clockwise",
|
|
vertex_elements: [
|
|
{
|
|
name: "pos",
|
|
data: "short4norm"
|
|
},
|
|
{
|
|
name: "nor",
|
|
data: "short2norm"
|
|
},
|
|
{
|
|
name: "tex",
|
|
data: "short2norm"
|
|
},
|
|
{
|
|
name: "col",
|
|
data: "short4norm"
|
|
}
|
|
],
|
|
color_attachments: ["RGBA32"]
|
|
};
|
|
let con_mesh: node_shader_context_t = node_shader_context_create(data, props);
|
|
|
|
con_mesh.allow_vcols = true;
|
|
|
|
let kong: node_shader_t = node_shader_context_make_kong(con_mesh);
|
|
|
|
node_shader_write_attrib_vert(kong, "output.pos = float4(input.pos.xy * 3.0, 0.0, 1.0);"); // Pos unpack
|
|
node_shader_write_attrib_vert(kong, "var madd: float2 = float2(0.5, 0.5);");
|
|
node_shader_add_out(kong, "tex_coord: float2");
|
|
node_shader_write_attrib_vert(kong, "output.tex_coord = output.pos.xy * madd + madd;");
|
|
node_shader_write_attrib_vert(kong, "output.tex_coord.y = 1.0 - output.tex_coord.y;");
|
|
node_shader_write_attrib_frag(kong, "var tex_coord: float2 = input.tex_coord;");
|
|
|
|
parser_material_init();
|
|
parser_material_canvases = [context_raw.material.canvas];
|
|
parser_material_nodes = context_raw.material.canvas.nodes;
|
|
parser_material_links = context_raw.material.canvas.links;
|
|
if (group != null) {
|
|
parser_material_push_group(group);
|
|
parser_material_parents = parents;
|
|
}
|
|
let links: ui_node_link_t[] = parser_material_links;
|
|
let link: ui_node_link_t = {
|
|
id: ui_next_link_id(links),
|
|
from_id: node.id,
|
|
from_socket: context_raw.node_preview_socket,
|
|
to_id: -1,
|
|
to_socket: -1
|
|
};
|
|
array_push(links, link);
|
|
|
|
parser_material_con = con_mesh;
|
|
parser_material_kong = kong;
|
|
parser_material_matcon = matcon;
|
|
|
|
parser_material_transform_color_space = false;
|
|
let res: string = parser_material_write_result(link);
|
|
parser_material_transform_color_space = true;
|
|
let st: string = node.outputs[link.from_socket].type;
|
|
if (st != "RGB" && st != "RGBA" && st != "VECTOR") {
|
|
res = parser_material_to_vec3(res);
|
|
}
|
|
array_remove(links, link);
|
|
|
|
kong.frag_out = "float4";
|
|
node_shader_write_frag(kong, "var basecol: float3 = " + res + ";");
|
|
node_shader_write_frag(kong, "output = float4(basecol.rgb, 1.0);");
|
|
|
|
parser_material_finalize(con_mesh);
|
|
|
|
con_mesh.data.shader_from_source = true;
|
|
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));
|
|
|
|
return con_mesh;
|
|
}
|