Files
armorpaint/armorlab/sources/make_material.ts
T

144 lines
4.0 KiB
TypeScript
Raw Normal View History

2024-03-14 15:31:22 +01:00
let make_material_default_scon: shader_context_t = null;
let make_material_default_mcon: material_context_t = null;
2024-05-03 21:29:39 +02:00
let make_material_height_used: bool = false;
2024-03-14 15:31:22 +01:00
function make_material_parse_mesh_material() {
2024-08-31 17:24:01 +02:00
let m: material_data_t = project_material_data;
2024-03-14 15:31:22 +01:00
2024-03-21 21:06:41 +01:00
for (let i: i32 = 0; i < m._.shader.contexts.length; ++i) {
2024-08-31 17:24:01 +02:00
let c: shader_context_t = m._.shader.contexts[i];
2024-03-14 15:31:22 +01:00
if (c.name == "mesh") {
array_remove(m._.shader.contexts, c);
array_remove(m._.shader._.contexts, c);
make_material_delete_context(c);
break;
}
}
2024-08-31 17:24:01 +02:00
let mm: material_t = {
name: "Material",
canvas: null
};
let con: node_shader_context_t = make_mesh_run(mm);
2024-03-14 15:31:22 +01:00
let scon: shader_context_t = shader_context_create(con.data);
2024-08-31 17:24:01 +02:00
let override_context: _shader_override_t = {};
2024-10-23 14:00:19 +02:00
// if (con.frag.shared_samplers.length > 0) {
// let sampler: string = con.frag.shared_samplers[0];
// override_context.shared_sampler = substring(sampler, string_last_index_of(sampler, " ") + 1, sampler.length);
// }
2024-03-14 15:31:22 +01:00
if (!context_raw.texture_filter) {
2024-10-23 14:00:19 +02:00
override_context.filter = "point";
2024-03-14 15:31:22 +01:00
}
2024-10-23 14:00:19 +02:00
override_context.addressing = "repeat";
scon._.override_context = override_context;
2024-03-20 16:13:54 +01:00
array_push(m._.shader.contexts, scon);
array_push(m._.shader._.contexts, scon);
2024-03-14 15:31:22 +01:00
context_raw.ddirty = 2;
///if arm_voxels
make_material_make_voxel(m);
///end
2024-09-06 21:11:46 +02:00
///if (arm_direct3d12 || arm_vulkan)
2024-03-14 15:31:22 +01:00
render_path_raytrace_dirty = 1;
///end
}
///if arm_voxels
function make_material_make_voxel(m: material_data_t) {
2024-08-31 17:24:01 +02:00
let rebuild: bool = true; // heightUsed;
2024-03-14 15:31:22 +01:00
if (config_raw.rp_gi != false && rebuild) {
let scon: shader_context_t = null;
2024-03-21 21:06:41 +01:00
for (let i: i32 = 0; i < m._.shader._.contexts.length; ++i) {
2024-08-31 17:24:01 +02:00
let c: shader_context_t = m._.shader._.contexts[i];
2024-03-14 15:31:22 +01:00
if (c.name == "voxel") {
scon = c;
break;
}
}
if (scon != null) make_voxel_run(scon);
}
}
///end
function make_material_parse_paint_material() {
2024-08-31 17:24:01 +02:00
let m: material_data_t = project_material_data;
2024-03-14 15:31:22 +01:00
let scon: shader_context_t = null;
let mcon: material_context_t = null;
2024-03-21 21:06:41 +01:00
for (let i: i32 = 0; i < m._.shader.contexts.length; ++i) {
2024-08-31 17:24:01 +02:00
let c: shader_context_t = m._.shader.contexts[i];
2024-03-14 15:31:22 +01:00
if (c.name == "paint") {
array_remove(m._.shader.contexts, c);
array_remove(m._.shader._.contexts, c);
2024-04-25 22:04:43 +02:00
if (c != make_material_default_scon) {
make_material_delete_context(c);
}
2024-03-14 15:31:22 +01:00
break;
}
}
2024-03-24 10:26:56 +01:00
for (let i: i32 = 0; i < m.contexts.length; ++i) {
2024-08-31 17:24:01 +02:00
let c: material_context_t = m.contexts[i];
2024-03-14 15:31:22 +01:00
if (c.name == "paint") {
array_remove(m.contexts, c);
array_remove(m._.contexts, c);
break;
}
}
let sdata: material_t = { name: "Material", canvas: null };
let mcon2: material_context_t = { name: "paint", bind_textures: [] };
2024-08-31 17:24:01 +02:00
let con: node_shader_context_t = make_paint_run(sdata, mcon2);
2024-03-14 15:31:22 +01:00
2024-08-31 17:24:01 +02:00
let compile_error: bool = false;
2024-03-14 15:31:22 +01:00
let scon2: shader_context_t;
let _scon: shader_context_t = shader_context_create(con.data);
2024-03-20 16:13:54 +01:00
if (_scon == null) {
2024-08-31 17:24:01 +02:00
compile_error = true;
2024-03-20 16:13:54 +01:00
}
2024-03-14 15:31:22 +01:00
scon2 = _scon;
2024-08-31 17:24:01 +02:00
if (compile_error) {
2024-03-20 16:13:54 +01:00
return;
}
2024-08-31 17:24:01 +02:00
let override_context: _shader_override_t = {};
2024-10-23 14:00:19 +02:00
override_context.addressing = "repeat";
2024-08-31 17:24:01 +02:00
scon2._.override_context = override_context;
2024-03-14 15:31:22 +01:00
let mcon3: material_context_t = material_context_create(mcon2);
2024-03-20 16:13:54 +01:00
array_push(m._.shader.contexts, scon2);
array_push(m._.shader._.contexts, scon2);
array_push(m.contexts, mcon3);
array_push(m._.contexts, mcon3);
2024-03-14 15:31:22 +01:00
2024-03-20 16:13:54 +01:00
if (make_material_default_scon == null) {
make_material_default_scon = scon2;
}
if (make_material_default_mcon == null) {
make_material_default_mcon = mcon3;
}
2024-03-14 15:31:22 +01:00
}
function make_material_get_displace_strength(): f32 {
2024-09-08 21:53:39 +02:00
let sc: vec4_t = context_main_object().base.transform.scale;
return config_raw.displace_strength * 0.02 * sc.x;
2024-03-14 15:31:22 +01:00
}
function make_material_voxelgi_half_extents(): string {
2024-08-31 17:24:01 +02:00
let ext: i32 = context_raw.vxao_ext;
2024-08-15 20:29:14 +02:00
return "const vec3 voxelgi_half_extents = vec3(" + ext + ", " + ext + ", " + ext + ");";
2024-03-14 15:31:22 +01:00
}
function make_material_delete_context(c: shader_context_t) {
2024-04-07 09:52:45 +02:00
app_notify_on_next_frame(function (c: shader_context_t) { // Ensure pipeline is no longer in use
2024-03-14 15:31:22 +01:00
shader_context_delete(c);
2024-04-02 15:45:49 +02:00
}, c);
2024-03-14 15:31:22 +01:00
}
2024-10-19 19:44:38 +02:00
function make_material_parse_brush() {
// parser_logic_parse(context_raw.brush.canvas);
}